From: jenkins-bot Date: Mon, 14 Aug 2017 16:48:17 +0000 (+0000) Subject: Merge "Perform a permission check on the title when changing the page language" X-Git-Tag: 1.31.0-rc.0~2391 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=6c9a2923fe1ee3a65cb027be5e781772f2b12fbd;hp=95d108845fe6545ebb52c8cc274ac76c444dde19 Merge "Perform a permission check on the title when changing the page language" --- diff --git a/.gitattributes b/.gitattributes index 09f86a3280..f230c60f7e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.sh eol=lf *.icc binary *.webp binary +*.mp3 binary \ No newline at end of file diff --git a/.gitignore b/.gitignore index b2c4d45cb1..3e97aab749 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,6 @@ node_modules/ # Composer /vendor /composer.lock -/composer.json /composer.local.json # MediaWiki UI documentation @@ -72,3 +71,4 @@ Thumbs.db /.htaccess /.htpasswd /tests/phan/issues +*.rej diff --git a/.mailmap b/.mailmap index f0562198e6..5a76fb950e 100644 --- a/.mailmap +++ b/.mailmap @@ -63,6 +63,7 @@ aude Audrey Tang Audrey Tang ayush_garg +Bae Junehyeon Bahodir Mansurov Bartosz Dziewoński Bartosz Dziewoński @@ -196,6 +197,7 @@ Jackmcbarn Jackmcbarn jagori James Forrester +Jaime Crespo Jan Gerber Jan Luca Naumann Jan Luca Naumann @@ -226,7 +228,6 @@ Jon Robson Jon Robson Juliusz Gonera Juliusz Gonera -JuneHyeon Bae Jure Kajzer Jure Kajzer Justin Du @@ -409,9 +410,11 @@ Steven Walling Subramanya Sastry Sucheta Ghoshal Sumit Asthana +TerraCodes Thalia Chan -Thiemo Mättig (WMDE) -Thiemo Mättig (WMDE) +Thalia Chan +Thiemo Mättig +Thiemo Mättig This, that and the other tholam Thomas Bleher @@ -452,9 +455,9 @@ X! Yaron Koren Yaron Koren Yaroslav Melnychuk -Yongmin Hong -Yongmin Hong -Yongmin Hong +Yongmin Hong +Yongmin Hong +Yongmin Hong Yuri Astrakhan Yuri Astrakhan Yuri Astrakhan diff --git a/.rubocop.yml b/.rubocop.yml deleted file mode 100644 index 5b6c3f2dc6..0000000000 --- a/.rubocop.yml +++ /dev/null @@ -1,26 +0,0 @@ -AllCops: - Exclude: - - 'extensions/**/*' - - 'node_modules/**/*' - - 'skins/**/*' - - 'tests/frontend/node_modules/**/*' - - 'vendor/**/*' - StyleGuideCopsOnly: true - -Metrics/LineLength: - Max: 100 - -Metrics/MethodLength: - Enabled: false - -Style/Alias: - Enabled: false - -Style/SignalException: - Enabled: false - -Style/StringLiterals: - EnforcedStyle: single_quotes - -Style/TrivialAccessors: - ExactNameMatch: true diff --git a/.travis.yml b/.travis.yml index 5e2c7a00db..cde7193424 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,12 @@ # complement that setup by testing MediaWiki on travis # language: php -# Use the slower sudo-enabled VMs instead of fast containers: -# - Package 'djvulibre-bin' is not yet whitelisted for trusty containers. -# https://github.com/travis-ci/apt-package-whitelist/issues/4036 -sudo: required -# Use Trusty instead of Travis default (precise) + + +# Use fast containers instead of the slower sudo-enabled VMs: +sudo: false +# Use Ubuntu 14 Trusty (not Ubuntu 12 Precise) +# # - Required in order to use HHVM 3.6 or higher. # - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176). dist: trusty @@ -25,10 +26,11 @@ matrix: php: 5.5 - env: dbtype=postgres dbuser=travis php: 5.5 + # https://docs.travis-ci.com/user/languages/php#HHVM-versions - env: dbtype=mysql dbuser=root - # https://docs.travis-ci.com/user/languages/php#HHVM-versions - # https://github.com/travis-ci/travis-ci/issues/7368 php: hhvm-3.12 + - env: dbtype=mysql dbuser=root + php: hhvm-3.18 - env: dbtype=mysql dbuser=root php: 7 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..d8e5d0872d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct). diff --git a/CREDITS b/CREDITS index 6a51e08756..c38c3fcc05 100644 --- a/CREDITS +++ b/CREDITS @@ -16,6 +16,7 @@ The following list can be found parsed under Special:Version/Credits --> * Aashaka Shah * abhinand * Abhishek Das +* Ad Huikeshoven * Adam Miller * Adam Roses Wight * addshore @@ -48,6 +49,7 @@ The following list can be found parsed under Special:Version/Credits --> * ananay * Anders Wegge Jakobsen * Andre Engels +* Andre Klapper * Andrew Bogott * Andrew Dunbar * Andrew Garrett @@ -76,6 +78,7 @@ The following list can be found parsed under Special:Version/Credits --> * awu42 * ayush_garg * Azliq7 +* Bae Junehyeon * Bagariavivek * Bahodir Mansurov * balloonguy @@ -200,6 +203,7 @@ The following list can be found parsed under Special:Version/Credits --> * Erik Moeller * Erwin Dokter * Étienne Beaulé +* Eugene Gvozdetsky * Evan McIntire * Evan Prodromou * ExplosiveHippo @@ -257,6 +261,7 @@ The following list can be found parsed under Special:Version/Credits --> * Jacob Block * Jacob Clark * jagori +* Jaime Crespo * Jakub Vrana * James Earl Douglas * James Forrester @@ -308,7 +313,6 @@ The following list can be found parsed under Special:Version/Credits --> * Julian Ostrow * Juliano F. Ravasi * Juliusz Gonera -* JuneHyeon Bae * Jure Kajzer * Justin Du * Kai Nissen @@ -355,6 +359,7 @@ The following list can be found parsed under Special:Version/Credits --> * Ltrlg * Luc Van Oostenryck * Lucas Garczewski +* Lucas Werkmeister * Luigi Corsaro * Luis Felipe Schenone * Luke Faraone @@ -366,6 +371,7 @@ The following list can be found parsed under Special:Version/Credits --> * Madman * madurangasiriwardena * Magnus Manske +* mainframe98 * Manuel Menal * Manuel Schneider * Marc Ordinas i Llopis @@ -421,6 +427,7 @@ The following list can be found parsed under Special:Version/Credits --> * Michał Roszka * Michał Zieliński * Mike Horvath +* Mikhail Popov * Minh Nguyễn * MinuteElectron * Misza13 @@ -429,11 +436,13 @@ The following list can be found parsed under Special:Version/Credits --> * Mohamed Magdy * Molly White * Moriel Schottlender +* Moritz Oberhauser * Mormegil * Mr. E23 * MrBlueSky * MrPete * Mukunda Modell +* MusikAnimal * Mwalker * mwjames * mybugs.mail @@ -454,7 +463,6 @@ The following list can be found parsed under Special:Version/Credits --> * Nicolas Dumazet * Nicolas Weeger * Niharika Kohli -* Nik * Nik Everett * Niklas Laxström * Nikola Kovacs @@ -609,14 +617,15 @@ The following list can be found parsed under Special:Version/Credits --> * Subramanya Sastry * Sumit Asthana * svip -* Swalling * Szymon Świerkosz * T.D. Corell * Tarquin +* TerraCodes +* Thalia Chan * The Discoverer * The Evil IP address * theopolisme -* Thiemo Mättig (WMDE) +* Thiemo Mättig * This, that and the other * tholam * Thomas Arrow diff --git a/Gemfile b/Gemfile deleted file mode 100644 index ee0cec0480..0000000000 --- a/Gemfile +++ /dev/null @@ -1,5 +0,0 @@ -source 'https://rubygems.org' - -gem 'mediawiki_selenium', '~> 1.8' -gem 'rake', '~> 11.1', '>= 11.1.1' -gem 'rubocop', '~> 0.32.1', require: false diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 4992303258..0000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,111 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - ast (2.0.0) - astrolabe (1.3.0) - parser (>= 2.2.0.pre.3, < 3.0) - builder (3.2.3) - childprocess (0.6.2) - ffi (~> 1.0, >= 1.0.11) - cucumber (1.3.20) - builder (>= 2.1.2) - diff-lcs (>= 1.1.3) - gherkin (~> 2.12) - multi_json (>= 1.7.5, < 2.0) - multi_test (>= 0.1.2) - data_magic (1.0) - faker (>= 1.1.2) - yml_reader (>= 0.6) - diff-lcs (1.3) - domain_name (0.5.20170223) - unf (>= 0.0.5, < 1.0.0) - faker (1.7.3) - i18n (~> 0.5) - faraday (0.11.0) - multipart-post (>= 1.2, < 3) - faraday-cookie_jar (0.0.6) - faraday (>= 0.7.4) - http-cookie (~> 1.0.0) - faraday_middleware (0.11.0.1) - faraday (>= 0.7.4, < 1.0) - ffi (1.9.17) - gherkin (2.12.2) - multi_json (~> 1.3) - headless (2.3.1) - http-cookie (1.0.3) - domain_name (~> 0.5) - i18n (0.8.1) - json (2.0.3) - mediawiki_api (0.7.1) - faraday (~> 0.9, >= 0.9.0) - faraday-cookie_jar (~> 0.0, >= 0.0.6) - faraday_middleware (~> 0.10, >= 0.10.0) - mediawiki_selenium (1.8.0) - cucumber (~> 1.3, >= 1.3.20) - headless (~> 2.0, >= 2.1.0) - json (~> 2.0, >= 2.0.2) - mediawiki_api (~> 0.7, >= 0.7.0) - page-object (~> 2.0) - rest-client (~> 1.6, >= 1.6.7) - rspec-core (~> 2.14, >= 2.14.4) - rspec-expectations (~> 2.14, >= 2.14.4) - selenium-webdriver (~> 3.1.0) - syntax (~> 1.2, >= 1.2.0) - thor (~> 0.19, >= 0.19.1) - mime-types (2.99.3) - multi_json (1.12.1) - multi_test (0.1.2) - multipart-post (2.0.0) - net-http-persistent (2.9.4) - netrc (0.11.0) - page-object (2.0.0) - net-http-persistent (~> 2.9.4) - page_navigation (>= 0.9) - selenium-webdriver (~> 3.0) - watir (~> 6.0) - page_navigation (0.10) - data_magic (>= 0.22) - parser (2.2.2.6) - ast (>= 1.1, < 3.0) - powerpack (0.1.1) - rainbow (2.0.0) - rake (11.1.1) - rest-client (1.8.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 3.0) - netrc (~> 0.7) - rspec-core (2.99.2) - rspec-expectations (2.99.2) - diff-lcs (>= 1.1.3, < 2.0) - rubocop (0.32.1) - astrolabe (~> 1.3) - parser (>= 2.2.2.5, < 3.0) - powerpack (~> 0.1) - rainbow (>= 1.99.1, < 3.0) - ruby-progressbar (~> 1.4) - ruby-progressbar (1.7.5) - rubyzip (1.2.1) - selenium-webdriver (3.1.0) - childprocess (~> 0.5) - rubyzip (~> 1.0) - websocket (~> 1.0) - syntax (1.2.1) - thor (0.19.4) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.2) - watir (6.2.0) - selenium-webdriver (~> 3.0) - websocket (1.2.4) - yml_reader (0.7) - -PLATFORMS - ruby - -DEPENDENCIES - mediawiki_selenium (~> 1.8) - rake (~> 11.1, >= 11.1.1) - rubocop (~> 0.32.1) - -BUNDLED WITH - 1.14.5 diff --git a/Gruntfile.js b/Gruntfile.js index 0e1c8cb2c2..dbbfcb814e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -4,6 +4,7 @@ module.exports = function ( grunt ) { var wgServer = process.env.MW_SERVER, wgScriptPath = process.env.MW_SCRIPT_PATH, + WebdriverIOconfigFile, karmaProxy = {}; grunt.loadNpmTasks( 'grunt-banana-checker' ); @@ -13,12 +14,19 @@ module.exports = function ( grunt ) { grunt.loadNpmTasks( 'grunt-jsonlint' ); grunt.loadNpmTasks( 'grunt-karma' ); grunt.loadNpmTasks( 'grunt-stylelint' ); + grunt.loadNpmTasks( 'grunt-webdriver' ); karmaProxy[ wgScriptPath ] = { target: wgServer + wgScriptPath, changeOrigin: true }; + if ( process.env.JENKINS_HOME ) { + WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js'; + } else { + WebdriverIOconfigFile = './tests/selenium/wdio.conf.js'; + } + grunt.initConfig( { eslint: { all: [ @@ -36,8 +44,6 @@ module.exports = function ( grunt ) { '!extensions/**/*.js', '!skins/**/*.js', // Skip functions aren't even parseable - '!resources/src/dom-level2-skip.js', - '!resources/src/es5-skip.js', '!resources/src/mediawiki.hidpi-skip.js' ] }, @@ -80,11 +86,14 @@ module.exports = function ( grunt ) { } ], logLevel: 'DEBUG', frameworks: [ 'qunit' ], - reporters: [ 'progress' ], + reporters: [ 'mocha' ], singleRun: true, autoWatch: false, // Some tests in extensions don't yield for more than the default 10s (T89075) - browserNoActivityTimeout: 60 * 1000 + browserNoActivityTimeout: 60 * 1000, + // Karma requires Same-Origin (or CORS) by default since v1.1.1 + // for better stacktraces. But we load the first request from wgServer + crossOriginAttribute: false }, main: { browsers: [ 'Chrome' ] @@ -105,7 +114,15 @@ module.exports = function ( grunt ) { return require( 'path' ).join( dest, src.replace( 'resources/', '' ) ); } } + }, + + // Configure WebdriverIO task + webdriver: { + test: { + configFile: WebdriverIOconfigFile + } } + } ); grunt.registerTask( 'assert-mw-env', function () { diff --git a/HISTORY b/HISTORY index 7f365ac095..9259814a9a 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,377 @@ -Change notes from older releases. For current info see RELEASE-NOTES-1.29. +Change notes from older releases. For current info see RELEASE-NOTES-1.30. + += MediaWiki 1.29 = + +== MediaWiki 1.29.0 == + +=== Configuration changes in 1.29 === +* Default cookie expiration time has been reduced to 30 days. Login cookie + expiration time is kept at 180 days. +* A new configuration variable has been added: $wgCookieSetOnAutoblock. This + determines whether to set a cookie when a user is autoblocked. Doing so means + that a blocked user, even after logging out and moving to a new IP address, + will still be blocked. +* The resetpassword right and associated password reset capture feature has + been removed. +* The $error parameter to the EmailUser hook should be set to a Status object + or boolean false. This should be compatible with at least MediaWiki 1.23 if + not earlier. Returning a raw HTML string is now deprecated. +* The $message parameter to the ApiCheckCanExecute hook should be set to an + ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a + code for ApiBase::parseMsg() will no longer work. +* ApiBase::$messageMap is no longer public. Code attempting to access it will + result in a PHP fatal error. +* $wgUserEmailUseReplyTo is now true by default to work around restrictive DMARC + policies. +* Subpages are now enabled by default in the Template namespace. Set + $wgNamespacesWithSubpages[NS_TEMPLATE] to false to keep the old behavior. +* $wgRunJobsAsync is now false by default (T142751). This change only affects + wikis with $wgJobRunRate > 0. +* (T158474) "Unknown user" has been added to $wgReservedUsernames. +* (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs. +* $wgDummyLanguageCodes is deprecated. Additional language code mappings may be + added to $wgExtraLanguageCodes instead. +* (T161453) LocalisationCache will no longer use the temporary directory in it's + fallback chain when trying to work out where to write the cache. +* The user right 'editusercssjs' (deprecated in 1.16) was removed. Use + 'editusercss' and 'edituserjs' in $wgGroupPermissions and elsewhere instead. + +=== New features in 1.29 === +* (T5233) A cookie can now be set when a user is autoblocked, to track that user + if they move to a new IP address. This is disabled by default. +* Added ILocalizedException interface to standardize the use of localized + exceptions, largely so the API can handle them more sensibly. +* Blocks created automatically by MediaWiki, such as for configured proxies or + dnsbls, are now indicated as such and use a new i18n message when displayed. +* Added new $wgHTTPImportTimeout setting. Sets timeout for + downloading the XML dump during a transwiki import in seconds. +* Parser limit report is now available in machine-readable format to JavaScript + via mw.config.get('wgPageParseReport'). +* Added $wgSoftBlockRanges, to allow for automatically blocking anonymous edits + from certain IP ranges (e.g. private IPs). +* (T59603) Added new magic word {{PAGELANGUAGE}} which returns the language code + of the page being parsed. +* HTML5 form validation attributes will no longer be suppressed. Originally + browsers had poor support for them, but modern browsers handle them fine. + This might affect some forms that used them and only worked because the + attributes were not actually being set. +* Expiry times can now be specified when users are added to user groups. +* Completely new user interface for the RecentChanges page, which + structures filters into user-friendly groups. This has corresponding + changes to how filters are registered by core and extensions. +* The edit form now uses pretty OOjs UI buttons, checkboxes and summary input. + Because this change can cause problems for extensions and on-wiki + scripts depending on the exact HTML, the old version is still available + and can be used by setting $wgOOUIEditPage = false; in LocalSettings.php. + This will be removed later and OOjs UI will become the only option. + To make testing easier, users can also force either mode by adding + &ooui=true or &ooui=false to the action=edit URL. + +=== External library changes in 1.29 === + +==== Upgraded external libraries ==== +* Updated QUnit from v1.22.0 to v1.23.1. +* Updated cssjanus from v1.1.2 to v1.2.0. +* Updated psr/log from v1.0.0 to v1.0.2. +* Update Moment.js from v2.8.4 to v2.15.0. +* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.14. +* Updated monolog from v1.18.2 to 1.22.1. +* Updated wikimedia/composer-merge-plugin from v1.3.1 to v1.4.0. +* Updated OOjs from v1.1.10 to v2.0.0. +* Updated jQuery from v1.11.3 to v3.2.1 (including jQuery Migrate v3.0.0). + +==== New external libraries ==== +* Added wikimedia/timestamp v1.0.0. +* Added wikimedia/remex-html v1.0.1. + +==== Removed and replaced external libraries ==== + +=== Bug fixes in 1.29 === +* (T62604) Core parser functions returning a number now format the number according + to the page content language, not wiki content language. +* (T27187) Search suggestions based on jquery.suggestions will now correctly only + highlight prefix matches in the results. +* (T157035) "new mw.Uri()" was ignoring options when using default URI. +* Special:Allpages can no longer be filtered by redirect in miser mode. +* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + +=== Action API changes in 1.29 === +* Submitting sensitive authentication request parameters to action=login, + 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. +* The capture option for action=resetpassword has been removed +* action=clearhasmsg now requires a POST. +* (T47843) API errors and warnings may be requested in non-English languages + using the new 'errorformat', 'errorlang', and 'errorsuselocal' parameters. +* API error codes may have changed. Most notably, errors from modules using + parameter prefixes (e.g. all query submodules) will no longer be prefixed. +* ApiPageSet-using modules will report the 'invalidreason' using the specified + 'errorformat'. +* action=emailuser may return a "Warnings" status, and now returns 'warnings' and + 'errors' subelements (as applicable) instead of 'message'. +* action=imagerotate returns an 'errors' subelement rather than 'errormessage'. +* action=move now reports errors when moving the talk page as an array under + key 'talkmove-errors', rather than using 'talkmove-error-code' and + 'talkmove-error-info'. The format for subpage move errors has also changed. +* action=revisiondelete no longer includes a "rendered" property on warnings + and errors for each item. Use errorformat=wikitext if you're wanting parsed + output. +* action=rollback no longer returns a "messageHtml" property. Use + errorformat=html if you're wanting HTML formatting of error messages. +* action=upload now reports optional stash failures as an array under key + 'stasherrors' rather than a 'stashfailed' text string. +* action=watch reports 'errors' and 'warnings' instead of a single 'error', and + no longer returns a 'message' on success. +* Added action=validatepassword to validate passwords for the account creation + and password change forms. +* action=purge now requires a POST. +* There is a new `languagevariants` siprop for action=query&meta=siteinfo, + which returns a list of languages with active LanguageConverter instances. +* action=query&query=allpages will no longer filter redirects using a database + query in miser mode. This may result in less results being returned than were + requested. + +=== Action API internal changes in 1.29 === +* New methods were added to ApiBase to handle errors and warnings using i18n + keys. Methods for using hard-coded English messages were deprecated: + * ApiBase::dieUsage() was deprecated + * ApiBase::dieUsageMsg() was deprecated + * ApiBase::dieUsageMsgOrDebug() was deprecated + * ApiBase::getErrorFromStatus() was deprecated + * ApiBase::parseMsg() was deprecated + * ApiBase::setWarning() was deprecated +* ApiBase::$messageMap is no longer public. Code attempting to access it will + result in a PHP fatal error. +* The $message parameter to the ApiCheckCanExecute hook should be set to an + ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a + code for ApiBase::parseMsg() will no longer work. +* UsageException is deprecated in favor of ApiUsageException. For the time + being ApiUsageException is a subclass of UsageException to allow things that + catch only UsageException to still function properly. +* If, for some strange reason, code was using an ApiErrorFormatter instead of + ApiErrorFormatter_BackCompat, note that the result format has changed and + various methods now take a module path rather than a module name. +* ApiMessageTrait::getApiCode() now strips 'apierror-' and 'apiwarn-' prefixes + from the message key, and maps some message keys for backwards compatibility. +* API parameters may now be marked as "sensitive" to keep their values out of + the logs. + +=== Languages updated in 1.29 === + +MediaWiki supports over 350 languages. Many localisations are updated +regularly. Below only new and removed languages are listed, as well as +changes to languages because of Phabricator reports. + +* Based as always on linguistic studies on intelligibility and language + knowledge by geography, language fallbacks have been expanded. When a + translation is missing in the user's preferred interface language, the + corresponding translation for the fallback language will be used instead. + English will only be used as last resort when there are no translations. + Some configurations (such as date formats and gender namespaces) have also + been updated when using the fallback language's configuration was inadequate. + The new or reinstated language fallbacks are (after cs ↔ sk in 1.28): + ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro; + sh → bs, sr-el, hr. +* (T137376) New language support: Atikamekw (atj). +* (T163600) New language support: Dinka (din). +* (T155957) Talk Namespaces for Javanese language (jv) have been updated. + +==== No fallback for Ukrainian ==== +* (T39314) The fallback from Ukrainian to Russian was removed. The Ukrainian + language will now use the default fallback language: English. When a translation + to Ukrainian is not available, an English string will be shown. + +=== Other changes in 1.29 === +* Database::getSearchEngine() (deprecated in 1.28) was removed. Use + SearchEngineFactory::getSearchEngineClass() instead. +* $wgSessionsInMemcached (deprecated in 1.20) was removed. No replacement is + required as all sessions are stored in Object Cache now. +* MWHttpRequest::execute() should be considered to return a StatusValue; the + Status return type is deprecated. +* User::edits() (deprecated in 1.21) was removed. +* Xml::escapeJsString() (deprecated in 1.21) was removed. +* Article::getText() and Article::prepareTextForEdit() (deprecated in 1.21) + were removed. +* Article::getAutosummary() and WikiPage::getAutosummary() (deprecated in 1.21) + were removed. +* Hook ArticleViewCustom (deprecated in 1.21) was removed. Use ArticleContentViewCustom + instead. +* Hooks EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21) were removed. +* Class RevisiondeleteAction (deprecated in 1.25) was removed. +* WikiPage::prepareTextForEdit() (deprecated in 1.21) was removed. +* WikiPage::getText() (deprecated in 1.21) was removed. +* Article::fetchContent() (deprecated in 1.21) was removed. +* User::getPassword() (deprecated in 1.27) was removed. +* User::getTemporaryPassword() (deprecated in 1.27) was removed. +* User::isPasswordReminderThrottled() (deprecated in 1.27) was removed. +* Class FSRepo (deprecated in 1.19) was removed. +* WebRequest::checkSessionCookie() (deprecated in 1.27) was removed. Use + \MediaWiki\Session\SessionManager::singleton()->getPersistedSessionId() instead. +* Class ImageGallery (deprecated in 1.22) was removed. + Use ImageGalleryBase::factory instead. +* Title::moveNoAuth() (deprecated in 1.25) was removed. Use MovePage class instead. +* Hook UnknownAction (deprecated in 1.19) was actually deprecated (it will now + emit warnings). Create a subclass of Action and add it to $wgActions instead. +* WikiRevision::getText() (deprecated since 1.21) is no longer marked deprecated. +* Linker::getInterwikiLinkAttributes() (deprecated since 1.25) was removed. +* Linker::getInternalLinkAttributes() (deprecated since 1.25) was removed. +* Linker::getInternalLinkAttributesObj() (deprecated since 1.25) was removed. +* Linker::getLinkAttributesInternal() (deprecated since 1.25) was removed. +* RedisConnectionPool::handleException (deprecated since 1.23) was removed. +* The static properties mw.Api.errors and mw.Api.warnings, containing incomplete + and outdated lists of errors/warnings returned by the API, are now deprecated. +* wiki.phtml entry point was removed. Refer to index.php instead. If you want "wiki.phtml" + URLs to continue to work, set up redirects. In Apache, this can be done by enabling + mod_rewrite and adding the following rules to your configuration: + + RewriteEngine On + RewriteBase / + RewriteRule ^/w/wiki\.phtml$ /w/index.php [R=301,L] +* Hook ArticleAfterFetchContent (deprecated in 1.21) was removed. + Use ArticleAfterFetchContentObject instead. +* Hook ArticleInsertComplete (deprecated in 1.21) was removed. + Use PageContentInsertComplete instead. +* Hook ArticleSave (deprecated in 1.21) was removed. + Use PageContentSave instead. +* Hook ArticleSaveComplete (deprecated in 1.21) was removed. + Use PageContentSaveComplete instead. +* Hook EditFilterMerged (deprecated in 1.21) was removed. + Use EditFilterMergedContent instead. +* Hook EditPageGetPreviewText (deprecated in 1.21) was removed. + Use EditPageGetPreviewContent instead. +* Hook TitleIsCssOrJsPage (deprecated in 1.21) was removed. + Use ContentHandlerDefaultModelFor instead. +* Hook TitleIsWikitextPage (deprecated in 1.21) was removed. + Use ContentHandlerDefaultModelFor instead. +* Article::getContent() (deprecated in 1.21) was removed. +* Revision::getText() (deprecated in 1.21) was removed. +* Article::doEdit() and WikiPage::doEdit() (deprecated in 1.21) were removed. +* Parser::replaceUnusualEscapes() (deprecated in 1.24) was removed. +* Article::doEditContent() was marked as deprecated, to be removed in 1.30 + or later. +* ContentHandler::runLegacyHooks() was removed. +* refreshLinks.php now can be limited to a particular category with --category=... + or a tracking category with --tracking-category=... +* User-like objects that are passed to SpecialUserRights and its subclasses are + now required to have a getGroupMemberships() method. See UserRightsProxy for + an example. +* User::$mGroups (instance variable) was marked private. Use User::getGroups() + instead. +* User::getGroupName(), User::getGroupMember(), User:getGroupPage(), + User::makeGroupLinkHTML(), and User::makeGroupLinkWiki() were deprecated. + Use equivalent methods on the UserGroupMembership class. +* Maintenance scripts and tests that call User::addGroup() must now ensure that + User objects have been added to the database prior to calling addGroup(). +* Protected function UsersPager::getGroups() was removed, and protected function + UsersPager::buildGroupLink() was changed from a static to an instance method. +* The third parameter ($cache) to the UsersPagerDoBatchLookups hook was changed; + see docs/hooks.txt. +* User::crypt() (deprecated in 1.24) was removed. +* User::comparePasswords() (deprecated in 1.24) was removed. +* ArchivedFile::getUserText() (deprecated in 1.23) was removed. +* HTMLFileCache::newFromTitle() (deprecated in 1.24) was removed. +* BREAKING CHANGE: Internal signature changes to ChangesListSpecialPage + and subclasses. It should only break if you call buildMainQueryConds + (changed to buildQuery with new signature) or doMainQuery (new + signature). Subclasses are likely to call at least doMainQuery + (possibly both), but other classes might too, because they were + public. + Also, some related hooks were deprecated, but this is not yet a + breaking change. +* Removed 'jquery.arrowSteps' module. (deprecated since 1.28) +* The 'jquery.autoEllipsis' ResourceLoader module is now deprecated. +* WikiRevision::$fileIsTemp was deprecated. +* WikiRevision::$importer was deprecated. +* WikiRevision::$user was deprecated. +* Article::getLastPurgeTimestamp(), WikiPage::getLastPurgeTimestamp(), and the + WikiPage::PURGE_* constants are deprecated, and the functions will always + return false. They were a hack for an issue that has since been fixed. +* Hook 'EditPageBeforeEditChecks' is now deprecated. Instead use the new hook + 'EditPageGetCheckboxesDefinition', or 'EditPage::showStandardInputs:options' + if you don't actually care about checkboxes and just want to add some HTML + to the page. +* Selflinks are now rendered as href-less tags with the class mw-selflink + rather than tags. The old class name, "selflink", was deprecated + and will be removed in a future release. (T160480) +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* Browser support for non-ES5 JavaScript browsers, including Android 2, + Opera <12.10, and Internet Explorer 9, was lowered from Grade A to Grade C. +* Removed wikibits global methods deprecated since MediaWiki 1.17 (T122755): + is_gecko, is_chrome_mac, is_chrome, webkit_version, is_safari_win, is_safari, + webkit_match, is_ff2, ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, + opera7_bugs, opera6_bugs, is_opera_95, is_opera_preseven, is_opera, + ie6_bugs, clientPC, changeText, killEvt, addHandler, hookEvent, + addClickHandler, removeHandler, getElementsByClassName, getInnerText, + setupCheckboxShiftClick, addCheckboxClickHandlers, mwEditButtons, + mwCustomEditButtons, injectSpinner, removeSpinner, escapeQuotes, + escapeQuotesHTML, jsMsg, addPortletLink, appendCSS, tooltipAccessKeyPrefix, + tooltipAccessKeyRegexp, updateTooltipAccessKeys. +* The ID of the
  • element containing the login link has changed from + 'pt-login' to 'pt-login-private' in private wikis. +* The old, neglected "bulletin board style toolbar" in the edit form is now + deprecated (T30856). This old code dates from 2006, and was replaced in the + MediaWiki release tarball and in Wikimedia production by the WikiEditor + extension in 2010. It is only shown to users if no other editor was + installed, and leads to confusion. +* (T92459) Loading ResourceLoader modules containing JavaScript through + addModuleStyles() is deprecated and will log a warning server-side. + += MediaWiki 1.28 = + +== MediaWiki 1.28.1 == + +This is a security and maintenance release of the MediaWiki 1.28 branch. + +=== Changes since 1.28.0 === + +* $wgRunJobsAsync is now false by default (T142751). This change only affects + wikis with $wgJobRunRate > 0. +* Fix fatal from "WaitConditionLoop" not being found, experienced when a wiki has + more than one database server setup. +* (T152717) Better escaping for PHP mail() command, +* (T154670) A missing method causing the MySQL installer to fatal in rare + circumstances was restored. +* (T154672) Un-deprecate ArticleAfterFetchContentObject hook. +* (T158766) Avoid SQL error on MSSQL when using selectRowCount(). +* (T145635) Fix too long index error when installing with MSSQL. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T154872) Fix incorrect ar_usertext_timestamp index names in new 1.28 installs. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. == MediaWiki 1.28 == @@ -326,6 +699,49 @@ There's usually someone online in #mediawiki on irc.freenode.net. = MediaWiki 1.27 = +== MediaWiki 1.27.2 == +This is a security and maintenance release of the MediaWiki 1.27 branch. + +ApiCreateAccount was removed in 1.27.0. It was incorrectly still marked as +deprecated (rather than already removed) in the RELEASE-NOTES at the point 1.27.0 +was released. + +=== Changes since 1.27.1 === + +* (T68404) CSS3 attr() function with url type argument is no longer allowed + in inline styles. +* $wgRunJobsAsync is now false by default (T142751). This change only affects + wikis with $wgJobRunRate > 0. +* (T152717) Better escaping for PHP mail() command +* Submitting the lgtoken and lgpassword parameters in the query string to + action=login is now deprecated and outputs a warning. They should be submitted + in the POST body instead. +* Submitting sensitive authentication request parameters to action=clientlogin, + action=createaccount, action=linkaccount, and action=changeauthenticationdata + in the query string is now deprecated and outputs a warning. They should be + submitted in the POST body instead. +* (T158766) Avoid SQL error on MSSQL when using selectRowCount() +* (T145635) Fix too long index error when installing with MSSQL. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + == MediaWiki 1.27.1 == This is a maintenance release of the MediaWiki 1.27 branch. @@ -2670,6 +3086,32 @@ of files that are no longer available follows. = MediaWiki 1.23 = +== MediaWiki 1.23.16 == +This is a security and maintenance release of the MediaWiki 1.23 branch. + +=== Changes since 1.23.15 === +* (T68404) CSS3 attr() function with url type is no longer allowed + in inline styles. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* Submitting the lgtoken and lgpassword parameters in the query string to + action=login is now deprecated and outputs a warning. They should be submitted + in the POST body instead. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + == MediaWiki 1.23.15 == This is a maintenance release of the MediaWiki 1.23 branch. diff --git a/INSTALL b/INSTALL index 90da38159c..13c9c62600 100644 --- a/INSTALL +++ b/INSTALL @@ -8,7 +8,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki Required software: * Web server with PHP 5.5.9 or higher. * A SQL server, the following types are supported -** MySQL 5.0.3 or higher +** MySQL 5.5.8 or higher ** PostgreSQL 8.3 or higher ** SQLite 3.3.7 or higher ** Oracle 9.0.1 or higher diff --git a/RELEASE-NOTES-1.29 b/RELEASE-NOTES-1.29 deleted file mode 100644 index 8eb1f896a3..0000000000 --- a/RELEASE-NOTES-1.29 +++ /dev/null @@ -1,327 +0,0 @@ -== MediaWiki 1.29 == - -THIS IS NOT A RELEASE YET - -MediaWiki 1.29 is an alpha-quality branch and is not recommended for use in -production. - -=== Configuration changes in 1.29 === -* Default cookie expiration time has been reduced to 30 days. Login cookie - expiration time is kept at 180 days. -* A new configuration variable has been added: $wgCookieSetOnAutoblock. This - determines whether to set a cookie when a user is autoblocked. Doing so means - that a blocked user, even after logging out and moving to a new IP address, - will still be blocked. -* The resetpassword right and associated password reset capture feature has - been removed. -* The $error parameter to the EmailUser hook should be set to a Status object - or boolean false. This should be compatible with at least MediaWiki 1.23 if - not earlier. Returning a raw HTML string is now deprecated. -* The $message parameter to the ApiCheckCanExecute hook should be set to an - ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a - code for ApiBase::parseMsg() will no longer work. -* ApiBase::$messageMap is no longer public. Code attempting to access it will - result in a PHP fatal error. -* $wgUserEmailUseReplyTo is now true by default to work around restrictive DMARC - policies. -* Subpages are now enabled by default in the Template namespace. Set - $wgNamespacesWithSubpages[NS_TEMPLATE] to false to keep the old behavior. -* $wgRunJobsAsync is now false by default (T142751). This change only affects - wikis with $wgJobRunRate > 0. -* A temporary feature flag, $wgDisableUserGroupExpiry, is provided to disable - new features that rely on the schema changes to the user_groups table. This - feature flag will likely be removed before 1.29 is released. -* (T158474) "Unknown user" has been added to $wgReservedUsernames. -* (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs. -* $wgDummyLanguageCodes is deprecated. Additional language code mappings may be - added to $wgExtraLanguageCodes instead. - -=== New features in 1.29 === -* (T5233) A cookie can now be set when a user is autoblocked, to track that user - if they move to a new IP address. This is disabled by default. -* Added ILocalizedException interface to standardize the use of localized - exceptions, largely so the API can handle them more sensibly. -* Blocks created automatically by MediaWiki, such as for configured proxies or - dnsbls, are now indicated as such and use a new i18n message when displayed. -* Added new $wgHTTPImportTimeout setting. Sets timeout for - downloading the XML dump during a transwiki import in seconds. -* Parser limit report is now available in machine-readable format to JavaScript - via mw.config.get('wgPageParseReport'). -* Added $wgSoftBlockRanges, to allow for automatically blocking anonymous edits - from certain IP ranges (e.g. private IPs). -* (T59603) Added new magic word {{PAGELANGUAGE}} which returns the language code - of the page being parsed. -* HTML5 form validation attributes will no longer be suppressed. Originally - browsers had poor support for them, but modern browsers handle them fine. - This might affect some forms that used them and only worked because the - attributes were not actually being set. -* Expiry times can now be specified when users are added to user groups. -* Completely new user interface for the RecentChanges page, which - structures filters into user-friendly groups. This has corresponding - changes to how filters are registered by core and extensions. - -=== External library changes in 1.29 === - -==== Upgraded external libraries ==== -* Added wikimedia/timestamp v1.0.0. -* Updated QUnit from v1.22.0 to v1.23.1. -* Updated cssjanus from v1.1.2 to 1.1.3. -* Updated psr/log from v1.0.0 to v1.0.2. -* Update Moment.js from v2.8.4 to v2.15.0. -* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.13. - -==== New external libraries ==== - -==== Removed and replaced external libraries ==== - -=== Bug fixes in 1.29 === -* (T62604) Core parser functions returning a number now format the number according - to the page content language, not wiki content language. -* (T27187) Search suggestions based on jquery.suggestions will now correctly only - highlight prefix matches in the results. -* (T157035) "new mw.Uri()" was ignoring options when using default URI. - -=== Action API changes in 1.29 === -* Submitting sensitive authentication request parameters to action=login, - 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. -* The capture option for action=resetpassword has been removed -* action=clearhasmsg now requires a POST. -* (T47843) API errors and warnings may be requested in non-English languages - using the new 'errorformat', 'errorlang', and 'errorsuselocal' parameters. -* API error codes may have changed. Most notably, errors from modules using - parameter prefixes (e.g. all query submodules) will no longer be prefixed. -* ApiPageSet-using modules will report the 'invalidreason' using the specified - 'errorformat'. -* action=emailuser may return a "Warnings" status, and now returns 'warnings' and - 'errors' subelements (as applicable) instead of 'message'. -* action=imagerotate returns an 'errors' subelement rather than 'errormessage'. -* action=move now reports errors when moving the talk page as an array under - key 'talkmove-errors', rather than using 'talkmove-error-code' and - 'talkmove-error-info'. The format for subpage move errors has also changed. -* action=revisiondelete no longer includes a "rendered" property on warnings - and errors for each item. Use errorformat=wikitext if you're wanting parsed - output. -* action=rollback no longer returns a "messageHtml" property. Use - errorformat=html if you're wanting HTML formatting of error messages. -* action=upload now reports optional stash failures as an array under key - 'stasherrors' rather than a 'stashfailed' text string. -* action=watch reports 'errors' and 'warnings' instead of a single 'error', and - no longer returns a 'message' on success. -* Added action=validatepassword to validate passwords for the account creation - and password change forms. -* action=purge now requires a POST. -* There is a new `languagevariants` siprop for action=query&meta=siteinfo, - which returns a list of languages with active LanguageConverter instances. - -=== Action API internal changes in 1.29 === -* New methods were added to ApiBase to handle errors and warnings using i18n - keys. Methods for using hard-coded English messages were deprecated: - * ApiBase::dieUsage() was deprecated - * ApiBase::dieUsageMsg() was deprecated - * ApiBase::dieUsageMsgOrDebug() was deprecated - * ApiBase::getErrorFromStatus() was deprecated - * ApiBase::parseMsg() was deprecated - * ApiBase::setWarning() was deprecated -* ApiBase::$messageMap is no longer public. Code attempting to access it will - result in a PHP fatal error. -* The $message parameter to the ApiCheckCanExecute hook should be set to an - ApiMessage. This is compatible with MediaWiki 1.27 and later. Returning a - code for ApiBase::parseMsg() will no longer work. -* UsageException is deprecated in favor of ApiUsageException. For the time - being ApiUsageException is a subclass of UsageException to allow things that - catch only UsageException to still function properly. -* If, for some strange reason, code was using an ApiErrorFormatter instead of - ApiErrorFormatter_BackCompat, note that the result format has changed and - various methods now take a module path rather than a module name. -* ApiMessageTrait::getApiCode() now strips 'apierror-' and 'apiwarn-' prefixes - from the message key, and maps some message keys for backwards compatibility. - -=== Languages updated in 1.29 === - -MediaWiki supports over 350 languages. Many localisations are updated -regularly. Below only new and removed languages are listed, as well as -changes to languages because of Phabricator reports. - -* Based as always on linguistic studies on intelligibility and language - knowledge by geography, language fallbacks have been expanded. When a - translation is missing in the user's preferred interface language, the - corresponding translation for the fallback language will be used instead. - English will only be used as last resort when there are no translations. - Some configurations (such as date formats and gender namespaces) have also - been updated when using the fallback language's configuration was inadequate. - The new or reinstated language fallbacks are (after cs ↔ sk in 1.28): - ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro; - sh → bs, sr-el, hr. -* (T155957) Talk Namespaces for Javanese language (jv) have been updated. - -==== No fallback for Ukrainian ==== -* (T39314) The fallback from Ukrainian to Russian was removed. The Ukrainian - language will now use the default fallback language: English. When a translation - to Ukrainian is not available, an English string will be shown. - -=== Other changes in 1.29 === -* Database::getSearchEngine() (deprecated in 1.28) was removed. Use - SearchEngineFactory::getSearchEngineClass() instead. -* $wgSessionsInMemcached (deprecated in 1.20) was removed. No replacement is - required as all sessions are stored in Object Cache now. -* MWHttpRequest::execute() should be considered to return a StatusValue; the - Status return type is deprecated. -* User::edits() (deprecated in 1.21) was removed. -* Xml::escapeJsString() (deprecated in 1.21) was removed. -* Article::getText() and Article::prepareTextForEdit() (deprecated in 1.21) - were removed. -* Article::getAutosummary() and WikiPage::getAutosummary() (deprecated in 1.21) - were removed. -* Hook ArticleViewCustom (deprecated in 1.21) was removed. Use ArticleContentViewCustom - instead. -* Hooks EditPageGetDiffText and ShowRawCssJs (deprecated in 1.21) were removed. -* Class RevisiondeleteAction (deprecated in 1.25) was removed. -* WikiPage::prepareTextForEdit() (deprecated in 1.21) was removed. -* WikiPage::getText() (deprecated in 1.21) was removed. -* Article::fetchContent() (deprecated in 1.21) was removed. -* User::getPassword() (deprecated in 1.27) was removed. -* User::getTemporaryPassword() (deprecated in 1.27) was removed. -* User::isPasswordReminderThrottled() (deprecated in 1.27) was removed. -* Class FSRepo (deprecated in 1.19) was removed. -* WebRequest::checkSessionCookie() (deprecated in 1.27) was removed. Use - \MediaWiki\Session\SessionManager::singleton()->getPersistedSessionId() instead. -* Class ImageGallery (deprecated in 1.22) was removed. - Use ImageGalleryBase::factory instead. -* Title::moveNoAuth() (deprecated in 1.25) was removed. Use MovePage class instead. -* Hook UnknownAction (deprecated in 1.19) was actually deprecated (it will now - emit warnings). Create a subclass of Action and add it to $wgActions instead. -* WikiRevision::getText() (deprecated since 1.21) is no longer marked deprecated. -* Linker::getInterwikiLinkAttributes() (deprecated since 1.25) was removed. -* Linker::getInternalLinkAttributes() (deprecated since 1.25) was removed. -* Linker::getInternalLinkAttributesObj() (deprecated since 1.25) was removed. -* Linker::getLinkAttributesInternal() (deprecated since 1.25) was removed. -* RedisConnectionPool::handleException (deprecated since 1.23) was removed. -* The static properties mw.Api.errors and mw.Api.warnings, containing incomplete - and outdated lists of errors/warnings returned by the API, are now deprecated. -* wiki.phtml entry point was removed. Refer to index.php instead. If you want "wiki.phtml" - URLs to continue to work, set up redirects. In Apache, this can be done by enabling - mod_rewrite and adding the following rules to your configuration: - - RewriteEngine On - RewriteBase / - RewriteRule ^/w/wiki\.phtml$ /w/index.php [R=301,L] -* Hook ArticleAfterFetchContent (deprecated in 1.21) was removed. - Use ArticleAfterFetchContentObject instead. -* Hook ArticleInsertComplete (deprecated in 1.21) was removed. - Use PageContentInsertComplete instead. -* Hook ArticleSave (deprecated in 1.21) was removed. - Use PageContentSave instead. -* Hook ArticleSaveComplete (deprecated in 1.21) was removed. - Use PageContentSaveComplete instead. -* Hook EditFilterMerged (deprecated in 1.21) was removed. - Use EditFilterMergedContent instead. -* Hook EditPageGetPreviewText (deprecated in 1.21) was removed. - Use EditPageGetPreviewContent instead. -* Hook TitleIsCssOrJsPage (deprecated in 1.21) was removed. - Use ContentHandlerDefaultModelFor instead. -* Hook TitleIsWikitextPage (deprecated in 1.21) was removed. - Use ContentHandlerDefaultModelFor instead. -* Article::getContent() (deprecated in 1.21) was removed. -* Revision::getText() (deprecated in 1.21) was removed. -* Article::doEdit() and WikiPage::doEdit() (deprecated in 1.21) were removed. -* Parser::replaceUnusualEscapes() (deprecated in 1.24) was removed. -* Article::doEditContent() was marked as deprecated, to be removed in 1.30 - or later. -* ContentHandler::runLegacyHooks() was removed. -* refreshLinks.php now can be limited to a particular category with --category=... - or a tracking category with --tracking-category=... -* User-like objects that are passed to SpecialUserRights and its subclasses are - now required to have a getGroupMemberships() method. See UserRightsProxy for - an example. -* User::$mGroups (instance variable) was marked private. Use User::getGroups() - instead. -* User::getGroupName(), User::getGroupMember(), User:getGroupPage(), - User::makeGroupLinkHTML(), and User::makeGroupLinkWiki() were deprecated. - Use equivalent methods on the UserGroupMembership class. -* Maintenance scripts and tests that call User::addGroup() must now ensure that - User objects have been added to the database prior to calling addGroup(). -* Protected function UsersPager::getGroups() was removed, and protected function - UsersPager::buildGroupLink() was changed from a static to an instance method. -* The third parameter ($cache) to the UsersPagerDoBatchLookups hook was changed; - see docs/hooks.txt. -* User::crypt() (deprecated in 1.24) was removed. -* User::comparePasswords() (deprecated in 1.24) was removed. -* ArchivedFile::getUserText() (deprecated in 1.23) was removed. -* HTMLFileCache::newFromTitle() (deprecated in 1.24) was removed. -* BREAKING CHANGE: Internal signature changes to ChangesListSpecialPage - and subclasses. It should only break if you call buildMainQueryConds - (changed to buildQuery with new signature) or doMainQuery (new - signature). Subclasses are likely to call at least doMainQuery - (possibly both), but other classes might too, because they were - public. - - Also, some related hooks were deprecated, but this is not yet a - breaking change. - -== Compatibility == - -MediaWiki 1.29 requires PHP 5.5.9 or later. There is experimental support for -HHVM 3.6.5 or later. - -MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but -support for them is somewhat less mature. There is experimental support for -Oracle and Microsoft SQL Server. - -The supported versions are: - -* MySQL 5.0.3 or later -* PostgreSQL 8.3 or later -* SQLite 3.3.7 or later -* Oracle 9.0.1 or later -* Microsoft SQL Server 2005 (9.00.1399) - -== Upgrading == - -1.29 has several database changes since 1.28, and will not work without schema -updates. Note that due to changes to some very large tables like the revision -table, the schema update may take quite long (minutes on a medium sized site, -many hours on a large site). - -If upgrading from before 1.11, and you are using a wiki as a commons -repository, make sure that it is updated as well. Otherwise, errors may arise -due to database schema changes. - -If upgrading from before 1.7, you may want to run refreshLinks.php to ensure -new database fields are filled with data. - -If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to -1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed -with MediaWiki 1.21. - -Don't forget to always back up your database before upgrading! - -See the file UPGRADE for more detailed upgrade instructions. - -For notes on 1.28.x and older releases, see HISTORY. - -== Online documentation == - -Documentation for both end-users and site administrators is available on -MediaWiki.org, and is covered under the GNU Free Documentation License (except -for pages that explicitly state that their contents are in the public domain): - - https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation - -== Mailing list == - -A mailing list is available for MediaWiki user support and discussion: - - https://lists.wikimedia.org/mailman/listinfo/mediawiki-l - -A low-traffic announcements-only list is also available: - - https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce - -It's highly recommended that you sign up for one of these lists if you're -going to run a public MediaWiki, so you can be notified of security fixes. - -== IRC help == - -There's usually someone online in #mediawiki on irc.freenode.net. diff --git a/RELEASE-NOTES-1.30 b/RELEASE-NOTES-1.30 new file mode 100644 index 0000000000..9474f21fd2 --- /dev/null +++ b/RELEASE-NOTES-1.30 @@ -0,0 +1,221 @@ +== MediaWiki 1.30 == + +THIS IS NOT A RELEASE YET + +MediaWiki 1.30 is an alpha-quality branch and is not recommended for use in +production. + +=== MySQL version requirement in 1.30 === +As of 1.30, MediaWiki now requires MySQL 5.5.8 or higher (see Compatibility +section). + +=== Configuration changes in 1.30 === +* The "C.UTF-8" locale should be used for $wgShellLocale, if available, to avoid + unexpected behavior when code uses locale-sensitive string comparisons. For + example, the Scribunto extension considers "bar" < "Foo" in most locales + since it ignores case. +* $wgShellLocale now affects LC_ALL rather than only LC_CTYPE. See + documentation of $wgShellLocale for details. +* $wgShellLocale is now applied for all requests. wfInitShellLocale() is + deprecated and a no-op, as it is no longer needed. +* $wgJobClasses may now specify callback functions as an alternative to plain + class names. This is intended for extensions that want control over the + instantiation of their jobs, to allow for proper dependency injection. +* $wgResourceModules may now specify callback functions as an alternative + to plain class names, using the 'factory' key in the module description + array. This allows dependency injection to be used for ResourceLoader modules. +* $wgExceptionHooks has been removed. +* (T45547) $wgUsePigLatinVariant added (off by default). +* (T152540) MediaWiki now supports a section ID escaping style that allows to display + non-Latin characters verbatim on many modern browsers. This is controlled by the + new configuration setting, $wgFragmentMode. +* $wgExperimentalHtmlIds is now deprecated and will be removed in a future version, + use $wgFragmentMode to migrate off it to a modern alternative. +* $wgExternalInterwikiFragmentMode was introduced to control how fragments in + sinterwikis going outside of current wiki farm are encoded. + +=== New features in 1.30 === +* (T37247) Output from Parser::parse() will now be wrapped in a div with + class="mw-parser-output" by default. This may be changed or disabled using + ParserOptions::setWrapOutputClass(). +* Added 'ChangeTagsAllowedAdd' hook, enabling extensions to allow software- + specific tags to be added by users. +* Added a 'ParserOptionsRegister' hook to allow extensions to register + additional parser options. +* (T45547) Included Pig Latin, a language game in English, as a + LanguageConverter variant. This allows English-speaking developers + to develop and test LanguageConverter more easily. Pig Latin can be + enabled by setting $wgUsePigLatinVariant to true. +* Added RecentChangesPurgeRows hook to allow extensions to purge data that + depends on the recentchanges table. +* Added JS config values wgDiffOldId/wgDiffNewId to the output of diff pages. +* (T2424) Added direct unwatch links to entries in Special:Watchlist (if the + 'watchlistunwatchlinks' preference option is enabled). With JavaScript + enabled, these links toggle so the user can also re-watch pages that have + just been unwatched. +* Added $wgParserTestMediaHandlers, where mock media handlers can be passed to + MediaHandlerFactory for parser tests. + +=== Languages updated in 1.30 === + +* Support for kbp (KabÉ©yɛ / Kabiyè) was added. +* Support for skr (Saraiki, سرائیکی) was added. + +=== External library changes in 1.30 === + +==== Upgraded external libraries ==== +* mediawiki/mediawiki-codesniffer updated to 0.8.1. +* wikimedia/composer-merge-plugin updated to 1.4.1. + +==== New external libraries ==== +* The class \TestingAccessWrapper has been moved to the external library + wikimedia/testing-access-wrapper and renamed \Wikimedia\TestingAccessWrapper. + +==== Removed and replaced external libraries ==== +* … + +=== Bug fixes in 1.30 === +* (T151633) Ordered list items use now Devanagari digits in Nepalese + (thanks to Sfic) + +=== Action API changes in 1.30 === +* (T37247) action=parse output will be wrapped in a div with + class="mw-parser-output" by default. This may be changed or disabled using + the new 'wrapoutputclass' parameter. +* When errorformat is not 'bc', abort reasons from action=login will be + formatted as specified by the error formatter parameters. +* action=compare can now handle arbitrary text, deleted revisions, and + returning users and edit comments. +* (T164106) The 'rvdifftotext', 'rvdifftotextpst', 'rvdiffto', + 'rvexpandtemplates', 'rvgeneratexml', 'rvparse', and 'rvprop=parsetree' + parameters to prop=revisions are deprecated, as are the similarly named + parameters to prop=deletedrevisions, list=allrevisions, and + list=alldeletedrevisions. Use action=compare, action=parse, or + action=expandtemplates instead. + +=== Action API internal changes in 1.30 === +* ApiBase::getDescriptionMessage() and the "apihelp-*-description" messages are + deprecated. The existing message should be split between "apihelp-*-summary" + and "apihelp-*-extended-description". +* (T123931) Individual values of multi-valued parameters can now be marked as + deprecated. + +=== Languages updated in 1.30 === +MediaWiki supports over 350 languages. Many localisations are updated +regularly. Below only new and removed languages are listed, as well as +changes to languages because of Phabricator reports. + +* … + +==== Pig Latin added ==== +* (T45547) Added Pig Latin, a made-up English variant (en-x-piglatin), + for easier variant development and testing. Disabled by default. It can be + enabled by setting $wgUsePigLatinVariant to true. + +=== Other changes in 1.30 === +* The use of an associative array for $wgProxyList, where the IP address is in + the key instead of the value, is deprecated (e.g. [ '127.0.0.1' => 'value' ]). + Please convert these arrays to indexed/sequential ones (e.g. [ '127.0.0.1' ]). +* mw.user.bucket (deprecated in 1.23) was removed. +* LoadBalancer::getServerInfo() and LoadBalancer::setServerInfo() are + deprecated. There are no known callers. +* File::getStreamHeaders() was deprecated. +* MediaHandler::getStreamHeaders() was deprecated. +* Title::canTalk() was deprecated. The new Title::canHaveTalkPage() should be + used instead. +* MWNamespace::canTalk() was deprecated. The new MWNamespace::hasTalkNamespace() + should be used instead. +* The ExtractThumbParameters hook (deprecated in 1.21) was removed. +* The OutputPage::addParserOutputNoText and ::getHeadLinks methods (both + deprecated in 1.24) were removed. +* wfMemcKey() and wfGlobalCacheKey() were deprecated. BagOStuff::makeKey() and + BagOStuff::makeGlobalKey() should be used instead. +* (T146304) Preprocessor handling of LanguageConverter markup has been improved. + As a result of the new uniform handling, '-{' may need to be escaped + (for example, as '-{') where it occurs inside template arguments + or wikilinks. +* (T163966) Page moves are now counted as edits for the purposes of + autopromotion, i.e., they increment the user_editcount field in the database. +* Two new hooks, LogEventsListLineEnding and NewPagesLineEnding, were added for + manipulating Special:Log and Special:NewPages lines. +* The OldChangesListRecentChangesLine, EnhancedChangesListModifyLineData, + PageHistoryLineEnding, ContributionsLineEnding and DeletedContributionsLineEnding + hooks have an additional parameter, for manipulating HTML data attributes of + RC/history lines. EnhancedChangesListModifyBlockLineData can do that via the + $data['attribs'] subarray. +* (T130632) The OutputPage::enableTOC() method was removed. +* WikiPage::getParserOutput() will now throw an exception if passed + ParserOptions that would pollute the parser cache. Callers should use + WikiPage::makeParserOptions() to create the ParserOptions object and only + change options that affect the parser cache key. +* Article::viewRedirect() is deprecated. +* DeprecatedGlobal no longer supports passing in a direct value, it requires a + callable factory function or a class name. +* The $parserMemc global, wfGetParserCacheStorage(), and ParserCache::singleton() + are all deprecated. The main ParserCache instance should be obtained from + MediaWikiServices instead. Access to the underlying BagOStuff is possible + through the new ParserCache::getCacheStorage() method. +* .mw-ui-constructive CSS class (deprecated in 1.27) was removed. +* Sanitizer::escapeId() was deprecated, use escapeIdForAttribute(), + escapeIdForLink() or escapeIdForExternalInterwiki() instead. +* Title::escapeFragmentForURL() was deprecated, use one of the aforementioned + Sanitizer functions or, if possible, Title::getFragmentForURL(). +* Second parameter to Sanitizer::escapeIdReferenceList() ($options) now does + nothing and is deprecated. +* mw.util.escapeId() was deprecated, use escapeIdForAttribute() or + escapeIdForLink(). +* MagicWord::replaceMultiple() (deprecated in 1.25) was removed. +* WikiImporter now requires the second parameter to be an instance of the Config, + class. Prior to that, the Config parameter was optional (a behavior deprecated in + 1.25). + +== Compatibility == +MediaWiki 1.30 requires PHP 5.5.9 or later. There is experimental support for +HHVM 3.6.5 or later. + +MySQL/MariaDB is the recommended DBMS. PostgreSQL or SQLite can also be used, +but support for them is somewhat less mature. There is experimental support for +Oracle and Microsoft SQL Server. + +The supported versions are: + +* MySQL 5.5.8 or later +* PostgreSQL 8.3 or later +* SQLite 3.3.7 or later +* Oracle 9.0.1 or later +* Microsoft SQL Server 2005 (9.00.1399) + +== Upgrading == +1.30 has several database changes since 1.29, and will not work without schema +updates. Note that due to changes to some very large tables like the revision +table, the schema update may take a long time (minutes on a medium sized site, +many hours on a large site). + +Don't forget to always back up your database before upgrading! + +See the file UPGRADE for more detailed upgrade instructions, including +important information when upgrading from versions prior to 1.11. + +For notes on 1.29.x and older releases, see HISTORY. + +== Online documentation == +Documentation for both end-users and site administrators is available on +MediaWiki.org, and is covered under the GNU Free Documentation License (except +for pages that explicitly state that their contents are in the public domain): + + https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation + +== Mailing list == +A mailing list is available for MediaWiki user support and discussion: + + https://lists.wikimedia.org/mailman/listinfo/mediawiki-l + +A low-traffic announcements-only list is also available: + + https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce + +It's highly recommended that you sign up for one of these lists if you're +going to run a public MediaWiki, so you can be notified of security fixes. + +== IRC help == +There's usually someone online in #mediawiki on irc.freenode.net. diff --git a/Rakefile b/Rakefile deleted file mode 100644 index 59f5480572..0000000000 --- a/Rakefile +++ /dev/null @@ -1,17 +0,0 @@ -require 'bundler/setup' - -require 'rubocop/rake_task' -RuboCop::RakeTask.new(:rubocop) do |task| - # if you use mediawiki-vagrant, rubocop will by default use it's .rubocop.yml - # the next line makes it explicit that you want .rubocop.yml from the directory - # where `bundle exec rake` is executed - task.options = ['-c', '.rubocop.yml'] -end - -require 'mediawiki_selenium/rake_task' -MediawikiSelenium::RakeTask.new(site_tag: false) - -task default: [:test] - -desc 'Run all build/tests commands (CI entry point)' -task test: [:rubocop] diff --git a/UPGRADE b/UPGRADE index 3ec1a22270..0e6ad9b0b8 100644 --- a/UPGRADE +++ b/UPGRADE @@ -109,6 +109,12 @@ In the "maintenance" directory, run the updateDoubleWidthSearch.php script. This will update the searchindex table for those pages that contain double-byte latin characters. +== Upgrading from 1.10 or earlier == + +If upgrading from before 1.11, and you are using a wiki as a commons +repository, make sure that it is updated as well. Otherwise, errors may arise +due to database schema changes. + == Upgrading from 1.8 or earlier == MediaWiki 1.9 and later no longer keep default localized message text @@ -135,6 +141,9 @@ to set only specific items as recommended in DefaultSettings.php. $wgLocalTZoffset was in hours, it is now using minutes. +If upgrading from before 1.7, you may want to run refreshLinks.php to ensure +new database fields are filled with data. + == Upgrading from 1.5 or earlier == Major changes have been made to the schema from 1.4.x. The updater @@ -149,7 +158,7 @@ UTF-8; an experimental command-line upgrade helper script, 'upgrade1_5.php', can do this -- run it prior to 'update.php' or the web upgrader. -NOTE that upgrade1_5.php does not work properly with recent version +NOTE that upgrade1_5.php does not work properly with recent versions of MediaWiki. If upgrading a 1.4.x wiki, you should upgrade to 1.5 first. upgrade1_5.php has been removed from MediaWiki 1.21. diff --git a/autoload.php b/autoload.php index 4ffaa11a2c..508e75bdc8 100644 --- a/autoload.php +++ b/autoload.php @@ -177,6 +177,7 @@ $wgAutoloadLocalClasses = [ 'BagOStuff' => __DIR__ . '/includes/libs/objectcache/BagOStuff.php', 'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc', 'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php', + 'BashkirUppercaseCollation' => __DIR__ . '/includes/collation/BashkirUppercaseCollation.php', 'BatchRowIterator' => __DIR__ . '/includes/utils/BatchRowIterator.php', 'BatchRowUpdate' => __DIR__ . '/includes/utils/BatchRowUpdate.php', 'BatchRowWriter' => __DIR__ . '/includes/utils/BatchRowWriter.php', @@ -188,10 +189,14 @@ $wgAutoloadLocalClasses = [ 'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php', 'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php', 'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php', + 'BenchmarkCSSMin' => __DIR__ . '/maintenance/benchmarks/benchmarkCSSMin.php', 'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php', 'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php', + 'BenchmarkJSMinPlus' => __DIR__ . '/maintenance/benchmarks/benchmarkJSMinPlus.php', + 'BenchmarkLruHash' => __DIR__ . '/maintenance/benchmarks/benchmarkLruHash.php', 'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php', 'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php', + 'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php', 'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php', 'BitmapHandler' => __DIR__ . '/includes/media/Bitmap.php', 'BitmapHandler_ClientOnly' => __DIR__ . '/includes/media/Bitmap_ClientOnly.php', @@ -258,6 +263,7 @@ $wgAutoloadLocalClasses = [ 'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php', 'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php', 'CleanupEmptyCategories' => __DIR__ . '/maintenance/cleanupEmptyCategories.php', + 'CleanupInvalidDbKeys' => __DIR__ . '/maintenance/cleanupInvalidDbKeys.php', 'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php', 'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php', 'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php', @@ -285,6 +291,7 @@ $wgAutoloadLocalClasses = [ 'Config' => __DIR__ . '/includes/config/Config.php', 'ConfigException' => __DIR__ . '/includes/config/ConfigException.php', 'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php', + 'ConfiguredReadOnlyMode' => __DIR__ . '/includes/ConfiguredReadOnlyMode.php', 'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php', 'Content' => __DIR__ . '/includes/content/Content.php', 'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php', @@ -311,6 +318,7 @@ $wgAutoloadLocalClasses = [ 'CssContentHandler' => __DIR__ . '/includes/content/CssContentHandler.php', 'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php', 'CurlHttpRequest' => __DIR__ . '/includes/http/CurlHttpRequest.php', + 'CustomUppercaseCollation' => __DIR__ . '/includes/collation/CustomUppercaseCollation.php', 'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php', 'DBAccessError' => __DIR__ . '/includes/libs/rdbms/exception/DBAccessError.php', 'DBAccessObjectUtils' => __DIR__ . '/includes/dao/DBAccessObjectUtils.php', @@ -383,6 +391,7 @@ $wgAutoloadLocalClasses = [ 'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php', 'DjVuHandler' => __DIR__ . '/includes/media/DjVu.php', 'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php', + 'DnsSrvDiscoverer' => __DIR__ . '/includes/libs/DnsSrvDiscoverer.php', 'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php', 'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php', 'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php', @@ -419,6 +428,7 @@ $wgAutoloadLocalClasses = [ 'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php', 'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php', 'EmptyBagOStuff' => __DIR__ . '/includes/libs/objectcache/EmptyBagOStuff.php', + 'EnConverter' => __DIR__ . '/languages/classes/LanguageEn.php', 'EncryptedPassword' => __DIR__ . '/includes/password/EncryptedPassword.php', 'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php', 'EnotifNotifyJob' => __DIR__ . '/includes/jobqueue/jobs/EnotifNotifyJob.php', @@ -426,6 +436,7 @@ $wgAutoloadLocalClasses = [ 'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/EnqueueableDataUpdate.php', 'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php', 'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php', + 'EtcdConfig' => __DIR__ . '/includes/config/EtcdConfig.php', 'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php', 'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php', 'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php', @@ -594,6 +605,7 @@ $wgAutoloadLocalClasses = [ 'HttpError' => __DIR__ . '/includes/exception/HttpError.php', 'HttpStatus' => __DIR__ . '/includes/libs/HttpStatus.php', 'IApiMessage' => __DIR__ . '/includes/api/ApiMessage.php', + 'IBufferingStatsdDataFactory' => __DIR__ . '/includes/libs/stats/IBufferingStatsdDataFactory.php', 'ICacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php', 'IContextSource' => __DIR__ . '/includes/context/IContextSource.php', 'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php', @@ -668,6 +680,7 @@ $wgAutoloadLocalClasses = [ 'JobQueueMemory' => __DIR__ . '/includes/jobqueue/JobQueueMemory.php', 'JobQueueReadOnlyError' => __DIR__ . '/includes/jobqueue/JobQueue.php', 'JobQueueRedis' => __DIR__ . '/includes/jobqueue/JobQueueRedis.php', + 'JobQueueSecondTestQueue' => __DIR__ . '/includes/jobqueue/JobQueueSecondTestQueue.php', 'JobRunner' => __DIR__ . '/includes/jobqueue/JobRunner.php', 'JobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php', 'JpegHandler' => __DIR__ . '/includes/media/Jpeg.php', @@ -676,6 +689,7 @@ $wgAutoloadLocalClasses = [ 'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php', 'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php', 'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php', + 'LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php', 'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php', 'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php', 'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php', @@ -692,6 +706,7 @@ $wgAutoloadLocalClasses = [ 'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php', 'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php', 'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php', + 'LanguageEn' => __DIR__ . '/languages/classes/LanguageEn.php', 'LanguageEs' => __DIR__ . '/languages/classes/LanguageEs.php', 'LanguageEt' => __DIR__ . '/languages/classes/LanguageEt.php', 'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php', @@ -862,6 +877,7 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php', 'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php', 'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php', + 'MediaWiki\\Edit\\PreparedEdit' => __DIR__ . '/includes/edit/PreparedEdit.php', 'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php', 'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php', 'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php', @@ -871,6 +887,8 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Linker\\LinkRenderer' => __DIR__ . '/includes/linker/LinkRenderer.php', 'MediaWiki\\Linker\\LinkRendererFactory' => __DIR__ . '/includes/linker/LinkRendererFactory.php', 'MediaWiki\\Linker\\LinkTarget' => __DIR__ . '/includes/linker/LinkTarget.php', + 'MediaWiki\\Logger\\ConsoleLogger' => __DIR__ . '/includes/debug/logger/ConsoleLogger.php', + 'MediaWiki\\Logger\\ConsoleSpi' => __DIR__ . '/includes/debug/logger/ConsoleSpi.php', 'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php', 'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php', 'MediaWiki\\Logger\\LoggerFactory' => __DIR__ . '/includes/debug/logger/LoggerFactory.php', @@ -946,6 +964,7 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Widget\\Search\\SearchResultWidget' => __DIR__ . '/includes/widget/search/SearchResultWidget.php', 'MediaWiki\\Widget\\Search\\SimpleSearchResultSetWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultSetWidget.php', 'MediaWiki\\Widget\\Search\\SimpleSearchResultWidget' => __DIR__ . '/includes/widget/search/SimpleSearchResultWidget.php', + 'MediaWiki\\Widget\\SelectWithInputWidget' => __DIR__ . '/includes/widget/SelectWithInputWidget.php', 'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php', 'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php', 'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php', @@ -966,6 +985,7 @@ $wgAutoloadLocalClasses = [ 'MessageBlobStore' => __DIR__ . '/includes/cache/MessageBlobStore.php', 'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php', 'MessageContent' => __DIR__ . '/includes/content/MessageContent.php', + 'MessageLocalizer' => __DIR__ . '/languages/MessageLocalizer.php', 'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php', 'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php', 'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php', @@ -1057,6 +1077,7 @@ $wgAutoloadLocalClasses = [ 'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php', 'Page' => __DIR__ . '/includes/page/Page.php', 'PageArchive' => __DIR__ . '/includes/page/PageArchive.php', + 'PageDataRequestHandler' => __DIR__ . '/includes/linkeddata/PageDataRequestHandler.php', 'PageExists' => __DIR__ . '/maintenance/pageExists.php', 'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php', 'PageProps' => __DIR__ . '/includes/PageProps.php', @@ -1099,6 +1120,7 @@ $wgAutoloadLocalClasses = [ 'PopulateInterwiki' => __DIR__ . '/maintenance/populateInterwiki.php', 'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php', 'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php', + 'PopulatePPSortKey' => __DIR__ . '/maintenance/populatePPSortKey.php', 'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php', 'PopulateRecentChangesSource' => __DIR__ . '/maintenance/populateRecentChangesSource.php', 'PopulateRevisionLength' => __DIR__ . '/maintenance/populateRevisionLength.php', @@ -1141,6 +1163,7 @@ $wgAutoloadLocalClasses = [ 'PurgeList' => __DIR__ . '/maintenance/purgeList.php', 'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php', 'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php', + 'PurgePage' => __DIR__ . '/maintenance/purgePage.php', 'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php', 'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php', 'QuickTemplate' => __DIR__ . '/includes/skins/QuickTemplate.php', @@ -1154,10 +1177,12 @@ $wgAutoloadLocalClasses = [ 'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php', 'RSSFeed' => __DIR__ . '/includes/Feed.php', 'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php', + 'RangeChronologicalPager' => __DIR__ . '/includes/pager/RangeChronologicalPager.php', 'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php', 'RawAction' => __DIR__ . '/includes/actions/RawAction.php', 'RawMessage' => __DIR__ . '/includes/Message.php', 'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php', + 'ReadOnlyMode' => __DIR__ . '/includes/ReadOnlyMode.php', 'ReassignEdits' => __DIR__ . '/maintenance/reassignEdits.php', 'RebuildAll' => __DIR__ . '/maintenance/rebuildall.php', 'RebuildFileCache' => __DIR__ . '/maintenance/rebuildFileCache.php', @@ -1169,6 +1194,7 @@ $wgAutoloadLocalClasses = [ 'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php', 'RecentChangesUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/RecentChangesUpdateJob.php', 'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php', + 'RecountCategories' => __DIR__ . '/maintenance/recountCategories.php', 'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php', 'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php', 'RedisBagOStuff' => __DIR__ . '/includes/libs/objectcache/RedisBagOStuff.php', @@ -1205,8 +1231,11 @@ $wgAutoloadLocalClasses = [ 'ResourceLoaderJqueryMsgModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderJqueryMsgModule.php', 'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php', 'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php', + 'ResourceLoaderMediaWikiUtilModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderMediaWikiUtilModule.php', 'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php', + 'ResourceLoaderOOUIFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIFileModule.php', 'ResourceLoaderOOUIImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIImageModule.php', + 'ResourceLoaderOOUIModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIModule.php', 'ResourceLoaderRawFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderRawFileModule.php', 'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php', 'ResourceLoaderSiteStylesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteStylesModule.php', @@ -1258,7 +1287,6 @@ $wgAutoloadLocalClasses = [ 'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php', 'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php', 'Sanitizer' => __DIR__ . '/includes/Sanitizer.php', - 'SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php', 'ScopedCallback' => __DIR__ . '/includes/compat/ScopedCallback.php', 'ScopedLock' => __DIR__ . '/includes/libs/lockmanager/ScopedLock.php', 'SearchApi' => __DIR__ . '/includes/api/SearchApi.php', @@ -1318,6 +1346,7 @@ $wgAutoloadLocalClasses = [ 'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php', 'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php', 'SpecialApiSandbox' => __DIR__ . '/includes/specials/SpecialApiSandbox.php', + 'SpecialAutoblockList' => __DIR__ . '/includes/specials/SpecialAutoblockList.php', 'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php', 'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php', 'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php', @@ -1339,6 +1368,7 @@ $wgAutoloadLocalClasses = [ 'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php', 'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php', 'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php', + 'SpecialGoToInterwiki' => __DIR__ . '/includes/specials/SpecialGoToInterwiki.php', 'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php', 'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php', 'SpecialLinkAccounts' => __DIR__ . '/includes/specials/SpecialLinkAccounts.php', @@ -1360,6 +1390,7 @@ $wgAutoloadLocalClasses = [ 'SpecialNewpages' => __DIR__ . '/includes/specials/SpecialNewpages.php', 'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php', 'SpecialPageAction' => __DIR__ . '/includes/actions/SpecialPageAction.php', + 'SpecialPageData' => __DIR__ . '/includes/specials/SpecialPageData.php', 'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php', 'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php', 'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php', @@ -1584,21 +1615,43 @@ $wgAutoloadLocalClasses = [ 'WikiImporter' => __DIR__ . '/includes/import/WikiImporter.php', 'WikiMap' => __DIR__ . '/includes/WikiMap.php', 'WikiPage' => __DIR__ . '/includes/page/WikiPage.php', - 'WikiReference' => __DIR__ . '/includes/WikiMap.php', + 'WikiReference' => __DIR__ . '/includes/WikiReference.php', 'WikiRevision' => __DIR__ . '/includes/import/WikiRevision.php', 'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php', 'WikiTextStructure' => __DIR__ . '/includes/content/WikiTextStructure.php', + 'Wikimedia\\Http\\HttpAcceptNegotiator' => __DIR__ . '/includes/libs/http/HttpAcceptNegotiator.php', + 'Wikimedia\\Http\\HttpAcceptParser' => __DIR__ . '/includes/libs/http/HttpAcceptParser.php', 'Wikimedia\\Rdbms\\Blob' => __DIR__ . '/includes/libs/rdbms/encasing/Blob.php', 'Wikimedia\\Rdbms\\ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php', 'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php', + 'Wikimedia\\Rdbms\\DBAccessError' => __DIR__ . '/includes/libs/rdbms/exception/DBAccessError.php', + 'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ . '/includes/libs/rdbms/database/DBConnRef.php', + 'Wikimedia\\Rdbms\\DBConnectionError' => __DIR__ . '/includes/libs/rdbms/exception/DBConnectionError.php', + 'Wikimedia\\Rdbms\\DBError' => __DIR__ . '/includes/libs/rdbms/exception/DBError.php', + 'Wikimedia\\Rdbms\\DBExpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBExpectedError.php', 'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php', + 'Wikimedia\\Rdbms\\DBQueryError' => __DIR__ . '/includes/libs/rdbms/exception/DBQueryError.php', + 'Wikimedia\\Rdbms\\DBReadOnlyError' => __DIR__ . '/includes/libs/rdbms/exception/DBReadOnlyError.php', + 'Wikimedia\\Rdbms\\DBReplicationWaitError' => __DIR__ . '/includes/libs/rdbms/exception/DBReplicationWaitError.php', + 'Wikimedia\\Rdbms\\DBTransactionError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionError.php', + 'Wikimedia\\Rdbms\\DBTransactionSizeError' => __DIR__ . '/includes/libs/rdbms/exception/DBTransactionSizeError.php', + 'Wikimedia\\Rdbms\\DBUnexpectedError' => __DIR__ . '/includes/libs/rdbms/exception/DBUnexpectedError.php', + 'Wikimedia\\Rdbms\\Database' => __DIR__ . '/includes/libs/rdbms/database/Database.php', 'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php', + 'Wikimedia\\Rdbms\\DatabaseMssql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMssql.php', + 'Wikimedia\\Rdbms\\DatabaseMysql' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysql.php', + 'Wikimedia\\Rdbms\\DatabaseMysqlBase' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqlBase.php', + 'Wikimedia\\Rdbms\\DatabaseMysqli' => __DIR__ . '/includes/libs/rdbms/database/DatabaseMysqli.php', + 'Wikimedia\\Rdbms\\DatabasePostgres' => __DIR__ . '/includes/libs/rdbms/database/DatabasePostgres.php', + 'Wikimedia\\Rdbms\\DatabaseSqlite' => __DIR__ . '/includes/libs/rdbms/database/DatabaseSqlite.php', 'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php', 'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php', 'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php', + 'Wikimedia\\Rdbms\\IDatabase' => __DIR__ . '/includes/libs/rdbms/database/IDatabase.php', 'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php', 'Wikimedia\\Rdbms\\ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php', 'Wikimedia\\Rdbms\\ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php', + 'Wikimedia\\Rdbms\\IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php', 'Wikimedia\\Rdbms\\IResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php', 'Wikimedia\\Rdbms\\LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php', 'Wikimedia\\Rdbms\\LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php', @@ -1610,6 +1663,7 @@ $wgAutoloadLocalClasses = [ 'Wikimedia\\Rdbms\\LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php', 'Wikimedia\\Rdbms\\LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php', 'Wikimedia\\Rdbms\\LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php', + 'Wikimedia\\Rdbms\\MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php', 'Wikimedia\\Rdbms\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php', 'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php', 'Wikimedia\\Rdbms\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php', @@ -1619,6 +1673,7 @@ $wgAutoloadLocalClasses = [ 'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php', 'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php', 'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php', + 'Wikimedia\\Rdbms\\SavepointPostgres' => __DIR__ . '/includes/libs/rdbms/database/utils/SavepointPostgres.php', 'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php', 'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php', 'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php', @@ -1637,11 +1692,11 @@ $wgAutoloadLocalClasses = [ 'XhprofData' => __DIR__ . '/includes/libs/XhprofData.php', 'Xml' => __DIR__ . '/includes/Xml.php', 'XmlDumpWriter' => __DIR__ . '/includes/export/XmlDumpWriter.php', - 'XmlJsCode' => __DIR__ . '/includes/Xml.php', + 'XmlJsCode' => __DIR__ . '/includes/XmlJsCode.php', 'XmlSelect' => __DIR__ . '/includes/XmlSelect.php', 'XmlTypeCheck' => __DIR__ . '/includes/libs/mime/XmlTypeCheck.php', 'ZhConverter' => __DIR__ . '/languages/classes/LanguageZh.php', 'ZipDirectoryReader' => __DIR__ . '/includes/utils/ZipDirectoryReader.php', - 'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReader.php', + 'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReaderError.php', 'profile_point' => __DIR__ . '/profileinfo.php', ]; diff --git a/composer.json b/composer.json index af8635a2bc..32933e67a6 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ }, "require": { "composer/semver": "1.4.2", - "cssjanus/cssjanus": "1.1.3", + "cssjanus/cssjanus": "1.2.0", "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", @@ -25,20 +25,20 @@ "ext-xml": "*", "liuggio/statsd-php-client": "1.0.18", "mediawiki/at-ease": "1.1.0", - "oojs/oojs-ui": "0.19.5", - "oyejorge/less.php": "1.7.0.13", + "oojs/oojs-ui": "0.22.4", + "oyejorge/less.php": "1.7.0.14", "php": ">=5.5.9", "psr/log": "1.0.2", "wikimedia/assert": "0.2.2", "wikimedia/base-convert": "1.0.1", "wikimedia/cdb": "1.4.1", "wikimedia/cldr-plural-rule-parser": "1.0.0", - "wikimedia/composer-merge-plugin": "1.3.1", + "wikimedia/composer-merge-plugin": "1.4.1", "wikimedia/html-formatter": "1.0.1", "wikimedia/ip-set": "1.1.0", "wikimedia/php-session-serializer": "1.0.4", - "wikimedia/relpath": "1.0.3", - "wikimedia/remex-html": "1.0.0", + "wikimedia/relpath": "2.0.0", + "wikimedia/remex-html": "1.0.1", "wikimedia/running-stat": "1.1.0", "wikimedia/scoped-callback": "1.0.0", "wikimedia/utfnormal": "1.1.0", @@ -49,18 +49,19 @@ }, "require-dev": { "composer/spdx-licenses": "1.1.4", + "hamcrest/hamcrest-php": "^2.0", "jakub-onderka/php-parallel-lint": "0.9.2", - "justinrainbow/json-schema": "~3.0", - "mediawiki/mediawiki-codesniffer": "0.7.2", "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a", - "monolog/monolog": "~1.18.2", + "justinrainbow/json-schema": "~5.2", + "mediawiki/mediawiki-codesniffer": "0.11.0", + "monolog/monolog": "~1.22.1", "nikic/php-parser": "2.1.0", "nmred/kafka-php": "0.1.5", - "phpunit/phpunit": "4.8.31", + "phpunit/phpunit": "4.8.35", + "psy/psysh": "0.8.5", "wikimedia/avro": "1.7.7", - "hamcrest/hamcrest-php": "^2.0", - "wmde/hamcrest-html-matchers": "^0.1.0", - "psy/psysh": "0.8.1" + "wikimedia/testing-access-wrapper": "~1.0", + "wmde/hamcrest-html-matchers": "^0.1.0" }, "suggest": { "ext-apc": "Local data and opcode cache", diff --git a/docs/database.txt b/docs/database.txt index 44ec764d95..dbc92044de 100644 --- a/docs/database.txt +++ b/docs/database.txt @@ -17,7 +17,7 @@ description of the tables and their contents, please see: To make a read query, something like this usually suffices: -$dbr = wfGetDB( DB_SLAVE ); +$dbr = wfGetDB( DB_REPLICA ); $res = $dbr->select( /* ...see docs... */ ); foreach ( $res as $row ) { ... diff --git a/docs/extension.schema.v1.json b/docs/extension.schema.v1.json index 3d6eda9ad9..7cfebcafa4 100644 --- a/docs/extension.schema.v1.json +++ b/docs/extension.schema.v1.json @@ -39,7 +39,7 @@ "url": { "type": "string", "description": "URL to the homepage for the extension.", - "format": "uri" + "format": "uri-reference" }, "description": { "type": "string", @@ -576,7 +576,7 @@ }, "JobClasses": { "type": "object", - "description": "Job types this extension implements (mapping of job type to class name)" + "description": "Job types this extension implements (mapping of job type to class name or factory function)" }, "LogTypes": { "type": "array", diff --git a/docs/extension.schema.v2.json b/docs/extension.schema.v2.json index a2fdf65aad..75a4f2c6fc 100644 --- a/docs/extension.schema.v2.json +++ b/docs/extension.schema.v2.json @@ -2,6 +2,7 @@ "$schema": "http://json-schema.org/schema#", "description": "MediaWiki extension.json schema", "type": "object", + "additionalProperties": false, "properties": { "manifest_version": { "type": "integer", @@ -39,7 +40,7 @@ "url": { "type": "string", "description": "URL to the homepage for the extension.", - "format": "uri" + "format": "uri-reference" }, "description": { "type": "string", @@ -317,7 +318,7 @@ } }, { - "description": "An arbitrary ResourceLoaderModule definition", + "description": "An arbitrary ResourceLoaderModule definition by class", "properties": { "class": { "type": "string", @@ -325,6 +326,16 @@ } }, "required": ["class"] + }, + { + "description": "An arbitrary ResourceLoaderModule definition with instantiator", + "properties": { + "factory": { + "type": "string", + "description": "A static instantiator function for creating the ResourceLoaderModule object." + } + }, + "required": ["factory"] } ] } @@ -586,7 +597,7 @@ }, "JobClasses": { "type": "object", - "description": "Job types this extension implements (mapping of job type to class name)" + "description": "Job types this extension implements (mapping of job type to class name or factory function)" }, "LogTypes": { "type": "array", @@ -653,7 +664,8 @@ "description": "Available feeds objects" }, "SkinOOUIThemes": { - "type": "object" + "type": "object", + "description": "Map of skin names to OOjs UI themes to use. Same format as ResourceLoaderOOUIModule::$builtinSkinThemeMap." }, "PasswordPolicy": { "type": "object", @@ -729,6 +741,20 @@ "type": "array", "description": "List of service wiring files to be loaded by the default instance of MediaWikiServices" }, + "attributes": { + "description":"Registration information for other extensions", + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "patternProperties": { + ".*": { + "type": ["array", "object"] + } + } + } + } + }, "load_composer_autoloader": { "type": "boolean", "description": "Load the composer autoloader for this extension, if one is present" diff --git a/docs/hooks.txt b/docs/hooks.txt index f307f45363..8912b82b70 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -74,9 +74,7 @@ Using a hook-running strategy, we can avoid having all this option-specific stuff in our mainline code. Using hooks, the function becomes: function showAnArticle( $article ) { - if ( Hooks::run( 'ArticleShow', array( &$article ) ) ) { - # code to actually show the article goes here Hooks::run( 'ArticleShowComplete', array( &$article ) ); @@ -736,7 +734,10 @@ $current: the reverted revision $create: Whether or not the restoration caused the page to be created (i.e. it didn't exist before). $comment: The comment associated with the undeletion. -$oldPageId: ID of page previously deleted (from archive table) +$oldPageId: ID of page previously deleted (from archive table). This ID will be used + for the restored page. +$restoredPages: Set of page IDs that have revisions restored for this undelete, + with keys being page IDs and values are 'true'. 'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved. $pageArchive: the PageArchive object @@ -1018,7 +1019,8 @@ RecentChangesLinked, and Watchlist). Generally, you will want to construct new ChangesListBooleanFilter or ChangesListStringOptionsFilter objects. When constructing them, you specify which group they belong to. You can reuse -existing groups (accessed through $special->getFilterGroup), or create your own. +existing groups (accessed through $special->getFilterGroup), or create your own +(ChangesListBooleanFilterGroup or ChangesListStringOptionsFilterGroup). If you create new groups, you must register them with $special->registerFilterGroup. $special: ChangesListSpecialPage instance @@ -1066,6 +1068,13 @@ $params: tag params $rc: RecentChange being tagged when the tagging accompanies the action or null $user: User who performed the tagging when the tagging is subsequent to the action or null +'ChangeTagsAllowedAdd': Called when checking if a user can add tags to a change. +&$allowedTags: List of all the tags the user is allowed to add. Any tags the + user wants to add ($addTags) that are not in this array will cause it to fail. + You may add or remove tags to this array as required. +$addTags: List of tags user intends to add. +$user: User who is adding the tags. + 'ChangeUserGroups': Called before user groups are changed. $performer: The User who will perform the change $user: The User whose groups will be changed @@ -1144,6 +1153,9 @@ $page: SpecialPage object for contributions &$ret: the HTML line $row: the DB row for this line &$classes: the classes to add to the surrounding
  • +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). 'ContributionsToolLinks': Change tool links above Special:Contributions $id: User identifier @@ -1189,6 +1201,9 @@ $page: SpecialPage object for DeletedContributions &$ret: the HTML line $row: the DB row for this line &$classes: the classes to add to the surrounding
  • +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). 'DifferenceEngineAfterLoadNewText': called in DifferenceEngine::loadNewText() after the new revision's content has been loaded into the class member variable @@ -1403,15 +1418,18 @@ textarea in the edit form. &$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff" &$tabindex: HTML tabindex of the last edit check/button -'EditPageBeforeEditChecks': Allows modifying the edit checks below the textarea -in the edit form. +'EditPageBeforeEditChecks': DEPRECATED! Use 'EditPageGetCheckboxesDefinition' instead, +or 'EditPage::showStandardInputs:options' if you don't actually care about checkboxes +and just want to add some HTML to the page. +Allows modifying the edit checks below the textarea in the edit form. &$editpage: The current EditPage object -&$checks: Array of edit checks like "watch this page"/"minor edit" +&$checks: Array of the HTML for edit checks like "watch this page"/"minor edit" &$tabindex: HTML tabindex of the last edit check/button 'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the textarea in the edit form. -&$toolbar: The toolbar HTMl +&$toolbar: The toolbar HTML +Hook subscribers can return false to avoid the default toolbar code being loaded. 'EditPageCopyrightWarning': Allow for site and per-namespace customization of contribution/copyright notice. @@ -1419,6 +1437,12 @@ $title: title of page being edited &$msg: localization message name, overridable. Default is either 'copyrightwarning' or 'copyrightwarning2'. +'EditPageGetCheckboxesDefinition': Allows modifying the edit checkboxes +below the textarea in the edit form. +$editpage: The current EditPage object +&$checkboxes: Array of checkbox definitions. See EditPage::getCheckboxesDefinition() +for the format. + 'EditPageGetDiffContent': Allow modifying the wikitext that will be used in "Show changes". Note that it is preferable to implement diff handling for different data types using the ContentHandler facility. @@ -1492,6 +1516,9 @@ $changesList: EnhancedChangesList object $block: An array of RecentChange objects in that block $rc: The RecentChange object for this line &$classes: An array of classes to change +&$attribs: associative array of other HTML attributes for the element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). 'EnhancedChangesListModifyBlockLineData': to alter data used to build a non-grouped recent change line in EnhancedChangesList. @@ -1507,13 +1534,6 @@ $ip: The ip address of the user change the tables headers. &$extTypes: associative array of extensions types -'ExtractThumbParameters': DEPRECATED! Media handler should override -MediaHandler::parseParamString instead. -Called when extracting thumbnail parameters from a thumbnail file name. -$thumbname: the base name of the thumbnail file -&$params: the currently extracted params (has source name, temp or archived -zone) - 'FetchChangesList': When fetching the ChangesList derivative for a particular user. $user: User the list is being fetched for @@ -1986,6 +2006,16 @@ $file: the File object or false if broken link &$attribs: the attributes to be applied &$ret: the value to return if your hook returns false +'LogEventsListLineEnding': Called before a Special:Log line is finished +$page: the LogEventsList object +&$ret: the HTML line +$entry: the DatabaseLogEntry object for this row +&$classes: the classes to add to the surrounding
  • +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). + + 'HtmlPageLinkRendererBegin': Used when generating internal and interwiki links in LinkRenderer, before processing starts. Return false to skip default @@ -2271,6 +2301,16 @@ $title: the diff page title (nullable) $old: the ?old= param value from the url $new: the ?new= param value from the url +'NewPagesLineEnding': Called before a NewPages line is finished. +$page: the SpecialNewPages object +&$ret: the HTML line +$row: the database row for this page (the recentchanges record and a few extras - see + NewPagesPager::getQueryInfo) +&$classes: the classes to add to the surrounding
  • +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). + 'NewRevisionFromEditComplete': Called when a revision was inserted due to an edit. $wikiPage: the WikiPage edited @@ -2283,7 +2323,10 @@ return false to omit the line from RecentChanges and Watchlist special pages. &$changeslist: The OldChangesList instance. &$s: HTML of the form "
  • ...
  • " containing one RC entry. $rc: The RecentChange object. -&$classes: array of css classes for the
  • element +&$classes: array of css classes for the
  • element. +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). 'OpenSearchUrls': Called when constructing the OpenSearch description XML. Hooks can alter or append to the array of URLs for search & suggestion formats. @@ -2300,6 +2343,10 @@ $page: the Page that was rendered. $title: the Title of the rendered page. $parserOutput: ParserOutput resulting from rendering the page. +'OtherAutoblockLogLink': Get links to the autoblock log from extensions which +autoblocks users and/or IP addresses too. +&$otherBlockLink: An array with links to other autoblock logs + 'OtherBlockLogLink': Get links to the block log from extensions which blocks users and/or IP addresses too. &$otherBlockLink: An array with links to other block logs @@ -2387,6 +2434,9 @@ $historyAction: the action object &$row: the revision row for this line &$s: the string representing this parsed line &$classes: array containing the
  • element classes +&$attribs: associative array of other HTML attributes for the
  • element. + Currently only data attributes reserved to MediaWiki are allowed + (see Sanitizer::isReservedDataAttribute). 'PageHistoryPager::doBatchLookups': Called after the pager query was run, before any output is generated, to allow batch lookups for prefetching information @@ -2400,7 +2450,8 @@ constructed. &$pager: the pager &$queryInfo: the query parameters -'PageRenderingHash': Alter the parser cache option hash key. A parser extension +'PageRenderingHash': NOTE: Consider using ParserOptionsRegister instead. +Alter the parser cache option hash key. A parser extension which depends on user options should install this hook and append its values to the key. &$confstr: reference to a hash key string which can be modified @@ -2524,6 +2575,16 @@ $file: file object that will be used to create the image &$params: 2-D array of parameters $parser: Parser object that called the hook +'ParserOptionsRegister': Register additional parser options. Note that if you +change the default value for an option, all existing parser cache entries will +be invalid. To avoid bugs, you'll need to handle that somehow (e.g. with the +RejectParserCacheValue hook) because MediaWiki won't do it for you. +&$defaults: Set the default value for your option here. +&$inCacheKey: To fragment the parser cache on your option, set a truthy value here. +&$lazyLoad: To lazy-initialize your option, set it null in $defaults and set a + callable here. The callable is passed the ParserOptions object and the option + name. + 'ParserSectionCreate': Called each time the parser creates a document section from wikitext. Use this to apply per-section modifications to HTML (like wrapping the section in a DIV). Caveat: DIVs are valid wikitext, and a DIV @@ -2596,6 +2657,7 @@ $formData: array of user submitted data $form: PreferencesForm object, also a ContextSource $user: User object with preferences to be saved set &$result: boolean indicating success +$oldUserOptions: array with user old options (before save) 'PreferencesGetLegend': Override the text used for the of a preferences section. @@ -2654,6 +2716,11 @@ random pages. 'RecentChange_save': Called at the end of RecentChange::save(). &$recentChange: RecentChange object +'RecentChangesPurgeRows': Called when old recentchanges rows are purged, after +deleting those rows but within the same transaction. +$rows: The deleted rows as an array of recentchanges row objects (with up to + $wgUpdateRowsPerQuery items). + 'RedirectSpecialArticleRedirectParams': Lets you alter the set of parameter names such as "oldid" that are preserved when using redirecting special pages such as Special:MyPage and Special:MyTalk. @@ -2697,11 +2764,19 @@ configuration variables to JavaScript. Things that depend on the current page or request state must be added through MakeGlobalVariablesScript instead. &$vars: array( variable name => value ) -'ResourceLoaderGetLessVars': Called in ResourceLoader::getLessVars after -variables from $wgResourceLoaderLESSVars are added. Can be used to add -context-based variables. +'ResourceLoaderGetLessVars': DEPRECATED! Called in ResourceLoader::getLessVars +to add global LESS variables. Loaded after $wgResourceLoaderLESSVars is added. +Global LESS variables are deprecated. Use ResourceLoaderModule::getLessVars() +instead to expose variables only in modules that need them. &$lessVars: array of variables already added +'ResourceLoaderJqueryMsgModuleMagicWords': Called in +ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg. +The value should be a string, and they can depend only on the +ResourceLoaderContext. +$context: ResourceLoaderContext +&$magicWords: Associative array mapping all-caps magic word to a string value + 'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource loader request or generating HTML output. @@ -3042,7 +3117,7 @@ UsersPager::formatRow(). &$item: HTML to be returned. Will be wrapped in
  • after the hook finishes $row: Database row object -'SpecialListusersHeader': Called before closing the
    in +'SpecialListusersHeader': Called after adding the submit button in UsersPager::getPageHeader(). $pager: The UsersPager instance &$out: The header HTML @@ -3384,6 +3459,14 @@ $title: Title object of the page that we're about to undelete $title: title object related to the revision $rev: revision (object) that will be viewed +'UnitTestsAfterDatabaseSetup': Called right after MediaWiki's test infrastructure +has finished creating/duplicating core tables for unit tests. +$database: Database in question +$prefix: Table prefix to be used in unit tests + +'UnitTestsBeforeDatabaseTeardown': Called right before MediaWiki tears down its +database infrastructure used for unit tests. + 'UnitTestsList': Called when building a list of paths containing PHPUnit tests. Since 1.24: Paths pointing to a directory will be recursively scanned for test case files matching the suffix "Test.php". @@ -3570,6 +3653,10 @@ $removed: Groups removed $performer: User who performed the change, false if via autopromotion $reason: The reason, if any, given by the user performing the change, false if via autopromotion. +$oldUGMs: An associative array (group name => UserGroupMembership object) of +the user's group memberships before the change. +$newUGMs: An associative array (group name => UserGroupMembership object) of +the user's current group memberships. 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for specific block exemptions). diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php index b85e1d6fc1..b73ecbd8ed 100644 --- a/includes/AuthPlugin.php +++ b/includes/AuthPlugin.php @@ -73,8 +73,8 @@ class AuthPlugin { /** * Modify options in the login template. * - * @param BaseTemplate $template - * @param string $type 'signup' or 'login'. Added in 1.16. + * @param BaseTemplate &$template + * @param string &$type 'signup' or 'login'. Added in 1.16. */ public function modifyUITemplate( &$template, &$type ) { # Override this! @@ -124,7 +124,7 @@ class AuthPlugin { * * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning * a different User object to $user is no longer supported. - * @param User $user + * @param User &$user * @return bool */ public function updateUser( &$user ) { @@ -286,7 +286,7 @@ class AuthPlugin { * * @deprecated since 1.26, use the UserLoggedIn hook instead. And assigning * a different User object to $user is no longer supported. - * @param User $user + * @param User &$user * @param bool $autocreate True if user is being autocreated on login */ public function initUser( &$user, $autocreate = false ) { @@ -306,7 +306,7 @@ class AuthPlugin { /** * Get an instance of a User object * - * @param User $user + * @param User &$user * * @return AuthPluginUser */ @@ -359,6 +359,7 @@ class AuthPluginUser { /** * @deprecated since 1.28, use SessionManager::invalidateSessionForUser() instead. + * @return bool */ public function resetAuthToken() { # Override this! diff --git a/includes/Autopromote.php b/includes/Autopromote.php index 56fbb07f88..a01465e9ae 100644 --- a/includes/Autopromote.php +++ b/includes/Autopromote.php @@ -177,7 +177,13 @@ class Autopromote { } return false; case APCOND_EDITCOUNT: - return $user->getEditCount() >= $cond[1]; + $reqEditCount = $cond[1]; + + // T157718: Avoid edit count lookup if specified edit count is 0 or invalid + if ( $reqEditCount <= 0 ) { + return true; + } + return $user->getEditCount() >= $reqEditCount; case APCOND_AGE: $age = time() - wfTimestampOrNull( TS_UNIX, $user->getRegistration() ); return $age >= $cond[1]; diff --git a/includes/Block.php b/includes/Block.php index 1f4041b890..843ea54484 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -20,6 +20,8 @@ * @file */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; use MediaWiki\MediaWikiServices; class Block { @@ -42,40 +44,40 @@ class Block { public $mParentBlockId; /** @var int */ - protected $mId; + private $mId; /** @var bool */ - protected $mFromMaster; + private $mFromMaster; /** @var bool */ - protected $mBlockEmail; + private $mBlockEmail; /** @var bool */ - protected $mDisableUsertalk; + private $mDisableUsertalk; /** @var bool */ - protected $mCreateAccount; + private $mCreateAccount; /** @var User|string */ - protected $target; + private $target; /** @var int Hack for foreign blocking (CentralAuth) */ - protected $forcedTargetID; + private $forcedTargetID; /** @var int Block::TYPE_ constant. Can only be USER, IP or RANGE internally */ - protected $type; + private $type; /** @var User */ - protected $blocker; + private $blocker; /** @var bool */ - protected $isHardblock; + private $isHardblock; /** @var bool */ - protected $isAutoblocking; + private $isAutoblocking; /** @var string|null */ - protected $systemBlockType; + private $systemBlockType; # TYPE constants const TYPE_USER = 1; @@ -483,7 +485,7 @@ class Block { # Periodic purge via commit hooks if ( mt_rand( 0, 9 ) == 0 ) { - Block::purgeExpired(); + self::purgeExpired(); } $row = $this->getDatabaseArray(); @@ -708,7 +710,7 @@ class Block { // than getting the msg raw and explode()'ing it. $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); $lines = $cache->getWithSetCallback( - wfMemcKey( 'ipb', 'autoblock', 'whitelist' ), + $cache->makeKey( 'ipb', 'autoblock', 'whitelist' ), $cache::TTL_DAY, function ( $curValue, &$ttl, array &$setOpts ) { $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) ); @@ -776,12 +778,12 @@ class Block { # It's okay to autoblock. Go ahead and insert/update the block... # Do not add a *new* block if the IP is already blocked. - $ipblock = Block::newFromTarget( $autoblockIP ); + $ipblock = self::newFromTarget( $autoblockIP ); if ( $ipblock ) { # Check if the block is an autoblock and would exceed the user block # if renewed. If so, do nothing, otherwise prolong the block time... if ( $ipblock->mAuto && // @todo Why not compare $ipblock->mExpiry? - $this->mExpiry > Block::getAutoblockExpiry( $ipblock->mTimestamp ) + $this->mExpiry > self::getAutoblockExpiry( $ipblock->mTimestamp ) ) { # Reset block timestamp to now and its expiry to # $wgAutoblockExpiry in the future @@ -808,11 +810,11 @@ class Block { if ( $this->mExpiry == 'infinity' ) { # Original block was indefinite, start an autoblock now - $autoblock->mExpiry = Block::getAutoblockExpiry( $timestamp ); + $autoblock->mExpiry = self::getAutoblockExpiry( $timestamp ); } else { # If the user is already blocked with an expiry date, we don't # want to pile on top of that. - $autoblock->mExpiry = min( $this->mExpiry, Block::getAutoblockExpiry( $timestamp ) ); + $autoblock->mExpiry = min( $this->mExpiry, self::getAutoblockExpiry( $timestamp ) ); } # Insert the block... @@ -827,7 +829,6 @@ class Block { * @return bool */ public function deleteIfExpired() { - if ( $this->isExpired() ) { wfDebug( "Block::deleteIfExpired() -- deleting\n" ); $this->delete(); @@ -869,7 +870,7 @@ class Block { public function updateTimestamp() { if ( $this->mAuto ) { $this->mTimestamp = wfTimestamp(); - $this->mExpiry = Block::getAutoblockExpiry( $this->mTimestamp ); + $this->mExpiry = self::getAutoblockExpiry( $this->mTimestamp ); $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'ipblocks', @@ -957,6 +958,7 @@ class Block { /** * Get the system block type, if any + * @since 1.29 * @return string|null */ public function getSystemBlockType() { @@ -1109,10 +1111,9 @@ class Block { * not be the same as the target you gave if you used $vagueTarget! */ public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) { - list( $target, $type ) = self::parseTarget( $specificTarget ); - if ( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) { - return Block::newFromID( $target ); + if ( $type == self::TYPE_ID || $type == self::TYPE_AUTO ) { + return self::newFromID( $target ); } elseif ( $target === null && $vagueTarget == '' ) { # We're not going to find anything useful here @@ -1122,7 +1123,7 @@ class Block { } elseif ( in_array( $type, - [ Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ] ) + [ self::TYPE_USER, self::TYPE_IP, self::TYPE_RANGE, null ] ) ) { $block = new Block(); $block->fromMaster( $fromMaster ); @@ -1189,7 +1190,7 @@ class Block { } $selectFields = array_merge( [ 'ipb_range_start', 'ipb_range_end' ], - Block::selectFields() + self::selectFields() ); $rows = $db->select( 'ipblocks', $selectFields, @@ -1350,12 +1351,12 @@ class Block { # off validation checking (which would exclude IP addresses) return [ User::newFromName( IP::sanitizeIP( $target ), false ), - Block::TYPE_IP + self::TYPE_IP ]; } elseif ( IP::isValidBlock( $target ) ) { # Can't create a User from an IP range - return [ IP::sanitizeRange( $target ), Block::TYPE_RANGE ]; + return [ IP::sanitizeRange( $target ), self::TYPE_RANGE ]; } # Consider the possibility that this is not a username at all @@ -1370,11 +1371,11 @@ class Block { # Note that since numbers are valid usernames, a $target of "12345" will be # considered a User. If you want to pass a block ID, prepend a hash "#12345", # since hash characters are not valid in usernames or titles generally. - return [ $userObj, Block::TYPE_USER ]; + return [ $userObj, self::TYPE_USER ]; } elseif ( preg_match( '/^#\d+$/', $target ) ) { # Autoblock reference in the form "#12345" - return [ substr( $target, 1 ), Block::TYPE_AUTO ]; + return [ substr( $target, 1 ), self::TYPE_AUTO ]; } else { # WTF? @@ -1450,13 +1451,11 @@ class Block { * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be * the same as the block's, to a maximum of 24 hours. * - * An empty value can also be set, in order to retain the cookie but remove the block ID - * (e.g. as used in User::getBlockedStatus). + * @since 1.29 * * @param WebResponse $response The response on which to set the cookie. - * @param boolean $setEmpty Whether to set the cookie's value to the empty string. */ - public function setCookie( WebResponse $response, $setEmpty = false ) { + public function setCookie( WebResponse $response ) { // Calculate the default expiry time. $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) ); @@ -1467,16 +1466,30 @@ class Block { } // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie. - $cookieValue = $setEmpty ? '' : $this->getCookieValue(); $expiryValue = DateTime::createFromFormat( 'YmdHis', $expiryTime )->format( 'U' ); $cookieOptions = [ 'httpOnly' => false ]; + $cookieValue = $this->getCookieValue(); $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions ); } + /** + * Unset the 'BlockID' cookie. + * + * @since 1.29 + * + * @param WebResponse $response The response on which to unset the cookie. + */ + public static function clearCookie( WebResponse $response ) { + $response->clearCookie( 'BlockID', [ 'httpOnly' => false ] ); + } + /** * Get the BlockID cookie's value for this block. This is usually the block ID concatenated * with an HMAC in order to avoid spoofing (T152951), but if wgSecretKey is not set will just * be the block ID. + * + * @since 1.29 + * * @return string The block ID, probably concatenated with "!" and the HMAC. */ public function getCookieValue() { @@ -1488,14 +1501,18 @@ class Block { return $id; } $hmac = MWCryptHash::hmac( $id, $secretKey, false ); - $cookieValue = $id . '!' . $hmac; + $cookieValue = $id . '!' . $hmac; return $cookieValue; } /** * Get the stored ID from the 'BlockID' cookie. The cookie's value is usually a combination of * the ID and a HMAC (see Block::setCookie), but will sometimes only be the ID. + * + * @since 1.29 + * * @param string $cookieValue The string in which to find the ID. + * * @return integer|null The block ID, or null if the HMAC is present and invalid. */ public static function getIdFromCookieValue( $cookieValue ) { diff --git a/includes/Category.php b/includes/Category.php index ece32ea105..c22ea64abf 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -40,15 +40,19 @@ class Category { /** Counts of membership (cat_pages, cat_subcats, cat_files) */ private $mPages = null, $mSubcats = null, $mFiles = null; + const LOAD_ONLY = 0; + const LAZY_INIT_ROW = 1; + private function __construct() { } /** * Set up all member variables using a database query. + * @param integer $mode * @throws MWException * @return bool True on success, false on failure. */ - protected function initialize() { + protected function initialize( $mode = self::LOAD_ONLY ) { if ( $this->mName === null && $this->mID === null ) { throw new MWException( __METHOD__ . ' has both names and IDs null' ); } elseif ( $this->mID === null ) { @@ -80,7 +84,7 @@ class Category { $this->mFiles = 0; # If the title exists, call refreshCounts to add a row for it. - if ( $this->mTitle->exists() ) { + if ( $mode === self::LAZY_INIT_ROW && $this->mTitle->exists() ) { DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] ); } @@ -104,7 +108,9 @@ class Category { $this->mSubcats = max( $this->mSubcats, 0 ); $this->mFiles = max( $this->mFiles, 0 ); - DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] ); + if ( $mode === self::LAZY_INIT_ROW ) { + DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] ); + } } return true; @@ -247,7 +253,7 @@ class Category { return $this->mTitle; } - if ( !$this->initialize() ) { + if ( !$this->initialize( self::LAZY_INIT_ROW ) ) { return false; } @@ -258,12 +264,11 @@ class Category { /** * Fetch a TitleArray of up to $limit category members, beginning after the * category sort key $offset. - * @param int $limit + * @param int|bool $limit * @param string $offset * @return TitleArray TitleArray object for category members. */ public function getMembers( $limit = false, $offset = '' ) { - $dbr = wfGetDB( DB_REPLICA ); $conds = [ 'cl_to' => $this->getName(), 'cl_from = page_id' ]; @@ -297,7 +302,7 @@ class Category { * @return bool */ private function getX( $key ) { - if ( !$this->initialize() ) { + if ( !$this->initialize( self::LAZY_INIT_ROW ) ) { return false; } return $this->{$key}; @@ -316,11 +321,18 @@ class Category { # If we have just a category name, find out whether there is an # existing row. Or if we have just an ID, get the name, because # that's what categorylinks uses. - if ( !$this->initialize() ) { + if ( !$this->initialize( self::LOAD_ONLY ) ) { return false; } $dbw = wfGetDB( DB_MASTER ); + # Avoid excess contention on the same category (T162121) + $name = __METHOD__ . ':' . md5( $this->mName ); + $scopedLock = $dbw->getScopedLockAndFlush( $name, __METHOD__, 1 ); + if ( !$scopedLock ) { + return false; + } + $dbw->startAtomic( __METHOD__ ); $cond1 = $dbw->conditional( [ 'page_namespace' => NS_CATEGORY ], 1, 'NULL' ); diff --git a/includes/CategoryFinder.php b/includes/CategoryFinder.php index 504b35f885..89bf5c7327 100644 --- a/includes/CategoryFinder.php +++ b/includes/CategoryFinder.php @@ -20,6 +20,8 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; + /** * The "CategoryFinder" class takes a list of articles, creates an internal * representation of all their parent categories (as well as parents of @@ -184,7 +186,6 @@ class CategoryFinder { * Scans a "parent layer" of the articles/categories in $this->next */ private function scanNextLayer() { - # Find all parents of the article currently in $this->next $layer = []; $res = $this->dbr->select( diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php index 31369b0187..9d692d71b3 100644 --- a/includes/CategoryViewer.php +++ b/includes/CategoryViewer.php @@ -108,7 +108,6 @@ class CategoryViewer extends ContextSource { * @return string HTML output */ public function getHTML() { - $this->showGallery = $this->getConfig()->get( 'CategoryMagicGallery' ) && !$this->getOutput()->mNoGallery; @@ -740,10 +739,7 @@ class CategoryViewer extends ContextSource { // to refresh the incorrect category table entry -- which should be // quick due to the small number of entries. $totalcnt = $rescnt; - $category = $this->cat; - DeferredUpdates::addCallableUpdate( function () use ( $category ) { - $category->refreshCounts(); - } ); + DeferredUpdates::addCallableUpdate( [ $this->cat, 'refreshCounts' ] ); } else { // Case 3: hopeless. Don't give a total count at all. // Messages: category-subcat-count-limited, category-article-count-limited, diff --git a/includes/ConfiguredReadOnlyMode.php b/includes/ConfiguredReadOnlyMode.php new file mode 100644 index 0000000000..af7c7cbdf5 --- /dev/null +++ b/includes/ConfiguredReadOnlyMode.php @@ -0,0 +1,73 @@ +config = $config; + } + + /** + * Check whether the wiki is in read-only mode. + * + * @return bool + */ + public function isReadOnly() { + return $this->getReason() !== false; + } + + /** + * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile. + * + * @return string|bool String when in read-only mode; false otherwise + */ + public function getReason() { + if ( $this->overrideReason !== null ) { + return $this->overrideReason; + } + $confReason = $this->config->get( 'ReadOnly' ); + if ( $confReason !== null ) { + return $confReason; + } + if ( $this->fileReason === null ) { + // Cache for faster access next time + $readOnlyFile = $this->config->get( 'ReadOnlyFile' ); + if ( is_file( $readOnlyFile ) && filesize( $readOnlyFile ) > 0 ) { + $this->fileReason = file_get_contents( $readOnlyFile ); + } else { + $this->fileReason = false; + } + } + return $this->fileReason; + } + + /** + * Set the read-only mode, which will apply for the remainder of the + * request or until a service reset. + * + * @param string|null $msg + */ + public function setReason( $msg ) { + $this->overrideReason = $msg; + } + + /** + * Clear the cache of the read only file + */ + public function clearCache() { + $this->fileReason = null; + } +} diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 192ad08dff..4e162f6ef5 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -75,7 +75,7 @@ $wgConfigRegistry = [ * MediaWiki version number * @since 1.2 */ -$wgVersion = '1.29.0-alpha'; +$wgVersion = '1.30.0-alpha'; /** * Name of the site. It must be changed in LocalSettings.php @@ -959,6 +959,23 @@ $wgTrustedMediaFormats = [ */ $wgMediaHandlers = []; +/** + * Media handler overrides for parser tests (they don't need to generate actual + * thumbnails, so a mock will do) + */ +$wgParserTestMediaHandlers = [ + 'image/jpeg' => 'MockBitmapHandler', + 'image/png' => 'MockBitmapHandler', + 'image/gif' => 'MockBitmapHandler', + 'image/tiff' => 'MockBitmapHandler', + 'image/webp' => 'MockBitmapHandler', + 'image/x-ms-bmp' => 'MockBitmapHandler', + 'image/x-bmp' => 'MockBitmapHandler', + 'image/x-xcf' => 'MockBitmapHandler', + 'image/svg+xml' => 'MockSvgHandler', + 'image/vnd.djvu' => 'MockDjVuHandler', +]; + /** * Plugins for page content model handling. * Each entry in the array maps a model id to a class name or callback @@ -1304,7 +1321,7 @@ $wgMimeInfoFile = 'includes/mime.info'; * Sets an external MIME detector program. The command must print only * the MIME type to standard output. * The name of the file to process will be appended to the command given here. - * If not set or NULL, PHP's fileinfo extension will be used if available. + * If not set or NULL, PHP's mime_content_type function will be used. * * @par Example: * @code @@ -1439,24 +1456,20 @@ $wgUploadThumbnailRenderHttpCustomDomain = false; $wgUseTinyRGBForJPGThumbnails = false; /** - * Default parameters for the "" tag - */ -$wgGalleryOptions = [ - // Default number of images per-row in the gallery. 0 -> Adapt to screensize - 'imagesPerRow' => 0, - // Width of the cells containing images in galleries (in "px") - 'imageWidth' => 120, - // Height of the cells containing images in galleries (in "px") - 'imageHeight' => 120, - // Length to truncate filename to in caption when using "showfilename". - // A value of 'true' will truncate the filename to one line using CSS - // and will be the behaviour after deprecation. - // @deprecated since 1.28 - 'captionLength' => true, - // Show the filesize in bytes in categories - 'showBytes' => true, - 'mode' => 'traditional', -]; + * Parameters for the "" tag. + * Fields are: + * - imagesPerRow: Default number of images per-row in the gallery. 0 -> Adapt to screensize + * - imageWidth: Width of the cells containing images in galleries (in "px") + * - imageHeight: Height of the cells containing images in galleries (in "px") + * - captionLength: Length to truncate filename to in caption when using "showfilename". + * A value of 'true' will truncate the filename to one line using CSS + * and will be the behaviour after deprecation. + * @deprecated since 1.28 + * - showBytes: Show the filesize in bytes in categories + * - showDimensions: Show the dimensions (width x height) in categories + * - mode: Gallery mode + */ +$wgGalleryOptions = []; /** * Adjust width of upright images when parameter 'upright' is used @@ -3056,6 +3069,12 @@ $wgDisableTitleConversion = false; */ $wgDefaultLanguageVariant = false; +/** + * Whether to enable the pig latin variant of English (en-x-piglatin), + * used to ease variant development work. + */ +$wgUsePigLatinVariant = false; + /** * Disabled variants array of language variant conversion. * @@ -3216,6 +3235,14 @@ $wgHTMLFormAllowTableFormat = true; */ $wgUseMediaWikiUIEverywhere = false; +/** + * Temporary variable that determines whether the EditPage class should use OOjs UI or not. + * This will be removed later and OOjs UI will become the only option. + * + * @since 1.29 + */ +$wgOOUIEditPage = true; + /** * Whether to label the store-to-database-and-show-to-others button in the editor * as "Save page"/"Save changes" if false (the default) or, if true, instead as @@ -3362,16 +3389,56 @@ $wgApiFrameOptions = 'DENY'; $wgDisableOutputCompression = false; /** - * Should we allow a broader set of characters in id attributes, per HTML5? If - * not, use only HTML 4-compatible IDs. This option is for testing -- when the - * functionality is ready, it will be on by default with no option. + * Abandoned experiment with HTML5-style ID escaping. Normalized IDs a bit + * too aggressively, breaking preexisting content (particularly Cite). + * See T29733, T29694, T29474. * - * Currently this appears to work fine in all browsers, but it's disabled by - * default because it normalizes id's a bit too aggressively, breaking preexisting - * content (particularly Cite). See T29733, T29694, T29474. + * @deprecated since 1.30, use $wgFragmentMode */ $wgExperimentalHtmlIds = false; +/** + * How should section IDs be encoded? + * This array can contain 1 or 2 elements, each of them can be one of: + * - 'html5' is modern HTML5 style encoding with minimal escaping. Allows to + * display Unicode characters in many browsers' address bars. + * - 'legacy' is old MediaWiki-style encoding, e.g. 啤酒 turns into .E5.95.A4.E9.85.92 + * - 'html5-legacy' corresponds to DEPRECATED $wgExperimentalHtmlIds mode. DO NOT use + * it for anything but migration off that mode (see below). + * + * The first element of this array specifies the primary mode of escaping IDs. This + * is what users will see when they e.g. follow an [[#internal link]] to a section of + * a page. + * + * The optional second element defines a fallback mode, useful for migrations. + * If present, it will direct MediaWiki to add empty s to every section with its + * id attribute set to fallback encoded title so that links using the previous encoding + * would still work. + * + * Example: you want to migrate your wiki from 'legacy' to 'html5' + * + * On the first step, set this variable to [ 'legacy', 'html5' ]. After a while, when + * all caches (parser, HTTP, etc.) contain only pages generated with this setting, + * flip the value to [ 'html5', 'legacy' ]. This will result in all internal links being + * generated in the new encoding while old links (both external and cached internal) will + * still work. After a long time, you might want to ditch backwards compatibility and + * set it to [ 'html5' ]. After all, pages get edited, breaking incoming links no matter which + * fragment mode is used. + * + * @since 1.30 + */ +$wgFragmentMode = [ 'legacy' ]; + +/** + * Which ID escaping mode should be used for external interwiki links? See documentation + * for $wgFragmentMode above for details of each mode. Because you can't control external sites, + * this setting should probably always be 'legacy', unless every wiki you link to has converted + * to 'html5'. + * + * @since 1.30 + */ +$wgExternalInterwikiFragmentMode = 'legacy'; + /** * Abstract list of footer icons for skins in place of old copyrightico and poweredbyico code * You can add new icons to the built in copyright or poweredby, or you can create @@ -3665,6 +3732,16 @@ $wgResourceLoaderMinifierMaxLineLength = 1000; */ $wgIncludeLegacyJavaScript = false; +/** + * Use jQuery 3 (with jQuery Migrate) instead of jQuery 1. + * + * This is a temporary feature flag for the MediaWiki 1.29 development cycle while + * instabilities with jQuery 3 are being addressed. See T124742. + * + * @deprecated since 1.29 + */ +$wgUsejQueryThree = true; + /** * Whether or not to assign configuration variables to the global window object. * @@ -3734,20 +3811,18 @@ $wgResourceLoaderValidateStaticJS = false; * at the beginning of all your .less files, with all the consequences. * In particular, string values must be escaped and quoted. * - * Changes to LESS variables do not trigger cache invalidation. - * - * If the LESS variables need to be dynamic, you can use the - * ResourceLoaderGetLessVars hook (since 1.25). + * Changes to this configuration do NOT trigger cache invalidation. * * @par Example: * @code * $wgResourceLoaderLESSVars = [ - * 'baseFontSize' => '1em', - * 'smallFontSize' => '0.75em', - * 'WikimediaBlue' => '#006699', + * 'exampleFontSize' => '1em', + * 'exampleBlue' => '#eee', * ]; * @endcode * @since 1.22 + * @deprecated since 1.30 Use ResourceLoaderModule::getLessVars() instead to + * add variables to individual modules that need them. */ $wgResourceLoaderLESSVars = [ /** @@ -4071,6 +4146,14 @@ $wgTrackingCategories = []; */ $wgContentNamespaces = [ NS_MAIN ]; +/** + * Optional array of namespaces which should be blacklisted from Special:ShortPages + * Only pages inside $wgContentNamespaces but not $wgShortPagesNamespaceBlacklist will + * be shown on that page. + * @since 1.30 + */ +$wgShortPagesNamespaceBlacklist = []; + /** * Array of namespaces, in addition to the talk namespaces, where signatures * (~~~~) are likely to be used. This determines whether to display the @@ -4173,7 +4256,7 @@ $wgMaxPPExpandDepth = 40; * * WARNING: Do not add 'file:' to this or internal file links will be broken. * Instead, if you want to support file links, add 'file://'. The same applies - * to any other protocols with the same name as a namespace. See bug #44011 for + * to any other protocols with the same name as a namespace. See task T46011 for * more information. * * @see wfParseUrl @@ -4867,6 +4950,7 @@ $wgDefaultUserOptions = [ 'watchlisthidepatrolled' => 0, 'watchlisthidecategorization' => 1, 'watchlistreloadautomatically' => 0, + 'watchlistunwatchlinks' => 0, 'watchmoves' => 0, 'watchrollback' => 0, 'wllimit' => 250, @@ -5007,6 +5091,9 @@ $wgBlockDisablesLogin = false; * @note Also that this will only protect _pages in the wiki_. Uploaded files * will remain readable. You can use img_auth.php to protect uploaded files, * see https://www.mediawiki.org/wiki/Manual:Image_Authorization + * + * @note Extensions should not modify this, but use the TitleReadWhitelist + * hook instead. */ $wgWhitelistRead = false; @@ -5728,7 +5815,7 @@ $wgPasswordAttemptThrottle = [ // Long term limit. We need to balance the risk // of somebody using this as a DoS attack to lock someone // out of their account, and someone doing a brute force attack. - [ 'count' => 150, 'seconds' => 60*60*48 ], + [ 'count' => 150, 'seconds' => 60 * 60 * 48 ], ]; /** @@ -5894,15 +5981,6 @@ $wgBotPasswordsCluster = false; */ $wgBotPasswordsDatabase = false; -/** - * Whether to disable user group expiry. This is a transitional feature flag - * in accordance with WMF schema change policy, and will be removed later - * (hopefully before MW 1.29 release). - * - * @since 1.29 - */ -$wgDisableUserGroupExpiry = false; - /** @} */ # end of user rights settings /************************************************************************//** @@ -5920,7 +5998,7 @@ $wgSecretKey = false; * * This can have the following formats: * - An array of addresses, either in the values - * or the keys (for backward compatibility) + * or the keys (for backward compatibility, deprecated since 1.30) * - A string, in that case this is the path to a file * containing the list of IP addresses, one per line */ @@ -6107,7 +6185,10 @@ $wgTrxProfilerLimits = [ 'PostSend' => [ 'readQueryTime' => 5, 'writeQueryTime' => 1, - 'maxAffected' => 1000 + 'maxAffected' => 1000, + // Log master queries under the post-send entry point as they are discouraged + 'masterConns' => 0, + 'writes' => 0, ], // Background job runner 'JobRunner' => [ @@ -6319,15 +6400,16 @@ $wgSiteStatsAsyncFactor = false; * Parser test suite files to be run by parserTests.php when no specific * filename is passed to it. * - * Extensions may add their own tests to this array, or site-local tests - * may be added via LocalSettings.php + * Extensions using extension.json will have any *.txt file in a + * tests/parser/ directory automatically run. + * + * Core tests can be added to ParserTestRunner::$coreTestFiles. * * Use full paths. + * + * @deprecated since 1.30 */ -$wgParserTestFiles = [ - "$IP/tests/parser/parserTests.txt", - "$IP/tests/parser/extraParserTests.txt" -]; +$wgParserTestFiles = []; /** * Allow running of javascript test suites via [[Special:JavaScriptTest]] (such as QUnit). @@ -6753,6 +6835,17 @@ $wgRCWatchCategoryMembership = false; */ $wgUseRCPatrol = true; +/** + * Whether to show the new experimental views (like namespaces, tags, and users) in + * RecentChanges filters + */ +$wgStructuredChangeFiltersEnableExperimentalViews = false; + +/** + * Whether to allow users to use the experimental live update feature in the new RecentChanges UI + */ +$wgStructuredChangeFiltersEnableLiveUpdate = false; + /** * Use new page patrolling to check new pages on Special:Newpages */ @@ -7314,8 +7407,10 @@ $wgServiceWiringFiles = [ ]; /** - * Maps jobs to their handling classes; extensions - * can add to this to provide custom jobs + * Maps jobs to their handlers; extensions + * can add to this to provide custom jobs. + * A job handler should either be a class name to be instantiated, + * or (since 1.30) a callback to use for creating the job object. */ $wgJobClasses = [ 'refreshLinks' => 'RefreshLinksJob', @@ -7394,6 +7489,19 @@ $wgJobQueueAggregator = [ 'class' => 'JobQueueAggregatorNull' ]; +/** + * Whether to include the number of jobs that are queued + * for the API's maxlag parameter. + * The total number of jobs will be divided by this to get an + * estimated second of maxlag. Typically bots backoff at maxlag=5, + * so setting this to the max number of jobs that should be in your + * queue divided by 5 should have the effect of stopping bots once + * that limit is hit. + * + * @since 1.29 + */ +$wgJobQueueIncludeInMaxLagFactor = false; + /** * Additional functions to be performed with updateSpecialPages. * Expensive Querypages are already updated. @@ -7402,15 +7510,6 @@ $wgSpecialPageCacheUpdates = [ 'Statistics' => [ 'SiteStatsUpdate', 'cacheUpdate' ] ]; -/** - * Hooks that are used for outputting exceptions. Format is: - * $wgExceptionHooks[] = $funcname - * or: - * $wgExceptionHooks[] = [ $class, $funcname ] - * Hooks should return strings or false - */ -$wgExceptionHooks = []; - /** * Page property link table invalidation lists. When a page property * changes, this may require other link tables to be updated (eg @@ -8131,11 +8230,40 @@ $wgShellCgroup = false; $wgPhpCli = '/usr/bin/php'; /** - * 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. - */ -$wgShellLocale = 'en_US.utf8'; + * Locale for LC_ALL, to provide a known environment for locale-sensitive operations + * + * For Unix-like operating systems, this should be set to C.UTF-8 or an + * equivalent to provide the most consistent behavior for locale-sensitive + * C library operations across different-language wikis. If that locale is not + * available, use another locale that has a UTF-8 character set. + * + * This setting mainly affects the behavior of C library functions, including: + * - String collation (order when sorting using locale-sensitive comparison) + * - For example, whether "Å" and "A" are considered to be the same letter or + * different letters and if different whether it comes after "A" or after + * "Z", and whether sorting is case sensitive. + * - String character set (how characters beyond basic ASCII are represented) + * - We need this to be a UTF-8 character set to work around + * https://bugs.php.net/bug.php?id=45132 + * - Language used for low-level error messages. + * - Formatting of date/time and numeric values (e.g. '.' versus ',' as the + * decimal separator) + * + * MediaWiki provides its own methods and classes to perform many + * locale-sensitive operations, which are designed to be able to vary locale + * based on wiki language or user preference: + * - MediaWiki's Collation class should generally be used instead of the C + * library collation functions when locale-sensitive sorting is needed. + * - MediaWiki's Message class should be used for localization of messages + * displayed to the user. + * - MediaWiki's Language class should be used for formatting numeric and + * date/time values. + * + * @note If multiple wikis are being served from the same process (e.g. the + * same fastCGI or Apache server), this setting must be the same on all those + * wikis. + */ +$wgShellLocale = 'C.UTF-8'; /** @} */ # End shell } @@ -8169,10 +8297,15 @@ $wgHTTPProxy = false; * Local virtual hosts. * * This lists domains that are configured as virtual hosts on the same machine. - * If a request is to be made to a domain listed here, or any subdomain thereof, - * then no proxy will be used. - * Command-line scripts are not affected by this setting and will always use - * proxy if it is configured. + * + * This affects the following: + * - MWHttpRequest: If a request is to be made to a domain listed here, or any + * subdomain thereof, then no proxy will be used. + * Command-line scripts are not affected by this setting and will always use + * the proxy if it is configured. + * - ChronologyProtector: Decide to shutdown LBFactory asynchronously instead + * synchronously if the current response redirects to a local virtual host. + * * @since 1.25 */ $wgLocalVirtualHosts = []; @@ -8232,6 +8365,20 @@ $wgUpdateRowsPerQuery = 100; */ $wgExternalDiffEngine = false; +/** + * wikidiff2 supports detection of changes in moved paragraphs. + * This setting controls the maximum number of paragraphs to compare before it bails out. + * Supported values: + * * 0: detection of moved paragraphs is disabled + * * int > 0: maximum number of paragraphs to compare + * Note: number of paragraph comparisons is in O(n^2). + * This setting is only effective if the wikidiff2 PHP/HHVM module is used as diffengine. + * See $wgExternalDiffEngine. + * + * @since 1.30 + */ +$wgWikiDiff2MovedParagraphDetectionCutoff = 0; + /** * Disable redirects to special pages and interwiki redirects, which use a 302 * and have no "redirected from" link. @@ -8510,6 +8657,15 @@ $wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb'; */ $wgMaxUserDBWriteDuration = false; +/* + * Max time (in seconds) a job-generated transaction can spend in writes. + * If exceeded, the transaction is rolled back with an error instead of being committed. + * + * @var int|bool Disabled if false + * @since 1.30 + */ +$wgMaxJobDBWriteDuration = false; + /** * Mapping of event channels (or channel categories) to EventRelayer configuration. * diff --git a/includes/Defines.php b/includes/Defines.php index bd92ff0683..8ac84e5ab5 100644 --- a/includes/Defines.php +++ b/includes/Defines.php @@ -24,6 +24,8 @@ require_once __DIR__ . '/libs/mime/defines.php'; require_once __DIR__ . '/libs/rdbms/defines.php'; require_once __DIR__ . '/compat/normal/UtfNormalDefines.php'; +use Wikimedia\Rdbms\IDatabase; + /** * @defgroup Constants MediaWiki constants */ @@ -265,3 +267,28 @@ define( 'CONTENT_FORMAT_XML', 'application/xml' ); */ define( 'SHELL_MAX_ARG_STRLEN', '100000' ); /**@}*/ + +/**@{ + * Schema change migration flags. + * + * Used as values of a feature flag for an orderly transition from an old + * schema to a new schema. + * + * - MIGRATION_OLD: Only read and write the old schema. The new schema need not + * even exist. This is used from when the patch is merged until the schema + * change is actually applied to the database. + * - MIGRATION_WRITE_BOTH: Write both the old and new schema. Read the new + * schema preferentially, falling back to the old. This is used while the + * change is being tested, allowing easy roll-back to the old schema. + * - MIGRATION_WRITE_NEW: Write only the new schema. Read the new schema + * preferentially, falling back to the old. This is used while running the + * maintenance script to migrate existing entries in the old schema to the + * new schema. + * - MIGRATION_NEW: Only read and write the new schema. The old schema (and the + * feature flag) may now be removed. + */ +define( 'MIGRATION_OLD', 0 ); +define( 'MIGRATION_WRITE_BOTH', 1 ); +define( 'MIGRATION_WRITE_NEW', 2 ); +define( 'MIGRATION_NEW', 3 ); +/**@}*/ diff --git a/includes/DeprecatedGlobal.php b/includes/DeprecatedGlobal.php index 14329d3213..60dde401ec 100644 --- a/includes/DeprecatedGlobal.php +++ b/includes/DeprecatedGlobal.php @@ -24,13 +24,16 @@ * Class to allow throwing wfDeprecated warnings * when people use globals that we do not want them to. */ - class DeprecatedGlobal extends StubObject { - protected $realValue, $version; + protected $version; - function __construct( $name, $realValue, $version = false ) { - parent::__construct( $name ); - $this->realValue = $realValue; + /** + * @param string $name Global name + * @param callable|string $callback Factory function or class name to construct + * @param bool|string $version Version global was deprecated in + */ + function __construct( $name, $callback, $version = false ) { + parent::__construct( $name, $callback ); $this->version = $version; } @@ -38,7 +41,6 @@ class DeprecatedGlobal extends StubObject { // PSR2.Methods.MethodDeclaration.Underscore // PSR2.Classes.PropertyDeclaration.ScopeMissing function _newObject() { - /* Put the caller offset for wfDeprecated as 6, as * that gives the function that uses this object, since: * 1 = this function ( _newObject ) @@ -52,7 +54,7 @@ class DeprecatedGlobal extends StubObject { * rather unlikely. */ wfDeprecated( '$' . $this->global, $this->version, false, 6 ); - return $this->realValue; + return parent::_newObject(); } // @codingStandardsIgnoreEnd } diff --git a/includes/EditPage.php b/includes/EditPage.php index c22125a6a2..49341c5e7e 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -413,6 +413,11 @@ class EditPage { */ private $isOldRev = false; + /** + * @var bool Whether OOUI should be enabled here + */ + private $oouiEnabled = false; + /** * @param Article $article */ @@ -426,6 +431,8 @@ class EditPage { $handler = ContentHandler::getForModelID( $this->contentModel ); $this->contentFormat = $handler->getDefaultFormat(); + + $this->oouiEnabled = $this->context->getConfig()->get( 'OOUIEditPage' ); } /** @@ -476,6 +483,14 @@ class EditPage { } } + /** + * Check if the edit page is using OOUI controls + * @return bool + */ + public function isOouiEnabled() { + return $this->oouiEnabled; + } + /** * Returns if the given content model is editable. * @@ -837,12 +852,15 @@ class EditPage { /** * This function collects the form data and uses it to populate various member variables. - * @param WebRequest $request + * @param WebRequest &$request * @throws ErrorPageError */ public function importFormData( &$request ) { global $wgContLang, $wgUser; + # Allow users to change the mode for testing + $this->oouiEnabled = $request->getFuzzyBool( 'ooui', $this->oouiEnabled ); + # Section edit can come from either the form or a link $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) ); @@ -1027,7 +1045,7 @@ class EditPage { throw new ErrorPageError( 'editpage-invalidcontentmodel-title', 'editpage-invalidcontentmodel-text', - [ $this->contentModel ] + [ wfEscapeWikiText( $this->contentModel ) ] ); } @@ -1035,7 +1053,10 @@ class EditPage { throw new ErrorPageError( 'editpage-notsupportedcontentformat-title', 'editpage-notsupportedcontentformat-text', - [ $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) ] + [ + wfEscapeWikiText( $this->contentFormat ), + wfEscapeWikiText( ContentHandler::getLocalizedName( $this->contentModel ) ) + ] ); } @@ -1059,7 +1080,7 @@ class EditPage { * this method should be overridden and return the page text that will be used * for saving, preview parsing and so on... * - * @param WebRequest $request + * @param WebRequest &$request * @return string|null */ protected function importContentFormData( &$request ) { @@ -1411,7 +1432,7 @@ class EditPage { /** * Make sure the form isn't faking a user's credentials. * - * @param WebRequest $request + * @param WebRequest &$request * @return bool * @private */ @@ -1429,10 +1450,8 @@ class EditPage { * This uses a temporary cookie for each revision ID so separate saves will never * interfere with each other. * - * The cookie is deleted in the mediawiki.action.view.postEdit JS module after - * the redirect. It must be clearable by JavaScript code, so it must not be - * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config - * variable. + * Article::view deletes the cookie on server-side after the redirect and + * converts the value to the global JavaScript variable wgPostEdit. * * If the variable were set on the server, it would be cached, which is unwanted * since the post-edit state should only apply to the load right after the save. @@ -1451,14 +1470,12 @@ class EditPage { } $response = RequestContext::getMain()->getRequest()->response(); - $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION, [ - 'httpOnly' => false, - ] ); + $response->setCookie( $postEditKey, $val, time() + self::POST_EDIT_COOKIE_DURATION ); } /** * Attempt submission - * @param array|bool $resultDetails See docs for $result in internalAttemptSave + * @param array|bool &$resultDetails See docs for $result in internalAttemptSave * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError * @return Status The resulting status object. */ @@ -1474,6 +1491,20 @@ class EditPage { return $status; } + /** + * Log when a page was successfully saved after the edit conflict view + */ + private function incrementResolvedConflicts() { + global $wgRequest; + + if ( $wgRequest->getText( 'mode' ) !== 'conflict' ) { + return; + } + + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); + $stats->increment( 'edit.failures.conflict.resolved' ); + } + /** * Handle status, such as after attempt save * @@ -1493,6 +1524,8 @@ class EditPage { if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) { + $this->incrementResolvedConflicts(); + $this->didSave = true; if ( !$resultDetails['nullEdit'] ) { $this->setPostEditCookie( $status->value ); @@ -1665,7 +1698,7 @@ class EditPage { global $wgParser; if ( $this->sectiontitle !== '' ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle ); + $sectionanchor = $this->guessSectionName( $this->sectiontitle ); // If no edit summary was specified, create one automatically from the section // title and have it link to the new section. Otherwise, respect the summary as // passed. @@ -1675,7 +1708,7 @@ class EditPage { ->rawParams( $cleanSectionTitle )->inContentLanguage()->text(); } } elseif ( $this->summary !== '' ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary ); + $sectionanchor = $this->guessSectionName( $this->summary ); # This is a new section, so create a link to the new section # in the revision summary. $cleanSummary = $wgParser->stripSectionName( $this->summary ); @@ -1688,7 +1721,7 @@ class EditPage { /** * Attempt submission (no UI) * - * @param array $result Array to add statuses to, currently with the + * @param array &$result Array to add statuses to, currently with the * possible keys: * - spam (string): Spam string from content if any spam is detected by * matchSpamRegex. @@ -1710,7 +1743,7 @@ class EditPage { * time. */ public function internalAttemptSave( &$result, $bot = false ) { - global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize; + global $wgUser, $wgRequest, $wgMaxArticleSize; global $wgContentHandlerUseDB; $status = Status::newGood(); @@ -2084,7 +2117,7 @@ class EditPage { # We can't deal with anchors, includes, html etc in the header for now, # headline would need to be parsed to improve this. if ( $hasmatch && strlen( $matches[2] ) > 0 ) { - $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $matches[2] ); + $sectionanchor = $this->guessSectionName( $matches[2] ); } } $result['sectionanchor'] = $sectionanchor; @@ -2318,12 +2351,9 @@ class EditPage { } public function setHeaders() { - global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock; + global $wgOut, $wgUser, $wgAjaxEditStash; $wgOut->addModules( 'mediawiki.action.edit' ); - if ( $wgCookieSetOnAutoblock === true ) { - $wgOut->addModules( 'mediawiki.user.blockcookie' ); - } $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' ); if ( $wgUser->getOption( 'showtoolbar' ) ) { @@ -2424,7 +2454,7 @@ class EditPage { # Show log extract when the user is currently blocked if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) { $username = explode( '/', $this->mTitle->getText(), 2 )[0]; - $user = User::newFromName( $username, false /* allow IP users*/ ); + $user = User::newFromName( $username, false /* allow IP users */ ); $ip = User::isIP( $username ); $block = Block::newFromTarget( $user, $user ); if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist @@ -2633,10 +2663,11 @@ class EditPage { } // @todo add EditForm plugin interface and use it here! - // search for textarea1 and textares2, and allow EditForm to override all uses. + // search for textarea1 and textarea2, and allow EditForm to override all uses. $wgOut->addHTML( Html::openElement( 'form', [ + 'class' => $this->oouiEnabled ? 'mw-editform-ooui' : 'mw-editform-legacy', 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID, 'method' => 'post', @@ -2736,6 +2767,14 @@ class EditPage { $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) ); $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) ); + // Preserve &ooui=1 / &ooui=0 from URL parameters after submitting the page for preview + $wgOut->addHTML( Html::hidden( 'ooui', $this->oouiEnabled ? '1' : '0' ) ); + + // following functions will need OOUI, enable it only once; here. + if ( $this->oouiEnabled ) { + $wgOut->enableOOUI(); + } + if ( $this->section == 'new' ) { $this->showSummaryInput( true, $this->summary ); $wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) ); @@ -2744,7 +2783,7 @@ class EditPage { $wgOut->addHTML( $this->editFormTextBeforeContent ); if ( !$this->isCssJsSubpage && $showToolbar && $wgUser->getOption( 'showtoolbar' ) ) { - $wgOut->addHTML( EditPage::getEditToolbar( $this->mTitle ) ); + $wgOut->addHTML( self::getEditToolbar( $this->mTitle ) ); } if ( $this->blankArticle ) { @@ -2883,24 +2922,38 @@ class EditPage { } } + $buttonLabel = $this->context->msg( $this->getSaveButtonLabel() )->text(); + if ( $this->missingComment ) { $wgOut->wrapWikiMsg( "
    \n$1\n
    ", 'missingcommenttext' ); } if ( $this->missingSummary && $this->section != 'new' ) { - $wgOut->wrapWikiMsg( "
    \n$1\n
    ", 'missingsummary' ); + $wgOut->wrapWikiMsg( + "
    \n$1\n
    ", + [ 'missingsummary', $buttonLabel ] + ); } if ( $this->missingSummary && $this->section == 'new' ) { - $wgOut->wrapWikiMsg( "
    \n$1\n
    ", 'missingcommentheader' ); + $wgOut->wrapWikiMsg( + "
    \n$1\n
    ", + [ 'missingcommentheader', $buttonLabel ] + ); } if ( $this->blankArticle ) { - $wgOut->wrapWikiMsg( "
    \n$1\n
    ", 'blankarticle' ); + $wgOut->wrapWikiMsg( + "
    \n$1\n
    ", + [ 'blankarticle', $buttonLabel ] + ); } if ( $this->selfRedirect ) { - $wgOut->wrapWikiMsg( "
    \n$1\n
    ", 'selfredirect' ); + $wgOut->wrapWikiMsg( + "
    \n$1\n
    ", + [ 'selfredirect', $buttonLabel ] + ); } if ( $this->hookError !== '' ) { @@ -3007,6 +3060,25 @@ class EditPage { $this->showHeaderCopyrightWarning(); } + /** + * Helper function for summary input functions, which returns the neccessary + * attributes for the input. + * + * @param array|null $inputAttrs Array of attrs to use on the input + * @return array + */ + private function getSummaryInputAttributes( array $inputAttrs = null ) { + // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters. + return ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [ + 'id' => 'wpSummary', + 'name' => 'wpSummary', + 'maxlength' => '200', + 'tabindex' => 1, + 'size' => 60, + 'spellcheck' => 'true', + ]; + } + /** * Standard summary input and label (wgSummary), abstracted so EditPage * subclasses may reorganize the form. @@ -3024,14 +3096,8 @@ class EditPage { public function getSummaryInput( $summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null ) { - // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters. - $inputAttrs = ( is_array( $inputAttrs ) ? $inputAttrs : [] ) + [ - 'id' => 'wpSummary', - 'maxlength' => '200', - 'tabindex' => '1', - 'size' => 60, - 'spellcheck' => 'true', - ] + Linker::tooltipAndAccesskeyAttribs( 'summary' ); + $inputAttrs = $this->getSummaryInputAttributes( $inputAttrs ); + $inputAttrs += Linker::tooltipAndAccesskeyAttribs( 'summary' ); $spanLabelAttrs = ( is_array( $spanLabelAttrs ) ? $spanLabelAttrs : [] ) + [ 'class' => $this->missingSummary ? 'mw-summarymissed' : 'mw-summary', @@ -3053,6 +3119,43 @@ class EditPage { return [ $label, $input ]; } + /** + * Same as self::getSummaryInput, but uses OOUI, instead of plain HTML. + * Builds a standard summary input with a label. + * + * @param string $summary The value of the summary input + * @param string $labelText The html to place inside the label + * @param array $inputAttrs Array of attrs to use on the input + * + * @return OOUI\FieldLayout OOUI FieldLayout with Label and Input + */ + function getSummaryInputOOUI( $summary = "", $labelText = null, $inputAttrs = null ) { + $inputAttrs = OOUI\Element::configFromHtmlAttributes( + $this->getSummaryInputAttributes( $inputAttrs ) + ); + $inputAttrs += [ + 'title' => Linker::titleAttrib( 'summary' ), + 'accessKey' => Linker::accesskey( 'summary' ), + ]; + + // For compatibility with old scripts and extensions, we want the legacy 'id' on the `` + $inputAttrs['inputId'] = $inputAttrs['id']; + $inputAttrs['id'] = 'wpSummaryWidget'; + + return new OOUI\FieldLayout( + new OOUI\TextInputWidget( [ + 'value' => $summary, + 'infusable' => true, + ] + $inputAttrs ), + [ + 'label' => new OOUI\HtmlSnippet( $labelText ), + 'align' => 'top', + 'id' => 'wpSummaryLabel', + 'classes' => [ $this->missingSummary ? 'mw-summarymissed' : 'mw-summary' ], + ] + ); + } + /** * @param bool $isSubjectPreview True if this is the section subject/title * up top, or false if this is the comment summary @@ -3061,6 +3164,7 @@ class EditPage { */ protected function showSummaryInput( $isSubjectPreview, $summary = "" ) { global $wgOut; + # Add a class if 'missingsummary' is triggered to allow styling of the summary line $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary'; if ( $isSubjectPreview ) { @@ -3072,14 +3176,22 @@ class EditPage { return; } } + $labelText = $this->context->msg( $isSubjectPreview ? 'subject' : 'summary' )->parse(); - list( $label, $input ) = $this->getSummaryInput( - $summary, - $labelText, - [ 'class' => $summaryClass ], - [] - ); - $wgOut->addHTML( "{$label} {$input}" ); + if ( $this->oouiEnabled ) { + $wgOut->addHTML( $this->getSummaryInputOOUI( + $summary, + $labelText, + [ 'class' => $summaryClass ] + ) ); + } else { + list( $label, $input ) = $this->getSummaryInput( + $summary, + $labelText, + [ 'class' => $summaryClass ] + ); + $wgOut->addHTML( "{$label} {$input}" ); + } } /** @@ -3113,16 +3225,13 @@ class EditPage { protected function showFormBeforeText() { global $wgOut; - $section = htmlspecialchars( $this->section ); - $wgOut->addHTML( << - - - - - -HTML - ); + + $wgOut->addHTML( Html::hidden( 'wpSection', htmlspecialchars( $this->section ) ) ); + $wgOut->addHTML( Html::hidden( 'wpStarttime', $this->starttime ) ); + $wgOut->addHTML( Html::hidden( 'wpEdittime', $this->edittime ) ); + $wgOut->addHTML( Html::hidden( 'editRevId', $this->editRevId ) ); + $wgOut->addHTML( Html::hidden( 'wpScrolltop', $this->scrolltop ) ); + if ( !$this->checkUnicodeCompliantBrowser() ) { $wgOut->addHTML( Html::hidden( 'safemode', '1' ) ); } @@ -3385,6 +3494,10 @@ HTML } } + /** + * Inserts optional text shown below edit and upload forms. Can be used to offer special + * characters not present on most keyboards for copying/pasting. + */ protected function showEditTools() { global $wgOut; $wgOut->addHTML( '
    ' . @@ -3489,9 +3602,21 @@ HTML $wgOut->addHTML( $this->getSummaryPreview( false, $this->summary ) ); } - $checkboxes = $this->getCheckboxes( $tabindex, - [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ] ); - $wgOut->addHTML( "
    " . implode( $checkboxes, "\n" ) . "
    \n" ); + if ( $this->oouiEnabled ) { + $checkboxes = $this->getCheckboxesOOUI( + $tabindex, + [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ] + ); + $checkboxesHTML = new OOUI\HorizontalLayout( [ 'items' => $checkboxes ] ); + } else { + $checkboxes = $this->getCheckboxes( + $tabindex, + [ 'minor' => $this->minoredit, 'watch' => $this->watchthis ] + ); + $checkboxesHTML = implode( $checkboxes, "\n" ); + } + + $wgOut->addHTML( "
    " . $checkboxesHTML . "
    \n" ); // Show copyright warning. $wgOut->addWikiText( $this->getCopywarn() ); @@ -3509,12 +3634,12 @@ HTML $message = $this->context->msg( 'edithelppage' )->inContentLanguage()->text(); $edithelpurl = Skin::makeInternalOrExternalUrl( $message ); - $attrs = [ - 'target' => 'helpwindow', - 'href' => $edithelpurl, - ]; - $edithelp = Html::linkButton( $this->context->msg( 'edithelp' )->text(), - $attrs, [ 'mw-ui-quiet' ] ) . + $edithelp = + Html::linkButton( + $this->context->msg( 'edithelp' )->text(), + [ 'target' => 'helpwindow', 'href' => $edithelpurl ], + [ 'mw-ui-quiet' ] + ) . $this->context->msg( 'word-separator' )->escaped() . $this->context->msg( 'newwindow' )->parse(); @@ -3574,20 +3699,28 @@ HTML */ public function getCancelLink() { $cancelParams = []; - $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); if ( !$this->isConflict && $this->oldid > 0 ) { $cancelParams['oldid'] = $this->oldid; } elseif ( $this->getContextTitle()->isRedirect() ) { $cancelParams['redirect'] = 'no'; } - $attrs = [ 'id' => 'mw-editform-cancel' ]; - - return $linkRenderer->makeKnownLink( - $this->getContextTitle(), - new HtmlArmor( $this->context->msg( 'cancel' )->parse() ), - Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ), - $cancelParams - ); + if ( $this->oouiEnabled ) { + return new OOUI\ButtonWidget( [ + 'id' => 'mw-editform-cancel', + 'href' => $this->getContextTitle()->getLinkUrl( $cancelParams ), + 'label' => new OOUI\HtmlSnippet( $this->context->msg( 'cancel' )->parse() ), + 'framed' => false, + 'infusable' => true, + 'flags' => 'destructive', + ] ); + } else { + return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink( + $this->getContextTitle(), + new HtmlArmor( $this->context->msg( 'cancel' )->parse() ), + Html::buttonAttributes( [ 'id' => 'mw-editform-cancel' ], [ 'mw-ui-quiet' ] ), + $cancelParams + ); + } } /** @@ -4000,132 +4133,304 @@ HTML } $script .= '});'; - $wgOut->addScript( ResourceLoader::makeInlineScript( $script ) ); $toolbar = '
    '; - Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ); + if ( Hooks::run( 'EditPageBeforeEditToolbar', [ &$toolbar ] ) ) { + // Only add the old toolbar cruft to the page payload if the toolbar has not + // been over-written by a hook caller + $wgOut->addScript( ResourceLoader::makeInlineScript( $script ) ); + }; return $toolbar; } /** - * Returns an array of html code of the following checkboxes: - * minor and watch + * Return an array of checkbox definitions. * - * @param int $tabindex Current tabindex - * @param array $checked Array of checkbox => bool, where bool indicates the checked - * status of the checkbox + * Array keys correspond to the `` 'name' attribute to use for each checkbox. * + * Array values are associative arrays with the following keys: + * - 'label-message' (required): message for label text + * - 'id' (required): 'id' attribute for the `` + * - 'default' (required): default checkedness (true or false) + * - 'title-message' (optional): used to generate 'title' attribute for the `
    tag without an href and with a class + * showing the link text. The calling sequence is the same as for the other + * make*LinkObj static functions, but $query is not used. * * @since 1.16.3 * @param Title $nt @@ -179,7 +184,7 @@ class Linker { * @return string */ public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) { - $ret = "{$prefix}{$html}{$trail}"; + $ret = "{$prefix}{$html}{$trail}"; if ( !Hooks::run( 'SelfLinkBegin', [ $nt, &$html, &$trail, &$prefix, &$ret ] ) ) { return $ret; } @@ -188,7 +193,7 @@ class Linker { $html = htmlspecialchars( $nt->getPrefixedText() ); } list( $inside, $trail ) = self::splitTrail( $trail ); - return "{$prefix}{$html}{$inside}{$trail}"; + return "{$prefix}{$html}{$inside}{$trail}"; } /** @@ -1328,17 +1333,20 @@ class Linker { Title $title, $text, $wikiId = null, $options = [] ) { if ( $wikiId !== null && !$title->isExternal() ) { - $link = Linker::makeExternalLink( + $link = self::makeExternalLink( WikiMap::getForeignURL( $wikiId, - $title->getPrefixedText(), + $title->getNamespace() === 0 + ? $title->getDBkey() + : MWNamespace::getCanonicalName( $title->getNamespace() ) . ':' + . $title->getDBkey(), $title->getFragment() ), $text, /* escape = */ false // Already escaped ); } else { - $link = Linker::link( $title, $text, [], [], $options ); + $link = self::link( $title, $text, [], [], $options ); } return $link; @@ -1347,7 +1355,7 @@ class Linker { /** * @param Title $contextTitle * @param string $target - * @param string $text + * @param string &$text * @return string */ public static function normalizeSubpageLink( $contextTitle, $target, &$text ) { @@ -1561,7 +1569,7 @@ class Linker { $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped(); return '
    ' - . '

    ' . $title . "

    \n" + . '

    ' . $title . "

    \n" . $toc . "\n
    \n"; } @@ -1605,22 +1613,24 @@ class Linker { * a space and ending with '>' * This *must* be at least '>' for no attribs * @param string $anchor The anchor to give the headline (the bit after the #) - * @param string $html Html for the text of the header + * @param string $html HTML for the text of the header * @param string $link HTML to add for the section edit link - * @param bool|string $legacyAnchor A second, optional anchor to give for + * @param string|bool $fallbackAnchor A second, optional anchor to give for * backward compatibility (false to omit) * * @return string HTML headline */ public static function makeHeadline( $level, $attribs, $anchor, $html, - $link, $legacyAnchor = false + $link, $fallbackAnchor = false ) { + $anchorEscaped = htmlspecialchars( $anchor ); $ret = "$html" + . "$html" . $link . ""; - if ( $legacyAnchor !== false ) { - $ret = "
    $ret"; + if ( $fallbackAnchor !== false && $fallbackAnchor !== $anchor ) { + $fallbackAnchor = htmlspecialchars( $fallbackAnchor ); + $ret = "
    $ret"; } return $ret; } @@ -1882,7 +1892,6 @@ class Linker { * @return string HTML output */ public static function formatHiddenCategories( $hiddencats ) { - $outText = ''; if ( count( $hiddencats ) > 0 ) { # Construct the HTML @@ -2019,7 +2028,7 @@ class Linker { } if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) { - return Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops + return self::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops } else { if ( $rev->getId() ) { // RevDelete links using revision ID are stable across @@ -2038,7 +2047,7 @@ class Linker { 'ids' => $rev->getTimestamp() ]; } - return Linker::revDeleteLink( $query, + return self::revDeleteLink( $query, $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide ); } } @@ -2094,9 +2103,6 @@ class Linker { * @return array */ public static function tooltipAndAccesskeyAttribs( $name, array $msgParams = [] ) { - # @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output - # no attribute" instead of "output '' as value for attribute", this - # would be three lines. $attribs = [ 'title' => self::titleAttrib( $name, 'withaccess', $msgParams ), 'accesskey' => self::accesskey( $name ) @@ -2118,9 +2124,6 @@ class Linker { * @return null|string */ public static function tooltip( $name, $options = null ) { - # @todo FIXME: If Sanitizer::expandAttributes() treated "false" as "output - # no attribute" instead of "output '' as value for attribute", this - # would be two lines. $tooltip = self::titleAttrib( $name, $options ); if ( $tooltip === false ) { return ''; diff --git a/includes/ListToggle.php b/includes/ListToggle.php index 2c87b8bac0..7a5fd9a1be 100644 --- a/includes/ListToggle.php +++ b/includes/ListToggle.php @@ -42,7 +42,7 @@ class ListToggle { private function checkboxLink( $checkboxType ) { return Html::element( // CSS classes: mw-checkbox-all, mw-checkbox-none, mw-checkbox-invert - 'a', [ 'href' => '#', 'class' => 'mw-checkbox-' . $checkboxType ], + 'a', [ 'class' => 'mw-checkbox-' . $checkboxType, 'role' => 'button', 'tabindex' => 0 ], $this->output->msg( 'checkbox-' . $checkboxType )->text() ); } diff --git a/includes/MWNamespace.php b/includes/MWNamespace.php index 4c5561fba8..97dba26b95 100644 --- a/includes/MWNamespace.php +++ b/includes/MWNamespace.php @@ -278,12 +278,26 @@ class MWNamespace { } /** - * Can this namespace ever have a talk namespace? + * Does this namespace ever have a talk namespace? + * + * @deprecated since 1.30, use hasTalkNamespace() instead. * * @param int $index Namespace index - * @return bool + * @return bool True if this namespace either is or has a corresponding talk namespace. */ public static function canTalk( $index ) { + return self::hasTalkNamespace( $index ); + } + + /** + * Does this namespace ever have a talk namespace? + * + * @since 1.30 + * + * @param int $index Namespace ID + * @return bool True if this namespace either is or has a corresponding talk namespace. + */ + public static function hasTalkNamespace( $index ) { return $index >= NS_MAIN; } @@ -356,7 +370,7 @@ class MWNamespace { */ public static function getSubjectNamespaces() { return array_filter( - MWNamespace::getValidNamespaces(), + self::getValidNamespaces(), 'MWNamespace::isSubject' ); } @@ -369,7 +383,7 @@ class MWNamespace { */ public static function getTalkNamespaces() { return array_filter( - MWNamespace::getValidNamespaces(), + self::getValidNamespaces(), 'MWNamespace::isTalk' ); } diff --git a/includes/MagicWord.php b/includes/MagicWord.php index ee95918700..6e7799a308 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -518,7 +518,7 @@ class MagicWord { * Returns true if the text matches the word, and alters the * input string, removing all instances of the word * - * @param string $text + * @param string &$text * * @return bool */ @@ -534,7 +534,7 @@ class MagicWord { } /** - * @param string $text + * @param string &$text * @return bool */ public function matchStartAndRemove( &$text ) { @@ -646,38 +646,11 @@ class MagicWord { return $this->mModified; } - /** - * $magicarr is an associative array of (magic word ID => replacement) - * This method uses the php feature to do several replacements at the same time, - * thereby gaining some efficiency. The result is placed in the out variable - * $result. The return value is true if something was replaced. - * @deprecated since 1.25, unused - * - * @param array $magicarr - * @param string $subject - * @param string $result - * - * @return bool - */ - public function replaceMultiple( $magicarr, $subject, &$result ) { - wfDeprecated( __METHOD__, '1.25' ); - $search = []; - $replace = []; - foreach ( $magicarr as $id => $replacement ) { - $mw = MagicWord::get( $id ); - $search[] = $mw->getRegex(); - $replace[] = $replacement; - } - - $result = preg_replace( $search, $replace, $subject ); - return $result !== $subject; - } - /** * Adds all the synonyms of this MagicWord to an array, to allow quick * lookup in a list of magic words * - * @param array $array + * @param array &$array * @param string $value */ public function addToArray( &$array, $value ) { diff --git a/includes/MagicWordArray.php b/includes/MagicWordArray.php index 6a9ead5f1e..7461191fca 100644 --- a/includes/MagicWordArray.php +++ b/includes/MagicWordArray.php @@ -260,7 +260,7 @@ class MagicWordArray { * Returns an associative array, ID => param value, for all items that match * Removes the matched items from the input string (passed by reference) * - * @param string $text + * @param string &$text * * @return array */ @@ -304,7 +304,7 @@ class MagicWordArray { * Return false if no match found and $text is not modified. * Does not match parameters. * - * @param string $text + * @param string &$text * * @return int|bool False on failure */ diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index 521c02c922..4e471844d8 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -21,9 +21,11 @@ */ use MediaWiki\Logger\LoggerFactory; +use Psr\Log\LoggerInterface; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ChronologyProtector; use Wikimedia\Rdbms\LBFactory; +use Wikimedia\Rdbms\DBConnectionError; /** * The MediaWiki class is the helper class for the index.php entry point. @@ -280,7 +282,7 @@ class MediaWiki { } // Special pages ($title may have changed since if statement above) - if ( NS_SPECIAL == $title->getNamespace() ) { + if ( $title->isSpecialPage() ) { // Actions that need to be made when we have a special pages SpecialPageFactory::executePath( $title, $this->context ); } else { @@ -537,13 +539,12 @@ class MediaWiki { HTMLFileCache::useFileCache( $this->context, HTMLFileCache::MODE_OUTAGE ) ) { // Try to use any (even stale) file during outages... - $cache = new HTMLFileCache( $context->getTitle(), 'view' ); + $cache = new HTMLFileCache( $context->getTitle(), $action ); if ( $cache->isCached() ) { $cache->loadFromFileCache( $context, HTMLFileCache::MODE_OUTAGE ); print MWExceptionRenderer::getHTML( $e ); exit; } - } MWExceptionHandler::handleException( $e ); @@ -608,6 +609,7 @@ class MediaWiki { $lbFactory->hasOrMadeRecentMasterChanges( INF ) ) ? self::getUrlDomainDistance( $output->getRedirect(), $context ) : false; + $allowHeaders = !( $output->isDisabled() || headers_sent() ); if ( $urlDomainDistance === 'local' || $urlDomainDistance === 'remote' ) { // OutputPage::output() will be fast; $postCommitWork will not be useful for // masking the latency of syncing DB positions accross all datacenters synchronously. @@ -615,7 +617,7 @@ class MediaWiki { $flags = $lbFactory::SHUTDOWN_CHRONPROT_ASYNC; $cpPosTime = microtime( true ); // Client's next request should see 1+ positions with this DBMasterPos::asOf() time - if ( $urlDomainDistance === 'local' ) { + if ( $urlDomainDistance === 'local' && $allowHeaders ) { // Client will stay on this domain, so set an unobtrusive cookie $expires = time() + ChronologyProtector::POSITION_TTL; $options = [ 'prefix' => '' ]; @@ -632,7 +634,7 @@ class MediaWiki { // OutputPage::output() is fairly slow; run it in $postCommitWork to mask // the latency of syncing DB positions accross all datacenters synchronously $flags = $lbFactory::SHUTDOWN_CHRONPROT_SYNC; - if ( $lbFactory->hasOrMadeRecentMasterChanges( INF ) ) { + if ( $lbFactory->hasOrMadeRecentMasterChanges( INF ) && $allowHeaders ) { $cpPosTime = microtime( true ); // Set a cookie in case the DB position store cannot sync accross datacenters. // This will at least cover the common case of the user staying on the domain. @@ -718,21 +720,28 @@ class MediaWiki { * @since 1.26 */ public function doPostOutputShutdown( $mode = 'normal' ) { - $timing = $this->context->getTiming(); - $timing->mark( 'requestShutdown' ); - - // Show visible profiling data if enabled (which cannot be post-send) - Profiler::instance()->logDataPageOutputOnly(); + // Perform the last synchronous operations... + try { + // Record backend request timing + $timing = $this->context->getTiming(); + $timing->mark( 'requestShutdown' ); + // Show visible profiling data if enabled (which cannot be post-send) + Profiler::instance()->logDataPageOutputOnly(); + } catch ( Exception $e ) { + // An error may already have been shown in run(), so just log it to be safe + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); + } + // Defer everything else if possible... $callback = function () use ( $mode ) { try { $this->restInPeace( $mode ); } catch ( Exception $e ) { - MWExceptionHandler::handleException( $e ); + // If this is post-send, then displaying errors can cause broken HTML + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); } }; - // Defer everything else... if ( function_exists( 'register_postsend_function' ) ) { // https://github.com/facebook/hhvm/issues/1230 register_postsend_function( $callback ); @@ -813,7 +822,6 @@ class MediaWiki { // ATTENTION: This hook is likely to be removed soon due to overall design of the system. if ( Hooks::run( 'BeforeHttpsRedirect', [ $this->context, &$redirUrl ] ) ) { - if ( $request->wasPosted() ) { // This is weird and we'd hope it almost never happens. This // means that a POST came in via HTTP and policy requires us @@ -896,12 +904,11 @@ class MediaWiki { __METHOD__ ); + // Important: this must be the last deferred update added (T100085, T154425) + DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] ); + // Do any deferred jobs DeferredUpdates::doUpdates( 'enqueue' ); - DeferredUpdates::setImmediateMode( true ); - - // Make sure any lazy jobs are pushed - JobQueueGroup::pushLazyJobs(); // Now that everything specific to this request is done, // try to occasionally run jobs (if enabled) from the queues @@ -942,24 +949,45 @@ class MediaWiki { $n = intval( $jobRunRate ); } - $runJobsLogger = LoggerFactory::getInstance( 'runJobs' ); + $logger = LoggerFactory::getInstance( 'runJobs' ); - // Fall back to running the job(s) while the user waits if needed - if ( !$this->config->get( 'RunJobsAsync' ) ) { - $runner = new JobRunner( $runJobsLogger ); - $runner->run( [ 'maxJobs' => $n ] ); - return; - } - - // Do not send request if there are probably no jobs try { - $group = JobQueueGroup::singleton(); - if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) { - return; + if ( $this->config->get( 'RunJobsAsync' ) ) { + // Send an HTTP request to the job RPC entry point if possible + $invokedWithSuccess = $this->triggerAsyncJobs( $n, $logger ); + if ( !$invokedWithSuccess ) { + // Fall back to blocking on running the job(s) + $logger->warning( "Jobs switched to blocking; Special:RunJobs disabled" ); + $this->triggerSyncJobs( $n, $logger ); + } + } else { + $this->triggerSyncJobs( $n, $logger ); } } catch ( JobQueueError $e ) { + // Do not make the site unavailable (T88312) MWExceptionHandler::logException( $e ); - return; // do not make the site unavailable + } + } + + /** + * @param integer $n Number of jobs to try to run + * @param LoggerInterface $runJobsLogger + */ + private function triggerSyncJobs( $n, LoggerInterface $runJobsLogger ) { + $runner = new JobRunner( $runJobsLogger ); + $runner->run( [ 'maxJobs' => $n ] ); + } + + /** + * @param integer $n Number of jobs to try to run + * @param LoggerInterface $runJobsLogger + * @return bool Success + */ + private function triggerAsyncJobs( $n, LoggerInterface $runJobsLogger ) { + // Do not send request if there are probably no jobs + $group = JobQueueGroup::singleton(); + if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) { + return true; } $query = [ 'title' => 'Special:RunJobs', @@ -1026,12 +1054,6 @@ class MediaWiki { $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" ); } - // Fall back to running the job(s) while the user waits if needed - if ( !$invokedWithSuccess ) { - $runJobsLogger->warning( "Jobs switched to blocking; Special:RunJobs disabled" ); - - $runner = new JobRunner( $runJobsLogger ); - $runner->run( [ 'maxJobs' => $n ] ); - } + return $invokedWithSuccess; } } diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index e44fefe9b5..84fc959fa7 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -9,9 +9,9 @@ use EventRelayerGroup; use GenderCache; use GlobalVarConfig; use Hooks; +use IBufferingStatsdDataFactory; use Wikimedia\Rdbms\LBFactory; use LinkCache; -use Liuggio\StatsdClient\Factory\StatsdDataFactory; use Wikimedia\Rdbms\LoadBalancer; use MediaHandlerFactory; use MediaWiki\Linker\LinkRenderer; @@ -23,6 +23,7 @@ use MWException; use MimeAnalyzer; use ObjectCache; use Parser; +use ParserCache; use ProxyLookup; use SearchEngine; use SearchEngineConfig; @@ -377,7 +378,7 @@ class MediaWikiServices extends ServiceContainer { parent::__construct(); // Register the given Config object as the bootstrap config service. - $this->defineService( 'BootstrapConfig', function() use ( $config ) { + $this->defineService( 'BootstrapConfig', function () use ( $config ) { return $config; } ); } @@ -446,7 +447,7 @@ class MediaWikiServices extends ServiceContainer { /** * @since 1.27 - * @return StatsdDataFactory + * @return IBufferingStatsdDataFactory */ public function getStatsdDataFactory() { return $this->getService( 'StatsdDataFactory' ); @@ -573,6 +574,14 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'Parser' ); } + /** + * @since 1.30 + * @return ParserCache + */ + public function getParserCache() { + return $this->getService( 'ParserCache' ); + } + /** * @since 1.28 * @return GenderCache @@ -656,6 +665,22 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'VirtualRESTServiceClient' ); } + /** + * @since 1.29 + * @return \ConfiguredReadOnlyMode + */ + public function getConfiguredReadOnlyMode() { + return $this->getService( 'ConfiguredReadOnlyMode' ); + } + + /** + * @since 1.29 + * @return \ReadOnlyMode + */ + public function getReadOnlyMode() { + return $this->getService( 'ReadOnlyMode' ); + } + /////////////////////////////////////////////////////////////////////////// // NOTE: When adding a service getter here, don't forget to add a test // case for it in MediaWikiServicesTest::provideGetters() and in diff --git a/includes/MergeHistory.php b/includes/MergeHistory.php index 8cf3af1581..48ff97bdf1 100644 --- a/includes/MergeHistory.php +++ b/includes/MergeHistory.php @@ -25,6 +25,7 @@ * @file */ use Wikimedia\Timestamp\TimestampException; +use Wikimedia\Rdbms\IDatabase; /** * Handles the backend logic of merging the histories of two @@ -59,7 +60,6 @@ class MergeHistory { protected $revisionsMerged; /** - * MergeHistory constructor. * @param Title $source Page from which history will be merged * @param Title $dest Page to which history will be merged * @param string|bool $timestamp Timestamp up to which history from the source will be merged diff --git a/includes/Message.php b/includes/Message.php index fd67613e28..8777c6fee1 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -419,7 +419,7 @@ class Message implements MessageSpecifier, Serializable { } if ( $value instanceof Message ) { // Message, RawMessage, ApiMessage, etc - $message = clone( $value ); + $message = clone $value; } elseif ( $value instanceof MessageSpecifier ) { $message = new Message( $value ); } elseif ( is_string( $value ) ) { @@ -488,7 +488,7 @@ class Message implements MessageSpecifier, Serializable { * * @since 1.17 * - * @param mixed ... Parameters as strings or arrays from + * @param mixed $args,... Parameters as strings or arrays from * Message::numParam() and the like, or a single array of parameters. * * @return Message $this diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php index f062d13514..a2a44bb868 100644 --- a/includes/MimeMagic.php +++ b/includes/MimeMagic.php @@ -28,14 +28,14 @@ class MimeMagic extends MimeAnalyzer { /** * Get an instance of this class * @return MimeMagic - * @deprecated since 1.28 get a MimeAnalyzer instance form MediaWikiServices + * @deprecated since 1.28 get a MimeAnalyzer instance from MediaWikiServices */ public static function singleton() { // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic $instance = MediaWikiServices::getInstance()->getMimeAnalyzer(); Assert::postcondition( $instance instanceof MimeMagic, - __METHOD__ . ' should return an instance of ' . MimeMagic::class + __METHOD__ . ' should return an instance of ' . self::class ); return $instance; } diff --git a/includes/MovePage.php b/includes/MovePage.php index 9a83d35705..39dc6424db 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -440,8 +440,8 @@ class MovePage { * @throws MWException */ private function moveToInternal( User $user, &$nt, $reason = '', $createRedirect = true, - array $changeTags = [] ) { - + array $changeTags = [] + ) { global $wgContLang; if ( $nt->exists() ) { $moveOverRedirect = true; @@ -455,7 +455,7 @@ class MovePage { $overwriteMessage = wfMessage( 'delete_and_move_reason', $this->oldTitle->getPrefixedText() - )->text(); + )->inContentLanguage()->text(); $newpage = WikiPage::factory( $nt ); $errs = []; $status = $newpage->doDeleteArticleReal( @@ -511,7 +511,7 @@ class MovePage { $logEntry->setComment( $reason ); $logEntry->setParameters( [ '4::target' => $nt->getPrefixedText(), - '5::noredir' => $redirectContent ? '0': '1', + '5::noredir' => $redirectContent ? '0' : '1', ] ); $formatter = LogFormatter::newFromEntry( $logEntry ); diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php index 2f47006272..2dc3732011 100644 --- a/includes/OutputHandler.php +++ b/includes/OutputHandler.php @@ -183,7 +183,6 @@ function wfDoContentLength( $length ) { * @return string */ function wfHtmlValidationHandler( $s ) { - $errors = ''; if ( MWTidy::checkErrors( $s, $errors ) ) { return $s; diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 9ecfa23e2a..2a3a7cd147 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -285,9 +285,9 @@ class OutputPage extends ContextSource { private $mTarget = null; /** - * @var bool Whether parser output should contain table of contents + * @var bool Whether parser output contains a table of contents */ - private $mEnableTOC = true; + private $mEnableTOC = false; /** * @var bool Whether parser output should contain section edit links @@ -295,13 +295,18 @@ class OutputPage extends ContextSource { private $mEnableSectionEditLinks = true; /** - * @var string|null The URL to send in a element with rel=copyright + * @var string|null The URL to send in a element with rel=license */ private $copyrightUrl; /** @var array Profiling data */ private $limitReportJSData = []; + /** + * Link: header contents + */ + private $mLinkHeader = []; + /** * Constructor for OutputPage. This should not be called directly. * Instead a new RequestContext should be created and it will implicitly create @@ -566,6 +571,7 @@ class OutputPage extends ContextSource { * @param bool $filter Whether to filter out insufficiently trustworthy modules * @param string|null $position If not null, only return modules with this position * @param string $param + * @param string $type * @return array Array of module names */ public function getModules( $filter = false, $position = null, $param = 'mModules', @@ -683,7 +689,7 @@ class OutputPage extends ContextSource { * Add one or more head items to the output * * @since 1.28 - * @param string|string[] $value Raw HTML + * @param string|string[] $values Raw HTML */ public function addHeadItems( $values ) { $this->mHeadItems = array_merge( $this->mHeadItems, (array)$values ); @@ -1568,6 +1574,7 @@ class OutputPage extends ContextSource { // been changed somehow, and keep it if so. $anonPO = ParserOptions::newFromAnon(); $anonPO->setEditSection( false ); + $anonPO->setAllowUnsafeRawHtml( false ); if ( !$options->matches( $anonPO ) ) { wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) ); $options->isBogus = false; @@ -1581,6 +1588,7 @@ class OutputPage extends ContextSource { // either. $po = ParserOptions::newFromAnon(); $po->setEditSection( false ); + $po->setAllowUnsafeRawHtml( false ); $po->isBogus = true; if ( $options !== null ) { $this->mParserOptions = empty( $options->isBogus ) ? $options : null; @@ -1590,6 +1598,7 @@ class OutputPage extends ContextSource { $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() ); $this->mParserOptions->setEditSection( false ); + $this->mParserOptions->setAllowUnsafeRawHtml( false ); } if ( $options !== null && !empty( $options->isBogus ) ) { @@ -1707,7 +1716,7 @@ class OutputPage extends ContextSource { * Add wikitext with a custom Title object * * @param string $text Wikitext - * @param Title $title + * @param Title &$title * @param bool $linestart Is this the start of a line? */ public function addWikiTextWithTitle( $text, &$title, $linestart = true ) { @@ -1718,7 +1727,7 @@ class OutputPage extends ContextSource { * Add wikitext with a custom Title object and tidy enabled. * * @param string $text Wikitext - * @param Title $title + * @param Title &$title * @param bool $linestart Is this the start of a line? */ function addWikiTextTitleTidy( $text, &$title, $linestart = true ) { @@ -1765,17 +1774,6 @@ class OutputPage extends ContextSource { $this->addParserOutput( $parserOutput ); } - /** - * Add a ParserOutput object, but without Html. - * - * @deprecated since 1.24, use addParserOutputMetadata() instead. - * @param ParserOutput $parserOutput - */ - public function addParserOutputNoText( $parserOutput ) { - wfDeprecated( __METHOD__, '1.24' ); - $this->addParserOutputMetadata( $parserOutput ); - } - /** * Add all metadata associated with a ParserOutput object, but without the actual HTML. This * includes categories, language links, ResourceLoader modules, effects of certain magic words, @@ -1842,6 +1840,14 @@ class OutputPage extends ContextSource { $outputPage = $this; Hooks::run( 'LanguageLinks', [ $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ] ); Hooks::run( 'OutputPageParserOutput', [ &$outputPage, $parserOutput ] ); + + // This check must be after 'OutputPageParserOutput' runs in addParserOutputMetadata + // so that extensions may modify ParserOutput to toggle TOC. + // This cannot be moved to addParserOutputText because that is not + // called by EditPage for Preview. + if ( $parserOutput->getTOCEnabled() && $parserOutput->getTOCHTML() ) { + $this->mEnableTOC = true; + } } /** @@ -1882,7 +1888,6 @@ class OutputPage extends ContextSource { */ function addParserOutput( $parserOutput ) { $this->addParserOutputMetadata( $parserOutput ); - $parserOutput->setTOCEnabled( $this->mEnableTOC ); // Touch section edit links only if not previously disabled if ( $parserOutput->getEditSectionTokens() ) { @@ -1895,7 +1900,7 @@ class OutputPage extends ContextSource { /** * Add the output of a QuickTemplate to the output buffer * - * @param QuickTemplate $template + * @param QuickTemplate &$template */ public function addTemplate( &$template ) { $this->addHTML( $template->getHTML() ); @@ -1959,7 +1964,7 @@ class OutputPage extends ContextSource { } /** - * @param $maxage + * @param int $maxage * @deprecated since 1.27 Use setCdnMaxage() instead */ public function setSquidMaxage( $maxage ) { @@ -2102,6 +2107,28 @@ class OutputPage extends ContextSource { return 'Vary: ' . implode( ', ', array_keys( $this->mVaryHeader ) ); } + /** + * Add an HTTP Link: header + * + * @param string $header Header value + */ + public function addLinkHeader( $header ) { + $this->mLinkHeader[] = $header; + } + + /** + * Return a Link: header. Based on the values of $mLinkHeader. + * + * @return string + */ + public function getLinkHeader() { + if ( !$this->mLinkHeader ) { + return false; + } + + return 'Link: ' . implode( ',', $this->mLinkHeader ); + } + /** * Get a complete Key header * @@ -2358,6 +2385,19 @@ class OutputPage extends ContextSource { // jQuery etc. can work correctly. $response->header( 'X-UA-Compatible: IE=Edge' ); + if ( !$this->mArticleBodyOnly ) { + $sk = $this->getSkin(); + + if ( $sk->shouldPreloadLogo() ) { + $this->addLogoPreloadLinkHeaders(); + } + } + + $linkHeader = $this->getLinkHeader(); + if ( $linkHeader ) { + $response->header( $linkHeader ); + } + // Prevent framing, if requested $frameOptions = $this->getFrameOptions(); if ( $frameOptions ) { @@ -2367,27 +2407,16 @@ class OutputPage extends ContextSource { if ( $this->mArticleBodyOnly ) { echo $this->mBodytext; } else { - $sk = $this->getSkin(); - // add skin specific modules - $modules = $sk->getDefaultModules(); - - // Enforce various default modules for all pages and all skins - $coreModules = [ - // Keep this list as small as possible - 'site', - 'mediawiki.page.startup', - 'mediawiki.user', - ]; - - // Support for high-density display images if enabled - if ( $config->get( 'ResponsiveImages' ) ) { - $coreModules[] = 'mediawiki.hidpi'; + // Enable safe mode if requested + if ( $this->getRequest()->getBool( 'safemode' ) ) { + $this->disallowUserJs(); } - $this->addModules( $coreModules ); - foreach ( $modules as $group ) { + $sk = $this->getSkin(); + foreach ( $sk->getDefaultModules() as $group ) { $this->addModules( $group ); } + MWDebug::addModules( $this ); // Avoid PHP 7.1 warning of passing $this by reference @@ -2724,7 +2753,9 @@ class OutputPage extends ContextSource { } else { $titleObj = Title::newFromText( $returnto ); } - if ( !is_object( $titleObj ) ) { + // We don't want people to return to external interwiki. That + // might potentially be used as part of a phishing scheme + if ( !is_object( $titleObj ) || $titleObj->isExternal() ) { $titleObj = Title::newMainPage(); } @@ -2878,6 +2909,18 @@ class OutputPage extends ContextSource { $pieces[] = $this->buildExemptModules(); $pieces = array_merge( $pieces, array_values( $this->getHeadLinksArray() ) ); $pieces = array_merge( $pieces, array_values( $this->mHeadItems ) ); + + $min = ResourceLoader::inDebugMode() ? '' : '.min'; + // Use an IE conditional comment to serve the script only to old IE + $pieces[] = ''; + $pieces[] = Html::closeElement( 'head' ); $bodyClasses = []; @@ -2978,7 +3021,7 @@ class OutputPage extends ContextSource { && $this->userCanPreview(); } - private function isUserCssPreview() { + protected function isUserCssPreview() { return $this->getConfig()->get( 'AllowUserCss' ) && $this->getTitle() && $this->getTitle()->isCssSubpage() @@ -3171,6 +3214,10 @@ class OutputPage extends ContextSource { $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) ); + $vars['wgRelevantPageIsProbablyEditable'] = $relevantTitle + && $relevantTitle->quickUserCan( 'edit', $user ) + && ( $relevantTitle->exists() || $relevantTitle->quickUserCan( 'create', $user ) ); + foreach ( $title->getRestrictionTypes() as $type ) { $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type ); } @@ -3412,7 +3459,7 @@ class OutputPage extends ContextSource { if ( $copyright ) { $tags['copyright'] = Html::element( 'link', [ - 'rel' => 'copyright', + 'rel' => 'license', 'href' => $copyright ] ); } @@ -3510,16 +3557,6 @@ class OutputPage extends ContextSource { return $tags; } - /** - * @return string HTML tag links to be put in the header. - * @deprecated since 1.24 Use OutputPage::headElement or if you have to, - * OutputPage::getHeadLinksArray directly. - */ - public function getHeadLinks() { - wfDeprecated( __METHOD__, '1.24' ); - return implode( "\n", $this->getHeadLinksArray() ); - } - /** * Generate a "" for a feed. * @@ -3620,10 +3657,21 @@ class OutputPage extends ContextSource { [ 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ] ); + $separateReq = [ 'site.styles', 'user.styles' ]; foreach ( $this->rlExemptStyleModules as $group => $moduleNames ) { - $chunks[] = $this->makeResourceLoaderLink( $moduleNames, + // Combinable modules + $chunks[] = $this->makeResourceLoaderLink( + array_diff( $moduleNames, $separateReq ), ResourceLoaderModule::TYPE_STYLES ); + + foreach ( array_intersect( $moduleNames, $separateReq ) as $name ) { + // These require their own dedicated request in order to support "@import" + // syntax, which is incompatible with concatenation. (T147667, T37562) + $chunks[] = $this->makeResourceLoaderLink( $name, + ResourceLoaderModule::TYPE_STYLES + ); + } } return self::combineWrappedStrings( array_merge( $chunks, $append ) ); @@ -3750,7 +3798,7 @@ class OutputPage extends ContextSource { * Caller is responsible for ensuring the file exists. Emits a PHP warning otherwise. * * @since 1.27 - * @param string $remotePath URL path prefix that points to $localPath + * @param string $remotePathPrefix URL path prefix that points to $localPath * @param string $localPath File directory exposed at $remotePath * @param string $file Path to target file relative to $localPath * @return string URL @@ -3885,15 +3933,7 @@ class OutputPage extends ContextSource { } /** - * Enables/disables TOC, doesn't override __NOTOC__ - * @param bool $flag - * @since 1.22 - */ - public function enableTOC( $flag = true ) { - $this->mEnableTOC = $flag; - } - - /** + * Whether the output has a table of contents * @return bool * @since 1.22 */ @@ -3925,12 +3965,10 @@ class OutputPage extends ContextSource { * @param String $skinName The Skin name to determine the correct OOUI theme * @param String $dir Language direction */ - public static function setupOOUI( $skinName = '', $dir = 'ltr' ) { - $themes = ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' ); - // Make keys (skin names) lowercase for case-insensitive matching. - $themes = array_change_key_case( $themes, CASE_LOWER ); - $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : 'MediaWiki'; - // For example, 'OOUI\MediaWikiTheme'. + public static function setupOOUI( $skinName = 'default', $dir = 'ltr' ) { + $themes = ResourceLoaderOOUIModule::getSkinThemeMap(); + $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : $themes['default']; + // For example, 'OOUI\WikimediaUITheme'. $themeClass = "OOUI\\{$theme}Theme"; OOUI\Theme::setSingleton( new $themeClass() ); OOUI\Element::setDefaultDir( $dir ); @@ -3949,10 +3987,83 @@ class OutputPage extends ContextSource { ); $this->addModuleStyles( [ 'oojs-ui-core.styles', - 'oojs-ui.styles.icons', 'oojs-ui.styles.indicators', 'oojs-ui.styles.textures', 'mediawiki.widgets.styles', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-alerts', + 'oojs-ui.styles.icons-interactions', ] ); } + + /** + * Add Link headers for preloading the wiki's logo. + * + * @since 1.26 + */ + protected function addLogoPreloadLinkHeaders() { + $logo = ResourceLoaderSkinModule::getLogo( $this->getConfig() ); + + $tags = []; + $logosPerDppx = []; + $logos = []; + + if ( !is_array( $logo ) ) { + // No media queries required if we only have one variant + $this->addLinkHeader( '<' . $logo . '>;rel=preload;as=image' ); + return; + } + + foreach ( $logo as $dppx => $src ) { + // Keys are in this format: "1.5x" + $dppx = substr( $dppx, 0, -1 ); + $logosPerDppx[$dppx] = $src; + } + + // Because PHP can't have floats as array keys + uksort( $logosPerDppx, function ( $a , $b ) { + $a = floatval( $a ); + $b = floatval( $b ); + + if ( $a == $b ) { + return 0; + } + // Sort from smallest to largest (e.g. 1x, 1.5x, 2x) + return ( $a < $b ) ? -1 : 1; + } ); + + foreach ( $logosPerDppx as $dppx => $src ) { + $logos[] = [ 'dppx' => $dppx, 'src' => $src ]; + } + + $logosCount = count( $logos ); + // Logic must match ResourceLoaderSkinModule: + // - 1x applies to resolution < 1.5dppx + // - 1.5x applies to resolution >= 1.5dppx && < 2dppx + // - 2x applies to resolution >= 2dppx + // Note that min-resolution and max-resolution are both inclusive. + for ( $i = 0; $i < $logosCount; $i++ ) { + if ( $i === 0 ) { + // Smallest dppx + // min-resolution is ">=" (larger than or equal to) + // "not min-resolution" is essentially "<" + $media_query = 'not all and (min-resolution: ' . $logos[ 1 ]['dppx'] . 'dppx)'; + } elseif ( $i !== $logosCount - 1 ) { + // In between + // Media query expressions can only apply "not" to the entire expression + // (e.g. can't express ">= 1.5 and not >= 2). + // Workaround: Use <= 1.9999 in place of < 2. + $upper_bound = floatval( $logos[ $i + 1 ]['dppx'] ) - 0.000001; + $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] . + 'dppx) and (max-resolution: ' . $upper_bound . 'dppx)'; + } else { + // Largest dppx + $media_query = '(min-resolution: ' . $logos[ $i ]['dppx'] . 'dppx)'; + } + + $this->addLinkHeader( + '<' . $logos[$i]['src'] . '>;rel=preload;as=image;media=' . $media_query + ); + } + } } diff --git a/includes/PHPVersionCheck.php b/includes/PHPVersionCheck.php index c56931e484..cd5bf54998 100644 --- a/includes/PHPVersionCheck.php +++ b/includes/PHPVersionCheck.php @@ -3,10 +3,6 @@ // @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 - * unrecoverable error. - * * 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 @@ -24,17 +20,23 @@ * * @file */ + +/** + * Check PHP Version, as well as for composer dependencies in entry points, + * and display something vaguely comprehensible in the event of a totally + * unrecoverable error. + * @class + */ 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 $mwVersion = '1.30'; var $functionsExtensionsMapping = array( 'mb_substr' => 'mbstring', 'utf8_encode' => 'xml', 'ctype_digit' => 'ctype', 'json_decode' => 'json', 'iconv' => 'iconv', + 'mime_content_type' => 'fileinfo', ); /** @@ -63,10 +65,41 @@ class PHPVersionCheck { /** * Returns the version of the installed php implementation. * - * @return string + * @param string $impl By default, the function returns the info of the currently installed PHP + * implementation. Using this parameter the caller can decide, what version info will be + * returned. Valid values: HHVM, PHP + * @return array An array of information about the php implementation, containing: + * - 'version': The version of the php implementation (specific to the implementation, not + * the version of the implemented php version) + * - 'implementation': The name of the implementation used + * - 'vendor': The development group, vendor or developer of the implementation. + * - 'upstreamSupported': The minimum version of the implementation supported by the named vendor. + * - 'minSupported': The minimum version supported by MediWiki + * - 'upgradeURL': The URL to the website of the implementation that contains + * upgrade/installation instructions. */ - function getPHPImplVersion() { - return PHP_VERSION; + function getPHPInfo( $impl = false ) { + if ( + ( defined( 'HHVM_VERSION' ) && $impl !== 'PHP' ) || + $impl === 'HHVM' + ) { + return array( + 'implementation' => 'HHVM', + 'version' => defined( 'HHVM_VERSION' ) ? HHVM_VERSION : 'undefined', + 'vendor' => 'Facebook', + 'upstreamSupported' => '3.6.5', + 'minSupported' => '3.6.5', + 'upgradeURL' => 'https://docs.hhvm.com/hhvm/installation/introduction', + ); + } + return array( + 'implementation' => 'PHP', + 'version' => PHP_VERSION, + 'vendor' => 'the PHP Group', + 'upstreamSupported' => '5.5.0', + 'minSupported' => '5.5.9', + 'upgradeURL' => 'http://www.php.net/downloads.php', + ); } /** @@ -75,31 +108,44 @@ class PHPVersionCheck { * @return $this */ function checkRequiredPHPVersion() { + $phpInfo = $this->getPHPInfo(); + $minimumVersion = $phpInfo['minSupported']; + $otherInfo = $this->getPHPInfo( $phpInfo['implementation'] === 'HHVM' ? 'PHP' : 'HHVM' ); if ( !function_exists( 'version_compare' ) - || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0 + || version_compare( $phpInfo['version'], $minimumVersion ) < 0 ) { - $shortText = "MediaWiki $this->mwVersion requires at least PHP version" - . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}."; + $shortText = "MediaWiki $this->mwVersion requires at least {$phpInfo['implementation']}" + . " version $minimumVersion or {$otherInfo['implementation']} version " + . "{$otherInfo['minSupported']}, you are using {$phpInfo['implementation']} " + . "{$phpInfo['version']}."; - $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"; + $longText = "Error: You might be using an older {$phpInfo['implementation']} version. \n" + . "MediaWiki $this->mwVersion needs {$phpInfo['implementation']}" + . " $minimumVersion or higher or {$otherInfo['implementation']} version " + . "{$otherInfo['minSupported']}.\n\nCheck if you have a" + . " newer php executable with a different name, such as php5.\n\n"; $longHtml = <<upgrading your copy of PHP. - PHP versions less than 5.5.0 are no longer supported by the PHP Group and will not receive + Please consider upgrading your copy of + {$phpInfo['implementation']}. + {$phpInfo['implementation']} versions less than {$phpInfo['upstreamSupported']} are no + longer supported by {$phpInfo['vendor']} and will not receive security or bugfix updates.

    - If for some reason you are unable to upgrade your PHP version, you will need to - download an older version - of MediaWiki from our website. See our - compatibility page - for details of which versions are compatible with prior versions of PHP. + If for some reason you are unable to upgrade your {$phpInfo['implementation']} version, + you will need to download an + older version of MediaWiki from our website. + See ourcompatibility page + for details of which versions are compatible with prior versions of {$phpInfo['implementation']}. HTML; - $this->triggerError( 'Supported PHP versions', $shortText, $longText, $longHtml ); + $this->triggerError( + "Supported {$phpInfo['implementation']} versions", + $shortText, + $longText, + $longHtml + ); } } @@ -185,9 +231,9 @@ HTML; /** * Returns an error page, which is suitable for output to the end user via a web browser. * - * @param $title - * @param $longHtml - * @param $shortText + * @param string $title + * @param string $longHtml + * @param string $shortText * @return string */ function getIndexErrorOutput( $title, $longHtml, $shortText ) { diff --git a/includes/PageProps.php b/includes/PageProps.php index 382d089c5b..dac756ed75 100644 --- a/includes/PageProps.php +++ b/includes/PageProps.php @@ -55,7 +55,7 @@ class PageProps { } $previousValue = self::$instance; self::$instance = $store; - return new ScopedCallback( function() use ( $previousValue ) { + return new ScopedCallback( function () use ( $previousValue ) { self::$instance = $previousValue; } ); } diff --git a/includes/Preferences.php b/includes/Preferences.php index b428e87be4..c74d6e1dce 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -109,7 +109,7 @@ class Preferences { * @throws MWException * @param User $user * @param IContextSource $context - * @param array $defaultPreferences Array to load values for + * @param array &$defaultPreferences Array to load values for * @return array|null */ static function loadPreferenceValues( $user, $context, &$defaultPreferences ) { @@ -202,7 +202,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences * @return void */ static function profilePreferences( $user, IContextSource $context, &$defaultPreferences ) { @@ -599,7 +599,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences * @return void */ static function skinPreferences( $user, IContextSource $context, &$defaultPreferences ) { @@ -650,7 +650,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function filesPreferences( $user, IContextSource $context, &$defaultPreferences ) { # # Files ##################################### @@ -671,7 +671,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences * @return void */ static function datetimePreferences( $user, IContextSource $context, &$defaultPreferences ) { @@ -749,7 +749,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) { # # Diffs #################################### @@ -811,7 +811,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) { # # Editing ##################################### @@ -884,7 +884,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function rcPreferences( $user, IContextSource $context, &$defaultPreferences ) { $config = $context->getConfig(); @@ -901,6 +901,8 @@ class Preferences { ]; $defaultPreferences['rclimit'] = [ 'type' => 'int', + 'min' => 0, + 'max' => 1000, 'label-message' => 'recentchangescount', 'help-message' => 'prefs-help-recentchangescount', 'section' => 'rc/displayrc', @@ -915,6 +917,12 @@ class Preferences { 'label-message' => 'tog-hideminor', 'section' => 'rc/advancedrc', ]; + $defaultPreferences['rcfilters-saved-queries'] = [ + 'type' => 'api', + ]; + $defaultPreferences['rcfilters-rclimit'] = [ + 'type' => 'api', + ]; if ( $config->get( 'RCWatchCategoryMembership' ) ) { $defaultPreferences['hidecategorization'] = [ @@ -952,7 +960,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function watchlistPreferences( $user, IContextSource $context, &$defaultPreferences ) { $config = $context->getConfig(); @@ -1036,6 +1044,11 @@ class Preferences { 'section' => 'watchlist/advancedwatchlist', 'label-message' => 'tog-watchlistreloadautomatically', ]; + $defaultPreferences['watchlistunwatchlinks'] = [ + 'type' => 'toggle', + 'section' => 'watchlist/advancedwatchlist', + 'label-message' => 'tog-watchlistunwatchlinks', + ]; if ( $config->get( 'RCWatchCategoryMembership' ) ) { $defaultPreferences['watchlisthidecategorization'] = [ @@ -1102,7 +1115,7 @@ class Preferences { /** * @param User $user * @param IContextSource $context - * @param array $defaultPreferences + * @param array &$defaultPreferences */ static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) { foreach ( MWNamespace::getValidNamespaces() as $n ) { @@ -1114,6 +1127,9 @@ class Preferences { /** * Dummy, kept for backwards-compatibility. + * @param User $user + * @param IContextSource $context + * @param array &$defaultPreferences */ static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) { } @@ -1313,7 +1329,7 @@ class Preferences { $formClass = 'PreferencesForm', array $remove = [] ) { - $formDescriptor = Preferences::getPreferences( $user, $context ); + $formDescriptor = self::getPreferences( $user, $context ); if ( count( $remove ) ) { $removeKeys = array_flip( $remove ); $formDescriptor = array_diff_key( $formDescriptor, $removeKeys ); @@ -1482,6 +1498,8 @@ class Preferences { } if ( $user->isAllowed( 'editmyoptions' ) ) { + $oldUserOptions = $user->getOptions(); + foreach ( self::$saveBlacklist as $b ) { unset( $formData[$b] ); } @@ -1502,7 +1520,10 @@ class Preferences { $user->setOption( $key, $value ); } - Hooks::run( 'PreferencesFormPreSave', [ $formData, $form, $user, &$result ] ); + Hooks::run( + 'PreferencesFormPreSave', + [ $formData, $form, $user, &$result, $oldUserOptions ] + ); } MediaWiki\Auth\AuthManager::callLegacyAuthPlugin( 'updateExternalDB', [ $user ] ); diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php index a68c36fb6b..53608e849a 100644 --- a/includes/ProtectionForm.php +++ b/includes/ProtectionForm.php @@ -616,7 +616,7 @@ class ProtectionForm { /** * Show protection long extracts for this page * - * @param OutputPage $out + * @param OutputPage &$out * @access private */ function showLogExtract( &$out ) { diff --git a/includes/ReadOnlyMode.php b/includes/ReadOnlyMode.php new file mode 100644 index 0000000000..547c2d5efe --- /dev/null +++ b/includes/ReadOnlyMode.php @@ -0,0 +1,68 @@ +configuredReadOnly = $cro; + $this->loadBalancer = $loadBalancer; + } + + /** + * Check whether the wiki is in read-only mode. + * + * @return bool + */ + public function isReadOnly() { + return $this->getReason() !== false; + } + + /** + * Check if the site is in read-only mode and return the message if so + * + * This checks the configuration and registered DB load balancers for + * read-only mode. This may result in DB connection being made. + * + * @return string|bool String when in read-only mode; false otherwise + */ + public function getReason() { + $reason = $this->configuredReadOnly->getReason(); + if ( $reason !== false ) { + return $reason; + } + $reason = $this->loadBalancer->getReadOnlyReason(); + if ( $reason !== false && $reason !== null ) { + return $reason; + } + return false; + } + + /** + * Set the read-only mode, which will apply for the remainder of the + * request or until a service reset. + * + * @param string|null $msg + */ + public function setReason( $msg ) { + $this->configuredReadOnly->setReason( $msg ); + } + + /** + * Clear the cache of the read only file + */ + public function clearCache() { + $this->configuredReadOnly->clearCache(); + } +} diff --git a/includes/Revision.php b/includes/Revision.php index dca2e1b569..3d4d161547 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -19,6 +19,9 @@ * * @file */ + +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; use MediaWiki\Linker\LinkTarget; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; @@ -556,8 +559,6 @@ class Revision implements IDBAccessObject { } /** - * Constructor - * * @param object|array $row Either a database row or an array * @throws MWException * @access private @@ -859,7 +860,7 @@ class Revision implements IDBAccessObject { * Revision::FOR_PUBLIC to be displayed to all users * Revision::FOR_THIS_USER to be displayed to the given user * Revision::RAW get the ID regardless of permissions - * @param User $user User object to check for, only if FOR_THIS_USER is passed + * @param User|null $user User object to check for, only if FOR_THIS_USER is passed * to the $audience parameter * @return int */ @@ -893,7 +894,7 @@ class Revision implements IDBAccessObject { * Revision::FOR_PUBLIC to be displayed to all users * Revision::FOR_THIS_USER to be displayed to the given user * Revision::RAW get the text regardless of permissions - * @param User $user User object to check for, only if FOR_THIS_USER is passed + * @param User|null $user User object to check for, only if FOR_THIS_USER is passed * to the $audience parameter * @return string */ @@ -937,7 +938,7 @@ class Revision implements IDBAccessObject { * Revision::FOR_PUBLIC to be displayed to all users * Revision::FOR_THIS_USER to be displayed to the given user * Revision::RAW get the text regardless of permissions - * @param User $user User object to check for, only if FOR_THIS_USER is passed + * @param User|null $user User object to check for, only if FOR_THIS_USER is passed * to the $audience parameter * @return string */ @@ -1001,7 +1002,7 @@ class Revision implements IDBAccessObject { return RecentChange::newFromConds( [ - 'rc_user_text' => $this->getUserText( Revision::RAW ), + 'rc_user_text' => $this->getUserText( self::RAW ), 'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ), 'rc_this_oldid' => $this->getId() ], @@ -1279,12 +1280,15 @@ class Revision implements IDBAccessObject { if ( isset( $row->old_id ) && $wiki === false ) { // Make use of the wiki-local revision text cache $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); - $text = $cache->getWithSetCallback( + // The cached value should be decompressed, so handle that and return here + return $cache->getWithSetCallback( $cache->makeKey( 'revisiontext', 'textid', $row->old_id ), self::getCacheTTL( $cache ), - function () use ( $url, $wiki ) { + function () use ( $url, $wiki, $flags ) { // No negative caching per Revision::loadText() - return ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] ); + $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] ); + + return self::decompressRevisionText( $text, $flags ); }, [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => $cache::TTL_PROC_LONG ] ); @@ -1293,12 +1297,7 @@ class Revision implements IDBAccessObject { } } - // If the text was fetched without an error, convert it - if ( $text !== false ) { - $text = self::decompressRevisionText( $text, $flags ); - } - - return $text; + return self::decompressRevisionText( $text, $flags ); } /** @@ -1308,7 +1307,7 @@ class Revision implements IDBAccessObject { * data is compressed, and 'utf-8' if we're saving in UTF-8 * mode. * - * @param mixed $text Reference to a text + * @param mixed &$text Reference to a text * @return string */ public static function compressRevisionText( &$text ) { @@ -1344,6 +1343,13 @@ class Revision implements IDBAccessObject { * @return string|bool Decompressed text, or false on failure */ public static function decompressRevisionText( $text, $flags ) { + global $wgLegacyEncoding, $wgContLang; + + if ( $text === false ) { + // Text failed to be fetched; nothing to do + return false; + } + if ( in_array( 'gzip', $flags ) ) { # Deal with optional compression of archived pages. # This can be done periodically via maintenance/compressOld.php, and @@ -1366,7 +1372,6 @@ class Revision implements IDBAccessObject { $text = $obj->getText(); } - global $wgLegacyEncoding; if ( $text !== false && $wgLegacyEncoding && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) ) { @@ -1374,7 +1379,6 @@ class Revision implements IDBAccessObject { # Upconvert on demand. # ("utf8" checked for compatibility with some broken # conversion scripts 2008-12-30) - global $wgContLang; $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text ); } @@ -1462,7 +1466,7 @@ class Revision implements IDBAccessObject { ? $this->getPreviousRevisionId( $dbw ) : $this->mParentId, 'rev_sha1' => $this->mSha1 === null - ? Revision::base36Sha1( $this->mText ) + ? self::base36Sha1( $this->mText ) : $this->mSha1, ]; @@ -1490,7 +1494,10 @@ class Revision implements IDBAccessObject { $dbw->insert( 'revision', $row, __METHOD__ ); - $this->mId = $rev_id !== null ? $rev_id : $dbw->insertId(); + if ( $this->mId === null ) { + // Only if nextSequenceValue() was called + $this->mId = $dbw->insertId(); + } // Assertion to try to catch T92046 if ( (int)$this->mId === 0 ) { @@ -1548,7 +1555,7 @@ class Revision implements IDBAccessObject { } } - $content = $this->getContent( Revision::RAW ); + $content = $this->getContent( self::RAW ); $prefixedDBkey = $title->getPrefixedDBkey(); $revId = $this->mId; diff --git a/includes/RevisionList.php b/includes/RevisionList.php index d909a652d7..b0bc60a188 100644 --- a/includes/RevisionList.php +++ b/includes/RevisionList.php @@ -22,6 +22,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * List for revision table items for a single page @@ -36,7 +37,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator { /** @var ResultWrapper|bool */ protected $res; - /** @var bool|object */ + /** @var bool|Revision */ protected $current; /** @@ -115,7 +116,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator { } public function key() { - return $this->res ? $this->res->key(): 0; + return $this->res ? $this->res->key() : 0; } public function valid() { diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php index 5f6abee485..ed09701d4b 100644 --- a/includes/Sanitizer.php +++ b/includes/Sanitizer.php @@ -56,6 +56,21 @@ class Sanitizer { const EVIL_URI_PATTERN = '!(^|\s|\*/\s*)(javascript|vbscript)([^\w]|$)!i'; const XMLNS_ATTRIBUTE_PATTERN = "/^xmlns:[:A-Z_a-z-.0-9]+$/"; + /** + * Tells escapeUrlForHtml() to encode the ID using the wiki's primary encoding. + * + * @since 1.30 + */ + const ID_PRIMARY = 0; + + /** + * Tells escapeUrlForHtml() to encode the ID using the fallback encoding, or return false + * if no fallback is configured. + * + * @since 1.30 + */ + const ID_FALLBACK = 1; + /** * List of all named character entities defined in HTML 4.01 * https://www.w3.org/TR/html4/sgml/entities.html @@ -339,8 +354,8 @@ class Sanitizer { */ static function getAttribsRegex() { if ( self::$attribsRegex === null ) { - $attribFirst = '[:A-Z_a-z0-9]'; - $attrib = '[:A-Z_a-z-.0-9]'; + $attribFirst = "[:_\p{L}\p{N}]"; + $attrib = "[:_\.\-\p{L}\p{N}]"; $space = '[\x09\x0a\x0c\x0d\x20]'; self::$attribsRegex = "/(?:^|$space)({$attribFirst}{$attrib}*) @@ -351,7 +366,7 @@ class Sanitizer { | '([^']*)(?:'|\$) | (((?!$space|>).)*) ) - )?(?=$space|\$)/sx"; + )?(?=$space|\$)/sxu"; } return self::$attribsRegex; } @@ -465,7 +480,7 @@ class Sanitizer { extract( self::getRecognizedTagData( $extratags, $removetags ) ); # Remove HTML comments - $text = Sanitizer::removeHTMLcomments( $text ); + $text = self::removeHTMLcomments( $text ); $bits = explode( '<', $text ); $text = str_replace( '>', '>', array_shift( $bits ) ); if ( !MWTidy::isEnabled() ) { @@ -583,12 +598,12 @@ class Sanitizer { call_user_func_array( $processCallback, [ &$params, $args ] ); } - if ( !Sanitizer::validateTag( $params, $t ) ) { + if ( !self::validateTag( $params, $t ) ) { $badtag = true; } # Strip non-approved attributes from the tag - $newparams = Sanitizer::fixTagAttributes( $params, $t ); + $newparams = self::fixTagAttributes( $params, $t ); } if ( !$badtag ) { $rest = str_replace( '>', '>', $rest ); @@ -629,11 +644,11 @@ class Sanitizer { call_user_func_array( $warnCallback, [ 'deprecated-self-close-category' ] ); } } - if ( !Sanitizer::validateTag( $params, $t ) ) { + if ( !self::validateTag( $params, $t ) ) { $badtag = true; } - $newparams = Sanitizer::fixTagAttributes( $params, $t ); + $newparams = self::fixTagAttributes( $params, $t ); if ( !$badtag ) { if ( $brace === '/>' && !isset( $htmlsingleonly[$t] ) ) { # Interpret self-closing tags as empty tags even when @@ -710,7 +725,7 @@ class Sanitizer { * @return bool */ static function validateTag( $params, $element ) { - $params = Sanitizer::decodeTagAttributes( $params ); + $params = self::decodeTagAttributes( $params ); if ( $element == 'meta' || $element == 'link' ) { if ( !isset( $params['itemprop'] ) ) { @@ -746,8 +761,8 @@ class Sanitizer { * @todo Check for unique id attribute :P */ static function validateTagAttributes( $attribs, $element ) { - return Sanitizer::validateAttributes( $attribs, - Sanitizer::attributeWhitelist( $element ) ); + return self::validateAttributes( $attribs, + self::attributeWhitelist( $element ) ); } /** @@ -782,28 +797,25 @@ class Sanitizer { # Allow any attribute beginning with "data-" # However: - # * data-ooui is reserved for ooui - # * data-mw and data-parsoid are reserved for parsoid - # * data-mw- is reserved for extensions (or core) if - # they need to communicate some data to the client and want to be - # sure that it isn't coming from an untrusted user. + # * Disallow data attributes used by MediaWiki code # * Ensure that the attribute is not namespaced by banning # colons. - if ( !preg_match( '/^data-(?!ooui|mw|parsoid)[^:]*$/i', $attribute ) + if ( !preg_match( '/^data-[^:]*$/i', $attribute ) && !isset( $whitelist[$attribute] ) + || self::isReservedDataAttribute( $attribute ) ) { continue; } # Strip javascript "expression" from stylesheets. - # http://msdn.microsoft.com/workshop/author/dhtml/overview/recalc.asp + # https://msdn.microsoft.com/en-us/library/ms537634.aspx if ( $attribute == 'style' ) { - $value = Sanitizer::checkCss( $value ); + $value = self::checkCss( $value ); } # Escape HTML id attributes if ( $attribute === 'id' ) { - $value = Sanitizer::escapeId( $value, 'noninitial' ); + $value = self::escapeIdForAttribute( $value, self::ID_PRIMARY ); } # Escape HTML id reference lists @@ -812,7 +824,7 @@ class Sanitizer { || $attribute === 'aria-labelledby' || $attribute === 'aria-owns' ) { - $value = Sanitizer::escapeIdReferenceList( $value, 'noninitial' ); + $value = self::escapeIdReferenceList( $value, 'noninitial' ); } // RDFa and microdata properties allow URLs, URIs and/or CURIs. @@ -835,7 +847,7 @@ class Sanitizer { # NOTE: even though elements using href/src are not allowed directly, supply # validation code that can be used by tag hook handlers, etc - if ( $attribute === 'href' || $attribute === 'src' ) { + if ( $attribute === 'href' || $attribute === 'src' || $attribute === 'poster' ) { if ( !preg_match( $hrefExp, $value ) ) { continue; // drop any href or src attributes not using an allowed protocol. // NOTE: this also drops all relative URLs @@ -858,6 +870,24 @@ class Sanitizer { return $out; } + /** + * Given an attribute name, checks whether it is a reserved data attribute + * (such as data-mw-foo) which is unavailable to user-generated HTML so MediaWiki + * core and extension code can safely use it to communicate with frontend code. + * @param string $attr Attribute name. + * @return bool + */ + public static function isReservedDataAttribute( $attr ) { + // data-ooui is reserved for ooui. + // data-mw and data-parsoid are reserved for parsoid. + // data-mw- is reserved for extensions (or core) if + // they need to communicate some data to the client and want to be + // sure that it isn't coming from an untrusted user. + // We ignore the possibility of namespaces since user-generated HTML + // can't use them anymore. + return (bool)preg_match( '/^data-(ooui|mw|parsoid)/i', $attr ); + } + /** * Merge two sets of HTML attributes. Conflicting items in the second set * will override those in the first, except for 'class' attributes which @@ -891,9 +921,8 @@ class Sanitizer { * @return string normalized css */ public static function normalizeCss( $value ) { - // Decode character references like { - $value = Sanitizer::decodeCharReferences( $value ); + $value = self::decodeCharReferences( $value ); // Decode escape sequences and line continuation // See the grammar in the CSS 2 spec, appendix D. @@ -1073,14 +1102,14 @@ class Sanitizer { return ''; } - $decoded = Sanitizer::decodeTagAttributes( $text ); - $stripped = Sanitizer::validateTagAttributes( $decoded, $element ); + $decoded = self::decodeTagAttributes( $text ); + $stripped = self::validateTagAttributes( $decoded, $element ); if ( $sorted ) { ksort( $stripped ); } - return Sanitizer::safeEncodeTagAttributes( $stripped ); + return self::safeEncodeTagAttributes( $stripped ); } /** @@ -1110,7 +1139,7 @@ class Sanitizer { * @return string HTML-encoded text fragment */ static function safeEncodeAttribute( $text ) { - $encValue = Sanitizer::encodeAttribute( $text ); + $encValue = self::encodeAttribute( $text ); # Templates and links may be expanded in later parsing, # creating invalid or dangerous output. Suppress this. @@ -1150,6 +1179,8 @@ class Sanitizer { * ambiguous if it's part of something that looks like a percent escape * (which don't work reliably in fragments cross-browser). * + * @deprecated since 1.30, use one of this class' escapeIdFor*() functions + * * @see https://www.w3.org/TR/html401/types.html#type-name Valid characters * in the id and name attributes * @see https://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with @@ -1172,7 +1203,7 @@ class Sanitizer { global $wgExperimentalHtmlIds; $options = (array)$options; - $id = Sanitizer::decodeCharReferences( $id ); + $id = self::decodeCharReferences( $id ); if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) { $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id ); @@ -1192,7 +1223,7 @@ class Sanitizer { ]; $id = urlencode( strtr( $id, ' ', '_' ) ); - $id = str_replace( array_keys( $replace ), array_values( $replace ), $id ); + $id = strtr( $id, $replace ); if ( !preg_match( '/^[a-zA-Z]/', $id ) && !in_array( 'noninitial', $options ) ) { // Initial character must be a letter! @@ -1201,21 +1232,146 @@ class Sanitizer { return $id; } + /** + * Given a section name or other user-generated or otherwise unsafe string, escapes it to be + * a valid HTML id attribute. + * + * WARNING: unlike escapeId(), the output of this function is not guaranteed to be HTML safe, + * be sure to use proper escaping. + * + * @param string $id String to escape + * @param int $mode One of ID_* constants, specifying whether the primary or fallback encoding + * should be used. + * @return string|bool Escaped ID or false if fallback encoding is requested but it's not + * configured. + * + * @since 1.30 + */ + public static function escapeIdForAttribute( $id, $mode = self::ID_PRIMARY ) { + global $wgFragmentMode; + + if ( !isset( $wgFragmentMode[$mode] ) ) { + if ( $mode === self::ID_PRIMARY ) { + throw new UnexpectedValueException( '$wgFragmentMode is configured with no primary mode' ); + } + return false; + } + + $internalMode = $wgFragmentMode[$mode]; + + return self::escapeIdInternal( $id, $internalMode ); + } + + /** + * Given a section name or other user-generated or otherwise unsafe string, escapes it to be + * a valid URL fragment. + * + * WARNING: unlike escapeId(), the output of this function is not guaranteed to be HTML safe, + * be sure to use proper escaping. + * + * @param string $id String to escape + * @return string Escaped ID + * + * @since 1.30 + */ + public static function escapeIdForLink( $id ) { + global $wgFragmentMode; + + if ( !isset( $wgFragmentMode[self::ID_PRIMARY] ) ) { + throw new UnexpectedValueException( '$wgFragmentMode is configured with no primary mode' ); + } + + $mode = $wgFragmentMode[self::ID_PRIMARY]; + + $id = self::escapeIdInternal( $id, $mode ); + $id = self::urlEscapeId( $id, $mode ); + + return $id; + } + + /** + * Given a section name or other user-generated or otherwise unsafe string, escapes it to be + * a valid URL fragment for external interwikis. + * + * @param string $id String to escape + * @return string Escaped ID + * + * @since 1.30 + */ + public static function escapeIdForExternalInterwiki( $id ) { + global $wgExternalInterwikiFragmentMode; + + $id = self::escapeIdInternal( $id, $wgExternalInterwikiFragmentMode ); + $id = self::urlEscapeId( $id, $wgExternalInterwikiFragmentMode ); + + return $id; + } + + /** + * Helper for escapeIdFor*() functions. URL-escapes the ID if needed. + * + * @param string $id String to escape + * @param string $mode One of modes from $wgFragmentMode + * @return string + */ + private static function urlEscapeId( $id, $mode ) { + if ( $mode === 'html5' ) { + $id = urlencode( $id ); + $id = str_replace( '%3A', ':', $id ); + } + + return $id; + } + + /** + * Helper for escapeIdFor*() functions. Performs most of the actual escaping. + * + * @param string $id String to escape + * @param string $mode One of modes from $wgFragmentMode + * @return string + */ + private static function escapeIdInternal( $id, $mode ) { + $id = self::decodeCharReferences( $id ); + + switch ( $mode ) { + case 'html5': + $id = str_replace( ' ', '_', $id ); + break; + case 'legacy': + // This corresponds to 'noninitial' mode of the old escapeId() + static $replace = [ + '%3A' => ':', + '%' => '.' + ]; + + $id = urlencode( str_replace( ' ', '_', $id ) ); + $id = strtr( $id, $replace ); + break; + case 'html5-legacy': + $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id ); + $id = trim( $id, '_' ); + if ( $id === '' ) { + // Must have been all whitespace to start with. + $id = '_'; + } + break; + default: + throw new InvalidArgumentException( "Invalid mode '$mode' passed to '" . __METHOD__ ); + } + + return $id; + } + /** * Given a string containing a space delimited list of ids, escape each id * to match ids escaped by the escapeId() function. * + * @todo wfDeprecated() uses of $options in 1.31, remove completely in 1.32 + * * @since 1.27 * * @param string $referenceString Space delimited list of ids - * @param string|array $options String or array of strings (default is array()): - * 'noninitial': This is a non-initial fragment of an id, not a full id, - * so don't pay attention if the first character isn't valid at the - * beginning of an id. Only matters if $wgExperimentalHtmlIds is - * false. - * 'legacy': Behave the way the old HTML 4-based ID escaping worked even - * if $wgExperimentalHtmlIds is used, so we can generate extra - * anchors and links won't break. + * @param string|array $options Deprecated and does nothing. * @return string */ static function escapeIdReferenceList( $referenceString, $options = [] ) { @@ -1224,7 +1380,7 @@ class Sanitizer { # Escape each token as an id foreach ( $references as &$ref ) { - $ref = Sanitizer::escapeId( $ref, $options ); + $ref = self::escapeIdForAttribute( $ref ); } # Merge the array back to a space delimited list string @@ -1261,7 +1417,7 @@ class Sanitizer { * @return string Escaped input */ static function escapeHtmlAllowEntities( $html ) { - $html = Sanitizer::decodeCharReferences( $html ); + $html = self::decodeCharReferences( $html ); # It seems wise to escape ' as well as ", as a matter of course. Can't # hurt. Use ENT_SUBSTITUTE so that incorrectly truncated multibyte characters # don't cause the entire string to disappear. @@ -1303,14 +1459,14 @@ class Sanitizer { foreach ( $pairs as $set ) { $attribute = strtolower( $set[1] ); - $value = Sanitizer::getTagAttributeCallback( $set ); + $value = self::getTagAttributeCallback( $set ); // Normalize whitespace $value = preg_replace( '/[\t\r\n ]+/', ' ', $value ); $value = trim( $value ); // Decode character references - $attribs[$attribute] = Sanitizer::decodeCharReferences( $value ); + $attribs[$attribute] = self::decodeCharReferences( $value ); } return $attribs; } @@ -1326,7 +1482,7 @@ class Sanitizer { $attribs = []; foreach ( $assoc_array as $attribute => $value ) { $encAttribute = htmlspecialchars( $attribute ); - $encValue = Sanitizer::safeEncodeAttribute( $value ); + $encValue = self::safeEncodeAttribute( $value ); $attribs[] = "$encAttribute=\"$encValue\""; } @@ -1413,11 +1569,11 @@ class Sanitizer { static function normalizeCharReferencesCallback( $matches ) { $ret = null; if ( $matches[1] != '' ) { - $ret = Sanitizer::normalizeEntity( $matches[1] ); + $ret = self::normalizeEntity( $matches[1] ); } elseif ( $matches[2] != '' ) { - $ret = Sanitizer::decCharReference( $matches[2] ); + $ret = self::decCharReference( $matches[2] ); } elseif ( $matches[3] != '' ) { - $ret = Sanitizer::hexCharReference( $matches[3] ); + $ret = self::hexCharReference( $matches[3] ); } if ( is_null( $ret ) ) { return htmlspecialchars( $matches[0] ); @@ -1454,7 +1610,7 @@ class Sanitizer { */ static function decCharReference( $codepoint ) { $point = intval( $codepoint ); - if ( Sanitizer::validateCodepoint( $point ) ) { + if ( self::validateCodepoint( $point ) ) { return sprintf( '&#%d;', $point ); } else { return null; @@ -1467,7 +1623,7 @@ class Sanitizer { */ static function hexCharReference( $codepoint ) { $point = hexdec( $codepoint ); - if ( Sanitizer::validateCodepoint( $point ) ) { + if ( self::validateCodepoint( $point ) ) { return sprintf( '&#x%x;', $point ); } else { return null; @@ -1521,7 +1677,10 @@ class Sanitizer { $text = preg_replace_callback( self::CHAR_REFS_REGEX, [ 'Sanitizer', 'decodeCharReferencesCallback' ], - $text, /* limit */ -1, $count ); + $text, + -1, //limit + $count + ); if ( $count ) { return $wgContLang->normalize( $text ); @@ -1536,11 +1695,11 @@ class Sanitizer { */ static function decodeCharReferencesCallback( $matches ) { if ( $matches[1] != '' ) { - return Sanitizer::decodeEntity( $matches[1] ); + return self::decodeEntity( $matches[1] ); } elseif ( $matches[2] != '' ) { - return Sanitizer::decodeChar( intval( $matches[2] ) ); + return self::decodeChar( intval( $matches[2] ) ); } elseif ( $matches[3] != '' ) { - return Sanitizer::decodeChar( hexdec( $matches[3] ) ); + return self::decodeChar( hexdec( $matches[3] ) ); } # Last case should be an ampersand by itself return $matches[0]; @@ -1554,7 +1713,7 @@ class Sanitizer { * @private */ static function decodeChar( $codepoint ) { - if ( Sanitizer::validateCodepoint( $codepoint ) ) { + if ( self::validateCodepoint( $codepoint ) ) { return UtfNormal\Utils::codepointToUtf8( $codepoint ); } else { return UtfNormal\Constants::UTF8_REPLACEMENT; @@ -1587,7 +1746,7 @@ class Sanitizer { * @return array */ static function attributeWhitelist( $element ) { - $list = Sanitizer::setupAttributeWhitelist(); + $list = self::setupAttributeWhitelist(); return isset( $list[$element] ) ? $list[$element] : []; @@ -1758,7 +1917,11 @@ class Sanitizer { # Not usually allowed, but may be used for extension-style hooks # such as when it is rasterized, or if $wgAllowImageTag is # true - 'img' => array_merge( $common, [ 'alt', 'src', 'width', 'height' ] ), + 'img' => array_merge( $common, [ 'alt', 'src', 'width', 'height', 'srcset' ] ), + + 'video' => array_merge( $common, [ 'poster', 'controls', 'preload', 'width', 'height' ] ), + 'source' => array_merge( $common, [ 'type', 'src' ] ), + 'track' => array_merge( $common, [ 'type', 'src', 'srclang', 'kind', 'label' ] ), # 15.2.1 'tt' => $common, @@ -1784,13 +1947,17 @@ class Sanitizer { 'rb' => $common, 'rp' => $common, 'rt' => $common, # array_merge( $common, array( 'rbspan' ) ), - 'rtc' => $common, + 'rtc' => $common, # MathML root element, where used for extensions # 'title' may not be 100% valid here; it's XHTML # https://www.w3.org/TR/REC-MathML/ 'math' => [ 'class', 'style', 'id', 'title' ], + // HTML 5 section 4.5 + 'figure' => $common, + 'figcaption' => $common, + # HTML 5 section 4.6 'bdi' => $common, @@ -1806,7 +1973,7 @@ class Sanitizer { // (ie: validateTag rejects tags missing the attributes needed for Microdata) // So we don't bother including $common attributes that have no purpose. 'meta' => [ 'itemprop', 'content' ], - 'link' => [ 'itemprop', 'href' ], + 'link' => [ 'itemprop', 'href', 'title' ], ]; return $whitelist; @@ -1858,7 +2025,7 @@ class Sanitizer { static function cleanUrl( $url ) { # Normalize any HTML entities in input. They will be # re-escaped by makeExternalLink(). - $url = Sanitizer::decodeCharReferences( $url ); + $url = self::decodeCharReferences( $url ); # Escape any control characters introduced by the above step $url = preg_replace_callback( '/[\][<>"\\x00-\\x20\\x7F\|]/', diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index ce82702f0a..d048007c3a 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -43,24 +43,25 @@ use MediaWiki\Logger\LoggerFactory; use MediaWiki\MediaWikiServices; return [ - 'DBLoadBalancerFactory' => function( MediaWikiServices $services ) { + 'DBLoadBalancerFactory' => function ( MediaWikiServices $services ) { $mainConfig = $services->getMainConfig(); $lbConf = MWLBFactory::applyDefaultConfig( $mainConfig->get( 'LBFactoryConf' ), - $mainConfig + $mainConfig, + $services->getConfiguredReadOnlyMode() ); $class = MWLBFactory::getLBFactoryClass( $lbConf ); return new $class( $lbConf ); }, - 'DBLoadBalancer' => function( MediaWikiServices $services ) { + 'DBLoadBalancer' => function ( MediaWikiServices $services ) { // just return the default LB from the DBLoadBalancerFactory service return $services->getDBLoadBalancerFactory()->getMainLB(); }, - 'SiteStore' => function( MediaWikiServices $services ) { + 'SiteStore' => function ( MediaWikiServices $services ) { $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() ); // TODO: replace wfGetCache with a CacheFactory service. @@ -70,7 +71,7 @@ return [ return new CachingSiteStore( $rawSiteStore, $cache ); }, - 'SiteLookup' => function( MediaWikiServices $services ) { + 'SiteLookup' => function ( MediaWikiServices $services ) { $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' ); if ( $cacheFile !== false ) { @@ -81,7 +82,7 @@ return [ } }, - 'ConfigFactory' => function( MediaWikiServices $services ) { + 'ConfigFactory' => function ( MediaWikiServices $services ) { // Use the bootstrap config to initialize the ConfigFactory. $registry = $services->getBootstrapConfig()->get( 'ConfigRegistry' ); $factory = new ConfigFactory(); @@ -92,12 +93,12 @@ return [ return $factory; }, - 'MainConfig' => function( MediaWikiServices $services ) { + 'MainConfig' => function ( MediaWikiServices $services ) { // Use the 'main' config from the ConfigFactory service. return $services->getConfigFactory()->makeConfig( 'main' ); }, - 'InterwikiLookup' => function( MediaWikiServices $services ) { + 'InterwikiLookup' => function ( MediaWikiServices $services ) { global $wgContLang; // TODO: manage $wgContLang as a service $config = $services->getMainConfig(); return new ClassicInterwikiLookup( @@ -110,26 +111,26 @@ return [ ); }, - 'StatsdDataFactory' => function( MediaWikiServices $services ) { + 'StatsdDataFactory' => function ( MediaWikiServices $services ) { return new BufferingStatsdDataFactory( rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' ) ); }, - 'EventRelayerGroup' => function( MediaWikiServices $services ) { + 'EventRelayerGroup' => function ( MediaWikiServices $services ) { return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) ); }, - 'SearchEngineFactory' => function( MediaWikiServices $services ) { + 'SearchEngineFactory' => function ( MediaWikiServices $services ) { return new SearchEngineFactory( $services->getSearchEngineConfig() ); }, - 'SearchEngineConfig' => function( MediaWikiServices $services ) { + 'SearchEngineConfig' => function ( MediaWikiServices $services ) { global $wgContLang; return new SearchEngineConfig( $services->getMainConfig(), $wgContLang ); }, - 'SkinFactory' => function( MediaWikiServices $services ) { + 'SkinFactory' => function ( MediaWikiServices $services ) { $factory = new SkinFactory(); $names = $services->getMainConfig()->get( 'ValidSkinNames' ); @@ -152,20 +153,21 @@ return [ return $factory; }, - 'WatchedItemStore' => function( MediaWikiServices $services ) { + 'WatchedItemStore' => function ( MediaWikiServices $services ) { $store = new WatchedItemStore( $services->getDBLoadBalancer(), - new HashBagOStuff( [ 'maxKeys' => 100 ] ) + new HashBagOStuff( [ 'maxKeys' => 100 ] ), + $services->getReadOnlyMode() ); $store->setStatsdDataFactory( $services->getStatsdDataFactory() ); return $store; }, - 'WatchedItemQueryService' => function( MediaWikiServices $services ) { + 'WatchedItemQueryService' => function ( MediaWikiServices $services ) { return new WatchedItemQueryService( $services->getDBLoadBalancer() ); }, - 'CryptRand' => function( MediaWikiServices $services ) { + 'CryptRand' => function ( MediaWikiServices $services ) { $secretKey = $services->getMainConfig()->get( 'SecretKey' ); return new CryptRand( [ @@ -176,7 +178,7 @@ return [ // for a little more variance 'wfWikiID', // If we have a secret key set then throw it into the state as well - function() use ( $secretKey ) { + function () use ( $secretKey ) { return $secretKey ?: ''; } ], @@ -190,7 +192,7 @@ return [ ); }, - 'CryptHKDF' => function( MediaWikiServices $services ) { + 'CryptHKDF' => function ( MediaWikiServices $services ) { $config = $services->getMainConfig(); $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' ); @@ -213,13 +215,13 @@ return [ ); }, - 'MediaHandlerFactory' => function( MediaWikiServices $services ) { + 'MediaHandlerFactory' => function ( MediaWikiServices $services ) { return new MediaHandlerFactory( $services->getMainConfig()->get( 'MediaHandlers' ) ); }, - 'MimeAnalyzer' => function( MediaWikiServices $services ) { + 'MimeAnalyzer' => function ( MediaWikiServices $services ) { $logger = LoggerFactory::getInstance( 'Mime' ); $mainConfig = $services->getMainConfig(); $params = [ @@ -272,7 +274,7 @@ return [ return new MimeMagic( $params ); }, - 'ProxyLookup' => function( MediaWikiServices $services ) { + 'ProxyLookup' => function ( MediaWikiServices $services ) { $mainConfig = $services->getMainConfig(); return new ProxyLookup( $mainConfig->get( 'SquidServers' ), @@ -280,26 +282,37 @@ return [ ); }, - 'Parser' => function( MediaWikiServices $services ) { + 'Parser' => function ( MediaWikiServices $services ) { $conf = $services->getMainConfig()->get( 'ParserConf' ); return ObjectFactory::constructClassInstance( $conf['class'], [ $conf ] ); }, - 'LinkCache' => function( MediaWikiServices $services ) { + 'ParserCache' => function ( MediaWikiServices $services ) { + $config = $services->getMainConfig(); + $cache = ObjectCache::getInstance( $config->get( 'ParserCacheType' ) ); + wfDebugLog( 'caches', 'parser: ' . get_class( $cache ) ); + + return new ParserCache( + $cache, + $config->get( 'CacheEpoch' ) + ); + }, + + 'LinkCache' => function ( MediaWikiServices $services ) { return new LinkCache( $services->getTitleFormatter(), $services->getMainWANObjectCache() ); }, - 'LinkRendererFactory' => function( MediaWikiServices $services ) { + 'LinkRendererFactory' => function ( MediaWikiServices $services ) { return new LinkRendererFactory( $services->getTitleFormatter(), $services->getLinkCache() ); }, - 'LinkRenderer' => function( MediaWikiServices $services ) { + 'LinkRenderer' => function ( MediaWikiServices $services ) { global $wgUser; if ( defined( 'MW_NO_SESSION' ) ) { @@ -309,11 +322,11 @@ return [ } }, - 'GenderCache' => function( MediaWikiServices $services ) { + 'GenderCache' => function ( MediaWikiServices $services ) { return new GenderCache(); }, - '_MediaWikiTitleCodec' => function( MediaWikiServices $services ) { + '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) { global $wgContLang; return new MediaWikiTitleCodec( @@ -323,15 +336,15 @@ return [ ); }, - 'TitleFormatter' => function( MediaWikiServices $services ) { + 'TitleFormatter' => function ( MediaWikiServices $services ) { return $services->getService( '_MediaWikiTitleCodec' ); }, - 'TitleParser' => function( MediaWikiServices $services ) { + 'TitleParser' => function ( MediaWikiServices $services ) { return $services->getService( '_MediaWikiTitleCodec' ); }, - 'MainObjectStash' => function( MediaWikiServices $services ) { + 'MainObjectStash' => function ( MediaWikiServices $services ) { $mainConfig = $services->getMainConfig(); $id = $mainConfig->get( 'MainStash' ); @@ -343,7 +356,7 @@ return [ return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); }, - 'MainWANObjectCache' => function( MediaWikiServices $services ) { + 'MainWANObjectCache' => function ( MediaWikiServices $services ) { $mainConfig = $services->getMainConfig(); $id = $mainConfig->get( 'MainWANCache' ); @@ -363,7 +376,7 @@ return [ return \ObjectCache::newWANCacheFromParams( $params ); }, - 'LocalServerObjectCache' => function( MediaWikiServices $services ) { + 'LocalServerObjectCache' => function ( MediaWikiServices $services ) { $mainConfig = $services->getMainConfig(); if ( function_exists( 'apc_fetch' ) ) { @@ -386,7 +399,7 @@ return [ return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] ); }, - 'VirtualRESTServiceClient' => function( MediaWikiServices $services ) { + 'VirtualRESTServiceClient' => function ( MediaWikiServices $services ) { $config = $services->getMainConfig()->get( 'VirtualRestConfig' ); $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) ); @@ -404,6 +417,17 @@ return [ return $vrsClient; }, + 'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) { + return new ConfiguredReadOnlyMode( $services->getMainConfig() ); + }, + + 'ReadOnlyMode' => function ( MediaWikiServices $services ) { + return new ReadOnlyMode( + $services->getConfiguredReadOnlyMode(), + $services->getDBLoadBalancer() + ); + }, + /////////////////////////////////////////////////////////////////////////// // NOTE: When adding a service here, don't forget to add a getter function // in the MediaWikiServices class. The convenience getter should just call diff --git a/includes/Setup.php b/includes/Setup.php index 5ea96dd040..68e3d96afe 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -49,6 +49,10 @@ if ( !isset( $wgVersion ) ) { mb_internal_encoding( 'UTF-8' ); +// Set the configured locale on all requests for consisteny +putenv( "LC_ALL=$wgShellLocale" ); +setlocale( LC_ALL, $wgShellLocale ); + // Set various default paths sensibly... $ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' ); @@ -177,6 +181,20 @@ $wgLockManagers[] = [ 'class' => 'NullLockManager', ]; +/** + * Default parameters for the "" tag. + * @see DefaultSettings.php for description of the fields. + */ +$wgGalleryOptions += [ + 'imagesPerRow' => 0, + 'imageWidth' => 120, + 'imageHeight' => 120, + 'captionLength' => true, + 'showBytes' => true, + 'showDimensions' => true, + 'mode' => 'traditional', +]; + /** * Initialise $wgLocalFileRepo from backwards-compatible settings */ @@ -264,6 +282,11 @@ foreach ( $wgForeignFileRepos as &$repo ) { } unset( $repo ); // no global pollution; destroy reference +// Convert this deprecated setting to modern system +if ( $wgExperimentalHtmlIds ) { + $wgFragmentMode = [ 'html5-legacy', 'legacy' ]; +} + $rcMaxAgeDays = $wgRCMaxAge / ( 3600 * 24 ); if ( $wgRCFilterByAge ) { // Trim down $wgRCLinkDays so that it only lists links which are valid @@ -665,14 +688,19 @@ $ps_memcached = Profiler::instance()->scopedProfileIn( $fname . '-memcached' ); $wgMemc = wfGetMainCache(); $messageMemc = wfGetMessageCacheStorage(); -$parserMemc = wfGetParserCacheStorage(); + +/** + * @deprecated since 1.30 + */ +$parserMemc = new DeprecatedGlobal( 'parserMemc', function () { + return MediaWikiServices::getInstance()->getParserCache()->getCacheStorage(); +}, '1.30' ); wfDebugLog( 'caches', 'cluster: ' . get_class( $wgMemc ) . ', WAN: ' . ( $wgMainWANCache === CACHE_NONE ? 'CACHE_NONE' : $wgMainWANCache ) . ', stash: ' . $wgMainStash . ', message: ' . get_class( $messageMemc ) . - ', parser: ' . get_class( $parserMemc ) . ', session: ' . get_class( ObjectCache::getInstance( $wgSessionCacheType ) ) ); diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php index 8d9256b811..7a01a6575b 100644 --- a/includes/SiteConfiguration.php +++ b/includes/SiteConfiguration.php @@ -345,7 +345,7 @@ class SiteConfiguration { * @param string $setting ID of the setting name to retrieve * @param string $wiki Wiki ID of the wiki in question. * @param string $suffix The suffix of the wiki in question. - * @param array $var Reference The variable to insert the value into. + * @param array &$var Reference The variable to insert the value into. * @param array $params List of parameters. $.'key' is replaced by $value in all returned data. * @param array $wikiTags The tags assigned to the wiki. */ diff --git a/includes/SiteStats.php b/includes/SiteStats.php index 105a581888..6a2d0e2ada 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -20,6 +20,10 @@ * @file */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; +use MediaWiki\MediaWikiServices; + /** * Static accessor class for site_stats and related things */ @@ -30,9 +34,6 @@ class SiteStats { /** @var bool */ private static $loaded = false; - /** @var int */ - private static $jobs; - /** @var int[] */ private static $pageCount = []; @@ -75,9 +76,12 @@ class SiteStats { $row = self::doLoad( wfGetDB( DB_REPLICA ) ); if ( !self::isSane( $row ) ) { - // Might have just been initialized during this request? Underflow? - wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" ); - $row = self::doLoad( wfGetDB( DB_MASTER ) ); + $lb = MediaWikiServices::getInstance()->getDBLoadBalancer(); + if ( $lb->hasOrMadeRecentMasterChanges() ) { + // Might have just been initialized during this request? Underflow? + wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" ); + $row = self::doLoad( wfGetDB( DB_MASTER ) ); + } } if ( !$wgMiserMode && !self::isSane( $row ) ) { @@ -95,6 +99,7 @@ class SiteStats { if ( !self::isSane( $row ) ) { wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" ); } + return $row; } @@ -181,12 +186,11 @@ class SiteStats { * @return int */ static function numberingroup( $group ) { - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); return $cache->getWithSetCallback( - wfMemcKey( 'SiteStats', 'groupcounts', $group ), + $cache->makeKey( 'SiteStats', 'groupcounts', $group ), $cache::TTL_HOUR, function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) { - global $wgDisableUserGroupExpiry; $dbr = wfGetDB( DB_REPLICA ); $setOpts += Database::getCacheSetOptions( $dbr ); @@ -196,9 +200,7 @@ class SiteStats { 'COUNT(*)', [ 'ug_group' => $group, - $wgDisableUserGroupExpiry ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ], __METHOD__ ); @@ -208,24 +210,24 @@ class SiteStats { } /** + * Total number of jobs in the job queue. * @return int */ static function jobs() { - if ( !isset( self::$jobs ) ) { - try{ - self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() ); - } catch ( JobQueueError $e ) { - self::$jobs = 0; - } - /** - * Zero rows still do single row read for row that doesn't exist, - * but people are annoyed by that - */ - if ( self::$jobs == 1 ) { - self::$jobs = 0; - } - } - return self::$jobs; + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + return $cache->getWithSetCallback( + $cache->makeKey( 'SiteStats', 'jobscount' ), + $cache::TTL_MINUTE, + function ( $oldValue, &$ttl, array &$setOpts ) { + try{ + $jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() ); + } catch ( JobQueueError $e ) { + $jobs = 0; + } + return $jobs; + }, + [ 'pcTTL' => $cache::TTL_PROC_LONG ] + ); } /** @@ -291,7 +293,6 @@ class SiteStatsInit { private $mUsers = null, $mFiles = null; /** - * Constructor * @param bool|IDatabase $database * - boolean: Whether to use the master DB * - IDatabase: Database connection to use diff --git a/includes/StubObject.php b/includes/StubObject.php index 0210ed9d6a..baf5109952 100644 --- a/includes/StubObject.php +++ b/includes/StubObject.php @@ -55,8 +55,6 @@ class StubObject { protected $params; /** - * Constructor. - * * @param string $global Name of the global variable. * @param string|callable $class Name of the class of the real object * or a factory function to call @@ -88,7 +86,7 @@ class StubObject { * infinite loop when unstubbing an object or to avoid reference parameter * breakage. * - * @param object $obj Object to check. + * @param object &$obj Object to check. * @return void */ public static function unstub( &$obj ) { diff --git a/includes/TemplateParser.php b/includes/TemplateParser.php index 924c347aa5..2759ff9baa 100644 --- a/includes/TemplateParser.php +++ b/includes/TemplateParser.php @@ -102,20 +102,22 @@ class TemplateParser { $key = $cache->makeKey( 'template', $templateName, $fastHash ); $code = $this->forceRecompile ? null : $cache->get( $key ); - if ( !$code ) { - $code = $this->compileForEval( $fileContents, $filename ); - - // Prefix the cached code with a keyed hash (64 hex chars) as an integrity check - $cache->set( $key, hash_hmac( 'sha256', $code, $secretKey ) . $code ); - } else { + if ( $code ) { // Verify the integrity of the cached PHP code $keyedHash = substr( $code, 0, 64 ); $code = substr( $code, 64 ); if ( $keyedHash !== hash_hmac( 'sha256', $code, $secretKey ) ) { - // Generate a notice if integrity check fails - trigger_error( "Template failed integrity check: {$filename}" ); + // If the integrity check fails, don't use the cached code + // We'll update the invalid cache below + $code = null; } } + if ( !$code ) { + $code = $this->compileForEval( $fileContents, $filename ); + + // Prefix the cached code with a keyed hash (64 hex chars) as an integrity check + $cache->set( $key, hash_hmac( 'sha256', $code, $secretKey ) . $code ); + } // If there is no secret key available, don't use cache } else { $code = $this->compileForEval( $fileContents, $filename ); diff --git a/includes/Title.php b/includes/Title.php index a5bb9c691f..05f85fa47d 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -21,6 +21,9 @@ * * @file */ + +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; use MediaWiki\Linker\LinkTarget; use MediaWiki\Interwiki\InterwikiLookup; use MediaWiki\MediaWikiServices; @@ -269,7 +272,7 @@ class Title implements LinkTarget { } try { - return Title::newFromTextThrow( strval( $text ), $defaultNamespace ); + return self::newFromTextThrow( strval( $text ), $defaultNamespace ); } catch ( MalformedTitleException $ex ) { return null; } @@ -408,7 +411,7 @@ class Title implements LinkTarget { __METHOD__ ); if ( $row !== false ) { - $title = Title::newFromRow( $row ); + $title = self::newFromRow( $row ); } else { $title = null; } @@ -436,7 +439,7 @@ class Title implements LinkTarget { $titles = []; foreach ( $res as $row ) { - $titles[] = Title::newFromRow( $row ); + $titles[] = self::newFromRow( $row ); } return $titles; } @@ -538,7 +541,7 @@ class Title implements LinkTarget { } $t = new Title(); - $t->mDbkeyform = Title::makeName( $ns, $title, $fragment, $interwiki, true ); + $t->mDbkeyform = self::makeName( $ns, $title, $fragment, $interwiki, true ); try { $t->secureAndSplit(); @@ -554,10 +557,10 @@ class Title implements LinkTarget { * @return Title The new object */ public static function newMainPage() { - $title = Title::newFromText( wfMessage( 'mainpage' )->inContentLanguage()->text() ); + $title = self::newFromText( wfMessage( 'mainpage' )->inContentLanguage()->text() ); // Don't give fatal errors if the message is broken if ( !$title ) { - $title = Title::newFromText( 'Main Page' ); + $title = self::newFromText( 'Main Page' ); } return $title; } @@ -745,6 +748,8 @@ class Title implements LinkTarget { /** * Escape a text fragment, say from a link, for a URL * + * @deprecated since 1.30, use Sanitizer::escapeIdForLink() or escapeIdForExternalInterwiki() + * * @param string $fragment Containing a URL or link fragment (after the "#") * @return string Escaped string */ @@ -930,7 +935,7 @@ class Title implements LinkTarget { */ public function getContentModel( $flags = 0 ) { if ( !$this->mForcedContentModel - && ( !$this->mContentModel || $flags === Title::GAID_FOR_UPDATE ) + && ( !$this->mContentModel || $flags === self::GAID_FOR_UPDATE ) && $this->getArticleID( $flags ) ) { $linkCache = LinkCache::singleton(); @@ -1017,12 +1022,25 @@ class Title implements LinkTarget { } /** - * Could this title have a corresponding talk page? + * Can this title have a corresponding talk page? * - * @return bool + * @deprecated since 1.30, use canHaveTalkPage() instead. + * + * @return bool True if this title either is a talk page or can have a talk page associated. */ public function canTalk() { - return MWNamespace::canTalk( $this->mNamespace ); + return $this->canHaveTalkPage(); + } + + /** + * Can this title have a corresponding talk page? + * + * @see MWNamespace::hasTalkNamespace + * + * @return bool True if this title either is a talk page or can have a talk page associated. + */ + public function canHaveTalkPage() { + return MWNamespace::hasTalkNamespace( $this->mNamespace ); } /** @@ -1080,7 +1098,7 @@ class Title implements LinkTarget { if ( $canonicalName ) { $localName = SpecialPageFactory::getLocalNameFor( $canonicalName, $par ); if ( $localName != $this->mDbkeyform ) { - return Title::makeTitle( NS_SPECIAL, $localName ); + return self::makeTitle( NS_SPECIAL, $localName ); } } } @@ -1179,7 +1197,7 @@ class Title implements LinkTarget { * @return bool */ public function isMainPage() { - return $this->equals( Title::newMainPage() ); + return $this->equals( self::newMainPage() ); } /** @@ -1297,7 +1315,24 @@ class Title implements LinkTarget { * @return Title The object for the talk page */ public function getTalkPage() { - return Title::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() ); + return self::makeTitle( MWNamespace::getTalk( $this->getNamespace() ), $this->getDBkey() ); + } + + /** + * Get a Title object associated with the talk page of this article, + * if such a talk page can exist. + * + * @since 1.30 + * + * @return Title The object for the talk page, + * or null if no associated talk page can exist, according to canHaveTalkPage(). + */ + public function getTalkPageIfDefined() { + if ( !$this->canHaveTalkPage() ) { + return null; + } + + return $this->getTalkPage(); } /** @@ -1312,7 +1347,7 @@ class Title implements LinkTarget { if ( $this->getNamespace() == $subjectNS ) { return $this; } - return Title::makeTitle( $subjectNS, $this->getDBkey() ); + return self::makeTitle( $subjectNS, $this->getDBkey() ); } /** @@ -1366,14 +1401,16 @@ class Title implements LinkTarget { /** * Get the fragment in URL form, including the "#" character if there is one + * * @return string Fragment in URL form */ public function getFragmentForURL() { if ( !$this->hasFragment() ) { return ''; - } else { - return '#' . Title::escapeFragmentForURL( $this->getFragment() ); + } elseif ( $this->isExternal() && !$this->getTransWikiID() ) { + return '#' . Sanitizer::escapeIdForExternalInterwiki( $this->getFragment() ); } + return '#' . Sanitizer::escapeIdForLink( $this->getFragment() ); } /** @@ -1416,13 +1453,22 @@ class Title implements LinkTarget { * @return string The prefixed text */ private function prefix( $name ) { + global $wgContLang; + $p = ''; if ( $this->isExternal() ) { $p = $this->mInterwiki . ':'; } if ( 0 != $this->mNamespace ) { - $p .= $this->getNsText() . ':'; + $nsText = $this->getNsText(); + + if ( $nsText === false ) { + // See T165149. Awkward, but better than erroneously linking to the main namespace. + $nsText = $wgContLang->getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}"; + } + + $p .= $nsText . ':'; } return $p . $name; } @@ -1510,7 +1556,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getRootTitle() { - return Title::makeTitle( $this->getNamespace(), $this->getRootText() ); + return self::makeTitle( $this->getNamespace(), $this->getRootText() ); } /** @@ -1550,7 +1596,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getBaseTitle() { - return Title::makeTitle( $this->getNamespace(), $this->getBaseText() ); + return self::makeTitle( $this->getNamespace(), $this->getBaseText() ); } /** @@ -1586,7 +1632,7 @@ class Title implements LinkTarget { * @since 1.20 */ public function getSubpage( $text ) { - return Title::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text ); + return self::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text ); } /** @@ -1681,6 +1727,33 @@ class Title implements LinkTarget { return $url; } + /** + * Get a url appropriate for making redirects based on an untrusted url arg + * + * This is basically the same as getFullUrl(), but in the case of external + * interwikis, we send the user to a landing page, to prevent possible + * phishing attacks and the like. + * + * @note Uses current protocol by default, since technically relative urls + * aren't allowed in redirects per HTTP spec, so this is not suitable for + * places where the url gets cached, as might pollute between + * https and non-https users. + * @see self::getLocalURL for the arguments. + * @param array|string $query + * @param string $proto Protocol type to use in URL + * @return String. A url suitable to use in an HTTP location header. + */ + public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) { + $target = $this; + if ( $this->isExternal() ) { + $target = SpecialPage::getTitleFor( + 'GoToInterwiki', + $this->getPrefixedDBKey() + ); + } + return $target->getFullUrl( $query, false, $proto ); + } + /** * Get a URL with no fragment or server name (relative URL) from a Title object. * If this page is generated with action=render, however, @@ -1823,6 +1896,8 @@ class Title implements LinkTarget { * protocol-relative, the URL will be expanded to http:// * * @see self::getLocalURL for the arguments. + * @param string $query + * @param string|bool $query2 * @return string The URL */ public function getInternalURL( $query = '', $query2 = false ) { @@ -2093,7 +2168,7 @@ class Title implements LinkTarget { private function checkSpecialsAndNSPermissions( $action, $user, $errors, $rigor, $short ) { # Only 'createaccount' can be performed on special pages, # which don't actually exist in the DB. - if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) { + if ( $this->isSpecialPage() && $action !== 'createaccount' ) { $errors[] = [ 'ns-specialprotected' ]; } @@ -2122,8 +2197,7 @@ class Title implements LinkTarget { private function checkCSSandJSPermissions( $action, $user, $errors, $rigor, $short ) { # Protect css/js subpages of user pages # XXX: this might be better using restrictions - # XXX: right 'editusercssjs' is deprecated, for backward compatibility only - if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) { + if ( $action != 'patrol' ) { if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) { if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) { $errors[] = [ 'mycustomcssprotected', $action ]; @@ -2287,6 +2361,17 @@ class Title implements LinkTarget { ) { $errors[] = [ 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ]; } + } elseif ( $action === 'undelete' ) { + if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $rigor, true ) ) ) { + // Undeleting implies editing + $errors[] = [ 'undelete-cantedit' ]; + } + if ( !$this->exists() + && count( $this->getUserPermissionsErrorsInternal( 'create', $user, $rigor, true ) ) + ) { + // Undeleting where nothing currently exists implies creating + $errors[] = [ 'undelete-cantcreate' ]; + } } return $errors; } @@ -2785,7 +2870,7 @@ class Title implements LinkTarget { $page_id = $row->pr_page; $page_ns = $row->page_namespace; $page_title = $row->page_title; - $sources[$page_id] = Title::makeTitle( $page_ns, $page_title ); + $sources[$page_id] = self::makeTitle( $page_ns, $page_title ); # Add groups needed for each restriction type if its not already there # Make sure this restriction type still exists @@ -3110,7 +3195,7 @@ class Title implements LinkTarget { if ( $limit > -1 ) { $options['LIMIT'] = $limit; } - $this->mSubpages = TitleArray::newFromResult( + return TitleArray::newFromResult( $dbr->select( 'page', [ 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ], $conds, @@ -3118,7 +3203,6 @@ class Title implements LinkTarget { $options ) ); - return $this->mSubpages; } /** @@ -3267,7 +3351,7 @@ class Title implements LinkTarget { * @return int Int or 0 if the page doesn't exist */ public function getLatestRevID( $flags = 0 ) { - if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) { + if ( !( $flags & self::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) { return intval( $this->mLatestID ); } if ( !$this->getArticleID( $flags ) ) { @@ -3386,7 +3470,7 @@ class Title implements LinkTarget { $this->mTextform = strtr( $this->mDbkeyform, '_', ' ' ); # We already know that some pages won't be in the database! - if ( $this->isExternal() || $this->mNamespace == NS_SPECIAL ) { + if ( $this->isExternal() || $this->isSpecialPage() ) { $this->mArticleID = 0; } @@ -3427,7 +3511,7 @@ class Title implements LinkTarget { if ( $res->numRows() ) { $linkCache = LinkCache::singleton(); foreach ( $res as $row ) { - $titleObj = Title::makeTitle( $row->page_namespace, $row->page_title ); + $titleObj = self::makeTitle( $row->page_namespace, $row->page_title ); if ( $titleObj ) { $linkCache->addGoodLinkObjFromRow( $titleObj, $row ); $retVal[] = $titleObj; @@ -3495,9 +3579,9 @@ class Title implements LinkTarget { $linkCache = LinkCache::singleton(); foreach ( $res as $row ) { if ( $row->page_id ) { - $titleObj = Title::newFromRow( $row ); + $titleObj = self::newFromRow( $row ); } else { - $titleObj = Title::makeTitle( $row->$blNamespace, $row->$blTitle ); + $titleObj = self::makeTitle( $row->$blNamespace, $row->$blTitle ); $linkCache->addBadLinkObj( $titleObj ); } $retVal[] = $titleObj; @@ -3553,7 +3637,7 @@ class Title implements LinkTarget { $retVal = []; foreach ( $res as $row ) { - $retVal[] = Title::makeTitle( $row->pl_namespace, $row->pl_title ); + $retVal[] = self::makeTitle( $row->pl_namespace, $row->pl_title ); } return $retVal; } @@ -3611,7 +3695,7 @@ class Title implements LinkTarget { * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise * * @deprecated since 1.25, use MovePage's methods instead - * @param Title $nt The new title + * @param Title &$nt The new title * @param bool $auth Whether to check user permissions (uses $wgUser) * @param string $reason Is the log summary of the move, used for spam checking * @return array|bool True on success, getUserPermissionsErrors()-like array on failure @@ -3663,7 +3747,7 @@ class Title implements LinkTarget { * Move a title to a new location * * @deprecated since 1.25, use the MovePage class instead - * @param Title $nt The new title + * @param Title &$nt The new title * @param bool $auth Indicates whether $wgUser's permissions * should be checked * @param string $reason The reason for the move @@ -3673,8 +3757,8 @@ class Title implements LinkTarget { * @return array|bool True on success, getUserPermissionsErrors()-like array on failure */ public function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true, - array $changeTags = [] ) { - + array $changeTags = [] + ) { global $wgUser; $err = $this->isValidMoveOperation( $nt, $auth, $reason ); if ( is_array( $err ) ) { @@ -3711,8 +3795,8 @@ class Title implements LinkTarget { * no pages were moved */ public function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true, - array $changeTags = [] ) { - + array $changeTags = [] + ) { global $wgMaximumMovedPages; // Check permissions if ( !$this->userCan( 'move-subpages' ) ) { @@ -3765,7 +3849,7 @@ class Title implements LinkTarget { } # T16385: we need makeTitleSafe because the new page names may # be longer than 255 characters. - $newSubpage = Title::makeTitleSafe( $newNs, $newPageName ); + $newSubpage = self::makeTitleSafe( $newNs, $newPageName ); $success = $oldSubpage->moveTo( $newSubpage, $auth, $reason, $createRedirect, $changeTags ); if ( $success === true ) { @@ -3927,7 +4011,7 @@ class Title implements LinkTarget { # Circular reference $stack[$parent] = []; } else { - $nt = Title::newFromText( $parent ); + $nt = self::newFromText( $parent ); if ( $nt ) { $stack[$parent] = $nt->getParentCategoryTree( $children + [ $parent => 1 ] ); } @@ -3954,21 +4038,52 @@ class Title implements LinkTarget { } /** - * Get the revision ID of the previous revision - * + * Get next/previous revision ID relative to another revision ID * @param int $revId Revision ID. Get the revision that was before this one. * @param int $flags Title::GAID_FOR_UPDATE - * @return int|bool Old revision ID, or false if none exists - */ - public function getPreviousRevisionID( $revId, $flags = 0 ) { - $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA ); + * @param string $dir 'next' or 'prev' + * @return int|bool New revision ID, or false if none exists + */ + private function getRelativeRevisionID( $revId, $flags, $dir ) { + $revId = (int)$revId; + if ( $dir === 'next' ) { + $op = '>'; + $sort = 'ASC'; + } elseif ( $dir === 'prev' ) { + $op = '<'; + $sort = 'DESC'; + } else { + throw new InvalidArgumentException( '$dir must be "next" or "prev"' ); + } + + if ( $flags & self::GAID_FOR_UPDATE ) { + $db = wfGetDB( DB_MASTER ); + } else { + $db = wfGetDB( DB_REPLICA, 'contributions' ); + } + + // Intentionally not caring if the specified revision belongs to this + // page. We only care about the timestamp. + $ts = $db->selectField( 'revision', 'rev_timestamp', [ 'rev_id' => $revId ], __METHOD__ ); + if ( $ts === false ) { + $ts = $db->selectField( 'archive', 'ar_timestamp', [ 'ar_rev_id' => $revId ], __METHOD__ ); + if ( $ts === false ) { + // Or should this throw an InvalidArgumentException or something? + return false; + } + } + $ts = $db->addQuotes( $ts ); + $revId = $db->selectField( 'revision', 'rev_id', [ 'rev_page' => $this->getArticleID( $flags ), - 'rev_id < ' . intval( $revId ) + "rev_timestamp $op $ts OR (rev_timestamp = $ts AND rev_id $op $revId)" ], __METHOD__, - [ 'ORDER BY' => 'rev_id DESC' ] + [ + 'ORDER BY' => "rev_timestamp $sort, rev_id $sort", + 'IGNORE INDEX' => 'rev_timestamp', // Probably needed for T159319 + ] ); if ( $revId === false ) { @@ -3978,6 +4093,17 @@ class Title implements LinkTarget { } } + /** + * Get the revision ID of the previous revision + * + * @param int $revId Revision ID. Get the revision that was before this one. + * @param int $flags Title::GAID_FOR_UPDATE + * @return int|bool Old revision ID, or false if none exists + */ + public function getPreviousRevisionID( $revId, $flags = 0 ) { + return $this->getRelativeRevisionID( $revId, $flags, 'prev' ); + } + /** * Get the revision ID of the next revision * @@ -3986,21 +4112,7 @@ class Title implements LinkTarget { * @return int|bool Next revision ID, or false if none exists */ public function getNextRevisionID( $revId, $flags = 0 ) { - $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA ); - $revId = $db->selectField( 'revision', 'rev_id', - [ - 'rev_page' => $this->getArticleID( $flags ), - 'rev_id > ' . intval( $revId ) - ], - __METHOD__, - [ 'ORDER BY' => 'rev_id' ] - ); - - if ( $revId === false ) { - return false; - } else { - return intval( $revId ); - } + return $this->getRelativeRevisionID( $revId, $flags, 'next' ); } /** @@ -4016,7 +4128,10 @@ class Title implements LinkTarget { $row = $db->selectRow( 'revision', Revision::selectFields(), [ 'rev_page' => $pageId ], __METHOD__, - [ 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 ] + [ + 'ORDER BY' => 'rev_timestamp ASC, rev_id ASC', + 'IGNORE INDEX' => 'rev_timestamp', // See T159319 + ] ); if ( $row ) { return new Revision( $row ); @@ -4596,7 +4711,7 @@ class Title implements LinkTarget { } /** - * Whether the magic words __INDEX__ and __NOINDEX__ function for this page. + * Whether the magic words __INDEX__ and __NOINDEX__ function for this page. * * @return bool */ diff --git a/includes/TrackingCategories.php b/includes/TrackingCategories.php index 825860a5a9..b3a49c71dd 100644 --- a/includes/TrackingCategories.php +++ b/includes/TrackingCategories.php @@ -22,6 +22,7 @@ /** * This class performs some operations related to tracking categories, such as creating * a list of all such categories. + * @since 1.29 */ class TrackingCategories { /** @var Config */ @@ -45,6 +46,7 @@ class TrackingCategories { 'expansion-depth-exceeded-category', 'restricted-displaytitle-ignored', 'deprecated-self-close-category', + 'template-loop-category', ]; /** diff --git a/includes/WatchedItemQueryService.php b/includes/WatchedItemQueryService.php index bc57049801..1fafb24dbe 100644 --- a/includes/WatchedItemQueryService.php +++ b/includes/WatchedItemQueryService.php @@ -1,5 +1,6 @@ loadBalancer = $loadBalancer; $this->cache = $cache; + $this->readOnlyMode = $readOnlyMode; $this->stats = new NullStatsdDataFactory(); $this->deferredUpdatesAddCallableUpdateCallback = [ 'DeferredUpdates', 'addCallableUpdate' ]; $this->revisionGetTimestampFromIdCallback = [ 'Revision', 'getTimestampFromId' ]; @@ -91,7 +104,7 @@ class WatchedItemStore implements StatsdAwareInterface { } $previousValue = $this->deferredUpdatesAddCallableUpdateCallback; $this->deferredUpdatesAddCallableUpdateCallback = $callback; - return new ScopedCallback( function() use ( $previousValue ) { + return new ScopedCallback( function () use ( $previousValue ) { $this->deferredUpdatesAddCallableUpdateCallback = $previousValue; } ); } @@ -114,7 +127,7 @@ class WatchedItemStore implements StatsdAwareInterface { } $previousValue = $this->revisionGetTimestampFromIdCallback; $this->revisionGetTimestampFromIdCallback = $callback; - return new ScopedCallback( function() use ( $previousValue ) { + return new ScopedCallback( function () use ( $previousValue ) { $this->revisionGetTimestampFromIdCallback = $previousValue; } ); } @@ -454,7 +467,7 @@ class WatchedItemStore implements StatsdAwareInterface { $item = new WatchedItem( $user, $target, - $row->wl_notificationtimestamp + wfTimestampOrNull( TS_MW, $row->wl_notificationtimestamp ) ); $this->cache( $item ); @@ -568,7 +581,8 @@ class WatchedItemStore implements StatsdAwareInterface { ); foreach ( $res as $row ) { - $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp; + $timestamps[$row->wl_namespace][$row->wl_title] = + wfTimestampOrNull( TS_MW, $row->wl_notificationtimestamp ); } return $timestamps; @@ -591,7 +605,7 @@ class WatchedItemStore implements StatsdAwareInterface { * @return bool success */ public function addWatchBatchForUser( User $user, array $targets ) { - if ( $this->loadBalancer->getReadOnlyReason() !== false ) { + if ( $this->readOnlyMode->isReadOnly() ) { return false; } // Only loggedin user can have a watchlist @@ -649,7 +663,7 @@ class WatchedItemStore implements StatsdAwareInterface { */ public function removeWatch( User $user, LinkTarget $target ) { // Only logged in user can have a watchlist - if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) { + if ( $this->readOnlyMode->isReadOnly() || $user->isAnon() ) { return false; } @@ -780,7 +794,7 @@ class WatchedItemStore implements StatsdAwareInterface { */ public function resetNotificationTimestamp( User $user, Title $title, $force = '', $oldid = 0 ) { // Only loggedin user can have a watchlist - if ( $this->loadBalancer->getReadOnlyReason() !== false || $user->isAnon() ) { + if ( $this->readOnlyMode->isReadOnly() || $user->isAnon() ) { return false; } @@ -807,7 +821,7 @@ class WatchedItemStore implements StatsdAwareInterface { // Calls DeferredUpdates::addCallableUpdate in normal operation call_user_func( $this->deferredUpdatesAddCallableUpdateCallback, - function() use ( $job ) { + function () use ( $job ) { $job->run(); } ); diff --git a/includes/WebStart.php b/includes/WebStart.php index 15804c7bd4..e281b6f267 100644 --- a/includes/WebStart.php +++ b/includes/WebStart.php @@ -1,12 +1,11 @@ getDisplayName(); @@ -166,7 +166,7 @@ class WikiMap { * @return string|bool URL or false if the wiki was not found */ public static function getForeignURL( $wikiID, $page, $fragmentId = null ) { - $wiki = WikiMap::getWiki( $wikiID ); + $wiki = self::getWiki( $wikiID ); if ( $wiki ) { return $wiki->getFullUrl( $page, $fragmentId ); @@ -175,106 +175,3 @@ class WikiMap { return false; } } - -/** - * Reference to a locally-hosted wiki - */ -class WikiReference { - private $mCanonicalServer; ///< canonical server URL, e.g. 'https://www.mediawiki.org' - private $mServer; ///< server URL, may be protocol-relative, e.g. '//www.mediawiki.org' - private $mPath; ///< path, '/wiki/$1' - - /** - * @param string $canonicalServer - * @param string $path - * @param null|string $server - */ - public function __construct( $canonicalServer, $path, $server = null ) { - $this->mCanonicalServer = $canonicalServer; - $this->mPath = $path; - $this->mServer = $server === null ? $canonicalServer : $server; - } - - /** - * Get the URL in a way to be displayed to the user - * More or less Wikimedia specific - * - * @return string - */ - public function getDisplayName() { - $parsed = wfParseUrl( $this->mCanonicalServer ); - if ( $parsed ) { - return $parsed['host']; - } else { - // Invalid server spec. - // There's no sane thing to do here, so just return the canonical server name in full. - return $this->mCanonicalServer; - } - } - - /** - * Helper function for getUrl() - * - * @todo FIXME: This may be generalized... - * - * @param string $page Page name (must be normalised before calling this function! - * May contain a section part.) - * @param string|null $fragmentId - * - * @return string relative URL, without the server part. - */ - private function getLocalUrl( $page, $fragmentId = null ) { - $page = wfUrlencode( str_replace( ' ', '_', $page ) ); - - if ( is_string( $fragmentId ) && $fragmentId !== '' ) { - $page .= '#' . wfUrlencode( $fragmentId ); - } - - return str_replace( '$1', $page, $this->mPath ); - } - - /** - * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki - * - * @param string $page Page name (must be normalised before calling this function!) - * @param string|null $fragmentId - * - * @return string Url - */ - public function getCanonicalUrl( $page, $fragmentId = null ) { - return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId ); - } - - /** - * Get a canonical server URL - * @return string - */ - public function getCanonicalServer() { - return $this->mCanonicalServer; - } - - /** - * Alias for getCanonicalUrl(), for backwards compatibility. - * @param string $page - * @param string|null $fragmentId - * - * @return string - */ - public function getUrl( $page, $fragmentId = null ) { - return $this->getCanonicalUrl( $page, $fragmentId ); - } - - /** - * Get a URL based on $wgServer, like Title::getFullURL() would produce - * when called locally on the wiki. - * - * @param string $page Page name (must be normalized before calling this function!) - * @param string|null $fragmentId - * - * @return string URL - */ - public function getFullUrl( $page, $fragmentId = null ) { - return $this->mServer . - $this->getLocalUrl( $page, $fragmentId ); - } -} diff --git a/includes/WikiReference.php b/includes/WikiReference.php new file mode 100644 index 0000000000..724ba980a3 --- /dev/null +++ b/includes/WikiReference.php @@ -0,0 +1,124 @@ +mCanonicalServer = $canonicalServer; + $this->mPath = $path; + $this->mServer = $server === null ? $canonicalServer : $server; + } + + /** + * Get the URL in a way to be displayed to the user + * More or less Wikimedia specific + * + * @return string + */ + public function getDisplayName() { + $parsed = wfParseUrl( $this->mCanonicalServer ); + if ( $parsed ) { + return $parsed['host']; + } else { + // Invalid server spec. + // There's no sane thing to do here, so just return the canonical server name in full. + return $this->mCanonicalServer; + } + } + + /** + * Helper function for getUrl() + * + * @todo FIXME: This may be generalized... + * + * @param string $page Page name (must be normalised before calling this function! + * May contain a section part.) + * @param string|null $fragmentId + * + * @return string relative URL, without the server part. + */ + private function getLocalUrl( $page, $fragmentId = null ) { + $page = wfUrlencode( str_replace( ' ', '_', $page ) ); + + if ( is_string( $fragmentId ) && $fragmentId !== '' ) { + $page .= '#' . wfUrlencode( $fragmentId ); + } + + return str_replace( '$1', $page, $this->mPath ); + } + + /** + * Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki + * + * @param string $page Page name (must be normalised before calling this function!) + * @param string|null $fragmentId + * + * @return string Url + */ + public function getCanonicalUrl( $page, $fragmentId = null ) { + return $this->mCanonicalServer . $this->getLocalUrl( $page, $fragmentId ); + } + + /** + * Get a canonical server URL + * @return string + */ + public function getCanonicalServer() { + return $this->mCanonicalServer; + } + + /** + * Alias for getCanonicalUrl(), for backwards compatibility. + * @param string $page + * @param string|null $fragmentId + * + * @return string + */ + public function getUrl( $page, $fragmentId = null ) { + return $this->getCanonicalUrl( $page, $fragmentId ); + } + + /** + * Get a URL based on $wgServer, like Title::getFullURL() would produce + * when called locally on the wiki. + * + * @param string $page Page name (must be normalized before calling this function!) + * @param string|null $fragmentId + * + * @return string URL + */ + public function getFullUrl( $page, $fragmentId = null ) { + return $this->mServer . + $this->getLocalUrl( $page, $fragmentId ); + } +} diff --git a/includes/Xml.php b/includes/Xml.php index d24a27cfa8..16a5a9ddec 100644 --- a/includes/Xml.php +++ b/includes/Xml.php @@ -225,7 +225,7 @@ class Xml { $selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode; $options = "\n"; foreach ( $languages as $code => $name ) { - $options .= Xml::option( "$code - $name", $code, $code == $selected ) . "\n"; + $options .= self::option( "$code - $name", $code, $code == $selected ) . "\n"; } $attrs = [ 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' ]; @@ -235,8 +235,8 @@ class Xml { $msg = wfMessage( 'yourlanguage' ); } return [ - Xml::label( $msg->text(), $attrs['id'] ), - Xml::tags( 'select', $attrs, $options ) + self::label( $msg->text(), $attrs['id'] ), + self::tags( 'select', $attrs, $options ) ]; } @@ -400,7 +400,7 @@ class Xml { $value = false, $attribs = [] ) { return [ - Xml::label( $label, $id, $attribs ), + self::label( $label, $id, $attribs ), self::input( $name, $size, $value, [ 'id' => $id ] + $attribs ) ]; } @@ -556,41 +556,11 @@ class Xml { $attribs['tabindex'] = $tabindex; } - return Xml::openElement( 'select', $attribs ) + return self::openElement( 'select', $attribs ) . "\n" . $options . "\n" - . Xml::closeElement( 'select' ); - } - - /** - * Converts textual drop-down list to array - * - * @param string $list Correctly formatted text (newline delimited) to be - * used to generate the options. - * @return array - */ - public static function getArrayFromWikiTextList( $list = '' ) { - $options = []; - - foreach ( explode( "\n", $list ) as $option ) { - $value = trim( $option ); - if ( $value == '' ) { - continue; - } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) { - // A new group is starting ... - $value = trim( substr( $value, 1 ) ); - $options[] = $value; - } elseif ( substr( $value, 0, 2 ) == '**' ) { - // groupmember - $value = trim( substr( $value, 2 ) ); - $options[] = $value; - } else { - // groupless reason list - $options[] = $value; - } - } - return $options; + . self::closeElement( 'select' ); } /** @@ -605,15 +575,15 @@ class Xml { * @return string */ public static function fieldset( $legend = false, $content = false, $attribs = [] ) { - $s = Xml::openElement( 'fieldset', $attribs ) . "\n"; + $s = self::openElement( 'fieldset', $attribs ) . "\n"; if ( $legend ) { - $s .= Xml::element( 'legend', null, $legend ) . "\n"; + $s .= self::element( 'legend', null, $legend ) . "\n"; } if ( $content !== false ) { $s .= $content . "\n"; - $s .= Xml::closeElement( 'fieldset' ) . "\n"; + $s .= self::closeElement( 'fieldset' ) . "\n"; } return $s; @@ -674,7 +644,7 @@ class Xml { */ public static function encodeJsCall( $name, $args, $pretty = false ) { foreach ( $args as &$arg ) { - $arg = Xml::encodeJsVar( $arg, $pretty ); + $arg = self::encodeJsVar( $arg, $pretty ); if ( $arg === false ) { return false; } @@ -732,7 +702,7 @@ class Xml { $text . ''; - return Xml::isWellFormed( $html ); + return self::isWellFormed( $html ); } /** @@ -766,25 +736,25 @@ class Xml { foreach ( $fields as $labelmsg => $input ) { $id = "mw-$labelmsg"; - $form .= Xml::openElement( 'tr', [ 'id' => $id ] ); + $form .= self::openElement( 'tr', [ 'id' => $id ] ); // TODO use a . . ' . $s2; } - Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes ] ); + $attribs = [ 'data-mw-revid' => $rev->getId() ]; + + Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes, &$attribs ] ); + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); - $attribs = []; if ( $classes ) { $attribs['class'] = implode( ' ', $classes ); } diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php index 167b7098bd..68dda37b6d 100644 --- a/includes/actions/InfoAction.php +++ b/includes/actions/InfoAction.php @@ -23,6 +23,7 @@ */ use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\Database; /** * Displays information about a page. @@ -72,8 +73,9 @@ class InfoAction extends FormlessAction { $revid = $revision ? $revision->getId() : null; } if ( $revid !== null ) { - $key = self::getCacheKey( $title, $revid ); - ObjectCache::getMainWANInstance()->delete( $key ); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $key = self::getCacheKey( $cache, $title, $revid ); + $cache->delete( $key ); } } @@ -125,7 +127,10 @@ class InfoAction extends FormlessAction { // Messages: // pageinfo-header-basic, pageinfo-header-edits, pageinfo-header-restrictions, // pageinfo-header-properties, pageinfo-category-info - $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() ) . "\n"; + $content .= $this->makeHeader( + $this->msg( "pageinfo-${header}" )->escaped(), + "mw-pageinfo-${header}" + ) . "\n"; $table = "\n"; foreach ( $infoTable as $infoRow ) { $name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0]; @@ -150,10 +155,11 @@ class InfoAction extends FormlessAction { * @param string $header The header text. * @return string The HTML. */ - protected function makeHeader( $header ) { - $spanAttribs = [ 'class' => 'mw-headline', 'id' => Sanitizer::escapeId( $header ) ]; + protected function makeHeader( $header, $canonicalId ) { + $spanAttribs = [ 'class' => 'mw-headline', 'id' => Sanitizer::escapeIdForAttribute( $header ) ]; + $h2Attribs = [ 'id' => Sanitizer::escapeIdForAttribute( $canonicalId ) ]; - return Html::rawElement( 'h2', [], Html::element( 'span', $spanAttribs, $header ) ); + return Html::rawElement( 'h2', $h2Attribs, Html::element( 'span', $spanAttribs, $header ) ); } /** @@ -388,7 +394,10 @@ class InfoAction extends FormlessAction { $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' ); $pageInfo['header-basic'][] = [ - Linker::link( $prefixIndex, $this->msg( 'pageinfo-subpages-name' )->escaped() ), + $linkRenderer->makeLink( + $prefixIndex, + $this->msg( 'pageinfo-subpages-name' )->text() + ), $this->msg( 'pageinfo-subpages-value' ) ->numParams( $pageCounts['subpages']['total'], @@ -689,9 +698,10 @@ class InfoAction extends FormlessAction { protected function pageCounts( Page $page ) { $fname = __METHOD__; $config = $this->context->getConfig(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); - return ObjectCache::getMainWANInstance()->getWithSetCallback( - self::getCacheKey( $page->getTitle(), $page->getLatest() ), + return $cache->getWithSetCallback( + self::getCacheKey( $cache, $page->getTitle(), $page->getLatest() ), WANObjectCache::TTL_WEEK, function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) { $title = $page->getTitle(); @@ -902,11 +912,12 @@ class InfoAction extends FormlessAction { } /** + * @param WANObjectCache $cache * @param Title $title * @param int $revId * @return string */ - protected static function getCacheKey( Title $title, $revId ) { - return wfMemcKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION ); + protected static function getCacheKey( WANObjectCache $cache, Title $title, $revId ) { + return $cache->makeKey( 'infoaction', md5( $title->getPrefixedText() ), $revId, self::VERSION ); } } diff --git a/includes/actions/PurgeAction.php b/includes/actions/PurgeAction.php index 942b731634..904c6e273d 100644 --- a/includes/actions/PurgeAction.php +++ b/includes/actions/PurgeAction.php @@ -42,7 +42,7 @@ class PurgeAction extends FormAction { } public function onSubmit( $data ) { - return $this->page->doPurge( WikiPage::PURGE_ALL ); + return $this->page->doPurge(); } public function show() { @@ -75,12 +75,24 @@ class PurgeAction extends FormAction { } } - protected function alterForm( HTMLForm $form ) { - $form->setSubmitTextMsg( 'confirm_purge_button' ); + protected function usesOOUI() { + return true; } - protected function preText() { - return $this->msg( 'confirm-purge-top' )->parse(); + protected function getFormFields() { + return [ + 'intro' => [ + 'type' => 'info', + 'vertical-label' => true, + 'raw' => true, + 'default' => $this->msg( 'confirm-purge-top' )->parse() + ] + ]; + } + + protected function alterForm( HTMLForm $form ) { + $form->setWrapperLegendMsg( 'confirm-purge-title' ); + $form->setSubmitTextMsg( 'confirm_purge_button' ); } protected function postText() { diff --git a/includes/actions/RevertAction.php b/includes/actions/RevertAction.php index e466e6549a..a914c9b2b3 100644 --- a/includes/actions/RevertAction.php +++ b/includes/actions/RevertAction.php @@ -66,6 +66,10 @@ class RevertAction extends FormAction { } } + protected function usesOOUI() { + return true; + } + protected function alterForm( HTMLForm $form ) { $form->setWrapperLegendMsg( 'filerevert-legend' ); $form->setSubmitTextMsg( 'filerevert-submit' ); diff --git a/includes/actions/UnwatchAction.php b/includes/actions/UnwatchAction.php index 7f043e4676..aa17b89c8d 100644 --- a/includes/actions/UnwatchAction.php +++ b/includes/actions/UnwatchAction.php @@ -31,22 +31,27 @@ class UnwatchAction extends WatchAction { return 'unwatch'; } - protected function getDescription() { - return $this->msg( 'removewatch' )->escaped(); - } - public function onSubmit( $data ) { self::doUnwatch( $this->getTitle(), $this->getUser() ); return true; } - protected function alterForm( HTMLForm $form ) { - $form->setSubmitTextMsg( 'confirm-unwatch-button' ); + protected function getFormFields() { + return [ + 'intro' => [ + 'type' => 'info', + 'vertical-label' => true, + 'raw' => true, + 'default' => $this->msg( 'confirm-unwatch-top' )->parse() + ] + ]; } - protected function preText() { - return $this->msg( 'confirm-unwatch-top' )->parse(); + protected function alterForm( HTMLForm $form ) { + parent::alterForm( $form ); + $form->setWrapperLegendMsg( 'removewatch' ); + $form->setSubmitTextMsg( 'confirm-unwatch-button' ); } public function onSuccess() { diff --git a/includes/actions/ViewAction.php b/includes/actions/ViewAction.php index 0ba964f9b1..134b8a45b1 100644 --- a/includes/actions/ViewAction.php +++ b/includes/actions/ViewAction.php @@ -58,9 +58,6 @@ class ViewAction extends FormlessAction { $touched = null; } - // If a page was purged on HTTP GET, relect that timestamp to avoid sending 304s - $touched = max( $touched, $this->page->getLastPurgeTimestamp() ); - // Send HTTP 304 if the IMS matches or otherwise set expiry/last-modified headers if ( $touched && $this->getOutput()->checkLastModified( $touched ) ) { wfDebug( __METHOD__ . ": done 304\n" ); diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php index 23505c020d..e12a727633 100644 --- a/includes/actions/WatchAction.php +++ b/includes/actions/WatchAction.php @@ -35,11 +35,8 @@ class WatchAction extends FormAction { return false; } - /** - * @return string HTML - */ protected function getDescription() { - return $this->msg( 'addwatch' )->escaped(); + return ''; } public function onSubmit( $data ) { @@ -57,15 +54,27 @@ class WatchAction extends FormAction { parent::checkCanExecute( $user ); } + protected function usesOOUI() { + return true; + } + + protected function getFormFields() { + return [ + 'intro' => [ + 'type' => 'info', + 'vertical-label' => true, + 'raw' => true, + 'default' => $this->msg( 'confirm-watch-top' )->parse() + ] + ]; + } + protected function alterForm( HTMLForm $form ) { + $form->setWrapperLegendMsg( 'addwatch' ); $form->setSubmitTextMsg( 'confirm-watch-button' ); $form->setTokenSalt( 'watch' ); } - protected function preText() { - return $this->msg( 'confirm-watch-top' )->parse(); - } - public function onSuccess() { $msgKey = $this->getTitle()->isTalkPage() ? 'addedwatchtext-talk' : 'addedwatchtext'; $this->getOutput()->addWikiMsg( $msgKey, $this->getTitle()->getPrefixedText() ); diff --git a/includes/api/ApiAMCreateAccount.php b/includes/api/ApiAMCreateAccount.php index 5d12590fdf..72a36d71a6 100644 --- a/includes/api/ApiAMCreateAccount.php +++ b/includes/api/ApiAMCreateAccount.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -132,6 +132,6 @@ class ApiAMCreateAccount extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Account_creation'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Account_creation'; } } diff --git a/includes/api/ApiAuthManagerHelper.php b/includes/api/ApiAuthManagerHelper.php index d037c365bd..d6b9f7612f 100644 --- a/includes/api/ApiAuthManagerHelper.php +++ b/includes/api/ApiAuthManagerHelper.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -169,6 +169,7 @@ class ApiAuthManagerHelper { $this->module->getMain()->markParamsUsed( array_keys( $data ) ); if ( $sensitive ) { + $this->module->getMain()->markParamsSensitive( array_keys( $sensitive ) ); $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' ); } @@ -228,8 +229,8 @@ class ApiAuthManagerHelper { /** * Logs successful or failed authentication. - * @param string|AuthenticationResponse $result Response or error message * @param string $event Event type (e.g. 'accountcreation') + * @param string|AuthenticationResponse $result Response or error message */ public function logAuthenticationResult( $event, $result ) { if ( is_string( $result ) ) { @@ -344,7 +345,7 @@ class ApiAuthManagerHelper { /** * Fetch the standard parameters this helper recognizes * @param string $action AuthManager action - * @param string $param... Parameters to use + * @param string $param,... Parameters to use * @return array */ public static function getStandardParams( $action, $param /* ... */ ) { diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index c03faf0513..2012e7d8cf 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -24,6 +24,8 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; + /** * This abstract class implements many basic API functions, and is the base of * all API classes. @@ -186,6 +188,22 @@ abstract class ApiBase extends ContextSource { */ const PARAM_EXTRA_NAMESPACES = 18; + /** + * (boolean) Is the parameter sensitive? Note 'password'-type fields are + * always sensitive regardless of the value of this field. + * @since 1.29 + */ + const PARAM_SENSITIVE = 19; + + /** + * (array) When PARAM_TYPE is an array, this indicates which of the values are deprecated. + * Keys are the deprecated parameter values, values define the warning + * message to emit: either boolean true (to use a default message) or a + * $msg for ApiBase::makeMessage(). + * @since 1.30 + */ + const PARAM_DEPRECATED_VALUES = 20; + /**@}*/ const ALL_DEFAULT_STRING = '*'; @@ -376,6 +394,13 @@ abstract class ApiBase extends ContextSource { /** * Indicates whether this module requires write mode + * + * This should return true for modules that may require synchronous database writes. + * Modules that do not need such writes should also not rely on master database access, + * since only read queries are needed and each master DB is a single point of failure. + * Additionally, requests that only need replica DBs can be efficiently routed to any + * datacenter via the Promise-Non-Write-API-Action header. + * * @return bool */ public function isWriteMode() { @@ -523,7 +548,7 @@ abstract class ApiBase extends ContextSource { // Main module has this method overridden // Safety - avoid infinite loop: if ( $this->isMain() ) { - ApiBase::dieDebug( __METHOD__, 'base method was called on main module.' ); + self::dieDebug( __METHOD__, 'base method was called on main module.' ); } return $this->getMain()->lacksSameOriginSecurity(); @@ -595,7 +620,7 @@ abstract class ApiBase extends ContextSource { // Main module has getResult() method overridden // Safety - avoid infinite loop: if ( $this->isMain() ) { - ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' ); + self::dieDebug( __METHOD__, 'base method was called on main module. ' ); } return $this->getMain()->getResult(); @@ -609,7 +634,7 @@ abstract class ApiBase extends ContextSource { // Main module has getErrorFormatter() method overridden // Safety - avoid infinite loop: if ( $this->isMain() ) { - ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' ); + self::dieDebug( __METHOD__, 'base method was called on main module. ' ); } return $this->getMain()->getErrorFormatter(); @@ -617,7 +642,7 @@ abstract class ApiBase extends ContextSource { /** * Gets a default replica DB connection object - * @return Database + * @return IDatabase */ protected function getDB() { if ( !isset( $this->mSlaveDB ) ) { @@ -635,7 +660,7 @@ abstract class ApiBase extends ContextSource { // Main module has getContinuationManager() method overridden // Safety - avoid infinite loop: if ( $this->isMain() ) { - ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' ); + self::dieDebug( __METHOD__, 'base method was called on main module. ' ); } return $this->getMain()->getContinuationManager(); @@ -643,13 +668,13 @@ abstract class ApiBase extends ContextSource { /** * Set the continuation manager - * @param ApiContinuationManager|null + * @param ApiContinuationManager|null $manager */ public function setContinuationManager( $manager ) { // Main module has setContinuationManager() method overridden // Safety - avoid infinite loop: if ( $this->isMain() ) { - ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' ); + self::dieDebug( __METHOD__, 'base method was called on main module. ' ); } $this->getMain()->setContinuationManager( $manager ); @@ -869,7 +894,7 @@ abstract class ApiBase extends ContextSource { * Get a WikiPage object from a title or pageid param, if possible. * Can die, if no param is set or if the title or page id is not valid. * - * @param array $params + * @param array $params User provided set of parameters, as from $this->extractRequestParams() * @param bool|string $load Whether load the object's state from the database: * - false: don't load (if the pageid is given, it will still be loaded) * - 'fromdb': load from a replica DB @@ -910,7 +935,7 @@ abstract class ApiBase extends ContextSource { * Can die, if no param is set or if the title or page id is not valid. * * @since 1.29 - * @param array $params + * @param array $params User provided set of parameters, as from $this->extractRequestParams() * @return Title */ public function getTitleFromTitleOrPageId( $params ) { @@ -942,7 +967,6 @@ abstract class ApiBase extends ContextSource { * @return bool */ protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) { - $userWatching = $this->getUser()->isWatched( $titleObj, User::IGNORE_USER_RIGHTS ); switch ( $watchlist ) { @@ -1009,6 +1033,9 @@ abstract class ApiBase extends ContextSource { $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] ) ? $paramSettings[self::PARAM_DEPRECATED] : false; + $deprecatedValues = isset( $paramSettings[self::PARAM_DEPRECATED_VALUES] ) + ? $paramSettings[self::PARAM_DEPRECATED_VALUES] + : []; $required = isset( $paramSettings[self::PARAM_REQUIRED] ) ? $paramSettings[self::PARAM_REQUIRED] : false; @@ -1023,12 +1050,16 @@ abstract class ApiBase extends ContextSource { } else { $type = 'NULL'; // allow everything } + + if ( $type == 'password' || !empty( $paramSettings[self::PARAM_SENSITIVE] ) ) { + $this->getMain()->markParamsSensitive( $encParamName ); + } } if ( $type == 'boolean' ) { if ( isset( $default ) && $default !== false ) { // Having a default value of anything other than 'false' is not allowed - ApiBase::dieDebug( + self::dieDebug( __METHOD__, "Boolean param $encParamName's default is set to '$default'. " . 'Boolean parameters must default to false.' @@ -1039,13 +1070,13 @@ abstract class ApiBase extends ContextSource { } elseif ( $type == 'upload' ) { if ( isset( $default ) ) { // Having a default value is not allowed - ApiBase::dieDebug( + self::dieDebug( __METHOD__, "File upload param $encParamName's default is set to " . "'$default'. File upload parameters may not have a default." ); } if ( $multi ) { - ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); + self::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); } $value = $this->getMain()->getUpload( $encParamName ); if ( !$value->exists() ) { @@ -1107,7 +1138,7 @@ abstract class ApiBase extends ContextSource { $allSpecifier = ( is_string( $allowAll ) ? $allowAll : self::ALL_DEFAULT_STRING ); if ( $allowAll && $multi && is_array( $type ) && in_array( $allSpecifier, $type, true ) ) { - ApiBase::dieDebug( + self::dieDebug( __METHOD__, "For param $encParamName, PARAM_ALL collides with a possible value" ); } @@ -1163,13 +1194,13 @@ abstract class ApiBase extends ContextSource { if ( !isset( $paramSettings[self::PARAM_MAX] ) || !isset( $paramSettings[self::PARAM_MAX2] ) ) { - ApiBase::dieDebug( + self::dieDebug( __METHOD__, "MAX1 or MAX2 are not defined for the limit $encParamName" ); } if ( $multi ) { - ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); + self::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); } $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : 0; if ( $value == 'max' ) { @@ -1190,7 +1221,7 @@ abstract class ApiBase extends ContextSource { break; case 'boolean': if ( $multi ) { - ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); + self::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" ); } break; case 'timestamp': @@ -1224,7 +1255,7 @@ abstract class ApiBase extends ContextSource { } break; default: - ApiBase::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" ); + self::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" ); } } @@ -1246,6 +1277,29 @@ abstract class ApiBase extends ContextSource { } $this->addDeprecation( [ 'apiwarn-deprecation-parameter', $encParamName ], $feature ); } + + // Set a warning if a deprecated parameter value has been passed + $usedDeprecatedValues = $deprecatedValues && $value !== false + ? array_intersect( array_keys( $deprecatedValues ), (array)$value ) + : []; + if ( $usedDeprecatedValues ) { + $feature = "$encParamName="; + $m = $this; + while ( !$m->isMain() ) { + $p = $m->getParent(); + $name = $m->getModuleName(); + $param = $p->encodeParamName( $p->getModuleManager()->getModuleGroup( $name ) ); + $feature = "{$param}={$name}&{$feature}"; + $m = $p; + } + foreach ( $usedDeprecatedValues as $v ) { + $msg = $deprecatedValues[$v]; + if ( $msg === true ) { + $msg = [ 'apiwarn-deprecation-parameter', "$encParamName=$v" ]; + } + $this->addDeprecation( $msg, "$feature$v" ); + } + } } elseif ( $required ) { $this->dieWithError( [ 'apierror-missingparam', $paramName ] ); } @@ -1378,7 +1432,7 @@ abstract class ApiBase extends ContextSource { * Validate the value against the minimum and user/bot maximum limits. * Prints usage info on failure. * @param string $paramName Parameter name - * @param int $value Parameter value + * @param int &$value Parameter value * @param int|null $min Minimum value * @param int|null $max Maximum value for users * @param int $botMax Maximum value for sysops/bots @@ -1545,7 +1599,7 @@ abstract class ApiBase extends ContextSource { /** * Truncate an array to a certain length. - * @param array $arr Array to truncate + * @param array &$arr Array to truncate * @param int $limit Maximum length * @return bool True if the array was truncated, false otherwise */ @@ -1843,6 +1897,23 @@ abstract class ApiBase extends ContextSource { throw new MWException( 'Successful status passed to ApiBase::dieStatus' ); } + // ApiUsageException needs a fatal status, but this method has + // historically accepted any non-good status. Convert it if necessary. + $status->setOK( false ); + if ( !$status->getErrorsByType( 'error' ) ) { + $newStatus = Status::newGood(); + foreach ( $status->getErrorsByType( 'warning' ) as $err ) { + call_user_func_array( + [ $newStatus, 'fatal' ], + array_merge( [ $err['message'] ], $err['params'] ) + ); + } + if ( !$newStatus->getErrorsByType( 'error' ) ) { + $newStatus->fatal( 'unknownerror-nocode' ); + } + $status = $newStatus; + } + throw new ApiUsageException( $this, $status ); } @@ -1967,12 +2038,62 @@ abstract class ApiBase extends ContextSource { */ /** - * Return the description message. + * Return the summary message. + * + * This is a one-line description of the module, suitable for display in a + * list of modules. * + * @since 1.30 * @return string|array|Message */ - protected function getDescriptionMessage() { - return "apihelp-{$this->getModulePath()}-description"; + protected function getSummaryMessage() { + return "apihelp-{$this->getModulePath()}-summary"; + } + + /** + * Return the extended help text message. + * + * This is additional text to display at the top of the help section, below + * the summary. + * + * @since 1.30 + * @return string|array|Message + */ + protected function getExtendedDescription() { + return [ [ + "apihelp-{$this->getModulePath()}-extended-description", + 'api-help-no-extended-description', + ] ]; + } + + /** + * Get final module summary + * + * Ideally this will just be the getSummaryMessage(). However, for + * backwards compatibility, if that message does not exist then the first + * line of wikitext from the description message will be used instead. + * + * @since 1.30 + * @return Message + */ + public function getFinalSummary() { + $msg = self::makeMessage( $this->getSummaryMessage(), $this->getContext(), [ + $this->getModulePrefix(), + $this->getModuleName(), + $this->getModulePath(), + ] ); + if ( !$msg->exists() ) { + wfDeprecated( 'API help "description" messages', '1.30' ); + $msg = self::makeMessage( $this->getDescriptionMessage(), $this->getContext(), [ + $this->getModulePrefix(), + $this->getModuleName(), + $this->getModulePath(), + ] ); + $msg = self::makeMessage( 'rawmessage', $this->getContext(), [ + preg_replace( '/\n.*/s', '', $msg->text() ) + ] ); + } + return $msg; } /** @@ -1995,15 +2116,33 @@ abstract class ApiBase extends ContextSource { $desc = (string)$desc; } - $msg = ApiBase::makeMessage( $this->getDescriptionMessage(), $this->getContext(), [ + $summary = self::makeMessage( $this->getSummaryMessage(), $this->getContext(), [ $this->getModulePrefix(), $this->getModuleName(), $this->getModulePath(), ] ); - if ( !$msg->exists() ) { - $msg = $this->msg( 'api-help-fallback-description', $desc ); + $extendedDescription = self::makeMessage( + $this->getExtendedDescription(), $this->getContext(), [ + $this->getModulePrefix(), + $this->getModuleName(), + $this->getModulePath(), + ] + ); + + if ( $summary->exists() ) { + $msgs = [ $summary, $extendedDescription ]; + } else { + wfDeprecated( 'API help "description" messages', '1.30' ); + $description = self::makeMessage( $this->getDescriptionMessage(), $this->getContext(), [ + $this->getModulePrefix(), + $this->getModuleName(), + $this->getModulePath(), + ] ); + if ( !$description->exists() ) { + $description = $this->msg( 'api-help-fallback-description', $desc ); + } + $msgs = [ $description ]; } - $msgs = [ $msg ]; Hooks::run( 'APIGetDescriptionMessages', [ $this, &$msgs ] ); @@ -2026,9 +2165,10 @@ abstract class ApiBase extends ContextSource { if ( $this->needsToken() ) { $params['token'] = [ - ApiBase::PARAM_TYPE => 'string', - ApiBase::PARAM_REQUIRED => true, - ApiBase::PARAM_HELP_MSG => [ + self::PARAM_TYPE => 'string', + self::PARAM_REQUIRED => true, + self::PARAM_SENSITIVE => true, + self::PARAM_HELP_MSG => [ 'api-help-param-token', $this->needsToken(), ], @@ -2065,7 +2205,7 @@ abstract class ApiBase extends ContextSource { } $desc = self::escapeWikiText( $desc ); - $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP ); + $params = $this->getFinalParams( self::GET_VALUES_FOR_HELP ); $msgs = []; foreach ( $params as $param => $settings ) { if ( !is_array( $settings ) ) { @@ -2084,15 +2224,15 @@ abstract class ApiBase extends ContextSource { $d = implode( ' ', $d ); } - if ( isset( $settings[ApiBase::PARAM_HELP_MSG] ) ) { - $msg = $settings[ApiBase::PARAM_HELP_MSG]; + if ( isset( $settings[self::PARAM_HELP_MSG] ) ) { + $msg = $settings[self::PARAM_HELP_MSG]; } else { $msg = $this->msg( "apihelp-{$path}-param-{$param}" ); if ( !$msg->exists() ) { $msg = $this->msg( 'api-help-fallback-parameter', $d ); } } - $msg = ApiBase::makeMessage( $msg, $this->getContext(), + $msg = self::makeMessage( $msg, $this->getContext(), [ $prefix, $param, $name, $path ] ); if ( !$msg ) { self::dieDebug( __METHOD__, @@ -2100,31 +2240,78 @@ abstract class ApiBase extends ContextSource { } $msgs[$param] = [ $msg ]; - if ( isset( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) { - if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE] ) ) { + if ( isset( $settings[self::PARAM_TYPE] ) && + $settings[self::PARAM_TYPE] === 'submodule' + ) { + if ( isset( $settings[self::PARAM_SUBMODULE_MAP] ) ) { + $map = $settings[self::PARAM_SUBMODULE_MAP]; + } else { + $prefix = $this->isMain() ? '' : ( $this->getModulePath() . '+' ); + $map = []; + foreach ( $this->getModuleManager()->getNames( $param ) as $submoduleName ) { + $map[$submoduleName] = $prefix . $submoduleName; + } + } + ksort( $map ); + $submodules = []; + $deprecatedSubmodules = []; + foreach ( $map as $v => $m ) { + $arr = &$submodules; + $isDeprecated = false; + $summary = null; + try { + $submod = $this->getModuleFromPath( $m ); + if ( $submod ) { + $summary = $submod->getFinalSummary(); + $isDeprecated = $submod->isDeprecated(); + if ( $isDeprecated ) { + $arr = &$deprecatedSubmodules; + } + } + } catch ( ApiUsageException $ex ) { + // Ignore + } + if ( $summary ) { + $key = $summary->getKey(); + $params = $summary->getParams(); + } else { + $key = 'api-help-undocumented-module'; + $params = [ $m ]; + } + $m = new ApiHelpParamValueMessage( "[[Special:ApiHelp/$m|$v]]", $key, $params, $isDeprecated ); + $arr[] = $m->setContext( $this->getContext() ); + } + $msgs[$param] = array_merge( $msgs[$param], $submodules, $deprecatedSubmodules ); + } elseif ( isset( $settings[self::PARAM_HELP_MSG_PER_VALUE] ) ) { + if ( !is_array( $settings[self::PARAM_HELP_MSG_PER_VALUE] ) ) { self::dieDebug( __METHOD__, 'ApiBase::PARAM_HELP_MSG_PER_VALUE is not valid' ); } - if ( !is_array( $settings[ApiBase::PARAM_TYPE] ) ) { + if ( !is_array( $settings[self::PARAM_TYPE] ) ) { self::dieDebug( __METHOD__, 'ApiBase::PARAM_HELP_MSG_PER_VALUE may only be used when ' . 'ApiBase::PARAM_TYPE is an array' ); } - $valueMsgs = $settings[ApiBase::PARAM_HELP_MSG_PER_VALUE]; - foreach ( $settings[ApiBase::PARAM_TYPE] as $value ) { + $valueMsgs = $settings[self::PARAM_HELP_MSG_PER_VALUE]; + $deprecatedValues = isset( $settings[self::PARAM_DEPRECATED_VALUES] ) + ? $settings[self::PARAM_DEPRECATED_VALUES] + : []; + + foreach ( $settings[self::PARAM_TYPE] as $value ) { if ( isset( $valueMsgs[$value] ) ) { $msg = $valueMsgs[$value]; } else { $msg = "apihelp-{$path}-paramvalue-{$param}-{$value}"; } - $m = ApiBase::makeMessage( $msg, $this->getContext(), + $m = self::makeMessage( $msg, $this->getContext(), [ $prefix, $param, $name, $path, $value ] ); if ( $m ) { $m = new ApiHelpParamValueMessage( $value, [ $m->getKey(), 'api-help-param-no-description' ], - $m->getParams() + $m->getParams(), + isset( $deprecatedValues[$value] ) ); $msgs[$param][] = $m->setContext( $this->getContext() ); } else { @@ -2134,13 +2321,13 @@ abstract class ApiBase extends ContextSource { } } - if ( isset( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) { - if ( !is_array( $settings[ApiBase::PARAM_HELP_MSG_APPEND] ) ) { + if ( isset( $settings[self::PARAM_HELP_MSG_APPEND] ) ) { + if ( !is_array( $settings[self::PARAM_HELP_MSG_APPEND] ) ) { self::dieDebug( __METHOD__, 'Value for ApiBase::PARAM_HELP_MSG_APPEND is not an array' ); } - foreach ( $settings[ApiBase::PARAM_HELP_MSG_APPEND] as $m ) { - $m = ApiBase::makeMessage( $m, $this->getContext(), + foreach ( $settings[self::PARAM_HELP_MSG_APPEND] as $m ) { + $m = self::makeMessage( $m, $this->getContext(), [ $prefix, $param, $name, $path ] ); if ( $m ) { $msgs[$param][] = $m; @@ -2427,6 +2614,7 @@ abstract class ApiBase extends ContextSource { * @param string $warning Warning message */ public function setWarning( $warning ) { + wfDeprecated( __METHOD__, '1.29' ); $msg = new ApiRawMessage( $warning, 'warning' ); $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg ); } @@ -2445,6 +2633,7 @@ abstract class ApiBase extends ContextSource { * @throws ApiUsageException always */ public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) { + wfDeprecated( __METHOD__, '1.29' ); $this->dieWithError( new RawMessage( '$1', [ $description ] ), $errorCode, @@ -2464,6 +2653,7 @@ abstract class ApiBase extends ContextSource { * @throws MWException */ public function getErrorFromStatus( $status, &$extraData = null ) { + wfDeprecated( __METHOD__, '1.29' ); if ( $status->isGood() ) { throw new MWException( 'Successful status passed to ApiBase::dieStatus' ); } @@ -2670,9 +2860,10 @@ abstract class ApiBase extends ContextSource { * Return the error message related to a certain array * @deprecated since 1.29 * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array - * @return [ 'code' => code, 'info' => info ] + * @return array [ 'code' => code, 'info' => info ] */ public function parseMsg( $error ) { + wfDeprecated( __METHOD__, '1.29' ); // Check whether someone passed the whole array, instead of one element as // documented. This breaks if it's actually an array of fallback keys, but // that's long-standing misbehavior introduced in r87627 to incorrectly @@ -2702,6 +2893,7 @@ abstract class ApiBase extends ContextSource { * @throws ApiUsageException always */ public function dieUsageMsg( $error ) { + wfDeprecated( __METHOD__, '1.29' ); $this->dieWithError( $this->parseMsgInternal( $error ) ); } @@ -2714,9 +2906,25 @@ abstract class ApiBase extends ContextSource { * @since 1.21 */ public function dieUsageMsgOrDebug( $error ) { + wfDeprecated( __METHOD__, '1.29' ); $this->dieWithErrorOrDebug( $this->parseMsgInternal( $error ) ); } + /** + * Return the description message. + * + * This is additional text to display on the help page after the summary. + * + * @deprecated since 1.30 + * @return string|array|Message + */ + protected function getDescriptionMessage() { + return [ [ + "apihelp-{$this->getModulePath()}-description", + "apihelp-{$this->getModulePath()}-summary", + ] ]; + } + /**@}*/ } diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php index 8577ad28b9..4d37af3162 100644 --- a/includes/api/ApiBlock.php +++ b/includes/api/ApiBlock.php @@ -193,6 +193,6 @@ class ApiBlock extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Block'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block'; } } diff --git a/includes/api/ApiCSPReport.php b/includes/api/ApiCSPReport.php index 4139019ccf..a4631d6f34 100644 --- a/includes/api/ApiCSPReport.php +++ b/includes/api/ApiCSPReport.php @@ -63,9 +63,9 @@ class ApiCSPReport extends ApiBase { /** * Log CSP report, with a different severity depending on $flags - * @param $flags Array Flags for this report - * @param $logLine String text of log entry - * @param $context Array logging context + * @param array $flags Flags for this report + * @param string $logLine text of log entry + * @param array $context logging context */ private function logReport( $flags, $logLine, $context ) { if ( in_array( 'false-positive', $flags ) ) { @@ -80,8 +80,8 @@ class ApiCSPReport extends ApiBase { /** * Get extra notes about the report. * - * @param $report Array The CSP report - * @return Array + * @param array $report The CSP report + * @return array */ private function getFlags( $report ) { $reportOnly = $this->getParameter( 'reportonly' ); @@ -115,7 +115,7 @@ class ApiCSPReport extends ApiBase { $req = $this->getRequest(); $contentType = $req->getHeader( 'content-type' ); if ( $contentType !== 'application/json' - && $contentType !=='application/csp-report' + && $contentType !== 'application/csp-report' ) { $this->error( 'wrongformat', __METHOD__ ); } @@ -155,9 +155,9 @@ class ApiCSPReport extends ApiBase { /** * Get text of log line. * - * @param $flags Array of additional markers for this report - * @param $report Array the csp report - * @return String Text to put in log + * @param array $flags of additional markers for this report + * @param array $report the csp report + * @return string Text to put in log */ private function generateLogLine( $flags, $report ) { $flagText = ''; @@ -177,8 +177,8 @@ class ApiCSPReport extends ApiBase { /** * Stop processing the request, and output/log an error * - * @param $code String error code - * @param $method String method that made error + * @param string $code error code + * @param string $method method that made error * @throws ApiUsageException Always */ private function error( $code, $method ) { @@ -186,9 +186,9 @@ class ApiCSPReport extends ApiBase { 'method' => $method, 'user-agent' => $this->getRequest()->getHeader( 'user-agent' ) ] ); - // 500 so it shows up in browser's developer console. + // Return 400 on error for user agents to display, e.g. to the console. $this->dieWithError( - [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 500 + [ 'apierror-csp-report', wfEscapeWikiText( $code ) ], 'cspreport-' . $code, [], 400 ); } diff --git a/includes/api/ApiChangeAuthenticationData.php b/includes/api/ApiChangeAuthenticationData.php index c25920e728..d4a26ad9c8 100644 --- a/includes/api/ApiChangeAuthenticationData.php +++ b/includes/api/ApiChangeAuthenticationData.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -93,6 +93,6 @@ class ApiChangeAuthenticationData extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data'; } } diff --git a/includes/api/ApiCheckToken.php b/includes/api/ApiCheckToken.php index 3cc7a8a058..e1be8efad2 100644 --- a/includes/api/ApiCheckToken.php +++ b/includes/api/ApiCheckToken.php @@ -2,7 +2,7 @@ /** * Created on Jan 29, 2015 * - * Copyright © 2015 Brad Jorsch bjorsch@wikimedia.org + * Copyright © 2015 Wikimedia Foundation and contributors * * 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 @@ -73,6 +73,7 @@ class ApiCheckToken extends ApiBase { 'token' => [ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_SENSITIVE => true, ], 'maxtokenage' => [ ApiBase::PARAM_TYPE => 'integer', diff --git a/includes/api/ApiClearHasMsg.php b/includes/api/ApiClearHasMsg.php index a5474b5823..3b2463098e 100644 --- a/includes/api/ApiClearHasMsg.php +++ b/includes/api/ApiClearHasMsg.php @@ -50,6 +50,6 @@ class ApiClearHasMsg extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:ClearHasMsg'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:ClearHasMsg'; } } diff --git a/includes/api/ApiClientLogin.php b/includes/api/ApiClientLogin.php index 3f5bc0c0c8..65dea93bdd 100644 --- a/includes/api/ApiClientLogin.php +++ b/includes/api/ApiClientLogin.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -132,6 +132,6 @@ class ApiClientLogin extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Login'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login'; } } diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php index d6867eb52d..953bc10cc3 100644 --- a/includes/api/ApiComparePages.php +++ b/includes/api/ApiComparePages.php @@ -1,9 +1,5 @@ extractRequestParams(); - $rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] ); - $rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] ); + // Parameter validation + $this->requireAtLeastOneParameter( $params, 'fromtitle', 'fromid', 'fromrev', 'fromtext' ); + $this->requireAtLeastOneParameter( $params, 'totitle', 'toid', 'torev', 'totext', 'torelative' ); + + $this->props = array_flip( $params['prop'] ); + + // Cache responses publicly by default. This may be overridden later. + $this->getMain()->setCacheMode( 'public' ); + + // Get the 'from' Revision and Content + list( $fromRev, $fromContent, $relRev ) = $this->getDiffContent( 'from', $params ); - $revision = Revision::newFromId( $rev1 ); + // Get the 'to' Revision and Content + if ( $params['torelative'] !== null ) { + if ( !$relRev ) { + $this->dieWithError( 'apierror-compare-relative-to-nothing' ); + } + switch ( $params['torelative'] ) { + case 'prev': + // Swap 'from' and 'to' + $toRev = $fromRev; + $toContent = $fromContent; + $fromRev = $relRev->getPrevious(); + $fromContent = $fromRev + ? $fromRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ) + : $toContent->getContentHandler()->makeEmptyContent(); + if ( !$fromContent ) { + $this->dieWithError( + [ 'apierror-missingcontent-revid', $fromRev->getId() ], 'missingcontent' + ); + } + break; + + case 'next': + $toRev = $relRev->getNext(); + $toContent = $toRev + ? $toRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ) + : $fromContent; + if ( !$toContent ) { + $this->dieWithError( [ 'apierror-missingcontent-revid', $toRev->getId() ], 'missingcontent' ); + } + break; + + case 'cur': + $title = $relRev->getTitle(); + $id = $title->getLatestRevID(); + $toRev = $id ? Revision::newFromId( $id ) : null; + if ( !$toRev ) { + $this->dieWithError( + [ 'apierror-missingrev-title', wfEscapeWikiText( $title->getPrefixedText() ) ], 'nosuchrevid' + ); + } + $toContent = $toRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ); + if ( !$toContent ) { + $this->dieWithError( [ 'apierror-missingcontent-revid', $toRev->getId() ], 'missingcontent' ); + } + break; + } + $relRev2 = null; + } else { + list( $toRev, $toContent, $relRev2 ) = $this->getDiffContent( 'to', $params ); + } - if ( !$revision ) { + // Should never happen, but just in case... + if ( !$fromContent || !$toContent ) { $this->dieWithError( 'apierror-baddiff' ); } - $contentHandler = $revision->getContentHandler(); - $de = $contentHandler->createDifferenceEngine( $this->getContext(), - $rev1, - $rev2, - null, // rcid - true, - false ); + // Get the diff + $context = new DerivativeContext( $this->getContext() ); + if ( $relRev && $relRev->getTitle() ) { + $context->setTitle( $relRev->getTitle() ); + } elseif ( $relRev2 && $relRev2->getTitle() ) { + $context->setTitle( $relRev2->getTitle() ); + } else { + $this->guessTitleAndModel(); + if ( $this->guessedTitle ) { + $context->setTitle( $this->guessedTitle ); + } + } + $de = $fromContent->getContentHandler()->createDifferenceEngine( + $context, + $fromRev ? $fromRev->getId() : 0, + $toRev ? $toRev->getId() : 0, + /* $rcid = */ null, + /* $refreshCache = */ false, + /* $unhide = */ true + ); + $de->setContent( $fromContent, $toContent ); + $difftext = $de->getDiffBody(); + if ( $difftext === false ) { + $this->dieWithError( 'apierror-baddiff' ); + } + // Fill in the response $vals = []; - if ( isset( $params['fromtitle'] ) ) { - $vals['fromtitle'] = $params['fromtitle']; - } - if ( isset( $params['fromid'] ) ) { - $vals['fromid'] = $params['fromid']; + $this->setVals( $vals, 'from', $fromRev ); + $this->setVals( $vals, 'to', $toRev ); + + if ( isset( $this->props['rel'] ) ) { + if ( $fromRev ) { + $rev = $fromRev->getPrevious(); + if ( $rev ) { + $vals['prev'] = $rev->getId(); + } + } + if ( $toRev ) { + $rev = $toRev->getNext(); + if ( $rev ) { + $vals['next'] = $rev->getId(); + } + } } - $vals['fromrevid'] = $rev1; - if ( isset( $params['totitle'] ) ) { - $vals['totitle'] = $params['totitle']; + + if ( isset( $this->props['diffsize'] ) ) { + $vals['diffsize'] = strlen( $difftext ); } - if ( isset( $params['toid'] ) ) { - $vals['toid'] = $params['toid']; + if ( isset( $this->props['diff'] ) ) { + ApiResult::setContentValue( $vals, 'body', $difftext ); } - $vals['torevid'] = $rev2; - $difftext = $de->getDiffBody(); + $this->getResult()->addValue( null, $this->getModuleName(), $vals ); + } - if ( $difftext === false ) { - $this->dieWithError( 'apierror-baddiff' ); + /** + * Guess an appropriate default Title and content model for this request + * + * Fills in $this->guessedTitle based on the first of 'fromrev', + * 'fromtitle', 'fromid', 'torev', 'totitle', and 'toid' that's present and + * valid. + * + * Fills in $this->guessedModel based on the Revision or Title used to + * determine $this->guessedTitle, or the 'fromcontentmodel' or + * 'tocontentmodel' parameters if no title was guessed. + */ + private function guessTitleAndModel() { + if ( $this->guessed ) { + return; } - ApiResult::setContentValue( $vals, 'body', $difftext ); + $this->guessed = true; + $params = $this->extractRequestParams(); - $this->getResult()->addValue( null, $this->getModuleName(), $vals ); + foreach ( [ 'from', 'to' ] as $prefix ) { + if ( $params["{$prefix}rev"] !== null ) { + $revId = $params["{$prefix}rev"]; + $rev = Revision::newFromId( $revId ); + if ( !$rev ) { + // Titles of deleted revisions aren't secret, per T51088 + $row = $this->getDB()->selectRow( + 'archive', + array_merge( + Revision::selectArchiveFields(), + [ 'ar_namespace', 'ar_title' ] + ), + [ 'ar_rev_id' => $revId ], + __METHOD__ + ); + if ( $row ) { + $rev = Revision::newFromArchiveRow( $row ); + } + } + if ( $rev ) { + $this->guessedTitle = $rev->getTitle(); + $this->guessedModel = $rev->getContentModel(); + break; + } + } + + if ( $params["{$prefix}title"] !== null ) { + $title = Title::newFromText( $params["{$prefix}title"] ); + if ( $title && !$title->isExternal() ) { + $this->guessedTitle = $title; + break; + } + } + + if ( $params["{$prefix}id"] !== null ) { + $title = Title::newFromID( $params["{$prefix}id"] ); + if ( $title ) { + $this->guessedTitle = $title; + break; + } + } + } + + if ( !$this->guessedModel ) { + if ( $this->guessedTitle ) { + $this->guessedModel = $this->guessedTitle->getContentModel(); + } elseif ( $params['fromcontentmodel'] !== null ) { + $this->guessedModel = $params['fromcontentmodel']; + } elseif ( $params['tocontentmodel'] !== null ) { + $this->guessedModel = $params['tocontentmodel']; + } + } } /** - * @param int $revision - * @param string $titleText - * @param int $titleId - * @return int + * Get the Revision and Content for one side of the diff + * + * This uses the appropriate set of 'rev', 'id', 'title', 'text', 'pst', + * 'contentmodel', and 'contentformat' parameters to determine what content + * should be diffed. + * + * Returns three values: + * - The revision used to retrieve the content, if any + * - The content to be diffed + * - The revision specified, if any, even if not used to retrieve the + * Content + * + * @param string $prefix 'from' or 'to' + * @param array $params + * @return array [ Revision|null, Content, Revision|null ] */ - private function revisionOrTitleOrId( $revision, $titleText, $titleId ) { - if ( $revision ) { - return $revision; - } elseif ( $titleText ) { - $title = Title::newFromText( $titleText ); - if ( !$title || $title->isExternal() ) { - $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $titleText ) ] ); - } - - return $title->getLatestRevID(); - } elseif ( $titleId ) { - $title = Title::newFromID( $titleId ); + private function getDiffContent( $prefix, array $params ) { + $title = null; + $rev = null; + $suppliedContent = $params["{$prefix}text"] !== null; + + // Get the revision and title, if applicable + $revId = null; + if ( $params["{$prefix}rev"] !== null ) { + $revId = $params["{$prefix}rev"]; + } elseif ( $params["{$prefix}title"] !== null || $params["{$prefix}id"] !== null ) { + if ( $params["{$prefix}title"] !== null ) { + $title = Title::newFromText( $params["{$prefix}title"] ); + if ( !$title || $title->isExternal() ) { + $this->dieWithError( + [ 'apierror-invalidtitle', wfEscapeWikiText( $params["{$prefix}title"] ) ] + ); + } + } else { + $title = Title::newFromID( $params["{$prefix}id"] ); + if ( !$title ) { + $this->dieWithError( [ 'apierror-nosuchpageid', $params["{$prefix}id"] ] ); + } + } + $revId = $title->getLatestRevID(); + if ( !$revId ) { + $revId = null; + // Only die here if we're not using supplied text + if ( !$suppliedContent ) { + if ( $title->exists() ) { + $this->dieWithError( + [ 'apierror-missingrev-title', wfEscapeWikiText( $title->getPrefixedText() ) ], 'nosuchrevid' + ); + } else { + $this->dieWithError( + [ 'apierror-missingtitle-byname', wfEscapeWikiText( $title->getPrefixedText() ) ], + 'missingtitle' + ); + } + } + } + } + if ( $revId !== null ) { + $rev = Revision::newFromId( $revId ); + if ( !$rev && $this->getUser()->isAllowedAny( 'deletedtext', 'undelete' ) ) { + // Try the 'archive' table + $row = $this->getDB()->selectRow( + 'archive', + array_merge( + Revision::selectArchiveFields(), + [ 'ar_namespace', 'ar_title' ] + ), + [ 'ar_rev_id' => $revId ], + __METHOD__ + ); + if ( $row ) { + $rev = Revision::newFromArchiveRow( $row ); + $rev->isArchive = true; + } + } + if ( !$rev ) { + $this->dieWithError( [ 'apierror-nosuchrevid', $revId ] ); + } + $title = $rev->getTitle(); + + // If we don't have supplied content, return here. Otherwise, + // continue on below with the supplied content. + if ( !$suppliedContent ) { + $content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() ); + if ( !$content ) { + $this->dieWithError( [ 'apierror-missingcontent-revid', $revId ], 'missingcontent' ); + } + return [ $rev, $content, $rev ]; + } + } + + // Override $content based on supplied text + $model = $params["{$prefix}contentmodel"]; + $format = $params["{$prefix}contentformat"]; + + if ( !$model && $rev ) { + $model = $rev->getContentModel(); + } + if ( !$model && $title ) { + $model = $title->getContentModel(); + } + if ( !$model ) { + $this->guessTitleAndModel(); + $model = $this->guessedModel; + } + if ( !$model ) { + $model = CONTENT_MODEL_WIKITEXT; + $this->addWarning( [ 'apiwarn-compare-nocontentmodel', $model ] ); + } + + if ( !$title ) { + $this->guessTitleAndModel(); + $title = $this->guessedTitle; + } + + try { + $content = ContentHandler::makeContent( $params["{$prefix}text"], $title, $model, $format ); + } catch ( MWContentSerializationException $ex ) { + $this->dieWithException( $ex, [ + 'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' ) + ] ); + } + + if ( $params["{$prefix}pst"] ) { if ( !$title ) { - $this->dieWithError( [ 'apierror-nosuchpageid', $titleId ] ); + $this->dieWithError( 'apierror-compare-no-title' ); + } + $popts = ParserOptions::newFromContext( $this->getContext() ); + $content = $content->preSaveTransform( $title, $this->getUser(), $popts ); + } + + return [ null, $content, $rev ]; + } + + /** + * Set value fields from a Revision object + * @param array &$vals Result array to set data into + * @param string $prefix 'from' or 'to' + * @param Revision|null $rev + */ + private function setVals( &$vals, $prefix, $rev ) { + if ( $rev ) { + $title = $rev->getTitle(); + if ( isset( $this->props['ids'] ) ) { + $vals["{$prefix}id"] = $title->getArticleId(); + $vals["{$prefix}revid"] = $rev->getId(); + } + if ( isset( $this->props['title'] ) ) { + ApiQueryBase::addTitleInfo( $vals, $title, $prefix ); + } + if ( isset( $this->props['size'] ) ) { + $vals["{$prefix}size"] = $rev->getSize(); } - return $title->getLatestRevID(); + $anyHidden = false; + if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { + $vals["{$prefix}texthidden"] = true; + $anyHidden = true; + } + + if ( $rev->isDeleted( Revision::DELETED_USER ) ) { + $vals["{$prefix}userhidden"] = true; + $anyHidden = true; + } + if ( isset( $this->props['user'] ) && + $rev->userCan( Revision::DELETED_USER, $this->getUser() ) + ) { + $vals["{$prefix}user"] = $rev->getUserText( Revision::RAW ); + $vals["{$prefix}userid"] = $rev->getUser( Revision::RAW ); + } + + if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) { + $vals["{$prefix}commenthidden"] = true; + $anyHidden = true; + } + if ( $rev->userCan( Revision::DELETED_COMMENT, $this->getUser() ) ) { + if ( isset( $this->props['comment'] ) ) { + $vals["{$prefix}comment"] = $rev->getComment( Revision::RAW ); + } + if ( isset( $this->props['parsedcomment'] ) ) { + $vals["{$prefix}parsedcomment"] = Linker::formatComment( + $rev->getComment( Revision::RAW ), + $rev->getTitle() + ); + } + } + + if ( $anyHidden ) { + $this->getMain()->setCacheMode( 'private' ); + if ( $rev->isDeleted( Revision::DELETED_RESTRICTED ) ) { + $vals["{$prefix}suppressed"] = true; + } + } + + if ( !empty( $rev->isArchive ) ) { + $this->getMain()->setCacheMode( 'private' ); + $vals["{$prefix}archive"] = true; + } } - $this->dieWithError( 'apierror-compare-inputneeded', 'inputneeded' ); } public function getAllowedParams() { - return [ - 'fromtitle' => null, - 'fromid' => [ + // Parameters for the 'from' and 'to' content + $fromToParams = [ + 'title' => null, + 'id' => [ ApiBase::PARAM_TYPE => 'integer' ], - 'fromrev' => [ + 'rev' => [ ApiBase::PARAM_TYPE => 'integer' ], - 'totitle' => null, - 'toid' => [ - ApiBase::PARAM_TYPE => 'integer' + 'text' => [ + ApiBase::PARAM_TYPE => 'text' ], - 'torev' => [ - ApiBase::PARAM_TYPE => 'integer' + 'pst' => false, + 'contentformat' => [ + ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(), ], + 'contentmodel' => [ + ApiBase::PARAM_TYPE => ContentHandler::getContentModels(), + ] ]; + + $ret = []; + foreach ( $fromToParams as $k => $v ) { + $ret["from$k"] = $v; + } + foreach ( $fromToParams as $k => $v ) { + $ret["to$k"] = $v; + } + + $ret = wfArrayInsertAfter( + $ret, + [ 'torelative' => [ ApiBase::PARAM_TYPE => [ 'prev', 'next', 'cur' ], ] ], + 'torev' + ); + + $ret['prop'] = [ + ApiBase::PARAM_DFLT => 'diff|ids|title', + ApiBase::PARAM_TYPE => [ + 'diff', + 'diffsize', + 'rel', + 'ids', + 'title', + 'user', + 'comment', + 'parsedcomment', + 'size', + ], + ApiBase::PARAM_ISMULTI => true, + ApiBase::PARAM_HELP_MSG_PER_VALUE => [], + ]; + + return $ret; } protected function getExamplesMessages() { diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php index 50c24aeca8..7766acd363 100644 --- a/includes/api/ApiDelete.php +++ b/includes/api/ApiDelete.php @@ -44,11 +44,13 @@ class ApiDelete extends ApiBase { $params = $this->extractRequestParams(); $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' ); - if ( !$pageObj->exists() ) { + $titleObj = $pageObj->getTitle(); + if ( !$pageObj->exists() && + !( $titleObj->getNamespace() == NS_FILE && self::canDeleteFile( $pageObj->getFile() ) ) + ) { $this->dieWithError( 'apierror-missingtitle' ); } - $titleObj = $pageObj->getTitle(); $reason = $params['reason']; $user = $this->getUser(); @@ -104,7 +106,7 @@ class ApiDelete extends ApiBase { * * @param Page|WikiPage $page Page or WikiPage object to work on * @param User $user User doing the action - * @param string|null $reason Reason for the deletion. Autogenerated if null + * @param string|null &$reason Reason for the deletion. Autogenerated if null * @param array $tags Tags to tag the deletion with * @return Status */ @@ -128,11 +130,19 @@ class ApiDelete extends ApiBase { return $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user, $tags ); } + /** + * @param File $file + * @return bool + */ + protected static function canDeleteFile( File $file ) { + return $file->exists() && $file->isLocal() && !$file->getRedirected(); + } + /** * @param Page $page Object to work on * @param User $user User doing the action * @param string $oldimage Archive name - * @param string $reason Reason for the deletion. Autogenerated if null. + * @param string &$reason Reason for the deletion. Autogenerated if null. * @param bool $suppress Whether to mark all deleted versions as restricted * @param array $tags Tags to tag the deletion with * @return Status @@ -143,7 +153,7 @@ class ApiDelete extends ApiBase { $title = $page->getTitle(); $file = $page->getFile(); - if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) { + if ( !self::canDeleteFile( $file ) ) { return self::delete( $page, $user, $reason, $tags ); } @@ -218,6 +228,6 @@ class ApiDelete extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Delete'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Delete'; } } diff --git a/includes/api/ApiDisabled.php b/includes/api/ApiDisabled.php index 41bf9b69c7..684c42547f 100644 --- a/includes/api/ApiDisabled.php +++ b/includes/api/ApiDisabled.php @@ -45,6 +45,14 @@ class ApiDisabled extends ApiBase { } protected function getDescriptionMessage() { - return 'apihelp-disabled-description'; + return 'apihelp-disabled-summary'; + } + + protected function getSummaryMessage() { + return 'apihelp-disabled-summary'; + } + + protected function getExtendedDescription() { + return 'apihelp-disabled-extended-description'; } } diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php index b45be31ffe..2245195cb0 100644 --- a/includes/api/ApiEditPage.php +++ b/includes/api/ApiEditPage.php @@ -64,7 +64,6 @@ class ApiEditPage extends ApiBase { /** @var $newTitle Title */ foreach ( $titles as $id => $newTitle ) { - if ( !isset( $titles[$id - 1] ) ) { $titles[$id - 1] = $oldTitle; } @@ -611,6 +610,6 @@ class ApiEditPage extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Edit'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Edit'; } } diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php index 8aff6f8afd..4b4b76bbc0 100644 --- a/includes/api/ApiEmailUser.php +++ b/includes/api/ApiEmailUser.php @@ -71,7 +71,7 @@ class ApiEmailUser extends ApiBase { } $result = array_filter( [ - 'result' => $retval->isGood() ? 'Success' : $retval->isOk() ? 'Warnings' : 'Failure', + 'result' => $retval->isGood() ? 'Success' : ( $retval->isOk() ? 'Warnings' : 'Failure' ), 'warnings' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'warning' ), 'errors' => $this->getErrorFormatter()->arrayFromStatus( $retval, 'error' ), ] ); @@ -114,6 +114,6 @@ class ApiEmailUser extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Email'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Email'; } } diff --git a/includes/api/ApiErrorFormatter.php b/includes/api/ApiErrorFormatter.php index c52b731bbd..7fb13525fa 100644 --- a/includes/api/ApiErrorFormatter.php +++ b/includes/api/ApiErrorFormatter.php @@ -176,7 +176,8 @@ class ApiErrorFormatter { } else { $msg = new RawMessage( '$1' ); if ( !isset( $options['code'] ) ) { - $options['code'] = 'internal_api_error_' . get_class( $exception ); + $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $exception ) ); + $options['code'] = 'internal_api_error_' . $class; } } $params = [ wfEscapeWikiText( $exception->getMessage() ) ]; @@ -253,7 +254,7 @@ class ApiErrorFormatter { $ret = preg_replace( '!!', '"', $text ); // Strip tags and decode. - $ret = html_entity_decode( strip_tags( $ret ), ENT_QUOTES | ENT_HTML5 ); + $ret = Sanitizer::stripAllTags( $ret ); return $ret; } diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php index 6f7cf652c3..e15d7da1e5 100644 --- a/includes/api/ApiExpandTemplates.php +++ b/includes/api/ApiExpandTemplates.php @@ -210,6 +210,6 @@ class ApiExpandTemplates extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#expandtemplates'; } } diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php index 97720c6e9f..cae1e150ee 100644 --- a/includes/api/ApiFeedContributions.php +++ b/includes/api/ApiFeedContributions.php @@ -70,11 +70,16 @@ class ApiFeedContributions extends ApiBase { $feedUrl ); + // Convert year/month parameters to end parameter + $params['start'] = ''; + $params['end'] = ''; + $params = ContribsPager::processDateFilter( $params ); + $pager = new ContribsPager( $this->getContext(), [ 'target' => $target, 'namespace' => $params['namespace'], - 'year' => $params['year'], - 'month' => $params['month'], + 'start' => $params['start'], + 'end' => $params['end'], 'tagFilter' => $params['tagfilter'], 'deletedOnly' => $params['deletedonly'], 'topOnly' => $params['toponly'], diff --git a/includes/api/ApiFeedRecentChanges.php b/includes/api/ApiFeedRecentChanges.php index 0b04c8cc92..2a80dd5354 100644 --- a/includes/api/ApiFeedRecentChanges.php +++ b/includes/api/ApiFeedRecentChanges.php @@ -63,8 +63,8 @@ class ApiFeedRecentChanges extends ApiBase { $feedFormat = $this->params['feedformat']; $specialClass = $this->params['target'] !== null - ? 'SpecialRecentchangeslinked' - : 'SpecialRecentchanges'; + ? SpecialRecentChangesLinked::class + : SpecialRecentChanges::class; $formatter = $this->getFeedObject( $feedFormat, $specialClass ); @@ -90,12 +90,12 @@ class ApiFeedRecentChanges extends ApiBase { * Return a ChannelFeed object. * * @param string $feedFormat Feed's format (either 'rss' or 'atom') - * @param string $specialClass Relevant special page name (either 'SpecialRecentchanges' or - * 'SpecialRecentchangeslinked') + * @param string $specialClass Relevant special page name (either 'SpecialRecentChanges' or + * 'SpecialRecentChangesLinked') * @return ChannelFeed */ public function getFeedObject( $feedFormat, $specialClass ) { - if ( $specialClass === 'SpecialRecentchangeslinked' ) { + if ( $specialClass === SpecialRecentChangesLinked::class ) { $title = Title::newFromText( $this->params['target'] ); if ( !$title ) { $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $this->params['target'] ) ] ); diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php index 7f349bce5d..b7c5ccc269 100644 --- a/includes/api/ApiFeedWatchlist.php +++ b/includes/api/ApiFeedWatchlist.php @@ -307,6 +307,6 @@ class ApiFeedWatchlist extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Watchlist_feed'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist_feed'; } } diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 83c348b4af..36247dd981 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -219,7 +219,14 @@ abstract class ApiFormatBase extends ApiBase { if ( !$this->getIsWrappedHtml() ) { // When the format without suffix 'fm' is defined, there is a non-html version if ( $this->getMain()->getModuleManager()->isDefined( $lcformat, 'format' ) ) { - $msg = $context->msg( 'api-format-prettyprint-header' )->params( $format, $lcformat ); + if ( !$this->getRequest()->wasPosted() ) { + $nonHtmlUrl = strtok( $this->getRequest()->getFullRequestURL(), '?' ) + . '?' . $this->getRequest()->appendQueryValue( 'format', $lcformat ); + $msg = $context->msg( 'api-format-prettyprint-header-hyperlinked' ) + ->params( $format, $lcformat, $nonHtmlUrl ); + } else { + $msg = $context->msg( 'api-format-prettyprint-header' )->params( $format, $lcformat ); + } } else { $msg = $context->msg( 'api-format-prettyprint-header-only-html' )->params( $format ); } @@ -330,7 +337,7 @@ abstract class ApiFormatBase extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Data_formats'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Data_formats'; } } diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php index e347a9f2c5..12e778bfb6 100644 --- a/includes/api/ApiHelp.php +++ b/includes/api/ApiHelp.php @@ -4,7 +4,7 @@ * * Created on Aug 29, 2014 * - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 @@ -25,6 +25,7 @@ */ use HtmlFormatter\HtmlFormatter; +use MediaWiki\MediaWikiServices; /** * Class to output help for an API module @@ -108,7 +109,7 @@ class ApiHelp extends ApiBase { } $out->setPageTitle( $context->msg( 'api-help-title' ) ); - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); $cacheKey = null; if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain && $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang @@ -116,7 +117,7 @@ class ApiHelp extends ApiBase { $cacheHelpTimeout = $context->getConfig()->get( 'APICacheHelpTimeout' ); if ( $cacheHelpTimeout > 0 ) { // Get help text from cache if present - $cacheKey = wfMemcKey( 'apihelp', $modules[0]->getModulePath(), + $cacheKey = $cache->makeKey( 'apihelp', $modules[0]->getModulePath(), (int)!empty( $options['toc'] ), str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) ); $cached = $cache->get( $cacheKey ); @@ -488,12 +489,22 @@ class ApiHelp extends ApiBase { if ( is_array( $type ) ) { $count = count( $type ); + $deprecatedValues = isset( $settings[ApiBase::PARAM_DEPRECATED_VALUES] ) + ? $settings[ApiBase::PARAM_DEPRECATED_VALUES] + : []; $links = isset( $settings[ApiBase::PARAM_VALUE_LINKS] ) ? $settings[ApiBase::PARAM_VALUE_LINKS] : []; - $values = array_map( function ( $v ) use ( $links ) { - // We can't know whether this contains LTR or RTL text. - $ret = $v === '' ? $v : Html::element( 'span', [ 'dir' => 'auto' ], $v ); + $values = array_map( function ( $v ) use ( $links, $deprecatedValues ) { + $attr = []; + if ( $v !== '' ) { + // We can't know whether this contains LTR or RTL text. + $attr['dir'] = 'auto'; + } + if ( isset( $deprecatedValues[$v] ) ) { + $attr['class'] = 'apihelp-deprecated-value'; + } + $ret = $attr ? Html::element( 'span', $attr, $v ) : $v; if ( isset( $links[$v] ) ) { $ret = "[[{$links[$v]}|$ret]]"; } @@ -518,23 +529,42 @@ class ApiHelp extends ApiBase { switch ( $type ) { case 'submodule': $groups[] = $name; + if ( isset( $settings[ApiBase::PARAM_SUBMODULE_MAP] ) ) { $map = $settings[ApiBase::PARAM_SUBMODULE_MAP]; - ksort( $map ); - $submodules = []; - foreach ( $map as $v => $m ) { - $submodules[] = "[[Special:ApiHelp/{$m}|{$v}]]"; - } + $defaultAttrs = []; } else { - $submodules = $module->getModuleManager()->getNames( $name ); - sort( $submodules ); - $prefix = $module->isMain() - ? '' : ( $module->getModulePath() . '+' ); - $submodules = array_map( function ( $name ) use ( $prefix ) { - $text = Html::element( 'span', [ 'dir' => 'ltr', 'lang' => 'en' ], $name ); - return "[[Special:ApiHelp/{$prefix}{$name}|{$text}]]"; - }, $submodules ); + $prefix = $module->isMain() ? '' : ( $module->getModulePath() . '+' ); + $map = []; + foreach ( $module->getModuleManager()->getNames( $name ) as $submoduleName ) { + $map[$submoduleName] = $prefix . $submoduleName; + } + $defaultAttrs = [ 'dir' => 'ltr', 'lang' => 'en' ]; + } + ksort( $map ); + + $submodules = []; + $deprecatedSubmodules = []; + foreach ( $map as $v => $m ) { + $attrs = $defaultAttrs; + $arr = &$submodules; + try { + $submod = $module->getModuleFromPath( $m ); + if ( $submod ) { + if ( $submod->isDeprecated() ) { + $arr = &$deprecatedSubmodules; + $attrs['class'] = 'apihelp-deprecated-value'; + } + } + } catch ( ApiUsageException $ex ) { + // Ignore + } + if ( $attrs ) { + $v = Html::element( 'span', $attrs, $v ); + } + $arr[] = "[[Special:ApiHelp/{$m}|{$v}]]"; } + $submodules = array_merge( $submodules, $deprecatedSubmodules ); $count = count( $submodules ); $info[] = $context->msg( 'api-help-param-list' ) ->params( $multi ? 2 : 1 ) @@ -844,9 +874,9 @@ class ApiHelp extends ApiBase { public function getHelpUrls() { return [ - 'https://www.mediawiki.org/wiki/API:Main_page', - 'https://www.mediawiki.org/wiki/API:FAQ', - 'https://www.mediawiki.org/wiki/API:Quick_start_guide', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Quick_start_guide', ]; } } diff --git a/includes/api/ApiHelpParamValueMessage.php b/includes/api/ApiHelpParamValueMessage.php index 45378eec1e..162b7cd6be 100644 --- a/includes/api/ApiHelpParamValueMessage.php +++ b/includes/api/ApiHelpParamValueMessage.php @@ -4,7 +4,7 @@ * * Created on Dec 22, 2014 * - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 @@ -36,6 +36,7 @@ class ApiHelpParamValueMessage extends Message { protected $paramValue; + protected $deprecated; /** * @see Message::__construct @@ -43,11 +44,14 @@ class ApiHelpParamValueMessage extends Message { * @param string $paramValue Parameter value being documented * @param string $text Message to use. * @param array $params Parameters for the message. + * @param bool $deprecated Whether the value is deprecated * @throws InvalidArgumentException + * @since 1.30 Added the `$deprecated` parameter */ - public function __construct( $paramValue, $text, $params = [] ) { + public function __construct( $paramValue, $text, $params = [], $deprecated = false ) { parent::__construct( $text, $params ); $this->paramValue = $paramValue; + $this->deprecated = (bool)$deprecated; } /** @@ -58,14 +62,32 @@ class ApiHelpParamValueMessage extends Message { return $this->paramValue; } + /** + * Fetch the 'deprecated' flag + * @since 1.30 + * @return bool + */ + public function isDeprecated() { + return $this->deprecated; + } + /** * Fetch the message. * @return string */ public function fetchMessage() { if ( $this->message === null ) { + $dep = ''; + if ( $this->isDeprecated() ) { + $msg = new Message( 'api-help-param-deprecated' ); + $msg->interface = $this->interface; + $msg->language = $this->language; + $msg->useDatabase = $this->useDatabase; + $msg->title = $this->title; + $dep = '' . $msg->fetchMessage() . ' '; + } $this->message = ";{$this->paramValue}:" - . parent::fetchMessage(); + . $dep . parent::fetchMessage(); } return $this->message; } diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php index bf5e4ce3b2..b46f0b1e51 100644 --- a/includes/api/ApiImport.php +++ b/includes/api/ApiImport.php @@ -171,7 +171,7 @@ class ApiImport extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Import'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Import'; } } diff --git a/includes/api/ApiLinkAccount.php b/includes/api/ApiLinkAccount.php index 9a21e7620c..9553f29767 100644 --- a/includes/api/ApiLinkAccount.php +++ b/includes/api/ApiLinkAccount.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -124,6 +124,6 @@ class ApiLinkAccount extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Linkaccount'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Linkaccount'; } } diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php index d64aeb7f2e..aa7e25e046 100644 --- a/includes/api/ApiLogin.php +++ b/includes/api/ApiLogin.php @@ -41,11 +41,28 @@ class ApiLogin extends ApiBase { parent::__construct( $main, $action, 'lg' ); } - protected function getDescriptionMessage() { + protected function getExtendedDescription() { if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) { - return 'apihelp-login-description'; + return 'apihelp-login-extended-description'; } else { - return 'apihelp-login-description-nobotpasswords'; + return 'apihelp-login-extended-description-nobotpasswords'; + } + } + + /** + * Format a message for the response + * @param Message|string|array $message + * @return string|array + */ + private function formatMessage( $message ) { + $message = Message::newFromSpecifier( $message ); + $errorFormatter = $this->getErrorFormatter(); + if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) { + return ApiErrorFormatter::stripMarkup( + $message->useDatabase( false )->inLanguage( 'en' )->text() + ); + } else { + return $errorFormatter->formatMessage( $message ); } } @@ -64,7 +81,7 @@ class ApiLogin extends ApiBase { if ( $this->lacksSameOriginSecurity() ) { $this->getResult()->addValue( null, 'login', [ 'result' => 'Aborted', - 'reason' => 'Cannot log in when the same-origin policy is not applied', + 'reason' => $this->formatMessage( 'api-login-fail-sameorigin' ), ] ); return; @@ -84,8 +101,10 @@ class ApiLogin extends ApiBase { if ( !$session->canSetUser() ) { $this->getResult()->addValue( null, 'login', [ 'result' => 'Aborted', - 'reason' => 'Cannot log in when using ' . - $session->getProvider()->describe( Language::factory( 'en' ) ), + 'reason' => $this->formatMessage( [ + 'api-login-fail-badsessionprovider', + $session->getProvider()->describe( $this->getErrorFormatter()->getLanguage() ), + ] ) ] ); return; @@ -190,25 +209,15 @@ class ApiLogin extends ApiBase { break; case 'Failed': - $errorFormatter = $this->getErrorFormatter(); - if ( $errorFormatter instanceof ApiErrorFormatter_BackCompat ) { - $result['reason'] = ApiErrorFormatter::stripMarkup( - $message->useDatabase( false )->inLanguage( 'en' )->text() - ); - } else { - $result['reason'] = $errorFormatter->formatMessage( $message ); - } + $result['reason'] = $this->formatMessage( $message ); break; case 'Aborted': - $result['reason'] = 'Authentication requires user interaction, ' . - 'which is not supported by action=login.'; - if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) { - $result['reason'] .= ' To be able to login with action=login, see [[Special:BotPasswords]].'; - $result['reason'] .= ' To continue using main-account login, see action=clientlogin.'; - } else { - $result['reason'] .= ' To log in, see action=clientlogin.'; - } + $result['reason'] = $this->formatMessage( + $this->getConfig()->get( 'EnableBotPasswords' ) + ? 'api-login-fail-aborted' + : 'api-login-fail-aborted-nobotpw' + ); break; default: @@ -250,6 +259,7 @@ class ApiLogin extends ApiBase { 'token' => [ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => false, // for BC + ApiBase::PARAM_SENSITIVE => true, ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', 'login' ], ], ]; @@ -265,7 +275,7 @@ class ApiLogin extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Login'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login'; } /** diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php index d5c28f1d6a..d56c096c7b 100644 --- a/includes/api/ApiLogout.php +++ b/includes/api/ApiLogout.php @@ -75,6 +75,6 @@ class ApiLogout extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Logout'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logout'; } } diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index 604fdf9e70..f6dd524886 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -1,7 +1,5 @@ @gmail.com" @@ -26,7 +24,10 @@ */ use MediaWiki\Logger\LoggerFactory; +use MediaWiki\MediaWikiServices; use Wikimedia\Timestamp\TimestampException; +use Wikimedia\Rdbms\DBQueryError; +use Wikimedia\Rdbms\DBError; /** * This is the main API class, used for both external and internal processing. @@ -160,6 +161,7 @@ class ApiMain extends ApiBase { private $mCacheMode = 'private'; private $mCacheControl = []; private $mParamsUsed = []; + private $mParamsSensitive = []; /** @var bool|null Cached return value from self::lacksSameOriginSecurity() */ private $lacksSameOriginSecurity = null; @@ -234,6 +236,7 @@ class ApiMain extends ApiBase { wfDebug( "API: stripping user credentials when the same-origin policy is not applied\n" ); $wgUser = new User(); $this->getContext()->setUser( $wgUser ); + $request->response()->header( 'MediaWiki-Login-Suppressed: true' ); } } @@ -367,7 +370,7 @@ class ApiMain extends ApiBase { /** * Set the continuation manager - * @param ApiContinuationManager|null + * @param ApiContinuationManager|null $manager */ public function setContinuationManager( $manager ) { if ( $manager !== null ) { @@ -544,7 +547,7 @@ class ApiMain extends ApiBase { $runTime = microtime( true ) - $t; $this->logRequest( $runTime ); if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) { - $this->getStats()->timing( + MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime ); } @@ -578,23 +581,12 @@ class ApiMain extends ApiBase { // T65145: Rollback any open database transactions if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) { // UsageExceptions are intentional, so don't rollback if that's the case - try { - MWExceptionHandler::rollbackMasterChangesAndLog( $e ); - } catch ( DBError $e2 ) { - // Rollback threw an exception too. Log it, but don't interrupt - // our regularly scheduled exception handling. - MWExceptionHandler::logException( $e2 ); - } + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); } // Allow extra cleanup and logging Hooks::run( 'ApiMain::onException', [ $this, $e ] ); - // Log it - if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) { - MWExceptionHandler::logException( $e ); - } - // Handle any kind of exception by outputting properly formatted error message. // If this fails, an unhandled exception should be thrown so that global error // handler will process and log it. @@ -701,13 +693,17 @@ class ApiMain extends ApiBase { $request = $this->getRequest(); $response = $request->response(); - $matchOrigin = false; + $matchedOrigin = false; $allowTiming = false; $varyOrigin = true; if ( $originParam === '*' ) { // Request for anonymous CORS - $matchOrigin = true; + // Technically we should check for the presence of an Origin header + // and not process it as CORS if it's not set, but that would + // require us to vary on Origin for all 'origin=*' requests which + // we don't want to do. + $matchedOrigin = true; $allowOrigin = '*'; $allowCredentials = 'false'; $varyOrigin = false; // No need to vary @@ -734,7 +730,7 @@ class ApiMain extends ApiBase { } $config = $this->getConfig(); - $matchOrigin = count( $origins ) === 1 && self::matchOrigin( + $matchedOrigin = count( $origins ) === 1 && self::matchOrigin( $originParam, $config->get( 'CrossSiteAJAXdomains' ), $config->get( 'CrossSiteAJAXdomainExceptions' ) @@ -745,19 +741,21 @@ class ApiMain extends ApiBase { $allowTiming = $originHeader; } - if ( $matchOrigin ) { + if ( $matchedOrigin ) { $requestedMethod = $request->getHeader( 'Access-Control-Request-Method' ); $preflight = $request->getMethod() === 'OPTIONS' && $requestedMethod !== false; if ( $preflight ) { // This is a CORS preflight request if ( $requestedMethod !== 'POST' && $requestedMethod !== 'GET' ) { // If method is not a case-sensitive match, do not set any additional headers and terminate. + $response->header( 'MediaWiki-CORS-Rejection: Unsupported method requested in preflight' ); return true; } // We allow the actual request to send the following headers $requestedHeaders = $request->getHeader( 'Access-Control-Request-Headers' ); if ( $requestedHeaders !== false ) { if ( !self::matchRequestedHeaders( $requestedHeaders ) ) { + $response->header( 'MediaWiki-CORS-Rejection: Unsupported header requested in preflight' ); return true; } $response->header( 'Access-Control-Allow-Headers: ' . $requestedHeaders ); @@ -765,6 +763,12 @@ class ApiMain extends ApiBase { // We only allow the actual request to be GET or POST $response->header( 'Access-Control-Allow-Methods: POST, GET' ); + } elseif ( $request->getMethod() !== 'POST' && $request->getMethod() !== 'GET' ) { + // Unsupported non-preflight method, don't handle it as CORS + $response->header( + 'MediaWiki-CORS-Rejection: Unsupported method for simple request or actual request' + ); + return true; } $response->header( "Access-Control-Allow-Origin: $allowOrigin" ); @@ -776,9 +780,12 @@ class ApiMain extends ApiBase { if ( !$preflight ) { $response->header( - 'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag' + 'Access-Control-Expose-Headers: MediaWiki-API-Error, Retry-After, X-Database-Lag, ' + . 'MediaWiki-Login-Suppressed' ); } + } else { + $response->header( 'MediaWiki-CORS-Rejection: Origin mismatch' ); } if ( $varyOrigin ) { @@ -1034,7 +1041,7 @@ class ApiMain extends ApiBase { // None of the rest have any messages for non-error types } elseif ( $e instanceof UsageException ) { // User entered incorrect parameters - generate error response - $data = $e->getMessageArray(); + $data = MediaWiki\quietCall( [ $e, 'getMessageArray' ] ); $code = $data['code']; $info = $data['info']; unset( $data['code'], $data['info'] ); @@ -1042,7 +1049,8 @@ class ApiMain extends ApiBase { } else { // Something is seriously wrong $config = $this->getConfig(); - $code = 'internal_api_error_' . get_class( $e ); + $class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $e ) ); + $code = 'internal_api_error_' . $class; if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) { $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ]; } else { @@ -1228,6 +1236,35 @@ class ApiMain extends ApiBase { return $module; } + /** + * @return array + */ + private function getMaxLag() { + $dbLag = MediaWikiServices::getInstance()->getDBLoadBalancer()->getMaxLag(); + $lagInfo = [ + 'host' => $dbLag[0], + 'lag' => $dbLag[1], + 'type' => 'db' + ]; + + $jobQueueLagFactor = $this->getConfig()->get( 'JobQueueIncludeInMaxLagFactor' ); + if ( $jobQueueLagFactor ) { + // Turn total number of jobs into seconds by using the configured value + $totalJobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() ); + $jobQueueLag = $totalJobs / (float)$jobQueueLagFactor; + if ( $jobQueueLag > $lagInfo['lag'] ) { + $lagInfo = [ + 'host' => wfHostname(), // XXX: Is there a better value that could be used? + 'lag' => $jobQueueLag, + 'type' => 'jobqueue', + 'jobs' => $totalJobs, + ]; + } + } + + return $lagInfo; + } + /** * Check the max lag if necessary * @param ApiBase $module Api module being used @@ -1237,18 +1274,22 @@ class ApiMain extends ApiBase { protected function checkMaxLag( $module, $params ) { if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) { $maxLag = $params['maxlag']; - list( $host, $lag ) = wfGetLB()->getMaxLag(); - if ( $lag > $maxLag ) { + $lagInfo = $this->getMaxLag(); + if ( $lagInfo['lag'] > $maxLag ) { $response = $this->getRequest()->response(); $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); - $response->header( 'X-Database-Lag: ' . intval( $lag ) ); + $response->header( 'X-Database-Lag: ' . intval( $lagInfo['lag'] ) ); if ( $this->getConfig()->get( 'ShowHostnames' ) ) { - $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] ); + $this->dieWithError( + [ 'apierror-maxlag', $lagInfo['lag'], $lagInfo['host'] ], + 'maxlag', + $lagInfo + ); } - $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' ); + $this->dieWithError( [ 'apierror-maxlag-generic', $lagInfo['lag'] ], 'maxlag', $lagInfo ); } } @@ -1601,13 +1642,17 @@ class ApiMain extends ApiBase { " {$logCtx['ip']} " . "T={$logCtx['timeSpentBackend']}ms"; + $sensitive = array_flip( $this->getSensitiveParams() ); foreach ( $this->getParamsUsed() as $name ) { $value = $request->getVal( $name ); if ( $value === null ) { continue; } - if ( strlen( $value ) > 256 ) { + if ( isset( $sensitive[$name] ) ) { + $value = '[redacted]'; + $encValue = '[redacted]'; + } elseif ( strlen( $value ) > 256 ) { $value = substr( $value, 0, 256 ); $encValue = $this->encodeRequestLogValue( $value ) . '[...]'; } else { @@ -1657,6 +1702,24 @@ class ApiMain extends ApiBase { $this->mParamsUsed += array_fill_keys( (array)$params, true ); } + /** + * Get the request parameters that should be considered sensitive + * @since 1.29 + * @return array + */ + protected function getSensitiveParams() { + return array_keys( $this->mParamsSensitive ); + } + + /** + * Mark parameters as sensitive + * @since 1.29 + * @param string|string[] $params + */ + public function markParamsSensitive( $params ) { + $this->mParamsSensitive += array_fill_keys( (array)$params, true ); + } + /** * Get a request value, and register the fact that it was used, for logging. * @param string $name @@ -1766,7 +1829,7 @@ class ApiMain extends ApiBase { ApiBase::PARAM_TYPE => 'submodule', ], 'format' => [ - ApiBase::PARAM_DFLT => ApiMain::API_DEFAULT_FORMAT, + ApiBase::PARAM_DFLT => self::API_DEFAULT_FORMAT, ApiBase::PARAM_TYPE => 'submodule', ], 'maxlag' => [ @@ -1868,14 +1931,15 @@ class ApiMain extends ApiBase { $header = $this->msg( 'api-help-datatypes-header' )->parse(); - // Add an additional span with sanitized ID - if ( !$this->getConfig()->get( 'ExperimentalHtmlIds' ) ) { - $header = Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/datatypes' ) ] ) . - $header; - } - $help['datatypes'] .= Html::rawElement( 'h' . min( 6, $level ), - [ 'id' => 'main/datatypes', 'class' => 'apihelp-header' ], - $header + $id = Sanitizer::escapeIdForAttribute( 'main/datatypes', Sanitizer::ID_PRIMARY ); + $idFallback = Sanitizer::escapeIdForAttribute( 'main/datatypes', Sanitizer::ID_FALLBACK ); + + $help['datatypes'] .= Linker::makeHeadline( min( 6, $level ), + ' class="apihelp-header"', + $id, + $header, + '', + $idFallback ); $help['datatypes'] .= $this->msg( 'api-help-datatypes' )->parseAsBlock(); if ( !isset( $tocData['main/datatypes'] ) ) { @@ -1890,15 +1954,15 @@ class ApiMain extends ApiBase { ]; } - // Add an additional span with sanitized ID - if ( !$this->getConfig()->get( 'ExperimentalHtmlIds' ) ) { - $header = Html::element( 'span', [ 'id' => Sanitizer::escapeId( 'main/credits' ) ] ) . - $header; - } $header = $this->msg( 'api-credits-header' )->parse(); - $help['credits'] .= Html::rawElement( 'h' . min( 6, $level ), - [ 'id' => 'main/credits', 'class' => 'apihelp-header' ], - $header + $id = Sanitizer::escapeIdForAttribute( 'main/credits', Sanitizer::ID_PRIMARY ); + $idFallback = Sanitizer::escapeIdForAttribute( 'main/credits', Sanitizer::ID_FALLBACK ); + $help['credits'] .= Linker::makeHeadline( min( 6, $level ), + ' class="apihelp-header"', + $id, + $header, + '', + $idFallback ); $help['credits'] .= $this->msg( 'api-credits' )->useDatabase( false )->parseAsBlock(); if ( !isset( $tocData['main/credits'] ) ) { diff --git a/includes/api/ApiManageTags.php b/includes/api/ApiManageTags.php index 3c080939c0..42de161018 100644 --- a/includes/api/ApiManageTags.php +++ b/includes/api/ApiManageTags.php @@ -125,6 +125,6 @@ class ApiManageTags extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Tag_management'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag_management'; } } diff --git a/includes/api/ApiMergeHistory.php b/includes/api/ApiMergeHistory.php index 357698e13c..79e9909567 100644 --- a/includes/api/ApiMergeHistory.php +++ b/includes/api/ApiMergeHistory.php @@ -137,6 +137,6 @@ class ApiMergeHistory extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Mergehistory'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Mergehistory'; } } diff --git a/includes/api/ApiModuleManager.php b/includes/api/ApiModuleManager.php index 42dfb719bb..b5e47ac9c9 100644 --- a/includes/api/ApiModuleManager.php +++ b/includes/api/ApiModuleManager.php @@ -97,7 +97,6 @@ class ApiModuleManager extends ContextSource { * @param string $group Which group modules belong to (action,format,...) */ public function addModules( array $modules, $group ) { - foreach ( $modules as $name => $moduleSpec ) { if ( is_array( $moduleSpec ) ) { $class = $moduleSpec['class']; diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php index 566f778169..1fb034f85f 100644 --- a/includes/api/ApiMove.php +++ b/includes/api/ApiMove.php @@ -292,6 +292,6 @@ class ApiMove extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Move'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Move'; } } diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php index e6fe27ca2a..419fd140d7 100644 --- a/includes/api/ApiOpenSearch.php +++ b/includes/api/ApiOpenSearch.php @@ -4,7 +4,7 @@ * * Copyright © 2006 Yuri Astrakhan "@gmail.com" * Copyright © 2008 Brion Vibber - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 @@ -232,7 +232,7 @@ class ApiOpenSearch extends ApiBase { break; case 'xml': - // http://msdn.microsoft.com/en-us/library/cc891508%28v=vs.85%29.aspx + // https://msdn.microsoft.com/en-us/library/cc891508(v=vs.85).aspx $imageKeys = [ 'source' => true, 'alt' => true, @@ -309,7 +309,7 @@ class ApiOpenSearch extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Opensearch'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Opensearch'; } /** diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php index 466d1865d6..5b0d86a7f6 100644 --- a/includes/api/ApiOptions.php +++ b/includes/api/ApiOptions.php @@ -169,7 +169,7 @@ class ApiOptions extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Options'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Options'; } protected function getExamplesMessages() { diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index 7d16af8f6b..cfac761c91 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -25,6 +25,7 @@ */ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * This class contains a list of pages that the client has requested. @@ -70,6 +71,7 @@ class ApiPageSet extends ApiBase { private $mInterwikiTitles = []; /** @var Title[] */ private $mPendingRedirectIDs = []; + private $mPendingRedirectSpecialPages = []; // [dbkey] => [ Title $from, Title $to ] private $mResolvedRedirectTitles = []; private $mConvertedTitles = []; private $mGoodRevIDs = []; @@ -119,7 +121,7 @@ class ApiPageSet extends ApiBase { public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) { parent::__construct( $dbSource->getMain(), $dbSource->getModuleName() ); $this->mDbSource = $dbSource; - $this->mAllowGenerator = ( $flags & ApiPageSet::DISABLE_GENERATORS ) == 0; + $this->mAllowGenerator = ( $flags & self::DISABLE_GENERATORS ) == 0; $this->mDefaultNamespace = $defaultNamespace; $this->mParams = $this->extractRequestParams(); @@ -164,7 +166,7 @@ class ApiPageSet extends ApiBase { } // Create a temporary pageset to store generator's output, // add any additional fields generator may need, and execute pageset to populate titles/pageids - $tmpPageSet = new ApiPageSet( $dbSource, ApiPageSet::DISABLE_GENERATORS ); + $tmpPageSet = new ApiPageSet( $dbSource, self::DISABLE_GENERATORS ); $generator->setGeneratorMode( $tmpPageSet ); $this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() ); @@ -812,6 +814,8 @@ class ApiPageSet extends ApiBase { // Get validated and normalized title objects $linkBatch = $this->processTitlesArray( $titles ); if ( $linkBatch->isEmpty() ) { + // There might be special-page redirects + $this->resolvePendingRedirects(); return; } @@ -1032,7 +1036,7 @@ class ApiPageSet extends ApiBase { // Repeat until all redirects have been resolved // The infinite loop is prevented by keeping all known pages in $this->mAllPages - while ( $this->mPendingRedirectIDs ) { + while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) { // Resolve redirects by querying the pagelinks table, and repeat the process // Create a new linkBatch object for the next pass $linkBatch = $this->getRedirectTargets(); @@ -1066,56 +1070,76 @@ class ApiPageSet extends ApiBase { $titlesToResolve = []; $db = $this->getDB(); - $res = $db->select( - 'redirect', - [ - 'rd_from', - 'rd_namespace', - 'rd_fragment', - 'rd_interwiki', - 'rd_title' - ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ], - __METHOD__ - ); - foreach ( $res as $row ) { - $rdfrom = intval( $row->rd_from ); - $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText(); - $to = Title::makeTitle( - $row->rd_namespace, - $row->rd_title, - $row->rd_fragment, - $row->rd_interwiki - ); - $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom]; - unset( $this->mPendingRedirectIDs[$rdfrom] ); - if ( $to->isExternal() ) { - $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); - } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { - $titlesToResolve[] = $to; + if ( $this->mPendingRedirectIDs ) { + $res = $db->select( + 'redirect', + [ + 'rd_from', + 'rd_namespace', + 'rd_fragment', + 'rd_interwiki', + 'rd_title' + ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ], + __METHOD__ + ); + foreach ( $res as $row ) { + $rdfrom = intval( $row->rd_from ); + $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText(); + $to = Title::makeTitle( + $row->rd_namespace, + $row->rd_title, + $row->rd_fragment, + $row->rd_interwiki + ); + $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom]; + unset( $this->mPendingRedirectIDs[$rdfrom] ); + if ( $to->isExternal() ) { + $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { + $titlesToResolve[] = $to; + } + $this->mRedirectTitles[$from] = $to; } - $this->mRedirectTitles[$from] = $to; - } - if ( $this->mPendingRedirectIDs ) { - // We found pages that aren't in the redirect table - // Add them - foreach ( $this->mPendingRedirectIDs as $id => $title ) { - $page = WikiPage::factory( $title ); - $rt = $page->insertRedirect(); - if ( !$rt ) { - // What the hell. Let's just ignore this - continue; + if ( $this->mPendingRedirectIDs ) { + // We found pages that aren't in the redirect table + // Add them + foreach ( $this->mPendingRedirectIDs as $id => $title ) { + $page = WikiPage::factory( $title ); + $rt = $page->insertRedirect(); + if ( !$rt ) { + // What the hell. Let's just ignore this + continue; + } + if ( $rt->isExternal() ) { + $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) { + $titlesToResolve[] = $rt; + } + $from = $title->getPrefixedText(); + $this->mResolvedRedirectTitles[$from] = $title; + $this->mRedirectTitles[$from] = $rt; + unset( $this->mPendingRedirectIDs[$id] ); } - if ( $rt->isExternal() ) { - $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki(); - } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) { - $titlesToResolve[] = $rt; + } + } + + if ( $this->mPendingRedirectSpecialPages ) { + foreach ( $this->mPendingRedirectSpecialPages as $key => list( $from, $to ) ) { + $fromKey = $from->getPrefixedText(); + $this->mResolvedRedirectTitles[$fromKey] = $from; + $this->mRedirectTitles[$fromKey] = $to; + if ( $to->isExternal() ) { + $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { + $titlesToResolve[] = $to; } - $from = $title->getPrefixedText(); - $this->mResolvedRedirectTitles[$from] = $title; - $this->mRedirectTitles[$from] = $rt; - unset( $this->mPendingRedirectIDs[$id] ); } + $this->mPendingRedirectSpecialPages = []; + + // Set private caching since we don't know what criteria the + // special pages used to decide on these redirects. + $this->mCacheMode = 'private'; } return $this->processTitlesArray( $titlesToResolve ); @@ -1196,8 +1220,26 @@ class ApiPageSet extends ApiBase { $dbkey = $titleObj->getDBkey(); if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) { $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId; - $this->mSpecialTitles[$this->mFakePageId] = $titleObj; - $this->mFakePageId--; + $target = null; + if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) { + $special = SpecialPageFactory::getPage( $dbkey ); + if ( $special instanceof RedirectSpecialArticle ) { + // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of + // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle. + $context = new DerivativeContext( $this ); + $context->setTitle( $titleObj ); + $context->setRequest( new FauxRequest ); + $special->setContext( $context ); + list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey ); + $target = $special->getRedirect( $subpage ); + } + } + if ( $target ) { + $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ]; + } else { + $this->mSpecialTitles[$this->mFakePageId] = $titleObj; + $this->mFakePageId--; + } } } else { // Regular page @@ -1314,7 +1356,7 @@ class ApiPageSet extends ApiBase { } } foreach ( $this->mGeneratorData as $ns => $dbkeys ) { - if ( $ns === -1 ) { + if ( $ns === NS_SPECIAL ) { $pages = []; foreach ( $this->mSpecialTitles as $id => $title ) { $pages[$title->getDBkey()] = $id; @@ -1384,7 +1426,7 @@ class ApiPageSet extends ApiBase { /** * Get the database connection (read-only) - * @return Database + * @return IDatabase */ protected function getDB() { return $this->mDbSource->getDB(); diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php index 67983e7a3a..17b00933a1 100644 --- a/includes/api/ApiParamInfo.php +++ b/includes/api/ApiParamInfo.php @@ -184,7 +184,7 @@ class ApiParamInfo extends ApiBase { } /** - * @param array $res Result array + * @param array &$res Result array * @param string $key Result key * @param Message[] $msgs * @param bool $joinLists @@ -401,6 +401,25 @@ class ApiParamInfo extends ApiBase { if ( isset( $settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX] ) ) { $item['submoduleparamprefix'] = $settings[ApiBase::PARAM_SUBMODULE_PARAM_PREFIX]; } + + $deprecatedSubmodules = []; + foreach ( $item['submodules'] as $v => $submodulePath ) { + try { + $submod = $this->getModuleFromPath( $submodulePath ); + if ( $submod && $submod->isDeprecated() ) { + $deprecatedSubmodules[] = $v; + } + } catch ( ApiUsageException $ex ) { + // Ignore + } + } + if ( $deprecatedSubmodules ) { + $item['type'] = array_merge( + array_diff( $item['type'], $deprecatedSubmodules ), + $deprecatedSubmodules + ); + $item['deprecatedvalues'] = $deprecatedSubmodules; + } } elseif ( $settings[ApiBase::PARAM_TYPE] === 'tags' ) { $item['type'] = ChangeTags::listExplicitlyDefinedTags(); } else { @@ -448,6 +467,16 @@ class ApiParamInfo extends ApiBase { if ( !empty( $settings[ApiBase::PARAM_RANGE_ENFORCE] ) ) { $item['enforcerange'] = true; } + if ( !empty( $settings[ApiBase::PARAM_DEPRECATED_VALUES] ) ) { + $deprecatedValues = array_keys( $settings[ApiBase::PARAM_DEPRECATED_VALUES] ); + if ( is_array( $item['type'] ) ) { + $deprecatedValues = array_intersect( $deprecatedValues, $item['type'] ); + } + if ( $deprecatedValues ) { + $item['deprecatedvalues'] = array_values( $deprecatedValues ); + ApiResult::setIndexedTagName( $item['deprecatedvalues'], 'v' ); + } + } if ( !empty( $settings[ApiBase::PARAM_HELP_MSG_INFO] ) ) { $item['info'] = []; @@ -543,6 +572,6 @@ class ApiParamInfo extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Parameter_information'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parameter_information'; } } diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index 287ffb7c0e..031fbf76a7 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -22,6 +22,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * @ingroup API */ @@ -36,6 +38,9 @@ class ApiParse extends ApiBase { /** @var Content $pstContent */ private $pstContent = null; + /** @var bool */ + private $contentIsDeleted = false, $contentIsSuppressed = false; + public function execute() { // The data is hot but user-dependent, like page views, so we set vary cookies $this->getMain()->setCacheMode( 'anon-public-user-private' ); @@ -83,6 +88,9 @@ class ApiParse extends ApiBase { $redirValues = null; + $needContent = isset( $prop['wikitext'] ) || + isset( $prop['parsetree'] ) || $params['generatexml']; + // Return result $result = $this->getResult(); @@ -108,27 +116,9 @@ class ApiParse extends ApiBase { $wgTitle = $titleObj; $pageObj = WikiPage::factory( $titleObj ); list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params ); - - // If for some reason the "oldid" is actually the current revision, it may be cached - // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than - // checking $rev->isCurrent(), because $pageObj is what actually ends up being used, - // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that. - if ( !$suppressCache && $rev->getId() == $pageObj->getLatest() ) { - // May get from/save to parser cache - $p_result = $this->getParsedContent( $pageObj, $popts, - $pageid, isset( $prop['wikitext'] ) ); - } else { // This is an old revision, so get the text differently - $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() ); - - if ( $this->section !== false ) { - $this->content = $this->getSectionContent( - $this->content, $this->msg( 'revid', $rev->getId() ) - ); - } - - // Should we save old revision parses to the parser cache? - $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts ); - } + $p_result = $this->getParsedContent( + $pageObj, $popts, $suppressCache, $pageid, $rev, $needContent + ); } else { // Not $oldid, but $pageid or $page if ( $params['redirects'] ) { $reqParams = [ @@ -170,25 +160,9 @@ class ApiParse extends ApiBase { } list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params ); - - // Don't pollute the parser cache when setting options that aren't - // in ParserOptions::optionsHash() - /// @todo: This should be handled closer to the actual cache instead of here, see T110269 - $suppressCache = $suppressCache || - $params['disablepp'] || - $params['disablelimitreport'] || - $params['preview'] || - $params['sectionpreview'] || - $params['disabletidy']; - - if ( $suppressCache ) { - $this->content = $this->getContent( $pageObj, $pageid ); - $p_result = $this->content->getParserOutput( $titleObj, null, $popts ); - } else { - // Potentially cached - $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, - isset( $prop['wikitext'] ) ); - } + $p_result = $this->getParsedContent( + $pageObj, $popts, $suppressCache, $pageid, null, $needContent + ); } } else { // Not $oldid, $pageid, $page. Hence based on $text $titleObj = Title::newFromText( $title ); @@ -247,6 +221,12 @@ class ApiParse extends ApiBase { if ( $params['onlypst'] ) { // Build a result and bail out $result_array = []; + if ( $this->contentIsDeleted ) { + $result_array['textdeleted'] = true; + } + if ( $this->contentIsSuppressed ) { + $result_array['textsuppressed'] = true; + } $result_array['text'] = $this->pstContent->serialize( $format ); $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text'; if ( isset( $prop['wikitext'] ) ) { @@ -277,6 +257,60 @@ class ApiParse extends ApiBase { $result_array['title'] = $titleObj->getPrefixedText(); $result_array['pageid'] = $pageid ?: $pageObj->getId(); + if ( $this->contentIsDeleted ) { + $result_array['textdeleted'] = true; + } + if ( $this->contentIsSuppressed ) { + $result_array['textsuppressed'] = true; + } + + if ( $params['disabletoc'] ) { + $p_result->setTOCEnabled( false ); + } + + if ( isset( $params['useskin'] ) ) { + $factory = MediaWikiServices::getInstance()->getSkinFactory(); + $skin = $factory->makeSkin( Skin::normalizeKey( $params['useskin'] ) ); + } else { + $skin = null; + } + + $outputPage = null; + if ( $skin || isset( $prop['headhtml'] ) || isset( $prop['categorieshtml'] ) ) { + // Enabling the skin via 'useskin', 'headhtml', or 'categorieshtml' + // gets OutputPage and Skin involved, which (among others) applies + // these hooks: + // - ParserOutputHooks + // - Hook: LanguageLinks + // - Hook: OutputPageParserOutput + // - Hook: OutputPageMakeCategoryLinks + $context = new DerivativeContext( $this->getContext() ); + $context->setTitle( $titleObj ); + $context->setWikiPage( $pageObj ); + + if ( $skin ) { + // Use the skin specified by 'useskin' + $context->setSkin( $skin ); + // Context clones the skin, refetch to stay in sync. (T166022) + $skin = $context->getSkin(); + } else { + // Make sure the context's skin refers to the context. Without this, + // $outputPage->getSkin()->getOutput() !== $outputPage which + // confuses some of the output. + $context->setSkin( $context->getSkin() ); + } + + $outputPage = new OutputPage( $context ); + $outputPage->addParserOutputMetadata( $p_result ); + $context->setOutput( $outputPage ); + + if ( $skin ) { + // Based on OutputPage::output() + foreach ( $skin->getDefaultModules() as $group ) { + $outputPage->addModules( $group ); + } + } + } if ( !is_null( $oldid ) ) { $result_array['revid'] = intval( $oldid ); @@ -286,10 +320,6 @@ class ApiParse extends ApiBase { $result_array['redirects'] = $redirValues; } - if ( $params['disabletoc'] ) { - $p_result->setTOCEnabled( false ); - } - if ( isset( $prop['text'] ) ) { $result_array['text'] = $p_result->getText(); $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text'; @@ -303,26 +333,26 @@ class ApiParse extends ApiBase { } if ( isset( $prop['langlinks'] ) ) { - $langlinks = $p_result->getLanguageLinks(); - - if ( $params['effectivelanglinks'] ) { - // Link flags are ignored for now, but may in the future be - // included in the result. - $linkFlags = []; - Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] ); + if ( $skin ) { + $langlinks = $outputPage->getLanguageLinks(); + } else { + $langlinks = $p_result->getLanguageLinks(); + // The deprecated 'effectivelanglinks' option depredates OutputPage + // support via 'useskin'. If not already applied, then run just this + // one hook of OutputPage::addParserOutputMetadata here. + if ( $params['effectivelanglinks'] ) { + $linkFlags = []; + Hooks::run( 'LanguageLinks', [ $titleObj, &$langlinks, &$linkFlags ] ); + } } - } else { - $langlinks = false; - } - if ( isset( $prop['langlinks'] ) ) { $result_array['langlinks'] = $this->formatLangLinks( $langlinks ); } if ( isset( $prop['categories'] ) ) { $result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() ); } if ( isset( $prop['categorieshtml'] ) ) { - $result_array['categorieshtml'] = $this->categoriesHtml( $p_result->getCategories() ); + $result_array['categorieshtml'] = $outputPage->getSkin()->getCategories(); $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'categorieshtml'; } if ( isset( $prop['links'] ) ) { @@ -340,6 +370,9 @@ class ApiParse extends ApiBase { if ( isset( $prop['sections'] ) ) { $result_array['sections'] = $p_result->getSections(); } + if ( isset( $prop['parsewarnings'] ) ) { + $result_array['parsewarnings'] = $p_result->getWarnings(); + } if ( isset( $prop['displaytitle'] ) ) { $result_array['displaytitle'] = $p_result->getDisplayTitle() ?: @@ -347,38 +380,41 @@ class ApiParse extends ApiBase { } if ( isset( $prop['headitems'] ) ) { - $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() ); - $this->addDeprecation( 'apiwarn-deprecation-parse-headitems', 'action=parse&prop=headitems' ); + if ( $skin ) { + $result_array['headitems'] = $this->formatHeadItems( $outputPage->getHeadItemsArray() ); + } else { + $result_array['headitems'] = $this->formatHeadItems( $p_result->getHeadItems() ); + } } if ( isset( $prop['headhtml'] ) ) { - $context = new DerivativeContext( $this->getContext() ); - $context->setTitle( $titleObj ); - $context->setWikiPage( $pageObj ); - - // We need an OutputPage tied to $context, not to the - // RequestContext at the root of the stack. - $output = new OutputPage( $context ); - $output->addParserOutputMetadata( $p_result ); - - $result_array['headhtml'] = $output->headElement( $context->getSkin() ); + $result_array['headhtml'] = $outputPage->headElement( $context->getSkin() ); $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml'; } if ( isset( $prop['modules'] ) ) { - $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) ); - $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) ); - $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) ); + if ( $skin ) { + $result_array['modules'] = $outputPage->getModules(); + $result_array['modulescripts'] = $outputPage->getModuleScripts(); + $result_array['modulestyles'] = $outputPage->getModuleStyles(); + } else { + $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) ); + $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) ); + $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) ); + } } if ( isset( $prop['jsconfigvars'] ) ) { - $result_array['jsconfigvars'] = - ApiResult::addMetadataToResultVars( $p_result->getJsConfigVars() ); + $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars(); + $result_array['jsconfigvars'] = ApiResult::addMetadataToResultVars( $jsconfigvars ); } if ( isset( $prop['encodedjsconfigvars'] ) ) { + $jsconfigvars = $skin ? $outputPage->getJsConfigVars() : $p_result->getJsConfigVars(); $result_array['encodedjsconfigvars'] = FormatJson::encode( - $p_result->getJsConfigVars(), false, FormatJson::ALL_OK + $jsconfigvars, + false, + FormatJson::ALL_OK ); $result_array[ApiResult::META_SUBELEMENTS][] = 'encodedjsconfigvars'; } @@ -389,7 +425,11 @@ class ApiParse extends ApiBase { } if ( isset( $prop['indicators'] ) ) { - $result_array['indicators'] = (array)$p_result->getIndicators(); + if ( $skin ) { + $result_array['indicators'] = (array)$outputPage->getIndicators(); + } else { + $result_array['indicators'] = (array)$p_result->getIndicators(); + } ApiResult::setArrayType( $result_array['indicators'], 'BCkvp', 'name' ); } @@ -452,6 +492,7 @@ class ApiParse extends ApiBase { 'modulestyles' => 'm', 'properties' => 'pp', 'limitreportdata' => 'lr', + 'parsewarnings' => 'pw' ]; $this->setIndexedTagNames( $result_array, $result_mapping ); $result->addValue( null, $this->getModuleName(), $result_array ); @@ -474,70 +515,81 @@ class ApiParse extends ApiBase { if ( $params['disabletidy'] ) { $popts->setTidy( false ); } + $popts->setWrapOutputClass( + $params['wrapoutputclass'] === '' ? false : $params['wrapoutputclass'] + ); $reset = null; $suppressCache = false; Hooks::run( 'ApiMakeParserOptions', [ $popts, $pageObj->getTitle(), $params, $this, &$reset, &$suppressCache ] ); + // Force cache suppression when $popts aren't cacheable. + $suppressCache = $suppressCache || !$popts->isSafeToCache(); + return [ $popts, $reset, $suppressCache ]; } /** * @param WikiPage $page * @param ParserOptions $popts + * @param bool $suppressCache * @param int $pageId - * @param bool $getWikitext + * @param Revision|null $rev + * @param bool $getContent * @return ParserOutput */ - private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) { - $this->content = $this->getContent( $page, $pageId ); + private function getParsedContent( + WikiPage $page, $popts, $suppressCache, $pageId, $rev, $getContent + ) { + $revId = $rev ? $rev->getId() : null; + $isDeleted = $rev && $rev->isDeleted( Revision::DELETED_TEXT ); + + if ( $getContent || $this->section !== false || $isDeleted ) { + if ( $rev ) { + $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() ); + if ( !$this->content ) { + $this->dieWithError( [ 'apierror-missingcontent-revid', $revId ] ); + } + } else { + $this->content = $page->getContent( Revision::FOR_THIS_USER, $this->getUser() ); + if ( !$this->content ) { + $this->dieWithError( [ 'apierror-missingcontent-pageid', $pageId ] ); + } + } + $this->contentIsDeleted = $isDeleted; + $this->contentIsSuppressed = $rev && + $rev->isDeleted( Revision::DELETED_TEXT | Revision::DELETED_RESTRICTED ); + } - if ( $this->section !== false && $this->content !== null ) { - // Not cached (save or load) - return $this->content->getParserOutput( $page->getTitle(), null, $popts ); + if ( $this->section !== false ) { + $this->content = $this->getSectionContent( + $this->content, + $pageId === null ? $page->getTitle()->getPrefixedText() : $this->msg( 'pageid', $pageId ) + ); + return $this->content->getParserOutput( $page->getTitle(), $revId, $popts ); } - // Try the parser cache first - // getParserOutput will save to Parser cache if able - $pout = $page->getParserOutput( $popts ); - if ( !$pout ) { - $this->dieWithError( [ 'apierror-nosuchrevid', $page->getLatest() ] ); + if ( $isDeleted ) { + // getParserOutput can't do revdeled revisions + $pout = $this->content->getParserOutput( $page->getTitle(), $revId, $popts ); + } else { + // getParserOutput will save to Parser cache if able + $pout = $page->getParserOutput( $popts, $revId, $suppressCache ); } - if ( $getWikitext ) { - $this->content = $page->getContent( Revision::RAW ); + if ( !$pout ) { + $this->dieWithError( [ 'apierror-nosuchrevid', $revId ?: $page->getLatest() ] ); } return $pout; } - /** - * Get the content for the given page and the requested section. - * - * @param WikiPage $page - * @param int $pageId - * @return Content - */ - private function getContent( WikiPage $page, $pageId = null ) { - $content = $page->getContent( Revision::RAW ); // XXX: really raw? - - if ( $this->section !== false && $content !== null ) { - $content = $this->getSectionContent( - $content, - !is_null( $pageId ) - ? $this->msg( 'pageid', $pageId ) - : $page->getTitle()->getPrefixedText() - ); - } - return $content; - } - /** * Extract the requested section from the given Content * * @param Content $content * @param string|Message $what Identifies the content in error messages, e.g. page title. - * @return Content|bool + * @return Content */ private function getSectionContent( Content $content, $what ) { // Not cached (save or load) @@ -655,13 +707,6 @@ class ApiParse extends ApiBase { return $result; } - private function categoriesHtml( $categories ) { - $context = $this->getContext(); - $context->getOutput()->addCategoryLinks( $categories ); - - return $context->getSkin()->getCategories(); - } - private function formatLinks( $links ) { $result = []; foreach ( $links as $ns => $nslinks ) { @@ -751,7 +796,8 @@ class ApiParse extends ApiBase { ], 'prop' => [ ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|' . - 'images|externallinks|sections|revid|displaytitle|iwlinks|properties', + 'images|externallinks|sections|revid|displaytitle|iwlinks|' . + 'properties|parsewarnings', ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => [ 'text', @@ -765,7 +811,6 @@ class ApiParse extends ApiBase { 'sections', 'revid', 'displaytitle', - 'headitems', 'headhtml', 'modules', 'jsconfigvars', @@ -777,14 +822,23 @@ class ApiParse extends ApiBase { 'limitreportdata', 'limitreporthtml', 'parsetree', + 'parsewarnings', + 'headitems', ], ApiBase::PARAM_HELP_MSG_PER_VALUE => [ 'parsetree' => [ 'apihelp-parse-paramvalue-prop-parsetree', CONTENT_MODEL_WIKITEXT ], ], + ApiBase::PARAM_DEPRECATED_VALUES => [ + 'headitems' => 'apiwarn-deprecation-parse-headitems', + ], ], + 'wrapoutputclass' => 'mw-parser-output', 'pst' => false, 'onlypst' => false, - 'effectivelanglinks' => false, + 'effectivelanglinks' => [ + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_DEPRECATED => true, + ], 'section' => null, 'sectiontitle' => [ ApiBase::PARAM_TYPE => 'string', @@ -806,6 +860,9 @@ class ApiParse extends ApiBase { 'preview' => false, 'sectionpreview' => false, 'disabletoc' => false, + 'useskin' => [ + ApiBase::PARAM_TYPE => array_keys( Skin::getAllowedSkins() ), + ], 'contentformat' => [ ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(), ], @@ -829,6 +886,6 @@ class ApiParse extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#parse'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#parse'; } } diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php index c33542f1c7..06e8ae28c2 100644 --- a/includes/api/ApiPatrol.php +++ b/includes/api/ApiPatrol.php @@ -112,6 +112,6 @@ class ApiPatrol extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Patrol'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Patrol'; } } diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php index c74f890a57..1be4b10382 100644 --- a/includes/api/ApiProtect.php +++ b/includes/api/ApiProtect.php @@ -199,6 +199,6 @@ class ApiProtect extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Protect'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protect'; } } diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php index 312463835c..83227a2fc2 100644 --- a/includes/api/ApiPurge.php +++ b/includes/api/ApiPurge.php @@ -56,7 +56,7 @@ class ApiPurge extends ApiBase { $page = WikiPage::factory( $title ); if ( !$user->pingLimiter( 'purge' ) ) { // Directly purge and skip the UI part of purge() - $page->doPurge( WikiPage::PURGE_ALL ); + $page->doPurge(); $r['purged'] = true; } else { $this->addWarning( 'apierror-ratelimited' ); @@ -176,6 +176,6 @@ class ApiPurge extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Purge'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Purge'; } } diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index 8196cfa2bb..e6f3fc45f7 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -24,6 +24,8 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; + /** * This is the main query class. It behaves similar to ApiMain: based on the * parameters given, it will create a list of titles to work on (an ApiPageSet @@ -168,7 +170,7 @@ class ApiQuery extends ApiBase { * @param string $name Name to assign to the database connection * @param int $db One of the DB_* constants * @param array $groups Query groups - * @return Database + * @return IDatabase */ public function getNamedDB( $name, $db, $groups ) { if ( !array_key_exists( $name, $this->mNamedDB ) ) { @@ -536,10 +538,10 @@ class ApiQuery extends ApiBase { public function getHelpUrls() { return [ - 'https://www.mediawiki.org/wiki/API:Query', - 'https://www.mediawiki.org/wiki/API:Meta', - 'https://www.mediawiki.org/wiki/API:Properties', - 'https://www.mediawiki.org/wiki/API:Lists', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Query', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Meta', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Properties', + 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Lists', ]; } } diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php index 614b06c0b5..aa89158f90 100644 --- a/includes/api/ApiQueryAllCategories.php +++ b/includes/api/ApiQueryAllCategories.php @@ -200,6 +200,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allcategories'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allcategories'; } } diff --git a/includes/api/ApiQueryAllDeletedRevisions.php b/includes/api/ApiQueryAllDeletedRevisions.php index 020df6d508..b22bb1ff15 100644 --- a/includes/api/ApiQueryAllDeletedRevisions.php +++ b/includes/api/ApiQueryAllDeletedRevisions.php @@ -2,7 +2,7 @@ /** * Created on Oct 3, 2014 * - * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org" + * Copyright © 2014 Wikimedia Foundation and contributors * * Heavily based on ApiQueryDeletedrevs, * Copyright © 2007 Roan Kattouw ".@gmail.com" @@ -455,6 +455,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Alldeletedrevisions'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Alldeletedrevisions'; } } diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php index ef6bb6ad99..250bee667f 100644 --- a/includes/api/ApiQueryAllImages.php +++ b/includes/api/ApiQueryAllImages.php @@ -26,6 +26,8 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; + /** * Query module to enumerate all available pages. * @@ -85,6 +87,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { $db = $this->getDB(); $params = $this->extractRequestParams(); + $userId = !is_null( $params['user'] ) ? User::idFromName( $params['user'] ) : null; // Table and return fields $this->addTables( 'image' ); @@ -189,7 +192,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { // Image filters if ( !is_null( $params['user'] ) ) { - $this->addWhereFld( 'img_user_text', $params['user'] ); + if ( $userId ) { + $this->addWhereFld( 'img_user', $userId ); + } else { + $this->addWhereFld( 'img_user_text', $params['user'] ); + } } if ( $params['filterbots'] != 'all' ) { $this->addTables( 'user_groups' ); @@ -198,9 +205,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { [ 'ug_group' => User::getGroupsWithPermission( 'bot' ), 'ug_user = img_user', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' ); @@ -269,7 +274,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { if ( $params['sort'] == 'timestamp' ) { $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag ); if ( !is_null( $params['user'] ) ) { - $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] ); + if ( $userId ) { + $this->addOption( 'USE INDEX', [ 'image' => 'img_user_timestamp' ] ); + } else { + $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] ); + } } else { $this->addOption( 'USE INDEX', [ 'image' => 'img_timestamp' ] ); } @@ -417,6 +426,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allimages'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allimages'; } } diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php index 3b24e37409..9d6bf46325 100644 --- a/includes/api/ApiQueryAllLinks.php +++ b/includes/api/ApiQueryAllLinks.php @@ -308,6 +308,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { public function getHelpUrls() { $name = ucfirst( $this->getModuleName() ); - return "https://www.mediawiki.org/wiki/API:{$name}"; + return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}"; } } diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php index 244effc523..271d281124 100644 --- a/includes/api/ApiQueryAllMessages.php +++ b/includes/api/ApiQueryAllMessages.php @@ -256,6 +256,6 @@ class ApiQueryAllMessages extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allmessages'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allmessages'; } } diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php index 7460bd5377..315def049b 100644 --- a/includes/api/ApiQueryAllPages.php +++ b/includes/api/ApiQueryAllPages.php @@ -76,10 +76,13 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { $this->addWhere( "page_title $op= $cont_from" ); } - if ( $params['filterredir'] == 'redirects' ) { - $this->addWhereFld( 'page_is_redirect', 1 ); - } elseif ( $params['filterredir'] == 'nonredirects' ) { - $this->addWhereFld( 'page_is_redirect', 0 ); + $miserMode = $this->getConfig()->get( 'MiserMode' ); + if ( !$miserMode ) { + if ( $params['filterredir'] == 'redirects' ) { + $this->addWhereFld( 'page_is_redirect', 1 ); + } elseif ( $params['filterredir'] == 'nonredirects' ) { + $this->addWhereFld( 'page_is_redirect', 0 ); + } } $this->addWhereFld( 'page_namespace', $params['namespace'] ); @@ -108,6 +111,18 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { $selectFields = $resultPageSet->getPageTableFields(); } + $miserModeFilterRedirValue = null; + $miserModeFilterRedir = $miserMode && $params['filterredir'] !== 'all'; + if ( $miserModeFilterRedir ) { + $selectFields[] = 'page_is_redirect'; + + if ( $params['filterredir'] == 'redirects' ) { + $miserModeFilterRedirValue = 1; + } elseif ( $params['filterredir'] == 'nonredirects' ) { + $miserModeFilterRedirValue = 0; + } + } + $this->addFields( $selectFields ); $forceNameTitleIndex = true; if ( isset( $params['minsize'] ) ) { @@ -219,6 +234,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { break; } + if ( $miserModeFilterRedir && (int)$row->page_is_redirect !== $miserModeFilterRedirValue ) { + // Filter implemented in PHP due to being in Miser Mode + continue; + } + if ( is_null( $resultPageSet ) ) { $title = Title::makeTitle( $row->page_namespace, $row->page_title ); $vals = [ @@ -242,7 +262,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { } public function getAllowedParams() { - return [ + $ret = [ 'from' => null, 'continue' => [ ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', @@ -314,6 +334,12 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { ApiBase::PARAM_DFLT => 'all' ], ]; + + if ( $this->getConfig()->get( 'MiserMode' ) ) { + $ret['filterredir'][ApiBase::PARAM_HELP_MSG_APPEND] = [ 'api-help-param-limited-in-miser-mode' ]; + } + + return $ret; } protected function getExamplesMessages() { @@ -329,6 +355,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allpages'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allpages'; } } diff --git a/includes/api/ApiQueryAllRevisions.php b/includes/api/ApiQueryAllRevisions.php index 7b43efcaf0..8f7d6eb28f 100644 --- a/includes/api/ApiQueryAllRevisions.php +++ b/includes/api/ApiQueryAllRevisions.php @@ -2,7 +2,7 @@ /** * Created on Sep 27, 2015 * - * Copyright © 2015 Brad Jorsch "bjorsch@wikimedia.org" + * Copyright © 2015 Wikimedia Foundation and contributors * * 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 @@ -290,6 +290,6 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allrevisions'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allrevisions'; } } diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index 9e7ad67068..fd95e1785a 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.php @@ -122,9 +122,7 @@ class ApiQueryAllUsers extends ApiQueryBase { [ 'ug1.ug_user=user_id', 'ug1.ug_group' => $params['group'], - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); @@ -147,9 +145,7 @@ class ApiQueryAllUsers extends ApiQueryBase { $this->addJoinConds( [ 'ug1' => [ 'LEFT OUTER JOIN', array_merge( [ 'ug1.ug_user=user_id', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ], $exclude ) ] ] ); $this->addWhere( 'ug1.ug_user IS NULL' ); @@ -165,9 +161,7 @@ class ApiQueryAllUsers extends ApiQueryBase { $this->addFields( [ 'groups' => $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', [ 'ug_user=user_id', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ) ] ); } @@ -395,6 +389,6 @@ class ApiQueryAllUsers extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Allusers'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allusers'; } } diff --git a/includes/api/ApiQueryAuthManagerInfo.php b/includes/api/ApiQueryAuthManagerInfo.php index 661ec5ab64..d23d8988f3 100644 --- a/includes/api/ApiQueryAuthManagerInfo.php +++ b/includes/api/ApiQueryAuthManagerInfo.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -127,6 +127,6 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Authmanagerinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Authmanagerinfo'; } } diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php index b3ac606fa9..56cbaac3c1 100644 --- a/includes/api/ApiQueryBacklinks.php +++ b/includes/api/ApiQueryBacklinks.php @@ -59,19 +59,19 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase { 'code' => 'bl', 'prefix' => 'pl', 'linktbl' => 'pagelinks', - 'helpurl' => 'https://www.mediawiki.org/wiki/API:Backlinks', + 'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Backlinks', ], 'embeddedin' => [ 'code' => 'ei', 'prefix' => 'tl', 'linktbl' => 'templatelinks', - 'helpurl' => 'https://www.mediawiki.org/wiki/API:Embeddedin', + 'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Embeddedin', ], 'imageusage' => [ 'code' => 'iu', 'prefix' => 'il', 'linktbl' => 'imagelinks', - 'helpurl' => 'https://www.mediawiki.org/wiki/API:Imageusage', + 'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageusage', ] ]; diff --git a/includes/api/ApiQueryBacklinksprop.php b/includes/api/ApiQueryBacklinksprop.php index 4ed7f52b26..1db15f87e8 100644 --- a/includes/api/ApiQueryBacklinksprop.php +++ b/includes/api/ApiQueryBacklinksprop.php @@ -4,7 +4,7 @@ * * Created on Aug 19, 2014 * - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 @@ -432,6 +432,6 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase { public function getHelpUrls() { $name = ucfirst( $this->getModuleName() ); - return "https://www.mediawiki.org/wiki/API:{$name}"; + return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}"; } } diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php index 87bb6a79d0..44526e88b1 100644 --- a/includes/api/ApiQueryBase.php +++ b/includes/api/ApiQueryBase.php @@ -24,6 +24,7 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\ResultWrapper; /** @@ -105,7 +106,7 @@ abstract class ApiQueryBase extends ApiBase { /** * Get the Query database connection (read-only) - * @return Database + * @return IDatabase */ protected function getDB() { if ( is_null( $this->mDb ) ) { @@ -121,7 +122,7 @@ abstract class ApiQueryBase extends ApiBase { * @param string $name Name to assign to the database connection * @param int $db One of the DB_* constants * @param array $groups Query groups - * @return Database + * @return IDatabase */ public function selectNamedDB( $name, $db, $groups ) { $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups ); @@ -355,7 +356,6 @@ abstract class ApiQueryBase extends ApiBase { * @return ResultWrapper */ protected function select( $method, $extraQuery = [], array &$hookData = null ) { - $tables = array_merge( $this->tables, isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : [] @@ -478,7 +478,7 @@ abstract class ApiQueryBase extends ApiBase { /** * Add information (title and namespace) about a Title object to a * result array - * @param array $arr Result array à la ApiResult + * @param array &$arr Result array à la ApiResult * @param Title $title * @param string $prefix Module prefix */ diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php index 004086059c..076a09efdf 100644 --- a/includes/api/ApiQueryBlocks.php +++ b/includes/api/ApiQueryBlocks.php @@ -335,6 +335,6 @@ class ApiQueryBlocks extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Blocks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Blocks'; } } diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php index f2498cae20..c4428d575a 100644 --- a/includes/api/ApiQueryCategories.php +++ b/includes/api/ApiQueryCategories.php @@ -227,6 +227,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Categories'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categories'; } } diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php index 3416240780..2a3bf38718 100644 --- a/includes/api/ApiQueryCategoryInfo.php +++ b/includes/api/ApiQueryCategoryInfo.php @@ -115,6 +115,6 @@ class ApiQueryCategoryInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Categoryinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categoryinfo'; } } diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php index 3a8847c339..c570ec997e 100644 --- a/includes/api/ApiQueryCategoryMembers.php +++ b/includes/api/ApiQueryCategoryMembers.php @@ -391,6 +391,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Categorymembers'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categorymembers'; } } diff --git a/includes/api/ApiQueryContributors.php b/includes/api/ApiQueryContributors.php index 148e315a3d..f802d9ef8c 100644 --- a/includes/api/ApiQueryContributors.php +++ b/includes/api/ApiQueryContributors.php @@ -4,7 +4,7 @@ * * Created on Nov 14, 2013 * - * Copyright © 2013 Brad Jorsch + * Copyright © 2013 Wikimedia Foundation and contributors * * 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 @@ -163,9 +163,7 @@ class ApiQueryContributors extends ApiQueryBase { [ 'ug_user=rev_user', 'ug_group' => $limitGroups, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); $this->addWhereIf( 'ug_user IS NULL', $excludeGroups ); @@ -256,6 +254,6 @@ class ApiQueryContributors extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Contributors'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Contributors'; } } diff --git a/includes/api/ApiQueryDeletedRevisions.php b/includes/api/ApiQueryDeletedRevisions.php index 471aed6427..8e4752e8cf 100644 --- a/includes/api/ApiQueryDeletedRevisions.php +++ b/includes/api/ApiQueryDeletedRevisions.php @@ -2,7 +2,7 @@ /** * Created on Oct 3, 2014 * - * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org" + * Copyright © 2014 Wikimedia Foundation and contributors * * Heavily based on ApiQueryDeletedrevs, * Copyright © 2007 Roan Kattouw ".@gmail.com" @@ -288,6 +288,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Deletedrevisions'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevisions'; } } diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php index 295915120f..b68a8682c5 100644 --- a/includes/api/ApiQueryDeletedrevs.php +++ b/includes/api/ApiQueryDeletedrevs.php @@ -250,7 +250,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $this->addOption( 'LIMIT', $limit + 1 ); $this->addOption( 'USE INDEX', - [ 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ] + [ 'archive' => ( $mode == 'user' ? 'ar_usertext_timestamp' : 'name_title_timestamp' ) ] ); if ( $mode == 'all' ) { if ( $params['unique'] ) { @@ -505,6 +505,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Deletedrevs'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevs'; } } diff --git a/includes/api/ApiQueryDisabled.php b/includes/api/ApiQueryDisabled.php index 9476066dfc..a94af695b6 100644 --- a/includes/api/ApiQueryDisabled.php +++ b/includes/api/ApiQueryDisabled.php @@ -45,6 +45,14 @@ class ApiQueryDisabled extends ApiQueryBase { } public function getDescriptionMessage() { - return 'apihelp-query+disabled-description'; + return 'apihelp-query+disabled-summary'; + } + + public function getSummaryMessage() { + return 'apihelp-query+disabled-summary'; + } + + public function getExtendedDescription() { + return 'apihelp-query+disabled-extended-description'; } } diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php index 02b7883d7b..2ebd6de7d6 100644 --- a/includes/api/ApiQueryDuplicateFiles.php +++ b/includes/api/ApiQueryDuplicateFiles.php @@ -189,6 +189,6 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Duplicatefiles'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Duplicatefiles'; } } diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php index 9b055377ef..6c29b6030f 100644 --- a/includes/api/ApiQueryExtLinksUsage.php +++ b/includes/api/ApiQueryExtLinksUsage.php @@ -230,6 +230,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Exturlusage'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Exturlusage'; } } diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php index 8c9c887ae5..71fd6d1b4b 100644 --- a/includes/api/ApiQueryExternalLinks.php +++ b/includes/api/ApiQueryExternalLinks.php @@ -134,6 +134,6 @@ class ApiQueryExternalLinks extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Extlinks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Extlinks'; } } diff --git a/includes/api/ApiQueryFileRepoInfo.php b/includes/api/ApiQueryFileRepoInfo.php index c4912366c4..4589991191 100644 --- a/includes/api/ApiQueryFileRepoInfo.php +++ b/includes/api/ApiQueryFileRepoInfo.php @@ -111,6 +111,6 @@ class ApiQueryFileRepoInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Filerepoinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filerepoinfo'; } } diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php index 116dbb3d34..7383cba6cb 100644 --- a/includes/api/ApiQueryFilearchive.php +++ b/includes/api/ApiQueryFilearchive.php @@ -292,6 +292,6 @@ class ApiQueryFilearchive extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Filearchive'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filearchive'; } } diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php index 6e2fb67b8d..a10ba164a2 100644 --- a/includes/api/ApiQueryIWBacklinks.php +++ b/includes/api/ApiQueryIWBacklinks.php @@ -215,6 +215,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Iwbacklinks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwbacklinks'; } } diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php index cfd990b213..9313af30ef 100644 --- a/includes/api/ApiQueryIWLinks.php +++ b/includes/api/ApiQueryIWLinks.php @@ -194,6 +194,6 @@ class ApiQueryIWLinks extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Iwlinks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwlinks'; } } diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php index e5e45b3b5a..7b0080eb23 100644 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -677,7 +677,7 @@ class ApiQueryImageInfo extends ApiQueryBase { ApiBase::PARAM_DFLT => -1, ApiBase::PARAM_HELP_MSG => [ 'apihelp-query+imageinfo-param-urlwidth', - ApiQueryImageInfo::TRANSFORM_LIMIT, + self::TRANSFORM_LIMIT, ], ], 'urlheight' => [ @@ -767,30 +767,30 @@ class ApiQueryImageInfo extends ApiQueryBase { */ private static function getProperties( $modulePrefix = '' ) { return [ - 'timestamp' => ' timestamp - Adds timestamp for the uploaded version', - 'user' => ' user - Adds the user who uploaded the image version', - 'userid' => ' userid - Add the user ID that uploaded the image version', - 'comment' => ' comment - Comment on the version', - 'parsedcomment' => ' parsedcomment - Parse the comment on the version', + 'timestamp' => ' timestamp - Adds timestamp for the uploaded version', + 'user' => ' user - Adds the user who uploaded the image version', + 'userid' => ' userid - Add the user ID that uploaded the image version', + 'comment' => ' comment - Comment on the version', + 'parsedcomment' => ' parsedcomment - Parse the comment on the version', 'canonicaltitle' => ' canonicaltitle - Adds the canonical title of the image file', - 'url' => ' url - Gives URL to the image and the description page', - 'size' => ' size - Adds the size of the image in bytes, ' . + 'url' => ' url - Gives URL to the image and the description page', + 'size' => ' size - Adds the size of the image in bytes, ' . 'its height and its width. Page count and duration are added if applicable', - 'dimensions' => ' dimensions - Alias for size', // B/C with Allimages - 'sha1' => ' sha1 - Adds SHA-1 hash for the image', - 'mime' => ' mime - Adds MIME type of the image', - 'thumbmime' => ' thumbmime - Adds MIME type of the image thumbnail' . + 'dimensions' => ' dimensions - Alias for size', // B/C with Allimages + 'sha1' => ' sha1 - Adds SHA-1 hash for the image', + 'mime' => ' mime - Adds MIME type of the image', + 'thumbmime' => ' thumbmime - Adds MIME type of the image thumbnail' . ' (requires url and param ' . $modulePrefix . 'urlwidth)', - 'mediatype' => ' mediatype - Adds the media type of the image', - 'metadata' => ' metadata - Lists Exif metadata for the version of the image', + 'mediatype' => ' mediatype - Adds the media type of the image', + 'metadata' => ' metadata - Lists Exif metadata for the version of the image', 'commonmetadata' => ' commonmetadata - Lists file format generic metadata ' . 'for the version of the image', - 'extmetadata' => ' extmetadata - Lists formatted metadata combined ' . + 'extmetadata' => ' extmetadata - Lists formatted metadata combined ' . 'from multiple sources. Results are HTML formatted.', - 'archivename' => ' archivename - Adds the file name of the archive ' . + 'archivename' => ' archivename - Adds the file name of the archive ' . 'version for non-latest versions', - 'bitdepth' => ' bitdepth - Adds the bit depth of the version', - 'uploadwarning' => ' uploadwarning - Used by the Special:Upload page to ' . + 'bitdepth' => ' bitdepth - Adds the bit depth of the version', + 'uploadwarning' => ' uploadwarning - Used by the Special:Upload page to ' . 'get information about an existing file. Not intended for use outside MediaWiki core', ]; } @@ -821,6 +821,6 @@ class ApiQueryImageInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Imageinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageinfo'; } } diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php index ae6f5bf564..0086c58a93 100644 --- a/includes/api/ApiQueryImages.php +++ b/includes/api/ApiQueryImages.php @@ -172,6 +172,6 @@ class ApiQueryImages extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Images'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Images'; } } diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index e789dd4fb5..ecdebd4dd9 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -128,7 +128,7 @@ class ApiQueryInfo extends ApiQueryBase { * @deprecated since 1.24 */ public static function resetTokenCache() { - ApiQueryInfo::$cachedTokens = []; + self::$cachedTokens = []; } /** @@ -144,11 +144,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['edit'] ) ) { - ApiQueryInfo::$cachedTokens['edit'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['edit'] ) ) { + self::$cachedTokens['edit'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['edit']; + return self::$cachedTokens['edit']; } /** @@ -161,11 +161,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['delete'] ) ) { - ApiQueryInfo::$cachedTokens['delete'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['delete'] ) ) { + self::$cachedTokens['delete'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['delete']; + return self::$cachedTokens['delete']; } /** @@ -178,11 +178,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['protect'] ) ) { - ApiQueryInfo::$cachedTokens['protect'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['protect'] ) ) { + self::$cachedTokens['protect'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['protect']; + return self::$cachedTokens['protect']; } /** @@ -195,11 +195,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['move'] ) ) { - ApiQueryInfo::$cachedTokens['move'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['move'] ) ) { + self::$cachedTokens['move'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['move']; + return self::$cachedTokens['move']; } /** @@ -212,11 +212,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['block'] ) ) { - ApiQueryInfo::$cachedTokens['block'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['block'] ) ) { + self::$cachedTokens['block'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['block']; + return self::$cachedTokens['block']; } /** @@ -237,11 +237,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['email'] ) ) { - ApiQueryInfo::$cachedTokens['email'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['email'] ) ) { + self::$cachedTokens['email'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['email']; + return self::$cachedTokens['email']; } /** @@ -254,11 +254,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['import'] ) ) { - ApiQueryInfo::$cachedTokens['import'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['import'] ) ) { + self::$cachedTokens['import'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['import']; + return self::$cachedTokens['import']; } /** @@ -271,11 +271,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['watch'] ) ) { - ApiQueryInfo::$cachedTokens['watch'] = $wgUser->getEditToken( 'watch' ); + if ( !isset( self::$cachedTokens['watch'] ) ) { + self::$cachedTokens['watch'] = $wgUser->getEditToken( 'watch' ); } - return ApiQueryInfo::$cachedTokens['watch']; + return self::$cachedTokens['watch']; } /** @@ -288,11 +288,11 @@ class ApiQueryInfo extends ApiQueryBase { } // The token is always the same, let's exploit that - if ( !isset( ApiQueryInfo::$cachedTokens['options'] ) ) { - ApiQueryInfo::$cachedTokens['options'] = $wgUser->getEditToken(); + if ( !isset( self::$cachedTokens['options'] ) ) { + self::$cachedTokens['options'] = $wgUser->getEditToken(); } - return ApiQueryInfo::$cachedTokens['options']; + return self::$cachedTokens['options']; } public function execute() { @@ -766,7 +766,7 @@ class ApiQueryInfo extends ApiQueryBase { if ( $this->fld_watched ) { foreach ( $timestamps as $namespaceId => $dbKeys ) { $this->watched[$namespaceId] = array_map( - function( $x ) { + function ( $x ) { return $x !== false; }, $dbKeys @@ -847,7 +847,7 @@ class ApiQueryInfo extends ApiQueryBase { $timestamps[$row->page_namespace][$row->page_title] = $revTimestamp - $age; } $titlesWithThresholds = array_map( - function( LinkTarget $target ) use ( $timestamps ) { + function ( LinkTarget $target ) use ( $timestamps ) { return [ $target, $timestamps[$target->getNamespace()][$target->getDBkey()] ]; @@ -860,7 +860,7 @@ class ApiQueryInfo extends ApiQueryBase { $titlesWithThresholds = array_merge( $titlesWithThresholds, array_map( - function( LinkTarget $target ) { + function ( LinkTarget $target ) { return [ $target, null ]; }, $this->missing @@ -946,6 +946,6 @@ class ApiQueryInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Info'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Info'; } } diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php index 8d5b5f3ea6..fd67d7c464 100644 --- a/includes/api/ApiQueryLangBacklinks.php +++ b/includes/api/ApiQueryLangBacklinks.php @@ -214,6 +214,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Langbacklinks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langbacklinks'; } } diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php index 55e3c85265..df33d02724 100644 --- a/includes/api/ApiQueryLangLinks.php +++ b/includes/api/ApiQueryLangLinks.php @@ -190,6 +190,6 @@ class ApiQueryLangLinks extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Langlinks'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langlinks'; } } diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php index 4556e29062..3639c06dbc 100644 --- a/includes/api/ApiQueryLinks.php +++ b/includes/api/ApiQueryLinks.php @@ -34,7 +34,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { const LINKS = 'links'; const TEMPLATES = 'templates'; - private $table, $prefix, $helpUrl; + private $table, $prefix, $titlesParam, $helpUrl; public function __construct( ApiQuery $query, $moduleName ) { switch ( $moduleName ) { @@ -42,13 +42,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase { $this->table = 'pagelinks'; $this->prefix = 'pl'; $this->titlesParam = 'titles'; - $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Links'; + $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Links'; break; case self::TEMPLATES: $this->table = 'templatelinks'; $this->prefix = 'tl'; $this->titlesParam = 'templates'; - $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Templates'; + $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Templates'; break; default: ApiBase::dieDebug( __METHOD__, 'Unknown module name' ); diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php index 8a13fef9fa..3e8bccc74d 100644 --- a/includes/api/ApiQueryLogEvents.php +++ b/includes/api/ApiQueryLogEvents.php @@ -242,7 +242,7 @@ class ApiQueryLogEvents extends ApiQueryBase { /** * @deprecated since 1.25 Use LogFormatter::formatParametersForApi instead * @param ApiResult $result - * @param array $vals + * @param array &$vals * @param string $params * @param string $type * @param string $action @@ -467,6 +467,6 @@ class ApiQueryLogEvents extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Logevents'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logevents'; } } diff --git a/includes/api/ApiQueryMyStashedFiles.php b/includes/api/ApiQueryMyStashedFiles.php index 1324f2ff49..457f6c6e5c 100644 --- a/includes/api/ApiQueryMyStashedFiles.php +++ b/includes/api/ApiQueryMyStashedFiles.php @@ -145,6 +145,6 @@ class ApiQueryMyStashedFiles extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:mystashedfiles'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:mystashedfiles'; } } diff --git a/includes/api/ApiQueryPagePropNames.php b/includes/api/ApiQueryPagePropNames.php index fc50b5067e..2d56983c61 100644 --- a/includes/api/ApiQueryPagePropNames.php +++ b/includes/api/ApiQueryPagePropNames.php @@ -2,7 +2,7 @@ /** * Created on January 21, 2013 * - * Copyright © 2013 Brad Jorsch + * Copyright © 2013 Wikimedia Foundation and contributors * * 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 @@ -21,7 +21,6 @@ * * @file * @since 1.21 - * @author Brad Jorsch */ /** @@ -57,7 +56,11 @@ class ApiQueryPagePropNames extends ApiQueryBase { } $limit = $params['limit']; - $this->addOption( 'LIMIT', $limit + 1 ); + + // mysql has issues with limit in loose index T115825 + if ( $this->getDB()->getType() !== 'mysql' ) { + $this->addOption( 'LIMIT', $limit + 1 ); + } $result = $this->getResult(); $count = 0; @@ -104,6 +107,6 @@ class ApiQueryPagePropNames extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Pagepropnames'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pagepropnames'; } } diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php index de1df34770..e49dfbcf1d 100644 --- a/includes/api/ApiQueryPageProps.php +++ b/includes/api/ApiQueryPageProps.php @@ -120,6 +120,6 @@ class ApiQueryPageProps extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Pageprops'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageprops'; } } diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php index f1f4d9a453..97f79b66df 100644 --- a/includes/api/ApiQueryPagesWithProp.php +++ b/includes/api/ApiQueryPagesWithProp.php @@ -2,7 +2,7 @@ /** * Created on December 31, 2012 * - * Copyright © 2012 Brad Jorsch + * Copyright © 2012 Wikimedia Foundation and contributors * * 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 @@ -21,7 +21,6 @@ * * @file * @since 1.21 - * @author Brad Jorsch */ /** @@ -173,6 +172,6 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Pageswithprop'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageswithprop'; } } diff --git a/includes/api/ApiQueryPrefixSearch.php b/includes/api/ApiQueryPrefixSearch.php index 3bf6d3fe4b..2fbc518b1e 100644 --- a/includes/api/ApiQueryPrefixSearch.php +++ b/includes/api/ApiQueryPrefixSearch.php @@ -54,7 +54,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase { $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) ); if ( $resultPageSet ) { - $resultPageSet->setRedirectMergePolicy( function( array $current, array $new ) { + $resultPageSet->setRedirectMergePolicy( function ( array $current, array $new ) { if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) { $current['index'] = $new['index']; } @@ -127,6 +127,6 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Prefixsearch'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Prefixsearch'; } } diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php index 62b2e42e03..5f6510ea28 100644 --- a/includes/api/ApiQueryProtectedTitles.php +++ b/includes/api/ApiQueryProtectedTitles.php @@ -234,6 +234,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Protectedtitles'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protectedtitles'; } } diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php index 908cdee667..caa5f05743 100644 --- a/includes/api/ApiQueryQueryPage.php +++ b/includes/api/ApiQueryQueryPage.php @@ -166,6 +166,6 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Querypage'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Querypage'; } } diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php index 00bd467cab..ce62226fc6 100644 --- a/includes/api/ApiQueryRandom.php +++ b/includes/api/ApiQueryRandom.php @@ -48,7 +48,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { * @param ApiPageSet|null $resultPageSet * @param int $limit Number of pages to fetch * @param string|null $start Starting page_random - * @param int|null $startId Starting page_id + * @param int $startId Starting page_id * @param string|null $end Ending page_random * @return array (int, string|null) Number of pages left to query and continuation string */ @@ -75,8 +75,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { if ( $start !== null ) { $start = $this->getDB()->addQuotes( $start ); - if ( $startId !== null ) { - $startId = (int)$startId; + if ( $startId > 0 ) { + $startId = (int)$startId; // safety $this->addWhere( "page_random = $start AND page_id >= $startId OR page_random > $start" ); } else { $this->addWhere( "page_random >= $start" ); @@ -144,10 +144,19 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { } else { $rand = wfRandom(); $start = $rand; - $startId = null; + $startId = 0; $end = null; } + // Set the non-continue if this is being used as a generator + // (as a list it doesn't matter because lists never non-continue) + if ( $resultPageSet !== null ) { + $endFlag = $end === null ? 0 : 1; + $this->getContinuationManager()->addGeneratorNonContinueParam( + $this, 'continue', "$rand|$start|$startId|$endFlag" + ); + } + list( $left, $continue ) = $this->runQuery( $resultPageSet, $params['limit'], $start, $startId, $end ); if ( $end === null && $continue === null ) { @@ -209,6 +218,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Random'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Random'; } } diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php index 26581a62d8..0dc01aabc2 100644 --- a/includes/api/ApiQueryRecentChanges.php +++ b/includes/api/ApiQueryRecentChanges.php @@ -699,6 +699,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Recentchanges'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Recentchanges'; } } diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index c47de9d8ce..a4f0315e9f 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -218,10 +218,75 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { ); } - $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'], - $params['start'], $params['end'] ); - $this->addWhereRange( 'rev_id', $params['dir'], - $params['startid'], $params['endid'] ); + // Convert startid/endid to timestamps (T163532) + $revids = []; + if ( $params['startid'] !== null ) { + $revids[] = (int)$params['startid']; + } + if ( $params['endid'] !== null ) { + $revids[] = (int)$params['endid']; + } + if ( $revids ) { + $db = $this->getDB(); + $sql = $db->unionQueries( [ + $db->selectSQLText( + 'revision', + [ 'id' => 'rev_id', 'ts' => 'rev_timestamp' ], + [ 'rev_id' => $revids ], + __METHOD__ + ), + $db->selectSQLText( + 'archive', + [ 'id' => 'ar_rev_id', 'ts' => 'ar_timestamp' ], + [ 'ar_rev_id' => $revids ], + __METHOD__ + ), + ], false ); + $res = $db->query( $sql, __METHOD__ ); + foreach ( $res as $row ) { + if ( (int)$row->id === (int)$params['startid'] ) { + $params['start'] = $row->ts; + } + if ( (int)$row->id === (int)$params['endid'] ) { + $params['end'] = $row->ts; + } + } + if ( $params['startid'] !== null && $params['start'] === null ) { + $p = $this->encodeParamName( 'startid' ); + $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" ); + } + if ( $params['endid'] !== null && $params['end'] === null ) { + $p = $this->encodeParamName( 'endid' ); + $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" ); + } + + if ( $params['start'] !== null ) { + $op = ( $params['dir'] === 'newer' ? '>' : '<' ); + $ts = $db->addQuotes( $db->timestampOrNull( $params['start'] ) ); + if ( $params['startid'] !== null ) { + $this->addWhere( "rev_timestamp $op $ts OR " + . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['startid'] ) ); + } else { + $this->addWhere( "rev_timestamp $op= $ts" ); + } + } + if ( $params['end'] !== null ) { + $op = ( $params['dir'] === 'newer' ? '<' : '>' ); // Yes, opposite of the above + $ts = $db->addQuotes( $db->timestampOrNull( $params['end'] ) ); + if ( $params['endid'] !== null ) { + $this->addWhere( "rev_timestamp $op $ts OR " + . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['endid'] ) ); + } else { + $this->addWhere( "rev_timestamp $op= $ts" ); + } + } + } else { + $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'], + $params['start'], $params['end'] ); + } + + $sort = ( $params['dir'] === 'newer' ? '' : 'DESC' ); + $this->addOption( 'ORDER BY', [ "rev_timestamp $sort", "rev_id $sort" ] ); // There is only one ID, use it $ids = array_keys( $pageSet->getGoodTitles() ); @@ -447,6 +512,6 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Revisions'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisions'; } } diff --git a/includes/api/ApiQueryRevisionsBase.php b/includes/api/ApiQueryRevisionsBase.php index 696ec87867..2ffd02488b 100644 --- a/includes/api/ApiQueryRevisionsBase.php +++ b/includes/api/ApiQueryRevisionsBase.php @@ -104,6 +104,17 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase { $this->fld_tags = isset( $prop['tags'] ); $this->fld_parsetree = isset( $prop['parsetree'] ); + if ( $this->fld_parsetree ) { + $encParam = $this->encodeParamName( 'prop' ); + $name = $this->getModuleName(); + $parent = $this->getParent(); + $parentParam = $parent->encodeParamName( $parent->getModuleManager()->getModuleGroup( $name ) ); + $this->addDeprecation( + [ 'apiwarn-deprecation-parameter', "{$encParam}=parsetree" ], + "action=query&{$parentParam}={$name}&{$encParam}=parsetree" + ); + } + if ( !empty( $params['contentformat'] ) ) { $this->contentFormat = $params['contentformat']; } @@ -477,6 +488,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase { 'expandtemplates' => [ ApiBase::PARAM_DFLT => false, ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-expandtemplates', + ApiBase::PARAM_DEPRECATED => true, ], 'generatexml' => [ ApiBase::PARAM_DFLT => false, @@ -486,19 +498,23 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase { 'parse' => [ ApiBase::PARAM_DFLT => false, ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-parse', + ApiBase::PARAM_DEPRECATED => true, ], 'section' => [ ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-section', ], 'diffto' => [ ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-diffto', + ApiBase::PARAM_DEPRECATED => true, ], 'difftotext' => [ ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotext', + ApiBase::PARAM_DEPRECATED => true, ], 'difftotextpst' => [ ApiBase::PARAM_DFLT => false, ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotextpst', + ApiBase::PARAM_DEPRECATED => true, ], 'contentformat' => [ ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(), diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php index 05b693d552..f0c4180069 100644 --- a/includes/api/ApiQuerySearch.php +++ b/includes/api/ApiQuerySearch.php @@ -62,18 +62,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { $searchInfo = array_flip( $params['info'] ); $prop = array_flip( $params['prop'] ); - // Deprecated parameters - if ( isset( $prop['hasrelated'] ) ) { - $this->addDeprecation( - [ 'apiwarn-deprecation-parameter', 'srprop=hasrelated' ], 'action=search&srprop=hasrelated' - ); - } - if ( isset( $prop['score'] ) ) { - $this->addDeprecation( - [ 'apiwarn-deprecation-parameter', 'srprop=score' ], 'action=search&srprop=score' - ); - } - // Create search engine instance and set options $search = $this->buildSearchEngine( $params ); $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] ); @@ -245,6 +233,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { $title = $result->getTitle(); ApiQueryBase::addTitleInfo( $vals, $title ); + $vals['pageid'] = $title->getArticleID(); if ( isset( $prop['size'] ) ) { $vals['size'] = $result->getByteSize(); @@ -386,6 +375,10 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { ], ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_HELP_MSG_PER_VALUE => [], + ApiBase::PARAM_DEPRECATED_VALUES => [ + 'score' => true, + 'hasrelated' => true + ], ], 'interwiki' => false, 'enablerewrites' => false, @@ -415,6 +408,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Search'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Search'; } } diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php index cc302dcebf..6b896c95ad 100644 --- a/includes/api/ApiQuerySiteinfo.php +++ b/includes/api/ApiQuerySiteinfo.php @@ -933,6 +933,6 @@ class ApiQuerySiteinfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Siteinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Siteinfo'; } } diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php index abb827fe4f..1924ca0339 100644 --- a/includes/api/ApiQueryStashImageInfo.php +++ b/includes/api/ApiQueryStashImageInfo.php @@ -123,6 +123,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Stashimageinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Stashimageinfo'; } } diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php index 43eb7e8066..1b154faecb 100644 --- a/includes/api/ApiQueryTags.php +++ b/includes/api/ApiQueryTags.php @@ -53,37 +53,24 @@ class ApiQueryTags extends ApiQueryBase { $softwareDefinedTags = array_fill_keys( ChangeTags::listSoftwareDefinedTags(), 0 ); $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 ); $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 ); + $tagStats = ChangeTags::tagUsageStatistics(); - $definedTags = array_merge( $softwareDefinedTags, $explicitlyDefinedTags ); + $tagHitcounts = array_merge( $softwareDefinedTags, $explicitlyDefinedTags, $tagStats ); + $tags = array_keys( $tagHitcounts ); # Fetch defined tags that aren't past the continuation if ( $params['continue'] !== null ) { $cont = $params['continue']; - $tags = array_filter( array_keys( $definedTags ), function ( $v ) use ( $cont ) { + $tags = array_filter( $tags, function ( $v ) use ( $cont ) { return $v >= $cont; } ); - $tags = array_fill_keys( $tags, 0 ); - } else { - $tags = $definedTags; - } - - # Merge in all used tags - $this->addTables( 'change_tag' ); - $this->addFields( 'ct_tag' ); - $this->addFields( [ 'hitcount' => $fld_hitcount ? 'COUNT(*)' : '0' ] ); - $this->addOption( 'LIMIT', $limit + 1 ); - $this->addOption( 'GROUP BY', 'ct_tag' ); - $this->addWhereRange( 'ct_tag', 'newer', $params['continue'], null ); - $res = $this->select( __METHOD__ ); - foreach ( $res as $row ) { - $tags[$row->ct_tag] = (int)$row->hitcount; } # Now make sure the array is sorted for proper continuation - ksort( $tags ); + sort( $tags ); $count = 0; - foreach ( $tags as $tagName => $hitcount ) { + foreach ( $tags as $tagName ) { if ( ++$count > $limit ) { $this->setContinueEnumParameter( 'continue', $tagName ); break; @@ -102,7 +89,7 @@ class ApiQueryTags extends ApiQueryBase { } if ( $fld_hitcount ) { - $tag['hitcount'] = $hitcount; + $tag['hitcount'] = intval( $tagHitcounts[$tagName] ); } $isSoftware = isset( $softwareDefinedTags[$tagName] ); @@ -178,6 +165,6 @@ class ApiQueryTags extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Tags'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tags'; } } diff --git a/includes/api/ApiQueryTokens.php b/includes/api/ApiQueryTokens.php index 5b700dbc9c..0e46fd0572 100644 --- a/includes/api/ApiQueryTokens.php +++ b/includes/api/ApiQueryTokens.php @@ -4,7 +4,7 @@ * * Created on August 8, 2014 * - * Copyright © 2014 Brad Jorsch bjorsch@wikimedia.org + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 @@ -131,6 +131,6 @@ class ApiQueryTokens extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Tokens'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tokens'; } } diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php index 31a9238001..181cddbeda 100644 --- a/includes/api/ApiQueryUserContributions.php +++ b/includes/api/ApiQueryUserContributions.php @@ -582,6 +582,6 @@ class ApiQueryContributions extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Usercontribs'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Usercontribs'; } } diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php index 04b0facd57..036515d6f5 100644 --- a/includes/api/ApiQueryUserInfo.php +++ b/includes/api/ApiQueryUserInfo.php @@ -182,17 +182,6 @@ class ApiQueryUserInfo extends ApiQueryBase { $vals['options'][ApiResult::META_BC_BOOLS] = array_keys( $vals['options'] ); } - if ( isset( $this->prop['preferencestoken'] ) ) { - $p = $this->getModulePrefix(); - $this->addDeprecation( - [ - 'apiwarn-deprecation-withreplacement', - "{$p}prop=preferencestoken", - 'action=query&meta=tokens', - ], - "meta=userinfo&{$p}prop=preferencestoken" - ); - } if ( isset( $this->prop['preferencestoken'] ) && !$this->lacksSameOriginSecurity() && $user->isAllowed( 'editmyoptions' ) @@ -320,7 +309,6 @@ class ApiQueryUserInfo extends ApiQueryBase { 'rights', 'changeablegroups', 'options', - 'preferencestoken', 'editcount', 'ratelimits', 'email', @@ -329,6 +317,7 @@ class ApiQueryUserInfo extends ApiQueryBase { 'registrationdate', 'unreadcount', 'centralids', + 'preferencestoken', ], ApiBase::PARAM_HELP_MSG_PER_VALUE => [ 'unreadcount' => [ @@ -337,6 +326,13 @@ class ApiQueryUserInfo extends ApiQueryBase { self::WL_UNREAD_LIMIT . '+', ], ], + ApiBase::PARAM_DEPRECATED_VALUES => [ + 'preferencestoken' => [ + 'apiwarn-deprecation-withreplacement', + $this->getModulePrefix() . "prop=preferencestoken", + 'action=query&meta=tokens', + ] + ], ], 'attachedwiki' => null, ]; @@ -352,6 +348,6 @@ class ApiQueryUserInfo extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Userinfo'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Userinfo'; } } diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php index 3a814c4c49..2a0eaddfb6 100644 --- a/includes/api/ApiQueryUsers.php +++ b/includes/api/ApiQueryUsers.php @@ -172,10 +172,8 @@ class ApiQueryUsers extends ApiQueryBase { $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] ); $this->addFields( [ 'user_name' ] ); $this->addFields( UserGroupMembership::selectFields() ); - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' . - $db->addQuotes( $db->timestamp() ) ); - } + $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' . + $db->addQuotes( $db->timestamp() ) ); $userGroupsRes = $this->select( __METHOD__ ); foreach ( $userGroupsRes as $row ) { @@ -184,7 +182,6 @@ class ApiQueryUsers extends ApiQueryBase { } foreach ( $res as $row ) { - // create user object and pass along $userGroups if set // that reduces the number of database queries needed in User dramatically if ( !isset( $userGroups ) ) { @@ -216,7 +213,7 @@ class ApiQueryUsers extends ApiQueryBase { } if ( isset( $this->prop['groupmemberships'] ) ) { - $data[$key]['groupmemberships'] = array_map( function( $ugm ) { + $data[$key]['groupmemberships'] = array_map( function ( $ugm ) { return [ 'group' => $ugm->getGroup(), 'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ), @@ -406,6 +403,6 @@ class ApiQueryUsers extends ApiQueryBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Users'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Users'; } } diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php index 3f597511a1..9883480500 100644 --- a/includes/api/ApiQueryWatchlist.php +++ b/includes/api/ApiQueryWatchlist.php @@ -179,7 +179,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { $watchedItemQuery = MediaWikiServices::getInstance()->getWatchedItemQueryService(); $items = $watchedItemQuery->getWatchedItemsWithRecentChangeInfo( $wlowner, $options, $startFrom ); - foreach ( $items as list ( $watchedItem, $recentChangeInfo ) ) { + foreach ( $items as list( $watchedItem, $recentChangeInfo ) ) { /** @var WatchedItem $watchedItem */ if ( is_null( $resultPageSet ) ) { $vals = $this->extractOutputData( $watchedItem, $recentChangeInfo ); @@ -475,7 +475,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => 'user' ], 'token' => [ - ApiBase::PARAM_TYPE => 'string' + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_SENSITIVE => true, ], 'continue' => [ ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', @@ -501,6 +502,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Watchlist'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist'; } } diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php index a1078a5d48..b0b1cde92b 100644 --- a/includes/api/ApiQueryWatchlistRaw.php +++ b/includes/api/ApiQueryWatchlistRaw.php @@ -170,7 +170,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => 'user' ], 'token' => [ - ApiBase::PARAM_TYPE => 'string' + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_SENSITIVE => true, ], 'dir' => [ ApiBase::PARAM_DFLT => 'ascending', @@ -198,6 +199,6 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Watchlistraw'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlistraw'; } } diff --git a/includes/api/ApiRemoveAuthenticationData.php b/includes/api/ApiRemoveAuthenticationData.php index 359d045fdd..e18484be2c 100644 --- a/includes/api/ApiRemoveAuthenticationData.php +++ b/includes/api/ApiRemoveAuthenticationData.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -106,6 +106,6 @@ class ApiRemoveAuthenticationData extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data'; } } diff --git a/includes/api/ApiResetPassword.php b/includes/api/ApiResetPassword.php index b5fa8ed859..77838269b4 100644 --- a/includes/api/ApiResetPassword.php +++ b/includes/api/ApiResetPassword.php @@ -1,6 +1,6 @@ + * Copyright © 2016 Wikimedia Foundation and contributors * * 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 @@ -43,11 +43,11 @@ class ApiResetPassword extends ApiBase { return $this->hasAnyRoutes; } - protected function getDescriptionMessage() { + protected function getExtendedDescription() { if ( !$this->hasAnyRoutes() ) { - return 'apihelp-resetpassword-description-noroutes'; + return 'apihelp-resetpassword-extended-description-noroutes'; } - return parent::getDescriptionMessage(); + return parent::getExtendedDescription(); } public function execute() { @@ -134,6 +134,6 @@ class ApiResetPassword extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data'; } } diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php index 6734740f77..468d8783b4 100644 --- a/includes/api/ApiResult.php +++ b/includes/api/ApiResult.php @@ -287,12 +287,12 @@ class ApiResult implements ApiSerializable { * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. */ public static function setValue( array &$arr, $name, $value, $flags = 0 ) { - if ( ( $flags & ApiResult::NO_VALIDATE ) !== ApiResult::NO_VALIDATE ) { + if ( ( $flags & self::NO_VALIDATE ) !== self::NO_VALIDATE ) { $value = self::validateValue( $value ); } if ( $name === null ) { - if ( $flags & ApiResult::ADD_ON_TOP ) { + if ( $flags & self::ADD_ON_TOP ) { array_unshift( $arr, $value ); } else { array_push( $arr, $value ); @@ -301,8 +301,8 @@ class ApiResult implements ApiSerializable { } $exists = isset( $arr[$name] ); - if ( !$exists || ( $flags & ApiResult::OVERRIDE ) ) { - if ( !$exists && ( $flags & ApiResult::ADD_ON_TOP ) ) { + if ( !$exists || ( $flags & self::OVERRIDE ) ) { + if ( !$exists && ( $flags & self::ADD_ON_TOP ) ) { $arr = [ $name => $value ] + $arr; } else { $arr[$name] = $value; @@ -403,13 +403,13 @@ class ApiResult implements ApiSerializable { * @since 1.21 int $flags replaced boolean $override */ public function addValue( $path, $name, $value, $flags = 0 ) { - $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' ); + $arr = &$this->path( $path, ( $flags & self::ADD_ON_TOP ) ? 'prepend' : 'append' ); - if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) { + if ( $this->checkingSize && !( $flags & self::NO_SIZE_CHECK ) ) { // self::size needs the validated value. Then flag // to not re-validate later. $value = self::validateValue( $value ); - $flags |= ApiResult::NO_VALIDATE; + $flags |= self::NO_VALIDATE; $newsize = $this->size + self::size( $value ); if ( $this->maxSize !== false && $newsize > $this->maxSize ) { @@ -459,7 +459,7 @@ class ApiResult implements ApiSerializable { $name = array_pop( $path ); } $ret = self::unsetValue( $this->path( $path, 'dummy' ), $name ); - if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) { + if ( $this->checkingSize && !( $flags & self::NO_SIZE_CHECK ) ) { $newsize = $this->size - self::size( $ret ); $this->size = max( $newsize, 0 ); } @@ -511,7 +511,7 @@ class ApiResult implements ApiSerializable { public function addParsedLimit( $moduleName, $limit ) { // Add value, allowing overwriting $this->addValue( 'limits', $moduleName, $limit, - ApiResult::OVERRIDE | ApiResult::NO_SIZE_CHECK ); + self::OVERRIDE | self::NO_SIZE_CHECK ); } /**@}*/ @@ -551,7 +551,7 @@ class ApiResult implements ApiSerializable { * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. */ public function addContentField( $path, $name, $flags = 0 ) { - $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' ); + $arr = &$this->path( $path, ( $flags & self::ADD_ON_TOP ) ? 'prepend' : 'append' ); self::setContentField( $arr, $name, $flags ); } @@ -1156,7 +1156,7 @@ class ApiResult implements ApiSerializable { $bools = []; foreach ( $vars as $k => $v ) { if ( is_array( $v ) || is_object( $v ) ) { - $vars[$k] = ApiResult::addMetadataToResultVars( (array)$v, is_object( $v ) ); + $vars[$k] = self::addMetadataToResultVars( (array)$v, is_object( $v ) ); } elseif ( is_bool( $v ) ) { // Better here to use real bools even in BC formats $bools[] = $k; @@ -1176,22 +1176,22 @@ class ApiResult implements ApiSerializable { // Get the list of keys we actually care about. Unfortunately, we can't support // certain keys that conflict with ApiResult metadata. $keys = array_diff( array_keys( $vars ), [ - ApiResult::META_TYPE, ApiResult::META_PRESERVE_KEYS, ApiResult::META_KVP_KEY_NAME, - ApiResult::META_INDEXED_TAG_NAME, ApiResult::META_BC_BOOLS + self::META_TYPE, self::META_PRESERVE_KEYS, self::META_KVP_KEY_NAME, + self::META_INDEXED_TAG_NAME, self::META_BC_BOOLS ] ); return [ - ApiResult::META_TYPE => 'kvp', - ApiResult::META_KVP_KEY_NAME => 'key', - ApiResult::META_PRESERVE_KEYS => $keys, - ApiResult::META_BC_BOOLS => $bools, - ApiResult::META_INDEXED_TAG_NAME => 'var', + self::META_TYPE => 'kvp', + self::META_KVP_KEY_NAME => 'key', + self::META_PRESERVE_KEYS => $keys, + self::META_BC_BOOLS => $bools, + self::META_INDEXED_TAG_NAME => 'var', ] + $vars; } else { return [ - ApiResult::META_TYPE => 'array', - ApiResult::META_BC_BOOLS => $bools, - ApiResult::META_INDEXED_TAG_NAME => 'value', + self::META_TYPE => 'array', + self::META_BC_BOOLS => $bools, + self::META_INDEXED_TAG_NAME => 'value', ] + $vars; } } diff --git a/includes/api/ApiRevisionDelete.php b/includes/api/ApiRevisionDelete.php index 4896e7e527..9d71a7db7e 100644 --- a/includes/api/ApiRevisionDelete.php +++ b/includes/api/ApiRevisionDelete.php @@ -2,7 +2,7 @@ /** * Created on Jun 25, 2013 * - * Copyright © 2013 Brad Jorsch + * Copyright © 2013 Wikimedia Foundation and contributors * * 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 @@ -199,6 +199,6 @@ class ApiRevisionDelete extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Revisiondelete'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisiondelete'; } } diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php index 9584f09be4..76b6cc6722 100644 --- a/includes/api/ApiRollback.php +++ b/includes/api/ApiRollback.php @@ -202,6 +202,6 @@ class ApiRollback extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Rollback'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Rollback'; } } diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php index 4fac37da35..fdc62a8ea9 100644 --- a/includes/api/ApiRsd.php +++ b/includes/api/ApiRsd.php @@ -89,7 +89,7 @@ class ApiRsd extends ApiBase { 'apiLink' => wfExpandUrl( wfScript( 'api' ), PROTO_CURRENT ), // Docs link is optional, but recommended. - 'docs' => 'https://www.mediawiki.org/wiki/API', + 'docs' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API', // Some APIs may need a blog ID, but it may be left blank. 'blogID' => '', diff --git a/includes/api/ApiSerializable.php b/includes/api/ApiSerializable.php index 70e93a6c2a..a41f655c94 100644 --- a/includes/api/ApiSerializable.php +++ b/includes/api/ApiSerializable.php @@ -2,7 +2,7 @@ /** * Created on Feb 25, 2015 * - * Copyright © 2015 Brad Jorsch "bjorsch@wikimedia.org" + * Copyright © 2015 Wikimedia Foundation and contributors * * 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 diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php index 5769ff6d39..663416e69e 100644 --- a/includes/api/ApiSetNotificationTimestamp.php +++ b/includes/api/ApiSetNotificationTimestamp.php @@ -5,7 +5,7 @@ * * Created on Jun 18, 2012 * - * Copyright © 2012 Brad Jorsch + * Copyright © 2012 Wikimedia Foundation and contributors * * 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 @@ -248,6 +248,6 @@ class ApiSetNotificationTimestamp extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetNotificationTimestamp'; } } diff --git a/includes/api/ApiSetPageLanguage.php b/includes/api/ApiSetPageLanguage.php old mode 100755 new mode 100644 index 3ff99f11c0..7e3f1acf96 --- a/includes/api/ApiSetPageLanguage.php +++ b/includes/api/ApiSetPageLanguage.php @@ -33,11 +33,11 @@ */ class ApiSetPageLanguage extends ApiBase { // Check if change language feature is enabled - protected function getDescriptionMessage() { + protected function getExtendedDescription() { if ( !$this->getConfig()->get( 'PageLanguageUseDB' ) ) { - return 'apihelp-setpagelanguage-description-disabled'; + return 'apihelp-setpagelanguage-extended-description-disabled'; } - return parent::getDescriptionMessage(); + return parent::getExtendedDescription(); } /** @@ -144,6 +144,6 @@ class ApiSetPageLanguage extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:SetPageLanguage'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetPageLanguage'; } } diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php index 37ee3e7623..d03fca87a0 100644 --- a/includes/api/ApiStashEdit.php +++ b/includes/api/ApiStashEdit.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use MediaWiki\Logger\LoggerFactory; @@ -45,6 +44,7 @@ class ApiStashEdit extends ApiBase { const PRESUME_FRESH_TTL_SEC = 30; const MAX_CACHE_TTL = 300; // 5 minutes + const MAX_SIGNATURE_TTL = 60; public function execute() { $user = $this->getUser(); @@ -392,6 +392,12 @@ class ApiStashEdit extends ApiBase { // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness. $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() ); $ttl = min( $parserOutput->getCacheExpiry() - $since, self::MAX_CACHE_TTL ); + + // Avoid extremely stale user signature timestamps (T84843) + if ( $parserOutput->getFlag( 'user-signature' ) ) { + $ttl = min( $ttl, self::MAX_SIGNATURE_TTL ); + } + if ( $ttl <= 0 ) { return [ null, 0, 'no_ttl' ]; } diff --git a/includes/api/ApiTag.php b/includes/api/ApiTag.php index 7470ff3507..76c676293f 100644 --- a/includes/api/ApiTag.php +++ b/includes/api/ApiTag.php @@ -187,6 +187,6 @@ class ApiTag extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Tag'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag'; } } diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php index bfb0324849..887edaae81 100644 --- a/includes/api/ApiUnblock.php +++ b/includes/api/ApiUnblock.php @@ -132,6 +132,6 @@ class ApiUnblock extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Block'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block'; } } diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php index 7fda1ea01a..3aa7b608dc 100644 --- a/includes/api/ApiUndelete.php +++ b/includes/api/ApiUndelete.php @@ -33,7 +33,6 @@ class ApiUndelete extends ApiBase { $this->useTransactionalTimeLimit(); $params = $this->extractRequestParams(); - $this->checkUserRightsAny( 'undelete' ); $user = $this->getUser(); if ( $user->isBlocked() ) { @@ -45,6 +44,10 @@ class ApiUndelete extends ApiBase { $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] ); } + if ( !$titleObj->userCan( 'undelete', $user, 'secure' ) ) { + $this->dieWithError( 'permdenied-undelete' ); + } + // Check if user can add tags if ( !is_null( $params['tags'] ) ) { $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user ); @@ -145,6 +148,6 @@ class ApiUndelete extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Undelete'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Undelete'; } } diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index af3fff6c56..a283b5a215 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -928,6 +928,6 @@ class ApiUpload extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Upload'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Upload'; } } diff --git a/includes/api/ApiUsageException.php b/includes/api/ApiUsageException.php index 9dc1f92bbc..17655ec1c3 100644 --- a/includes/api/ApiUsageException.php +++ b/includes/api/ApiUsageException.php @@ -45,6 +45,10 @@ class UsageException extends MWException { $this->mCodestr = $codestr; $this->mExtraData = $extradata; + if ( !$this instanceof ApiUsageException ) { + wfDeprecated( __METHOD__, '1.29' ); + } + // This should never happen, so throw an exception about it that will // hopefully get logged with a backtrace (T138585) if ( !is_string( $codestr ) || $codestr === '' ) { @@ -58,6 +62,7 @@ class UsageException extends MWException { * @return string */ public function getCodeString() { + wfDeprecated( __METHOD__, '1.29' ); return $this->mCodestr; } @@ -65,6 +70,7 @@ class UsageException extends MWException { * @return array */ public function getMessageArray() { + wfDeprecated( __METHOD__, '1.29' ); $result = [ 'code' => $this->mCodestr, 'info' => $this->getMessage() @@ -180,18 +186,20 @@ class ApiUsageException extends UsageException implements ILocalizedException { /** * @deprecated Do not use. This only exists here because UsageException is in * the inheritance chain for backwards compatibility. - * @inheritdoc + * @inheritDoc */ public function getCodeString() { + wfDeprecated( __METHOD__, '1.29' ); return $this->getApiMessage()->getApiCode(); } /** * @deprecated Do not use. This only exists here because UsageException is in * the inheritance chain for backwards compatibility. - * @inheritdoc + * @inheritDoc */ public function getMessageArray() { + wfDeprecated( __METHOD__, '1.29' ); $enMsg = clone $this->getApiMessage(); $enMsg->inLanguage( 'en' )->useDatabase( false ); @@ -202,7 +210,7 @@ class ApiUsageException extends UsageException implements ILocalizedException { } /** - * @inheritdoc + * @inheritDoc */ public function getMessageObject() { return $this->status->getMessage(); diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php index 262f072dda..2a364d9756 100644 --- a/includes/api/ApiUserrights.php +++ b/includes/api/ApiUserrights.php @@ -58,7 +58,7 @@ class ApiUserrights extends ApiBase { $params = $this->extractRequestParams(); // Figure out expiry times from the input - // @todo Remove this isset check when removing $wgDisableUserGroupExpiry + // $params['expiry'] may not be set in subclasses if ( isset( $params['expiry'] ) ) { $expiry = (array)$params['expiry']; } else { @@ -214,6 +214,6 @@ class ApiUserrights extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:User_group_membership'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:User_group_membership'; } } diff --git a/includes/api/ApiValidatePassword.php b/includes/api/ApiValidatePassword.php index 6968523f28..943149da0f 100644 --- a/includes/api/ApiValidatePassword.php +++ b/includes/api/ApiValidatePassword.php @@ -76,6 +76,6 @@ class ApiValidatePassword extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Validatepassword'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Validatepassword'; } } diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php index 37d319f151..efe21f11d6 100644 --- a/includes/api/ApiWatch.php +++ b/includes/api/ApiWatch.php @@ -183,6 +183,6 @@ class ApiWatch extends ApiBase { } public function getHelpUrls() { - return 'https://www.mediawiki.org/wiki/API:Watch'; + return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watch'; } } diff --git a/includes/api/SearchApi.php b/includes/api/SearchApi.php index fb9c4e67d9..f7c6471e7c 100644 --- a/includes/api/SearchApi.php +++ b/includes/api/SearchApi.php @@ -115,7 +115,7 @@ trait SearchApi { $defaultProfile = null; foreach ( $profiles as $profile ) { $types[] = $profile['name']; - if ( isset ( $profile['desc-message'] ) ) { + if ( isset( $profile['desc-message'] ) ) { $helpMessages[$profile['name']] = $profile['desc-message']; } if ( !empty( $profile['default'] ) ) { @@ -144,7 +144,7 @@ trait SearchApi { * one ( to support the continue parameter ) * - namespace: mandatory * - search engine profiles defined by SearchApi::getSearchProfileParams() - * @param string[]|null API request params (must be sanitized by + * @param string[]|null $params API request params (must be sanitized by * ApiBase::extractRequestParams() before) * @return SearchEngine the search engine */ diff --git a/includes/api/i18n/ar.json b/includes/api/i18n/ar.json index 122219589f..6b2a2b7305 100644 --- a/includes/api/i18n/ar.json +++ b/includes/api/i18n/ar.json @@ -20,7 +20,7 @@ "apihelp-main-param-curtimestamp": "تشمل الطابع الزمني الحالي في النتيجة.", "apihelp-main-param-responselanginfo": "تشمل اللغات المستخدمة لأجل uselang and errorlang في النتيجة.", "apihelp-main-param-errorsuselocal": "إذا ما أعطيت، النصوص الخطأ ستستخدم الرسائل المخصصة محليا من نطاق {{ns:MediaWiki}}.", - "apihelp-block-description": "منع مستخدم.", + "apihelp-block-summary": "منع مستخدم.", "apihelp-block-param-user": "اسم المستخدم، أو عنوان IP أو نطاق عنوان IP لمنعه. لا يمكن أن يُستخدَم جنبا إلى جنب مع $1userid", "apihelp-block-param-userid": "معرف المستخدم لمنعه، لا يمكن أن يُستخدَم جنبا إلى جنب مع $1user", "apihelp-block-param-reason": "السبب للمنع.", @@ -29,23 +29,24 @@ "apihelp-block-param-autoblock": "منع آخر عنوان IP مستخدم تلقائيا، وأية عناوين IP لاحقة حاولت الدخول من خلاله.", "apihelp-block-param-noemail": "منع المستخدم من إرسال البريد الإلكتروني من خلال الويكي. (يتطلب صلاحية blockemail).", "apihelp-block-param-hidename": "إخفاء اسم المستخدم من سجل المنع. (يتطلب صلاحية hideuser).", - "apihelp-block-param-allowusertalk": "تسمح للمستخدم لتحرير صفحة النقاش الخاصة (يعتمد على [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "تسمح للمستخدم بتحرير صفحة النقاش الخاصة (يعتمد على [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-watchuser": "مشاهدة صفحة المستخدم ونقاش IP.", "apihelp-block-example-ip-simple": "منع عنوان IP 192.0.2.5 لمدة ثلاثة أيام بسبب >المخالفة الأولى.", "apihelp-block-example-user-complex": "منع المستخدم المخرب لأجل غير مسمى بسبب التخريب، ومنع إنشاء حساب جديد وإرسال بريد إلكتروني.", - "apihelp-changeauthenticationdata-description": "تغيير بيانات المصادقة للمستخدم الحالي.", + "apihelp-changeauthenticationdata-summary": "تغيير بيانات المصادقة للمستخدم الحالي.", "apihelp-changeauthenticationdata-example-password": "محاولة تغيير كلمة المرور للمستخدم الحالي إلى ExamplePassword.", - "apihelp-checktoken-description": "تحقق من صحة رمز من [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "تحقق من صحة رمز من [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "نوع من الرموز يجري اختبارها.", "apihelp-checktoken-param-token": "اختبار الرموز.", "apihelp-checktoken-param-maxtokenage": "أقصى عمر للرمز يسمح، في ثوان.", "apihelp-checktoken-example-simple": "اختبار صلاحية رمز csrf.", - "apihelp-clearhasmsg-description": "مسح hasmsg العلم للمستخدم الحالي.", + "apihelp-clearhasmsg-summary": "مسح hasmsg العلم للمستخدم الحالي.", "apihelp-clearhasmsg-example-1": "مسح hasmsg العلم للمستخدم الحالي.", - "apihelp-clientlogin-description": "تسجيل الدخول إلى ويكي باستخدام التدفق التفاعلي.", + "apihelp-clientlogin-summary": "تسجيل الدخول إلى ويكي باستخدام التدفق التفاعلي.", "apihelp-clientlogin-example-login": "بدء عملية تسجيل الدخول إلى الويكي كمستخدم Example بكلمة المرور ExamplePassword.", "apihelp-clientlogin-example-login2": "واصلة تسجيل الدخول بعد استجابة UI لعاملي الصادقة، إمداد OATHToken ل987654.", - "apihelp-compare-description": "الحصول على الفرق بين صفحتين. يجب تمرير عنوان الصفحة أو رقم المراجعة أو معرف الصفحة لكل من \"من\" و\"إلى\".", + "apihelp-compare-summary": "الحصول على الفرق بين صفحتين.", + "apihelp-compare-extended-description": "يجب تمرير عنوان الصفحة أو رقم المراجعة أو معرف الصفحة لكل من \"من\" و\"إلى\".", "apihelp-compare-param-fromtitle": "العنوان الأول للمقارنة.", "apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.", "apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.", @@ -53,7 +54,7 @@ "apihelp-compare-param-toid": "رقم الصفحة الثاني للمقارنة.", "apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.", "apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.", - "apihelp-createaccount-description": "انشاء حساب مستخدم جديد", + "apihelp-createaccount-summary": "انشاء حساب مستخدم جديد", "apihelp-createaccount-example-create": "بدء عملية إنشاء المستخدم Example بكلمة المرور ExamplePassword.", "apihelp-createaccount-param-name": "اسم المستخدم.", "apihelp-createaccount-param-domain": "مجال للمصادقة الخارجية (اختياري).", @@ -65,9 +66,9 @@ "apihelp-createaccount-param-language": "رمز اللغة لتعيينه كافتراضي للمستخدم (اختياري، لغة المحتوى الافتراضية).", "apihelp-createaccount-example-pass": "إنشاء المستخدم testuser بكلمة المرور test123.", "apihelp-createaccount-example-mail": "إنشاء مستخدم testmailuser وأرسل كلمة المرور بالبريد الإلكتروني بشكل عشوائي.", - "apihelp-cspreport-description": "مستخدمة من قبل المتصفحات للإبلاغ عن انتهاكات سياسة أمن المحتوى. لا ينبغي أبدا أن تستخدم هذه الوحدة، إلا عند استخدامها تلقائيا باستخدام متصفح ويب CSP متوافق.", + "apihelp-cspreport-summary": "مستخدمة من قبل المتصفحات للإبلاغ عن انتهاكات سياسة أمن المحتوى. لا ينبغي أبدا أن تستخدم هذه الوحدة، إلا عند استخدامها تلقائيا باستخدام متصفح ويب CSP متوافق.", "apihelp-cspreport-param-reportonly": "علم على أنه تقرير عن سياسة الرصد، وليس فرض سياسة", - "apihelp-delete-description": "حذف صفحة.", + "apihelp-delete-summary": "حذف صفحة.", "apihelp-delete-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع $1pageid$1pageidMain Page.", "apihelp-delete-example-reason": "حذف Main Page بسبب Preparing for move.", - "apihelp-disabled-description": "هذا الاصدار تم تعطيله.", - "apihelp-edit-description": "إنشاء وتعديل الصفحات.", + "apihelp-disabled-summary": "هذا الاصدار تم تعطيله.", + "apihelp-edit-summary": "إنشاء وتعديل الصفحات.", "apihelp-edit-param-title": "عنوان الصفحة للحذف. لا يمكن أن يُستخدَم جنبا إلى جنب مع $1pageid$1pageid0 للقسم العلوي، new لقسم جديد.", @@ -106,13 +107,13 @@ "apihelp-edit-example-edit": "عدل صفحة.", "apihelp-edit-example-prepend": "إضافة البادئة __NOTOC__ إلى الصفحة.", "apihelp-edit-example-undo": "التراجع عن التعديلات 13579 خلال 13585 بملخص تلقائي.", - "apihelp-emailuser-description": "مراسلة المستخدم", + "apihelp-emailuser-summary": "مراسلة المستخدم", "apihelp-emailuser-param-target": "مستخدم لإرسال بريد إلكتروني له.", "apihelp-emailuser-param-subject": "رأس الموضوع", "apihelp-emailuser-param-text": "جسم البريد الإلكتروني", "apihelp-emailuser-param-ccme": "إرسال نسخة من هذه الرسالة لي.", "apihelp-emailuser-example-email": "أرسل بريدا إلكترونيا للمستخدم WikiSysop بالنص Content.", - "apihelp-expandtemplates-description": "يوسع كافة القوالب ضمن نصوص الويكي.", + "apihelp-expandtemplates-summary": "يوسع كافة القوالب ضمن نصوص الويكي.", "apihelp-expandtemplates-param-title": "عنوان الصفحة.", "apihelp-expandtemplates-param-text": "نص ويكي للتحويل.", "apihelp-expandtemplates-param-revid": "معرف المراجعة، ل{{REVISIONID}} والمتغيرات مماثلة.", @@ -125,7 +126,7 @@ "apihelp-expandtemplates-param-includecomments": "إدراج أو عدم إدراج تعليقات HTML في الإخراج.", "apihelp-expandtemplates-param-generatexml": "ولد شجرة تحليل XML (حل محلها $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "توسيع نص الويكي {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "إرجاع تغذية مساهمات المستخدم.", + "apihelp-feedcontributions-summary": "إرجاع تغذية مساهمات المستخدم.", "apihelp-feedcontributions-param-feedformat": "هيئة التلقيم.", "apihelp-feedcontributions-param-user": "أي المستخدمين سيتم الحصول على تبرعات لهم.", "apihelp-feedcontributions-param-namespace": "أي نطاق ستتم تصفية المساهمات حسبه.", @@ -158,16 +159,16 @@ "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.", "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة", "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.", - "apihelp-feedwatchlist-description": "إرجاع تغذية قائمة المراقبة.", + "apihelp-feedwatchlist-summary": "إرجاع تغذية قائمة المراقبة.", "apihelp-feedwatchlist-param-feedformat": "هيئة التلقيم.", "apihelp-feedwatchlist-param-hours": "صفحات قائمة معدلة ضمن عدة ساعات من الآن.", "apihelp-feedwatchlist-example-default": "عرض تغذية قائمة المراقبة.", "apihelp-feedwatchlist-example-all6hrs": "اظهر كل التغييرات في اخر 6 ساعات", - "apihelp-filerevert-description": "استرجع الملف لنسخة قديمة.", + "apihelp-filerevert-summary": "استرجع الملف لنسخة قديمة.", "apihelp-filerevert-param-filename": "اسم الملف المستهدف، دون البادئة ملف:.", "apihelp-filerevert-param-comment": "تعليق الرفع.", "apihelp-filerevert-example-revert": "استرجاع Wiki.png لنسحة 2011-03-05T15:27:40Z.", - "apihelp-help-description": "عرض مساعدة لوحدات محددة.", + "apihelp-help-summary": "عرض مساعدة لوحدات محددة.", "apihelp-help-param-modules": "وحدات لعرض مساعدة لها (قيم وسائط action وformat أوmain). يمكن تحديد الوحدات الفرعية ب +.", "apihelp-help-param-submodules": "تشمل المساعدة للوحدات الفرعية من الوحدة المسماة.", "apihelp-help-param-recursivesubmodules": "تشمل المساعدة للوحدات الفرعية بشكل متكرر.", @@ -179,7 +180,7 @@ "apihelp-help-example-recursive": "كل المساعدة في صفحة واحدة.", "apihelp-help-example-help": "مساعدة لوحدة المساعدة نفسها.", "apihelp-help-example-query": "مساعدة لوحدتي استعلام فرعيتين.", - "apihelp-imagerotate-description": "تدوير صورة واحدة أو أكثر.", + "apihelp-imagerotate-summary": "تدوير صورة واحدة أو أكثر.", "apihelp-imagerotate-param-rotation": "درجة تدوير الصورة في اتجاه عقارب الساعة.", "apihelp-imagerotate-example-simple": "تدوير File:Example.png بمقدار 90 درجة.", "apihelp-imagerotate-example-generator": "تدوير جميع الصور في Category:Flip بمقدار 180 درجة.", @@ -192,19 +193,20 @@ "apihelp-import-param-namespace": "استيراد إلى هذا النطاق. لا يمكن أن يُستخدَم إلى جانب $1rootpage.", "apihelp-import-param-rootpage": "استيراد كصفحة فرعية لهذه الصفحة. لا يمكن أن يُستخدَم إلى جانب $1rootpage.", "apihelp-import-example-import": "استيراد [[meta:Help:ParserFunctions]] للنطاق 100 بالتاريخ الكامل.", - "apihelp-linkaccount-description": "ربط حساب من موفر طرف ثالث للمستخدم الحالي.", + "apihelp-linkaccount-summary": "ربط حساب من موفر طرف ثالث للمستخدم الحالي.", "apihelp-linkaccount-example-link": "بدء عملية ربط حساب من Example.", - "apihelp-login-description": "سجل دخولك الآن واحصل على مصادقة الكوكيز، وينبغي استخدام هذا الإجراء فقط في تركيبة مع [[Special:BotPasswords|خاص:كلمات مرور البوت]]. تم إهمال استخدام لتسجيل الدخول للحساب الرئيسي وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "سجل دخولك الآن واحصل على مصادقة الكوكيز. هذا العمل مستنكر وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "سجل دخولك الآن واحصل على مصادقة الكوكيز.", + "apihelp-login-extended-description": "وينبغي استخدام هذا الإجراء فقط في تركيبة مع [[Special:BotPasswords|خاص:كلمات مرور البوت]]. تم إهمال استخدام لتسجيل الدخول للحساب الرئيسي وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "هذا العمل مستنكر وقد يفشل دون سابق إنذار. لتسجيل الدخول بأمان إلى الحساب الرئيسي; استخدم [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "اسم المستخدم.", "apihelp-login-param-password": "كلمة السر", "apihelp-login-param-domain": "النطاق (اختياري).", "apihelp-login-param-token": "تم الحصول على رمز الدخول في الطلب الأول.", "apihelp-login-example-gettoken": "استرداد رمز تسجيل الدخول.", "apihelp-login-example-login": "تسجيل الدخول", - "apihelp-logout-description": "تسجيل الخروج ومسح بيانات الجلسة.", + "apihelp-logout-summary": "تسجيل الخروج ومسح بيانات الجلسة.", "apihelp-logout-example-logout": "تسجيل خروج المستخدم الحالي.", - "apihelp-managetags-description": "أداء المهام الإدارية المتعلقة بتغيير الوسوم.", + "apihelp-managetags-summary": "أداء المهام الإدارية المتعلقة بتغيير الوسوم.", "apihelp-managetags-param-operation": "أي الإجراءات ستنفذ:\n؛ إنشاء: إنشاء وسم التغيير جديدة للاستخدام اليدوي.\n؛ حذف: إزالة وسم التغيير من قاعدة البيانات، بما في ذلك إزالة الوسم من كافة المراجعات، وإدخالات التغيير الأخيرة، وإدخالات السجل المستخدم.\n؛ تنشيط: تنشيط وسم التغيير، مما يسمح للمستخدمين بتطبيقه يدويا.\n; إلغاء: إلغاء تنشيط وسم التغيير، ومنع المستخدمين من تطبيقه يدويا.", "apihelp-managetags-param-reason": "سبب اختياري لإنشاء، وحذف، وتفعيل أو تعطيل الوسم.", "apihelp-managetags-param-ignorewarnings": "إذا كان سيتم تجاهل أي تحذيرات تصدر خلال العملية.", @@ -212,7 +214,7 @@ "apihelp-managetags-example-delete": "حذف vandlaism وسم بسبب Misspelt", "apihelp-managetags-example-activate": "تنشيط الوسم المسمى spam بسبب For use in edit patrolling", "apihelp-managetags-example-deactivate": "تعطيل الوسم المسمى spam بسبب No longer required", - "apihelp-mergehistory-description": "ادمج تاريخ الصفحة.", + "apihelp-mergehistory-summary": "ادمج تاريخ الصفحة.", "apihelp-mergehistory-param-from": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب $1fromid.", "apihelp-mergehistory-param-fromid": "معرف الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب $1from.", "apihelp-mergehistory-param-to": "عنوان الصفحة التي سيتم دمج تاريخها. لا يمكن أن تُستخدَم بجانب $1toid.", @@ -221,7 +223,7 @@ "apihelp-mergehistory-param-reason": "سبب دمج التاريخ.", "apihelp-mergehistory-example-merge": "دمج تاريخ Oldpage كاملا إلى Newpage.", "apihelp-mergehistory-example-merge-timestamp": "دمج مراجعات الصفحة Oldpage dating up to 2015-12-31T04:37:41Z إلى Newpage.", - "apihelp-move-description": "نقل صفحة.", + "apihelp-move-summary": "نقل صفحة.", "apihelp-move-param-from": "عنوان الصفحة للنقل. لا يمكن أن تُستخدَم بجانب $1pageid$1pageidBadtitle إلى Goodtitle دون ترك تحويلة.", - "apihelp-opensearch-description": "بحث الويكي باستخدام بروتوكول أوبن سيرش OpenSearch.", + "apihelp-opensearch-summary": "بحث الويكي باستخدام بروتوكول أوبن سيرش OpenSearch.", "apihelp-opensearch-param-search": "سطر البحث", "apihelp-opensearch-param-limit": "الحد الأقصى للنتائج المُرجعة", "apihelp-opensearch-param-namespace": "النطاقات للبحث.", - "apihelp-opensearch-param-suggest": "لا تفعل شيئا إذا كان [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] خاطئا.", + "apihelp-opensearch-param-suggest": "لا تفعل شيئا إذا كان [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] خاطئا.", "apihelp-opensearch-param-format": "شكل الإخراج.", "apihelp-opensearch-param-warningsaserror": "إذا تم رفع التحذيرات بformat=json, أعد أخطاء API بدلا من تجاهلها.", "apihelp-opensearch-example-te": "العثور على صفحات تبدأ بTe.", @@ -248,7 +250,7 @@ "apihelp-options-example-reset": "إعادة تعيين كل التفضيلات.", "apihelp-options-example-change": "غير تفضيلات skin وhideminor.", "apihelp-options-example-complex": "إعادة تعيين جميع تفضيلات، ثم تعيين skin وnickname.", - "apihelp-paraminfo-description": "الحصول على معلومات حول وحدات API.", + "apihelp-paraminfo-summary": "الحصول على معلومات حول وحدات API.", "apihelp-paraminfo-param-helpformat": "شكل سلاسل المساعدة.", "apihelp-paraminfo-param-mainmodule": "الحصول على معلومات عن وحدة (المستوى الأعلى) الرئيسية أيضا. استخدم $1modules=main بدلا من ذلك.", "apihelp-paraminfo-param-formatmodules": "قائمة بأسماء أشكال الوحدات (قيم الوسيط format). استخدم $1modules بدلا من ذلك.", @@ -271,7 +273,7 @@ "apihelp-parse-paramvalue-prop-externallinks": "يعطي الوصلات الخارجية في تحليل نصوص الويكي.", "apihelp-parse-paramvalue-prop-sections": "يعطي الأقسام في تحليل نصوص الويكي.", "apihelp-parse-paramvalue-prop-displaytitle": "يضيف العنوان في تحليل نصوص الويكي.", - "apihelp-parse-paramvalue-prop-headitems": "Deprecated. يعطي عناصر لوضعها في <head> الصفحة.", + "apihelp-parse-paramvalue-prop-headitems": "يعطي عناصر لوضعها في <head> الصفحة.", "apihelp-parse-paramvalue-prop-headhtml": "يعطي تحليل <head> الصفحة.", "apihelp-parse-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة. للتطبيق; استخدم mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.", @@ -297,13 +299,13 @@ "apihelp-parse-example-text": "تحليل نصوص ويكي", "apihelp-parse-example-texttitle": "تحليل نصوص ويكي، تحديد عنوان الصفحة.", "apihelp-parse-example-summary": "تحليل الملخص.", - "apihelp-patrol-description": "مراجعة صفحة أو مراجعة.", + "apihelp-patrol-summary": "مراجعة صفحة أو مراجعة.", "apihelp-patrol-param-rcid": "معرف أحدث التغييرات للمراجعة", "apihelp-patrol-param-revid": "معرف مراجعة للمراجعة", "apihelp-patrol-param-tags": "تغيير وسوم لتطبيق الإدخال في سجل المراجعة.", "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد", "apihelp-patrol-example-revid": "راجع مراجعة.", - "apihelp-protect-description": "غير مستوى الحماية لصفحة.", + "apihelp-protect-summary": "غير مستوى الحماية لصفحة.", "apihelp-protect-param-title": "عنوان الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.", "apihelp-protect-param-pageid": "معرف الصفحة ل (إزالة) الحماية. لا يمكن أن تُستخدَم بجانب $1pageid.", "apihelp-protect-param-reason": "سبب (إزالة) الحماية.", @@ -312,12 +314,13 @@ "apihelp-protect-example-protect": "حماية صفحة.", "apihelp-protect-example-unprotect": "إلغاء حماية الصفحة من خلال وضع قيود لall (أي يُسمَح أي شخص باتخاذ الإجراءات).", "apihelp-protect-example-unprotect2": "إلغاء حماية الصفحة عن طريق عدم وضع أية قيود.", - "apihelp-purge-description": "مسح ذاكرة التخزين المؤقت للعناوين المعطاة", + "apihelp-purge-summary": "مسح ذاكرة التخزين المؤقت للعناوين المعطاة", "apihelp-purge-param-forcelinkupdate": "تحديث جداول الروابط.", "apihelp-purge-param-forcerecursivelinkupdate": "تحديث جدول الروابط، وتحديث جداول الروابط لأية صفحة تستخدم هذه الصفحة كقالب.", "apihelp-purge-example-simple": "إفراغ كاش Main Page وصفحة API.", "apihelp-purge-example-generator": "إفراغ كاش أول 10 صفحات في النطاق الرئيسي.", - "apihelp-query-description": "جلب البيانات من وعن ميدياويكي. يجب على جميع تعديلات البيانات أولا استخدام استعلام للحصول على رمز لمنع الاعتداء من المواقع الخبيثة.", + "apihelp-query-summary": "جلب البيانات من وعن ميدياويكي.", + "apihelp-query-extended-description": "يجب على جميع تعديلات البيانات أولا استخدام استعلام للحصول على رمز لمنع الاعتداء من المواقع الخبيثة.", "apihelp-query-param-prop": "أي الخصائص تريد الحصول على صفحات استعلام عنها.", "apihelp-query-param-list": "أي القوائم تريد الحصول عليها.", "apihelp-query-param-meta": "أي البيانات الوصفية تريد الحصول عليها.", @@ -326,7 +329,7 @@ "apihelp-query-param-rawcontinue": "إرجاع query-continue بيانات خام للاستمرار.", "apihelp-query-example-revisions": "جلب [[Special:ApiHelp/query+siteinfo|معلومات الموقع]] و[[Special:ApiHelp/query+revisions|مراجعات]] Main Page.", "apihelp-query-example-allpages": "جلب مراجعات الصفحات التي تبدأ بAPI/.", - "apihelp-query+allcategories-description": "تعداد جميع التصنيفات.", + "apihelp-query+allcategories-summary": "تعداد جميع التصنيفات.", "apihelp-query+allcategories-param-from": "التصنيف الذي يبدأ التعداد منه.", "apihelp-query+allcategories-param-to": "التصنيف الذي يقف التعداد عنده.", "apihelp-query+allcategories-param-prefix": "ابحث عن جميع التصنيفات التي تبدأ أسماؤها بهذه القيمة.", @@ -335,7 +338,7 @@ "apihelp-query+allcategories-param-prop": "أي الخصائص تريد الحصول عليها:", "apihelp-query+allcategories-paramvalue-prop-size": "أضف عدد الصفحات في هذا التصنيف.", "apihelp-query+allcategories-example-generator": "استرداد المعلومات حول صفحة التصنيف نفسها للتصنيفات التي تبدأ بList.", - "apihelp-query+alldeletedrevisions-description": "قائمة جميع المراجعات المحذوفة بواسطة المستخدم أو في نطاق.", + "apihelp-query+alldeletedrevisions-summary": "قائمة جميع المراجعات المحذوفة بواسطة المستخدم أو في نطاق.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "يمكن أن تُستخدَم فقط مع $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "لا يمكن أن تُستخدَم مع $3user.", "apihelp-query+alldeletedrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.", @@ -347,7 +350,7 @@ "apihelp-query+alldeletedrevisions-param-excludeuser": "لا تدرج المراجعات التي كتبها هذا المستخدم.", "apihelp-query+alldeletedrevisions-param-namespace": "أدرج الصفحات في هذا النطاق فقط.", "apihelp-query+alldeletedrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.", - "apihelp-query+allfileusages-description": "قائمة جميع استخدامات الملفات، بما في ذلك غير الموجودة.", + "apihelp-query+allfileusages-summary": "قائمة جميع استخدامات الملفات، بما في ذلك غير الموجودة.", "apihelp-query+allfileusages-param-from": "عنوان الملف لبدء التعداد منه.", "apihelp-query+allfileusages-param-to": "عنوان الملف لوقف التعداد منه.", "apihelp-query+allfileusages-param-prefix": "البحث عن كل عناوين الملفات التي تبدأ بهذه القيمة.", @@ -355,7 +358,7 @@ "apihelp-query+allfileusages-paramvalue-prop-ids": "تضيف معرفات استخدام الصفحات (لا يمكن استخدامها مع $1unique).", "apihelp-query+allfileusages-paramvalue-prop-title": "تضيف عنوان الملف.", "apihelp-query+allfileusages-param-limit": "كم عدد مجموع البنود للعودة.", - "apihelp-query+allimages-description": "تعداد كافة الصور بشكل متتالي.", + "apihelp-query+allimages-summary": "تعداد كافة الصور بشكل متتالي.", "apihelp-query+allimages-param-sort": "خاصية للفرز وفقًا لها.", "apihelp-query+allimages-param-from": "عنوان الصورة لبدء التعداد منه. يمكن استخدامها مع $1sort=name فقط.", "apihelp-query+allimages-param-to": "عنوان الصورة لوقف التعداد منه. يمكن استخدامها مع $1sort=name فقط.", @@ -370,7 +373,7 @@ "apihelp-query+allimages-example-recent": "أظهر قائمة الملفات التي تم تحميلها مؤخرا، على غرار [[Special:NewFiles|خاص:ملفات جديدة]].", "apihelp-query+allimages-example-mimetypes": "أظهر قائمة الملفات من نوع MIME image/png أو image/gif", "apihelp-query+allimages-example-generator": "عرض معلومات حول 4 ملفات تبدأ بالحرف T.", - "apihelp-query+alllinks-description": "تعداد كافة الروابط التي تشير إلى نطاق معين.", + "apihelp-query+alllinks-summary": "تعداد كافة الروابط التي تشير إلى نطاق معين.", "apihelp-query+alllinks-param-from": "عنوان الرابط لبدء التعداد منه.", "apihelp-query+alllinks-param-to": "عنوان الرابط لوقف التعداد منه.", "apihelp-query+alllinks-param-prefix": "البحث عن كل العناوين المرتبطة التي تبدأ بهذه القيمة.", @@ -388,7 +391,7 @@ "apihelp-query+allmessages-param-prefix": "إرجاء الرسائل بهذه البادئة.", "apihelp-query+allmessages-example-ipb": "عرض رسائل تبدأ بipb-.", "apihelp-query+allmessages-example-de": "عرض رسائل august and mainpage باللغة الألمانية.", - "apihelp-query+allpages-description": "تعداد كافة الصفحات بشكل متتالي في نطاق معين.", + "apihelp-query+allpages-summary": "تعداد كافة الصفحات بشكل متتالي في نطاق معين.", "apihelp-query+allpages-param-to": "عنوان الصفحة لإيقاف التعداد منه.", "apihelp-query+allpages-param-prefix": "البحث عن كل عناوين الصفحات التي تبدأ بهذه القيمة.", "apihelp-query+allpages-param-namespace": "نطاق للتعداد.", @@ -405,7 +408,7 @@ "apihelp-query+allredirects-param-namespace": "نطاق للتعداد.", "apihelp-query+allredirects-param-limit": "كم عدد مجموع البنود للعودة.", "apihelp-query+allredirects-example-generator": "يحصل على الصفحات التي تحتوي على تحويلات.", - "apihelp-query+allrevisions-description": "اعرض كل المراجعات.", + "apihelp-query+allrevisions-summary": "اعرض كل المراجعات.", "apihelp-query+allrevisions-param-start": "التصنيف الذي يبدأ التعداد منه.", "apihelp-query+allrevisions-param-end": "الطابع الزمني الذي يقف التعداد منه.", "apihelp-query+allrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.", @@ -414,5 +417,7 @@ "apihelp-query+blocks-example-simple": "قائمة المنع.", "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.", "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها.", + "apierror-offline": "لم يمكن المتابعة بسبب مشاكل في الاتصال بالشبكة; تأكد من أنه لديك اتصال بالإنترنت وحاول مرة أخرى.", + "apierror-timeout": "لم يستجب الخادم ضمن الوقت المتوقع.", "api-feed-error-title": "خطأ ($1)" } diff --git a/includes/api/i18n/ast.json b/includes/api/i18n/ast.json index 89f9e39edc..09c63777a8 100644 --- a/includes/api/i18n/ast.json +++ b/includes/api/i18n/ast.json @@ -5,7 +5,8 @@ "Enolp" ] }, - "apihelp-main-description": "

    \n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Llista d'alderique]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fallos y solicitúes]\n
    \nEstau: Toles carauterístiques qu'apaecen nesta páxina tendríen de funcionar, pero la API inda ta en desendolcu activu, y puede camudar en cualquier momentu. Suscríbete a la [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ llista de corréu mediawiki-api-announce] p'avisos sobro anovamientos.\n\nSolicitúes incorreutes: Cuando s'unvíen solicitúes incorreutes a la API, unvíase una cabecera HTTP cola clave \"MediaWiki-API-Error\" y, darréu, tanto'l valor de la cabecera como'l códigu d'error devueltu pondránse al mesmu valor. Pa más información, consulta [[mw:API:Errors_and_warnings|API: Errores y avisos]].\n\nPruebes: Pa facilitar les pruebes de solicitúes API, consulta [[Special:ApiSandbox]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Llista d'alderique]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fallos y solicitúes]\n
    \nEstau: Toles carauterístiques qu'apaecen nesta páxina tendríen de funcionar, pero la API inda ta en desendolcu activu, y puede camudar en cualquier momentu. Suscríbete a la [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ llista de corréu mediawiki-api-announce] p'avisos sobro anovamientos.\n\nSolicitúes incorreutes: Cuando s'unvíen solicitúes incorreutes a la API, unvíase una cabecera HTTP cola clave \"MediaWiki-API-Error\" y, darréu, tanto'l valor de la cabecera como'l códigu d'error devueltu pondránse al mesmu valor. Pa más información, consulta [[mw:API:Errors_and_warnings|API: Errores y avisos]].\n\nPruebes: Pa facilitar les pruebes de solicitúes API, consulta [[Special:ApiSandbox]].", "apihelp-main-param-action": "Qué aición facer.", "apihelp-main-param-format": "El formatu de la salida.", "apihelp-main-param-maxlag": "El retrasu (lag) máximu puede utilizase cuando MediaWiki ta instaláu nun conxuntu de bases de datos replicaes. Pa evitar les aiciones que pudieran causar un retrasu entá mayor na replicación del sitiu, esti parámetru puede causar que'l cliente espere hasta que'l retrasu de replicación sía menor que'l valor especificáu. En casu de retrasu escesivu, devuélvese un códigu d'error maxlag con un mensaxe asemeyáu a Esperando a $host: $lag segundos de retrasu.
    Ver [[mw:Manual:Maxlag_parameter|Manual:Parámetru maxlag]] pa más información.", @@ -15,7 +16,7 @@ "apihelp-main-param-assertuser": "Comprobar que'l usuariu actual ye l'usuariu nomáu.", "apihelp-main-param-servedby": "Incluyir el nome del host que sirvió la solicitú nes resultancies.", "apihelp-main-param-curtimestamp": "Incluyir la marca de tiempu actual na resultancia.", - "apihelp-block-description": "Bloquiar a un usuariu.", + "apihelp-block-summary": "Bloquiar a un usuariu.", "apihelp-block-param-user": "Nome d'usuariu, dirección #IP o intervalu d'IP que quies bloquiar. Nun puede utilizase con $1userid", "apihelp-block-param-expiry": "Fecha de caducidá. Puede ser relativa (por casu, 5 meses o 2 selmanes) o absoluta (por casu, 2016-01-16T12:34:56Z). Si s'establez a infinitu, indefiníu, o nunca, el bloquéu nun caducará nunca.", "apihelp-block-param-reason": "Motivu del bloquéu.", @@ -28,9 +29,9 @@ "apihelp-block-param-watchuser": "Vixilar les páxines d'usuariu y d'alderique del usuariu o de la dirección IP.", "apihelp-block-example-ip-simple": "Bloquiar la dirección IP 192.0.2.5 mientres 3 díes col motivu Primer avisu.", "apihelp-block-example-user-complex": "Bloquiar al usuariu Vandal indefinidamente col motivu Vandalismu y torgar que cree nueves cuentes o unvie correos.", - "apihelp-changeauthenticationdata-description": "Camudar los datos d'identificación del usuariu actual.", + "apihelp-changeauthenticationdata-summary": "Camudar los datos d'identificación del usuariu actual.", "apihelp-changeauthenticationdata-example-password": "Intentar camudar la contraseña del usuariu actual a ContraseñaExemplu.", "apihelp-createaccount-param-name": "Nome d'usuariu.", "apihelp-createaccount-param-language": "Códigu de llingua p'afitar como predetermináu al usuariu (opcional, predetermina la llingua del conteníu).", - "apihelp-disabled-description": "Esti módulu deshabilitóse." + "apihelp-disabled-summary": "Esti módulu deshabilitóse." } diff --git a/includes/api/i18n/awa.json b/includes/api/i18n/awa.json index d094592197..b961399f11 100644 --- a/includes/api/i18n/awa.json +++ b/includes/api/i18n/awa.json @@ -4,7 +4,7 @@ "1AnuraagPandey" ] }, - "apihelp-block-description": "सदस्य कय अवरोधित करा जाय।", + "apihelp-block-summary": "सदस्य कय अवरोधित करा जाय।", "apihelp-block-param-reason": "ब्लाक करेकै कारण", "apihelp-block-param-nocreate": "खाते बनावेकै रोका जाय", "apihelp-edit-param-minor": "छोट संपादन" diff --git a/includes/api/i18n/azb.json b/includes/api/i18n/azb.json index ca09cf6ea9..37259d7aca 100644 --- a/includes/api/i18n/azb.json +++ b/includes/api/i18n/azb.json @@ -9,7 +9,7 @@ "apihelp-block-param-nocreate": "حساب آچماغین قاباغینی آل.", "apihelp-checktoken-param-token": "تِست اۆچون توکن.", "apihelp-compare-param-fromtitle": "مۆقاییسه اۆچون ایلک باشلیق.", - "apihelp-delete-description": "بیر صفحه‌نی سیل.", + "apihelp-delete-summary": "بیر صفحه‌نی سیل.", "apihelp-delete-param-unwatch": "صفحه‌نی ایزله‌دیکلر لیستیندن سیل.", - "apihelp-edit-description": "صفحه‌لری یارادیب دَییشدیر." + "apihelp-edit-summary": "صفحه‌لری یارادیب دَییشدیر." } diff --git a/includes/api/i18n/ba.json b/includes/api/i18n/ba.json index 2107e899f5..a9e4ccdc4b 100644 --- a/includes/api/i18n/ba.json +++ b/includes/api/i18n/ba.json @@ -16,7 +16,7 @@ "Ләйсән" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почта таратыу]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API яңылыҡтары]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Хаталар һәм яуаптар]\n
    \nСтатус: Был биттә күрһәтелгән бар функциялар ҙа эшләргә тейеш, шулай ҙа API әүҙем эшкәртеү хәлендә тора һәм теләгән бер ваҡытта үҙгәрергә мөмкин. Яңыртылыуҙарҙы һәр саҡ белеп торор өсөн [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почта таратыу mediawiki-api-announce], ошоға яҙыл.\n\nХаталы һоратыуҙар: Әгәр API хаталы һоратыу алһа, HTTP баш һүҙе «MediaWiki-API-Error» асҡысы менән кире ҡайтарыла, бынан һуң баш һүҙҙең мәғәнәһе һәм хата коды кире ебәреләсәк һәм кире шул уҡ мәғәнәлә кире ҡуйыласаҡ. Киңерәк мәғлүмәтте ошонан ҡара [[mw:API:Errors_and_warnings|API:Хаталар һәм иҫкәртеүҙәр]].\n\nТестлау: API-һоратыуҙарҙы тестлау уңайлы булһын өсөн ҡара. [[Special:ApiSandbox]]", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почта таратыу]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API яңылыҡтары]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Хаталар һәм яуаптар]\n
    \nСтатус: Был биттә күрһәтелгән бар функциялар ҙа эшләргә тейеш, шулай ҙа API әүҙем эшкәртеү хәлендә тора һәм теләгән бер ваҡытта үҙгәрергә мөмкин. Яңыртылыуҙарҙы һәр саҡ белеп торор өсөн [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почта таратыу mediawiki-api-announce], ошоға яҙыл.\n\nХаталы һоратыуҙар: Әгәр API хаталы һоратыу алһа, HTTP баш һүҙе «MediaWiki-API-Error» асҡысы менән кире ҡайтарыла, бынан һуң баш һүҙҙең мәғәнәһе һәм хата коды кире ебәреләсәк һәм кире шул уҡ мәғәнәлә кире ҡуйыласаҡ. Киңерәк мәғлүмәтте ошонан ҡара [[mw:API:Errors_and_warnings|API:Хаталар һәм иҫкәртеүҙәр]].\n\nТестлау: API-һоратыуҙарҙы тестлау уңайлы булһын өсөн ҡара. [[Special:ApiSandbox]]", "apihelp-main-param-action": "Үтәлергә тейеш булған ғәмәлдәр.", "apihelp-main-param-format": "Мәғлүмәттәр сығарыу форматы.", "apihelp-main-param-smaxage": "Cache-Control HTTP-баш һүҙҙең s-maxage мәғәнәһен бирелгән секунд эсендә билдәләй.", @@ -26,7 +26,7 @@ "apihelp-main-param-servedby": "Һөҙөмтәләргә һорауҙы эшкәрткән хост исемен индерергә", "apihelp-main-param-curtimestamp": "Һөҙөмтәләргә ваҡытлыса тамға ҡуйырға.", "apihelp-main-param-origin": "API мөрәжәғәт иткәндә AJAX-һорау (CORS) кросс-домены ҡулланһағыҙ, параметрға тәүге домен мәғәнәһен бирегеҙ. Ул алдағы һорауҙа булырға һәм шул рәүешле URI-һорауҙың (POST түгел) бер өлөшө булырға тейеш. Ул атамалағы бер сығанаҡҡа Origin тап килергә тейеш, мәҫәлән, https://ru.wikipedia.org йәки https://meta.wikimedia.org. Әгәр ҙә параметр атамаға Origin тура килмәһә, яуап 403 хата коды менән кире ҡайтарыла. Әгәр параметр Origin атамаға тура килһә, һәм сығанаҡ рөхсәт ителгән исемлектә икән, Access-Control-Allow-Origin тигән атама ҡуйыласаҡ.", - "apihelp-block-description": "Ҡатнашыусыны бикләү", + "apihelp-block-summary": "Ҡатнашыусыны бикләү", "apihelp-block-param-user": "Һеҙ бикләргә теләгән ҡатнашыусының IP адресы йәки IP диапозоны.", "apihelp-block-param-expiry": "Ғәмәлдән сығыу ваҡыты. Ул сағыштырмаса булыуы мөмкин(мәҫәлән 5 ай йәки 2 аҙна) йәки абсолют (мәҫәлән 2014-09-18T12:34:56Z). Әгәр саманан тыш ҡуйылһа сикһеҙ, билдәләнмәгән, йәки һис ҡасан, блок ғәмәлдән сыҡмай.", "apihelp-block-param-reason": "Бикләү сәбәбе.", @@ -40,14 +40,14 @@ "apihelp-block-param-watchuser": "Битте йәки IP-ҡатнашыусыны һәм фекер алышыу битен күҙәтеү аҫтына аларға.", "apihelp-block-example-ip-simple": "Блок IP-адрес 192.0.2.5 өс көн эсендә Беренсе удар .", "apihelp-block-example-user-complex": "Ҡулланыусыны ябыу Вандал уйланылған билдәһеҙ мөҙҙәткә Вандаллыҡ , шулай уҡ яңы иҫәп булдырыуға юл ҡуймау һәм электрон почтаға ебәреү.", - "apihelp-checktoken-description": "\n-нан Маркерҙың дөрөҫлөгөн тикшерегеҙ [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "-нан Маркерҙың дөрөҫлөгөн тикшерегеҙ [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Тамға тибы һынау үтә.", "apihelp-checktoken-param-token": "Тикшереү токены.", "apihelp-checktoken-param-maxtokenage": "Токендың максималь йәше (секундтарҙа)", "apihelp-checktoken-example-simple": "csrf-токендың яраҡлығын тикшерергә", - "apihelp-clearhasmsg-description": "Ағымдағы ҡуллыныусының hasmsg флагын таҙарта", + "apihelp-clearhasmsg-summary": "Ағымдағы ҡуллыныусының hasmsg флагын таҙарта", "apihelp-clearhasmsg-example-1": "Ағымдағы ҡуллыныусының hasmsg флагын таҙарта", - "apihelp-compare-description": "\nТикшереү һаны, биттең баш һүҙе, йәки бит өсөн идентификатор баштан аҙаҡҡаса икеһе өсөн дә ҡабул ителергә тейеш", + "apihelp-compare-summary": "Тикшереү һаны, биттең баш һүҙе, йәки бит өсөн идентификатор баштан аҙаҡҡаса икеһе өсөн дә ҡабул ителергә тейеш", "apihelp-compare-param-fromtitle": "Сағыштырыу өсөн беренсе баш һүҙ", "apihelp-compare-param-fromid": "Сағыштырыу өсөн беренсе идентификатор.", "apihelp-compare-param-fromrev": "Сағыштырыу өсөн беренсе редакция.", @@ -55,7 +55,7 @@ "apihelp-compare-param-toid": "Сағыштырыу өсөн икенсе идентификатор.", "apihelp-compare-param-torev": "Сағыштырыу өсөн икенсе версия.", "apihelp-compare-example-1": "1-се һәм 2-се версиялар араһында айырма эшләү", - "apihelp-createaccount-description": "Ҡатнашыусыларҙың яңы иҫәп яҙыуҙарын булдырыу.", + "apihelp-createaccount-summary": "Ҡатнашыусыларҙың яңы иҫәп яҙыуҙарын булдырыу.", "apihelp-createaccount-param-name": "Ҡатнашыусы исеме.", "apihelp-createaccount-param-password": "Серһүҙ (ignored if $1mailpassword is set).", "apihelp-createaccount-param-domain": "Тышҡы аутентификация домены (өҫтәмә).", @@ -67,7 +67,7 @@ "apihelp-createaccount-param-language": "Тел кодын ҡулланыусы өсөн һүҙһеҙ ҡуйырға (мотлаҡ түгел, эсенә алғандағында тел һүҙһеҙ файҙаланыла)", "apihelp-createaccount-example-pass": "test123 серһүҙле testuser ҡулланыусыһын булдырыу.", "apihelp-createaccount-example-mail": "testmailuser ҡулланыусыһын һәм электрон почтаны булдырыу, осраҡлы серһеҙ яһау", - "apihelp-delete-description": "Битте юйырға.", + "apihelp-delete-summary": "Битте юйырға.", "apihelp-delete-param-title": "Биттең баш һүҙен юйырға. $1биттәрҙән бергә файҙаланыу мөмкин түгел.", "apihelp-delete-param-pageid": "Бит идентифакторы юйылыу өсөн биттәр. $1title менән бергә ҡулланыла алмайҙар", "apihelp-delete-param-reason": "Юйылыу сәбәбе. Әгәр ул ҡуйылмаған булһа, билдәләнмәгән сәбәп менән автоматик рәүештә юйыласаҡ.", @@ -78,8 +78,8 @@ "apihelp-delete-param-oldimage": "\nБында нисек ҡаралғанса, юйыу өсөн иҫке һүрәтләмәнең исеме [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]]", "apihelp-delete-example-simple": "Юйырға: Main Page.", "apihelp-delete-example-reason": "Юйырға Main Page сәбәп Preparing for move.", - "apihelp-disabled-description": "Был модуль һүндерелгән.", - "apihelp-edit-description": "Биттәрҙе төҙөргә һәм мөхәррирләргә.", + "apihelp-disabled-summary": "Был модуль һүндерелгән.", + "apihelp-edit-summary": "Биттәрҙе төҙөргә һәм мөхәррирләргә.", "apihelp-edit-param-title": "Мөхәриррләү өсөн биттең исеме.$1биттәрҙән бергә файҙаланыу мөмкин түгел.", "apihelp-edit-param-pageid": "Бит идентифакторын мөхәррирләү өсөн биттәр. $1title менән бергә ҡулланыла алмайҙар", "apihelp-edit-param-section": "Номерҙы айырыу. 0 өҫкө секция өсөн, яңы яңынан бүлеү өсөн.", @@ -110,13 +110,13 @@ "apihelp-edit-example-edit": "Битте мөхәррирләү", "apihelp-edit-example-prepend": "Бит башына тылсымлы һүҙ ҡуйырға __NOTOC__.", "apihelp-edit-example-undo": " 13579-ҙан 13585-кә тиклем төҙәтеүҙәрҙе кире алырға", - "apihelp-emailuser-description": "Ҡатнашыусыға хат", + "apihelp-emailuser-summary": "Ҡатнашыусыға хат", "apihelp-emailuser-param-target": "Ҡатнашыусы электрон хат ебәрә", "apihelp-emailuser-param-subject": "Теманың баш һүҙе", "apihelp-emailuser-param-text": "Хат эстәлеге", "apihelp-emailuser-param-ccme": "Был хәбәрҙең копияһын миңә ебәрергә", "apihelp-emailuser-example-email": "Ҡатнашыусыға хат ебәрергә WikiSysopтекст Content.", - "apihelp-expandtemplates-description": "wikitext ҡалыптарын аса.", + "apihelp-expandtemplates-summary": "wikitext ҡалыптарын аса.", "apihelp-expandtemplates-param-title": "Бит баш һүҙе", "apihelp-expandtemplates-param-text": "Конвертлау өсөн викитекст", "apihelp-expandtemplates-param-revid": "{{REVISIONID}} һәм шуға оҡшаған алмаштар өсөн ID-ны яңынан ҡарау", @@ -130,7 +130,7 @@ "apihelp-expandtemplates-paramvalue-prop-parsetree": "XML керетелә торған мәғлүмәт ағасы (шәжәрәһе).", "apihelp-expandtemplates-param-includecomments": "Сыҡҡанда HTML комментарийҙарына индереү кәрәкме?", "apihelp-expandtemplates-example-simple": "Вики-тексты асығыҙ {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Һеҙҙең исемгә килгән тәҡдимдәргә ҡайтыу", + "apihelp-feedcontributions-summary": "Һеҙҙең исемгә килгән тәҡдимдәргә ҡайтыу", "apihelp-feedcontributions-param-feedformat": "Мәғлүмәттәр сығарыу форматы.", "apihelp-feedcontributions-param-year": "Йылдан башлап (һәм элегерәк):", "apihelp-feedcontributions-param-month": "Айҙан башлап (һәм элегерәк):", @@ -139,7 +139,7 @@ "apihelp-feedcontributions-param-newonly": "Яңы бит яһаған төҙәтеүҙәрҙе генә күрһәтергә", "apihelp-feedcontributions-param-showsizediff": "Өлгәоәр араһыдағы күләм айырмаһын күрһәтергә", "apihelp-feedcontributions-example-simple": "Ҡулланыусының өлөшөн күрһәтергә Example.", - "apihelp-feedrecentchanges-description": "Каналдың һуңғы үҙгәрештәрен кире ҡайтарырға.", + "apihelp-feedrecentchanges-summary": "Каналдың һуңғы үҙгәрештәрен кире ҡайтарырға.", "apihelp-feedrecentchanges-param-feedformat": "Мәғлүмәттәр сығарыу форматы.", "apihelp-feedrecentchanges-param-invert": "Һайланғандан башҡа исемдәр арауығы", "apihelp-feedrecentchanges-param-limit": "Ҡайтарылған һөҙөмтәләрҙең максималь һаны.", @@ -157,17 +157,17 @@ "apihelp-feedrecentchanges-param-categories_any": "Был категориянан башҡа теләһә ҡайһы категориялар биттәрендәге үҙгәрештәрҙе генә күрһәтергә", "apihelp-feedrecentchanges-example-simple": "Һуңғы үҙгәртеүҙәрҙе күрһәтергә.", "apihelp-feedrecentchanges-example-30days": "30 көн арауығындағы һуңғы үҙгәртеүҙәрҙе күрһәтергә.", - "apihelp-feedwatchlist-description": "Күҙәтеү каналын ҡайтара", + "apihelp-feedwatchlist-summary": "Күҙәтеү каналын ҡайтара", "apihelp-feedwatchlist-param-feedformat": "Мәғлүмәттәр сығарыу форматы.", "apihelp-feedwatchlist-param-hours": "Был моменттан һуң күп сәғәт эсендә биттәр исемлеге үҙгәртелгән.", "apihelp-feedwatchlist-param-linktosections": "Мөмкин булһа, үҙгәртеүҙәр булған бүлеккә тура һылтанма.", "apihelp-feedwatchlist-example-default": "Күҙәтеү каналын күрһәтергә", "apihelp-feedwatchlist-example-all6hrs": "Күҙәтеү биттәрендәге һуңғы 6 сәғәт эсендәге барлыҡ үҙгәрештәрҙе күрһәтергә.", - "apihelp-filerevert-description": "Файлды иҫке версияға ҡайтарырға.", + "apihelp-filerevert-summary": "Файлды иҫке версияға ҡайтарырға.", "apihelp-filerevert-param-filename": "Префиксһыҙ файл исеме", "apihelp-filerevert-param-comment": "Комментарий тейәргә", "apihelp-filerevert-example-revert": "Кире Wiki.png юрауға 2011-03-05T15:27:40Z ҡайтырға.", - "apihelp-help-description": "Күрһәтелгән модулдәр өсөн белешмәне тасуирлау.", + "apihelp-help-summary": "Күрһәтелгән модулдәр өсөн белешмәне тасуирлау.", "apihelp-help-param-modules": " Белешмәләр тасуирлау өсөн (күрһәткестәр action һәм format дәүмәленә, йәки main). Модулдәрҙе a + ярҙамында күрһәтә алаһығыҙ.", "apihelp-help-param-submodules": "Модуль исеменән субмодулдәр өсөн ярҙам индерә", "apihelp-help-param-recursivesubmodules": "Рекурсив рәүешле субмодулдәр өсөн ярҙам индерә.", @@ -177,7 +177,7 @@ "apihelp-help-example-recursive": "Бар белешмә бер бүлектә.", "apihelp-help-example-help": "Модулдең үҙ ярҙамына ярҙам итеү", "apihelp-help-example-query": "Подмодулдәрҙең ике һорауына ярҙам итергә.", - "apihelp-imagerotate-description": "Бер йәки бер нисә һүрәтте бороу.", + "apihelp-imagerotate-summary": "Бер йәки бер нисә һүрәтте бороу.", "apihelp-imagerotate-param-rotation": "Һүрәтте сәғәт йөрөшө буйынса нисә градусҡа борорға.", "apihelp-imagerotate-example-simple": "File:Example.png на 90 градусҡа борорға.", "apihelp-imagerotate-example-generator": "Бар һүрәттәрҙе лә Category:Flip на 180 градусҡа борорға.", @@ -192,17 +192,17 @@ "apihelp-login-param-token": "Беренсе һорау ваҡытынла алынған логин маркер", "apihelp-login-example-gettoken": "Системаға инеү маркерын алыу.", "apihelp-login-example-login": "Танылыу.", - "apihelp-logout-description": "Сығырға һәм сессия мәғлүмәтен юйырға.", + "apihelp-logout-summary": "Сығырға һәм сессия мәғлүмәтен юйырға.", "apihelp-logout-example-logout": "Ағымдағы ҡулланыусының киткән саҡта инеүе", - "apihelp-managetags-description": "Тегтарҙы үҙгәртеү менән бәйле идара итеү мәсьәләләрен хәл итеү", + "apihelp-managetags-summary": "Тегтарҙы үҙгәртеү менән бәйле идара итеү мәсьәләләрен хәл итеү", "apihelp-managetags-param-reason": "\nБилдәне булдырыу, юйҙырыу, активациялау һәм деактивациялау өсөн мотлаҡ булмаған сәбәп", - "apihelp-mergehistory-description": "Үҙгәртеүҙәр тарихын берләштереү.", + "apihelp-mergehistory-summary": "Үҙгәртеүҙәр тарихын берләштереү.", "apihelp-mergehistory-param-from": "Тарихты берләштергән бит атамаһы. $1fromid менән бергә ҡуланыуы мөмкин түгел.", "apihelp-mergehistory-param-fromid": "Тарихты берләштергән бит атамаһы. $1fromid менән бергә ҡуланыуы мөмкин түгел.", "apihelp-mergehistory-param-to": "Тарихты берләштергән бит атамаһы. $1fromid менән бергә ҡуланыуы мөмкин түгел.", "apihelp-mergehistory-param-toid": "Тарихты берләштергән бит атамаһы. $1fromid менән бергә ҡуланыуы мөмкин түгел.", "apihelp-mergehistory-param-reason": "Тарихты берләштереү сәбәбе", - "apihelp-move-description": "Биттең исемен үҙгәртергә", + "apihelp-move-summary": "Биттең исемен үҙгәртергә", "apihelp-move-param-from": "Мөхәриррләү өсөн биттең исеме.$1биттәрҙән бергә файҙаланыу мөмкин түгел.", "apihelp-move-param-fromid": "Бит идентифакторын мөхәррирләү өсөн биттәр. $1title менән бергә ҡулланыла алмайҙар.", "apihelp-move-param-to": "Исемен үҙгәртергә тейешле биттең баш һүҙе", @@ -215,7 +215,7 @@ "apihelp-move-param-watchlist": "Ағымдағы ҡулланыусының теҙмәһенән битте һүҙһеҙ өҫтәргә йәки юйырға, һылтанмаларҙы файҙаланығыҙ йәки сәғәтте алмаштырмаҫҡа.", "apihelp-move-param-ignorewarnings": "Бөтә иҫкәрмәләргә иғтибар итмәҫкә", "apihelp-move-example-move": "Исемен үҙгәртергә Badtitle Goodtitle йүнәлтеү ҡуймаҫҡа.", - "apihelp-opensearch-description": "OpenSearch протоколын ҡулланып вики эҙләү.", + "apihelp-opensearch-summary": "OpenSearch протоколын ҡулланып вики эҙләү.", "apihelp-opensearch-param-search": "Эҙләү юлы.", "apihelp-opensearch-param-limit": "Ҡайтарылған һөҙөмтәләрҙең максималь һаны.", "apihelp-opensearch-param-namespace": "Эҙләү өсөн исемдәр арауығы", @@ -223,7 +223,7 @@ "apihelp-opensearch-example-te": " Te менән башланған биттәрҙе табырға.", "apihelp-options-param-reset": "Килешеү буйынса көйләүҙәргә күсергә.", "apihelp-options-example-reset": "Бөтә көйләүҙәрҙе ташларға", - "apihelp-paraminfo-description": "API модуле тураһында мәғлүмәт алырға.", + "apihelp-paraminfo-summary": "API модуле тураһында мәғлүмәт алырға.", "apihelp-paraminfo-param-helpformat": "Белешмә юлы форматы.", "apihelp-parse-param-prop": "Ҡайһы мәғлүмәтте алырға:", "apihelp-parse-paramvalue-prop-langlinks": "Вики-текстың синтаксик анализында тышҡы ссылкалар бирә.", @@ -253,7 +253,7 @@ "apihelp-patrol-param-tags": "Юйҙырылғандар журналындағы яҙмаларға мөрәжәғәт итер өсөн, билдәләрҙе үҙгәртергә.", "apihelp-patrol-example-rcid": "Һуңғы үҙгәрештәрҙе ҡарау.", "apihelp-patrol-example-revid": "Яңынан ҡарау.", - "apihelp-protect-description": "Битте һаҡлау кимәлен үҙгәртергә", + "apihelp-protect-summary": "Битте һаҡлау кимәлен үҙгәртергә", "apihelp-protect-param-title": "Бит атамаһы. $1pageid менән бергә ҡулланылмай.", "apihelp-protect-param-reason": "(ООН) һағы сәбәптәре.", "apihelp-protect-param-tags": "Юйҙырылғандар журналындағы яҙмаларға мөрәжәғәт итер өсөн, билдәләрҙе үҙгәртергә.", @@ -265,7 +265,7 @@ "apihelp-purge-param-forcerecursivelinkupdate": "Һылтанманы һәм таблицаны яңыртығыҙ һәм был битте шаблон итеп ҡулланған башҡа биттәр өсөн һылтанмаларҙы ла яңыртығыҙ.", "apihelp-query-param-list": "Ниндәй исемлекте ҡулланырға", "apihelp-query-param-meta": "Ниндәй матамәғлүмәт ҡулланырға", - "apihelp-query+allcategories-description": "Бөтә категорияларҙы иҫәпләргә", + "apihelp-query+allcategories-summary": "Бөтә категорияларҙы иҫәпләргә", "apihelp-query+allcategories-param-from": "Иҫәп күсереү башланған ваҡыт билдәһе", "apihelp-query+allcategories-param-to": "Иҫәп күсереү башланған ваҡыт билдәһе", "apihelp-query+allcategories-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", @@ -275,14 +275,14 @@ "apihelp-query+allcategories-paramvalue-prop-size": "Категорияларға биттәр һаны өҫтәү", "apihelp-query+allcategories-example-size": "Биттәр һаны буйынса мәғлүмәтле категориялар исемлеге.", "apihelp-query+allcategories-example-generator": "исемлек категориялар битенән мәғлүмәт алырға.", - "apihelp-query+alldeletedrevisions-description": "Бар мөхәррирләү исемлеге ҡулланыусы тарафынан юйылған.", + "apihelp-query+alldeletedrevisions-summary": "Бар мөхәррирләү исемлеге ҡулланыусы тарафынан юйылған.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "$3ҡулланыусының менән генә ҡулланыла ала.", "apihelp-query+alldeletedrevisions-param-end": "Иҫәп күсереү башланған ваҡыт билдәһе", "apihelp-query+alldeletedrevisions-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", "apihelp-query+alldeletedrevisions-param-user": "Бары тик был ҡулланыусының үҙгәртеүҙәр исемлеге.", "apihelp-query+alldeletedrevisions-param-namespace": "Бары тик был исемдәр арауығындағы биттәр исемлеге.", "apihelp-query+alldeletedrevisions-example-ns-main": "Төп исемдәр арауығында юйылған тәүге 50 үҙгәртеү исемлеге.", - "apihelp-query+allfileusages-description": "Юйылғандар менән бергә барлыҡ файлдар тәртибе исемлеге.", + "apihelp-query+allfileusages-summary": "Юйылғандар менән бергә барлыҡ файлдар тәртибе исемлеге.", "apihelp-query+allfileusages-param-from": "Һанауҙы башлау өсөн файл атамаһы.", "apihelp-query+allfileusages-param-to": "Һанауҙы туҡтатыу файлы атамаһы.", "apihelp-query+allfileusages-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", @@ -293,7 +293,7 @@ "apihelp-query+allfileusages-example-unique": "Атамаларҙың уҙенсәлекле файлдары исемлеге.", "apihelp-query+allfileusages-example-unique-generator": "Төшөп ҡалғандарҙы айырып, барлыҡ исем-һылтанмаларҙы алырға.", "apihelp-query+allfileusages-example-generator": "Һылтанмалы биттәр бар.", - "apihelp-query+allimages-description": "Бер-бер артлы бөтә образдарҙы һанап сығырға.", + "apihelp-query+allimages-summary": "Бер-бер артлы бөтә образдарҙы һанап сығырға.", "apihelp-query+allimages-param-sort": "Сортировкалау үҙенсәлектәре.", "apihelp-query+allimages-param-dir": "Һанау йүнәлеше.", "apihelp-query+allimages-param-minsize": "Һүрәттәр лимиты (байттарҙа).", @@ -301,7 +301,7 @@ "apihelp-query+allimages-param-limit": "Кире ҡайтыу өсөн образдар һаны.", "apihelp-query+allimages-example-B": "Б хәрефенән башланған файлдар исемлеген күрһәтергә.", "apihelp-query+allimages-example-generator": "Б хәрефенән башланған файлдар исемлеген күрһәтергә.", - "apihelp-query+alllinks-description": "Бирелгән исемдәр арауығына йүнәлткән барлыҡ һылтанмаларҙы һанап сығырға.", + "apihelp-query+alllinks-summary": "Бирелгән исемдәр арауығына йүнәлткән барлыҡ һылтанмаларҙы һанап сығырға.", "apihelp-query+alllinks-param-from": "Һанауҙы башлау өсөн һылтанма атамаһы.", "apihelp-query+alllinks-param-to": "Һанауҙы туҡтатыу һылтанмаһы атамаһы.", "apihelp-query+alllinks-param-prefix": "Был мәғәнәнән башланған бәйләнешле бар атамаларҙы эҙләргә.", @@ -313,7 +313,7 @@ "apihelp-query+alllinks-example-unique": "Атамаларҙың уҙенсәлекле файлдары исемлеге.", "apihelp-query+alllinks-example-unique-generator": "Төшөп ҡалғандарҙы айырып, барлыҡ исем-һылтанмаларҙы алырға.", "apihelp-query+alllinks-example-generator": "Һылтанмалы биттәр бар.", - "apihelp-query+allmessages-description": "Был сайттан хәбәр ҡайтарыу.", + "apihelp-query+allmessages-summary": "Был сайттан хәбәр ҡайтарыу.", "apihelp-query+allmessages-param-prop": "Ниндәй үҙенсәлек алырға:", "apihelp-query+allmessages-param-args": "Аргументтар Хәбәрҙәрҙә биреләсәк.", "apihelp-query+allpages-param-from": "Иҫәп күсереү башланған ваҡыт билдәһе", @@ -398,7 +398,7 @@ "apihelp-query+links-param-limit": "Күпме һылтанмаларҙы кире ҡайтарырға.", "apihelp-query+links-param-dir": "Һанау йүнәлеше.", "apihelp-query+linkshere-param-prop": "Ниндәй үҙенсәлек алырға:", - "apihelp-query+logevents-description": "Журналдарҙан ваҡиға алыу.", + "apihelp-query+logevents-summary": "Журналдарҙан ваҡиға алыу.", "apihelp-query+logevents-param-prop": "Ниндәй үҙенсәлек алырға:", "apihelp-query+logevents-param-start": "Иҫәп күсереү башланған ваҡыт билдәһе", "apihelp-query+logevents-param-end": "Иҫәп күсереү тамамланған ваҡыт билдәһе", @@ -428,7 +428,7 @@ "apihelp-query+search-param-info": "Ниндәй матамәғлүмәт ҡулланырға", "apihelp-query+search-param-prop": "Ниндәй үҙенсәлекте ҡайтарырға", "apihelp-query+search-param-limit": "Нисә битте тергеҙергә?", - "apihelp-query+tags-description": "Үҙгәртелгән тамғалар исемлеге.", + "apihelp-query+tags-summary": "Үҙгәртелгән тамғалар исемлеге.", "apihelp-query+tags-param-limit": "Кире ҡайтарылған белдереүҙәрҙең иң күп һаны", "apihelp-query+tags-param-prop": "Ниндәй үҙенсәлек алырға:", "apihelp-query+tags-example-simple": "Аңлайышлы тамғалар бите", @@ -436,6 +436,7 @@ "apihelp-query+templates-param-dir": "Һанау йүнәлеше.", "apihelp-query+transcludedin-param-prop": "Ниндәй үҙенсәлек алырға:", "apihelp-query+transcludedin-param-limit": "Күпме һылтанмаларҙы кире ҡайтарырға.", - "apihelp-query+usercontribs-description": "Ҡулланыусының бөтә төҙәтеүҙәрен алыу", - "apihelp-query+usercontribs-param-limit": "Кире ҡайтарылған белдереүҙәрҙең иң күп һаны" + "apihelp-query+usercontribs-summary": "Ҡулланыусының бөтә төҙәтеүҙәрен алыу", + "apihelp-query+usercontribs-param-limit": "Кире ҡайтарылған белдереүҙәрҙең иң күп һаны", + "apierror-timeout": "Көтөлгән ваҡыт эсендә сервер яуып бирмәне." } diff --git a/includes/api/i18n/be-tarask.json b/includes/api/i18n/be-tarask.json index 6634645e7e..3dad83001d 100644 --- a/includes/api/i18n/be-tarask.json +++ b/includes/api/i18n/be-tarask.json @@ -5,7 +5,8 @@ "Renessaince" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Дакумэнтацыя]]\n* [[mw:API:FAQ|Частыя пытаньні]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n
    \nСтатус: усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\nПамылковыя запыты: калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым значэньне загалоўку і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце [[mw:API:Errors_and_warnings|API: Памылкі і папярэджаньні]].\n\nТэставаньне: для зручнасьці праверкі API-запытаў, глядзіце [[Special:ApiSandbox]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Дакумэнтацыя]]\n* [[mw:API:FAQ|Частыя пытаньні]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n
    \nСтатус: усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\nПамылковыя запыты: калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым значэньне загалоўку і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце [[mw:API:Errors_and_warnings|API: Памылкі і папярэджаньні]].\n\nТэставаньне: для зручнасьці праверкі API-запытаў, глядзіце [[Special:ApiSandbox]].", "apihelp-main-param-action": "Дзеяньне для выкананьня.", "apihelp-main-param-format": "Фармат вываду.", "apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі maxlag з паведамленьнем кшталту Чаканьне $host: $lag сэкундаў затрымкі.
    Глядзіце [[mw:Manual:Maxlag_parameter|Інструкцыя:Парамэтар maxlag]] дзеля дадатковай інфармацыі.", @@ -17,7 +18,7 @@ "apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.", "apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку Origin, павінна быць зададзена нешта кшталту https://en.wikipedia.org або https://meta.wikimedia.org. Калі парамэтар не супадае з загалоўкам Origin, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам Origin і крыніца знаходзіцца ў белым сьпісе, будуць выстаўленыя загалоўкі Access-Control-Allow-Origin і Access-Control-Allow-Credentials.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне *. Гэта прывядзе да выстаўленьня загалоўку Access-Control-Allow-Origin, але Access-Control-Allow-Credentials будзе мець значэньне false і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.", "apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] з siprop=languages вяртае сьпіс кодаў мовы, або трэба вызначыць user, каб ужываць налады мовы цяперашняга карыстальніка, або вызначыць content, каб ужываць мову зьместу гэтай вікі.", - "apihelp-block-description": "Блякаваньне ўдзельніка.", + "apihelp-block-summary": "Блякаваньне ўдзельніка.", "apihelp-block-param-user": "Імя ўдзельніка, IP-адрас або IP-дыяпазон, якія вы хочаце заблякаваць. Ня можа быць ужыты разам з $1userid", "apihelp-block-param-expiry": "Час заканчэньня. Можа быць адносным (напрыклад, 5 months або 2 weeks) ці абсалютным (напрыклад, 2014-09-18T12:34:56Z). Калі выстаўлены на infinite, indefinite ці never, блякаваньне будзе бестэрміновым.", "apihelp-block-param-reason": "Прычына блякаваньня.", @@ -31,9 +32,10 @@ "apihelp-block-param-watchuser": "Назіраць за старонкай удзельніка або старонкай IP-адрасу, а таксама старонкай гутарак.", "apihelp-block-example-ip-simple": "Заблякаваць IP-адрас 192.0.2.5 на тры дні з прычынай First strike.", "apihelp-block-example-user-complex": "Заблякаваць удзельніка Vandal назаўсёды з прычынай Vandalism, а таксама забараніць стварэньне новых рахункаў і адсылку лістоў электроннай поштай.", - "apihelp-clearhasmsg-description": "Ачышчае сьцяг hasmsg для актуальнага карыстальніка.", + "apihelp-clearhasmsg-summary": "Ачышчае сьцяг hasmsg для актуальнага карыстальніка.", "apihelp-clearhasmsg-example-1": "Ачыстка сьцягу hasmsg для актуальнага карыстальніка", - "apihelp-compare-description": "Атрымаць розьніцу паміж 2 старонкамі.\n\nВы мусіце перадаць нумар вэрсіі, назву або ID старонкі для абодвух «from» і «to».", + "apihelp-compare-summary": "Атрымаць розьніцу паміж 2 старонкамі.", + "apihelp-compare-extended-description": "Вы мусіце перадаць нумар вэрсіі, назву або ID старонкі для абодвух «from» і «to».", "apihelp-compare-param-fromtitle": "Першая назва для параўнаньня.", "apihelp-compare-param-fromid": "ID першай старонкі для параўнаньня.", "apihelp-compare-param-fromrev": "Першая вэрсія для параўнаньня.", @@ -41,7 +43,7 @@ "apihelp-compare-param-toid": "ID другой старонкі для параўнаньня.", "apihelp-compare-param-torev": "Другая вэрсія для параўнаньня.", "apihelp-compare-example-1": "Паказвае розьніцу паміж вэрсіямі 1 і 2", - "apihelp-createaccount-description": "Стварэньне новага рахунку ўдзельніка.", + "apihelp-createaccount-summary": "Стварэньне новага рахунку ўдзельніка.", "apihelp-createaccount-param-name": "Імя ўдзельніка.", "apihelp-createaccount-param-password": "Пароль (ігнаруецца, калі выстаўлена $1mailpassword).", "apihelp-createaccount-param-domain": "Дамэн для вонкавай аўтэнтыфікацыі (неабавязкова).", diff --git a/includes/api/i18n/bg.json b/includes/api/i18n/bg.json index 29c06059a9..3839bda628 100644 --- a/includes/api/i18n/bg.json +++ b/includes/api/i18n/bg.json @@ -7,22 +7,22 @@ ] }, "apihelp-main-param-action": "Кое действие да се извърши.", - "apihelp-block-description": "Блокиране на потребител.", + "apihelp-block-summary": "Блокиране на потребител.", "apihelp-block-param-user": "Потребителско име, IP адрес или диапазон от IP адреси, които искате да блокирате.", "apihelp-block-param-reason": "Причина за блокиране.", "apihelp-block-param-nocreate": "Забрана за създаване на потребителски сметки.", "apihelp-block-param-hidename": "Скрива потребителското име от дневника на блокиранията. (Изисква право hideuser)", - "apihelp-createaccount-description": "Създаване на нова потребителска сметка.", + "apihelp-createaccount-summary": "Създаване на нова потребителска сметка.", "apihelp-createaccount-param-name": "Потребителско име.", "apihelp-createaccount-param-email": "Адрес на електронна поща на потребителя (незадължително).", "apihelp-createaccount-param-realname": "Истинско име на потребителя (незадължително).", - "apihelp-delete-description": "Изтриване на страница.", - "apihelp-edit-description": "Създаване и редактиране на страници.", + "apihelp-delete-summary": "Изтриване на страница.", + "apihelp-edit-summary": "Създаване и редактиране на страници.", "apihelp-edit-param-text": "Съдържание на страница.", "apihelp-edit-param-minor": "Малка промяна.", "apihelp-edit-param-notminor": "Значителна промяна.", "apihelp-edit-param-bot": "Отбелязване на редакцията като бот.", - "apihelp-emailuser-description": "Изпращане на е-писмо до потребител.", + "apihelp-emailuser-summary": "Изпращане на е-писмо до потребител.", "apihelp-emailuser-param-target": "Получател на имейла.", "apihelp-emailuser-param-subject": "Заглавие на тема.", "apihelp-emailuser-param-text": "Съдържание на писмото.", @@ -47,7 +47,7 @@ "apihelp-login-param-name": "Потребителско име.", "apihelp-login-param-password": "Парола.", "apihelp-login-param-domain": "Домейн (по избор).", - "apihelp-move-description": "Преместване на страница.", + "apihelp-move-summary": "Преместване на страница.", "apihelp-move-param-reason": "Причина за преименуването.", "apihelp-move-param-movetalk": "Преименуване на беседата, ако има такава.", "apihelp-move-param-movesubpages": "Преименуване на подстраници, ако е приложимо.", diff --git a/includes/api/i18n/bgn.json b/includes/api/i18n/bgn.json index 6f8f59650b..62fa6c8385 100644 --- a/includes/api/i18n/bgn.json +++ b/includes/api/i18n/bgn.json @@ -4,7 +4,7 @@ "Ibrahim khashrowdi" ] }, - "apihelp-block-description": "کار زوروکئ بستین", + "apihelp-block-summary": "کار زوروکئ بستین", "apihelp-createaccount-param-name": "کار زورؤکین نام.", "apihelp-login-param-name": "کار زورؤکین نام.", "apihelp-userrights-param-user": "کار زورؤکین نام." diff --git a/includes/api/i18n/bn.json b/includes/api/i18n/bn.json index fe93ebea44..bfec841cef 100644 --- a/includes/api/i18n/bn.json +++ b/includes/api/i18n/bn.json @@ -8,11 +8,11 @@ }, "apihelp-main-param-format": "আউটপুটের বিন্যাস", "apihelp-main-param-requestid": "এখানে প্রদত্ত যেকোন মান প্রতিক্রিয়ায় অন্তর্ভুক্ত করা হবে। অনুরোধের পার্থক্য করতে ব্যবহার করা যেতে পারে।", - "apihelp-block-description": "ব্যবহারকারীকে বাধা দিন।", + "apihelp-block-summary": "ব্যবহারকারীকে বাধা দিন।", "apihelp-block-param-reason": "বাধার দানের কারণ।", - "apihelp-createaccount-description": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন", + "apihelp-createaccount-summary": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন", "apihelp-createaccount-param-name": "ব্যবহারকারী নাম।", - "apihelp-delete-description": "একটি পাতা মুছে ফেলুন।", + "apihelp-delete-summary": "একটি পাতা মুছে ফেলুন।", "apihelp-delete-example-simple": "প্রধান পাতা মুছে ফেলুন।", "apihelp-edit-param-text": "পাতার বিষয়বস্তু।", "apihelp-edit-param-minor": "অনুল্লেখ্য সম্পাদনা।", diff --git a/includes/api/i18n/br.json b/includes/api/i18n/br.json index a8f4dd8e59..079ea43a3c 100644 --- a/includes/api/i18n/br.json +++ b/includes/api/i18n/br.json @@ -5,17 +5,17 @@ "Fulup" ] }, - "apihelp-block-description": "Stankañ un implijer", + "apihelp-block-summary": "Stankañ un implijer", "apihelp-block-param-reason": "Abeg evit stankañ.", - "apihelp-createaccount-description": "Krouiñ ur gont implijer nevez.", + "apihelp-createaccount-summary": "Krouiñ ur gont implijer nevez.", "apihelp-createaccount-param-name": "Anv implijer.", - "apihelp-delete-description": "Diverkañ ur bajenn.", - "apihelp-edit-description": "Krouiñ pajennoù ha kemmañ anezho.", + "apihelp-delete-summary": "Diverkañ ur bajenn.", + "apihelp-edit-summary": "Krouiñ pajennoù ha kemmañ anezho.", "apihelp-edit-param-sectiontitle": "Titl ur rannbennad nevez.", "apihelp-edit-param-text": "Danvez ar bajenn.", "apihelp-edit-param-minor": "Kemmig dister.", "apihelp-edit-example-edit": "Kemmañ ur bajenn.", - "apihelp-emailuser-description": "Kas ur postel d'un implijer.", + "apihelp-emailuser-summary": "Kas ur postel d'un implijer.", "apihelp-emailuser-param-text": "Korf ar postel.", "apihelp-expandtemplates-param-title": "Titl ar bajenn.", "apihelp-feedcontributions-param-year": "Adalek ar bloaz (ha koshoc'h)", @@ -28,7 +28,7 @@ "apihelp-login-param-password": "Ger-tremen.", "apihelp-login-param-domain": "Domani (diret).", "apihelp-login-example-login": "Kevreañ.", - "apihelp-move-description": "Dilec'hiañ ur bajenn.", + "apihelp-move-summary": "Dilec'hiañ ur bajenn.", "apihelp-move-param-noredirect": "Chom hep krouiñ un adkas.", "apihelp-protect-example-protect": "Gwareziñ ur bajenn.", "apihelp-rollback-param-tags": "Tikedennoù da lakaat e talvoud war an distroioù." diff --git a/includes/api/i18n/bs.json b/includes/api/i18n/bs.json index 841bb2a4e8..7771f80ef8 100644 --- a/includes/api/i18n/bs.json +++ b/includes/api/i18n/bs.json @@ -7,11 +7,11 @@ }, "apihelp-main-param-action": "Koju akciju izvesti.", "apihelp-main-param-format": "Format izlaza.", - "apihelp-block-description": "Blokiraj korisnika", + "apihelp-block-summary": "Blokiraj korisnika", "apihelp-block-param-reason": "Razlog za blokadu", "apihelp-block-example-ip-simple": "Blokiraj IP adresu 192.0.2.5 na tri dana sa razlogom Prvi napad.", "apihelp-compare-param-fromtitle": "Prvi naslov za poređenje.", - "apihelp-delete-description": "Obriši stranicu.", + "apihelp-delete-summary": "Obriši stranicu.", "apihelp-edit-param-text": "Sadržaj stranice.", "apihelp-edit-param-minor": "Mala izmjena." } diff --git a/includes/api/i18n/ca.json b/includes/api/i18n/ca.json index 987231f234..bba97338ad 100644 --- a/includes/api/i18n/ca.json +++ b/includes/api/i18n/ca.json @@ -12,22 +12,22 @@ "apihelp-main-param-action": "Quina acció realitzar.", "apihelp-main-param-format": "El format de la sortida.", "apihelp-main-param-curtimestamp": "Inclou la marca horària actual en el resultat.", - "apihelp-block-description": "Bloca un usuari.", + "apihelp-block-summary": "Bloca un usuari.", "apihelp-block-param-reason": "Raó del blocatge.", "apihelp-block-param-nocreate": "Evita la creació de comptes.", - "apihelp-createaccount-description": "Creeu un nou compte d'usuari.", + "apihelp-createaccount-summary": "Creeu un nou compte d'usuari.", "apihelp-createaccount-param-name": "Nom d'usuari.", "apihelp-createaccount-param-password": "Contrasenya (ignorada si es defineix $1mailpassword)", "apihelp-createaccount-param-email": "Adreça electrònica de l'usuari (opcional).", "apihelp-createaccount-param-realname": "Nom real de l'usuari (opcional).", - "apihelp-delete-description": "Suprimeix una pàgina.", - "apihelp-disabled-description": "Aquest mòdul ha estat desactivat.", - "apihelp-edit-description": "Crea i edita pàgines.", + "apihelp-delete-summary": "Suprimeix una pàgina.", + "apihelp-disabled-summary": "Aquest mòdul ha estat desactivat.", + "apihelp-edit-summary": "Crea i edita pàgines.", "apihelp-edit-param-text": "Contingut de la pàgina.", "apihelp-edit-param-minor": "Edició menor.", "apihelp-edit-param-createonly": "No editeu aquesta pàgina si ja existeix.", "apihelp-edit-example-edit": "Editeu una pàgina.", - "apihelp-emailuser-description": "Envieu un correu electrònic a un usuari.", + "apihelp-emailuser-summary": "Envieu un correu electrònic a un usuari.", "apihelp-emailuser-param-target": "Usuari a qui enviar el correu.", "apihelp-emailuser-param-text": "Cos del correu.", "apihelp-emailuser-param-ccme": "Envia'm una còpia d'aquest correu electrònic.", @@ -42,7 +42,7 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtra segons etiqueta.", "apihelp-feedrecentchanges-param-target": "Mostra només els canvis de les pàgines enllaçades a aquesta pàgina.", "apihelp-feedrecentchanges-example-simple": "Mostra els canvis recents.", - "apihelp-help-description": "Mostra l’ajuda dels mòduls especificats.", + "apihelp-help-summary": "Mostra l’ajuda dels mòduls especificats.", "apihelp-help-example-recursive": "Tota l'ajuda en una sola pàgina.", "apihelp-import-param-rootpage": "Importa com a subpàgina d'aquesta pàgina.", "apihelp-login-param-name": "Nom d'usuari.", diff --git a/includes/api/i18n/ce.json b/includes/api/i18n/ce.json index fa7c460ed3..dc6ee3ce1f 100644 --- a/includes/api/i18n/ce.json +++ b/includes/api/i18n/ce.json @@ -8,9 +8,9 @@ "apihelp-main-param-format": "Гойту формат.", "apihelp-main-param-curtimestamp": "Хилламийн юкъатоха ханна йолу билгало", "apihelp-createaccount-param-name": "Декъашхочун цӀе.", - "apihelp-delete-description": "ДӀаяккха агӀо.", + "apihelp-delete-summary": "ДӀаяккха агӀо.", "apihelp-edit-example-edit": "АгӀо таян", - "apihelp-emailuser-description": "Декъашхочунга кехат", + "apihelp-emailuser-summary": "Декъашхочунга кехат", "apihelp-emailuser-param-target": "Электронан кехатан адрес.", "apihelp-emailuser-param-subject": "Хьедаран корта.", "apihelp-emailuser-param-text": "Кехатан чулацам", @@ -18,8 +18,8 @@ "apihelp-feedrecentchanges-param-hideminor": "Къайладаха жима нисдарш.", "apihelp-feedrecentchanges-param-tagfilter": "Тегийн луьттург.", "apihelp-login-example-login": "ЧугӀо", - "apihelp-logout-description": "ЧугӀой сессийн хаамаш дӀацӀанбе.", - "apihelp-move-description": "АгӀон цӀе хийца.", + "apihelp-logout-summary": "ЧугӀой сессийн хаамаш дӀацӀанбе.", + "apihelp-move-summary": "АгӀон цӀе хийца.", "apihelp-opensearch-param-search": "Лахаран могӀа.", "apihelp-parse-example-page": "АгӀо зер", "apihelp-parse-example-text": "Wikitext зер.", diff --git a/includes/api/i18n/cs.json b/includes/api/i18n/cs.json index ca1e85a2ee..1e11427aa3 100644 --- a/includes/api/i18n/cs.json +++ b/includes/api/i18n/cs.json @@ -10,13 +10,14 @@ "Macofe", "Danny B.", "LordMsz", - "Dvorapa" + "Dvorapa", + "Matěj Suchánek" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
    \nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\nTestování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
    \nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\nTestování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].", "apihelp-main-param-action": "Která akce se má provést.", "apihelp-main-param-format": "Formát výstupu.", - "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.
    Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].", + "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.
    Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].", "apihelp-main-param-smaxage": "Nastaví HTTP hlavičku pro řízení kešování s-maxage na uvedený počet sekund. Chyby se nekešují nikdy.", "apihelp-main-param-maxage": "Nastaví HTTP hlavičku pro řízení kešování max-age na uvedený počet sekund. Chyby se nekešují nikdy.", "apihelp-main-param-assert": "Pokud je nastaveno na „user“, ověří, že je uživatel přihlášen, pokud je nastaveno na „bot“, ověří, že má oprávnění „bot“.", @@ -25,14 +26,14 @@ "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.", "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu).\n\nU autentizovaných požadavků hodnota musí přesně odpovídat jednomu z původů v hlavičce Origin, takže musí být nastavena na něco jako https://en.wikipedia.org nebo https://meta.wikimedia.org. Pokud parametr neodpovídá hlavičce Origin, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce Origin a tento původ je na bílé listině, budou nastaveny hlavičky Access-Control-Allow-Origin a Access-Control-Allow-Credentials.\n\nU neautentizovaných požadavků uveďte hodnotu *. To způsobí nastavení hlavičky Access-Control-Allow-Origin, ale hlavička Access-Control-Allow-Credentials bude false a budou omezena všechna data specifická pro uživatele.", "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] se siprop=languages získáte seznam jazykových kódů nebo zadejte „user“ pro použití předvoleného jazyka aktuálního uživatele či „content“ pro použití jazyka obsahu této wiki.", - "apihelp-block-description": "Zablokovat uživatele.", + "apihelp-block-summary": "Zablokovat uživatele.", "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat. Nelze použít dohromady s $1userid.", "apihelp-block-param-reason": "Důvod bloku.", "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).", "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.", "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)", "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění hideuser.)", - "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.", "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.", "apihelp-block-example-ip-simple": "Na tři dny zablokovat IP adresu 192.0.2.5 s odůvodněním First strike.", @@ -41,7 +42,8 @@ "apihelp-checktoken-param-token": "Token, který se má otestovat.", "apihelp-checktoken-param-maxtokenage": "Nejvyšší povolené stáří tokenu v sekundách.", "apihelp-checktoken-example-simple": "Testuje správnost tokenu csrf.", - "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ i „to“ musíte zadat číslo revize, název stránky nebo ID stránky.", + "apihelp-compare-summary": "Vrátí rozdíl dvou stránek.", + "apihelp-compare-extended-description": "Ve „from“ i „to“ musíte zadat číslo revize, název stránky nebo ID stránky.", "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.", "apihelp-compare-param-fromid": "ID první stránky k porovnání.", "apihelp-compare-param-fromrev": "Číslo revize první stránky k porovnání.", @@ -49,7 +51,7 @@ "apihelp-compare-param-toid": "ID druhé stránky k porovnání.", "apihelp-compare-param-torev": "Číslo revize druhé stránky k porovnání.", "apihelp-compare-example-1": "Porovnat revize 1 a 2.", - "apihelp-createaccount-description": "Vytvořit nový uživatelský účet.", + "apihelp-createaccount-summary": "Vytvořit nový uživatelský účet.", "apihelp-createaccount-param-name": "Uživatelské jméno.", "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno $1mailpassword).", "apihelp-createaccount-param-domain": "Doména pro externí ověření (volitelné).", @@ -60,15 +62,15 @@ "apihelp-createaccount-param-language": "Kód jazyka, který se má uživateli nastavit jako výchozí (volitelné, výchozí je jazyk obsahu).", "apihelp-createaccount-example-pass": "Vytvořit uživatele testuser s heslem test123.", "apihelp-createaccount-example-mail": "Vytvořit uživatele testmailuser a zaslat mu e-mail s náhodně vygenerovaným heslem.", - "apihelp-delete-description": "Smazat stránku.", + "apihelp-delete-summary": "Smazat stránku.", "apihelp-delete-param-title": "Název stránky, která se má smazat. Není možné použít společně s $1pageid.", "apihelp-delete-param-pageid": "ID stránky, která se má smazat. Není možné použít společně s $1title.", "apihelp-delete-param-watch": "Přidat stránku na seznam sledovaných.", "apihelp-delete-param-unwatch": "Odstranit stránku ze seznamu sledovaných.", "apihelp-delete-example-simple": "Smazat stránku Main Page.", "apihelp-delete-example-reason": "Smazat stránku Main Page s odůvodněním Preparing for move.", - "apihelp-disabled-description": "Tento modul byl deaktivován.", - "apihelp-edit-description": "Vytvářet a upravovat stránky.", + "apihelp-disabled-summary": "Tento modul byl deaktivován.", + "apihelp-edit-summary": "Vytvářet a upravovat stránky.", "apihelp-edit-param-title": "Název stránky, kterou chcete editovat. Nelze použít společně s $1pageid.", "apihelp-edit-param-pageid": "ID stránky, která se má editovat. Není možné použít společně s $1title.", "apihelp-edit-param-sectiontitle": "Název nové sekce.", @@ -80,20 +82,20 @@ "apihelp-edit-param-nocreate": "Pokud stránka neexistuje, vrátit chybu.", "apihelp-edit-param-watch": "Přidat stránku na seznam sledovaných.", "apihelp-edit-param-unwatch": "Odstranit stránku ze seznamu sledovaných.", - "apihelp-edit-param-watchlist": "Bezpodmíněnečně přidat nebo odstranit stránku ze sledovaných stránek aktuálního uživatele, použít nastavení nebo neměnit sledování.", + "apihelp-edit-param-watchlist": "Bezpodmínečně přidat nebo odstranit stránku ze sledovaných stránek aktuálního uživatele, použít nastavení nebo neměnit sledování.", "apihelp-edit-param-redirect": "Automaticky opravit přesměrování.", "apihelp-edit-example-edit": "Upravit stránku.", - "apihelp-emailuser-description": "Poslat uživateli e-mail.", + "apihelp-emailuser-summary": "Poslat uživateli e-mail.", "apihelp-emailuser-param-target": "Uživatel, kterému se má e-mail poslat.", "apihelp-emailuser-param-subject": "Hlavička s předmětem.", "apihelp-emailuser-param-text": "Tělo zprávy.", "apihelp-emailuser-param-ccme": "Odeslat mi kopii této zprávy.", "apihelp-emailuser-example-email": "Poslat e-mail uživateli WikiSysop s textem Content.", - "apihelp-expandtemplates-description": "Rozbalí všechny šablony ve wikitextu.", + "apihelp-expandtemplates-summary": "Rozbalí všechny šablony ve wikitextu.", "apihelp-expandtemplates-param-title": "Název stránky.", "apihelp-expandtemplates-param-text": "Wikitext k převedení.", "apihelp-expandtemplates-param-revid": "ID revize, pro {{REVISIONID}} a podobné proměnné.", - "apihelp-feedcontributions-description": "Vrátí kanál příspěvků uživatele.", + "apihelp-feedcontributions-summary": "Vrátí kanál příspěvků uživatele.", "apihelp-feedcontributions-param-feedformat": "Formát kanálu.", "apihelp-feedcontributions-param-year": "Od roku (a dříve).", "apihelp-feedcontributions-param-month": "Od měsíce (a dříve)", @@ -115,10 +117,10 @@ "apihelp-feedrecentchanges-param-target": "Zobrazit jen změny na stránkách odkazovaných z této stránky.", "apihelp-feedrecentchanges-example-simple": "Zobrazit poslední změny.", "apihelp-feedrecentchanges-example-30days": "Zobrazit poslední změny za 30 dní.", - "apihelp-filerevert-description": "Revertovat soubor na starší verzi.", + "apihelp-filerevert-summary": "Revertovat soubor na starší verzi.", "apihelp-filerevert-param-filename": "Cílový název souboru, bez prefixu Soubor:", "apihelp-filerevert-param-comment": "Vložit komentář.", - "apihelp-help-description": "Zobrazuje nápovědu k uvedeným modulům.", + "apihelp-help-summary": "Zobrazuje nápovědu k uvedeným modulům.", "apihelp-help-param-modules": "Moduly, pro které se má zobrazit nápověda (hodnoty parametrů action a format anebo main). Submoduly lze zadávat pomocí +.", "apihelp-help-param-submodules": "Zahrnout nápovědu pro podmoduly uvedeného modulu.", "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro podmoduly rekurzivně.", @@ -129,7 +131,7 @@ "apihelp-help-example-recursive": "Veškerá nápověda na jedné stránce", "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy", "apihelp-help-example-query": "Nápověda pro dva podmoduly query", - "apihelp-imagerotate-description": "Otočit jeden nebo více obrázků.", + "apihelp-imagerotate-summary": "Otočit jeden nebo více obrázků.", "apihelp-imagerotate-example-generator": "Otočit všechny obrázky v Category:Flip o 180 stupňů.", "apihelp-import-param-summary": "Shrnutí do protokolovacího záznamu importu.", "apihelp-import-param-xml": "Nahraný XML soubor.", @@ -140,7 +142,7 @@ "apihelp-login-param-domain": "Doména (volitelná)", "apihelp-login-example-login": "Přihlášení", "apihelp-logout-example-logout": "Odhlášení aktuálního uživatele.", - "apihelp-move-description": "Přesunout stránku.", + "apihelp-move-summary": "Přesunout stránku.", "apihelp-move-param-reason": "Důvod k přejmenování.", "apihelp-move-param-movetalk": "Přejmenovat diskuzní stránku, pokud existuje.", "apihelp-move-param-movesubpages": "Přejmenovat možné podstránky", @@ -148,11 +150,11 @@ "apihelp-move-param-watch": "Přidat stránku a přesměrování do sledovaných stránek aktuálního uživatele.", "apihelp-move-param-unwatch": "Odstranit stránku a přesměrování ze sledovaných stránek současného uživatele.", "apihelp-move-param-ignorewarnings": "Ignorovat všechna varování.", - "apihelp-opensearch-description": "Vyhledávání na wiki pomocí protokolu OpenSearch.", + "apihelp-opensearch-summary": "Vyhledávání na wiki pomocí protokolu OpenSearch.", "apihelp-opensearch-param-search": "Hledaný řetězec.", "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků", "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.", - "apihelp-opensearch-param-suggest": "Pokud je [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vypnuto, nedělat nic.", + "apihelp-opensearch-param-suggest": "Pokud je [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vypnuto, nedělat nic.", "apihelp-opensearch-param-format": "Formát výstupu.", "apihelp-opensearch-example-te": "Najít stránky začínající na „Te“.", "apihelp-options-param-reset": "Vrátit nastavení na výchozí hodnoty.", @@ -164,15 +166,15 @@ "apihelp-parse-example-text": "Parsovat wikitext.", "apihelp-parse-example-summary": "Parsovat shrnutí.", "apihelp-patrol-example-revid": "Prověřit revizi.", - "apihelp-protect-description": "Změnit úroveň zamčení stránky.", + "apihelp-protect-summary": "Změnit úroveň zamčení stránky.", "apihelp-protect-param-reason": "Důvod pro odemčení.", "apihelp-protect-example-protect": "Zamknout stránku.", "apihelp-query+allcategories-param-limit": "Kolik má být zobrazeno kategorií.", - "apihelp-query+alldeletedrevisions-description": "Seznam všech smazaných revizí od konkrétního uživatele nebo v konkrétním jmenném prostoru.", + "apihelp-query+alldeletedrevisions-summary": "Seznam všech smazaných revizí od konkrétního uživatele nebo v konkrétním jmenném prostoru.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Není možné užít s $3user.", "apihelp-query+alldeletedrevisions-example-user": "Seznam posledních 50 smazaných editací uživatele Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Seznam prvních 50 smazaných revizí v hlavním jmenném prostoru.", - "apihelp-query+allfileusages-description": "Zobrazit seznam všech použití souboru, včetně neexistujících.", + "apihelp-query+allfileusages-summary": "Zobrazit seznam všech použití souboru, včetně neexistujících.", "apihelp-query+allfileusages-example-unique": "Zobrazit seznam unikátních názvů souborů.", "apihelp-query+allimages-param-minsize": "Omezit na obrázky, které mají alespoň tento počet bajtů.", "apihelp-query+allimages-param-maxsize": "Omezit na obrázky, které mají maximálně tento počet bajtů.", @@ -182,23 +184,23 @@ "apihelp-query+allpages-param-minsize": "Omezit na stránky s určitým počtem bajtů.", "apihelp-query+allpages-param-prtype": "Omezit jen na zamčené stránky.", "apihelp-query+allpages-example-B": "Zobrazit seznam stránek začínajících na písmeno B.", - "apihelp-query+allredirects-description": "Seznam všech přesměrování pro jmenný prostor.", + "apihelp-query+allredirects-summary": "Seznam všech přesměrování pro jmenný prostor.", "apihelp-query+allredirects-example-unique": "Seznam unikátních cílových stránek.", "apihelp-query+allredirects-example-generator": "Získat stránky obsahující přesměrování.", "apihelp-query+alltransclusions-param-limit": "Kolik položek zobrazit celkem.", "apihelp-query+alltransclusions-example-unique": "Seznam unikátně vložených titulů.", "apihelp-query+allusers-example-Y": "Zobrazit uživatele počínaje písmenem Y.", - "apihelp-query+backlinks-description": "Najít všechny stránky, které odkazují na danou stránku.", + "apihelp-query+backlinks-summary": "Najít všechny stránky, které odkazují na danou stránku.", "apihelp-query+backlinks-example-simple": "Zobrazit odkazy na Main page.", "apihelp-query+blocks-example-simple": "Vypsat zablokování.", "apihelp-query+blocks-example-users": "Seznam bloků uživatelů Alice a Bob.", - "apihelp-query+categories-description": "Zobrazit všechny kategorie, do kterých je stránka zařazena.", + "apihelp-query+categories-summary": "Zobrazit všechny kategorie, do kterých je stránka zařazena.", "apihelp-query+categories-param-limit": "Kolik kategorií má být zobrazeno.", - "apihelp-query+categorymembers-description": "Seznam všech stránek v dané kategorii.", + "apihelp-query+categorymembers-summary": "Seznam všech stránek v dané kategorii.", "apihelp-query+categorymembers-param-limit": "Maximální počet stránek k zobrazení.", "apihelp-query+categorymembers-example-simple": "Zobrazit prvních 10 stránek v Category:Physics", "apihelp-query+categorymembers-example-generator": "Získat informace o prvních 10 stránkách v Category:Physics.", - "apihelp-query+contributors-description": "Zobrazit seznam registrovaných a počet anonymních přispěvatelů stránky.", + "apihelp-query+contributors-summary": "Zobrazit seznam registrovaných a počet anonymních přispěvatelů stránky.", "apihelp-query+contributors-param-limit": "Kolik přispěvatelů má být zobrazeno.", "apihelp-query+contributors-example-simple": "Zobrazit přispěvatele stránky Main Page.", "apihelp-query+deletedrevs-param-excludeuser": "Nezahrnovat revize od tohoto uživatele.", @@ -214,7 +216,7 @@ "apihelp-query+langbacklinks-param-lang": "Jazyk pro jazykový odkaz.", "apihelp-query+langbacklinks-example-simple": "Zobrazit stránky odkazující na [[:fr:Test]]", "apihelp-query+langbacklinks-example-generator": "Získat informace o stránkách odkazujících na [[:fr:Test]].", - "apihelp-query+langlinks-description": "Zobrazit všechny mezijazykové odkazy z daných stránek.", + "apihelp-query+langlinks-summary": "Zobrazit všechny mezijazykové odkazy z daných stránek.", "apihelp-query+langlinks-param-lang": "Zobrazit pouze jazykové odkazy s tímto kódem jazyka.", "apihelp-query+linkshere-example-generator": "Získat informace o stránkách, které odkazují na [[Hlavní Stránka|Hlavní stránku]].", "apihelp-query+recentchanges-param-excludeuser": "Nezobrazovat změny od tohoto uživatele.", @@ -224,28 +226,28 @@ "apihelp-query+search-example-simple": "Hledat meaning", "apihelp-query+tags-example-simple": "Získat seznam dostupných tagů.", "apihelp-query+usercontribs-example-user": "Zobrazit příspěvky uživatele Příklad", - "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.", + "apihelp-query+watchlistraw-summary": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.", "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.", "apihelp-stashedit-param-summary": "Změnit shrnutí.", "apihelp-unblock-param-user": "Uživatel, IP adresa nebo rozsah IP adres k odblokování. Nelze použít dohromady s $1id nebo $1userid.", "apihelp-watch-example-watch": "Sledovat stránku Main Page.", "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.", "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.", - "apihelp-json-description": "Vypisuje data ve formátu JSON.", + "apihelp-json-summary": "Vypisuje data ve formátu JSON.", "apihelp-json-param-callback": "Pokud je uvedeno, obalí výstup do zadaného volání funkce. Z bezpečnostních důvodů budou omezena všechna data specifická pro uživatele.", "apihelp-json-param-utf8": "Pokud je uvedeno, bude většina ne-ASCII znaků (ale ne všechny) kódována v UTF-8 místo nahrazení hexadecimálními escape sekvencemi. Implicitní chování, pokud není formatversion nastaveno na 1.", - "apihelp-jsonfm-description": "Vypisuje data ve formátu JSON (v čitelné HTML podobě).", - "apihelp-none-description": "Nevypisuje nic.", - "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.", - "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).", - "apihelp-rawfm-description": "Data včetně ladicích prvků vypisuje ve formátu JSON (v čitelné HTML podobě).", - "apihelp-xml-description": "Vypisuje data ve formátu XML.", + "apihelp-jsonfm-summary": "Vypisuje data ve formátu JSON (v čitelné HTML podobě).", + "apihelp-none-summary": "Nevypisuje nic.", + "apihelp-php-summary": "Vypisuje data v serializačním formátu PHP.", + "apihelp-phpfm-summary": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).", + "apihelp-rawfm-summary": "Data včetně ladicích prvků vypisuje ve formátu JSON (v čitelné HTML podobě).", + "apihelp-xml-summary": "Vypisuje data ve formátu XML.", "apihelp-xml-param-xslt": "Pokud je uvedeno, přidá uvedenou stránku jako stylopis XSL. Hodnotou musí být název stránky ve jmenném prostoru MediaWiki, jejíž název končí na .xsl.", "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.", - "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).", + "apihelp-xmlfm-summary": "Vypisuje data ve formátu XML (v čitelné HTML podobě).", "api-format-title": "Odpověď z MediaWiki API", - "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr format. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte format=$2.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].", - "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].", + "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr format. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte format=$2.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].", + "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].", "api-help-title": "Nápověda k MediaWiki API", "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Hlavní modul", @@ -287,6 +289,7 @@ "api-help-open-in-apisandbox": "[otevřít v pískovišti]", "apierror-nosuchsection-what": "$2 neobsahuje sekci $1.", "apierror-sectionsnotsupported-what": "$1 nepodporuje sekce.", + "apierror-timeout": "Server neodpověděl v očekávaném čase.", "api-credits-header": "Zásluhy", "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index f8e6acdff2..8a2fd5ff38 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -17,13 +17,15 @@ "FriedhelmW", "Predatorix", "Luke081515", - "Eddie" + "Eddie", + "Zenith", + "Tacsipacsi" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n
    \nStatus: Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\nFehlerhafte Anfragen: Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].\n\nTesten: Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentation]]\n* [[mw:Special:MyLanguage/API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n
    \nStatus: Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\nFehlerhafte Anfragen: Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Fehler und Warnungen]].\n\nTesten: Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].", "apihelp-main-param-action": "Auszuführende Aktion.", "apihelp-main-param-format": "Format der Ausgabe.", - "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode maxlag zurückgegeben mit einer Nachricht wie Waiting for $host: $lag seconds lagged.
    Siehe [[mw:Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.", + "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode maxlag zurückgegeben mit einer Nachricht wie Waiting for $host: $lag seconds lagged.
    Siehe [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.", "apihelp-main-param-smaxage": "Den s-maxage-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gepuffert.", "apihelp-main-param-maxage": "Den max-age-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.", "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf user gesetzt, oder Bot ist, wenn auf bot gesetzt.", @@ -36,7 +38,7 @@ "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] mit siprop=languages gibt eine Liste der Sprachcodes zurück. Gib user zum Verwenden der aktuellen Benutzerspracheinstellung oder content an, um die Inhaltssprache des Wikis zu verwenden.", "apihelp-main-param-errorformat": "Zu verwendendes Format zur Ausgabe von Warnungen und Fehlertexten.\n; plaintext: Wikitext mit entfernten HTML-Tags und ersetzten Entitäten.\n; wikitext: Ungeparster Wikitext.\n; html: HTML.\n; raw: Nachrichtenschlüssel und Parameter.\n; none: Keine Textausgabe, nur die Fehlercodes.\n; bc: Vor MediaWiki 1.29 verwendetes Format. errorlang und errorsuselocal werden ignoriert.", "apihelp-main-param-errorsuselocal": "Falls angegeben, verwenden Fehlertexte lokalisierte Nachrichten aus dem {{ns:MediaWiki}}-Namensraum.", - "apihelp-block-description": "Einen Benutzer sperren.", + "apihelp-block-summary": "Sperrt einen Benutzer.", "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der gesperrt werden soll. Kann nicht zusammen mit $1userid verwendet werden.", "apihelp-block-param-userid": "Die zu sperrende Benutzerkennung. Kann nicht zusammen mit $1user verwendet werden.", "apihelp-block-param-expiry": "Sperrdauer. Kann relativ (z. B. 5 months oder 2 weeks) oder absolut (z. B. 2014-09-18T12:34:56Z) sein. Wenn auf infinite, indefinite oder never gesetzt, ist die Sperre unbegrenzt.", @@ -46,31 +48,33 @@ "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.", "apihelp-block-param-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das blockemail-Recht).", "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das hideuser-Recht).", - "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.", "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.", "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.", "apihelp-block-example-ip-simple": "IP 192.0.2.5 für drei Tage mit der Begründung „First strike“ (erste Verwarnung) sperren", "apihelp-block-example-user-complex": "Benutzer Vandal unbeschränkt sperren mit der Begründung „Vandalism“ (Vandalismus), Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.", - "apihelp-changeauthenticationdata-description": "Ändert die Authentifizierungsdaten für den aktuellen Benutzer.", + "apihelp-changeauthenticationdata-summary": "Ändert die Authentifizierungsdaten für den aktuellen Benutzer.", "apihelp-changeauthenticationdata-example-password": "Versucht, das Passwort des aktuellen Benutzers in ExamplePassword zu ändern.", - "apihelp-checktoken-description": "Überprüft die Gültigkeit eines über [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] erhaltenen Tokens.", + "apihelp-checktoken-summary": "Überprüft die Gültigkeit eines über [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] erhaltenen Tokens.", "apihelp-checktoken-param-type": "Typ des Tokens, das getestet werden soll.", "apihelp-checktoken-param-token": "Token, das getestet werden soll.", "apihelp-checktoken-param-maxtokenage": "Maximal erlaubtes Alter des Tokens in Sekunden.", "apihelp-checktoken-example-simple": "Überprüft die Gültigkeit des csrf-Tokens.", - "apihelp-clearhasmsg-description": "Löschen des hasmsg-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.", + "apihelp-clearhasmsg-summary": "Löschen des hasmsg-Flags („hat Nachrichten“-Flag) für den aktuellen Benutzer.", "apihelp-clearhasmsg-example-1": "hasmsg-Flags für den aktuellen Benutzer löschen", "apihelp-clientlogin-example-login": "Startet den Prozess der Anmeldung in dem Wiki als Benutzer Example mit dem Passwort ExamplePassword.", - "apihelp-compare-description": "Abrufen des Unterschieds zwischen zwei Seiten.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitennummer für „from“ als auch „to“ angeben.", + "apihelp-compare-summary": "Ruft den Unterschied zwischen zwei Seiten ab.", + "apihelp-compare-extended-description": "Du musst eine Versionsnummer, einen Seitentitel oder eine Seitennummer für „from“ als auch „to“ angeben.", "apihelp-compare-param-fromtitle": "Erster zu vergleichender Titel.", "apihelp-compare-param-fromid": "Erste zu vergleichende Seitennummer.", "apihelp-compare-param-fromrev": "Erste zu vergleichende Version.", "apihelp-compare-param-totitle": "Zweiter zu vergleichender Titel.", "apihelp-compare-param-toid": "Zweite zu vergleichende Seitennummer.", "apihelp-compare-param-torev": "Zweite zu vergleichende Version.", + "apihelp-compare-paramvalue-prop-title": "Die Seitentitel der Versionen „Von“ und „Nach“.", "apihelp-compare-example-1": "Unterschied zwischen Version 1 und 2 abrufen", - "apihelp-createaccount-description": "Erstellen eines neuen Benutzerkontos.", + "apihelp-createaccount-summary": "Erstellt ein neues Benutzerkonto.", "apihelp-createaccount-param-preservestate": "Falls [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] für hasprimarypreservedstate wahr ausgegeben hat, sollten Anfragen, die als primary-required markiert wurden, ausgelassen werden. Falls ein nicht-leerer Wert für preservedusername zurückgegeben wurde, muss dieser Benutzername für den Parameter username verwendet werden.", "apihelp-createaccount-param-name": "Benutzername.", "apihelp-createaccount-param-password": "Passwort (wird ignoriert, wenn $1mailpassword angegeben ist).", @@ -83,7 +87,7 @@ "apihelp-createaccount-param-language": "Festzulegender standardmäßiger Sprachcode für den Benutzer (optional, Standard ist Inhaltssprache).", "apihelp-createaccount-example-pass": "Benutzer testuser mit dem Passwort test123 erstellen.", "apihelp-createaccount-example-mail": "Benutzer testmailuser erstellen und zufällig generiertes Passwort per E-Mail verschicken.", - "apihelp-delete-description": "Löschen einer Seite.", + "apihelp-delete-summary": "Löscht eine Seite.", "apihelp-delete-param-title": "Titel der Seite, die gelöscht werden soll. Kann nicht zusammen mit $1pageid verwendet werden.", "apihelp-delete-param-pageid": "Seitennummer der Seite, die gelöscht werden soll. Kann nicht zusammen mit $1title verwendet werden.", "apihelp-delete-param-reason": "Löschbegründung. Falls nicht festgelegt, wird eine automatisch generierte Begründung verwendet.", @@ -94,8 +98,8 @@ "apihelp-delete-param-oldimage": "Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.", "apihelp-delete-example-simple": "Main Page löschen.", "apihelp-delete-example-reason": "Main Page löschen mit der Begründung Preparing for move.", - "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.", - "apihelp-edit-description": "Erstellen und Bearbeiten von Seiten.", + "apihelp-disabled-summary": "Dieses Modul wurde deaktiviert.", + "apihelp-edit-summary": "Erstellen und Bearbeiten von Seiten.", "apihelp-edit-param-title": "Titel der Seite, die bearbeitet werden soll. Kann nicht zusammen mit $1pageid verwendet werden.", "apihelp-edit-param-pageid": "Seitennummer der Seite, die bearbeitet werden soll. Kann nicht zusammen mit $1title verwendet werden.", "apihelp-edit-param-section": "Abschnittsnummer. 0 für die Einleitung, new für einen neuen Abschnitt.", @@ -126,13 +130,13 @@ "apihelp-edit-example-edit": "Eine Seite bearbeiten", "apihelp-edit-example-prepend": "__NOTOC__ bei einer Seite voranstellen", "apihelp-edit-example-undo": "Versionen 13579 bis 13585 mit automatischer Zusammenfassung rückgängig machen", - "apihelp-emailuser-description": "E-Mail an einen Benutzer senden.", + "apihelp-emailuser-summary": "E-Mail an einen Benutzer senden.", "apihelp-emailuser-param-target": "Benutzer, an den die E-Mail gesendet werden soll.", "apihelp-emailuser-param-subject": "Betreffzeile.", "apihelp-emailuser-param-text": "E-Mail-Inhalt.", "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.", "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer WikiSysop mit dem Text Content senden.", - "apihelp-expandtemplates-description": "Alle Vorlagen innerhalb des Wikitextes expandieren.", + "apihelp-expandtemplates-summary": "Alle Vorlagen innerhalb des Wikitextes expandieren.", "apihelp-expandtemplates-param-title": "Titel der Seite.", "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.", "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von {{REVISIONID}} und ähnlichen Variablen verwendet wird.", @@ -149,7 +153,7 @@ "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.", "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Den Wikitext {{Project:Sandbox}} expandieren.", - "apihelp-feedcontributions-description": "Gibt einen Benutzerbeiträge-Feed zurück.", + "apihelp-feedcontributions-summary": "Gibt einen Benutzerbeiträge-Feed zurück.", "apihelp-feedcontributions-param-feedformat": "Das Format des Feeds.", "apihelp-feedcontributions-param-user": "Von welchen Benutzern die Beiträge abgerufen werden sollen.", "apihelp-feedcontributions-param-namespace": "Auf welchen Namensraum die Beiträge begrenzt werden sollen.", @@ -162,7 +166,7 @@ "apihelp-feedcontributions-param-hideminor": "Blendet Kleinigkeiten aus.", "apihelp-feedcontributions-param-showsizediff": "Zeigt den Größenunterschied zwischen Versionen an.", "apihelp-feedcontributions-example-simple": "Beiträge für die Benutzer Beispiel zurückgeben", - "apihelp-feedrecentchanges-description": "Gibt einen Letzte-Änderungen-Feed zurück.", + "apihelp-feedrecentchanges-summary": "Gibt einen Letzte-Änderungen-Feed zurück.", "apihelp-feedrecentchanges-param-feedformat": "Das Format des Feeds.", "apihelp-feedrecentchanges-param-namespace": "Namensraum, auf den die Ergebnisse beschränkt werden sollen.", "apihelp-feedrecentchanges-param-invert": "Alle Namensräume außer dem ausgewählten.", @@ -184,18 +188,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Zeigt stattdessen nur Änderungen auf Seiten in einer dieser Kategorien.", "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen", "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen", - "apihelp-feedwatchlist-description": "Gibt einen Beobachtungslisten-Feed zurück.", + "apihelp-feedwatchlist-summary": "Gibt einen Beobachtungslisten-Feed zurück.", "apihelp-feedwatchlist-param-feedformat": "Das Format des Feeds.", "apihelp-feedwatchlist-param-hours": "Seiten auflisten, die innerhalb dieser Anzahl Stunden ab jetzt geändert wurden.", "apihelp-feedwatchlist-param-linktosections": "Verlinke direkt zum veränderten Abschnitt, wenn möglich.", "apihelp-feedwatchlist-example-default": "Den Beobachtungslisten-Feed anzeigen", "apihelp-feedwatchlist-example-all6hrs": "Zeige alle Änderungen an beobachteten Seiten der letzten 6 Stunden.", - "apihelp-filerevert-description": "Eine Datei auf eine alte Version zurücksetzen.", + "apihelp-filerevert-summary": "Eine Datei auf eine alte Version zurücksetzen.", "apihelp-filerevert-param-filename": "Ziel-Datei, ohne das Datei:-Präfix.", "apihelp-filerevert-param-comment": "Hochladekommentar.", "apihelp-filerevert-param-archivename": "Archivname der Version, auf die die Datei zurückgesetzt werden soll.", "apihelp-filerevert-example-revert": "Wiki.png auf die Version vom 2011-03-05T15:27:40Z zurücksetzen.", - "apihelp-help-description": "Hilfe für die angegebenen Module anzeigen.", + "apihelp-help-summary": "Hilfe für die angegebenen Module anzeigen.", "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter action und format oder main). Kann Submodule mit einem + angeben.", "apihelp-help-param-submodules": "Hilfe für Submodule des benannten Moduls einschließen.", "apihelp-help-param-recursivesubmodules": "Hilfe für Submodule rekursiv einschließen.", @@ -207,12 +211,13 @@ "apihelp-help-example-recursive": "Alle Hilfen in einer Seite", "apihelp-help-example-help": "Hilfe für das Hilfemodul selbst", "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule", - "apihelp-imagerotate-description": "Ein oder mehrere Bilder drehen.", + "apihelp-imagerotate-summary": "Ein oder mehrere Bilder drehen.", "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.", "apihelp-imagerotate-param-tags": "Auf den Eintrag im Datei-Logbuch anzuwendende Markierungen", "apihelp-imagerotate-example-simple": "Datei:Beispiel.png um 90 Grad drehen.", "apihelp-imagerotate-example-generator": "Alle Bilder in der Kategorie:Flip um 180 Grad drehen.", - "apihelp-import-description": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.\n\nBitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den xml-Parameter zu senden.", + "apihelp-import-summary": "Importiert eine Seite aus einem anderen Wiki oder von einer XML-Datei.", + "apihelp-import-extended-description": "Bitte beachte, dass der HTTP-POST-Vorgang als Dateiupload ausgeführt werden muss (z.B. durch multipart/form-data), um eine Datei über den xml-Parameter zu senden.", "apihelp-import-param-summary": "Importzusammenfassung des Logbucheintrags.", "apihelp-import-param-xml": "Hochgeladene XML-Datei.", "apihelp-import-param-interwikisource": "Für Interwiki-Importe: Wiki, von dem importiert werden soll.", @@ -223,16 +228,18 @@ "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit $1namespace verwendet werden.", "apihelp-import-param-tags": "Auf den Eintrag im Import-Logbuch und die Nullversion bei den importierten Seiten anzuwendende Änderungsmarkierungen.", "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.", - "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-linkaccount-summary": "Verbindet ein Benutzerkonto von einem Drittanbieter mit dem aktuellen Benutzer.", + "apihelp-login-summary": "Anmelden und Authentifizierungs-Cookies beziehen.", + "apihelp-login-extended-description": "Diese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Benutzername.", "apihelp-login-param-password": "Passwort.", "apihelp-login-param-domain": "Domain (optional).", "apihelp-login-param-token": "Anmeldetoken, den du in der ersten Anfrage erhalten hast.", "apihelp-login-example-gettoken": "Ruft einen Anmelde-Token ab", "apihelp-login-example-login": "Anmelden", - "apihelp-logout-description": "Abmelden und alle Sitzungsdaten löschen.", + "apihelp-logout-summary": "Abmelden und alle Sitzungsdaten löschen.", "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab", - "apihelp-managetags-description": "Ermöglicht Verwaltungsaufgaben zu Änderungsmarkierungen.", + "apihelp-managetags-summary": "Ermöglicht Verwaltungsaufgaben zu Änderungsmarkierungen.", "apihelp-managetags-param-operation": "Welcher Vorgang soll ausgeführt werden:\n;create:Ein neues Änderungsschlagwort zum manuellen Gebrauch erstellen.\n;delete:Ein Änderungsschlagwort aus der Datenbank entfernen. Einschließlich dem Entfernen des Schlagworts von allen Überarbeitungen, kürzlichen Änderungseinträgen und Logbuch-Einträgen, in denen es genutzt wird.\n;activate:Ein Änderungsschlagwort aktivieren und damit Benutzern erlauben es manuell anzuwenden.\n;deactive:Ein Änderungsschlagwort deaktivieren und damit die manuelle Verwendung durch Benutzer unterbinden.", "apihelp-managetags-param-tag": "Schlagwort zum Erstellen, Löschen, Aktivieren oder Deaktivieren. Zum Erstellen darf das Schlagwort noch nicht vorhanden sein. Zur Löschung muss das Schlagwort vorhanden sein. Zur Aktivierung muss das Schlagwort vorhanden sein, darf aber nicht von einer Erweiterung in Gebrauch sein. Zur Deaktivierung muss das Schlagwort gegenwärtig aktiv und manuell definiert sein.", "apihelp-managetags-param-reason": "optionale Begründung für das Erstellen, Löschen, Aktivieren oder Deaktivieren der Markierung.", @@ -242,10 +249,10 @@ "apihelp-managetags-example-delete": "Löscht die vandlaism-Markierung mit der Begründung Misspelt.", "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens spam mit der Begründung For use in edit patrolling (für die Eingangskontrolle).", "apihelp-managetags-example-deactivate": "Deaktiviert eine Markierung namens spam mit der Begründung No longer required (nicht mehr benötigt).", - "apihelp-mergehistory-description": "Führt Versionsgeschichten von Seiten zusammen.", + "apihelp-mergehistory-summary": "Führt Versionsgeschichten von Seiten zusammen.", "apihelp-mergehistory-param-reason": "Grund für die Zusammenführung der Versionsgeschichten", "apihelp-mergehistory-example-merge": "Fügt alle Versionen von Oldpage der Versionsgeschichte von Newpage hinzu.", - "apihelp-move-description": "Eine Seite verschieben.", + "apihelp-move-summary": "Eine Seite verschieben.", "apihelp-move-param-from": "Titel der zu verschiebenden Seite. Kann nicht zusammen mit $1fromid verwendet werden.", "apihelp-move-param-fromid": "Seitenkennung der zu verschiebenden Seite. Kann nicht zusammen mit $1from verwendet werden.", "apihelp-move-param-to": "Titel, zu dem die Seite umbenannt werden soll.", @@ -259,16 +266,16 @@ "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.", "apihelp-move-param-tags": "Auf den Eintrag im Verschiebungs-Logbuch und die Nullversion der Zielseite anzuwendende Änderungsmarkierungen.", "apihelp-move-example-move": "Badtitle nach Goodtitle verschieben, ohne eine Weiterleitung zu erstellen.", - "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.", + "apihelp-opensearch-summary": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.", "apihelp-opensearch-param-search": "Such-Zeichenfolge.", "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.", "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.", - "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] falsch ist.", + "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] falsch ist.", "apihelp-opensearch-param-redirects": "Wie mit Weiterleitungen umgegangen werden soll:\n;return:Gibt die Weiterleitung selbst zurück.\n;resolve:Gibt die Zielseite zurück. Kann weniger als $1limit Ergebnisse zurückgeben.\nAus Kompatibilitätsgründen ist für $1format=json die Vorgabe \"return\" und \"resolve\" für alle anderen Formate.", "apihelp-opensearch-param-format": "Das Format der Ausgabe.", "apihelp-opensearch-param-warningsaserror": "Wenn Warnungen mit format=json auftreten, gib einen API-Fehler zurück, anstatt ihn zu ignorieren.", "apihelp-opensearch-example-te": "Seiten finden, die mit Te beginnen.", - "apihelp-options-description": "Die Voreinstellungen des gegenwärtigen Benutzers ändern.", + "apihelp-options-summary": "Die Voreinstellungen des gegenwärtigen Benutzers ändern.", "apihelp-options-param-reset": "Setzt die Einstellungen auf Websitestandards zurück.", "apihelp-options-param-resetkinds": "Liste von zurückzusetzenden Optionstypen, wenn die $1reset-Option ausgewählt ist.", "apihelp-options-param-change": "Liste von Änderungen, die mit name=wert formatiert sind (z. B. skin=vector). Falls kein Wert angegeben wurde (ohne einem Gleichheitszeichen), z. B. Optionname|AndereOption|…, wird die Option auf ihren Standardwert zurückgesetzt. Falls ein übergebener Wert ein Trennzeichen enthält (|), verwende den [[Special:ApiHelp/main#main/datatypes|alternativen Mehrfachwerttrenner]] zur korrekten Bedienung.", @@ -276,7 +283,7 @@ "apihelp-options-example-reset": "Alle Einstellungen zurücksetzen", "apihelp-options-example-change": "Ändert die Einstellungen skin und hideminor.", "apihelp-options-example-complex": "Setzt alle Einstellungen zurück, dann skin und nickname festlegen.", - "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.", + "apihelp-paraminfo-summary": "Ruft Informationen über API-Module ab.", "apihelp-paraminfo-param-modules": "Liste von Modulnamen (Werte der Parameter action und format oder main). Kann Untermodule mit einem + oder alle Untermodule mit +* oder alle Untermodule rekursiv mit +** bestimmen.", "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.", "apihelp-paraminfo-param-querymodules": "Liste von Abfragemodulnamen (Werte von prop-, meta- oder list-Parameter). Benutze $1modules=query+foo anstatt $1querymodules=foo.", @@ -302,12 +309,15 @@ "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.", "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.", "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.", + "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <head> der Seite zurück.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.", "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.", "apihelp-parse-paramvalue-prop-iwlinks": "Gibt Interwiki-Links des geparsten Wikitextes zurück.", "apihelp-parse-paramvalue-prop-wikitext": "Gibt den originalen Wikitext zurück, der geparst wurde.", "apihelp-parse-paramvalue-prop-properties": "Gibt verschiedene Eigenschaften zurück, die im geparsten Wikitext definiert sind.", + "apihelp-parse-paramvalue-prop-parsewarnings": "Gibt die Warnungen aus, die beim Parsen des Inhalts aufgetreten sind.", + "apihelp-parse-param-wrapoutputclass": "Zu verwendende CSS-Klasse, in der die Parserausgabe verpackt werden soll.", "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls new, parst $1text und $1sectiontitle, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\nnew ist nur erlaubt mit der Angabe text.", "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn section = new ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die summary ersetzt, wenn er weggelassen oder leer ist.", "apihelp-parse-param-disablepp": "Benutze $1disablelimitreport stattdessen.", @@ -316,36 +326,38 @@ "apihelp-parse-param-preview": "Im Vorschaumodus parsen.", "apihelp-parse-param-sectionpreview": "Im Abschnitt Vorschau-Modus parsen (aktiviert ebenfalls den Vorschau-Modus)", "apihelp-parse-param-disabletoc": "Inhaltsverzeichnis in der Ausgabe weglassen.", + "apihelp-parse-param-useskin": "Wendet die ausgewählte Benutzeroberfläche auf die Parserausgabe an. Kann Auswirkungen auf die folgenden Eigenschaften haben: langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-param-contentmodel": "Inhaltsmodell des eingegebenen Textes. Fall ausgelassen, muss $1title angegeben werden und Standardwert wird das Modell des angegebenen Titels. Ist nur gültig im Zusammenhang mit $1text.", "apihelp-parse-example-page": "Eine Seite parsen.", "apihelp-parse-example-text": "Wikitext parsen.", "apihelp-parse-example-texttitle": "Parst den Wikitext über die Eingabe des Seitentitels.", "apihelp-parse-example-summary": "Parst eine Zusammenfassung.", - "apihelp-patrol-description": "Kontrolliert eine Seite oder Version.", + "apihelp-patrol-summary": "Kontrolliert eine Seite oder Version.", "apihelp-patrol-param-rcid": "Letzte-Änderungen-Kennung, die kontrolliert werden soll.", "apihelp-patrol-param-revid": "Versionskennung, die kontrolliert werden soll.", "apihelp-patrol-param-tags": "Auf den Kontroll-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.", "apihelp-patrol-example-rcid": "Kontrolliert eine kürzlich getätigte Änderung.", "apihelp-patrol-example-revid": "Kontrolliert eine Version", - "apihelp-protect-description": "Ändert den Schutzstatus einer Seite.", + "apihelp-protect-summary": "Ändert den Schutzstatus einer Seite.", "apihelp-protect-param-title": "Titel der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1pageid verwendet werden.", "apihelp-protect-param-pageid": "Seitenkennung der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1title verwendet werden.", "apihelp-protect-param-protections": "Listet die Schutzebenen nach dem Format Aktion=Ebene (z. B. edit=sysop) auf. Die Ebene all bedeutet, dass jeder die Aktion ausführen darf, z. B. keine Beschränkung.\n\nHINWEIS: Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.", "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte infinite, indefinite, infinity oder never übergeben.", "apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.", "apihelp-protect-param-tags": "Auf den Seitenschutz-Logbuch-Eintrag anzuwendende Änderungsmarkierungen.", - "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (z. B. werden eingebundene Vorlagen und Bilder in dieser Seite geschützt). Wird ignoriert, falls keine der angegebenen Schutzebenen Kaskaden unterstützt.", + "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (d. h. in dieser Seite eingebundene Vorlagen und Bilder werden geschützt). Wird ignoriert, falls keine der angegebenen Schutzebenen Kaskaden unterstützt.", "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste des aktuellen Benutzers hinzu.", "apihelp-protect-param-watchlist": "Die Seite bedingungslos zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.", "apihelp-protect-example-protect": "Schützt eine Seite", "apihelp-protect-example-unprotect": "Entsperrt eine Seite, indem die Einschränkungen durch den Schutz auf all gestellt werden (z. B. darf jeder die Aktion ausführen).", "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden", - "apihelp-purge-description": "Setzt den Cache der angegebenen Seiten zurück.", + "apihelp-purge-summary": "Setzt den Cache der angegebenen Seiten zurück.", "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.", "apihelp-purge-param-forcerecursivelinkupdate": "Aktualisiert die Linktabelle der Seite und alle Linktabellen der Seiten, die sie als Vorlage einbinden.", "apihelp-purge-example-simple": "Purgt die Main Page und die API-Seite.", "apihelp-purge-example-generator": "Purgt die ersten 10 Seiten des Hauptnamensraums.", - "apihelp-query-description": "Bezieht Daten von und über MediaWiki.\n\nAlle Änderungsvorgänge müssen unter Angabe eines Tokens ablaufen, um Missbrauch durch böswillige Anwendungen vorzubeugen.", + "apihelp-query-summary": "Bezieht Daten von und über MediaWiki.", + "apihelp-query-extended-description": "Alle Änderungsvorgänge müssen unter Angabe eines Tokens ablaufen, um Missbrauch durch böswillige Anwendungen vorzubeugen.", "apihelp-query-param-prop": "Zurückzugebende Eigenschaften der abgefragten Seiten.", "apihelp-query-param-list": "Welche Listen abgerufen werden sollen.", "apihelp-query-param-meta": "Zurückzugebende Metadaten.", @@ -356,7 +368,7 @@ "apihelp-query-param-rawcontinue": "Gibt query-continue-Rohdaten zur Fortsetzung zurück.", "apihelp-query-example-revisions": "Bezieht [[Special:ApiHelp/query+siteinfo|Seiteninformationen]] und [[Special:ApiHelp/query+revisions|Versionen]] der Main Page.", "apihelp-query-example-allpages": "Bezieht Versionen von Seiten, die mit API/ beginnen.", - "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.", + "apihelp-query+allcategories-summary": "Alle Kategorien aufzählen.", "apihelp-query+allcategories-param-from": "Kategorie, bei der die Auflistung beginnen soll.", "apihelp-query+allcategories-param-to": "Kategorie, bei der die Auflistung enden soll.", "apihelp-query+allcategories-param-prefix": "Listet alle Kategorien auf, die mit dem angegebenen Wert beginnen.", @@ -369,7 +381,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Markiert über __HIDDENCAT__ versteckte Kategorien.", "apihelp-query+allcategories-example-size": "Listet Kategorien mit der Anzahl ihrer Einträge auf.", "apihelp-query+allcategories-example-generator": "Bezieht Informationen über die Kategorieseite selbst für Kategorien, die mit List beginnen.", - "apihelp-query+alldeletedrevisions-description": "Bezieht alle gelöschten Versionen eines Benutzers oder eines Namensraumes.", + "apihelp-query+alldeletedrevisions-summary": "Bezieht alle gelöschten Versionen eines Benutzers oder eines Namensraumes.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Darf nur mit $3user verwendet werden.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kann nicht zusammen mit $3user benutzt werden.", "apihelp-query+alldeletedrevisions-param-start": "Der Zeitstempel, bei dem die Auflistung beginnen soll.", @@ -384,7 +396,7 @@ "apihelp-query+alldeletedrevisions-param-generatetitles": "Wenn als Generator verwendet, werden eher Titel als Bearbeitungs-IDs erzeugt.", "apihelp-query+alldeletedrevisions-example-user": "Liste die letzten 50 gelöschten Beiträge, sortiert nach Benutzer Beispiel.", "apihelp-query+alldeletedrevisions-example-ns-main": "Liste die ersten 50 gelöschten Bearbeitungen im Hauptnamensraum.", - "apihelp-query+allfileusages-description": "Liste alle Dateiverwendungen, einschließlich nicht-vorhandener.", + "apihelp-query+allfileusages-summary": "Liste alle Dateiverwendungen, einschließlich nicht-vorhandener.", "apihelp-query+allfileusages-param-from": "Titel der Datei, bei der die Aufzählung beginnen soll.", "apihelp-query+allfileusages-param-to": "Titel der Datei, bei der die Aufzählung enden soll.", "apihelp-query+allfileusages-param-prefix": "Sucht nach allen Dateititeln, die mit diesem Wert beginnen.", @@ -397,7 +409,7 @@ "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten", "apihelp-query+allfileusages-example-unique-generator": "Ruft alle Dateititel ab und markiert die fehlenden.", "apihelp-query+allfileusages-example-generator": "Seiten abrufen, die die Dateien enthalten", - "apihelp-query+allimages-description": "Alle Bilder nacheinander auflisten.", + "apihelp-query+allimages-summary": "Alle Bilder nacheinander auflisten.", "apihelp-query+allimages-param-sort": "Eigenschaft, nach der sortiert werden soll.", "apihelp-query+allimages-param-dir": "Aufzählungsrichtung.", "apihelp-query+allimages-param-from": "Der Bildtitel bei dem die Auflistung beginnen soll. Darf nur mit $1sort=Name verwendet werden.", @@ -417,7 +429,7 @@ "apihelp-query+allimages-example-recent": "Zeigt eine Liste von kürzlich hochgeladenen Dateien ähnlich zu [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Zeige eine Liste von Dateien mit den MIME-Typen image/png oder image/gif", "apihelp-query+allimages-example-generator": "Zeige Informationen über 4 Dateien beginnend mit dem Buchstaben T.", - "apihelp-query+alllinks-description": "Liste alle Verknüpfungen auf, die auf einen bestimmten Namensraum verweisen.", + "apihelp-query+alllinks-summary": "Liste alle Verknüpfungen auf, die auf einen bestimmten Namensraum verweisen.", "apihelp-query+alllinks-param-from": "Der Titel der Verknüpfung bei der die Auflistung beginnen soll.", "apihelp-query+alllinks-param-to": "Der Titel der Verknüpfung bei der die Auflistung enden soll.", "apihelp-query+alllinks-param-prefix": "Suche nach allen verknüpften Titeln die mit diesem Wert beginnen.", @@ -431,7 +443,7 @@ "apihelp-query+alllinks-example-unique": "Einheitlich verlinkte Titel auflisten", "apihelp-query+alllinks-example-unique-generator": "Ruft alle verknüpften Titel ab und markiert die fehlenden.", "apihelp-query+alllinks-example-generator": "Ruft Seiten ab welche die Verknüpfungen beinhalten.", - "apihelp-query+allmessages-description": "Gibt Nachrichten von dieser Website zurück.", + "apihelp-query+allmessages-summary": "Gibt Nachrichten von dieser Website zurück.", "apihelp-query+allmessages-param-messages": "Welche Nachrichten ausgegeben werden sollen. * (Vorgabe) bedeutet alle Nachrichten.", "apihelp-query+allmessages-param-prop": "Zurückzugebende Eigenschaften.", "apihelp-query+allmessages-param-enableparser": "Setzen, um den Parser zu aktivieren. Dies wird den Wikitext der Nachricht vorverarbeiten (magische Worte ersetzen, Vorlagen berücksichtigen, usw.).", @@ -447,7 +459,7 @@ "apihelp-query+allmessages-param-prefix": "Gebe Nachrichten mit diesem Präfix zurück.", "apihelp-query+allmessages-example-ipb": "Zeige Nachrichten die mit ipb- beginnen.", "apihelp-query+allmessages-example-de": "Zeige Nachrichten august und mainpage auf deutsch.", - "apihelp-query+allpages-description": "Listet alle Seiten in einem Namensraum nacheinander auf.", + "apihelp-query+allpages-summary": "Listet alle Seiten in einem Namensraum nacheinander auf.", "apihelp-query+allpages-param-from": "Seitentitel, bei dem die Auflistung beginnen soll.", "apihelp-query+allpages-param-to": "Seitentitel, bei dem die Auflistung enden soll.", "apihelp-query+allpages-param-prefix": "Nach Seitentiteln suchen, die mit diesem Wert beginnen.", @@ -465,7 +477,7 @@ "apihelp-query+allpages-example-B": "Bezieht eine Liste von Seiten, die mit dem Buchstaben B beginnen.", "apihelp-query+allpages-example-generator": "Gibt Informationen über vier Seiten mit dem Anfangsbuchstaben T zurück.", "apihelp-query+allpages-example-generator-revisions": "Übermittelt den Inhalt der ersten beiden Seiten, die mit Re beginnen und keine Weiterleitungen sind.", - "apihelp-query+allredirects-description": "Bezieht alle Weiterleitungen in einem Namensraum.", + "apihelp-query+allredirects-summary": "Bezieht alle Weiterleitungen in einem Namensraum.", "apihelp-query+allredirects-param-from": "Titel der Weiterleitung, bei der die Auflistung beginnen soll.", "apihelp-query+allredirects-param-to": "Titel der Weiterleitung, bei der die Auflistung enden soll.", "apihelp-query+allredirects-param-prefix": "Weiterleitungen auflisten, deren Zielseiten mit diesem Wert beginnen.", @@ -482,7 +494,7 @@ "apihelp-query+allredirects-example-unique": "Einzigartige Zielseiten auflisten.", "apihelp-query+allredirects-example-unique-generator": "Bezieht alle Zielseiten und markiert die Fehlenden.", "apihelp-query+allredirects-example-generator": "Seiten abrufen, die die Weiterleitungen enthalten", - "apihelp-query+allrevisions-description": "Liste alle Bearbeitungen.", + "apihelp-query+allrevisions-summary": "Liste alle Bearbeitungen.", "apihelp-query+allrevisions-param-start": "Der Zeitstempel, bei dem die Auflistung beginnen soll.", "apihelp-query+allrevisions-param-end": "Der Zeitstempel, bei dem die Auflistung enden soll.", "apihelp-query+allrevisions-param-user": "Liste nur Bearbeitungen von diesem Benutzer auf.", @@ -494,7 +506,7 @@ "apihelp-query+mystashedfiles-param-prop": "Welche Eigenschaften für die Dateien abgerufen werden sollen.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Ruft die Dateigröße und Bildabmessungen ab.", "apihelp-query+mystashedfiles-param-limit": "Wie viele Dateien zurückgegeben werden sollen.", - "apihelp-query+alltransclusions-description": "Liste alle Transklusionen auf (eingebettete Seiten die {{x}} benutzen), einschließlich nicht vorhandener.", + "apihelp-query+alltransclusions-summary": "Liste alle Transklusionen auf (eingebettete Seiten die {{x}} benutzen), einschließlich nicht vorhandener.", "apihelp-query+alltransclusions-param-from": "Der Titel der Transklusion bei dem die Auflistung beginnen soll.", "apihelp-query+alltransclusions-param-to": "Der Titel der Transklusion bei dem die Auflistung enden soll.", "apihelp-query+alltransclusions-param-prefix": "Suche nach allen transkludierten Titeln die mit diesem Wert beginnen.", @@ -507,7 +519,7 @@ "apihelp-query+alltransclusions-example-unique": "Einzigartige eingebundene Titel auflisten.", "apihelp-query+alltransclusions-example-unique-generator": "Ruft alle transkludierten Titel ab und markiert die fehlenden.", "apihelp-query+alltransclusions-example-generator": "Ruft Seiten ab welche die Transklusionen beinhalten.", - "apihelp-query+allusers-description": "Auflisten aller registrierten Benutzer.", + "apihelp-query+allusers-summary": "Auflisten aller registrierten Benutzer.", "apihelp-query+allusers-param-from": "Der Benutzername, bei dem die Auflistung beginnen soll.", "apihelp-query+allusers-param-to": "Der Benutzername, bei dem die Auflistung enden soll.", "apihelp-query+allusers-param-prefix": "Sucht nach allen Benutzern, die mit diesem Wert beginnen.", @@ -529,7 +541,7 @@ "apihelp-query+authmanagerinfo-example-login": "Ruft die Anfragen ab, die beim Beginnen einer Anmeldung verwendet werden können.", "apihelp-query+authmanagerinfo-example-login-merged": "Ruft die Anfragen ab, die beim Beginnen einer Anmeldung verwendet werden können, mit zusammengeführten Formularfeldern.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Testet, ob die Authentifizierung für die Aktion foo ausreichend ist.", - "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.", + "apihelp-query+backlinks-summary": "Alle Seiten finden, die auf die angegebene Seite verlinken.", "apihelp-query+backlinks-param-title": "Zu suchender Titel. Darf nicht zusammen mit $1pageid benutzt werden.", "apihelp-query+backlinks-param-pageid": "Zu suchende Seiten-ID. Darf nicht zusammen mit $1title benutzt werden.", "apihelp-query+backlinks-param-namespace": "Der aufzulistende Namensraum.", @@ -539,7 +551,7 @@ "apihelp-query+backlinks-param-redirect": "Falls die verweisende Seite eine Weiterleitung ist, finde alle Seiten, die auf diese Weiterleitung ebenfalls verweisen. Die maximale Grenze wird halbiert.", "apihelp-query+backlinks-example-simple": "Links auf Main page anzeigen.", "apihelp-query+backlinks-example-generator": "Hole Informationen über die Seiten, die auf die Hauptseite verweisen.", - "apihelp-query+blocks-description": "Liste alle gesperrten Benutzer und IP-Adressen auf.", + "apihelp-query+blocks-summary": "Liste alle gesperrten Benutzer und IP-Adressen auf.", "apihelp-query+blocks-param-start": "Der Zeitstempel, bei dem die Aufzählung beginnen soll.", "apihelp-query+blocks-param-end": "Der Zeitstempel, bei dem die Aufzählung beendet werden soll.", "apihelp-query+blocks-param-ids": "Liste von Sperren-IDs, die aufglistet werden sollen (optional).", @@ -559,7 +571,7 @@ "apihelp-query+blocks-param-show": "Zeige nur Elemente, die diese Kriterien erfüllen. Um zum Beispiel unbestimmte Sperren von IP-Adressen zu sehen, setzte $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Sperren auflisten", "apihelp-query+blocks-example-users": "Listet Sperren der Benutzer Alice und Bob auf.", - "apihelp-query+categories-description": "Liste alle Kategorien auf, zu denen die Seiten gehören.", + "apihelp-query+categories-summary": "Liste alle Kategorien auf, zu denen die Seiten gehören.", "apihelp-query+categories-param-prop": "Zusätzlich zurückzugebende Eigenschaften jeder Kategorie:", "apihelp-query+categories-paramvalue-prop-timestamp": "Fügt einen Zeitstempel wann die Kategorie angelegt wurde hinzu.", "apihelp-query+categories-param-show": "Welche Art von Kategorien gezeigt werden soll.", @@ -568,9 +580,9 @@ "apihelp-query+categories-param-dir": "Die Auflistungsrichtung.", "apihelp-query+categories-example-simple": "Rufe eine Liste von Kategorien ab, zu denen die Seite Albert Einstein gehört.", "apihelp-query+categories-example-generator": "Rufe Informationen über alle Kategorien ab, die in der Seite Albert Einstein eingetragen sind.", - "apihelp-query+categoryinfo-description": "Gibt Informationen zu den angegebenen Kategorien zurück.", + "apihelp-query+categoryinfo-summary": "Gibt Informationen zu den angegebenen Kategorien zurück.", "apihelp-query+categoryinfo-example-simple": "Erhalte Informationen über Category:Foo und Category:Bar.", - "apihelp-query+categorymembers-description": "Liste alle Seiten in der angegebenen Kategorie auf.", + "apihelp-query+categorymembers-summary": "Liste alle Seiten in der angegebenen Kategorie auf.", "apihelp-query+categorymembers-param-pageid": "Seitenkennung der Kategorie, die aufgelistet werden soll. Darf nicht zusammen mit $1title verwendet werden.", "apihelp-query+categorymembers-param-prop": "Welche Informationsteile einbinden:", "apihelp-query+categorymembers-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.", @@ -590,7 +602,7 @@ "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.", "apihelp-query+categorymembers-example-simple": "Rufe die ersten 10 Seiten von Category:Physics ab.", "apihelp-query+categorymembers-example-generator": "Rufe die Seiteninformationen zu den ersten 10 Seiten vonCategory:Physics ab.", - "apihelp-query+contributors-description": "Rufe die Liste der angemeldeten Bearbeiter und die Zahl anonymer Bearbeiter einer Seite ab.", + "apihelp-query+contributors-summary": "Rufe die Liste der angemeldeten Bearbeiter und die Zahl anonymer Bearbeiter einer Seite ab.", "apihelp-query+contributors-param-limit": "Wie viele Spender zurückgegeben werden sollen.", "apihelp-query+contributors-example-simple": "Zeige Mitwirkende der Seite Main Page.", "apihelp-query+deletedrevisions-param-start": "Der Zeitstempel bei dem die Auflistung beginnen soll. Wird bei der Verarbeitung einer Liste von Bearbeitungs-IDs ignoriert.", @@ -600,7 +612,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "Schließe Bearbeitungen dieses Benutzers bei der Auflistung aus.", "apihelp-query+deletedrevisions-example-titles": "Listet die gelöschten Bearbeitungen der Seiten Main Page und Talk:Main Page samt Inhalt auf.", "apihelp-query+deletedrevisions-example-revids": "Liste Informationen zur gelöschten Bearbeitung 123456.", - "apihelp-query+deletedrevs-description": "Liste gelöschte Bearbeitungen.\n\nArbeitet in drei Modi:\n# Listet gelöschte Bearbeitungen des angegeben Titels auf, sortiert nach dem Zeitstempel.\n# Listet gelöschte Beiträge des angegebenen Benutzers auf, sortiert nach dem Zeitstempel (keine Titel bestimmt)\n# Listet alle gelöschten Bearbeitungen im angegebenen Namensraum auf, sortiert nach Titel und Zeitstempel (keine Titel bestimmt, $1user nicht gesetzt).\n\nBestimmte Parameter wirken nur bei bestimmten Modi und werden in anderen nicht berücksichtigt.", + "apihelp-query+deletedrevs-summary": "Liste gelöschte Bearbeitungen.", + "apihelp-query+deletedrevs-extended-description": "Arbeitet in drei Modi:\n# Listet gelöschte Bearbeitungen des angegeben Titels auf, sortiert nach dem Zeitstempel.\n# Listet gelöschte Beiträge des angegebenen Benutzers auf, sortiert nach dem Zeitstempel (keine Titel bestimmt)\n# Listet alle gelöschten Bearbeitungen im angegebenen Namensraum auf, sortiert nach Titel und Zeitstempel (keine Titel bestimmt, $1user nicht gesetzt).\n\nBestimmte Parameter wirken nur bei bestimmten Modi und werden in anderen nicht berücksichtigt.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modus|Modi}}: $2", "apihelp-query+deletedrevs-param-start": "Der Zeitstempel bei dem die Auflistung beginnen soll.", "apihelp-query+deletedrevs-param-end": "Der Zeitstempel bei dem die Auflistung enden soll.", @@ -617,14 +630,14 @@ "apihelp-query+deletedrevs-example-mode2": "Liste die letzten 50 gelöschten Beiträge von Bob auf (Modus 2).", "apihelp-query+deletedrevs-example-mode3-main": "Liste die ersten 50 gelöschten Bearbeitungen im Hauptnamensraum (Modus 3).", "apihelp-query+deletedrevs-example-mode3-talk": "Liste die ersten 50 gelöschten Seiten im {{ns:talk}}-Namensraum (Modus 3).", - "apihelp-query+disabled-description": "Dieses Abfrage-Modul wurde deaktiviert.", - "apihelp-query+duplicatefiles-description": "Liste alle Dateien auf die, basierend auf der Prüfsumme, Duplikate der angegebenen Dateien sind.", + "apihelp-query+disabled-summary": "Dieses Abfrage-Modul wurde deaktiviert.", + "apihelp-query+duplicatefiles-summary": "Liste alle Dateien auf die, basierend auf der Prüfsumme, Duplikate der angegebenen Dateien sind.", "apihelp-query+duplicatefiles-param-limit": "Wie viele doppelte Dateien zurückgeben.", "apihelp-query+duplicatefiles-param-dir": "Die Auflistungsrichtung.", "apihelp-query+duplicatefiles-param-localonly": "Sucht nur nach Dateien im lokalen Repositorium.", "apihelp-query+duplicatefiles-example-simple": "Sucht nach Duplikaten von [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Sucht nach Duplikaten aller Dateien.", - "apihelp-query+embeddedin-description": "Finde alle Seiten, die den angegebenen Titel einbetten (transkludieren).", + "apihelp-query+embeddedin-summary": "Finde alle Seiten, die den angegebenen Titel einbetten (transkludieren).", "apihelp-query+embeddedin-param-title": "Titel nach dem gesucht werden soll. Darf nicht zusammen mit $1pageid verwendet werden.", "apihelp-query+embeddedin-param-pageid": "Seitenkennung nach der gesucht werden soll. Darf nicht zusammen mit $1title verwendet werden.", "apihelp-query+embeddedin-param-namespace": "Der aufzulistende Namensraum.", @@ -633,11 +646,11 @@ "apihelp-query+embeddedin-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.", "apihelp-query+embeddedin-example-simple": "Zeige Seiten, die Template:Stub transkludieren.", "apihelp-query+embeddedin-example-generator": "Rufe Informationen über Seiten ab, die Template:Stub transkludieren.", - "apihelp-query+extlinks-description": "Gebe alle externen URLs (nicht Interwiki) der angegebenen Seiten zurück.", + "apihelp-query+extlinks-summary": "Gebe alle externen URLs (nicht Interwiki) der angegebenen Seiten zurück.", "apihelp-query+extlinks-param-limit": "Wie viele Links zurückgegeben werden sollen.", "apihelp-query+extlinks-param-query": "Suchbegriff ohne Protokoll. Nützlich um zu prüfen, ob eine bestimmte Seite eine bestimmte externe URL enthält.", "apihelp-query+extlinks-example-simple": "Rufe eine Liste erxterner Verweise auf Main Page ab.", - "apihelp-query+exturlusage-description": "Listet Seiten auf, die die angegebene URL beinhalten.", + "apihelp-query+exturlusage-summary": "Listet Seiten auf, die die angegebene URL beinhalten.", "apihelp-query+exturlusage-param-prop": "Welche Informationsteile einbinden:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Fügt die ID der Seite hinzu.", "apihelp-query+exturlusage-paramvalue-prop-title": "Fügt die Titel- und Namensraum-ID der Seite hinzu.", @@ -646,7 +659,7 @@ "apihelp-query+exturlusage-param-namespace": "Die aufzulistenden Seiten-Namensräume.", "apihelp-query+exturlusage-param-limit": "Wie viele Seiten zurückgegeben werden sollen.", "apihelp-query+exturlusage-example-simple": "Zeigt Seiten, die auf http://www.mediawiki.org verlinken.", - "apihelp-query+filearchive-description": "Alle gelöschten Dateien der Reihe nach auflisten.", + "apihelp-query+filearchive-summary": "Alle gelöschten Dateien der Reihe nach auflisten.", "apihelp-query+filearchive-param-from": "Der Bildertitel, bei dem die Auflistung beginnen soll.", "apihelp-query+filearchive-param-to": "Der Bildertitel, bei dem die Auflistung enden soll.", "apihelp-query+filearchive-param-prefix": "Nach allen Bildtiteln, die mit diesem Wert beginnen suchen.", @@ -668,9 +681,9 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Ergänzt die Bittiefe der Version.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Fügt den Dateinamen der Archivversion für die nicht-neuesten Versionen hinzu.", "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten", - "apihelp-query+filerepoinfo-description": "Gebe Metainformationen über Bild-Repositorien zurück, die im Wiki eingerichtet sind.", + "apihelp-query+filerepoinfo-summary": "Gebe Metainformationen über Bild-Repositorien zurück, die im Wiki eingerichtet sind.", "apihelp-query+filerepoinfo-example-simple": "Ruft Informationen über Dateirepositorien ab.", - "apihelp-query+fileusage-description": "Alle Seiten finden, die die angegebenen Dateien verwenden.", + "apihelp-query+fileusage-summary": "Alle Seiten finden, die die angegebenen Dateien verwenden.", "apihelp-query+fileusage-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+fileusage-paramvalue-prop-pageid": "Seitenkennung jeder Seite.", "apihelp-query+fileusage-paramvalue-prop-title": "Titel jeder Seite.", @@ -679,7 +692,7 @@ "apihelp-query+fileusage-param-limit": "Wie viel zurückgegeben werden soll.", "apihelp-query+fileusage-example-simple": "Zeige eine Liste von Seiten, die [[:File:Example.jpg]] verwenden.", "apihelp-query+fileusage-example-generator": "Zeige Informationen über Seiten, die [[:File:Example.jpg]] verwenden.", - "apihelp-query+imageinfo-description": "Gibt Informationen und alle Versionen der Datei zurück.", + "apihelp-query+imageinfo-summary": "Gibt Informationen und alle Versionen der Datei zurück.", "apihelp-query+imageinfo-param-prop": "Welche Dateiinformationen abgerufen werden sollen:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Fügt einen Zeitstempel für die hochgeladene Version hinzu.", "apihelp-query+imageinfo-paramvalue-prop-user": "Fügt den Benutzer zu jeder hochgeladenen Dateiversion hinzu.", @@ -707,20 +720,20 @@ "apihelp-query+imageinfo-param-localonly": "Suche nur nach Dateien im lokalen Repositorium.", "apihelp-query+imageinfo-example-simple": "Rufe Informationen über die aktuelle Version von [[:File:Albert Einstein Head.jpg]] ab.", "apihelp-query+imageinfo-example-dated": "Rufe Informationen über Versionen von [[:File:Test.jpg]] von 2008 und später ab.", - "apihelp-query+images-description": "Gibt alle Dateien zurück, die in den angegebenen Seiten enthalten sind.", + "apihelp-query+images-summary": "Gibt alle Dateien zurück, die in den angegebenen Seiten enthalten sind.", "apihelp-query+images-param-limit": "Wie viele Dateien zurückgegeben werden sollen.", "apihelp-query+images-param-images": "Nur diese Dateien auflisten. Nützlich um zu prüfen, ob eine bestimmte Seite eine bestimmte Datei enthält.", "apihelp-query+images-param-dir": "Die Auflistungsrichtung.", "apihelp-query+images-example-simple": "Rufe eine Liste von Dateien ab, die auf der [[Main Page]] verwendet werden.", "apihelp-query+images-example-generator": "Rufe Informationen über alle Dateien ab, die auf der [[Main Page]] verwendet werden.", - "apihelp-query+imageusage-description": "Finde alle Seiten, die den angegebenen Bildtitel verwenden.", + "apihelp-query+imageusage-summary": "Finde alle Seiten, die den angegebenen Bildtitel verwenden.", "apihelp-query+imageusage-param-title": "Titel nach dem gesucht werden soll. Darf nicht zusammen mit $1pageid verwendet werden.", "apihelp-query+imageusage-param-pageid": "Seitenkennung nach der gesucht werden soll. Darf nicht zusammen mit $1title verwendet werden.", "apihelp-query+imageusage-param-namespace": "Der aufzulistende Namensraum.", "apihelp-query+imageusage-param-dir": "Die Auflistungsrichtung.", "apihelp-query+imageusage-param-redirect": "Falls die verweisende Seite eine Weiterleitung ist, finde alle Seiten, die ebenfalls auf diese Weiterleitung verweisen. Die maximale Grenze wird halbiert.", "apihelp-query+imageusage-example-simple": "Zeige Seiten, die [[:File:Albert Einstein Head.jpg]] verwenden.", - "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.", + "apihelp-query+info-summary": "Ruft Basisinformationen über die Seite ab.", "apihelp-query+info-param-prop": "Zusätzlich zurückzugebende Eigenschaften:", "apihelp-query+info-paramvalue-prop-protection": "Liste die Schutzstufe jeder Seite auf.", "apihelp-query+info-paramvalue-prop-talkid": "Die Seitenkennung der Diskussionsseite für jede Nicht-Diskussionsseite.", @@ -752,32 +765,48 @@ "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.", "apihelp-query+langlinks-paramvalue-prop-autonym": "Ergänzt den Namen der Muttersprache.", "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.", + "apihelp-query+links-summary": "Gibt alle Links von den angegebenen Seiten zurück.", + "apihelp-query+links-param-namespace": "Zeigt nur Links in diesen Namensräumen.", "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.", "apihelp-query+links-param-dir": "Die Auflistungsrichtung.", "apihelp-query+links-example-simple": "Links von der Hauptseite abrufen", - "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.", + "apihelp-query+linkshere-summary": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.", "apihelp-query+linkshere-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.", "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.", - "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.", + "apihelp-query+linkshere-param-limit": "Wie viel zurückgegeben werden soll.", + "apihelp-query+linkshere-example-simple": "Holt eine Liste von Seiten, die auf [[Main Page]] verlinken.", + "apihelp-query+logevents-summary": "Ruft Ereignisse von Logbüchern ab.", "apihelp-query+logevents-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+logevents-paramvalue-prop-ids": "Ergänzt die Kennung des Logbuchereignisses.", "apihelp-query+logevents-paramvalue-prop-title": "Ergänzt den Titel der Seite für das Logbuchereignis.", "apihelp-query+logevents-paramvalue-prop-type": "Ergänzt den Typ des Logbuchereignisses.", "apihelp-query+logevents-paramvalue-prop-user": "Ergänzt den verantwortlichen Benutzer für das Logbuchereignis.", "apihelp-query+logevents-paramvalue-prop-comment": "Ergänzt den Kommentar des Logbuchereignisses.", + "apihelp-query+logevents-paramvalue-prop-tags": "Listet Markierungen für das Logbuchereignis auf.", + "apihelp-query+logevents-param-start": "Der Zeitstempel, bei dem die Aufzählung beginnen soll.", + "apihelp-query+logevents-param-end": "Der Zeitstempel, bei dem die Aufzählung enden soll.", + "apihelp-query+logevents-param-prefix": "Filtert Einträge, die mit diesem Präfix beginnen.", + "apihelp-query+logevents-param-limit": "Wie viele Ereigniseinträge insgesamt zurückgegeben werden sollen.", "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.", "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.", + "apihelp-query+pageswithprop-param-dir": "In welche Richtung sortiert werden soll.", "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.", + "apihelp-query+prefixsearch-param-namespace": "Welche Namensräume durchsucht werden sollen.", + "apihelp-query+prefixsearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.", "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.", "apihelp-query+prefixsearch-param-profile": "Zu verwendendes Suchprofil.", + "apihelp-query+protectedtitles-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.", "apihelp-query+protectedtitles-param-prop": "Zurückzugebende Eigenschaften:", + "apihelp-query+protectedtitles-paramvalue-prop-level": "Ergänzt den Schutzstatus.", + "apihelp-query+protectedtitles-example-simple": "Listet geschützte Titel auf.", "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.", - "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.", + "apihelp-query+recentchanges-summary": "Listet die letzten Änderungen auf.", "apihelp-query+recentchanges-param-user": "Listet nur Änderungen von diesem Benutzer auf.", "apihelp-query+recentchanges-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.", "apihelp-query+recentchanges-param-tag": "Listet nur Änderungen auf, die mit dieser Markierung markiert sind.", + "apihelp-query+recentchanges-param-prop": "Bezieht zusätzliche Informationen mit ein:", "apihelp-query+recentchanges-paramvalue-prop-comment": "Fügt den Kommentar für die Bearbeitung hinzu.", "apihelp-query+recentchanges-paramvalue-prop-flags": "Ergänzt Markierungen für die Bearbeitung.", "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.", @@ -809,12 +838,14 @@ "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.", "apihelp-query+search-example-simple": "Nach meaning suchen.", "apihelp-query+search-example-text": "Texte nach meaning durchsuchen.", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.", + "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste von Spezialseiten-Aliasse.", + "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste von magischen Wörtern und ihrer Aliasse.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:Special:MyLanguage/LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.", "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen", "apihelp-query+stashimageinfo-param-sessionkey": "Alias für $1filekey, für die Rückwärtskompatibilität.", "apihelp-query+stashimageinfo-example-simple": "Gibt Informationen für eine gespeicherte Datei zurück.", "apihelp-query+stashimageinfo-example-params": "Gibt Vorschaubilder für zwei gespeicherte Dateien zurück.", - "apihelp-query+tags-description": "Änderungs-Tags auflisten.", + "apihelp-query+tags-summary": "Änderungs-Tags auflisten.", "apihelp-query+tags-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+tags-paramvalue-prop-name": "Ergänzt den Namen der Markierung.", "apihelp-query+tags-paramvalue-prop-displayname": "Ergänzt die Systemnachricht für die Markierung.", @@ -825,7 +856,7 @@ "apihelp-query+tokens-param-type": "Typen der Token, die abgerufen werden sollen.", "apihelp-query+transcludedin-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "Seitenkennung jeder Seite.", - "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.", + "apihelp-query+usercontribs-summary": "Alle Bearbeitungen von einem Benutzer abrufen.", "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.", "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.", "apihelp-query+usercontribs-param-end": "Der zurückzugebende End-Zeitstempel.", @@ -835,14 +866,17 @@ "apihelp-query+usercontribs-paramvalue-prop-ids": "Fügt die Seiten- und Versionskennung hinzu.", "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.", "apihelp-query+usercontribs-paramvalue-prop-comment": "Fügt den Kommentar der Bearbeitung hinzu.", + "apihelp-query+usercontribs-paramvalue-prop-size": "Ergänzt die neue Größe der Bearbeitung.", + "apihelp-query+usercontribs-paramvalue-prop-flags": "Ergänzt Markierungen der Bearbeitung.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Markiert kontrollierte Bearbeitungen.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Listet die Markierungen für die Bearbeitung auf.", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Markiert, ob der aktuelle Benutzer gesperrt ist, von wem und aus welchem Grund.", + "apihelp-query+userinfo-paramvalue-prop-options": "Listet alle Einstellungen auf, die der aktuelle Benutzer festgelegt hat.", "apihelp-query+userinfo-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des aktuellen Benutzers.", "apihelp-query+userinfo-paramvalue-prop-realname": "Fügt den bürgerlichen Namen des Benutzers hinzu.", "apihelp-query+userinfo-example-simple": "Informationen über den aktuellen Benutzer abrufen", "apihelp-query+userinfo-example-data": "Ruft zusätzliche Informationen über den aktuellen Benutzer ab.", - "apihelp-query+users-description": "Informationen über eine Liste von Benutzern abrufen.", + "apihelp-query+users-summary": "Informationen über eine Liste von Benutzern abrufen.", "apihelp-query+users-param-prop": "Welche Informationsteile einbezogen werden sollen:", "apihelp-query+users-paramvalue-prop-blockinfo": "Markiert, ob der Benutzer gesperrt ist, von wem und aus welchem Grund.", "apihelp-query+users-paramvalue-prop-groups": "Listet alle Gruppen auf, zu denen jeder Benutzer gehört.", @@ -861,25 +895,29 @@ "apihelp-query+watchlist-paramvalue-prop-user": "Ergänzt den Benutzer, der die Bearbeitung ausgeführt hat.", "apihelp-query+watchlist-paramvalue-prop-userid": "Ergänzt die Kennung des Benutzers, der die Bearbeitung ausgeführt hat.", "apihelp-query+watchlist-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.", + "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Ergänzt den geparsten Kommentar der Bearbeitung.", "apihelp-query+watchlist-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.", "apihelp-query+watchlist-paramvalue-prop-patrol": "Markiert Bearbeitungen, die kontrolliert sind.", "apihelp-query+watchlist-paramvalue-prop-sizes": "Ergänzt die alten und neuen Längen der Seite.", + "apihelp-query+watchlist-paramvalue-type-edit": "Normale Seitenbearbeitungen.", + "apihelp-query+watchlist-paramvalue-type-external": "Externe Änderungen.", "apihelp-query+watchlist-paramvalue-type-new": "Seitenerstellungen.", "apihelp-query+watchlist-paramvalue-type-log": "Logbucheinträge.", - "apihelp-query+watchlistraw-description": "Ruft alle Seiten der Beobachtungsliste des aktuellen Benutzers ab.", + "apihelp-query+watchlist-paramvalue-type-categorize": "Änderungen an der Kategoriemitgliedschaft.", + "apihelp-query+watchlistraw-summary": "Ruft alle Seiten der Beobachtungsliste des aktuellen Benutzers ab.", "apihelp-query+watchlistraw-param-prop": "Zusätzlich zurückzugebende Eigenschaften:", "apihelp-query+watchlistraw-param-fromtitle": "Titel (mit Namensraum-Präfix), bei dem die Aufzählung beginnen soll.", "apihelp-query+watchlistraw-param-totitle": "Titel (mit Namensraum-Präfix), bei dem die Aufzählung enden soll.", "apihelp-resetpassword-param-user": "Benutzer, der zurückgesetzt werden soll.", - "apihelp-revisiondelete-description": "Löscht und stellt Versionen wieder her.", + "apihelp-revisiondelete-summary": "Löscht und stellt Versionen wieder her.", "apihelp-revisiondelete-param-hide": "Was für jede Version versteckt werden soll.", "apihelp-revisiondelete-param-show": "Was für jede Version wieder eingeblendet werden soll.", "apihelp-revisiondelete-param-tags": "Auf den Eintrag im Lösch-Logbuch anzuwendende Markierungen.", - "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.", + "apihelp-rsd-summary": "Ein RSD-Schema (Really Simple Discovery) exportieren.", "apihelp-rsd-example-simple": "Das RSD-Schema exportieren", "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.", - "apihelp-setpagelanguage-description": "Ändert die Sprache einer Seite.", - "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], um diese Aktion zu verwenden.", + "apihelp-setpagelanguage-summary": "Ändert die Sprache einer Seite.", + "apihelp-setpagelanguage-extended-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], um diese Aktion zu verwenden.", "apihelp-setpagelanguage-param-title": "Titel der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit $1pageid verwendet werden.", "apihelp-setpagelanguage-param-pageid": "Kennung der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit $1title verwendet werden.", "apihelp-setpagelanguage-param-lang": "Code der Sprache, auf den die Seite geändert werden soll. Verwende default, um die Seite auf die Standardinhaltssprache des Wikis zurückzusetzen.", @@ -897,7 +935,7 @@ "apihelp-tokens-param-type": "Abzufragende Tokentypen.", "apihelp-tokens-example-edit": "Ruft einen Bearbeitungstoken ab (Standard).", "apihelp-tokens-example-emailmove": "Ruft einen E-Mail- und Verschiebungstoken ab.", - "apihelp-unblock-description": "Einen Benutzer freigeben.", + "apihelp-unblock-summary": "Einen Benutzer freigeben.", "apihelp-unblock-param-id": "Kennung der Sperre zur Freigabe (abgerufen durch list=blocks). Kann nicht zusammen mit $1user oder $1userid verwendet werden.", "apihelp-unblock-param-user": "Benutzername, IP-Adresse oder IP-Adressbereich, der freigegeben werden soll. Kann nicht zusammen mit $1id oder $1userid verwendet werden.", "apihelp-unblock-param-reason": "Grund für die Freigabe.", @@ -917,14 +955,15 @@ "apihelp-upload-param-checkstatus": "Ruft nur den Hochladestatus für den angegebenen Dateischlüssel ab.", "apihelp-upload-example-url": "Von einer URL hochladen", "apihelp-upload-example-filekey": "Vervollständigt einen Upload, der aufgrund von Warnungen fehlgeschlagen ist.", - "apihelp-userrights-description": "Ändert die Gruppenzugehörigkeit eines Benutzers.", + "apihelp-userrights-summary": "Ändert die Gruppenzugehörigkeit eines Benutzers.", "apihelp-userrights-param-user": "Benutzername.", "apihelp-userrights-param-userid": "Benutzerkennung.", "apihelp-userrights-param-add": "Fügt den Benutzer zu diesen Gruppen hinzu oder falls er bereits Mitglied ist, aktualisiert den Ablauf seiner Mitgliedschaft in dieser Gruppe.", "apihelp-userrights-param-remove": "Entfernt den Benutzer von diesen Gruppen.", "apihelp-userrights-param-reason": "Grund für die Änderung.", "apihelp-userrights-param-tags": "Auf den Eintrag im Benutzerrechte-Logbuch anzuwendende Änderungsmarkierungen.", - "apihelp-validatepassword-description": "Validiert ein Passwort gegen die Passwortrichtlinien des Wikis.\n\nDie Validität wird als Good gemeldet, falls das Passwort akzeptabel ist, Change, falls das Passwort zur Anmeldung verwendet werden kann, jedoch geändert werden muss oder Invalid, falls das Passwort nicht verwendbar ist.", + "apihelp-validatepassword-summary": "Validiert ein Passwort gegen die Passwortrichtlinien des Wikis.", + "apihelp-validatepassword-extended-description": "Die Validität wird als Good gemeldet, falls das Passwort akzeptabel ist, Change, falls das Passwort zur Anmeldung verwendet werden kann, jedoch geändert werden muss oder Invalid, falls das Passwort nicht verwendbar ist.", "apihelp-validatepassword-param-password": "Zu validierendes Passwort.", "apihelp-validatepassword-param-user": "Der beim Austesten der Benutzerkontenerstellung verwendete Benutzername. Der angegebene Benutzer darf nicht vorhanden sein.", "apihelp-validatepassword-param-email": "Die beim Austesten der Benutzerkontenerstellung verwendete E-Mail-Adresse.", @@ -934,20 +973,20 @@ "apihelp-watch-example-watch": "Die Seite Main Page beobachten.", "apihelp-watch-example-unwatch": "Die Seite Main Page nicht beobachten.", "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.", - "apihelp-json-description": "Daten im JSON-Format ausgeben.", + "apihelp-json-summary": "Daten im JSON-Format ausgeben.", "apihelp-json-param-callback": "Falls angegeben, wird die Ausgabe in einen angegebenen Funktionsaufruf eingeschlossen. Aus Sicherheitsgründen sind benutzerspezifische Daten beschränkt.", "apihelp-json-param-utf8": "Falls angegeben, kodiert die meisten (aber nicht alle) Nicht-ASCII-Zeichen als UTF-8 anstatt sie mit hexadezimalen Escape-Sequenzen zu ersetzen. Standard, wenn formatversion nicht 1 ist.", - "apihelp-jsonfm-description": "Daten im JSON-Format ausgeben (schöngedruckt in HTML).", - "apihelp-none-description": "Nichts ausgeben.", - "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.", - "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).", - "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).", - "apihelp-xml-description": "Daten im XML-Format ausgeben.", + "apihelp-jsonfm-summary": "Daten im JSON-Format ausgeben (schöngedruckt in HTML).", + "apihelp-none-summary": "Nichts ausgeben.", + "apihelp-php-summary": "Daten im serialisierten PHP-Format ausgeben.", + "apihelp-phpfm-summary": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).", + "apihelp-rawfm-summary": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).", + "apihelp-xml-summary": "Daten im XML-Format ausgeben.", "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:MediaWiki}}“ sein und mit .xsl enden.", "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.", - "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).", + "apihelp-xmlfm-summary": "Daten im XML-Format ausgeben (schöngedruckt in HTML).", "api-format-title": "MediaWiki-API-Ergebnis", - "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter format an, um das Ausgabeformat zu ändern. Lege format=$2 fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.", + "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter format an, um das Ausgabeformat zu ändern. Lege format=$2 fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:Special:MyLanguage/API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.", "api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.", "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.", "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.", @@ -955,6 +994,7 @@ "api-help-title": "MediaWiki-API-Hilfe", "api-help-lead": "Dies ist eine automatisch generierte MediaWiki-API-Dokumentationsseite.\n\nDokumentation und Beispiele: https://www.mediawiki.org/wiki/API/de", "api-help-main-header": "Hauptmodul", + "api-help-undocumented-module": "Keine Dokumentation für das Modul „$1“.", "api-help-flag-deprecated": "Dieses Modul ist veraltet.", "api-help-flag-internal": "Dieses Modul ist intern oder instabil. Seine Operationen werden ohne Kenntnisnahme geändert.", "api-help-flag-readrights": "Dieses Modul erfordert Leserechte.", @@ -990,7 +1030,7 @@ "api-help-param-default-empty": "Standard: (leer)", "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.", - "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].", + "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Special:MyLanguage/Manual:$wgMiserMode|Miser-Modus]].", "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.", "api-help-param-no-description": "(keine Beschreibung)", "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:", @@ -999,18 +1039,34 @@ "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.", "api-help-open-in-apisandbox": "[in Spielwiese öffnen]", "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.", + "apierror-badgenerator-unknown": "generator=$1 unbekannt.", + "apierror-badip": "Der IP-Parameter ist nicht gültig.", + "apierror-badmd5": "Die angegebene MD5-Prüfsumme war falsch.", + "apierror-badmodule-badsubmodule": "Das Modul $1 hat kein Untermodul namens „$2“.", + "apierror-badmodule-nosubmodules": "Das Modul $1 hat keine Untermodule.", + "apierror-badparameter": "Ungültiger Wert für den Parameter $1.", + "apierror-badquery": "Ungültige Abfrage.", "apierror-cannot-async-upload-file": "Die Parameter async und file können nicht kombiniert werden. Falls du eine asynchrone Verarbeitung deiner hochgeladenen Datei wünschst, lade sie zuerst mithilfe des Parameters stash auf den Speicher hoch. Veröffentliche anschließend die gespeicherte Datei asynchron mithilfe filekey und async.", + "apierror-emptypage": "Das Erstellen neuer leerer Seiten ist nicht erlaubt.", + "apierror-filedoesnotexist": "Die Datei ist nicht vorhanden.", + "apierror-import-unknownerror": "Unbekannter Fehler beim Importieren: $1.", + "apierror-invalid-file-key": "Kein gültiger Dateischlüssel.", + "apierror-invalidsection": "Der Parameter section muss eine gültige Abschnittskennung oder new sein.", "apierror-invaliduserid": "Die Benutzerkennung $1 ist nicht gültig.", + "apierror-nosuchsection": "Es gibt keinen Abschnitt $1.", "apierror-nosuchuserid": "Es gibt keinen Benutzer mit der Kennung $1.", + "apierror-offline": "Aufgrund von Problemen bei der Netzwerkverbindung kannst du nicht weitermachen. Stelle sicher, dass du eine funktionierende Internetverbindung hast und versuche es erneut.", "apierror-pagelang-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.", "apierror-protect-invalidaction": "Ungültiger Schutztyp „$1“.", "apierror-readonly": "Das Wiki ist derzeit im schreibgeschützten Modus.", + "apierror-revisions-badid": "Für den Parameter $1 wurde keine Version gefunden.", "apierror-revwrongpage": "Die Version $1 ist keine Version von $2.", "apierror-sectionreplacefailed": "Der aktualisierte Abschnitt konnte nicht zusammengeführt werden.", "apierror-stashinvalidfile": "Ungültige gespeicherte Datei.", "apierror-stashnosuchfilekey": "Kein derartiger Dateischlüssel: $1.", "apierror-stashwrongowner": "Falscher Besitzer: $1", "apierror-systemblocked": "Du wurdest von MediaWiki automatisch gesperrt.", + "apierror-timeout": "Der Server hat nicht innerhalb der erwarteten Zeit reagiert.", "apierror-unknownerror-nocode": "Unbekannter Fehler.", "apierror-unknownerror": "Unbekannter Fehler: „$1“.", "apierror-unknownformat": "Nicht erkanntes Format „$1“.", diff --git a/includes/api/i18n/diq.json b/includes/api/i18n/diq.json index 0c43bd759d..2a0cbe8ba0 100644 --- a/includes/api/i18n/diq.json +++ b/includes/api/i18n/diq.json @@ -10,24 +10,24 @@ ] }, "apihelp-main-param-action": "Performansa kamci aksiyon", - "apihelp-block-description": "Enê karberi bloqe ke", + "apihelp-block-summary": "Enê karberi bloqe ke", "apihelp-block-param-reason": "Sebeba Bloqey", "apihelp-block-param-nocreate": "Hesab viraştişi bloqe ke.", "apihelp-checktoken-param-token": "Jetona test ke", - "apihelp-createaccount-description": "Yew Hesabê karberi yo newe vıraze", + "apihelp-createaccount-summary": "Yew Hesabê karberi yo newe vıraze", "apihelp-createaccount-param-name": "Nameyê karberi.", "apihelp-createaccount-param-email": "E-postay karberi (keyfi)", "apihelp-createaccount-param-realname": "Namey karberi yo raştay (keyfi)", - "apihelp-delete-description": "Pele bestere.", + "apihelp-delete-summary": "Pele bestere.", "apihelp-delete-example-simple": "Main Page besternê.", - "apihelp-disabled-description": "Eno modul aktiv niyo.", - "apihelp-edit-description": "Vıraze û pelan bıvurne.", + "apihelp-disabled-summary": "Eno modul aktiv niyo.", + "apihelp-edit-summary": "Vıraze û pelan bıvurne.", "apihelp-edit-param-text": "Zerreki pele", "apihelp-edit-param-minor": "Vurriyayışê werdiy", "apihelp-edit-param-notminor": "Vurnayışo qıckek niyo.", "apihelp-edit-param-bot": "Nê vurnayışi zey boti nişan ke.", "apihelp-edit-example-edit": "Şeker bıvurne", - "apihelp-emailuser-description": "Yew karberi rê e-poste bırışe.", + "apihelp-emailuser-summary": "Yew karberi rê e-poste bırışe.", "apihelp-emailuser-param-target": "Karbero ke cı rê e-poste do bırışiyo.", "apihelp-emailuser-param-subject": "Sernameyê mewzuyi.", "apihelp-emailuser-param-text": "Metınê e-posteyi.", @@ -52,8 +52,8 @@ "apihelp-login-param-password": "Parola.", "apihelp-login-param-domain": "Domain (optional).", "apihelp-login-example-login": "Dekew.", - "apihelp-mergehistory-description": "Verorê pela yew ke", - "apihelp-move-description": "Yew pele bere.", + "apihelp-mergehistory-summary": "Verorê pela yew ke", + "apihelp-move-summary": "Yew pele bere.", "apihelp-move-param-noredirect": "Hetenayış mevıraz", "apihelp-options-example-reset": "Terciha pêron reset ke", "apihelp-options-example-change": "Tercihanê skin u hideminor bıvurnê", diff --git a/includes/api/i18n/el.json b/includes/api/i18n/el.json index 2c5c0db95a..4e8dfa04ba 100644 --- a/includes/api/i18n/el.json +++ b/includes/api/i18n/el.json @@ -9,13 +9,14 @@ "Giorgos456" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Τεκμηρίωση]]\n* [[mw:API:FAQ|Συχνές ερωτήσεις]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Λίστα αλληλογραφίας]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ανακοινώσεις API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Σφάλματα & αιτήματα]\n
    \nΚατάσταση: Όλα τα χαρακτηριστικά που εμφανίζονται σε αυτή τη σελίδα πρέπει να λειτουργούν, αλλά το API είναι ακόμα σε ενεργό ανάπτυξη, και μπορεί να αλλάξει ανά πάσα στιγμή. Εγγραφείτε στη [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce λίστα αλληλογραφίας] για να ειδοποιείστε για ενημερώσεις.\n\nΕσφαλμένα αιτήματα: Όταν στέλνονται εσφαλμένα αιτήματα στο API, επιστρέφεται μία κεφαλίδα HTTP (header) με το κλειδί \"MediaWiki-API-Error\" κι έπειτα η τιμή της κεφαλίδας και ο κωδικός σφάλματος που επιστρέφονται ορίζονται στην ίδια τιμή. Για περισσότερες πληροφορίες, δείτε [[mw:API:Errors_and_warnings|API: Σφάλματα και προειδοποιήσεις]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Τεκμηρίωση]]\n* [[mw:API:FAQ|Συχνές ερωτήσεις]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Λίστα αλληλογραφίας]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ανακοινώσεις API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Σφάλματα & αιτήματα]\n
    \nΚατάσταση: Όλα τα χαρακτηριστικά που εμφανίζονται σε αυτή τη σελίδα πρέπει να λειτουργούν, αλλά το API είναι ακόμα σε ενεργό ανάπτυξη, και μπορεί να αλλάξει ανά πάσα στιγμή. Εγγραφείτε στη [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce λίστα αλληλογραφίας] για να ειδοποιείστε για ενημερώσεις.\n\nΕσφαλμένα αιτήματα: Όταν στέλνονται εσφαλμένα αιτήματα στο API, επιστρέφεται μία κεφαλίδα HTTP (header) με το κλειδί \"MediaWiki-API-Error\" κι έπειτα η τιμή της κεφαλίδας και ο κωδικός σφάλματος που επιστρέφονται ορίζονται στην ίδια τιμή. Για περισσότερες πληροφορίες, δείτε [[mw:API:Errors_and_warnings|API: Σφάλματα και προειδοποιήσεις]].", "apihelp-main-param-action": "Ποια ενέργει να εκτελεστεί.", "apihelp-main-param-format": "Η μορφή των δεδομένων εξόδου.", "apihelp-main-param-curtimestamp": "Συμπερίληψη της τρέχουσας χρονοσφραγίδας στο αποτέλεσμα.", "apihelp-main-param-origin": "Κατά την πρόσβαση στο API χρησιμοποιώντας ένα cross-domain αίτημα AJAX (ΕΤΠ), το σύνολο αυτό το τομέα προέλευσης. Αυτό πρέπει να περιλαμβάνεται σε κάθε προ-πτήσης αίτηση, και ως εκ τούτου πρέπει να είναι μέρος του URI αιτήματος (δεν είναι η ΘΈΣΗ του σώματος). Αυτό πρέπει να ταιριάζει με μία από τις ρίζες της Προέλευσης κεφαλίδων ακριβώς, γι ' αυτό θα πρέπει να οριστεί σε κάτι σαν https://en.wikipedia.org ή https://meta.wikimedia.org. Εάν αυτή η παράμετρος δεν ταιριάζει με την Προέλευση κεφαλίδα, 403 απάντηση θα πρέπει να επιστραφεί. Εάν αυτή η παράμετρος ταιριάζει με την Προέλευση κεφαλίδα και η καταγωγή του είναι στη λίστα επιτρεπόμενων, μια Access-Control-Allow-Origin κεφαλίδα θα πρέπει να ρυθμιστεί.", "apihelp-main-param-uselang": "Γλώσσα για τις μεταφράσεις μηνυμάτων. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] με siprop=languages επιστρέφει μια λίστα με κωδικούς γλωσσών, ή καθορίστε user για να χρησιμοποιήσετε την προτίμηση γλώσσας του τρέχοντα χρήστη, ή καθορίστε content για να χρησιμοποιήσετε τη γλώσσα περιεχομένου αυτού του wiki.", - "apihelp-block-description": "Φραγή χρήστη", + "apihelp-block-summary": "Φραγή χρήστη", "apihelp-block-param-user": "Όνομα χρήστη, διεύθυνση IP ή εύρος διευθύνσεων IP που θέλετε να επιβάλετε φραγή.", "apihelp-block-param-expiry": "Ώρα λήξης. Μπορεί να είναι σχετική (π.χ. σε 5 μήνες ή σε 2 εβδομάδες) ή απόλυτη (π.χ. 2014-09-18T12:34:56Z). Αν οριστεί σε άπειρη, απεριόριστη, ή ποτέ, ο αποκλεισμός δεν θα λήξει ποτέ.", "apihelp-block-param-reason": "Λόγος φραγής.", @@ -29,16 +30,16 @@ "apihelp-block-example-ip-simple": "Φραγή διεύθυνσης IP 192.0.2.5 για τρεις μέρες με το λόγο, Πρώτη απεργία.", "apihelp-checktoken-param-token": "Δείγμα σας για τη δοκιμή.", "apihelp-checktoken-param-maxtokenage": "Μέγιστη επιτρεπόμενη διάρκεια του token, σε δευτερόλεπτα.", - "apihelp-createaccount-description": "Δημιουργήστε νέο λογαριασμό χρήστη.", + "apihelp-createaccount-summary": "Δημιουργήστε νέο λογαριασμό χρήστη.", "apihelp-createaccount-param-name": "Όνομα χρήστη.", "apihelp-createaccount-param-password": "Κωδικός πρόσβασης (αγνοείται, αν έχει οριστεί το $1mailpassword).", "apihelp-createaccount-param-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου χρήστη (προαιρετικό).", "apihelp-createaccount-param-realname": "Πραγματικό όνομα χρήστη (προαιρετικό).", "apihelp-createaccount-param-mailpassword": "Εάν οριστεί σε οποιαδήποτε τιμή, ένας τυχαίος κωδικός πρόσβασης θα αποσταλεί μέσω ηλεκτρονικού ταχυδρομείου στο χρήστη.", "apihelp-createaccount-param-language": "Κωδικός γλώσσας που να οριστεί ως προεπιλογή για το χρήστη (προαιρετικό, έχει ως προεπιλογή τη γλώσσα περιεχομένου).", - "apihelp-delete-description": "Διαγραφή σελίδας.", + "apihelp-delete-summary": "Διαγραφή σελίδας.", "apihelp-delete-example-simple": "Διαγραφή Main Page.", - "apihelp-edit-description": "Δημιουργία και επεξεργασία σελίδων.", + "apihelp-edit-summary": "Δημιουργία και επεξεργασία σελίδων.", "apihelp-edit-param-sectiontitle": "Ο τίτλος νέας ενότητας.", "apihelp-edit-param-text": "Περιεχόμενο σελίδας.", "apihelp-edit-param-minor": "Μικροεπεξεργασία.", @@ -50,12 +51,12 @@ "apihelp-edit-param-unwatch": "Να αφαιρεθεί η σελίδα από τη λίστα παρακολούθησης του τρέχοντα χρήστη.", "apihelp-edit-param-contentmodel": "Μοντέλο περιεχομένου για το νέο περιεχόμενο.", "apihelp-edit-example-edit": "Επεξεργασία κάποιας σελίδας.", - "apihelp-emailuser-description": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε χρήστη.", + "apihelp-emailuser-summary": "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε χρήστη.", "apihelp-emailuser-param-target": "Χρήστης στον οποίον να σταλεί το μήνυμα ηλεκτρονικού ταχυδρομείου.", "apihelp-emailuser-param-subject": "Κεφαλίδα θέματος.", "apihelp-emailuser-param-text": "Σώμα μηνύματος.", "apihelp-emailuser-param-ccme": "Αποστολή αντιγράφου αυτού του μηνύματος σε εμένα.", - "apihelp-expandtemplates-description": "Επεκτείνει όλα τα πρότυπα στον κώδικα wiki.", + "apihelp-expandtemplates-summary": "Επεκτείνει όλα τα πρότυπα στον κώδικα wiki.", "apihelp-expandtemplates-param-title": "Τίτλος σελίδας.", "apihelp-expandtemplates-param-text": "Κώδικας wiki προς μετατροπή.", "apihelp-feedcontributions-param-feedformat": "Η μορφή της ροής.", @@ -74,20 +75,20 @@ "apihelp-feedrecentchanges-param-target": "Εμφάνιση μόνο των αλλαγών σε σελίδες που συνδέονται με αυτή τη σελίδα.", "apihelp-feedrecentchanges-example-simple": "Εμφάνιση πρόσφατων αλλαγών.", "apihelp-feedrecentchanges-example-30days": "Εμφάνιση πρόσφατων αλλαγών για 30 ημέρες.", - "apihelp-feedwatchlist-description": "Επιστρέφει μια ροή λίστας παρακολούθησης.", + "apihelp-feedwatchlist-summary": "Επιστρέφει μια ροή λίστας παρακολούθησης.", "apihelp-feedwatchlist-param-feedformat": "Η μορφή της ροής.", "apihelp-filerevert-param-comment": "Σχόλιο ανεβάσματος.", "apihelp-help-example-recursive": "Όλη η βοήθεια σε μια σελίδα.", - "apihelp-imagerotate-description": "Περιστροφή μίας ή περισσοτέρων εικόνων.", + "apihelp-imagerotate-summary": "Περιστροφή μίας ή περισσοτέρων εικόνων.", "apihelp-imagerotate-param-rotation": "Μοίρες με τις οποίες να περιστραφεί η εικόνα ωρολογιακά.", "apihelp-import-param-summary": "Εισαγωγή σύνοψης.", "apihelp-login-param-name": "Όνομα χρήστη.", "apihelp-login-param-password": "Κωδικός πρόσβασης.", "apihelp-login-param-domain": "Τομέας (προαιρετικό).", "apihelp-login-example-login": "Σύνδεση.", - "apihelp-logout-description": "Αποσύνδεση και διαγραφή δεδομένων περιόδου λειτουργίας.", + "apihelp-logout-summary": "Αποσύνδεση και διαγραφή δεδομένων περιόδου λειτουργίας.", "apihelp-logout-example-logout": "Αποσύνδεση του τρέχοντα χρήστη.", - "apihelp-move-description": "Μετακίνηση σελίδας.", + "apihelp-move-summary": "Μετακίνηση σελίδας.", "apihelp-move-param-reason": "Λόγος μετονομασίας.", "apihelp-move-param-movetalk": "Μετονομασία της σελίδας συζήτησης, εάν υπάρχει.", "apihelp-move-param-movesubpages": "Μετονομασία υποσελίδων, εφόσον συντρέχει περίπτωση.", diff --git a/includes/api/i18n/en-gb.json b/includes/api/i18n/en-gb.json index f4373abb6b..777c4e8741 100644 --- a/includes/api/i18n/en-gb.json +++ b/includes/api/i18n/en-gb.json @@ -6,15 +6,16 @@ "Macofe" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n
    \nStatus: All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\nErroneous requests: When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n
    \nStatus: All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\nErroneous requests: When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].", "apihelp-main-param-maxage": "Set the max-age HTTP cache control header to this many seconds. Errors are never cached.", "apihelp-main-param-assert": "Verify the user is logged in if set to user, or has the bot userright if bot.", "apihelp-block-param-user": "Username, IP address, or IP range to block.", "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-watchuser": "Watch the user and talk pages of the user or IP address.", "apihelp-block-example-ip-simple": "Block IP address 192.0.2.5 for three days with reason First strike.", - "apihelp-clearhasmsg-description": "Clears the hasmsg flag for the current user.", - "apihelp-compare-description": "Get the difference between 2 pages.\n\nA revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.", + "apihelp-clearhasmsg-summary": "Clears the hasmsg flag for the current user.", + "apihelp-compare-summary": "Get the difference between 2 pages.", + "apihelp-compare-extended-description": "A revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.", "apihelp-createaccount-param-password": "Password (ignored if $1mailpassword is set).", "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with $1pageid.", "apihelp-delete-param-watch": "Add the page to the current user's watchlist.", @@ -30,7 +31,8 @@ "apihelp-filerevert-example-revert": "Revert Wiki.png to the version of 2011-03-05T15:27:40Z.", "apihelp-help-example-main": "Help for the main module.", "apihelp-help-example-query": "Help for two query submodules.", - "apihelp-import-description": "Import a page from another wiki, or an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the xml parameter.", + "apihelp-import-summary": "Import a page from another wiki, or an XML file.", + "apihelp-import-extended-description": "Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the xml parameter.", "apihelp-login-example-gettoken": "Retrieve a login token.", "apihelp-logout-example-logout": "Log the current user out.", "apihelp-move-param-to": "Title to rename the page to.", @@ -97,8 +99,8 @@ "apihelp-query+linkshere-example-simple": "Get a list of pages linking to the [[Main Page]].", "apihelp-query+linkshere-example-generator": "Get information about pages linking to the [[Main Page]].", "apihelp-query+logevents-example-simple": "List recent log events.", - "apihelp-query+pagepropnames-description": "List all page property names in use on the wiki.", - "apihelp-query+pageswithprop-description": "List all pages using a given page property.", + "apihelp-query+pagepropnames-summary": "List all page property names in use on the wiki.", + "apihelp-query+pageswithprop-summary": "List all pages using a given page property.", "apihelp-query+pageswithprop-example-generator": "Get page information about the first 10 pages using __NOTOC__.", "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace.", "apihelp-query+random-example-simple": "Return two random pages from the main namespace.", @@ -124,7 +126,7 @@ "apihelp-query+userinfo-example-simple": "Get information about the current user.", "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the watchlist of the current user.", "apihelp-query+watchlist-example-generator": "Fetch page info for recently changed pages on the current user's watchlist.", - "apihelp-query+watchlistraw-description": "Get all pages on the current user's watchlist.", + "apihelp-query+watchlistraw-summary": "Get all pages on the current user's watchlist.", "apihelp-query+watchlistraw-example-simple": "List pages on the watchlist of the current user.", "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist.", "apihelp-revisiondelete-example-revision": "Hide content for revision 12345 on the page Main Page.", @@ -142,15 +144,11 @@ "apihelp-userrights-example-userid": "Add the user with ID 123 to group bot, and remove from groups sysop and bureaucrat.", "apihelp-watch-param-title": "The page to (un)watch. Use $1titles instead.", "apihelp-watch-example-unwatch": "Unwatch the page Main Page.", - "apihelp-dbg-description": "Output data in PHP's var_export() format.", - "apihelp-dbgfm-description": "Output data in PHP's var_export() format (pretty-print in HTML).", - "apihelp-php-description": "Output data in serialised PHP format.", - "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML).", - "apihelp-txt-description": "Output data in PHP's print_r() format.", - "apihelp-txtfm-description": "Output data in PHP's print_r() format (pretty-print in HTML).", + "apihelp-php-summary": "Output data in serialised PHP format.", + "apihelp-phpfm-summary": "Output data in serialised PHP format (pretty-print in HTML).", "api-pageset-param-redirects-generator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids, and in pages returned by $1generator.", "api-pageset-param-redirects-nogenerator": "Automatically resolve redirects in $1titles, $1pageids, and $1revids.", "api-help-param-multi-separate": "Separate values with |.", - "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].", - "api-help-param-limited-in-miser-mode": "Note: Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned." + "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].", + "api-help-param-limited-in-miser-mode": "Note: Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using this may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned." } diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index ab8a8a56bd..3d4a100419 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -6,10 +6,11 @@ ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n
    \nStatus: All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\nErroneous requests: When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\nTesting: For ease of testing API requests, see [[Special:ApiSandbox]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n
    \nStatus: All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\nErroneous requests: When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\nTesting: For ease of testing API requests, see [[Special:ApiSandbox]].", "apihelp-main-param-action": "Which action to perform.", "apihelp-main-param-format": "The format of the output.", - "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code maxlag is returned with a message like Waiting for $host: $lag seconds lagged.
    See [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.", + "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code maxlag is returned with a message like Waiting for $host: $lag seconds lagged.
    See [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.", "apihelp-main-param-smaxage": "Set the s-maxage HTTP cache control header to this many seconds. Errors are never cached.", "apihelp-main-param-maxage": "Set the max-age HTTP cache control header to this many seconds. Errors are never cached.", "apihelp-main-param-assert": "Verify the user is logged in if set to user, or has the bot user right if bot.", @@ -24,7 +25,7 @@ "apihelp-main-param-errorlang": "Language to use for warnings and errors. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] with siprop=languages returns a list of language codes, or specify content to use this wiki's content language, or specify uselang to use the same value as the uselang parameter.", "apihelp-main-param-errorsuselocal": "If given, error texts will use locally-customized messages from the {{ns:MediaWiki}} namespace.", - "apihelp-block-description": "Block a user.", + "apihelp-block-summary": "Block a user.", "apihelp-block-param-user": "Username, IP address, or IP address range to block. Cannot be used together with $1userid", "apihelp-block-param-userid": "User ID to block. Cannot be used together with $1user.", "apihelp-block-param-expiry": "Expiry time. May be relative (e.g. 5 months or 2 weeks) or absolute (e.g. 2014-09-18T12:34:56Z). If set to infinite, indefinite, or never, the block will never expire.", @@ -34,39 +35,59 @@ "apihelp-block-param-autoblock": "Automatically block the last used IP address, and any subsequent IP addresses they try to login from.", "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the blockemail right).", "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the hideuser right).", - "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.", "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.", "apihelp-block-param-tags": "Change tags to apply to the entry in the block log.", "apihelp-block-example-ip-simple": "Block IP address 192.0.2.5 for three days with reason First strike.", "apihelp-block-example-user-complex": "Block user Vandal indefinitely with reason Vandalism, and prevent new account creation and email sending.", - "apihelp-changeauthenticationdata-description": "Change authentication data for the current user.", + "apihelp-changeauthenticationdata-summary": "Change authentication data for the current user.", "apihelp-changeauthenticationdata-example-password": "Attempt to change the current user's password to ExamplePassword.", - "apihelp-checktoken-description": "Check the validity of a token from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Check the validity of a token from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Type of token being tested.", "apihelp-checktoken-param-token": "Token to test.", "apihelp-checktoken-param-maxtokenage": "Maximum allowed age of the token, in seconds.", "apihelp-checktoken-example-simple": "Test the validity of a csrf token.", - "apihelp-clearhasmsg-description": "Clears the hasmsg flag for the current user.", + "apihelp-clearhasmsg-summary": "Clears the hasmsg flag for the current user.", "apihelp-clearhasmsg-example-1": "Clear the hasmsg flag for the current user.", - "apihelp-clientlogin-description": "Log in to the wiki using the interactive flow.", + "apihelp-clientlogin-summary": "Log in to the wiki using the interactive flow.", "apihelp-clientlogin-example-login": "Start the process of logging in to the wiki as user Example with password ExamplePassword.", "apihelp-clientlogin-example-login2": "Continue logging in after a UI response for two-factor auth, supplying an OATHToken of 987654.", - "apihelp-compare-description": "Get the difference between 2 pages.\n\nA revision number, a page title, or a page ID for both \"from\" and \"to\" must be passed.", + "apihelp-compare-summary": "Get the difference between two pages.", + "apihelp-compare-extended-description": "A revision number, a page title, a page ID, text, or a relative reference for both \"from\" and \"to\" must be passed.", "apihelp-compare-param-fromtitle": "First title to compare.", "apihelp-compare-param-fromid": "First page ID to compare.", "apihelp-compare-param-fromrev": "First revision to compare.", + "apihelp-compare-param-fromtext": "Use this text instead of the content of the revision specified by fromtitle, fromid or fromrev.", + "apihelp-compare-param-frompst": "Do a pre-save transform on fromtext.", + "apihelp-compare-param-fromcontentmodel": "Content model of fromtext. If not supplied, it will be guessed based on the other parameters.", + "apihelp-compare-param-fromcontentformat": "Content serialization format of fromtext.", "apihelp-compare-param-totitle": "Second title to compare.", "apihelp-compare-param-toid": "Second page ID to compare.", "apihelp-compare-param-torev": "Second revision to compare.", + "apihelp-compare-param-torelative": "Use a revision relative to the revision determined from fromtitle, fromid or fromrev. All of the other 'to' options will be ignored.", + "apihelp-compare-param-totext": "Use this text instead of the content of the revision specified by totitle, toid or torev.", + "apihelp-compare-param-topst": "Do a pre-save transform on totext.", + "apihelp-compare-param-tocontentmodel": "Content model of totext. If not supplied, it will be guessed based on the other parameters.", + "apihelp-compare-param-tocontentformat": "Content serialization format of totext.", + "apihelp-compare-param-prop": "Which pieces of information to get.", + "apihelp-compare-paramvalue-prop-diff": "The diff HTML.", + "apihelp-compare-paramvalue-prop-diffsize": "The size of the diff HTML, in bytes.", + "apihelp-compare-paramvalue-prop-rel": "The revision IDs of the revision previous to 'from' and after 'to', if any.", + "apihelp-compare-paramvalue-prop-ids": "The page and revision IDs of the 'from' and 'to' revisions.", + "apihelp-compare-paramvalue-prop-title": "The page titles of the 'from' and 'to' revisions.", + "apihelp-compare-paramvalue-prop-user": "The user name and ID of the 'from' and 'to' revisions.", + "apihelp-compare-paramvalue-prop-comment": "The comment on the 'from' and 'to' revisions.", + "apihelp-compare-paramvalue-prop-parsedcomment": "The parsed comment on the 'from' and 'to' revisions.", + "apihelp-compare-paramvalue-prop-size": "The size of the 'from' and 'to' revisions.", "apihelp-compare-example-1": "Create a diff between revision 1 and 2.", - "apihelp-createaccount-description": "Create a new user account.", + "apihelp-createaccount-summary": "Create a new user account.", "apihelp-createaccount-param-preservestate": "If [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] returned true for hasprimarypreservedstate, requests marked as primary-required should be omitted. If it returned a non-empty value for preservedusername, that username must be used for the username parameter.", "apihelp-createaccount-example-create": "Start the process of creating user Example with password ExamplePassword.", "apihelp-createaccount-param-name": "Username.", @@ -80,10 +101,12 @@ "apihelp-createaccount-param-language": "Language code to set as default for the user (optional, defaults to content language).", "apihelp-createaccount-example-pass": "Create user testuser with password test123.", "apihelp-createaccount-example-mail": "Create user testmailuser and email a randomly-generated password.", - "apihelp-cspreport-description": "Used by browsers to report violations of the Content Security Policy. This module should never be used, except when used automatically by a CSP compliant web browser.", + + "apihelp-cspreport-summary": "Used by browsers to report violations of the Content Security Policy. This module should never be used, except when used automatically by a CSP compliant web browser.", "apihelp-cspreport-param-reportonly": "Mark as being a report from a monitoring policy, not an enforced policy", "apihelp-cspreport-param-source": "What generated the CSP header that triggered this report", - "apihelp-delete-description": "Delete a page.", + + "apihelp-delete-summary": "Delete a page.", "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with $1pageid.", "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with $1title.", "apihelp-delete-param-reason": "Reason for the deletion. If not set, an automatically generated reason will be used.", @@ -95,9 +118,9 @@ "apihelp-delete-example-simple": "Delete Main Page.", "apihelp-delete-example-reason": "Delete Main Page with the reason Preparing for move.", - "apihelp-disabled-description": "This module has been disabled.", + "apihelp-disabled-summary": "This module has been disabled.", - "apihelp-edit-description": "Create and edit pages.", + "apihelp-edit-summary": "Create and edit pages.", "apihelp-edit-param-title": "Title of the page to edit. Cannot be used together with $1pageid.", "apihelp-edit-param-pageid": "Page ID of the page to edit. Cannot be used together with $1title.", "apihelp-edit-param-section": "Section number. 0 for the top section, new for a new section.", @@ -129,14 +152,14 @@ "apihelp-edit-example-prepend": "Prepend __NOTOC__ to a page.", "apihelp-edit-example-undo": "Undo revisions 13579 through 13585 with autosummary.", - "apihelp-emailuser-description": "Email a user.", + "apihelp-emailuser-summary": "Email a user.", "apihelp-emailuser-param-target": "User to send email to.", "apihelp-emailuser-param-subject": "Subject header.", "apihelp-emailuser-param-text": "Mail body.", "apihelp-emailuser-param-ccme": "Send a copy of this mail to me.", "apihelp-emailuser-example-email": "Send an email to user WikiSysop with the text Content.", - "apihelp-expandtemplates-description": "Expands all templates within wikitext.", + "apihelp-expandtemplates-summary": "Expands all templates within wikitext.", "apihelp-expandtemplates-param-title": "Title of page.", "apihelp-expandtemplates-param-text": "Wikitext to convert.", "apihelp-expandtemplates-param-revid": "Revision ID, for {{REVISIONID}} and similar variables.", @@ -154,7 +177,7 @@ "apihelp-expandtemplates-param-generatexml": "Generate XML parse tree (replaced by $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Expand the wikitext {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Returns a user contributions feed.", + "apihelp-feedcontributions-summary": "Returns a user contributions feed.", "apihelp-feedcontributions-param-feedformat": "The format of the feed.", "apihelp-feedcontributions-param-user": "What users to get the contributions for.", "apihelp-feedcontributions-param-namespace": "Which namespace to filter the contributions by.", @@ -168,7 +191,7 @@ "apihelp-feedcontributions-param-showsizediff": "Show the size difference between revisions.", "apihelp-feedcontributions-example-simple": "Return contributions for user Example.", - "apihelp-feedrecentchanges-description": "Returns a recent changes feed.", + "apihelp-feedrecentchanges-summary": "Returns a recent changes feed.", "apihelp-feedrecentchanges-param-feedformat": "The format of the feed.", "apihelp-feedrecentchanges-param-namespace": "Namespace to limit the results to.", "apihelp-feedrecentchanges-param-invert": "All namespaces but the selected one.", @@ -191,20 +214,20 @@ "apihelp-feedrecentchanges-example-simple": "Show recent changes.", "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.", - "apihelp-feedwatchlist-description": "Returns a watchlist feed.", + "apihelp-feedwatchlist-summary": "Returns a watchlist feed.", "apihelp-feedwatchlist-param-feedformat": "The format of the feed.", "apihelp-feedwatchlist-param-hours": "List pages modified within this many hours from now.", "apihelp-feedwatchlist-param-linktosections": "Link directly to changed sections if possible.", "apihelp-feedwatchlist-example-default": "Show the watchlist feed.", "apihelp-feedwatchlist-example-all6hrs": "Show all changes to watched pages in the past 6 hours.", - "apihelp-filerevert-description": "Revert a file to an old version.", + "apihelp-filerevert-summary": "Revert a file to an old version.", "apihelp-filerevert-param-filename": "Target filename, without the File: prefix.", "apihelp-filerevert-param-comment": "Upload comment.", "apihelp-filerevert-param-archivename": "Archive name of the revision to revert to.", "apihelp-filerevert-example-revert": "Revert Wiki.png to the version of 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Display help for the specified modules.", + "apihelp-help-summary": "Display help for the specified modules.", "apihelp-help-param-modules": "Modules to display help for (values of the action and format parameters, or main). Can specify submodules with a +.", "apihelp-help-param-submodules": "Include help for submodules of the named module.", "apihelp-help-param-recursivesubmodules": "Include help for submodules recursively.", @@ -217,13 +240,14 @@ "apihelp-help-example-help": "Help for the help module itself.", "apihelp-help-example-query": "Help for two query submodules.", - "apihelp-imagerotate-description": "Rotate one or more images.", + "apihelp-imagerotate-summary": "Rotate one or more images.", "apihelp-imagerotate-param-rotation": "Degrees to rotate image clockwise.", "apihelp-imagerotate-param-tags": "Tags to apply to the entry in the upload log.", "apihelp-imagerotate-example-simple": "Rotate File:Example.png by 90 degrees.", "apihelp-imagerotate-example-generator": "Rotate all images in Category:Flip by 180 degrees.", - "apihelp-import-description": "Import a page from another wiki, or from an XML file.\n\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the xml parameter.", + "apihelp-import-summary": "Import a page from another wiki, or from an XML file.", + "apihelp-import-extended-description": "Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending a file for the xml parameter.", "apihelp-import-param-summary": "Log entry import summary.", "apihelp-import-param-xml": "Uploaded XML file.", "apihelp-import-param-interwikisource": "For interwiki imports: wiki to import from.", @@ -235,11 +259,12 @@ "apihelp-import-param-tags": "Change tags to apply to the entry in the import log and to the null revision on the imported pages.", "apihelp-import-example-import": "Import [[meta:Help:ParserFunctions]] to namespace 100 with full history.", - "apihelp-linkaccount-description": "Link an account from a third-party provider to the current user.", + "apihelp-linkaccount-summary": "Link an account from a third-party provider to the current user.", "apihelp-linkaccount-example-link": "Start the process of linking to an account from Example.", - "apihelp-login-description": "Log in and get authentication cookies.\n\nThis action should only be used in combination with [[Special:BotPasswords]]; use for main-account login is deprecated and may fail without warning. To safely log in to the main account, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Log in and get authentication cookies.\n\nThis action is deprecated and may fail without warning. To safely log in, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Log in and get authentication cookies.", + "apihelp-login-extended-description": "This action should only be used in combination with [[Special:BotPasswords]]; use for main-account login is deprecated and may fail without warning. To safely log in to the main account, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "This action is deprecated and may fail without warning. To safely log in, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "User name.", "apihelp-login-param-password": "Password.", "apihelp-login-param-domain": "Domain (optional).", @@ -247,10 +272,10 @@ "apihelp-login-example-gettoken": "Retrieve a login token.", "apihelp-login-example-login": "Log in.", - "apihelp-logout-description": "Log out and clear session data.", + "apihelp-logout-summary": "Log out and clear session data.", "apihelp-logout-example-logout": "Log the current user out.", - "apihelp-managetags-description": "Perform management tasks relating to change tags.", + "apihelp-managetags-summary": "Perform management tasks relating to change tags.", "apihelp-managetags-param-operation": "Which operation to perform:\n;create:Create a new change tag for manual use.\n;delete:Remove a change tag from the database, including removing the tag from all revisions, recent change entries and log entries on which it is used.\n;activate:Activate a change tag, allowing users to apply it manually.\n;deactivate:Deactivate a change tag, preventing users from applying it manually.", "apihelp-managetags-param-tag": "Tag to create, delete, activate or deactivate. For tag creation, the tag must not exist. For tag deletion, the tag must exist. For tag activation, the tag must exist and not be in use by an extension. For tag deactivation, the tag must be currently active and manually defined.", "apihelp-managetags-param-reason": "An optional reason for creating, deleting, activating or deactivating the tag.", @@ -261,7 +286,7 @@ "apihelp-managetags-example-activate": "Activate a tag named spam with the reason For use in edit patrolling", "apihelp-managetags-example-deactivate": "Deactivate a tag named spam with the reason No longer required", - "apihelp-mergehistory-description": "Merge page histories.", + "apihelp-mergehistory-summary": "Merge page histories.", "apihelp-mergehistory-param-from": "Title of the page from which history will be merged. Cannot be used together with $1fromid.", "apihelp-mergehistory-param-fromid": "Page ID of the page from which history will be merged. Cannot be used together with $1from.", "apihelp-mergehistory-param-to": "Title of the page to which history will be merged. Cannot be used together with $1toid.", @@ -271,7 +296,7 @@ "apihelp-mergehistory-example-merge": "Merge the entire history of Oldpage into Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Merge the page revisions of Oldpage dating up to 2015-12-31T04:37:41Z into Newpage.", - "apihelp-move-description": "Move a page.", + "apihelp-move-summary": "Move a page.", "apihelp-move-param-from": "Title of the page to rename. Cannot be used together with $1fromid.", "apihelp-move-param-fromid": "Page ID of the page to rename. Cannot be used together with $1from.", "apihelp-move-param-to": "Title to rename the page to.", @@ -286,17 +311,18 @@ "apihelp-move-param-tags": "Change tags to apply to the entry in the move log and to the null revision on the destination page.", "apihelp-move-example-move": "Move Badtitle to Goodtitle without leaving a redirect.", - "apihelp-opensearch-description": "Search the wiki using the OpenSearch protocol.", + "apihelp-opensearch-summary": "Search the wiki using the OpenSearch protocol.", "apihelp-opensearch-param-search": "Search string.", "apihelp-opensearch-param-limit": "Maximum number of results to return.", "apihelp-opensearch-param-namespace": "Namespaces to search.", - "apihelp-opensearch-param-suggest": "Do nothing if [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] is false.", + "apihelp-opensearch-param-suggest": "Do nothing if [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] is false.", "apihelp-opensearch-param-redirects": "How to handle redirects:\n;return:Return the redirect itself.\n;resolve:Return the target page. May return fewer than $1limit results.\nFor historical reasons, the default is \"return\" for $1format=json and \"resolve\" for other formats.", "apihelp-opensearch-param-format": "The format of the output.", "apihelp-opensearch-param-warningsaserror": "If warnings are raised with format=json, return an API error instead of ignoring them.", "apihelp-opensearch-example-te": "Find pages beginning with Te.", - "apihelp-options-description": "Change preferences of the current user.\n\nOnly options which are registered in core or in one of installed extensions, or options with keys prefixed with userjs- (intended to be used by user scripts), can be set.", + "apihelp-options-summary": "Change preferences of the current user.", + "apihelp-options-extended-description": "Only options which are registered in core or in one of installed extensions, or options with keys prefixed with userjs- (intended to be used by user scripts), can be set.", "apihelp-options-param-reset": "Resets preferences to the site defaults.", "apihelp-options-param-resetkinds": "List of types of options to reset when the $1reset option is set.", "apihelp-options-param-change": "List of changes, formatted name=value (e.g. skin=vector). If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value. If any value passed contains the pipe character (|), use the [[Special:ApiHelp/main#main/datatypes|alternative multiple-value separator]] for correct operation.", @@ -306,7 +332,7 @@ "apihelp-options-example-change": "Change skin and hideminor preferences.", "apihelp-options-example-complex": "Reset all preferences, then set skin and nickname.", - "apihelp-paraminfo-description": "Obtain information about API modules.", + "apihelp-paraminfo-summary": "Obtain information about API modules.", "apihelp-paraminfo-param-modules": "List of module names (values of the action and format parameters, or main). Can specify submodules with a +, or all submodules with +*, or all submodules recursively with +**.", "apihelp-paraminfo-param-helpformat": "Format of help strings.", "apihelp-paraminfo-param-querymodules": "List of query module names (value of prop, meta or list parameter). Use $1modules=query+foo instead of $1querymodules=foo.", @@ -316,7 +342,8 @@ "apihelp-paraminfo-example-1": "Show info for [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], and [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Show info for all submodules of [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "Parses content and returns parser output.\n\nSee the various prop-modules of [[Special:ApiHelp/query|action=query]] to get information from the current version of a page.\n\nThere are several ways to specify the text to parse:\n# Specify a page or revision, using $1page, $1pageid, or $1oldid.\n# Specify content explicitly, using $1text, $1title, and $1contentmodel.\n# Specify only a summary to parse. $1prop should be given an empty value.", + "apihelp-parse-summary": "Parses content and returns parser output.", + "apihelp-parse-extended-description": "See the various prop-modules of [[Special:ApiHelp/query|action=query]] to get information from the current version of a page.\n\nThere are several ways to specify the text to parse:\n# Specify a page or revision, using $1page, $1pageid, or $1oldid.\n# Specify content explicitly, using $1text, $1title, and $1contentmodel.\n# Specify only a summary to parse. $1prop should be given an empty value.", "apihelp-parse-param-title": "Title of page the text belongs to. If omitted, $1contentmodel must be specified, and [[API]] will be used as the title.", "apihelp-parse-param-text": "Text to parse. Use $1title or $1contentmodel to control the content model.", "apihelp-parse-param-summary": "Summary to parse.", @@ -336,7 +363,7 @@ "apihelp-parse-paramvalue-prop-sections": "Gives the sections in the parsed wikitext.", "apihelp-parse-paramvalue-prop-revid": "Adds the revision ID of the parsed page.", "apihelp-parse-paramvalue-prop-displaytitle": "Adds the title of the parsed wikitext.", - "apihelp-parse-paramvalue-prop-headitems": "Deprecated. Gives items to put in the <head> of the page.", + "apihelp-parse-paramvalue-prop-headitems": "Gives items to put in the <head> of the page.", "apihelp-parse-paramvalue-prop-headhtml": "Gives parsed <head> of the page.", "apihelp-parse-paramvalue-prop-modules": "Gives the ResourceLoader modules used on the page. To load, use mw.loader.using(). Either jsconfigvars or encodedjsconfigvars must be requested jointly with modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Gives the JavaScript configuration variables specific to the page. To apply, use mw.config.set().", @@ -348,6 +375,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when $1disablelimitreport is set.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when $1disablelimitreport is set.", "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Gives the warnings that occurred while parsing content.", + "apihelp-parse-param-wrapoutputclass": "CSS class to use to wrap the parser output.", "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.", "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with $1text.", "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with $1prop=langlinks).", @@ -361,6 +390,7 @@ "apihelp-parse-param-preview": "Parse in preview mode.", "apihelp-parse-param-sectionpreview": "Parse in section preview mode (enables preview mode too).", "apihelp-parse-param-disabletoc": "Omit table of contents in output.", + "apihelp-parse-param-useskin": "Apply the selected skin to the parser output. May affect the following properties: langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-param-contentformat": "Content serialization format used for the input text. Only valid when used with $1text.", "apihelp-parse-param-contentmodel": "Content model of the input text. If omitted, $1title must be specified, and default will be the model of the specified title. Only valid when used with $1text.", "apihelp-parse-example-page": "Parse a page.", @@ -368,14 +398,14 @@ "apihelp-parse-example-texttitle": "Parse wikitext, specifying the page title.", "apihelp-parse-example-summary": "Parse a summary.", - "apihelp-patrol-description": "Patrol a page or revision.", + "apihelp-patrol-summary": "Patrol a page or revision.", "apihelp-patrol-param-rcid": "Recentchanges ID to patrol.", "apihelp-patrol-param-revid": "Revision ID to patrol.", "apihelp-patrol-param-tags": "Change tags to apply to the entry in the patrol log.", "apihelp-patrol-example-rcid": "Patrol a recent change.", "apihelp-patrol-example-revid": "Patrol a revision.", - "apihelp-protect-description": "Change the protection level of a page.", + "apihelp-protect-summary": "Change the protection level of a page.", "apihelp-protect-param-title": "Title of the page to (un)protect. Cannot be used together with $1pageid.", "apihelp-protect-param-pageid": "ID of the page to (un)protect. Cannot be used together with $1title.", "apihelp-protect-param-protections": "List of protection levels, formatted action=level (e.g. edit=sysop). A level of all means everyone is allowed to take the action, i.e. no restriction.\n\nNote: Any actions not listed will have restrictions removed.", @@ -389,13 +419,14 @@ "apihelp-protect-example-unprotect": "Unprotect a page by setting restrictions to all (i.e. everyone is allowed to take the action).", "apihelp-protect-example-unprotect2": "Unprotect a page by setting no restrictions.", - "apihelp-purge-description": "Purge the cache for the given titles.", + "apihelp-purge-summary": "Purge the cache for the given titles.", "apihelp-purge-param-forcelinkupdate": "Update the links tables.", "apihelp-purge-param-forcerecursivelinkupdate": "Update the links table, and update the links tables for any page that uses this page as a template.", "apihelp-purge-example-simple": "Purge the Main Page and the API page.", "apihelp-purge-example-generator": "Purge the first 10 pages in the main namespace.", - "apihelp-query-description": "Fetch data from and about MediaWiki.\n\nAll data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.", + "apihelp-query-summary": "Fetch data from and about MediaWiki.", + "apihelp-query-extended-description": "All data modifications will first have to use query to acquire a token to prevent abuse from malicious sites.", "apihelp-query-param-prop": "Which properties to get for the queried pages.", "apihelp-query-param-list": "Which lists to get.", "apihelp-query-param-meta": "Which metadata to get.", @@ -407,7 +438,7 @@ "apihelp-query-example-revisions": "Fetch [[Special:ApiHelp/query+siteinfo|site info]] and [[Special:ApiHelp/query+revisions|revisions]] of Main Page.", "apihelp-query-example-allpages": "Fetch revisions of pages beginning with API/.", - "apihelp-query+allcategories-description": "Enumerate all categories.", + "apihelp-query+allcategories-summary": "Enumerate all categories.", "apihelp-query+allcategories-param-from": "The category to start enumerating from.", "apihelp-query+allcategories-param-to": "The category to stop enumerating at.", "apihelp-query+allcategories-param-prefix": "Search for all category titles that begin with this value.", @@ -421,7 +452,7 @@ "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each.", "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning List.", - "apihelp-query+alldeletedrevisions-description": "List all deleted revisions by a user or in a namespace.", + "apihelp-query+alldeletedrevisions-summary": "List all deleted revisions by a user or in a namespace.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "May only be used with $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Cannot be used with $3user.", "apihelp-query+alldeletedrevisions-param-start": "The timestamp to start enumerating from.", @@ -433,12 +464,12 @@ "apihelp-query+alldeletedrevisions-param-user": "Only list revisions by this user.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Don't list revisions by this user.", "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Note: Due to [[mw:Manual:$wgMiserMode|miser mode]], using $1user and $1namespace together may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Note: Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using $1user and $1namespace together may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned.", "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.", "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.", - "apihelp-query+allfileusages-description": "List all file usages, including non-existing.", + "apihelp-query+allfileusages-summary": "List all file usages, including non-existing.", "apihelp-query+allfileusages-param-from": "The title of the file to start enumerating from.", "apihelp-query+allfileusages-param-to": "The title of the file to stop enumerating at.", "apihelp-query+allfileusages-param-prefix": "Search for all file titles that begin with this value.", @@ -453,7 +484,7 @@ "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones.", "apihelp-query+allfileusages-example-generator": "Gets pages containing the files.", - "apihelp-query+allimages-description": "Enumerate all images sequentially.", + "apihelp-query+allimages-summary": "Enumerate all images sequentially.", "apihelp-query+allimages-param-sort": "Property to sort by.", "apihelp-query+allimages-param-dir": "The direction in which to list.", "apihelp-query+allimages-param-from": "The image title to start enumerating from. Can only be used with $1sort=name.", @@ -474,7 +505,7 @@ "apihelp-query+allimages-example-mimetypes": "Show a list of files with MIME type image/png or image/gif", "apihelp-query+allimages-example-generator": "Show info about 4 files starting at the letter T.", - "apihelp-query+alllinks-description": "Enumerate all links that point to a given namespace.", + "apihelp-query+alllinks-summary": "Enumerate all links that point to a given namespace.", "apihelp-query+alllinks-param-from": "The title of the link to start enumerating from.", "apihelp-query+alllinks-param-to": "The title of the link to stop enumerating at.", "apihelp-query+alllinks-param-prefix": "Search for all linked titles that begin with this value.", @@ -490,7 +521,7 @@ "apihelp-query+alllinks-example-unique-generator": "Gets all linked titles, marking the missing ones.", "apihelp-query+alllinks-example-generator": "Gets pages containing the links.", - "apihelp-query+allmessages-description": "Return messages from this site.", + "apihelp-query+allmessages-summary": "Return messages from this site.", "apihelp-query+allmessages-param-messages": "Which messages to output. * (default) means all messages.", "apihelp-query+allmessages-param-prop": "Which properties to get.", "apihelp-query+allmessages-param-enableparser": "Set to enable parser, will preprocess the wikitext of message (substitute magic words, handle templates, etc.).", @@ -507,7 +538,7 @@ "apihelp-query+allmessages-example-ipb": "Show messages starting with ipb-.", "apihelp-query+allmessages-example-de": "Show messages august and mainpage in German.", - "apihelp-query+allpages-description": "Enumerate all pages sequentially in a given namespace.", + "apihelp-query+allpages-summary": "Enumerate all pages sequentially in a given namespace.", "apihelp-query+allpages-param-from": "The page title to start enumerating from.", "apihelp-query+allpages-param-to": "The page title to stop enumerating at.", "apihelp-query+allpages-param-prefix": "Search for all page titles that begin with this value.", @@ -526,7 +557,7 @@ "apihelp-query+allpages-example-generator": "Show info about 4 pages starting at the letter T.", "apihelp-query+allpages-example-generator-revisions": "Show content of first 2 non-redirect pages beginning at Re.", - "apihelp-query+allredirects-description": "List all redirects to a namespace.", + "apihelp-query+allredirects-summary": "List all redirects to a namespace.", "apihelp-query+allredirects-param-from": "The title of the redirect to start enumerating from.", "apihelp-query+allredirects-param-to": "The title of the redirect to stop enumerating at.", "apihelp-query+allredirects-param-prefix": "Search for all target pages that begin with this value.", @@ -544,7 +575,7 @@ "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones.", "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects.", - "apihelp-query+allrevisions-description": "List all revisions.", + "apihelp-query+allrevisions-summary": "List all revisions.", "apihelp-query+allrevisions-param-start": "The timestamp to start enumerating from.", "apihelp-query+allrevisions-param-end": "The timestamp to stop enumerating at.", "apihelp-query+allrevisions-param-user": "Only list revisions by this user.", @@ -554,14 +585,14 @@ "apihelp-query+allrevisions-example-user": "List the last 50 contributions by user Example.", "apihelp-query+allrevisions-example-ns-main": "List the first 50 revisions in the main namespace.", - "apihelp-query+mystashedfiles-description": "Get a list of files in the current user's upload stash.", + "apihelp-query+mystashedfiles-summary": "Get a list of files in the current user's upload stash.", "apihelp-query+mystashedfiles-param-prop": "Which properties to fetch for the files.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Fetch the file size and image dimensions.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Fetch the file's MIME type and media type.", "apihelp-query+mystashedfiles-param-limit": "How many files to get.", "apihelp-query+mystashedfiles-example-simple": "Get the filekey, file size, and pixel size of files in the current user's upload stash.", - "apihelp-query+alltransclusions-description": "List all transclusions (pages embedded using {{x}}), including non-existing.", + "apihelp-query+alltransclusions-summary": "List all transclusions (pages embedded using {{x}}), including non-existing.", "apihelp-query+alltransclusions-param-from": "The title of the transclusion to start enumerating from.", "apihelp-query+alltransclusions-param-to": "The title of the transclusion to stop enumerating at.", "apihelp-query+alltransclusions-param-prefix": "Search for all transcluded titles that begin with this value.", @@ -577,7 +608,7 @@ "apihelp-query+alltransclusions-example-unique-generator": "Gets all transcluded titles, marking the missing ones.", "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions.", - "apihelp-query+allusers-description": "Enumerate all registered users.", + "apihelp-query+allusers-summary": "Enumerate all registered users.", "apihelp-query+allusers-param-from": "The user name to start enumerating from.", "apihelp-query+allusers-param-to": "The user name to stop enumerating at.", "apihelp-query+allusers-param-prefix": "Search for all users that begin with this value.", @@ -599,14 +630,14 @@ "apihelp-query+allusers-param-attachedwiki": "With $1prop=centralids, also indicate whether the user is attached with the wiki identified by this ID.", "apihelp-query+allusers-example-Y": "List users starting at Y.", - "apihelp-query+authmanagerinfo-description": "Retrieve information about the current authentication status.", + "apihelp-query+authmanagerinfo-summary": "Retrieve information about the current authentication status.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Test whether the user's current authentication status is sufficient for the specified security-sensitive operation.", "apihelp-query+authmanagerinfo-param-requestsfor": "Fetch information about the authentication requests needed for the specified authentication action.", "apihelp-query+authmanagerinfo-example-login": "Fetch the requests that may be used when beginning a login.", "apihelp-query+authmanagerinfo-example-login-merged": "Fetch the requests that may be used when beginning a login, with form fields merged.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Test whether authentication is sufficient for action foo.", - "apihelp-query+backlinks-description": "Find all pages that link to the given page.", + "apihelp-query+backlinks-summary": "Find all pages that link to the given page.", "apihelp-query+backlinks-param-title": "Title to search. Cannot be used together with $1pageid.", "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with $1title.", "apihelp-query+backlinks-param-namespace": "The namespace to enumerate.", @@ -617,7 +648,7 @@ "apihelp-query+backlinks-example-simple": "Show links to Main page.", "apihelp-query+backlinks-example-generator": "Get information about pages linking to Main page.", - "apihelp-query+blocks-description": "List all blocked users and IP addresses.", + "apihelp-query+blocks-summary": "List all blocked users and IP addresses.", "apihelp-query+blocks-param-start": "The timestamp to start enumerating from.", "apihelp-query+blocks-param-end": "The timestamp to stop enumerating at.", "apihelp-query+blocks-param-ids": "List of block IDs to list (optional).", @@ -639,7 +670,7 @@ "apihelp-query+blocks-example-simple": "List blocks.", "apihelp-query+blocks-example-users": "List blocks of users Alice and Bob.", - "apihelp-query+categories-description": "List all categories the pages belong to.", + "apihelp-query+categories-summary": "List all categories the pages belong to.", "apihelp-query+categories-param-prop": "Which additional properties to get for each category:", "apihelp-query+categories-paramvalue-prop-sortkey": "Adds the sortkey (hexadecimal string) and sortkey prefix (human-readable part) for the category.", "apihelp-query+categories-paramvalue-prop-timestamp": "Adds timestamp of when the category was added.", @@ -651,10 +682,10 @@ "apihelp-query+categories-example-simple": "Get a list of categories the page Albert Einstein belongs to.", "apihelp-query+categories-example-generator": "Get information about all categories used in the page Albert Einstein.", - "apihelp-query+categoryinfo-description": "Returns information about the given categories.", + "apihelp-query+categoryinfo-summary": "Returns information about the given categories.", "apihelp-query+categoryinfo-example-simple": "Get information about Category:Foo and Category:Bar.", - "apihelp-query+categorymembers-description": "List all pages in a given category.", + "apihelp-query+categorymembers-summary": "List all pages in a given category.", "apihelp-query+categorymembers-param-title": "Which category to enumerate (required). Must include the {{ns:category}}: prefix. Cannot be used together with $1pageid.", "apihelp-query+categorymembers-param-pageid": "Page ID of the category to enumerate. Cannot be used together with $1title.", "apihelp-query+categorymembers-param-prop": "Which pieces of information to include:", @@ -680,7 +711,7 @@ "apihelp-query+categorymembers-example-simple": "Get first 10 pages in Category:Physics.", "apihelp-query+categorymembers-example-generator": "Get page info about first 10 pages in Category:Physics.", - "apihelp-query+contributors-description": "Get the list of logged-in contributors and the count of anonymous contributors to a page.", + "apihelp-query+contributors-summary": "Get the list of logged-in contributors and the count of anonymous contributors to a page.", "apihelp-query+contributors-param-group": "Only include users in the given groups. Does not include implicit or auto-promoted groups like *, user, or autoconfirmed.", "apihelp-query+contributors-param-excludegroup": "Exclude users in the given groups. Does not include implicit or auto-promoted groups like *, user, or autoconfirmed.", "apihelp-query+contributors-param-rights": "Only include users having the given rights. Does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed.", @@ -688,7 +719,8 @@ "apihelp-query+contributors-param-limit": "How many contributors to return.", "apihelp-query+contributors-example-simple": "Show contributors to the page Main Page.", - "apihelp-query+deletedrevisions-description": "Get deleted revision information.\n\nMay be used in several ways:\n# Get deleted revisions for a set of pages, by setting titles or pageids. Ordered by title and timestamp.\n# Get data about a set of deleted revisions by setting their IDs with revids. Ordered by revision ID.", + "apihelp-query+deletedrevisions-summary": "Get deleted revision information.", + "apihelp-query+deletedrevisions-extended-description": "May be used in several ways:\n# Get deleted revisions for a set of pages, by setting titles or pageids. Ordered by title and timestamp.\n# Get data about a set of deleted revisions by setting their IDs with revids. Ordered by revision ID.", "apihelp-query+deletedrevisions-param-start": "The timestamp to start enumerating from. Ignored when processing a list of revision IDs.", "apihelp-query+deletedrevisions-param-end": "The timestamp to stop enumerating at. Ignored when processing a list of revision IDs.", "apihelp-query+deletedrevisions-param-tag": "Only list revisions tagged with this tag.", @@ -697,7 +729,8 @@ "apihelp-query+deletedrevisions-example-titles": "List the deleted revisions of the pages Main Page and Talk:Main Page, with content.", "apihelp-query+deletedrevisions-example-revids": "List the information for deleted revision 123456.", - "apihelp-query+deletedrevs-description": "List deleted revisions.\n\nOperates in three modes:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.", + "apihelp-query+deletedrevs-summary": "List deleted revisions.", + "apihelp-query+deletedrevs-extended-description": "Operates in three modes:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}}: $2", "apihelp-query+deletedrevs-param-start": "The timestamp to start enumerating from.", "apihelp-query+deletedrevs-param-end": "The timestamp to stop enumerating at.", @@ -716,16 +749,16 @@ "apihelp-query+deletedrevs-example-mode3-main": "List the first 50 deleted revisions in the main namespace (mode 3).", "apihelp-query+deletedrevs-example-mode3-talk": "List the first 50 deleted pages in the {{ns:talk}} namespace (mode 3).", - "apihelp-query+disabled-description": "This query module has been disabled.", + "apihelp-query+disabled-summary": "This query module has been disabled.", - "apihelp-query+duplicatefiles-description": "List all files that are duplicates of the given files based on hash values.", + "apihelp-query+duplicatefiles-summary": "List all files that are duplicates of the given files based on hash values.", "apihelp-query+duplicatefiles-param-limit": "How many duplicate files to return.", "apihelp-query+duplicatefiles-param-dir": "The direction in which to list.", "apihelp-query+duplicatefiles-param-localonly": "Look only for files in the local repository.", "apihelp-query+duplicatefiles-example-simple": "Look for duplicates of [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Look for duplicates of all files.", - "apihelp-query+embeddedin-description": "Find all pages that embed (transclude) the given title.", + "apihelp-query+embeddedin-summary": "Find all pages that embed (transclude) the given title.", "apihelp-query+embeddedin-param-title": "Title to search. Cannot be used together with $1pageid.", "apihelp-query+embeddedin-param-pageid": "Page ID to search. Cannot be used together with $1title.", "apihelp-query+embeddedin-param-namespace": "The namespace to enumerate.", @@ -735,14 +768,14 @@ "apihelp-query+embeddedin-example-simple": "Show pages transcluding Template:Stub.", "apihelp-query+embeddedin-example-generator": "Get information about pages transcluding Template:Stub.", - "apihelp-query+extlinks-description": "Returns all external URLs (not interwikis) from the given pages.", + "apihelp-query+extlinks-summary": "Returns all external URLs (not interwikis) from the given pages.", "apihelp-query+extlinks-param-limit": "How many links to return.", "apihelp-query+extlinks-param-protocol": "Protocol of the URL. If empty and $1query is set, the protocol is http. Leave both this and $1query empty to list all external links.", "apihelp-query+extlinks-param-query": "Search string without protocol. Useful for checking whether a certain page contains a certain external url.", "apihelp-query+extlinks-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.", "apihelp-query+extlinks-example-simple": "Get a list of external links on Main Page.", - "apihelp-query+exturlusage-description": "Enumerate pages that contain a given URL.", + "apihelp-query+exturlusage-summary": "Enumerate pages that contain a given URL.", "apihelp-query+exturlusage-param-prop": "Which pieces of information to include:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Adds the ID of page.", "apihelp-query+exturlusage-paramvalue-prop-title": "Adds the title and namespace ID of the page.", @@ -754,7 +787,7 @@ "apihelp-query+exturlusage-param-expandurl": "Expand protocol-relative URLs with the canonical protocol.", "apihelp-query+exturlusage-example-simple": "Show pages linking to http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Enumerate all deleted files sequentially.", + "apihelp-query+filearchive-summary": "Enumerate all deleted files sequentially.", "apihelp-query+filearchive-param-from": "The image title to start enumerating from.", "apihelp-query+filearchive-param-to": "The image title to stop enumerating at.", "apihelp-query+filearchive-param-prefix": "Search for all image titles that begin with this value.", @@ -777,11 +810,11 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "Adds the filename of the archive version for non-latest versions.", "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.", - "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.", - "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.", + "apihelp-query+filerepoinfo-summary": "Return meta information about image repositories configured on the wiki.", + "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.", "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.", - "apihelp-query+fileusage-description": "Find all pages that use the given files.", + "apihelp-query+fileusage-summary": "Find all pages that use the given files.", "apihelp-query+fileusage-param-prop": "Which properties to get:", "apihelp-query+fileusage-paramvalue-prop-pageid": "Page ID of each page.", "apihelp-query+fileusage-paramvalue-prop-title": "Title of each page.", @@ -792,7 +825,7 @@ "apihelp-query+fileusage-example-simple": "Get a list of pages using [[:File:Example.jpg]].", "apihelp-query+fileusage-example-generator": "Get information about pages using [[:File:Example.jpg]].", - "apihelp-query+imageinfo-description": "Returns file information and upload history.", + "apihelp-query+imageinfo-summary": "Returns file information and upload history.", "apihelp-query+imageinfo-param-prop": "Which file information to get:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adds timestamp for the uploaded version.", "apihelp-query+imageinfo-paramvalue-prop-user": "Adds the user who uploaded each file version.", @@ -829,14 +862,14 @@ "apihelp-query+imageinfo-example-simple": "Fetch information about the current version of [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "Fetch information about versions of [[:File:Test.jpg]] from 2008 and later.", - "apihelp-query+images-description": "Returns all files contained on the given pages.", + "apihelp-query+images-summary": "Returns all files contained on the given pages.", "apihelp-query+images-param-limit": "How many files to return.", "apihelp-query+images-param-images": "Only list these files. Useful for checking whether a certain page has a certain file.", "apihelp-query+images-param-dir": "The direction in which to list.", "apihelp-query+images-example-simple": "Get a list of files used in the [[Main Page]].", "apihelp-query+images-example-generator": "Get information about all files used in the [[Main Page]].", - "apihelp-query+imageusage-description": "Find all pages that use the given image title.", + "apihelp-query+imageusage-summary": "Find all pages that use the given image title.", "apihelp-query+imageusage-param-title": "Title to search. Cannot be used together with $1pageid.", "apihelp-query+imageusage-param-pageid": "Page ID to search. Cannot be used together with $1title.", "apihelp-query+imageusage-param-namespace": "The namespace to enumerate.", @@ -847,7 +880,7 @@ "apihelp-query+imageusage-example-simple": "Show pages using [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "Get information about pages using [[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "Get basic page information.", + "apihelp-query+info-summary": "Get basic page information.", "apihelp-query+info-param-prop": "Which additional properties to get:", "apihelp-query+info-paramvalue-prop-protection": "List the protection level of each page.", "apihelp-query+info-paramvalue-prop-talkid": "The page ID of the talk page for each non-talk page.", @@ -865,7 +898,8 @@ "apihelp-query+info-example-simple": "Get information about the page Main Page.", "apihelp-query+info-example-protection": "Get general and protection information about the page Main Page.", - "apihelp-query+iwbacklinks-description": "Find all pages that link to the given interwiki link.\n\nCan be used to find all links with a prefix, or all links to a title (with a given prefix). Using neither parameter is effectively \"all interwiki links\".", + "apihelp-query+iwbacklinks-summary": "Find all pages that link to the given interwiki link.", + "apihelp-query+iwbacklinks-extended-description": "Can be used to find all links with a prefix, or all links to a title (with a given prefix). Using neither parameter is effectively \"all interwiki links\".", "apihelp-query+iwbacklinks-param-prefix": "Prefix for the interwiki.", "apihelp-query+iwbacklinks-param-title": "Interwiki link to search for. Must be used with $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "How many total pages to return.", @@ -876,7 +910,7 @@ "apihelp-query+iwbacklinks-example-simple": "Get pages linking to [[wikibooks:Test]].", "apihelp-query+iwbacklinks-example-generator": "Get information about pages linking to [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Returns all interwiki links from the given pages.", + "apihelp-query+iwlinks-summary": "Returns all interwiki links from the given pages.", "apihelp-query+iwlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).", "apihelp-query+iwlinks-param-prop": "Which additional properties to get for each interlanguage link:", "apihelp-query+iwlinks-paramvalue-prop-url": "Adds the full URL.", @@ -886,7 +920,8 @@ "apihelp-query+iwlinks-param-dir": "The direction in which to list.", "apihelp-query+iwlinks-example-simple": "Get interwiki links from the page Main Page.", - "apihelp-query+langbacklinks-description": "Find all pages that link to the given language link.\n\nCan be used to find all links with a language code, or all links to a title (with a given language). Using neither parameter is effectively \"all language links\".\n\nNote that this may not consider language links added by extensions.", + "apihelp-query+langbacklinks-summary": "Find all pages that link to the given language link.", + "apihelp-query+langbacklinks-extended-description": "Can be used to find all links with a language code, or all links to a title (with a given language). Using neither parameter is effectively \"all language links\".\n\nNote that this may not consider language links added by extensions.", "apihelp-query+langbacklinks-param-lang": "Language for the language link.", "apihelp-query+langbacklinks-param-title": "Language link to search for. Must be used with $1lang.", "apihelp-query+langbacklinks-param-limit": "How many total pages to return.", @@ -897,7 +932,7 @@ "apihelp-query+langbacklinks-example-simple": "Get pages linking to [[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "Get information about pages linking to [[:fr:Test]].", - "apihelp-query+langlinks-description": "Returns all interlanguage links from the given pages.", + "apihelp-query+langlinks-summary": "Returns all interlanguage links from the given pages.", "apihelp-query+langlinks-param-limit": "How many langlinks to return.", "apihelp-query+langlinks-param-url": "Whether to get the full URL (cannot be used with $1prop).", "apihelp-query+langlinks-param-prop": "Which additional properties to get for each interlanguage link:", @@ -910,7 +945,7 @@ "apihelp-query+langlinks-param-inlanguagecode": "Language code for localised language names.", "apihelp-query+langlinks-example-simple": "Get interlanguage links from the page Main Page.", - "apihelp-query+links-description": "Returns all links from the given pages.", + "apihelp-query+links-summary": "Returns all links from the given pages.", "apihelp-query+links-param-namespace": "Show links in these namespaces only.", "apihelp-query+links-param-limit": "How many links to return.", "apihelp-query+links-param-titles": "Only list links to these titles. Useful for checking whether a certain page links to a certain title.", @@ -919,7 +954,7 @@ "apihelp-query+links-example-generator": "Get information about the link pages in the page Main Page.", "apihelp-query+links-example-namespaces": "Get links from the page Main Page in the {{ns:user}} and {{ns:template}} namespaces.", - "apihelp-query+linkshere-description": "Find all pages that link to the given pages.", + "apihelp-query+linkshere-summary": "Find all pages that link to the given pages.", "apihelp-query+linkshere-param-prop": "Which properties to get:", "apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.", "apihelp-query+linkshere-paramvalue-prop-title": "Title of each page.", @@ -930,7 +965,7 @@ "apihelp-query+linkshere-example-simple": "Get a list of pages linking to the [[Main Page]].", "apihelp-query+linkshere-example-generator": "Get information about pages linking to the [[Main Page]].", - "apihelp-query+logevents-description": "Get events from logs.", + "apihelp-query+logevents-summary": "Get events from logs.", "apihelp-query+logevents-param-prop": "Which properties to get:", "apihelp-query+logevents-paramvalue-prop-ids": "Adds the ID of the log event.", "apihelp-query+logevents-paramvalue-prop-title": "Adds the title of the page for the log event.", @@ -954,15 +989,15 @@ "apihelp-query+logevents-param-limit": "How many total event entries to return.", "apihelp-query+logevents-example-simple": "List recent log events.", - "apihelp-query+pagepropnames-description": "List all page property names in use on the wiki.", + "apihelp-query+pagepropnames-summary": "List all page property names in use on the wiki.", "apihelp-query+pagepropnames-param-limit": "The maximum number of names to return.", "apihelp-query+pagepropnames-example-simple": "Get first 10 property names.", - "apihelp-query+pageprops-description": "Get various page properties defined in the page content.", + "apihelp-query+pageprops-summary": "Get various page properties defined in the page content.", "apihelp-query+pageprops-param-prop": "Only list these page properties ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] returns page property names in use). Useful for checking whether pages use a certain page property.", "apihelp-query+pageprops-example-simple": "Get properties for the pages Main Page and MediaWiki.", - "apihelp-query+pageswithprop-description": "List all pages using a given page property.", + "apihelp-query+pageswithprop-summary": "List all pages using a given page property.", "apihelp-query+pageswithprop-param-propname": "Page property for which to enumerate pages ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] returns page property names in use).", "apihelp-query+pageswithprop-param-prop": "Which pieces of information to include:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Adds the page ID.", @@ -973,7 +1008,8 @@ "apihelp-query+pageswithprop-example-simple": "List the first 10 pages using {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Get additional information about the first 10 pages using __NOTOC__.", - "apihelp-query+prefixsearch-description": "Perform a prefix search for page titles.\n\nDespite the similarity in names, this module is not intended to be equivalent to [[Special:PrefixIndex]]; for that, see [[Special:ApiHelp/query+allpages|action=query&list=allpages]] with the apprefix parameter. The purpose of this module is similar to [[Special:ApiHelp/opensearch|action=opensearch]]: to take user input and provide the best-matching titles. Depending on the search engine backend, this might include typo correction, redirect avoidance, or other heuristics.", + "apihelp-query+prefixsearch-summary": "Perform a prefix search for page titles.", + "apihelp-query+prefixsearch-extended-description": "Despite the similarity in names, this module is not intended to be equivalent to [[Special:PrefixIndex]]; for that, see [[Special:ApiHelp/query+allpages|action=query&list=allpages]] with the apprefix parameter. The purpose of this module is similar to [[Special:ApiHelp/opensearch|action=opensearch]]: to take user input and provide the best-matching titles. Depending on the search engine backend, this might include typo correction, redirect avoidance, or other heuristics.", "apihelp-query+prefixsearch-param-search": "Search string.", "apihelp-query+prefixsearch-param-namespace": "Namespaces to search.", "apihelp-query+prefixsearch-param-limit": "Maximum number of results to return.", @@ -981,7 +1017,7 @@ "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with meaning.", "apihelp-query+prefixsearch-param-profile": "Search profile to use.", - "apihelp-query+protectedtitles-description": "List all titles protected from creation.", + "apihelp-query+protectedtitles-summary": "List all titles protected from creation.", "apihelp-query+protectedtitles-param-namespace": "Only list titles in these namespaces.", "apihelp-query+protectedtitles-param-level": "Only list titles with these protection levels.", "apihelp-query+protectedtitles-param-limit": "How many total pages to return.", @@ -998,12 +1034,13 @@ "apihelp-query+protectedtitles-example-simple": "List protected titles.", "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace.", - "apihelp-query+querypage-description": "Get a list provided by a QueryPage-based special page.", + "apihelp-query+querypage-summary": "Get a list provided by a QueryPage-based special page.", "apihelp-query+querypage-param-page": "The name of the special page. Note, this is case sensitive.", "apihelp-query+querypage-param-limit": "Number of results to return.", "apihelp-query+querypage-example-ancientpages": "Return results from [[Special:Ancientpages]].", - "apihelp-query+random-description": "Get a set of random pages.\n\nPages are listed in a fixed sequence, only the starting point is random. This means that if, for example, Main Page is the first random page in the list, List of fictional monkeys will always be second, List of people on stamps of Vanuatu third, etc.", + "apihelp-query+random-summary": "Get a set of random pages.", + "apihelp-query+random-extended-description": "Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, Main Page is the first random page in the list, List of fictional monkeys will always be second, List of people on stamps of Vanuatu third, etc.", "apihelp-query+random-param-namespace": "Return pages in these namespaces only.", "apihelp-query+random-param-limit": "Limit how many random pages will be returned.", "apihelp-query+random-param-redirect": "Use $1filterredir=redirects instead.", @@ -1011,7 +1048,7 @@ "apihelp-query+random-example-simple": "Return two random pages from the main namespace.", "apihelp-query+random-example-generator": "Return page info about two random pages from the main namespace.", - "apihelp-query+recentchanges-description": "Enumerate recent changes.", + "apihelp-query+recentchanges-summary": "Enumerate recent changes.", "apihelp-query+recentchanges-param-start": "The timestamp to start enumerating from.", "apihelp-query+recentchanges-param-end": "The timestamp to end enumerating.", "apihelp-query+recentchanges-param-namespace": "Filter changes to only these namespaces.", @@ -1042,7 +1079,7 @@ "apihelp-query+recentchanges-example-simple": "List recent changes.", "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes.", - "apihelp-query+redirects-description": "Returns all redirects to the given pages.", + "apihelp-query+redirects-summary": "Returns all redirects to the given pages.", "apihelp-query+redirects-param-prop": "Which properties to get:", "apihelp-query+redirects-paramvalue-prop-pageid": "Page ID of each redirect.", "apihelp-query+redirects-paramvalue-prop-title": "Title of each redirect.", @@ -1053,10 +1090,11 @@ "apihelp-query+redirects-example-simple": "Get a list of redirects to the [[Main Page]].", "apihelp-query+redirects-example-generator": "Get information about all redirects to the [[Main Page]].", - "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.", + "apihelp-query+revisions-summary": "Get revision information.", + "apihelp-query+revisions-extended-description": "May be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.", "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).", - "apihelp-query+revisions-param-startid": "From which revision ID to start enumeration.", - "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revision ID.", + "apihelp-query+revisions-param-startid": "Start enumeration from this revision's timestamp. The revision must exist, but need not belong to this page.", + "apihelp-query+revisions-param-endid": "Stop enumeration at this revision's timestamp. The revision must exist, but need not belong to this page.", "apihelp-query+revisions-param-start": "From which revision timestamp to start enumeration.", "apihelp-query+revisions-param-end": "Enumerate up to this timestamp.", "apihelp-query+revisions-param-user": "Only include revisions made by user.", @@ -1083,18 +1121,18 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Parsed comment by the user for the revision.", "apihelp-query+revisions+base-paramvalue-prop-content": "Text of the revision.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Tags for the revision.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Deprecated. Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] or [[Special:ApiHelp/parse|action=parse]] instead. The XML parse tree of revision content (requires content model $1).", "apihelp-query+revisions+base-param-limit": "Limit how many revisions will be returned.", - "apihelp-query+revisions+base-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content; replaced by $1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.", + "apihelp-query+revisions+base-param-expandtemplates": "Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] instead. Expand templates in revision content (requires $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] or [[Special:ApiHelp/parse|action=parse]] instead. Generate XML parse tree for revision content (requires $1prop=content).", + "apihelp-query+revisions+base-param-parse": "Use [[Special:ApiHelp/parse|action=parse]] instead. Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.", "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.", - "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use prev, next and cur for the previous, next and current revision respectively.", - "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text.", - "apihelp-query+revisions+base-param-difftotextpst": "Perform a pre-save transform on the text before diffing it. Only valid when used with $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "Use [[Special:ApiHelp/compare|action=compare]] instead. Revision ID to diff each revision to. Use prev, next and cur for the previous, next and current revision respectively.", + "apihelp-query+revisions+base-param-difftotext": "Use [[Special:ApiHelp/compare|action=compare]] instead. Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text.", + "apihelp-query+revisions+base-param-difftotextpst": "Use [[Special:ApiHelp/compare|action=compare]] instead. Perform a pre-save transform on the text before diffing it. Only valid when used with $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Serialization format used for $1difftotext and expected for output of content.", - "apihelp-query+search-description": "Perform a full text search.", + "apihelp-query+search-summary": "Perform a full text search.", "apihelp-query+search-param-search": "Search for page titles or content matching this value. You can use the search string to invoke special search features, depending on what the wiki's search backend implements.", "apihelp-query+search-param-namespace": "Search only within these namespaces.", "apihelp-query+search-param-what": "Which type of search to perform.", @@ -1112,17 +1150,17 @@ "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-isfilematch": "Adds a boolean indicating if the search matched file content.", - "apihelp-query+search-paramvalue-prop-score": "Deprecated and ignored.", - "apihelp-query+search-paramvalue-prop-hasrelated": "Deprecated and ignored.", + "apihelp-query+search-paramvalue-prop-score": "Ignored.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignored.", "apihelp-query+search-param-limit": "How many total pages to return.", "apihelp-query+search-param-interwiki": "Include interwiki results in the search, if available.", "apihelp-query+search-param-backend": "Which search backend to use, if not the default.", - "apihelp-query+search-param-enablerewrites": "Enable internal query rewriting. Some search backends can rewrite the query into one its thinks gives better results, such as correcting spelling errors.", + "apihelp-query+search-param-enablerewrites": "Enable internal query rewriting. Some search backends can rewrite the query into another which is thought to provide better results, for instance by correcting spelling errors.", "apihelp-query+search-example-simple": "Search for meaning.", "apihelp-query+search-example-text": "Search texts for meaning.", "apihelp-query+search-example-generator": "Get page info about the pages returned for a search for meaning.", - "apihelp-query+siteinfo-description": "Return general information about the site.", + "apihelp-query+siteinfo-summary": "Return general information about the site.", "apihelp-query+siteinfo-param-prop": "Which information to get:", "apihelp-query+siteinfo-paramvalue-prop-general": "Overall system information.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "List of registered namespaces and their canonical names.", @@ -1139,11 +1177,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.", "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using $1inlanguagecode, otherwise in the content language).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "Returns a list of variable IDs.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "Returns a list of protocols that are allowed in external links.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Returns the default values for user preferences.", @@ -1156,13 +1194,13 @@ "apihelp-query+siteinfo-example-interwiki": "Fetch a list of local interwiki prefixes.", "apihelp-query+siteinfo-example-replag": "Check the current replication lag.", - "apihelp-query+stashimageinfo-description": "Returns file information for stashed files.", + "apihelp-query+stashimageinfo-summary": "Returns file information for stashed files.", "apihelp-query+stashimageinfo-param-filekey": "Key that identifies a previous upload that was stashed temporarily.", "apihelp-query+stashimageinfo-param-sessionkey": "Alias for $1filekey, for backward compatibility.", "apihelp-query+stashimageinfo-example-simple": "Returns information for a stashed file.", "apihelp-query+stashimageinfo-example-params": "Returns thumbnails for two stashed files.", - "apihelp-query+tags-description": "List change tags.", + "apihelp-query+tags-summary": "List change tags.", "apihelp-query+tags-param-limit": "The maximum number of tags to list.", "apihelp-query+tags-param-prop": "Which properties to get:", "apihelp-query+tags-paramvalue-prop-name": "Adds name of tag.", @@ -1174,8 +1212,8 @@ "apihelp-query+tags-paramvalue-prop-active": "Whether the tag is still being applied.", "apihelp-query+tags-example-simple": "List available tags.", - "apihelp-query+templates-description": "Returns all pages transcluded on the given pages.", - "apihelp-query+templates-param-namespace": "Show templates in this namespaces only.", + "apihelp-query+templates-summary": "Returns all pages transcluded on the given pages.", + "apihelp-query+templates-param-namespace": "Show templates in these namespaces only.", "apihelp-query+templates-param-limit": "How many templates to return.", "apihelp-query+templates-param-templates": "Only list these templates. Useful for checking whether a certain page uses a certain template.", "apihelp-query+templates-param-dir": "The direction in which to list.", @@ -1183,12 +1221,12 @@ "apihelp-query+templates-example-generator": "Get information about the template pages used on Main Page.", "apihelp-query+templates-example-namespaces": "Get pages in the {{ns:user}} and {{ns:template}} namespaces that are transcluded on the page Main Page.", - "apihelp-query+tokens-description": "Gets tokens for data-modifying actions.", + "apihelp-query+tokens-summary": "Gets tokens for data-modifying actions.", "apihelp-query+tokens-param-type": "Types of token to request.", "apihelp-query+tokens-example-simple": "Retrieve a csrf token (the default).", "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token.", - "apihelp-query+transcludedin-description": "Find all pages that transclude the given pages.", + "apihelp-query+transcludedin-summary": "Find all pages that transclude the given pages.", "apihelp-query+transcludedin-param-prop": "Which properties to get:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "Page ID of each page.", "apihelp-query+transcludedin-paramvalue-prop-title": "Title of each page.", @@ -1199,7 +1237,7 @@ "apihelp-query+transcludedin-example-simple": "Get a list of pages transcluding Main Page.", "apihelp-query+transcludedin-example-generator": "Get information about pages transcluding Main Page.", - "apihelp-query+usercontribs-description": "Get all edits by a user.", + "apihelp-query+usercontribs-summary": "Get all edits by a user.", "apihelp-query+usercontribs-param-limit": "The maximum number of contributions to return.", "apihelp-query+usercontribs-param-start": "The start timestamp to return from.", "apihelp-query+usercontribs-param-end": "The end timestamp to return to.", @@ -1218,13 +1256,13 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Adds flags of the edit.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Tags patrolled edits.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Lists tags for the edit.", - "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: $2show=!minor.\n\nIf $2show=patrolled or $2show=!patrolled is set, revisions older than [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|second|seconds}}) won't be shown.", + "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: $2show=!minor.\n\nIf $2show=patrolled or $2show=!patrolled is set, revisions older than [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|second|seconds}}) won't be shown.", "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.", "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.", "apihelp-query+usercontribs-example-user": "Show contributions of user Example.", "apihelp-query+usercontribs-example-ipprefix": "Show contributions from all IP addresses with prefix 192.0.2..", - "apihelp-query+userinfo-description": "Get information about the current user.", + "apihelp-query+userinfo-summary": "Get information about the current user.", "apihelp-query+userinfo-param-prop": "Which pieces of information to include:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Tags if the current user is blocked, by whom, and for what reason.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adds a tag messages if the current user has pending messages.", @@ -1234,7 +1272,7 @@ "apihelp-query+userinfo-paramvalue-prop-rights": "Lists all the rights the current user has.", "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-preferencestoken": "Deprecated. Get a token to change current user's preferences.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Get a token to change current user's preferences.", "apihelp-query+userinfo-paramvalue-prop-editcount": "Adds the current user's edit count.", "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.", "apihelp-query+userinfo-paramvalue-prop-realname": "Adds the user's real name.", @@ -1247,7 +1285,7 @@ "apihelp-query+userinfo-example-simple": "Get information about the current user.", "apihelp-query+userinfo-example-data": "Get additional information about the current user.", - "apihelp-query+users-description": "Get information about a list of users.", + "apihelp-query+users-summary": "Get information about a list of users.", "apihelp-query+users-param-prop": "Which pieces of information to include:", "apihelp-query+users-paramvalue-prop-blockinfo": "Tags if the user is blocked, by whom, and for what reason.", "apihelp-query+users-paramvalue-prop-groups": "Lists all the groups each user belongs to.", @@ -1266,7 +1304,7 @@ "apihelp-query+users-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.", "apihelp-query+users-example-simple": "Return information for user Example.", - "apihelp-query+watchlist-description": "Get recent changes to pages in the current user's watchlist.", + "apihelp-query+watchlist-summary": "Get recent changes to pages in the current user's watchlist.", "apihelp-query+watchlist-param-allrev": "Include multiple revisions of the same page within given timeframe.", "apihelp-query+watchlist-param-start": "The timestamp to start enumerating from.", "apihelp-query+watchlist-param-end": "The timestamp to end enumerating.", @@ -1303,7 +1341,7 @@ "apihelp-query+watchlist-example-generator-rev": "Fetch revision info for recent changes to pages on the current user's watchlist.", "apihelp-query+watchlist-example-wlowner": "List the top revision for recently changed pages on the watchlist of user Example.", - "apihelp-query+watchlistraw-description": "Get all pages on the current user's watchlist.", + "apihelp-query+watchlistraw-summary": "Get all pages on the current user's watchlist.", "apihelp-query+watchlistraw-param-namespace": "Only list pages in the given namespaces.", "apihelp-query+watchlistraw-param-limit": "How many total results to return per request.", "apihelp-query+watchlistraw-param-prop": "Which additional properties to get:", @@ -1317,17 +1355,17 @@ "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist.", "apihelp-query+watchlistraw-example-generator": "Fetch page info for pages on the current user's watchlist.", - "apihelp-removeauthenticationdata-description": "Remove authentication data for the current user.", + "apihelp-removeauthenticationdata-summary": "Remove authentication data for the current user.", "apihelp-removeauthenticationdata-example-simple": "Attempt to remove the current user's data for FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Send a password reset email to a user.", - "apihelp-resetpassword-description-noroutes": "No password reset routes are available.\n\nEnable routes in [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] to use this module.", + "apihelp-resetpassword-summary": "Send a password reset email to a user.", + "apihelp-resetpassword-extended-description-noroutes": "No password reset routes are available.\n\nEnable routes in [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] to use this module.", "apihelp-resetpassword-param-user": "User being reset.", "apihelp-resetpassword-param-email": "Email address of the user being reset.", "apihelp-resetpassword-example-user": "Send a password reset email to user Example.", "apihelp-resetpassword-example-email": "Send a password reset email for all users with email address user@example.com.", - "apihelp-revisiondelete-description": "Delete and undelete revisions.", + "apihelp-revisiondelete-summary": "Delete and undelete revisions.", "apihelp-revisiondelete-param-type": "Type of revision deletion being performed.", "apihelp-revisiondelete-param-target": "Page title for the revision deletion, if required for the type.", "apihelp-revisiondelete-param-ids": "Identifiers for the revisions to be deleted.", @@ -1339,7 +1377,8 @@ "apihelp-revisiondelete-example-revision": "Hide content for revision 12345 on the page Main Page.", "apihelp-revisiondelete-example-log": "Hide all data on log entry 67890 with the reason BLP violation.", - "apihelp-rollback-description": "Undo the last edit to the page.\n\nIf the last user who edited the page made multiple edits in a row, they will all be rolled back.", + "apihelp-rollback-summary": "Undo the last edit to the page.", + "apihelp-rollback-extended-description": "If the last user who edited the page made multiple edits in a row, they will all be rolled back.", "apihelp-rollback-param-title": "Title of the page to roll back. Cannot be used together with $1pageid.", "apihelp-rollback-param-pageid": "Page ID of the page to roll back. Cannot be used together with $1title.", "apihelp-rollback-param-tags": "Tags to apply to the rollback.", @@ -1350,10 +1389,11 @@ "apihelp-rollback-example-simple": "Roll back the last edits to page Main Page by user Example.", "apihelp-rollback-example-summary": "Roll back the last edits to page Main Page by IP user 192.0.2.5 with summary Reverting vandalism, and mark those edits and the revert as bot edits.", - "apihelp-rsd-description": "Export an RSD (Really Simple Discovery) schema.", + "apihelp-rsd-summary": "Export an RSD (Really Simple Discovery) schema.", "apihelp-rsd-example-simple": "Export the RSD schema.", - "apihelp-setnotificationtimestamp-description": "Update the notification timestamp for watched pages.\n\nThis affects the highlighting of changed pages in the watchlist and history, and the sending of email when the \"{{int:tog-enotifwatchlistpages}}\" preference is enabled.", + "apihelp-setnotificationtimestamp-summary": "Update the notification timestamp for watched pages.", + "apihelp-setnotificationtimestamp-extended-description": "This affects the highlighting of changed pages in the watchlist and history, and the sending of email when the \"{{int:tog-enotifwatchlistpages}}\" preference is enabled.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Work on all watched pages.", "apihelp-setnotificationtimestamp-param-timestamp": "Timestamp to which to set the notification timestamp.", "apihelp-setnotificationtimestamp-param-torevid": "Revision to set the notification timestamp to (one page only).", @@ -1363,8 +1403,8 @@ "apihelp-setnotificationtimestamp-example-pagetimestamp": "Set the notification timestamp for Main page so all edits since 1 January 2012 are unviewed.", "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the {{ns:user}} namespace.", - "apihelp-setpagelanguage-description": "Change the language of a page.", - "apihelp-setpagelanguage-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] to use this action.", + "apihelp-setpagelanguage-summary": "Change the language of a page.", + "apihelp-setpagelanguage-extended-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] to use this action.", "apihelp-setpagelanguage-param-title": "Title of the page whose language you wish to change. Cannot be used together with $1pageid.", "apihelp-setpagelanguage-param-pageid": "Page ID of the page whose language you wish to change. Cannot be used together with $1title.", "apihelp-setpagelanguage-param-lang": "Language code of the language to change the page to. Use default to reset the page to the wiki's default content language.", @@ -1373,7 +1413,8 @@ "apihelp-setpagelanguage-example-language": "Change the language of Main Page to Basque.", "apihelp-setpagelanguage-example-default": "Change the language of the page with ID 123 to the wiki's default content language.", - "apihelp-stashedit-description": "Prepare an edit in shared cache.\n\nThis is intended to be used via AJAX from the edit form to improve the performance of the page save.", + "apihelp-stashedit-summary": "Prepare an edit in shared cache.", + "apihelp-stashedit-extended-description": "This is intended to be used via AJAX from the edit form to improve the performance of the page save.", "apihelp-stashedit-param-title": "Title of the page being edited.", "apihelp-stashedit-param-section": "Section number. 0 for the top section, new for a new section.", "apihelp-stashedit-param-sectiontitle": "The title for a new section.", @@ -1384,7 +1425,7 @@ "apihelp-stashedit-param-baserevid": "Revision ID of the base revision.", "apihelp-stashedit-param-summary": "Change summary.", - "apihelp-tag-description": "Add or remove change tags from individual revisions or log entries.", + "apihelp-tag-summary": "Add or remove change tags from individual revisions or log entries.", "apihelp-tag-param-rcid": "One or more recent changes IDs from which to add or remove the tag.", "apihelp-tag-param-revid": "One or more revision IDs from which to add or remove the tag.", "apihelp-tag-param-logid": "One or more log entry IDs from which to add or remove the tag.", @@ -1395,12 +1436,13 @@ "apihelp-tag-example-rev": "Add the vandalism tag to revision ID 123 without specifying a reason", "apihelp-tag-example-log": "Remove the spam tag from log entry ID 123 with the reason Wrongly applied", - "apihelp-tokens-description": "Get tokens for data-modifying actions.\n\nThis module is deprecated in favor of [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-summary": "Get tokens for data-modifying actions.", + "apihelp-tokens-extended-description": "This module is deprecated in favor of [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-tokens-param-type": "Types of token to request.", "apihelp-tokens-example-edit": "Retrieve an edit token (the default).", "apihelp-tokens-example-emailmove": "Retrieve an email token and a move token.", - "apihelp-unblock-description": "Unblock a user.", + "apihelp-unblock-summary": "Unblock a user.", "apihelp-unblock-param-id": "ID of the block to unblock (obtained through list=blocks). Cannot be used together with $1user or $1userid.", "apihelp-unblock-param-user": "Username, IP address or IP address range to unblock. Cannot be used together with $1id or $1userid.", "apihelp-unblock-param-userid": "User ID to unblock. Cannot be used together with $1id or $1user.", @@ -1409,7 +1451,8 @@ "apihelp-unblock-example-id": "Unblock block ID #105.", "apihelp-unblock-example-user": "Unblock user Bob with reason Sorry Bob.", - "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "Restore revisions of a deleted page.", + "apihelp-undelete-extended-description": "A list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "Title of the page to restore.", "apihelp-undelete-param-reason": "Reason for restoring.", "apihelp-undelete-param-tags": "Change tags to apply to the entry in the deletion log.", @@ -1419,10 +1462,11 @@ "apihelp-undelete-example-page": "Undelete page Main Page.", "apihelp-undelete-example-revisions": "Undelete two revisions of page Main Page.", - "apihelp-unlinkaccount-description": "Remove a linked third-party account from the current user.", + "apihelp-unlinkaccount-summary": "Remove a linked third-party account from the current user.", "apihelp-unlinkaccount-example-simple": "Attempt to remove the current user's link for the provider associated with FooAuthenticationRequest.", - "apihelp-upload-description": "Upload a file, or get the status of pending uploads.\n\nSeveral methods are available:\n* Upload file contents directly, using the $1file parameter.\n* Upload the file in pieces, using the $1filesize, $1chunk, and $1offset parameters.\n* Have the MediaWiki server fetch a file from a URL, using the $1url parameter.\n* Complete an earlier upload that failed due to warnings, using the $1filekey parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending the $1file.", + "apihelp-upload-summary": "Upload a file, or get the status of pending uploads.", + "apihelp-upload-extended-description": "Several methods are available:\n* Upload file contents directly, using the $1file parameter.\n* Upload the file in pieces, using the $1filesize, $1chunk, and $1offset parameters.\n* Have the MediaWiki server fetch a file from a URL, using the $1url parameter.\n* Complete an earlier upload that failed due to warnings, using the $1filekey parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when sending the $1file.", "apihelp-upload-param-filename": "Target filename.", "apihelp-upload-param-comment": "Upload comment. Also used as the initial page text for new files if $1text is not specified.", "apihelp-upload-param-tags": "Change tags to apply to the upload log entry and file page revision.", @@ -1443,7 +1487,7 @@ "apihelp-upload-example-url": "Upload from a URL.", "apihelp-upload-example-filekey": "Complete an upload that failed due to warnings.", - "apihelp-userrights-description": "Change a user's group membership.", + "apihelp-userrights-summary": "Change a user's group membership.", "apihelp-userrights-param-user": "User name.", "apihelp-userrights-param-userid": "User ID.", "apihelp-userrights-param-add": "Add the user to these groups, or if they are already a member, update the expiry of their membership in that group.", @@ -1455,7 +1499,8 @@ "apihelp-userrights-example-userid": "Add the user with ID 123 to group bot, and remove from groups sysop and bureaucrat.", "apihelp-userrights-example-expiry": "Add user SometimeSysop to group sysop for 1 month.", - "apihelp-validatepassword-description": "Validate a password against the wiki's password policies.\n\nValidity is reported as Good if the password is acceptable, Change if the password may be used for login but must be changed, or Invalid if the password is not usable.", + "apihelp-validatepassword-summary": "Validate a password against the wiki's password policies.", + "apihelp-validatepassword-extended-description": "Validity is reported as Good if the password is acceptable, Change if the password may be used for login but must be changed, or Invalid if the password is not usable.", "apihelp-validatepassword-param-password": "Password to validate.", "apihelp-validatepassword-param-user": "User name, for use when testing account creation. The named user must not exist.", "apihelp-validatepassword-param-email": "Email address, for use when testing account creation.", @@ -1463,7 +1508,7 @@ "apihelp-validatepassword-example-1": "Validate the password foobar for the current user.", "apihelp-validatepassword-example-2": "Validate the password qwerty for creating user Example.", - "apihelp-watch-description": "Add or remove pages from the current user's watchlist.", + "apihelp-watch-summary": "Add or remove pages from the current user's watchlist.", "apihelp-watch-param-title": "The page to (un)watch. Use $1titles instead.", "apihelp-watch-param-unwatch": "If set the page will be unwatched rather than watched.", "apihelp-watch-example-watch": "Watch the page Main Page.", @@ -1472,27 +1517,33 @@ "apihelp-format-example-generic": "Return the query result in the $1 format.", "apihelp-format-param-wrappedhtml": "Return the pretty-printed HTML and associated ResourceLoader modules as a JSON object.", - "apihelp-json-description": "Output data in JSON format.", + "apihelp-json-summary": "Output data in JSON format.", "apihelp-json-param-callback": "If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.", "apihelp-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences. Default when formatversion is not 1.", "apihelp-json-param-ascii": "If specified, encodes all non-ASCII using hexadecimal escape sequences. Default when formatversion is 1.", "apihelp-json-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, * keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently 2), may change without warning.", - "apihelp-jsonfm-description": "Output data in JSON format (pretty-print in HTML).", - "apihelp-none-description": "Output nothing.", - "apihelp-php-description": "Output data in serialized PHP format.", + "apihelp-jsonfm-summary": "Output data in JSON format (pretty-print in HTML).", + "apihelp-none-summary": "Output nothing.", + "apihelp-php-summary": "Output data in serialized PHP format.", "apihelp-php-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, * keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently 2), may change without warning.", - "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).", - "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).", - "apihelp-xml-description": "Output data in XML format.", + "apihelp-phpfm-summary": "Output data in serialized PHP format (pretty-print in HTML).", + "apihelp-rawfm-summary": "Output data, including debugging elements, in JSON format (pretty-print in HTML).", + "apihelp-xml-summary": "Output data in XML format.", "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:MediaWiki}} namespace ending in .xsl.", "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.", - "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).", + "apihelp-xmlfm-summary": "Output data in XML format (pretty-print in HTML).", "api-format-title": "MediaWiki API result", - "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set format=$2.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.", - "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.", + "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set format=$2.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.", + "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:Special:MyLanguage/API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.", + "api-format-prettyprint-header-hyperlinked": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the format parameter to change the output format. To see the non-HTML representation of the $1 format, set [$3 format=$2].\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.", "api-format-prettyprint-status": "This response would be returned with HTTP status $1 $2.", + "api-login-fail-aborted": "Authentication requires user interaction, which is not supported by action=login. To be able to login with action=login, see [[Special:BotPasswords]]. To continue using main-account login, see [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "Authentication requires user interaction, which is not supported by action=login. To log in, see [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "Cannot log in when using $1.", + "api-login-fail-sameorigin": "Cannot log in when the same-origin policy is not applied.", + "api-pageset-param-titles": "A list of titles to work on.", "api-pageset-param-pageids": "A list of page IDs to work on.", "api-pageset-param-revids": "A list of revision IDs to work on.", @@ -1504,6 +1555,7 @@ "api-help-title": "MediaWiki API help", "api-help-lead": "This is an auto-generated MediaWiki API documentation page.\n\nDocumentation and examples: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Main module", + "api-help-undocumented-module": "No documentation for module $1.", "api-help-fallback-description": "$1", "api-help-fallback-parameter": "$1", "api-help-fallback-example": "$1", @@ -1546,8 +1598,8 @@ "api-help-param-default-empty": "Default: (empty)", "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "For compatibility, the token used in the web UI is also accepted.", - "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].", - "api-help-param-limited-in-miser-mode": "Note: Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned.", + "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].", + "api-help-param-limited-in-miser-mode": "Note: Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using this may result in fewer than $1limit results returned before continuing; in extreme cases, zero results may be returned.", "api-help-param-direction": "In which direction to enumerate:\n;newer:List oldest first. Note: $1start has to be before $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.", "api-help-param-continue": "When more results are available, use this to continue.", "api-help-param-no-description": "(no description)", @@ -1556,6 +1608,7 @@ "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2", "api-help-right-apihighlimits": "Use higher limits in API queries (slow queries: $1; fast queries: $2). The limits for slow queries also apply to multivalue parameters.", "api-help-open-in-apisandbox": "[open in sandbox]", + "api-help-no-extended-description": "", "api-help-authmanager-general-usage": "The general procedure to use this module is:\n# Fetch the fields available from [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] with amirequestsfor=$4, and a $5 token from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Present the fields to the user, and obtain their submission.\n# Post to this module, supplying $1returnurl and any relevant fields.\n# Check the status in the response.\n#* If you received PASS or FAIL, you're done. The operation either succeeded or it didn't.\n#* If you received UI, present the new fields to the user and obtain their submission. Then post to this module with $1continue and the relevant fields set, and repeat step 4.\n#* If you received REDIRECT, direct the user to the redirecttarget and wait for the return to $1returnurl. Then post to this module with $1continue and any fields passed to the return URL, and repeat step 4.\n#* If you received RESTART, that means the authentication worked but we don't have a linked user account. You might treat this as UI or as FAIL.", "api-help-authmanagerhelper-requests": "Only use these authentication requests, by the id returned from [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] with amirequestsfor=$1 or from a previous response from this module.", @@ -1614,7 +1667,8 @@ "apierror-changeauth-norequest": "Failed to create change request.", "apierror-chunk-too-small": "Minimum chunk size is $1 {{PLURAL:$1|byte|bytes}} for non-final chunks.", "apierror-cidrtoobroad": "$1 CIDR ranges broader than /$2 are not accepted.", - "apierror-compare-inputneeded": "A title, a page ID, or a revision number is needed for both the from and the to parameters.", + "apierror-compare-no-title": "Cannot pre-save transform without a title. Try specifying fromtitle or totitle.", + "apierror-compare-relative-to-nothing": "No 'from' revision for torelative to be relative to.", "apierror-contentserializationexception": "Content serialization failed: $1", "apierror-contenttoobig": "The content you supplied exceeds the article size limit of $1 {{PLURAL:$1|kilobyte|kilobytes}}.", "apierror-copyuploadbaddomain": "Uploads by URL are not allowed from this domain.", @@ -1658,10 +1712,12 @@ "apierror-maxlag": "Waiting for $2: $1 {{PLURAL:$1|second|seconds}} lagged.", "apierror-mimesearchdisabled": "MIME search is disabled in Miser Mode.", "apierror-missingcontent-pageid": "Missing content for page ID $1.", + "apierror-missingcontent-revid": "Missing content for revision ID $1.", "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|The parameter|At least one of the parameters}} $1 is required.", "apierror-missingparam-one-of": "{{PLURAL:$2|The parameter|One of the parameters}} $1 is required.", "apierror-missingparam": "The $1 parameter must be set.", "apierror-missingrev-pageid": "No current revision of page ID $1.", + "apierror-missingrev-title": "No current revision of title $1.", "apierror-missingtitle-createonly": "Missing titles can only be protected with create.", "apierror-missingtitle": "The page you specified doesn't exist.", "apierror-missingtitle-byname": "The page $1 doesn't exist.", @@ -1695,6 +1751,7 @@ "apierror-notarget": "You have not specified a valid target for this action.", "apierror-notpatrollable": "The revision r$1 can't be patrolled as it's too old.", "apierror-nouploadmodule": "No upload module set.", + "apierror-offline": "Could not proceed due to network connectivity issues. Make sure you have a working internet connection and try again.", "apierror-opensearch-json-warnings": "Warnings cannot be represented in OpenSearch JSON format.", "apierror-pagecannotexist": "Namespace doesn't allow actual pages.", "apierror-pagedeleted": "The page has been deleted since you fetched its timestamp.", @@ -1719,6 +1776,7 @@ "apierror-revdel-mutuallyexclusive": "The same field cannot be used in both hide and show.", "apierror-revdel-needtarget": "A target title is required for this RevDel type.", "apierror-revdel-paramneeded": "At least one value is required for hide and/or show.", + "apierror-revisions-badid": "No revision was found for parameter $1.", "apierror-revisions-norevids": "The revids parameter may not be used with the list options ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, and $1end).", "apierror-revisions-singlepage": "titles, pageids or a generator was used to supply multiple pages, but the $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, and $1end parameters may only be used on a single page.", "apierror-revwrongpage": "r$1 is not a revision of $2.", @@ -1744,6 +1802,7 @@ "apierror-stashzerolength": "File is of zero length, and could not be stored in the stash: $1.", "apierror-systemblocked": "You have been blocked automatically by MediaWiki.", "apierror-templateexpansion-notwikitext": "Template expansion is only supported for wikitext content. $1 uses content model $2.", + "apierror-timeout": "The server did not respond within the expected time.", "apierror-toofewexpiries": "$1 expiry {{PLURAL:$1|timestamp was|timestamps were}} provided where $2 {{PLURAL:$2|was|were}} needed.", "apierror-unknownaction": "The action specified, $1, is not recognized.", "apierror-unknownerror-editpage": "Unknown EditPage error: $1.", @@ -1764,6 +1823,7 @@ "apiwarn-badurlparam": "Could not parse $1urlparam for $2. Using only width and height.", "apiwarn-badutf8": "The value passed for $1 contains invalid or non-normalized data. Textual data should be valid, NFC-normalized Unicode without C0 control characters other than HT (\\t), LF (\\n), and CR (\\r).", "apiwarn-checktoken-percentencoding": "Check that symbols such as \"+\" in the token are properly percent-encoded in the URL.", + "apiwarn-compare-nocontentmodel": "No content model could be determined, assuming $1.", "apiwarn-deprecation-deletedrevs": "list=deletedrevs has been deprecated. Please use prop=deletedrevisions or list=alldeletedrevisions instead.", "apiwarn-deprecation-expandtemplates-prop": "Because no values have been specified for the prop parameter, a legacy format has been used for the output. This format is deprecated, and in the future, a default value will be set for the prop parameter, causing the new format to always be used.", "apiwarn-deprecation-httpsexpected": "HTTP used when HTTPS was expected.", diff --git a/includes/api/i18n/eo.json b/includes/api/i18n/eo.json index e358bcb352..e1c316120d 100644 --- a/includes/api/i18n/eo.json +++ b/includes/api/i18n/eo.json @@ -6,11 +6,11 @@ ] }, "apihelp-main-param-format": "La formo de la eligaĵo.", - "apihelp-block-description": "Bloki uzanton.", + "apihelp-block-summary": "Bloki uzanton.", "apihelp-block-param-user": "Salutnomo, IP-adreso aŭ IP-adresa intervalo forbarota.", "apihelp-block-param-expiry": "Eksvalidiĝa tempo. Ĝi povas esti relativa (ekz. 5 months aŭ 2 weeks aŭ absoluta (ekz. 2014-09-18T12:34:56Z). Se vi indikas infinite (senfine), indefinite (nedifinite) aŭ never (neniam), la forbaro neniam eksvalidiĝos.", "apihelp-createaccount-param-name": "Uzantnomo.", - "apihelp-delete-description": "Forigi paĝon.", + "apihelp-delete-summary": "Forigi paĝon.", "apihelp-edit-param-minor": "Redakteto.", "apihelp-edit-example-edit": "Redakti paĝon.", "apihelp-feedrecentchanges-param-hideminor": "Kaŝi redaktetojn.", @@ -21,7 +21,7 @@ "apihelp-feedrecentchanges-param-hidemyself": "Kaŝi ŝanĝojn faritajn de la nuna uzanto.", "apihelp-feedrecentchanges-param-hidecategorization": "Kaŝi ŝanĝojn de kategoria aneco.", "apihelp-feedrecentchanges-example-simple": "Montri ĵusajn ŝanĝojn.", - "apihelp-filerevert-description": "Restarigi malnovan version de dosiero.", + "apihelp-filerevert-summary": "Restarigi malnovan version de dosiero.", "apihelp-filerevert-param-comment": "Alŝuta komento.", "apihelp-login-param-name": "Uzantnomo.", "apihelp-login-param-password": "Pasvorto.", diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json index a2fbb48f1b..6272f4e381 100644 --- a/includes/api/i18n/es.json +++ b/includes/api/i18n/es.json @@ -27,15 +27,17 @@ "Hamilton Abreu", "Pompilos", "Igv", - "Fortega" + "Fortega", + "Luzcaru", + "Javiersanp" ] }, - "apihelp-main-description": "
    \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
    \nEstado: 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\nSolicitudes erróneas: 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\nPruebas: para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n
    \nStatus: Todas las funciones mostradas en esta página deberían estar funcionando, pero la API aún está en desarrollo activo, y puede cambiar en cualquier momento. Suscribase a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] para aviso de actualizaciones.\n\nErroneous requests: Cuando se envían solicitudes erróneas a la API, se enviará un encabezado HTTP con la clave \"MediaWiki-API-Error\" y, luego, el valor del encabezado y el código de error devuelto se establecerán en el mismo valor. Para más información ver [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\nTesting: Para facilitar la comprobación de las solicitudes de API, consulte [[Special:ApiSandbox]].", "apihelp-main-param-action": "Qué acción se realizará.", "apihelp-main-param-format": "El formato de la salida.", - "apihelp-main-param-maxlag": "El retraso (lag) máximo puede ser utilizado cuando MediaWiki está instalado en un conjunto de bases de datos replicadas. Para evitar cualquier acción que pudiera causar un retraso aún mayor en la replicación del sitio, este parámetro puede causar que el cliente espere hasta que el retraso de replicación sea menor que el valor especificado. En caso de exceso de retraso, se devuelve un código de error maxlag con un mensaje similar a Esperando a $host: $lag segundos de retraso.
    Véase [[mw:Manual:Maxlag_parameter|Manual:Parámetro maxlag]] para más información.", - "apihelp-main-param-smaxage": "Establece el encabezado HTTP s-maxage de control de caché a esta cantidad de segundos. Los errores nunca se almacenan en caché.", - "apihelp-main-param-maxage": "Establece el encabezado HTTP max-age de control de caché a esta cantidad de segundos. Los errores nunca se almacenan en caché.", + "apihelp-main-param-maxlag": "El retraso máximo puede utilizarse cuando MediaWiki se instala en un clúster replicado de base de datos. Para guardar las acciones que causan más retardo de replicación de sitio, este parámetro puede hacer que el cliente espere hasta que el retardo de replicación sea menor que el valor especificado. En caso de retraso excesivo, se devuelve el código de error maxlag con un mensaje como Esperando a $host: $lag segundos de retraso.
    Consulta [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: parámetro Maxlag]] para más información.", + "apihelp-main-param-smaxage": "Establece la cabecera HTTP s-maxage de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.", + "apihelp-main-param-maxage": "Establece la cabecera HTTP max-age de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.", "apihelp-main-param-assert": "Comprobar que el usuario haya iniciado sesión si el valor es user o si tiene el permiso de bot si es bot.", "apihelp-main-param-assertuser": "Verificar el usuario actual es el usuario nombrado.", "apihelp-main-param-requestid": "Cualquier valor dado aquí se incluirá en la respuesta. Se puede utilizar para distinguir solicitudes.", @@ -47,7 +49,7 @@ "apihelp-main-param-errorformat": "Formato utilizado para la salida de texto de avisos y errores.\n; plaintext: Wikitexto en el que se han eliminado las etiquetas HTML y reemplazado las entidades.\n; wikitext: Wikitexto sin analizar.\n; html: HTML.\n; raw: Clave del mensaje y parámetros.\n; none: Ninguna salida de texto, solo códigos de error.\n; bc: Formato empleado en versiones de MediaWiki anteriores a la 1.29. No se tienen en cuenta errorlang y errorsuselocal.", "apihelp-main-param-errorlang": "Idioma empleado para advertencias y errores. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages devuelve una lista de códigos de idioma. Puedes especificar content para utilizar el idioma del contenido de este wiki o uselang para utilizar el valor del parámetro uselang.", "apihelp-main-param-errorsuselocal": "Si se da, los textos de error emplearán mensajes localmente personalizados del espacio de nombres {{ns:MediaWiki}}.", - "apihelp-block-description": "Bloquear a un usuario.", + "apihelp-block-summary": "Bloquear a un usuario.", "apihelp-block-param-user": "Nombre de usuario, dirección IP o intervalo de IP que quieres bloquear. No se puede utilizar junto con $1userid", "apihelp-block-param-userid": "ID de usuario para bloquear. No se puede utilizar junto con $1user.", "apihelp-block-param-expiry": "Fecha de expiración. Puede ser relativa (por ejemplo, 5 months o 2 weeks) o absoluta (por ejemplo, 2014-09-18T12:34:56Z). Si se establece en infinite, indefinite, o never, el bloqueo será permanente.", @@ -57,25 +59,26 @@ "apihelp-block-param-autoblock": "Bloquear automáticamente la última dirección IP y todas las direcciones IP que traten de iniciar sesión posteriormente.", "apihelp-block-param-noemail": "Evitar que el usuario envíe correos a través de la wiki (es necesario el derecho blockemail).", "apihelp-block-param-hidename": "Ocultar el nombre de usuario del registro de bloqueo (es necesario el derecho hideuser
    ).", - "apihelp-block-param-allowusertalk": "Permitir que el usuario edite su propia página de discusión (depende de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Permitir que el usuario edite su propia página de discusión (depende de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Si la cuenta ya está bloqueada, sobrescribir el bloqueo existente.", "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.", "apihelp-block-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de bloqueos.", "apihelp-block-example-ip-simple": "Bloquear la dirección IP 192.0.2.5 durante 3 días por el motivo First strike.", "apihelp-block-example-user-complex": "Bloquear al usuario Vandal indefinidamente con el motivo Vandalism y evitar que se cree nuevas cuentas o envíe correos.", - "apihelp-changeauthenticationdata-description": "Cambiar los datos de autentificación para el usuario actual.", + "apihelp-changeauthenticationdata-summary": "Cambiar los datos de autentificación para el usuario actual.", "apihelp-changeauthenticationdata-example-password": "Intento para cambiar la contraseña del usuario actual a ExamplePassword.", - "apihelp-checktoken-description": "Comprueba la validez de una ficha desde [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Comprueba la validez de una ficha desde [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo de ficha a probar.", "apihelp-checktoken-param-token": "Ficha a probar.", "apihelp-checktoken-param-maxtokenage": "Duración máxima de la ficha, en segundos.", "apihelp-checktoken-example-simple": "Probar la validez de una ficha csrf.", - "apihelp-clearhasmsg-description": "Limpia la marca hasmsg del usuario actual.", + "apihelp-clearhasmsg-summary": "Limpia la marca hasmsg del usuario actual.", "apihelp-clearhasmsg-example-1": "Limpiar la marca hasmsg del usuario actual.", - "apihelp-clientlogin-description": "Entrar en wiki usando el flujo interactivo.", + "apihelp-clientlogin-summary": "Entrar en wiki usando el flujo interactivo.", "apihelp-clientlogin-example-login": "Comenzar el proceso para iniciar sesión en el wiki como usuario Example con la contraseña ExamplePassword.", "apihelp-clientlogin-example-login2": "Continuar el inicio de sesión después de una respuesta de la UI a la autenticación de dos pasos, en la que devuelve un OATHToken de 987654.", - "apihelp-compare-description": "Obtener la diferencia entre 2 páginas.\n\nSe debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".", + "apihelp-compare-summary": "Obtener la diferencia entre 2 páginas.", + "apihelp-compare-extended-description": "Se debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".", "apihelp-compare-param-fromtitle": "Primer título para comparar", "apihelp-compare-param-fromid": "ID de la primera página a comparar.", "apihelp-compare-param-fromrev": "Primera revisión para comparar.", @@ -83,7 +86,7 @@ "apihelp-compare-param-toid": "Segunda identificador de página para comparar.", "apihelp-compare-param-torev": "Segunda revisión para comparar.", "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.", - "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.", + "apihelp-createaccount-summary": "Crear una nueva cuenta de usuario.", "apihelp-createaccount-param-preservestate": "Si [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] devolvió true (verdadero) para hasprimarypreservedstate, deberían omitirse las peticiones marcadas como primary-required. Si devolvió un valor no vacío para preservedusername, se debe usar ese nombre de usuario en el parámetro username.", "apihelp-createaccount-example-create": "Empezar el proceso de creación del usuario Example con la contraseña ExamplePassword.", "apihelp-createaccount-param-name": "Nombre de usuario.", @@ -97,22 +100,22 @@ "apihelp-createaccount-param-language": "Código de idioma a establecer como predeterminado para el usuario (opcional, predeterminado al contenido del idioma).", "apihelp-createaccount-example-pass": "Crear usuario testuser con la contraseña test123.", "apihelp-createaccount-example-mail": "Crear usuario testmailuser y enviar una contraseña generada aleatoriamente.", - "apihelp-cspreport-description": "Utilizado por los navegadores para reportar violaciones de la política de seguridad de contenidos. Este módulo no debe usarse nunca, excepto cuando se usa automáticamente por un navegador web CSP compatible.", - "apihelp-cspreport-param-reportonly": "Marcar un informe de una política de vigilancia y no a una política forzada", + "apihelp-cspreport-summary": "Utilizado por los navegadores para informar de violaciones a la normativa de seguridad de contenidos. Este módulo no debe usarse nunca, excepto cuando se usa automáticamente por un navegador web compatible con CSP.", + "apihelp-cspreport-param-reportonly": "Marcar como informe proveniente de una normativa de vigilancia, no una impuesta", "apihelp-cspreport-param-source": "Qué generó la cabecera CSP que provocó este informe", - "apihelp-delete-description": "Borrar una página.", + "apihelp-delete-summary": "Borrar una página.", "apihelp-delete-param-title": "Título de la página a eliminar. No se puede utilizar junto a $1pageid.", "apihelp-delete-param-pageid": "ID de la página a eliminar. No se puede utilizar junto a $1title.", "apihelp-delete-param-reason": "Motivo de la eliminación. Si no se especifica, se generará uno automáticamente.", "apihelp-delete-param-tags": "Cambio de etiquetas para aplicar a la entrada en la eliminación del registro.", "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.", - "apihelp-delete-param-watchlist": "Incondicionalmente agregar o remover la página de la lista de seguimiento del usuario actual, usar las preferencias o no cambiar el seguimiento.", + "apihelp-delete-param-watchlist": "Añadir o quitar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar el estado de seguimiento.", "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.", "apihelp-delete-param-oldimage": "El nombre de la imagen antigua es proporcionado conforme a lo dispuesto por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Borrar Main Page.", "apihelp-delete-example-reason": "Eliminar Main Page con el motivo Preparing for move.", - "apihelp-disabled-description": "Se desactivó este módulo.", - "apihelp-edit-description": "Crear y editar páginas.", + "apihelp-disabled-summary": "Se desactivó este módulo.", + "apihelp-edit-summary": "Crear y editar páginas.", "apihelp-edit-param-title": "Título de la página a editar. No se puede utilizar junto a $1pageid.", "apihelp-edit-param-pageid": "ID de la página a editar. No se puede utilizar junto a $1title.", "apihelp-edit-param-section": "Número de la sección. 0 para una sección superior, new para una sección nueva.", @@ -143,13 +146,13 @@ "apihelp-edit-example-edit": "Editar una página", "apihelp-edit-example-prepend": "Anteponer __NOTOC__ a una página.", "apihelp-edit-example-undo": "Deshacer intervalo de revisiones 13579-13585 con resumen automático", - "apihelp-emailuser-description": "Enviar un mensaje de correo electrónico a un usuario.", + "apihelp-emailuser-summary": "Enviar un mensaje de correo electrónico a un usuario.", "apihelp-emailuser-param-target": "Cuenta de usuario destinatario.", - "apihelp-emailuser-param-subject": "Encabezamiento de asunto.", + "apihelp-emailuser-param-subject": "Cabecera de asunto.", "apihelp-emailuser-param-text": "Cuerpo del mensaje.", "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.", "apihelp-emailuser-example-email": "Enviar un correo al usuario WikiSysop con el texto Content.", - "apihelp-expandtemplates-description": "Expande todas las plantillas en wikitexto.", + "apihelp-expandtemplates-summary": "Expande todas las plantillas en wikitexto.", "apihelp-expandtemplates-param-title": "Título de la página.", "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.", "apihelp-expandtemplates-param-revid": "Revisión de ID, para {{REVISIONID}} y variables similares.", @@ -166,7 +169,7 @@ "apihelp-expandtemplates-param-includecomments": "Incluir o no los comentarios HTML en la salida.", "apihelp-expandtemplates-param-generatexml": "Generar un árbol de análisis XML (remplazado por $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Expandir el wikitexto {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Devuelve el canal de contribuciones de un usuario.", + "apihelp-feedcontributions-summary": "Devuelve el canal de contribuciones de un usuario.", "apihelp-feedcontributions-param-feedformat": "El formato del canal.", "apihelp-feedcontributions-param-user": "De qué usuarios recibir contribuciones.", "apihelp-feedcontributions-param-namespace": "Espacio de nombre para filtrar las contribuciones.", @@ -179,7 +182,7 @@ "apihelp-feedcontributions-param-hideminor": "Ocultar ediciones menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar la diferencia de tamaño entre revisiones.", "apihelp-feedcontributions-example-simple": "Devolver las contribuciones del usuario Example.", - "apihelp-feedrecentchanges-description": "Devuelve un canal de cambios recientes.", + "apihelp-feedrecentchanges-summary": "Devuelve un canal de cambios recientes.", "apihelp-feedrecentchanges-param-feedformat": "El formato del canal.", "apihelp-feedrecentchanges-param-namespace": "Espacio de nombres al cual limitar los resultados.", "apihelp-feedrecentchanges-param-invert": "Todos los espacios de nombres menos el que está seleccionado.", @@ -201,35 +204,36 @@ "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.", "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.", "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.", - "apihelp-feedwatchlist-description": "Devuelve el canal de una lista de seguimiento.", + "apihelp-feedwatchlist-summary": "Devuelve el canal de una lista de seguimiento.", "apihelp-feedwatchlist-param-feedformat": "El formato del canal.", "apihelp-feedwatchlist-param-hours": "Listar las páginas modificadas desde estas horas hasta ahora.", "apihelp-feedwatchlist-param-linktosections": "Enlazar directamente a las secciones cambiadas de ser posible.", "apihelp-feedwatchlist-example-default": "Mostrar el canal de la lista de seguimiento.", "apihelp-feedwatchlist-example-all6hrs": "Mostrar todos los cambios en páginas vigiladas en las últimas 6 horas.", - "apihelp-filerevert-description": "Revertir el archivo a una versión anterior.", + "apihelp-filerevert-summary": "Revertir el archivo a una versión anterior.", "apihelp-filerevert-param-filename": "Nombre de archivo final, sin el prefijo Archivo:", "apihelp-filerevert-param-comment": "Comentario de carga.", "apihelp-filerevert-param-archivename": "Nombre del archivo de la revisión para deshacerla.", "apihelp-filerevert-example-revert": "Devolver Wiki.png a la versión del 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Mostrar la ayuda para los módulos especificados.", + "apihelp-help-summary": "Mostrar la ayuda para los módulos especificados.", "apihelp-help-param-modules": "Módulos para los que mostrar ayuda (valores de los parámetros action y format o main). Se pueden especificar submódulos con un +.", "apihelp-help-param-submodules": "Incluir ayuda para submódulos del módulo con nombre.", "apihelp-help-param-recursivesubmodules": "Incluir ayuda para submódulos recursivamente.", "apihelp-help-param-helpformat": "Formato de salida de la ayuda.", "apihelp-help-param-wrap": "Envolver el producto en una estructura de respuesta de la API estándar.", - "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.", + "apihelp-help-param-toc": "Incluir un sumario en la salida HTML.", "apihelp-help-example-main": "Ayuda del módulo principal", "apihelp-help-example-submodules": "Ayuda para action=query y todos sus submódulos.", "apihelp-help-example-recursive": "Toda la ayuda en una página", "apihelp-help-example-help": "Ayuda del módulo de ayuda en sí", "apihelp-help-example-query": "Ayuda para dos submódulos de consulta.", - "apihelp-imagerotate-description": "Girar una o más imágenes.", + "apihelp-imagerotate-summary": "Girar una o más imágenes.", "apihelp-imagerotate-param-rotation": "Grados que rotar una imagen en sentido horario.", "apihelp-imagerotate-param-tags": "Etiquetas que añadir a la entrada en el registro de subidas.", "apihelp-imagerotate-example-simple": "Rotar File:Example.png 90 grados.", "apihelp-imagerotate-example-generator": "Rotar todas las imágenes en Category:Flip 180 grados.", - "apihelp-import-description": "Importar una página desde otra wiki, o desde un archivo XML.\n\nTenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro xml.", + "apihelp-import-summary": "Importar una página desde otra wiki, o desde un archivo XML.", + "apihelp-import-extended-description": "Tenga en cuenta que el HTTP POST debe hacerse como una carga de archivos (es decir, el uso de multipart/form-data) al enviar un archivo para el parámetro xml.", "apihelp-import-param-summary": "Resumen de importación de entrada del registro.", "apihelp-import-param-xml": "Se cargó el archivo XML.", "apihelp-import-param-interwikisource": "Para importaciones interwiki: wiki desde la que importar.", @@ -240,19 +244,20 @@ "apihelp-import-param-rootpage": "Importar como subpágina de esta página. No puede usarse simultáneamente con $1namespace.", "apihelp-import-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de importaciones y a la revisión nula de las páginas importadas.", "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] al espacio de nombres 100 con todo el historial.", - "apihelp-linkaccount-description": "Vincular una cuenta de un proveedor de terceros para el usuario actual.", + "apihelp-linkaccount-summary": "Vincular una cuenta de un proveedor de terceros para el usuario actual.", "apihelp-linkaccount-example-link": "Iniciar el proceso de vincular a una cuenta de Ejemplo.", - "apihelp-login-description": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción solo se debe utilizar en combinación con [[Special:BotPasswords]]; para la cuenta de inicio de sesión no se utiliza y puede fallar sin previo aviso. Para iniciar la sesión de forma segura a la cuenta principal, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Iniciar sesión y obtener las cookies de autenticación.\n\nEsta acción esta obsoleta y puede fallar sin previo aviso. Para conectarse de forma segura, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Iniciar sesión y obtener las cookies de autenticación.", + "apihelp-login-extended-description": "Esta acción solo se debe utilizar en combinación con [[Special:BotPasswords]]; para la cuenta de inicio de sesión no se utiliza y puede fallar sin previo aviso. Para iniciar la sesión de forma segura a la cuenta principal, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Esta acción esta obsoleta y puede fallar sin previo aviso. Para conectarse de forma segura, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nombre de usuario.", "apihelp-login-param-password": "Contraseña.", "apihelp-login-param-domain": "Dominio (opcional).", "apihelp-login-param-token": "La clave de inicio de sesión se obtiene en la primera solicitud.", "apihelp-login-example-gettoken": "Recuperar clave de inicio de sesión.", "apihelp-login-example-login": "Acceder.", - "apihelp-logout-description": "Salir y vaciar los datos de la sesión.", + "apihelp-logout-summary": "Salir y vaciar los datos de la sesión.", "apihelp-logout-example-logout": "Cerrar la sesión del usuario actual.", - "apihelp-managetags-description": "Realizar tareas de administración relacionadas con el cambio de etiquetas.", + "apihelp-managetags-summary": "Realizar tareas de administración relacionadas con el cambio de etiquetas.", "apihelp-managetags-param-operation": "Qué operación realizar:\n;create: Crear una nueva etiqueta de cambio de uso manual.\n;delete: Eliminar una etiqueta de cambio de la base de datos, eliminando la etiqueta de todas las revisiones, cambios en entradas recientes y registros en los que se ha utilizado.\n;activate: Activar una etiqueta de cambio, permitiendo a los usuarios aplicarla manualmente.\n;deactivate: Desactivar una etiqueta de cambio, evitando que los usuarios la apliquen manualmente.", "apihelp-managetags-param-tag": "Etiqueta para crear, eliminar, activar o desactivar. Para crear una etiqueta, esta debe no existir. Para eliminarla, debe existir. Para activarla, debe existir y no estar en uso por ninguna extensión. Para desactivarla, debe estar activada y definida manualmente.", "apihelp-managetags-param-reason": "Un motivo opcional para crear, eliminar, activar o desactivar la etiqueta.", @@ -262,7 +267,7 @@ "apihelp-managetags-example-delete": "Eliminar la etiqueta vandlaism con el motivo Misspelt", "apihelp-managetags-example-activate": "Activar una etiqueta llamada spam con el motivo For use in edit patrolling", "apihelp-managetags-example-deactivate": "Desactivar una etiqueta llamada spam con el motivo No longer required", - "apihelp-mergehistory-description": "Fusionar historiales de páginas.", + "apihelp-mergehistory-summary": "Fusionar historiales de páginas.", "apihelp-mergehistory-param-from": "El título de la página desde la que se combinará la historia. No se puede utilizar junto con $1fromid.", "apihelp-mergehistory-param-fromid": "Page ID de la página desde la que se combinara el historial. No se puede utilizar junto con $1from.", "apihelp-mergehistory-param-to": "El título de la página desde la que se combinara el historial. No se puede utilizar junto con $1toid.", @@ -271,7 +276,7 @@ "apihelp-mergehistory-param-reason": "Motivo para la fusión del historial.", "apihelp-mergehistory-example-merge": "Combinar todo el historial de Oldpage en Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Combinar las revisiones de Oldpage hasta el 2015-12-31T04:37:41Z en Newpage.", - "apihelp-move-description": "Trasladar una página.", + "apihelp-move-summary": "Trasladar una página.", "apihelp-move-param-from": "Título de la página a renombrar. No se puede utilizar con $1fromid.", "apihelp-move-param-fromid": "ID de la página a renombrar. No se puede utilizar con $1from.", "apihelp-move-param-to": "Título para cambiar el nombre de la página.", @@ -285,16 +290,17 @@ "apihelp-move-param-ignorewarnings": "Ignorar cualquier aviso.", "apihelp-move-param-tags": "Cambiar las etiquetas que aplicar a la entrada en el registro de traslados y en la revisión nula de la página de destino.", "apihelp-move-example-move": "Trasladar Badtitle a Goodtitle sin dejar una redirección.", - "apihelp-opensearch-description": "Buscar en el wiki mediante el protocolo OpenSearch.", + "apihelp-opensearch-summary": "Buscar en el wiki mediante el protocolo OpenSearch.", "apihelp-opensearch-param-search": "Buscar cadena.", "apihelp-opensearch-param-limit": "Número máximo de resultados que devolver.", "apihelp-opensearch-param-namespace": "Espacio de nombres que buscar.", - "apihelp-opensearch-param-suggest": "No hacer nada si [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] es falso.", + "apihelp-opensearch-param-suggest": "No hacer nada si [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] es falso.", "apihelp-opensearch-param-redirects": "Cómo manejar las redirecciones:\n;return: Volver a la propia redirección.\n;resolve: Volver a la página de destino. Puede devolver menos de $1limit resultados.\nPor motivos históricos, se utiliza \"return\" para $1format=json y \"resolve\" para otros formatos.", "apihelp-opensearch-param-format": "El formato de salida.", "apihelp-opensearch-param-warningsaserror": "Si las advertencias están planteadas con format=json, devolver un error de API en lugar de hacer caso omiso de ellas.", "apihelp-opensearch-example-te": "Buscar páginas que empiecen por Te.", - "apihelp-options-description": "Cambiar preferencias del usuario actual.\n\nSolo se pueden establecer opciones que estén registradas en el núcleo o en una de las extensiones instaladas u opciones con claves predefinidas con userjs- (diseñadas para utilizarse con scripts de usuario).", + "apihelp-options-summary": "Cambiar preferencias del usuario actual.", + "apihelp-options-extended-description": "Solo se pueden establecer opciones que estén registradas en el núcleo o en una de las extensiones instaladas u opciones con claves predefinidas con userjs- (diseñadas para utilizarse con scripts de usuario).", "apihelp-options-param-reset": "Restablece las preferencias de la página web a sus valores predeterminados.", "apihelp-options-param-resetkinds": "Lista de tipos de opciones a restablecer cuando la opción $1reset esté establecida.", "apihelp-options-param-change": "Lista de cambios con el formato nombre=valor (por ejemplo: skin=vector). 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. Si algún valor contiene el carácter tubería (|), se debe utilizar el [[Special:ApiHelp/main#main/datatypes|separador alternativo de múltiples valores]] para que las operaciones se realicen correctamente.", @@ -303,7 +309,7 @@ "apihelp-options-example-reset": "Restablecer todas las preferencias", "apihelp-options-example-change": "Cambiar las preferencias skin y hideminor.", "apihelp-options-example-complex": "Restablecer todas las preferencias y establecer skin y nickname.", - "apihelp-paraminfo-description": "Obtener información acerca de los módulos de la API.", + "apihelp-paraminfo-summary": "Obtener información acerca de los módulos de la API.", "apihelp-paraminfo-param-modules": "Lista de los nombres de los módulos (valores de los parámetros action y format o main). Se pueden especificar submódulos con un +, todos los submódulos con +* o todos los submódulos recursivamente con +**.", "apihelp-paraminfo-param-helpformat": "Formato de las cadenas de ayuda.", "apihelp-paraminfo-param-querymodules": "Lista de los nombres de los módulos de consulta (valor de los parámetros prop, meta or list). Utiliza $1modules=query+foo en vez de $1querymodules=foo.", @@ -312,7 +318,8 @@ "apihelp-paraminfo-param-formatmodules": "Lista de los nombres del formato de los módulos (valor del parámetro format). Utiliza $1modules en su lugar.", "apihelp-paraminfo-example-1": "Mostrar información para [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] y [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Mostrar información para todos los submódulos de [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "Analiza el contenido y devuelve la salida del analizador sintáctico.\n\nVéanse los distintos módulos prop de [[Special:ApiHelp/query|action=query]] para obtener información de la versión actual de una página.\n\nHay varias maneras de especificar el texto que analizar:\n# Especificar una página o revisión, mediante $1page, $1pageid o $1oldid.\n# Especificar explícitamente el contenido, mediante $1text, $1title y $1contentmodel.\n# Especificar solamente un resumen que analizar. Se debería asignar a $1prop un valor vacío.", + "apihelp-parse-summary": "Analiza el contenido y devuelve la salida del analizador sintáctico.", + "apihelp-parse-extended-description": "Véanse los distintos módulos prop de [[Special:ApiHelp/query|action=query]] para obtener información de la versión actual de una página.\n\nHay varias maneras de especificar el texto que analizar:\n# Especificar una página o revisión, mediante $1page, $1pageid o $1oldid.\n# Especificar explícitamente el contenido, mediante $1text, $1title y $1contentmodel.\n# Especificar solamente un resumen que analizar. Se debería asignar a $1prop un valor vacío.", "apihelp-parse-param-title": "Título de la página a la que pertenece el texto. Si se omite se debe especificar $1contentmodel y se debe utilizar el [[API]] como título.", "apihelp-parse-param-text": "Texto a analizar. Utiliza $1title or $1contentmodel para controlar el modelo del contenido.", "apihelp-parse-param-summary": "Resumen a analizar.", @@ -332,8 +339,8 @@ "apihelp-parse-paramvalue-prop-sections": "Da las secciones del wikitexto analizado.", "apihelp-parse-paramvalue-prop-revid": "Añade la ID de revisión de la página analizada.", "apihelp-parse-paramvalue-prop-displaytitle": "Añade el título del wikitexto analizado.", - "apihelp-parse-paramvalue-prop-headitems": "Obsoleto. Proporciona elementos para colocar en el <head> de la página.", - "apihelp-parse-paramvalue-prop-headhtml": "Da el <encabezado> analizado de la página.", + "apihelp-parse-paramvalue-prop-headitems": "Proporciona elementos para colocar en el <head> de la página.", + "apihelp-parse-paramvalue-prop-headhtml": "Proporciona la <head> analizada de la página.", "apihelp-parse-paramvalue-prop-modules": "Proporciona los módulos de ResourceLoader utilizados en la página. Para cargar, utiliza mw.loader.using(). jsconfigvars o bien encodedjsconfigvars deben solicitarse en conjunto con modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Proporciona las variables de configuración de JavaScript específicas de la página. Para obtenerlas, utiliza mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Da la configuración JavaScript de variables específica para la página como cadena JSON.", @@ -344,6 +351,7 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Da el informe del límite de forma estructurada. No da datos si $1disablelimitreport está establecido.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si $1disablelimitreport está establecido.", "apihelp-parse-paramvalue-prop-parsetree": "El árbol de análisis sintáctico XML del contenido de la revisión (requiere modelo de contenido $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Da las advertencias que se produjeron al analizar el contenido.", "apihelp-parse-param-pst": "Guardar previamente los cambios antes de transformar la entrada antes de analizarla. Sólo es válido cuando se utiliza con el texto.", "apihelp-parse-param-onlypst": "Guardar previamente los cambios antes de transformar (PST) en la entrada. Devuelve el mismo wikitexto, después de que un PST se ha aplicado. Sólo es válido cuando se utiliza con $1text.", "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con $1prop=langlinks).", @@ -356,20 +364,21 @@ "apihelp-parse-param-generatexml": "Generar árbol de análisis sintáctico XML (requiere modelo de contenido $1; sustituido por $2prop=parsetree).", "apihelp-parse-param-preview": "Analizar en modo de vista previa.", "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).", - "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.", + "apihelp-parse-param-disabletoc": "Omitir el sumario en la salida.", + "apihelp-parse-param-useskin": "Aplicar la piel seleccionada a la salida del analizador. Puede afectar a las siguientes propiedades: langlinks, headitems, módulos, jsconfigvars, indicadores.", "apihelp-parse-param-contentformat": "Formato de serialización de contenido utilizado para la introducción de texto. Sólo es válido cuando se utiliza con $1text.", "apihelp-parse-param-contentmodel": "Modelo de contenido del texto de entrada. Si se omite, se debe especificar $1title, y el valor por defecto será el modelo del título especificado. Solo es válido cuando se use junto con $1text.", "apihelp-parse-example-page": "Analizar una página.", "apihelp-parse-example-text": "Analizar wikitexto.", "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando el título de la página.", "apihelp-parse-example-summary": "Analizar un resumen.", - "apihelp-patrol-description": "Verificar una página o revisión.", + "apihelp-patrol-summary": "Verificar una página o revisión.", "apihelp-patrol-param-rcid": "Identificador de cambios recientes que verificar.", "apihelp-patrol-param-revid": "Identificador de revisión que patrullar.", "apihelp-patrol-param-tags": "Cambio de etiquetas para aplicar a la entrada en la patrulla de registro.", "apihelp-patrol-example-rcid": "Verificar un cambio reciente.", "apihelp-patrol-example-revid": "Verificar una revisión.", - "apihelp-protect-description": "Cambiar el nivel de protección de una página.", + "apihelp-protect-summary": "Cambiar el nivel de protección de una página.", "apihelp-protect-param-title": "Título de la página a (des)proteger. No se puede utilizar con $1pageid.", "apihelp-protect-param-pageid": "ID de la página a (des)proteger. No se puede utilizar con $1title.", "apihelp-protect-param-protections": "Lista de los niveles de protección, con formato action=level (por ejemplo: edit=sysop). Un nivel de all («todos») significa que cualquier usuaro puede realizar la acción, es decir, no hay restricción.\n\nNota: Cualquier acción no mencionada tendrá las restricciones eliminadas.", @@ -382,11 +391,13 @@ "apihelp-protect-example-protect": "Proteger una página", "apihelp-protect-example-unprotect": "Desproteger una página estableciendo la restricción a all («todos», es decir, cualquier usuario puede realizar la acción).", "apihelp-protect-example-unprotect2": "Desproteger una página anulando las restricciones.", - "apihelp-purge-description": "Purgar la caché de los títulos proporcionados.", + "apihelp-purge-summary": "Purgar la caché de los títulos proporcionados.", "apihelp-purge-param-forcelinkupdate": "Actualizar las tablas de enlaces.", "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar la tabla de enlaces y todas las tablas de enlaces de cualquier página que use esta página como una plantilla.", "apihelp-purge-example-simple": "Purgar la Main Page y la página API.", "apihelp-purge-example-generator": "Purgar las 10 primeras páginas del espacio de nombres principal.", + "apihelp-query-summary": "Obtener datos de y sobre MediaWiki.", + "apihelp-query-extended-description": "Todas las modificaciones de datos tendrán que utilizar primero la consulta para adquirir un token para evitar el abuso desde sitios maliciosos.", "apihelp-query-param-prop": "Qué propiedades obtener para las páginas consultadas.", "apihelp-query-param-list": "Qué listas obtener.", "apihelp-query-param-meta": "Qué metadatos obtener.", @@ -395,8 +406,9 @@ "apihelp-query-param-exportnowrap": "Devuelve el XML de exportación sin envolverlo en un resultado XML (mismo formato que [[Special:Export]]). Solo se puede usar junto con $1export.", "apihelp-query-param-iwurl": "Si la URL completa si el título es un interwiki.", "apihelp-query-param-rawcontinue": "Devuelve los datos query-continue en bruto para continuar.", + "apihelp-query-example-revisions": "Busque [[Special:ApiHelp/query+siteinfo|información del sitio]] y [[Special:ApiHelp/query+revisions|revisiones]] de Main Page.", "apihelp-query-example-allpages": "Obtener revisiones de páginas que comiencen por API/.", - "apihelp-query+allcategories-description": "Enumerar todas las categorías.", + "apihelp-query+allcategories-summary": "Enumerar todas las categorías.", "apihelp-query+allcategories-param-from": "La categoría para comenzar la enumeración", "apihelp-query+allcategories-param-to": "La categoría para detener la enumeración", "apihelp-query+allcategories-param-prefix": "Buscar todos los títulos de las categorías que comiencen con este valor.", @@ -409,7 +421,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Etiqueta las categorías que están ocultas con __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Lista las categorías con información sobre el número de páginas de cada una.", "apihelp-query+allcategories-example-generator": "Recupera la información sobre la propia página de categoría para las categorías que empiezan por List.", - "apihelp-query+alldeletedrevisions-description": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.", + "apihelp-query+alldeletedrevisions-summary": "Listar todas las revisiones eliminadas por un usuario o en un espacio de nombres.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Solo puede usarse con $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "No puede utilizarse con $3user.", "apihelp-query+alldeletedrevisions-param-start": "El sello de tiempo para comenzar la enumeración", @@ -421,16 +433,17 @@ "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-miser-user-namespace": "Nota: Debido al [[mw:Manual:$wgMiserMode|modo avaro]], usar juntos $1user y $1namespace puede dar lugar a que se devuelvan menos de $1limit antes de continuar. En casos extremos, podrían devolverse cero resultados.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]], usar juntos $1user y $1namespace puede dar lugar a que se devuelvan menos de $1limit resultados antes de continuar. En casos extremos, podrían devolverse cero resultados.", "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 Example.", "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+allfileusages-summary": "Enumerar todos los usos del archivo, incluidos los que no existen.", "apihelp-query+allfileusages-param-from": "El título del archivo para comenzar la enumeración.", "apihelp-query+allfileusages-param-to": "El título del archivo para detener la enumeración.", "apihelp-query+allfileusages-param-prefix": "Buscar todos los títulos de los archivos que comiencen con este valor.", "apihelp-query+allfileusages-param-unique": "Mostrar solo títulos únicos de archivo. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.", "apihelp-query+allfileusages-param-prop": "Qué piezas de información incluir:", + "apihelp-query+allfileusages-paramvalue-prop-ids": "Agrega los ID de página de las páginas en uso (no se puede usar con $1unique).", "apihelp-query+allfileusages-paramvalue-prop-title": "Agrega el título del archivo.", "apihelp-query+allfileusages-param-limit": "Cuántos elementos en total se devolverán.", "apihelp-query+allfileusages-param-dir": "La dirección en la que se listará.", @@ -438,7 +451,7 @@ "apihelp-query+allfileusages-example-unique": "Listar títulos de archivos únicos.", "apihelp-query+allfileusages-example-unique-generator": "Recupera los títulos de todos los archivos y marca los faltantes.", "apihelp-query+allfileusages-example-generator": "Recupera las páginas que contienen los archivos.", - "apihelp-query+allimages-description": "Enumerar todas las imágenes secuencialmente.", + "apihelp-query+allimages-summary": "Enumerar todas las imágenes secuencialmente.", "apihelp-query+allimages-param-sort": "Propiedad por la que realizar la ordenación.", "apihelp-query+allimages-param-dir": "La dirección en la que se listará.", "apihelp-query+allimages-param-from": "El título de la imagen para comenzar la enumeración. Solo puede utilizarse con $1sort=name.", @@ -458,12 +471,13 @@ "apihelp-query+allimages-example-recent": "Mostrar una lista de archivos subidos recientemente, similar a [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Mostrar una lista de archivos tipo MIME image/png o image/gif", "apihelp-query+allimages-example-generator": "Mostrar información acerca de 4 archivos que empiecen por la letra T.", - "apihelp-query+alllinks-description": "Enumerar todos los enlaces que apunten a un determinado espacio de nombres.", + "apihelp-query+alllinks-summary": "Enumerar todos los enlaces que apunten a un determinado espacio de nombres.", "apihelp-query+alllinks-param-from": "El título del enlace para comenzar la enumeración.", "apihelp-query+alllinks-param-to": "El título del enlace para detener la enumeración.", "apihelp-query+alllinks-param-prefix": "Buscar todos los títulos vinculados que comiencen con este valor.", "apihelp-query+alllinks-param-unique": "Mostrar solo títulos únicos enlazados. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.", "apihelp-query+alllinks-param-prop": "Qué piezas de información incluir:", + "apihelp-query+alllinks-paramvalue-prop-ids": "Agrega el ID de página de la página de enlace (no se puede usar con $1unique).", "apihelp-query+alllinks-paramvalue-prop-title": "Añade el título del enlace.", "apihelp-query+alllinks-param-namespace": "El espacio de nombres que enumerar.", "apihelp-query+alllinks-param-limit": "Cuántos elementos en total se devolverán.", @@ -472,7 +486,7 @@ "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados únicamente.", "apihelp-query+alllinks-example-unique-generator": "Obtiene todos los títulos enlazados, marcando los que falten.", "apihelp-query+alllinks-example-generator": "Obtiene páginas que contienen los enlaces.", - "apihelp-query+allmessages-description": "Devolver los mensajes de este sitio.", + "apihelp-query+allmessages-summary": "Devolver los mensajes de este sitio.", "apihelp-query+allmessages-param-messages": "Qué mensajes mostrar. * (predeterminado) significa todos los mensajes.", "apihelp-query+allmessages-param-prop": "Qué propiedades se obtendrán.", "apihelp-query+allmessages-param-enableparser": "Establecer para habilitar el analizador, se preprocesará el wikitexto del mensaje (sustitución de palabras mágicas, uso de plantillas, etc.).", @@ -488,7 +502,7 @@ "apihelp-query+allmessages-param-prefix": "Devolver mensajes con este prefijo.", "apihelp-query+allmessages-example-ipb": "Mostrar mensajes que empiecen por ipb-.", "apihelp-query+allmessages-example-de": "Mostrar mensajes august y mainpage en alemán.", - "apihelp-query+allpages-description": "Enumerar todas las páginas secuencialmente en un espacio de nombres determinado.", + "apihelp-query+allpages-summary": "Enumerar todas las páginas secuencialmente en un espacio de nombres determinado.", "apihelp-query+allpages-param-from": "El título de página para comenzar la enumeración", "apihelp-query+allpages-param-to": "El título de página para detener la enumeración.", "apihelp-query+allpages-param-prefix": "Buscar todos los títulos de las páginas que comiencen con este valor.", @@ -502,10 +516,11 @@ "apihelp-query+allpages-param-limit": "Cuántas páginas en total se devolverán.", "apihelp-query+allpages-param-dir": "La dirección en la que se listará.", "apihelp-query+allpages-param-filterlanglinks": "Filtrar en función de si una página tiene langlinks. Tenga en cuenta que esto no puede considerar langlinks agregados por extensiones.", + "apihelp-query+allpages-param-prexpiry": "¿Cuál término de protección para filtrar la página en:\n; Indefinida: Obtener sólo páginas con protección de vencimiento indefinida.\n; Definida: Obtener sólo las páginas con un definitivo (específico) vencimiento.\n; Todos: Obtener páginas con cualquier caducidad.", "apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra B.", "apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra T.", "apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por Re.", - "apihelp-query+allredirects-description": "Obtener la lista de todas las redirecciones a un espacio de nombres.", + "apihelp-query+allredirects-summary": "Obtener la lista de todas las redirecciones a un espacio de nombres.", "apihelp-query+allredirects-param-from": "El título de la redirección para iniciar la enumeración.", "apihelp-query+allredirects-param-to": "El título de la redirección para detener la enumeración.", "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.", @@ -522,7 +537,7 @@ "apihelp-query+allredirects-example-unique": "La lista de páginas de destino.", "apihelp-query+allredirects-example-unique-generator": "Obtiene todas las páginas de destino, marcando los que faltan.", "apihelp-query+allredirects-example-generator": "Obtiene páginas que contienen las redirecciones.", - "apihelp-query+allrevisions-description": "Listar todas las revisiones.", + "apihelp-query+allrevisions-summary": "Listar todas las revisiones.", "apihelp-query+allrevisions-param-start": "La marca de tiempo para iniciar la enumeración.", "apihelp-query+allrevisions-param-end": "La marca de tiempo para detener la enumeración.", "apihelp-query+allrevisions-param-user": "Listar solo las revisiones de este usuario.", @@ -531,17 +546,19 @@ "apihelp-query+allrevisions-param-generatetitles": "Cuando se utilice como generador, genera títulos en lugar de ID de revisión.", "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario Example.", "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.", - "apihelp-query+mystashedfiles-description": "Obtener una lista de archivos en la corriente de carga de usuarios.", + "apihelp-query+mystashedfiles-summary": "Obtener una lista de archivos en la corriente de carga de usuarios.", "apihelp-query+mystashedfiles-param-prop": "Propiedades a buscar para los archivos.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Buscar el tamaño del archivo y las dimensiones de la imagen.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obtener el tipo MIME y tipo multimedia del archivo.", "apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.", - "apihelp-query+alltransclusions-description": "Mostrar todas las transclusiones (páginas integradas mediante {{x}}), incluidas las inexistentes.", + "apihelp-query+mystashedfiles-example-simple": "Obtenga la clave de archivo, el tamaño del archivo y el tamaño de los archivos en pixeles en el caché de carga del usuario actual.", + "apihelp-query+alltransclusions-summary": "Mostrar todas las transclusiones (páginas integradas mediante {{x}}), incluidas las inexistentes.", "apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.", "apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.", "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluidos que comiencen con este valor.", "apihelp-query+alltransclusions-param-unique": "Mostrar solo títulos únicos transcluidos. No se puede usar junto con $1prop=ids. Cuando se use como generador, devuelve páginas de destino en vez de páginas de origen.", "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:", + "apihelp-query+alltransclusions-paramvalue-prop-ids": "Agrega el ID de página de la página de redirección (no se puede usar con $1unique).", "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.", @@ -550,7 +567,7 @@ "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-summary": "Enumerar todos los usuarios registrados.", "apihelp-query+allusers-param-from": "El nombre de usuario por el que empezar la enumeración.", "apihelp-query+allusers-param-to": "El nombre de usuario por el que finalizar la enumeración.", "apihelp-query+allusers-param-prefix": "Buscar todos los usuarios que empiecen con este valor.", @@ -571,12 +588,13 @@ "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 $1prop=centralids, 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 Y.", - "apihelp-query+authmanagerinfo-description": "Recuperar información sobre el estado de autenticación actual.", + "apihelp-query+authmanagerinfo-summary": "Recuperar información sobre el estado de autenticación actual.", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Compruebe si el estado de autenticación actual del usuario es suficiente para la operación sensible-seguridad especificada.", "apihelp-query+authmanagerinfo-param-requestsfor": "Obtener información sobre las peticiones de autentificación requeridas para la acción de autentificación especificada.", "apihelp-query+authmanagerinfo-example-login": "Captura de las solicitudes que puede ser utilizadas al comienzo de inicio de sesión.", "apihelp-query+authmanagerinfo-example-login-merged": "Obtener las peticiones que podrían utilizarse al empezar un inicio de sesión, con los campos de formulario integrados.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Comprueba si la autentificación es suficiente para realizar la acción foo.", - "apihelp-query+backlinks-description": "Encuentra todas las páginas que enlazan a la página dada.", + "apihelp-query+backlinks-summary": "Encuentra todas las páginas que enlazan a la página dada.", "apihelp-query+backlinks-param-title": "Título que buscar. No se puede usar junto con $1pageid.", "apihelp-query+backlinks-param-pageid": "Identificador de página que buscar. No puede usarse junto con $1title", "apihelp-query+backlinks-param-namespace": "El espacio de nombres que enumerar.", @@ -586,7 +604,7 @@ "apihelp-query+backlinks-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.", "apihelp-query+backlinks-example-simple": "Mostrar enlaces a Main page.", "apihelp-query+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas a Main page.", - "apihelp-query+blocks-description": "Listar todos los usuarios y direcciones IP bloqueadas.", + "apihelp-query+blocks-summary": "Listar todos los usuarios y direcciones IP bloqueadas.", "apihelp-query+blocks-param-start": "El sello de tiempo para comenzar la enumeración", "apihelp-query+blocks-param-end": "El sello de tiempo para detener la enumeración", "apihelp-query+blocks-param-ids": "Lista de bloquear IDs para listar (opcional).", @@ -607,7 +625,7 @@ "apihelp-query+blocks-param-show": "Muestra solamente los elementos que cumplen estos criterios.\nPor ejemplo, para mostrar solamente los bloqueos indefinidos a direcciones IP, introduce $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Listar bloques.", "apihelp-query+blocks-example-users": "Muestra los bloqueos de los usuarios Alice y Bob.", - "apihelp-query+categories-description": "Enumera todas las categorías a las que pertenecen las páginas.", + "apihelp-query+categories-summary": "Enumera todas las categorías a las que pertenecen las páginas.", "apihelp-query+categories-param-prop": "Qué propiedades adicionales obtener para cada categoría:", "apihelp-query+categories-paramvalue-prop-sortkey": "Añade la clave de ordenación (cadena hexadecimal) y el prefijo de la clave de ordenación (la parte legible) de la categoría.", "apihelp-query+categories-paramvalue-prop-timestamp": "Añade la marca de tiempo del momento en que se añadió la categoría.", @@ -618,9 +636,9 @@ "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 Albert Einstein.", "apihelp-query+categories-example-generator": "Obtener información acerca de todas las categorías utilizadas en la página Albert Einstein.", - "apihelp-query+categoryinfo-description": "Devuelve información acerca de las categorías dadas.", + "apihelp-query+categoryinfo-summary": "Devuelve información acerca de las categorías dadas.", "apihelp-query+categoryinfo-example-simple": "Obtener información acerca de Category:Foo y Category:Bar", - "apihelp-query+categorymembers-description": "Lista todas las páginas en una categoría dada.", + "apihelp-query+categorymembers-summary": "Lista todas las páginas en una categoría dada.", "apihelp-query+categorymembers-param-title": "Categoría que enumerar (requerida). Debe incluir el prefijo {{ns:category}}:. No se puede utilizar junto con $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID de página de la categoría para enumerar. No se puede utilizar junto con $1title.", "apihelp-query+categorymembers-param-prop": "Qué piezas de información incluir:", @@ -645,13 +663,15 @@ "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.", "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en Category:Physics.", "apihelp-query+categorymembers-example-generator": "Obtener información sobre las primeras 10 páginas de la Category:Physics.", - "apihelp-query+contributors-description": "Obtener la lista de contribuidores conectados y el número de contribuidores anónimos de una página.", + "apihelp-query+contributors-summary": "Obtener la lista de contribuidores conectados y el número de contribuidores anónimos de una página.", "apihelp-query+contributors-param-group": "Solo incluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.", "apihelp-query+contributors-param-excludegroup": "Excluir usuarios de los grupos especificados. No incluye grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.", "apihelp-query+contributors-param-rights": "Solo incluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.", "apihelp-query+contributors-param-excluderights": "Excluir usuarios con los derechos especificados. No incluye derechos concedidos a grupos implícitos o autopromocionados, como *, usuario o autoconfirmado.", "apihelp-query+contributors-param-limit": "Cuántos contribuyentes se devolverán.", "apihelp-query+contributors-example-simple": "Mostrar los contribuyentes de la página Main Page.", + "apihelp-query+deletedrevisions-summary": "Obtener información de revisión eliminada.", + "apihelp-query+deletedrevisions-extended-description": "Puede ser utilizada de varias maneras:\n# Obtenga las revisiones eliminadas de un conjunto de páginas, estableciendo títulos o ID de paginas. Ordenadas por título y marca horaria.\n# Obtener datos sobre un conjunto de revisiones eliminadas estableciendo sus ID con identificación de revisión. Ordenado por ID de revisión.", "apihelp-query+deletedrevisions-param-start": "Marca de tiempo por la que empezar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.", "apihelp-query+deletedrevisions-param-end": "Marca de tiempo por la que terminar la enumeración. Se ignora cuando se esté procesando una lista de ID de revisión.", "apihelp-query+deletedrevisions-param-tag": "Listar solo las revisiones con esta etiqueta.", @@ -659,7 +679,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "No listar las revisiones de este usuario.", "apihelp-query+deletedrevisions-example-titles": "Muestra la lista de revisiones borradas de las páginas Main Page y Talk:Main Page, con su contenido.", "apihelp-query+deletedrevisions-example-revids": "Mostrar la información de la revisión borrada 123456.", - "apihelp-query+deletedrevs-description": "Muestra la lista de revisiones borradas.\n\nOpera en tres modos:\n# Lista de revisiones borradas de los títulos dados, ordenadas por marca de tiempo.\n# Lista de contribuciones borradas del usuario dado, ordenadas por marca de tiempo.\n# Lista de todas las revisiones borradas en el espacio de nombres dado, ordenadas por título y marca de tiempo (donde no se ha especificado ningún título ni se ha fijado $1user).", + "apihelp-query+deletedrevs-summary": "Muestra la lista de revisiones borradas.", + "apihelp-query+deletedrevs-extended-description": "Opera en tres modos:\n# Lista de revisiones borradas de los títulos dados, ordenadas por marca de tiempo.\n# Lista de contribuciones borradas del usuario dado, ordenadas por marca de tiempo.\n# Lista de todas las revisiones borradas en el espacio de nombres dado, ordenadas por título y marca de tiempo (donde no se ha especificado ningún título ni se ha fijado $1user).", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2", "apihelp-query+deletedrevs-param-start": "Marca de tiempo por la que empezar la enumeración.", "apihelp-query+deletedrevs-param-end": "Marca de tiempo por la que terminar la enumeración.", @@ -677,14 +698,14 @@ "apihelp-query+deletedrevs-example-mode2": "Muestra las últimas 50 contribuciones de Bob (modo 2).", "apihelp-query+deletedrevs-example-mode3-main": "Muestra las primeras 50 revisiones borradas del espacio principal (modo 3).", "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-description": "Enumerar todos los archivos que son duplicados de los archivos dados a partir de los valores hash.", + "apihelp-query+disabled-summary": "Se ha desactivado el módulo de consulta.", + "apihelp-query+duplicatefiles-summary": "Enumerar todos los archivos que son duplicados de los archivos dados a partir de los valores hash.", "apihelp-query+duplicatefiles-param-limit": "Número de archivos duplicados para devolver.", "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-summary": "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-pageid": "Identificador de página que buscar. No se puede usar junto con $1title.", "apihelp-query+embeddedin-param-namespace": "El espacio de nombres que enumerar.", @@ -693,13 +714,13 @@ "apihelp-query+embeddedin-param-limit": "Cuántas páginas se devolverán.", "apihelp-query+embeddedin-example-simple": "Mostrar las páginas que transcluyen Template:Stub.", "apihelp-query+embeddedin-example-generator": "Obtener información sobre las páginas que transcluyen Template:Stub.", - "apihelp-query+extlinks-description": "Devuelve todas las URL externas (excluidos los interwikis) de las páginas dadas.", + "apihelp-query+extlinks-summary": "Devuelve todas las URL externas (excluidos los interwikis) de las páginas dadas.", "apihelp-query+extlinks-param-limit": "Cuántos enlaces se devolverán.", "apihelp-query+extlinks-param-protocol": "Protocolo de la URL. Si está vacío y $1query está definido, el protocolo es http. Para enumerar todos los enlaces externos, deja a la vez vacíos esto y $1query.", "apihelp-query+extlinks-param-query": "Cadena de búsqueda sin protocolo. Útil para comprobar si una determinada página contiene una determinada URL externa.", "apihelp-query+extlinks-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.", "apihelp-query+extlinks-example-simple": "Obtener una lista de los enlaces externos en Main Page.", - "apihelp-query+exturlusage-description": "Enumera páginas que contienen una URL dada.", + "apihelp-query+exturlusage-summary": "Enumera páginas que contienen una URL dada.", "apihelp-query+exturlusage-param-prop": "Qué piezas de información incluir:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Añade el identificado de la página.", "apihelp-query+exturlusage-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.", @@ -710,7 +731,7 @@ "apihelp-query+exturlusage-param-limit": "Cuántas páginas se devolverán.", "apihelp-query+exturlusage-param-expandurl": "Expandir las URL relativas a un protocolo con el protocolo canónico.", "apihelp-query+exturlusage-example-simple": "Mostrar páginas que enlacen con http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Enumerar todos los archivos borrados de forma secuencial.", + "apihelp-query+filearchive-summary": "Enumerar todos los archivos borrados de forma secuencial.", "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.", @@ -732,9 +753,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Añade la profundidad de bit de la versión.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Añade el nombre de archivo de la versión archivada para las versiones que no son las últimas.", "apihelp-query+filearchive-example-simple": "Mostrar una lista de todos los archivos eliminados.", - "apihelp-query+filerepoinfo-description": "Devuelve metainformación sobre los repositorios de imágenes configurados en el wiki.", + "apihelp-query+filerepoinfo-summary": "Devuelve metainformación sobre los repositorios de imágenes configurados en el wiki.", + "apihelp-query+filerepoinfo-param-prop": "Propiedades del repositorio a obtener (puede haber más disponibles en algunos wikis):\n;apiurl:URL del repositorio API - útil para obtener información de imagen del servidor.\n;name:La clave del repositorio - usado in e.g. [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] y [[Special:ApiHelp/query+imageinfo|imageinfo]] devuelve valores.\n;displayname:El nombre legible del repositorio wiki.\n;rooturl:Raíz URL para rutas de imágenes.\n;local:Si ese repositorio es local o no.", "apihelp-query+filerepoinfo-example-simple": "Obtener información acerca de los repositorios de archivos.", - "apihelp-query+fileusage-description": "Encontrar todas las páginas que utilizan los archivos dados.", + "apihelp-query+fileusage-summary": "Encontrar todas las páginas que utilizan los archivos dados.", "apihelp-query+fileusage-param-prop": "Qué propiedades se obtendrán:", "apihelp-query+fileusage-paramvalue-prop-pageid": "Identificador de cada página.", "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada página.", @@ -744,7 +766,7 @@ "apihelp-query+fileusage-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.", "apihelp-query+fileusage-example-simple": "Obtener una lista de páginas que utilicen [[:File:Example.jpg]].", "apihelp-query+fileusage-example-generator": "Obtener información acerca de las páginas que utilicen [[:File:Example.jpg]].", - "apihelp-query+imageinfo-description": "Devuelve información del archivo y su historial de subida.", + "apihelp-query+imageinfo-summary": "Devuelve información del archivo y su historial de subida.", "apihelp-query+imageinfo-param-prop": "Qué información del archivo se obtendrá:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Añade la marca de tiempo a la versión actualizada.", "apihelp-query+imageinfo-paramvalue-prop-user": "Añade el usuario que subió cada versión del archivo.", @@ -753,6 +775,7 @@ "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analizar el comentario de la versión.", "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Agrega el título canónico del archivo.", "apihelp-query+imageinfo-paramvalue-prop-url": "Devuelve la URL para el archivo y la página de descripción.", + "apihelp-query+imageinfo-paramvalue-prop-size": "Agrega el tamaño del archivo en bytes y la altura, el ancho y el número de páginas (si aplica).", "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias para el tamaño.", "apihelp-query+imageinfo-paramvalue-prop-sha1": "Añade el hash SHA-1 para la imagen.", "apihelp-query+imageinfo-paramvalue-prop-mime": "Añade el tipo MIME del archivo.", @@ -763,23 +786,29 @@ "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Enumera metadatos con formato combinados de múltiples fuentes. Los resultados están en formato HTML.", "apihelp-query+imageinfo-paramvalue-prop-archivename": "Añade el nombre del archivo de la versión archivada para las versiones anteriores a la última.", "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Añade la profundidad de bits de la versión.", + "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado por la página de Carga Especial para obtener información sobre un archivo existente. No está diseñado para ser utilizado fuera del núcleo MediaWiki.", + "apihelp-query+imageinfo-paramvalue-prop-badfile": "Añade si el archivo está en la [[MediaWiki:Bad image list]]", "apihelp-query+imageinfo-param-limit": "Cuántos revisiones de archivos se devolverán por perfil.", "apihelp-query+imageinfo-param-start": "Marca de tiempo por la que empezar la enumeración.", "apihelp-query+imageinfo-param-end": "Marca de tiempo por la que terminar la enumeración.", + "apihelp-query+imageinfo-param-urlwidth": "Si se establece $2prop=url, se devolverá una URL a una imagen escalada a este ancho.\nPor razones de rendimiento, si se utiliza esta opción, no se devolverán más de $1 imágenes escaladas.", "apihelp-query+imageinfo-param-urlheight": "Similar a $1urlwidth.", "apihelp-query+imageinfo-param-metadataversion": "Versión de los metadatos que se utilizará. Si se especifica latest, utilizará la última versión. El valor predeterminado es 1, por motivo de retrocompatibilidad.", + "apihelp-query+imageinfo-param-extmetadatalanguage": "En qué idioma obtener «extmetadata». Esto afecta tanto la traducción que se obtendrá ―si hay varias― como el formato de elementos como los números y algunos valores.", + "apihelp-query+imageinfo-param-extmetadatamultilang": "Si las traducciones para la propiedad extmetadata están disponibles, busque todas ellas.", "apihelp-query+imageinfo-param-extmetadatafilter": "Si se especifica y no vacío, sólo estas claves serán devueltos por $1prop=extmetadata.", "apihelp-query+imageinfo-param-urlparam": "Un controlador específico de la cadena de parámetro. Por ejemplo, los archivos Pdf pueden utilizar page15-100px. $1urlwidth debe ser utilizado y debe ser consistente con $1urlparam.", + "apihelp-query+imageinfo-param-badfilecontexttitle": "Si $2prop=badfile está establecido, este es el título de la página utilizado al evaluar la [[MediaWiki:Bad image list]]", "apihelp-query+imageinfo-param-localonly": "Buscar solo archivos en el repositorio local.", "apihelp-query+imageinfo-example-simple": "Obtener información sobre la versión actual de [[:File:Albert Einstein Head.jpg]].", "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-summary": "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-images": "Mostrar solo estos archivos. Útil para comprobar si una determinada página tiene un determinado archivo.", "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+images-example-generator": "Obtener información sobre todos los archivos empleados en [[Main Page]].", - "apihelp-query+imageusage-description": "Encontrar todas las páginas que usen el título de imagen dado.", + "apihelp-query+imageusage-summary": "Encontrar todas las páginas que usen el título de imagen dado.", "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.", @@ -789,10 +818,14 @@ "apihelp-query+imageusage-param-redirect": "Si la página con el enlace es una redirección, encontrar también las páginas que enlacen a esa redirección. El límite máximo se reduce a la mitad.", "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+info-summary": "Obtener información básica de la página.", "apihelp-query+info-param-prop": "Qué propiedades adicionales se obtendrán:", "apihelp-query+info-paramvalue-prop-protection": "Listar el nivel de protección de cada página.", "apihelp-query+info-paramvalue-prop-talkid": "El identificador de la página de discusión correspondiente a cada página que no es de discusión.", + "apihelp-query+info-paramvalue-prop-watched": "Muestra el estado de seguimiento de cada página.", + "apihelp-query+info-paramvalue-prop-watchers": "El número de observadores, si se permite.", + "apihelp-query+info-paramvalue-prop-visitingwatchers": "El número de observadores de cada página que ha visitado ediciones recientes a esa página, si se permite.", + "apihelp-query+info-paramvalue-prop-notificationtimestamp": "La hora de notificación de la lista de seguimiento de cada página.", "apihelp-query+info-paramvalue-prop-subjectid": "La ID de página de la página principal de cada página de discusión.", "apihelp-query+info-paramvalue-prop-url": "Muestra una URL completa, una URL de edición y la URL canónica de cada página.", "apihelp-query+info-paramvalue-prop-readable": "Si el usuario puede leer esta página.", @@ -802,7 +835,8 @@ "apihelp-query+info-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.", "apihelp-query+info-example-simple": "Obtener información acerca de la página Main Page.", "apihelp-query+info-example-protection": "Obtén información general y protección acerca de la página Main Page.", - "apihelp-query+iwbacklinks-description": "Encontrar todas las páginas que enlazan al enlace interwiki dado.\n\nPuede utilizarse para encontrar todos los enlaces con un prefijo, o todos los enlaces a un título (con un determinado prefijo). Si no se introduce ninguno de los parámetros, se entiende como «todos los enlaces interwiki».", + "apihelp-query+iwbacklinks-summary": "Encontrar todas las páginas que enlazan al enlace interwiki dado.", + "apihelp-query+iwbacklinks-extended-description": "Puede utilizarse para encontrar todos los enlaces con un prefijo, o todos los enlaces a un título (con un determinado prefijo). Si no se introduce ninguno de los parámetros, se entiende como «todos los enlaces interwiki».", "apihelp-query+iwbacklinks-param-prefix": "Prefijo para el interwiki.", "apihelp-query+iwbacklinks-param-title": "Enlace interlingüístico que buscar. Se debe usar junto con $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "Cuántas páginas se devolverán.", @@ -812,14 +846,19 @@ "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+iwbacklinks-example-generator": "Obtener información sobre las páginas que enlacen a [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Devuelve todos los enlaces interwiki de las páginas dadas.", + "apihelp-query+iwlinks-summary": "Devuelve todos los enlaces interwiki de las páginas dadas.", + "apihelp-query+iwlinks-param-url": "Si desea obtener la URL completa (no se puede usar con $1prop).", "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-title": "El enlace Interwiki para buscar. Debe utilizarse con $1prefix .", "apihelp-query+iwlinks-param-dir": "La dirección en que ordenar la lista.", "apihelp-query+iwlinks-example-simple": "Obtener los enlaces interwiki de la página Main Page.", + "apihelp-query+langbacklinks-summary": "Encuentra todas las páginas que conectan con el enlace de idioma dado.", + "apihelp-query+langbacklinks-extended-description": "Puede utilizarse para encontrar todos los enlaces con un código de idioma, o todos los enlaces a un título (con un idioma dado). El uso de ninguno de los parámetros es efectivamente \"todos los enlaces de idioma\".\n\nTenga en cuenta que esto no puede considerar los enlaces de idiomas agregados por extensiones.", "apihelp-query+langbacklinks-param-lang": "Idioma del enlace de idioma.", + "apihelp-query+langbacklinks-param-title": "Enlace de idioma para buscar. Debe utilizarse con $1lang.", "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.", @@ -827,7 +866,7 @@ "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-description": "Devuelve todos los enlaces interlingüísticos de las páginas dadas.", + "apihelp-query+langlinks-summary": "Devuelve todos los enlaces interlingüísticos de las páginas dadas.", "apihelp-query+langlinks-param-limit": "Número de enlaces interlingüísticos que devolver.", "apihelp-query+langlinks-param-url": "Obtener la URL completa o no (no se puede usar con $1prop).", "apihelp-query+langlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:", @@ -839,14 +878,15 @@ "apihelp-query+langlinks-param-dir": "La dirección en que ordenar la lista.", "apihelp-query+langlinks-param-inlanguagecode": "Código de idioma para los nombres de idiomas localizados.", "apihelp-query+langlinks-example-simple": "Obtener los enlaces interlingüísticos de la página Main Page.", - "apihelp-query+links-description": "Devuelve todos los enlaces de las páginas dadas.", + "apihelp-query+links-summary": "Devuelve todos los enlaces de las páginas dadas.", "apihelp-query+links-param-namespace": "Mostrar solo los enlaces en estos espacios de nombres.", "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.", "apihelp-query+links-param-titles": "Devolver solo los enlaces a estos títulos. Útil para comprobar si una determinada página enlaza a un determinado título.", "apihelp-query+links-param-dir": "La dirección en que ordenar la lista.", "apihelp-query+links-example-simple": "Obtener los enlaces de la página Main Page", + "apihelp-query+links-example-generator": "Obtenga información sobre las páginas de enlace en la página Página principal.", "apihelp-query+links-example-namespaces": "Obtener enlaces de la página Main Page de los espacios de nombres {{ns:user}} and {{ns:template}}.", - "apihelp-query+linkshere-description": "Buscar todas las páginas que enlazan a las páginas dadas.", + "apihelp-query+linkshere-summary": "Buscar todas las páginas que enlazan a las páginas dadas.", "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.", @@ -856,7 +896,7 @@ "apihelp-query+linkshere-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.", "apihelp-query+linkshere-example-simple": "Obtener una lista de páginas que enlacen a la [[Main Page]].", "apihelp-query+linkshere-example-generator": "Obtener información acerca de las páginas enlazadas a la [[Main Page|Portada]].", - "apihelp-query+logevents-description": "Obtener eventos de los registros.", + "apihelp-query+logevents-summary": "Obtener eventos de los registros.", "apihelp-query+logevents-param-prop": "Qué propiedades se obtendrán:", "apihelp-query+logevents-paramvalue-prop-ids": "Agrega el identificador del evento de registro.", "apihelp-query+logevents-paramvalue-prop-title": "Añade el título de la página para el evento del registro.", @@ -879,13 +919,13 @@ "apihelp-query+logevents-param-tag": "Solo mostrar las entradas de eventos con esta etiqueta.", "apihelp-query+logevents-param-limit": "Número total de entradas de eventos que devolver.", "apihelp-query+logevents-example-simple": "Mostrar los eventos recientes del registro.", - "apihelp-query+pagepropnames-description": "Mostrar todos los nombres de propiedades de página utilizados en el wiki.", + "apihelp-query+pagepropnames-summary": "Mostrar todos los nombres de propiedades de página utilizados en el wiki.", "apihelp-query+pagepropnames-param-limit": "Número máximo de nombres que devolver.", "apihelp-query+pagepropnames-example-simple": "Obtener los 10 primeros nombres de propiedades.", - "apihelp-query+pageprops-description": "Obtener diferentes propiedades de página definidas en el contenido de la página.", + "apihelp-query+pageprops-summary": "Obtener diferentes propiedades de página definidas en el contenido de la página.", "apihelp-query+pageprops-param-prop": "Sólo listar estas propiedades de página ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] devuelve los nombres de las propiedades de página en uso). Útil para comprobar si las páginas usan una determinada propiedad de página.", "apihelp-query+pageprops-example-simple": "Obtener las propiedades de las páginas Main Page y MediaWiki.", - "apihelp-query+pageswithprop-description": "Mostrar todas las páginas que usen una propiedad de página.", + "apihelp-query+pageswithprop-summary": "Mostrar todas las páginas que usen una propiedad de página.", "apihelp-query+pageswithprop-param-propname": "Propiedad de página para la cual enumerar páginas ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] devuelve los nombres de las propiedades de página en uso).", "apihelp-query+pageswithprop-param-prop": "Qué piezas de información incluir:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Añade el identificador de página.", @@ -895,13 +935,15 @@ "apihelp-query+pageswithprop-param-dir": "Dirección en la que se desea ordenar.", "apihelp-query+pageswithprop-example-simple": "Listar las 10 primeras páginas que utilicen {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Obtener información adicional acerca de las 10 primeras páginas que utilicen __NOTOC__.", + "apihelp-query+prefixsearch-summary": "Realice una búsqueda de prefijo de títulos de página.", + "apihelp-query+prefixsearch-extended-description": "A pesar de la similitud en los nombres, este módulo no pretende ser equivalente a [[Special:PrefixIndex]]; para eso, vea [[Special:ApiHelp/query+allpages|action=query&list=allpages]] con el parámetro apprefix. El propósito de este módulo es similar a [[Special:ApiHelp/opensearch|action=opensearch]]: para tomar la entrada del usuario y proporcionar los mejores títulos coincidentes. Dependiendo del motor de búsqueda backend, esto puede incluir la corrección de errores, redirigir la evasión, u otras heurísticas.", "apihelp-query+prefixsearch-param-search": "Buscar cadena.", "apihelp-query+prefixsearch-param-namespace": "Espacio de nombres que buscar.", "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados que devolver.", "apihelp-query+prefixsearch-param-offset": "Número de resultados que omitir.", "apihelp-query+prefixsearch-example-simple": "Buscar títulos de páginas que empiecen con meaning.", "apihelp-query+prefixsearch-param-profile": "Perfil de búsqueda que utilizar.", - "apihelp-query+protectedtitles-description": "Mostrar todos los títulos protegidos contra creación.", + "apihelp-query+protectedtitles-summary": "Mostrar todos los títulos protegidos contra creación.", "apihelp-query+protectedtitles-param-namespace": "Listar solo los títulos en estos espacios de nombres.", "apihelp-query+protectedtitles-param-level": "Listar solo títulos con estos niveles de protección.", "apihelp-query+protectedtitles-param-limit": "Cuántas páginas se devolverán.", @@ -917,17 +959,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "Agrega el nivel de protección.", "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.", "apihelp-query+protectedtitles-example-generator": "Encuentra enlaces a títulos protegidos en el espacio de nombres principal.", - "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, es sensible a mayúsculas y minúsculas.", + "apihelp-query+querypage-summary": "Obtenga una lista proporcionada por una página especial basada en QueryPage.", + "apihelp-query+querypage-param-page": "El nombre de la página especial. Recuerda, distingue mayúsculas y minúsculas.", "apihelp-query+querypage-param-limit": "Número de resultados que se devolverán.", "apihelp-query+querypage-example-ancientpages": "Devolver resultados de [[Special:Ancientpages]].", - "apihelp-query+random-description": "Obtener un conjunto de páginas aleatorias.\n\nLas páginas aparecen enumeradas en una secuencia fija, solo que el punto de partida es aleatorio. Esto quiere decir que, si, por ejemplo, Portada es la primera página aleatoria de la lista, Lista de monos ficticios siempre será la segunda, Lista de personas en sellos de Vanuatu la tercera, etc.", + "apihelp-query+random-summary": "Obtener un conjunto de páginas aleatorias.", + "apihelp-query+random-extended-description": "Las páginas aparecen enumeradas en una secuencia fija, solo que el punto de partida es aleatorio. Esto quiere decir que, si, por ejemplo, Portada es la primera página aleatoria de la lista, Lista de monos ficticios siempre será la segunda, Lista de personas en sellos de Vanuatu la tercera, etc.", "apihelp-query+random-param-namespace": "Devolver solo las páginas de estos espacios de nombres.", "apihelp-query+random-param-limit": "Limita el número de páginas aleatorias que se devolverán.", "apihelp-query+random-param-redirect": "Usa $1filterredir=redirects en su lugar.", "apihelp-query+random-param-filterredir": "Cómo filtrar las redirecciones.", "apihelp-query+random-example-simple": "Devuelve dos páginas aleatorias del espacio de nombres principal.", "apihelp-query+random-example-generator": "Devuelve la información de dos páginas aleatorias del espacio de nombres principal.", - "apihelp-query+recentchanges-description": "Enumerar cambios recientes.", + "apihelp-query+recentchanges-summary": "Enumerar cambios recientes.", "apihelp-query+recentchanges-param-start": "El sello de tiempo para comenzar la enumeración.", "apihelp-query+recentchanges-param-end": "El sello de tiempo para finalizar la enumeración.", "apihelp-query+recentchanges-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.", @@ -948,6 +992,7 @@ "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiqueta ediciones verificables como verificadas o no verificadas.", "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Añade información de registro (identificador de registro, tipo de registro, etc.) a las entradas de registro.", "apihelp-query+recentchanges-paramvalue-prop-tags": "Muestra las etiquetas de la entrada.", + "apihelp-query+recentchanges-paramvalue-prop-sha1": "Añade la suma de comprobación de contenido para las entradas asociadas a una revisión.", "apihelp-query+recentchanges-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.", "apihelp-query+recentchanges-param-show": "Muestra solo los elementos que cumplan estos criterios. Por ejemplo, para ver solo ediciones menores realizadas por usuarios conectados, introduce $1show=minor|!anon.", "apihelp-query+recentchanges-param-limit": "Cuántos cambios en total se devolverán.", @@ -956,15 +1001,18 @@ "apihelp-query+recentchanges-param-generaterevisions": "Cuando se utilice como generador, genera identificadores de revisión en lugar de títulos. Las entradas en la lista de cambios recientes que no tengan identificador de revisión asociado (por ejemplo, la mayoría de las entradas de registro) no generarán nada.", "apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.", "apihelp-query+recentchanges-example-generator": "Obtener información de página de cambios recientes no patrullados.", - "apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.", + "apihelp-query+redirects-summary": "Devuelve todas las redirecciones a las páginas dadas.", "apihelp-query+redirects-param-prop": "Qué propiedades se obtendrán:", "apihelp-query+redirects-paramvalue-prop-pageid": "Identificador de página de cada redirección.", "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.", "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirección, si los hubiere.", "apihelp-query+redirects-param-namespace": "Incluir solo páginas de estos espacios de nombres.", "apihelp-query+redirects-param-limit": "Cuántas redirecciones se devolverán.", + "apihelp-query+redirects-param-show": "Mostrar únicamente los elementos que cumplan con estos criterios:\n;fragment: mostrar solo redirecciones con fragmento.\n;!fragment: mostrar solo redirecciones sin fragmento.", "apihelp-query+redirects-example-simple": "Mostrar una lista de las redirecciones a la [[Main Page|Portada]]", "apihelp-query+redirects-example-generator": "Obtener información sobre todas las redirecciones a la [[Main Page|Portada]].", + "apihelp-query+revisions-summary": "Obtener información de la revisión.", + "apihelp-query+revisions-extended-description": "Puede ser utilizado de varias maneras:\n# Obtener datos sobre un conjunto de páginas (última revisión), estableciendo títulos o ID de paginas.\n# Obtener revisiones para una página determinada, usando títulos o ID de páginas con inicio, fin o límite.\n# Obtener datos sobre un conjunto de revisiones estableciendo sus ID con revids.", "apihelp-query+revisions-paraminfo-singlepageonly": "Solo se puede usar con una sola página (modo n.º 2).", "apihelp-query+revisions-param-startid": "Identificador de revisión a partir del cual empezar la enumeración.", "apihelp-query+revisions-param-endid": "Identificador de revisión en el que detener la enumeración.", @@ -999,7 +1047,7 @@ "apihelp-query+revisions+base-param-parse": "Analizar el contenido de la revisión (requiere $1prop=content). Por motivos de rendimiento, si se utiliza esta opción, el valor de $1limit es forzado a 1.", "apihelp-query+revisions+base-param-section": "Recuperar solamente el contenido de este número de sección.", "apihelp-query+revisions+base-param-contentformat": "Formato de serialización utilizado para $1difftotext y esperado para la salida de contenido.", - "apihelp-query+search-description": "Realizar una búsqueda de texto completa.", + "apihelp-query+search-summary": "Realizar una búsqueda de texto completa.", "apihelp-query+search-param-namespace": "Buscar sólo en estos espacios de nombres.", "apihelp-query+search-param-what": "Tipo de búsqueda que realizar.", "apihelp-query+search-param-info": "Qué metadatos devolver.", @@ -1015,16 +1063,16 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "Añade el título de la sección correspondiente.", "apihelp-query+search-paramvalue-prop-categorysnippet": "Añade un fragmento analizado de la categoría correspondiente.", "apihelp-query+search-paramvalue-prop-isfilematch": "Añade un booleano que indica si la búsqueda corresponde al contenido del archivo.", - "apihelp-query+search-paramvalue-prop-score": "Desaconsejado e ignorado.", - "apihelp-query+search-paramvalue-prop-hasrelated": "Desaconsejado e ignorado.", + "apihelp-query+search-paramvalue-prop-score": "Ignorado.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorado", "apihelp-query+search-param-limit": "Cuántas páginas en total se devolverán.", "apihelp-query+search-param-interwiki": "Incluir resultados interwiki en la búsqueda, si es posible.", "apihelp-query+search-param-backend": "Qué servidor de búsqueda utilizar, si no es el servidor por defecto.", - "apihelp-query+search-param-enablerewrites": "Habilita la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.", + "apihelp-query+search-param-enablerewrites": "Habilitar la reescritura de consultas internas. Algunos servidores de búsqueda pueden reescribir la consulta a una que considere que da mejores resultados, por ejemplo, corrigiendo las faltas ortográficas.", "apihelp-query+search-example-simple": "Buscar meaning.", "apihelp-query+search-example-text": "Buscar meaning en los textos.", "apihelp-query+search-example-generator": "Obtener información acerca de las páginas devueltas por una búsqueda de meaning.", - "apihelp-query+siteinfo-description": "Devolver información general acerca de la página web.", + "apihelp-query+siteinfo-summary": "Devolver información general acerca de la página web.", "apihelp-query+siteinfo-param-prop": "Qué información se obtendrá:", "apihelp-query+siteinfo-paramvalue-prop-general": "Información global del sistema.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista de espacios de nombres registrados y sus nombres canónicos.", @@ -1042,6 +1090,7 @@ "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devuelve información sobre tipos de restricciones (protección) disponible.", "apihelp-query+siteinfo-paramvalue-prop-languages": "Devuelve una lista de los idiomas que admite MediaWiki (opcionalmente localizada mediante el uso de $1inlanguagecode).", "apihelp-query+siteinfo-paramvalue-prop-skins": "Devuelve una lista de todos las apariencias habilitadas (opcionalmente localizada mediante el uso de $1inlanguagecode, de lo contrario en el idioma del contenido).", + "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devuelve una lista de las etiquetas extensoras del analizador.", "apihelp-query+siteinfo-paramvalue-prop-variables": "Devuelve una lista de identificadores variables.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devuelve una lista de los protocolos que se permiten en los enlaces externos.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devuelve los valores predeterminados de las preferencias del usuario.", @@ -1050,11 +1099,11 @@ "apihelp-query+siteinfo-param-inlanguagecode": "Código de idioma para los nombres localizados de los idiomas (en el mejor intento posible) y apariencias.", "apihelp-query+siteinfo-example-simple": "Obtener información del sitio.", "apihelp-query+siteinfo-example-interwiki": "Obtener una lista de prefijos interwiki locales.", - "apihelp-query+stashimageinfo-description": "Devuelve información del archivo para archivos escondidos.", + "apihelp-query+stashimageinfo-summary": "Devuelve información del archivo para archivos escondidos.", "apihelp-query+stashimageinfo-param-sessionkey": "Alias de $1filekey, para retrocompatibilidad.", "apihelp-query+stashimageinfo-example-simple": "Devuelve información para un archivo escondido.", "apihelp-query+stashimageinfo-example-params": "Devuelve las miniaturas de dos archivos escondidos.", - "apihelp-query+tags-description": "Enumerar las etiquetas de modificación.", + "apihelp-query+tags-summary": "Enumerar las etiquetas de modificación.", "apihelp-query+tags-param-limit": "El número máximo de etiquetas para enumerar.", "apihelp-query+tags-param-prop": "Qué propiedades se obtendrán:", "apihelp-query+tags-paramvalue-prop-name": "Añade el nombre de la etiqueta.", @@ -1065,7 +1114,7 @@ "apihelp-query+tags-paramvalue-prop-source": "Obtiene las fuentes de la etiqueta, que pueden incluir extension para etiquetas definidas por extensiones y manual para etiquetas que pueden aplicarse manualmente por los usuarios.", "apihelp-query+tags-paramvalue-prop-active": "Si la etiqueta aún se sigue aplicando.", "apihelp-query+tags-example-simple": "Enumera las etiquetas disponibles.", - "apihelp-query+templates-description": "Devuelve todas las páginas transcluidas en las páginas dadas.", + "apihelp-query+templates-summary": "Devuelve todas las páginas transcluidas en las páginas dadas.", "apihelp-query+templates-param-namespace": "Mostrar plantillas solamente en estos espacios de nombres.", "apihelp-query+templates-param-limit": "Cuántas plantillas se devolverán.", "apihelp-query+templates-param-templates": "Mostrar solo estas plantillas. Útil para comprobar si una determinada página utiliza una determinada plantilla.", @@ -1073,7 +1122,7 @@ "apihelp-query+templates-example-simple": "Obtener las plantillas que se usan en la página Portada.", "apihelp-query+templates-example-generator": "Obtener información sobre las páginas de las plantillas utilizadas en Main Page.", "apihelp-query+templates-example-namespaces": "Obtener las páginas de los espacios de nombres {{ns:user}} y {{ns:template}} que están transcluidas en la página Main Page.", - "apihelp-query+transcludedin-description": "Encuentra todas las páginas que transcluyan las páginas dadas.", + "apihelp-query+transcludedin-summary": "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+transcludedin-paramvalue-prop-title": "Título de cada página.", @@ -1083,7 +1132,7 @@ "apihelp-query+transcludedin-param-show": "Muestra solo los elementos que cumplen estos criterios:\n;redirect: Muestra solamente redirecciones.\n;!redirect: Muestra solamente páginas que no son redirecciones.", "apihelp-query+transcludedin-example-simple": "Obtener una lista de páginas transcluyendo Main Page.", "apihelp-query+transcludedin-example-generator": "Obtener información sobre las páginas que transcluyen Main Page.", - "apihelp-query+usercontribs-description": "Obtener todas las ediciones realizadas por un usuario.", + "apihelp-query+usercontribs-summary": "Obtener todas las ediciones realizadas por un usuario.", "apihelp-query+usercontribs-param-limit": "Número máximo de contribuciones que se devolverán.", "apihelp-query+usercontribs-param-user": "Los usuarios para los cuales se desea recuperar las contribuciones. No se puede utilizar junto con $1userids o $1userprefix.", "apihelp-query+usercontribs-param-userprefix": "Recuperar las contribuciones de todos los usuarios cuyos nombres comienzan con este valor. No se puede utilizar junto con $1user o $1userids.", @@ -1100,16 +1149,17 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Añade las marcas de la edición.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiqueta ediciones verificadas.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista las etiquetas para la edición.", - "apihelp-query+usercontribs-param-show": "Mostrar solo los elementos que coinciden con estos criterios. Por ejemplo, solo ediciones no menores: $2show=!minor.\n\nSi se establece $2show=patrolled o $2show=!patrolled, las revisiones más antiguas que [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) no se mostrarán.", + "apihelp-query+usercontribs-param-show": "Mostrar solo los elementos que coinciden con estos criterios. Por ejemplo, solo ediciones no menores: $2show=!minor.\n\nSi se establece $2show=patrolled o $2show=!patrolled, no se mostrarán las revisiones con una antigüedad mayor que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}).", "apihelp-query+usercontribs-param-tag": "Enumerar solo las revisiones con esta etiqueta.", "apihelp-query+usercontribs-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.", "apihelp-query+usercontribs-example-user": "Mostrar contribuciones del usuario Example.", "apihelp-query+usercontribs-example-ipprefix": "Mostrar las contribuciones de todas las direcciones IP con el prefijo 192.0.2..", - "apihelp-query+userinfo-description": "Obtener información sobre el usuario actual.", + "apihelp-query+userinfo-summary": "Obtener información sobre el usuario actual.", "apihelp-query+userinfo-param-prop": "Qué piezas de información incluir:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué motivo.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Añade una etiqueta messages si el usuario actual tiene mensajes pendientes.", "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos los grupos al que pertenece el usuario actual.", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Enumera los grupos a los que se ha asignado explícitamente al usuario actual, incluida la fecha de expiración de la pertenencia a cada grupo.", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Enumera todos los grupos a los que pertenece automáticamente el usuario actual.", "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos los permisos que tiene el usuario actual.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Enumera los grupos a los que el usuario actual se puede unir o retirar.", @@ -1123,7 +1173,7 @@ "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Añade el recuento de páginas no leídas de la lista de seguimiento del usuario (máximo $1, devuelve $2 si el número es mayor).", "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.", - "apihelp-query+users-description": "Obtener información sobre una lista de usuarios.", + "apihelp-query+users-summary": "Obtener información sobre una lista de usuarios.", "apihelp-query+users-param-prop": "Qué piezas de información incluir:", "apihelp-query+users-paramvalue-prop-blockinfo": "Etiqueta si el usuario está bloqueado, por quién y por qué razón.", "apihelp-query+users-paramvalue-prop-groups": "Lista todos los grupos a los que pertenece cada usuario.", @@ -1138,7 +1188,7 @@ "apihelp-query+users-param-userids": "Una lista de identificadores de usuarios de los que obtener información.", "apihelp-query+users-param-token": "Usa [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] en su lugar.", "apihelp-query+users-example-simple": "Devolver información del usuario Example.", - "apihelp-query+watchlist-description": "Obtener los cambios recientes de las páginas de la lista de seguimiento del usuario actual.", + "apihelp-query+watchlist-summary": "Obtener los cambios recientes de las páginas de la lista de seguimiento del usuario actual.", "apihelp-query+watchlist-param-start": "El sello de tiempo para comenzar la enumeración", "apihelp-query+watchlist-param-end": "El sello de tiempo para finalizar la enumeración.", "apihelp-query+watchlist-param-namespace": "Filtrar cambios solamente a los espacios de nombres dados.", @@ -1172,7 +1222,7 @@ "apihelp-query+watchlist-example-generator": "Obtener información de página de las páginas con cambios recientes de la lista de seguimiento del usuario actual.", "apihelp-query+watchlist-example-generator-rev": "Obtener información de revisión de los cambios recientes de páginas de la lista de seguimiento del usuario actual.", "apihelp-query+watchlist-example-wlowner": "Enumerar la última revisión de páginas con cambios recientes de la lista de seguimiento del usuario Example.", - "apihelp-query+watchlistraw-description": "Obtener todas las páginas de la lista de seguimiento del usuario actual.", + "apihelp-query+watchlistraw-summary": "Obtener todas las páginas de la lista de seguimiento del usuario actual.", "apihelp-query+watchlistraw-param-namespace": "Mostrar solamente las páginas de los espacios de nombres dados.", "apihelp-query+watchlistraw-param-limit": "Número de resultados que devolver en cada petición.", "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:", @@ -1184,14 +1234,14 @@ "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.", "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.", "apihelp-query+watchlistraw-example-generator": "Obtener información de las páginas de la lista de seguimiento del usuario actual.", - "apihelp-removeauthenticationdata-description": "Elimina los datos de autentificación del usuario actual.", + "apihelp-removeauthenticationdata-summary": "Elimina los datos de autentificación del usuario actual.", "apihelp-removeauthenticationdata-example-simple": "Trata de eliminar los datos del usuario actual para FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Enviar un email de reinicialización de la contraseña a un usuario.", + "apihelp-resetpassword-summary": "Enviar un email de reinicialización de la contraseña a un usuario.", "apihelp-resetpassword-param-user": "Usuario en proceso de reinicialización", "apihelp-resetpassword-param-email": "Dirección de correo electrónico del usuario que se va a reinicializar", "apihelp-resetpassword-example-user": "Enviar un correo de recuperación de contraseña al usuario Ejemplo.", "apihelp-resetpassword-example-email": "Enviar un correo de recuperación de contraseña para todos los usuarios con dirección de correo electrónico usuario@ejemplo.com.", - "apihelp-revisiondelete-description": "Eliminar y restaurar revisiones", + "apihelp-revisiondelete-summary": "Eliminar y restaurar revisiones", "apihelp-revisiondelete-param-target": "Título de la página para el borrado de la revisión, en caso de ser necesario para ese tipo.", "apihelp-revisiondelete-param-ids": "Identificadores de las revisiones para borrar.", "apihelp-revisiondelete-param-hide": "Qué ocultar en cada revisión.", @@ -1200,7 +1250,8 @@ "apihelp-revisiondelete-param-tags": "Etiquetas que aplicar a la entrada en el registro de borrados.", "apihelp-revisiondelete-example-revision": "Ocultar el contenido de la revisión 12345 de la página Main Page.", "apihelp-revisiondelete-example-log": "Ocultar todos los datos de la entrada de registro 67890 con el motivo BLP violation.", - "apihelp-rollback-description": "Deshacer la última edición de la página.\n\nSi el último usuario que editó la página hizo varias ediciones consecutivas, todas ellas serán revertidas.", + "apihelp-rollback-summary": "Deshacer la última edición de la página.", + "apihelp-rollback-extended-description": "Si el último usuario que editó la página hizo varias ediciones consecutivas, todas ellas serán revertidas.", "apihelp-rollback-param-title": "Título de la página que revertir. No se puede usar junto con $1pageid.", "apihelp-rollback-param-pageid": "Identificador de la página que revertir. No se puede usar junto con $1title.", "apihelp-rollback-param-tags": "Etiquetas que aplicar a la reversión.", @@ -1210,9 +1261,10 @@ "apihelp-rollback-param-watchlist": "Añadir o borrar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar seguimiento.", "apihelp-rollback-example-simple": "Revertir las últimas ediciones de la página Main Page por el usuario Example.", "apihelp-rollback-example-summary": "Revertir las últimas ediciones de la página Main Page por el usuario de IP 192.0.2.5 con resumen Reverting vandalism, y marcar esas ediciones y la reversión como ediciones realizadas por bots.", - "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery; Descubrimiento Muy Simple).", + "apihelp-rsd-summary": "Exportar un esquema RSD (Really Simple Discovery; Descubrimiento Muy Simple).", "apihelp-rsd-example-simple": "Exportar el esquema RSD.", - "apihelp-setnotificationtimestamp-description": "Actualizar la marca de tiempo de notificación de las páginas en la lista de seguimiento.\n\nEsto afecta a la función de resaltado de las páginas modificadas en la lista de seguimiento y al envío de correo electrónico cuando la preferencia \"{{int:tog-enotifwatchlistpages}}\" está habilitada.", + "apihelp-setnotificationtimestamp-summary": "Actualizar la marca de tiempo de notificación de las páginas en la lista de seguimiento.", + "apihelp-setnotificationtimestamp-extended-description": "Esto afecta a la función de resaltado de las páginas modificadas en la lista de seguimiento y al envío de correo electrónico cuando la preferencia \"{{int:tog-enotifwatchlistpages}}\" está habilitada.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabajar en todas las páginas en seguimiento.", "apihelp-setnotificationtimestamp-param-timestamp": "Marca de tiempo en la que fijar la marca de tiempo de notificación.", "apihelp-setnotificationtimestamp-param-torevid": "Revisión a la que fijar la marca de tiempo de notificación (una sola página).", @@ -1221,8 +1273,8 @@ "apihelp-setnotificationtimestamp-example-page": "Restablecer el estado de notificación de Main page.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fijar la marca de tiempo de notificación de Main page para que todas las ediciones posteriores al 1 de enero de 2012 estén consideradas como no vistas.", "apihelp-setnotificationtimestamp-example-allpages": "Restablecer el estado de notificación de las páginas del espacio de nombres {{ns:user}}.", - "apihelp-setpagelanguage-description": "Cambiar el idioma de una página.", - "apihelp-setpagelanguage-description-disabled": "En este wiki no se permite modificar el idioma de las páginas.\n\nActiva [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", + "apihelp-setpagelanguage-summary": "Cambiar el idioma de una página.", + "apihelp-setpagelanguage-extended-description-disabled": "En este wiki no se permite modificar el idioma de las páginas.\n\nActiva [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", "apihelp-setpagelanguage-param-title": "Título de la página cuyo idioma deseas cambiar. No se puede usar junto con $1pageid.", "apihelp-setpagelanguage-param-pageid": "Identificador de la página cuyo idioma deseas cambiar. No se puede usar junto con $1title.", "apihelp-setpagelanguage-param-lang": "Código del idioma al que se desea cambiar la página. Usa default para restablecer la página al idioma predeterminado para el contenido del wiki.", @@ -1238,7 +1290,7 @@ "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.", "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.", "apihelp-stashedit-param-summary": "Resumen de cambios.", - "apihelp-tag-description": "Añadir o borrar etiquetas de modificación de revisiones individuales o entradas de registro.", + "apihelp-tag-summary": "Añadir o borrar etiquetas de modificación de revisiones individuales o entradas de registro.", "apihelp-tag-param-rcid": "Uno o más identificadores de cambios recientes a los que añadir o borrar la etiqueta.", "apihelp-tag-param-revid": "Uno o más identificadores de revisión a los que añadir o borrar la etiqueta.", "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.", @@ -1248,7 +1300,7 @@ "apihelp-tag-param-tags": "Etiquetas que aplicar a la entrada de registro que se generará como resultado de esta acción.", "apihelp-tag-example-rev": "Añadir la etiqueta vandalism al identificador de revisión 123 sin especificar un motivo", "apihelp-tag-example-log": "Eliminar la etiqueta spam de la entrada del registro con identificador 123 con el motivo Wrongly applied", - "apihelp-unblock-description": "Desbloquear un usuario.", + "apihelp-unblock-summary": "Desbloquear un usuario.", "apihelp-unblock-param-id": "Identificador del bloqueo que se desea desbloquear (obtenido mediante list=blocks). No se puede usar junto con with $1user o $1userid.", "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con $1id o $1userid.", "apihelp-unblock-param-userid": "ID de usuario que desbloquear. No se puede utilizar junto con $1id o $1user.", @@ -1278,7 +1330,7 @@ "apihelp-upload-param-async": "Realizar de forma asíncrona las operaciones de archivo potencialmente grandes cuando sea posible.", "apihelp-upload-example-url": "Subir desde una URL.", "apihelp-upload-example-filekey": "Completar una subida que falló debido a advertencias.", - "apihelp-userrights-description": "Cambiar la pertenencia a grupos de un usuario.", + "apihelp-userrights-summary": "Cambiar la pertenencia a grupos de un usuario.", "apihelp-userrights-param-user": "Nombre de usuario.", "apihelp-userrights-param-userid": "ID de usuario.", "apihelp-userrights-param-add": "Agregar el usuario a estos grupos, o, si ya es miembro, actualizar la fecha de expiración de su pertenencia a ese grupo.", @@ -1289,14 +1341,15 @@ "apihelp-userrights-example-user": "Agregar al usuario FooBot al grupo bot y eliminarlo de los grupos sysop y bureaucrat.", "apihelp-userrights-example-userid": "Añade el usuario con identificador 123 al grupo bot, y lo borra de los grupos sysop y bureaucrat.", "apihelp-userrights-example-expiry": "Añadir al usuario SometimeSysop al grupo sysop por 1 mes.", - "apihelp-validatepassword-description": "Valida una contraseña contra las políticas de contraseñas del wiki.\n\nLa validez es Good si la contraseña es aceptable, Change y la contraseña se puede usar para iniciar sesión pero debe cambiarse o Invalid si la contraseña no se puede usar.", + "apihelp-validatepassword-summary": "Valida una contraseña contra las políticas de contraseñas del wiki.", + "apihelp-validatepassword-extended-description": "La validez es Good si la contraseña es aceptable, Change y la contraseña se puede usar para iniciar sesión pero debe cambiarse o Invalid si la contraseña no se puede usar.", "apihelp-validatepassword-param-password": "Contraseña para validar.", "apihelp-validatepassword-param-user": "Nombre de usuario, para pruebas de creación de cuentas. El usuario nombrado no debe existir.", "apihelp-validatepassword-param-email": "Dirección de correo electrónico, para pruebas de creación de cuentas.", "apihelp-validatepassword-param-realname": "Nombre real, para pruebas de creación de cuentas.", "apihelp-validatepassword-example-1": "Validar la contraseña foobar para el usuario actual.", "apihelp-validatepassword-example-2": "Validar la contraseña qwerty para la creación del usuario Example.", - "apihelp-watch-description": "Añadir o borrar páginas de la lista de seguimiento del usuario actual.", + "apihelp-watch-summary": "Añadir o borrar páginas de la lista de seguimiento del usuario actual.", "apihelp-watch-param-title": "La página que seguir o dejar de seguir. Usa $1titles en su lugar.", "apihelp-watch-param-unwatch": "Si se define, en vez de seguir la página, se dejará de seguir.", "apihelp-watch-example-watch": "Vigilar la página Main Page.", @@ -1304,25 +1357,26 @@ "apihelp-watch-example-generator": "Seguir las primeras páginas del espacio de nombres principal.", "apihelp-format-example-generic": "Devolver el resultado de la consulta en formato $1.", "apihelp-format-param-wrappedhtml": "Devolver el HTML con resaltado sintáctico y los módulos ResourceLoader asociados en forma de objeto JSON.", - "apihelp-json-description": "Extraer los datos de salida en formato JSON.", + "apihelp-json-summary": "Extraer los datos de salida en formato JSON.", "apihelp-json-param-callback": "Si se especifica, envuelve la salida dentro de una llamada a una función dada. Por motivos de seguridad, cualquier dato específico del usuario estará restringido.", "apihelp-json-param-utf8": "Si se especifica, codifica la mayoría (pero no todos) de los caracteres no pertenecientes a ASCII como UTF-8 en lugar de reemplazarlos por secuencias de escape hexadecimal. Toma el comportamiento por defecto si formatversion no es 1.", "apihelp-json-param-ascii": "Si se especifica, codifica todos los caracteres no pertenecientes a ASCII mediante secuencias de escape hexadecimal. Toma el comportamiento por defecto si formatversion no es 1.", "apihelp-json-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves * para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utiliza el último formato (actualmente 2). Puede cambiar sin aviso.", - "apihelp-jsonfm-description": "Producir los datos de salida en formato JSON (con resaltado sintáctico en HTML).", - "apihelp-none-description": "No extraer nada.", - "apihelp-php-description": "Extraer los datos de salida en formato serializado PHP.", + "apihelp-jsonfm-summary": "Producir los datos de salida en formato JSON (con resaltado sintáctico en HTML).", + "apihelp-none-summary": "No extraer nada.", + "apihelp-php-summary": "Extraer los datos de salida en formato serializado PHP.", "apihelp-php-param-formatversion": "Formato de salida:\n;1: Formato retrocompatible (booleanos con estilo XML, claves * para nodos de contenido, etc.).\n;2: Formato moderno experimental. ¡Atención, las especificaciones pueden cambiar!\n;latest: Utilizar el último formato (actualmente 2). Puede cambiar sin aviso.", - "apihelp-phpfm-description": "Producir los datos de salida en formato PHP serializado (con resaltado sintáctico en HTML).", - "apihelp-rawfm-description": "Extraer los datos de salida, incluidos los elementos de depuración, en formato JSON (embellecido en HTML).", - "apihelp-xml-description": "Producir los datos de salida en formato XML.", + "apihelp-phpfm-summary": "Producir los datos de salida en formato PHP serializado (con resaltado sintáctico en HTML).", + "apihelp-rawfm-summary": "Extraer los datos de salida, incluidos los elementos de depuración, en formato JSON (embellecido en HTML).", + "apihelp-xml-summary": "Producir los datos de salida en formato XML.", "apihelp-xml-param-xslt": "Si se especifica, añade la página nombrada como una hoja de estilo XSL. El valor debe ser un título en el espacio de nombres {{ns:MediaWiki}} que termine en .xsl.", "apihelp-xml-param-includexmlnamespace": "Si se especifica, añade un espacio de nombres XML.", - "apihelp-xmlfm-description": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).", + "apihelp-xmlfm-summary": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).", "api-format-title": "Resultado de la API de MediaWiki", - "api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro format para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea format=$2.\n\nPara obtener más información, consulta la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].", - "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.", + "api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro format para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea format=$2.\n\nPara obtener más información, consulta la [[mw:Special:MyLanguage/API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].", + "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:Special:MyLanguage/API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.", "api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.", + "api-login-fail-badsessionprovider": "No se puede acceder mientras esté utilizándose $1.", "api-pageset-param-titles": "Una lista de títulos en los que trabajar.", "api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.", "api-pageset-param-revids": "Una lista de identificadores de revisiones en las que trabajar.", @@ -1366,8 +1420,8 @@ "api-help-param-multi-all": "Para especificar todos los valores, utiliza $1.", "api-help-param-default": "Predeterminado: $1", "api-help-param-default-empty": "Predeterminado: (vacío)", - "api-help-param-disabled-in-miser-mode": "Deshabilitado debido al [[mw:Manual:$wgMiserMode|modo avaro]].", - "api-help-param-limited-in-miser-mode": "Nota: Debido al [[mw:Manual:$wgMiserMode|modo avaro]], usar esto puede dar lugar a que se devuelvan menos de $1limit antes de continuar. En casos extremos, podrían devolverse cero resultados.", + "api-help-param-disabled-in-miser-mode": "Deshabilitado debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]].", + "api-help-param-limited-in-miser-mode": "strong>Nota:
    Debido al [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avaro]], usar esto puede dar lugar a que se devuelvan menos de $1limit antes de continuar. En casos extremos, podrían devolverse cero resultados.", "api-help-param-direction": "En qué sentido hacer la enumeración:\n;newer: De más antiguos a más recientes. Nota: $1start debe ser anterior a $1end.\n;older: De más recientes a más antiguos (orden predefinido). Nota: $1start debe ser posterior a $1end.", "api-help-param-continue": "Cuando haya más resultados disponibles, utiliza esto para continuar.", "api-help-param-no-description": "(sin descripción)", @@ -1421,9 +1475,10 @@ "apierror-cantsend": "No estás conectado, no tienes una dirección de correo electrónico confirmada o no tienes permiso para enviar correo electrónico a otros usuarios, así que no puedes enviar correo electrónico.", "apierror-cantundelete": "No se ha podido restaurar: puede que las revisiones solicitadas no existan o que ya se hayan restaurado.", "apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.", - "apierror-compare-inputneeded": "Se necesita un título, un identificador de página o un número de revisión tanto para el parámetro from como para el parámetro to.", "apierror-contentserializationexception": "La serialización de contenido falló: $1", - "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobytes|kilobytes}}.", + "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobyte|kilobytes}}.", + "apierror-copyuploadbaddomain": "No se permite realizar cargas a partir de este dominio.", + "apierror-copyuploadbadurl": "No se permite realizar cargas a partir de este URL.", "apierror-create-titleexists": "Los títulos existentes no se pueden proteger con create.", "apierror-csp-report": "Error de procesamiento del informe CSP: $1.", "apierror-databaseerror": "[$1] Error en la consulta de la base de datos.", @@ -1493,6 +1548,7 @@ "apierror-nosuchuserid": "No hay ningún usuario con ID $1.", "apierror-notarget": "No has especificado un destino válido para esta acción.", "apierror-notpatrollable": "La revisión r$1 no se puede patrullar por ser demasiado antigua.", + "apierror-offline": "No se puede continuar debido a problemas de conectividad de la red. Asegúrate de que tienes una conexión activa a internet e inténtalo de nuevo.", "apierror-opensearch-json-warnings": "No se pueden representar los avisos en formato JSON de OpenSearch.", "apierror-pagecannotexist": "En este espacio de nombres no se permiten páginas reales.", "apierror-pagedeleted": "La página ha sido borrada en algún momento desde que obtuviste su marca de tiempo.", @@ -1512,9 +1568,11 @@ "apierror-reauthenticate": "No te has autentificado recientemente en esta sesión. Por favor, vuelve a autentificarte.", "apierror-revdel-mutuallyexclusive": "No se puede usar el mismo campo en hide y show.", "apierror-revdel-paramneeded": "Se requiere al menos un valor para hide y/o show.", + "apierror-revisions-badid": "No se encontró ninguna revisión para el parámetro $1.", "apierror-revisions-norevids": "El parámetro revids no se puede utilizar junto con las opciones de lista ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start y $1end).", "apierror-revisions-singlepage": "Se utilizó titles, pageids o un generador para proporcionar múltiples páginas, pero los parámetros $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start y $1end solo se pueden utilizar en una sola página.", "apierror-revwrongpage": "r$1 no es una revisión de $2.", + "apierror-searchdisabled": "Se ha desactivado la búsqueda de «$1».", "apierror-sectionreplacefailed": "No se ha podido combinar la sección actualizada.", "apierror-sectionsnotsupported": "Las secciones no son compatibles con el modelo de contenido $1.", "apierror-sectionsnotsupported-what": "Las secciones no son compatibles con $1.", @@ -1526,6 +1584,7 @@ "apierror-stashwrongowner": "Propietario incorrecto: $1", "apierror-systemblocked": "Has sido bloqueado automáticamente por el software MediaWiki.", "apierror-templateexpansion-notwikitext": "La expansión de plantillas solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.", + "apierror-timeout": "El servidor no respondió en el plazo previsto.", "apierror-unknownaction": "La acción especificada, $1, no está reconocida.", "apierror-unknownerror-editpage": "Error de EditPage desconocido: $1.", "apierror-unknownerror-nocode": "Error desconocido.", diff --git a/includes/api/i18n/et.json b/includes/api/i18n/et.json index 15ddb3af44..64107fc0e7 100644 --- a/includes/api/i18n/et.json +++ b/includes/api/i18n/et.json @@ -4,7 +4,7 @@ "Pikne" ] }, - "apihelp-query+imageinfo-description": "Tagastab failiteabe ja üleslaadimisajaloo.", + "apihelp-query+imageinfo-summary": "Tagastab failiteabe ja üleslaadimisajaloo.", "apihelp-query+imageinfo-param-prop": "Millist teavet faili kohta hankida:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Lisab üles laaditud versiooni ajatempli.", "apihelp-query+imageinfo-paramvalue-prop-user": "Lisab kasutaja, kes iga failiversiooni üles laadis.", diff --git a/includes/api/i18n/eu.json b/includes/api/i18n/eu.json index be2f9a0aa6..1e03f5d43e 100644 --- a/includes/api/i18n/eu.json +++ b/includes/api/i18n/eu.json @@ -9,21 +9,21 @@ }, "apihelp-main-param-action": "Zein ekintza burutuko da.", "apihelp-main-param-format": "Irteerako formatua.", - "apihelp-block-description": "Blokeatu erabiltzaile bat.", + "apihelp-block-summary": "Blokeatu erabiltzaile bat.", "apihelp-block-param-reason": "Blokeatzeko arrazoia.", - "apihelp-createaccount-description": "Erabiltzaile kontu berria sortu.", + "apihelp-createaccount-summary": "Erabiltzaile kontu berria sortu.", "apihelp-createaccount-param-name": "Erabiltzaile izena.", "apihelp-createaccount-param-email": "Erabiltzailearen helbide elektronikoa (aukerakoa).", "apihelp-createaccount-param-realname": "Erabiltzailearen benetako izena (aukerakoa).", - "apihelp-delete-description": "Orrialde bat ezabatu.", + "apihelp-delete-summary": "Orrialde bat ezabatu.", "apihelp-delete-example-simple": "Ezabatu Main Page.", - "apihelp-disabled-description": "Modulu hau ezgaitu da.", - "apihelp-edit-description": "Orrialdeak sortu eta aldatu.", + "apihelp-disabled-summary": "Modulu hau ezgaitu da.", + "apihelp-edit-summary": "Orrialdeak sortu eta aldatu.", "apihelp-edit-param-sectiontitle": "Atal berri baten titulua.", "apihelp-edit-param-text": "Orrialdearen edukia.", "apihelp-edit-param-minor": "Aldaketa txikia.", "apihelp-edit-example-edit": "Orrialde bat aldatu", - "apihelp-emailuser-description": "Erabiltzaileari e-maila bidali", + "apihelp-emailuser-summary": "Erabiltzaileari e-maila bidali", "apihelp-emailuser-param-subject": "Gaiaren goiburua.", "apihelp-emailuser-param-text": "Mezuaren gorputza.", "apihelp-expandtemplates-param-title": "Orrialdearen izenburua.", @@ -43,28 +43,28 @@ "apihelp-feedrecentchanges-example-30days": "Erakutsi aldaketa berriak 30 egunez", "apihelp-filerevert-param-comment": "Iruzkina igo.", "apihelp-help-example-recursive": "Laguntza guztia orrialde batean.", - "apihelp-imagerotate-description": "Irudi bat edo gehiago biratu.", + "apihelp-imagerotate-summary": "Irudi bat edo gehiago biratu.", "apihelp-import-param-summary": "Inportazioaren laburpena.", "apihelp-import-param-xml": "XML fitxategia igo da.", "apihelp-login-param-name": "Erabiltzaile izena.", "apihelp-login-param-password": "Pasahitza.", "apihelp-login-param-domain": "Domeinua (hautazkoa).", "apihelp-login-example-login": "Hasi saioa", - "apihelp-move-description": "Orrialde bat mugitu", + "apihelp-move-summary": "Orrialde bat mugitu", "apihelp-move-param-reason": "Berrizenpenaren arrazoia.", "apihelp-move-param-noredirect": "Birzuzenketarik ez sortu.", "apihelp-move-param-ignorewarnings": "Edozein ohar ezikusi.", "apihelp-opensearch-param-namespace": "Bilatzeko izen-tarteak.", "apihelp-opensearch-param-format": "Irteerako formatua.", "apihelp-options-example-reset": "Berrezarri hobespen guztiak.", - "apihelp-paraminfo-description": "API moduluei buruzko informazioa eskuratu.", + "apihelp-paraminfo-summary": "API moduluei buruzko informazioa eskuratu.", "apihelp-parse-param-summary": "Analizatzeko laburpena.", "apihelp-protect-param-reason": "Babesteko edo babesa kentzeko zergatia.", "apihelp-protect-example-protect": "Orrialde bat babestu", - "apihelp-query+allcategories-description": "Kategoria guztiak zenbakitu.", + "apihelp-query+allcategories-summary": "Kategoria guztiak zenbakitu.", "apihelp-query+allusers-param-witheditsonly": "Bakarrik zerrendatu aldaketak egin dituzten erabiltzaileak.", "apihelp-query+allusers-param-activeusers": "Bakarrik zerrendatu azken {{PLURAL:$1|eguneko|$1 egunetako}} erabiltzaile aktiboak.", - "apihelp-query+blocks-description": "Zerrendatu blokeatutako erabiltzaile eta IP helbide guztiak.", + "apihelp-query+blocks-summary": "Zerrendatu blokeatutako erabiltzaile eta IP helbide guztiak.", "apihelp-query+imageinfo-param-urlheight": "$1urlwidth-en antzekoa.", "apihelp-query+imageusage-example-simple": "Erakutsi [[:File:Albert Einstein Head.jpg]] darabilten orriak", "apihelp-query+langlinks-param-inlanguagecode": "Hizkuntza izenak aurkitzeko hizkuntza kodea.", diff --git a/includes/api/i18n/fa.json b/includes/api/i18n/fa.json index 2ae81d456e..36ab4c9f2f 100644 --- a/includes/api/i18n/fa.json +++ b/includes/api/i18n/fa.json @@ -17,7 +17,7 @@ "Alifakoor" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n
    \n\nوضعیت: تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\nدرخواست‌های معیوب: وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.\n\nآزمایش: برای انجام درخواست‌های API آزمایشی [[Special:ApiSandbox]] را ببینید.", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n
    \n\nوضعیت: تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\nدرخواست‌های معیوب: وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.\n\nآزمایش: برای انجام درخواست‌های API آزمایشی [[Special:ApiSandbox]] را ببینید.", "apihelp-main-param-action": "کدام عملیات را انجام دهد.", "apihelp-main-param-format": "فرمت خروجی.", "apihelp-main-param-smaxage": "تنظيم s-maxage سرآیند کنترل حافضهٔ نهان HTTP بر اين تعداد ثانيه.", @@ -25,7 +25,7 @@ "apihelp-main-param-requestid": "هر مقداری که در اینجا وارد شود در پاسخ گنجانده می‌شود. ممکن است برای تمايز بين درخواست‌ها بکار رود.", "apihelp-main-param-servedby": "نام ميزبانی که درخواست را سرويس داده در نتايج گنجانده شود.", "apihelp-main-param-curtimestamp": "برچسب زمان کنونی را در نتیجه قرار دهید.", - "apihelp-block-description": "بستن کاربر", + "apihelp-block-summary": "بستن کاربر", "apihelp-block-param-user": "نام کاربری، آدرس آی پی یا محدوده آی پی موردنظر شما برای بستن.", "apihelp-block-param-reason": "دلیل بسته‌شدن", "apihelp-block-param-anononly": "فقط بستن کاربران ناشناس (مانند غیرفعال کردن ویرایش‌های ناشناس این آی‌پی).", @@ -38,16 +38,17 @@ "apihelp-block-param-watchuser": "صفحه‌های کاربر و بحث کاربر نشانی آی‌پی یا کاربر را پی‌گیری کنید.", "apihelp-block-example-ip-simple": "آی‌پی ۱۹۲٫۰٫۲٫۵ را برای سه روز همراه دلیل برخورد اول ببندید", "apihelp-block-example-user-complex": "بستن کاربرخرابکار به شکل نامحدود به علت خرابکاری، همچنين جلوگيری از ايجاد حساب جديد و ارسال ايميل.", - "apihelp-changeauthenticationdata-description": "تغيير اطلاعات احراز هويت برای کاربر فعلی", + "apihelp-changeauthenticationdata-summary": "تغيير اطلاعات احراز هويت برای کاربر فعلی", "apihelp-changeauthenticationdata-example-password": "تلاش برای تغيير گذرواژه فعلی کاربر به نمونهٔ گذرواژه.", "apihelp-checktoken-param-type": "نوع توکنی که دارد آزمایش می‌شود.", "apihelp-checktoken-param-token": "توکن برای تست", "apihelp-checktoken-param-maxtokenage": "حداکثر عمر توکن به ثانیه.", "apihelp-checktoken-example-simple": "تست اعتبار یک توکن csrf", - "apihelp-clearhasmsg-description": "پرچم hasmsg را برای کاربر جاری پاک کن.", + "apihelp-clearhasmsg-summary": "پرچم hasmsg را برای کاربر جاری پاک کن.", "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم hasmsg برای کاربر جاری", "apihelp-clientlogin-example-login": "شروع فرآیند ورود به ويکی به عنوان کاربر نمونه با گذرواژهٔ نمونهٔ گذرواژه", - "apihelp-compare-description": "تفاوت بین ۲ صفحه را بیابید.\n\nشما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.", + "apihelp-compare-summary": "تفاوت بین ۲ صفحه را بیابید.", + "apihelp-compare-extended-description": "شما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.", "apihelp-compare-param-fromtitle": "عنوان اول برای مقایسه.", "apihelp-compare-param-fromid": "شناسه صفحه اول برای مقایسه.", "apihelp-compare-param-fromrev": "نسخه اول برای مقایسه.", @@ -55,7 +56,7 @@ "apihelp-compare-param-toid": "شناسه صفحه دوم برای مقایسه.", "apihelp-compare-param-torev": "نسخه دوم برای مقایسه.", "apihelp-compare-example-1": "ایجاد تفاوت بین نسخه 1 و 2", - "apihelp-createaccount-description": "ایجاد حساب کاربری", + "apihelp-createaccount-summary": "ایجاد حساب کاربری", "apihelp-createaccount-param-name": "نام کاربری.", "apihelp-createaccount-param-password": "رمز عبور (نادیده گرفته می‌شود اگر $1mailpassword تنظیم شده‌باشد).", "apihelp-createaccount-param-domain": "دامنه برای احراز هویت خارجی (اختیاری).", @@ -65,7 +66,7 @@ "apihelp-createaccount-param-reason": "دلیل اختیاری برای ایجاد حساب کاربری جهت قرارگرفتن در سیاهه‌ها.", "apihelp-createaccount-example-pass": "ایجاد کاربر testuser همراه رمز عبور test123", "apihelp-createaccount-example-mail": "ایجاد کاربر testmailuser و ارسال یک رمز عبور تصادفی به ای‌میل.", - "apihelp-delete-description": "حذف صفحه", + "apihelp-delete-summary": "حذف صفحه", "apihelp-delete-param-title": "عنوان صفحه‌ای که قصد حذفش را دارید. نمی‌تواند در کنار $1pageid استفاده شود.", "apihelp-delete-param-pageid": "شناسه صفحه‌ای که قصد حذفش را دارید. نمی‌تواند در کنار $1title استفاده شود.", "apihelp-delete-param-reason": "دلیل برای حذف. اگر تنظیم نشود، یک دلیل خودکار ساخته‌شده استفاده می‌شود.", @@ -73,8 +74,8 @@ "apihelp-delete-param-unwatch": "صفحه را از پی‌گیری‌تان حذف کنید.", "apihelp-delete-example-simple": "حذف Main Page.", "apihelp-delete-example-reason": "حذف صفحهٔ اصلی همراه دلیل آماده‌سازی برای انتقال", - "apihelp-disabled-description": "این پودمان غیرفعال شده است.", - "apihelp-edit-description": "ایجاد و ویرایش صفحه", + "apihelp-disabled-summary": "این پودمان غیرفعال شده است.", + "apihelp-edit-summary": "ایجاد و ویرایش صفحه", "apihelp-edit-param-title": "عنوان صفحه‌ای که قصد ویرایشش را دارید. نمی‌تواند در کنار $1pageid استفاده شود.", "apihelp-edit-param-pageid": "شناسه صفحهٔ صفحه‌ای که می‌خواهید ویرایشش کنید. نمی‌تواند در کنار $1title استفاده شود.", "apihelp-edit-param-section": "شماره بخش. ۰ برای بخش بالا، «تازه» برای یک بخش تازه.", @@ -96,16 +97,16 @@ "apihelp-edit-param-token": "بلیط باید همیشه به عنوان اخرین پارامتر، یا دست کم بعد از پارامتر $1text فرستاده شود.", "apihelp-edit-example-edit": "ویرایش صفحه", "apihelp-edit-example-undo": "واگردانی نسخه‌های ۱۳۵۷۹ تا ۱۳۵۸۵ با خلاصهٔ خودکار.", - "apihelp-emailuser-description": "ایمیل به کاربر", + "apihelp-emailuser-summary": "ایمیل به کاربر", "apihelp-emailuser-param-target": "کاربر برای ارسال ایمیل به وی.", "apihelp-emailuser-param-subject": "موضوع هدر.", "apihelp-emailuser-param-text": "متن رایانه.", "apihelp-emailuser-param-ccme": "ارسال یک نسخه از رایانه به شما.", - "apihelp-expandtemplates-description": "گسترش همه الگوها در ویکی نبشته", + "apihelp-expandtemplates-summary": "گسترش همه الگوها در ویکی نبشته", "apihelp-expandtemplates-param-title": "عنوان صفحه", "apihelp-expandtemplates-param-text": "تبدیل برای ویکی‌متن.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "ویکی‌متن گسترش‌یافته.", - "apihelp-feedcontributions-description": "خوراک مشارکت‌های یک کاربر را برمی‌گرداند.", + "apihelp-feedcontributions-summary": "خوراک مشارکت‌های یک کاربر را برمی‌گرداند.", "apihelp-feedcontributions-param-feedformat": "فرمت خوراک.", "apihelp-feedcontributions-param-namespace": "فیلتر شدن مشارکتها براساس فضای نام.", "apihelp-feedcontributions-param-year": "از سال (و پیش از آن).", @@ -116,7 +117,7 @@ "apihelp-feedcontributions-param-newonly": "فقط نمایش ویرایش‌هایی که تولید‌های صفحه هستند.", "apihelp-feedcontributions-param-showsizediff": "نمایش تفاوت حجم تغییرات بین نسخه‌ها.", "apihelp-feedcontributions-example-simple": "مشارکت‌های [[کاربر:نمونه]] را برگردان", - "apihelp-feedrecentchanges-description": "خوراک تغییرات اخیر را برمی‌گرداند.", + "apihelp-feedrecentchanges-summary": "خوراک تغییرات اخیر را برمی‌گرداند.", "apihelp-feedrecentchanges-param-feedformat": "فرمت خوراک.", "apihelp-feedrecentchanges-param-namespace": "فضای نام برای محدودکردن نتایج به.", "apihelp-feedrecentchanges-param-invert": "همهٔ فضاهای نام به جز انتخاب‌شده‌ها.", @@ -135,23 +136,23 @@ "apihelp-feedrecentchanges-param-showlinkedto": "نمایش ویرایش‌ها بر روی صفحات پیوند داده شده به صفحات انتخاب شده.", "apihelp-feedrecentchanges-example-simple": "نمایش تغییرات اخیر", "apihelp-feedrecentchanges-example-30days": "نمایش تغییرات اخیر در 30 روز اخیر", - "apihelp-feedwatchlist-description": "برگرداندن فهرست پیگیری‌های خوراک.", + "apihelp-feedwatchlist-summary": "برگرداندن فهرست پیگیری‌های خوراک.", "apihelp-feedwatchlist-param-feedformat": "فرمت خوراک.", "apihelp-feedwatchlist-param-linktosections": "اگر ممکن است به طور مستقیم به بخش‌های تغییریافته پیوند دهید.", "apihelp-feedwatchlist-example-default": "نمایش خوراک فهرست پی‌گیری", "apihelp-feedwatchlist-example-all6hrs": "همهٔ تغییرات ۶ ساعت گذشته در صفحه‌های پی‌گیری را نمایش دهید", - "apihelp-filerevert-description": "واگردانی فایل به یک نسخه قدیمی", + "apihelp-filerevert-summary": "واگردانی فایل به یک نسخه قدیمی", "apihelp-filerevert-param-filename": "نام پروندهٔ مقصد، بدون پیشوند پرونده:.", "apihelp-filerevert-param-comment": "ارسال دیدگاه.", "apihelp-filerevert-param-archivename": "نام بایگانی بازبینی برای برگرداندن.", "apihelp-filerevert-example-revert": "برگرداندن Wiki.png به نسخهٔ 2011-03-05T15:27:40Z.", - "apihelp-help-description": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.", + "apihelp-help-summary": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.", "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.", "apihelp-help-example-main": "راهنما برای پودمان اصلی", "apihelp-help-example-recursive": "همهٔ راهنما در یک صفحه", - "apihelp-help-example-help": "راهنما برای خود ماژول راهنما", - "apihelp-help-example-query": "راهنما برای دو زیر پودمان کوئری", - "apihelp-imagerotate-description": "چرخاندن یک یا چند تصویر", + "apihelp-help-example-help": "راهنمایی برای خود راهنما.", + "apihelp-help-example-query": "راهنما برای دو زیرپودمانِ پرسمان", + "apihelp-imagerotate-summary": "چرخاندن یک یا چند تصویر", "apihelp-imagerotate-param-rotation": "درجه برای چرخاندن تصویر در جهت ساعت‌گرد.", "apihelp-imagerotate-example-simple": "چرخاندن ۹۰ درجه برای File:Example.png", "apihelp-imagerotate-example-generator": "چرخاندن ۱۸۰ درجه برای همهٔ تصاویر موجود در Category:Flip", @@ -169,10 +170,10 @@ "apihelp-login-param-token": "بلیط ورود به سامانه که در اولین درخواست دریافت شد.", "apihelp-login-example-gettoken": "دریافت توکن ورود", "apihelp-login-example-login": "ورود", - "apihelp-logout-description": "خروج به همراه پاک نمودن اطلاعات این نشست", + "apihelp-logout-summary": "خروج به همراه پاک نمودن اطلاعات این نشست", "apihelp-logout-example-logout": "خروج کاربر فعلی", - "apihelp-mergehistory-description": "ادغام تاریخچه صفحات", - "apihelp-move-description": "انتقال صفحه", + "apihelp-mergehistory-summary": "ادغام تاریخچه صفحات", + "apihelp-move-summary": "انتقال صفحه", "apihelp-move-param-to": "عنوانی که قصد دارید صفحه را به آن نام تغییر دهید.", "apihelp-move-param-reason": "دلیل انتقال", "apihelp-move-param-movetalk": "صفحهٔ بحث را تغییرنام دهید، اگر وجوددارد.", @@ -181,7 +182,7 @@ "apihelp-move-param-watch": "صفحه و تغییرمسیر را به پی‌گیری کاربر کنونی بیافزایید.", "apihelp-move-param-unwatch": "صفحه و تغییرمسیر را از پی‌گیری کاربر کنونی حذف کنید.", "apihelp-move-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.", - "apihelp-opensearch-description": "جستجو در ویکی بااستفاده از پروتکل اوپن‌سرچ.", + "apihelp-opensearch-summary": "جستجو در ویکی بااستفاده از پروتکل اوپن‌سرچ.", "apihelp-opensearch-param-search": "جستجوی رشته.", "apihelp-opensearch-param-limit": "حداکثر تعداد نتایج برای بازگرداندن.", "apihelp-opensearch-param-namespace": "فضاهای نامی برای جستجو", @@ -194,10 +195,10 @@ "apihelp-parse-example-page": "تجزیه یک صفحه.", "apihelp-parse-example-text": "تجزیه متن ویکی.", "apihelp-parse-example-summary": "تجزیه خلاصه.", - "apihelp-patrol-description": "گشت‌زنی یک صفحه یا نسخهٔ ویرایشی.", + "apihelp-patrol-summary": "گشت‌زنی یک صفحه یا نسخهٔ ویرایشی.", "apihelp-patrol-example-rcid": "گشت‌زنی یک تغییر اخیر", "apihelp-patrol-example-revid": "گشت‌زدن یک نسخه", - "apihelp-protect-description": "تغییر سطح محافظت صفحه", + "apihelp-protect-summary": "تغییر سطح محافظت صفحه", "apihelp-protect-param-reason": "دلیل برای (عدم) حفاظت.", "apihelp-protect-example-protect": "محافظت از صفحه", "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به all.", @@ -214,7 +215,7 @@ "apihelp-query+allfileusages-example-unique": "فهرست پرونده‌های با عنوان یکتا", "apihelp-query+allfileusages-example-unique-generator": "گرفتن عنوان همهٔ پرونده‌ها، برچسب زدن موارد گم شده", "apihelp-query+allfileusages-example-generator": "گرفتن صفحاتی که دارای پرونده هستند", - "apihelp-query+allimages-description": "متوالی شمردن همهٔ تصاویر.", + "apihelp-query+allimages-summary": "متوالی شمردن همهٔ تصاویر.", "apihelp-query+allimages-param-sort": "خصوصیت برای مرتب‌سازی بر پایه آن", "apihelp-query+allimages-param-dir": "جهتی که باید فهرست شود.", "apihelp-query+allimages-param-minsize": "محدودکردن به صفحه‌هایی که دست کم این تعداد بایت دارند.", @@ -226,7 +227,7 @@ "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.", "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.", "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.", - "apihelp-query+allrevisions-description": "فهرست همه نسخه‌ها", + "apihelp-query+allrevisions-summary": "فهرست همه نسخه‌ها", "apihelp-query+mystashedfiles-param-limit": "تعداد پرونده‌هایی که باید بگیرد.", "apihelp-query+allusers-param-dir": "جهتی که باید مرتب شود.", "apihelp-query+allusers-paramvalue-prop-rights": "فهرست دسترسی‌هایی که کاربر دارد.", @@ -235,13 +236,13 @@ "apihelp-query+allusers-param-limit": "تعداد کل نام‌های کاربری برای بازگرداندن.", "apihelp-query+allusers-param-witheditsonly": "فقط کاربرانی را که ويرایش داشته اند ليست کن", "apihelp-query+allusers-param-activeusers": "فقط کاربرانی را ليست کن که در $1 روز گذشته فعاليت داشته‌اند", - "apihelp-query+authmanagerinfo-description": "بازیابی اطلاعات در مورد وضعيت فعلی احراز هويت", + "apihelp-query+authmanagerinfo-summary": "بازیابی اطلاعات در مورد وضعيت فعلی احراز هويت", "apihelp-query+backlinks-example-simple": "نمایش پیوندها به Main page.", "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها", "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.", "apihelp-query+categories-param-limit": "چه میزان رده بازگردانده شود.", "apihelp-query+categories-param-categories": "فقط این رده‌ها فهرست شود. کاربردی برای بررسی وجود یک صفحهٔ مشخص در یک ردهٔ مشخص.", - "apihelp-query+categorymembers-description": "فهرست‌کردن همهٔ صفحه‌ها در یک ردهٔ مشخص‌شده.", + "apihelp-query+categorymembers-summary": "فهرست‌کردن همهٔ صفحه‌ها در یک ردهٔ مشخص‌شده.", "apihelp-query+categorymembers-paramvalue-prop-ids": "افزودن شناسه صفحه", "apihelp-query+categorymembers-param-sort": "خصوصیت برای مرتب‌سازی", "apihelp-query+categorymembers-param-dir": "جهت مرتب شدن", @@ -258,7 +259,7 @@ "apihelp-query+imageinfo-param-end": "زمان توقف فهرست کردن.", "apihelp-query+imageinfo-param-urlheight": "مشابه $1urlwidth.", "apihelp-query+images-param-limit": "تعداد پرونده‌هایی که باید بازگرداند.", - "apihelp-query+info-description": "دریافت اطلاعات سادهٔ صفحه.", + "apihelp-query+info-summary": "دریافت اطلاعات سادهٔ صفحه.", "apihelp-query+iwbacklinks-param-prefix": "پیشوند میان‌ویکی.", "apihelp-query+iwbacklinks-param-title": "پیوند میان‌ویکی برای جستجو. باید همراه $1blprefix استفاده شود.", "apihelp-query+iwbacklinks-param-limit": "تعداد صفحه‌ها برای بازگرداندن.", @@ -273,7 +274,7 @@ "apihelp-query+linkshere-paramvalue-prop-redirect": "اگر صفحه تغییر مسیر بود برچسب بزن.", "apihelp-query+linkshere-param-namespace": "فقط صفحات این فضای نام را فهرست کن.", "apihelp-query+linkshere-param-limit": "تعداد برای بازگرداندن.", - "apihelp-query+logevents-description": "دریافت رویدادها از سیاهه‌ها.", + "apihelp-query+logevents-summary": "دریافت رویدادها از سیاهه‌ها.", "apihelp-query+logevents-param-prop": "خصوصیتی که باید گرفته شود.", "apihelp-query+logevents-paramvalue-prop-ids": "افزودن شناسه سیاهه رویداد.", "apihelp-query+pageswithprop-paramvalue-prop-ids": "افزودن شناسه صفحه", @@ -303,7 +304,7 @@ "apihelp-query+siteinfo-param-prop": "اطلاعاتی که باید گرفته‌شود:", "apihelp-query+siteinfo-paramvalue-prop-statistics": "بازرگرداندن آمار سایت.", "apihelp-query+siteinfo-example-simple": "دریافت اطلاعات سایت.", - "apihelp-query+tags-description": "فهرست تغییرات برچسب‌ها.", + "apihelp-query+tags-summary": "فهرست تغییرات برچسب‌ها.", "apihelp-query+tags-param-limit": "حداکثر تعداد برچسب‌ها برای فهرست شدن.", "apihelp-query+tags-param-prop": "خصوصیتی که باید گرفته شود:", "apihelp-query+tags-paramvalue-prop-name": "افزودن نام برچسب.", @@ -313,7 +314,7 @@ "apihelp-stashedit-param-contentmodel": "مدل محتوایی محتوای جدید", "apihelp-stashedit-param-summary": "خلاصه تغییرات.", "apihelp-tag-param-reason": "دلیل تغییر.", - "apihelp-unblock-description": "بازکردن کاربر.", + "apihelp-unblock-summary": "بازکردن کاربر.", "apihelp-undelete-param-reason": "دلیل احیا.", "apihelp-upload-param-filename": "نام پرونده مقصد.", "apihelp-upload-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.", @@ -322,7 +323,7 @@ "apihelp-userrights-param-user": "نام کاربری.", "apihelp-userrights-param-userid": "شناسه کاربر.", "apihelp-userrights-param-reason": "دلیل تغییر.", - "apihelp-none-description": "بیرون‌ریزی هیچ.", + "apihelp-none-summary": "بیرون‌ریزی هیچ.", "api-format-title": "نتیجه ای‌پی‌آی مدیاویکی", "api-help-main-header": "پودمان اصلی", "api-help-source": "منبع: $1", @@ -330,5 +331,6 @@ "api-help-param-limit": "بيش از $1 مجاز نيست", "api-help-param-limit2": "بيش از $1 (برای ربات‌ها $2) مجاز نيست", "api-help-param-default": "پیش‌فرض: $1", + "apierror-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.", "api-credits-header": "اعتبار" } diff --git a/includes/api/i18n/fi.json b/includes/api/i18n/fi.json index b2398af697..a21afb0527 100644 --- a/includes/api/i18n/fi.json +++ b/includes/api/i18n/fi.json @@ -12,7 +12,7 @@ }, "apihelp-main-param-action": "Mikä toiminto suoritetaan.", "apihelp-main-param-curtimestamp": "Sisällytä nykyinen aikaleima tulokseen.", - "apihelp-block-description": "Estä käyttäjä.", + "apihelp-block-summary": "Estä käyttäjä.", "apihelp-block-param-user": "Käyttäjä, IP-osoite tai IP-osoitealue, joka estetään.", "apihelp-block-param-expiry": "Päättymisaika. Voi olla suhteellinen (esim. 5 months tai 2 weeks) tai absoluuttinen (esim. 2014-09-18T12:34:56Z). Jos asetetaan infinite, indefinite tai never, esto ei pääty koskaan.", "apihelp-block-param-reason": "Eston syy.", @@ -27,19 +27,19 @@ "apihelp-block-example-ip-simple": "Estä IP-osoite 192.0.2.5 kolmeksi päiväksi syystä First strike.", "apihelp-block-example-user-complex": "Estä käyttäjä Vandal ikuisesti syystä Vandalism, sekä estä uusien käyttäjien luonti ja sähköpostin lähetys.", "apihelp-compare-param-fromtitle": "Ensimmäinen vertailtava otsikko.", - "apihelp-createaccount-description": "Luo uusi käyttäjätunnus.", + "apihelp-createaccount-summary": "Luo uusi käyttäjätunnus.", "apihelp-createaccount-param-name": "Käyttäjätunnus.", "apihelp-createaccount-param-email": "Käyttäjän sähköpostiosoite (valinnainen).", "apihelp-createaccount-param-realname": "Käyttäjän oikea nimi (valinnainen).", "apihelp-createaccount-example-pass": "Luo käyttäjä testuser salasanalla test123.", "apihelp-createaccount-example-mail": "Luo käyttäjä testmailuset ja lähetä sähköpostilla satunnaisesti luotu salasana.", - "apihelp-delete-description": "Poista sivu.", + "apihelp-delete-summary": "Poista sivu.", "apihelp-delete-param-watch": "Lisää sivu nykyisen käyttäjän tarkkailulistalle.", "apihelp-delete-param-unwatch": "Poista sivu nykyisen käyttäjän tarkkailulistalta.", "apihelp-delete-example-simple": "Poista Main Page.", "apihelp-delete-example-reason": "Poista Main Page syystä Preparing for move.", - "apihelp-disabled-description": "Tämä moduuli on poistettu käytöstä.", - "apihelp-edit-description": "Luo ja muokkaa sivuja.", + "apihelp-disabled-summary": "Tämä moduuli on poistettu käytöstä.", + "apihelp-edit-summary": "Luo ja muokkaa sivuja.", "apihelp-edit-param-text": "Sivun sisältö.", "apihelp-edit-param-minor": "Pieni muokkaus.", "apihelp-edit-param-notminor": "Ei-pieni muokkaus.", @@ -48,13 +48,13 @@ "apihelp-edit-param-watch": "Lisää sivu nykyisen käyttäjän tarkkailulistalle.", "apihelp-edit-param-unwatch": "Poista sivu nykyisen käyttäjän tarkkailulistalta.", "apihelp-edit-example-edit": "Muokkaa sivua.", - "apihelp-emailuser-description": "Lähetä sähköpostia käyttäjälle.", + "apihelp-emailuser-summary": "Lähetä sähköpostia käyttäjälle.", "apihelp-emailuser-param-target": "Käyttäjä, jolle lähetetään sähköpostia.", "apihelp-emailuser-param-subject": "Otsikko.", "apihelp-emailuser-param-text": "Sähköpostin sisältö.", "apihelp-emailuser-param-ccme": "Lähetä kopio tästä viestistä minulle.", "apihelp-emailuser-example-email": "Lähetä käyttäjälle WikiSysop sähköposti, jossa lukee Content.", - "apihelp-expandtemplates-description": "Laajentaa kaikki wikitekstin mallineet.", + "apihelp-expandtemplates-summary": "Laajentaa kaikki wikitekstin mallineet.", "apihelp-expandtemplates-param-title": "Sivun otsikko.", "apihelp-expandtemplates-param-text": "Muunnettava wikiteksti.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "Laajennettu wikiteksti.", @@ -75,20 +75,20 @@ "apihelp-feedrecentchanges-example-simple": "Näytä tuoreet muutokset.", "apihelp-filerevert-param-filename": "Kohteen nimi ilman File:-etuliitettä.", "apihelp-filerevert-param-comment": "Tallennuksen kommentti.", - "apihelp-imagerotate-description": "Käännä kuva tai kuvia.", + "apihelp-imagerotate-summary": "Käännä kuva tai kuvia.", "apihelp-imagerotate-example-simple": "Käännä kuvaa File:Example.png 90 astetta.", "apihelp-imagerotate-example-generator": "Käännä kaikkia kuvia luokassa Category:Flip 180 astetta.", "apihelp-login-param-name": "Käyttäjänimi.", "apihelp-login-param-password": "Salasana.", "apihelp-login-example-login": "Kirjaudu sisään.", - "apihelp-logout-description": "Kirjaudu ulos ja tyhjennä istunnon tiedot.", + "apihelp-logout-summary": "Kirjaudu ulos ja tyhjennä istunnon tiedot.", "apihelp-logout-example-logout": "Kirjaa nykyinen käyttäjä ulos.", "apihelp-managetags-example-create": "Luo merkkaus nimeltä spam syystä For use in edit patrolling", "apihelp-managetags-example-delete": "Poista merkkaus vandlaism syystä Misspelt", "apihelp-managetags-example-activate": "Ota käyttöön merkkaus nimeltä spam syystä For use in edit patrolling", "apihelp-managetags-example-deactivate": "Poista käytöstä merkkaus nimeltä spam syystä No longer required", - "apihelp-mergehistory-description": "Yhdistä sivujen muutoshistoriat.", - "apihelp-move-description": "Siirrä sivu.", + "apihelp-mergehistory-summary": "Yhdistä sivujen muutoshistoriat.", + "apihelp-move-summary": "Siirrä sivu.", "apihelp-move-param-noredirect": "Älä luo ohjausta.", "apihelp-move-param-watch": "Lisää sivu ja ohjaus nykyisen käyttäjän tarkkailulistalle.", "apihelp-move-param-unwatch": "Poista sivu ja ohjaus nykyisen käyttäjän tarkkailulistalta.", diff --git a/includes/api/i18n/fo.json b/includes/api/i18n/fo.json index 55229048b0..1470458a53 100644 --- a/includes/api/i18n/fo.json +++ b/includes/api/i18n/fo.json @@ -4,7 +4,7 @@ "EileenSanda" ] }, - "apihelp-block-description": "Sperra ein brúkara.", + "apihelp-block-summary": "Sperra ein brúkara.", "apihelp-block-param-user": "Brúkaranavn, IP adressa ella IP interval ið tú ynskir at sperra.", "apihelp-block-param-expiry": "Lokadagur. Kann vera relativt (t.d. 5 months ella 2 weeks) ella absolutt (t.d. 2014-09-18T12:34:56Z). Um ásett til infinite, indefinite, ella never, so gongur sperringin aldri út.", "apihelp-block-param-reason": "Orsøk til sperring.", @@ -17,23 +17,23 @@ "apihelp-block-param-reblock": "Um brúkarin longu er sperraður, yvirskriva so tað verandi sperringina.", "apihelp-block-example-ip-simple": "Sperra IP adressuna 192.0.2.5 í tríggjar dagar við orsøkini First strike.", "apihelp-block-example-user-complex": "Sperra brúkara Vandal í óvissa tíð við orsøkini Vandalism, og forða fyri upprættan av nýggjum kontum og at senda teldupost.", - "apihelp-createaccount-description": "Upprætta eina nýggja brúkarakonto.", + "apihelp-createaccount-summary": "Upprætta eina nýggja brúkarakonto.", "apihelp-createaccount-param-name": "Brúkaranavn.", "apihelp-createaccount-param-password": "Loyniorð (síggj burtur frá $1mailpassword um er upplýst).", "apihelp-createaccount-param-email": "Teldupostadressan hjá brúkaranum (valfrítt).", "apihelp-createaccount-param-realname": "Veruliga navnið hjá brúkaranum (valfrítt).", "apihelp-createaccount-example-pass": "Upprætta brúkara testuser við loyniorðinum test123.", "apihelp-createaccount-example-mail": "Upprætta brúkaran testmailuser og send eitt tilvildarliga stovnað loyniorð við telduposti.", - "apihelp-delete-description": "Strika eina síðu.", + "apihelp-delete-summary": "Strika eina síðu.", "apihelp-edit-example-edit": "Rætta eina síðu.", - "apihelp-emailuser-description": "Send t-post til ein brúkara.", + "apihelp-emailuser-summary": "Send t-post til ein brúkara.", "apihelp-emailuser-param-subject": "Evni teigur.", "apihelp-emailuser-param-text": "Innihaldið í teldubrævinum.", "apihelp-emailuser-param-ccme": "Send mær eitt avrit av hesum telduposti.", "apihelp-emailuser-example-email": "Send ein teldupost til brúkaran WikiSysop við tekstinum Content.", - "apihelp-expandtemplates-description": "Víðkar allar fyrimyndir í wikitekstinum.", + "apihelp-expandtemplates-summary": "Víðkar allar fyrimyndir í wikitekstinum.", "apihelp-expandtemplates-param-title": "Heiti á síðuni.", "apihelp-login-param-name": "Brúkaranavn.", "apihelp-login-param-password": "Loyniorð.", - "apihelp-move-description": "Flyt eina síðu." + "apihelp-move-summary": "Flyt eina síðu." } diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index d698b30e6f..b73d537ef2 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -20,23 +20,24 @@ "Wladek92", "Ash Crow", "L", - "Umherirrender", "Elfix", "Lbayle", "Verdy p", "Yasten", "Trial", "Pols12", - "The RedBurn" + "The RedBurn", + "Umherirrender", + "Thibaut120094" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n
    \nÉtat : Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\nRequêtes erronées : Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\nTest : Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n
    \nÉtat : Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\nRequêtes erronées : Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\nTest : Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].", "apihelp-main-param-action": "Quelle action effectuer.", "apihelp-main-param-format": "Le format de sortie.", - "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur maxlag est renvoyé avec un message tel que Attente de $host : $lag secondes de délai.
    Voyez [[mw:Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.", + "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur maxlag est renvoyé avec un message tel que Attente de $host : $lag secondes de délai.
    Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.", "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache s-maxage à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.", "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache max-age à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.", - "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à user, ou s'il a le droit d'un utilisateur robot si positionné à bot.", + "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si la valeur est user, ou s’il a le droit d’un utilisateur robot si la valeur est bot.", "apihelp-main-param-assertuser": "Vérifier que l’utilisateur actuel est l’utilisateur nommé.", "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.", "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.", @@ -47,7 +48,7 @@ "apihelp-main-param-errorformat": "Format à utiliser pour la sortie du texte d’avertissement et d’erreur.\n; plaintext: Wikitexte avec balises HTML supprimées et les entités remplacées.\n; wikitext: wikitexte non analysé.\n; html: HTML.\n; raw: Clé de message et paramètres.\n; none: Aucune sortie de texte, uniquement les codes erreur.\n; bc: Format utilisé avant MédiaWiki 1.29. errorlang et errorsuselocal sont ignorés.", "apihelp-main-param-errorlang": "Langue à utiliser pour les avertissements et les erreurs. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] avec siprop=languages renvoyant une liste de codes de langue, ou spécifier content pour utiliser la langue du contenu de ce wiki, ou spécifier uselang pour utiliser la même valeur que le paramètre uselang.", "apihelp-main-param-errorsuselocal": "S’il est fourni, les textes d’erreur utiliseront des messages adaptés à la langue dans l’espace de noms {{ns:MediaWiki}}.", - "apihelp-block-description": "Bloquer un utilisateur.", + "apihelp-block-summary": "Bloquer un utilisateur.", "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer. Ne peut pas être utilisé en même temps que $1userid", "apihelp-block-param-userid": "ID d'utilisateur à bloquer. Ne peut pas être utilisé avec $1user.", "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. 5 months ou 2 weeks) ou absolue (par ex. 2014-09-18T12:34:56Z). Si elle est mise à infinite, indefinite ou never, le blocage n’expirera jamais.", @@ -57,33 +58,53 @@ "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.", "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le droit blockemail).", "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit hideuser).", - "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.", "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.", "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.", "apihelp-block-example-ip-simple": "Bloquer l’adresse IP 192.0.2.5 pour trois jours avec le motif Premier avertissement.", "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur Vandal avec le motif Vandalism, et empêcher la création de nouveau compte et l'envoi de courriel.", - "apihelp-changeauthenticationdata-description": "Modifier les données d’authentification pour l’utilisateur actuel.", + "apihelp-changeauthenticationdata-summary": "Modifier les données d’authentification pour l’utilisateur actuel.", "apihelp-changeauthenticationdata-example-password": "Tentative de modification du mot de passe de l’utilisateur actuel en ExempleMotDePasse.", - "apihelp-checktoken-description": "Vérifier la validité d'un jeton de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Vérifier la validité d'un jeton de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Type de jeton testé", "apihelp-checktoken-param-token": "Jeton à tester.", "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 csrf.", - "apihelp-clearhasmsg-description": "Efface le drapeau hasmsg pour l’utilisateur courant.", + "apihelp-clearhasmsg-summary": "Efface le drapeau hasmsg pour l’utilisateur courant.", "apihelp-clearhasmsg-example-1": "Effacer le drapeau hasmsg pour l’utilisateur courant", - "apihelp-clientlogin-description": "Se connecter au wiki en utilisant le flux interactif.", + "apihelp-clientlogin-summary": "Se connecter au wiki en utilisant le flux interactif.", "apihelp-clientlogin-example-login": "Commencer le processus de connexion au wiki en tant qu’utilisateur Exemple avec le mot de passe ExempleMotDePasse.", "apihelp-clientlogin-example-login2": "Continuer la connexion après une réponse de l’IHM pour l’authentification à deux facteurs, en fournissant un OATHToken valant 987654.", - "apihelp-compare-description": "Obtenir la différence entre 2 pages.\n\nVous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».", + "apihelp-compare-summary": "Obtenir la différence entre deux pages.", + "apihelp-compare-extended-description": "Vous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».", "apihelp-compare-param-fromtitle": "Premier titre à comparer.", "apihelp-compare-param-fromid": "ID de la première page à comparer.", "apihelp-compare-param-fromrev": "Première révision à comparer.", + "apihelp-compare-param-fromtext": "Utiliser ce texte au lieu du contenu de la révision spécifié par fromtitle, fromid ou fromrev.", + "apihelp-compare-param-frompst": "Faire une transformation avant enregistrement sur fromtext.", + "apihelp-compare-param-fromcontentmodel": "Modèle de contenu de fromtext. Si non fourni, il sera deviné d’après les autres paramètres.", + "apihelp-compare-param-fromcontentformat": "Sérialisation du contenu de fromtext.", "apihelp-compare-param-totitle": "Second titre à comparer.", "apihelp-compare-param-toid": "ID de la seconde page à comparer.", "apihelp-compare-param-torev": "Seconde révision à comparer.", + "apihelp-compare-param-torelative": "Utiliser une révision relative à la révision déterminée de fromtitle, fromid ou fromrev. Toutes les autres options 'to' seront ignorées.", + "apihelp-compare-param-totext": "Utiliser ce texte au lieu du contenu de la révision spécifié par totitle, toid ou torev.", + "apihelp-compare-param-topst": "Faire une transformation avant enregistrement sur totext.", + "apihelp-compare-param-tocontentmodel": "Modèle de contenu de totext. Si non fourni, il sera deviné d’après les autres paramètres.", + "apihelp-compare-param-tocontentformat": "Sérialisation du contenu de totext.", + "apihelp-compare-param-prop": "Quelles informations obtenir.", + "apihelp-compare-paramvalue-prop-diff": "Le diff HTML.", + "apihelp-compare-paramvalue-prop-diffsize": "La taille du diff HTML en octets.", + "apihelp-compare-paramvalue-prop-rel": "L’ID des révisions précédant 'depuis' et 'vers', s’il y en a.", + "apihelp-compare-paramvalue-prop-ids": "L’ID de page et de révision des révisions 'depuis' et 'vers'.", + "apihelp-compare-paramvalue-prop-title": "Le titre de page des révisions 'depuis' et 'vers'.", + "apihelp-compare-paramvalue-prop-user": "Le nom et l’ID d’utilisateur des révisions 'depuis' et 'vers'.", + "apihelp-compare-paramvalue-prop-comment": "Le commentaire des révisions 'depuis' et 'vers'.", + "apihelp-compare-paramvalue-prop-parsedcomment": "Le commentaire analysé des révisions 'depuis' et 'vers'.", + "apihelp-compare-paramvalue-prop-size": "La taille des révisions 'depuis' et 'vers'.", "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2", - "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.", + "apihelp-createaccount-summary": "Créer un nouveau compte utilisateur.", "apihelp-createaccount-param-preservestate": "Si [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] a retourné true pour hasprimarypreservedstate, les demandes marquées comme primary-required doivent être omises. Si elle a retourné une valeur non vide pour preservedusername, ce nom d'utilisateur doit être utilisé pour le paramètre username.", "apihelp-createaccount-example-create": "Commencer le processus de création d’un utilisateur Exemple avec le mot de passe ExempleMotDePasse.", "apihelp-createaccount-param-name": "Nom d’utilisateur.", @@ -97,10 +118,10 @@ "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).", "apihelp-createaccount-example-pass": "Créer l’utilisateur testuser avec le mot de passe test123.", "apihelp-createaccount-example-mail": "Créer l’utilisateur testmailuser et envoyer par courriel un mot de passe généré aléatoirement.", - "apihelp-cspreport-description": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.", + "apihelp-cspreport-summary": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.", "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée", "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport", - "apihelp-delete-description": "Supprimer une page.", + "apihelp-delete-summary": "Supprimer une page.", "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible à utiliser avec $1pageid.", "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec $1title.", "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.", @@ -111,8 +132,8 @@ "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Supprimer Main Page.", "apihelp-delete-example-reason": "Supprimer Main Page avec le motif Preparing for move.", - "apihelp-disabled-description": "Ce module a été désactivé.", - "apihelp-edit-description": "Créer et modifier les pages.", + "apihelp-disabled-summary": "Ce module a été désactivé.", + "apihelp-edit-summary": "Créer et modifier les pages.", "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec $1pageid.", "apihelp-edit-param-pageid": "ID de la page que vous voulez modifier. Impossible à utiliser avec $1title.", "apihelp-edit-param-section": "Numéro de section. 0 pour la section de tête, new pour une nouvelle section.", @@ -143,17 +164,17 @@ "apihelp-edit-example-edit": "Modifier une page", "apihelp-edit-example-prepend": "Préfixer une page par __NOTOC__.", "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique.", - "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.", + "apihelp-emailuser-summary": "Envoyer un courriel à un utilisateur.", "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.", "apihelp-emailuser-param-subject": "Entête du sujet.", "apihelp-emailuser-param-text": "Corps du courriel.", "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.", "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur WikiSysop avec le texte Content.", - "apihelp-expandtemplates-description": "Développe tous les modèles avec du wikitexte.", + "apihelp-expandtemplates-summary": "Développe tous les modèles avec du wikitexte.", "apihelp-expandtemplates-param-title": "Titre de la page.", "apihelp-expandtemplates-param-text": "Wikitexte à convertir.", "apihelp-expandtemplates-param-revid": "ID de révision, pour {{REVISIONID}} et les variables semblables.", - "apihelp-expandtemplates-param-prop": "Quelles informations récupérer.\n\nNoter que si aucune valeur n’est sélectionnée, le résultat contiendra le wikitexte, mais la sortie sera dans un format obsolète.", + "apihelp-expandtemplates-param-prop": "Quelles informations récupérer.\n\nNoter que si aucune valeur n’est sélectionnée, le résultat contiendra le wikitexte, mais la sortie sera dans un format désuet.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "Le wikitexte développé", "apihelp-expandtemplates-paramvalue-prop-categories": "Toutes les catégories présentes dans l’entrée qui ne sont pas représentées dans la sortie du wikitexte.", "apihelp-expandtemplates-paramvalue-prop-properties": "Propriétés de la page définies par le développement des mots magiques dans le wikitexte.", @@ -166,7 +187,7 @@ "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.", "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Développe le wikitexte {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Renvoie le fil des contributions d’un utilisateur.", + "apihelp-feedcontributions-summary": "Renvoie le fil des contributions d’un utilisateur.", "apihelp-feedcontributions-param-feedformat": "Le format du flux.", "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.", "apihelp-feedcontributions-param-namespace": "Par quels espaces de nom filtrer les contributions.", @@ -179,7 +200,7 @@ "apihelp-feedcontributions-param-hideminor": "Masquer les modifications mineures.", "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.", "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de l'utilisateur Exemple.", - "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.", + "apihelp-feedrecentchanges-summary": "Renvoie un fil de modifications récentes.", "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.", "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.", "apihelp-feedrecentchanges-param-invert": "Tous les espaces de noms sauf celui sélectionné.", @@ -201,18 +222,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.", "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes", "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours", - "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.", + "apihelp-feedwatchlist-summary": "Renvoie un flux de liste de suivi.", "apihelp-feedwatchlist-param-feedformat": "Le format du flux.", "apihelp-feedwatchlist-param-hours": "Lister les pages modifiées lors de ce nombre d’heures depuis maintenant.", "apihelp-feedwatchlist-param-linktosections": "Lier directement vers les sections modifées si possible.", "apihelp-feedwatchlist-example-default": "Afficher le flux de la liste de suivi", "apihelp-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures", - "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.", + "apihelp-filerevert-summary": "Rétablir un fichier dans une ancienne version.", "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.", - "apihelp-filerevert-param-comment": "Télécharger le commentaire.", + "apihelp-filerevert-param-comment": "Téléverser le commentaire.", "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.", "apihelp-filerevert-example-revert": "Rétablir Wiki.png dans la version du 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.", + "apihelp-help-summary": "Afficher l’aide pour les modules spécifiés.", "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres action et format, ou main). Les sous-modules peuvent être spécifiés avec un +.", "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.", "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.", @@ -224,14 +245,15 @@ "apihelp-help-example-recursive": "Toute l’aide sur une page.", "apihelp-help-example-help": "Aide pour le module d’aide lui-même.", "apihelp-help-example-query": "Aide pour deux sous-modules de recherche.", - "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.", + "apihelp-imagerotate-summary": "Faire pivoter une ou plusieurs images.", "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.", - "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléchargement.", + "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléversement.", "apihelp-imagerotate-example-simple": "Faire pivoter File:Example.png de 90 degrés.", "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de Category:Flip de 180 degrés.", - "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre xml.", + "apihelp-import-summary": "Importer une page depuis un autre wiki, ou depuis un fichier XML.", + "apihelp-import-extended-description": "Noter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre xml.", "apihelp-import-param-summary": "Résumé de l’importation de l’entrée de journal.", - "apihelp-import-param-xml": "Fichier XML téléchargé.", + "apihelp-import-param-xml": "Fichier XML téléversé.", "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.", "apihelp-import-param-interwikipage": "Pour les importations interwiki : page à importer.", "apihelp-import-param-fullhistory": "Pour les importations interwiki : importer tout l’historique, et pas seulement la version courante.", @@ -240,19 +262,20 @@ "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page. Impossible à utiliser avec $1namespace.", "apihelp-import-param-tags": "Modifier les balises à appliquer à l'entrée du journal d'importation et à la version zéro des pages importées.", "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-summary": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.", "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis Exemple.", - "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 [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "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 [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Reconnecte et récupère les témoins (cookies) d'authentification.", + "apihelp-login-extended-description": "Cette 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 [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Cette action est désuète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nom d’utilisateur.", "apihelp-login-param-password": "Mot de passe.", "apihelp-login-param-domain": "Domaine (facultatif).", "apihelp-login-param-token": "Jeton de connexion obtenu à la première requête.", "apihelp-login-example-gettoken": "Récupérer un jeton de connexion", "apihelp-login-example-login": "Se connecter", - "apihelp-logout-description": "Se déconnecter et effacer les données de session.", + "apihelp-logout-summary": "Se déconnecter et effacer les données de session.", "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.", - "apihelp-managetags-description": "Effectuer des tâches de gestion relatives à la modification des balises.", + "apihelp-managetags-summary": "Effectuer des tâches de gestion relatives à la modification des balises.", "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.", "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.", "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.", @@ -262,7 +285,7 @@ "apihelp-managetags-example-delete": "Supprimer la balise vandlaism avec le motif Misspelt", "apihelp-managetags-example-activate": "Activer une balise nommée spam avec le motif For use in edit patrolling", "apihelp-managetags-example-deactivate": "Désactiver une balise nommée spam avec le motif No longer required", - "apihelp-mergehistory-description": "Fusionner les historiques des pages.", + "apihelp-mergehistory-summary": "Fusionner les historiques des pages.", "apihelp-mergehistory-param-from": "Titre de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec $1fromid.", "apihelp-mergehistory-param-fromid": "ID de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec $1from.", "apihelp-mergehistory-param-to": "Titre de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec $1toid.", @@ -271,7 +294,7 @@ "apihelp-mergehistory-param-reason": "Raison pour fusionner l’historique.", "apihelp-mergehistory-example-merge": "Fusionner l’historique complet de AnciennePage dans NouvellePage.", "apihelp-mergehistory-example-merge-timestamp": "Fusionner les révisions de la page AnciennePage jusqu’au 2015-12-31T04:37:41Z dans NouvellePage.", - "apihelp-move-description": "Déplacer une page.", + "apihelp-move-summary": "Déplacer une page.", "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec $1fromid.", "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec $1from.", "apihelp-move-param-to": "Nouveau titre de la page.", @@ -285,16 +308,17 @@ "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.", "apihelp-move-param-tags": "Modifier les balises à appliquer à l'entrée du journal des renommages et à la version zéro de la page de destination.", "apihelp-move-example-move": "Renommer Badtitle en Goodtitle sans garder de redirection.", - "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.", + "apihelp-opensearch-summary": "Rechercher dans le wiki en utilisant le protocole OpenSearch.", "apihelp-opensearch-param-search": "Chaîne de caractères cherchée.", "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.", "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.", - "apihelp-opensearch-param-suggest": "Ne rien faire si [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vaut faux.", + "apihelp-opensearch-param-suggest": "Ne rien faire si [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vaut faux.", "apihelp-opensearch-param-redirects": "Comment gérer les redirections :\n;return:Renvoie la redirection elle-même.\n;resolve:Renvoie la page cible. Peut renvoyer moins de $1limit résultats.\nPour des raisons historiques, la valeur par défaut est « return » pour $1format=json et « resolve » pour les autres formats.", "apihelp-opensearch-param-format": "Le format de sortie.", "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec format=json, renvoyer une erreur d’API au lieu de les ignorer.", "apihelp-opensearch-example-te": "Trouver les pages commençant par Te.", - "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec des clés préfixées par userjs- (devant être utilisées dans les scripts utilisateur), peuvent être définies.", + "apihelp-options-summary": "Modifier les préférences de l'utilisateur courant.", + "apihelp-options-extended-description": "Seules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec des clés préfixées par userjs- (devant être utilisées dans les scripts utilisateur), peuvent être définies.", "apihelp-options-param-reset": "Réinitialise les préférences avec les valeurs par défaut du site.", "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option $1reset est définie.", "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut. Pour toute valeur passée contenant une barre verticale (|), utiliser le [[Special:ApiHelp/main#main/datatypes|séparateur alternatif de valeur multiple]] pour que l'opération soit correcte.", @@ -303,7 +327,7 @@ "apihelp-options-example-reset": "Réinitialiser toutes les préférences", "apihelp-options-example-change": "Modifier les préférences skin et hideminor.", "apihelp-options-example-complex": "Réinitialiser toutes les préférences, puis définir skin et nickname.", - "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.", + "apihelp-paraminfo-summary": "Obtenir des informations sur les modules de l’API.", "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres action et format, ou main). Peut spécifier des sous-modules avec un +, ou tous les sous-modules avec +*, ou tous les sous-modules récursivement avec +**.", "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.", "apihelp-paraminfo-param-querymodules": "Liste des noms des modules de requête (valeur des paramètres prop, meta ou list). Utiliser $1modules=query+foo au lieu de $1querymodules=foo.", @@ -312,7 +336,8 @@ "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre format). Utiliser plutôt $1modules.", "apihelp-paraminfo-example-1": "Afficher les informations pour [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] et [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Afficher les informations pour tous les sous-modules de [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "Analyse le contenu et renvoie le résultat de l’analyseur.\n\nVoyez les différents modules prop de [[Special:ApiHelp/query|action=query]] pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant $1page, $1pageid ou $1oldid.\n# Spécifier explicitement un contenu, en utilisant $1text, $1title et $1contentmodel\n# Spécifier uniquement un résumé à analyser. $1prop doit recevoir une valeur vide.", + "apihelp-parse-summary": "Analyse le contenu et renvoie le résultat de l’analyseur.", + "apihelp-parse-extended-description": "Voyez les différents modules prop de [[Special:ApiHelp/query|action=query]] pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant $1page, $1pageid ou $1oldid.\n# Spécifier explicitement un contenu, en utilisant $1text, $1title et $1contentmodel\n# Spécifier uniquement un résumé à analyser. $1prop doit recevoir une valeur vide.", "apihelp-parse-param-title": "Titre de la page à laquelle appartient le texte. Si omis, $1contentmodel doit être spécifié, et [[API]] sera utilisé comme titre.", "apihelp-parse-param-text": "Texte à analyser. utiliser $1title ou $1contentmodel pour contrôler le modèle de contenu.", "apihelp-parse-param-summary": "Résumé à analyser.", @@ -332,7 +357,7 @@ "apihelp-parse-paramvalue-prop-sections": "Fournit les sections dans le wikitexte analysé.", "apihelp-parse-paramvalue-prop-revid": "Ajoute l’ID de révision de la page analysée.", "apihelp-parse-paramvalue-prop-displaytitle": "Ajoute le titre du wikitexte analysé.", - "apihelp-parse-paramvalue-prop-headitems": "Obsolète. Fournit les éléments à mettre dans le <head> de la page.", + "apihelp-parse-paramvalue-prop-headitems": "Fournit les éléments à mettre dans le <head> de la page.", "apihelp-parse-paramvalue-prop-headhtml": "Fournit le <head> analysé de la page.", "apihelp-parse-paramvalue-prop-modules": "Fournit les modules ResourceLoader utilisés sur la page. Pour les charger, utiliser mw.loader.using(). Soit jsconfigvars soit encodedjsconfigvars doit être demandé avec modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Fournit les variables de configuration JavaScript spécifiques à la page. Pour les appliquer, utiliser mw.config.set().", @@ -344,6 +369,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si $1disablelimitreport est positionné.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si $1disablelimitreport est positionné.", "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Fournit les messages d'avertissement qui sont apparus lors de l'analyse de contenu.", + "apihelp-parse-param-wrapoutputclass": "classe CSS à utiliser pour formater la sortie de l'analyseur.", "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.", "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec $1text.", "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec $1prop=langlinks).", @@ -357,19 +384,20 @@ "apihelp-parse-param-preview": "Analyser en mode aperçu.", "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).", "apihelp-parse-param-disabletoc": "Omettre la table des matières dans la sortie.", + "apihelp-parse-param-useskin": "Appliquer l’habillage sélectionné sur la sortie de l’analyseur. Cela peut affecter les propriétés suivantes : langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-param-contentformat": "Format de sérialisation du contenu utilisé pour le texte d’entrée. Valide uniquement si utilisé avec $1text.", "apihelp-parse-param-contentmodel": "Modèle de contenu du texte d’entrée. Si omis, $1title doit être spécifié, et la valeur par défaut sera le modèle du titre spécifié. Valide uniquement quand utilisé avec $1text.", "apihelp-parse-example-page": "Analyser une page.", "apihelp-parse-example-text": "Analyser le wikitexte.", "apihelp-parse-example-texttitle": "Analyser du wikitexte, en spécifiant le titre de la page.", "apihelp-parse-example-summary": "Analyser un résumé.", - "apihelp-patrol-description": "Patrouiller une page ou une révision.", + "apihelp-patrol-summary": "Patrouiller une page ou une révision.", "apihelp-patrol-param-rcid": "ID de modification récente à patrouiller.", "apihelp-patrol-param-revid": "ID de révision à patrouiller.", "apihelp-patrol-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de surveillance.", "apihelp-patrol-example-rcid": "Patrouiller une modification récente", "apihelp-patrol-example-revid": "Patrouiller une révision", - "apihelp-protect-description": "Modifier le niveau de protection d’une page.", + "apihelp-protect-summary": "Modifier le niveau de protection d’une page.", "apihelp-protect-param-title": "Titre de la page à (dé)protéger. Impossible à utiliser avec $1pageid.", "apihelp-protect-param-pageid": "ID de la page à (dé)protéger. Impossible à utiliser avec $1title.", "apihelp-protect-param-protections": "Liste des niveaux de protection, au format action=niveau (par exemple edit=sysop). Un niveau de tout, indique que tout le monde est autorisé à faire l'action, c'est à dire aucune restriction.\n\nNOTE : Toutes les actions non listées auront leur restrictions supprimées.", @@ -382,12 +410,13 @@ "apihelp-protect-example-protect": "Protéger une page", "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à all (c'est à dire tout le monde est autorisé à faire l'action).", "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction", - "apihelp-purge-description": "Vider le cache des titres fournis.", + "apihelp-purge-summary": "Vider le cache des titres fournis.", "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.", "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle", "apihelp-purge-example-simple": "Purger les pages Main Page et API.", "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal", - "apihelp-query-description": "Extraire des données de et sur MediaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.", + "apihelp-query-summary": "Extraire des données de et sur MediaWiki.", + "apihelp-query-extended-description": "Toutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.", "apihelp-query-param-prop": "Quelles propriétés obtenir pour les pages demandées.", "apihelp-query-param-list": "Quelles listes obtenir.", "apihelp-query-param-meta": "Quelles métadonnées obtenir.", @@ -398,7 +427,7 @@ "apihelp-query-param-rawcontinue": "Renvoyer les données query-continue brutes pour continuer.", "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de Main Page.", "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par API/.", - "apihelp-query+allcategories-description": "Énumérer toutes les catégories.", + "apihelp-query+allcategories-summary": "Énumérer toutes les catégories.", "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.", "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.", "apihelp-query+allcategories-param-prefix": "Rechercher tous les titres de catégorie qui commencent avec cette valeur.", @@ -411,7 +440,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Marque les catégories qui sont masquées avec __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Lister les catégories avec l’information sur le nombre de pages dans chacune", "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par List.", - "apihelp-query+alldeletedrevisions-description": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.", + "apihelp-query+alldeletedrevisions-summary": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Utilisable uniquement avec $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Impossible à utiliser avec $3user.", "apihelp-query+alldeletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération.", @@ -423,11 +452,11 @@ "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.", "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "REMARQUE : du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser $1user et $1namespace ensemble peut aboutir à moins de résultats renvoyés que $1limit avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "REMARQUE : du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser $1user et $1namespace ensemble peut aboutir à avoir moins de résultats renvoyés que $1limit avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.", "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.", - "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.", + "apihelp-query+allfileusages-summary": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.", "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.", "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.", "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.", @@ -441,7 +470,7 @@ "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques.", "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants.", "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers.", - "apihelp-query+allimages-description": "Énumérer toutes les images séquentiellement.", + "apihelp-query+allimages-summary": "Énumérer toutes les images séquentiellement.", "apihelp-query+allimages-param-sort": "Propriété par laquelle trier.", "apihelp-query+allimages-param-dir": "L'ordre dans laquel lister.", "apihelp-query+allimages-param-from": "Le titre de l’image depuis laquelle démarrer l’énumération. Ne peut être utilisé qu’avec $1sort=name.", @@ -453,15 +482,15 @@ "apihelp-query+allimages-param-maxsize": "Restreindre aux images avec au plus ce nombre d’octets.", "apihelp-query+allimages-param-sha1": "Hachage SHA1 de l’image. Écrase $1sha1base36.", "apihelp-query+allimages-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MediaWiki).", - "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléchargés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.", - "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléchargés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.", + "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléversés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.", + "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléversés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.", "apihelp-query+allimages-param-mime": "Quels types MIME rechercher, par ex. image/jpeg.", "apihelp-query+allimages-param-limit": "Combien d’images renvoyer au total.", "apihelp-query+allimages-example-B": "Afficher une liste des fichiers commençant par la lettre B.", - "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléchargés, semblable à [[Special:NewFiles]].", + "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléversés, semblable à [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Afficher une liste de fichiers avec le type MIME image/png ou image/gif", "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre T.", - "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.", + "apihelp-query+alllinks-summary": "Énumérer tous les liens pointant vers un espace de noms donné.", "apihelp-query+alllinks-param-from": "Le titre du lien auquel démarrer l’énumération.", "apihelp-query+alllinks-param-to": "Le titre du lien auquel arrêter l’énumération.", "apihelp-query+alllinks-param-prefix": "Rechercher tous les titres liés commençant par cette valeur.", @@ -476,7 +505,7 @@ "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques", "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants", "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens", - "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.", + "apihelp-query+allmessages-summary": "Renvoyer les messages depuis ce site.", "apihelp-query+allmessages-param-messages": "Quels messages sortir. * (par défaut) signifie tous les messages.", "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.", "apihelp-query+allmessages-param-enableparser": "Positionner pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).", @@ -492,7 +521,7 @@ "apihelp-query+allmessages-param-prefix": "Renvoyer les messages avec ce préfixe.", "apihelp-query+allmessages-example-ipb": "Afficher les messages commençant par ipb-.", "apihelp-query+allmessages-example-de": "Afficher les messages august et mainpage en allemand.", - "apihelp-query+allpages-description": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.", + "apihelp-query+allpages-summary": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.", "apihelp-query+allpages-param-from": "Le titre de la page depuis lequel commencer l’énumération.", "apihelp-query+allpages-param-to": "Le titre de la page auquel stopper l’énumération.", "apihelp-query+allpages-param-prefix": "Rechercher tous les titres de page qui commencent par cette valeur.", @@ -510,7 +539,7 @@ "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre B.", "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre T.", "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par Re.", - "apihelp-query+allredirects-description": "Lister toutes les redirections vers un espace de noms.", + "apihelp-query+allredirects-summary": "Lister toutes les redirections vers un espace de noms.", "apihelp-query+allredirects-param-from": "Le titre de la redirection auquel démarrer l’énumération.", "apihelp-query+allredirects-param-to": "Le titre de la redirection auquel arrêter l’énumération.", "apihelp-query+allredirects-param-prefix": "Rechercher toutes les pages cible commençant par cette valeur.", @@ -527,7 +556,7 @@ "apihelp-query+allredirects-example-unique": "Lister les pages cible unique", "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes", "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections", - "apihelp-query+allrevisions-description": "Lister toutes les révisions.", + "apihelp-query+allrevisions-summary": "Lister toutes les révisions.", "apihelp-query+allrevisions-param-start": "L’horodatage auquel démarrer l’énumération.", "apihelp-query+allrevisions-param-end": "L’horodatage auquel arrêter l’énumération.", "apihelp-query+allrevisions-param-user": "Lister uniquement les révisions faites par cet utilisateur.", @@ -536,13 +565,13 @@ "apihelp-query+allrevisions-param-generatetitles": "Utilisé comme générateur, génère des titres plutôt que des IDs de révision.", "apihelp-query+allrevisions-example-user": "Lister les 50 dernières contributions de l’utilisateur Example.", "apihelp-query+allrevisions-example-ns-main": "Lister les 50 premières révisions dans l’espace de noms principal.", - "apihelp-query+mystashedfiles-description": "Obtenir une liste des fichiers dans le cache de téléchargement de l’utilisateur actuel", + "apihelp-query+mystashedfiles-summary": "Obtenir une liste des fichiers dans le cache de téléversement de l’utilisateur actuel", "apihelp-query+mystashedfiles-param-prop": "Quelles propriétés récupérer pour les fichiers.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Récupérer la taille du fichier et les dimensions de l’image.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Récupérer le type MIME du fichier et son type de média.", "apihelp-query+mystashedfiles-param-limit": "Combien de fichiers obtenir.", - "apihelp-query+mystashedfiles-example-simple": "Obtenir la clé du fichier, sa taille, et la taille en pixel des fichiers dans le cache de téléchargement de l’utilisateur actuel.", - "apihelp-query+alltransclusions-description": "Lister toutes les transclusions (pages intégrées en utilisant {{x}}), y compris les inexistantes.", + "apihelp-query+mystashedfiles-example-simple": "Obtenir la clé du fichier, sa taille, et la taille en pixels des fichiers dans le cache de téléversement de l’utilisateur actuel.", + "apihelp-query+alltransclusions-summary": "Lister toutes les transclusions (pages intégrées en utilisant {{x}}), y compris les inexistantes.", "apihelp-query+alltransclusions-param-from": "Le titre de la transclusion depuis lequel commencer l’énumération.", "apihelp-query+alltransclusions-param-to": "Le titre de la transclusion auquel arrêter l’énumération.", "apihelp-query+alltransclusions-param-prefix": "Rechercher tous les titres inclus qui commencent par cette valeur.", @@ -557,7 +586,7 @@ "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques", "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants.", "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant les transclusions.", - "apihelp-query+allusers-description": "Énumérer tous les utilisateurs enregistrés.", + "apihelp-query+allusers-summary": "Énumérer tous les utilisateurs enregistrés.", "apihelp-query+allusers-param-from": "Le nom d’utilisateur auquel démarrer l’énumération.", "apihelp-query+allusers-param-to": "Le nom d’utilisateur auquel stopper l’énumération.", "apihelp-query+allusers-param-prefix": "Rechercher tous les utilisateurs commençant par cette valeur.", @@ -578,13 +607,13 @@ "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.", "apihelp-query+allusers-param-attachedwiki": "Avec $1prop=centralids, indiquer aussi si l’utilisateur est attaché avec le wiki identifié par cet ID.", "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à Y.", - "apihelp-query+authmanagerinfo-description": "Récupérer les informations concernant l’état d’authentification actuel.", + "apihelp-query+authmanagerinfo-summary": "Récupérer les informations concernant l’état d’authentification actuel.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Tester si l’état d’authentification actuel de l’utilisateur est suffisant pour l’opération spécifiée comme sensible du point de vue sécurité.", "apihelp-query+authmanagerinfo-param-requestsfor": "Récupérer les informations sur les requêtes d’authentification nécessaires pour l’action d’authentification spécifiée.", "apihelp-query+authmanagerinfo-example-login": "Récupérer les requêtes qui peuvent être utilisées en commençant une connexion.", "apihelp-query+authmanagerinfo-example-login-merged": "Récupérer les requêtes qui peuvent être utilisées au début de la connexion, avec les champs de formulaire intégrés.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Tester si l’authentification est suffisante pour l’action foo.", - "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.", + "apihelp-query+backlinks-summary": "Trouver toutes les pages qui ont un lien vers la page donnée.", "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.", "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec $1title.", "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.", @@ -594,7 +623,7 @@ "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver également toutes les pages qui ont un lien vers cette redirection. La limite maximale est divisée par deux.", "apihelp-query+backlinks-example-simple": "Afficher les liens vers Main page.", "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers Main page.", - "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.", + "apihelp-query+blocks-summary": "Lister tous les utilisateurs et les adresses IP bloqués.", "apihelp-query+blocks-param-start": "L’horodatage auquel démarrer l’énumération.", "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.", "apihelp-query+blocks-param-ids": "Liste des IDs de bloc à lister (facultatif).", @@ -615,7 +644,7 @@ "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Lister les blocages", "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs Alice et Bob.", - "apihelp-query+categories-description": "Lister toutes les catégories auxquelles les pages appartiennent.", + "apihelp-query+categories-summary": "Lister toutes les catégories auxquelles les pages appartiennent.", "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :", "apihelp-query+categories-paramvalue-prop-sortkey": "Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.", "apihelp-query+categories-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’ajout de la catégorie.", @@ -626,9 +655,9 @@ "apihelp-query+categories-param-dir": "La direction dans laquelle lister.", "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient la page Albert Einstein.", "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans la page Albert Einstein.", - "apihelp-query+categoryinfo-description": "Renvoie les informations sur les catégories données.", + "apihelp-query+categoryinfo-summary": "Renvoie les informations sur les catégories données.", "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur Category:Foo et Category:Bar.", - "apihelp-query+categorymembers-description": "Lister toutes les pages d’une catégorie donnée.", + "apihelp-query+categorymembers-summary": "Lister toutes les pages d’une catégorie donnée.", "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe {{ns:category}}:. Impossible à utiliser avec $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec $1title.", "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :", @@ -653,14 +682,15 @@ "apihelp-query+categorymembers-param-endsortkey": "Utiliser plutôt $1endhexsortkey.", "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de Category:Physics.", "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de Category:Physics.", - "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.", + "apihelp-query+contributors-summary": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.", "apihelp-query+contributors-param-group": "Inclut uniquement les utilisateurs dans les groupes donnés. N'inclut pas les groupes implicites ou auto-promus comme *, user ou autoconfirmed.", "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.", "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.", "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.", "apihelp-query+contributors-param-limit": "Combien de contributeurs renvoyer.", "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la Main Page.", - "apihelp-query+deletedrevisions-description": "Obtenir des informations sur la révision supprimée.\n\nPeut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.", + "apihelp-query+deletedrevisions-summary": "Obtenir des informations sur la révision supprimée.", + "apihelp-query+deletedrevisions-extended-description": "Peut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.", "apihelp-query+deletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.", "apihelp-query+deletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.", "apihelp-query+deletedrevisions-param-tag": "Lister uniquement les révisions marquées par cette balise.", @@ -668,7 +698,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.", "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées des pages Main Page et Talk:Main Page, avec leur contenu.", "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée 123456.", - "apihelp-query+deletedrevs-description": "Lister les révisions supprimées.\n\nOpère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.", + "apihelp-query+deletedrevs-summary": "Afficher les versions supprimées.", + "apihelp-query+deletedrevs-extended-description": "Opère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}} : $2", "apihelp-query+deletedrevs-param-start": "L’horodatage auquel démarrer l’énumération.", "apihelp-query+deletedrevs-param-end": "L’horodatage auquel arrêter l’énumération.", @@ -681,19 +712,19 @@ "apihelp-query+deletedrevs-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.", "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.", "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.", - "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:Obsolète. Fournit le jeton de modification.\n;tags:Balises pour la révision.", + "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid : Ajoute l’ID de la révision supprimée.\n;parentid : Ajoute l’ID de la révision précédente de la page.\n;user : Ajoute l’utilisateur ayant fait la révision.\n;userid : Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment : Ajoute le commentaire de la révision.\n;parsedcomment : Ajoute le commentaire analysé de la révision.\n;minor : Marque si la révision est mineure.\n;len : Ajoute la longueur (en octets) de la révision.\n;sha1 : Ajoute le SHA-1 (base 16) de la révision.\n;content : Ajoute le contenu de la révision.\n;token : Désuet. Fournit le jeton de modification.\n;tags : Balises pour la révision.", "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages Main Page et Talk:Main Page, avec le contenu (mode 1).", "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de Bob supprimées (mode 2).", "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)", "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).", - "apihelp-query+disabled-description": "Ce module de requête a été désactivé.", - "apihelp-query+duplicatefiles-description": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.", + "apihelp-query+disabled-summary": "Ce module de requête a été désactivé.", + "apihelp-query+duplicatefiles-summary": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.", "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.", "apihelp-query+duplicatefiles-param-dir": "La direction dans laquelle lister.", "apihelp-query+duplicatefiles-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.", "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Rechercher les doublons de tous les fichiers", - "apihelp-query+embeddedin-description": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.", + "apihelp-query+embeddedin-summary": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.", "apihelp-query+embeddedin-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.", "apihelp-query+embeddedin-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.", "apihelp-query+embeddedin-param-namespace": "L’espace de noms à énumérer.", @@ -702,13 +733,13 @@ "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.", "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant Template:Stub.", "apihelp-query+embeddedin-example-generator": "Obtenir des informations sur les pages incluant Template:Stub.", - "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.", + "apihelp-query+extlinks-summary": "Renvoyer toutes les URLs externes (non interwikis) des pages données.", "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.", "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et $1query est positionné, le protocole est http. Laisser à la fois ceci et $1query vides pour lister tous les liens externes.", "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.", "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.", "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de Main Page.", - "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.", + "apihelp-query+exturlusage-summary": "Énumérer les pages contenant une URL donnée.", "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :", "apihelp-query+exturlusage-paramvalue-prop-ids": "Ajoute l’ID de la page.", "apihelp-query+exturlusage-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.", @@ -719,7 +750,7 @@ "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.", "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.", "apihelp-query+exturlusage-example-simple": "Afficher les pages avec un lien vers http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Énumérer séquentiellement tous les fichiers supprimés.", + "apihelp-query+filearchive-summary": "Énumérer séquentiellement tous les fichiers supprimés.", "apihelp-query+filearchive-param-from": "Le titre de l’image auquel démarrer l’énumération.", "apihelp-query+filearchive-param-to": "Le titre de l’image auquel arrêter l’énumération.", "apihelp-query+filearchive-param-prefix": "Rechercher tous les titres d’image qui commencent par cette valeur.", @@ -729,8 +760,8 @@ "apihelp-query+filearchive-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).", "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :", "apihelp-query+filearchive-paramvalue-prop-sha1": "Ajoute le hachage SHA-1 pour l’image.", - "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l’horodatage pour la version téléchargée.", - "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé la version de l’image.", + "apihelp-query+filearchive-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléversée.", + "apihelp-query+filearchive-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléversé la version de l’image.", "apihelp-query+filearchive-paramvalue-prop-size": "Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).", "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias pour la taille.", "apihelp-query+filearchive-paramvalue-prop-description": "Ajoute la description de la version de l’image.", @@ -738,13 +769,13 @@ "apihelp-query+filearchive-paramvalue-prop-mime": "Ajoute le MIME de l’image.", "apihelp-query+filearchive-paramvalue-prop-mediatype": "Ajoute le type de média de l’image.", "apihelp-query+filearchive-paramvalue-prop-metadata": "Liste les métadonnées Exif pour la version de l’image.", - "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Ajoute la profondeur de bit de la version.", + "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.", "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés", - "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.", - "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.", + "apihelp-query+filerepoinfo-summary": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.", + "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.", "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.", - "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.", + "apihelp-query+fileusage-summary": "Trouver toutes les pages qui utilisent les fichiers donnés.", "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :", "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de chaque page.", "apihelp-query+fileusage-paramvalue-prop-title": "Titre de chaque page.", @@ -754,11 +785,11 @@ "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.", "apihelp-query+fileusage-example-simple": "Obtenir une liste des pages utilisant [[:File:Example.jpg]]", "apihelp-query+fileusage-example-generator": "Obtenir l’information sur les pages utilisant [[:File:Example.jpg]]", - "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléchargement.", + "apihelp-query+imageinfo-summary": "Renvoyer l’information de fichier et l’historique de téléversement.", "apihelp-query+imageinfo-param-prop": "Quelle information obtenir du fichier :", - "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléchargée.", - "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléchargé chaque version du fichier.", - "apihelp-query+imageinfo-paramvalue-prop-userid": "Ajouter l’ID de l’utilisateur qui a téléchargé chaque version du fichier.", + "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléversée.", + "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléversé chaque version du fichier.", + "apihelp-query+imageinfo-paramvalue-prop-userid": "Ajouter l’ID de l’utilisateur qui a téléversé chaque version du fichier.", "apihelp-query+imageinfo-paramvalue-prop-comment": "Commentaire sur la version.", "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analyser le commentaire de la version.", "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Ajoute le titre canonique du fichier.", @@ -790,13 +821,13 @@ "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.", "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008.", - "apihelp-query+images-description": "Renvoie tous les fichiers contenus dans les pages fournies.", + "apihelp-query+images-summary": "Renvoie tous les fichiers contenus dans les pages fournies.", "apihelp-query+images-param-limit": "Combien de fichiers renvoyer.", "apihelp-query+images-param-images": "Lister uniquement ces fichiers. Utile pour vérifier si une page donnée contient un fichier donné.", "apihelp-query+images-param-dir": "La direction dans laquelle lister.", "apihelp-query+images-example-simple": "Obtenir une liste des fichiers utilisés dans [[Main Page]]", "apihelp-query+images-example-generator": "Obtenir des informations sur tous les fichiers utilisés dans [[Main Page]]", - "apihelp-query+imageusage-description": "Trouver toutes les pages qui utilisent le titre de l’image donné.", + "apihelp-query+imageusage-summary": "Trouver toutes les pages qui utilisent le titre de l’image donné.", "apihelp-query+imageusage-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.", "apihelp-query+imageusage-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.", "apihelp-query+imageusage-param-namespace": "L’espace de noms à énumérer.", @@ -806,7 +837,7 @@ "apihelp-query+imageusage-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont aussi un lien vers cette redirection. La limite maximale est divisée par deux.", "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]", "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]", - "apihelp-query+info-description": "Obtenir les informations de base sur la page.", + "apihelp-query+info-summary": "Obtenir les informations de base sur la page.", "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :", "apihelp-query+info-paramvalue-prop-protection": "Lister le niveau de protection de chaque page.", "apihelp-query+info-paramvalue-prop-talkid": "L’ID de la page de discussion de chaque page qui n’est pas de discussion.", @@ -823,7 +854,8 @@ "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-query+info-example-simple": "Obtenir des informations sur la page Main Page.", "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page Main Page.", - "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».", + "apihelp-query+iwbacklinks-summary": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.", + "apihelp-query+iwbacklinks-extended-description": "Peut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».", "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.", "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.", @@ -833,7 +865,7 @@ "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.", "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages qui ont un lien vers [[wikibooks:Test]].", "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages qui ont un lien vers [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.", + "apihelp-query+iwlinks-summary": "Renvoie tous les liens interwiki des pages indiquées.", "apihelp-query+iwlinks-param-url": "S'il faut obtenir l’URL complète (impossible à utiliser avec $1prop).", "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :", "apihelp-query+iwlinks-paramvalue-prop-url": "Ajoute l’URL complète.", @@ -842,7 +874,8 @@ "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1prefix.", "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.", "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de la page Main Page.", - "apihelp-query+langbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). N’utiliser aucun paramètre revient à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.", + "apihelp-query+langbacklinks-summary": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.", + "apihelp-query+langbacklinks-extended-description": "Peut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). Sans paramètre équivaut à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.", "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.", "apihelp-query+langbacklinks-param-title": "Lien interlangue à rechercher. Doit être utilisé avec $1lang.", "apihelp-query+langbacklinks-param-limit": "Combien de pages renvoyer au total.", @@ -852,7 +885,7 @@ "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.", "apihelp-query+langbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]].", - "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.", + "apihelp-query+langlinks-summary": "Renvoie tous les liens interlangue des pages fournies.", "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.", "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec $1prop).", "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :", @@ -861,10 +894,10 @@ "apihelp-query+langlinks-paramvalue-prop-autonym": "Ajoute le nom natif de la langue.", "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.", "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec $1lang.", - "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.", + "apihelp-query+langlinks-param-dir": "La direction dans laquelle lister.", "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.", "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page Main Page.", - "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.", + "apihelp-query+links-summary": "Renvoie tous les liens des pages fournies.", "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.", "apihelp-query+links-param-limit": "Combien de liens renvoyer.", "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.", @@ -872,7 +905,7 @@ "apihelp-query+links-example-simple": "Obtenir les liens de la page Main Page", "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans Main Page.", "apihelp-query+links-example-namespaces": "Obtenir les liens de la page Main Page dans les espaces de nom {{ns:user}} et {{ns:template}}.", - "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.", + "apihelp-query+linkshere-summary": "Trouver toutes les pages ayant un lien vers les pages données.", "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :", "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de chaque page.", "apihelp-query+linkshere-paramvalue-prop-title": "Titre de chaque page.", @@ -882,7 +915,7 @@ "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.", "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à [[Main Page]]", "apihelp-query+linkshere-example-generator": "Obtenir des informations sur les pages liées à [[Main Page]]", - "apihelp-query+logevents-description": "Obtenir des événements des journaux.", + "apihelp-query+logevents-summary": "Récupère les événements à partir des journaux.", "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :", "apihelp-query+logevents-paramvalue-prop-ids": "Ajoute l’ID de l’événement.", "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement enregistré.", @@ -905,13 +938,13 @@ "apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.", "apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.", "apihelp-query+logevents-example-simple": "Liste les entrées de journal récentes.", - "apihelp-query+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.", + "apihelp-query+pagepropnames-summary": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.", "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.", "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété.", - "apihelp-query+pageprops-description": "Obtenir diverses propriétés de page définies dans le contenu de la page.", + "apihelp-query+pageprops-summary": "Obtenir diverses propriétés de page définies dans le contenu de la page.", "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés de page ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] renvoie les noms de propriété de page utilisés). Utile pour vérifier si des pages utilisent une certaine propriété de page.", "apihelp-query+pageprops-example-simple": "Obtenir les propriétés des pages Main Page et MediaWiki.", - "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.", + "apihelp-query+pageswithprop-summary": "Lister toutes les pages utilisant une propriété de page donnée.", "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] renvoie les noms de propriété de page utilisés).", "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Ajoute l’ID de la page.", @@ -921,14 +954,15 @@ "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.", "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant __NOTOC__.", - "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.\n\nMalgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez [[Special:ApiHelp/query+allpages|action=query&list=allpages]] avec le paramètre apprefix. Le but de ce module est similaire à [[Special:ApiHelp/opensearch|action=opensearch]] : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.", + "apihelp-query+prefixsearch-summary": "Effectuer une recherche de préfixe sur les titres de page.", + "apihelp-query+prefixsearch-extended-description": "Malgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez [[Special:ApiHelp/query+allpages|action=query&list=allpages]] avec le paramètre apprefix. Le but de ce module est similaire à [[Special:ApiHelp/opensearch|action=opensearch]] : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.", "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.", - "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.", + "apihelp-query+prefixsearch-param-namespace": "Espaces de noms à rechercher.", "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.", "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.", "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par meaning.", "apihelp-query+prefixsearch-param-profile": "Rechercher le profil à utiliser.", - "apihelp-query+protectedtitles-description": "Lister tous les titres protégés en création.", + "apihelp-query+protectedtitles-summary": "Lister tous les titres protégés en création.", "apihelp-query+protectedtitles-param-namespace": "Lister uniquement les titres dans ces espaces de nom.", "apihelp-query+protectedtitles-param-level": "Lister uniquement les titres avec ces niveaux de protection.", "apihelp-query+protectedtitles-param-limit": "Combien de pages renvoyer au total.", @@ -943,37 +977,38 @@ "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Ajoute l’horodatage de levée de la protection.", "apihelp-query+protectedtitles-paramvalue-prop-level": "Ajoute le niveau de protection.", "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés", - "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal", - "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage", - "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.", + "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal.", + "apihelp-query+querypage-summary": "Obtenir une liste fournie par une page spéciale basée sur QueryPage.", + "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Notez que ce nom est sensible à la casse.", "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.", "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].", - "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est Accueil, la seconde sera toujours Liste des singes de fiction, la troisième Liste de personnes figurant sur les timbres de Vanuatu, etc.", + "apihelp-query+random-summary": "Récupèrer un ensemble de pages au hasard.", + "apihelp-query+random-extended-description": "Les pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est Accueil, la seconde sera toujours Liste des singes de fiction, la troisième Liste de personnes figurant sur les timbres de Vanuatu, etc.", "apihelp-query+random-param-namespace": "Renvoyer seulement des pages de ces espaces de noms.", "apihelp-query+random-param-limit": "Limiter le nombre de pages aléatoires renvoyées.", "apihelp-query+random-param-redirect": "Utilisez $1filterredir=redirects au lieu de ce paramètre.", "apihelp-query+random-param-filterredir": "Comment filtrer les redirections.", - "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace principal", - "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal", - "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.", + "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace de noms principal.", + "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal.", + "apihelp-query+recentchanges-summary": "Énumérer les modifications récentes.", "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.", "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.", - "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de nom.", - "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.", - "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.", + "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.", + "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications faites par cet utilisateur.", + "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.", "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.", "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :", - "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.", + "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque s'il s'agit d'une adresse IP.", "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.", "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.", "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.", "apihelp-query+recentchanges-paramvalue-prop-flags": "Ajoute les balises de la modification.", "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.", "apihelp-query+recentchanges-paramvalue-prop-title": "Ajoute le titre de la page modifiée.", - "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.", - "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle tailles de la page en octets.", + "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et de la nouvelle révision.", + "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle taille de la page en octets.", "apihelp-query+recentchanges-paramvalue-prop-redirect": "Marque la modification si la page est une redirection.", - "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marque les modifications patrouillables comme patrouillées ou non.", + "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marque les modifications à relire comme relues ou pas.", "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.", "apihelp-query+recentchanges-paramvalue-prop-tags": "Liste les balises de l’entrée.", "apihelp-query+recentchanges-paramvalue-prop-sha1": "Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.", @@ -984,28 +1019,29 @@ "apihelp-query+recentchanges-param-toponly": "Lister uniquement les modifications qui sont de la dernière révision.", "apihelp-query+recentchanges-param-generaterevisions": "Utilisé comme générateur, générer des IDs de révision plutôt que des titres.\nLes entrées de modification récentes sans IDs de révision associé (par ex. la plupart des entrées de journaux) ne généreront rien.", "apihelp-query+recentchanges-example-simple": "Lister les modifications récentes", - "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non patrouillées", - "apihelp-query+redirects-description": "Renvoie toutes les redirections vers les pages données.", + "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non relues.", + "apihelp-query+redirects-summary": "Renvoie toutes les redirections vers les pages données.", "apihelp-query+redirects-param-prop": "Quelles propriétés récupérer :", "apihelp-query+redirects-paramvalue-prop-pageid": "ID de page de chaque redirection.", "apihelp-query+redirects-paramvalue-prop-title": "Titre de chaque redirection.", "apihelp-query+redirects-paramvalue-prop-fragment": "Fragment de chaque redirection, s’il y en a un.", - "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.", + "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.", "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.", "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.", "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]", "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]", - "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.", + "apihelp-query+revisions-summary": "Récupèrer les informations de relecture.", + "apihelp-query+revisions-extended-description": "Peut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.", "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).", - "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.", - "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.", + "apihelp-query+revisions-param-startid": "Commencer l'énumération à partir de la date de cette revue. La revue doit exister, mais ne concerne pas forcément cette page.", + "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette revue. La revue doit exister mais ne concerne pas forcément cette page.", "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.", "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.", "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.", "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.", "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.", "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.", - "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres API et Page principale.", + "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres API et Main Page.", "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la Main Page.", "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la Page principale.", "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la Page principale faites après le 01/05/2006.", @@ -1024,17 +1060,17 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Commentaire analysé de l’utilisateur sur la révision.", "apihelp-query+revisions+base-paramvalue-prop-content": "Texte de la révision.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Balises de la révision.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Deprecated. Utiliser [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]] à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu $1).", "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.", - "apihelp-query+revisions+base-param-expandtemplates": "Développer les modèles dans le contenu de la révision (nécessite $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content ; remplacé par $1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.", + "apihelp-query+revisions+base-param-expandtemplates": "Utiliser [[Special:ApiHelp/expandtemplates|action=expandtemplates]] à la place. Développer les modèles dans le contenu de la révision (nécessite $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Utiliser [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]] à la place. Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).", + "apihelp-query+revisions+base-param-parse": "Utiliser [[Special:ApiHelp/parse|action=parse]] à la place. Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.", "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.", - "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser prev, next et cur pour la version précédente, suivante et actuelle respectivement.", - "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte.", - "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "Utiliser [[Special:ApiHelp/compare|action=compare]] à la place. ID de révision à prendre pour comparer chaque révision. Utiliser prev, next et cur pour la version précédente, suivante et actuelle respectivement.", + "apihelp-query+revisions+base-param-difftotext": "Utiliser [[Special:ApiHelp/compare|action=compare]] à la place. Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte.", + "apihelp-query+revisions+base-param-difftotextpst": "Utiliser [[Special:ApiHelp/compare|action=compare]] à la place. Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand utilisé avec $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour $1difftotext et attendu pour la sortie du contenu.", - "apihelp-query+search-description": "Effectuer une recherche en texte intégral.", + "apihelp-query+search-summary": "Effectuer une recherche en texte intégral.", "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.", "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de noms.", "apihelp-query+search-param-what": "Quel type de recherche effectuer.", @@ -1052,54 +1088,54 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "Ajoute le titre de la section correspondante.", "apihelp-query+search-paramvalue-prop-categorysnippet": "Ajoute un extrait analysé de la catégorie correspondante.", "apihelp-query+search-paramvalue-prop-isfilematch": "Ajoute un booléen indiquant si la recherche correspond au contenu du fichier.", - "apihelp-query+search-paramvalue-prop-score": "Désuet et ignoré.", - "apihelp-query+search-paramvalue-prop-hasrelated": "Obsolète et ignoré.", + "apihelp-query+search-paramvalue-prop-score": "Ignoré.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignoré.", "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.", "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.", "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.", - "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.", + "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent réécrire la requête en une autre qui est censée donner de meilleurs résultats, par exemple en corrigeant les erreurs d’orthographe.", "apihelp-query+search-example-simple": "Rechercher meaning.", - "apihelp-query+search-example-text": "Rechercher des textes pour signification.", + "apihelp-query+search-example-text": "Rechercher des textes pour meaning.", "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de meaning.", - "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.", + "apihelp-query+siteinfo-summary": "Renvoyer les informations générales sur le site.", "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :", "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.", - "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de nom déclarés et leur nom canonique.", - "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de nom déclarés.", + "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de noms déclarés avec leur nom canonique.", + "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de noms déclarés.", "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste des alias des pages spéciales.", "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.", "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.", + "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de données ayant la plus grande latence de réplication.", "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.", "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.", "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.", - "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléchargement.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléversement.", "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).", "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que MédiaWiki prend en charge (éventuellement localisée en utilisant $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] est activé, et les variantes prises en charge pour chacun.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant $1inlanguagecode, sinon dans la langue du contenu).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de [[mw:Manual:$wgHooks|$wgHooks]]).", - "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.", - "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste d'IDs de variable.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste de protocoles autorisés dans les liens externes.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.", "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.", "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.", "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.", "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.", "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.", - "apihelp-query+siteinfo-example-simple": "Extraire les informations du site", - "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux", - "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle", - "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.", - "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.", - "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.", + "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.", + "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.", + "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.", + "apihelp-query+stashimageinfo-summary": "Renvoie les informations de fichier des fichiers mis en réserve.", + "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléversement précédent qui a été temporairement mis en réserve.", + "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité ascendante.", "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.", - "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve", - "apihelp-query+tags-description": "Lister les balises de modification.", + "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis de côté.", + "apihelp-query+tags-summary": "Lister les balises de modification.", "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.", "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :", "apihelp-query+tags-paramvalue-prop-name": "Ajoute le nom de la balise.", @@ -1107,22 +1143,22 @@ "apihelp-query+tags-paramvalue-prop-description": "Ajoute la description de la balise.", "apihelp-query+tags-paramvalue-prop-hitcount": "Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.", "apihelp-query+tags-paramvalue-prop-defined": "Indique si la balise est définie.", - "apihelp-query+tags-paramvalue-prop-source": "Obtient les sources de la balise, ce qui comprend extension pour les balises définies par une extension et manual pour les balises pouvant être appliquées manuellement par les utilisateurs.", + "apihelp-query+tags-paramvalue-prop-source": "Retourne les sources de la balise, ce qui comprend extension pour les balises définies par une extension et manual pour les balises pouvant être appliquées manuellement par les utilisateurs.", "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.", - "apihelp-query+tags-example-simple": "Lister les balises disponibles", - "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.", - "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de nom.", + "apihelp-query+tags-example-simple": "Lister les balises disponibles.", + "apihelp-query+templates-summary": "Renvoie toutes les pages incluses dans les pages fournies.", + "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de noms.", "apihelp-query+templates-param-limit": "Combien de modèles renvoyer.", "apihelp-query+templates-param-templates": "Lister uniquement ces modèles. Utile pour vérifier si une certaine page utilise un modèle donné.", "apihelp-query+templates-param-dir": "La direction dans laquelle lister.", - "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page Accueil.", + "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page Main Page.", "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle utilisé sur Main Page.", - "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de nom {{ns:user}} et {{ns:template}} qui sont inclues dans la page Main Page.", - "apihelp-query+tokens-description": "Récupère les jetons pour les actions de modification de données.", + "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de noms {{ns:user}} et {{ns:template}} qui sont inclues dans la page Main Page.", + "apihelp-query+tokens-summary": "Récupère les jetons pour les actions de modification de données.", "apihelp-query+tokens-param-type": "Types de jeton à demander.", - "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut)", - "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille", - "apihelp-query+transcludedin-description": "Trouver toutes les pages qui incluent les pages données.", + "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut).", + "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille.", + "apihelp-query+transcludedin-summary": "Trouver toutes les pages qui incluent les pages données.", "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :", "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de page de chaque page.", "apihelp-query+transcludedin-paramvalue-prop-title": "Titre de chaque page.", @@ -1132,14 +1168,14 @@ "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.", "apihelp-query+transcludedin-example-simple": "Obtenir une liste des pages incluant Main Page.", "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant Main Page.", - "apihelp-query+usercontribs-description": "Obtenir toutes les modifications par un utilisateur.", + "apihelp-query+usercontribs-summary": "Obtenir toutes les modifications d'un utilisateur.", "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.", "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.", "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.", "apihelp-query+usercontribs-param-user": "Utilisateurs pour lesquels il faut récupérer les contributions. Ne peut pas être utilisé avec $1userid ou $1userprefix.", "apihelp-query+usercontribs-param-userprefix": "Récupérer les contributions pour tous les utilisateurs dont les noms commencent par cette valeur. Ne peut pas être utilisé avec $1user ou $1userids.", "apihelp-query+usercontribs-param-userids": "Utilisateurs pour lesquels il faut récupérer les contributions. Ne peut pas être utilisé avec $1user ou $1userprefix.", - "apihelp-query+usercontribs-param-namespace": "Lister uniquement les contributions dans ces espaces de nom.", + "apihelp-query+usercontribs-param-namespace": "Lister uniquement les contributions dans ces espaces de noms.", "apihelp-query+usercontribs-param-prop": "Inclure des informations supplémentaires:", "apihelp-query+usercontribs-paramvalue-prop-ids": "Ajoute l’ID de page et l’ID de révision.", "apihelp-query+usercontribs-paramvalue-prop-title": "Ajoute le titre et l’ID d’espace de noms de la page.", @@ -1149,14 +1185,14 @@ "apihelp-query+usercontribs-paramvalue-prop-size": "Ajoute la nouvelle taille de la modification.", "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Ajoute le delta de taille de la modification par rapport à son parent.", "apihelp-query+usercontribs-paramvalue-prop-flags": "Ajoute les marques de la modification.", - "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications patrouillées.", + "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications relues.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Liste les balises de la modification.", - "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : $2show=!minor.\n\nSi $2show=patrolled ou $2show=!patrolled est positionné, les révisions plus anciennes que [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.", + "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : $2show=!minor.\n\nSi $2show=patrolled ou $2show=!patrolled est positionné, les révisions plus anciennes que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.", "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.", - "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications qui sont la dernière révision.", + "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications de la dernière révision.", "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur Exemple.", "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe 192.0.2..", - "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.", + "apihelp-query+userinfo-summary": "Obtenir des informations sur l’utilisateur courant.", "apihelp-query+userinfo-param-prop": "Quelles informations inclure :", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Ajoute une balise messages si l’utilisateur actuel a des messages en cours.", @@ -1165,8 +1201,8 @@ "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.", "apihelp-query+userinfo-paramvalue-prop-rights": "Liste tous les droits qu’a l’utilisateur actuel.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.", - "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a défini l’utilisateur actuel.", - "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obsolete. Obtenir un jeton pour modifier les préférences de l’utilisateur actuel.", + "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a définies l’utilisateur actuel.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obtenir un jeton pour modifier les préférences de l’utilisateur actuel.", "apihelp-query+userinfo-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur actuel.", "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.", "apihelp-query+userinfo-paramvalue-prop-realname": "Ajoute le vrai nom de l’utilisateur actuel.", @@ -1176,12 +1212,12 @@ "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie $2 s’il y en a plus).", "apihelp-query+userinfo-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.", "apihelp-query+userinfo-param-attachedwiki": "Avec $1prop=centralids, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.", - "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel", - "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel", - "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs", + "apihelp-query+userinfo-example-simple": "Obtenir des informations sur l’utilisateur actuel.", + "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel.", + "apihelp-query+users-summary": "Obtenir des informations sur une liste d’utilisateurs", "apihelp-query+users-param-prop": "Quelles informations inclure :", "apihelp-query+users-paramvalue-prop-blockinfo": "Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.", - "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auquel appartient chaque utilisateur.", + "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auxquels appartient chaque utilisateur.", "apihelp-query+users-paramvalue-prop-groupmemberships": "Liste les groupes auxquels chaque utilisateur a été explicitement affecté, avec la date d’expiration de l’appartenance à chaque groupe.", "apihelp-query+users-paramvalue-prop-implicitgroups": "Liste tous les groupes dont un utilisateur est automatiquement membre.", "apihelp-query+users-paramvalue-prop-rights": "Liste tous les droits qu’a un utilisateur.", @@ -1192,11 +1228,11 @@ "apihelp-query+users-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.", "apihelp-query+users-paramvalue-prop-cancreate": "Indique si un compte peut être créé pour les noms d’utilisateurs valides mais non enregistrés.", "apihelp-query+users-param-attachedwiki": "Avec $1prop=centralids, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.", - "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.", + "apihelp-query+users-param-users": "Une liste d'utilisateurs pour lesquels obtenir des l’informations.", "apihelp-query+users-param-userids": "Une liste d’ID utilisateur pour lesquels obtenir des informations.", - "apihelp-query+users-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-query+users-param-token": "Utiliser [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] à la place.", "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur Example.", - "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages dans la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlist-summary": "Obtenir les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.", "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.", "apihelp-query+watchlist-param-end": "L’horodatage auquel arrêter l’énumération.", @@ -1205,7 +1241,7 @@ "apihelp-query+watchlist-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.", "apihelp-query+watchlist-param-limit": "Combien de résultats au total renvoyer par demande.", "apihelp-query+watchlist-param-prop": "Quelles propriétés supplémentaires obtenir :", - "apihelp-query+watchlist-paramvalue-prop-ids": "Ajoute les IDs de révision et de page", + "apihelp-query+watchlist-paramvalue-prop-ids": "Ajoute les IDs de révision et de page.", "apihelp-query+watchlist-paramvalue-prop-title": "Ajoute le titre de la page.", "apihelp-query+watchlist-paramvalue-prop-flags": "Ajoute les marqueurs de la modification.", "apihelp-query+watchlist-paramvalue-prop-user": "Ajoute l’utilisateur ayant fait la modification.", @@ -1213,27 +1249,27 @@ "apihelp-query+watchlist-paramvalue-prop-comment": "Ajoute le commentaire de la modification.", "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé de la modification.", "apihelp-query+watchlist-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.", - "apihelp-query+watchlist-paramvalue-prop-patrol": "Marque les modifications patrouillées.", + "apihelp-query+watchlist-paramvalue-prop-patrol": "Marque les modifications relues.", "apihelp-query+watchlist-paramvalue-prop-sizes": "Ajoute les tailles ancienne et nouvelle de la page.", "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Ajoute l’horodatage de la dernière notification de la modification à l’utilisateur.", "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.", "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.", "apihelp-query+watchlist-param-type": "Quels types de modification afficher :", - "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page", + "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page.", "apihelp-query+watchlist-paramvalue-type-external": "Modifications externes.", "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.", "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.", "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.", "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.", - "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.", - "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel", + "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsateur) pour autoriser l’accès à la liste de suivi d'un autre utilisateur.", + "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlist-example-allrev": "Chercher les informations sur toutes les modifications récentes des pages de la liste de suivi de l’utilisateur actuel", "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel", + "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur Exemple.", - "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.", - "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.", + "apihelp-query+watchlistraw-summary": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de noms fournis.", "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.", "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :", "apihelp-query+watchlistraw-paramvalue-prop-changed": "Ajoute l’horodatage de la dernière notification de l’utilisateur à propos de la modification.", @@ -1243,17 +1279,17 @@ "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.", "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", - "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel", - "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.", + "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel.", + "apihelp-removeauthenticationdata-summary": "Supprimer les données d’authentification pour l’utilisateur actuel.", "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.", - "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] pour utiliser ce module.", + "apihelp-resetpassword-summary": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.", + "apihelp-resetpassword-extended-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] pour utiliser ce module.", "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.", "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.", "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur Exemple.", - "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec une adresse email user@example.com.", - "apihelp-revisiondelete-description": "Supprimer et annuler la suppression des révisions.", + "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec l’adresse user@example.com.", + "apihelp-revisiondelete-summary": "Supprimer et rétablir des révisions.", "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.", "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.", "apihelp-revisiondelete-param-ids": "Identifiants pour les révisions à supprimer.", @@ -1262,9 +1298,10 @@ "apihelp-revisiondelete-param-suppress": "S’il faut supprimer les données aux administrateurs comme aux autres.", "apihelp-revisiondelete-param-reason": "Motif de suppression ou d’annulation de suppression.", "apihelp-revisiondelete-param-tags": "Balises à appliquer à l’entrée dans le journal de suppression.", - "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision 12345 de la page Main Page", + "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision 12345 de la page Main Page.", "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal 67890 avec le motif Violation de Biographie de Personne Vivante.", - "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.", + "apihelp-rollback-summary": "Annuler les dernières modifications de la page.", + "apihelp-rollback-extended-description": "Si le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.", "apihelp-rollback-param-title": "Titre de la page à restaurer. Impossible à utiliser avec $1pageid.", "apihelp-rollback-param-pageid": "ID de la page à restaurer. Impossible à utiliser avec $1title.", "apihelp-rollback-param-tags": "Balises à appliquer à la révocation.", @@ -1272,11 +1309,12 @@ "apihelp-rollback-param-summary": "Personnaliser le résumé de la modification. S’il est vide, le résumé par défaut sera utilisé.", "apihelp-rollback-param-markbot": "Marquer les modifications annulées et les modifications annulées comme robot.", "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.", - "apihelp-rollback-example-simple": "Annuler les dernières modifications à [Main Page par l’utilisateur Exemple.", + "apihelp-rollback-example-simple": "Annuler les dernières modifications à Main Page par l’utilisateur Example.", "apihelp-rollback-example-summary": "Annuler les dernières modifications de la page Main Page par l’utilisateur à l’adresse IP 192.0.2.5 avec le résumé Annulation de vandalisme, et marquer ces modifications et l’annulation comme modifications de robots.", - "apihelp-rsd-description": "Exporter un schéma RSD (Découverte Très Simple).", + "apihelp-rsd-summary": "Exporter un schéma RSD (Découverte Très Simple).", "apihelp-rsd-example-simple": "Exporter le schéma RSD", - "apihelp-setnotificationtimestamp-description": "Mettre à jour l’horodatage de notification pour les pages suivies.\n\nCela affecte la mise en évidence des pages modifiées dans la liste de suivi et l’historique, et l’envoi de courriel quand la préférence « {{int:tog-enotifwatchlistpages}} » est activée.", + "apihelp-setnotificationtimestamp-summary": "Mettre à jour l’horodatage de notification pour les pages suivies.", + "apihelp-setnotificationtimestamp-extended-description": "Cela affecte la mise en évidence des pages modifiées dans la liste de suivi et l’historique, et l’envoi de courriel quand la préférence « {{int:tog-enotifwatchlistpages}} » est activée.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Travailler sur toutes les pages suivies.", "apihelp-setnotificationtimestamp-param-timestamp": "Horodatage auquel dater la notification.", "apihelp-setnotificationtimestamp-param-torevid": "Révision pour laquelle fixer l’horodatage de notification (une page uniquement).", @@ -1285,8 +1323,8 @@ "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la Page principale.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour Page principale afin que toutes les modifications depuis le 1 janvier 2012 soient non vues", "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms {{ns:user}}.", - "apihelp-setpagelanguage-description": "Modifier la langue d’une page.", - "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] pour utiliser cette action.", + "apihelp-setpagelanguage-summary": "Modifier la langue d’une page.", + "apihelp-setpagelanguage-extended-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] pour utiliser cette action.", "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec $1pageid.", "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec $1title.", "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser defaut pour réinitialiser la page sur la langue par défaut du contenu du wiki.", @@ -1294,7 +1332,8 @@ "apihelp-setpagelanguage-param-tags": "Modifier les balises à appliquer à l'entrée du journal résultant de cette action.", "apihelp-setpagelanguage-example-language": "Changer la langue de la page principale en basque.", "apihelp-setpagelanguage-example-default": "Remplacer la langue de la page ayant l'ID 123 par la langue par défaut du contenu du wiki.", - "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.", + "apihelp-stashedit-summary": "Préparer des modifications dans le cache partagé.", + "apihelp-stashedit-extended-description": "Ceci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.", "apihelp-stashedit-param-title": "Titre de la page en cours de modification.", "apihelp-stashedit-param-section": "Numéro de section. 0 pour la section du haut, new pour une nouvelle section.", "apihelp-stashedit-param-sectiontitle": "Le titre pour une nouvelle section.", @@ -1304,21 +1343,22 @@ "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.", "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.", "apihelp-stashedit-param-summary": "Résumé du changement", - "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.", + "apihelp-tag-summary": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.", "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.", - "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.", - "apihelp-tag-param-logid": "Un ou plus IDs d’entrée de journal à partir desquels ajouter ou supprimer la balise.", + "apihelp-tag-param-revid": "Un ou plusieurs IDs de révision à partir desquels ajouter ou supprimer la balise.", + "apihelp-tag-param-logid": "Un ou plusieurs IDs d’entrée de journal à partir desquels ajouter ou supprimer la balise.", "apihelp-tag-param-add": "Balises à ajouter. Seules les balises définies manuellement peuvent être ajoutées.", "apihelp-tag-param-remove": "Balises à supprimer. Seules les balises qui sont soit définies manuellement soit pas du tout définies peuvent être supprimées.", "apihelp-tag-param-reason": "Motif de la modification.", "apihelp-tag-param-tags": "Balises à appliquer à l’entrée de journal qui sera créée en résultat de cette action.", "apihelp-tag-example-rev": "Ajoute la balise vandalism à partir de l’ID de révision 123 sans indiquer de motif", "apihelp-tag-example-log": "Supprimer la balise spam à partir de l’ID d’entrée de journal 123 avec le motif Wrongly applied", - "apihelp-tokens-description": "Obtenir les jetons pour les actions modifiant les données.\n\nCe module est obsolète, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-summary": "Obtenir des jetons pour des actions de modification des données.", + "apihelp-tokens-extended-description": "Ce module est désuet, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-tokens-param-type": "Types de jeton à demander.", "apihelp-tokens-example-edit": "Récupérer un jeton de modification (par défaut).", "apihelp-tokens-example-emailmove": "Récupérer un jeton de courriel et un jeton de déplacement.", - "apihelp-unblock-description": "Débloquer un utilisateur.", + "apihelp-unblock-summary": "Débloquer un utilisateur.", "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via list=blocks). Impossible à utiliser avec $1user ou $1userid.", "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que $1id ou $1userid.", "apihelp-unblock-param-userid": "ID de l'utilisateur à débloquer. Ne peut être utilisé avec $1id ou $1user.", @@ -1326,7 +1366,8 @@ "apihelp-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.", "apihelp-unblock-example-id": "Lever le blocage d’ID #105.", "apihelp-unblock-example-user": "Débloquer l’utilisateur Bob avec le motif Désolé Bob.", - "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "Restituer les versions d'une page supprimée.", + "apihelp-undelete-extended-description": "Une liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "Titre de la page à restaurer.", "apihelp-undelete-param-reason": "Motif de restauration.", "apihelp-undelete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de suppression.", @@ -1335,29 +1376,30 @@ "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.", "apihelp-undelete-example-page": "Annuler la suppression de la page Main Page.", "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page Main Page.", - "apihelp-unlinkaccount-description": "Supprimer un compte tiers lié de l’utilisateur actuel.", + "apihelp-unlinkaccount-summary": "Supprimer un compte tiers lié de l’utilisateur actuel.", "apihelp-unlinkaccount-example-simple": "Essayer de supprimer le lien de l’utilisateur actuel pour le fournisseur associé avec FooAuthenticationRequest.", - "apihelp-upload-description": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre $1file.\n* Téléverser le fichier par morceaux, en utilisant les paramètres $1filesize, $1chunk, and $1offset.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre $1url.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre $1filekey.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant multipart/form-data) en envoyant le multipart/form-data.", + "apihelp-upload-summary": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.", + "apihelp-upload-extended-description": "Plusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre $1file.\n* Téléverser le fichier par morceaux, en utilisant les paramètres $1filesize, $1chunk, and $1offset.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre $1url.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre $1filekey.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant multipart/form-data) en envoyant le multipart/form-data.", "apihelp-upload-param-filename": "Nom de fichier cible.", - "apihelp-upload-param-comment": "Télécharger le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si $1text n’est pas spécifié.", - "apihelp-upload-param-tags": "Modifier les balises à appliquer à l’entrée du journal de téléchargement et à la révision de la page du fichier.", + "apihelp-upload-param-comment": "Téléverser le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si $1text n’est pas spécifié.", + "apihelp-upload-param-tags": "Modifier les balises à appliquer à l’entrée du journal de téléversement et à la révision de la page du fichier.", "apihelp-upload-param-text": "Texte de page initiale pour les nouveaux fichiers.", "apihelp-upload-param-watch": "Suivre la page.", "apihelp-upload-param-watchlist": "Ajouter ou supprimer sans condition la page de la liste de suivi de l’utilisateur actuel, utiliser les préférences ou ne pas changer le suivi.", "apihelp-upload-param-ignorewarnings": "Ignorer tous les avertissements.", "apihelp-upload-param-file": "Contenu du fichier.", "apihelp-upload-param-url": "URL où chercher le fichier.", - "apihelp-upload-param-filekey": "Clé identifiant un téléchargement précédent temporairement mis en attente.", + "apihelp-upload-param-filekey": "Clé identifiant un téléversement précédent temporairement mis en attente.", "apihelp-upload-param-sessionkey": "Comme $1filekey, conservé pour des raisons de compatibilité descendante.", "apihelp-upload-param-stash": "Si positionné, le serveur conservera temporairement le fichier au lieu de l’ajouter au dépôt.", - "apihelp-upload-param-filesize": "Taille du fichier de tout le téléchargement.", + "apihelp-upload-param-filesize": "Taille du téléversement entier.", "apihelp-upload-param-offset": "Décalage du bloc en octets.", "apihelp-upload-param-chunk": "Partie du contenu.", - "apihelp-upload-param-async": "Faire de façon asynchrone les grosses opérations sur les fichiers quand c’est possible.", - "apihelp-upload-param-checkstatus": "Récupérer uniquement l’état de téléchargement pour la clé de fichier donnée.", - "apihelp-upload-example-url": "Télécharger depuis une URL", - "apihelp-upload-example-filekey": "Terminer un téléchargement qui a échoué à cause d’avertissements", - "apihelp-userrights-description": "Modifier l’appartenance d’un utilisateur à un groupe.", + "apihelp-upload-param-async": "Faire les grosses opérations de fichiers de façon asynchrone quand c’est possible.", + "apihelp-upload-param-checkstatus": "Récupérer uniquement l’état de téléversement pour la clé de fichier donnée.", + "apihelp-upload-example-url": "Téléverser depuis une URL", + "apihelp-upload-example-filekey": "Terminer un téléversement qui a échoué à cause d’avertissements", + "apihelp-userrights-summary": "Modifier l’appartenance d’un utilisateur à un groupe.", "apihelp-userrights-param-user": "Nom d’utilisateur.", "apihelp-userrights-param-userid": "ID de l’utilisateur.", "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes, ou s’ils sont déjà membres, mettre à jour la date d’expiration de leur appartenance à ce groupe.", @@ -1365,17 +1407,18 @@ "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.", "apihelp-userrights-param-reason": "Motif pour la modification.", "apihelp-userrights-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal des droits utilisateur.", - "apihelp-userrights-example-user": "Ajouter l’utilisateur FooBot au groupe bot, et le supprimer des groupes sysop et bureaucrat.", + "apihelp-userrights-example-user": "Ajouter l’utilisateur FooBot au groupe bot, et le supprimer des groupes sysop et bureaucrat.", "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID 123 au groupe robot, et le supprimer des groupes sysop et bureaucrate.", "apihelp-userrights-example-expiry": "Ajouter l'utilisateur SometimeSysop au groupe sysop pour 1 mois.", - "apihelp-validatepassword-description": "Valider un mot de passe en suivant les règles des mots de passe du wiki.\n\nLa validation est Good si le mot de passe est acceptable, Change s'il peut être utilisé pour se connecter et doit être changé, ou Invalid s'il n'est pas utilisable.", + "apihelp-validatepassword-summary": "Valider un mot de passe conformément aux règles concernant les mots de passe du wiki.", + "apihelp-validatepassword-extended-description": "La validation est Good si le mot de passe est acceptable, Change s'il peut être utilisé pour se connecter et doit être changé, ou Invalid s'il n'est pas utilisable.", "apihelp-validatepassword-param-password": "Mot de passe à valider.", "apihelp-validatepassword-param-user": "Nom de l'utilisateur, pour tester la création de compte. L'utilisateur ne doit pas déja exister.", "apihelp-validatepassword-param-email": "Adresse courriel, pour tester la création de compte.", "apihelp-validatepassword-param-realname": "Vrai nom, pour tester la création de compte.", "apihelp-validatepassword-example-1": "Valider le mot de passe foobar pour l'utilisateur actuel.", "apihelp-validatepassword-example-2": "Valider le mot de passe qwerty pour la création de l'utilisateur Example.", - "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.", + "apihelp-watch-summary": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.", "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt $1titles.", "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.", "apihelp-watch-example-watch": "Suivre la page Main Page.", @@ -1383,25 +1426,30 @@ "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal", "apihelp-format-example-generic": "Renvoyer le résultat de la requête dans le format $1.", "apihelp-format-param-wrappedhtml": "Renvoyer le HTML avec une jolie mise en forme et les modules ResourceLoader associés comme un objet JSON.", - "apihelp-json-description": "Extraire les données au format JSON.", + "apihelp-json-summary": "Extraire les données au format JSON.", "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.", "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale. Valeur par défaut quand formatversion ne vaut pas 1.", "apihelp-json-param-ascii": "Si spécifié, encode toutes ses séquences d’échappement non ASCII utilisant l’hexadécimal. Valeur par défaut quand formatversion vaut 1.", "apihelp-json-param-formatversion": "Mise en forme de sortie :\n;1:Format rétro-compatible (booléens de style XML, clés * pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement 2), peut changer sans avertissement.", - "apihelp-jsonfm-description": "Extraire les données au format JSON (affiché proprement en HTML).", - "apihelp-none-description": "Ne rien extraire.", - "apihelp-php-description": "Extraire les données au format sérialisé de PHP.", + "apihelp-jsonfm-summary": "Extraire les données au format JSON (affiché proprement en HTML).", + "apihelp-none-summary": "Ne rien extraire.", + "apihelp-php-summary": "Extraire les données au format sérialisé de PHP.", "apihelp-php-param-formatversion": "Mise en forme de la sortie :\n;1:Format rétro-compatible (bool&ens de style XML, clés * pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement 2), peut changer sans avertissement.", - "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).", - "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).", - "apihelp-xml-description": "Extraire les données au format XML.", + "apihelp-phpfm-summary": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).", + "apihelp-rawfm-summary": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).", + "apihelp-xml-summary": "Extraire les données au format XML.", "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:MediaWiki}} se terminant par .xsl.", "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.", - "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).", + "apihelp-xmlfm-summary": "Extraire les données au format XML (affiché proprement en HTML).", "api-format-title": "Résultat de l’API de MediaWiki", - "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", - "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", + "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", + "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de débogage, et n’est pas approprié pour une utilisation applicative.\n\nVoir la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", + "api-format-prettyprint-header-hyperlinked": "Voici la représentation HTML du format $1. HTML est bien pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez [$3 format=$2].\n\nVoir la [[mw:API|documentation complète]], ou l’ [[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", "api-format-prettyprint-status": "Cette réponse serait retournée avec l'état HTTP $1 $2.", + "api-login-fail-aborted": "L’authentification nécessite une interaction avec l’utilisateur, qui n’est pas prise en charge par action=login. Pour pouvoir se connecter avec action=login, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion du compte principal, voyez [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "L’authentification nécessite une interaction avec l’utilisateur, qui n’est pas prise en charge par action=login. Pour se connecter, voyez [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "Impossible de se connecter en utilisant $1.", + "api-login-fail-sameorigin": "Impossible de se connecter quand la politique de même origine n’est pas appliquée.", "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.", "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.", "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.", @@ -1412,7 +1460,8 @@ "api-help-title": "Aide de l’API de MediaWiki", "api-help-lead": "Ceci est une page d’aide de l’API de MediaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API", "api-help-main-header": "Module principal", - "api-help-flag-deprecated": "Ce module est obsolète.", + "api-help-undocumented-module": "Aucune documentation pour le module $1.", + "api-help-flag-deprecated": "Ce module est désuet.", "api-help-flag-internal": "Ce module est interne ou instable. Son fonctionnement peut être modifié sans préavis.", "api-help-flag-readrights": "Ce module nécessite des droits de lecture.", "api-help-flag-writerights": "Ce module nécessite des droits d’écriture.", @@ -1424,7 +1473,7 @@ "api-help-license-noname": "Licence : [[$1|Voir le lien]]", "api-help-license-unknown": "Licence : inconnue", "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :", - "api-help-param-deprecated": "Obsolète.", + "api-help-param-deprecated": "Désuet.", "api-help-param-required": "Ce paramètre est obligatoire.", "api-help-datatypes-header": "Type de données", "api-help-datatypes": "Les entrées dans MédiaWiki doivent être en UTF-8 à la norme NFC. MédiaWiki peut tenter de convertir d’autres types d’entrée, mais cela peut faire échouer certaines opérations (comme les [[Special:ApiHelp/edit|modifications]] avec contrôles MD5) to fail.\n\nCertains types de paramètre dans les requêtes de l’API nécessitent plus d’explication :\n;boolean\n:Les paramètres booléens fonctionnent comme des cases à cocher HTML : si le paramètre est spécifié, quelle que soit sa valeur, il est considéré comme vrai. Pour une valeur fausse, enlever complètement le paramètre.\n;timestamp\n:Les horodatages peuvent être spécifiés sous différentes formes. Date et heure ISO 8601 est recommandé. Toutes les heures sont en UTC, tout fuseau horaire inclus est ignoré.\n:* Date et heure ISO 8601, 2001-01-15T14:56:00Z (la ponctuation et Z sont facultatifs)\n:* Date et heure ISO 8601 avec fractions de seconde (ignorées), 2001-01-15T14:56:00.00001Z (tirets, deux-points et Z sont facultatifs)\n:* Format MédiaWiki, 20010115145600\n:* Format numérique générique, 2001-01-15 14:56:00 (fuseau horaire facultatif en GMT, +##, ou -## sont ignorés)\n:* Format EXIF, 2001:01:15 14:56:00\n:*Format RFC 2822 (le fuseau horaire est facultatif), Mon, 15 Jan 2001 14:56:00\n:* Format RFC 850 (le fuseau horaire est facultatif), Monday, 15-Jan-2001 14:56:00\n:* Format ctime C, Mon Jan 15 14:56:00 2001\n:* Secondes depuis 1970-01-01T00:00:00Z sous forme d’entier de 1 à 13 chiffres (sans 0)\n:* La chaîne now", @@ -1448,8 +1497,8 @@ "api-help-param-default-empty": "Par défaut : (vide)", "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Pour rester compatible, le jeton utilisé dans l’IHM web est aussi accepté.", - "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Manual:$wgMiserMode|mode minimal]].", - "api-help-param-limited-in-miser-mode": "NOTE : Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que $1limit renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", + "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]].", + "api-help-param-limited-in-miser-mode": "NOTE : Du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que $1limit renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", "api-help-param-direction": "Dans quelle direction énumérer :\n;newer:Lister les plus anciens en premier. Note : $1start doit être avant $1end.\n;older:Lister les nouveaux en premier (par défaut). Note : $1start doit être postérieur à $1end.", "api-help-param-continue": "Quand plus de résultats sont disponibles, utiliser cela pour continuer.", "api-help-param-no-description": "(aucune description)", @@ -1479,8 +1528,8 @@ "apierror-badcontinue": "Paramètre de continuation non valide. Vous devez passer la valeur d’origine renvoyée par la requête précédente.", "apierror-baddiff": "La différence ne peut être récupérée. Une ou les deux révisions n’existent pas ou vous n’avez pas le droit de les voir.", "apierror-baddiffto": "$1diffto doit être fixé à un nombre positif ou nul, prev, next ou cur.", - "apierror-badformat-generic": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2.", - "apierror-badformat": "Le format demandé $1 n’est pas supporté pour le modèle de contenu $2 utilisé par $3.", + "apierror-badformat-generic": "Le format demandé $1 n’est pas pris en charge pour le modèle de contenu $2.", + "apierror-badformat": "Le format demandé $1 n’est pas pris en charge pour le modèle de contenu $2 utilisé par $3.", "apierror-badgenerator-notgenerator": "Le module $1 ne peut pas être utilisé comme générateur.", "apierror-badgenerator-unknown": "generator=$1 inconnu.", "apierror-badip": "Paramètre IP non valide.", @@ -1491,22 +1540,22 @@ "apierror-badquery": "Requête invalide.", "apierror-badtimestamp": "Valeur non valide « $2 » pour le paramètre de référence horaire $1.", "apierror-badtoken": "Jeton CSRF non valide.", - "apierror-badupload": "Le paramètre de téléchargement de fichier $1 n’est pas un téléchargement de fichier ; assurez-vous d’utiliser multipart/form-data pour votre POST et d’inclure un nom de fichier dans l’entête Content-Disposition.", + "apierror-badupload": "Le paramètre de téléversement de fichier $1 n’est pas un téléversement de fichier ; assurez-vous d’utiliser multipart/form-data pour votre POST et d’inclure un nom de fichier dans l’entête Content-Disposition.", "apierror-badurl": "Valeur « $2 » non valide pour le paramètre d’URL $1.", "apierror-baduser": "Valeur « $2 » non valide pour le paramètre utilisateur $1.", "apierror-badvalue-notmultivalue": "La séparation multi-valeur U+001F ne peut être utilisée que pour des paramètres multi-valeurs.", "apierror-bad-watchlist-token": "Jeton de liste de suivi fourni non valide. Veuillez mettre un jeton valide dans [[Special:Preferences]].", "apierror-blockedfrommail": "Vous avez été bloqué pour l’envoi de courriel.", "apierror-blocked": "Vous avez été bloqué pour modifier.", - "apierror-botsnotsupported": "Cette interface n’est pas supportée pour les robots.", - "apierror-cannot-async-upload-file": "Les paramètres async et file ne peuvent pas être combinés. Si vous voulez un traitement asynchrone de votre fichier téléchargé, importez-le d’abord dans la réserve (en utilisant le paramètre stash) puis publiez le fichier importé de façon asynchrone (en utilisant filekey et async).", + "apierror-botsnotsupported": "Cette interface n’est pas prise en charge pour les robots.", + "apierror-cannot-async-upload-file": "Les paramètres async et file ne peuvent pas être combinés. Si vous voulez un traitement asynchrone de votre fichier téléversé, importez-le d’abord dans la réserve (en utilisant le paramètre stash) puis publiez le fichier importé de façon asynchrone (en utilisant filekey et async).", "apierror-cannotreauthenticate": "Cette action n’est pas disponible car votre identité ne peut pas être vérifiée.", "apierror-cannotviewtitle": "Vous n’êtes pas autorisé à voir $1.", "apierror-cantblock-email": "Vous n’avez pas le droit de bloquer des utilisateurs pour envoyer des courriels via ce wiki.", "apierror-cantblock": "Vous n’avez pas le droit de bloquer des utilisateurs.", "apierror-cantchangecontentmodel": "Vous n’avez pas le droit de modifier le modèle de contenu d’une page.", - "apierror-canthide": "Vous n’avez pas le droit de masquer les noms d’utilisateur du journal de blog.", - "apierror-cantimport-upload": "Vous n’avez pas le droit d’importer des pages téléchargées.", + "apierror-canthide": "Vous n’avez pas le droit de masquer les noms d’utilisateur du journal de blocages.", + "apierror-cantimport-upload": "Vous n’avez pas le droit d’importer des pages téléversées.", "apierror-cantimport": "Vous n’avez pas le droit d’importer des pages.", "apierror-cantoverwrite-sharedfile": "Le fichier cible existe dans un dépôt partagé et vous n’avez pas le droit de l’écraser.", "apierror-cantsend": "Vous n’êtes pas connecté, vous n’avez pas d’adresse de courriel confirmée, ou vous n’êtes pas autorisé à envoyer des courriels aux autres utilisateurs, donc vous ne pouvez envoyer de courriel.", @@ -1514,11 +1563,12 @@ "apierror-changeauth-norequest": "Échec à la création de la requête de modification.", "apierror-chunk-too-small": "La taille minimale d’un segment est de $1 {{PLURAL:$1|octet|octets}} pour les segments hors le dernier.", "apierror-cidrtoobroad": "Les plages CIDR $1 plus large que /$2 ne sont pas acceptées.", - "apierror-compare-inputneeded": "Un titre, un ID de page ou un numéro de révision est nécessaire pour les paramètres from et to.", + "apierror-compare-no-title": "Impossible de faire une transformation avant enregistrement sans titre. Essayez de spécifier fromtitle ou totitle.", + "apierror-compare-relative-to-nothing": "Pas de révision 'depuis' pour torelative à laquelle se rapporter.", "apierror-contentserializationexception": "Échec de sérialisation du contenu : $1", "apierror-contenttoobig": "Le contenu que vous avez fourni dépasse la limite de taille d’un article, qui est de $1 {{PLURAL:$1|kilooctet|kilooctets}}.", - "apierror-copyuploadbaddomain": "Les téléchargements par URL ne sont pas autorisés pour ce domaine.", - "apierror-copyuploadbadurl": "Les téléchargements ne sont pas autorisés depuis cette URL.", + "apierror-copyuploadbaddomain": "Les téléversements par URL ne sont pas autorisés pour ce domaine.", + "apierror-copyuploadbadurl": "Les téléversements ne sont pas autorisés depuis cette URL.", "apierror-create-titleexists": "Les titres existants ne peuvent pas être protégés avec create.", "apierror-csp-report": "Erreur lors du traitement du rapport CSP: $1.", "apierror-databaseerror": "[$1] erreur de requête de base de données.", @@ -1558,10 +1608,12 @@ "apierror-maxlag": "Attente de $2 : $1 {{PLURAL:$1|seconed|secondes}} de délai.", "apierror-mimesearchdisabled": "La recherche MIME est désactivée en mode Misère.", "apierror-missingcontent-pageid": "Contenu manquant pour la page d’ID $1.", + "apierror-missingcontent-revid": "Contenu de la révision d’ID $1 manquant.", "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Le paramètre|Au moins un des paramètres}} $1 est obligatoire.", "apierror-missingparam-one-of": "{{PLURAL:$2|Le paramètre|Un des paramètres}} $1 est obligatoire.", "apierror-missingparam": "Le paramètre $1 doit être défini.", "apierror-missingrev-pageid": "Aucune révision actuelle de la page d’ID $1.", + "apierror-missingrev-title": "Aucune révision actuelle de titre $1.", "apierror-missingtitle-createonly": "Les titres manquants ne peuvent être protégés qu’avec create.", "apierror-missingtitle": "La page que vous avez spécifié n’existe pas.", "apierror-missingtitle-byname": "La page $1 n’existe pas.", @@ -1573,14 +1625,14 @@ "apierror-mustbeloggedin-generic": "Vous devez être connecté.", "apierror-mustbeloggedin-linkaccounts": "Vous devez être connecté pour lier des comptes.", "apierror-mustbeloggedin-removeauth": "Vous devez être connecté pour supprimer les données d’authentification.", - "apierror-mustbeloggedin-uploadstash": "La réserve de téléchargement n’est disponible que pour les utilisateurs connectés.", + "apierror-mustbeloggedin-uploadstash": "La réserve de téléversement n’est disponible que pour les utilisateurs connectés.", "apierror-mustbeloggedin": "Vous devez être connecté pour $1.", "apierror-mustbeposted": "Le module $1 nécessite une requête POST.", "apierror-mustpostparams": "{{PLURAL:$2|Le paramètre suivant a été trouvé|Les paramètres suivants ont été trouvés}} dans la chaîne de requête, mais doit être dans le corps du POST : $1.", "apierror-noapiwrite": "La modification de ce wiki via l’API est désactivée. Assurez-vous que la déclaration $wgEnableWriteAPI=true; st inclue dans le fichier LocalSettings.php du wiki.", "apierror-nochanges": "Aucun changement n’a été demandé.", "apierror-nodeleteablefile": "Pas de telle ancienne version du fichier.", - "apierror-no-direct-editing": "La modification directe via l’API n’est pas supportée pour le modèle de contenu $1 utilisée par $2.", + "apierror-no-direct-editing": "La modification directe via l’API n’est pas prise en charge pour le modèle de contenu $1 utilisé par $2.", "apierror-noedit-anon": "Les utilisateurs anonymes ne peuvent pas modifier les pages.", "apierror-noedit": "Vous n’avez pas le droit de modifier les pages.", "apierror-noimageredirect-anon": "Les utilisateurs anonymes ne peut pas créer des redirections d’image.", @@ -1594,14 +1646,15 @@ "apierror-nosuchuserid": "Il n'y a pas d'utilisateur ayant l'ID $1.", "apierror-notarget": "Vous n’avez pas spécifié une cible valide pour cette action.", "apierror-notpatrollable": "La révision r$1 ne peut pas être patrouillée car elle est trop ancienne.", - "apierror-nouploadmodule": "Aucun module de téléchargement défini.", + "apierror-nouploadmodule": "Aucun module de téléversement défini.", + "apierror-offline": "Impossible de continuer du fait de problèmes de connexion au réseau. Assurez-vous d’avoir une connexion internet opérationnelle et réessayez.", "apierror-opensearch-json-warnings": "Les avertissements ne peuvent pas être représentés dans le format JSON OpenSearch.", "apierror-pagecannotexist": "L’espace de noms ne permet pas de pages réelles.", "apierror-pagedeleted": "La page a été supprimée depuis que vous avez récupéré son horodatage.", "apierror-pagelang-disabled": "Il n'est pas possible de modifier la langue d'une page sur ce wiki.", "apierror-paramempty": "Le paramètre $1 ne peut pas être vide.", - "apierror-parsetree-notwikitext": "prop=parsetree n’est supporté que pour le contenu wikitexte.", - "apierror-parsetree-notwikitext-title": "prop=parsetree n’est supporté que pour le contenu wikitexte. $1 utilise le modèle de contenu $2.", + "apierror-parsetree-notwikitext": "prop=parsetree n’est pris en charge que pour le contenu wikitexte.", + "apierror-parsetree-notwikitext-title": "prop=parsetree n’est pris en charge que pour le contenu wikitexte. $1 utilise le modèle de contenu $2.", "apierror-pastexpiry": "Le temps d’expiration « $1 » est dans le passé.", "apierror-permissiondenied": "Vous n’avez pas le droit de $1.", "apierror-permissiondenied-generic": "Autorisation refusée.", @@ -1619,6 +1672,7 @@ "apierror-revdel-mutuallyexclusive": "Le même champ ne peut pas être utilisé à la fois en hide et show.", "apierror-revdel-needtarget": "Un titre cible est nécessaire pour ce type RevDel.", "apierror-revdel-paramneeded": "Au moins une valeur est nécessaire pour hide ou show.", + "apierror-revisions-badid": "Pas de correction trouvée pour le paramètre $1.", "apierror-revisions-norevids": "Le paramètre revids ne peut pas être utilisé avec les options de liste ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, et $1end).", "apierror-revisions-singlepage": "titles, pageids ou un générateur a été utilisé pour fournir plusieurs pages, mais les paramètres $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start et $1end ne peuvent être utilisés que sur une seule page.", "apierror-revwrongpage": "r$1 n'est pas une révision de $2.", @@ -1629,13 +1683,13 @@ "apierror-show": "Paramètre incorrect - des valeurs mutuellement exclusives ne peuvent pas être fournies.", "apierror-siteinfo-includealldenied": "Impossible d’afficher toutes les informatiosn du serveur, sauf si $wgShowHostNames vaut vrai.", "apierror-sizediffdisabled": "La différence de taille est désactivée dans le mode Miser.", - "apierror-spamdetected": "Votre modification a été refusée parce qu'elle contenait un fragment de spam: $1.", + "apierror-spamdetected": "Votre modification a été refusée parce qu’elle contenait un fragment de pourriel : $1.", "apierror-specialpage-cantexecute": "Vous n'avez pas l'autorisation d'afficher les résultats de cette page spéciale.", "apierror-stashedfilenotfound": "Impossible de trouver le fichier dans la réserve: $1.", "apierror-stashedit-missingtext": "Pas de texte en réserve associé à la donnée de hachage.", - "apierror-stashfailed-complete": "Un téléchargement par morceaux est déjà achevé, vérifiez l’état pour plus de détails.", - "apierror-stashfailed-nosession": "Aucune session de téléchargement par morceaux avec cette clé.", - "apierror-stashfilestorage": "Impossible de mettre le téléchargement en réserve: $1", + "apierror-stashfailed-complete": "Un téléversement par morceaux est déjà achevé, vérifiez l’état pour plus de détails.", + "apierror-stashfailed-nosession": "Aucune session de téléversement par morceaux avec cette clé.", + "apierror-stashfilestorage": "Impossible de mettre le téléversement en réserve: $1", "apierror-stashinvalidfile": "Fichier de réserve invalide.", "apierror-stashnosuchfilekey": "Filekey inconnue: $1.", "apierror-stashpathinvalid": "La clé du fichier n'a pas le bon format ou est invalide: $1 .", @@ -1643,6 +1697,7 @@ "apierror-stashzerolength": "Fichier est de longueur nulle, et n'a pas pu être mis dans la réserve: $1.", "apierror-systemblocked": "Vous avez été bloqué automatiquement par MediaWiki.", "apierror-templateexpansion-notwikitext": "Le développement du modèle n'est effectif que sur un contenu wikitext. $1 utilise le modèle de contenu $2.", + "apierror-timeout": "Le serveur n’a pas répondu dans le délai imparti.", "apierror-toofewexpiries": "$1 {{PLURAL:$1|horodatage d’expiration a été fourni|horodatages d’expiration ont été fournis}} alors que $2 {{PLURAL:$2|était attendu|étaient attendus}}.", "apierror-unknownaction": "L'action spécifiée, $1, n'est pas reconnue.", "apierror-unknownerror-editpage": "Erreur inconnue EditPage: $1.", @@ -1662,16 +1717,17 @@ "apiwarn-badurlparam": "Impossible d'analyser $1urlparam pour $2. En utilisant seulement la largeur et la hauteur.", "apiwarn-badutf8": "La valeur passée pour $1 contient des données non valides ou non normalisées. Les données textuelles doivent être de l’Unicode valide normalisé en NFC sans caractères de contrôle c0 autres que HT (\\t), LF (\\n) et CR (\\r).", "apiwarn-checktoken-percentencoding": "Vérifier que les symboles tels que \"+\" dans le jeton sont correctement codés avec des pourcents dans l'URL.", - "apiwarn-deprecation-deletedrevs": "list=deletedrevs est devenu obsolète. Veuillez utiliser prop=deletedrevisions ou list=alldeletedrevisions à la place.", - "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre prop, un format d’héritage a été utilisé pour la sortie. Ce format est obsolète et, dans le futur, une valeur par défaut sera fixée pour le paramètre prop, provoquant ainsi l’utilisation systématique du nouveau format.", + "apiwarn-compare-nocontentmodel": "Aucun modèle de contenu n’a pu être déterminé, $1 est supposé.", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs est devenu désuet. Veuillez utiliser prop=deletedrevisions ou list=alldeletedrevisions à la place.", + "apiwarn-deprecation-expandtemplates-prop": "Comme aucune valeur n’a été spécifiée pour le paramètre prop, un format patrimonial a été utilisé pour la sortie. Ce format est désuet et, dans le futur, une valeur par défaut sera fixée pour le paramètre prop, provoquant ainsi l’utilisation systématique du nouveau format.", "apiwarn-deprecation-httpsexpected": "HTTP est utilisé alors que HTTPS est attendu.", - "apiwarn-deprecation-login-botpw": "La connexion au compte principal via action=login est obsolète et peut ne plus fonctionner sans avertissement. Pour continuer à vous connecter avec action=login, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez action=clientlogin.", - "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via action=login est obsolète et peut ne plus fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez action=clientlogin.", - "apiwarn-deprecation-login-token": "La récupération d’un jeton via action=login est obsolète. Utilisez action=query&meta=tokens&type=login à la place.", - "apiwarn-deprecation-parameter": "Le paramètre $1 est obsolète.", - "apiwarn-deprecation-parse-headitems": "prop=headitems est obsolète depuis MédiaWiki 1.28. Utilisez prop=headhtml lors de la création de nouveaux documents HTML, ou prop=modules|jsconfigvars lors de la mise à jour d’un document côté client.", - "apiwarn-deprecation-purge-get": "L'utilisation de action=purge via un GET est obsolète. Utiliser POST à la place.", - "apiwarn-deprecation-withreplacement": "$1 est obsolète. Veuillez utiliser $2 à la place.", + "apiwarn-deprecation-login-botpw": "La connexion au compte principal via action=login est désuète et peut cesser de fonctionner sans avertissement. Pour continuer à vous connecter avec action=login, voyez [[Special:BotPasswords]]. Pour continuer à utiliser la connexion au compte principal en toute sécurité, voyez action=clientlogin.", + "apiwarn-deprecation-login-nobotpw": "La connexion au compte principal via action=login est désuète et peut cesser de fonctionner sans avertissement. Pour vous connecter en toute sécurité, voyez action=clientlogin.", + "apiwarn-deprecation-login-token": "La récupération d’un jeton via action=login est désuète. Utilisez action=query&meta=tokens&type=login à la place.", + "apiwarn-deprecation-parameter": "Le paramètre $1 est désuet.", + "apiwarn-deprecation-parse-headitems": "prop=headitems est désuet depuis MédiaWiki 1.28. Utilisez prop=headhtml lors de la création de nouveaux documents HTML, ou prop=modules|jsconfigvars lors de la mise à jour d’un document côté client.", + "apiwarn-deprecation-purge-get": "L’utilisation de action=purge via un GET est désuète. Utiliser POST à la place.", + "apiwarn-deprecation-withreplacement": "$1 est désuet. Veuillez utiliser $2 à la place.", "apiwarn-difftohidden": "Impossible de faire un diff avec r$1 : le contenu est masqué.", "apiwarn-errorprinterfailed": "Erreur échec imprimante. Nouvel essai sans paramètres.", "apiwarn-errorprinterfailed-ex": "Erreur d’échec de l’impression (réessayera sans paramètres) : $1", @@ -1690,7 +1746,7 @@ "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.", "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre $1. La limite est $2.", "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.", - "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage $1 a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez now.", + "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage $1 a été rendu désuet. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez now.", "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre $1 : $2.", "apiwarn-unsupportedarray": "Le paramètre $1 utilise une syntaxe PHP de tableau non prise en charge.", "apiwarn-urlparamwidth": "Valeur de la largeur définie dans $1urlparam ($2) ignorée en faveur de la largeur calculée à partir de $1urlwidth/$1urlheight ($3).", diff --git a/includes/api/i18n/frc.json b/includes/api/i18n/frc.json index a9a2ea0da4..e8d706c133 100644 --- a/includes/api/i18n/frc.json +++ b/includes/api/i18n/frc.json @@ -5,14 +5,14 @@ "Macofe" ] }, - "apihelp-block-description": "Bloquer un useur.", + "apihelp-block-summary": "Bloquer un useur.", "apihelp-createaccount-param-name": "Nom d'useur.", "apihelp-createaccount-param-password": "Mot de passe (ignoré si $1mailpassword est défini).", "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (optional).", - "apihelp-delete-description": "Effacer une page.", + "apihelp-delete-summary": "Effacer une page.", "apihelp-delete-param-title": "Titre de la page que tu veux effacer. Impossible de l’user avec $1pageid.", "apihelp-delete-example-simple": "Effacer Main Page.", - "apihelp-emailuser-description": "Emailer un useur.", + "apihelp-emailuser-summary": "Emailer un useur.", "apihelp-expandtemplates-param-title": "Titre de la page.", "apihelp-login-param-name": "Nom d’useur.", "apihelp-login-param-password": "Mot de passe.", diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json index 183f3cb2ec..1a0cad9e9b 100644 --- a/includes/api/i18n/gl.json +++ b/includes/api/i18n/gl.json @@ -8,16 +8,16 @@ "Banjo", "Fisterraeomar", "Toliño", - "Umherirrender", "Amire80", "Macofe", - "Hamilton Abreu" + "Hamilton Abreu", + "Umherirrender" ] }, - "apihelp-main-description": "
    \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
    \nEstado: 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\nSolicitudes incorrectas: 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\nTest: Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/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
    \nEstado: 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\nSolicitudes incorrectas: 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:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\nTest: Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].", "apihelp-main-param-action": "Que acción se realizará.", "apihelp-main-param-format": "O formato de saída.", - "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro maxlag cunha mensaxe como esperando por $host: $lag segundos de retardo.
    Para máis información, ver [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]].", + "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro maxlag cunha mensaxe como esperando por $host: $lag segundos de retardo.
    Para máis información, ver [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]].", "apihelp-main-param-smaxage": "Fixar a cabeceira HTTP de control de caché s-maxage a esos segundos. Os erros nunca se gardan na caché.", "apihelp-main-param-maxage": "Fixar a cabeceira HTTP de control de caché max-age a esos segundos. Os erros nunca se gardan na caché.", "apihelp-main-param-assert": "Verificar se o usuario está conectado como usuario ou ten a marca de bot.", @@ -31,7 +31,7 @@ "apihelp-main-param-errorformat": "Formato a usar para a saída do texto de aviso e de erroː\n; plaintext: texto wiki sen as etiquetas HTML e coas entidades substituídas.\n; wikitext: texto wiki sen analizar.\n; html: HTML.\n; raw: Clave de mensaxe e parámetros.\n; none: Sen saída de texto, só os códigos de erro.\n; bc: Formato utilizado antes de MediaWiki 1.29. errorlang e errorsuselocal non se teñen en conta.", "apihelp-main-param-errorlang": "Lingua usada para advertencias e erros. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages devolve unha lista de códigos de lingua. Pode especificar content para utilizar a lingua do contido deste wiki ou uselang para utilizar o mesmo valor que o do parámetro uselang.", "apihelp-main-param-errorsuselocal": "Se se indica, os textos de erro empregarán mensaxes adaptadas á lingua do espazo de nomes {{ns:MediaWiki}}.", - "apihelp-block-description": "Bloquear un usuario.", + "apihelp-block-summary": "Bloquear un usuario.", "apihelp-block-param-user": "Nome de usuario, dirección ou rango de IPs que quere bloquear. Non pode usarse xunto con $1userid", "apihelp-block-param-userid": "Identificador de usuario a bloquear. Non pode usarse xunto con $1user.", "apihelp-block-param-expiry": "Tempo de caducidade. Pode ser relativo (p. ex.5 meses ou 2 semanas) ou absoluto (p. ex. 2014-09-18T12:34:56Z
    ). Se se pon kbd>infinite
    , indefinite, ou never, o bloqueo nunca caducará.", @@ -41,33 +41,39 @@ "apihelp-block-param-autoblock": "Bloquear automaticamente o último enderezo IP utilizado, e calquera outro enderezo desde o que intente conectarse.", "apihelp-block-param-noemail": "Impide que o usuario envíe correos electrónicos a través da wiki. (Require o permiso blockemail).", "apihelp-block-param-hidename": "Ocultar o nome de usuario do rexistro de bloqueos. (Precisa do permiso hideuser).", - "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.", "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario", "apihelp-block-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de bloqueos.", "apihelp-block-example-ip-simple": "Bloquear dirección IP 192.0.2.5 durante tres días coa razón Primeiro aviso.", "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario Vandal coa razón Vandalism, e impedir a creación de novas contas e envío de correos electrónicos.", - "apihelp-changeauthenticationdata-description": "Cambiar os datos de autenticación do usuario actual.", + "apihelp-changeauthenticationdata-summary": "Cambiar os datos de autenticación do usuario actual.", "apihelp-changeauthenticationdata-example-password": "Intento de cambiar o contrasinal do usuario actua a ExemploContrasinal.", - "apihelp-checktoken-description": "Verificar a validez dun identificador de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Verificar a validez dun identificador de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo de identificador a probar.", "apihelp-checktoken-param-token": "Símbolo a testar", "apihelp-checktoken-param-maxtokenage": "Tempo máximo autorizado para o identificador, en segundos.", "apihelp-checktoken-example-simple": "Verificar a validez de un identificador csrf.", - "apihelp-clearhasmsg-description": "Limpar a bandeira hasmsg para o usuario actual", + "apihelp-clearhasmsg-summary": "Limpar a bandeira hasmsg para o usuario actual", "apihelp-clearhasmsg-example-1": "Limpar a bandeira hasmsg para o usuario actual", - "apihelp-clientlogin-description": "Conectarse á wiki usando o fluxo interactivo.", + "apihelp-clientlogin-summary": "Conectarse á wiki usando o fluxo interactivo.", "apihelp-clientlogin-example-login": "Comezar o proceso de conexión á wiki como o usuario Exemplo con contrasinal ExemploContrasinal.", "apihelp-clientlogin-example-login2": "Continuar a conexión despois dunha resposta de UI para unha autenticación de dous factores, proporcionando un OATHToken con valor 987654.", - "apihelp-compare-description": "Obter as diferencias entre dúas páxinas.\n\nDebe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".", + "apihelp-compare-summary": "Obter as diferencias entre dúas páxinas.", + "apihelp-compare-extended-description": "Debe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".", "apihelp-compare-param-fromtitle": "Primeiro título para comparar.", "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.", "apihelp-compare-param-fromrev": "Primeira revisión a comparar.", + "apihelp-compare-param-fromtext": "Uso este texto en vez do contido da revisión especificada por fromtitle, fromid ou fromrev.", "apihelp-compare-param-totitle": "Segundo título para comparar.", "apihelp-compare-param-toid": "Identificador da segunda páxina a comparar.", "apihelp-compare-param-torev": "Segunda revisión a comparar.", + "apihelp-compare-param-prop": "Que información obter.", + "apihelp-compare-paramvalue-prop-diff": "O diff HTML.", + "apihelp-compare-paramvalue-prop-diffsize": "O tamaño do diff HTML, en bytes.", + "apihelp-compare-paramvalue-prop-size": "Tamaño das revisións 'desde' e 'a'.", "apihelp-compare-example-1": "Mostrar diferencias entre a revisión 1 e a 2", - "apihelp-createaccount-description": "Crear unha nova conta de usuario.", + "apihelp-createaccount-summary": "Crear unha nova conta de usuario.", "apihelp-createaccount-param-preservestate": "SE [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] devolve o valor \"certo\" para hasprimarypreservedstate, as consultas marcadas como primary-required deben ser omitidas. Se devolve un valor non baleiro para preservedusername, ese nome de usuario debe usarse para o parámetro username.", "apihelp-createaccount-example-create": "Comezar o proceso de crear un usuario Exemplo con contrasinal ExemploContrasinal.", "apihelp-createaccount-param-name": "Nome de usuario.", @@ -81,10 +87,10 @@ "apihelp-createaccount-param-language": "Código de lingua para usar como defecto polo usuario (de xeito opcional, usarase a lingua por defecto)", "apihelp-createaccount-example-pass": "Crear usuario testuser con contrasinal test123.", "apihelp-createaccount-example-mail": "Crear usuario testmailuser\"testmailuser\" e enviar por correo electrónico un contrasinal xenerado de forma aleatoria.", - "apihelp-cspreport-description": "Usado polos navegadores para informar de violacións da política de confidencialidade de contido. Este módulo non debe se usado nunca, excepto cando é usado automaticamente por un navegador web compatible con CSP.", + "apihelp-cspreport-summary": "Usado polos navegadores para informar de violacións da política de confidencialidade de contido. Este módulo non debe se usado nunca, excepto cando é usado automaticamente por un navegador web compatible con CSP.", "apihelp-cspreport-param-reportonly": "Marcar un informe dunha política de vixiancia e non unha política esixida", "apihelp-cspreport-param-source": "Que xerou a cabeceira CSP que lanzou este informe", - "apihelp-delete-description": "Borrar a páxina.", + "apihelp-delete-summary": "Borrar a páxina.", "apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con $1pageid.", "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con $1title.", "apihelp-delete-param-reason": "Razón para o borrado. Se non se indica, usarase unha razón xenerada automaticamente.", @@ -95,8 +101,8 @@ "apihelp-delete-param-oldimage": "Nome da imaxe antiga a borrar como se proporciona en [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Borrar Main Page.", "apihelp-delete-example-reason": "Eliminar Main Page coa razón Preparing for move.", - "apihelp-disabled-description": "Este módulo foi desactivado.", - "apihelp-edit-description": "Crear e editar páxinas.", + "apihelp-disabled-summary": "Este módulo foi desactivado.", + "apihelp-edit-summary": "Crear e editar páxinas.", "apihelp-edit-param-title": "Título da páxina que quere editar. Non pode usarse xunto con $1pageid.", "apihelp-edit-param-pageid": "Identificador da páxina que quere editar. Non pode usarse xunto con $1title.", "apihelp-edit-param-section": "Número de selección. O 0 é para a sección superior, new para unha sección nova.", @@ -127,13 +133,13 @@ "apihelp-edit-example-edit": "Editar a páxina", "apihelp-edit-example-prepend": "Antepor __NOTOC__ a unha páxina.", "apihelp-edit-example-undo": "Desfacer revisións 13579 a 13585 con resumo automático.", - "apihelp-emailuser-description": "Enviar un correo electrónico a un usuario.", + "apihelp-emailuser-summary": "Enviar un correo electrónico a un usuario.", "apihelp-emailuser-param-target": "Usuario ó que lle mandar correo electrónico.", "apihelp-emailuser-param-subject": "Asunto.", "apihelp-emailuser-param-text": "Corpo do correo.", "apihelp-emailuser-param-ccme": "Enviarme unha copia deste correo.", "apihelp-emailuser-example-email": "Enviar un correo electrónico ó usuario WikiSysop co texto Content.", - "apihelp-expandtemplates-description": "Expandir tódolos modelos dentro do wikitexto.", + "apihelp-expandtemplates-summary": "Expandir tódolos modelos dentro do wikitexto.", "apihelp-expandtemplates-param-title": "Título da páxina.", "apihelp-expandtemplates-param-text": "Sintaxis wiki a converter.", "apihelp-expandtemplates-param-revid": "ID de revisión, para {{REVISIONID}} e variables similares.", @@ -150,7 +156,7 @@ "apihelp-expandtemplates-param-includecomments": "Cando queria incluír comentarios HTML na saída.", "apihelp-expandtemplates-param-generatexml": "Xenerar árbore de análise XML (reemprazado por $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Expandir o wikitexto {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Devolve a lista de contribucións dun usuario.", + "apihelp-feedcontributions-summary": "Devolve a lista de contribucións dun usuario.", "apihelp-feedcontributions-param-feedformat": "O formato de alimentación.", "apihelp-feedcontributions-param-user": "Para que usuarios recuperar as contribucións.", "apihelp-feedcontributions-param-namespace": "Que espazo de nomes filtrar polas contribucións.", @@ -163,7 +169,7 @@ "apihelp-feedcontributions-param-hideminor": "Ocultar edicións menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar diferenza de tamaño entre edicións.", "apihelp-feedcontributions-example-simple": "Mostrar as contribucións do usuario Example.", - "apihelp-feedrecentchanges-description": "Devolve un ficheiro de cambios recentes.", + "apihelp-feedrecentchanges-summary": "Devolve un ficheiro de cambios recentes.", "apihelp-feedrecentchanges-param-feedformat": "O formato da saída.", "apihelp-feedrecentchanges-param-namespace": "Espazo de nomes ó que limitar os resultados.", "apihelp-feedrecentchanges-param-invert": "Tódolos nomes de espazos agás o seleccionado", @@ -185,18 +191,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Só mostrar cambios en páxinas pertencentes a calquera das categorías.", "apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes", "apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días", - "apihelp-feedwatchlist-description": "Devolve o fluxo dunha lista de vixiancia.", + "apihelp-feedwatchlist-summary": "Devolve o fluxo dunha lista de vixiancia.", "apihelp-feedwatchlist-param-feedformat": "O formato da saída.", "apihelp-feedwatchlist-param-hours": "Lista as páxinas modificadas desde estas horas ata agora.", "apihelp-feedwatchlist-param-linktosections": "Ligar directamente ás seccións modificadas se é posible.", "apihelp-feedwatchlist-example-default": "Mostar o fluxo da lista de vixiancia.", "apihelp-feedwatchlist-example-all6hrs": "Amosar tódolos cambios feitos ás páxinas vixiadas nas últimas 6 horas.", - "apihelp-filerevert-description": "Revertir o ficheiro a unha versión anterior.", + "apihelp-filerevert-summary": "Revertir o ficheiro a unha versión anterior.", "apihelp-filerevert-param-filename": "Nome de ficheiro final, sen o prefixo Ficheiro:", "apihelp-filerevert-param-comment": "Comentario de carga.", "apihelp-filerevert-param-archivename": "Nome de ficheiro da revisión á que reverter.", "apihelp-filerevert-example-revert": "Reverter Wiki.png á versión do 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Mostrar axuda para os módulos indicados.", + "apihelp-help-summary": "Mostrar axuda para os módulos indicados.", "apihelp-help-param-modules": "Módulos para mostar axuda (valores dos parámetros acción e formato, ou principal). Pode especificar submódulos con un +.", "apihelp-help-param-submodules": "Incluír axuda para os submódulos do módulo nomeado.", "apihelp-help-param-recursivesubmodules": "Incluír axuda para os submódulos de forma recursiva.", @@ -208,12 +214,13 @@ "apihelp-help-example-recursive": "Toda a axuda nunha páxina", "apihelp-help-example-help": "Axuda do módulo de axuda en si", "apihelp-help-example-query": "Axuda para dous submódulos de consulta.", - "apihelp-imagerotate-description": "Xirar unha ou máis imaxes.", + "apihelp-imagerotate-summary": "Xirar unha ou máis imaxes.", "apihelp-imagerotate-param-rotation": "Graos a rotar a imaxe no sentido do reloxio.", "apihelp-imagerotate-param-tags": "Etiquetas aplicar á entrada no rexistro de subas.", "apihelp-imagerotate-example-simple": "Rotar File:Example.png 90 graos.", "apihelp-imagerotate-example-generator": "Rotar tódalas imaxes en Category:Flip 180 graos", - "apihelp-import-description": "Importar unha páxina doutra wiki, ou dun ficheiro XML.\n\nDecátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro xml.", + "apihelp-import-summary": "Importar unha páxina doutra wiki, ou dun ficheiro XML.", + "apihelp-import-extended-description": "Decátese de que o POST HTTP debe facerse como unha carga de ficheiro (p. ex. usando multipart/form-data) cando se envíe un ficheiro para o parámetro xml.", "apihelp-import-param-summary": "Resume de importación de entrada no rexistro.", "apihelp-import-param-xml": "Subido ficheiro XML.", "apihelp-import-param-interwikisource": "Para importacións interwiki: wiki da que importar.", @@ -224,19 +231,20 @@ "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina. Non se pode usar de forma conxunta con $1namespace.", "apihelp-import-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de importacións e á revisión nula das páxinas importadas.", "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.", - "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.", + "apihelp-linkaccount-summary": "Vincular unha conta dun provedor externo ó usuario actual.", "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de Exemplo.", - "apihelp-login-description": "Iniciar sesión e obter as cookies de autenticación.\n\nEsta acción só debe utilizarse en combinación con [[Special:BotPasswords]]; para a cuenta de inicio de sesión non se utiliza e pode fallar sen previo aviso. Para iniciar a sesión de forma segura na conta principal, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Conectarse e obter as cookies de autenticación. \n\nEsta acción está obsoleta e pode fallar sen avisar. Para conectarse sen problema use [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Iniciar sesión e obter as cookies de autenticación.", + "apihelp-login-extended-description": "Esta acción só debe utilizarse en combinación con [[Special:BotPasswords]]; para a cuenta de inicio de sesión non se utiliza e pode fallar sen previo aviso. Para iniciar a sesión de forma segura na conta principal, utilice [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Esta acción está obsoleta e pode fallar sen avisar. Para conectarse sen problema use [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nome de usuario.", "apihelp-login-param-password": "Contrasinal", "apihelp-login-param-domain": "Dominio (opcional).", "apihelp-login-param-token": "Identificador de conexión obtido na primeira petición.", "apihelp-login-example-gettoken": "Recuperar un identificador de conexión.", "apihelp-login-example-login": "Identificarse", - "apihelp-logout-description": "Terminar e limpar datos de sesión.", + "apihelp-logout-summary": "Terminar e limpar datos de sesión.", "apihelp-logout-example-logout": "Cerrar a sesión do usuario actual", - "apihelp-managetags-description": "Realizar tarefas de xestión relacionadas coa modificación de etiquetas.", + "apihelp-managetags-summary": "Realizar tarefas de xestión relacionadas coa modificación de etiquetas.", "apihelp-managetags-param-operation": "Que operación realizar:\n;create:Crear unha nova etiqueta de modificación para uso manual.\n;delete:Borar unha etiqueta de modificación da base de datos, incluíndo o borrado da etiqueta de todas as revisións, entradas de cambios recentes e entradas de rexistro onde estea a usarse.\n;activate:Activar unha etiqueta de modificación, permitindo que os usuarios a usen manualmente.\n;deactivate:Desactivar unha etiqueta de modificación, impedindo que os usuarios a usen manualmente.", "apihelp-managetags-param-tag": "Etiqueta para crear, borrar, activar ou desactivar. Para a creación da etiqueta, a etiqueta non pode existir previamente. Para o borrado da etiqueta, a etiqueta debe existir. Para a activación da etiqueta, a etiqueta debe existir e non pode ser usada por unha extensión. Para desactivar unha etiqueta, a etiqueta debe estar activa e definida manualmente.", "apihelp-managetags-param-reason": "Un motivo opcional para crear, borrar, activar ou desactivar a etiqueta.", @@ -246,7 +254,7 @@ "apihelp-managetags-example-delete": "Borrar a etiqueta vandalismo coa razón Erros ortográficos", "apihelp-managetags-example-activate": "Activar a etiqueta chamada spam coa razón For use in edit patrolling", "apihelp-managetags-example-deactivate": "Desactivar a etiqueta chamada spam coa razón No longer required", - "apihelp-mergehistory-description": "Fusionar os historiais das páxinas.", + "apihelp-mergehistory-summary": "Fusionar os historiais das páxinas.", "apihelp-mergehistory-param-from": "Título da páxina desde a que se fusionará o historial. Non pode usarse xunto con $1fromid.", "apihelp-mergehistory-param-fromid": "Identificador da páxina desde a que se fusionará o historial. Non pode usarse xunto con $1from.", "apihelp-mergehistory-param-to": "Título da páxina á que se fusionará o historial. Non pode usarse xunto con $1toid.", @@ -255,7 +263,7 @@ "apihelp-mergehistory-param-reason": "Razón para a fusión de historiais.", "apihelp-mergehistory-example-merge": "Fusionar o historial enteiro de PáxinaVella en PáxinaNova.", "apihelp-mergehistory-example-merge-timestamp": "Fusionar as revisións da páxina PáxinaVella con data 2015-12-31T04:37:41Z en PáxinaNova.", - "apihelp-move-description": "Mover unha páxina.", + "apihelp-move-summary": "Mover unha páxina.", "apihelp-move-param-from": "Título da páxina que quere renomear. Non pode usarse xunto con $1fromid.", "apihelp-move-param-fromid": "Identificador da páxina que quere renomear. Non pode usarse xunto con $1from.", "apihelp-move-param-to": "Título ó que renomear a páxina.", @@ -269,16 +277,17 @@ "apihelp-move-param-ignorewarnings": "Ignorar as advertencias.", "apihelp-move-param-tags": "Cambiar as etiquetas a aplicar á entrada do rexistro de traslados e na revisión nula da páxina de destino.", "apihelp-move-example-move": "Mover Badtitle a Goodtitle sen deixar unha redirección.", - "apihelp-opensearch-description": "Buscar no wiki mediante o protocolo OpenSearch.", + "apihelp-opensearch-summary": "Buscar no wiki mediante o protocolo OpenSearch.", "apihelp-opensearch-param-search": "Buscar texto.", "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.", "apihelp-opensearch-param-namespace": "Espazo de nomes no que buscar.", - "apihelp-opensearch-param-suggest": "Non facer nada se [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] é falso.", + "apihelp-opensearch-param-suggest": "Non facer nada se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] é falso.", "apihelp-opensearch-param-redirects": "Como xestionar as redireccións:\n;return:Devolve a mesma redirección.\n;resolve:Devolve a páxina á que apunta. Pode devolver menos de $1limit resultados.\nPor razóns históricas, o valor por defecto para $1format=json é \"return\" e \"resolve\" para outros formatos.", "apihelp-opensearch-param-format": "O formato de saída.", "apihelp-opensearch-param-warningsaserror": "Se os avisos son recibidos con format=json, devolver un erro de API no canto de ignoralos.", "apihelp-opensearch-example-te": "Atopar páxinas que comezan por Te.", - "apihelp-options-description": "Cambiar as preferencias do usuario actual.\n\nSó se poden cambiar opcións que estean rexistradas no núcleo ou nunha das extensións instaladas, ou aquelas opcións con claves prefixadas con userjs- (previstas para ser usadas por escrituras de usuario).", + "apihelp-options-summary": "Cambiar as preferencias do usuario actual.", + "apihelp-options-extended-description": "Só se poden cambiar opcións que estean rexistradas no núcleo ou nunha das extensións instaladas, ou aquelas opcións con claves prefixadas con userjs- (previstas para ser usadas por escrituras de usuario).", "apihelp-options-param-reset": "Reinicia as preferencias ás iniciais do sitio.", "apihelp-options-param-resetkinds": "Lista de tipos de opcións a reinicializar cando a opción $1reset está definida.", "apihelp-options-param-change": "Lista de cambios, con formato nome=valor (p. ex. skin=vector). Se non se da un valor (sen un símbolo de igual), p.ex. optionname|otheroption|..., a opción pasará ó valor por defecto. Para calquera valor que conteña o carácter (|), use o [[Special:ApiHelp/main#main/datatypes|separador alternativo para valores múltiples]] para unha operación correcta.", @@ -287,7 +296,7 @@ "apihelp-options-example-reset": "Restablecer todas as preferencias.", "apihelp-options-example-change": "Cambiar as preferencias skin and hideminor.", "apihelp-options-example-complex": "Restaurar todas as preferencias, logo fixar skin e nickname.", - "apihelp-paraminfo-description": "Obter información sobre módulos API.", + "apihelp-paraminfo-summary": "Obter información sobre módulos API.", "apihelp-paraminfo-param-modules": "Lista de nomes de módulos (valores dos parámetros acciónformato, ou principal). Pode especificar submódulos con +, ou tódolos submódulos con +*, ou tódolos submódulos recursivamente con +**.", "apihelp-paraminfo-param-helpformat": "Formato das cadeas de axuda.", "apihelp-paraminfo-param-querymodules": "Lista dos nomes de módulos de consulta (valores dos parámetros prop, meta ou list). Use $1modules=query+foo no canto de $1querymodules=foo.", @@ -296,7 +305,8 @@ "apihelp-paraminfo-param-formatmodules": "Lista dos nomes de módulo de formato (valores do parámetro formato). No canto use $1modules.", "apihelp-paraminfo-example-1": "Amosar información para [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], e [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Mostrar a información para tódolos submódulos de [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "Analiza o contido e devolve o resultado do analizador.\n\nVexa varios módulos propostos de [[Special:ApiHelp/query|action=query]] para obter información sobre a versión actual dunha páxina.\n\nHai varias formas de especificar o texto a analizar:\n# Especificar unha páxina ou revisión, usando $1page, $1pageid, ou $1oldid.\n# Especificando contido explícitamente, usando $1text, $1title, and $1contentmodel.\n# Especificando só un resumo a analizar. $1prop debe ter un valor baleiro.", + "apihelp-parse-summary": "Fai a análise sintáctica do contido e devolve o resultado da análise.", + "apihelp-parse-extended-description": "Vexa varios módulos propostos de [[Special:ApiHelp/query|action=query]] para obter información sobre a versión actual dunha páxina.\n\nHai varias formas de especificar o texto a analizar:\n# Especificar unha páxina ou revisión, usando $1page, $1pageid, ou $1oldid.\n# Especificando contido explícitamente, usando $1text, $1title, and $1contentmodel.\n# Especificando só un resumo a analizar. $1prop debe ter un valor baleiro.", "apihelp-parse-param-title": "Título da páxina á que pertence o texto. Se non se indica, debe especificarse $1contentmodel, e [[API]] usarase como o título.", "apihelp-parse-param-text": "Texto a analizar. Use $1title ou $1contentmodel para controlar o modelo de contido.", "apihelp-parse-param-summary": "Resumo a analizar.", @@ -316,7 +326,7 @@ "apihelp-parse-paramvalue-prop-sections": "Devolve as seccións do texto wiki analizado.", "apihelp-parse-paramvalue-prop-revid": "Engade o identificador de edición do texto wiki analizado.", "apihelp-parse-paramvalue-prop-displaytitle": "Engade o título do texto wiki analizado.", - "apihelp-parse-paramvalue-prop-headitems": "Obsoleto. Devolve os elementos a poñer na <cabeceira> da páxina.", + "apihelp-parse-paramvalue-prop-headitems": "Devolve os elementos a poñer na <cabeceira> da páxina.", "apihelp-parse-paramvalue-prop-headhtml": "Devolve <cabeceira> analizada da páxina.", "apihelp-parse-paramvalue-prop-modules": "Devolve os módulos ResourceLoader usados na páxina. Para cargar, use mw.loader.using(). jsconfigvars ou encodedjsconfigvars deben ser solicitados xunto con modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Devolve as variables específicas de configuración JavaScript da páxina. Para aplicalo, use mw.config.set().", @@ -328,6 +338,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Devolve o informe de límite de forma estruturada. Non devolve datos cando $1disablelimitreport está fixado.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Devolve a versión HTML do informe de límite. Non devolve datos cando $1disablelimitreport está fixado.", "apihelp-parse-paramvalue-prop-parsetree": "Árbores de análise XML do contido da revisión (precisa o modelo de contido $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Devolve os avisos que ocorreron ó analizar o contido.", + "apihelp-parse-param-wrapoutputclass": "Clase CSS a usar para formatar a saída do analizador sintáctico.", "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.", "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con $1text.", "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con $1prop=langlinks).", @@ -341,19 +353,20 @@ "apihelp-parse-param-preview": "Analizar en modo vista previa.", "apihelp-parse-param-sectionpreview": "Analizar en modo vista previa de sección (activa tamén o modo de vista previa).", "apihelp-parse-param-disabletoc": "Omitir o índice na saída.", + "apihelp-parse-param-useskin": "Aplicar o tema seleccionado á saída do analizador. Pode afectar ás seguintes propiedades: langlinks, headitems, módulos, jsconfigvars, indicadores.", "apihelp-parse-param-contentformat": "Formato de serialización do contido usado para o texto de entrada. Só válido cando se usa con $1text.", "apihelp-parse-param-contentmodel": "Modelo de contido do texto de entrada. Se se omite, debe especificarse $1title, e o valor por defecto será o modelo do título especificado. Só válido cando se usa con $1text.", "apihelp-parse-example-page": "Analizar unha páxina.", "apihelp-parse-example-text": "Analizar un wikitexto.", "apihelp-parse-example-texttitle": "Analizar wikitexto, especificando o título da páxina.", "apihelp-parse-example-summary": "Analizar un resumo.", - "apihelp-patrol-description": "Patrullar unha páxina ou edición.", + "apihelp-patrol-summary": "Patrullar unha páxina ou edición.", "apihelp-patrol-param-rcid": "ID de modificación recente a vixiar.", "apihelp-patrol-param-revid": "ID de revisión a vixiar.", "apihelp-patrol-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de patrullas.", "apihelp-patrol-example-rcid": "Patrullar un cambio recente", "apihelp-patrol-example-revid": "Patrullar unha revisión", - "apihelp-protect-description": "Cambiar o nivel de protección dunha páxina.", + "apihelp-protect-summary": "Cambiar o nivel de protección dunha páxina.", "apihelp-protect-param-title": "Título da páxina que quere (des)protexer. Non pode usarse xunto con $1pageid.", "apihelp-protect-param-pageid": "Identificador da páxina que quere (des)protexer. Non pode usarse xunto con $1title.", "apihelp-protect-param-protections": "Lista dos niveis de protección, con formato action=level (p.ex. edit=sysop). Un nivel de all quere dicir que todo o mundo ten permiso para realizar a acción, sen restricións.\n\nNota: Todas as accións que non estean listadas terán restriccións para ser eliminadas.", @@ -366,12 +379,13 @@ "apihelp-protect-example-protect": "Protexer unha páxina", "apihelp-protect-example-unprotect": "Desprotexer unha páxina poñendo as restricións a all. (isto quere dicir que todo o mundo pode realizar a acción).", "apihelp-protect-example-unprotect2": "Desprotexer unha páxina quitando as restricións.", - "apihelp-purge-description": "Borrar a caché para os títulos indicados.", + "apihelp-purge-summary": "Borrar a caché para os títulos indicados.", "apihelp-purge-param-forcelinkupdate": "Actualizar as táboas de ligazóns.", "apihelp-purge-param-forcerecursivelinkupdate": "Actualizar a táboa de ligazóns, e actualizar as táboas de ligazóns para calquera páxina que use esta páxina como modelo.", "apihelp-purge-example-simple": "Purgar a Main Page e páxina da API.", "apihelp-purge-example-generator": "Purgar as primeiras 10 páxinas no espazo de nomes principal.", - "apihelp-query-description": "Consultar datos de e sobre MediaWiki.\n\nTodas as modificacións de datos primeiro teñen que facer unha busca para obter un identificador para evitar abusos de sitios maliciosos.", + "apihelp-query-summary": "Consultar datos de e sobre MediaWiki.", + "apihelp-query-extended-description": "Todas as modificacións de datos primeiro teñen que facer unha busca para obter un identificador para evitar abusos de sitios maliciosos.", "apihelp-query-param-prop": "Que propiedades obter para as páxinas buscadas.", "apihelp-query-param-list": "Que lista obter.", "apihelp-query-param-meta": "Que metadatos obter.", @@ -382,7 +396,7 @@ "apihelp-query-param-rawcontinue": "Devolver os datos en bruto de query-continue para continuar.", "apihelp-query-example-revisions": "Consultar [[Special:ApiHelp/query+siteinfo|información do sitio]] e [[Special:ApiHelp/query+revisions|as revisións]] da Páxina Principal.", "apihelp-query-example-allpages": "Buscar revisións de páxinas que comecen por API/.", - "apihelp-query+allcategories-description": "Numerar tódalas categorías", + "apihelp-query+allcategories-summary": "Numerar tódalas categorías", "apihelp-query+allcategories-param-from": "Categoría pola que comezar a enumeración.", "apihelp-query+allcategories-param-to": "Categoría pola que rematar a enumeración.", "apihelp-query+allcategories-param-prefix": "Buscar todos os títulos de categoría que comezan con este valor.", @@ -395,7 +409,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Marca as categorías que están ocultas con __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Listar categorías con información do número de páxinas en cada unha.", "apihelp-query+allcategories-example-generator": "Obter información sobre a páxina de categoría para categorías que comezan por List.", - "apihelp-query+alldeletedrevisions-description": "Listar todas as revisións borradas por un usuario ou nun espazo de nomes.", + "apihelp-query+alldeletedrevisions-summary": "Listar todas as revisións borradas por un usuario ou nun espazo de nomes.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Só pode usarse con $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Non pode usarse con $3user.", "apihelp-query+alldeletedrevisions-param-start": "Selo de tempo para comezar a enumeración.", @@ -407,11 +421,11 @@ "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.", "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez $1user e $1namespace pode devolver menos resultados de $1limit antes de continuar, en casos extremos, pode que non devolva resultados.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], ó usar á vez $1user e $1namespace pode devolver menos resultados de $1limit antes de continuar, en casos extremos, pode que non devolva resultados.", "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.", "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.", - "apihelp-query+allfileusages-description": "Lista todos os usos de ficheiro, incluído os que non existen.", + "apihelp-query+allfileusages-summary": "Lista todos os usos de ficheiro, incluído os que non existen.", "apihelp-query+allfileusages-param-from": "Título do ficheiro no que comezar a enumerar.", "apihelp-query+allfileusages-param-to": "Título do ficheiro no que rematar de enumerar.", "apihelp-query+allfileusages-param-prefix": "Buscar tódolos títulos de ficheiro que comezan con este valor.", @@ -425,7 +439,7 @@ "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 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-summary": "Enumerar tódalas imaxes secuencialmente.", "apihelp-query+allimages-param-sort": "Propiedade pola que ordenar.", "apihelp-query+allimages-param-dir": "Dirección na cal listar.", "apihelp-query+allimages-param-from": "Título da imaxe no que comezar a enumerar. Só pode usarse con $1sort=name.", @@ -445,7 +459,7 @@ "apihelp-query+allimages-example-recent": "Mostrar unha lista de ficheiros subidos recentemente, similares a [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Mostrar unha lista de ficheiros con tipo MIME image/png ou image/gif", "apihelp-query+allimages-example-generator": "Mostar información sobre catro ficheiros que comecen pola letra T.", - "apihelp-query+alllinks-description": "Numerar tódalas ligazóns que apuntan a un nome de espazos determinado.", + "apihelp-query+alllinks-summary": "Numerar tódalas ligazóns que apuntan a un nome de espazos determinado.", "apihelp-query+alllinks-param-from": "Título da ligazón na que comezar a enumerar.", "apihelp-query+alllinks-param-to": "Título da ligazón na que rematar de enumerar.", "apihelp-query+alllinks-param-prefix": "Buscar tódolos títulos ligados que comezan con este valor.", @@ -460,7 +474,7 @@ "apihelp-query+alllinks-example-unique": "Listar títulos ligados únicos", "apihelp-query+alllinks-example-unique-generator": "Obtén tódolos títulos ligados, marcando os eliminados.", "apihelp-query+alllinks-example-generator": "Obtén as páxinas que conteñen as ligazóns.", - "apihelp-query+allmessages-description": "Devolver mensaxes deste sitio.", + "apihelp-query+allmessages-summary": "Devolver mensaxes deste sitio.", "apihelp-query+allmessages-param-messages": "Que mensaxes devolver. * (por defecto) significa todas as mensaxes", "apihelp-query+allmessages-param-prop": "Que propiedades obter.", "apihelp-query+allmessages-param-enableparser": "Marcar para activar o analizador, isto preprocesará o texto wiki da mensaxe (substituir palabras máxicas, xestionar modelo, etc.)", @@ -476,7 +490,7 @@ "apihelp-query+allmessages-param-prefix": "Devolver mensaxes con este prefixo.", "apihelp-query+allmessages-example-ipb": "Mostar mensaxes que comecen por ipb-.", "apihelp-query+allmessages-example-de": "Mostrar mensaxes august e mainpage en Alemán.", - "apihelp-query+allpages-description": "Numerar tódalas páxinas secuencialmente nun espazo de nomes determinado.", + "apihelp-query+allpages-summary": "Numerar tódalas páxinas secuencialmente nun espazo de nomes determinado.", "apihelp-query+allpages-param-from": "Título da páxina na que comezar a enumerar.", "apihelp-query+allpages-param-to": "Título da páxina na que rematar de enumerar.", "apihelp-query+allpages-param-prefix": "Buscar tódolos títulos de páxinas que comezan con este valor.", @@ -494,7 +508,7 @@ "apihelp-query+allpages-example-B": "Mostrar unha lista de páxinas que comezan pola letra B.", "apihelp-query+allpages-example-generator": "Mostrar inforfmación sobre 4 páxinas que comecen pola letra T.", "apihelp-query+allpages-example-generator-revisions": "Motrar o contido das dúas primeiras páxinas que non sexan redirección que comecen por Re.", - "apihelp-query+allredirects-description": "Lista tódalas redireccións a un espazo de nomes.", + "apihelp-query+allredirects-summary": "Lista tódalas redireccións a un espazo de nomes.", "apihelp-query+allredirects-param-from": "Título da redirección na que comezar a enumerar.", "apihelp-query+allredirects-param-to": "Título da redirección na que rematar de enumerar.", "apihelp-query+allredirects-param-prefix": "Buscar todas as páxinas que comecen con este valor.", @@ -511,7 +525,7 @@ "apihelp-query+allredirects-example-unique": "Lista páxinas obxectivo únicas.", "apihelp-query+allredirects-example-unique-generator": "Obtén tódalas páxinas obxectivo, marcando as eliminadas.", "apihelp-query+allredirects-example-generator": "Obtén as páxinas que conteñen as redireccións.", - "apihelp-query+allrevisions-description": "Listar todas as revisións.", + "apihelp-query+allrevisions-summary": "Listar todas as revisións.", "apihelp-query+allrevisions-param-start": "Selo de tempo no que comezar a enumeración.", "apihelp-query+allrevisions-param-end": "Selo de tempo para rematar a enumeración.", "apihelp-query+allrevisions-param-user": "Só listar revisións deste usuario.", @@ -520,13 +534,13 @@ "apihelp-query+allrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.", "apihelp-query+allrevisions-example-user": "Listar as últimas 50 contribucións do usuario Example.", "apihelp-query+allrevisions-example-ns-main": "Listar as 50 primeiras revisións do espazo de nomes principal.", - "apihelp-query+mystashedfiles-description": "Obter unha lista dos ficheiros da caché de carga do usuario actual.", + "apihelp-query+mystashedfiles-summary": "Obter unha lista dos ficheiros da caché de carga do usuario actual.", "apihelp-query+mystashedfiles-param-prop": "Que propiedades obter para os ficheiros.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Consultar o tamaño de ficheiro e as dimensións da imaxe.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Consultar o tipo MIME do ficheiro e tipo multimedia.", "apihelp-query+mystashedfiles-param-limit": "Cantos ficheiros devolver.", "apihelp-query+mystashedfiles-example-simple": "Obter a clave de ficheiro, tamaño de ficheiro, e tamaño en pixels dos ficheiros na caché de carga do usuario actual.", - "apihelp-query+alltransclusions-description": "Listar todas as transclusións (páxinas integradas usando {{x}}), incluíndo as eliminadas.", + "apihelp-query+alltransclusions-summary": "Listar todas as transclusións (páxinas integradas usando {{x}}), incluíndo as eliminadas.", "apihelp-query+alltransclusions-param-from": "Título da transclusión na que comezar a enumerar.", "apihelp-query+alltransclusions-param-to": "Título da transclusión na que rematar de enumerar.", "apihelp-query+alltransclusions-param-prefix": "Buscar todos os títulos transcluídos que comezan con este valor.", @@ -541,7 +555,7 @@ "apihelp-query+alltransclusions-example-unique": "Lista os títulos transcluídos únicos.", "apihelp-query+alltransclusions-example-unique-generator": "Obtén tódolos títulos transcluídos, marcando os eliminados.", "apihelp-query+alltransclusions-example-generator": "Obtén as páxinas que conteñen as transclusións.", - "apihelp-query+allusers-description": "Enumerar tódolos usuarios rexistrados.", + "apihelp-query+allusers-summary": "Enumerar tódolos usuarios rexistrados.", "apihelp-query+allusers-param-from": "Nome de usuario para comezar a enumeración", "apihelp-query+allusers-param-to": "Nome de usuario para rematar a enumeración.", "apihelp-query+allusers-param-prefix": "Buscar tódolos nomes de usuario que comezan con este valor.", @@ -562,13 +576,13 @@ "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.", "apihelp-query+allusers-param-attachedwiki": "Con $1prop=centralids, \ntamén indica se o usuario está acoplado á wiki identificada por este identificador.", "apihelp-query+allusers-example-Y": "Listar usuarios que comecen por Y.", - "apihelp-query+authmanagerinfo-description": "Recuperar información sobre o estado de autenticación actual.", + "apihelp-query+authmanagerinfo-summary": "Recuperar información sobre o estado de autenticación actual.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Comprobar se o estado de autenticación actual do usuario é abondo para a operación especificada como sensible dende o punto de vista da seguridade.", "apihelp-query+authmanagerinfo-param-requestsfor": "Recuperar a información sobre as peticións de autenticación necesarias para a acción de autenticación especificada.", "apihelp-query+authmanagerinfo-example-login": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión.", "apihelp-query+authmanagerinfo-example-login-merged": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión, xunto cos campos de formulario integrados.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Probar se a autenticación é abondo para a acción foo.", - "apihelp-query+backlinks-description": "Atopar todas as páxinas que ligan coa páxina dada.", + "apihelp-query+backlinks-summary": "Atopar todas as páxinas que ligan coa páxina dada.", "apihelp-query+backlinks-param-title": "Título a buscar. Non pode usarse xunto con $1pageid.", "apihelp-query+backlinks-param-pageid": "Identificador de páxina a buscar. Non pode usarse xunto con $1title.", "apihelp-query+backlinks-param-namespace": "Espazo de nomes a enumerar.", @@ -578,7 +592,7 @@ "apihelp-query+backlinks-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.", "apihelp-query+backlinks-example-simple": "Mostrar ligazóns á Main page.", "apihelp-query+backlinks-example-generator": "Obter a información das páxinas que ligan á Main page.", - "apihelp-query+blocks-description": "Listar todos os usuarios e direccións IP bloqueados.", + "apihelp-query+blocks-summary": "Listar todos os usuarios e direccións IP bloqueados.", "apihelp-query+blocks-param-start": "Selo de tempo para comezar a enumeración.", "apihelp-query+blocks-param-end": "Selo de tempo para rematar a enumeración.", "apihelp-query+blocks-param-ids": "Lista de IDs de bloque a listar (opcional).", @@ -599,7 +613,7 @@ "apihelp-query+blocks-param-show": "Só mostrar elementos correspondentes a eses criterios.\nPor exemplo, para ver só bloques indefinidos en direccións IP, ponga $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Listar bloques.", "apihelp-query+blocks-example-users": "Lista de bloques de usuarios Alice e Bob.", - "apihelp-query+categories-description": "Listar todas as categorías ás que pertencen as páxinas.", + "apihelp-query+categories-summary": "Listar todas as categorías ás que pertencen as páxinas.", "apihelp-query+categories-param-prop": "Que propiedades adicionais obter para cada categoría:", "apihelp-query+categories-paramvalue-prop-sortkey": "Engade a clave de ordenación (cadea hexadecimal) e o prefixo da clave de ordenación (parte lexible) da categoría.", "apihelp-query+categories-paramvalue-prop-timestamp": "Engade o selo de tempo de cando se engadíu a categoría.", @@ -610,9 +624,9 @@ "apihelp-query+categories-param-dir": "Dirección na cal listar.", "apihelp-query+categories-example-simple": "Obter a lista de categorías ás que pertence a páxina Albert Einstein", "apihelp-query+categories-example-generator": "Obter a información de todas as categorías usadas na páxina Albert Einstein.", - "apihelp-query+categoryinfo-description": "Devolver información sobre as categorías dadas.", + "apihelp-query+categoryinfo-summary": "Devolver información sobre as categorías dadas.", "apihelp-query+categoryinfo-example-simple": "Obter información sobre Category:Foo e Category:Bar", - "apihelp-query+categorymembers-description": "Listar tódalas páxinas nunha categoría determinada.", + "apihelp-query+categorymembers-summary": "Listar tódalas páxinas nunha categoría determinada.", "apihelp-query+categorymembers-param-title": "Que categoría enumerar (obrigatorio). Debe incluír o prefixo {{ns:category}}:. Non pode usarse xunto con $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID de páxina da categoría a enumerar. Non se pode usar xunto con $1title.", "apihelp-query+categorymembers-param-prop": "Que información incluír:", @@ -637,14 +651,15 @@ "apihelp-query+categorymembers-param-endsortkey": "Usar $1endhexsortkey no seu lugar.", "apihelp-query+categorymembers-example-simple": "Obter as dez primeiras páxinas de Category:Physics.", "apihelp-query+categorymembers-example-generator": "Obter a información das primeiras dez páxinas de Category:Physics.", - "apihelp-query+contributors-description": "Obter a lista de contribuidores conectados e o número de contribuidores anónimos dunha páxina.", + "apihelp-query+contributors-summary": "Obter a lista de contribuidores conectados e o número de contribuidores anónimos dunha páxina.", "apihelp-query+contributors-param-group": "Incluír só ós usuarios dos grupos dados. Non se inclúen grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.", "apihelp-query+contributors-param-excludegroup": "Excluír usuarios nos grupos dados. Non se inclúen grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.", "apihelp-query+contributors-param-rights": "Incluír só ós usuarios cos dereitos dados. Non se inclúen os dereitos dados a grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.", "apihelp-query+contributors-param-excluderights": "Excluír usuarios cos dereitos dados. Non se inclúen os dereitos dados a grupos implícitos nin autopromocionados como *, usuario ou autoconfirmado.", "apihelp-query+contributors-param-limit": "Número total de contribuidores a devolver.", "apihelp-query+contributors-example-simple": "Mostrar os contribuidores á páxina Main Page.", - "apihelp-query+deletedrevisions-description": "Obter a información da revisión eliminada.\n\nPode usarse de varias formas:\n#Obter as revisións borradas dun conxunto de páxinas, indicando os títulos ou os IDs das páxinas. Ordenado por título e selo de tempo.\n#Obter datos sobre un conxunto de revisións borradas, indicando os seus IDs e os seus IDs de revisión. Ordenado por ID de revisión.", + "apihelp-query+deletedrevisions-summary": "Obter información sobre as revisións eliminadas.", + "apihelp-query+deletedrevisions-extended-description": "Pode usarse de varias formas:\n#Obter as revisións borradas dun conxunto de páxinas, indicando os títulos ou os IDs das páxinas. Ordenado por título e selo de tempo.\n#Obter datos sobre un conxunto de revisións borradas, indicando os seus IDs e os seus IDs de revisión. Ordenado por ID de revisión.", "apihelp-query+deletedrevisions-param-start": "Selo de tempo no que comezar a enumeración. Ignorado cando se está procesando unha lista de IDs de revisións.", "apihelp-query+deletedrevisions-param-end": "Selo de tempo no que rematar a enumeración. Ignorado cando se está procesando unha lista de IDs de revisións.", "apihelp-query+deletedrevisions-param-tag": "Só listar revisións marcadas con esta etiqueta.", @@ -652,7 +667,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "Non listar revisións deste usuario.", "apihelp-query+deletedrevisions-example-titles": "Listar as revisións borradas das páxinas Main Page e Talk:Main Page, con contido.", "apihelp-query+deletedrevisions-example-revids": "Listar a información para a revisión borrada 123456.", - "apihelp-query+deletedrevs-description": "Lista as modificación borradas.\n\nOpera según tres modos:\n#Lista as modificacións borradas dos títulos indicados, ordenados por selo de tempo.\n#Lista as contribucións borradas do usuario indicado, ordenadas por selo de tempo (sen indicar títulos).\n#Lista todas as modificacións borradas no espazo de nomes indicado, ordenadas por título e selo de tempo (sen indicar títulos, sen fixar $1user).\n\nCertos parámetros só se aplican a algúns modos e son ignorados noutros.", + "apihelp-query+deletedrevs-summary": "Listar as revisións eliminadas.", + "apihelp-query+deletedrevs-extended-description": "Opera según tres modos:\n#Lista as modificacións borradas dos títulos indicados, ordenados por selo de tempo.\n#Lista as contribucións borradas do usuario indicado, ordenadas por selo de tempo (sen indicar títulos).\n#Lista todas as modificacións borradas no espazo de nomes indicado, ordenadas por título e selo de tempo (sen indicar títulos, sen fixar $1user).\n\nCertos parámetros só se aplican a algúns modos e son ignorados noutros.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2", "apihelp-query+deletedrevs-param-start": "Selo de tempo no que comezar a enumeración.", "apihelp-query+deletedrevs-param-end": "Selo de tempo para rematar a enumeración.", @@ -670,14 +686,14 @@ "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribucións borradas de Bob (modo 2).", "apihelp-query+deletedrevs-example-mode3-main": "Listar as primeiras 50 revisións borradas no espazo de nomes principal (modo 3)", "apihelp-query+deletedrevs-example-mode3-talk": "Listar as primeiras 50 páxinas no espazo de nomes {{ns:talk}} (modo 3).", - "apihelp-query+disabled-description": "Este módulo de consulta foi desactivado.", - "apihelp-query+duplicatefiles-description": "Listar todos os ficheiros que son duplicados dos fichieros dados baseado nos valores da función hash.", + "apihelp-query+disabled-summary": "Este módulo de consulta foi desactivado.", + "apihelp-query+duplicatefiles-summary": "Listar todos os ficheiros que son duplicados dos fichieros dados baseado nos valores da función hash.", "apihelp-query+duplicatefiles-param-limit": "Cantos ficheiros duplicados devolver.", "apihelp-query+duplicatefiles-param-dir": "Dirección na cal listar.", "apihelp-query+duplicatefiles-param-localonly": "Só buscar por ficheiros no repositorio local.", "apihelp-query+duplicatefiles-example-simple": "Buscar duplicados de [[:File:Albert Einstein Head.jpg]]", "apihelp-query+duplicatefiles-example-generated": "Buscar duplicados de tódolos ficheiros", - "apihelp-query+embeddedin-description": "Atopar todas as páxinas que inclúen (por transclusión) o título dado.", + "apihelp-query+embeddedin-summary": "Atopar todas as páxinas que inclúen (por transclusión) o título dado.", "apihelp-query+embeddedin-param-title": "Título a buscar. Non pode usarse xunto con $1pageid.", "apihelp-query+embeddedin-param-pageid": "Identificador de páxina a buscar. Non pode usarse xunto con $1title.", "apihelp-query+embeddedin-param-namespace": "Espazo de nomes a enumerar.", @@ -686,13 +702,13 @@ "apihelp-query+embeddedin-param-limit": "Número total de páxinas a devolver.", "apihelp-query+embeddedin-example-simple": "Mostrar as páxinas que inclúan Template:Stub.", "apihelp-query+embeddedin-example-generator": "Obter información sobre as páxinas que inclúen Template:Stub.", - "apihelp-query+extlinks-description": "Devolve todas as URLs externas (sen ser interwikis) das páxinas dadas.", + "apihelp-query+extlinks-summary": "Devolve todas as URLs externas (sen ser interwikis) das páxinas dadas.", "apihelp-query+extlinks-param-limit": "Cantas ligazóns devolver.", "apihelp-query+extlinks-param-protocol": "Protocolo da URL. Se está baleiro e está activo $1query, o protocolo é http. Deixar esa variable e a $1query baleiras para listar todas as ligazóns externas.", "apihelp-query+extlinks-param-query": "Buscar cadea sen protocolo. Útil para verificar se unha páxina determinada contén unha URL externa determinada.", "apihelp-query+extlinks-param-expandurl": "Expandir as URLs relativas a un protocolo co protocolo canónico.", "apihelp-query+extlinks-example-simple": "Obter unha de ligazóns externas á Main Page.", - "apihelp-query+exturlusage-description": "Enumerar páxinas que conteñen unha dirección URL dada.", + "apihelp-query+exturlusage-summary": "Enumerar páxinas que conteñen unha dirección URL dada.", "apihelp-query+exturlusage-param-prop": "Que información incluír:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Engade o ID da páxina.", "apihelp-query+exturlusage-paramvalue-prop-title": "Engade o título e o ID do espazo de nomes da páxina.", @@ -703,7 +719,7 @@ "apihelp-query+exturlusage-param-limit": "Cantas páxinas devolver.", "apihelp-query+exturlusage-param-expandurl": "Expandir as URLs relativas a un protocolo co protocolo canónico.", "apihelp-query+exturlusage-example-simple": "Mostrar páxinas ligando a http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Enumerar secuencialmente todos os ficheiros borrados.", + "apihelp-query+filearchive-summary": "Enumerar secuencialmente todos os ficheiros borrados.", "apihelp-query+filearchive-param-from": "Título da imaxe coa que comezar a enumeración.", "apihelp-query+filearchive-param-to": "Título da imaxe coa que rematar a enumeración.", "apihelp-query+filearchive-param-prefix": "Buscar tódolos títulos de imaxes que comezan con este valor.", @@ -725,10 +741,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Engade a profundidade de bit da versión.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.", "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.", - "apihelp-query+filerepoinfo-description": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.", - "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.", + "apihelp-query+filerepoinfo-summary": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.", + "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.", "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros", - "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.", + "apihelp-query+fileusage-summary": "Atopar tódalas páxinas que usan os ficheiros dados.", "apihelp-query+fileusage-param-prop": "Que propiedades obter:", "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de cada páxina.", "apihelp-query+fileusage-paramvalue-prop-title": "Título de cada páxina.", @@ -738,7 +754,7 @@ "apihelp-query+fileusage-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.", "apihelp-query+fileusage-example-simple": "Obter unha lista de páxinas usando [[:File:Example.jpg]]", "apihelp-query+fileusage-example-generator": "Obter infomación sobre páxinas que usan [[:File:Example.jpg]]", - "apihelp-query+imageinfo-description": "Devolve información de ficheiros e historial de subidas.", + "apihelp-query+imageinfo-summary": "Devolve información de ficheiros e historial de subidas.", "apihelp-query+imageinfo-param-prop": "Que información do ficheiro obter:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Engade selo de tempo á versión subida.", "apihelp-query+imageinfo-paramvalue-prop-user": "Engade o usuario que subiu cada versión do ficheiro.", @@ -774,13 +790,13 @@ "apihelp-query+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.", "apihelp-query+imageinfo-example-simple": "Busca a información sobre a versión actual de [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "Busca información sobre as versións de [[:File:Test.jpg]] posteriores a 2008.", - "apihelp-query+images-description": "Devolve todos os ficheiros contidos nas páxinas dadas.", + "apihelp-query+images-summary": "Devolve todos os ficheiros contidos nas páxinas dadas.", "apihelp-query+images-param-limit": "Cantos ficheiros devolver.", "apihelp-query+images-param-images": "Listar só eses ficheiros. Útil para verificar se unha páxina concreta ten un ficheiro determinado.", "apihelp-query+images-param-dir": "Dirección na cal listar.", "apihelp-query+images-example-simple": "Obter unha lista de arquivos empregados na [[Main Page]].", "apihelp-query+images-example-generator": "Obter información sobre todos os ficheiros usados na [[Main Page]].", - "apihelp-query+imageusage-description": "Atopar tódalas páxinas que usan o título da imaxe dada.", + "apihelp-query+imageusage-summary": "Atopar tódalas páxinas que usan o título da imaxe dada.", "apihelp-query+imageusage-param-title": "Título a buscar. Non pode usarse xunto con $1pageid.", "apihelp-query+imageusage-param-pageid": "ID de páxina a buscar. Non pode usarse xunto con $1title.", "apihelp-query+imageusage-param-namespace": "Nome de espazos a numerar.", @@ -790,7 +806,7 @@ "apihelp-query+imageusage-param-redirect": "Se a ligazón sobre unha páxina é unha redirección, atopa tamén todas as páxinas que ligan con esa redirección. O límite máximo divídese á metade.", "apihelp-query+imageusage-example-simple": "Mostrar as páxinas que usan [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "Obter información sobre as páxinas que usan [[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "Obter información básica da páxina.", + "apihelp-query+info-summary": "Obter información básica da páxina.", "apihelp-query+info-param-prop": "Que propiedades adicionais obter:", "apihelp-query+info-paramvalue-prop-protection": "Listar o nivel de protección de cada páxina.", "apihelp-query+info-paramvalue-prop-talkid": "O ID de páxina da páxina de conversa para cada páxina que non é páxina de conversa.", @@ -807,7 +823,8 @@ "apihelp-query+info-param-token": "Usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] no canto diso.", "apihelp-query+info-example-simple": "Obter información sobre a páxina Main Page.", "apihelp-query+info-example-protection": "Obter información xeral e de protección sobre a páxina Main Page.", - "apihelp-query+iwbacklinks-description": "Atopar todas as páxina que ligan á ligazón interwiki indicada.\n\nPode usarse para atopar todas as ligazóns cun prefixo, ou todas as ligazóns a un título (co prefixo indicado). Se non se usa ningún parámetro funciona como \"todas as ligazóns interwiki\".", + "apihelp-query+iwbacklinks-summary": "Atopar todas as páxina que ligan á ligazón interwiki indicada.", + "apihelp-query+iwbacklinks-extended-description": "Pode usarse para atopar todas as ligazóns cun prefixo, ou todas as ligazóns a un título (co prefixo indicado). Se non se usa ningún parámetro funciona como \"todas as ligazóns interwiki\".", "apihelp-query+iwbacklinks-param-prefix": "Prefixo para a interwiki.", "apihelp-query+iwbacklinks-param-title": "Ligazón interwiki a buscar. Debe usarse con $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "Número total de páxinas a devolver.", @@ -817,7 +834,7 @@ "apihelp-query+iwbacklinks-param-dir": "Dirección na cal listar.", "apihelp-query+iwbacklinks-example-simple": "Obter as páxinas ligadas a [[wikibooks:Test]]", "apihelp-query+iwbacklinks-example-generator": "Obter información sobre as páxinas que ligan a [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Devolve todas as ligazóns interwiki ás páxinas indicadas.", + "apihelp-query+iwlinks-summary": "Devolve todas as ligazóns interwiki ás páxinas indicadas.", "apihelp-query+iwlinks-param-url": "Se obter a URL completa (non pode usarse con $1prop).", "apihelp-query+iwlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interwiki:", "apihelp-query+iwlinks-paramvalue-prop-url": "Engade a URL completa.", @@ -826,7 +843,8 @@ "apihelp-query+iwlinks-param-title": "Ligazón interwiki a buscar. Debe usarse con $1prefix.", "apihelp-query+iwlinks-param-dir": "Dirección na cal listar.", "apihelp-query+iwlinks-example-simple": "Obter as ligazóns interwiki da páxina Main Page.", - "apihelp-query+langbacklinks-description": "Atopar todas as páxinas que ligan coa ligazón de lingua dada. \n\nPode usarse para atopar todas as ligazóns cun código de lingua, ou todas as ligazón a un título (cunha lingua dada). Non usar cun parámetro que sexa \"todas as ligazóns de lingua\".\n\nDecátese que isto pode non considerar as ligazóns de idioma engadidas polas extensións.", + "apihelp-query+langbacklinks-summary": "Atopar todas as páxinas que ligan coa ligazón de lingua dada.", + "apihelp-query+langbacklinks-extended-description": "Pode usarse para atopar todas as ligazóns cun código de lingua, ou todas as ligazón a un título (cunha lingua dada). Non usar cun parámetro que sexa \"todas as ligazóns de lingua\".\n\nDecátese que isto pode non considerar as ligazóns de idioma engadidas polas extensións.", "apihelp-query+langbacklinks-param-lang": "Lingua para a ligazón de lingua.", "apihelp-query+langbacklinks-param-title": "Ligazón de lingua a buscar. Debe usarse con $1lang.", "apihelp-query+langbacklinks-param-limit": "Número total de páxinas a devolver.", @@ -836,7 +854,7 @@ "apihelp-query+langbacklinks-param-dir": "Dirección na cal listar.", "apihelp-query+langbacklinks-example-simple": "Obter as páxinas ligadas a [[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "Obter información sobre as páxinas que ligan a [[:fr:Test]].", - "apihelp-query+langlinks-description": "Devolve todas as ligazóns interwiki ás páxinas indicadas.", + "apihelp-query+langlinks-summary": "Devolve todas as ligazóns interwiki ás páxinas indicadas.", "apihelp-query+langlinks-param-limit": "Cantas ligazóns de lingua devolver.", "apihelp-query+langlinks-param-url": "Se obter a URL completa (non pode usarse con $1prop).", "apihelp-query+langlinks-param-prop": "Que propiedades adicionais obter para cada ligazón interlingüística:", @@ -848,7 +866,7 @@ "apihelp-query+langlinks-param-dir": "Dirección na cal listar.", "apihelp-query+langlinks-param-inlanguagecode": "Código de lingua para nomes de lingua localizados.", "apihelp-query+langlinks-example-simple": "Obter ligazóns interlingua da páxina Main Page.", - "apihelp-query+links-description": "Devolve todas as ligazóns das páxinas indicadas.", + "apihelp-query+links-summary": "Devolve todas as ligazóns das páxinas indicadas.", "apihelp-query+links-param-namespace": "Mostra ligazóns só neste espazo de nomes.", "apihelp-query+links-param-limit": "Cantas ligazóns devolver.", "apihelp-query+links-param-titles": "Listar só as ligazóns a eses títulos. Útil para verificar se unha páxina concreta liga a un título determinado.", @@ -856,7 +874,7 @@ "apihelp-query+links-example-simple": "Obter as ligazóns da páxina Main Page.", "apihelp-query+links-example-generator": "Obter información sobre as ligazóns de páxina da Main Page.", "apihelp-query+links-example-namespaces": "Obter as ligazóns á páxina Main Page nos espazos de nome {{ns:user}} e {{ns:template}}.", - "apihelp-query+linkshere-description": "Atopar todas as páxinas que ligan coas páxinas dadas.", + "apihelp-query+linkshere-summary": "Atopar todas as páxinas que ligan coas páxinas dadas.", "apihelp-query+linkshere-param-prop": "Que propiedades obter:", "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de cada páxina.", "apihelp-query+linkshere-paramvalue-prop-title": "Título de cada páxina.", @@ -866,7 +884,7 @@ "apihelp-query+linkshere-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.", "apihelp-query+linkshere-example-simple": "Obter unha lista que ligan á [[Main Page]]", "apihelp-query+linkshere-example-generator": "Obter a información das páxinas que ligan á [[Main Page]].", - "apihelp-query+logevents-description": "Obter os eventos dos rexistros.", + "apihelp-query+logevents-summary": "Obter os eventos dos rexistros.", "apihelp-query+logevents-param-prop": "Que propiedades obter:", "apihelp-query+logevents-paramvalue-prop-ids": "Engade o identificador do evento.", "apihelp-query+logevents-paramvalue-prop-title": "Engade o título da páxina para o evento.", @@ -889,13 +907,13 @@ "apihelp-query+logevents-param-tag": "Só listar entradas de evento marcadas con esta etiqueta.", "apihelp-query+logevents-param-limit": "Número total de entradas de evento a devolver.", "apihelp-query+logevents-example-simple": "Lista de eventos recentes do rexistro.", - "apihelp-query+pagepropnames-description": "Listar os nomes de todas as propiedades de páxina usados na wiki.", + "apihelp-query+pagepropnames-summary": "Listar os nomes de todas as propiedades de páxina usados na wiki.", "apihelp-query+pagepropnames-param-limit": "Máximo número de nomes a retornar.", "apihelp-query+pagepropnames-example-simple": "Obter os dez primeiros nomes de propiedade.", - "apihelp-query+pageprops-description": "Obter varias propiedades de páxina definidas no contido da páxina.", + "apihelp-query+pageprops-summary": "Obter varias propiedades de páxina definidas no contido da páxina.", "apihelp-query+pageprops-param-prop": "Listar só estas propiedades de páxina ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] devolve os nomes das propiedades de páxina usados). Útil para verificar se as páxinas usan unha determinada propiedade de páxina.", "apihelp-query+pageprops-example-simple": "Obter as propiedades para as páxinas Main Page e MediaWiki", - "apihelp-query+pageswithprop-description": "Mostrar a lista de páxinas que empregan unha propiedade determinada.", + "apihelp-query+pageswithprop-summary": "Mostrar a lista de páxinas que empregan unha propiedade determinada.", "apihelp-query+pageswithprop-param-propname": "Propiedade de páxina para a que enumerar as páxinas ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] devolve os nomes das propiedades de páxina en uso).", "apihelp-query+pageswithprop-param-prop": "Que información incluír:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Engade o ID da páxina.", @@ -905,14 +923,15 @@ "apihelp-query+pageswithprop-param-dir": "En que dirección ordenar.", "apihelp-query+pageswithprop-example-simple": "Lista as dez primeiras páxinas que usan {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Obter información adicional das dez primeiras páxinas que usan __NOTOC__.", - "apihelp-query+prefixsearch-description": "Facer unha busca de prefixo nos títulos das páxinas.\nA pesar das semellanzas nos nomes, este módulo non pretende ser equivalente a [[Special:PrefixIndex]]; para iso consulte [[Special:ApiHelp/query+allpages|action=query&list=allpages]] co parámetro apprefix. O propósito deste módulo é semellante ó de [[Special:ApiHelp/opensearch|action=opensearch]]: para coller a entrada do usuario e proporcionar mellores os títulos que mellor se lle adapten. Dependendo do motor de buscas do servidor, isto pode incluír corrección de erros, evitar as redireccións, ou outras heurísticas.", + "apihelp-query+prefixsearch-summary": "Facer unha busca de prefixo nos títulos das páxinas.", + "apihelp-query+prefixsearch-extended-description": "A pesar das semellanzas nos nomes, este módulo non pretende ser equivalente a [[Special:PrefixIndex]]; para iso consulte [[Special:ApiHelp/query+allpages|action=query&list=allpages]] co parámetro apprefix. O propósito deste módulo é semellante ó de [[Special:ApiHelp/opensearch|action=opensearch]]: para coller a entrada do usuario e proporcionar mellores os títulos que mellor se lle adapten. Dependendo do motor de buscas do servidor, isto pode incluír corrección de erros, evitar as redireccións, ou outras heurísticas.", "apihelp-query+prefixsearch-param-search": "Buscar texto.", "apihelp-query+prefixsearch-param-namespace": "Espazo de nomes no que buscar.", "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados a visualizar.", "apihelp-query+prefixsearch-param-offset": "Número de resultados a saltar.", "apihelp-query+prefixsearch-example-simple": "Buscar títulos de páxina que comecen con meaning.", "apihelp-query+prefixsearch-param-profile": "Buscar o perfil a usar.", - "apihelp-query+protectedtitles-description": "Listar todos os títulos protexidos en creación.", + "apihelp-query+protectedtitles-summary": "Listar todos os títulos protexidos en creación.", "apihelp-query+protectedtitles-param-namespace": "Só listar títulos nestes espazos de nomes.", "apihelp-query+protectedtitles-param-level": "Só listar títulos con estos niveis de protección.", "apihelp-query+protectedtitles-param-limit": "Número total de páxinas a devolver.", @@ -928,18 +947,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "Engade o nivel de protección.", "apihelp-query+protectedtitles-example-simple": "Listar títulos protexidos", "apihelp-query+protectedtitles-example-generator": "Atopar ligazóns ós títulos protexidos no espazo de nomes principal", - "apihelp-query+querypage-description": "Obtén unha lista proporcionada por unha páxina especial basada en QueryPage.", + "apihelp-query+querypage-summary": "Obtén unha lista proporcionada por unha páxina especial basada en QueryPage.", "apihelp-query+querypage-param-page": "Nome da páxina especial. Teña en conta que diferencia entre maiúsculas e minúsculas.", "apihelp-query+querypage-param-limit": "Número de resultados a visualizar.", "apihelp-query+querypage-example-ancientpages": "Resultados devoltos de [[Special:Ancientpages]].", - "apihelp-query+random-description": "Obter un conxunto de páxinas aleatorias.\n\nAs páxinas están listadas nunha secuencia fixa, só o punto de comezo é aleatorio. Isto significa que se, por exemplo, a Main Page é a primeira páxina aleatoria da lista, a Lista de monos ficticios será sempre a segunda, Lista de xente en selos de Vanuatu será a terceira, etc.", + "apihelp-query+random-summary": "Obter un conxunto de páxinas aleatorias.", + "apihelp-query+random-extended-description": "As páxinas están listadas nunha secuencia fixa, só o punto de comezo é aleatorio. Isto significa que se, por exemplo, a Main Page é a primeira páxina aleatoria da lista, a Lista de monos ficticios será sempre a segunda, Lista de xente en selos de Vanuatu será a terceira, etc.", "apihelp-query+random-param-namespace": "Devolver páxinas só neste espazo de nomes.", "apihelp-query+random-param-limit": "Limitar cantas páxinas aleatorias se van devolver.", "apihelp-query+random-param-redirect": "No canto use $1filterredir=redirects.", "apihelp-query+random-param-filterredir": "Como filtrar para redireccións.", "apihelp-query+random-example-simple": "Obter dúas páxinas aleatorias do espazo de nomes principal.", "apihelp-query+random-example-generator": "Obter a información da páxina de dúas páxinas aleatorias do espazo de nomes principal.", - "apihelp-query+recentchanges-description": "Enumerar cambios recentes.", + "apihelp-query+recentchanges-summary": "Enumerar cambios recentes.", "apihelp-query+recentchanges-param-start": "Selo de tempo para comezar a enumeración.", "apihelp-query+recentchanges-param-end": "Selo de tempo para rematar a enumeración.", "apihelp-query+recentchanges-param-namespace": "Filtrar os cambios a só eses espazos de nomes.", @@ -969,7 +989,7 @@ "apihelp-query+recentchanges-param-generaterevisions": "Cando é usado como xerador, xera identificadore de revisión no canto de títulos. As entradas de modificacións recentes sen identificadores de revisión asociados (p. ex. a maioría das entradas de rexistro) non xerarán nada.", "apihelp-query+recentchanges-example-simple": "Listar cambios recentes.", "apihelp-query+recentchanges-example-generator": "Obter a información de páxina sobre cambios recentes sen vixiancia.", - "apihelp-query+redirects-description": "Devolve todas as redireccións das páxinas indicadas.", + "apihelp-query+redirects-summary": "Devolve todas as redireccións das páxinas indicadas.", "apihelp-query+redirects-param-prop": "Que propiedades recuperar:", "apihelp-query+redirects-paramvalue-prop-pageid": "ID de páxina de cada redirección.", "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirección.", @@ -979,10 +999,11 @@ "apihelp-query+redirects-param-show": "Só mostrar elementos que cumpran estos criterios:\n;fragment:Só mostrar redireccións que teñan un fragmento.\n;!fragment:Só mostrar redireccións que non teñan un fragmento.", "apihelp-query+redirects-example-simple": "Obter unha lista de redireccións á [[Main Page]]", "apihelp-query+redirects-example-generator": "Obter información sobre tódalas redireccións á [[Main Page]]", - "apihelp-query+revisions-description": "Obter información da modificación.\n\nPode usarse de varias formas:\n#Obter datos sobre un conxunto de páxinas (última modificación), fixando os títulos ou os IDs das páxinas.\n#Obter as modificacións da páxina indicada, usando os títulos ou os IDs de páxinas con comezar, rematar ou límite.\n#Obter os datos sobre un conxunto de modificacións fixando os seus IDs cos seus IDs de modificación.", + "apihelp-query+revisions-summary": "Obter información da revisión.", + "apihelp-query+revisions-extended-description": "Pode usarse de varias formas:\n#Obter datos sobre un conxunto de páxinas (última modificación), fixando os títulos ou os IDs das páxinas.\n#Obter as modificacións da páxina indicada, usando os títulos ou os IDs de páxinas con comezar, rematar ou límite.\n#Obter os datos sobre un conxunto de modificacións fixando os seus IDs cos seus IDs de modificación.", "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode usarse cunha única páxina (mode #2).", "apihelp-query+revisions-param-startid": "Desde que ID de revisión comezar a enumeración.", - "apihelp-query+revisions-param-endid": "Rematar a enumeración de revisión neste ID de revisión.", + "apihelp-query+revisions-param-endid": "Rematar a enumeración de revisión na data e hora desta revisión. A revisión ten que existir, pero non precisa pertencer a esta páxina.", "apihelp-query+revisions-param-start": "Desde que selo de tempo comezar a enumeración.", "apihelp-query+revisions-param-end": "Enumerar desde este selo de tempo.", "apihelp-query+revisions-param-user": "Só incluir revisión feitas polo usuario.", @@ -1008,17 +1029,17 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Comentario analizado do usuario para a modificación.", "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisión.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisión.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Árbore de análise XML do contido da modificación (precisa o modelo de contido $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Obsoleto. En substitución, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. Árbore de análise XML do contido da modificación (precisa o modelo de contido $1).", "apihelp-query+revisions+base-param-limit": "Limitar cantas revisións se van devolver.", - "apihelp-query+revisions+base-param-expandtemplates": "Expandir os modelos no contido da revisión (require $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "Xenerar a árbore de análise XML para o contido da revisión (require $1prop=content; substituído por $1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "Analizar o contido da revisión (require $1prop=content). Por razóns de rendemento, se se usa esta opción, $1limit cámbiase a 1.", + "apihelp-query+revisions+base-param-expandtemplates": "En substitución, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Expandir os modelos no contido da revisión (require $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "En substitución, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. Xenerar a árbore de análise XML para o contido da revisión (require $1prop=content; substituído por $1prop=parsetree).", + "apihelp-query+revisions+base-param-parse": "En substitución, use [[Special:ApiHelp/parse|action=parse]]. Analizar o contido da revisión (require $1prop=content). Por razóns de rendemento, se se usa esta opción, $1limit cámbiase a 1.", "apihelp-query+revisions+base-param-section": "Recuperar unicamente o contido deste número de sección.", - "apihelp-query+revisions+base-param-diffto": "ID de revisión a comparar con cada revisión. Use prev, next e cur para a versión precedente, seguinte e actual respectivamente.", - "apihelp-query+revisions+base-param-difftotext": "Texto co que comparar cada revisión. Só compara un número limitado de revisións. Ignora $1diffto. Se $1section ten valor, só se comparará co texto esa sección.", - "apihelp-query+revisions+base-param-difftotextpst": "Facer unha transformación sobre o texto antes do gardado e antes de comparalo. Só válidoo cando se usa con $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "En substitución, use [[Special:ApiHelp/compare|action=compare]]. ID de revisión a comparar con cada revisión. Use prev, next e cur para a versión precedente, seguinte e actual respectivamente.", + "apihelp-query+revisions+base-param-difftotext": "En substitución, use [[Special:ApiHelp/compare|action=compare]]. Texto co que comparar cada revisión. Só compara un número limitado de revisións. Ignora $1diffto. Se $1section ten valor, só se comparará co texto esa sección.", + "apihelp-query+revisions+base-param-difftotextpst": "En substitución, use [[Special:ApiHelp/compare|action=compare]]. Facer unha transformación sobre o texto antes do gardado e antes de comparalo. Só válidoo cando se usa con $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Formato de serialización usado por $1difftotext e esperado para a saída do contido.", - "apihelp-query+search-description": "Facer unha busca por texto completo.", + "apihelp-query+search-summary": "Facer unha busca por texto completo.", "apihelp-query+search-param-search": "Buscar os títulos de páxina ou contido que coincidan con este valor. Pode usar a cadea de busca para invocar funcións especiais de busca, dependendo do motor de busca que teña a wiki.", "apihelp-query+search-param-namespace": "Buscar só nestes espazos de nomes.", "apihelp-query+search-param-what": "Que tipo de busca lanzar.", @@ -1036,16 +1057,16 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "Engade o título da sección asociada.", "apihelp-query+search-paramvalue-prop-categorysnippet": "Engade un fragmento analizado da categoría asociada.", "apihelp-query+search-paramvalue-prop-isfilematch": "Engade unha marca indicando se o resultado da busca é un ficheiro.", - "apihelp-query+search-paramvalue-prop-score": "Obsoleto e ignorado.", - "apihelp-query+search-paramvalue-prop-hasrelated": "Obsoleto e ignorado.", + "apihelp-query+search-paramvalue-prop-score": "Ignorado.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorado.", "apihelp-query+search-param-limit": "Número total de páxinas a devolver.", "apihelp-query+search-param-interwiki": "Incluir na busca resultados de interwikis, se é posible.", "apihelp-query+search-param-backend": "Que servidor de busca usar, se non se indica usa o que hai por defecto.", - "apihelp-query+search-param-enablerewrites": "Habilitar reescritura da consulta interna. Algúns motores de busca poden reescribir a consulta a outra que se estima que dará mellores resultados, como corrixindo erros de ortografía.", + "apihelp-query+search-param-enablerewrites": "Habilitar reescritura da consulta interna. Algúns motores de busca poden reescribir a consulta a outra que consideran que dará mellores resultados, por exemplo, corrixindo erros de ortografía.", "apihelp-query+search-example-simple": "Buscar meaning.", "apihelp-query+search-example-text": "Buscar texto por significado.", "apihelp-query+search-example-generator": "Obter información da páxina sobre as páxinas devoltas por unha busca por meaning.", - "apihelp-query+siteinfo-description": "Devolver información xeral sobre o sitio.", + "apihelp-query+siteinfo-summary": "Devolver información xeral sobre o sitio.", "apihelp-query+siteinfo-param-prop": "Que información obter:", "apihelp-query+siteinfo-paramvalue-prop-general": "Información xeral do sistema.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista dos espazos de nomes rexistrados e os seus nomes canónicos.", @@ -1062,10 +1083,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.", "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando $1inlanguagecode).", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando $1inlanguagecode, noutro caso no idioma do contido).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.", @@ -1077,12 +1099,12 @@ "apihelp-query+siteinfo-example-simple": "Obter información do sitio.", "apihelp-query+siteinfo-example-interwiki": "Obter unha lista de prefixos interwiki locais.", "apihelp-query+siteinfo-example-replag": "Revisar o retardo de replicación actual.", - "apihelp-query+stashimageinfo-description": "Devolve a información dos ficheiros almacenados.", + "apihelp-query+stashimageinfo-summary": "Devolve a información dos ficheiros almacenados.", "apihelp-query+stashimageinfo-param-filekey": "Clave que identifica unha subida precedente e que foi almacenada temporalmente.", "apihelp-query+stashimageinfo-param-sessionkey": "Alias para $1filekey, para compatibilidade con versións antigas.", "apihelp-query+stashimageinfo-example-simple": "Devolve a información dun ficheiro almacenado.", "apihelp-query+stashimageinfo-example-params": "Devolve as miniaturas de dous ficheiros almacenados.", - "apihelp-query+tags-description": "Lista de marcas de cambios.", + "apihelp-query+tags-summary": "Lista de marcas de cambios.", "apihelp-query+tags-param-limit": "Máximo número de etiquetas a listar.", "apihelp-query+tags-param-prop": "Que propiedades recuperar:", "apihelp-query+tags-paramvalue-prop-name": "Engade o nome da etiqueta.", @@ -1093,7 +1115,7 @@ "apihelp-query+tags-paramvalue-prop-source": "Obtén as fontes da etiqueta, que poden incluír extension para etiquetas definidas en extensión e manual para etiquetas que poden ser aplicadas manualmente polos usuarios.", "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-summary": "Devolve todas as páxinas incluídas na páxina indicada.", "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.", @@ -1101,11 +1123,11 @@ "apihelp-query+templates-example-simple": "Coller os modelos usado na Páxina Principal.", "apihelp-query+templates-example-generator": "Obter información sobre os modelos usados na Páxina Principal.", "apihelp-query+templates-example-namespaces": "Obter páxinas nos espazos de nomes {{ns:user}} e {{ns:template}} que se transclúen na Páxina Principal.", - "apihelp-query+tokens-description": "Recupera os identificadores das accións de modificación de datos.", + "apihelp-query+tokens-summary": "Recupera os identificadores das accións de modificación de datos.", "apihelp-query+tokens-param-type": "Tipos de identificadores a consultar.", "apihelp-query+tokens-example-simple": "Recuperar un identificador csrf (por defecto).", "apihelp-query+tokens-example-types": "Recuperar un identificador vixiancia e un de patrulla.", - "apihelp-query+transcludedin-description": "Atopar todas as páxinas que inclúen ás páxinas indicadas.", + "apihelp-query+transcludedin-summary": "Atopar todas as páxinas que inclúen ás páxinas indicadas.", "apihelp-query+transcludedin-param-prop": "Que propiedades obter:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de páxina de cada páxina.", "apihelp-query+transcludedin-paramvalue-prop-title": "Título de cada páxina.", @@ -1115,7 +1137,7 @@ "apihelp-query+transcludedin-param-show": "Mostrar só elementos que cumpren estes criterios:\n;redirect:Só mostra redireccións.\n;!redirect:Só mostra as que non son redireccións.", "apihelp-query+transcludedin-example-simple": "Obter unha lista de páxinas que inclúen a Main Page.", "apihelp-query+transcludedin-example-generator": "Obter información sobre as páxinas que inclúen Main Page.", - "apihelp-query+usercontribs-description": "Mostrar tódalas edicións dun usuario.", + "apihelp-query+usercontribs-summary": "Mostrar tódalas edicións dun usuario.", "apihelp-query+usercontribs-param-limit": "Máximo número de contribucións a mostar.", "apihelp-query+usercontribs-param-start": "Selo de tempo de comezo ó que volver.", "apihelp-query+usercontribs-param-end": "Selo de tempo de fin ó que volver.", @@ -1134,12 +1156,12 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Engade os indicadores da modificación.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marca as modificacións vixiadas.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da modificación.", - "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: $2show=!minor.\n\nSe está fixado $2show=patrolled ou $2show=!patrolled, as modificacións máis antigas que [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.", + "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: $2show=!minor.\n\nSe está fixado $2show=patrolled ou $2show=!patrolled, as modificacións máis antigas que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.", "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.", "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.", "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario Exemplo.", "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribucións de tódalas direccións IP que comezan por 192.0.2..", - "apihelp-query+userinfo-description": "Obter información sobre o usuario actual.", + "apihelp-query+userinfo-summary": "Obter información sobre o usuario actual.", "apihelp-query+userinfo-param-prop": "Que pezas de información incluír:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marca se o usuario actual está bloqueado, por que, e por que razón.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Engade unha etiqueta messages (mensaxe) se o usuario actual ten mensaxes pendentes.", @@ -1149,7 +1171,7 @@ "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos os dereitos que ten o usuario actual.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos ós que o usuario pode engadir ou eliminar a outros usuarios.", "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas as preferencias que ten seleccionadas o usuario actual.", - "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obsoleto.Obtén o identificador para cambiar as preferencias do usuario actual.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obtén un identificador para cambiar as preferencias do usuario actual.", "apihelp-query+userinfo-paramvalue-prop-editcount": "Engade o contador de edicións do usuario actual.", "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos o límites de rango aplicados ó usuario actual.", "apihelp-query+userinfo-paramvalue-prop-realname": "Engade o nome real do usuario.", @@ -1161,7 +1183,7 @@ "apihelp-query+userinfo-param-attachedwiki": "Con $1prop=centralids, \nindica que o usuario está acoplado á wiki identificada por este identificador.", "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.", "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.", - "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.", + "apihelp-query+users-summary": "Obter información sobre unha lista de usuarios.", "apihelp-query+users-param-prop": "Que información incluír:", "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas se o usuario está bloqueado, por quen, e por que razón.", "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos ós que pertence cada usuario.", @@ -1179,7 +1201,7 @@ "apihelp-query+users-param-userids": "Unha lista de identificadores de usuarios dos que obter información.", "apihelp-query+users-param-token": "Usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] no canto diso.", "apihelp-query+users-example-simple": "Mostar información para o usuario Example.", - "apihelp-query+watchlist-description": "Ver os cambios recentes das páxinas na lista de vixiancia do usuario actual.", + "apihelp-query+watchlist-summary": "Ver os cambios recentes das páxinas na lista de vixiancia do usuario actual.", "apihelp-query+watchlist-param-allrev": "Incluír múltiples revisións da mesma páxina dentro do intervalo de tempo indicado.", "apihelp-query+watchlist-param-start": "Selo de tempo para comezar a enumeración", "apihelp-query+watchlist-param-end": "Selo de tempo para rematar a enumeración.", @@ -1215,7 +1237,7 @@ "apihelp-query+watchlist-example-generator": "Buscar a información de páxina das páxinas cambiadas recentemente da lista de vixiancia do usuario actual.", "apihelp-query+watchlist-example-generator-rev": "Buscar a información da revisión dos cambios recentes de páxinas na lista de vixiancia do usuario actual.", "apihelp-query+watchlist-example-wlowner": "Listar a última revisión das páxinas cambiadas recentemente da lista de vixiancia do usuario Example.", - "apihelp-query+watchlistraw-description": "Obter todas as páxinas da lista de vixiancia do usuario actual.", + "apihelp-query+watchlistraw-summary": "Obter todas as páxinas da lista de vixiancia do usuario actual.", "apihelp-query+watchlistraw-param-namespace": "Só listar páxinas nestes espazos de nomes.", "apihelp-query+watchlistraw-param-limit": "Cantos resultados totais mostrar por petición.", "apihelp-query+watchlistraw-param-prop": "Que propiedades adicionais obter:", @@ -1228,15 +1250,15 @@ "apihelp-query+watchlistraw-param-totitle": "Título (co prefixo de espazo de nomes) no que rematar de enumerar.", "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.", "apihelp-query+watchlistraw-example-generator": "Buscar a información de páxina das páxinas da lista de vixiancia do usuario actual.", - "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.", + "apihelp-removeauthenticationdata-summary": "Elimina os datos de autenticación do usuario actual.", "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.", - "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] para usar este módulo.", + "apihelp-resetpassword-summary": "Envía un correo de inicialización de contrasinal a un usuario.", + "apihelp-resetpassword-extended-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] para usar este módulo.", "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.", "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.", "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario Exemplo.", "apihelp-resetpassword-example-email": "Enviar un correo de reinicialización de contrasinal a todos os usuarios con enderezo de correo electrónico usario@exemplo.com.", - "apihelp-revisiondelete-description": "Borrar e restaurar revisións.", + "apihelp-revisiondelete-summary": "Borrar e restaurar revisións.", "apihelp-revisiondelete-param-type": "Tipo de borrado de revisión a ser tratada.", "apihelp-revisiondelete-param-target": "Título de páxina para o borrado da revisión, se requerido para o tipo.", "apihelp-revisiondelete-param-ids": "Identificadores para as revisións a ser borradas.", @@ -1247,7 +1269,8 @@ "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar á entrada no rexistro de borrados.", "apihelp-revisiondelete-example-revision": "Ocultar contido para revisión 12345 na Páxina Principal.", "apihelp-revisiondelete-example-log": "Ocultar todos os datos da entrada de rexistro 67890 coa razón BLP violation.", - "apihelp-rollback-description": "Desfacer a última modificación da páxina.\n\nSe o último usuario que modificou a páxina fixo varias modificacións nunha fila, desfaranse todas.", + "apihelp-rollback-summary": "Desfacer a última edición da páxina.", + "apihelp-rollback-extended-description": "Se o último usuario que editou a páxina fixo varias edicións consecutivas, serán revertidas todas.", "apihelp-rollback-param-title": "Título da páxina a desfacer. Non pode usarse xunto con $1pageid.", "apihelp-rollback-param-pageid": "ID da páxina a desfacer. Non pode usarse xunto con $1title.", "apihelp-rollback-param-tags": "Etiquetas a aplicar á reversión.", @@ -1257,9 +1280,10 @@ "apihelp-rollback-param-watchlist": "Engadir ou eliminar sen condicións a páxina da lista de vixiancia do usuario actual, use as preferencias ou non cambie a vixiancia.", "apihelp-rollback-example-simple": "Desfacer as últimas edicións á Páxina Principal do usuario Exemplo.", "apihelp-rollback-example-summary": "Desfacer as últimas edicións á páxina Main Page polo usuario da dirección IP 192.0.2.5 co resumo de edición Revertindo vandalismo, marcar esas edicións e a reversión como edicións de bot.", - "apihelp-rsd-description": "Exportar un esquema RSD (Really Simple Discovery, Descubrimento Moi Simple).", + "apihelp-rsd-summary": "Exportar un esquema RSD (Really Simple Discovery, Descubrimento Moi Simple).", "apihelp-rsd-example-simple": "Exportar o esquema RSD.", - "apihelp-setnotificationtimestamp-description": "Actualizar a data e hora da notificación das páxinas vixiadas.\n\nIsto afecta ao realce das páxinas modificadas na lista de vixiancia e no historial, e ao envío de correos cando a preferencia \"{{int:tog-enotifwatchlistpages}}\" está activada.", + "apihelp-setnotificationtimestamp-summary": "Actualizar a data e hora de notificación das páxinas vixiadas.", + "apihelp-setnotificationtimestamp-extended-description": "Isto afecta ao realce das páxinas modificadas na lista de vixiancia e no historial, e ao envío de correos cando a preferencia \"{{int:tog-enotifwatchlistpages}}\" está activada.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Traballar en tódalas páxinas vixiadas.", "apihelp-setnotificationtimestamp-param-timestamp": "Selo de tempo ó que fixar a notificación.", "apihelp-setnotificationtimestamp-param-torevid": "Modificación á que fixar o selo de tempo de modificación (só unha páxina).", @@ -1268,8 +1292,8 @@ "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a Páxina Principal.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a Main page de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.", "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de {{ns:user}}.", - "apihelp-setpagelanguage-description": "Cambiar a lingua dunha páxina.", - "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", + "apihelp-setpagelanguage-summary": "Cambiar a lingua dunha páxina.", + "apihelp-setpagelanguage-extended-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", "apihelp-setpagelanguage-param-title": "Título da páxina cuxa lingua quere cambiar. Non se pode usar xunto con $1pageid.", "apihelp-setpagelanguage-param-pageid": "Identificador da páxina cuxa lingua quere cambiar. Non se pode usar xunto con $1title.", "apihelp-setpagelanguage-param-lang": "Código da lingua á que se quere cambiar a páxina. Use default para restablecer a páxina á lingua por defecto do contido da wiki.", @@ -1277,7 +1301,8 @@ "apihelp-setpagelanguage-param-tags": "Cambiar as etiquetas a aplicar á entrada de rexistro resultante desta acción.", "apihelp-setpagelanguage-example-language": "Cambiar a lingua de Main Page ó éuscaro.", "apihelp-setpagelanguage-example-default": "Cambiar a lingua da páxina con identificador 123 á lingua predeterminada para o contido da wiki.", - "apihelp-stashedit-description": "Preparar unha edición na caché compartida.\n\nEstá previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.", + "apihelp-stashedit-summary": "Preparar unha edición na caché compartida.", + "apihelp-stashedit-extended-description": "Está previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.", "apihelp-stashedit-param-title": "Título da páxina que se está a editar.", "apihelp-stashedit-param-section": "Número de selección. O 0 é para a sección superior, novo para unha sección nova.", "apihelp-stashedit-param-sectiontitle": "Título para unha nova sección.", @@ -1287,7 +1312,7 @@ "apihelp-stashedit-param-contentformat": "Formato de serialización de contido utilizado para o texto de entrada.", "apihelp-stashedit-param-baserevid": "Identificador da revisión da revisión de base.", "apihelp-stashedit-param-summary": "Resumo do cambio.", - "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.", + "apihelp-tag-summary": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.", "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.", "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.", "apihelp-tag-param-logid": "Identificadores de unha ou máis entradas do rexistro nas que engadir ou eliminar a etiqueta.", @@ -1297,11 +1322,12 @@ "apihelp-tag-param-tags": "Etiquetas a aplicar á entrada de rexistro que será creada como resultado desta acción.", "apihelp-tag-example-rev": "Engadir a etiqueta vandalismo á revisión con identificador 123 sen indicar un motivo", "apihelp-tag-example-log": "Eliminar a etiqueta publicidade da entrada do rexistro con identificador 123 co motivo aplicada incorrectamente", - "apihelp-tokens-description": "Obter os identificadores para accións de modificación de datos.\n\nEste módulo está obsoleto e foi reemprazado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-summary": "Obter os identificadores para accións de modificación de datos.", + "apihelp-tokens-extended-description": "Este módulo está obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-tokens-param-type": "Tipos de identificadores a consultar.", "apihelp-tokens-example-edit": "Recuperar un identificador de modificación (por defecto).", "apihelp-tokens-example-emailmove": "Recuperar un identificador de correo e un identificador de movemento.", - "apihelp-unblock-description": "Desbloquear un usuario.", + "apihelp-unblock-summary": "Desbloquear un usuario.", "apihelp-unblock-param-id": "ID do bloque a desbloquear (obtido de list=blocks). Non pode usarse xunto con $1user ou $1userid.", "apihelp-unblock-param-user": "Nome de usuario, enderezo IP ou rango de enderezos IP a desbloquear. Non pode usarse xunto con $1id ou $1userid.", "apihelp-unblock-param-userid": "ID de usuario a desbloquear. Non pode usarse xunto con $1id ou $1user.", @@ -1309,7 +1335,8 @@ "apihelp-unblock-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de bloqueo.", "apihelp-unblock-example-id": "Desbloquear bloqueo ID #105.", "apihelp-unblock-example-user": "Desbloquear usuario Bob con razón Síntoo Bob.", - "apihelp-undelete-description": "Restaurar modificacións dunha páxina borrada.\n\nUnha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "Restaurar modificacións dunha páxina borrada.", + "apihelp-undelete-extended-description": "Unha lista de modificacións borradas (incluíndo os seus selos de tempo) pode consultarse a través de [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], e unha lista de IDs de ficheiros borrados pode consultarse a través de [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "Título da páxina a restaurar.", "apihelp-undelete-param-reason": "Razón para restaurar.", "apihelp-undelete-param-tags": "Cambiar as etiquetas a aplicar na entrada do rexistro de borrado.", @@ -1318,9 +1345,10 @@ "apihelp-undelete-param-watchlist": "Engadir ou eliminar a páxina da lista de vixiancia do usuario actual sen condicións, use as preferencias ou non cambie a vixiancia.", "apihelp-undelete-example-page": "Restaurar a Páxina Principal.", "apihelp-undelete-example-revisions": "Restaurar dúas revisións de Main Page.", - "apihelp-unlinkaccount-description": "Elimina unha conta vinculada do usuario actual.", + "apihelp-unlinkaccount-summary": "Elimina unha conta vinculada do usuario actual.", "apihelp-unlinkaccount-example-simple": "Tentar eliminar a ligazón do usuario actual co provedor asociado con FooAuthenticationRequest.", - "apihelp-upload-description": "Subir un ficheiro, ou obter o estado de subas pedentes.\n\nHai varios métodos dispoñibles:\n*Subir o contido do ficheiro directamente, usando o parámetro $1file.\n*Subir o ficheiro por partes, usando os parámetros $1filesize, $1chunk, e $1offset.\n*Mandar ó servidor MediaWiki que colla un ficheiro dunha URL, usando o parámetro $1url.\n*Completar unha suba anterior que fallou a causa dos avisos, usando o parámetro $1filekey. \nTeña en conta que o HTTP POST debe facerse como suba de ficheiro (p.ex. usando multipart/form-data)cando se envie o $1file.", + "apihelp-upload-summary": "Subir un ficheiro, ou obter o estado das subas pendentes.", + "apihelp-upload-extended-description": "Hai varios métodos dispoñibles:\n*Subir o contido do ficheiro directamente, usando o parámetro $1file.\n*Subir o ficheiro por partes, usando os parámetros $1filesize, $1chunk, e $1offset.\n*Mandar ó servidor MediaWiki que colla un ficheiro dunha URL, usando o parámetro $1url.\n*Completar unha suba anterior que fallou a causa dos avisos, usando o parámetro $1filekey. \nTeña en conta que o HTTP POST debe facerse como suba de ficheiro (p.ex. usando multipart/form-data)cando se envie o $1file.", "apihelp-upload-param-filename": "Nome de ficheiro obxectivo.", "apihelp-upload-param-comment": "Subir comentario. Tamén usado como texto da páxina inicial para ficheiros novos se non se especifica $1text.", "apihelp-upload-param-tags": "Cambiar etiquetas a aplicar á entrada do rexistro de subas e á revisión de páxina de ficheiro.", @@ -1340,24 +1368,26 @@ "apihelp-upload-param-checkstatus": "Só buscar o estado da subida da clave de ficheiro indicada.", "apihelp-upload-example-url": "Carga dunha URL", "apihelp-upload-example-filekey": "Completar carga que fallou debido a avisos", - "apihelp-userrights-description": "Cambiar a pertencia dun usuario a un grupo.", + "apihelp-userrights-summary": "Cambiar a pertencia dun usuario a un grupo.", "apihelp-userrights-param-user": "Nome de usuario.", "apihelp-userrights-param-userid": "ID de usuario.", "apihelp-userrights-param-add": "Engadir o usuario a estes grupos, ou se xa é membro, actualizar a caducidade da súa afiliación.", + "apihelp-userrights-param-expiry": "Marcas de tempo de caducidade. Poden ser relativas (por exemplo, 5 meses ou 2 semanas) ou absolutas (por exemplo, 2014-09-18T12:34:56Z). Se só se fixa unha marca de tempo, utilizarase para tódolos grupos que se pasen ó parámetro $1add. Use infinite, indefinite, infinity, ou never para que a pertenza ó grupo non teña data de caducidade.", "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.", "apihelp-userrights-param-reason": "Motivo para o cambio.", "apihelp-userrights-param-tags": "Cambia as etiquetas a aplicar á entrada do rexistro de dereitos de usuario.", "apihelp-userrights-example-user": "Engadir o usuario FooBot ó grupo bot, e eliminar dos grupos sysop e bureaucrat.", "apihelp-userrights-example-userid": "Engadir ó usuario con ID 123 ó grupo bot, e borralo dos grupos sysop e burócrata.", "apihelp-userrights-example-expiry": "Engadir o usuario SometimeSysop ó grupo sysop por 1 mes.", - "apihelp-validatepassword-description": "Valida un contrasinal contra as políticas de contrasinais da wiki.\n\nA validez é Good se o contrasinal é aceptable, Change se o contrasinal pode usarse para iniciar sesión pero debe cambiarse ou Invalid se o contrasinal non se pode usar.", + "apihelp-validatepassword-summary": "Valida un contrasinal contra as políticas de contrasinais da wiki.", + "apihelp-validatepassword-extended-description": "A validez é Good se o contrasinal é aceptable, Change se o contrasinal pode usarse para iniciar sesión pero debe cambiarse ou Invalid se o contrasinal non se pode usar.", "apihelp-validatepassword-param-password": "Contrasinal a validar.", "apihelp-validatepassword-param-user": "Nome de usuario, para probas de creación de contas. O usuario nomeado non debe existir.", "apihelp-validatepassword-param-email": "Enderezo de correo electrónico, para probas de creación de contas.", "apihelp-validatepassword-param-realname": "Nome real, para probas de creación de contas.", "apihelp-validatepassword-example-1": "Validar o contrasinal foobar para o usuario actual.", "apihelp-validatepassword-example-2": "Validar o contrasinal qwerty para a creación do usuario Example.", - "apihelp-watch-description": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.", + "apihelp-watch-summary": "Engadir ou borrar páxinas da lista de vixiancia do usuario actual.", "apihelp-watch-param-title": "Páxina a vixiar/deixar de vixiar. Usar no canto $1titles.", "apihelp-watch-param-unwatch": "Se está definido, a páxina deixará de estar vixiada en vez de vixiada.", "apihelp-watch-example-watch": "Vixiar a páxina Main Page.", @@ -1365,25 +1395,26 @@ "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal", "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.", "apihelp-format-param-wrappedhtml": "Devolver o HTML formatado e os módulos ResourceLoader asociados como un obxecto JSON.", - "apihelp-json-description": "Datos de saída en formato JSON.", + "apihelp-json-summary": "Datos de saída en formato JSON.", "apihelp-json-param-callback": "Se está especificado, inclúe a saída na chamada da función indicada. Para maior seguridade, todos os datos específicos do usuario serán restrinxidos.", "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais. Por defecto cando formatversion non é 1.", "apihelp-json-param-ascii": "Se está indicado, codifica todos os caracteres que non sexan ASCII usando secuencias de escape hexadecimais. Por defecto cando formatversion é 1.", "apihelp-json-param-formatversion": "Formato de saída:\n;1:Formato compatible con versións anteriores(booleanos estilo XML,claves * para nodos, etc.).\n;2:Formato moderno experimental. Os detalles poden cambiar!\n;latest:Usa o último formato (actualmente kbd>2
    ), pode cambiar sen aviso previo.", - "apihelp-jsonfm-description": "Datos de saída en formato JSON(impresión en HTML).", - "apihelp-none-description": "Ningunha saída.", - "apihelp-php-description": "Datos de saída en formato serializado de PHP.", + "apihelp-jsonfm-summary": "Datos de saída en formato JSON(impresión en HTML).", + "apihelp-none-summary": "Ningunha saída.", + "apihelp-php-summary": "Datos de saída en formato serializado de PHP.", "apihelp-php-param-formatversion": "Formato de saída:\n;1:Formato compatible con versións anteriores(booleanos estilo XML,claves * para nodos, etc.).\n;2:Formato moderno experimental. Os detalles poden cambiar!\n;latest:Usa o último formato (actualmente kbd>2
    ), pode cambiar sen aviso previo.", - "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).", - "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).", - "apihelp-xml-description": "Datos de saída en formato XML.", + "apihelp-phpfm-summary": "Datos de saída en formato serializado de PHP(impresión en HTML).", + "apihelp-rawfm-summary": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).", + "apihelp-xml-summary": "Datos de saída en formato XML.", "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:MediaWiki}} rematando con .xsl.", "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.", - "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).", + "apihelp-xmlfm-summary": "Datos de saída en formato XML(impresión en HTML).", "api-format-title": "Resultado de API de MediaWiki", - "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro format para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe format=$2.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.", - "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.", + "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro format para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe format=$2.\n\n\nRevise a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.", + "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.", "api-format-prettyprint-status": "Esta resposta será devolta co estado de HTTP $1 $2.", + "api-login-fail-badsessionprovider": "Non é posible conectarse usando $1.", "api-pageset-param-titles": "Lista de títulos nos que traballar.", "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.", "api-pageset-param-revids": "Unha lista de IDs de modificacións sobre as que traballar.", @@ -1394,6 +1425,7 @@ "api-help-title": "Axuda da API de MediaWiki", "api-help-lead": "Esta é unha páxina de documentación da API de MediaWiki xerada automaticamente.\n\nDocumentación e exemplos:\nhttps://www.mediawiki.org/wiki/API", "api-help-main-header": "Módulo principal", + "api-help-undocumented-module": "Non existe documentación para o móduloː $1", "api-help-flag-deprecated": "Este módulo está obsoleto.", "api-help-flag-internal": "Este módulo é interno ou inestable. O seu funcionamento pode cambiar sen aviso previo.", "api-help-flag-readrights": "Este módulo precisa permisos de lectura.", @@ -1430,8 +1462,8 @@ "api-help-param-default-empty": "Por defecto: (baleiro)", "api-help-param-token": "Un identificador \"$1\" recuperado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Por compatibilidade, o identificador usado na web UI tamén é aceptado.", - "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Manual:$wgMiserMode|modo minimal]].", - "api-help-param-limited-in-miser-mode": "Nota: Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de $1limit resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.", + "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]].", + "api-help-param-limited-in-miser-mode": "Nota: Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de $1limit resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.", "api-help-param-direction": "En que dirección enumerar:\n;newer:Lista os máis antigos primeiro. Nota: $1start ten que estar antes que $1end.\n;older:Lista os máis novos primeiro (por defecto). Nota: $1start ten que estar despois que $1end.", "api-help-param-continue": "Cando estean dispoñibles máis resultados, use isto para continuar.", "api-help-param-no-description": "(sen descrición)", @@ -1477,6 +1509,7 @@ "apierror-badurl": "Valor \"$2\" non válido para o parámetro de URL $1.", "apierror-baduser": "Valor \"$2\" non válido para o parámetro de usuario $1.", "apierror-badvalue-notmultivalue": "O separador multivalor U+001F só pode utilizarse en parámetros multivalorados.", + "apierror-bad-watchlist-token": "Identificador de lista de vixilancia proporcionado incorrecto. Por favor, obteña un identificador correcto en [[Special:Preferences]].", "apierror-blockedfrommail": "Foi bloqueado para o envío de correos electrónicos.", "apierror-blocked": "Foi bloqueado fronte á edición.", "apierror-botsnotsupported": "Esta interface non está dispoñible para bots.", @@ -1494,7 +1527,6 @@ "apierror-changeauth-norequest": "Erro ó crear a petición de modificación.", "apierror-chunk-too-small": "O tamaño mínimo dun segmento é de $1 {{PLURAL:$1|byte|bytes}} para os segmentos non finais.", "apierror-cidrtoobroad": "Os rangos CIDR $1 maiores que /$2 non son aceptados.", - "apierror-compare-inputneeded": "É necesario un título, un ID de páxina ou un número de revisión para os parámetros from e to.", "apierror-contentserializationexception": "Erro de serialización do contidoː $1", "apierror-contenttoobig": "O contido que achegou excede o límite de tamaño dun artigo, que é de {{PLURAL:$1|kilobyte|kilobytes}}.", "apierror-copyuploadbaddomain": "As subas por URL non están permitidas para este dominio.", @@ -1573,6 +1605,8 @@ "apierror-nosuchuserid": "Non hai ningún usuario con identificador $1.", "apierror-notarget": "Non indicou un destino válido para esta acción.", "apierror-notpatrollable": "A revisión r$1 non pode patrullarse por ser demasiado antiga.", + "apierror-nouploadmodule": "Non se definiu un módulo de carga.", + "apierror-offline": "Non se pode continuar debido a problemas de conectividade da rede. Asegúrese de que ten unha conexión activa a internet e inténteo de novo.", "apierror-opensearch-json-warnings": "Non se poden representar os avisos en formato JSON de OpenSearch.", "apierror-pagecannotexist": "O espazo de nomes non permite as páxinas actuais.", "apierror-pagedeleted": "A páxina foi borrada dende que obtivo o selo de tempo.", @@ -1593,6 +1627,12 @@ "apierror-readapidenied": "Necesita permiso de lectura para utilizar ese módulo.", "apierror-readonly": "A wiki está actualmente en modo de só lectura.", "apierror-reauthenticate": "Non se autentificou recentemente nesta sesión. Por favor, volva a autentificarse.", + "apierror-revdel-mutuallyexclusive": "Non se pode usar o mesmo campo en hide e show.", + "apierror-revdel-needtarget": "É necesario un título obxectivo para este tipo RevDel.", + "apierror-revdel-paramneeded": "Requírese polo menos un valor para hide e/ou show.", + "apierror-revisions-badid": "Non se atoparon modificacións para o parámetro $1.", + "apierror-revisions-norevids": "O parámetro revids non se pode utilizar xunto coas opción de lista ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end).", + "apierror-revisions-singlepage": "Utilizouse titles, pageids ou un xerador para proporcionar múltiples páxinas, pero os parámetros $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end só poden utilizarse nunha soa páxina.", "apierror-revwrongpage": "r$1 non é unha revisión de $2.", "apierror-searchdisabled": "A busca $1 está desactivada.", "apierror-sectionreplacefailed": "Non se puido combinar a sección actualizada.", @@ -1603,36 +1643,67 @@ "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.", "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: $1.", "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.", + "apierror-stashedfilenotfound": "Non se puido atopar o ficheiro na reserva: $1.", + "apierror-stashfailed-complete": "A suba por partes completouse, revise o estado para obter máis detalles.", + "apierror-stashfailed-nosession": "Non hai sesión de suba por partes con esa clave.", + "apierror-stashfilestorage": "Non se puido almacenar a suba na reservaː $1", "apierror-stashinvalidfile": "Ficheiro de reserva incorrecto.", + "apierror-stashnosuchfilekey": "A chave de ficheiro non existe: $1.", "apierror-stashpathinvalid": "Clave de ficheiro con formato incorrecto ou non válidaː $1.", "apierror-stashwrongowner": "Erro de propietarioː $1", "apierror-stashzerolength": "Ficheiro de lonxitude cero, non pode ser almacenado na reservaː $1.", "apierror-systemblocked": "Foi bloqueado automaticamente polo software MediaWiki.", + "apierror-templateexpansion-notwikitext": "A expansión de modelos só é compatible co contido en wikitexto. $1 usa o modelo de contido $2.", + "apierror-timeout": "O servidor non respondeu no tempo esperado.", + "apierror-unknownaction": "A acción especificada, $1, non está recoñecida.", "apierror-unknownerror-editpage": "Erro descoñecido EditPageː $1.", "apierror-unknownerror-nocode": "Erro descoñecido.", "apierror-unknownerror": "Erro descoñecido: \"$1\".", "apierror-unknownformat": "Formato descoñecido \"$1\".", "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro non recoñecido|Parámetros non recoñecidos}}: $1.", "apierror-unrecognizedvalue": "Valor non recoñecido para o parámetro $1: $2.", + "apierror-unsupportedrepo": "O repositorio local de ficheiros non permite consultar tódalas imaxes.", + "apierror-upload-filekeyneeded": "Debe proporcionar un filekey cando offset é distinto de cero.", + "apierror-upload-filekeynotallowed": "Non pode proporcionar filekey cando offset é 0.", + "apierror-upload-inprogress": "A suba dende a reserva está en progreso.", + "apierror-upload-missingresult": "Non hai resultado nos datos de estado.", "apierror-urlparamnormal": "Non se puideron normalizar os parámetros de imaxe de $1.", "apierror-writeapidenied": "Non ten permiso para editar este wiki a través da API.", "apiwarn-alldeletedrevisions-performance": "Para ter un mellor rendemento á hora de xerar títulos, estableza $1dir=newer.", "apiwarn-badurlparam": "Non se puido analizar $1urlparam para $2. Só se usará a anchura e a altura.", + "apiwarn-badutf8": "O valor pasado para $1 contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs quedou obsoleto. No seu lugar, utilice prop=deletedrevisions ou list=alldeletedrevisions.", + "apiwarn-deprecation-expandtemplates-prop": "Como non se especificou ningún valor para o parámetro prop, utilizouse un formato herdado para a saída. Este formato está en desuso e, no futuro, o parámetro prop terá un valor predeterminado, de forma que sempre se utilizará o formato novo.", "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.", + "apiwarn-deprecation-login-botpw": "O inicio de sesión coa conta principal mediante action=login está en desuso e pode deixar de funcionar sen aviso previo. Para proseguir o inicio de sesión mediante action=login, consulte [[Special:BotPasswords]]. Para proseguir o inicio de sesión coa conta principal de forma segura, consulte action=clientlogin.", + "apiwarn-deprecation-login-nobotpw": "O inicio de sesión coa conta principal mediante action=login está en desuso e pode deixar de funcionar sen aviso previo. Para iniciar sesión de forma segura, consulte action=clientlogin.", "apiwarn-deprecation-parameter": "O parámetro $1 está obsoleto.", + "apiwarn-deprecation-parse-headitems": "prop=headitems está en desuso desde MediaWiki 1.28. Use prop=headhtml cando cree novos documentos HTML, ou prop=módulos|jsconfigvars cando actualice un documento no lado do cliente.", + "apiwarn-deprecation-purge-get": "O uso de action=purge mediante GET está obsoleto. Use POST no seu lugar.", + "apiwarn-deprecation-withreplacement": "$1 está obsoleto. No seu lugar, utilice $2.", + "apiwarn-difftohidden": "Imposible facer un diff con r$1: o contido está oculto.", "apiwarn-invalidcategory": "\"$1\" non é unha categoría.", "apiwarn-invalidtitle": "\"$1\" non é un título válido.", + "apiwarn-invalidxmlstylesheetext": "As follas de estilo deben ter a extensión .xsl.", + "apiwarn-invalidxmlstylesheet": "A folla de estilos especificada non é válida ou non existe.", + "apiwarn-invalidxmlstylesheetns": "A folla de estilos debería estar no espazo de nomes {{ns:MediaWiki}}.", + "apiwarn-moduleswithoutvars": "A propiedade modules está definida, pero non o está jsconfigvars nin encodedjsconfigvars. As variables de configuración son necesarias para o correcto uso do módulo.", "apiwarn-notfile": "\"$1\" non é un ficheiro.", "apiwarn-parse-nocontentmodel": "Non se proporcionou title nin contentmodel, asúmese $1.", "apiwarn-tokennotallowed": "A acción \"$1\" non está permitida para o usuario actual.", "apiwarn-toomanyvalues": "Demasiados valores para o parámetro $1. O límite é $2.", "apiwarn-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.", + "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor non recoñecido|Valores non recoñecidos}} para o parámetro $1: $2.", + "apiwarn-unsupportedarray": "O parámetro $1 usa unha sintaxe PHP de matriz que non está soportada.", + "apiwarn-validationfailed-badchars": "caracteres non válidos na clave (só se admiten os caracteres a-z, A-Z, 0-9, _ e -).", "apiwarn-validationfailed-badpref": "non é unha preferencia válida.", "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.", + "apiwarn-validationfailed-keytoolong": "clave demasiado longa (non pode ter máis de $1 bytes).", "apiwarn-validationfailed": "Erro de validación de $1: $2", "apiwarn-wgDebugAPI": "Aviso de seguridade: $wgDebugAPI está habilitado.", "api-feed-error-title": "Erro ($1)", "api-usage-docref": "Consulte $1 para ver o uso da API.", + "api-usage-mailinglist-ref": "Subscribirse á lista de correo mediawiki-api-announce en <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> para obter avisos de obsolescencia da API ou de modificacións importantes.", "api-exception-trace": "$1 en $2($3)\n$4", "api-credits-header": "Créditos", "api-credits": "Desenvolvedores da API:\n* Roan Kattouw (desenvolvedor principal, set. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador e desenvolvedor principal, set. 2006-sep. 2007)\n* Brad Jorsch (desenvolvedor principal, 2013-actualidade)\n\nEnvía comentarios, suxerencias e preguntas a mediawiki-api@lists.wikimedia.org\nou informa dun erro en https://phabricator.wikimedia.org/." diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index f10334a226..aa06dcfa60 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -9,18 +9,19 @@ "ערן", "LaG roiL", "Elyashiv", - "Umherirrender", "Macofe", "MojoMann", "Mikey641", "Esh77", - "שמזן" + "שמזן", + "Or", + "Umherirrender" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|תיעוד]]\n* [[mw:API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n
    \nמצב: כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\nבקשות שגויות: כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\nבדיקה: לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|תיעוד]]\n* [[mw:Special:MyLanguage/API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n
    \nמצב: כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\nבקשות שגויות: כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:Special:MyLanguage/API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\nבדיקה: לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].", "apihelp-main-param-action": "איזו פעולה לבצע.", "apihelp-main-param-format": "תסדיר הפלט.", - "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה maxlag מוחזר עם הודעה כמו Waiting for $host: $lag seconds lagged.
    ר' [[mw:Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.", + "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה maxlag מוחזר עם הודעה כמו Waiting for $host: $lag seconds lagged.
    ר' [[mw:Special:MyLanguage/Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.", "apihelp-main-param-smaxage": "הגדרת כותרת בקרת מטמון HTTP‏ s-maxage למספר כזה של שניות.", "apihelp-main-param-maxage": "הגדרת כותרת בקרת מטמון HTTP‏ max-age למספר כזה של שניות.", "apihelp-main-param-assert": "לוודא שהמשתמש נכנס אם זה מוגדר ל־user, או שיש לו הרשאת בוט אם זה bot.", @@ -34,7 +35,7 @@ "apihelp-main-param-errorformat": "תסדיר לשימוש בפלט טקסט אזהרות ושגיאות.\n; plaintext: קוד ויקי ללא תגי HTML ועם ישויות מוחלפות.\n; wikitext: קוד ויקי לא מפוענח.\n; html: קוד HTML.\n; raw: מפתח הודעה ופרמטרים.\n; none: ללא פלט טקסט, רק הודעות השגיאה.\n; bc: התסדיר ששימש לפני מדיה־ויקי 1.29. התעלמות מ־errorlang ו־ errorsuselocal.", "apihelp-main-param-errorlang": "השפה שתשמש לאזהרות לשגיאות [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] עם siprop=languages תחזיר רשימת קודי שפה, ואפשר גם לציין content כדי להשתמש בשפת התוכן של הוויקי הזה, או לציין uselang עם אותו הערך הפרמטר uselang.", "apihelp-main-param-errorsuselocal": "אם ניתן, הטקסטים של השגיאות ישתמשו בהודעות מותאמות מקומית ממרחב השם {{ns:MediaWiki}}.", - "apihelp-block-description": "חסימת משתמש.", + "apihelp-block-summary": "חסימת משתמש.", "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח כתובות IP שברצונך לחסום. אי־אפשר להשתמש בזה יחד עם $1userid", "apihelp-block-param-userid": "מזהה המשתמש לחסימה. לא יכול לשמש יחד עם $1user.", "apihelp-block-param-expiry": "זמן תפוגה. יכול להיות יחסי (למשל 5 months או 2 weeks) או מוחלט (למשל 2014-09-18T12:34:56Z). אם זה מוגדר ל־infinite‏, indefinite, או never, החסימה לא תפוג לעולם.", @@ -44,33 +45,53 @@ "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.", "apihelp-block-param-noemail": "למנוע ממשתמש לשלוח דואר אלקטרוני דרך הוויקי. (דורש את ההרשאה blockemail).", "apihelp-block-param-hidename": "הסרת השם מיומן החסימות. (דורש את ההרשאה hideuser.)", - "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.", "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.", "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.", "apihelp-block-example-ip-simple": "חסימת כתובת ה־IP‏ 192.0.2.5 לשלושה ימים עם הסיבה First strike.", "apihelp-block-example-user-complex": "חסימת המשתמש Vandal ללא הגבלת זמן עם הסיבה Vandalism, ומניעת יצירת חשבונות חדשים ושליחת דוא\"ל.", - "apihelp-changeauthenticationdata-description": "שינוי נתוני אימות עבור המשתמש הנוכחי.", + "apihelp-changeauthenticationdata-summary": "שינוי נתוני אימות עבור המשתמש הנוכחי.", "apihelp-changeauthenticationdata-example-password": "ניסיון לשנות את הססמה של המשתמש הנוכחי ל־ExamplePassword.", - "apihelp-checktoken-description": "בדיקת התקינות של האסימון מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "בדיקת התקינות של האסימון מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "סוג האסימון שבבדיקה.", "apihelp-checktoken-param-token": "איזה אסימון לבדוק.", "apihelp-checktoken-param-maxtokenage": "הגיל המרבי המותר של האסימון, בשניות.", "apihelp-checktoken-example-simple": "בדיקת התקינות של אסימון csrf.", - "apihelp-clearhasmsg-description": "מנקה את דגל hasmsg עבור המשתמש הנוכחי.", + "apihelp-clearhasmsg-summary": "מנקה את דגל hasmsg עבור המשתמש הנוכחי.", "apihelp-clearhasmsg-example-1": "לנקות את דגל hasmsg עבור המשתמש הנוכחי.", - "apihelp-clientlogin-description": "כניסה לוויקי באמצעות זרימה הידודית.", + "apihelp-clientlogin-summary": "כניסה לוויקי באמצעות זרימה הידודית.", "apihelp-clientlogin-example-login": "תחילת תהליך כניסה לוויקי בתור משתמש Example עם הססמה ExamplePassword.", "apihelp-clientlogin-example-login2": "המשך כניסה אחרי תשובת UI לאימות דו־גורמי, עם OATHToken של 987654.", - "apihelp-compare-description": "קבלת ההבדל בין 2 דפים.\n\nיש להעביר מספר גרסה, כותרת דף או מזהה דף גם ל־\"from\" וגם ל־\"to\".", + "apihelp-compare-summary": "קבלת ההבדל בין 2 דפים.", + "apihelp-compare-extended-description": "יש להעביר מספר גרסה, כותרת דף או מזהה דף גם ל־\"from\" וגם ל־\"to\".", "apihelp-compare-param-fromtitle": "כותרת ראשונה להשוואה.", - "apihelp-compare-param-fromid": "מס׳ זיהוי של העמוד הראשון להשוואה.", + "apihelp-compare-param-fromid": "מס׳ זיהוי של הדף הראשון להשוואה.", "apihelp-compare-param-fromrev": "גרסה ראשונה להשוואה.", + "apihelp-compare-param-fromtext": "להשתמש בטקסט הזה במקום תוכן הגרסה שהוגדרה על־ידי fromtitle, fromid או fromrev.", + "apihelp-compare-param-frompst": "לעשות התמרה לפני שמירה ב־fromtext.", + "apihelp-compare-param-fromcontentmodel": "מודל התוכן של fromtext. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.", + "apihelp-compare-param-fromcontentformat": "תסדיר הסדרת תוכן של fromtext.", "apihelp-compare-param-totitle": "כותרת שנייה להשוואה.", - "apihelp-compare-param-toid": "מס׳ מזהה של העמוד השני להשוואה.", + "apihelp-compare-param-toid": "מס׳ מזהה של הדף השני להשוואה.", "apihelp-compare-param-torev": "גרסה שנייה להשוואה.", + "apihelp-compare-param-torelative": "להשתמש בגרסה יחסית לגרסה שהוסקה מfromtitle, fromid או fromrev. לכל אפשריות ה־\"to\" האחרות לא תהיה השפעה.", + "apihelp-compare-param-totext": "להשתמש בטקסט הזה במקום התוכן של הגרסה שהוגדר ב־totitle, toid or torev.", + "apihelp-compare-param-topst": "לעשות התמרה לפני שמירה ב־totext.", + "apihelp-compare-param-tocontentmodel": "מודל התוכן של totext. אם זה לא סופק, ייעשה ניחוש על סמך פרמטרים אחרים.", + "apihelp-compare-param-tocontentformat": "תסדיר הסדרת תוכן של fromtext.", + "apihelp-compare-param-prop": "אילו פריטי מידע לקבל.", + "apihelp-compare-paramvalue-prop-diff": "ה־HTML של ההשוואה.", + "apihelp-compare-paramvalue-prop-diffsize": "גודל ה־HTML של ההשוואה, בבתים.", + "apihelp-compare-paramvalue-prop-rel": "מזהי הגרסאות של הגרסאות לפני \"from\" ואחרי \"to\", אם יש כאלה.", + "apihelp-compare-paramvalue-prop-ids": "מזהי הדף והגרסה של גרסאות ה־\"from\" וה־\"to\".", + "apihelp-compare-paramvalue-prop-title": "כותרות הדפים של גרסאות ה־\"from\" וה־\"to\".", + "apihelp-compare-paramvalue-prop-user": "השם והמזהה של המשתמש של גרסאות ה־\"from\" וה־\"to\".", + "apihelp-compare-paramvalue-prop-comment": "התקציר על גרסאות ה־\"from\" וה־\"to\".", + "apihelp-compare-paramvalue-prop-parsedcomment": "התקציר המפוענח על גרסאות ה־\"from\" וה־\"to\".", + "apihelp-compare-paramvalue-prop-size": "הגודל של גרסאות ה־\"from\" וה־\"to\".", "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.", - "apihelp-createaccount-description": "יצירת חשבון משתמש חדש.", + "apihelp-createaccount-summary": "יצירת חשבון משתמש חדש.", "apihelp-createaccount-param-preservestate": "אם [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] החזיר true עבור hasprimarypreservedstate, בקשות שמסומנות בתור primary-required אמורות להיות מושמטות. אם מוחזר ערך לא ריק ל־preservedusername, שם המשתמש הזה ישמש לפרמטר username.", "apihelp-createaccount-example-create": "תחילת תהליך יצירת המשתמש Example עם הססמה ExamplePassword.", "apihelp-createaccount-param-name": "שם משתמש.", @@ -84,22 +105,22 @@ "apihelp-createaccount-param-language": "קוד השפה שיוגדר כבררת המחדל למשתמש (רשות, בררת המחדל היא שפת התוכן).", "apihelp-createaccount-example-pass": "יצירת המשתמש testuser עם הססמה test123.", "apihelp-createaccount-example-mail": "יצירת המשתמש testmailuser ושליחת ססמה שיוצרה אקראית בדוא״ל.", - "apihelp-cspreport-description": "משמש דפדפנים לדיווח הפרות של מדיניות אבטחת תוכן. המודול הזה לעולם לא ישמש אלא אם הוא משמש עם דפדפן תומך CSP.", + "apihelp-cspreport-summary": "משמש דפדפנים לדיווח הפרות של מדיניות אבטחת תוכן. המודול הזה לעולם לא ישמש אלא אם הוא משמש עם דפדפן תומך CSP.", "apihelp-cspreport-param-reportonly": "לסמן בתור דיווח ממדיניות מנטרת, לא מדיניות כפויה", "apihelp-cspreport-param-source": "מה ייצר את כותרת ה־CSP שייצרה את הדו״ח הזה", - "apihelp-delete-description": "מחיקת דף.", - "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם $1pageid.", - "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם $1title.", + "apihelp-delete-summary": "מחיקת דף.", + "apihelp-delete-param-title": "כותרת הדף למחיקה. לא ניתן להשתמש בשילוב עם $1pageid.", + "apihelp-delete-param-pageid": "מס׳ הזיהוי של הדף למחיקה. לא ניתן להשתמש בשילוב עם $1title.", "apihelp-delete-param-reason": "סיבת המחיקה. אם לא הוגדרה, תתווסף סיבה שנוצרה אוטומטית.", "apihelp-delete-param-tags": "תגי שינוי שיחולו על העיול ביומן המחיקה.", - "apihelp-delete-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.", + "apihelp-delete-param-watch": "הוספת הדף לרשימת המעקב של המשתמש הנוכחי.", "apihelp-delete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.", "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.", "apihelp-delete-param-oldimage": "שם התמונה הישנה למחיקה כפי שסופק ל־[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "מחיקת Main Page.", "apihelp-delete-example-reason": "מחיקת Main Page. סיבה: Preparing for move.", - "apihelp-disabled-description": "היחידה הזאת כובתה.", - "apihelp-edit-description": "יצירה ועריכה של דפים.", + "apihelp-disabled-summary": "היחידה הזאת כובתה.", + "apihelp-edit-summary": "יצירה ועריכה של דפים.", "apihelp-edit-param-title": "שם הדף לעריכה. לא לשימוש עם $1pageid.", "apihelp-edit-param-pageid": "מזהה הדף לעריכה. לא לשימוש עם $1title.", "apihelp-edit-param-section": "מספר הפסקה 0 לפסקה העליונה, new לפסקה חדשה.", @@ -115,7 +136,7 @@ "apihelp-edit-param-recreate": "לעקוב את כל הטעויות על כך שהדף נמחק בינתיים.", "apihelp-edit-param-createonly": "לא לערוך את הדף אם הוא כבר קיים.", "apihelp-edit-param-nocreate": "לזרוק שגיאה אם הדף אינו קיים.", - "apihelp-edit-param-watch": "הוספת העמוד לרשימת המעקב של המשתמש הנוכחי.", + "apihelp-edit-param-watch": "הוספת הדף לרשימת המעקב של המשתמש הנוכחי.", "apihelp-edit-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.", "apihelp-edit-param-watchlist": "להוסיף את הדף לרשימת המעקב של המשתמש הנוכחי או להסיר אותו משם, להשתמש בהעדפות, או לא לשנות את מצב המעקב.", "apihelp-edit-param-md5": "גיבוב MD5 של הפרמטר $1text או צירוף של הפטמטרים $1prependtext ו־$1appendtext. אם זה מוגדר, העריכה לא תיעשה אלא אם כן הגיבוב נכון.", @@ -128,15 +149,15 @@ "apihelp-edit-param-contentmodel": "מודל התוכן של התוכן החדש.", "apihelp-edit-param-token": "האסימון תמיד צריך להישלח בתור הפרמטר האחרון, או לפחות אחרי הפרמטר $1text parameter.", "apihelp-edit-example-edit": "עריכת דף", - "apihelp-edit-example-prepend": "הוספת __NOTOC__ לתחילת העמוד.", + "apihelp-edit-example-prepend": "הוספת __NOTOC__ לתחילת הדף.", "apihelp-edit-example-undo": "ביטול גרסאות מ־13579 עד 13585 עם תקציר אוטומטי.", - "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.", + "apihelp-emailuser-summary": "שליחת דוא\"ל למשתמש.", "apihelp-emailuser-param-target": "לאיזה משתמש לשלוח דוא\"ל.", "apihelp-emailuser-param-subject": "כותרת נושא.", "apihelp-emailuser-param-text": "גוף הדואר.", "apihelp-emailuser-param-ccme": "שליחת עותק של הדואר הזה אליי.", "apihelp-emailuser-example-email": "שליחת דוא\"ל למשתמש WikiSysop עם הטקסט Content.", - "apihelp-expandtemplates-description": "הרחבת כל התבניות בתוך קוד הוויקי.", + "apihelp-expandtemplates-summary": "הרחבת כל התבניות בתוך קוד הוויקי.", "apihelp-expandtemplates-param-title": "כותרת הדף.", "apihelp-expandtemplates-param-text": "איזה קוד ויקי להמיר.", "apihelp-expandtemplates-param-revid": "מזהה גרסה, עבור {{REVISIONID}} ומשתנים דומים.", @@ -144,7 +165,7 @@ "apihelp-expandtemplates-paramvalue-prop-wikitext": "קוד הוויקי המורחב.", "apihelp-expandtemplates-paramvalue-prop-categories": "קטגוריות כלשהן שקיימות בקלט ואינן מיוצגות בפלט הוויקיטקסט.", "apihelp-expandtemplates-paramvalue-prop-properties": "מאפייני דף המוגדרים במילות קסם מורחבות בקוד ויקי.", - "apihelp-expandtemplates-paramvalue-prop-volatile": "האם הפלט הוא נדיף ואין להשתמש בו במקום אחר בעמוד.", + "apihelp-expandtemplates-paramvalue-prop-volatile": "האם הפלט הוא נדיף ולא מיועד לשימוש במקום אחר בדף.", "apihelp-expandtemplates-paramvalue-prop-ttl": "הזמן המרבי שאחריו המטמונים של התוצאה צריכים לפוג.", "apihelp-expandtemplates-paramvalue-prop-modules": "כל יחידות ה־ResourceLoader שפונקציות מפענח ביקשו לוסיף לפלט. יש לבקש את jsconfigvars או את encodedjsconfigvars יחד עם modules.", "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה.", @@ -153,7 +174,7 @@ "apihelp-expandtemplates-param-includecomments": "האם לכלול הערות HTML בפלט.", "apihelp-expandtemplates-param-generatexml": "יצירת עץ פענוח XML (מוחלף ב־$1prop=parsetree).", "apihelp-expandtemplates-example-simple": "להרחיב את קוד הוויקי {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "להחזיר הזנת תרומות משתמש.", + "apihelp-feedcontributions-summary": "להחזיר הזנת תרומות משתמש.", "apihelp-feedcontributions-param-feedformat": "תסדיר ההזנה.", "apihelp-feedcontributions-param-user": "לקבל תרומות של אילו משמשים.", "apihelp-feedcontributions-param-namespace": "לפי איזה מרחב שם לסנן את התרומות.", @@ -166,7 +187,7 @@ "apihelp-feedcontributions-param-hideminor": "להסתיר עריכות משניות.", "apihelp-feedcontributions-param-showsizediff": "להציג את ההבדל בגודל בין גרסאות.", "apihelp-feedcontributions-example-simple": "החזרת תרומות עבור המשתמש Example.", - "apihelp-feedrecentchanges-description": "להחזיר הזנת שינויים אחרונים.", + "apihelp-feedrecentchanges-summary": "להחזיר הזנת שינויים אחרונים.", "apihelp-feedrecentchanges-param-feedformat": "תסדיר ההזנה.", "apihelp-feedrecentchanges-param-namespace": "לאיזה מרחב שם להגביל את התוצאות.", "apihelp-feedrecentchanges-param-invert": "כל מרחבי השם למעט זה שנבחר.", @@ -188,18 +209,18 @@ "apihelp-feedrecentchanges-param-categories_any": "להציג רק שינויים בדפים בכל הקטגוריות במקום.", "apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.", "apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.", - "apihelp-feedwatchlist-description": "החזרת הזנת רשימת מעקב.", + "apihelp-feedwatchlist-summary": "החזרת הזנת רשימת מעקב.", "apihelp-feedwatchlist-param-feedformat": "תסדיר ההזנה.", "apihelp-feedwatchlist-param-hours": "רשימת דפים ששונו בתוך מספר כזה של שעות מעכשיו.", "apihelp-feedwatchlist-param-linktosections": "לקשר ישר לפסקאות ששונו אם אפשר.", "apihelp-feedwatchlist-example-default": "הצגת הזנת רשימת מעקב.", "apihelp-feedwatchlist-example-all6hrs": "להציג את כל השינויים בדפים שבמעקב ב־6 השעות האחרונות.", - "apihelp-filerevert-description": "לשחזר את הקובץ לגרסה ישנה יותר.", + "apihelp-filerevert-summary": "לשחזר את הקובץ לגרסה ישנה יותר.", "apihelp-filerevert-param-filename": "שם קובץ היעד, ללא התחילית File:.", "apihelp-filerevert-param-comment": "הערת העלאה.", "apihelp-filerevert-param-archivename": "שם הארכיון של הגרסה שאליה ישוחזר הקובץ.", "apihelp-filerevert-example-revert": "לשחזר את Wiki.png לגרסה מ־2011-03-05T15:27:40Z.", - "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.", + "apihelp-help-summary": "הצגת עזרה עבור היחידות שצוינו.", "apihelp-help-param-modules": "עזרה של אילו יחידות להציג (ערכים של הפרמטרים action ו־format, או main). אפשר להגדיר תת־יחידות עם +.", "apihelp-help-param-submodules": "לכלול עזרה לתת־יחידות ליחידה שצוינה.", "apihelp-help-param-recursivesubmodules": "לכלול עזרה לתת־יחידות באופן רקורסיבי.", @@ -211,12 +232,13 @@ "apihelp-help-example-recursive": "כל העזרה בדף אחד.", "apihelp-help-example-help": "עזרה ליחידת העזרה עצמה.", "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.", - "apihelp-imagerotate-description": "סיבוב של תמונה אחת או יותר.", + "apihelp-imagerotate-summary": "סיבוב של תמונה אחת או יותר.", "apihelp-imagerotate-param-rotation": "בכמה מעלות לסובב בכיוון השעון.", "apihelp-imagerotate-param-tags": "אילו תגים להחיל על העיול ביומן ההעלאות.", "apihelp-imagerotate-example-simple": "לסובב את File:Example.png ב־90 מעלות.", "apihelp-imagerotate-example-generator": "לסובב את כל התמונות ב־Category:Flip ב־180 מעלות.", - "apihelp-import-description": "לייבא דף מוויקי אחר או מקובץ XML.\n\nיש לשים לב לכך שפעולת HTTP POST צריכה להיעשות בתור העלאת קובץ (כלומר, עם multipart/form-data) בזמן שליחת קובץ לפרמטר xml.", + "apihelp-import-summary": "לייבא דף מוויקי אחר או מקובץ XML.", + "apihelp-import-extended-description": "יש לשים לב לכך שפעולת HTTP POST צריכה להיעשות בתור העלאת קובץ (כלומר, עם multipart/form-data) בזמן שליחת קובץ לפרמטר xml.", "apihelp-import-param-summary": "תקציר ייבוא עיולי יומן.", "apihelp-import-param-xml": "קובץ XML שהועלה.", "apihelp-import-param-interwikisource": "ליבוא בין אתרי ויקי: מאיזה ויקי לייבא.", @@ -227,19 +249,20 @@ "apihelp-import-param-rootpage": "לייבא בתור תת־משנה של הדף הזה. לא ניתן להשתמש בזה יחד עם $1namespace.", "apihelp-import-param-tags": "תגי שינוי שיחולו על העיול ביומן הייבוא ולגרסה הריקה בדפים המיובאים.", "apihelp-import-example-import": "לייבא את [[meta:Help:ParserFunctions]] למרחב השם 100 עם היסטוריה מלאה.", - "apihelp-linkaccount-description": "קישור חשבון של ספק צד־שלישי למשתמש הנוכחי.", + "apihelp-linkaccount-summary": "קישור חשבון של ספק צד־שלישי למשתמש הנוכחי.", "apihelp-linkaccount-example-link": "תחילת תהליך הקישור לחשבון מ־Example.", - "apihelp-login-description": "להיכנס ולקבל עוגיות אימות.\n\nהפעולה הזאת צריכה לשמש רק בשילוב [[Special:BotPasswords]]; שימוש לכניסה לחשבון ראשי מיושן ועשוי להיכשל ללא אזהרה. כדי להיכנס בבטחה לחשבון הראשי, יש להשתמש ב־[[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "להיכנס ולקבל עוגיות אימות.\n\nהפעולה הזאת מיושנת ועשויה להיכשל ללא אזהרה. כדי להיכנס בבטחה, יש להשתמש ב־[[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "להיכנס ולקבל עוגיות אימות.", + "apihelp-login-extended-description": "הפעולה הזאת צריכה לשמש רק בשילוב [[Special:BotPasswords]]; שימוש לכניסה לחשבון ראשי מיושן ועשוי להיכשל ללא אזהרה. כדי להיכנס בבטחה לחשבון הראשי, יש להשתמש ב־[[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "הפעולה הזאת מיושנת ועשויה להיכשל ללא אזהרה. כדי להיכנס בבטחה, יש להשתמש ב־[[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "שם משתמש.", "apihelp-login-param-password": "ססמה.", "apihelp-login-param-domain": "שם מתחם (רשות).", "apihelp-login-param-token": "אסימון כניסה התקבל בבקשה הראשונה.", "apihelp-login-example-gettoken": "קבלת אסימון כניסה.", "apihelp-login-example-login": "כניסה.", - "apihelp-logout-description": "יציאה וניקוי של נתוני הפעילות.", + "apihelp-logout-summary": "יציאה וניקוי של נתוני הפעילות.", "apihelp-logout-example-logout": "הוצאת המשתמש הנוכחי.", - "apihelp-managetags-description": "ביצוע פעולות ניהוליות הקשורות בשינוי תגיות.", + "apihelp-managetags-summary": "ביצוע פעולות ניהוליות הקשורות בשינוי תגיות.", "apihelp-managetags-param-operation": "איזו פעולה לבצע:\n;create:יצירת תג שינוי חדש לשימוש ידני.\n;delete:הסרת תג שינוי ממסד הנתונים, כולל הסרת התג מכל הגרסאות, עיולי שינויים אחרונים ועיולי יומן שהוא משמש בהן.\n;activate:הפעלת תג שינוי, ואפשור למשתמש להחיל אותו ידנית.\n;deactivate:כיבוי תג שינוי, ומניעה ממשתמשים להחיל אותו ידנית.", "apihelp-managetags-param-tag": "תג ליצירה, מחיקה, הפעלה או כיבוי. ליצירת תג, התג לא צריך להיות קיים. למחיקת תג, התג צריך להיות קיים. להפעלת תג, התג צריך להתקיים ולא להיות בשימוש של הרחבה. לכיבוי תג, התג צריך להיות קיים ומוגדר ידנית.", "apihelp-managetags-param-reason": "סיבה אופציונלית ליצירה, מחיקה, הפעלה או כיבוי של תג.", @@ -249,7 +272,7 @@ "apihelp-managetags-example-delete": "מחיקת התג vandlaism עם הסיבה Misspelt", "apihelp-managetags-example-activate": "הפעלת התג spam עם הסיבה For use in edit patrolling", "apihelp-managetags-example-deactivate": "כיבוי התג spam עם הסיבה No longer required", - "apihelp-mergehistory-description": "מיזוג גרסאות של דפים.", + "apihelp-mergehistory-summary": "מיזוג גרסאות של דפים.", "apihelp-mergehistory-param-from": "כותרת הדף שההיסטוריה שלו תמוזג. לא ניתן להשתמש בזה יחד עם $1fromid.", "apihelp-mergehistory-param-fromid": "מזהה הדף שממנו תמוזג ההיסטוריה. לא ניתן להשתמש בזה יחד עם $1from.", "apihelp-mergehistory-param-to": "כותרת הדף שההיסטוריה תמוזג אליו. לא ניתן להשתמש בזה יחד עם $1toid.", @@ -258,7 +281,7 @@ "apihelp-mergehistory-param-reason": "סיבה למיזוג ההיסטוריה.", "apihelp-mergehistory-example-merge": "מיזוג כל ההיסטוריה של Oldpage אל Newpage.", "apihelp-mergehistory-example-merge-timestamp": "מיזוג גרסאות הדפים של Oldpage עד 2015-12-31T04:37:41Z אל Newpage.", - "apihelp-move-description": "העברת עמוד.", + "apihelp-move-summary": "העברת עמוד.", "apihelp-move-param-from": "שם הדף ששמו ישונה. לא יכול לשמש יחד עם $1fromid.", "apihelp-move-param-fromid": "מזהה הדף של הדף שצריך לשנות את שמו. לא יכול לשמש עם $1from.", "apihelp-move-param-to": "לאיזו כותרת לשנות את שם הדף.", @@ -272,16 +295,17 @@ "apihelp-move-param-ignorewarnings": "להתעלם מכל האזהרות.", "apihelp-move-param-tags": "תגי שינוי שיחולו על העיול ביומן ההעברות ולגרסה הריקה בדף היעד.", "apihelp-move-example-move": "העברת Badtitle ל־Goodtitle בלי להשאיר הפניה.", - "apihelp-opensearch-description": "חיפוש בוויקי בפרוטוקול OpenSearch.", + "apihelp-opensearch-summary": "חיפוש בוויקי בפרוטוקול OpenSearch.", "apihelp-opensearch-param-search": "מחרוזת לחיפוש.", "apihelp-opensearch-param-limit": "המספר המרבי של התוצאות שתוחזרנה.", "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.", - "apihelp-opensearch-param-suggest": "לא לעשות דבר אם [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] הוא false.", + "apihelp-opensearch-param-suggest": "לא לעשות דבר אם [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] הוא false.", "apihelp-opensearch-param-redirects": "איך לטפל בהפניות:\n;return:להחזיר את ההפניה עצמה.\n;resolve:להחזיר את דף היעד. יכול להחזיר פחות מ־$1limit תוצאות.\nמסיבות היסטוריות, בררת המחדל היא \"return\" עבור $1format=json ו־\"resolve\" עבור תסדירים אחרים.", "apihelp-opensearch-param-format": "תסדיר הפלט.", "apihelp-opensearch-param-warningsaserror": "אם אזהרות מוּעלות עם format=json, להחזיר שגיאת API במקום להתעלם מהן.", "apihelp-opensearch-example-te": "חיפוש דפים שמתחילים ב־Te.", - "apihelp-options-description": "שינוי העדפות של המשתמש הנוכחי.\n\nרק אפשרויות שמוגדרות בליבה או באחת מההרחבות המותקנות, או אפשרויות עם מפתחות עם התחילית \"userjs-\" (שמיועדות לשימוש תסריטי משתמשים) יכולות להיות מוגדרות.", + "apihelp-options-summary": "שינוי העדפות של המשתמש הנוכחי.", + "apihelp-options-extended-description": "רק אפשרויות שמוגדרות בליבה או באחת מההרחבות המותקנות, או אפשרויות עם מפתחות עם התחילית \"userjs-\" (שמיועדות לשימוש תסריטי משתמשים) יכולות להיות מוגדרות.", "apihelp-options-param-reset": "אתחול ההעדפות לבררות המחדל של האתר.", "apihelp-options-param-resetkinds": "רשימת סוגי אפשרויות לאתחל כאשר מוגדרת האפשרות $1reset.", "apihelp-options-param-change": "רשימת שינויים, בתסדיר name=value (למשל skin=vector). אם לא ניתן ערך, אפילו לא סימן שווה, למשל optionname|otheroption|...‎, האפשרות תאופס לערך בררת המחדל שלה. אם ערך מועבר כלשהו מכיל את תו המקל (|), יש להשתמש ב[[Special:ApiHelp/main#main/datatypes|מפריד ערכים מרובים חלופי]] בשביל פעולה נכונה.", @@ -290,7 +314,7 @@ "apihelp-options-example-reset": "אתחול כל ההעדפות.", "apihelp-options-example-change": "לשנות את ההעדפות skin ו־hideminor.", "apihelp-options-example-complex": "לאתחל את כל ההעדפות ואז להגדיר את skin ואת nickname.", - "apihelp-paraminfo-description": "קבלת מידע על יחידות של API.", + "apihelp-paraminfo-summary": "קבלת מידע על יחידות של API.", "apihelp-paraminfo-param-modules": "רשימה של שמות יחידות (ערכים של הפרמטרים action ו־format, או main). אפשר להגדיר תת־יחידות עם +, או כל התת־מודולים עם +*, או כל התת־מודולים באופן רקורסיבי עם +**.", "apihelp-paraminfo-param-helpformat": "תסדיר מחרוזות העזרה.", "apihelp-paraminfo-param-querymodules": "רשימת שמות יחידות query (ערך של הפרמטר prop‏, meta או list). יש להשתמש ב־$1modules=query+foo במקום $1querymodules=foo.", @@ -299,7 +323,8 @@ "apihelp-paraminfo-param-formatmodules": "רשימת שמות תסדירים (ערכים של הפרמטר format). יש להשתמש ב־$1modules במקום זה.", "apihelp-paraminfo-example-1": "הצגת מידע עבור [[Special:ApiHelp/parse|action=parse]]‏, [[Special:ApiHelp/jsonfm|format=jsonfm]]‏, [[Special:ApiHelp/query+allpages|action=query&list=allpages]]‏, ו־[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "הצגת מידע עבור כל התת־מודולים של [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "מפענח את התוכן ומחזיר פלט מפענח.\n\nר' את יחידת ה־prop השיונות של [[Special:ApiHelp/query|action=query]] כדי לקבל מידע על הגרסה הנוכחית של הדף.\n\nיש מספר דרכים לציין טקסט לפענוח:\n# ציון דף או גרסה באמצעות $1page‏, $1pageid, או $1oldid.\n# ציון התוכן במפורש, באמצעות $1text‏, $1title, ו־$1contentmodel.\n# ציון רק של התקציר לפענוח. ל־$1prop צריך לתת ערך ריק.", + "apihelp-parse-summary": "מפענח את התוכן ומחזיר פלט מפענח.", + "apihelp-parse-extended-description": "ר' את יחידת ה־prop השיונות של [[Special:ApiHelp/query|action=query]] כדי לקבל מידע על הגרסה הנוכחית של הדף.\n\nיש מספר דרכים לציין טקסט לפענוח:\n# ציון דף או גרסה באמצעות $1page‏, $1pageid, או $1oldid.\n# ציון התוכן במפורש, באמצעות $1text‏, $1title, ו־$1contentmodel.\n# ציון רק של התקציר לפענוח. ל־$1prop צריך לתת ערך ריק.", "apihelp-parse-param-title": "שם הדף שהטקסט שייך אליו. אם זה מושמט, יש לציין את $1contentmodel, ו־[[API]] ישמש ככותרת.", "apihelp-parse-param-text": "הטקסט לפענוח. יש להשתמש ב־$1title או ב־$1contentmodel.", "apihelp-parse-param-summary": "התקציר שצריך לפענח.", @@ -319,7 +344,7 @@ "apihelp-parse-paramvalue-prop-sections": "מתן הפסקאות בקוד הוויקי המפוענח.", "apihelp-parse-paramvalue-prop-revid": "הוספת מזהה הגרסה של הדף המפוענח.", "apihelp-parse-paramvalue-prop-displaytitle": "הוספת הכותרת של קוד הוויקי המפוענח.", - "apihelp-parse-paramvalue-prop-headitems": "לא בשימוש. נותן פריטים לשים ב־<head> של הדף.", + "apihelp-parse-paramvalue-prop-headitems": "נותן פריטים לשים ב־<head> של הדף.", "apihelp-parse-paramvalue-prop-headhtml": "נותן את ה־<head> המפוענח של הדף.", "apihelp-parse-paramvalue-prop-modules": "מתן יחידות ResourceLoader שמשמשות בדף. כדי לטעון, יש להשתמש בmw.loader.using(). יש לבקש את jsconfigvars או את encodedjsconfigvars יחד עם modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה. כדי להחיל, יש להשתמש בmw.config.set().", @@ -331,6 +356,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר $1disablelimitreport.", "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר $1disablelimitreport.", "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "נותן אזהרות שאירעו בזמן פענוח התוכן.", + "apihelp-parse-param-wrapoutputclass": "מחלקה של CSS שתשמש לעטיפת פלט המפענח.", "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.", "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם $1text.", "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם $1prop=langlinks).", @@ -344,19 +371,20 @@ "apihelp-parse-param-preview": "לפענח במצב תצוגה מקדימה.", "apihelp-parse-param-sectionpreview": "לפענח במצב תצוגה מקדימה של פסקה (מדליק גם את מצב תצוגה מקדימה).", "apihelp-parse-param-disabletoc": "להשמיט את תוכן העניינים בפלט.", + "apihelp-parse-param-useskin": "להחיל את העיצוב שנבחר לפלט המפענח. יכול להשפיע על המאפיינים הבאים: langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-param-contentformat": "תסדיר הסדרת תוכן שישמש לטקסט הקלט. תקף רק עם $1text.", "apihelp-parse-param-contentmodel": "מודל התוכן של טקסט הקלט. אם זה מושמט, יש לציין את $1title והערך ההתחלתי יהיה המודל של הכותרת שצוינה. תקין רק כאשר משמש עם $1text.", "apihelp-parse-example-page": "לפענח דף.", "apihelp-parse-example-text": "לפענח קוד ויקי.", "apihelp-parse-example-texttitle": "לפענח קוד, עם ציון כותרת דף.", "apihelp-parse-example-summary": "לפענח תקציר.", - "apihelp-patrol-description": "לנטר דף או גרסה.", + "apihelp-patrol-summary": "לנטר דף או גרסה.", "apihelp-patrol-param-rcid": "מזהה שינויים אחרונים לניטור.", "apihelp-patrol-param-revid": "מזהה גרסה לניטור.", "apihelp-patrol-param-tags": "תגי שינוי שיחולו על העיול ביומן הניטור.", "apihelp-patrol-example-rcid": "לנטר רשומה משינויים אחרונים.", "apihelp-patrol-example-revid": "לנטר גרסה.", - "apihelp-protect-description": "לשנות את רמת ההגנה של דף.", + "apihelp-protect-summary": "לשנות את רמת ההגנה של דף.", "apihelp-protect-param-title": "כותרת הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1pageid.", "apihelp-protect-param-pageid": "מזהה הדף להגנה או הסרת הגנה. לא ניתן להשתמש בזה יחד עם $1title.", "apihelp-protect-param-protections": "רשימת רמות הגנה, בתסדיר action=level (למשל edit=sysop). רמת all פירושה שכולם מורשים לבצע את הפעולה, כלומר אין הגנה.\n\nהערה: ההגבלות יוסרו מכל הפעולות שלא כתובות ברשימה.", @@ -369,12 +397,13 @@ "apihelp-protect-example-protect": "הגנה על דף.", "apihelp-protect-example-unprotect": "להסיר את ההגנה מהדף על־ידי הגדרת מגבלות על all (למשל: כולם מורשים לבצע את הפעולה).", "apihelp-protect-example-unprotect2": "הסרת הגנה מדף על־ידי הגדרה של אפס הגבלות.", - "apihelp-purge-description": "ניקוי המטמון לכותרות שניתנו.", + "apihelp-purge-summary": "ניקוי המטמון לכותרות שניתנו.", "apihelp-purge-param-forcelinkupdate": "עדכון טבלאות הקישורים.", "apihelp-purge-param-forcerecursivelinkupdate": "עדכון טבלת הקישורים ועדכון טבלאות הקישורים עבור כל דף שמשתמש בדף הזה בתור תבנית.", "apihelp-purge-example-simple": "ניקוי המטמון של הדפים Main Page ו־API.", "apihelp-purge-example-generator": "ניקוי 10 הדפים הראשונים במרחב הראשי.", - "apihelp-query-description": "אחזור נתונים ממדיה־ויקי ועליה.\n\nכל שינויי הנתונים יצטרכו תחילה להשתמש ב־query כדי לקבל אסימון למניעת שימוש לרעה מאתרים זדוניים.", + "apihelp-query-summary": "אחזור נתונים ממדיה־ויקי ועליה.", + "apihelp-query-extended-description": "כל שינויי הנתונים יצטרכו תחילה להשתמש ב־query כדי לקבל אסימון למניעת שימוש לרעה מאתרים זדוניים.", "apihelp-query-param-prop": "אילו מאפיינים לקבל על הדפים בשאילתה.", "apihelp-query-param-list": "אילו רשימות לקבל.", "apihelp-query-param-meta": "אילו מטא־נתונים לקבל.", @@ -385,7 +414,7 @@ "apihelp-query-param-rawcontinue": "להחזיר נתוני query-continue גולמיים להמשך.", "apihelp-query-example-revisions": "אחזור [[Special:ApiHelp/query+siteinfo|site info]] ו־[[Special:ApiHelp/query+revisions|revisions]] של Main Page.", "apihelp-query-example-allpages": "אחזור גרסאת של דפים שמתחילים ב־API/.", - "apihelp-query+allcategories-description": "למנות את כל הקטגוריות.", + "apihelp-query+allcategories-summary": "למנות את כל הקטגוריות.", "apihelp-query+allcategories-param-from": "מאיזו קטגוריה להתחיל למנות.", "apihelp-query+allcategories-param-to": "באיזו קטגוריה להפסיק למנות.", "apihelp-query+allcategories-param-prefix": "חיפוש כל כותרות הקטגוריות שמתחילות בערך הזה.", @@ -398,7 +427,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "מתייג קטגוריות מוסתרות עם __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "רשימת קטגוריות עם מידע על מספר הדפים בכל אחת מהן.", "apihelp-query+allcategories-example-generator": "אחזור מידע על דף הקטגוריה עצמו עבור קטגוריות שמתחילות ב־List.", - "apihelp-query+alldeletedrevisions-description": "רשימת כל הגרסאות המחוקות על־ידי משתמש או במרחב.", + "apihelp-query+alldeletedrevisions-summary": "רשימת כל הגרסאות המחוקות על־ידי משתמש או במרחב.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "יכול לשמש רק $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "לא יכול לשמש עם $3user.", "apihelp-query+alldeletedrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות.", @@ -410,11 +439,11 @@ "apihelp-query+alldeletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.", "apihelp-query+alldeletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.", "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "לתשומת לבך: בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־$1user וב־$1namespace ביחד עלול להניב החזרה של פחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "לתשומת לבך: בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־$1user וב־$1namespace ביחד עלול להניב החזרה של פחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.", "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.", "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.", - "apihelp-query+allfileusages-description": "לרשום את כל שימושי הקובץ, כולל בלתי־קיימים.", + "apihelp-query+allfileusages-summary": "לרשום את כל שימושי הקובץ, כולל בלתי־קיימים.", "apihelp-query+allfileusages-param-from": "מאיזה שם קובץ להתחיל למנות.", "apihelp-query+allfileusages-param-to": "שם הקובץ שהמנייה תסתיים בו.", "apihelp-query+allfileusages-param-prefix": "חיפוש כל שמות הקבצים שמתחילים עם הערך הזה.", @@ -428,7 +457,7 @@ "apihelp-query+allfileusages-example-unique": "רשימת שמות קבצים ייחודיים.", "apihelp-query+allfileusages-example-unique-generator": "קבלת כל שמות הקבצים, כולל חסרים.", "apihelp-query+allfileusages-example-generator": "קבלת דפים שמכילים את הקבצים.", - "apihelp-query+allimages-description": "למנות את כל התמונות לפי הסדר.", + "apihelp-query+allimages-summary": "למנות את כל התמונות לפי הסדר.", "apihelp-query+allimages-param-sort": "לפי איזה מאפיין למיין.", "apihelp-query+allimages-param-dir": "באיזה כיוון לרשום.", "apihelp-query+allimages-param-from": "מאיזה שם תמונה להתחיל למנות. יכול לשמש רק עם $1sort=name.", @@ -448,7 +477,7 @@ "apihelp-query+allimages-example-recent": "הצגת רשימת קבצים שהועלו לאחרונה, דומה ל־[[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "להציג רשימה של קבצות שסוג ה־MIME שלהם הוא image/png או image/gif.", "apihelp-query+allimages-example-generator": "הצגת מידע על 4 קבצים המתחילים באות T.", - "apihelp-query+alllinks-description": "למנות את כל הקישורים שמצביעים למרחב שם נתון.", + "apihelp-query+alllinks-summary": "למנות את כל הקישורים שמצביעים למרחב שם נתון.", "apihelp-query+alllinks-param-from": "מאיזה שם קישור להתחיל למנות.", "apihelp-query+alllinks-param-to": "כותרת הקישור שהמנייה תסתיים בו.", "apihelp-query+alllinks-param-prefix": "חיפוש כל הכותרות המקושרות שמתחילות בערך הזה.", @@ -463,7 +492,7 @@ "apihelp-query+alllinks-example-unique": "רשימת כותרות מקושרים ייחודיות.", "apihelp-query+alllinks-example-unique-generator": "קבלת כל הכותרות המקושרות, וסימון החסרות.", "apihelp-query+alllinks-example-generator": "קבלת דפים שמכילים את הקישורים.", - "apihelp-query+allmessages-description": "החזרת הודעות מהאתר הזה.", + "apihelp-query+allmessages-summary": "החזרת הודעות מהאתר הזה.", "apihelp-query+allmessages-param-messages": "אילו הודעות לפלוט. כתיבת * (בררת מחדל) תפלוט את כל ההודעות.", "apihelp-query+allmessages-param-prop": "אלו מאפיינים לקבל.", "apihelp-query+allmessages-param-enableparser": "יש להגדיר כדי להפעיל את המפענח, יעשה קדם־עיבוד לקוד ויקי של ההודעה (יחליף מילות קסם, יטפל בתבניות, וכו').", @@ -479,7 +508,7 @@ "apihelp-query+allmessages-param-prefix": "החזרת הודעת עם התחילית הזאת.", "apihelp-query+allmessages-example-ipb": "להציג הודעות שמתחילות ב־ipb-.", "apihelp-query+allmessages-example-de": "להציג את ההודעות august ו־mainpage בגרמנית.", - "apihelp-query+allpages-description": "למנות את כל הדפים לפי הסדר במרחב שם נתון.", + "apihelp-query+allpages-summary": "למנות את כל הדפים לפי הסדר במרחב שם נתון.", "apihelp-query+allpages-param-from": "מאיזה שם דף להתחיל למנות.", "apihelp-query+allpages-param-to": "כותרת הדף שהמנייה תסתיים בו.", "apihelp-query+allpages-param-prefix": "חיפוש כל שמות הדפים שמתחילים בערך הזה.", @@ -497,7 +526,7 @@ "apihelp-query+allpages-example-B": "להציג רשימה של דפים במתחילים באות B.", "apihelp-query+allpages-example-generator": "להציג מידע על 4 דפים שמתחילים באות T.", "apihelp-query+allpages-example-generator-revisions": "להציג את תוכן של 2 הדפים הראשונים שמתחילים ב־Re ושאינם דפי הפניה.", - "apihelp-query+allredirects-description": "רשימה של כל ההפניות למרחב שם.", + "apihelp-query+allredirects-summary": "רשימה של כל ההפניות למרחב שם.", "apihelp-query+allredirects-param-from": "מאיזו כותרת הפניה להתחיל את מנייה.", "apihelp-query+allredirects-param-to": "כותרת ההפניה שהמנייה תיפסק בה.", "apihelp-query+allredirects-param-prefix": "חיפוש על דפי היעד שמתחילים בערך הזה.", @@ -514,7 +543,7 @@ "apihelp-query+allredirects-example-unique": "רשימת דפי יעד ייחודיים.", "apihelp-query+allredirects-example-unique-generator": "קבלת על דפי היעד, תוך כדי סימון החסרים.", "apihelp-query+allredirects-example-generator": "קבלת דפים שמכילים את ההפניות.", - "apihelp-query+allrevisions-description": "רשימת כל הגרסאות.", + "apihelp-query+allrevisions-summary": "רשימת כל הגרסאות.", "apihelp-query+allrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות.", "apihelp-query+allrevisions-param-end": "באיזה חותם־זמן להפסיק למנות.", "apihelp-query+allrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.", @@ -523,13 +552,13 @@ "apihelp-query+allrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.", "apihelp-query+allrevisions-example-user": "לרשום את 50 התרומות האחרונות של משתמש Example.", "apihelp-query+allrevisions-example-ns-main": "רשימת 50 הגרסאות הראשונות במרחב הראשי.", - "apihelp-query+mystashedfiles-description": "קבלת רשימת קבצים בסליק ההעלאה של המשתמש הנוכחי.", + "apihelp-query+mystashedfiles-summary": "קבלת רשימת קבצים בסליק ההעלאה של המשתמש הנוכחי.", "apihelp-query+mystashedfiles-param-prop": "אילו מאפיינים לאחזר עבור הקבצים.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "אחזור גודל הקובץ וממדי התמונה.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "אחזור סוג ה־MIME של הקובץ וסוג המדיה.", "apihelp-query+mystashedfiles-param-limit": "כמה קבצים לקבל.", "apihelp-query+mystashedfiles-example-simple": "לקבל מפתח קובץ, גודל קובץ וגודל בפיקסלים של קבצים בסליק ההעלאה של המשתמש הנוכחי.", - "apihelp-query+alltransclusions-description": "רשימת כל ההכללות (דפים שמוטבעים באמצעות {{x}}), כולל כאלה שאינם קיימים.", + "apihelp-query+alltransclusions-summary": "רשימת כל ההכללות (דפים שמוטבעים באמצעות {{x}}), כולל כאלה שאינם קיימים.", "apihelp-query+alltransclusions-param-from": "מאיזו כותרת ההכללה להתחיל למנות.", "apihelp-query+alltransclusions-param-to": "כותרת ההכללה שהמנייה תיפסק בה.", "apihelp-query+alltransclusions-param-prefix": "חיפוש כל הכותרות המוכללות שמתחילות הערך הזה.", @@ -544,7 +573,7 @@ "apihelp-query+alltransclusions-example-unique": "רשימת כותרת מוכללות ייחודיות.", "apihelp-query+alltransclusions-example-unique-generator": "קבלת כל כל הכותרות המוכללות, תוך כדי סימון החסרות.", "apihelp-query+alltransclusions-example-generator": "קבלת דפים שמכילים את ההכללות.", - "apihelp-query+allusers-description": "למנות את כל המשתמשים הרשומים.", + "apihelp-query+allusers-summary": "למנות את כל המשתמשים הרשומים.", "apihelp-query+allusers-param-from": "מאיזה שם משתמש להתחיל למנות.", "apihelp-query+allusers-param-to": "באיזה שם משתמש להפסיק למנות.", "apihelp-query+allusers-param-prefix": "חיפוש כל המשתמשים שמתחילים בערך הזה.", @@ -565,13 +594,13 @@ "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.", "apihelp-query+allusers-param-attachedwiki": "עם $1prop=centralids, לציין גם האם המשתמש משויך לוויקי עם המזהה הזה.", "apihelp-query+allusers-example-Y": "לרשום משתמשים שמתחילים ב־Y.", - "apihelp-query+authmanagerinfo-description": "אחזור מידע אודות מצב האימות הנוכחי.", + "apihelp-query+authmanagerinfo-summary": "אחזור מידע אודות מצב האימות הנוכחי.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "בדיקה האם מצב האימות הנוכחי של המשתמש מספיק בשביל הפעולה הרגישה מבחינת אבטחה שצוינה.", "apihelp-query+authmanagerinfo-param-requestsfor": "אחזור מידע על בקשות האימות הדרושות לפעולת האימות המבוקשת.", "apihelp-query+authmanagerinfo-example-login": "אחזור הבקשות שיכולות לשמש לתחילת הכניסה.", "apihelp-query+authmanagerinfo-example-login-merged": "אחזור הבקשות שיכולות לשמש לתחילת הכניסה, עם שדות טופס ממוזגים.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "בדיקה האם האימות מספיק בשביל הפעולה foo.", - "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.", + "apihelp-query+backlinks-summary": "מציאת כל הדפים שמקשרים לדף הנתון.", "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.", "apihelp-query+backlinks-param-pageid": "מזהה דף לחיפוש. לא ניתן להשתמש בזה יחד עם $1title.", "apihelp-query+backlinks-param-namespace": "איזה מרחב שם למנות.", @@ -581,7 +610,7 @@ "apihelp-query+backlinks-param-redirect": "אם הדף המקשר הוא הפניה, למצוא גם את כל הדפים שמקשרים לאותה ההפניה. ההגבלה המרבית מוקטנת בחצי.", "apihelp-query+backlinks-example-simple": "הצגת קישורים ל־Main Page.", "apihelp-query+backlinks-example-generator": "קבל מידע על דפים שמקשרים ל־Main page.", - "apihelp-query+blocks-description": "לרשום את כל המשתמשים וכתובות ה־IP שנחסמו.", + "apihelp-query+blocks-summary": "לרשום את כל המשתמשים וכתובות ה־IP שנחסמו.", "apihelp-query+blocks-param-start": "מאיזה חותם‏־זמן להתחיל למנות.", "apihelp-query+blocks-param-end": "באיזה חותם זמן להפסיק למנות.", "apihelp-query+blocks-param-ids": "רשימת מזהי חסימות לרשום (לא חובה).", @@ -602,7 +631,7 @@ "apihelp-query+blocks-param-show": "להציג רק פריטים שמתאימים לאמות המידה האלו.\nלמשל, כדי לראות רק חסימות ללא לצמיתות על כתובות IP יש להגדיר $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "רשימת חסימות.", "apihelp-query+blocks-example-users": "רשימת חסימות של המשתמשים Alice ו־Bob.", - "apihelp-query+categories-description": "לרשום את כל הקטגוריות שהדף שייך אליהן.", + "apihelp-query+categories-summary": "לרשום את כל הקטגוריות שהדף שייך אליהן.", "apihelp-query+categories-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קטגוריה:", "apihelp-query+categories-paramvalue-prop-sortkey": "הוספת מפתח מיון (מחרוזת הקסדצימלית) ותחילית מפתח מיון (החלק הקריא) עבור קטגוריה.", "apihelp-query+categories-paramvalue-prop-timestamp": "הוספת חותם־הזמן של יצירת הקטגוריה.", @@ -613,9 +642,9 @@ "apihelp-query+categories-param-dir": "באיזה כיוון לרשום.", "apihelp-query+categories-example-simple": "קבלת רשימת קטגוריות שהם Albert Einstein שייך אליהן.", "apihelp-query+categories-example-generator": "קבלת מידע על כל הקטגוריות שמשמשות בדף Albert Einstein.", - "apihelp-query+categoryinfo-description": "החזרת מידע על הקטגוריות הנתונות.", + "apihelp-query+categoryinfo-summary": "החזרת מידע על הקטגוריות הנתונות.", "apihelp-query+categoryinfo-example-simple": "קבחצ מידע על Category:Foo ועל Category:Bar.", - "apihelp-query+categorymembers-description": "רשימת כל הדפים בקטגוריה נתונה.", + "apihelp-query+categorymembers-summary": "רשימת כל הדפים בקטגוריה נתונה.", "apihelp-query+categorymembers-param-title": "איזו קטגוריה למנות (נדרש). חייב לכלול את התחילית {{ns:category}}:. לא יכול לשמש יחד עם $1pageid.", "apihelp-query+categorymembers-param-pageid": "מזהה הדף של הקטגוריה שצריך למנות. לא יכול לשמש יחד עם $1title.", "apihelp-query+categorymembers-param-prop": "אילו חלקי מידע לכלול:", @@ -640,14 +669,15 @@ "apihelp-query+categorymembers-param-endsortkey": "כדאי להשתמש ב־$1endhexsortkey במקום.", "apihelp-query+categorymembers-example-simple": "קבלת עשרת העמודים הראשונים שתחת Category:Physics.", "apihelp-query+categorymembers-example-generator": "קבל מידע על הדף עבור 10 הדפים הראשונים ב־Category:Physics.", - "apihelp-query+contributors-description": "קבלת רשימה של תורמים שנכנסו לחשבון ומניין של תורמים אלמוניים לדף.", + "apihelp-query+contributors-summary": "קבלת רשימה של תורמים שנכנסו לחשבון ומניין של תורמים אלמוניים לדף.", "apihelp-query+contributors-param-group": "לכלול רק משתמשים בקבוצות הנתונות. לא כולל קבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.", "apihelp-query+contributors-param-excludegroup": "לא לכלול משתמשים בקבוצות הנתונות. לא כולל קבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.", "apihelp-query+contributors-param-rights": "לכלול רק משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.", "apihelp-query+contributors-param-excluderights": "לא לכלול משתמשים עם ההרשאות הנתונות. לא כולל הרשאות שניתנו בקבוצות משתמעות או אוטומטיות כגון *, user או autoconfirmed.", "apihelp-query+contributors-param-limit": "כמה תורמים להחזיר.", "apihelp-query+contributors-example-simple": "הצגת תורמים לדף Main Page.", - "apihelp-query+deletedrevisions-description": "קבלת מידע על גרסה מחוקה.\n\nיכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.", + "apihelp-query+deletedrevisions-summary": "קבלת מידע על גרסה מחוקה.", + "apihelp-query+deletedrevisions-extended-description": "יכול לשמש במספר דרכים:\n# קבלת גרסאות מחוקות עבור ערכת דפים, על־ידי הגדרת שמות או מזהי דף. ממוין לפי שם וחותם־זמן.\n# קבלת מידע על ערכת גרסאות מחוקות באמצעות הגדרת המזהים שלהם עם revid־ים. ממוין לפי מזהה גרסה.", "apihelp-query+deletedrevisions-param-start": "מאיזה חותם־זמן להתחיל למנות. לא תקף בעיבוד רשימת מזהי גרסה.", "apihelp-query+deletedrevisions-param-end": "באיזה חותם־זמן להפסיק למנות. לא תקף בעת עיבוד רשימת מזהי גרסה.", "apihelp-query+deletedrevisions-param-tag": "לרשום רק גרסאות עם התג הזה.", @@ -655,7 +685,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.", "apihelp-query+deletedrevisions-example-titles": "רשימת גרסאות מחוקות של הדפים Main Page ו־Talk:Main Page, עם תוכן.", "apihelp-query+deletedrevisions-example-revids": "קבלת מידע לגרסה המחוקה 123456.", - "apihelp-query+deletedrevs-description": "רשימת גרסאות מחוקות.\n\nפועל בשלושה אופנים:\n# רשימת גרסאות מחוקות לשמות שניתנו, ממוינות לפי חותם־זמן.\n# רשימת תרומות מחוקות של המשתמש שניתן, ממוינות לפי חותם־זמן (בלי לציין שמות).\n# רשימת כל הגרסאות המחוקות במרחב השם שניתן, ממוינות לפי שם וחותם־זמן (בלי לציין שמות, בלי להגדיר $1user).\n\nפרמטרים מסוימים חלים רק על חלק מהאופנים ולא תקפים באחרים.", + "apihelp-query+deletedrevs-summary": "רשימת גרסאות מחוקות.", + "apihelp-query+deletedrevs-extended-description": "פועל בשלושה אופנים:\n# רשימת גרסאות מחוקות לשמות שניתנו, ממוינות לפי חותם־זמן.\n# רשימת תרומות מחוקות של המשתמש שניתן, ממוינות לפי חותם־זמן (בלי לציין שמות).\n# רשימת כל הגרסאות המחוקות במרחב השם שניתן, ממוינות לפי שם וחותם־זמן (בלי לציין שמות, בלי להגדיר $1user).\n\nפרמטרים מסוימים חלים רק על חלק מהאופנים ולא תקפים באחרים.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|מצב|מצבים}}: $2", "apihelp-query+deletedrevs-param-start": "באיזה חותם־זמן להתחיל למנות.", "apihelp-query+deletedrevs-param-end": "באיזה חותם־זמן להפסיק למנות.", @@ -673,14 +704,14 @@ "apihelp-query+deletedrevs-example-mode2": "רשימת 50 העריכות המחוקות האחרונות של Bob‏ (mode 2).", "apihelp-query+deletedrevs-example-mode3-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי (mode 3).", "apihelp-query+deletedrevs-example-mode3-talk": "רשימת 50 הדפים המחוקים הראשונים במרחב השם {{ns:talk}}‏ (mode 3).", - "apihelp-query+disabled-description": "יחידת ה־query הזאת כובתה.", - "apihelp-query+duplicatefiles-description": "רשימת כל הקבצים שהם כפולים של קבצים נתונים לפי ערכי הגיבוב.", + "apihelp-query+disabled-summary": "יחידת ה־query הזאת כובתה.", + "apihelp-query+duplicatefiles-summary": "רשימת כל הקבצים שהם כפולים של קבצים נתונים לפי ערכי הגיבוב.", "apihelp-query+duplicatefiles-param-limit": "כמה קבצים כפולים להחזיר.", "apihelp-query+duplicatefiles-param-dir": "באיזה כיוון לרשום.", "apihelp-query+duplicatefiles-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.", "apihelp-query+duplicatefiles-example-simple": "חיפוש אחר כפילויות של [[:קובץ:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "חיפוש אחר כפילויות בין כל הקבצים.", - "apihelp-query+embeddedin-description": "חיפוש כל הדפים שמטמיעים (מכלילים) את הכותרת הנתונה.", + "apihelp-query+embeddedin-summary": "חיפוש כל הדפים שמטמיעים (מכלילים) את הכותרת הנתונה.", "apihelp-query+embeddedin-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.", "apihelp-query+embeddedin-param-pageid": "מזהה דף לחיפוש. לא יכול לשמש יחד עם $1title.", "apihelp-query+embeddedin-param-namespace": "איזה מרחב שם למנות.", @@ -689,13 +720,13 @@ "apihelp-query+embeddedin-param-limit": "כמה דפים להחזיר בסך הכול.", "apihelp-query+embeddedin-example-simple": "הצגת דפים שמכלילים את Template:Stub.", "apihelp-query+embeddedin-example-generator": "קבלת מידע על דפים שמכלילים את Template:Stub.", - "apihelp-query+extlinks-description": "החזרת כל ה־URL־ים החיצוניים (לא בינוויקי) מהדפים הנתונים.", + "apihelp-query+extlinks-summary": "החזרת כל ה־URL־ים החיצוניים (לא בינוויקי) מהדפים הנתונים.", "apihelp-query+extlinks-param-limit": "כמה קישורים להחזיר.", "apihelp-query+extlinks-param-protocol": "הפרוטוקול של ה־URL. אם זה ריק, ו־$1query מוגדר, הפרוטוקול הוא http. יש להשאיר את זה ואת $1query ריק כדי לרשום את כל הקישורים החיצוניים.", "apihelp-query+extlinks-param-query": "מחרוזת חיפוש ללא פרוטוקול. שימושי לבדיקה האם דף מסוים מכיל url חיצוני מסוים.", "apihelp-query+extlinks-param-expandurl": "הרחבת URL־ים בעלי פרוטוקול יחסי בפרוטוקול קנוני.", "apihelp-query+extlinks-example-simple": "קבלת רשימת קישורים חיצוניים ב־Main Page.", - "apihelp-query+exturlusage-description": "למנות דפים שמכילים URL נתון.", + "apihelp-query+exturlusage-summary": "למנות דפים שמכילים URL נתון.", "apihelp-query+exturlusage-param-prop": "אילו חלקי מידע לכלול:", "apihelp-query+exturlusage-paramvalue-prop-ids": "הוספת מזהה הדף.", "apihelp-query+exturlusage-paramvalue-prop-title": "הוספת השם ומזהה מרחב השם של הדף.", @@ -706,7 +737,7 @@ "apihelp-query+exturlusage-param-limit": "כמה דפים להחזיר.", "apihelp-query+exturlusage-param-expandurl": "הרחבת URL־ים בעלי פרוטוקול יחסי בפרוטוקול קנוני.", "apihelp-query+exturlusage-example-simple": "הצגת דפים שמקשרים ל־http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "למנות את כל הקבצים המחוקים לפי הסדר.", + "apihelp-query+filearchive-summary": "למנות את כל הקבצים המחוקים לפי הסדר.", "apihelp-query+filearchive-param-from": "מאיזו כותרת תמונה להתחיל למנות.", "apihelp-query+filearchive-param-to": "באיזו כותרת תמונה להפסיק למנות.", "apihelp-query+filearchive-param-prefix": "חיפוש כל שמות התמונות שמתחילים בערך הזה.", @@ -728,10 +759,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "הוספת עומק הביטים של הגרסה.", "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.", "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.", - "apihelp-query+filerepoinfo-description": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.", - "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.", + "apihelp-query+filerepoinfo-summary": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.", + "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.", "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.", - "apihelp-query+fileusage-description": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.", + "apihelp-query+fileusage-summary": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.", "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+fileusage-paramvalue-prop-pageid": "מזהה הדף של כל דף.", "apihelp-query+fileusage-paramvalue-prop-title": "השם של כל דף.", @@ -741,7 +772,7 @@ "apihelp-query+fileusage-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.", "apihelp-query+fileusage-example-simple": "קבלת רשימת דפים שמשתמשים ב־[[:File:Example.jpg]].", "apihelp-query+fileusage-example-generator": "קבלת מידע על דפים שמשתמשים ב־[[:File:Example.jpg]].", - "apihelp-query+imageinfo-description": "החזרת מידע על קובץ והיסטורייה העלאה.", + "apihelp-query+imageinfo-summary": "החזרת מידע על קובץ והיסטורייה העלאה.", "apihelp-query+imageinfo-param-prop": "איזה מידע על הקובץ לקבל:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "הוספת חותם־זמן לגרסה שהועלתה.", "apihelp-query+imageinfo-paramvalue-prop-user": "הוספה המשתמש שהעלה כל גרסה של קובץ.", @@ -777,13 +808,13 @@ "apihelp-query+imageinfo-param-localonly": "חיפוש אחר קבצים במאגר המקומי בלבד.", "apihelp-query+imageinfo-example-simple": "קבלת מידע על הגרסה הנוכחית של [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "אחזור מידע על גרסאות של [[:File:Test.jpg]] מ־2008 ואחרי‏־כן.", - "apihelp-query+images-description": "להחזיר את כל הקבצים שמכילים הדפים הנתונים.", + "apihelp-query+images-summary": "להחזיר את כל הקבצים שמכילים הדפים הנתונים.", "apihelp-query+images-param-limit": "כמה קבצים להחזיר.", "apihelp-query+images-param-images": "לרשום רק את הקבצים האלה. שימוש לבדיקת האם לדף מסוים יש קובץ מסוים.", "apihelp-query+images-param-dir": "באיזה כיוון לרשום.", "apihelp-query+images-example-simple": "קבלת רשימת קבצים שמשמשים ב־[[Main Page]].", "apihelp-query+images-example-generator": "קבלת מידע על כל הקבצים שמשמשים ב־[[Main Page]].", - "apihelp-query+imageusage-description": "מציאת כל הדפים שמתמשים בשם התמונה הנתונה.", + "apihelp-query+imageusage-summary": "מציאת כל הדפים שמתמשים בשם התמונה הנתונה.", "apihelp-query+imageusage-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם $1pageid.", "apihelp-query+imageusage-param-pageid": "מזהה דף לחיפוש. לא יכול לשמש יחד עם $1title.", "apihelp-query+imageusage-param-namespace": "איזה מרחב שם למנות.", @@ -793,7 +824,7 @@ "apihelp-query+imageusage-param-redirect": "אם הדף המקשר הוא הפניה, למצוא גם את כל הדפים שמקשרים לאותה ההפניה. ההגבלה המרבית מוקטנת בחצי.", "apihelp-query+imageusage-example-simple": "הצגת דפים שמשתמשים ב־[[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "קבלת פרטים על דפים שמשתמשים ב־[[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "קבלת מידע בסיסי על הדף.", + "apihelp-query+info-summary": "קבלת מידע בסיסי על הדף.", "apihelp-query+info-param-prop": "אילו מאפיינים נוספים לקבל:", "apihelp-query+info-paramvalue-prop-protection": "לרשום את רמת ההגנה של כל דף.", "apihelp-query+info-paramvalue-prop-talkid": "מזהה הדף של דף השיחה עבור כל דף שאינו דף שיחה.", @@ -810,7 +841,8 @@ "apihelp-query+info-param-token": "להשתמש ב־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] במקום.", "apihelp-query+info-example-simple": "קבלת מידע על הדף Main Page", "apihelp-query+info-example-protection": "קבלת מידע כללי ומידע על הגנה של הדף Main Page.", - "apihelp-query+iwbacklinks-description": "מציאות כל הדפים שמקשרים לקישור הבינוויקי הנתון.\n\nיכול לשמש למציאת כל הקישורים עם התחילית, או כל הקישורים לכותרת (עם תחילית נתונה). אי־שימוש בשום פרמטר אומר \"כל קישורי בינוויקי\".", + "apihelp-query+iwbacklinks-summary": "מציאות כל הדפים שמקשרים לקישור הבינוויקי הנתון.", + "apihelp-query+iwbacklinks-extended-description": "יכול לשמש למציאת כל הקישורים עם התחילית, או כל הקישורים לכותרת (עם תחילית נתונה). אי־שימוש בשום פרמטר אומר \"כל קישורי בינוויקי\".", "apihelp-query+iwbacklinks-param-prefix": "תחילית לבינוויקי.", "apihelp-query+iwbacklinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.", @@ -820,7 +852,7 @@ "apihelp-query+iwbacklinks-param-dir": "באיזה כיוון לרשום.", "apihelp-query+iwbacklinks-example-simple": "קבלת דפים שמקשרים ל־[[wikibooks:Test]].", "apihelp-query+iwbacklinks-example-generator": "קבלת מידע על דפים שמקשרים ל־[[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "החזרת כל קישורי הבינוויקי מהדפים הנתונים.", + "apihelp-query+iwlinks-summary": "החזרת כל קישורי הבינוויקי מהדפים הנתונים.", "apihelp-query+iwlinks-param-url": "האם לקבל את ה־URL המלא (לא יכול לשמש עם $1prop).", "apihelp-query+iwlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:", "apihelp-query+iwlinks-paramvalue-prop-url": "הוספת ה־URL המלא.", @@ -829,7 +861,8 @@ "apihelp-query+iwlinks-param-title": "איזה קישור בינוויקי לחפש. צריך להשתמש בזה יחד עם $1prefix.", "apihelp-query+iwlinks-param-dir": "באיזה כיוון לרשום.", "apihelp-query+iwlinks-example-simple": "קבלת קישורי בינוויקי מהדף Main Page.", - "apihelp-query+langbacklinks-description": "מציאת כל הדפים שמקשרים לקישור השפה הנתון.\n\nיכול לשמש למציאת כל הקישורים עם קוד שפה, או כל הקישורים לכותרת (עם שפה נתונה). אי־שימוש בשום פרמטר פירושו \"כל קישורי שפה\".\n\nנא לשים לב לכך שזה עשוי לא להתייחס לקישורי שפה שמוסיפות הרחבות.", + "apihelp-query+langbacklinks-summary": "מציאת כל הדפים שמקשרים לקישור השפה הנתון.", + "apihelp-query+langbacklinks-extended-description": "יכול לשמש למציאת כל הקישורים עם קוד שפה, או כל הקישורים לכותרת (עם שפה נתונה). אי־שימוש בשום פרמטר פירושו \"כל קישורי שפה\".\n\nנא לשים לב לכך שזה עשוי לא להתייחס לקישורי שפה שמוסיפות הרחבות.", "apihelp-query+langbacklinks-param-lang": "שפה עבור קישור שפה.", "apihelp-query+langbacklinks-param-title": "איזה קישור שפה לחפש. חייב לשמש עם $1lang.", "apihelp-query+langbacklinks-param-limit": "כמה דפים להחזיר בסך הכול.", @@ -839,7 +872,7 @@ "apihelp-query+langbacklinks-param-dir": "באיזה כיוון לרשום.", "apihelp-query+langbacklinks-example-simple": "קבלת דפים שמקשרים ל־[[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "קבלת מידע על דפים שמקשרים ל־[[:fr:Test]].", - "apihelp-query+langlinks-description": "החזרת כל הקישורים הבין־לשוניים מהדפים הנתונים.", + "apihelp-query+langlinks-summary": "החזרת כל הקישורים הבין־לשוניים מהדפים הנתונים.", "apihelp-query+langlinks-param-limit": "כמה קישורי שפה להחזיר.", "apihelp-query+langlinks-param-url": "האם לקבל את ה־URL המלא (לא יכול לשמש עם $1prop).", "apihelp-query+langlinks-param-prop": "אילו מאפיינים נוספים לקבל עבור כל קישור בין־לשוני:", @@ -849,9 +882,9 @@ "apihelp-query+langlinks-param-lang": "להחזיר רק קישורי שפה עם קוד השפה הזה.", "apihelp-query+langlinks-param-title": "קישור לחיפוש. חובה להשתמש עם $1lang.", "apihelp-query+langlinks-param-dir": "באיזה כיוון לרשום.", - "apihelp-query+langlinks-param-inlanguagecode": "קוד שפה ששמות שפות מתורגמות.", + "apihelp-query+langlinks-param-inlanguagecode": "קוד שפה בשביל שמות שפות מתורגמות.", "apihelp-query+langlinks-example-simple": "קבלת קישורים בין־לשוניים מהדף Main Page.", - "apihelp-query+links-description": "החזרת כל הקישורים מהדפים שצוינו.", + "apihelp-query+links-summary": "החזרת כל הקישורים מהדפים שצוינו.", "apihelp-query+links-param-namespace": "להציג קישורים רק במרחבי השם האלה.", "apihelp-query+links-param-limit": "כמה קישורים להחזיר.", "apihelp-query+links-param-titles": "לרשום רק קישורים לכותרות האלו. שימושי לבדיקה האם דף מסוים מקשר לכותרת מסוימת.", @@ -859,7 +892,7 @@ "apihelp-query+links-example-simple": "קבלת קישורים מהדף Main Page", "apihelp-query+links-example-generator": "קבלת מידע על דפי הקישור בדף Main Page.", "apihelp-query+links-example-namespaces": "קבלת קישורים מהדף Main Page במרחבי השם {{ns:user}} ו־{{ns:template}}.", - "apihelp-query+linkshere-description": "מציאת כל הדפים שמקשרים לדפים הנתונים.", + "apihelp-query+linkshere-summary": "מציאת כל הדפים שמקשרים לדפים הנתונים.", "apihelp-query+linkshere-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+linkshere-paramvalue-prop-pageid": "מזהה הדף של כל דף.", "apihelp-query+linkshere-paramvalue-prop-title": "השם של כל דף.", @@ -869,7 +902,7 @@ "apihelp-query+linkshere-param-show": "הצגת פריטים שתואמים את הדרישות הללו בלבד:\n;redirect:הצגת הפניות בלבד.\n;!redirect:הצגת קישורים שאינם הפניות בלבד.", "apihelp-query+linkshere-example-simple": "קבלת רשימת דפים שמקשרים ל־[[Main Page]].", "apihelp-query+linkshere-example-generator": "קבל מידע על דפים שמקשרים ל־[[Main Page]].", - "apihelp-query+logevents-description": "קבלת אירועים מהרישומים.", + "apihelp-query+logevents-summary": "קבלת אירועים מהרישומים.", "apihelp-query+logevents-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+logevents-paramvalue-prop-ids": "הוספת המזהה של אירוע היומן.", "apihelp-query+logevents-paramvalue-prop-title": "הוספת שם הדף של אירוע היומן.", @@ -892,13 +925,13 @@ "apihelp-query+logevents-param-tag": "לרשום רק אירועים שמתויגם בתג הזה.", "apihelp-query+logevents-param-limit": "כמה עיולי אירועים להחזיר בסך הכול.", "apihelp-query+logevents-example-simple": "רשימת אירועי יומן אחרונים.", - "apihelp-query+pagepropnames-description": "רשימת כל שמות המאפיינים שמשמשים בוויקי.", + "apihelp-query+pagepropnames-summary": "רשימת כל שמות המאפיינים שמשמשים בוויקי.", "apihelp-query+pagepropnames-param-limit": "המספר המרבי של השמות להחזיר.", "apihelp-query+pagepropnames-example-simple": "לתת את 10 שמות המאפיינים הראשונים.", - "apihelp-query+pageprops-description": "קבלת מאפייני דף שונים שמוגדרים בתוכן הדף.", + "apihelp-query+pageprops-summary": "קבלת מאפייני דף שונים שמוגדרים בתוכן הדף.", "apihelp-query+pageprops-param-prop": "לרשום רק את המאפיינים האלה (שימוש ב־[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] מחזיר רשימת שמות מאפייני דף בשימוש). זה שימושי לבדיקה האם דפים משתמשים במאפיין דף מסוים.", "apihelp-query+pageprops-example-simple": "קבלת מאפיינים עבור הדפים Main Page ו־MediaWiki.", - "apihelp-query+pageswithprop-description": "לרשום את כל הדפים שמשתמשים במאפיין דף נתון.", + "apihelp-query+pageswithprop-summary": "לרשום את כל הדפים שמשתמשים במאפיין דף נתון.", "apihelp-query+pageswithprop-param-propname": "מאפיין דף שעבורו למנות דפים ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] מחזיר רשימת שמות מאפייני דף בשימוש).", "apihelp-query+pageswithprop-param-prop": "אילו חלקי מידע לכלול:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "הוספת מזהה הדף.", @@ -908,14 +941,15 @@ "apihelp-query+pageswithprop-param-dir": "באיזה כיוון לסדר.", "apihelp-query+pageswithprop-example-simple": "הצגת עשרת הדפים הראשונים שעושים שימוש ב־{{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "קבלת מידע נוסף על עשרת הדפים הראשונים המשתמשים ב־__NOTOC__.", - "apihelp-query+prefixsearch-description": "ביצוע חיפוש תחילית של כותרות דפים.\n\nלמרות הדמיון בשם, המודול הזה אינו אמור להיות שווה ל־[[Special:PrefixIndex]] (\"מיוחד:דפים המתחילים ב\"); לדבר כזה, ר' [[Special:ApiHelp/query+allpages|action=query&list=allpages]] עם הפרמטר apprefix. מטרת המודול הזה דומה ל־[[Special:ApiHelp/opensearch|action=opensearch]]: לקבל קלט ממשתמש ולספק את הכותרות המתאימות ביותר. בהתאם לשרת מנוע החיפוש, זה יכול לכלול תיקון שגיאות כתיב, הימנעות מדפי הפניה והירסטיקות אחרות.", + "apihelp-query+prefixsearch-summary": "ביצוע חיפוש תחילית של כותרות דפים.", + "apihelp-query+prefixsearch-extended-description": "למרות הדמיון בשם, המודול הזה אינו אמור להיות שווה ל־[[Special:PrefixIndex]] (\"מיוחד:דפים המתחילים ב\"); לדבר כזה, ר' [[Special:ApiHelp/query+allpages|action=query&list=allpages]] עם הפרמטר apprefix. מטרת המודול הזה דומה ל־[[Special:ApiHelp/opensearch|action=opensearch]]: לקבל קלט ממשתמש ולספק את הכותרות המתאימות ביותר. בהתאם לשרת מנוע החיפוש, זה יכול לכלול תיקון שגיאות כתיב, הימנעות מדפי הפניה והירסטיקות אחרות.", "apihelp-query+prefixsearch-param-search": "מחרוזת לחיפוש.", "apihelp-query+prefixsearch-param-namespace": "שמות מתחם לחיפוש.", "apihelp-query+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.", "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.", "apihelp-query+prefixsearch-example-simple": "חיפוש שםות דפים שמתחילים ב־meaning.", "apihelp-query+prefixsearch-param-profile": "באיזה פרופיל חיפוש להשתמש.", - "apihelp-query+protectedtitles-description": "לרשום את כל הכותרות שמוגנות מפני יצירה.", + "apihelp-query+protectedtitles-summary": "לרשום את כל הכותרות שמוגנות מפני יצירה.", "apihelp-query+protectedtitles-param-namespace": "לרשום רק כותרות במרחבי השם האלה.", "apihelp-query+protectedtitles-param-level": "לרשום רק שמות עם רמת ההגנה הזאת.", "apihelp-query+protectedtitles-param-limit": "כמה דפים להחזיר בסך הכול.", @@ -931,18 +965,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "הוספת רמת ההגנה.", "apihelp-query+protectedtitles-example-simple": "רשימת כותרות מוגנות.", "apihelp-query+protectedtitles-example-generator": "חיפוש קישורים לכותרות מוגנות במרחב הראשי.", - "apihelp-query+querypage-description": "קבלת רשימה שמסופקת על־ידי דף מיוחד מבוסס־QueryPage.", + "apihelp-query+querypage-summary": "קבלת רשימה שמסופקת על־ידי דף מיוחד מבוסס־QueryPage.", "apihelp-query+querypage-param-page": "שם הדף המיוחד. לתשומת לבך, זה תלוי־רישיות.", "apihelp-query+querypage-param-limit": "מספר תוצאות להחזרה.", "apihelp-query+querypage-example-ancientpages": "מחזיר תוצאות מ־[[Special:Ancientpages]].", - "apihelp-query+random-description": "קבלת ערכת דפים אקראיים.\n\nהדפים רשומים בסדר קבוע, ורק נקודת ההתחלה אקראית. זה אומר שאם, למשל, Main Page הוא הדף האקראי הראשון הרשימה, List of fictional monkeys יהיה תמיד השני, List of people on stamps of Vanuatu שלישי, וכו'.", + "apihelp-query+random-summary": "קבלת ערכת דפים אקראיים.", + "apihelp-query+random-extended-description": "הדפים רשומים בסדר קבוע, ורק נקודת ההתחלה אקראית. זה אומר שאם, למשל, Main Page הוא הדף האקראי הראשון הרשימה, List of fictional monkeys יהיה תמיד השני, List of people on stamps of Vanuatu שלישי, וכו'.", "apihelp-query+random-param-namespace": "מחזיר דפים רק במרחבי השם האלה.", "apihelp-query+random-param-limit": "להגביל את מספר הדפים האקראיים שיוחזרו.", "apihelp-query+random-param-redirect": "נא להשתמש ב־$1filterredir=redirects במקום.", "apihelp-query+random-param-filterredir": "איך לסנן הפניות.", "apihelp-query+random-example-simple": "להחזיר שני דפים אקראיים מהמרחב הראשי.", "apihelp-query+random-example-generator": "החזרת מידע על הדף על שני דפים אקראיים מהמרחב הראשי.", - "apihelp-query+recentchanges-description": "למנות שינויים אחרונים.", + "apihelp-query+recentchanges-summary": "למנות שינויים אחרונים.", "apihelp-query+recentchanges-param-start": "מאיזה חותם־זמן להתחיל למנות.", "apihelp-query+recentchanges-param-end": "באיזה חותם זמן להפסיק לרשום.", "apihelp-query+recentchanges-param-namespace": "לסנן את השינויים רק למרחבי השם האלה.", @@ -972,7 +1007,7 @@ "apihelp-query+recentchanges-param-generaterevisions": "בעת שימוש בתור מחולל, לחולל מזהי גרסה במקום כותרות. עיולי שינויים אחרונים ללא מזהה גרסה משויך (למשל רוב עיולי היומן) לא יחוללו דבר.", "apihelp-query+recentchanges-example-simple": "הצגת השינויים האחרונים.", "apihelp-query+recentchanges-example-generator": "קבלת מידע על הדף על שינויים אחרונים שלא נבדקו.", - "apihelp-query+redirects-description": "מחזיר את כל ההפניות לדפים הנתונים.", + "apihelp-query+redirects-summary": "מחזיר את כל ההפניות לדפים הנתונים.", "apihelp-query+redirects-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+redirects-paramvalue-prop-pageid": "מזהה הדף של כל הפניה.", "apihelp-query+redirects-paramvalue-prop-title": "השם של כל הפניה.", @@ -982,10 +1017,11 @@ "apihelp-query+redirects-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;fragment:להציג רק הפניות עם מקטע.\n;!fragment:להציג רק הפניות ללא מקטע.", "apihelp-query+redirects-example-simple": "קבלת רשימת הפניות ל־[[Main Page]]", "apihelp-query+redirects-example-generator": "קבלת מידע על כל ההפניות ל־[[Main Page]].", - "apihelp-query+revisions-description": "קבלת מידע על גרסה.\n\nיכול לשמש במספר דרכים:\n# קבלת נתונים על ערכת דפים (גרסה אחרונה), באמצעות כותרות או מזהי דף.\n# קבלת גרסאות עבור דף נתון אחד, באמצעות שימוש בכותרות או במזהי דף עם start‏, end או limit.\n# קבלת נתונים על ערכת גרסאות באמצעות הגדרת המזהים שלהם עם revid־ים.", + "apihelp-query+revisions-summary": "קבלת מידע על גרסה.", + "apihelp-query+revisions-extended-description": "יכול לשמש במספר דרכים:\n# קבלת נתונים על ערכת דפים (גרסה אחרונה), באמצעות כותרות או מזהי דף.\n# קבלת גרסאות עבור דף נתון אחד, באמצעות שימוש בכותרות או במזהי דף עם start‏, end או limit.\n# קבלת נתונים על ערכת גרסאות באמצעות הגדרת המזהים שלהם עם revid־ים.", "apihelp-query+revisions-paraminfo-singlepageonly": "יכול לשמש רק עם דף בודד (mode #2).", - "apihelp-query+revisions-param-startid": "מאיזה מזהה גרסה להתחיל למנות.", - "apihelp-query+revisions-param-endid": "באיזה מזהה גרסה להפסיק את מניית הגרסאות.", + "apihelp-query+revisions-param-startid": "להתחיל למנות מחותם הזמן של הגרסה הזאת. הגרסה צריכה להיות קיימת, אבל לא חייבת להיות שייכת לדף הזה.", + "apihelp-query+revisions-param-endid": "להפסיק למנות מחותם הזמן של הגרסה הזאת. הגרסה צריכה להיות קיימת, אבל לא חייבת להיות שייכת לדף הזה.", "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.", "apihelp-query+revisions-param-end": "למנות עד חותם־הזמן הזה.", "apihelp-query+revisions-param-user": "לכלול רק גרסאות מאת משתמש.", @@ -1002,7 +1038,7 @@ "apihelp-query+revisions+base-paramvalue-prop-ids": "מזהה הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-flags": "דגלי גרסה (משני).", "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-user": "המתמש שעשה את הגרסה", + "apihelp-query+revisions+base-paramvalue-prop-user": "המשתמש שעשה את הגרסה", "apihelp-query+revisions+base-paramvalue-prop-userid": "מזהה המשתמש של יוצר הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-size": "אורך (בבייטים) של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (בבסיס 16) של הגרסה.", @@ -1011,17 +1047,17 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "הערה מפוענחת מאת המשתמש על הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-content": "הטקסט של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-tags": "התגים עבור הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "מיושן. יש להשתמש ב־ [[Special:ApiHelp/expandtemplates|action=expandtemplates]] או ב־ [[Special:ApiHelp/parse|action=parse]] במקום בזה.\n\nעץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1).", "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.", - "apihelp-query+revisions+base-param-expandtemplates": "להרחיב תבניות בתוכן הגרסה (דורש $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "יצירת עץ פענוח XML עבור תוכן הגרסה (דורש את $1prop=content; מוחלף ב־$1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "פענוח תוכן הגרסה (דורש $1prop=content). מסיבות של ביצועים, אם האפשרות הזאת משמשת, $1limit נכפה לערך 1.", + "apihelp-query+revisions+base-param-expandtemplates": "יש להשתמש ב־[[Special:ApiHelp/expandtemplates|action=expandtemplates]] במקום בזה. להרחיב תבניות בתוכן הגרסה (דורש $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "יש להשתמש ב־[[Special:ApiHelp/expandtemplates|action=expandtemplates]] או ב־[[Special:ApiHelp/parse|action=parse]] במקום בזה. יצירת עץ פענוח XML עבור תוכן הגרסה (דורש את $1prop=content; מוחלף ב־$1prop=parsetree).", + "apihelp-query+revisions+base-param-parse": "יש להשתמש ב־[[Special:ApiHelp/parse|action=parse]] במקום בזה. פענוח תוכן הגרסה (דורש $1prop=content). מסיבות של ביצועים, אם האפשרות הזאת משמשת, $1limit נכפה לערך 1.", "apihelp-query+revisions+base-param-section": "לאחזר רק את התוכן של הפִסקה עם המספר הזה.", - "apihelp-query+revisions+base-param-diffto": "מזהה הגרסה שאליו תושווה כל גרסה. יש להשתמש ב־prev‏, next ו־cur עבור הגרסה הקודמת, הבא והנוכחית, בהתאמה.", - "apihelp-query+revisions+base-param-difftotext": "הטקסט שאליו תושווה כל גרסה. מבצע השוואה רק של מספר מוגבל של גרסאות. דורס את $1diffto. אם מוגדר $1section, רק הפסקה הזאת תושווה אל מול הטקסט הזה.", - "apihelp-query+revisions+base-param-difftotextpst": "ביצוע התמרה לפני שמירה על הטקסט לפני הרצת השוואה. תקף רק כשמשמש עם $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "יש להשתמש ב־[[Special:ApiHelp/compare|action=compare]] במקום בזה. מזהה הגרסה שכל גרסה תושווה אליה. יש להשתמש ב־prev‏, next ו־cur עבור הגרסה הקודמת, הבא והנוכחית, בהתאמה.", + "apihelp-query+revisions+base-param-difftotext": "יש להשתמש ב־[[Special:ApiHelp/compare|action=compare]] במקום בזה. הטקסט שכל גרסה גרסה תושווה אליו. מבצע השוואה רק של מספר מוגבל של גרסאות. דורס את $1diffto. אם מוגדר $1section, רק הפסקה הזאת תושווה אל מול הטקסט הזה.", + "apihelp-query+revisions+base-param-difftotextpst": "יש להשתמש ב־[[Special:ApiHelp/compare|action=compare]] במקום בזה. ביצוע התמרה לפני שמירה על הטקסט לפני הרצת השוואה. תקף רק כשמשמש עם $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "תסדיר ההסדרה שמשמש את $1difftotext וצפוי לפלט של תוכן.", - "apihelp-query+search-description": "ביצוע חיפוש בכל הטקסט.", + "apihelp-query+search-summary": "ביצוע חיפוש בכל הטקסט.", "apihelp-query+search-param-search": "חיפוש שמות דפים או תוכן שמתאים לערך הזה. אפשר להשתמש בחיפוש מחרוזת כדי לקרוא לאפשרויות חיפוש מתקדמות, בהתאם למה שממומש בשרת החיפוש של הוויקי.", "apihelp-query+search-param-namespace": "חיפוש רק במרחבי השם האלה.", "apihelp-query+search-param-what": "איזה סוג חיפוש לבצע.", @@ -1039,16 +1075,16 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "הוספת שם הפסקה התואמת.", "apihelp-query+search-paramvalue-prop-categorysnippet": "הוספת קטע קצר מפוענח של הקטגוריה התואמת.", "apihelp-query+search-paramvalue-prop-isfilematch": "הוספת בוליאני שמציין אם החיפוש תאם לתוכן של קובץ.", - "apihelp-query+search-paramvalue-prop-score": "מיושן וחסר־השפעה.", - "apihelp-query+search-paramvalue-prop-hasrelated": "מיושן וחסר־השפעה.", + "apihelp-query+search-paramvalue-prop-score": "חסר־השפעה.", + "apihelp-query+search-paramvalue-prop-hasrelated": "חסר־השפעה.", "apihelp-query+search-param-limit": "כמה דפים להחזיר בסך הכול.", "apihelp-query+search-param-interwiki": "לכלול תוצאות בינוויקי בחיפוש, אם זמין.", "apihelp-query+search-param-backend": "באיזה שרת חיפוש להשתמש אם לא בבררת המחדל.", - "apihelp-query+search-param-enablerewrites": "הפעלת שכתוב שאילתות פנימי. שרתי חיפוש אחדים יכולים לשכתב את השאילתה לצורה שלדעתם נותנת תוצאות טובות יותר, למשל תיקון שגיאות כתיב.", + "apihelp-query+search-param-enablerewrites": "הפעלת שכתוב שאילתות פנימי. שרתי חיפוש אחדים יכולים לשכתב את השאילתה לצורה אחרת שנחשבת לכזאת שמספקת תוצאות טובות יותר, למשל באמצעות תיקון שגיאות כתיב.", "apihelp-query+search-example-simple": "חיפוש meaning.", "apihelp-query+search-example-text": "חיפוש טקסטים עבור meaning.", "apihelp-query+search-example-generator": "קבלת מידע על הדף עבור שמוחזרים מחיפוש אחרי meaning.", - "apihelp-query+siteinfo-description": "החזרת מידע כללי על האתר.", + "apihelp-query+siteinfo-summary": "החזרת מידע כללי על האתר.", "apihelp-query+siteinfo-param-prop": "איזה מיד לקבל:", "apihelp-query+siteinfo-paramvalue-prop-general": "מידע מערכת כללי.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "רשימת מרחבי שם רשומים והשמות הקנוניים שלהם.", @@ -1065,11 +1101,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.", "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.", "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות $1inlanguagecode, אחרת זה יהיה בשפת התוכן).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.", @@ -1077,16 +1113,16 @@ "apihelp-query+siteinfo-param-filteriw": "החזרה רק של עיולים מקומיים או רק של עיולים לא מקומיים ממפת הבינוויקי.", "apihelp-query+siteinfo-param-showalldb": "רשימת כל שרתי מסד הנתונים, לא רק אלה שהכי מתעכבים.", "apihelp-query+siteinfo-param-numberingroup": "רשימת מספרי משתמשים בקבוצות משתמשים.", - "apihelp-query+siteinfo-param-inlanguagecode": "קוד שפה ששמות שפות מתורגמות (מאמץ טוב ביותר) ושמות עיצובים.", + "apihelp-query+siteinfo-param-inlanguagecode": "קוד שפה בשביל שמות שפות מתורגמות (מאמץ טוב ביותר) ושמות עיצובים.", "apihelp-query+siteinfo-example-simple": "איזור מידע על האתר.", "apihelp-query+siteinfo-example-interwiki": "אחזור תחיליות בינוויקי מקומיות.", "apihelp-query+siteinfo-example-replag": "בדיקת שיהוי השכפול הנוכחי.", - "apihelp-query+stashimageinfo-description": "החזרת מידע על הקובץ עבור הקבצים המוסלקים.", + "apihelp-query+stashimageinfo-summary": "החזרת מידע על הקובץ עבור הקבצים המוסלקים.", "apihelp-query+stashimageinfo-param-filekey": "מפתח שמזהה העלאה קודמת שהוסלקה באופן זמני.", "apihelp-query+stashimageinfo-param-sessionkey": "כינוי ל־$1filekey, לתאימות אחורה.", "apihelp-query+stashimageinfo-example-simple": "החזרת מידע על קובץ מוסלק.", "apihelp-query+stashimageinfo-example-params": "החזרת תמונות ממוזערות עבור שני קבצים מוסלקים.", - "apihelp-query+tags-description": "רשימת תגי שינוי.", + "apihelp-query+tags-summary": "רשימת תגי שינוי.", "apihelp-query+tags-param-limit": "המספר המרבי של תגים לרשום.", "apihelp-query+tags-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+tags-paramvalue-prop-name": "הוספת שם התג.", @@ -1097,7 +1133,7 @@ "apihelp-query+tags-paramvalue-prop-source": "קבלת מקורות התג, שיכולים להיות extension עבור תגים שמגדירות הרחבות ו־manual עבור תגים שמשתמשים יכולים להחיל ידנית.", "apihelp-query+tags-paramvalue-prop-active": "האם התג עדיין מוּחל.", "apihelp-query+tags-example-simple": "רשימת תגים זמינים.", - "apihelp-query+templates-description": "החזרת כל הדפים המוכללים בדפים הנתונים.", + "apihelp-query+templates-summary": "החזרת כל הדפים המוכללים בדפים הנתונים.", "apihelp-query+templates-param-namespace": "הצגת תבניות רק במרחב השם הזה.", "apihelp-query+templates-param-limit": "כמה תבניות להחזיר.", "apihelp-query+templates-param-templates": "לרשום רק את התבניות האלו. שימושי לבדיקה האם דף מסוים משתמש בתבנית מסוימת.", @@ -1105,11 +1141,11 @@ "apihelp-query+templates-example-simple": "קבלת התבניות המשמשות בדף Main Page.", "apihelp-query+templates-example-generator": "קבלת מידע על דפי התבנית שמשמשים ב־Main Page.", "apihelp-query+templates-example-namespaces": "קבלת מידע במרחבי השם {{ns:user}} ו־{{ns:template}} שמוכללים בדף Main Page.", - "apihelp-query+tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.", + "apihelp-query+tokens-summary": "קבלת אסימונים לפעולות שמשנות נתונים.", "apihelp-query+tokens-param-type": "סוגי האסימונים לבקש.", "apihelp-query+tokens-example-simple": "אחזור אסימון csrf (בררת המחדל).", "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור", - "apihelp-query+transcludedin-description": "מציאת כל הדפים שמכלילים את הדפים הנתונים.", + "apihelp-query+transcludedin-summary": "מציאת כל הדפים שמכלילים את הדפים הנתונים.", "apihelp-query+transcludedin-param-prop": "אילו מאפיינים לקבל:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "מזהה הדף של כל דף.", "apihelp-query+transcludedin-paramvalue-prop-title": "השם של כל דף.", @@ -1119,7 +1155,7 @@ "apihelp-query+transcludedin-param-show": "לחפש רק פריטים שמתאימים לאמות המידה הבאות:\n;redirect:להציג רק הפניות.\n;!redirect:לא להציג הפניות.", "apihelp-query+transcludedin-example-simple": "קבלת רשימה של דפים שמכלילים את Main Page.", "apihelp-query+transcludedin-example-generator": "קבלת מידע על הדפים שמכלילים את Main Page.", - "apihelp-query+usercontribs-description": "קבלת כל העריכות של המשתמש.", + "apihelp-query+usercontribs-summary": "קבלת כל העריכות של המשתמש.", "apihelp-query+usercontribs-param-limit": "המספר המרבי של התרומות להחזיר.", "apihelp-query+usercontribs-param-start": "באיזה חותם־הזמן להתחיל.", "apihelp-query+usercontribs-param-end": "באיזה חותם־הזמן לסיים", @@ -1138,12 +1174,12 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "הוספת הדגלים של העריכה.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "מתייג עריכות בדוקות.", "apihelp-query+usercontribs-paramvalue-prop-tags": "רשימת תגים עבור עריכות.", - "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר $2show=patrolled או $2show=!patrolled, גרסאות ישנות מ־[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.", + "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר $2show=patrolled או $2show=!patrolled, גרסאות ישנות מ־[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.", "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.", "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.", "apihelp-query+usercontribs-example-user": "הצגת התרומות של המשתמש Example.", "apihelp-query+usercontribs-example-ipprefix": "הצגת תרומות מכל כתובות ה־IP שמתחילות ב־192.0.2..", - "apihelp-query+userinfo-description": "קבלת מידע על המשתמש הנוכחי.", + "apihelp-query+userinfo-summary": "קבלת מידע על המשתמש הנוכחי.", "apihelp-query+userinfo-param-prop": "אילו חלקי מידע לכלול:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "מתייג אם המשתמש הנוכחי נחסם, על־ידי מי ומאיזו סיבה.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "הוספת התג messages אם למשתמש הנוכחי יש הודעות ממתינות.", @@ -1153,7 +1189,7 @@ "apihelp-query+userinfo-paramvalue-prop-rights": "רשימת כל ההרשאות שיש למשתמש הזה.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "רשימת הקבוצות שהמשתמש הנוכחי יכול להוסיף אליהן ולגרוע מהן.", "apihelp-query+userinfo-paramvalue-prop-options": "רשימת כל ההעדפות שהמשתמש הנוכחי הגדיר.", - "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "מיושן. קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "קבלת אסימון לשינוי ההעדפות של המשתמש הנוכחי.", "apihelp-query+userinfo-paramvalue-prop-editcount": "הוספת מניין העריכות של המשתמש הנוכחי.", "apihelp-query+userinfo-paramvalue-prop-ratelimits": "רשימת כל מגבלות הקצב שחלות על המשתמש הנוכחי.", "apihelp-query+userinfo-paramvalue-prop-realname": "הוספת השם האמתי של המשתמש.", @@ -1165,7 +1201,7 @@ "apihelp-query+userinfo-param-attachedwiki": "עם $1prop=centralids, לציין האם המשתמש משויך לוויקי עם המזהה הזה.", "apihelp-query+userinfo-example-simple": "קבלת מידע על המשתמש הנוכחי.", "apihelp-query+userinfo-example-data": "קבלת מידע נוסף על המשתמש הנוכחי.", - "apihelp-query+users-description": "קבלת מידע על רשימת משתמשים.", + "apihelp-query+users-summary": "קבלת מידע על רשימת משתמשים.", "apihelp-query+users-param-prop": "אילו חלקי מידע לקבל:", "apihelp-query+users-paramvalue-prop-blockinfo": "מתייג אם המשתמש חסום, על־ידי מי, ומאיזו סיבה.", "apihelp-query+users-paramvalue-prop-groups": "רשימת כל הקבוצות שהמשתמש שייך אליהן.", @@ -1183,7 +1219,7 @@ "apihelp-query+users-param-userids": "רשימת מזהי משתמש שעבורם יתקבל המידע.", "apihelp-query+users-param-token": "יש להשתמש ב־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] במקום.", "apihelp-query+users-example-simple": "החזרת מידע עבור המשתמש Example.", - "apihelp-query+watchlist-description": "קבלת שינויים אחרונים לדפים ברשימת המעקב של המשתמש הנוכחי.", + "apihelp-query+watchlist-summary": "קבלת שינויים אחרונים לדפים ברשימת המעקב של המשתמש הנוכחי.", "apihelp-query+watchlist-param-allrev": "לכלול גרסאות מרובות של אותו הדף בתוך מסגרת הזמן הנתונה.", "apihelp-query+watchlist-param-start": "מאיזה חותם־זמן להתחיל למנות.", "apihelp-query+watchlist-param-end": "באיזה חותם זמן להפסיק לרשום.", @@ -1219,7 +1255,7 @@ "apihelp-query+watchlist-example-generator": "אחזור מידע על הדף עבור דפים שהשתנו לאחרונה ברשימת המעקב של המשתמש הנוכחי.", "apihelp-query+watchlist-example-generator-rev": "אחזור מידע על הגרסה עבור דפים שהשתנו לאחרונה ברשימת המעקב של המשתמש הנוכחי.", "apihelp-query+watchlist-example-wlowner": "לרשום את הגרסה האחרונה עבור דפים שהשתנו לאחרונה ברשימת המעקב של משתמש Example.", - "apihelp-query+watchlistraw-description": "קבלת כל הדפים ברשימת המעקב של המשתמש הנוכחי.", + "apihelp-query+watchlistraw-summary": "קבלת כל הדפים ברשימת המעקב של המשתמש הנוכחי.", "apihelp-query+watchlistraw-param-namespace": "לרשום רק דפים במרחב השם הנתון.", "apihelp-query+watchlistraw-param-limit": "כמה תוצאות סך הכול להחזיר בכל בקשה.", "apihelp-query+watchlistraw-param-prop": "אילו מאפיינים נוספים לקבל:", @@ -1232,15 +1268,15 @@ "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.", "apihelp-query+watchlistraw-example-simple": "לרשום דפים ברשימת המעקב של המשתמש הנוכחי.", "apihelp-query+watchlistraw-example-generator": "אחזור מידע על הדפים עבור דפים ברשימת המעקב של המשתמש הנוכחי.", - "apihelp-removeauthenticationdata-description": "הסרת נתוני אימות עבור המשתמש הנוכחי.", + "apihelp-removeauthenticationdata-summary": "הסרת נתוני אימות עבור המשתמש הנוכחי.", "apihelp-removeauthenticationdata-example-simple": "לנסות להסיר את נתוני המשתמש הנוכחי בשביל FooAuthenticationRequest.", - "apihelp-resetpassword-description": "שליחת דוא\"ל איפוס סיסמה למשתמש.", - "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", + "apihelp-resetpassword-summary": "שליחת דוא\"ל איפוס סיסמה למשתמש.", + "apihelp-resetpassword-extended-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", "apihelp-resetpassword-param-user": "המשתמש שמאופס.", "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.", "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש Example.", "apihelp-resetpassword-example-email": "שליחת מכתב איפוס ססמה לכל המשתמשים שהכתובת שלהם היא user@example.com.", - "apihelp-revisiondelete-description": "מחיקה ושחזור ממחיקה של גרסאות.", + "apihelp-revisiondelete-summary": "מחיקה ושחזור ממחיקה של גרסאות.", "apihelp-revisiondelete-param-type": "סוג מחיקת הגרסה שמתבצע.", "apihelp-revisiondelete-param-target": "שם הדף למחיקת גרסה, אם זה נחוץ לסוג.", "apihelp-revisiondelete-param-ids": "מזהים של הגרסה שתימחק.", @@ -1251,7 +1287,8 @@ "apihelp-revisiondelete-param-tags": "אילו תגים להחיל על העיול ביומן המחיקה.", "apihelp-revisiondelete-example-revision": "הסתרת התוכן של הגרסה 12345 בדף Main Page.", "apihelp-revisiondelete-example-log": "הסתרת כל הנתונים על רשומת היומן 67890 עם הסיבה BLP violation.", - "apihelp-rollback-description": "ביטול העריכה האחרונה לדף.\n\nאם המשמש האחרון שערך את הדף עשה מספר עריכות זו אחר זו, הן תשוחזרנה.", + "apihelp-rollback-summary": "ביטול העריכה האחרונה לדף.", + "apihelp-rollback-extended-description": "אם המשמש האחרון שערך את הדף עשה מספר עריכות זו אחר זו, הן תשוחזרנה.", "apihelp-rollback-param-title": "שם הדף לשחזור. לא יכול לשמש יחד עם $1pageid.", "apihelp-rollback-param-pageid": "מזהה הדף לשחזור. לא יכול לשמש יחד עם $1title.", "apihelp-rollback-param-tags": "אילו תגים להחיל על השחזור.", @@ -1261,9 +1298,10 @@ "apihelp-rollback-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.", "apihelp-rollback-example-simple": "שחזור העריכות האחרונות לדף Main Page על־ידי המשתמש Example.", "apihelp-rollback-example-summary": "שחזור העריכות האחרונות לדף Main Page מאת משתמש ה־IP‏ 192.0.2.5 עם התקציר Reverting vandalism וסימון של העריכות האלה ושל השחזור בתור עריכות בוט.", - "apihelp-rsd-description": "יצוא סכמת RSD‏ (Really Simple Discovery).", + "apihelp-rsd-summary": "יצוא סכמת RSD‏ (Really Simple Discovery).", "apihelp-rsd-example-simple": "יצוא סכמת ה־RSD.", - "apihelp-setnotificationtimestamp-description": "עדכון חותם־הזמן של ההודעה עבור דפים במעקב.\n\nזה משפיע על הדגשת הדפים שהשתנו ברשימת המעקב ובהיסטוריה, ושליחת דואר אלקטרוני כאשר ההעדפה \"{{int:tog-enotifwatchlistpages}}\" מופעלת.", + "apihelp-setnotificationtimestamp-summary": "עדכון חותם־הזמן של ההודעה עבור דפים במעקב.", + "apihelp-setnotificationtimestamp-extended-description": "זה משפיע על הדגשת הדפים שהשתנו ברשימת המעקב ובהיסטוריה, ושליחת דואר אלקטרוני כאשר ההעדפה \"{{int:tog-enotifwatchlistpages}}\" מופעלת.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "לעבוד על כל הדפים שבמעקב.", "apihelp-setnotificationtimestamp-param-timestamp": "חותם־הזמן להגדרת חותם־זמן של הודעה.", "apihelp-setnotificationtimestamp-param-torevid": "לאיזו גרסה להגדיר את חותם הזמן (רק דף אחד).", @@ -1272,8 +1310,8 @@ "apihelp-setnotificationtimestamp-example-page": "אתחול מצב ההודעה עבור Main Page.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־Main page כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.", "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם {{ns:user}}.", - "apihelp-setpagelanguage-description": "שנה את השפה של דף", - "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] על מנת להשתמש בפעולה זו", + "apihelp-setpagelanguage-summary": "שנה את השפה של דף", + "apihelp-setpagelanguage-extended-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] על מנת להשתמש בפעולה זו", "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם $1pageid.", "apihelp-setpagelanguage-param-pageid": "מזהה הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם $1title.", "apihelp-setpagelanguage-param-lang": "קוד השפה של השפה שאליה צריך לשנות את הדף. יש להשתמש ב־default כדי לאתחל את הדף לשפת בררת המחדל של הוויקי.", @@ -1281,7 +1319,8 @@ "apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.", "apihelp-setpagelanguage-example-language": "שינוי השפה של Main Page לבסקית.", "apihelp-setpagelanguage-example-default": "שינוי השפה של הדף בעל המזהה 123 לשפה הרגילה של הוויקי.", - "apihelp-stashedit-description": "הכנת עריכה במטמון משותף.\n\nזה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.", + "apihelp-stashedit-summary": "הכנת עריכה במטמון משותף.", + "apihelp-stashedit-extended-description": "זה מיועד לשימוש דרך AJAX מתוך ערך כדי לשפר את הביצועים של שמירת הדף.", "apihelp-stashedit-param-title": "כותרת הדף הנערך.", "apihelp-stashedit-param-section": "מספר הפסקה. 0 עבור הפסקה הראשונה, new עבור פסקה חדשה.", "apihelp-stashedit-param-sectiontitle": "כותרת הפסקה החדשה.", @@ -1291,7 +1330,7 @@ "apihelp-stashedit-param-contentformat": "תסדיר הסדרת תוכן עבור טקסט הקלט.", "apihelp-stashedit-param-baserevid": "מזהה גסה של גרסת הבסיס.", "apihelp-stashedit-param-summary": "לשנות תקציר.", - "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.", + "apihelp-tag-summary": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.", "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.", "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.", "apihelp-tag-param-logid": "מזהה רשומת יומן אחת או יותר שתג יתווסף אליה או יוסר ממנה.", @@ -1301,11 +1340,12 @@ "apihelp-tag-param-tags": "אילו תגים להחיל על רשומת היומן שתיווצר כתוצאה מהפעולה הזאת.", "apihelp-tag-example-rev": "הוספת התג vandalism לגרסה עם המזהה 123 בלי לציין סיבה", "apihelp-tag-example-log": "הסרת התג spam מעיול עם המזהה 123 עם הסיבה Wrongly applied", - "apihelp-tokens-description": "קבלת אסימונים לפעולות שמשנות נתונים.\n\nהיחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-summary": "קבלת אסימונים לפעולות שמשנות נתונים.", + "apihelp-tokens-extended-description": "היחידה הזאת הוכרזה בתור מיושנת לטובת [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-tokens-param-type": "סוגי האסימונים לבקש.", "apihelp-tokens-example-edit": "אחזור אסימון עריכה (בררת המחדל).", "apihelp-tokens-example-emailmove": "אחזור אסימון דוא\"ל ואסימון העברה.", - "apihelp-unblock-description": "שחרור משתמש מחסימה.", + "apihelp-unblock-summary": "שחרור משתמש מחסימה.", "apihelp-unblock-param-id": "מזהה החסימה לשחרור (מתקבל דרך list=blocks). לא יכול לשמש יחד עם $1user או $1userid.", "apihelp-unblock-param-user": "שם משתמש, כתובת IP או טווח כתובות IP לחסימה. לא יכול לשמש יחד עם $1id או $1userid.", "apihelp-unblock-param-userid": "מזהה המשתמש שישוחרר מחסימה. לא יכול לשמש יחד עם $1id או $1user.", @@ -1313,7 +1353,8 @@ "apihelp-unblock-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.", "apihelp-unblock-example-id": "לשחרר את החסימה עם מזהה #105.", "apihelp-unblock-example-user": "לשחרר את החסימה של המשתמש Bob עם הסיבה Sorry Bob.", - "apihelp-undelete-description": "שחזור גרסאות של דף מחוק.\n\nאפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "שחזור גרסאות של דף מחוק.", + "apihelp-undelete-extended-description": "אפשר לאחזר רשימת גרסאות מחוקות (כולל חותמי־זמן) דרך [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], ואפשר לאחזר רשימת מזהי קבצים מחוקים דרך [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "שם הדף לשחזור ממחיקה.", "apihelp-undelete-param-reason": "סיבה לשחזור.", "apihelp-undelete-param-tags": "תגי שינוי שיחולו על העיול ביומן המחיקה.", @@ -1322,9 +1363,10 @@ "apihelp-undelete-param-watchlist": "הוספה או הסרה של הדף ללא תנאי מרשימת המעקב של המשתמש הנוכחי, להשתמש בהעדפות או לא לשנות את המעקב.", "apihelp-undelete-example-page": "שחזור ממחיקה של הדף Main Page.", "apihelp-undelete-example-revisions": "שחזור שתי גרסאות של הדף Main Page.", - "apihelp-unlinkaccount-description": "ביטול קישור של חשבון צד־שלישי מהמשתמש הנוכחי.", + "apihelp-unlinkaccount-summary": "ביטול קישור של חשבון צד־שלישי מהמשתמש הנוכחי.", "apihelp-unlinkaccount-example-simple": "לנסות להסיר את הקישור של המשתמש הנוכחי לספק המשויך עם FooAuthenticationRequest.", - "apihelp-upload-description": "העלאת קובץ, או קבלת מצב ההעלאות הממתינות.\n\nיש מספר שיטות:\n* להעלות את הקובץ ישירות, באמצעות הפרמטר $1file.\n* להעלות את הקובץ בחלקים, באמצעות הפרמטרים $1filesize‏, $1chunk ו־$1offset.\n* לגרום לשרת מדיה־ויקי לאחזר את הקובץ מ־URL באמצעות הפרמטר $1url.\n* להשלים העלאה קודמת שנכשלה בשל אזהרות באמצעות הפרמטר $1filekey.\nלתשומך לבך, יש לעשות את HTTP POST בתור העלאת קובץ (כלומר באמצעות multipart/form-data) בעת שליחת ה־$1file.", + "apihelp-upload-summary": "העלאת קובץ, או קבלת מצב ההעלאות הממתינות.", + "apihelp-upload-extended-description": "יש מספר שיטות:\n* להעלות את הקובץ ישירות, באמצעות הפרמטר $1file.\n* להעלות את הקובץ בחלקים, באמצעות הפרמטרים $1filesize‏, $1chunk ו־$1offset.\n* לגרום לשרת מדיה־ויקי לאחזר את הקובץ מ־URL באמצעות הפרמטר $1url.\n* להשלים העלאה קודמת שנכשלה בשל אזהרות באמצעות הפרמטר $1filekey.\nלתשומך לבך, יש לעשות את HTTP POST בתור העלאת קובץ (כלומר באמצעות multipart/form-data) בעת שליחת ה־$1file.", "apihelp-upload-param-filename": "שם קובץ היעד.", "apihelp-upload-param-comment": "הערת העלאה. משמש גם בתור טקסט הדף ההתחלתי עבור קבצים חדשים אם $1text אינו מצוין.", "apihelp-upload-param-tags": "שינוי תגים להחלה לרשומות ההעלאה ולגרסאות דף הקובץ.", @@ -1344,7 +1386,7 @@ "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.", "apihelp-upload-example-url": "להעלות מ־URL.", "apihelp-upload-example-filekey": "להשלים העלאה שנכשלה בשל אזהרות.", - "apihelp-userrights-description": "שינוי חברות בקבוצות של המשתמש.", + "apihelp-userrights-summary": "שינוי חברות בקבוצות של המשתמש.", "apihelp-userrights-param-user": "שם משתמש.", "apihelp-userrights-param-userid": "מזהה משתמש.", "apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.", @@ -1355,14 +1397,15 @@ "apihelp-userrights-example-user": "הוספת המשתמש FooBot לקבוצה bot והסרתו מהקבוצות sysop ו־bureaucrat.", "apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה 123 לקבוצה bot והסרתו מהקבוצות sysop ו־bureaucrat.", "apihelp-userrights-example-expiry": "להוסיף את SometimeSysop לקבוצה sysop לחודש אחד.", - "apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־Good אם הססמה קבילה, Change אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או Invalid אם הססמה אינה שמישה.", + "apihelp-validatepassword-summary": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.", + "apihelp-validatepassword-extended-description": "התקינות מדווחת כ־Good אם הססמה קבילה, Change אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או Invalid אם הססמה אינה שמישה.", "apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.", "apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.", "apihelp-validatepassword-param-email": "כתובת הדוא\"ל, לשימוש בעת בדיקת יצירת חשבון.", "apihelp-validatepassword-param-realname": "שם אמתי, לשימוש בעת בדיקת יצירת חשבון.", "apihelp-validatepassword-example-1": "לבדוק את תקינות הססמה foobar עבור המשתמש הנוכחי.", "apihelp-validatepassword-example-2": "לבדוק את תקינות הססמה qwerty ליצירת החשבון Example.", - "apihelp-watch-description": "להוסיף דפים לרשימת המעקב של המשתמש הנוכחי או הסרתם ממנה.", + "apihelp-watch-summary": "להוסיף דפים לרשימת המעקב של המשתמש הנוכחי או הסרתם ממנה.", "apihelp-watch-param-title": "הדף להוסיף לרשימת המעקב או להסיר ממנה. יש להשתמש במקום זאת ב־$1titles.", "apihelp-watch-param-unwatch": "אם זה מוגדר, הדף יהיה לא במעקב במקום להיות במעקב.", "apihelp-watch-example-watch": "לעקוב אחרי הדף Main Page.", @@ -1370,25 +1413,30 @@ "apihelp-watch-example-generator": "לעקוב אחרי הדפים הראשונים במרחב הראשי.", "apihelp-format-example-generic": "להחזיר את תוצאות השאילתה בתסדיר $1.", "apihelp-format-param-wrappedhtml": "החזרת HTML מעוצב ומודולי ResourceLoader משויכים בתור עצם JSON.", - "apihelp-json-description": "לפלוט נתונים בתסדיר JSON.", + "apihelp-json-summary": "לפלוט נתונים בתסדיר JSON.", "apihelp-json-param-callback": "אם זה צוין, עוטף את הפלט לתוך קריאת פונקציה נתונה. למען הבטיחות, כל הנתונים הייחודיים למשתמש יוגבלו.", "apihelp-json-param-utf8": "אם זה צוין, רוב התווים שאינם ASCII (אבל לא כולם) יקודדו בתור UTF-8 במקום להתחלף בסדרות חילוף הקסדצימליות. זאת בררת המחדל אם הערך של formatversion הוא לא 1.", "apihelp-json-param-ascii": "אם זה צוין, לקודד את כל מה שאינו ASCII בסדרות חילוף הקסדצימליות. זאת בררת המחדל כש־formatversion היא 1.", "apihelp-json-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות * לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע 2), יכול להשתנות ללא התראה.", - "apihelp-jsonfm-description": "לפלוט נתונים בתסדיר JSON (עם הדפסה יפה ב־HTML).", - "apihelp-none-description": "לא לפלוט שום דבר.", - "apihelp-php-description": "לפלוט נתונים בתסדיר PHP מוסדר.", + "apihelp-jsonfm-summary": "לפלוט נתונים בתסדיר JSON (עם הדפסה יפה ב־HTML).", + "apihelp-none-summary": "לא לפלוט שום דבר.", + "apihelp-php-summary": "לפלוט נתונים בתסדיר PHP מוסדר.", "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות * לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע 2), יכול להשתנות ללא התראה.", - "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).", - "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).", - "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.", + "apihelp-phpfm-summary": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).", + "apihelp-rawfm-summary": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).", + "apihelp-xml-summary": "לפלוט נתונים בתסדיר XML.", "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:MediaWiki}} במרחב שם המשתמש, המסתיים ב- .xsl.", "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.", - "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).", + "apihelp-xmlfm-summary": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).", "api-format-title": "תוצאה של API של מדיה־ויקי", - "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", - "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", + "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", + "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", + "api-format-prettyprint-header-hyperlinked": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש להגדיר [$3 format=$2].\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", "api-format-prettyprint-status": "התשובה הזאת הייתה מוחזרת עם סטטוס ה־HTTP מס' $1 עם הטקסט $2.", + "api-login-fail-aborted": "אימות דורש הידוד עם המשתמש, שאינו נתמך ב־action=login. כדי שיהיה אפשר להיכנס לחשבון עם action=login, נא לראות את [[Special:BotPasswords]]. כדי להמשיך להשתמש בכניסה עם חשבון ראשי, ר' [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "אימות דורש הידוד עם המשתמש, שאינו נתמך ב־action=login. כדי להיכנס לחשבון, ר' [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "לא ניתן להיכנס לחשבון באמצעות $1.", + "api-login-fail-sameorigin": "לא ניתן להיכנס לחשבון כאשר מדיניות מקור זהה אינה חלה.", "api-pageset-param-titles": "רשימת כותרות.", "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.", "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.", @@ -1399,6 +1447,7 @@ "api-help-title": "עזרה של MediaWiki API", "api-help-lead": "זהו דף תיעוד של API שנוצר באופן אוטומטי.\n\nתיעוד ודוגמאות: https://www.mediawiki.org/wiki/API", "api-help-main-header": "יחידה ראשית", + "api-help-undocumented-module": "אין תיעוד למודול $1.", "api-help-flag-deprecated": "יחידה זו אינה מומלצת לשימוש.", "api-help-flag-internal": "היחידה הזאת היא פנימית או בלתי־יציבה. הפעולה שלה יכולה להשתנות ללא הודעה מוקדמת.", "api-help-flag-readrights": "יחידה זו דורשת הרשאות קריאה.", @@ -1435,8 +1484,8 @@ "api-help-param-default-empty": "ברירת מחדל: (ריק)", "api-help-param-token": "אסימון \"$1\" שאוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.", - "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]].", - "api-help-param-limited-in-miser-mode": "לתשומת לבך: בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.", + "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]].", + "api-help-param-limited-in-miser-mode": "לתשומת לבך: בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.", "api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.", "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.", "api-help-param-no-description": "(ללא תיאור)", @@ -1501,7 +1550,8 @@ "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.", "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.", "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.", - "apierror-compare-inputneeded": "כותרת, מזהה דף, או מספר גרסה נחוצים בשביל הפרמטרים from ו־to.", + "apierror-compare-no-title": "לא ניתן לעשות התמרה לפני שמירה ללא כותרת. נא לנסות לציין fromtitle או totitle.", + "apierror-compare-relative-to-nothing": "אין גרסת \"from\" עבור torelative שתהיה יחסית.", "apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1", "apierror-contenttoobig": "התוכן שסיפקת חורג מגודל הערך המרבי של {{PLURAL:$1|קילובייט אחד|$1 קילובייטים}}.", "apierror-copyuploadbaddomain": "העלאות לפי URL אינם מורשות מהמתחם הזה.", @@ -1545,10 +1595,12 @@ "apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.", "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.", "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.", + "apierror-missingcontent-revid": "תוכן חסר עבור מזהה הגרסה $1.", "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.", "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.", "apierror-missingparam": "הפרמטר $1 צריך להיות מוגדר.", "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.", + "apierror-missingrev-title": "אין גרסה נוכחית לכותרת $1.", "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם create.", "apierror-missingtitle": "הדף שנתת אינו קיים.", "apierror-missingtitle-byname": "הדף $1 אינו קיים.", @@ -1582,6 +1634,7 @@ "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.", "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.", "apierror-nouploadmodule": "לא הוגדר מודול העלאה.", + "apierror-offline": "לא היה אפשר להמשיך בשל בעיות חיבור רשת. נא לוודא שיש לך חיבור אינטרנט פועל ולנסות שוב.", "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.", "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.", "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.", @@ -1606,6 +1659,7 @@ "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם hide ועם show.", "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.", "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל hide או show.", + "apierror-revisions-badid": "לא נמצאה גרסה לפרמטר $1.", "apierror-revisions-norevids": "הפרמטר revids אינו יכול לשמש עם אפשרויות הרשימה ($1limit‏, $1startid‏, $1endid‏, $1dir=newer‏, $1user‏, $1excludeuser‏, $1start, ו־$1end).", "apierror-revisions-singlepage": "titles‏, pageids או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים $1limit‏, $1startid‏, $1endid‏, $1dir=newer‏, $1user‏, $1excludeuser‏, $1start, ו־$1end יכולים לשמש רק בדף בודד.", "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.", @@ -1630,6 +1684,7 @@ "apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.", "apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.", "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.", + "apierror-timeout": "השרת לא השיב בזמן המצופה.", "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.", "apierror-unknownaction": "הפעולה שניתנה, $1, אינה מוכרת.", "apierror-unknownerror-editpage": "שגיאת EditPage בלתי־ידועה: $1.", @@ -1649,6 +1704,7 @@ "apiwarn-badurlparam": "לא היה אפשר לפענח את $1urlparam עבור $2. משתמשים רק ב־width ו־height.", "apiwarn-badutf8": "הערך הערך שהועבר ל־$1 מכיל נתונים בלתי־תקינים או בלתי־מנורמלים. נתונים טקסט אמורים להיות תקינים, מנורמלי NFC ללא תווי בקרה C0 למעט HT (\\t)‏, LF (\\n), ו־CR (\\r).", "apiwarn-checktoken-percentencoding": "נא לבדוק שסימנים כמו \"+\" באסימון מקודדים עם אחוזים בצורה נכונה ב־URL.", + "apiwarn-compare-nocontentmodel": "לא היה אפשר לקבוע את מודל התוכן, נניח שזה $1.", "apiwarn-deprecation-deletedrevs": "list=deletedrevs הוצהר בתור מיושן. נא להשתמש ב־ prop=deletedrevisions או ב־list=alldeletedrevisions במקום זה.", "apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר prop, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר prop, כך שתמיד ישמש התסדיר החדש.", "apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.", diff --git a/includes/api/i18n/hr.json b/includes/api/i18n/hr.json index 5f46e73223..2273ee9d29 100644 --- a/includes/api/i18n/hr.json +++ b/includes/api/i18n/hr.json @@ -4,6 +4,6 @@ "Ex13" ] }, - "apihelp-block-description": "Blokiraj suradnika.", + "apihelp-block-summary": "Blokiraj suradnika.", "apihelp-block-param-user": "Suradničko ime, IP adresa ili opseg koje želite blokirati." } diff --git a/includes/api/i18n/hu.json b/includes/api/i18n/hu.json index 232386e3d2..813fb7c6ef 100644 --- a/includes/api/i18n/hu.json +++ b/includes/api/i18n/hu.json @@ -10,58 +10,1128 @@ "Dj" ] }, + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentáció]]\n* [[mw:Special:MyLanguage/API:FAQ|GYIK]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Levelezőlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-bejelentések]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Hibabejelentések és kérések]\n
    \nStátusz: Minden ezen a lapon látható funkciónak működnie kell, de az API jelenleg is aktív fejlesztés alatt áll, és bármikor változhat. Iratkozz fel a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce levelezőlistára] a frissítések követéséhez.\n\nHibás kérések: Ha az API hibás kérést kap, egy HTTP-fejlécet küld vissza „MediaWiki-API-Error” kulccsal, és a fejléc értéke és a visszaküldött hibakód ugyanarra az értékre lesz állítva. További információért lásd: [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Hibák és figyelmeztetések]].\n\nTesztelés: Az API-kérések könnyebb teszteléséhez használható az [[Special:ApiSandbox|API-homokozó]].", "apihelp-main-param-action": "Milyen műveletet hajtson végre.", "apihelp-main-param-format": "A kimenet formátuma.", + "apihelp-main-param-smaxage": "Az s-maxage gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.", + "apihelp-main-param-maxage": "Az maxage gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.", + "apihelp-main-param-assert": "Annak ellenőrzése, hogy a felhasználó be van-e jelentkezve user érték esetén, vagy botjog ellenőrzése bot érték esetén.", + "apihelp-main-param-assertuser": "Annak ellenőrzése, hogy a jelenlegi felhasználó a megadott-e.", "apihelp-main-param-requestid": "Az itt megadott bármilyen érték szerepelni fog a válaszban. Több kérés megkülönböztetésére használható.", "apihelp-main-param-servedby": "Tartalmazza a válasz kérést kiszolgáló gép nevét.", "apihelp-main-param-curtimestamp": "Tartalmazza a válasz az aktuális időbélyeget.", - "apihelp-block-description": "Szerkesztő blokkolása", - "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány.", + "apihelp-main-param-responselanginfo": "A válasz tartalmazza uselang és errorlang paraméterekben használt nyelveket.", + "apihelp-main-param-uselang": "Az üzenetfordításokhoz használandó nyelv. A [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] a siprop=languages paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy user az aktuális felhasználó, illetve content a wiki nyelvbeállításához.", + "apihelp-main-param-errorformat": "A figyelmeztetések és hibaüzenetek formátuma.\n; plaintext: Wikiszöveg eltávolított HTML-címkékkel és a HTML-entitások (pl. &amp;) kicserélésével.\n; wikitext: Feldolgozatlan wikiszöveg.\n; html: HTML.\n; raw: Az üzenet azonosítója és paraméterei.\n; none: Szöveges kimenet mellőzése, csak hibakódok.\n; bc: A MediaWiki 1.29 előtti formátum. A errorlang és erroruselocal paraméterek figyelmen kívül lesznek hagyva.", + "apihelp-main-param-errorlang": "A figyelmeztetésekhez és hibaüzenetekhez használandó nyelv. A [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] a siprop=languages paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy content a wiki nyelvbeállításához, illetve uselang a uselang paraméter értékéhez.", + "apihelp-main-param-errorsuselocal": "Ha meg van adva, a hibaüzenetek a helyileg testreszabott üzeneteket fogják használni a {{ns:MediaWiki}} névtérből.", + "apihelp-block-summary": "Szerkesztő blokkolása", + "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány. Nem használható együtt a $1userid paraméterrel.", + "apihelp-block-param-userid": "A blokkolandó felhasználó numerikus azonosítója. Nem használható a $1user paraméterrel együtt.", "apihelp-block-param-expiry": "Lejárat ideje. Lehet relatív (pl. 5 months, 2 weeks) vagy abszolút (pl. 2014-09-18T12:34:56Z). Ha infinite-re, indefinite-re vagy never-re állítod, a blokk soha nem fog lejárni.", "apihelp-block-param-reason": "Blokkolás oka.", + "apihelp-block-param-anononly": "Csak anonim felhasználók blokkolása (anonim szerkesztések megakadályozása erről az IP-címről).", "apihelp-block-param-nocreate": "Új regisztráció megakadályozása", + "apihelp-block-param-autoblock": "Az utoljára használt IP-cím blokkolása, valamint bármilyen további IP-cím, amiről a felhasználó megpróbál bejelentkezni.", + "apihelp-block-param-noemail": "A wiki e-mail-küldő rendszerének letiltása a felhasználó számára (blockemail jogosultság szükséges hozzá).", + "apihelp-block-param-hidename": "A felhasználónév elrejtése a blokknaplóból (hideuser jog szükséges hozzá).", + "apihelp-block-param-allowusertalk": "A felhasználó szerkeszthesse a saját vitalapját (a [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]] beállítástól függ).", + "apihelp-block-param-reblock": "Jelenlegi blokk felülírása, ha a felhasználó már blokkolva van.", "apihelp-block-param-watchuser": "A szerkesztő vagy IP-cím szerkesztői- és vitalapjának figyelése.", + "apihelp-block-example-ip-simple": "A 192.0.2.5 IP-cím blokkolása három napra First strike indoklással.", + "apihelp-block-example-user-complex": "Vandal blokkolása határozatlan időre Vandalism indoklással, új fiók létrehozásának és e-mail küldésének megakadályozása.", + "apihelp-checktoken-summary": "Egy [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] kéréssel szerzett token érvényességének vizsgálata.", + "apihelp-checktoken-param-type": "A tesztelendő token típusa.", + "apihelp-checktoken-param-token": "A tesztelendő token.", + "apihelp-checktoken-param-maxtokenage": "A token megengedett legnagyobb kora másodpercekben.", + "apihelp-checktoken-example-simple": "Egy csrf token érvényességének vizsgálata.", + "apihelp-clearhasmsg-summary": "A hasmsg jelzés törlése az aktuális felhasználónak.", + "apihelp-clearhasmsg-example-1": "A hasmsg jelzés törlése az aktuális felhasználónak.", + "apihelp-clientlogin-example-login": "A bejelentkezési folyamat elkezdése Example felhasználónévvel és ExamplePassword jelszóval.", + "apihelp-clientlogin-example-login2": "A bejelentkezés folytatása UI válasz után a kétlépcsős azonosításra, az OATHToken paraméternek 987654 értéket megadva.", + "apihelp-compare-summary": "Két lap közötti különbség kiszámítása.", + "apihelp-compare-extended-description": "Mindkét laphoz kötelező megadni egy lapváltozat-azonosítót, címet vagy lapazonosítót.", + "apihelp-compare-param-fromtitle": "Az első összehasonlítandó lap címe.", + "apihelp-compare-param-fromid": "Az első összehasonlítandó lap lapazonosítója.", + "apihelp-compare-param-fromrev": "Az első összehasonlítandó lapváltozat azonosítója.", + "apihelp-compare-param-totitle": "A második összehasonlítandó lap címe.", + "apihelp-compare-param-toid": "A második összehasonlítandó lap lapazonosítója.", + "apihelp-compare-param-torev": "A második összehasonlítandó lapváltozat azonosítója.", + "apihelp-compare-example-1": "Az 1-es és 2-es lapváltozat összehasonlítása.", + "apihelp-createaccount-summary": "Új felhasználói fiók létrehozása.", + "apihelp-createaccount-example-create": "Example felhasználói fiók létrehozásának elkezdése ExamplePassword jelszóval.", "apihelp-createaccount-param-name": "Felhasználónév.", + "apihelp-createaccount-param-password": "Jelszó (figyelmen kívül hagyva, ha a $1mailpassword be van állítva).", + "apihelp-createaccount-param-domain": "Tartomány külső hitelesítéshez (opcionális).", + "apihelp-createaccount-param-token": "Felhasználólétrehozási token az első kérésből", "apihelp-createaccount-param-email": "A szerkesztő e-mail-címe (nem kötelező).", "apihelp-createaccount-param-realname": "A szerkesztő valódi neve (nem kötelező).", - "apihelp-delete-description": "Lap törlése.", + "apihelp-createaccount-param-mailpassword": "Ha bármilyen értéket kap, egy véletlenszerű jelszót kap a felhasználó e-mailben.", + "apihelp-createaccount-param-reason": "Opcionális indoklás a fióklétrehozáshoz a naplókba.", + "apihelp-createaccount-param-language": "A felhasználó alapértelmezett nyelvkódja (opcionális, alapértelmezetten a tartalom nyelve).", + "apihelp-createaccount-example-pass": "testuser felhasználó létrehozása test123 jelszóval.", + "apihelp-createaccount-example-mail": "testmailuser felhasználó létrehozása, véletlenszerű jelszó elküldése e-mailben.", + "apihelp-delete-summary": "Lap törlése.", + "apihelp-delete-param-title": "A törlendő lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-delete-param-pageid": "A törlendő lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-delete-param-reason": "A törlés indoka. Ha nincs beállítva, automatikusan generált indoklás helyettesíti.", + "apihelp-delete-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.", + "apihelp-delete-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", "apihelp-delete-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.", + "apihelp-delete-param-oldimage": "A törlendő régi kép neve az [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] által adott formátumban.", "apihelp-delete-example-simple": "Main Page törlése.", - "apihelp-disabled-description": "Ez a modul le lett tiltva.", - "apihelp-edit-description": "Lapok létrehozása és szerkesztése.", + "apihelp-delete-example-reason": "Main Page törlése Preparing for move indoklással.", + "apihelp-disabled-summary": "Ez a modul le lett tiltva.", + "apihelp-edit-summary": "Lapok létrehozása és szerkesztése.", + "apihelp-edit-param-title": "A szerkesztendő lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-edit-param-pageid": "A szerkesztendő lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-edit-param-section": "A szerkesztendő szakasz száma. 0 a bevezetőhöz, new új szakaszhoz.", "apihelp-edit-param-sectiontitle": "Az új szakasz címe.", + "apihelp-edit-param-text": "A lap tartalma.", + "apihelp-edit-param-summary": "Szerkesztési összefoglaló. A szakasz címe is, ha $1section=new és a $1sectiontitle paraméter nincs beállítva.", "apihelp-edit-param-minor": "Apró változtatás.", + "apihelp-edit-param-notminor": "Nem apró változtatás.", "apihelp-edit-param-bot": "Szerkesztés megjelölése botszerkesztésként.", + "apihelp-edit-param-basetimestamp": "Az alapváltozat időbélyege, a szerkesztési ütközések felismerésére szolgál. Az [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]] kéréssel szerezhető meg.", + "apihelp-edit-param-starttimestamp": "A szerkesztési folyamat kezdetének időbélyege, a szerkesztési ütközések felismerésére szolgál. Egy megfelelő érték lekérhető a [[Special:ApiHelp/main|curtimestamp]] paraméterrel a folyamat kezdetén (pl. a szerkesztendő lap tartalmának letöltésekor).", + "apihelp-edit-param-recreate": "Bármilyen hiba felülírása arról, hogy a lapot a szerkesztés közben törölték.", "apihelp-edit-param-createonly": "Ne szerkeszd a lapot, ha már létezik.", + "apihelp-edit-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.", + "apihelp-edit-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.", + "apihelp-edit-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", + "apihelp-edit-param-prependtext": "Ezen szöveg hozzáadása a lap elejére. Felülírja a $1text paramétert.", + "apihelp-edit-param-appendtext": "Ezen szöveg hozzáadása a lap végére. Felülírja a $1text paramétert.\n\nHasználd a $1section=new paramétert új szakasz hozzáadásához ezen paraméter helyett.", + "apihelp-edit-param-undo": "Ezen változat visszavonása. Felülírja a $1text, $1prependtext és $1appendtext paramétereket.", + "apihelp-edit-param-undoafter": "Minden változtatás visszavonása az $1undo paraméterben szereplőtől eddig. Ha nincs megadva, csak egy változtatás visszavonása.", + "apihelp-edit-param-redirect": "Átirányítások automatikus feloldása.", + "apihelp-edit-param-contentmodel": "Az új tartalom tartalommodellje.", + "apihelp-edit-param-token": "A tokennek mindig az utolsó paraméternek, vagy legalább a $1text után kell lennie.", "apihelp-edit-example-edit": "Lap szerkesztése", - "apihelp-emailuser-description": "E-mail küldése", + "apihelp-edit-example-prepend": "__NOTOC__ hozzáadása a lap elejére.", + "apihelp-edit-example-undo": "Az 13579–13585. változatok visszavonása automatikus szerkesztési összefoglalóval.", + "apihelp-emailuser-summary": "E-mail küldése", + "apihelp-emailuser-param-target": "Az e-mail címzettje.", + "apihelp-emailuser-param-subject": "A levél tárgya.", "apihelp-emailuser-param-text": "Szövegtörzs.", "apihelp-emailuser-param-ccme": "Másolat küldése magamnak.", + "apihelp-emailuser-example-email": "E-mail küldése WikiSysop felhasználónak Content szöveggel.", + "apihelp-expandtemplates-summary": "Minden sablon kibontása a wikiszövegben.", "apihelp-expandtemplates-param-title": "Lap címe.", + "apihelp-expandtemplates-param-text": "Az átalakítandó wikiszöveg.", + "apihelp-expandtemplates-param-revid": "Változatazonosító a {{REVISIONID}} és hasonló változók kibontásához.", + "apihelp-expandtemplates-param-prop": "A lekérendő információk.\n\nHa nincs megadva érték, a válasz tartalmazni fogja a wikiszöveget, de a kimenet elavult formátumú lesz.", + "apihelp-expandtemplates-paramvalue-prop-wikitext": "A kibontott wikiszöveg.", + "apihelp-expandtemplates-paramvalue-prop-categories": "Bármilyen, a bemenetben szereplő kategória, ami nem jelenik meg a wikiszöveges kimenetben.", + "apihelp-expandtemplates-paramvalue-prop-properties": "A wikiszövegben kibontott varázsszavak által meghatározott laptulajdonságok.", + "apihelp-expandtemplates-paramvalue-prop-ttl": "Maximális idő, ami után az eredmény gyorsítótárazása érvénytelenítendő.", + "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "A lapra vonatkozó JavaScript-változók.", + "apihelp-expandtemplates-param-includecomments": "A HTML-megjegyzések szerepeljenek-e a kimenetben.", + "apihelp-expandtemplates-example-simple": "A {{Project:Sandbox}} wikiszöveg kibontása.", + "apihelp-feedcontributions-summary": "Egy felhasználó közreműködéseinek lekérése hírcsatornaként.", + "apihelp-feedcontributions-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedcontributions-param-user": "A lekérendő felhasználók.", + "apihelp-feedcontributions-param-namespace": "A közreműködések szűrése ezen névtérre.", + "apihelp-feedcontributions-param-year": "Közreműködések lekérése eddig az évig.", + "apihelp-feedcontributions-param-month": "Közreműködések lekérése ennek a hónapnak a végéig.", + "apihelp-feedcontributions-param-tagfilter": "A közreműködések szűrése az ezen címkével ellátottakra.", + "apihelp-feedcontributions-param-deletedonly": "Csak a törölt szerkesztések lekérése.", + "apihelp-feedcontributions-param-toponly": "Csak a jelenleg utolsónak számító változtatások lekérése.", + "apihelp-feedcontributions-param-newonly": "Csak az új oldalt létrehozó szerkesztések lekérése.", + "apihelp-feedcontributions-param-hideminor": "Apró szerkesztések kihagyása.", + "apihelp-feedcontributions-param-showsizediff": "A változatok közötti méretkülönbség lekérése.", + "apihelp-feedcontributions-example-simple": "Example felhasználó közreműködéseinek lekérése.", + "apihelp-feedrecentchanges-summary": "A friss változtatások lekérése hírcsatornaként.", + "apihelp-feedrecentchanges-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedrecentchanges-param-namespace": "Az eredmények szűrése erre a névtérre.", + "apihelp-feedrecentchanges-param-invert": "Minden névtér a kiválasztott kivételével.", + "apihelp-feedrecentchanges-param-associated": "A kapcsolódó (vita- vagy tartalmi) névtér befoglalása.", + "apihelp-feedrecentchanges-param-days": "Az eredmények szűrése az elmúlt ennyi napra.", + "apihelp-feedrecentchanges-param-limit": "Találatok maximális száma.", + "apihelp-feedrecentchanges-param-from": "Szerkesztések megjelenítése ekkortól.", "apihelp-feedrecentchanges-param-hideminor": "Apró változtatások elrejtése.", "apihelp-feedrecentchanges-param-hidebots": "Botszerkesztések elrejtése.", + "apihelp-feedrecentchanges-param-hideanons": "Anonim felhasználók szerkesztéseinek elrejtése.", + "apihelp-feedrecentchanges-param-hideliu": "Bejelentkezett felhasználók szerkesztéseinek elrejtése.", "apihelp-feedrecentchanges-param-hidepatrolled": "Ellenőrzött változtatások elrejtése.", + "apihelp-feedrecentchanges-param-hidemyself": "A jelenlegi felhasználó szerkesztéseinek elrejtése.", + "apihelp-feedrecentchanges-param-hidecategorization": "Kategóriaváltoztatások elrejtése.", + "apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.", + "apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.", + "apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.", + "apihelp-feedwatchlist-summary": "A figyelőlista lekérése hírcsatornaként.", + "apihelp-feedwatchlist-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedwatchlist-param-hours": "Az utóbbi ennyi órában szerkesztett lapok listázása.", + "apihelp-feedwatchlist-param-linktosections": "Hivatkozás közvetlenül a módosított szakaszra, ha lehetséges.", + "apihelp-feedwatchlist-example-default": "A figyelőlista-hírcsatorna megjelenítése.", + "apihelp-feedwatchlist-example-all6hrs": "A figyelt lapok összes változtatásának megjelenítése az elmúlt 6 órában.", + "apihelp-filerevert-summary": "Egy fájl visszaállítása egy régebbi verzióra.", + "apihelp-filerevert-param-filename": "Célfájlnév, {{ns:6}}: (File:) előtag nélkül", + "apihelp-filerevert-param-comment": "Feltöltési összefoglaló.", + "apihelp-filerevert-param-archivename": "A visszaállítandó változat archív neve.", + "apihelp-filerevert-example-revert": "Wiki.png visszaállítása a 2011-03-05T15:27:40Z-kori változatra.", + "apihelp-help-summary": "Súgó megjelenítése a megadott modulokhoz.", + "apihelp-help-param-submodules": "Súgó megjelenítése a megadott modul almoduljaihoz is.", + "apihelp-help-param-recursivesubmodules": "Súgó megjelenítése az almodulokhoz rekurzívan.", + "apihelp-help-param-helpformat": "A súgó kimeneti formátuma.", + "apihelp-help-param-wrap": "Az eredmény visszaadása a szabványos API-válaszstruktúrában.", + "apihelp-help-param-toc": "A HTML-kimenet tartalmazzon egy tartalomjegyzéket.", + "apihelp-help-example-main": "Súgó megjelenítése a fő modulhoz.", + "apihelp-help-example-submodules": "Súgó az action=query modulhoz és összes almoduljához.", + "apihelp-help-example-recursive": "Minden súgó egy lapon.", + "apihelp-help-example-help": "Súgó magához a súgó modulhoz.", + "apihelp-help-example-query": "Súgó két lekérdező almodulhoz.", + "apihelp-imagerotate-summary": "Egy vagy több kép elforgatása.", + "apihelp-imagerotate-param-rotation": "A kép forgatása ennyi fokkal az óramutató járásával megegyező irányban.", + "apihelp-imagerotate-example-simple": "Example.png elforgatása 90 fokkal.", + "apihelp-imagerotate-example-generator": "Az összes kép elforgatása a Category:Flip kategóriában 180 fokkal.", + "apihelp-import-summary": "Egy lap importálása egy másik wikiből vagy XML-fájlból.", + "apihelp-import-extended-description": "A HTTP POST-kérést fájlfeltöltésként kell elküldeni (multipart/form-data használatával) a xml paraméter használatakor.", + "apihelp-import-param-xml": "Feltöltött XML-fájl.", + "apihelp-import-param-interwikisource": "Wikiközi importálásnál: forráswiki.", + "apihelp-import-param-interwikipage": "Wikiközi importálásnál: az importálandó lap.", + "apihelp-import-param-fullhistory": "Wikiközi importálásnál: teljes laptörténet importálása, nem csak az aktuális változat.", + "apihelp-import-param-templates": "Wikiközi importálásnál: importálás a lapon használt sablonokkal együtt.", + "apihelp-import-param-namespace": "Importálás ebbe a névtérbe. Nem használható együtt a $1rootpage paraméterrel.", + "apihelp-import-param-rootpage": "Importálás ennek a lapnak az allapjaként. Nem használható együtt a $1namespace paraméterrel.", + "apihelp-import-example-import": "[[meta:Help:ParserFunctions]] importálása a 100-as névtérbe teljes laptörténettel.", + "apihelp-linkaccount-summary": "Egy harmadik fél szolgáltató fiókjának kapcsolása a jelenlegi felhasználóhoz.", + "apihelp-linkaccount-example-link": "Összekapcsolás elkezdése Example szolgáltató fiókjával.", + "apihelp-login-summary": "Bejelentkezés és hitelesítő sütik lekérése.", + "apihelp-login-extended-description": "Ez a művelet csak [[Special:BotPasswords|botjelszavakkal]] használandó; a fő fiókkal való használat elavult és figyelmeztetés nélkül sikertelen lehet. A fő fiókkal való biztonságos bejelentkezéshez használd az [[Special:ApiHelp/clientlogin|action=clientlogin]] paramétert.", + "apihelp-login-extended-description-nobotpasswords": "Ez a művelet elavult és figyelmeztetés nélkül sikertelen lehet. A biztonságos bejelentkezéshez használd az [[Special:ApiHelp/clientlogin|action=clientlogin]] paramétert.", "apihelp-login-param-name": "Szerkesztőnév.", "apihelp-login-param-password": "Jelszó.", "apihelp-login-param-domain": "Tartomány (opcionális)", + "apihelp-login-param-token": "Az első kérésben megszerzett bejelentkezési token.", + "apihelp-login-example-gettoken": "Egy bejelentkezés token lekérése.", "apihelp-login-example-login": "Bejelentkezés.", + "apihelp-logout-summary": "Kijelentkezés és munkamenetadatok törlése.", "apihelp-logout-example-logout": "Aktuális felhasználó kijelentkeztetése.", - "apihelp-mergehistory-description": "Laptörténetek egyesítése", + "apihelp-managetags-summary": "A változtatáscímkék kezelése.", + "apihelp-managetags-param-operation": "A végrehajtandó feladat:\n;create: Új változtatáscímke létrehozása kézi használatra.\n;delete: Egy változtatáscímke eltávolítása az adatbázisból, beleértve az eltávolítását minden lapváltozatról, frissváltoztatások-bejegyzésről és naplóbejegyzésről, ahol használatban van.\n;activate: Egy változtatáscímke aktiválása, lehetővé téve a felhasználóknak a kézi használatát.\n;deactivate: Egy változtatáscímke deaktiválása, a felhasználók megakadályozása a kézi használatban.", + "apihelp-managetags-param-tag": "A létrehozandó, törlendő, aktiválandó vagy deaktiválandó címke. Létrehozás esetén adott nevű címke nem létezhet. Törlés esetén a címkének léteznie kell. Aktiválás esetén a címkének léteznie kell, és nem használhatja más kiterjesztés. Deaktiválás esetén a címkének aktívnak és kézzel definiáltnak kell lennie.", + "apihelp-managetags-param-reason": "Opcionális indoklás a címke létrehozásához, törléséhez, aktiválásához vagy deaktiválásához.", + "apihelp-managetags-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása a művelet közben.", + "apihelp-managetags-example-create": "spam címke létrehozása For use in edit patrolling indoklással", + "apihelp-managetags-example-delete": "vandlaism címke törlése Misspelt indoklással", + "apihelp-managetags-example-activate": "spam címke aktiválása For use in edit patrolling indoklással", + "apihelp-managetags-example-deactivate": "spam címke deaktiválása No longer required indoklással", + "apihelp-mergehistory-summary": "Laptörténetek egyesítése", "apihelp-mergehistory-param-reason": "Laptörténet egyesítésének oka.", - "apihelp-move-description": "Egy lap átnevezése.", + "apihelp-move-summary": "Egy lap átnevezése.", + "apihelp-move-param-from": "Az átnevezendő lap címe. Nem használható együtt a $1fromid paraméterrel.", + "apihelp-move-param-fromid": "Az átnevezendő lap lapazonosítója. Nem használható együtt a $1from paraméterrel.", + "apihelp-move-param-to": "A lap új címe.", "apihelp-move-param-reason": "Az átnevezés oka.", "apihelp-move-param-movetalk": "Nevezd át a vitalapot is, ha létezik.", "apihelp-move-param-movesubpages": "Nevezd át az allapokat is, ha lehetséges.", "apihelp-move-param-noredirect": "Ne készíts átirányítást.", + "apihelp-move-param-watch": "A lap és az átirányítás hozzáadása a jelenlegi felhasználó figyelőlistájához.", + "apihelp-move-param-unwatch": "A lap és az átirányítás eltávolítása a jelenlegi felhasználó figyelőlistájáról.", + "apihelp-move-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", "apihelp-move-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása.", + "apihelp-move-example-move": "Badtitle átnevezése Goodtitle címre átirányítás készítése nélkül.", + "apihelp-opensearch-summary": "Keresés a wikin az OpenSearch protokoll segítségével.", + "apihelp-opensearch-param-search": "A keresőkifejezés.", "apihelp-opensearch-param-limit": "Találatok maximális száma.", + "apihelp-opensearch-param-namespace": "A keresendő névterek.", + "apihelp-opensearch-param-suggest": "Ne csináljon semmit, ha a [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] hamis.", + "apihelp-opensearch-param-redirects": "Hogyan kezelje az átirányításokat:\n;return: Magának az átirányításnak a visszaadása.\n;resolve: A céllap visszaadása. Lehet, hogy kevesebb mint $1limit találatot ad vissza.\nTörténeti okokból az alapértelmezés „return” $1format=json esetén és „resolve” más formátumoknál.", + "apihelp-opensearch-param-format": "A kimenet formátuma.", + "apihelp-opensearch-example-te": "Te-vel kezdődő lapok keresése.", + "apihelp-options-summary": "A jelenlegi felhasználó beállításainak módosítása.", + "apihelp-options-extended-description": "Csak a MediaWiki vagy kiterjesztései által kínált, valamint a userjs- előtagú (felhasználói parancsfájloknak szánt) beállítások állíthatók be.", + "apihelp-options-param-reset": "Beállítások visszaállítása a wiki alapértelmezéseire.", + "apihelp-options-param-resetkinds": "A visszaállítandó beállítások típusa(i) a $1reset paraméter használatakor.", + "apihelp-options-param-change": "Változtatások listája név=érték formátumban (pl. skin=vector). Ha nincs érték megadva (egyenlőségjel sem szerepel – pl. beállítás|másik|…), a beállítások visszaállnak az alapértelmezett értékre. Ha bármilyen érték tartalmaz függőleges vonal karaktert (|), használd az [[Special:ApiHelp/main#main/datatypes|alternatív elválasztókaraktert]] a megfelelő működéshez.", + "apihelp-options-param-optionname": "Az $1optionvalue értékre állítandó beállítás neve.", + "apihelp-options-param-optionvalue": "Az $1optionname beállítás értéke.", "apihelp-options-example-reset": "Minden beállítás visszaállítása", + "apihelp-options-example-change": "A skin és a hideminor beállítások módosítása.", + "apihelp-options-example-complex": "Minden beállítás visszaállítása, majd a skin és a nickname beállítása.", + "apihelp-paraminfo-summary": "Információk lekérése API-modulokról.", + "apihelp-paraminfo-param-modules": "Modulnevek (az action és format paraméterek értékei vagy main). Megadhatók almodulok + elválasztással vagy minden almodul +*, illetve rekurzívan minden almodul +** végződéssel.", + "apihelp-paraminfo-param-helpformat": "A súgószövegek formátuma.", + "apihelp-paraminfo-param-querymodules": "Lekérdező modul(ok) neve (a prop, meta vagy list paraméter értéke). Használd a $1modules=query+foo formát a $1querymodules=foo helyett.", + "apihelp-paraminfo-param-mainmodule": "Információk lekérése a fő (legfelső szintű) modulról is. Használd a $1modules=main paramétert helyette.", + "apihelp-paraminfo-param-pagesetmodule": "Információk lekérése a pageset modulról is (ez szolgáltatja a titles paramétert és társait).", + "apihelp-paraminfo-param-formatmodules": "Formázómodul(ok) neve (a format paraméter értéke). Használd a $1modules paramétert helyette.", + "apihelp-paraminfo-example-1": "Információk megjelenítése az [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] és [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] lekérdezésekhez.", + "apihelp-paraminfo-example-2": "Információk megjelenítése az [[Special:ApiHelp/query|action=query]] összes almoduljához.", + "apihelp-parse-summary": "Tartalom feldolgozása.", + "apihelp-parse-extended-description": "Lásd az [[Special:ApiHelp/query|action=query]] számos prop-modulját a információk lekérésére a lap aktuális változatáról.\n\nTöbbféle módon megadható a feldolgozandó szöveg:\n# Egy lap vagy lapváltozat megadásával, a $1page, $1pageid vagy $1oldid paraméterrel.\n# Magának a tartalomnak a megadásával, a $1text, $1title és $1contentmodel paraméterrel.\n# Csak egy összefoglaló feldolgozása. A $1prop paraméternek üresnek kell lennie.", + "apihelp-parse-param-title": "A lapnak a címe, amihez a szöveg tartozik. Ha nincs megadva, a $1contentmodel paraméter kötelező, és a cím [[API]] lesz.", + "apihelp-parse-param-text": "A feldolgozandó szöveg. Használd a $1title vagy $1contentmodel paramétert a tartalommodell megadásához.", + "apihelp-parse-param-summary": "Feldolgozandó szerkesztési összefoglaló.", + "apihelp-parse-param-page": "Ezen lap tartalmának feldolgozása. Nem használható együtt a $1text és $1title paraméterrel.", + "apihelp-parse-param-pageid": "Ezen lap tartalmának feldolgozása. Felülírja a $1page paramétert.", + "apihelp-parse-param-redirects": "Ha a $1page vagy $1pageid átirányítás, annak feloldása.", + "apihelp-parse-param-oldid": "Ezen lapváltozat feldolgozása. Felülírja a $1page és $1pageid paramétert.", + "apihelp-parse-param-prop": "A lekérendő információk:", + "apihelp-parse-paramvalue-prop-text": "A feldolgozott wikiszöveg.", + "apihelp-parse-paramvalue-prop-langlinks": "A feldolgozott wikiszövegben talált nyelvközi hivatkozások.", + "apihelp-parse-paramvalue-prop-categories": "A feldolgozott wikiszövegben talált kategóriák.", + "apihelp-parse-paramvalue-prop-categorieshtml": "A kategóriák HTML-verziója.", + "apihelp-parse-paramvalue-prop-links": "A feldolgozott wikiszövegben talált belső linkek.", + "apihelp-parse-paramvalue-prop-templates": "A feldolgozott wikiszövegben használt sablonok.", + "apihelp-parse-paramvalue-prop-images": "A feldolgozott wikiszövegben használt képek.", + "apihelp-parse-paramvalue-prop-externallinks": "A feldolgozott wikiszövegben talált külső linkek.", + "apihelp-parse-paramvalue-prop-sections": "A feldolgozott wikiszövegben talált szakaszok.", + "apihelp-parse-paramvalue-prop-revid": "A feldolgozott lap lapváltozat-azonosítója.", + "apihelp-parse-paramvalue-prop-displaytitle": "A feldolgozott wikiszöveghez tartozó cím.", + "apihelp-parse-paramvalue-prop-headitems": "A <head> HTML-címkébe kerülő elemek.", + "apihelp-parse-paramvalue-prop-headhtml": "A lap feldolgozott <head> HTML-címkéje.", + "apihelp-parse-paramvalue-prop-modules": "A lapon használt ResourceLoader-modulok. A betöltésükhöz használd a mw.loader.using() függvényt. Vagy a jsconfigvars, vagy az encodedjsconfigvars paramétert kötelező együtt használni ezzel a paraméterrel.", + "apihelp-parse-paramvalue-prop-jsconfigvars": "A lapra jellemző JavaScript-változók. A használatukhoz állítsd be őket az mw.config.set() függvénnyel.", + "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "A lapra jellemző JavaScript-változók JSON-szövegként.", + "apihelp-parse-paramvalue-prop-indicators": "A lap státuszindikátorainak HTML-kódja.", + "apihelp-parse-paramvalue-prop-iwlinks": "A feldolgozott wikiszövegben talált interwikihivatkozások.", + "apihelp-parse-paramvalue-prop-wikitext": "Az eredeti wikiszöveg.", + "apihelp-parse-paramvalue-prop-properties": "A feldolgozott wikiszövegben definiált különböző tulajdonságok.", + "apihelp-parse-paramvalue-prop-parsewarnings": "A tartalom feldolgozása közben előforduló hibák visszaadása.", + "apihelp-parse-param-wrapoutputclass": "Az értelmező kimenetének körülvétele ezzel a CSS-osztállyal.", + "apihelp-parse-param-pst": "Mentés előtti átalakítások elvégzése a bemeneten a feldolgozás előtt. Csak szöveggel használva érvényes.", + "apihelp-parse-param-onlypst": "Mentés előtti átalakítások (pre-save transform, PST) végrehajtása a bemeneten, de a feldolgozás mellőzése. Csak a $1text paraméterrel használva érvényes.", + "apihelp-parse-param-section": "Csak a megadott sorszámú szakasz feldolgozása.\n\nHa new, a $1text és $1sectiontitle feldolgozása úgy, mintha egy új szakaszt adnál a laphoz.\n\nA new csak a text paraméter megadásakor engedélyezett.", + "apihelp-parse-param-sectiontitle": "Az új szakasz címe, ha a section paraméter new.\n\nA szerkesztéssel ellentétben itt nem a summary tartalma az alapértelmezett értéke.", + "apihelp-parse-param-disablepp": "Használd a $1disablelimitreport paramétert helyette.", + "apihelp-parse-param-disableeditsection": "A szakaszok szerkesztőlinkjeinek elhagyása a kimenetből.", + "apihelp-parse-param-preview": "Feldolgozás előnézetmódban.", + "apihelp-parse-param-sectionpreview": "Feldolgozás szakaszelőnézet-módban (az előnézetmódot is engedélyezi).", + "apihelp-parse-param-disabletoc": "Tartalomjegyzék elhagyása a kimenetből.", + "apihelp-parse-param-contentmodel": "A bemeneti szöveg tartalommodellje. Ha nincs megadva, a $1title paraméter kötelező, és az alapértelmezés a megadott cím tartalommodellje lesz. Csak a $1text paraméterrel együtt használva érvényes.", + "apihelp-parse-example-page": "Egy lap feldolgozása.", + "apihelp-parse-example-text": "Wikiszöveg feldolgozása.", + "apihelp-parse-example-texttitle": "Wikiszöveg feldolgozása a lapcím megadásával.", + "apihelp-parse-example-summary": "Egy szerkesztési összefoglaló feldolgozása.", + "apihelp-patrol-summary": "Egy lap vagy lapváltozat ellenőrzöttnek jelölése (patrol).", + "apihelp-patrol-param-rcid": "Az ellenőrzendő frissváltoztatások-azonosító.", + "apihelp-patrol-param-revid": "Az ellenőrzendő lapváltozat azonosítója (oldid).", + "apihelp-patrol-example-rcid": "Egy friss változtatás ellenőrzöttnek jelölése.", + "apihelp-patrol-example-revid": "Egy lapváltozat ellenőrzöttnek jelölése.", + "apihelp-protect-summary": "Egy lap védelmi szintjének változtatása.", + "apihelp-protect-param-title": "A levédendő/feloldandó lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-protect-param-pageid": "A levédendő/feloldandó lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-protect-param-protections": "Védelmi szintek, típus=szint formátumban (pl. edit=sysop). Az all szint azt jelenti, hogy mindenki végrehajthatja az adott műveletet, vagyis nincs korlátozás.\n\nMegjegyzés: Minden nem listázott művelet védelme el lesz távolítva.", + "apihelp-protect-param-expiry": "A lejáratok időbélyege. Ha csak egy időbélyeg van megadva, az vonatkozik minden védelemre. Használj infinite (végtelen), indefinite (határozatlan), infinity (végtelen) vagy never (soha) értéket le nem járó védelemhez.", + "apihelp-protect-param-reason": "A levédés/feloldás oka.", + "apihelp-protect-param-cascade": "Kaszkádolt védelem engedélyezése (a lapon használt sablonok és képek védelme). Nincs hatása, ha egyetlen megadott védelmi szint sem támogatja a kaszkádolt védelmet.", + "apihelp-protect-param-watch": "A levédett/feloldott lap címe hozzáadása az aktuális felhasználó figyelőlistájához.", + "apihelp-protect-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", "apihelp-protect-example-protect": "Lap levédése.", + "apihelp-protect-example-unprotect": "Egy lap védelmének feloldása a korlátozások all-ra állításával (vagyis mindenki végrehajthatja a műveleteket).", + "apihelp-protect-example-unprotect2": "Egy lap védelmének feloldása semmilyen védelem beállításával.", + "apihelp-purge-summary": "A gyorsítótár ürítése a megadott lapoknál.", + "apihelp-purge-param-forcelinkupdate": "A linktáblák frissítése.", + "apihelp-purge-param-forcerecursivelinkupdate": "A linktábla frissítése a megadott lapokra és minden olyan lapra, ami a megadott lapokat beilleszti sablonként.", + "apihelp-purge-example-simple": "A gyorsítótár ürítése a Main Page és API lapoknál.", + "apihelp-purge-example-generator": "A gyorsítótár ürítése az első 10 fő névtérbeli lapnál.", + "apihelp-query-summary": "Adatok lekérése a MediaWikiből és a MediaWikiről.", + "apihelp-query-extended-description": "Minden adatmódosításhoz először a query segítségével szereznie kell egy tokent a rosszindulatú oldalak visszaéléseinek elhárítására.", + "apihelp-query-param-prop": "A lapokról lekérendő tulajdonságok.", + "apihelp-query-param-list": "Lekérendő listák.", + "apihelp-query-param-meta": "Lekérendő metaadatok.", + "apihelp-query-param-indexpageids": "Egy pageids szakasz hozzáadása a kimenethez az összes visszaadott lapazonosítóval.", + "apihelp-query-param-export": "Az összes megadott vagy generált lap aktuális változatának exportálása.", + "apihelp-query-param-exportnowrap": "Az exportált XML visszaadása normál eredményszerkezetbe (JSON, XML stb.) burkolás nélkül (a [[Special:Export]] kimenetével megegyező formátum). Csak az $1export paraméterrel együtt használható.", + "apihelp-query-param-iwurl": "A teljes URL visszaadása, ha a cím egy interwikilink.", + "apihelp-query-param-rawcontinue": "Nyers query-continue adatok visszaadása a folytatáshoz.", + "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|Wikiinformációk]] és a Main Page [[Special:ApiHelp/query+revisions|laptörténetének]] lekérése.", + "apihelp-query-example-allpages": "Az API/ kezdetű lapok laptörténetének lekérése.", + "apihelp-query+allcategories-summary": "Az összes kategória visszaadása.", + "apihelp-query+allcategories-param-from": "A kategóriák listázása ettől a címtől.", + "apihelp-query+allcategories-param-to": "A kategóriák listázása eddig a címig.", + "apihelp-query+allcategories-param-prefix": "Ezzel kezdődő című kategóriák keresése.", "apihelp-query+allcategories-param-dir": "A rendezés iránya.", + "apihelp-query+allcategories-param-min": "Csak legalább ennyi taggal rendelkező kategóriák visszaadása.", + "apihelp-query+allcategories-param-max": "Csak legfeljebb ennyi taggal rendelkező kategóriák visszaadása.", + "apihelp-query+allcategories-param-limit": "A visszaadandó kategóriák száma.", + "apihelp-query+allcategories-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+allcategories-paramvalue-prop-size": "A kategóriában lévő lapok száma.", + "apihelp-query+allcategories-paramvalue-prop-hidden": "Rejtett-e a kategória a __HIDDENCAT__ kapcsolóval.", + "apihelp-query+allcategories-example-size": "Kategóriák listázása a bennük lévő lapok számával.", + "apihelp-query+allcategories-example-generator": "Információk lekérése magukról a kategórialapokról, amiknek a címe List kezdetű.", + "apihelp-query+alldeletedrevisions-summary": "Egy felhasználó vagy egy névtér összes törölt szerkesztésének listázása.", + "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Csak az $3user paraméterrel együtt használható.", + "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nem használható együtt az $3user paraméterrel.", + "apihelp-query+alldeletedrevisions-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+alldeletedrevisions-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+alldeletedrevisions-param-from": "Listázás ettől a címtől.", + "apihelp-query+alldeletedrevisions-param-to": "Listázás eddig a címig.", + "apihelp-query+alldeletedrevisions-param-prefix": "Ezzel kezdődő című lapok keresése.", + "apihelp-query+alldeletedrevisions-param-tag": "Csak ezzel a címkével ellátott változatok listázása.", + "apihelp-query+alldeletedrevisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+alldeletedrevisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+alldeletedrevisions-param-namespace": "Lapok listázása csak ebben a névtérben.", + "apihelp-query+alldeletedrevisions-param-generatetitles": "Generátorként használva címek visszaadása lapváltozat-azonosítók helyett.", + "apihelp-query+alldeletedrevisions-example-user": "Example 50 legutóbbi törölt szerkesztésének listázása.", + "apihelp-query+alldeletedrevisions-example-ns-main": "A fő névtér első 50 törölt szerkesztésének listázása.", + "apihelp-query+allfileusages-summary": "Az összes fájlhasználat listázása, beleértve a nem létező fájlokét is.", + "apihelp-query+allfileusages-param-from": "Listázás ettől a címtől vagy fájltól.", + "apihelp-query+allfileusages-param-to": "Listázás eddig a címig vagy fájlig.", + "apihelp-query+allfileusages-param-prefix": "Ezzel kezdődő nevű fájlok keresése.", + "apihelp-query+allfileusages-param-unique": "Csak különböző fájlnevek listázása. Nem használható együtt az $1prop=id paraméterrel.", + "apihelp-query+allfileusages-param-prop": "Visszaadandó információk:", + "apihelp-query+allfileusages-paramvalue-prop-ids": "A képeket használó lapok lapazonosítói (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+allfileusages-paramvalue-prop-title": "A fájl neve.", + "apihelp-query+allfileusages-param-limit": "A visszaadandó elemek maximális száma.", + "apihelp-query+allfileusages-param-dir": "A listázás iránya.", + "apihelp-query+allfileusages-example-B": "Fájlnevek listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, B-től kezdve.", + "apihelp-query+allfileusages-example-unique": "Különböző fájlnevek listázása.", + "apihelp-query+allfileusages-example-unique-generator": "Az összes fájlnév lekérése, hiányzók megjelölése.", + "apihelp-query+allfileusages-example-generator": "A fájlokat használó lapok lekérése.", + "apihelp-query+allimages-summary": "Az összes kép visszaadása.", + "apihelp-query+allimages-param-sort": "Rendezési szempont.", + "apihelp-query+allimages-param-dir": "A listázás iránya.", + "apihelp-query+allimages-param-from": "Listázás ettől a fájlnévtől. Csak az $1sort=name paraméterrel együtt használható.", + "apihelp-query+allimages-param-to": "Listázás eddig a fájlnévig. Csak az $1sort=name paraméterrel együtt használható.", + "apihelp-query+allimages-param-start": "Listázás ettől az időbélyegtől. Csak az $1sort=timestamp paraméterrel együtt használható.", + "apihelp-query+allimages-param-end": "Listázás eddig az időbélyegig. Csak az $1sort=timestamp paraméterrel együtt használható.", + "apihelp-query+allimages-param-prefix": "Ezzel kezdődő nevű fájlok keresése. Csak az $1sort=name paraméterrel együtt használható.", + "apihelp-query+allimages-param-minsize": "A fájlok minimális fájlmérete bájtban.", + "apihelp-query+allimages-param-maxsize": "A fájlok maximális fájlmérete bájtban.", + "apihelp-query+allimages-param-user": "Ezen felhasználó által feltöltött fájlok visszaadása. Csak az $1sort=timestamp paraméterrel együtt használható. Nem használható együtt az $1filterbots paraméterrel.", + "apihelp-query+allimages-param-filterbots": "Botok által feltöltött fájlok szűrése. Csak az $1sort=timestamp paraméterrel együtt használható. Nem használható együtt az $1user paraméterrel.", + "apihelp-query+allimages-param-mime": "Szűrés MIME-típus alapján, pl. image/jpeg.", + "apihelp-query+allimages-param-limit": "A visszaadandó képek száma.", + "apihelp-query+allimages-example-B": "Fájlok listázása B-től kezdve.", + "apihelp-query+allimages-example-recent": "A legutóbb feltöltött fájlok listázása, hasonló a [[Special:NewFiles]] laphoz.", + "apihelp-query+allimages-example-mimetypes": "image/png vagy image/gif MIME-típusú fájlok listázása", + "apihelp-query+allimages-example-generator": "Információk 4 fájlról T-től kezdve.", + "apihelp-query+alllinks-summary": "Egy adott névtérbe mutató összes hivatkozás visszaadása.", + "apihelp-query+alllinks-param-from": "Listázás ettől a hivatkozástól.", + "apihelp-query+alllinks-param-to": "Listázás eddig a hivatkozásig.", + "apihelp-query+alllinks-param-prefix": "Ezzel kezdődő című hivatkozott lapok keresése.", + "apihelp-query+alllinks-param-unique": "Csak különböző címek listázása. Nem használható együtt az $1prop=ids paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.", + "apihelp-query+alllinks-param-prop": "Visszaadandó információk:", + "apihelp-query+alllinks-paramvalue-prop-ids": "A hivatkozó lapok lapazonosítói (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+alllinks-paramvalue-prop-title": "A hivatkozott lap címe.", + "apihelp-query+alllinks-param-namespace": "A listázandó névtér.", + "apihelp-query+alllinks-param-limit": "A visszaadandó elemek maximális száma.", + "apihelp-query+alllinks-param-dir": "A listázás iránya.", + "apihelp-query+alllinks-example-B": "Hivatkozott lapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, B-től kezdve.", + "apihelp-query+alllinks-example-unique": "Különböző hivatkozott lapok listázása.", + "apihelp-query+alllinks-example-unique-generator": "Az összes hivatkozott lap lekérése, hiányzók megjelölése.", + "apihelp-query+alllinks-example-generator": "A hivatkozásokat tartalmazó lapok lekérése.", + "apihelp-query+allmessages-summary": "A wiki felületüzeneteinek lekérése.", + "apihelp-query+allmessages-param-messages": "A visszaadandó üzenetek. A * (alapértelmezés) az összes üzenetet jelenti.", + "apihelp-query+allmessages-param-prop": "A lekérendő tulajdonságok.", + "apihelp-query+allmessages-param-nocontent": "Ne tartalmazza a kimenet az üzenetek tartalmát.", + "apihelp-query+allmessages-param-includelocal": "Helyi üzenetek befoglalása (a szoftverben nem, de a {{ns:MediaWiki}} névtérben létező üzenetek).\nEz az összes lapot listázza a {{ns:MediaWiki}} névtérben, így a nem valódi üzeneteket is, mint a [[MediaWiki:Common.js|Common.js]] fájl.", + "apihelp-query+allmessages-param-args": "Az üzenetben behelyettesítendő paraméterek.", + "apihelp-query+allmessages-param-filter": "Csak az ezen szöveget tartalmazó nevű üzenetek visszaadása.", + "apihelp-query+allmessages-param-customised": "Az üzenetek szűrése módosítási állapot alapján.", + "apihelp-query+allmessages-param-lang": "A visszaadott üzenetek nyelve.", + "apihelp-query+allmessages-param-from": "Listázás ettől az üzenettől.", + "apihelp-query+allmessages-param-to": "Listázás eddig az üzenetig.", + "apihelp-query+allmessages-param-prefix": "Ezzel kezdődő nevű üzenetek visszaadása.", + "apihelp-query+allmessages-example-ipb": "ipb- előtagú üzenetek lekérése.", + "apihelp-query+allmessages-example-de": "Az august és mainpage üzenetek lekérése német nyelven.", + "apihelp-query+allpages-summary": "Egy adott névtér összes lapjának visszaadása.", + "apihelp-query+allpages-param-from": "A lapok listázása ettől a címtől.", + "apihelp-query+allpages-param-to": "A lapok listázása eddig a címig.", + "apihelp-query+allpages-param-prefix": "Ezzel kezdődő című lapok keresése.", + "apihelp-query+allpages-param-namespace": "A listázandó névtér.", + "apihelp-query+allpages-param-filterredir": "A listázandó lapok.", + "apihelp-query+allpages-param-minsize": "A lapok minimális hossza bájtban.", + "apihelp-query+allpages-param-maxsize": "A lapok maximális hossza bájtban.", + "apihelp-query+allpages-param-prtype": "Csak védett lapok listázása.", + "apihelp-query+allpages-param-prlevel": "A védelmek szűrése a védelmi szint alapján (csak az $1prtype= paraméterrel együtt használható).", + "apihelp-query+allpages-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+allpages-param-dir": "A listázás iránya.", + "apihelp-query+allpages-param-filterlanglinks": "Szűrés az alapján, hogy vannak-e nyelvközi hivatkozások a lapon. Nem biztos, hogy figyelembe veszi a kiterjesztések által hozzáadott nyelvközi hivatkozásokat.", + "apihelp-query+allpages-param-prexpiry": "Szűrés a védelem lejárata alapján:\n;indefinite: Csak meghatározatlan idejű védelemmel ellátott lapok.\n;definite: Csak meghatározott idejű (konkrét lejáratú) védelemmel ellátott lapok.\n;all: Bármilyen lejáratú védelemmel ellátott lapok.", + "apihelp-query+allpages-example-B": "Lapok listázása B-től kezdve.", + "apihelp-query+allpages-example-generator": "Információk 4 lapról T-től kezdve.", + "apihelp-query+allpages-example-generator-revisions": "Az első két nem átirányító lap tartalmának megjelenítése Re-től kezdve.", + "apihelp-query+allredirects-summary": "Egy adott névtérbe mutató összes átirányítás listázása.", + "apihelp-query+allredirects-param-from": "Listázás ettől az átirányításcímtől.", + "apihelp-query+allredirects-param-to": "Listázás eddig az átirányításcímig.", + "apihelp-query+allredirects-param-prefix": "Ezzel kezdődő című céllapok keresése.", + "apihelp-query+allredirects-param-unique": "Csak különböző céllapok listázása. Nem használható együtt az $1prop=ids|fragment|interwiki paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.", + "apihelp-query+allredirects-param-prop": "Visszaadandó információk:", + "apihelp-query+allredirects-paramvalue-prop-ids": "Az átirányító lapok lapazonosítói (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+allredirects-paramvalue-prop-title": "Az átirányítás címe.", + "apihelp-query+allredirects-paramvalue-prop-fragment": "Az átirányítás célszakasza, ha van (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+allredirects-paramvalue-prop-interwiki": "Az átirányítás céljának interwiki-előtagja, ha van (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+allredirects-param-namespace": "A listázandó névtér.", + "apihelp-query+allredirects-param-limit": "A visszaadandó elemek maximális száma.", + "apihelp-query+allredirects-param-dir": "A listázás iránya.", + "apihelp-query+allredirects-example-B": "Céllapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, B-től kezdve.", + "apihelp-query+allredirects-example-unique": "Különböző céllapok listázása.", + "apihelp-query+allredirects-example-unique-generator": "Az összes céllap lekérése, hiányzók megjelölése.", + "apihelp-query+allredirects-example-generator": "Az átirányításokat tartalmazó lapok lekérése.", + "apihelp-query+allrevisions-summary": "Az összes lapváltozat listázása.", + "apihelp-query+allrevisions-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+allrevisions-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+allrevisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+allrevisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+allrevisions-param-namespace": "Lapok listázása csak ebben a névtérben.", + "apihelp-query+allrevisions-param-generatetitles": "Generátorként használva címek visszaadása lapváltozat-azonosítók helyett.", + "apihelp-query+allrevisions-example-user": "Example 50 legutóbbi szerkesztésének listázása.", + "apihelp-query+allrevisions-example-ns-main": "A fő névtér első 50 szerkesztésének listázása.", + "apihelp-query+mystashedfiles-param-prop": "A fájlok lekérendő tulajdonságai.", + "apihelp-query+mystashedfiles-paramvalue-prop-size": "A fájlméret és a kép dimenziói (szélessége és magassága).", + "apihelp-query+mystashedfiles-paramvalue-prop-type": "A fájl MIME-típusa és médiatípusa.", + "apihelp-query+mystashedfiles-param-limit": "A lekérendő fájlok száma.", + "apihelp-query+alltransclusions-summary": "Az összes beillesztés listázása ({{x}} kóddal beillesztett lapok), beleértve a nem létező lapokét is.", + "apihelp-query+alltransclusions-param-from": "Listázás ettől a beillesztett laptól.", + "apihelp-query+alltransclusions-param-to": "Listázás eddig a beillesztett lapig.", + "apihelp-query+alltransclusions-param-prefix": "Ezzel kezdődő című beillesztett lapok keresése.", + "apihelp-query+alltransclusions-param-unique": "Csak különböző beillesztett címek listázása. Nem használható együtt az $1prop=ids paraméterrel.\nGenerátorként használva a céllapokat adja vissza a forráslapok helyett.", + "apihelp-query+alltransclusions-param-prop": "Visszaadandó információk:", + "apihelp-query+alltransclusions-paramvalue-prop-ids": "A lapokat beillesztő lapok lapazonosítói (nem használható együtt az $1unique paraméterrel).", + "apihelp-query+alltransclusions-paramvalue-prop-title": "A beillesztés címe.", + "apihelp-query+alltransclusions-param-namespace": "A listázandó névtér.", + "apihelp-query+alltransclusions-param-limit": "A visszaadandó elemek maximális száma.", + "apihelp-query+alltransclusions-param-dir": "A listázás iránya.", + "apihelp-query+alltransclusions-example-B": "Beillesztett lapok listázása, a hiányzókat is beleértve, a forráslapok lapazonosítójával, B-től kezdve.", + "apihelp-query+alltransclusions-example-unique": "Különböző beillesztett címek listázása.", + "apihelp-query+alltransclusions-example-unique-generator": "Az összes beillesztett lap lekérése, hiányzók megjelölése.", + "apihelp-query+alltransclusions-example-generator": "A beillesztéseket tartalmazó lapok lekérése.", + "apihelp-query+allusers-summary": "Az összes regisztrált felhasználó visszaadása.", + "apihelp-query+allusers-param-from": "A felhasználók listázása ettől a névtől.", + "apihelp-query+allusers-param-to": "A felhasználók listázása eddig a névig.", + "apihelp-query+allusers-param-prefix": "Ezzel kezdődő nevű felhasználók keresése.", + "apihelp-query+allusers-param-dir": "A rendezés iránya.", + "apihelp-query+allusers-param-group": "Csak megadott csoportokba tartozó felhasználók visszaadása.", + "apihelp-query+allusers-param-excludegroup": "Csak a megadott csoportokba nem tartozó felhasználók visszaadása.", + "apihelp-query+allusers-param-rights": "Csak a megadott jogosultságokkal rendelkező felhasználók visszaadása. Ez nem tartalmazza azokat a jogosultságokat, amiket implicit vagy automatikusan hozzáadott csoportok adnak meg, mint a *, a user vagy az autoconfirmed.", + "apihelp-query+allusers-param-prop": "Visszaadandó információk:", + "apihelp-query+allusers-paramvalue-prop-blockinfo": "Információk a felhasználó jelenleg érvényes blokkjáról.", + "apihelp-query+allusers-paramvalue-prop-groups": "A felhasználó csoportjai. Ez több szervererőforrást használ, és lehet, hogy a limitnél kevesebb eredményt ad vissza.", + "apihelp-query+allusers-paramvalue-prop-implicitgroups": "A felhasználó automatikus csoportjai.", + "apihelp-query+allusers-paramvalue-prop-rights": "A felhasználó jogosultságai.", + "apihelp-query+allusers-paramvalue-prop-editcount": "A felhasználó szerkesztésszáma.", + "apihelp-query+allusers-paramvalue-prop-registration": "A felhasználó regisztrációjának időbélyege, ha elérhető (lehet üres).", + "apihelp-query+allusers-paramvalue-prop-centralids": "A felhasználó központi azonosítói és az összekapcsolási státusza.", + "apihelp-query+allusers-param-limit": "A visszaadandó felhasználónevek maximális száma.", + "apihelp-query+allusers-param-witheditsonly": "Csak szerkesztéssel rendelkező felhasználók listázása.", + "apihelp-query+allusers-param-activeusers": "Csak az elmúlt $1 napban aktív felhasználók listázása.", + "apihelp-query+allusers-param-attachedwiki": "Az $1prop=centralids paraméter mellett annak jelzése, hogy a felhasználó össze van-e kapcsolva a megadott wikivel.", + "apihelp-query+allusers-example-Y": "A felhasználók listázása Y-tól kezdve.", + "apihelp-query+authmanagerinfo-summary": "Információk lekérése az aktuális azonosítási státuszról.", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Annak ellenőrzése, hogy a felhasználó jelenlegi azonosítási státusza megfelelő-e a megadott biztonságkritikus művelethez.", + "apihelp-query+authmanagerinfo-param-requestsfor": "Információk lekérése a megadott azonosítási művelethez szükséges azonosítási kérésekről.", + "apihelp-query+authmanagerinfo-example-login": "Egy bejelentkezés elkezdéséhez használható kérések lekérése.", + "apihelp-query+authmanagerinfo-example-login-merged": "Egy bejelentkezés elkezdéséhez használható kérések lekérése, az űrlapmezők összevonásával.", + "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Annak ellenőrzése, hogy a hitelesítés megfelelő-e a foo művelethez.", + "apihelp-query+backlinks-summary": "Egy adott lapra hivatkozó más lapok megkeresése.", + "apihelp-query+backlinks-param-title": "A keresendő cím. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-query+backlinks-param-pageid": "A keresendő lapazonosító. Nem használható együtt a $1title paraméterrel.", + "apihelp-query+backlinks-param-namespace": "A listázandó névtér.", + "apihelp-query+backlinks-param-dir": "A listázás iránya.", + "apihelp-query+backlinks-param-filterredir": "Az átirányítások szűrése. Ha nonredirects, és a $1redirect paraméter engedélyezett, csak a második szintre érvényes.", + "apihelp-query+backlinks-param-limit": "A visszaadandó lapok maximális száma. Ha a $1redirect engedélyezve van, ez a limit minden szintre külön érvényes (vagyis összesen 2 × $1limit eredmény lehet a válaszban).", + "apihelp-query+backlinks-param-redirect": "Ha a hivatkozó lap átirányítás, az arra hivatkozó lapok keresése szintén. A maximális limit feleződik.", + "apihelp-query+backlinks-example-simple": "A Main Page lapra mutató hivatkozások keresése.", + "apihelp-query+backlinks-example-generator": "Információk lekérése a Main Page-re hivatkozó lapokról.", + "apihelp-query+blocks-summary": "Az összes blokkolt felhasználó és IP-cím listázása.", + "apihelp-query+blocks-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+blocks-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+blocks-param-ids": "A listázandó blokkok blokkazonosítói (opcionális).", + "apihelp-query+blocks-param-users": "A keresendő felhasználók (opcionális).", + "apihelp-query+blocks-param-ip": "Minden erre az IP-címre vagy CIDR tartományra vonatkozó blokk listázása, a tartományblokkokat is beleértve. Nem használható együtt a $3users paraméterrel. A CIDR tartományok maximális szélessége IPv4 esetén /$1, IPv6 esetén /$2.", + "apihelp-query+blocks-param-limit": "A listázandó blokkok maximális száma.", + "apihelp-query+blocks-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+blocks-paramvalue-prop-id": "A blokk azonosítója.", + "apihelp-query+blocks-paramvalue-prop-user": "A blokkolt felhasználó felhasználóneve.", + "apihelp-query+blocks-paramvalue-prop-userid": "A blokkolt felhasználó felhasználóazonosítója.", + "apihelp-query+blocks-paramvalue-prop-by": "A blokkoló felhasználó felhasználóneve.", + "apihelp-query+blocks-paramvalue-prop-byid": "A blokkoló felhasználó felhasználóazonosítója.", + "apihelp-query+blocks-paramvalue-prop-timestamp": "A blokkolás időbélyege.", + "apihelp-query+blocks-paramvalue-prop-expiry": "A blokk lejáratának időbélyege.", + "apihelp-query+blocks-paramvalue-prop-reason": "A blokk indoklása.", + "apihelp-query+blocks-paramvalue-prop-range": "A blokk által érintett IP-címek tartománya.", + "apihelp-query+blocks-param-show": "Csak a megadott feltételeknek megfelelő elemek megjelenítése.\nPéldául csak IP-címek végtelen blokkjainak megjelenítéséhez állítsd $1show=ip|!temp értékre.", + "apihelp-query+blocks-example-simple": "Blokkok listázása.", + "apihelp-query+blocks-example-users": "Alice és Bob blokkjainak listázása.", + "apihelp-query+categories-summary": "A lapok összes kategóriájának listázása.", + "apihelp-query+categories-param-prop": "A kategóriákhoz lekérendő további tulajdonságok:", + "apihelp-query+categories-paramvalue-prop-timestamp": "A kategória hozzáadásának időbélyege.", + "apihelp-query+categories-paramvalue-prop-hidden": "A __HIDDENCAT__ kapcsolóval elrejtett kategóriák megjelölése.", + "apihelp-query+categories-param-show": "A megjelenítendő kategóriatípusok.", + "apihelp-query+categories-param-limit": "A visszaadandó kategóriák száma.", + "apihelp-query+categories-param-categories": "Csak ezen kategóriák listázása. Annak ellenőrzésére alkalmas, hogy egy lap benne van-e egy adott kategóriában.", + "apihelp-query+categories-param-dir": "A listázás iránya.", + "apihelp-query+categories-example-simple": "Az Albert Einstein lap kategóriáinak lekérése.", + "apihelp-query+categories-example-generator": "Információk lekérése az Albert Einstein lap kategóriáiról.", + "apihelp-query+categoryinfo-summary": "Információk lekérése a megadott kategóriákról.", + "apihelp-query+categoryinfo-example-simple": "Információk lekérése a Category:Foo és a Category:Bar kategóriáról.", + "apihelp-query+categorymembers-summary": "Egy kategória összes tagjának listázása.", + "apihelp-query+categorymembers-param-title": "A listázandó kategória (kötelező). Tartalmaznia kell a {{ns:category}}: előtagot. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-query+categorymembers-param-pageid": "A listázandó kategória lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-query+categorymembers-param-prop": "Visszaadandó információk:", + "apihelp-query+categorymembers-paramvalue-prop-ids": "A lap lapazonosítója.", + "apihelp-query+categorymembers-paramvalue-prop-title": "A lap címe és névterének azonosítója.", + "apihelp-query+categorymembers-paramvalue-prop-type": "A lap kategorizálási típusa (page, subcat vagy file).", + "apihelp-query+categorymembers-paramvalue-prop-timestamp": "A lap bekategorizálásának időbélyege.", + "apihelp-query+categorymembers-param-namespace": "Csak ezen névterekben található lapok visszaadása. A $1namespace=14 és $1namespace=6 helyett használható $1type=subcat, illetve $1type=file.", + "apihelp-query+categorymembers-param-type": "A megadott kategorizálási típusú lapok visszaadása. Nincs hatása, ha a $1sort paraméter értéke timestamp.", + "apihelp-query+categorymembers-param-limit": "A lekérdezendő lapok maximális száma.", + "apihelp-query+categorymembers-param-sort": "Rendezési szempont.", + "apihelp-query+categorymembers-param-dir": "A rendezés iránya.", + "apihelp-query+categorymembers-param-start": "A listázás kezdő időbélyege. Csak $1sort=timestamp paraméterrel együtt használható.", + "apihelp-query+categorymembers-param-end": "A lista végét jelentő időbélyeg. Csak $1sort=timestamp paraméterrel együtt használható.", + "apihelp-query+categorymembers-param-startsortkey": "Használd a $1starthexsortkey paramétert helyette.", + "apihelp-query+categorymembers-param-endsortkey": "Használd a $1endhexsortkey paramétert helyette.", + "apihelp-query+categorymembers-example-simple": "A Category:Physics első 10 tagjának lekérése.", + "apihelp-query+categorymembers-example-generator": "Információk lekérése a Category:Physics első 10 tagjáról.", + "apihelp-query+contributors-summary": "Egy lap bejelentkezett közreműködői listájának, valamint az anonim közreműködők számának lekérése.", + "apihelp-query+contributors-param-group": "Csak a megadott felhasználócsoportok tagjainak visszaadása. Ez nem tartalmazza az implicit vagy automatikusan hozzáadott csoportokat, mint a *, a user vagy az autoconfirmed.", + "apihelp-query+contributors-param-excludegroup": "A megadott felhasználócsoportok tagjainak kihagyása. Ez nem tartalmazza az implicit vagy automatikusan hozzáadott csoportokat, mint a *, a user vagy az autoconfirmed.", + "apihelp-query+contributors-param-rights": "Csak a megadott jogosultságokkal rendelkező felhasználók visszaadása. Ez nem tartalmazza azokat a jogosultságokat, amiket implicit vagy automatikusan hozzáadott csoportok adnak meg, mint a *, a user vagy az autoconfirmed.", + "apihelp-query+contributors-param-excluderights": "A megadott jogosultságokkal rendelkező felhasználók kizárása. Ez nem tartalmazza azokat a jogosultságokat, amiket implicit vagy automatikusan hozzáadott csoportok adnak meg, mint a *, a user vagy az autoconfirmed.", + "apihelp-query+contributors-param-limit": "A visszaadandó közreműködők maximális száma.", + "apihelp-query+contributors-example-simple": "A Main Page lap közreműködőinek lekérése.", + "apihelp-query+deletedrevisions-param-start": "Listázás ettől az időbélyegtől. Nincs hatása, ha lapváltozat-azonosítók vannak megadva.", + "apihelp-query+deletedrevisions-param-end": "A lista végét jelentő időbélyeg. Nincs hatása, ha lapváltozat-azonosítók vannak megadva.", + "apihelp-query+deletedrevisions-param-tag": "Csak ezzel a címkével ellátott változatok listázása.", + "apihelp-query+deletedrevisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+deletedrevisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+deletedrevisions-example-titles": "A Main Page és Talk:Main Page lapok törölt lapváltozatainak listázása tartalommal.", + "apihelp-query+deletedrevisions-example-revids": "Információk listázása az 123456 törölt lapváltozatról.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mód|Módok}}: $2", + "apihelp-query+deletedrevs-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+deletedrevs-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+deletedrevs-param-from": "Listázás ettől a címtől.", + "apihelp-query+deletedrevs-param-to": "Listázás eddig a címig.", + "apihelp-query+deletedrevs-param-prefix": "Ezzel kezdődő című lapok keresése.", + "apihelp-query+deletedrevs-param-unique": "Egyetlen lapváltozat listázása minden laphoz.", + "apihelp-query+deletedrevs-param-tag": "Csak ezzel a címkével ellátott változatok listázása.", + "apihelp-query+deletedrevs-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+deletedrevs-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+deletedrevs-param-namespace": "Lapok listázása csak ebben a névtérben.", + "apihelp-query+deletedrevs-param-limit": "A listázandó lapváltozatok maximális száma.", + "apihelp-query+deletedrevs-example-mode1": "Main Page és Talk:Main Page utolsó törölt lapváltozatainak listázása tartalommal (1. mód).", + "apihelp-query+deletedrevs-example-mode2": "Bob felhasználó utolsó 50 törölt szerkesztésének listázása (2. mód).", + "apihelp-query+deletedrevs-example-mode3-main": "Az első 50 törölt lapváltozat listázása a fő névtérben (3. mód).", + "apihelp-query+deletedrevs-example-mode3-talk": "Az első 50 törölt lapváltozat listázása a {{ns:talk}} névtérben (3. mód).", + "apihelp-query+disabled-summary": "Ez a lekérdezőmodul le lett tiltva.", + "apihelp-query+duplicatefiles-param-limit": "A visszaadandó duplikátumok száma.", + "apihelp-query+duplicatefiles-param-dir": "A listázás iránya.", + "apihelp-query+duplicatefiles-param-localonly": "Csak helyi fájlok keresése.", + "apihelp-query+duplicatefiles-example-simple": "[[:File:Albert Einstein Head.jpg]] duplikátumainak keresése.", + "apihelp-query+duplicatefiles-example-generated": "Az összes fájl duplikátumainak keresése.", + "apihelp-query+embeddedin-summary": "A megadott lapot beillesztő összes lap lekérése.", + "apihelp-query+embeddedin-param-title": "A keresendő lap címe. Nem használható együtt az $1pageid paraméterrel.", + "apihelp-query+embeddedin-param-pageid": "A keresendő lap lapazonosítója. Nem használható együtt az $1title paraméterrel.", + "apihelp-query+embeddedin-param-namespace": "A listázandó névtér.", + "apihelp-query+embeddedin-param-dir": "A listázás iránya.", + "apihelp-query+embeddedin-param-filterredir": "Szűrés átirányítások alapján.", + "apihelp-query+embeddedin-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+embeddedin-example-simple": "A Template:Stub lapot beillesztő lapok megjelenítése.", + "apihelp-query+embeddedin-example-generator": "Információk lekérése a Template:Stub lapot beillesztő lapokról.", + "apihelp-query+extlinks-summary": "A megadott lapokon található összes külső (nem interwiki) link visszaadása.", + "apihelp-query+extlinks-param-limit": "A visszaadandó linkek száma.", + "apihelp-query+extlinks-param-protocol": "Az URL protokollja. Ha üres és az $1query paraméter meg van adva, a protokoll http. Hagyd ezt és az $1query paramétert is üresen az összes külső link listázásához.", + "apihelp-query+extlinks-example-simple": "A Main Page lapon található összes külső hivatkozás listájának lekérése.", + "apihelp-query+exturlusage-summary": "Egy megadott URL-t tartalmazó lapok visszaadása.", + "apihelp-query+exturlusage-param-prop": "Visszaadandó információk:", + "apihelp-query+exturlusage-paramvalue-prop-ids": "A lap lapazonosítója.", + "apihelp-query+exturlusage-paramvalue-prop-title": "A lap címe és névterének azonosítója.", + "apihelp-query+exturlusage-paramvalue-prop-url": "A lapon használt URL.", + "apihelp-query+exturlusage-param-protocol": "Az URL protokollja. Ha üres és az $1query paraméter meg van adva, a protokoll http. Hagyd ezt és az $1query paramétert is üresen az összes külső link listázásához.", + "apihelp-query+exturlusage-param-namespace": "A listázandó névtér.", + "apihelp-query+exturlusage-param-limit": "A visszaadandó lapok száma.", + "apihelp-query+exturlusage-example-simple": "A http://www.mediawiki.org URL-re hivatkozó lapok megjelenítése.", + "apihelp-query+filearchive-summary": "Az összes törölt fájl visszaadása.", + "apihelp-query+filearchive-param-from": "A fájlok listázása ettől a címtől.", + "apihelp-query+filearchive-param-to": "A fájlok listázása eddig a címig.", + "apihelp-query+filearchive-param-prefix": "Ezzel kezdődő című fájlok keresése.", + "apihelp-query+filearchive-param-limit": "A visszaadandó fájlok száma.", + "apihelp-query+filearchive-param-dir": "A listázás iránya.", + "apihelp-query+filearchive-param-prop": "A lekérendő információk:", + "apihelp-query+filearchive-paramvalue-prop-timestamp": "A feltöltött verzió időbélyege.", + "apihelp-query+filearchive-paramvalue-prop-user": "A fájlverzió feltöltője.", + "apihelp-query+filearchive-paramvalue-prop-size": "A fájl mérete bájtban, magassága, szélessége és oldalszáma (ha értelmezhető).", + "apihelp-query+filearchive-paramvalue-prop-description": "A fájlverzió leírása.", + "apihelp-query+filearchive-paramvalue-prop-mime": "A fájl MIME-típusa.", + "apihelp-query+filearchive-paramvalue-prop-mediatype": "A fájl médiatípusa.", + "apihelp-query+filearchive-paramvalue-prop-metadata": "A fájlverzió EXIF-metaadatai.", + "apihelp-query+filearchive-paramvalue-prop-bitdepth": "A verzió bitmélysége.", + "apihelp-query+filearchive-paramvalue-prop-archivename": "Az archivált verzió fájlneve a nem legújabb verziók esetén.", + "apihelp-query+filearchive-example-simple": "Az összes törölt fájl listázása.", + "apihelp-query+filerepoinfo-summary": "Metainformációk visszaadása a wikin beállított fájltárolókról.", + "apihelp-query+filerepoinfo-example-simple": "Információk lekérése a fájltárolókról.", + "apihelp-query+fileusage-summary": "A megadott fájlokat használó lapok lekérése.", + "apihelp-query+fileusage-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+fileusage-paramvalue-prop-pageid": "A lapok lapazonosítói.", + "apihelp-query+fileusage-paramvalue-prop-title": "A lapok címei.", + "apihelp-query+fileusage-paramvalue-prop-redirect": "Az átirányítások megjelölése.", + "apihelp-query+fileusage-param-namespace": "Lapok listázása ezekben a névterekben.", + "apihelp-query+fileusage-param-limit": "A visszaadandó lapok száma.", + "apihelp-query+fileusage-param-show": "Szűrés az átirányítások alapján:\n;redirect: Csak átirányítások visszaadása.\n;!redirect: Átirányítások elrejtése.", + "apihelp-query+fileusage-example-simple": "A [[:File:Example.jpg]] képet használó lapok listázása.", + "apihelp-query+fileusage-example-generator": "Információk lekérése a [[:File:Example.jpg]] képet használó lapokról.", + "apihelp-query+imageinfo-summary": "Fájlinformációk és fájltörténet lekérése.", + "apihelp-query+imageinfo-param-prop": "A lekérendő fájlinformációk:", + "apihelp-query+imageinfo-paramvalue-prop-timestamp": "A feltöltött verzió időbélyege.", + "apihelp-query+imageinfo-paramvalue-prop-user": "Az egyes fájlverziók feltöltői.", + "apihelp-query+imageinfo-paramvalue-prop-userid": "Az egyes fájlverziók feltöltőinek felhasználóazonosítói.", + "apihelp-query+imageinfo-paramvalue-prop-comment": "A verzió feltöltési összefoglalója.", + "apihelp-query+imageinfo-paramvalue-prop-url": "A fájlra és a leírólapra mutató URL.", + "apihelp-query+imageinfo-paramvalue-prop-size": "A fájl mérete bájtban, magassága, szélessége és oldalszáma (ha értelmezhető).", "apihelp-query+imageinfo-paramvalue-prop-sha1": "SHA-1 hash hozzáadása a fájlhoz.", "apihelp-query+imageinfo-paramvalue-prop-mime": "MIME-típus hozzáadása a fájlhoz.", + "apihelp-query+imageinfo-paramvalue-prop-mediatype": "A fájl médiatípusa.", + "apihelp-query+imageinfo-paramvalue-prop-metadata": "A fájlverzió EXIF-metaadatai.", + "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "A formázott metaadatok több forrásból kombinálva. A kimenet HTML-formázott.", + "apihelp-query+imageinfo-paramvalue-prop-archivename": "Az archivált verzió fájlneve a nem legújabb verziók esetén.", + "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "A verzió bitmélysége.", + "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "A Speciális:Feltöltés lap használja egy létező fájl információinak lekéréséhez. Nem készült a MediaWiki magján kívüli használatra.", + "apihelp-query+imageinfo-paramvalue-prop-badfile": "A fájl szerepel-e a [[MediaWiki:Bad image list]] listán.", + "apihelp-query+imageinfo-param-limit": "A fájlonként visszaadandó verziók száma.", + "apihelp-query+imageinfo-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+imageinfo-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+imageinfo-param-urlwidth": "Ha az $2prop=url meg van adva, erre a szélességre méretezett kép URL-jét adja vissza.\nTeljesítményi okokból ezen opció használatakor legfeljebb $1 átméretezett képet ad vissza.", + "apihelp-query+imageinfo-param-urlheight": "Az $1urlwidth paraméterhez hasonló.", + "apihelp-query+imageinfo-param-metadataversion": "A használandó metaadat-verzió. Ha latest, a legfrissebb verzió használata. Alapértelmezetten 1 a visszamenőleges kompatibilitás érdekében.", + "apihelp-query+imageinfo-param-extmetadatamultilang": "Ha elérhetők fordítások az extmetadata tulajdonsághoz, az összes lekérése.", + "apihelp-query+imageinfo-param-extmetadatafilter": "Ha meg van adva és nem üres, csak ezeket a tulajdonságokat adja vissza az $1prop=extmetadata paraméter esetén.", + "apihelp-query+imageinfo-param-badfilecontexttitle": "Ha a $2prop=badfile meg van adva, ezen cím használata a [[MediaWiki:Bad image list]] kiértékeléskor.", + "apihelp-query+imageinfo-param-localonly": "Csak helyi fájlok keresése.", + "apihelp-query+imageinfo-example-simple": "Információk lekérése a [[:File:Albert Einstein Head.jpg]] aktuális verziójáról.", + "apihelp-query+imageinfo-example-dated": "Információk lekérése a [[:File:Test.jpg]] 2008-as és korábbi verzióiról.", + "apihelp-query+images-summary": "A megadott lapokon használt összes fájl visszaadása.", + "apihelp-query+images-param-limit": "A visszaadandó fájlok száma.", + "apihelp-query+images-param-images": "Csak ezen fájlok listázása. Annak ellenőrzésére alkalmas, hogy egy lap használ-e egy adott fájlt.", + "apihelp-query+images-param-dir": "A listázás iránya.", + "apihelp-query+images-example-simple": "A [[Main Page]] lapon használt fájlok listázása.", + "apihelp-query+images-example-generator": "Információk lekérése a [[Main Page]] lapon használt fájlokról.", + "apihelp-query+imageusage-summary": "A megadott képcímet használó lapok lekérése.", + "apihelp-query+imageusage-param-title": "A keresendő cím. Nem használható együtt az $1pageid paraméterrel.", + "apihelp-query+imageusage-param-pageid": "A keresendő lapazonosító. Nem használható együtt az $1title paraméterrel.", + "apihelp-query+imageusage-param-namespace": "A listázandó névtér.", + "apihelp-query+imageusage-param-dir": "A listázás iránya.", + "apihelp-query+imageusage-param-filterredir": "Az átirányítások szűrése. Ha nonredirects, és az $1redirect paraméter engedélyezett, csak a második szintre érvényes.", + "apihelp-query+imageusage-param-limit": "A visszaadandó lapok maximális száma. Ha az $1redirect engedélyezve van, ez a limit minden szintre külön érvényes (vagyis összesen 2 × $1limit eredmény lehet a válaszban).", + "apihelp-query+imageusage-param-redirect": "Ha a hivatkozó lap átirányítás, az arra hivatkozó lapok keresése szintén. A maximális limit feleződik.", + "apihelp-query+imageusage-example-simple": "A [[:File:Albert Einstein Head.jpg]] képet használó lapok megjelenítése.", + "apihelp-query+imageusage-example-generator": "Információk lekérése a [[:File:Albert Einstein Head.jpg]] képet használó lapokról.", + "apihelp-query+info-summary": "Alapvető lapinformációk lekérése.", + "apihelp-query+info-param-prop": "További lekérendő tulajdonságok:", + "apihelp-query+info-paramvalue-prop-protection": "A lapok védelmi szintjeinek listázása.", + "apihelp-query+info-paramvalue-prop-talkid": "A vitalap lapazonosítója a nem-vitalapoknál.", + "apihelp-query+info-paramvalue-prop-watched": "A lapok figyelési státusza.", "apihelp-query+info-paramvalue-prop-watchers": "A lapot figyelők száma, ha lehetséges.", + "apihelp-query+info-paramvalue-prop-visitingwatchers": "A figyelők száma, akik látták a lap friss változtatásait, ha engedélyezett.", + "apihelp-query+info-paramvalue-prop-notificationtimestamp": "A figyelőlista értesítési időbélyege.", + "apihelp-query+info-paramvalue-prop-subjectid": "A tartalmi lap lapazonosítója a vitalapoknál.", + "apihelp-query+info-paramvalue-prop-readable": "A felhasználó olvashatja-e a lapot.", + "apihelp-query+info-paramvalue-prop-displaytitle": "A lap ténylegesen megjelenített címe.", + "apihelp-query+info-param-testactions": "Annak ellenőrzése, hogy a felhasználó végrehajthat-e bizonyos műveleteket a lapon.", + "apihelp-query+info-param-token": "Használd a [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] lekérdezést helyette.", + "apihelp-query+info-example-simple": "Információk lekérése a Main Page lapról.", + "apihelp-query+info-example-protection": "Alapvető és lapvédelmi információk lekérése a Main Page lapról.", + "apihelp-query+iwbacklinks-summary": "Egy adott interwikilinkre hivatkozó lapok lekérése.", + "apihelp-query+iwbacklinks-extended-description": "Használható adott előtagú vagy egy adott címre mutató (megadott előtagú) linkek keresésére. Mindkét paraméter elhagyásával az összes interwikilinket visszaadja.", + "apihelp-query+iwbacklinks-param-prefix": "Az interwiki előtagja.", + "apihelp-query+iwbacklinks-param-title": "A keresendő interwikilink. Az $1blprefix paraméterrel együtt használandó.", + "apihelp-query+iwbacklinks-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+iwbacklinks-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Az interwiki előtagja.", + "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Az interwiki címe.", + "apihelp-query+iwbacklinks-param-dir": "A listázás iránya.", + "apihelp-query+iwbacklinks-example-simple": "A [[wikibooks:Test]] könyvre hivatkozó lapok lekérése.", + "apihelp-query+iwbacklinks-example-generator": "Információk lekérése a [[wikibooks:Test]] könyvre hivatkozó lapokról.", + "apihelp-query+iwlinks-summary": "A megadott lapokon található összes interwikilink lekérése.", + "apihelp-query+iwlinks-param-prop": "A nyelvközi hivatkozásokhoz lekérendő további tulajdonságok:", + "apihelp-query+iwlinks-param-limit": "A visszaadandó interwikilinkek száma.", + "apihelp-query+iwlinks-param-prefix": "Csak a megadott előtagú interwikilinkek visszaadása.", + "apihelp-query+iwlinks-param-title": "A keresendő interwikilink. Az $1prefix paraméterrel együtt használandó.", + "apihelp-query+iwlinks-param-dir": "A listázás iránya.", + "apihelp-query+iwlinks-example-simple": "A Main Page lapon található interwikilinkek lekérése.", + "apihelp-query+langbacklinks-summary": "A megadott nyelvközi hivatkozásra hivatkozó lapok lekérése.", + "apihelp-query+langbacklinks-extended-description": "Használható adott előtagú vagy egy adott címre mutató (megadott előtagú) linkek keresésére. Mindkét paraméter elhagyásával az összes nyelvközi hivatkozást visszaadja.\n\nEz a lekérdezés nem feltétlenül veszi figyelembe a kiterjesztések által hozzáadott nyelvközi hivatkozásokat.", + "apihelp-query+langbacklinks-param-lang": "A nyelvközi hivatkozás nyelve.", + "apihelp-query+langbacklinks-param-title": "A keresendő nyelvközi hivatkozás. Az $1lang paraméterrel együtt használandó.", + "apihelp-query+langbacklinks-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+langbacklinks-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+langbacklinks-paramvalue-prop-lllang": "A nyelvközi hivatkozás nyelvkódja.", + "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "A nyelvközi hivatkozás címe.", + "apihelp-query+langbacklinks-param-dir": "A listázás iránya.", + "apihelp-query+langbacklinks-example-simple": "A [[:fr:Test]] lapra hivatkozó lapok lekérése.", + "apihelp-query+langbacklinks-example-generator": "Információk lekérése a [[:fr:Test]] lapra hivatkozó lapokról.", + "apihelp-query+langlinks-summary": "A megadott lapokon található összes nyelvközi hivatkozás lekérése.", + "apihelp-query+langlinks-param-limit": "A visszaadandó nyelvközi hivatkozások száma.", + "apihelp-query+langlinks-param-prop": "A nyelvközi hivatkozásokhoz lekérendő további tulajdonságok:", + "apihelp-query+langlinks-param-lang": "Csak ezen nyelvű nyelvközi hivatkozások visszaadása.", + "apihelp-query+langlinks-param-title": "A keresendő hivatkozás. Az $1prefix paraméterrel együtt használandó.", + "apihelp-query+langlinks-param-dir": "A listázás iránya.", + "apihelp-query+langlinks-param-inlanguagecode": "Nyelvkód a lefordított nyelvneveknek.", + "apihelp-query+langlinks-example-simple": "A Main Page lapon található nyelvközi hivatkozások lekérése.", + "apihelp-query+links-summary": "A megadott lapokon található összes hivatkozás lekérése.", + "apihelp-query+links-param-namespace": "Csak az ezen névterekbe mutató hivatkozások visszaadása.", + "apihelp-query+links-param-limit": "A visszaadandó hivatkozások száma.", + "apihelp-query+links-param-titles": "Csak ezen címekre mutató hivatkozások listázása. Annak ellenőrzésére alkalmas, hogy egy lap hivatkozik-e egy adott lapra.", + "apihelp-query+links-param-dir": "A listázás iránya.", + "apihelp-query+links-example-simple": "A Main Page lapon található hivatkozások lekérése.", + "apihelp-query+links-example-generator": "Információk lekérése a Main Page lapon lévő hivatkozások céllapjairól.", + "apihelp-query+links-example-namespaces": "A Main Page lapon található, {{ns:user}} és {{ns:template}} névterekbe mutató hivatkozások lekérése.", + "apihelp-query+linkshere-summary": "A megadott lapra hivatkozó lapok lekérése.", + "apihelp-query+linkshere-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+linkshere-paramvalue-prop-pageid": "A lapok lapazonosítói.", + "apihelp-query+linkshere-paramvalue-prop-title": "A lapok címei.", + "apihelp-query+linkshere-paramvalue-prop-redirect": "Az átirányítások megjelölése.", + "apihelp-query+linkshere-param-namespace": "Lapok listázása ezekben a névterekben.", + "apihelp-query+linkshere-param-limit": "A visszaadandó lapok száma.", + "apihelp-query+linkshere-param-show": "Szűrés az átirányítások alapján:\n;redirect: Csak átirányítások visszaadása.\n;!redirect: Átirányítások elrejtése.", + "apihelp-query+linkshere-example-simple": "A [[Main Page]] lapra hivatkozó lapok listázása.", + "apihelp-query+linkshere-example-generator": "Információk lekérése a [[Main Page]] lapra hivatkozó lapokról.", + "apihelp-query+logevents-summary": "Naplóbejegyzések lekérése.", + "apihelp-query+logevents-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+logevents-paramvalue-prop-ids": "A naplóbejegyzés azonosítója.", + "apihelp-query+logevents-paramvalue-prop-title": "Az eseményben érintett lap címe.", + "apihelp-query+logevents-paramvalue-prop-type": "A naplóbejegyzés típusa.", + "apihelp-query+logevents-paramvalue-prop-user": "Az eseményért felelős felhasználó.", + "apihelp-query+logevents-paramvalue-prop-userid": "Az eseményért felelős felhasználó azonosítója.", + "apihelp-query+logevents-paramvalue-prop-timestamp": "A naplóbejegyzés időbélyege.", + "apihelp-query+logevents-paramvalue-prop-comment": "A naplóbejegyzéshez tartozó megjegyzés.", + "apihelp-query+logevents-paramvalue-prop-details": "További részletek a naplóbejegyzésről.", + "apihelp-query+logevents-paramvalue-prop-tags": "A naplóbejegyzés címkéi.", + "apihelp-query+logevents-param-type": "Csak ezen típusú naplóbejegyzések visszaadása.", + "apihelp-query+logevents-param-start": "A listázás kezdő időbélyege.", + "apihelp-query+logevents-param-end": "A lista végét jelentő időbélyeg.", + "apihelp-query+logevents-param-user": "A bejegyzések szűrése az ezen felhasználó által végrehajtottakra.", + "apihelp-query+logevents-param-title": "A bejegyzések szűrése az ezen laphoz kapcsolódóakra.", + "apihelp-query+logevents-param-namespace": "A bejegyzések szűrése névtér alapján.", + "apihelp-query+logevents-param-prefix": "A bejegyzések szűrése az ezzel az előtaggal kezdődőekre.", + "apihelp-query+logevents-param-tag": "Csak ezzel a címkével ellátott bejegyzések listázása.", + "apihelp-query+logevents-param-limit": "A visszaadandó bejegyzések száma.", + "apihelp-query+logevents-example-simple": "A legutóbbi naplóbejegyzések listázása.", + "apihelp-query+pagepropnames-summary": "A wikin elérhető laptulajdonságnevek listázása.", + "apihelp-query+pagepropnames-param-limit": "A visszaadandó nevek maximális száma.", + "apihelp-query+pagepropnames-example-simple": "Az első 10 tulajdonságnév lekérése.", + "apihelp-query+pageprops-summary": "A lap tartalmában meghatározott különböző laptulajdonságok lekérése.", + "apihelp-query+pageprops-param-prop": "Csak ezen laptulajdonságok listázása (az [[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] visszaadja a használatban lévő laptulajdonságokat). Annak ellenőrzésére alkalmas, hogy egy lap benne használ-e egy adott laptulajdonságot.", + "apihelp-query+pageprops-example-simple": "A Main Page és MediaWiki lap tulajdonságainak lekérése.", + "apihelp-query+pageswithprop-summary": "Egy adott laptulajdonságot használó lapok listázása.", + "apihelp-query+pageswithprop-param-propname": "A listázandó laptulajdonság (az [[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] visszaadja a használatban lévő laptulajdonságokat).", + "apihelp-query+pageswithprop-param-prop": "Visszaadandó információk:", + "apihelp-query+pageswithprop-paramvalue-prop-ids": "A lap lapazonosítója.", + "apihelp-query+pageswithprop-paramvalue-prop-title": "A lap címe és névterének azonosítója.", + "apihelp-query+pageswithprop-paramvalue-prop-value": "A laptulajdonság értéke.", + "apihelp-query+pageswithprop-param-limit": "A lekérdezendő lapok maximális száma.", + "apihelp-query+pageswithprop-param-dir": "A rendezés iránya.", + "apihelp-query+pageswithprop-example-simple": "Az első 10 {{DISPLAYTITLE:}}-t használó lap listázása.", + "apihelp-query+pageswithprop-example-generator": "További információk lekérése az első 10 __NOTOC__ kapcsolót használó lapról.", + "apihelp-query+prefixsearch-param-search": "A keresőkifejezés.", + "apihelp-query+prefixsearch-param-namespace": "A keresendő névterek.", + "apihelp-query+prefixsearch-param-limit": "Találatok maximális száma.", + "apihelp-query+prefixsearch-param-offset": "Kihagyandó találatok száma.", + "apihelp-query+prefixsearch-example-simple": "meaning kezdetű lapcímek keresése.", + "apihelp-query+prefixsearch-param-profile": "Használandó keresőprofil.", + "apihelp-query+protectedtitles-summary": "Létrehozás ellen védett lapok listázása.", + "apihelp-query+protectedtitles-param-namespace": "Címek listázása csak ezekben a névterekben.", + "apihelp-query+protectedtitles-param-level": "Csak ilyen védelmi szintű címek listázása.", + "apihelp-query+protectedtitles-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+protectedtitles-param-start": "Listázás ettől a védelem-időbélyegtől.", + "apihelp-query+protectedtitles-param-end": "Listázás eddig a védelem-időbélyegig.", + "apihelp-query+protectedtitles-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "A levédés időbélyege.", + "apihelp-query+protectedtitles-paramvalue-prop-user": "A levédő felhasználó.", + "apihelp-query+protectedtitles-paramvalue-prop-userid": "A levédő felhasználó azonosítója.", + "apihelp-query+protectedtitles-paramvalue-prop-comment": "A védelem indoka.", + "apihelp-query+protectedtitles-paramvalue-prop-expiry": "A védelem lejáratának időbélyege.", + "apihelp-query+protectedtitles-paramvalue-prop-level": "Védelmi szint.", + "apihelp-query+protectedtitles-example-simple": "A védett címek listázása.", + "apihelp-query+protectedtitles-example-generator": "A fő névtérben lévő védett címekre mutató hivatkozások lekérése.", + "apihelp-query+querypage-summary": "Egy QueryPage-alapú speciális lap listájának lekérése.", + "apihelp-query+querypage-param-limit": "Megjelenítendő találatok száma.", + "apihelp-query+querypage-example-ancientpages": "A [[Special:Ancientpages]] eredményeinek lekérése.", + "apihelp-query+random-param-namespace": "Lapok visszaadása csak ezekből a névterekből.", + "apihelp-query+random-param-limit": "A visszaadandó véletlenszerű lapok száma.", + "apihelp-query+random-param-redirect": "Használd a $1filterredir=redirects paramétert helyette.", + "apihelp-query+random-param-filterredir": "Szűrés átirányítások alapján.", + "apihelp-query+random-example-simple": "Két lap visszaadása találomra a fő névtérből.", + "apihelp-query+random-example-generator": "Lapinformációk lekérése két véletlenszerűen kiválasztott fő névtérbeli lapról.", + "apihelp-query+recentchanges-summary": "A friss változtatások listázása.", + "apihelp-query+recentchanges-param-start": "Listázás ettől az időbélyegtől.", + "apihelp-query+recentchanges-param-end": "Listázás eddig az időbélyegig.", + "apihelp-query+recentchanges-param-namespace": "A változtatások szűrése ezekre a névterekre.", + "apihelp-query+recentchanges-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+recentchanges-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+recentchanges-param-tag": "Csak ezzel a címkével ellátott szerkesztések listázása.", + "apihelp-query+recentchanges-param-prop": "További információk visszaadása:", + "apihelp-query+recentchanges-paramvalue-prop-user": "A szerkesztést végrehajtó felhasználó, és hogy anonim-e.", + "apihelp-query+recentchanges-paramvalue-prop-userid": "A szerkesztést végrehajtó felhasználó azonosítója.", + "apihelp-query+recentchanges-paramvalue-prop-comment": "A szerkesztési összefoglaló.", + "apihelp-query+recentchanges-paramvalue-prop-timestamp": "A szerkesztés időbélyege.", + "apihelp-query+recentchanges-paramvalue-prop-title": "A szerkesztett lap címe.", + "apihelp-query+recentchanges-paramvalue-prop-ids": "A lapazonosító, frissváltoztatások-azonosító, valamint a régi és az új lapváltozat-azonosító.", + "apihelp-query+recentchanges-paramvalue-prop-sizes": "A lap régi és új hossza bájtban.", + "apihelp-query+recentchanges-paramvalue-prop-redirect": "A lap átirányítás-e.", + "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Az ellenőrizhető (patrol) szerkesztések megjelölése ellenőrzöttként vagy ellenőrizetlenként.", + "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Naplóinformációk (naplóazonosító, naplótípus stb.) a naplóbejegyzésekhez.", + "apihelp-query+recentchanges-paramvalue-prop-tags": "A változtatás címkéi.", + "apihelp-query+recentchanges-param-token": "Használd a [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] lekérdezést helyette.", + "apihelp-query+recentchanges-param-show": "Csak a kritériumoknak megfelelő elemek visszaadása. Például csak bejelentkezett felhasználók apró változtatásainak megtekintéséhez használd az $1show=minor|!anon értéket.", + "apihelp-query+recentchanges-param-limit": "A visszaadandó változások maximális száma.", + "apihelp-query+recentchanges-param-type": "A visszaadandó változások típusai.", + "apihelp-query+recentchanges-param-toponly": "Csak a lapok legfrissebb változtatásának visszaadása.", + "apihelp-query+recentchanges-example-simple": "Friss változtatások listázása.", + "apihelp-query+recentchanges-example-generator": "Lapinformációk lekérése az ellenőrizetlen változtatásokról (patrol).", + "apihelp-query+redirects-summary": "A megadott lapokra mutató átirányítások lekérése.", + "apihelp-query+redirects-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+redirects-paramvalue-prop-pageid": "Az átirányítások lapazonosítói.", + "apihelp-query+redirects-paramvalue-prop-title": "Az átirányítások címei.", + "apihelp-query+redirects-param-namespace": "Lapok listázása csak ezekben a névterekben.", + "apihelp-query+redirects-param-limit": "A visszaadandó átirányítások száma.", + "apihelp-query+redirects-example-simple": "A [[Main Page]] lapra mutató átirányítások listázása.", + "apihelp-query+redirects-example-generator": "Információk lekérése a [[Main Page]] lapra mutató átirányításokról.", + "apihelp-query+revisions-paraminfo-singlepageonly": "Csak egyetlen lappal használható (2. mód).", + "apihelp-query+revisions-param-startid": "Listázás ennek a lapváltozatnak az időbélyegétől. A lapváltozatnak léteznie kell, de nem szükséges ehhez a laphoz tartoznia.", + "apihelp-query+revisions-param-endid": "Listázás ennek a lapváltozatnak az időbélyegéig. A lapváltozatnak léteznie kell, de nem szükséges ehhez a laphoz tartoznia.", + "apihelp-query+revisions-param-start": "Listázás ettől az időbélyegtől.", + "apihelp-query+revisions-param-end": "Listázás eddig az időbélyegig.", + "apihelp-query+revisions-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+revisions-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+revisions-param-tag": "Csak ezzel a címkével ellátott változatok listázása.", + "apihelp-query+revisions-param-token": "Az egyes lapváltozatokhoz lekérendő tokenek.", + "apihelp-query+revisions-example-content": "Adatok lekérése tartalommal az API és Main Page lapok legfrissebb változatáról.", + "apihelp-query+revisions-example-last5": "A Main Page 5 legfrissebb változatának lekérése.", + "apihelp-query+revisions-example-first5": "A Main Page első 5 változatának lekérése.", + "apihelp-query+revisions-example-first5-after": "A Main Page 2006. május 1-jét követő első 5 változatának lekérése.", + "apihelp-query+revisions-example-first5-not-localhost": "A Main Page első 5 változatának lekérése, amit nem 127.0.0.1 anonim felhasználó készített.", + "apihelp-query+revisions-example-first5-user": "A Main Page első 5 változatának lekérése, amit a MediaWiki default felhasználó készített.", + "apihelp-query+revisions+base-param-prop": "Az egyes lapváltozatokhoz lekérendő tulajdonságok:", + "apihelp-query+revisions+base-paramvalue-prop-ids": "A változat azonosítója.", + "apihelp-query+revisions+base-paramvalue-prop-timestamp": "A változat időbélyege.", + "apihelp-query+revisions+base-paramvalue-prop-user": "A változatot létrehozó felhasználó.", + "apihelp-query+revisions+base-paramvalue-prop-userid": "A változatot létrehozó felhasználó azonosítója.", + "apihelp-query+revisions+base-paramvalue-prop-size": "A változat hossza bájtban.", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "A változat tartalommodell-azonosítója.", + "apihelp-query+revisions+base-paramvalue-prop-comment": "A szerkesztési összefoglaló.", + "apihelp-query+revisions+base-paramvalue-prop-content": "A változat szövege.", + "apihelp-query+revisions+base-paramvalue-prop-tags": "A változat címkéi.", + "apihelp-query+revisions+base-param-limit": "A visszaadandó változatok maximális száma.", + "apihelp-query+revisions+base-param-expandtemplates": "Használd a [[Special:ApiHelp/expandtemplates|action=expandtemplates]] lekérdezést helyette. A sablonok kibontása a változat tartalmában (az $1prop=content paraméterrel együtt használandó).", + "apihelp-query+revisions+base-param-section": "Csak ezen szakasz tartalmának lekérése.", + "apihelp-query+search-summary": "Teljes szöveges keresés végrehajtása.", + "apihelp-query+search-param-search": "Erre az értékre illeszkedő lapcímek és tartalom keresése. Használható lehet speciális keresési funkciók meghívására a wiki keresőmotorjától függően.", + "apihelp-query+search-param-namespace": "Keresés csak ezekben a névterekben.", + "apihelp-query+search-param-what": "A végrehajtandó keresési típus.", + "apihelp-query+search-param-info": "A visszaadandó metaadatok.", + "apihelp-query+search-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+search-paramvalue-prop-size": "A lap mérete bájtban.", + "apihelp-query+search-paramvalue-prop-wordcount": "A lap szószáma.", + "apihelp-query+search-paramvalue-prop-timestamp": "A lap utolsó szerkesztésének időbélyege.", + "apihelp-query+search-paramvalue-prop-redirecttitle": "Az illeszkedő átirányítás címe.", + "apihelp-query+search-paramvalue-prop-sectiontitle": "Az illeszkedő szakaszcím.", + "apihelp-query+search-paramvalue-prop-isfilematch": "A fájl tartalma illeszkedik-e.", + "apihelp-query+search-paramvalue-prop-score": "Figyelmen kívül hagyva.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Figyelmen kívül hagyva.", + "apihelp-query+search-param-limit": "A visszaadandó lapok maximális száma.", + "apihelp-query+search-param-interwiki": "Interwiki-találatok befoglalása az eredménybe, ha elérhetők.", + "apihelp-query+search-param-backend": "A használandó keresőmotor, ha nem az alapértelmezett.", + "apihelp-query+search-param-enablerewrites": "A keresőkifejezés átírásának engedélyezése. Bizonyos keresőmotorok át tudják írni a keresőkifejezést egy jobb találatokat adónak ítéltre, például elgépelések javításával.", + "apihelp-query+search-example-simple": "Keresés a meaning szóra.", + "apihelp-query+search-example-text": "Keresés a meaning szóra a lapok szövegében.", + "apihelp-query+search-example-generator": "Lapinformációk lekérése a meaning szóra kapott találatokról.", + "apihelp-query+siteinfo-summary": "Általános információk lekérése a wikiről.", + "apihelp-query+siteinfo-param-prop": "A lekérendő információk:", + "apihelp-query+siteinfo-paramvalue-prop-general": "Általános rendszerinformációk.", + "apihelp-query+siteinfo-paramvalue-prop-statistics": "Wikistatisztikák.", + "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Felhasználócsoportok és jogaik.", + "apihelp-query+siteinfo-paramvalue-prop-libraries": "A wikin telepített függvénykönyvtárak.", + "apihelp-query+siteinfo-paramvalue-prop-extensions": "A wikin telepített kiterjesztések.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "A feltölthető fájlkiterjesztések (fájltípusok) listája.", + "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "A wiki szerzői jogi (licenc-) információi, ha elérhetők.", + "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Információk az elérhető korlátozási (lapvédelmi) típusokról.", + "apihelp-query+siteinfo-paramvalue-prop-variables": "Az elérhető változónevek listája.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "A külső hivatkozásokban engedélyezett protokollok listája.", + "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "A felhasználói beállítások alapértelmezett értékei.", + "apihelp-query+siteinfo-param-filteriw": "Csak helyi vagy csak nem helyi interwikik visszaadása az interwikitérképben.", + "apihelp-query+siteinfo-param-numberingroup": "A egyes felhasználócsoportokba tartozó felhasználók számának listázása.", + "apihelp-query+siteinfo-example-simple": "Wikiinformációk lekérése.", + "apihelp-query+siteinfo-example-interwiki": "A helyi interwiki-előtagok listájának lekérése.", + "apihelp-query+tags-summary": "Változtatáscímkék listázása.", + "apihelp-query+tags-param-limit": "A listázandó címkék maximális száma.", + "apihelp-query+tags-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+tags-paramvalue-prop-name": "A címke neve.", + "apihelp-query+tags-paramvalue-prop-displayname": "A címke rendszerüzenete.", + "apihelp-query+tags-paramvalue-prop-description": "A címke leírása.", + "apihelp-query+tags-paramvalue-prop-hitcount": "A címkével rendelkező lapváltozatok és naplóbejegyzések száma.", + "apihelp-query+tags-paramvalue-prop-defined": "A címke definiálva van-e.", + "apihelp-query+tags-example-simple": "Az elérhető címkék listázása.", + "apihelp-query+templates-summary": "A megadott lapokra beillesztett összes lap visszaadása.", + "apihelp-query+templates-param-namespace": "Csak ezekben a névterekben található sablonok visszaadása.", + "apihelp-query+templates-param-limit": "A visszaadandó sablonok száma.", + "apihelp-query+templates-param-templates": "Csak ezen sablonok listázása. Annak ellenőrzésére alkalmas, hogy egy lap beilleszt-e egy adott sablont.", + "apihelp-query+templates-param-dir": "A listázás iránya.", + "apihelp-query+templates-example-simple": "A Main Page lapon használt sablonok lekérése.", + "apihelp-query+templates-example-generator": "Információk lekérése a Main Page lapon használt sablonlapokról.", + "apihelp-query+templates-example-namespaces": "A Main Page lapon használt {{ns:user}} és {{ns:template}} névtérbeli sablonok lekérése.", + "apihelp-query+tokens-summary": "Tokenek lekérése adatmódosító műveletekhez.", + "apihelp-query+tokens-param-type": "Lekérendő tokentípusok.", + "apihelp-query+tokens-example-simple": "Egy csrf token lekérése (alapértelmezett).", + "apihelp-query+tokens-example-types": "Egy watch és egy patrol token lekérése.", + "apihelp-query+transcludedin-summary": "A megadott lapokat beillesztő lapok lekérése.", + "apihelp-query+transcludedin-param-prop": "Lekérendő tulajdonságok:", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "A lapok lapazonosítói.", + "apihelp-query+transcludedin-paramvalue-prop-title": "A lapok címei.", + "apihelp-query+transcludedin-paramvalue-prop-redirect": "Az átirányítások megjelölése.", + "apihelp-query+transcludedin-param-namespace": "Lapok listázása csak ezekben a névterekben.", + "apihelp-query+transcludedin-param-limit": "A visszaadandó lapok száma.", + "apihelp-query+transcludedin-param-show": "Szűrés az átirányítások alapján:\n;redirect: Csak átirányítások visszaadása.\n;!redirect: Átirányítások elrejtése.", + "apihelp-query+transcludedin-example-simple": "A Main Page lapot beillesztő lapok listájának lekérése.", + "apihelp-query+transcludedin-example-generator": "Információk lekérése a Main Page lapot beillesztő lapokról.", + "apihelp-query+usercontribs-summary": "Egy felhasználó összes szerkesztésének lekérése.", + "apihelp-query+usercontribs-param-limit": "A visszaadott szerkesztések maximális száma.", + "apihelp-query+usercontribs-param-start": "Visszaadás ettől az időbélyegtől.", + "apihelp-query+usercontribs-param-end": "Visszaadás eddig az időbélyegig.", + "apihelp-query+usercontribs-param-namespace": "Szerkesztések listázása csak ezekben a névterekben.", + "apihelp-query+usercontribs-param-prop": "További információk visszaadása:", + "apihelp-query+usercontribs-paramvalue-prop-ids": "A lap- és lapváltozat-azonosító.", + "apihelp-query+usercontribs-paramvalue-prop-title": "A lap címe és névterének azonosítója.", + "apihelp-query+usercontribs-paramvalue-prop-timestamp": "A szerkesztés időbélyege.", + "apihelp-query+usercontribs-paramvalue-prop-comment": "A szerkesztési összefoglaló.", + "apihelp-query+usercontribs-paramvalue-prop-size": "A szerkesztett lap új mérete.", + "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Az ellenőrzött szerkesztések megjelölése (patrol).", + "apihelp-query+usercontribs-paramvalue-prop-tags": "A szerkesztés címkéi.", + "apihelp-query+usercontribs-param-show": "Csak a kritériumoknak megfelelő szerkesztések mutatása, pl. csak nem apró szerkesztések: $2show=!minor.\n\nHa az $2show=patrolled vagy $2show=!patrolled meg van adva, a [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]-nél ($1 másodperc) régebbi szerkesztések nem jelennek meg.", + "apihelp-query+usercontribs-param-tag": "Csak ezzel a címkével ellátott változatok listázása.", + "apihelp-query+usercontribs-param-toponly": "Csak a legfrissebbnek számító szerkesztések visszaadása.", + "apihelp-query+usercontribs-example-user": "Example szerkesztéseinek megjelenítése.", + "apihelp-query+usercontribs-example-ipprefix": "192.0.2. kezdetű IP-címek szerkesztéseinek megjelenítése.", + "apihelp-query+userinfo-summary": "Információk lekérése az aktuális felhasználóról.", + "apihelp-query+userinfo-param-prop": "Visszaadandó információk:", + "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Blokkolva van-e az aktuális felhasználó, és ha igen, akkor ki és miért blokkolta.", + "apihelp-query+userinfo-paramvalue-prop-groups": "A jelenlegi felhasználó összes csoportjának listája.", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "A jelenlegi felhasználó explicit csoportjainak listája, az egyes csoporttagságok lejárati idejével.", + "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Azoknak a csoportoknak a listája, amiknek a jelenlegi felhasználó automatikusan tagja.", + "apihelp-query+userinfo-paramvalue-prop-rights": "A jelenlegi felhasználó jogosultságainak listája.", + "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "A jelenlegi felhasználó által hozzáadható és eltávolítható csoportok listája.", + "apihelp-query+userinfo-paramvalue-prop-options": "A jelenlegi felhasználó beállításai.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "A jelenlegi felhasználó beállításainak megváltoztatásához szükséges token lekérése.", + "apihelp-query+userinfo-paramvalue-prop-editcount": "A jelenlegi felhasználó szerkesztésszáma.", + "apihelp-query+userinfo-paramvalue-prop-ratelimits": "A jelenlegi felhasználóra érvényes sebességkorlátozások.", + "apihelp-query+userinfo-paramvalue-prop-realname": "A felhasználó valódi neve.", + "apihelp-query+userinfo-paramvalue-prop-email": "A felhasználó e-mail-címe és megerősítésének dátuma.", + "apihelp-query+userinfo-paramvalue-prop-registrationdate": "A felhasználó regisztrációjának dátuma.", + "apihelp-query+userinfo-paramvalue-prop-unreadcount": "A felhasználó figyelőlistáján levő olvasatlan lapok száma (legfeljebb $1; $2 értéket ad vissza, ha több).", + "apihelp-query+userinfo-paramvalue-prop-centralids": "A felhasználó központi azonosítói és az összekapcsolási státusza.", + "apihelp-query+userinfo-param-attachedwiki": "A felhasználó össze van-e kapcsolva az ezen azonosítójú wikivel, az $1prop=centralids paraméterrel együtt használandó.", + "apihelp-query+userinfo-example-simple": "Információk lekérése az aktuális felhasználóról.", + "apihelp-query+userinfo-example-data": "További információk lekérése az aktuális felhasználóról.", + "apihelp-query+users-summary": "Információk lekérése felhasználók listájáról.", + "apihelp-query+users-param-prop": "Visszaadandó információk:", + "apihelp-query+users-paramvalue-prop-blockinfo": "Blokkolva van-e a felhasználó, és ha igen, akkor ki és miért blokkolta.", + "apihelp-query+users-paramvalue-prop-groups": "A felhasználó összes csoportjának listája.", + "apihelp-query+users-paramvalue-prop-groupmemberships": "A felhasználó explicit csoportjainak listája, az egyes csoporttagságok lejárati idejével.", + "apihelp-query+users-paramvalue-prop-implicitgroups": "Azoknak a csoportoknak a listája, amiknek a felhasználó automatikusan tagja.", + "apihelp-query+users-paramvalue-prop-rights": "A felhasználó jogosultságainak listája.", + "apihelp-query+users-paramvalue-prop-editcount": "A felhasználó szerkesztésszáma.", + "apihelp-query+users-paramvalue-prop-registration": "A felhasználó regisztrációjának időbélyege.", + "apihelp-query+users-paramvalue-prop-emailable": "A felhasználó szeretne-e e-mailt fogadni a [[Special:Emailuser]] lapon keresztül.", + "apihelp-query+users-paramvalue-prop-gender": "A felhasználó neme („male”, „female” vagy „unknown”).", + "apihelp-query+users-paramvalue-prop-centralids": "A felhasználó központi azonosítói és az összekapcsolási státusza.", + "apihelp-query+users-paramvalue-prop-cancreate": "Létrehozható-e fiók az érvényes, de nem regisztrált felhasználóneveken.", + "apihelp-query+users-param-attachedwiki": "A felhasználó össze van-e kapcsolva az ezen azonosítójú wikivel, az $1prop=centralids paraméterrel együtt használandó.", + "apihelp-query+users-param-users": "A lekérendő felhasználók listája.", + "apihelp-query+users-param-userids": "A lekérendő felhasználók azonosítóinak listája.", + "apihelp-query+users-param-token": "Használd a [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] lekérdezést helyette.", + "apihelp-query+users-example-simple": "Információk lekérése Example felhasználóról.", + "apihelp-query+watchlist-summary": "A felhasználó figyelőlistáján szereplő lapok friss változtatásainak lekérése.", + "apihelp-query+watchlist-param-allrev": "Egy lap összes változtatásának lekérése a megadott időszakból.", + "apihelp-query+watchlist-param-start": "Listázás ettől az időbélyegtől.", + "apihelp-query+watchlist-param-end": "Listázás eddig az időbélyegig.", + "apihelp-query+watchlist-param-namespace": "A változtatások szűrése ezekre a névterekre.", + "apihelp-query+watchlist-param-user": "Csak ezen felhasználó szerkesztéseinek listázása.", + "apihelp-query+watchlist-param-excludeuser": "Ezen felhasználó szerkesztéseinek kihagyása.", + "apihelp-query+watchlist-param-limit": "A kérésenként visszaadandó eredmények száma.", + "apihelp-query+watchlist-param-prop": "További lekérendő tulajdonságok:", + "apihelp-query+watchlist-paramvalue-prop-ids": "Lapváltozat- és lapazonosítók.", + "apihelp-query+watchlist-paramvalue-prop-title": "A lap címe.", + "apihelp-query+watchlist-paramvalue-prop-user": "A szerkesztést végrehajtó felhasználó.", + "apihelp-query+watchlist-paramvalue-prop-userid": "A szerkesztést végrehajtó felhasználó azonosítója.", + "apihelp-query+watchlist-paramvalue-prop-comment": "A szerkesztési összefoglaló.", + "apihelp-query+watchlist-paramvalue-prop-timestamp": "A szerkesztés időbélyege.", + "apihelp-query+watchlist-paramvalue-prop-patrol": "Az ellenőrzött szerkesztések megjelölése (patrol).", + "apihelp-query+watchlist-paramvalue-prop-sizes": "A lap régi és új hossza.", + "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Annak időbélyege, amikor a felhasználó utoljára értesítést kapott a szerkesztésről.", + "apihelp-query+watchlist-param-show": "Csak a kritériumoknak megfelelő elemek visszaadása. Például csak bejelentkezett felhasználók apró változtatásainak megtekintéséhez használd az $1show=minor|!anon értéket.", + "apihelp-query+watchlist-param-type": "A megjelenítendő változtatások típusai:", + "apihelp-query+watchlist-paramvalue-type-edit": "Normál lapszerkesztések.", + "apihelp-query+watchlist-paramvalue-type-external": "Külső változtatások.", + "apihelp-query+watchlist-paramvalue-type-new": "Laplétrehozások.", + "apihelp-query+watchlist-paramvalue-type-log": "Naplóbejegyzések.", + "apihelp-query+watchlist-paramvalue-type-categorize": "Kategóriaváltoztatások.", + "apihelp-query+watchlist-param-owner": "A $1token paraméterrel együtt használandó egy másik felhasználó figyelőlistájának elérésére.", + "apihelp-query+watchlist-param-token": "Egy biztonsági token (elérhető a felhasználó [[Special:Preferences#mw-prefsection-watchlist|beállításaiban]]) egy másik felhasználó figyelőlistájának eléréséhez.", + "apihelp-query+watchlist-example-simple": "A jelenlegi felhasználó figyelőlistáján szereplő nemrég módosított lapok legfrissebb változatának listázása.", + "apihelp-query+watchlist-example-props": "További információk lekérése a jelenlegi felhasználó figyelőlistáján szereplő nemrég módosított lapok legfrissebb változatáról.", + "apihelp-query+watchlist-example-allrev": "További információk lekérése a jelenlegi felhasználó figyelőlistáján szereplő összes friss változtatásról.", + "apihelp-query+watchlist-example-generator": "Lapinformációk lekérése a jelenlegi felhasználó figyelőlistáján szereplő nemrég módosított lapokról.", + "apihelp-query+watchlist-example-generator-rev": "Lapváltozat-információk lekérése a jelenlegi felhasználó figyelőlistáján szereplő friss változtatásokról.", + "apihelp-query+watchlist-example-wlowner": "Exapmle felhasználó figyelőlistáján szereplő nemrég módosított lapok legfrissebb változatának listázása.", + "apihelp-query+watchlistraw-summary": "A jelenlegi felhasználó figyelőlistáján szereplő összes lap lekérése.", + "apihelp-query+watchlistraw-param-namespace": "Lapok listázása csak ezekben a névterekben.", + "apihelp-query+watchlistraw-param-limit": "A kérésenként visszaadandó eredmények száma.", + "apihelp-query+watchlistraw-param-prop": "További lekérendő tulajdonságok:", + "apihelp-query+watchlistraw-paramvalue-prop-changed": "Annak időbélyege, amikor a felhasználó utoljára értesítést kapott a szerkesztésről.", + "apihelp-query+watchlistraw-param-show": "Csak a kritériumoknak megfelelő elemek listázása.", + "apihelp-query+watchlistraw-param-owner": "A $1token paraméterrel együtt használandó egy másik felhasználó figyelőlistájának elérésére.", + "apihelp-query+watchlistraw-param-token": "Egy biztonsági token (elérhető a felhasználó [[Special:Preferences#mw-prefsection-watchlist|beállításaiban]]) egy másik felhasználó figyelőlistájának eléréséhez.", + "apihelp-query+watchlistraw-param-dir": "A listázás iránya.", + "apihelp-query+watchlistraw-param-fromtitle": "Listázás ettől a címtől (névtérelőtaggal).", + "apihelp-query+watchlistraw-param-totitle": "Listázás eddig a címig (névtérelőtaggal).", + "apihelp-query+watchlistraw-example-simple": "A jelenlegi felhasználó figyelőlistáján szereplő lapok lekérése.", + "apihelp-query+watchlistraw-example-generator": "Lapinformációk lekérése a jelenlegi felhasználó figyelőlistáján szereplő lapokról.", + "apihelp-removeauthenticationdata-summary": "A jelenlegi felhasználó hitelesítési adatainak eltávolítása.", + "apihelp-removeauthenticationdata-example-simple": "Kísérlet a jelenlegi felhasználó FooAuthenticationRequest kéréshez kapcsolódó adatainak eltávolítására.", + "apihelp-resetpassword-summary": "Jelszó-visszaállító e-mail küldése a felhasználónak.", + "apihelp-resetpassword-extended-description-noroutes": "Nem érhetők el jelszó-visszaállítási módok.\n\nEngedélyezz néhány módot a [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] PHP-változóval a modul használatához.", + "apihelp-resetpassword-param-user": "A visszaállítandó felhasználó.", + "apihelp-resetpassword-param-email": "A visszaállítandó felhasználó e-mail-címe.", + "apihelp-resetpassword-example-user": "Jelszó-visszaállító e-mail küldése Example felhasználónak.", + "apihelp-resetpassword-example-email": "Jelszó-visszaállító e-mail küldése az összes user@example.com e-mail-című felhasználónak.", + "apihelp-revisiondelete-summary": "Változatok törlése és helyreállítása.", + "apihelp-revisiondelete-param-ids": "A törlendő lapváltozatok azonosítói.", + "apihelp-revisiondelete-param-reason": "A törlés vagy helyreállítás indoklása.", + "apihelp-revisiondelete-example-revision": "A 12345 lapváltozat tartalmának elrejtése a Main Page lapon.", + "apihelp-revisiondelete-example-log": "A 67890 naplóbejegyzés összes adatának elrejtése BLP violation indoklással.", + "apihelp-rollback-summary": "A lap legutóbbi változtatásának visszavonása.", + "apihelp-rollback-extended-description": "Ha a lap utolsó szerkesztője egymás után több szerkesztést végzett, az összes visszavonása.", + "apihelp-rollback-param-title": "A visszaállítandó lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-rollback-param-pageid": "A visszaállítandó lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-rollback-param-summary": "Egyéni szerkesztési összefoglaló. Ha üres, az alapértelmezett összefoglaló lesz használatban.", + "apihelp-rollback-param-markbot": "A visszavont és a visszavonó szerkesztések botszerkesztésnek jelölése.", + "apihelp-rollback-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", + "apihelp-rsd-summary": "Egy RSD-séma (Really Simple Discovery) exportálása.", + "apihelp-rsd-example-simple": "Az RSD-séma exportálása.", + "apihelp-setnotificationtimestamp-summary": "A figyelt lapok értesítési időbélyegének frissítése.", + "apihelp-setnotificationtimestamp-extended-description": "Ez érinti a módosított lapok kiemelését a figyelőlistán és a laptörténetekben, valamint az e-mail-küldést a „{{int:tog-enotifwatchlistpages}}” beállítás engedélyezése esetén.", + "apihelp-setnotificationtimestamp-param-entirewatchlist": "Dolgozás az összes figyelt lapon.", + "apihelp-setnotificationtimestamp-param-timestamp": "Az értesítési időbélyeg állítása erre az időbélyegre.", + "apihelp-setnotificationtimestamp-param-torevid": "Az értesítési időbélyeg állítása erre a lapváltozatra (csak egy lap esetén).", + "apihelp-setnotificationtimestamp-param-newerthanrevid": "Az értesítési időbélyeg állítása ennél a lapváltozatnál újabbra (csak egy lap esetén).", + "apihelp-setnotificationtimestamp-example-all": "Az értesítési állapot visszaállítása a teljes figyelőlistára.", + "apihelp-setnotificationtimestamp-example-page": "A Main page értesítési állapotának visszaállítása.", + "apihelp-setnotificationtimestamp-example-pagetimestamp": "A Main page értesítési időbélyegének módosítása, hogy a 2012. január 1-jét követő szerkesztések nem megtekintettek legyenek.", + "apihelp-setnotificationtimestamp-example-allpages": "A {{ns:user}} névtérbeli lapok értesítési állapotának visszaállítása.", + "apihelp-setpagelanguage-summary": "Egy lap nyelvének módosítása.", + "apihelp-setpagelanguage-extended-description-disabled": "A lapnyelv módosítása nem engedélyezett ezen a wikin.\n\nEngedélyezd a [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] PHP-változót ezen művelet használatához.", + "apihelp-setpagelanguage-param-title": "A módosítandó lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-setpagelanguage-param-pageid": "A módosítandó lap azonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-setpagelanguage-param-lang": "A lap nyelvének módosítása erre a nyelvkódra. Használd a default értéket a wiki alapértelmezett tartalomnyelvére való visszaállításhoz.", + "apihelp-setpagelanguage-param-reason": "A módosítás oka.", + "apihelp-setpagelanguage-example-language": "A Main Page nyelvének módosítása baszkra.", + "apihelp-setpagelanguage-example-default": "A 123 azonosítójú lap nyelvének módosítása a wiki alapértelmezett tartalomnyelvére.", + "apihelp-stashedit-summary": "Egy szerkesztés előkészítése a megosztott gyorsítótárban.", + "apihelp-stashedit-extended-description": "Ez a modul AJAX segítségével, a szerkesztőűrlapról történő használatra készült a lapmentés teljesítményének javítására.", + "apihelp-stashedit-param-title": "A szerkesztett lap címe.", + "apihelp-stashedit-param-section": "A szerkesztett szakasz száma. 0 a bevezetőhöz, new új szakaszhoz.", + "apihelp-stashedit-param-sectiontitle": "Az új szakasz címe.", + "apihelp-stashedit-param-text": "A lap tartalma.", + "apihelp-stashedit-param-contentmodel": "Az új tartalom tartalommodellje.", + "apihelp-stashedit-param-baserevid": "Az alapváltozat változatazonosítója.", + "apihelp-stashedit-param-summary": "Szerkesztési összefoglaló.", "apihelp-userrights-param-userid": "Felhasználói azonosító.", "api-help-title": "MediaWiki API súgó", "api-help-lead": "Ez egy automatikusan generált MediaWiki API-dokumentációs lap.\n\nDokumentáció és példák: https://www.mediawiki.org/wiki/API", @@ -86,12 +1156,13 @@ "api-help-param-type-boolean": "Típus: logikai ([[Special:ApiHelp/main#main/datatypes|részletek]])", "api-help-param-type-timestamp": "Típus: {{PLURAL:$1|1=időbélyeg|2=időbélyegek listája}} ([[Special:ApiHelp/main#main/datatypes|engedélyezett formátumok]])", "api-help-param-type-user": "Típus: {{PLURAL:$1|1=felhasználónév|2=felhasználónevek listája}}", - "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: {{!}})}}: $2", + "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: {{!}} vagy [[Special:ApiHelp/main#main/datatypes|más]])}}: $2", "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Üresnek kell lennie|Lehet üres vagy $2}}", "api-help-param-limit": "Nem engedélyezett több mint $1.", "api-help-param-limit2": "Nem engedélyezett több mint $1 (botoknak $2).", "api-help-param-integer-min": "Az {{PLURAL:$1|1=érték nem lehet kisebb|2=értékek nem lehetnek kisebbek}} mint $2.", "api-help-param-integer-max": "Az {{PLURAL:$1|1=érték nem lehet nagyobb|2=értékek nem lehetnek nagyobbak}} mint $3.", "api-help-param-integer-minmax": "{{PLURAL:$1|1=Az értéknek $2 és $3 között kell lennie.|2=Az értékeknek $2 és $3 között kell lenniük.}}", - "api-help-param-default": "Alapértelmezett: $1" + "api-help-param-default": "Alapértelmezett: $1", + "apierror-timeout": "A kiszolgáló nem adott választ a várt időn belül." } diff --git a/includes/api/i18n/ia.json b/includes/api/i18n/ia.json index dad298fd22..462726ae17 100644 --- a/includes/api/i18n/ia.json +++ b/includes/api/i18n/ia.json @@ -5,7 +5,8 @@ "Rafaneta" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n
    \nStato: Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\nRequestas erronee: Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\nTests: Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n
    \nStato: Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\nRequestas erronee: Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\nTests: Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].", "apihelp-main-param-action": "Qual action exequer.", "apihelp-main-param-format": "Le formato del resultato.", "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error maxlag es retornate con un message como Attende $host: $lag secundas de latentia.
    Vide [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] pro plus information.", @@ -19,7 +20,7 @@ "apihelp-main-param-responselanginfo": "Includer le linguas usate pro uselang e errorlang in le resultato.", "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST).\n\nPro requestas authenticate, isto debe corresponder exactemente a un del origines in le capite Origin, dunque debe esser mittite a qualcosa como http://ia.wikipedia.org o https://meta.wikimedia.org. Si iste parametro non corresponde al capite Origin, un responsa 403 essera retornate. Si iste parametro corresponde al capite Origin e le origine es in le lista blanc, le capites Access-Control-Allow-Origin e Access-Control-Allow-Credentials essera inserite.\n\nPro requestas non authenticate, specifica le valor *. Isto causara le insertion del capite Access-Control-Allow-Origin, ma Access-Control-Allow-Credentials essera mittite a false e tote le datos specific al usator essera restringite.", "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages retorna un lista de codices de lingua, o specifica user pro usar le preferentia de lingua del usator actual, o specifica content pro usar le lingua de contento de iste wiki.", - "apihelp-block-description": "Blocar un usator.", + "apihelp-block-summary": "Blocar un usator.", "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo de adresses IP a blocar. Non pote esser usate insimul a $1userid", "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. 5 months o 2 weeks<.kbd>) o absolute (p.ex. 2014-09-18T12:34:56Z). Si es mittite a infinite, indefinite o never, le blocada nunquam expirara.", "apihelp-block-param-reason": "Motivo del blocada.", @@ -33,19 +34,20 @@ "apihelp-block-param-watchuser": "Observar le paginas de usator e discussion del usator o del adresse IP.", "apihelp-block-example-ip-simple": "Blocar le adresse IP 192.0.2.5 pro tres dies con le motivo Prime advertimento.", "apihelp-block-example-user-complex": "Blocar le usator Vandalo pro tempore indeterminate con le motivo Vandalismo, e impedir le creation de nove contos e le invio de e-mail.", - "apihelp-changeauthenticationdata-description": "Cambiar le datos de authentication pro le usator actual.", + "apihelp-changeauthenticationdata-summary": "Cambiar le datos de authentication pro le usator actual.", "apihelp-changeauthenticationdata-example-password": "Tentar de cambiar le contrasigno del usator actual a ExemploDeContrasigno.", - "apihelp-checktoken-description": "Verificar le validitate de un indicio ab [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Verificar le validitate de un indicio ab [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Typo de indicio a testar.", "apihelp-checktoken-param-token": "Indicio a testar.", "apihelp-checktoken-param-maxtokenage": "Etate maxime permittite pro le indicio, in secundas.", "apihelp-checktoken-example-simple": "Testar le validitate de un indicio csrf.", - "apihelp-clearhasmsg-description": "Cancella le signal hasmsg pro le usator actual.", + "apihelp-clearhasmsg-summary": "Cancella le signal hasmsg pro le usator actual.", "apihelp-clearhasmsg-example-1": "Cancellar le signal hasmsg pro le usator actual.", - "apihelp-clientlogin-description": "Aperir session in le wiki usante le fluxo interactive.", + "apihelp-clientlogin-summary": "Aperir session in le wiki usante le fluxo interactive.", "apihelp-clientlogin-example-login": "Comenciar le processo de aperir session in le wiki como le usator Exemplo con le contrasigno ExemploDeContrasigno.", "apihelp-clientlogin-example-login2": "Continuar a aperir session post un responsa UI pro authentication bifactorial, forniente un OATHToken de 987654.", - "apihelp-compare-description": "Obtener le differentia inter duo paginas.\n\nEs necessari indicar un numero de version, un titulo de pagina o un ID de pagina, e pro \"from\" e pro \"to\".", + "apihelp-compare-summary": "Obtener le differentia inter duo paginas.", + "apihelp-compare-extended-description": "Es necessari indicar un numero de version, un titulo de pagina o un ID de pagina, e pro \"from\" e pro \"to\".", "apihelp-compare-param-fromtitle": "Prime titulo a comparar.", "apihelp-compare-param-fromid": "Prime ID de pagina comparar.", "apihelp-compare-param-fromrev": "Prime version a comparar.", @@ -53,7 +55,7 @@ "apihelp-compare-param-toid": "Secunde ID de pagina a comparar.", "apihelp-compare-param-torev": "Secunde version a comparar.", "apihelp-compare-example-1": "Crear un diff inter version 1 e 2.", - "apihelp-createaccount-description": "Crear un nove conto de usator.", + "apihelp-createaccount-summary": "Crear un nove conto de usator.", "apihelp-createaccount-param-name": "Nomine de usator.", "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.", "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del Pagina principal que non ha essite facite per le usator anonyme 127.0.0.1", diff --git a/includes/api/i18n/id.json b/includes/api/i18n/id.json index 5ae354704e..b1d2f28616 100644 --- a/includes/api/i18n/id.json +++ b/includes/api/i18n/id.json @@ -10,7 +10,7 @@ }, "apihelp-main-param-action": "Tindakan manakah yang akan dilakukan.", "apihelp-main-param-format": "Format keluaran.", - "apihelp-block-description": "Blokir pengguna.", + "apihelp-block-summary": "Blokir pengguna.", "apihelp-block-param-user": "Nama pengguna, alamat IP, atau rentang alamat IP untuk diblokir.", "apihelp-block-param-expiry": "Waktu kedaluwarsa. Dapat berupa waktu relatif (seperti 5 bulan atau 2 minggu) atau waktu absolut (seperti 2014-09-18T12:34:56Z). Jika diatur ke selamanya, tak terbatas, atau tidak pernah, pemblokiran itu tidak akan berakhir.", "apihelp-block-param-reason": "Alasan pemblokiran.", @@ -26,7 +26,7 @@ "apihelp-compare-param-toid": "ID halaman kedua untuk dibandingkan.", "apihelp-compare-param-torev": "Revisi kedua untuk dibandingkan.", "apihelp-compare-example-1": "Buat perbedaan antara revisi 1 dan 2.", - "apihelp-createaccount-description": "Buat akun pengguna baru.", + "apihelp-createaccount-summary": "Buat akun pengguna baru.", "apihelp-createaccount-example-create": "Mulai proses pembuatan pengguna Contoh dengan kata sandi ContohKataSandi.", "apihelp-createaccount-param-name": "Nama pengguna", "apihelp-createaccount-param-password": "Kata sandi (diabaikan jika $1mailpassword diatur).", @@ -39,7 +39,7 @@ "apihelp-createaccount-param-language": "Kode bahasa untuk diatur sebagai baku kepada pengguna (opsional, nilai bakunya adalah bahasa isi).", "apihelp-createaccount-example-pass": "Buat pengguna testuser dengan kata sandi test123.", "apihelp-createaccount-example-mail": "Buat pengguna testmailuser dan kirim surel berisi kata sandi acak.", - "apihelp-delete-description": "Hapus halaman", + "apihelp-delete-summary": "Hapus halaman", "apihelp-delete-param-title": "Judul halaman untuk dihapus. Tidak dapat digunakan bersama dengan $1pageid.", "apihelp-delete-param-pageid": "ID halaman dari halaman yang akan dihapus. Tidak dapat digunakan bersama dengan $1title.", "apihelp-delete-param-reason": "Alasan penghapusan. Jika tidak diberikan, alasan yang dihasilkan secara otomatis akan digunakan.", @@ -50,8 +50,8 @@ "apihelp-delete-param-oldimage": "Nama gambar lama untuk dihapus seperti yang disebutkan oleh [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Hapus Halaman Utama.", "apihelp-delete-example-reason": "Hapus Halaman Utama dengan alasan Persiapan untuk dialihkan.", - "apihelp-disabled-description": "Modul ini telah dimatikan.", - "apihelp-edit-description": "Buat dan sunting halaman.", + "apihelp-disabled-summary": "Modul ini telah dimatikan.", + "apihelp-edit-summary": "Buat dan sunting halaman.", "apihelp-edit-param-title": "Judul halaman untuk dibuat. Tidak dapat digunakan bersama dengan $1pageid.", "apihelp-edit-param-pageid": "ID halaman dari halaman yang akan disunting. Tidak dapat digunakan bersama dengan $1title.", "apihelp-edit-param-section": "Nomor bagian. 0 untuk bagian atas, baru untuk bagian baru.", @@ -82,12 +82,12 @@ "apihelp-edit-example-edit": "Sunting halaman.", "apihelp-edit-example-prepend": "Tambahkan __NOTOC__ ke halaman.", "apihelp-edit-example-undo": "Batalkan revisi 13579 melalui 13585 dengan ringkasan otomatis.", - "apihelp-emailuser-description": "Kirim surel ke pengguna ini.", + "apihelp-emailuser-summary": "Kirim surel ke pengguna ini.", "apihelp-emailuser-param-target": "Pengguna yang akan dikirimi surel.", "apihelp-emailuser-param-subject": "Tajuk subjek.", "apihelp-emailuser-param-text": "Badan pesan.", "apihelp-emailuser-param-ccme": "Kirimkan salinan pesan ini kepada saya.", - "apihelp-expandtemplates-description": "Longgarkan semua templat dalam teks wiki.", + "apihelp-expandtemplates-summary": "Longgarkan semua templat dalam teks wiki.", "apihelp-expandtemplates-param-title": "Judul halaman.", "apihelp-expandtemplates-param-text": "Teks wiki yang akan diubah.", "apihelp-expandtemplates-param-revid": "ID revisi, untuk {{REVISIONID}} dan variabel serupa.", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index d84775fbb1..23b86ab659 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -19,14 +19,14 @@ "Margherita.mignanelli" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n
    \nStato: tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\nIstruzioni sbagliate: quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\nTest: per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentazione]] (in inglese)\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n
    \nStato: tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\nIstruzioni sbagliate: quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\nTest: per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].", "apihelp-main-param-action": "Azione da compiere.", "apihelp-main-param-format": "Formato dell'output.", "apihelp-main-param-assert": "Verifica che l'utente abbia effettuato l'accesso se si è impostato user, o che abbia i permessi di bot se si è impostato bot.", "apihelp-main-param-requestid": "Tutti i valori forniti saranno implementati nella risposta. Potrebbero venir utilizzati per distinguere le richieste.", "apihelp-main-param-servedby": "Includi nel risultato il nome dell'host che ha servito la richiesta.", "apihelp-main-param-curtimestamp": "Includi nel risultato il timestamp attuale.", - "apihelp-block-description": "Blocca un utente.", + "apihelp-block-summary": "Blocca un utente.", "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare. Non può essere usato insieme a $1userid", "apihelp-block-param-expiry": "Tempo di scadenza. Può essere relativo (ad esempio, 5 months o 2 weeks) o assoluto (ad esempio 2014-09-18T12:34:56Z). Se impostato a infinite, indefinite o never, il blocco non scadrà mai.", "apihelp-block-param-reason": "Motivo del blocco.", @@ -38,19 +38,20 @@ "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.", "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP 192.0.2.5 per tre giorni con motivazione First strike.", "apihelp-block-example-user-complex": "Blocca l'utente Vandal a tempo indeterminato con motivazione Vandalism, e impediscigli la creazione di nuovi account e l'invio di e-mail.", - "apihelp-changeauthenticationdata-description": "Modificare i dati di autenticazione per l'utente corrente.", + "apihelp-changeauthenticationdata-summary": "Modificare i dati di autenticazione per l'utente corrente.", "apihelp-changeauthenticationdata-example-password": "Tentativo di modificare la password dell'utente corrente a ExamplePassword.", - "apihelp-checktoken-description": "Verifica la validità di un token da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Verifica la validità di un token da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo di token in corso di test.", "apihelp-checktoken-param-token": "Token da testare.", "apihelp-checktoken-param-maxtokenage": "Massima età consentita per il token, in secondi.", "apihelp-checktoken-example-simple": "Verifica la validità di un token csrf.", - "apihelp-clearhasmsg-description": "Cancella il flag hasmsg per l'utente corrente.", + "apihelp-clearhasmsg-summary": "Cancella il flag hasmsg per l'utente corrente.", "apihelp-clearhasmsg-example-1": "Cancella il flag hasmsg per l'utente corrente.", - "apihelp-clientlogin-description": "Accedi al wiki utilizzando il flusso interattivo.", + "apihelp-clientlogin-summary": "Accedi al wiki utilizzando il flusso interattivo.", "apihelp-clientlogin-example-login": "Avvia il processo di accesso alla wiki come utente Example con password ExamplePassword.", "apihelp-clientlogin-example-login2": "Continua l'accesso dopo una risposta dell'UI per l'autenticazione a due fattori, fornendo un OATHToken di 987654.", - "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".", + "apihelp-compare-summary": "Ottieni le differenze tra 2 pagine.", + "apihelp-compare-extended-description": "Un numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".", "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.", "apihelp-compare-param-fromid": "Primo ID di pagina da confrontare.", "apihelp-compare-param-fromrev": "Prima revisione da confrontare.", @@ -58,7 +59,7 @@ "apihelp-compare-param-toid": "Secondo ID di pagina da confrontare.", "apihelp-compare-param-torev": "Seconda revisione da confrontare.", "apihelp-compare-example-1": "Crea un diff tra revisione 1 e revisione 2.", - "apihelp-createaccount-description": "Crea un nuovo account utente.", + "apihelp-createaccount-summary": "Crea un nuovo account utente.", "apihelp-createaccount-param-preservestate": "Se [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] ha restituito true per hasprimarypreservedstate, le richieste contrassegnate come primary-required dovrebbero essere omesse. Se invece ha restituito un valore non vuoto per preservedusername, quel nome utente deve essere utilizzato per il parametro username.", "apihelp-createaccount-example-create": "Avvia il processo di creazione utente Example con password ExamplePassword.", "apihelp-createaccount-param-name": "Nome utente.", @@ -71,7 +72,7 @@ "apihelp-createaccount-param-language": "Codice di lingua da impostare come predefinita per l'utente (opzionale, di default è la lingua del contenuto).", "apihelp-createaccount-example-pass": "Crea l'utente testuser con password test123.", "apihelp-createaccount-example-mail": "Crea l'utente testmailuser e mandagli via e-mail una password generata casualmente.", - "apihelp-delete-description": "Cancella una pagina.", + "apihelp-delete-summary": "Cancella una pagina.", "apihelp-delete-param-title": "Titolo della pagina che si desidera eliminare. Non può essere usato insieme a $1pageid.", "apihelp-delete-param-pageid": "ID di pagina della pagina da cancellare. Non può essere usato insieme con $1title.", "apihelp-delete-param-reason": "Motivo della cancellazione. Se non indicato, verrà usata una motivazione generata automaticamente.", @@ -80,8 +81,8 @@ "apihelp-delete-param-oldimage": "Il nome della vecchia immagine da cancellare, come fornita da [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Cancella Main Page.", "apihelp-delete-example-reason": "Cancella la Main Page con motivazione Preparing for move.", - "apihelp-disabled-description": "Questo modulo è stato disabilitato.", - "apihelp-edit-description": "Crea e modifica pagine.", + "apihelp-disabled-summary": "Questo modulo è stato disabilitato.", + "apihelp-edit-summary": "Crea e modifica pagine.", "apihelp-edit-param-title": "Titolo della pagina da modificare. Non può essere usato insieme a $1pageid.", "apihelp-edit-param-pageid": "ID di pagina della pagina da modificare. Non può essere usato insieme con $1title.", "apihelp-edit-param-section": "Numero di sezione. 0 per la sezione iniziale, new per una nuova sezione.", @@ -101,13 +102,13 @@ "apihelp-edit-param-token": "Il token deve sempre essere inviato come ultimo parametro, o almeno dopo il parametro $1text.", "apihelp-edit-example-edit": "Modifica una pagina.", "apihelp-edit-example-prepend": "Anteponi __NOTOC__ a una pagina.", - "apihelp-emailuser-description": "Manda un'e-mail ad un utente.", + "apihelp-emailuser-summary": "Manda un'e-mail ad un utente.", "apihelp-emailuser-param-target": "Utente a cui inviare l'e-mail.", "apihelp-emailuser-param-subject": "Oggetto dell'e-mail.", "apihelp-emailuser-param-text": "Testo dell'e-mail.", "apihelp-emailuser-param-ccme": "Mandami una copia di questa mail.", "apihelp-emailuser-example-email": "Manda una e-mail all'utente WikiSysop con il testo Content.", - "apihelp-expandtemplates-description": "Espande tutti i template all'interno del wikitesto.", + "apihelp-expandtemplates-summary": "Espande tutti i template all'interno del wikitesto.", "apihelp-expandtemplates-param-title": "Titolo della pagina.", "apihelp-expandtemplates-param-text": "Wikitesto da convertire.", "apihelp-expandtemplates-param-prop": "Quale informazione ottenere.\n\nNota che se non è selezionato alcun valore, il risultato conterrà il codice wiki, ma l'output sarà in un formato obsoleto.", @@ -149,18 +150,18 @@ "apihelp-feedwatchlist-param-hours": "Elenca le pagine modificate entro queste ultime ore.", "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.", "apihelp-feedwatchlist-example-all6hrs": "Mostra tutte le modifiche alle pagine osservate nelle ultime 6 ore.", - "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.", + "apihelp-filerevert-summary": "Ripristina un file ad una versione precedente.", "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.", "apihelp-filerevert-param-comment": "Commento sul caricamento.", "apihelp-filerevert-param-archivename": "Nome dell'archivio della versione da ripristinare.", "apihelp-filerevert-example-revert": "Ripristina Wiki.png alla versione del 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Mostra la guida per i moduli specificati.", + "apihelp-help-summary": "Mostra la guida per i moduli specificati.", "apihelp-help-param-toc": "Includi un indice nell'output HTML.", "apihelp-help-example-main": "Aiuto per il modulo principale.", "apihelp-help-example-submodules": "Aiuto per action=query e tutti i suoi sotto-moduli.", "apihelp-help-example-recursive": "Tutti gli aiuti in una pagina.", "apihelp-help-example-help": "Aiuto per lo stesso modulo di aiuto.", - "apihelp-imagerotate-description": "Ruota una o più immagini.", + "apihelp-imagerotate-summary": "Ruota una o più immagini.", "apihelp-imagerotate-param-rotation": "Gradi di rotazione dell'immagine in senso orario.", "apihelp-imagerotate-example-simple": "Ruota File:Example.png di 90 gradi.", "apihelp-imagerotate-example-generator": "Ruota tutte le immagini in Category:Flip di 180 gradi.", @@ -173,18 +174,19 @@ "apihelp-import-param-namespace": "Importa in questo namespace. Non può essere usato insieme a $1rootpage.", "apihelp-import-param-rootpage": "Importa come sottopagina di questa pagina. Non può essere usato insieme a $1namespace.", "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.", - "apihelp-linkaccount-description": "Collegamento di un'utenza di un provider di terze parti all'utente corrente.", + "apihelp-linkaccount-summary": "Collegamento di un'utenza di un provider di terze parti all'utente corrente.", "apihelp-linkaccount-example-link": "Avvia il processo di collegamento ad un'utenza da Example.", - "apihelp-login-description": "Accedi e ottieni i cookie di autenticazione.\n\nQuesta azione deve essere usata esclusivamente in combinazione con [[Special:BotPasswords]]; utilizzarla per l'accesso all'account principale è deprecato e può fallire senza preavviso. Per accedere in modo sicuro all'utenza principale, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Accedi e ottieni i cookies di autenticazione.\n\nQuesta azione è deprecata e può fallire senza preavviso. Per accedere in modo sicuro, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Accedi e ottieni i cookie di autenticazione.", + "apihelp-login-extended-description": "Questa azione deve essere usata esclusivamente in combinazione con [[Special:BotPasswords]]; utilizzarla per l'accesso all'account principale è deprecato e può fallire senza preavviso. Per accedere in modo sicuro all'utenza principale, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Questa azione è deprecata e può fallire senza preavviso. Per accedere in modo sicuro, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nome utente.", "apihelp-login-param-password": "Password.", "apihelp-login-param-domain": "Dominio (opzionale).", "apihelp-login-example-gettoken": "Recupera un token di login.", "apihelp-login-example-login": "Entra.", - "apihelp-logout-description": "Esci e cancella i dati della sessione.", + "apihelp-logout-summary": "Esci e cancella i dati della sessione.", "apihelp-logout-example-logout": "Disconnetti l'utente attuale.", - "apihelp-mergehistory-description": "Unisce cronologie pagine.", + "apihelp-mergehistory-summary": "Unisce cronologie pagine.", "apihelp-mergehistory-param-from": "Il titolo della pagina da cui cronologia sarà unita. Non può essere usato insieme a $1fromid.", "apihelp-mergehistory-param-fromid": "L'ID della pagina da cui cronologia sarà unita. Non può essere usato insieme a $1from.", "apihelp-mergehistory-param-to": "Il titolo della pagina in cui cronologia sarà unita. Non può essere usato insieme a $1toid.", @@ -193,7 +195,7 @@ "apihelp-mergehistory-param-reason": "Motivo per l'unione della cronologia.", "apihelp-mergehistory-example-merge": "Unisci l'intera cronologia di Oldpage in Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Unisci le versioni della pagina Oldpage fino a 2015-12-31T04:37:41Z in Newpage.", - "apihelp-move-description": "Sposta una pagina.", + "apihelp-move-summary": "Sposta una pagina.", "apihelp-move-param-to": "Titolo a cui spostare la pagina.", "apihelp-move-param-reason": "Motivo della rinomina.", "apihelp-move-param-movetalk": "Rinomina la pagina di discussione, se esiste.", @@ -205,12 +207,12 @@ "apihelp-move-example-move": "Sposta Badtitle a Goodtitle senza lasciare redirect.", "apihelp-opensearch-param-search": "Stringa di ricerca.", "apihelp-opensearch-param-limit": "Numero massimo di risultati da restituire.", - "apihelp-opensearch-param-suggest": "Non fare nulla se [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] è falso.", + "apihelp-opensearch-param-suggest": "Non fare nulla se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] è falso.", "apihelp-opensearch-param-format": "Il formato dell'output.", "apihelp-opensearch-example-te": "Trova le pagine che iniziano con Te.", "apihelp-options-param-optionvalue": "Il valore per l'opzione specificata da $1optionname.", "apihelp-options-example-reset": "Reimposta tutte le preferenze.", - "apihelp-paraminfo-description": "Ottieni informazioni sui moduli API.", + "apihelp-paraminfo-summary": "Ottieni informazioni sui moduli API.", "apihelp-paraminfo-param-helpformat": "Formato delle stringhe di aiuto.", "apihelp-parse-param-summary": "Oggetto da analizzare.", "apihelp-parse-param-redirects": "Se $1page o $1pageid è impostato come reindirizzamento, lo risolve.", @@ -218,26 +220,26 @@ "apihelp-parse-example-text": "Analizza wikitext.", "apihelp-parse-example-texttitle": "Analizza wikitext, specificando il titolo della pagina.", "apihelp-parse-example-summary": "Analizza un oggetto.", - "apihelp-patrol-description": "Verifica una pagina o versione.", + "apihelp-patrol-summary": "Verifica una pagina o versione.", "apihelp-patrol-param-rcid": "ID della modifica recente da verificare.", "apihelp-patrol-param-revid": "ID versione da verificare.", "apihelp-patrol-param-tags": "Modifica etichette da applicare all'elemento del registro delle verifiche.", "apihelp-patrol-example-rcid": "Verifica una modifica recente.", "apihelp-patrol-example-revid": "Verifica una versione.", - "apihelp-protect-description": "Modifica il livello di protezione di una pagina.", + "apihelp-protect-summary": "Modifica il livello di protezione di una pagina.", "apihelp-protect-param-title": "Titolo della pagina da (s)proteggere. Non può essere usato insieme a $1pageid.", "apihelp-protect-param-pageid": "ID della pagina da (s)proteggere. Non può essere usato insieme con $1title.", "apihelp-protect-param-tags": "Modifica etichette da applicare all'elemento del registro delle protezioni.", "apihelp-protect-example-protect": "Proteggi una pagina.", "apihelp-protect-example-unprotect": "Sproteggi una pagina impostando restrizione su all (cioè a tutti è consentito intraprendere l'azione).", "apihelp-protect-example-unprotect2": "Sproteggi una pagina impostando nessuna restrizione.", - "apihelp-purge-description": "Pulisce la cache per i titoli indicati.", + "apihelp-purge-summary": "Pulisce la cache per i titoli indicati.", "apihelp-purge-param-forcelinkupdate": "Aggiorna la tabella dei collegamenti.", "apihelp-purge-param-forcerecursivelinkupdate": "Aggiorna la tabella dei collegamenti per questa pagina, e per ogni pagina che usa questa pagina come template.", "apihelp-query-param-list": "Quali elenchi ottenere.", "apihelp-query-param-meta": "Quali metadati ottenere.", "apihelp-query-param-export": "Esporta la versione attuale di tutte le pagine ottenute o generate.", - "apihelp-query+allcategories-description": "Enumera tutte le categorie.", + "apihelp-query+allcategories-summary": "Enumera tutte le categorie.", "apihelp-query+allcategories-param-from": "La categoria da cui iniziare l'elenco.", "apihelp-query+allcategories-param-to": "La categoria al quale interrompere l'elenco.", "apihelp-query+allcategories-param-prefix": "Ricerca per tutti i titoli delle categorie che iniziano con questo valore.", @@ -247,7 +249,7 @@ "apihelp-query+allcategories-paramvalue-prop-size": "Aggiungi il numero di pagine nella categoria.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Etichetta categorie che sono nascoste con __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Elenca categorie con informazioni sul numero di pagine in ognuna.", - "apihelp-query+alldeletedrevisions-description": "Elenca tutte le versioni cancellate da un utente o in un namespace.", + "apihelp-query+alldeletedrevisions-summary": "Elenca tutte le versioni cancellate da un utente o in un namespace.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Può essere utilizzato solo con $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Non può essere utilizzato con $3user.", "apihelp-query+alldeletedrevisions-param-start": "Il timestamp da cui iniziare l'elenco.", @@ -275,7 +277,7 @@ "apihelp-query+allimages-param-end": "Il timestamp al quale interrompere l'elenco. Può essere utilizzato solo con $1sort=timestamp.", "apihelp-query+allimages-param-limit": "Quante immagini in totale restituire.", "apihelp-query+allimages-example-B": "Mostra un elenco di file a partire dalla lettera B.", - "apihelp-query+alllinks-description": "Elenca tutti i collegamenti che puntano ad un namespace indicato.", + "apihelp-query+alllinks-summary": "Elenca tutti i collegamenti che puntano ad un namespace indicato.", "apihelp-query+alllinks-param-from": "Il titolo del collegamento da cui iniziare l'elenco.", "apihelp-query+alllinks-param-to": "Il titolo del collegamento al quale interrompere l'elenco.", "apihelp-query+alllinks-param-prefix": "Ricerca per tutti i titoli dei collegamenti che iniziano con questo valore.", @@ -286,7 +288,7 @@ "apihelp-query+alllinks-param-limit": "Quanti elementi totali restituire.", "apihelp-query+alllinks-param-dir": "La direzione in cui elencare.", "apihelp-query+alllinks-example-generator": "Ottieni le pagine contenenti i collegamenti.", - "apihelp-query+allmessages-description": "Restituisce messaggi da questo sito.", + "apihelp-query+allmessages-summary": "Restituisce messaggi da questo sito.", "apihelp-query+allmessages-param-prop": "Quali proprietà ottenere.", "apihelp-query+allmessages-param-lang": "Restituisci messaggi in questa lingua.", "apihelp-query+allmessages-param-prefix": "Restituisci messaggi con questo prefisso.", @@ -305,7 +307,7 @@ "apihelp-query+allredirects-param-limit": "Quanti elementi totali restituire.", "apihelp-query+allredirects-param-dir": "La direzione in cui elencare.", "apihelp-query+allredirects-example-generator": "Ottieni le pagine contenenti i reindirizzamenti.", - "apihelp-query+allrevisions-description": "Elenco di tutte le versioni.", + "apihelp-query+allrevisions-summary": "Elenco di tutte le versioni.", "apihelp-query+allrevisions-param-start": "Il timestamp da cui iniziare l'elenco.", "apihelp-query+allrevisions-param-end": "Il timestamp al quale interrompere l'elenco.", "apihelp-query+allrevisions-param-user": "Elenca solo le versioni di questo utente.", @@ -317,7 +319,7 @@ "apihelp-query+mystashedfiles-paramvalue-prop-size": "Recupera la dimensione del file e le dimensioni dell'immagine.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Recupera il tipo MIME del file e il tipo media.", "apihelp-query+mystashedfiles-param-limit": "Quanti file restituire.", - "apihelp-query+alltransclusions-description": "Elenca tutte le inclusioni (pagine incorporate utilizzando {{x}}), comprese le non esistenti.", + "apihelp-query+alltransclusions-summary": "Elenca tutte le inclusioni (pagine incorporate utilizzando {{x}}), comprese le non esistenti.", "apihelp-query+alltransclusions-param-from": "Il titolo dell'inclusione da cui iniziare l'elenco.", "apihelp-query+alltransclusions-param-prop": "Quali pezzi di informazioni includere:", "apihelp-query+alltransclusions-paramvalue-prop-title": "Aggiunge il titolo dell'inclusione.", @@ -333,13 +335,13 @@ "apihelp-query+allusers-param-excludegroup": "Escludi gli utenti nei gruppi indicati.", "apihelp-query+allusers-param-prop": "Quali pezzi di informazioni includere:", "apihelp-query+allusers-param-limit": "Quanti nomi utente totali restituire.", - "apihelp-query+authmanagerinfo-description": "Recupera informazioni circa l'attuale stato di autenticazione.", + "apihelp-query+authmanagerinfo-summary": "Recupera informazioni circa l'attuale stato di autenticazione.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Verifica se lo stato di autenticazione dell'utente attuale è sufficiente per la specifica operazione sensibile alla sicurezza.", "apihelp-query+authmanagerinfo-param-requestsfor": "Recupera informazioni circa le richieste di autenticazione necessarie per la specifica azione di autenticazione.", "apihelp-query+authmanagerinfo-example-login": "Recupera le richieste che possono essere utilizzate quando si inizia l'accesso.", "apihelp-query+authmanagerinfo-example-login-merged": "Recupera le richieste che possono essere utilizzate quando si inizia l'accesso, con i campi del modulo uniti.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Verificare se l'autenticazione è sufficiente per l'azione foo.", - "apihelp-query+backlinks-description": "Trova tutte le pagine che puntano a quella specificata.", + "apihelp-query+backlinks-summary": "Trova tutte le pagine che puntano a quella specificata.", "apihelp-query+backlinks-param-namespace": "Il namespace da elencare.", "apihelp-query+backlinks-param-dir": "La direzione in cui elencare.", "apihelp-query+backlinks-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.", @@ -354,14 +356,14 @@ "apihelp-query+blocks-paramvalue-prop-by": "Aggiunge il nome utente dell'utente che ha effettuato il blocco.", "apihelp-query+blocks-paramvalue-prop-byid": "Aggiunge l'ID utente dell'utente che ha effettuato il blocco.", "apihelp-query+blocks-example-simple": "Elenca i blocchi.", - "apihelp-query+categories-description": "Elenca tutte le categorie a cui appartengono le pagine.", + "apihelp-query+categories-summary": "Elenca tutte le categorie a cui appartengono le pagine.", "apihelp-query+categories-param-prop": "Quali proprietà aggiuntive ottenere per ogni categoria.", "apihelp-query+categories-param-show": "Quale tipo di categorie mostrare.", "apihelp-query+categories-param-limit": "Quante categorie restituire.", "apihelp-query+categories-param-dir": "La direzione in cui elencare.", - "apihelp-query+categoryinfo-description": "Restituisce informazioni su una categoria indicata.", + "apihelp-query+categoryinfo-summary": "Restituisce informazioni su una categoria indicata.", "apihelp-query+categoryinfo-example-simple": "Ottieni informazioni su Category:Foo e Category:Bar.", - "apihelp-query+categorymembers-description": "Elenca tutte le pagine in una categoria indicata.", + "apihelp-query+categorymembers-summary": "Elenca tutte le pagine in una categoria indicata.", "apihelp-query+categorymembers-param-prop": "Quali pezzi di informazioni includere:", "apihelp-query+categorymembers-paramvalue-prop-ids": "Aggiunge l'ID pagina.", "apihelp-query+categorymembers-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.", @@ -395,12 +397,12 @@ "apihelp-query+deletedrevs-param-excludeuser": "Non elencare le versioni di questo utente.", "apihelp-query+deletedrevs-param-namespace": "Elenca solo le pagine in questo namespace.", "apihelp-query+deletedrevs-param-limit": "Il numero massimo di versioni da elencare.", - "apihelp-query+disabled-description": "Questo modulo query è stato disabilitato.", + "apihelp-query+disabled-summary": "Questo modulo query è stato disabilitato.", "apihelp-query+duplicatefiles-param-limit": "Quanti file duplicati restituire.", "apihelp-query+duplicatefiles-param-dir": "La direzione in cui elencare.", "apihelp-query+duplicatefiles-example-simple": "Cerca i duplicati di [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Cerca i duplicati di tutti i file.", - "apihelp-query+embeddedin-description": "Trova tutte le pagine che incorporano (transclusione) il titolo specificato.", + "apihelp-query+embeddedin-summary": "Trova tutte le pagine che incorporano (transclusione) il titolo specificato.", "apihelp-query+embeddedin-param-namespace": "Il namespace da elencare.", "apihelp-query+embeddedin-param-dir": "La direzione in cui elencare.", "apihelp-query+embeddedin-param-limit": "Quante pagine totali restituire.", @@ -417,7 +419,7 @@ "apihelp-query+filearchive-paramvalue-prop-mime": "Aggiunge MIME dell'immagine.", "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Aggiunge la profondità di bit della versione.", "apihelp-query+filearchive-example-simple": "Mostra un elenco di tutti i file cancellati.", - "apihelp-query+fileusage-description": "Trova tutte le pagine che utilizzano il file specificato.", + "apihelp-query+fileusage-summary": "Trova tutte le pagine che utilizzano il file specificato.", "apihelp-query+fileusage-param-prop": "Quali proprietà ottenere:", "apihelp-query+fileusage-paramvalue-prop-pageid": "ID pagina di ogni pagina.", "apihelp-query+fileusage-paramvalue-prop-title": "Titolo di ogni pagina.", @@ -425,17 +427,18 @@ "apihelp-query+fileusage-param-namespace": "Includi solo le pagine in questi namespace.", "apihelp-query+fileusage-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.", "apihelp-query+fileusage-example-simple": "Ottieni un elenco di pagine che usano [[:File:Example.jpg]].", + "apihelp-query+imageinfo-summary": "Restituisce informazione sul file sulla cronologia di caricamento.", "apihelp-query+imageinfo-paramvalue-prop-mime": "Aggiunge il tipo MIME del file.", "apihelp-query+imageinfo-param-start": "Il timestamp da cui iniziare l'elenco.", "apihelp-query+imageinfo-param-urlheight": "Simile a $1urlwidth.", "apihelp-query+images-param-limit": "Quanti file restituire.", "apihelp-query+images-param-dir": "La direzione in cui elencare.", "apihelp-query+images-example-simple": "Ottieni un elenco di file usati in [[Main Page]].", - "apihelp-query+imageusage-description": "Trova tutte le pagine che utilizzano il titolo dell'immagine specificato.", + "apihelp-query+imageusage-summary": "Trova tutte le pagine che utilizzano il titolo dell'immagine specificato.", "apihelp-query+imageusage-param-namespace": "Il namespace da elencare.", "apihelp-query+imageusage-param-dir": "La direzione in cui elencare.", "apihelp-query+imageusage-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.", - "apihelp-query+info-description": "Ottieni informazioni base sulla pagina.", + "apihelp-query+info-summary": "Ottieni informazioni base sulla pagina.", "apihelp-query+info-param-prop": "Quali proprietà aggiuntive ottenere:", "apihelp-query+info-paramvalue-prop-visitingwatchers": "Il numero di osservatori di ogni pagina che hanno visitato le ultime modifiche alla pagina, se consentito.", "apihelp-query+iwbacklinks-param-prefix": "Prefisso per l'interwiki.", @@ -444,7 +447,7 @@ "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Aggiunge il prefisso dell'interwiki.", "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Aggiunge il titolo dell'interwiki.", "apihelp-query+iwbacklinks-param-dir": "La direzione in cui elencare.", - "apihelp-query+iwlinks-description": "Restituisce tutti i collegamenti interwiki dalle pagine indicate.", + "apihelp-query+iwlinks-summary": "Restituisce tutti i collegamenti interwiki dalle pagine indicate.", "apihelp-query+iwlinks-paramvalue-prop-url": "Aggiunge l'URL completo.", "apihelp-query+iwlinks-param-limit": "Quanti collegamenti interwiki restituire.", "apihelp-query+iwlinks-param-dir": "La direzione in cui elencare.", @@ -458,7 +461,7 @@ "apihelp-query+links-param-namespace": "Mostra collegamenti solo in questi namespace.", "apihelp-query+links-param-limit": "Quanti collegamenti restituire.", "apihelp-query+links-param-dir": "La direzione in cui elencare.", - "apihelp-query+linkshere-description": "Trova tutte le pagine che puntano a quelle specificate.", + "apihelp-query+linkshere-summary": "Trova tutte le pagine che puntano a quelle specificate.", "apihelp-query+linkshere-param-prop": "Quali proprietà ottenere:", "apihelp-query+linkshere-paramvalue-prop-pageid": "ID pagina di ogni pagina.", "apihelp-query+linkshere-paramvalue-prop-title": "Titolo di ogni pagina.", @@ -480,7 +483,7 @@ "apihelp-query+prefixsearch-param-limit": "Numero massimo di risultati da restituire.", "apihelp-query+prefixsearch-param-offset": "Numero di risultati da saltare", "apihelp-query+prefixsearch-param-profile": "Profilo di ricerca da utilizzare.", - "apihelp-query+protectedtitles-description": "Elenca tutti i titoli protetti dalla creazione.", + "apihelp-query+protectedtitles-summary": "Elenca tutti i titoli protetti dalla creazione.", "apihelp-query+protectedtitles-param-namespace": "Elenca solo i titoli in questi namespace.", "apihelp-query+protectedtitles-param-level": "Elenca solo i titoli con questi livelli di protezione.", "apihelp-query+protectedtitles-param-limit": "Quante pagine totali restituire.", @@ -495,18 +498,18 @@ "apihelp-query+random-param-namespace": "Restituisci le pagine solo in questi namespace.", "apihelp-query+random-param-redirect": "Usa $1filterredir=redirects invece.", "apihelp-query+random-example-simple": "Restituisce due pagine casuali dal namespace principale.", - "apihelp-query+recentchanges-description": "Elenca le modifiche recenti.", + "apihelp-query+recentchanges-summary": "Elenca le modifiche recenti.", "apihelp-query+recentchanges-param-start": "Il timestamp da cui iniziare l'elenco.", "apihelp-query+recentchanges-param-end": "Il timestamp al quale interrompere l'elenco.", "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.", - "apihelp-query+redirects-description": "Restituisce tutti i reindirizzamenti alla data indicata.", + "apihelp-query+redirects-summary": "Restituisce tutti i reindirizzamenti alla data indicata.", "apihelp-query+redirects-param-prop": "Quali proprietà ottenere:", "apihelp-query+redirects-paramvalue-prop-pageid": "ID pagina di ogni redirect.", "apihelp-query+redirects-paramvalue-prop-title": "Titolo di ogni redirect.", "apihelp-query+redirects-param-namespace": "Includi solo le pagine in questi namespace.", "apihelp-query+redirects-param-limit": "Quanti reindirizzamenti restituire.", "apihelp-query+redirects-example-simple": "Ottieni un elenco di redirect a [[Main Page]].", - "apihelp-query+revisions-param-startid": "L'ID versione da cui iniziare l'elenco.", + "apihelp-query+revisions-param-startid": "Inizia l'elenco dal timestamp di questa versione. La versione deve esistere, ma non necessariamente deve appartenere a questa pagina.", "apihelp-query+revisions-param-start": "Il timestamp della versione da cui iniziare l'elenco.", "apihelp-query+revisions-param-tag": "Elenca solo le versioni etichettate con questa etichetta.", "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.", @@ -515,7 +518,7 @@ "apihelp-query+revisions+base-paramvalue-prop-userid": "ID utente dell'autore della versione.", "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.", - "apihelp-query+search-description": "Eseguire una ricerca di testo completa.", + "apihelp-query+search-summary": "Eseguire una ricerca di testo completa.", "apihelp-query+search-param-what": "Quale tipo di ricerca effettuare.", "apihelp-query+search-param-info": "Quali metadati restituire.", "apihelp-query+search-param-prop": "Quali proprietà restituire.", @@ -524,19 +527,22 @@ "apihelp-query+search-paramvalue-prop-timestamp": "Aggiungi il timestamp di quando la pagina è stata modificata l'ultima volta.", "apihelp-query+search-paramvalue-prop-redirecttitle": "Aggiunge il titolo del redirect corrispondente.", "apihelp-query+search-paramvalue-prop-sectiontitle": "Aggiunge il titolo della sezione corrispondente.", + "apihelp-query+search-paramvalue-prop-score": "Ignorato.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorato.", "apihelp-query+search-param-limit": "Quante pagine totali restituire.", "apihelp-query+siteinfo-param-prop": "Quali informazioni ottenere:", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Restituisce le statistiche del sito.", "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.", "apihelp-query+siteinfo-paramvalue-prop-extensions": "Restituisci estensioni installate sul wiki.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Restituisce un'elenco di codici lingua per cui [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] è attivo, e le varianti supportate per ognuno di essi.", "apihelp-query+siteinfo-example-simple": "Recupera informazioni sul sito.", "apihelp-query+tags-param-prop": "Quali proprietà ottenere:", "apihelp-query+templates-param-limit": "Quanti template restituire.", "apihelp-query+templates-param-dir": "La direzione in cui elencare.", "apihelp-query+tokens-param-type": "Tipi di token da richiedere.", "apihelp-query+tokens-example-simple": "Recupera un token csrf (il predefinito).", - "apihelp-query+transcludedin-description": "Trova tutte le pagine che incorporano quella specificata.", + "apihelp-query+transcludedin-summary": "Trova tutte le pagine che incorporano quella specificata.", "apihelp-query+transcludedin-param-prop": "Quali proprietà ottenere:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID pagina di ogni pagina.", "apihelp-query+transcludedin-paramvalue-prop-title": "Titolo di ogni pagina.", @@ -547,19 +553,20 @@ "apihelp-query+usercontribs-param-namespace": "Elenca solo i contributi in questi namespace.", "apihelp-query+usercontribs-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etichetta modifiche verificate", - "apihelp-query+userinfo-description": "Ottieni informazioni sull'utente attuale.", + "apihelp-query+userinfo-summary": "Ottieni informazioni sull'utente attuale.", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etichetta se l'utente attuale è bloccato, da chi e per quale motivo.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Aggiunge un'etichetta messages se l'utente attuale ha messaggi in attesa.", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Elenca tutti i gruppi di cui l'utente attuale è automaticamente membro.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Elenca tutti i gruppi di cui l'utente attuale può essere aggiunto o rimosso.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Ottieni un token per modificare le preferenze dell'utente attuale.", "apihelp-query+userinfo-paramvalue-prop-realname": "Aggiungi il nome reale dell'utente.", "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Aggiungi la data di registrazione dell'utente.", "apihelp-query+userinfo-example-simple": "Ottieni informazioni sull'utente attuale.", - "apihelp-query+users-description": "Ottieni informazioni su un elenco di utenti.", + "apihelp-query+users-summary": "Ottieni informazioni su un elenco di utenti.", "apihelp-query+users-param-prop": "Quali pezzi di informazioni includere:", "apihelp-query+users-paramvalue-prop-cancreate": "Indica se può essere creata un'utenza per nomi utente validi ma non registrati.", "apihelp-query+users-param-users": "Un elenco di utenti di cui ottenere informazioni.", - "apihelp-query+watchlist-description": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.", + "apihelp-query+watchlist-summary": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.", "apihelp-query+watchlist-param-start": "Il timestamp da cui iniziare l'elenco.", "apihelp-query+watchlist-param-end": "Il timestamp al quale interrompere l'elenco.", "apihelp-query+watchlist-param-prop": "Quali proprietà aggiuntive ottenere:", @@ -575,20 +582,21 @@ "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.", "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.", "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.", - "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.", + "apihelp-removeauthenticationdata-summary": "Rimuove i dati di autenticazione per l'utente corrente.", "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.", - "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] per usare questo modulo.", + "apihelp-resetpassword-summary": "Invia una mail per reimpostare la password di un utente.", + "apihelp-resetpassword-extended-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] per usare questo modulo.", "apihelp-resetpassword-param-user": "Utente in corso di ripristino.", "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.", "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente Example.", "apihelp-resetpassword-example-email": "Invia una mail per reimpostare la password a tutti gli utenti con indirizzo di posta elettronica user@example.com.", - "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.", + "apihelp-revisiondelete-summary": "Cancella e ripristina le versioni.", "apihelp-revisiondelete-param-type": "Tipo di cancellazione della versione effettuata.", "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.", "apihelp-revisiondelete-param-show": "Cosa mostrare per ogni versione.", "apihelp-revisiondelete-param-reason": "Motivo per l'eliminazione o il ripristino.", - "apihelp-setpagelanguage-description": "Cambia la lingua di una pagina.", + "apihelp-setpagelanguage-summary": "Cambia la lingua di una pagina.", + "apihelp-setpagelanguage-extended-description-disabled": "La modifica della lingua di una pagina non è consentita su questo wiki.\n\nAttiva [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] per usare questa azione.", "apihelp-setpagelanguage-param-reason": "Motivo per la modifica.", "apihelp-stashedit-param-title": "Titolo della pagina che si sta modificando.", "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.", @@ -598,15 +606,16 @@ "apihelp-tag-param-reason": "Motivo per la modifica.", "apihelp-tokens-param-type": "Tipi di token da richiedere.", "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).", - "apihelp-unblock-description": "Sblocca un utente", + "apihelp-unblock-summary": "Sblocca un utente", "apihelp-unblock-param-user": "Nome utente, indirizzo IP o range di IP da sbloccare. Non può essere usato insieme a $1id o $1userid.", "apihelp-unblock-param-userid": "ID utente da sbloccare. Non può essere usato insieme a $1id o $1userid.", "apihelp-unblock-param-reason": "Motivo dello sblocco.", "apihelp-unblock-param-tags": "Modifica etichette da applicare all'elemento del registro dei blocchi.", + "apihelp-undelete-summary": "Ripristina versioni di una pagina cancellata.", "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.", "apihelp-undelete-param-reason": "Motivo per il ripristino.", "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.", - "apihelp-unlinkaccount-description": "Rimuove un'utenza di terze parti collegata all'utente corrente.", + "apihelp-unlinkaccount-summary": "Rimuove un'utenza di terze parti collegata all'utente corrente.", "apihelp-unlinkaccount-example-simple": "Tentativo di rimuovere il collegamento dell'utente corrente per il provider associato con FooAuthenticationRequest.", "apihelp-upload-param-watch": "Osserva la pagina.", "apihelp-upload-param-file": "Contenuto del file.", @@ -616,11 +625,12 @@ "apihelp-userrights-param-add": "Aggiungere l'utente a questi gruppi, o se sono già membri, aggiornare la scadenza della loro appartenenza a quel gruppo.", "apihelp-userrights-param-remove": "Rimuovi l'utente da questi gruppi.", "apihelp-userrights-param-reason": "Motivo del cambiamento.", - "apihelp-validatepassword-description": "Convalida una password seguendo le politiche del wiki sulle password.\n\nLa validità è riportata come Good se la password è accettabile, Change se la password può essere utilizzata per l'accesso ma deve essere modificata, o Invalid se la password non è utilizzabile.", + "apihelp-validatepassword-summary": "Convalida una password seguendo le politiche del wiki sulle password.", + "apihelp-validatepassword-extended-description": "La validità è riportata come Good se la password è accettabile, Change se la password può essere utilizzata per l'accesso ma deve essere modificata, o Invalid se la password non è utilizzabile.", "apihelp-validatepassword-param-password": "Password da convalidare.", "apihelp-validatepassword-example-1": "Convalidare la password foobar per l'attuale utente.", "apihelp-validatepassword-example-2": "Convalida la password qwerty per la creazione dell'utente Example.", - "apihelp-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.", + "apihelp-watch-summary": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.", "apihelp-format-param-wrappedhtml": "Restituisce l'HTML ben formattato e i moduli ResourceLoader associati come un oggetto JSON.", "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.", "api-pageset-param-pageids": "Un elenco di ID pagina su cui lavorare.", @@ -629,6 +639,7 @@ "api-pageset-param-redirects-nogenerator": "Risolve automaticamente i reindirizzamenti in $1titles, $1pageids, e $1revids.", "api-pageset-param-converttitles": "Converte i titoli in altre varianti, se necessario. Funziona solo se la lingua del contenuto del wiki supporta la conversione in varianti. Le lingue che supportano la conversione in varianti includono $1", "api-help-main-header": "Modulo principale", + "api-help-undocumented-module": "Nessuna documentazione per il modulo $1.", "api-help-flag-deprecated": "Questo modulo è deprecato.", "api-help-flag-internal": "Questo modulo è interno o instabile. Il suo funzionamento potrebbe variare senza preavviso.", "api-help-flag-readrights": "Questo modulo richiede i diritti di lettura.", @@ -676,5 +687,6 @@ "apierror-invalidoldimage": "Il parametro oldimage ha un formato non valido.", "apierror-invaliduserid": "L'ID utente $1 non è valido.", "apierror-nosuchuserid": "Non c'è alcun utente con ID $1.", + "apierror-timeout": "Il server non ha risposto entro il tempo previsto.", "api-credits-header": "Crediti" } diff --git a/includes/api/i18n/ja.json b/includes/api/i18n/ja.json index e17b9adb80..c9eabbbdb6 100644 --- a/includes/api/i18n/ja.json +++ b/includes/api/i18n/ja.json @@ -14,7 +14,7 @@ "ネイ" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|説明文書]]\n* [[mw:API:FAQ|よくある質問]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n
    \n状態: このページに表示されている機能は全て動作するはずですが、この API は未だ活発に開発されており、変更される可能性があります。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n誤ったリクエスト: 誤ったリクエストが API に送られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:API:Errors_and_warnings|API: Errors and warnings]] を参照してください。\n\nテスト: API のリクエストのテストは、[[Special:ApiSandbox]]で簡単に行えます。", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|説明文書]]\n* [[mw:API:FAQ|よくある質問]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n
    \n状態: このページに表示されている機能は全て動作するはずですが、この API は未だ活発に開発されており、変更される可能性があります。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n誤ったリクエスト: 誤ったリクエストが API に送られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:API:Errors_and_warnings|API: Errors and warnings]] を参照してください。\n\nテスト: API のリクエストのテストは、[[Special:ApiSandbox]]で簡単に行えます。", "apihelp-main-param-action": "実行する操作です。", "apihelp-main-param-format": "出力する形式です。", "apihelp-main-param-smaxage": "s-maxage HTTP キャッシュ コントロール ヘッダー に、この秒数を設定します。エラーがキャッシュされることはありません。", @@ -24,7 +24,7 @@ "apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。", "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。", "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] は siprop=languages を付けると言語コードの一覧を返します。user を指定することで現在の利用者の個人設定の言語を、content を指定することでこのウィキの本文の言語を使用することもできます。", - "apihelp-block-description": "利用者をブロックします。", + "apihelp-block-summary": "利用者をブロックします。", "apihelp-block-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。$1useridとは同時に使用できません。", "apihelp-block-param-userid": "ブロックする利用者のID。$1userとは同時に使用できません。", "apihelp-block-param-expiry": "有効期限。相対的 (例: 5 months または 2 weeks) または絶対的 (e.g. 2014-09-18T12:34:56Z) どちらでも構いません。infinite, indefinite, もしくは never と設定した場合, 無期限ブロックとなります。", @@ -40,14 +40,15 @@ "apihelp-block-example-ip-simple": "IPアドレス 192.0.2.5 を First strike という理由で3日ブロックする", "apihelp-block-example-user-complex": "利用者 Vandal を Vandalism という理由で無期限ブロックし、新たなアカウント作成とメールの送信を禁止する。", "apihelp-changeauthenticationdata-example-password": "現在の利用者のパスワードを ExamplePassword に変更する。", - "apihelp-checktoken-description": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] のトークンの妥当性を確認します。", + "apihelp-checktoken-summary": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] のトークンの妥当性を確認します。", "apihelp-checktoken-param-type": "調べるトークンの種類。", "apihelp-checktoken-param-token": "調べるトークン。", "apihelp-checktoken-example-simple": "csrf トークンの妥当性を調べる。", - "apihelp-clearhasmsg-description": "現在の利用者の hasmsg フラグを消去します。", + "apihelp-clearhasmsg-summary": "現在の利用者の hasmsg フラグを消去します。", "apihelp-clearhasmsg-example-1": "現在の利用者の hasmsg フラグを消去する。", "apihelp-clientlogin-example-login": "利用者 Example としてのログイン処理をパスワード ExamplePassword で開始する", - "apihelp-compare-description": "2つの版間の差分を取得します。\n\n\"from\" と \"to\" の両方の版番号、ページ名、もしくはページIDを渡す必要があります。", + "apihelp-compare-summary": "2つの版間の差分を取得します。", + "apihelp-compare-extended-description": "\"from\" と \"to\" の両方の版番号、ページ名、もしくはページIDを渡す必要があります。", "apihelp-compare-param-fromtitle": "比較する1つ目のページ名。", "apihelp-compare-param-fromid": "比較する1つ目のページID。", "apihelp-compare-param-fromrev": "比較する1つ目の版。", @@ -55,7 +56,7 @@ "apihelp-compare-param-toid": "比較する2つ目のページID。", "apihelp-compare-param-torev": "比較する2つ目の版。", "apihelp-compare-example-1": "版1と2の差分を生成する。", - "apihelp-createaccount-description": "新しい利用者アカウントを作成します。", + "apihelp-createaccount-summary": "新しい利用者アカウントを作成します。", "apihelp-createaccount-param-name": "利用者名。", "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。", "apihelp-createaccount-param-domain": "外部認証のドメイン (省略可能)。", @@ -67,7 +68,7 @@ "apihelp-createaccount-param-language": "利用者の言語コードの既定値 (省略可能, 既定ではコンテンツ言語)。", "apihelp-createaccount-example-pass": "利用者 testuser をパスワード test123 として作成する。", "apihelp-createaccount-example-mail": "利用者 testmailuserを作成し、無作為に生成されたパスワードをメールで送る。", - "apihelp-delete-description": "ページを削除します。", + "apihelp-delete-summary": "ページを削除します。", "apihelp-delete-param-title": "削除するページ名です。$1pageid とは同時に使用できません。", "apihelp-delete-param-pageid": "削除するページIDです。$1title とは同時に使用できません。", "apihelp-delete-param-reason": "削除の理由です。入力しない場合、自動的に生成された理由が使用されます。", @@ -77,8 +78,8 @@ "apihelp-delete-param-oldimage": "削除する古い画像の[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] で取得できるような名前。", "apihelp-delete-example-simple": "Main Page を削除する", "apihelp-delete-example-reason": "Preparing for move という理由で Main Page を削除する", - "apihelp-disabled-description": "このモジュールは無効化されています。", - "apihelp-edit-description": "ページを作成、編集します。", + "apihelp-disabled-summary": "このモジュールは無効化されています。", + "apihelp-edit-summary": "ページを作成、編集します。", "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。", "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。", "apihelp-edit-param-section": "節番号です。先頭の節の場合は 0、新しい節の場合は newを指定します。", @@ -104,13 +105,13 @@ "apihelp-edit-example-edit": "ページを編集", "apihelp-edit-example-prepend": "__NOTOC__ をページの先頭に挿入する。", "apihelp-edit-example-undo": "版 13579 から 13585 まで要約を自動入力して取り消す。", - "apihelp-emailuser-description": "利用者に電子メールを送信します。", + "apihelp-emailuser-summary": "利用者に電子メールを送信します。", "apihelp-emailuser-param-target": "送信先の利用者名。", "apihelp-emailuser-param-subject": "題名。", "apihelp-emailuser-param-text": "電子メールの本文。", "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。", "apihelp-emailuser-example-email": "利用者 WikiSysop に Content という本文の電子メールを送信。", - "apihelp-expandtemplates-description": "ウィキテキストに含まれるすべてのテンプレートを展開します。", + "apihelp-expandtemplates-summary": "ウィキテキストに含まれるすべてのテンプレートを展開します。", "apihelp-expandtemplates-param-title": "ページの名前です。", "apihelp-expandtemplates-param-text": "変換するウィキテキストです。", "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開されたウィキテキスト。", @@ -118,7 +119,7 @@ "apihelp-expandtemplates-param-includecomments": "HTMLコメントを出力に含めるかどうか。", "apihelp-expandtemplates-param-generatexml": "XMLの構文解析ツリーを生成します (replaced by $1prop=parsetree)", "apihelp-expandtemplates-example-simple": "ウィキテキスト {{Project:Sandbox}} を展開する。", - "apihelp-feedcontributions-description": "利用者の投稿記録フィードを返します。", + "apihelp-feedcontributions-summary": "利用者の投稿記録フィードを返します。", "apihelp-feedcontributions-param-feedformat": "フィードの形式。", "apihelp-feedcontributions-param-user": "投稿記録を取得する利用者。", "apihelp-feedcontributions-param-namespace": "この名前空間への投稿記録に絞り込む。", @@ -131,7 +132,7 @@ "apihelp-feedcontributions-param-hideminor": "細部の編集を非表示", "apihelp-feedcontributions-param-showsizediff": "版間のサイズの増減を表示する。", "apihelp-feedcontributions-example-simple": "利用者 Example の投稿記録を取得する。", - "apihelp-feedrecentchanges-description": "最近の更新フィードを返します。", + "apihelp-feedrecentchanges-summary": "最近の更新フィードを返します。", "apihelp-feedrecentchanges-param-feedformat": "フィードの形式。", "apihelp-feedrecentchanges-param-namespace": "この名前空間の結果のみに絞り込む。", "apihelp-feedrecentchanges-param-invert": "選択されたものを除く、すべての名前空間。", @@ -148,16 +149,16 @@ "apihelp-feedrecentchanges-param-target": "このページからリンクされているページの変更のみを表示する。", "apihelp-feedrecentchanges-example-simple": "最近の更新を表示する。", "apihelp-feedrecentchanges-example-30days": "最近30日間の変更を表示する。", - "apihelp-feedwatchlist-description": "ウォッチリストのフィードを返します。", + "apihelp-feedwatchlist-summary": "ウォッチリストのフィードを返します。", "apihelp-feedwatchlist-param-feedformat": "フィードの形式。", "apihelp-feedwatchlist-param-linktosections": "可能であれば、変更された節に直接リンクする。", "apihelp-feedwatchlist-example-default": "ウォッチリストのフィードを表示する。", "apihelp-feedwatchlist-example-all6hrs": "ウォッチ中のページに対する過去6時間の更新をすべて表示する。", - "apihelp-filerevert-description": "ファイルを古い版に差し戻します。", + "apihelp-filerevert-summary": "ファイルを古い版に差し戻します。", "apihelp-filerevert-param-filename": "対象のファイル名 (File: 接頭辞を含めない)。", "apihelp-filerevert-param-comment": "アップロードのコメント。", "apihelp-filerevert-example-revert": "Wiki.png を 2011-03-05T15:27:40Z の版に差し戻す。", - "apihelp-help-description": "指定したモジュールのヘルプを表示します。", + "apihelp-help-summary": "指定したモジュールのヘルプを表示します。", "apihelp-help-param-modules": "ヘルプを表示するモジュールです (action パラメーターおよび format パラメーターの値、または main)。+ を使用して下位モジュールを指定できます。", "apihelp-help-param-submodules": "指定したモジュールの下位モジュールのヘルプを含めます。", "apihelp-help-param-recursivesubmodules": "下位モジュールのヘルプを再帰的に含めます。", @@ -168,11 +169,12 @@ "apihelp-help-example-recursive": "すべてのヘルプを1つのページに", "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ", "apihelp-help-example-query": "2つの下位モジュールのヘルプ", - "apihelp-imagerotate-description": "1つ以上の画像を回転させます。", + "apihelp-imagerotate-summary": "1つ以上の画像を回転させます。", "apihelp-imagerotate-param-rotation": "画像を回転させる時計回りの角度。", "apihelp-imagerotate-example-simple": "File:Example.png を 90 度回転させる。", "apihelp-imagerotate-example-generator": "Category:Flip 内のすべての画像を 180 度回転させる。", - "apihelp-import-description": "他のWikiまたはXMLファイルからページを取り込む。\n\nxml パラメーターでファイルを送信する場合、ファイルのアップロードとしてHTTP POSTされなければならない (例えば、multipart/form-dataを使用する) 点に注意してください。", + "apihelp-import-summary": "他のWikiまたはXMLファイルからページを取り込む。", + "apihelp-import-extended-description": "xml パラメーターでファイルを送信する場合、ファイルのアップロードとしてHTTP POSTされなければならない (例えば、multipart/form-dataを使用する) 点に注意してください。", "apihelp-import-param-summary": "記録されるページ取り込みの要約。", "apihelp-import-param-xml": "XMLファイルをアップロード", "apihelp-import-param-interwikisource": "ウィキ間の取り込みの場合: 取り込み元のウィキ。", @@ -182,14 +184,15 @@ "apihelp-import-param-namespace": "この名前空間に取り込む。$1rootpageパラメータとは同時に使用できません。", "apihelp-import-param-rootpage": "このページの下位ページとして取り込む。$1namespace パラメータとは同時に使用できません。", "apihelp-import-example-import": "[[meta:Help:ParserFunctions]] をすべての履歴とともに名前空間100に取り込む。", - "apihelp-login-description": "ログインして認証クッキーを取得します。\n\nログインが成功した場合、必要なクッキーは HTTP 応答ヘッダに含まれます。ログインに失敗した場合、自動化のパスワード推定攻撃を制限するために、追加の試行は速度制限されることがあります。", + "apihelp-login-summary": "ログインして認証クッキーを取得します。", + "apihelp-login-extended-description": "ログインが成功した場合、必要なクッキーは HTTP 応答ヘッダに含まれます。ログインに失敗した場合、自動化のパスワード推定攻撃を制限するために、追加の試行は速度制限されることがあります。", "apihelp-login-param-name": "利用者名。", "apihelp-login-param-password": "パスワード。", "apihelp-login-param-domain": "ドメイン (省略可能)", "apihelp-login-param-token": "最初のリクエストで取得したログイントークンです。", "apihelp-login-example-gettoken": "ログイントークンを取得する。", "apihelp-login-example-login": "ログイン", - "apihelp-logout-description": "ログアウトしてセッションデータを消去します。", + "apihelp-logout-summary": "ログアウトしてセッションデータを消去します。", "apihelp-logout-example-logout": "現在の利用者をログアウトする。", "apihelp-managetags-param-operation": "実行する操作:\n;create: 手動適用のための新たな変更タグを作成します。\n;delete: 変更タグをデータベースから削除し、そのタグが使用されているすべての版、最近の更新項目、記録項目からそれを除去します。\n;activate: 変更タグを有効化し、利用者がそのタグを手動で適用できるようにします。\n;deactivate: 変更タグを無効化し、利用者がそのタグを手動で適用することができないようにします。", "apihelp-managetags-param-tag": "作成、削除、有効化、または無効化するタグ。タグの作成の場合、そのタグは存在しないものでなければなりません。タグの削除の場合、そのタグが存在しなければなりません。タグの有効化の場合、そのタグが存在し、かつ拡張機能によって使用されていないものでなければなりません。タグの無効化の場合、そのタグが現在有効であって手動で定義されたものでなければなりません。", @@ -199,14 +202,14 @@ "apihelp-managetags-example-delete": "vandlaism タグを Misspelt という理由で削除する", "apihelp-managetags-example-activate": "spam という名前のタグを For use in edit patrolling という理由で有効化する", "apihelp-managetags-example-deactivate": "No longer required という理由でタグ spam を無効化する", - "apihelp-mergehistory-description": "ページの履歴を統合する。", + "apihelp-mergehistory-summary": "ページの履歴を統合する。", "apihelp-mergehistory-param-from": "履歴統合元のページ名。$1fromid とは同時に使用できません。", "apihelp-mergehistory-param-fromid": "履歴統合元のページ。$1from とは同時に使用できません。", "apihelp-mergehistory-param-to": "履歴統合先のページ名。$1toid とは同時に使用できません。", "apihelp-mergehistory-param-toid": "履歴統合先のページID。$1to とは同時に使用できません。", "apihelp-mergehistory-param-reason": "履歴の統合の理由。", "apihelp-mergehistory-example-merge": "Oldpage のすべての履歴を Newpage に統合する。", - "apihelp-move-description": "ページを移動します。", + "apihelp-move-summary": "ページを移動します。", "apihelp-move-param-from": "移動するページのページ名です。$1fromid とは同時に使用できません。", "apihelp-move-param-fromid": "移動するページのページIDです。$1from とは同時に使用できません。", "apihelp-move-param-to": "移動後のページ名。", @@ -218,11 +221,11 @@ "apihelp-move-param-unwatch": "そのページと転送ページを現在の利用者のウォッチリストから除去します。", "apihelp-move-param-ignorewarnings": "あらゆる警告を無視", "apihelp-move-example-move": "Badtitle を Goodtitle に転送ページを残さず移動", - "apihelp-opensearch-description": "OpenSearch プロトコルを使用してWiki内を検索します。", + "apihelp-opensearch-summary": "OpenSearch プロトコルを使用してWiki内を検索します。", "apihelp-opensearch-param-search": "検索文字列。", "apihelp-opensearch-param-limit": "返す結果の最大数。", "apihelp-opensearch-param-namespace": "検索する名前空間。", - "apihelp-opensearch-param-suggest": "[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] が false の場合、何もしません。", + "apihelp-opensearch-param-suggest": "[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] が false の場合、何もしません。", "apihelp-opensearch-param-redirects": "転送を処理する方法:\n;return: 転送ページそのものを返します。\n;resolve: 転送先のページを返します。$1limit より返される結果が少なくなるかもしれません。\n歴史的な理由により、$1format=json では \"return\" が、他の形式では \"resolve\" が既定です。", "apihelp-opensearch-param-format": "出力する形式。", "apihelp-opensearch-example-te": "Te から始まるページを検索する。", @@ -232,7 +235,7 @@ "apihelp-options-example-reset": "すべて初期設定に戻す。", "apihelp-options-example-change": "skin および hideminor の個人設定を変更する。", "apihelp-options-example-complex": "すべての個人設定を初期化し、skin および nickname を設定する。", - "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。", + "apihelp-paraminfo-summary": "API モジュールに関する情報を取得します。", "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (action および format パラメーターの値, または main). + を使用して下位モジュールを指定できます。", "apihelp-paraminfo-param-helpformat": "ヘルプ文字列の形式。", "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (prop, meta or list パラメータの値)。$1querymodules=foo の代わりに $1modules=query+foo を使用してください。", @@ -277,13 +280,13 @@ "apihelp-parse-example-page": "ページをパース", "apihelp-parse-example-text": "ウィキテキストをパース", "apihelp-parse-example-summary": "要約を構文解析します。", - "apihelp-patrol-description": "ページまたは版を巡回済みにする。", + "apihelp-patrol-summary": "ページまたは版を巡回済みにする。", "apihelp-patrol-param-rcid": "巡回済みにする最近の更新ID。", "apihelp-patrol-param-revid": "巡回済みにする版ID。", "apihelp-patrol-param-tags": "巡回記録の項目に適用する変更タグ。", "apihelp-patrol-example-rcid": "最近の更新を巡回", "apihelp-patrol-example-revid": "版を巡回済みにする。", - "apihelp-protect-description": "ページの保護レベルを変更します。", + "apihelp-protect-summary": "ページの保護レベルを変更します。", "apihelp-protect-param-title": "保護(解除)するページ名です。$1pageid とは同時に使用できません。", "apihelp-protect-param-pageid": "保護(解除)するページIDです。$1title とは同時に使用できません。", "apihelp-protect-param-protections": "action=level の形式 (例えば、edit=sysop) で整形された、保護レベルの一覧。レベル all は誰もが操作できる、言い換えると制限が掛かっていないことを意味します。\n\n注意: ここに列挙されなかった操作の制限は解除されます。", @@ -292,9 +295,9 @@ "apihelp-protect-param-tags": "保護記録の項目に適用する変更タグ。", "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。", "apihelp-protect-example-protect": "ページを保護する。", - "apihelp-protect-example-unprotect": "制限値を all にしてページの保護を解除する。", + "apihelp-protect-example-unprotect": "制限値を all にしてページの保護を解除する(つまり、誰もが操作できるようになる)\n。", "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。", - "apihelp-purge-description": "指定されたページのキャッシュを破棄します。", + "apihelp-purge-summary": "指定されたページのキャッシュを破棄します。", "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。", "apihelp-purge-example-simple": "ページ Main Page および API をパージする。", "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。", @@ -305,7 +308,7 @@ "apihelp-query-param-iwurl": "タイトルがウィキ間リンクである場合に、完全なURLを取得するかどうか。", "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|サイト情報]]とMain Pageの[[Special:ApiHelp/query+revisions|版]]を取得する。", "apihelp-query-example-allpages": "API/ で始まるページの版を取得する。", - "apihelp-query+allcategories-description": "すべてのカテゴリを一覧表示します。", + "apihelp-query+allcategories-summary": "すべてのカテゴリを一覧表示します。", "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。", "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。", "apihelp-query+allcategories-param-prefix": "この値で始まるページ名のカテゴリを検索します。", @@ -316,7 +319,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "__HIDDENCAT__に隠されているタグカテゴリ。", "apihelp-query+allcategories-example-size": "カテゴリを、内包するページ数の情報と共に、一覧表示する。", "apihelp-query+allcategories-example-generator": "List で始まるカテゴリページに関する情報を取得する。", - "apihelp-query+alldeletedrevisions-description": "利用者によって削除された、または名前空間内の削除されたすべての版を一覧表示する。", + "apihelp-query+alldeletedrevisions-summary": "利用者によって削除された、または名前空間内の削除されたすべての版を一覧表示する。", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "$3user と同時に使用します。", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "$3user と同時に使用できません。", "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。", @@ -328,11 +331,11 @@ "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。", "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。", "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意: [[mw:Manual:$wgMiserMode|miser mode]] により、$1user と $1namespace を同時に使用すると継続する前に $1limit より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意: [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] により、$1user と $1namespace を同時に使用すると継続する前に $1limit より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。", "apihelp-query+alldeletedrevisions-param-generatetitles": "ジェネレーターとして使用する場合、版IDではなくページ名を生成します。", "apihelp-query+alldeletedrevisions-example-user": "利用者 Example による削除された直近の50版を一覧表示する。", "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。", - "apihelp-query+allfileusages-description": "存在しないものを含め、すべてのファイルの使用状況を一覧表示する。", + "apihelp-query+allfileusages-summary": "存在しないものを含め、すべてのファイルの使用状況を一覧表示する。", "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのページ名。", "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのページ名。", "apihelp-query+allfileusages-param-prefix": "この値で始まるページ名のすべてのファイルを検索する。", @@ -344,7 +347,7 @@ "apihelp-query+allfileusages-example-unique": "ユニークなファイルを一覧表示する。", "apihelp-query+allfileusages-example-unique-generator": "ファイル名を、存在しないものに印をつけて、すべて取得する。", "apihelp-query+allfileusages-example-generator": "ファイルを含むページを取得します。", - "apihelp-query+allimages-description": "順次すべての画像を列挙します。", + "apihelp-query+allimages-summary": "順次すべての画像を列挙します。", "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。", "apihelp-query+allimages-param-dir": "一覧表示する方向。", "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。", @@ -363,7 +366,7 @@ "apihelp-query+allimages-example-recent": "[[Special:NewFiles]] のように、最近アップロードされたファイルの一覧を表示する。", "apihelp-query+allimages-example-mimetypes": "MIMEタイプが image/png または image/gif であるファイルの一覧を表示する", "apihelp-query+allimages-example-generator": "T で始まる4つのファイルに関する情報を表示する。", - "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。", + "apihelp-query+alllinks-summary": "与えられた名前空間へのすべてのリンクを一覧表示します。", "apihelp-query+alllinks-param-from": "列挙を開始するリンクのページ名。", "apihelp-query+alllinks-param-to": "列挙を終了するリンクのページ名。", "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。", @@ -401,7 +404,7 @@ "apihelp-query+allpages-example-B": "B で始まるページの一覧を表示する。", "apihelp-query+allpages-example-generator": "T で始まる4つのページに関する情報を表示する。", "apihelp-query+allpages-example-generator-revisions": "Re で始まる最初の非リダイレクトの2ページの内容を表示する。", - "apihelp-query+allredirects-description": "ある名前空間へのすべての転送を一覧表示する。", + "apihelp-query+allredirects-summary": "ある名前空間へのすべての転送を一覧表示する。", "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのページ名。", "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのページ名。", "apihelp-query+allredirects-param-prefix": "この値で始まるすべてのページを検索する。", @@ -412,7 +415,7 @@ "apihelp-query+allredirects-param-limit": "返す項目の総数。", "apihelp-query+allredirects-param-dir": "一覧表示する方向。", "apihelp-query+allredirects-example-B": "B で始まる転送先ページ (存在しないページも含む)を、転送元のページIDとともに表示する。", - "apihelp-query+allrevisions-description": "すべての版を一覧表示する。", + "apihelp-query+allrevisions-summary": "すべての版を一覧表示する。", "apihelp-query+allrevisions-param-start": "列挙の始点となるタイムスタンプ。", "apihelp-query+allrevisions-param-end": "列挙の終点となるタイムスタンプ。", "apihelp-query+allrevisions-param-user": "この利用者による版のみを一覧表示する。", @@ -425,7 +428,7 @@ "apihelp-query+mystashedfiles-paramvalue-prop-size": "ファイルサイズと画像の大きさを取得します。", "apihelp-query+mystashedfiles-paramvalue-prop-type": "ファイルの MIME タイプとメディアタイプを取得します。", "apihelp-query+mystashedfiles-param-limit": "取得するファイルの数。", - "apihelp-query+alltransclusions-description": "存在しないものも含めて、すべての参照読み込み ({{x}} で埋め込まれたページ) を一覧表示します。", + "apihelp-query+alltransclusions-summary": "存在しないものも含めて、すべての参照読み込み ({{x}} で埋め込まれたページ) を一覧表示します。", "apihelp-query+alltransclusions-param-from": "列挙を開始する参照読み込みのページ名。", "apihelp-query+alltransclusions-param-to": "列挙を終了する参照読み込みのページ名。", "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべての参照読み込みされているページを検索する。", @@ -438,7 +441,7 @@ "apihelp-query+alltransclusions-example-B": "参照読み込みされているページ (存在しないページも含む) を、参照元のページIDとともに、B で始まるものから一覧表示する。", "apihelp-query+alltransclusions-example-unique-generator": "参照読み込みされたページを、存在しないものに印をつけて、すべて取得する。", "apihelp-query+alltransclusions-example-generator": "参照読み込みを含んでいるページを取得する。", - "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。", + "apihelp-query+allusers-summary": "すべての登録利用者を一覧表示します。", "apihelp-query+allusers-param-from": "列挙を開始する利用者名。", "apihelp-query+allusers-param-to": "列挙を終了する利用者名。", "apihelp-query+allusers-param-prefix": "この値で始まるすべての利用者を検索する。", @@ -455,7 +458,7 @@ "apihelp-query+allusers-param-witheditsonly": "編集履歴のある利用者のみ一覧表示する。", "apihelp-query+allusers-param-activeusers": "最近 $1 {{PLURAL:$1|日間}}のアクティブな利用者のみを一覧表示する。", "apihelp-query+allusers-example-Y": "Y で始まる利用者を一覧表示する。", - "apihelp-query+backlinks-description": "与えられたページにリンクしているすべてのページを検索します。", + "apihelp-query+backlinks-summary": "与えられたページにリンクしているすべてのページを検索します。", "apihelp-query+backlinks-param-title": "検索するページ名。$1pageid とは同時に使用できません。", "apihelp-query+backlinks-param-pageid": "検索するページID。$1titleとは同時に使用できません。", "apihelp-query+backlinks-param-namespace": "列挙する名前空間。", @@ -463,7 +466,7 @@ "apihelp-query+backlinks-param-limit": "返すページの総数。$1redirect を有効化した場合は、各レベルに対し個別にlimitが適用されます (つまり、最大で 2 * $1limit 件の結果が返されます)。", "apihelp-query+backlinks-example-simple": "Main page へのリンクを表示する。", "apihelp-query+backlinks-example-generator": "Main page にリンクしているページの情報を取得する。", - "apihelp-query+blocks-description": "ブロックされた利用者とIPアドレスを一覧表示します。", + "apihelp-query+blocks-summary": "ブロックされた利用者とIPアドレスを一覧表示します。", "apihelp-query+blocks-param-start": "列挙の始点となるタイムスタンプ。", "apihelp-query+blocks-param-end": "列挙の終点となるタイムスタンプ。", "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。", @@ -483,7 +486,7 @@ "apihelp-query+blocks-param-show": "これらの基準を満たす項目のみを表示します。\nたとえば、IPアドレスの無期限ブロックのみを表示するには、$1show=ip|!temp を設定します。", "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。", "apihelp-query+blocks-example-users": "利用者Alice および Bob のブロックを一覧表示する。", - "apihelp-query+categories-description": "ページが属するすべてのカテゴリを一覧表示します。", + "apihelp-query+categories-summary": "ページが属するすべてのカテゴリを一覧表示します。", "apihelp-query+categories-param-prop": "各カテゴリについて取得する追加のプロパティ:", "apihelp-query+categories-paramvalue-prop-timestamp": "カテゴリが追加されたときのタイムスタンプを追加します。", "apihelp-query+categories-paramvalue-prop-hidden": "__HIDDENCAT__で隠されているカテゴリに印を付ける。", @@ -491,9 +494,9 @@ "apihelp-query+categories-param-limit": "返すカテゴリの数。", "apihelp-query+categories-example-simple": "ページ Albert Einstein が属しているカテゴリの一覧を取得する。", "apihelp-query+categories-example-generator": "ページ Albert Einstein で使われているすべてのカテゴリに関する情報を取得する。", - "apihelp-query+categoryinfo-description": "与えられたカテゴリに関する情報を返します。", + "apihelp-query+categoryinfo-summary": "与えられたカテゴリに関する情報を返します。", "apihelp-query+categoryinfo-example-simple": "Category:Foo および Category:Bar に関する情報を取得する。", - "apihelp-query+categorymembers-description": "与えられたカテゴリ内のすべてのページを一覧表示します。", + "apihelp-query+categorymembers-summary": "与えられたカテゴリ内のすべてのページを一覧表示します。", "apihelp-query+categorymembers-param-title": "一覧表示するカテゴリ (必須)。{{ns:category}}: 接頭辞を含まなければなりません。$1pageid とは同時に使用できません。", "apihelp-query+categorymembers-param-pageid": "一覧表示するカテゴリのページID. $1title とは同時に使用できません。", "apihelp-query+categorymembers-param-prop": "どの情報を結果に含めるか:", @@ -510,7 +513,7 @@ "apihelp-query+categorymembers-param-endsortkey": "代わりに $1endhexsortkey を使用してください。", "apihelp-query+categorymembers-example-simple": "Category:Physics に含まれる最初の10ページを取得する。", "apihelp-query+categorymembers-example-generator": "Category:Physics に含まれる最初の10ページのページ情報を取得する。", - "apihelp-query+contributors-description": "ページへのログインした投稿者の一覧と匿名投稿者の数を取得します。", + "apihelp-query+contributors-summary": "ページへのログインした投稿者の一覧と匿名投稿者の数を取得します。", "apihelp-query+contributors-param-limit": "返す投稿者の数。", "apihelp-query+contributors-example-simple": "Main Page への投稿者を表示する。", "apihelp-query+deletedrevisions-param-start": "列挙の始点となるタイムスタンプ。版IDの一覧を処理するときには無視されます。", @@ -535,7 +538,7 @@ "apihelp-query+deletedrevs-example-mode2": "Bob による、削除された最後の50投稿を一覧表示する(モード 2)。", "apihelp-query+deletedrevs-example-mode3-main": "標準名前空間にある削除された最初の50版を一覧表示する(モード 3)。", "apihelp-query+deletedrevs-example-mode3-talk": "{{ns:talk}}名前空間にある削除された最初の50版を一覧表示する(モード 3)。", - "apihelp-query+disabled-description": "このクエリモジュールは無効化されています。", + "apihelp-query+disabled-summary": "このクエリモジュールは無効化されています。", "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。", "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。", "apihelp-query+embeddedin-param-namespace": "列挙する名前空間。", @@ -543,11 +546,11 @@ "apihelp-query+embeddedin-param-limit": "返すページの総数。", "apihelp-query+embeddedin-example-simple": "Template:Stub を参照読み込みしているページを表示する。", "apihelp-query+embeddedin-example-generator": "Template:Stub をトランスクルードしているページに関する情報を取得する。", - "apihelp-query+extlinks-description": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。", + "apihelp-query+extlinks-summary": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。", "apihelp-query+extlinks-param-limit": "返すリンクの数。", "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ$1query が設定されている場合, protocol は http となります。すべての外部リンクを一覧表示するためにはこのパラメータと $1query の両方を空にしてください。", "apihelp-query+extlinks-example-simple": "Main Page の外部リンクの一覧を取得する。", - "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。", + "apihelp-query+exturlusage-summary": "与えられたURLを含むページを一覧表示します。", "apihelp-query+exturlusage-param-prop": "どの情報を結果に含めるか:", "apihelp-query+exturlusage-paramvalue-prop-ids": "ページのIDを追加します。", "apihelp-query+exturlusage-paramvalue-prop-title": "ページ名と名前空間IDを追加します。", @@ -557,7 +560,7 @@ "apihelp-query+exturlusage-param-namespace": "列挙するページ名前空間。", "apihelp-query+exturlusage-param-limit": "返すページの数。", "apihelp-query+exturlusage-example-simple": "http://www.mediawiki.org にリンクしているページを一覧表示する。", - "apihelp-query+filearchive-description": "削除されたファイルをすべて順に列挙します。", + "apihelp-query+filearchive-summary": "削除されたファイルをすべて順に列挙します。", "apihelp-query+filearchive-param-from": "列挙の始点となる画像のページ名。", "apihelp-query+filearchive-param-to": "列挙の終点となる画像のページ名。", "apihelp-query+filearchive-param-dir": "一覧表示する方向。", @@ -592,7 +595,7 @@ "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。", "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。", "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]] の現在のバージョンに関する情報を取得する。", - "apihelp-query+images-description": "与えられたページに含まれるすべてのファイルを返します。", + "apihelp-query+images-summary": "与えられたページに含まれるすべてのファイルを返します。", "apihelp-query+images-param-limit": "返す画像の数。", "apihelp-query+images-example-simple": "[[Main Page]] で使用されているファイルの一覧を取得する。", "apihelp-query+images-example-generator": "[[Main Page]] で使用されているファイルに関する情報を取得する。", @@ -601,7 +604,7 @@ "apihelp-query+imageusage-param-namespace": "列挙する名前空間。", "apihelp-query+imageusage-example-simple": "[[:File:Albert Einstein Head.jpg]] を使用しているページを表示する。", "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]] を使用しているページに関する情報を取得する。", - "apihelp-query+info-description": "ページの基本的な情報を取得します。", + "apihelp-query+info-summary": "ページの基本的な情報を取得します。", "apihelp-query+info-param-prop": "追加で取得するプロパティ:", "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。", "apihelp-query+info-param-token": "代わりに [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] を使用してください。", @@ -615,7 +618,7 @@ "apihelp-query+iwbacklinks-param-dir": "一覧表示する方向。", "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。", "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。", - "apihelp-query+iwlinks-description": "ページからのすべてのウィキ間リンクを返します。", + "apihelp-query+iwlinks-summary": "ページからのすべてのウィキ間リンクを返します。", "apihelp-query+iwlinks-param-url": "完全なURLを取得するかどうか ($1propとは同時に使用できません).", "apihelp-query+iwlinks-param-prop": "各言語間リンクについて取得する追加のプロパティ:", "apihelp-query+iwlinks-paramvalue-prop-url": "完全なURLを追加します。", @@ -633,7 +636,7 @@ "apihelp-query+langbacklinks-param-dir": "一覧表示する方向。", "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。", "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。", - "apihelp-query+langlinks-description": "ページからのすべての言語間リンクを返します。", + "apihelp-query+langlinks-summary": "ページからのすべての言語間リンクを返します。", "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。", "apihelp-query+langlinks-param-url": "完全なURLを取得するかどうか ($1propとは同時に使用できません).", "apihelp-query+langlinks-param-prop": "各言語間リンクについて取得する追加のプロパティ:", @@ -643,7 +646,7 @@ "apihelp-query+langlinks-param-title": "検索するリンク。$1langと同時に使用しなければなりません。", "apihelp-query+langlinks-param-dir": "一覧表示する方向。", "apihelp-query+langlinks-example-simple": "Main Page にある言語間リンクを取得する。", - "apihelp-query+links-description": "ページからのすべてのリンクを返します。", + "apihelp-query+links-summary": "ページからのすべてのリンクを返します。", "apihelp-query+links-param-namespace": "この名前空間へのリンクのみ表示する。", "apihelp-query+links-param-limit": "返すリンクの数。", "apihelp-query+links-example-simple": "Main Page からのリンクを取得する。", @@ -672,12 +675,12 @@ "apihelp-query+logevents-param-tag": "このタグが付与された記録項目のみ表示する。", "apihelp-query+logevents-param-limit": "返す記録項目の総数。", "apihelp-query+logevents-example-simple": "最近の記録項目を一覧表示する。", - "apihelp-query+pagepropnames-description": "Wiki内で使用されているすべてのページプロパティ名を一覧表示します。", + "apihelp-query+pagepropnames-summary": "Wiki内で使用されているすべてのページプロパティ名を一覧表示します。", "apihelp-query+pagepropnames-param-limit": "返す名前の最大数。", "apihelp-query+pagepropnames-example-simple": "最初の10個のプロパティ名を取得する。", - "apihelp-query+pageprops-description": "ページコンテンツで定義されている様々なページのプロパティを取得。", + "apihelp-query+pageprops-summary": "ページコンテンツで定義されている様々なページのプロパティを取得。", "apihelp-query+pageprops-example-simple": "ページ Main Page および MeiaWiki のプロパティを取得する。", - "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。", + "apihelp-query+pageswithprop-summary": "与えられたページプロパティが使用されているすべてのページを一覧表示します。", "apihelp-query+pageswithprop-param-prop": "どの情報を結果に含めるか:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "ページIDを追加します。", "apihelp-query+pageswithprop-paramvalue-prop-title": "ページ名と名前空間IDを追加します。", @@ -685,12 +688,13 @@ "apihelp-query+pageswithprop-param-limit": "返すページの最大数。", "apihelp-query+pageswithprop-example-simple": "{{DISPLAYTITLE:}} を使用している最初の10ページを一覧表示する。", "apihelp-query+pageswithprop-example-generator": "__NOTOC__ を使用している最初の10ページについての追加情報を取得する。", - "apihelp-query+prefixsearch-description": "ページ名の先頭一致検索を行います。\n\n名前が似ていますが、このモジュールは[[Special:PrefixIndex]]と等価であることを意図しません。そのような目的では[[Special:ApiHelp/query+allpages|action=query&list=allpages]] を apprefix パラメーターと共に使用してください。このモジュールの目的は [[Special:ApiHelp/opensearch|action=opensearch]] と似ています: 利用者から入力を受け取り、最も適合するページ名を提供するというものです。検索エンジンのバックエンドによっては、誤入力の訂正や、転送の回避、その他のヒューリスティクスが適用されることがあります。", + "apihelp-query+prefixsearch-summary": "ページ名の先頭一致検索を行います。", + "apihelp-query+prefixsearch-extended-description": "名前が似ていますが、このモジュールは[[Special:PrefixIndex]]と等価であることを意図しません。そのような目的では[[Special:ApiHelp/query+allpages|action=query&list=allpages]] を apprefix パラメーターと共に使用してください。このモジュールの目的は [[Special:ApiHelp/opensearch|action=opensearch]] と似ています: 利用者から入力を受け取り、最も適合するページ名を提供するというものです。検索エンジンのバックエンドによっては、誤入力の訂正や、転送の回避、その他のヒューリスティクスが適用されることがあります。", "apihelp-query+prefixsearch-param-search": "検索文字列。", "apihelp-query+prefixsearch-param-namespace": "検索する名前空間。", "apihelp-query+prefixsearch-param-limit": "返す結果の最大数。", "apihelp-query+prefixsearch-example-simple": "meaning で始まるページ名を検索する。", - "apihelp-query+protectedtitles-description": "作成保護が掛けられているページを一覧表示します。", + "apihelp-query+protectedtitles-summary": "作成保護が掛けられているページを一覧表示します。", "apihelp-query+protectedtitles-param-namespace": "この名前空間に含まれるページのみを一覧表示します。", "apihelp-query+protectedtitles-param-level": "この保護レベルのページのみを一覧表示します。", "apihelp-query+protectedtitles-param-limit": "返すページの総数。", @@ -709,7 +713,7 @@ "apihelp-query+random-param-filterredir": "転送ページを絞り込む方法。", "apihelp-query+random-example-simple": "標準名前空間から2つのページを無作為に返す。", "apihelp-query+random-example-generator": "標準名前空間から無作為に選ばれた2つのページのページ情報を返す。", - "apihelp-query+recentchanges-description": "最近の更新を一覧表示します。", + "apihelp-query+recentchanges-summary": "最近の更新を一覧表示します。", "apihelp-query+recentchanges-param-start": "列挙の始点となるタイムスタンプ。", "apihelp-query+recentchanges-param-end": "列挙の終点となるタイムスタンプ。", "apihelp-query+recentchanges-param-namespace": "この名前空間の変更のみに絞り込む。", @@ -730,7 +734,7 @@ "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。", "apihelp-query+recentchanges-param-generaterevisions": "ジェネレータとして使用される場合、版IDではなくページ名を生成します。関連する版IDのない最近の変更の項目 (例えば、ほとんどの記録項目) は何も生成しません。", "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。", - "apihelp-query+redirects-description": "ページへのすべての転送を返します。", + "apihelp-query+redirects-summary": "ページへのすべての転送を返します。", "apihelp-query+redirects-param-prop": "取得するプロパティ:", "apihelp-query+redirects-paramvalue-prop-pageid": "各リダイレクトのページID。", "apihelp-query+redirects-paramvalue-prop-title": "各リダイレクトのページ名。", @@ -757,7 +761,7 @@ "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。", "apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。", "apihelp-query+revisions+base-param-limit": "返す版の数を制限する。", - "apihelp-query+search-description": "全文検索を行います。", + "apihelp-query+search-summary": "全文検索を行います。", "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。", "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。", "apihelp-query+search-param-what": "実行する検索の種類です。", @@ -773,9 +777,10 @@ "apihelp-query+siteinfo-paramvalue-prop-general": "システム全体の情報。", "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特別ページの別名の一覧。", "apihelp-query+siteinfo-paramvalue-prop-magicwords": "マジックワードとこれらの別名の一覧。", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "アップロードが許可されているファイル拡張子の一覧を返します。", "apihelp-query+siteinfo-param-numberingroup": "利用者グループに属する利用者の数を一覧表示します。", "apihelp-query+siteinfo-example-simple": "サイト情報を取得する。", - "apihelp-query+tags-description": "変更タグを一覧表示します。", + "apihelp-query+tags-summary": "変更タグを一覧表示します。", "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。", "apihelp-query+tags-param-prop": "取得するプロパティ:", "apihelp-query+tags-paramvalue-prop-name": "タグの名前を追加。", @@ -783,23 +788,23 @@ "apihelp-query+tags-paramvalue-prop-description": "タグの説明を追加します。", "apihelp-query+tags-paramvalue-prop-hitcount": "版の記録項目の数と、このタグを持っている記録項目の数を、追加します。", "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。", - "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。", + "apihelp-query+templates-summary": "与えられたページでトランスクルードされているすべてのページを返します。", "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。", "apihelp-query+templates-param-limit": "返すテンプレートの数。", "apihelp-query+templates-example-simple": "Main Page で使用されているテンプレートを取得する。", "apihelp-query+templates-example-generator": "Main Page で使用されているテンプレートに関する情報を取得する。", "apihelp-query+templates-example-namespaces": "Main Page でトランスクルードされている {{ns:user}} および {{ns:template}} 名前空間のページを取得する。", - "apihelp-query+tokens-description": "データ変更操作用のトークンを取得します。", + "apihelp-query+tokens-summary": "データ変更操作用のトークンを取得します。", "apihelp-query+tokens-param-type": "リクエストするトークンの種類。", "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。", "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。", - "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。", + "apihelp-query+transcludedin-summary": "与えられたページをトランスクルードしているすべてのページを検索します。", "apihelp-query+transcludedin-param-prop": "取得するプロパティ:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "各ページのページID。", "apihelp-query+transcludedin-paramvalue-prop-title": "各ページのページ名。", "apihelp-query+transcludedin-example-simple": "Main Page をトランスクルードしているページの一覧を取得する。", "apihelp-query+transcludedin-example-generator": "Main Page をトランスクルードしているページに関する情報を取得する。", - "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。", + "apihelp-query+usercontribs-summary": "利用者によるすべての編集を取得します。", "apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。", "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。$1userids または $1userprefix とは同時に使用できません。", "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user または $1userids とは同時に使用できません。", @@ -815,16 +820,16 @@ "apihelp-query+usercontribs-param-toponly": "最新の版である変更のみを一覧表示する。", "apihelp-query+usercontribs-example-user": "利用者 Example の投稿記録を表示する。", "apihelp-query+usercontribs-example-ipprefix": "192.0.2. から始まるすべてのIPアドレスからの投稿記録を表示する。", - "apihelp-query+userinfo-description": "現在の利用者に関する情報を取得します。", + "apihelp-query+userinfo-summary": "現在の利用者に関する情報を取得します。", "apihelp-query+userinfo-param-prop": "どの情報を結果に含めるか:", "apihelp-query+userinfo-paramvalue-prop-realname": "利用者の本名を追加します。", "apihelp-query+userinfo-example-simple": "現在の利用者に関する情報を取得します。", "apihelp-query+userinfo-example-data": "現在の利用者に関する追加情報を取得します。", - "apihelp-query+users-description": "利用者のリストについての情報を取得します。", + "apihelp-query+users-summary": "利用者のリストについての情報を取得します。", "apihelp-query+users-param-prop": "どの情報を結果に含めるか:", "apihelp-query+users-param-token": "代わりに [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] を使用してください。", "apihelp-query+users-example-simple": "利用者 Example の情報を返す。", - "apihelp-query+watchlist-description": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。", + "apihelp-query+watchlist-summary": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。", "apihelp-query+watchlist-param-start": "列挙の始点となるタイムスタンプ。", "apihelp-query+watchlist-param-end": "列挙の終点となるタイムスタンプ。", "apihelp-query+watchlist-param-namespace": "この名前空間の変更のみに絞り込む。", @@ -840,13 +845,13 @@ "apihelp-query+watchlist-paramvalue-prop-loginfo": "適切な場合にログ情報を追加します。", "apihelp-query+watchlist-example-simple": "現在の利用者のウォッチリストにある最近変更されたページの最新版を一覧表示します。", "apihelp-query+watchlist-example-generator": "現在の利用者のウォッチリスト上の最近更新されたページに関する情報を取得する。", - "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。", + "apihelp-query+watchlistraw-summary": "現在の利用者のウォッチリストにあるすべてのページを取得します。", "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。", "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:", "apihelp-query+watchlistraw-param-dir": "一覧表示する方向。", "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。", "apihelp-resetpassword-example-user": "利用者 Example にパスワード再設定の電子メールを送信する。", - "apihelp-revisiondelete-description": "版の削除および復元を行います。", + "apihelp-revisiondelete-summary": "版の削除および復元を行います。", "apihelp-revisiondelete-param-reason": "削除または復元の理由。", "apihelp-revisiondelete-example-revision": "Main Page の版 12345 の本文を隠す。", "apihelp-rollback-param-title": "巻き戻すページ名です。$1pageid とは同時に使用できません。", @@ -856,24 +861,31 @@ "apihelp-rollback-param-markbot": "巻き戻された編集と巻き戻しをボットの編集としてマークする。", "apihelp-rollback-example-simple": "利用者 Example による Main Page への最後の一連の編集を巻き戻す。", "apihelp-rollback-example-summary": "IP利用者 192.0.2.5 による Main Page への最後の一連の編集を Reverting vandalism という理由で、それらの編集とその差し戻しをボットの編集としてマークして差し戻す。", + "apihelp-setpagelanguage-summary": "ページの言語を変更します。", + "apihelp-setpagelanguage-extended-description-disabled": "ページ言語の変更はこのwikiでは許可されていません。\n\nこの操作を利用するには、[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] を設定してください。", + "apihelp-setpagelanguage-param-title": "言語を変更したいページのページ名。$1pageid とは同時に使用できません。", + "apihelp-setpagelanguage-param-pageid": "言語を変更したいページのページID。$1title とは同時に使用できません。", "apihelp-stashedit-param-title": "編集されているページのページ名。", + "apihelp-stashedit-param-section": "節番号です。先頭の節の場合は 0、新しい節の場合は newを指定します。", + "apihelp-stashedit-param-sectiontitle": "新しい節の名前です。", "apihelp-stashedit-param-text": "ページの本文。", "apihelp-stashedit-param-contentmodel": "新しいコンテンツのコンテンツ・モデル。", - "apihelp-tag-description": "個々の版または記録項目に対しタグの追加または削除を行います。", + "apihelp-tag-summary": "個々の版または記録項目に対しタグの追加または削除を行います。", "apihelp-tag-param-add": "追加するタグ。手動で定義されたタグのみ追加可能です。", "apihelp-tag-param-reason": "変更の理由。", "apihelp-tag-example-rev": "版ID 123に vandalism タグを理由を指定せずに追加する", "apihelp-tag-example-log": "Wrongly applied という理由で spam タグを 記録項目ID 123 から取り除く", "apihelp-tokens-param-type": "リクエストするトークンの種類。", "apihelp-tokens-example-edit": "編集トークンを取得する (既定)。", - "apihelp-unblock-description": "利用者のブロックを解除します。", + "apihelp-unblock-summary": "利用者のブロックを解除します。", "apihelp-unblock-param-id": "解除するブロックのID (list=blocksで取得できます)。$1user とは同時に使用できません。", "apihelp-unblock-param-user": "ブロックを解除する利用者名、IPアドレスまたはIPレンジ。$1idとは同時に使用できません。", "apihelp-unblock-param-reason": "ブロック解除の理由。", "apihelp-unblock-param-tags": "ブロック記録の項目に適用する変更タグ。", "apihelp-unblock-example-id": "ブロックID #105 を解除する。", "apihelp-unblock-example-user": "Sorry Bob という理由で利用者 Bob のブロックを解除する。", - "apihelp-undelete-description": "削除されたページの版を復元します。\n\n削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。", + "apihelp-undelete-summary": "削除されたページの版を復元します。", + "apihelp-undelete-extended-description": "削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。", "apihelp-undelete-param-title": "復元するページ名。", "apihelp-undelete-param-reason": "復元の理由。", "apihelp-undelete-param-tags": "削除記録の項目に適用する変更タグ。", @@ -883,30 +895,31 @@ "apihelp-upload-param-watch": "このページをウォッチする。", "apihelp-upload-param-ignorewarnings": "あらゆる警告を無視する。", "apihelp-upload-param-url": "ファイル取得元のURL.", - "apihelp-userrights-description": "利用者の所属グループを変更します。", + "apihelp-userrights-summary": "利用者の所属グループを変更します。", "apihelp-userrights-param-user": "利用者名。", "apihelp-userrights-param-userid": "利用者ID。", "apihelp-userrights-param-add": "利用者をこのグループに追加します。", "apihelp-userrights-param-reason": "変更の理由。", - "apihelp-watch-description": "現在の利用者のウォッチリストにページを追加/除去します。", + "apihelp-userrights-example-expiry": "利用者 SometimeSysop を 1ヶ月間 sysop グループに追加する。", + "apihelp-watch-summary": "現在の利用者のウォッチリストにページを追加/除去します。", "apihelp-watch-example-watch": "Main Page をウォッチする。", "apihelp-watch-example-unwatch": "Main Page のウォッチを解除する。", - "apihelp-format-example-generic": "クエリの結果を $1 形式に返します。", - "apihelp-json-description": "データを JSON 形式で出力します。", + "apihelp-format-example-generic": "クエリの結果を $1 形式で返します。", + "apihelp-json-summary": "データを JSON 形式で出力します。", "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。", "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。formatversion が 1 でない場合は既定です。", "apihelp-json-param-ascii": "指定すると、すべての非ASCII文字を16進エスケープにエンコードします。formatversion が 1 の場合既定です。", - "apihelp-jsonfm-description": "データを JSON 形式 (HTML に埋め込んだ形式) で出力します。", - "apihelp-none-description": "何も出力しません。", - "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。", - "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。", - "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。", - "apihelp-xml-description": "データを XML 形式で出力します。", + "apihelp-jsonfm-summary": "データを JSON 形式 (HTML に埋め込んだ形式) で出力します。", + "apihelp-none-summary": "何も出力しません。", + "apihelp-php-summary": "データを PHP のシリアル化した形式で出力します。", + "apihelp-phpfm-summary": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。", + "apihelp-rawfm-summary": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。", + "apihelp-xml-summary": "データを XML 形式で出力します。", "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:MediaWiki}} 名前空間の、ページ名の末尾が .xsl でのタイトルである必要があります。", "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。", - "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。", + "apihelp-xmlfm-summary": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。", "api-format-title": "MediaWiki API の結果", - "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\nformat パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。", + "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\nformat パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:Special:MyLanguage/API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。", "api-pageset-param-titles": "対象のページ名のリスト。", "api-pageset-param-pageids": "対象のページIDのリスト。", "api-pageset-param-revids": "対象の版IDのリスト。", @@ -938,7 +951,7 @@ "api-help-param-default-empty": "既定値: (空)", "api-help-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] から取得した「$1」トークン", "api-help-param-token-webui": "互換性のために、ウェブUIで使用されるトークンも受理されます。", - "api-help-param-limited-in-miser-mode": "注意: [[mw:Manual:$wgMiserMode|miser mode]] により、これを使用すると継続する前に $1limit より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。", + "api-help-param-limited-in-miser-mode": "注意: [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] により、これを使用すると継続する前に $1limit より返される結果が少なくなることがあります; 極端な場合では、ゼロ件の結果が返ることもあります。", "api-help-param-direction": "列挙の方向:\n;newer:古いものを先に表示します。注意: $1start は $1end 以前でなければなりません。\n;older:新しいものを先に表示します (既定)。注意: $1start は $1end 以降でなければなりません。", "api-help-param-no-description": "(説明なし)", "api-help-examples": "{{PLURAL:$1|例}}:", @@ -946,6 +959,9 @@ "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2", "api-help-open-in-apisandbox": "[サンドボックスで開く]", "apierror-missingparam": "パラメーター $1 を設定してください。", + "apierror-timeout": "サーバーが決められた時間内に応答しませんでした。", + "apiwarn-invalidcategory": "「$1」はカテゴリではありません。", + "apiwarn-notfile": "「$1」はファイルではありません。", "api-credits-header": "クレジット", "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://phabricator.wikimedia.org/" } diff --git a/includes/api/i18n/ko.json b/includes/api/i18n/ko.json index ec20f8a7aa..bff361e40b 100644 --- a/includes/api/i18n/ko.json +++ b/includes/api/i18n/ko.json @@ -15,13 +15,14 @@ "Ykhwong", "Jonghaya", "Jerrykim306", - "코코아" + "코코아", + "Macofe" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n
    \n상태: 이 페이지에 보이는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n잘못된 요청: API에 잘못된 요청이 전송되면 \"MediaWiki-API-Error\" 키가 포함된 HTTP 헤더가 전송되며 반환되는 헤더와 오류 코드의 값은 모두 동일한 값으로 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors and warnings/ko|API:오류와 경고]]를 참조하십시오.\n\n테스트하기: API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|설명문서]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n
    \n상태: 이 페이지에 보이는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n잘못된 요청: API에 잘못된 요청이 전송되면 \"MediaWiki-API-Error\" 키가 포함된 HTTP 헤더가 전송되며 반환되는 헤더와 오류 코드의 값은 모두 동일한 값으로 설정됩니다. 자세한 정보에 대해서는 [[mw:Special:MyLanguage/API:Errors and warnings/ko|API:오류와 경고]]를 참조하십시오.\n\n테스트하기: API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.", "apihelp-main-param-action": "수행할 동작", "apihelp-main-param-format": "출력값의 형식.", - "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, maxlag 오류 코드와 Waiting for $host: $lag seconds lagged 메시지가 제공됩니다.
    [[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.", + "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, maxlag 오류 코드와 $host 대기 중: $lag초 지연되었습니다 메시지가 제공됩니다.
    [[mw:Special:MyLanguage/Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]]에서 더 많은 정보를 얻을 수 있습니다.", "apihelp-main-param-smaxage": "s-maxage HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.", "apihelp-main-param-maxage": "max-age HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.", "apihelp-main-param-assert": "user 플래그가 설정되어 있다면 로그인 여부를 체크하며, bot 플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.", @@ -35,7 +36,7 @@ "apihelp-main-param-errorformat": "경고 및 오류 텍스트 출력을 위해 사용할 형식입니다.\n; plaintext: HTML 태그가 제거되고 엔티티가 치환된 위키텍스트입니다.\n; wikitext: 구문 분석되지 않은 위키텍스트입니다.\n; html: HTML입니다.\n; raw: 메시지 키와 변수입니다.\n; none: 텍스트 없이 오류 코드만 출력합니다.\n; bc: 미디어위키 1.29 이전에 사용된 형식입니다. errorlang 및 errorsuselocal은 무시됩니다.", "apihelp-main-param-errorlang": "경고와 오류를 위해 사용할 언어입니다. siprop=languages가 포함된 [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]는 언어 코드의 목록을 반환하고, content를 지정하면 이 위키의 내용 상의 언어를 사용하며, uselang을 지정하면 uselang 변수와 동일한 값을 사용합니다.", "apihelp-main-param-errorsuselocal": "지정하면 오류 텍스트가 {{ns:MediaWiki}} 이름공간에서 지역적으로 정의된 메시지를 사용합니다.", - "apihelp-block-description": "사용자를 차단합니다.", + "apihelp-block-summary": "사용자를 차단합니다.", "apihelp-block-param-user": "차단할 사용자 이름, IP 주소, 또는 IP 주소 대역입니다. $1userid와(과) 함께 사용할 수 없습니다.", "apihelp-block-param-userid": "차단할 사용자 ID입니다. $1user와(과) 함께 사용할 수 없습니다.", "apihelp-block-param-expiry": "기한. 상대값(예시: 5 months 또는
    2 weeks
    ) 또는 절대값(예시: 2014-09-18T12:34:56Z)이 될 수 있습니다. infinite, indefinite 또는 never로 설정하면 무기한으로 설정됩니다.", @@ -45,33 +46,35 @@ "apihelp-block-param-autoblock": "최근 사용한 IP 주소나 로그인을 시도한 이후에 사용한 모든 IP 주소를 자동으로 차단합니다.", "apihelp-block-param-noemail": "위키를 통해 이메일을 보내지 못하도록 막습니다. (blockemail 권한 필요)", "apihelp-block-param-hidename": "차단 기록에서 사용자 이름을 숨깁니다. (hideuser 권한 필요)", - "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. ([[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]] 값에 따라 다름)", + "apihelp-block-param-allowusertalk": "사용자가 자신의 토론 문서를 편집할 수 있도록 허용합니다 ([[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]에 따라 다름)", "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.", "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.", "apihelp-block-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.", "apihelp-block-example-ip-simple": "IP 192.0.2.5에 대해 First strike라는 이유로 3일 간 차단하기", "apihelp-block-example-user-complex": "사용자 Vandal을 Vandalism이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기", - "apihelp-changeauthenticationdata-description": "현재 사용자의 인증 데이터를 변경합니다.", + "apihelp-changeauthenticationdata-summary": "현재 사용자의 인증 데이터를 변경합니다.", "apihelp-changeauthenticationdata-example-password": "현재 사용자의 비밀번호를 ExamplePassword로 바꾸는 것을 시도합니다.", - "apihelp-checktoken-description": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]의 토큰의 유효성을 확인합니다.", + "apihelp-checktoken-summary": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]의 토큰의 유효성을 확인합니다.", "apihelp-checktoken-param-type": "테스트되는 토큰의 종류.", "apihelp-checktoken-param-token": "테스트할 토큰", "apihelp-checktoken-param-maxtokenage": "초로 계산된 토큰의 최대 나이.", "apihelp-checktoken-example-simple": "csrf 토큰의 유효성을 테스트합니다.", - "apihelp-clearhasmsg-description": "현재 사용자의 hasmsg 플래그를 비웁니다.", + "apihelp-clearhasmsg-summary": "현재 사용자의 hasmsg 플래그를 비웁니다.", "apihelp-clearhasmsg-example-1": "현재 계정의 hasmsg 플래그를 삭제합니다.", - "apihelp-clientlogin-description": "상호작용 플로우를 이용하여 위키에 로그인합니다.", + "apihelp-clientlogin-summary": "상호작용 플로우를 이용하여 위키에 로그인합니다.", "apihelp-clientlogin-example-login": "사용자 Example, 비밀번호 ExamplePassword로 위키 로그인 과정을 시작합니다.", "apihelp-clientlogin-example-login2": "987654의 OATHToken을 지정하여 2요소 인증을 위한 UI 응답 이후에 로그인을 계속합니다.", - "apihelp-compare-description": "두 문서 간의 차이를 가져옵니다.\n\n대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.", + "apihelp-compare-summary": "두 문서 간의 차이를 가져옵니다.", + "apihelp-compare-extended-description": "대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.", "apihelp-compare-param-fromtitle": "비교할 첫 이름.", "apihelp-compare-param-fromid": "비교할 첫 문서 ID.", "apihelp-compare-param-fromrev": "비교할 첫 판.", "apihelp-compare-param-totitle": "비교할 두 번째 제목.", "apihelp-compare-param-toid": "비교할 두 번째 문서 ID.", "apihelp-compare-param-torev": "비교할 두 번째 판.", + "apihelp-compare-param-prop": "가져올 정보입니다.", "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.", - "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.", + "apihelp-createaccount-summary": "새 사용자 계정을 만듭니다.", "apihelp-createaccount-example-create": "비밀번호 ExamplePassword로 된 사용자 Example의 생성 과정을 시작합니다.", "apihelp-createaccount-param-name": "사용자 이름", "apihelp-createaccount-param-password": "비밀번호입니다. ($1mailpassword가 설정되어 있으면 무시됩니다)", @@ -84,17 +87,20 @@ "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)", "apihelp-createaccount-example-pass": "사용자 testuser를 만들고 비밀번호를 test123으로 설정합니다.", "apihelp-createaccount-example-mail": "사용자 testmailuser를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.", - "apihelp-cspreport-description": "브라우저가 콘텐츠 보안 정책의 위반을 보고하기 위해 사용합니다. 이 모듈은 SCP를 준수하는 웹 브라우저에 의해 자동으로 사용될 때를 제외하고는 사용해서는 안 됩니다.", + "apihelp-cspreport-summary": "브라우저가 콘텐츠 보안 정책의 위반을 보고하기 위해 사용합니다. 이 모듈은 SCP를 준수하는 웹 브라우저에 의해 자동으로 사용될 때를 제외하고는 사용해서는 안 됩니다.", "apihelp-cspreport-param-reportonly": "강제적 정책이 아닌, 모니터링 정책에서 나온 보고서인 것으로 표시합니다", - "apihelp-delete-description": "문서 삭제", + "apihelp-delete-summary": "문서 삭제", "apihelp-delete-param-title": "삭제할 문서의 제목. $1pageid과 함께 사용할 수 없습니다.", "apihelp-delete-param-pageid": "삭제할 문서의 ID. $1title과 함께 사용할 수 없습니다.", "apihelp-delete-param-reason": "삭제의 이유. 설정하지 않으면 자동 생성되는 이유를 사용합니다.", "apihelp-delete-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.", + "apihelp-delete-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-delete-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.", "apihelp-delete-example-simple": "Main Page를 삭제합니다.", - "apihelp-disabled-description": "이 모듈은 해제되었습니다.", - "apihelp-edit-description": "문서를 만들고 편집합니다.", + "apihelp-delete-example-reason": "Preparing for move 라는 이유로 Main Page를 삭제하기.", + "apihelp-disabled-summary": "이 모듈은 해제되었습니다.", + "apihelp-edit-summary": "문서를 만들고 편집합니다.", + "apihelp-edit-param-title": "편집할 문서의 제목. $1pageid과 같이 사용할 수 없습니다.", "apihelp-edit-param-section": "문단 번호입니다. 0은 최상위 문단, new는 새 문단입니다.", "apihelp-edit-param-sectiontitle": "새 문단을 위한 제목.", "apihelp-edit-param-text": "문서 내용.", @@ -107,17 +113,18 @@ "apihelp-edit-param-nocreate": "페이지가 존재하지 않으면 오류를 출력합니다.", "apihelp-edit-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.", "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.", + "apihelp-edit-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-edit-param-redirect": "자동으로 넘겨주기 처리하기.", "apihelp-edit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.", "apihelp-edit-example-edit": "문서 편집", "apihelp-edit-example-undo": "자동 편집요약으로 13579판에서 13585판까지 되돌리기.", - "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.", + "apihelp-emailuser-summary": "사용자에게 이메일을 보냅니다.", "apihelp-emailuser-param-target": "이메일을 받을 사용자.", "apihelp-emailuser-param-subject": "제목 헤더.", "apihelp-emailuser-param-text": "메일 본문.", "apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.", "apihelp-emailuser-example-email": "WikiSysop 사용자에게 텍스트 Content로 이메일을 보냅니다.", - "apihelp-expandtemplates-description": "위키텍스트 안에 모든 틀을 확장합니다.", + "apihelp-expandtemplates-summary": "위키텍스트 안에 모든 틀을 확장합니다.", "apihelp-expandtemplates-param-title": "문서 제목", "apihelp-expandtemplates-param-text": "변환할 위키텍스트.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "확장된 위키텍스트.", @@ -125,16 +132,18 @@ "apihelp-expandtemplates-param-includecomments": "출력에 HTML 주석을 포함할 것인지의 여부.", "apihelp-expandtemplates-param-generatexml": "XML 구문 분석 트리를 생성합니다. ($1prop=parsetree로 대체함)", "apihelp-expandtemplates-example-simple": "위키텍스트 {{Project:Sandbox}}를 확장합니다.", - "apihelp-feedcontributions-description": "사용자 기여 피드를 반환합니다.", + "apihelp-feedcontributions-summary": "사용자 기여 피드를 반환합니다.", "apihelp-feedcontributions-param-feedformat": "피드 포맷.", "apihelp-feedcontributions-param-user": "기여를 읽을 사용자 이름.", "apihelp-feedcontributions-param-namespace": "기여를 분류할 이름공간", + "apihelp-feedcontributions-param-year": "년부터 (혹은 그 이전).", + "apihelp-feedcontributions-param-month": "달부터 (혹은 그 이전).", "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.", "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.", "apihelp-feedcontributions-param-newonly": "새 글인 편집만 봅니다.", "apihelp-feedcontributions-param-hideminor": "사소한 편집을 숨깁니다.", "apihelp-feedcontributions-param-showsizediff": "판 사이의 크기 차이를 보여줍니다.", - "apihelp-feedrecentchanges-description": "최근 바뀜 피드를 반환합니다.", + "apihelp-feedrecentchanges-summary": "최근 바뀜 피드를 반환합니다.", "apihelp-feedrecentchanges-param-feedformat": "피드 포맷.", "apihelp-feedrecentchanges-param-namespace": "결과를 제한할 이름공간.", "apihelp-feedrecentchanges-param-invert": "선택한 항목을 제외한 모든 이름공간.", @@ -150,14 +159,14 @@ "apihelp-feedrecentchanges-param-tagfilter": "태그로 분류", "apihelp-feedrecentchanges-example-simple": "최근 바뀜을 봅니다.", "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.", - "apihelp-feedwatchlist-description": "주시문서 목록 피드를 반환합니다.", + "apihelp-feedwatchlist-summary": "주시문서 목록 피드를 반환합니다.", "apihelp-feedwatchlist-param-feedformat": "피드 포맷.", "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.", - "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.", + "apihelp-filerevert-summary": "파일을 이전 판으로 되돌립니다.", "apihelp-filerevert-param-filename": "파일: 접두어가 없는 대상 파일 이름.", "apihelp-filerevert-param-comment": "업로드 댓글입니다.", "apihelp-filerevert-example-revert": "Wiki.png를 2011-03-05T15:27:40Z 판으로 되돌립니다.", - "apihelp-help-description": "지정된 모듈의 도움말을 표시합니다.", + "apihelp-help-summary": "지정된 모듈의 도움말을 표시합니다.", "apihelp-help-param-modules": "(action, format 변수의 값 또는 main)에 대한 도움말을 표시하는 모듈입니다. +로 하위 모듈을 지정할 수 있습니다.", "apihelp-help-param-submodules": "명명된 모듈의 하위 모듈의 도움말을 포함합니다.", "apihelp-help-param-recursivesubmodules": "하위 모듈의 도움말을 반복하여 포함합니다.", @@ -168,38 +177,45 @@ "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.", "apihelp-help-example-help": "도움말 모듈 자체에 대한 도움말입니다.", "apihelp-help-example-query": "2개의 쿼리 하위 모듈의 도움말입니다.", - "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.", + "apihelp-imagerotate-summary": "하나 이상의 그림을 회전합니다.", "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.", + "apihelp-import-summary": "다른 위키나 XML 파일로부터 문서를 가져옵니다.", "apihelp-import-param-xml": "업로드한 XML 파일.", + "apihelp-linkaccount-summary": "서드파티 제공자의 계정을 현재 사용자와 연결합니다.", + "apihelp-login-summary": "로그인한 다음 인증 쿠키를 가져옵니다.", "apihelp-login-param-name": "사용자 이름.", "apihelp-login-param-password": "비밀번호.", "apihelp-login-param-domain": "도메인 (선택).", "apihelp-login-param-token": "처음 요청에서 로그인 토큰을 취득했습니다.", "apihelp-login-example-gettoken": "로그인 토큰을 검색합니다.", "apihelp-login-example-login": "로그인.", - "apihelp-logout-description": "로그아웃하고 세션 데이터를 지웁니다.", + "apihelp-logout-summary": "로그아웃하고 세션 데이터를 지웁니다.", "apihelp-logout-example-logout": "현재 사용자를 로그아웃합니다.", - "apihelp-mergehistory-description": "문서 역사를 합칩니다.", + "apihelp-mergehistory-summary": "문서 역사를 합칩니다.", "apihelp-mergehistory-param-reason": "문서 병합 이유.", - "apihelp-move-description": "문서 이동하기.", + "apihelp-move-summary": "문서 이동하기.", "apihelp-move-param-reason": "제목을 변경하는 이유", "apihelp-move-param-movetalk": "토론 문서가 존재한다면, 토론 문서도 이름을 변경해주세요.", "apihelp-move-param-movesubpages": "하위 문서가 있다면, 하위 문서도 이름을 변경해주세요.", "apihelp-move-param-noredirect": "넘겨주기 문서 만들지 않기", "apihelp-move-param-watch": "현재 사용자의 주시 문서에 이 문서와 넘겨주기 문서를 추가하기", "apihelp-move-param-unwatch": "현재 사용자의 주시 문서에 이 문서와 넘겨주기 문서를 제거하기", + "apihelp-move-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-move-param-ignorewarnings": "모든 경고 무시하기", "apihelp-move-example-move": "기존 제목에서 대상 제목으로 넘겨주기를 만들지 않고 이동하기.", - "apihelp-opensearch-description": "OpenSearch 프로토콜을 이용하여 위키 검색하기", + "apihelp-opensearch-summary": "OpenSearch 프로토콜을 이용하여 위키를 검색합니다.", "apihelp-opensearch-param-search": "문자열 검색", "apihelp-opensearch-param-limit": "반환할 결과의 최대 수", "apihelp-opensearch-param-namespace": "검색할 이름공간.", + "apihelp-opensearch-param-suggest": "[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]이 거짓인 경우 아무 것도 하지 않습니다.", "apihelp-opensearch-param-format": "출력 포맷.", "apihelp-opensearch-example-te": "Te로 시작하는 문서를 찾기.", + "apihelp-options-summary": "현재 사용자의 환경 설정을 변경합니다.", "apihelp-options-param-reset": "사이트 기본으로 설정 초기화", "apihelp-options-example-reset": "모든 설정 초기화", - "apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.", + "apihelp-paraminfo-summary": "API 모듈의 정보를 가져옵니다.", "apihelp-paraminfo-param-helpformat": "도움말 문자열 포맷.", + "apihelp-parse-summary": "내용의 구문을 분석하고 파서 출력을 반환합니다.", "apihelp-parse-param-summary": "구문 분석할 요약입니다.", "apihelp-parse-paramvalue-prop-text": "위키텍스트의 구문 분석된 텍스트를 제공합니다.", "apihelp-parse-paramvalue-prop-langlinks": "구문 분석된 위키텍스트의 언어 링크를 제공합니다.", @@ -212,7 +228,7 @@ "apihelp-parse-paramvalue-prop-sections": "구문 분석된 위키텍스트의 문단을 제공합니다.", "apihelp-parse-paramvalue-prop-revid": "구문 분석된 페이지의 판 ID를 추가합니다.", "apihelp-parse-paramvalue-prop-displaytitle": "구문 분석된 위키텍스트의 제목을 추가합니다.", - "apihelp-parse-paramvalue-prop-headitems": "사용되지 않습니다. 문서의 <head> 안에 넣을 항목을 제공합니다.", + "apihelp-parse-paramvalue-prop-headitems": "문서의 <head> 안에 넣을 항목을 제공합니다.", "apihelp-parse-paramvalue-prop-headhtml": "문서의 구문 분석된 <head>를 제공합니다.", "apihelp-parse-paramvalue-prop-modules": "문서에 사용되는 ResourceLoader 모듈을 제공합니다. 불러오려면, mw.loader.using()을 사용하세요. jsconfigvars 또는 encodedjsconfigvars는 modules와 함께 요청해야 합니다.", "apihelp-parse-paramvalue-prop-jsconfigvars": "문서에 특화된 자바스크립트 구성 변수를 제공합니다. 적용하려면 mw.config.set()을 사용하세요.", @@ -226,18 +242,23 @@ "apihelp-parse-param-preview": "미리 보기 모드에서 구문 분석을 합니다.", "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 구문 분석을 합니다. (미리 보기 모드도 활성화함)", "apihelp-parse-param-disabletoc": "출력에서 목차를 제외합니다.", + "apihelp-parse-param-useskin": "선택한 스킨을 파서 출력에 적용합니다. 다음의 속성에 영향을 줄 수 있습니다: langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-example-page": "페이지의 구문을 분석합니다.", "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.", "apihelp-parse-example-summary": "요약을 구문 분석합니다.", + "apihelp-patrol-summary": "문서나 판을 점검하기.", "apihelp-patrol-param-rcid": "점검할 최근 바뀜 ID입니다.", "apihelp-patrol-param-revid": "점검할 판 ID입니다.", "apihelp-patrol-example-rcid": "최근의 변경사항을 점검합니다.", "apihelp-patrol-example-revid": "판을 점검합니다.", - "apihelp-protect-description": "문서의 보호 수준을 변경합니다.", + "apihelp-protect-summary": "문서의 보호 수준을 변경합니다.", "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.", + "apihelp-protect-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-protect-example-protect": "문서 보호", - "apihelp-purge-description": "주어진 제목을 위한 캐시를 새로 고침.", + "apihelp-purge-summary": "주어진 제목을 위한 캐시를 새로 고침.", "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.", + "apihelp-purge-example-simple": "Main Page와 API 문서를 새로 고침.", + "apihelp-query-summary": "미디어위키의 데이터 및 정보를 가져옵니다.", "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.", "apihelp-query-param-list": "가져올 목록입니다.", "apihelp-query-param-meta": "가져올 메타데이터입니다.", @@ -246,50 +267,60 @@ "apihelp-query-param-exportnowrap": "XML 결과물로 래핑하지 않고 엑스포트 XML을 반환합니다. $1export와만 같이 사용할 수 있습니다.", "apihelp-query-param-iwurl": "제목이 인터위키 링크인 경우 전체 URL을 가져올지의 여부입니다.", "apihelp-query-param-rawcontinue": "계속하기 위해 순수 query-continue 데이터를 반환합니다.", - "apihelp-query+allcategories-description": "모든 분류를 열거합니다.", + "apihelp-query+allcategories-summary": "모든 분류를 열거합니다.", "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.", "apihelp-query+allcategories-param-dir": "정렬 방향.", "apihelp-query+allcategories-param-limit": "반환할 분류의 갯수입니다.", "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:", "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.", + "apihelp-query+alldeletedrevisions-summary": "사용자에 의해서나 이름공간 안에서 삭제된 모든 판을 나열합니다.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "$3user와 함께 사용할 수 없습니다.", + "apihelp-query+alldeletedrevisions-param-from": "이 제목부터 목록을 보이기.", + "apihelp-query+alldeletedrevisions-param-to": "이 제목까지 목록을 보이기.", "apihelp-query+alldeletedrevisions-param-prefix": "이 값으로 시작하는 모든 문서 제목을 검색합니다.", "apihelp-query+alldeletedrevisions-param-tag": "이 태그로 태그된 판만을 나열합니다.", "apihelp-query+alldeletedrevisions-param-user": "이 사용자에 대한 판만 나열합니다.", "apihelp-query+alldeletedrevisions-param-excludeuser": "이 사용자에 대한 판을 나열하지 않습니다.", "apihelp-query+alldeletedrevisions-param-namespace": "이 이름공간의 문서만 나열합니다.", "apihelp-query+alldeletedrevisions-example-user": "Example님의 최근 50개의 삭제된 기여를 나열합니다.", + "apihelp-query+allfileusages-summary": "존재하지 않는 것을 포함하여 파일을 사용하는 모든 문서를 나열합니다.", "apihelp-query+allfileusages-paramvalue-prop-title": "파일의 제목을 추가합니다.", "apihelp-query+allfileusages-param-limit": "반환할 총 항목 수입니다.", "apihelp-query+allfileusages-example-unique": "고유한 파일 제목을 나열합니다.", "apihelp-query+allfileusages-example-unique-generator": "모든 파일 제목을 가져오되, 존재하지 않는 항목을 표시합니다.", "apihelp-query+allfileusages-example-generator": "파일을 포함하는 문서를 가져옵니다.", - "apihelp-query+allimages-description": "모든 그림을 순차적으로 열거합니다.", + "apihelp-query+allimages-summary": "모든 그림을 순차적으로 열거합니다.", "apihelp-query+allimages-example-recent": "최근 업로드된 파일을 보여줍니다. [[Special:NewFiles]]와 유사합니다.", + "apihelp-query+alllinks-summary": "제시된 이름공간을 가리키는 모든 링크를 열거합니다.", "apihelp-query+alllinks-paramvalue-prop-title": "링크의 제목을 추가합니다.", "apihelp-query+alllinks-param-namespace": "열거할 이름공간.", "apihelp-query+alllinks-param-limit": "반환할 총 항목 수입니다.", - "apihelp-query+allmessages-description": "이 사이트에서 반환할 메시지.", + "apihelp-query+allmessages-summary": "이 사이트에서 반환할 메시지.", "apihelp-query+allmessages-example-ipb": "ipb-로 시작하는 메시지를 보입니다.", + "apihelp-query+allpages-summary": "제시된 이름공간의 모든 문서를 순서대로 열거합니다.", "apihelp-query+allpages-param-namespace": "열거할 이름공간.", + "apihelp-query+allredirects-summary": "이름공간의 모든 넘겨주기를 나열합니다.", "apihelp-query+allredirects-paramvalue-prop-title": "넘겨주기의 제목을 추가합니다.", "apihelp-query+allredirects-param-namespace": "열거할 이름공간.", "apihelp-query+allredirects-param-limit": "반환할 총 항목 수입니다.", - "apihelp-query+allrevisions-description": "모든 판 표시.", + "apihelp-query+allrevisions-summary": "모든 판 표시.", "apihelp-query+mystashedfiles-param-limit": "가져올 파일의 갯수.", "apihelp-query+alltransclusions-param-prop": "포함할 정보:", "apihelp-query+alltransclusions-param-namespace": "열거할 이름공간.", "apihelp-query+alltransclusions-param-limit": "반환할 총 항목 수입니다.", - "apihelp-query+allusers-description": "등록된 모든 사용자를 열거합니다.", + "apihelp-query+allusers-summary": "등록된 모든 사용자를 열거합니다.", "apihelp-query+allusers-param-dir": "정렬 방향.", "apihelp-query+allusers-param-prop": "포함할 정보:", "apihelp-query+allusers-paramvalue-prop-blockinfo": "현재 차단된 사용자의 정보를 추가함.", "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.", "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.", "apihelp-query+allusers-example-Y": "Y로 시작하는 사용자를 나열합니다.", - "apihelp-query+authmanagerinfo-description": "현재의 인증 상태에 대한 정보를 검색합니다.", + "apihelp-query+authmanagerinfo-summary": "현재의 인증 상태에 대한 정보를 검색합니다.", + "apihelp-query+backlinks-summary": "제시된 문서에 연결된 모든 문서를 찾습니다.", "apihelp-query+backlinks-param-namespace": "열거할 이름공간.", - "apihelp-query+blocks-description": "차단된 모든 사용자와 IP 주소를 나열합니다.", + "apihelp-query+backlinks-example-simple": "Main Page를 가리키는 링크를 보이기.", + "apihelp-query+backlinks-example-generator": "Main Page를 가리키는 문서의 정보를 보기.", + "apihelp-query+blocks-summary": "차단된 모든 사용자와 IP 주소를 나열합니다.", "apihelp-query+blocks-param-start": "나열을 시작할 타임스탬프", "apihelp-query+blocks-param-end": "나열을 끝낼 타임스탬프", "apihelp-query+blocks-param-ids": "나열할 차단 ID 목록 (선택 사항).", @@ -304,29 +335,38 @@ "apihelp-query+blocks-paramvalue-prop-expiry": "차단 만료 시점의 타임스탬프를 추가합니다.", "apihelp-query+blocks-paramvalue-prop-reason": "차단 이유를 추가합니다.", "apihelp-query+blocks-paramvalue-prop-range": "차단에 영향을 받는 IP 주소 대역을 추가합니다.", + "apihelp-query+categories-summary": "문서가 속하는 모든 분류를 나열합니다.", "apihelp-query+categories-param-limit": "반환할 분류의 갯수입니다.", + "apihelp-query+categoryinfo-summary": "제시된 분류의 정보를 반환합니다.", + "apihelp-query+categorymembers-summary": "제시된 분류의 모든 문서를 나열합니다.", "apihelp-query+categorymembers-paramvalue-prop-ids": "페이지 ID를 추가합니다.", "apihelp-query+categorymembers-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", "apihelp-query+categorymembers-paramvalue-prop-timestamp": "문서가 포함된 시기의 타임스탬프를 추가합니다.", "apihelp-query+categorymembers-param-limit": "반환할 문서의 최대 수입니다.", "apihelp-query+categorymembers-param-startsortkey": "$1starthexsortkey를 대신 사용해 주십시오.", "apihelp-query+categorymembers-param-endsortkey": "$1endhexsortkey를 대신 사용해 주십시오.", + "apihelp-query+contributors-summary": "문서에 대해 로그인한 기여자의 목록과 익명 기여자의 수를 가져옵니다.", + "apihelp-query+deletedrevisions-summary": "삭제된 판 정보를 가져옵니다.", + "apihelp-query+deletedrevs-summary": "삭제된 판을 나열합니다.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|모드|모드}}: $2", "apihelp-query+deletedrevs-param-start": "나열을 시작할 타임스탬프", "apihelp-query+deletedrevs-param-end": "나열을 끝낼 타임스탬프", "apihelp-query+deletedrevs-param-limit": "나열할 판의 최대 양.", - "apihelp-query+disabled-description": "이 쿼리 모듈은 비활성화되었습니다.", - "apihelp-query+duplicatefiles-description": "해시 값 기반으로 주어진 파일들 중 중복된 모든 파일을 나열합니다.", + "apihelp-query+disabled-summary": "이 쿼리 모듈은 비활성화되었습니다.", + "apihelp-query+duplicatefiles-summary": "해시 값 기반으로 주어진 파일들 중 중복된 모든 파일을 나열합니다.", "apihelp-query+duplicatefiles-param-limit": "반환할 중복 파일의 수.", + "apihelp-query+embeddedin-summary": "제시된 문서를 끼워넣은 모든 문서를 찾습니다.", "apihelp-query+embeddedin-param-namespace": "열거할 이름공간.", + "apihelp-query+extlinks-summary": "제시된 문서의 모든 외부 URL(인터위키 아님)을 반환합니다.", "apihelp-query+extlinks-param-limit": "반환할 링크의 수.", + "apihelp-query+exturlusage-summary": "제시된 URL을 포함하는 문서를 열거합니다.", "apihelp-query+exturlusage-param-prop": "포함할 정보:", "apihelp-query+exturlusage-paramvalue-prop-ids": "문서의 ID를 추가합니다.", "apihelp-query+exturlusage-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", "apihelp-query+exturlusage-paramvalue-prop-url": "문서에 사용된 URL을 추가합니다.", "apihelp-query+exturlusage-param-namespace": "열거할 문서 이름공간.", "apihelp-query+exturlusage-param-limit": "반환할 문서 수.", - "apihelp-query+filearchive-description": "삭제된 모든 파일을 순서대로 열거합니다.", + "apihelp-query+filearchive-summary": "삭제된 모든 파일을 순서대로 열거합니다.", "apihelp-query+filearchive-paramvalue-prop-sha1": "그림에 대한 SHA-1 해시를 추가합니다.", "apihelp-query+filearchive-paramvalue-prop-user": "그림 판을 올린 사용자를 추가합니다.", "apihelp-query+filearchive-paramvalue-prop-description": "그림 판의 설명을 추가합니다.", @@ -334,8 +374,9 @@ "apihelp-query+filearchive-paramvalue-prop-mediatype": "그림의 미디어 유형을 추가합니다.", "apihelp-query+filearchive-paramvalue-prop-metadata": "그림의 버전에 대한 Exif 메타데이터를 나열합니다.", "apihelp-query+filearchive-example-simple": "삭제된 모든 파일의 목록을 표시합니다.", - "apihelp-query+filerepoinfo-description": "위키에 구성된 그림 저장소에 대한 메타 정보를 반환합니다.", + "apihelp-query+filerepoinfo-summary": "위키에 구성된 그림 저장소에 대한 메타 정보를 반환합니다.", "apihelp-query+filerepoinfo-example-simple": "파일 저장소의 정보를 가져옵니다.", + "apihelp-query+fileusage-summary": "제시된 파일을 사용하는 모든 문서를 찾습니다.", "apihelp-query+fileusage-param-prop": "얻고자 하는 속성:", "apihelp-query+fileusage-paramvalue-prop-pageid": "각 문서의 페이지 ID.", "apihelp-query+fileusage-paramvalue-prop-title": "각 문서의 제목.", @@ -343,69 +384,94 @@ "apihelp-query+fileusage-param-namespace": "이 이름공간의 문서만 포함합니다.", "apihelp-query+fileusage-param-limit": "반환할 항목 수.", "apihelp-query+fileusage-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", + "apihelp-query+imageinfo-summary": "파일 정보와 업로드 역사를 반환합니다.", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "업로드된 판에 대한 타임스탬프를 추가합니다.", "apihelp-query+imageinfo-paramvalue-prop-sha1": "파일에 대한 SHA-1 해시를 추가합니다.", "apihelp-query+imageinfo-paramvalue-prop-mediatype": "파일의 미디어 유형을 추가합니다.", "apihelp-query+imageinfo-param-urlheight": "$1urlwidth와 유사합니다.", "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]]의 현재 판에 대한 정보를 가져옵니다.", "apihelp-query+imageinfo-example-dated": "2008년 및 그 이후의 [[:File:Test.jpg]]의 판에 대한 정보를 가져옵니다.", + "apihelp-query+images-summary": "제시된 문서에 포함된 모든 파일을 반환합니다.", "apihelp-query+images-param-limit": "반환할 파일 수.", "apihelp-query+images-example-simple": "[[Main Page|대문]]에 사용된 파일 목록을 가져옵니다.", "apihelp-query+images-example-generator": "[[Main Page|대문]]에 사용된 모든 파일에 관한 정보를 가져옵니다.", + "apihelp-query+imageusage-summary": "제시된 그림 제목을 사용하는 모든 문서를 찾습니다.", "apihelp-query+imageusage-param-namespace": "열거할 이름공간.", "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]]를 이용하여 페이지의 정보를 가져옵니다.", - "apihelp-query+info-description": "기본 페이지 정보를 가져옵니다.", + "apihelp-query+info-summary": "기본 페이지 정보를 가져옵니다.", "apihelp-query+info-param-prop": "얻고자 하는 추가 속성:", "apihelp-query+info-paramvalue-prop-protection": "각 문서의 보호 수준을 나열합니다.", "apihelp-query+info-paramvalue-prop-readable": "사용자가 이 문서를 읽을 수 있는지의 여부.", + "apihelp-query+iwbacklinks-summary": "제시된 인터위키 링크에 연결된 모든 문서를 찾습니다.", "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.", "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. $1blprefix와 함께 사용해야 합니다.", "apihelp-query+iwbacklinks-param-limit": "반활한 총 문서 수.", "apihelp-query+iwbacklinks-param-prop": "얻고자 하는 속성:", "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "인터위키의 접두사를 추가합니다.", "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "인터위키의 제목을 추가합니다.", + "apihelp-query+iwlinks-summary": "제시된 문서의 모든 인터위키 링크를 반환합니다.", "apihelp-query+iwlinks-paramvalue-prop-url": "전체 URL을 추가합니다.", + "apihelp-query+langbacklinks-summary": "제시된 언어 링크에 연결된 모든 문서를 찾습니다.", "apihelp-query+langbacklinks-param-lang": "언어 링크의 언어.", "apihelp-query+langbacklinks-paramvalue-prop-lllang": "언어 링크의 언어 코드를 추가합니다.", "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "언어 링크의 제목을 추가합니다.", + "apihelp-query+langlinks-summary": "제시된 문서의 모든 언어 간 링크를 반환합니다.", "apihelp-query+langlinks-paramvalue-prop-url": "전체 URL을 추가합니다.", "apihelp-query+langlinks-param-lang": "이 언어 코드의 언어 링크만 반환합니다.", + "apihelp-query+links-summary": "제시된 문서의 모든 링크를 반환합니다.", + "apihelp-query+linkshere-summary": "제시된 문서에 연결된 모든 문서를 찾습니다.", "apihelp-query+linkshere-paramvalue-prop-pageid": "각 문서의 페이지 ID.", "apihelp-query+linkshere-paramvalue-prop-title": "각 문서의 제목.", "apihelp-query+linkshere-param-namespace": "이 이름공간의 문서만 포함합니다.", "apihelp-query+linkshere-param-limit": "반환할 항목 수.", "apihelp-query+linkshere-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", + "apihelp-query+logevents-summary": "기록에서 이벤트를 가져옵니다.", "apihelp-query+logevents-paramvalue-prop-ids": "로그 이벤트의 ID를 추가합니다.", "apihelp-query+logevents-paramvalue-prop-type": "로그 이벤트의 유형을 추가합니다.", + "apihelp-query+pagepropnames-summary": "위키에서 사용 중인 모든 문서 속성 이름을 나열합니다.", "apihelp-query+pagepropnames-param-limit": "반환할 이름의 최대 수.", + "apihelp-query+pageprops-summary": "문서 내용에 정의된 다양한 문서 속성을 가져옵니다.", + "apihelp-query+pageswithprop-summary": "제시된 문서 속성을 사용하는 모든 문서를 나열합니다.", "apihelp-query+pageswithprop-param-prop": "포함할 정보:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "페이지 ID를 추가합니다.", "apihelp-query+pageswithprop-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.", "apihelp-query+pageswithprop-param-dir": "정렬 순서", + "apihelp-query+prefixsearch-summary": "문서 제목에 대해 두문자 검색을 수행합니다.", "apihelp-query+prefixsearch-param-search": "문자열 검색", "apihelp-query+prefixsearch-param-namespace": "검색할 이름공간.", "apihelp-query+prefixsearch-param-limit": "반환할 결과의 최대 수", "apihelp-query+prefixsearch-param-profile": "검색 프로파일 사용", + "apihelp-query+protectedtitles-summary": "작성이 보호된 모든 제목을 나열합니다.", "apihelp-query+protectedtitles-paramvalue-prop-level": "보호 수준을 추가합니다.", + "apihelp-query+querypage-summary": "QueryPage 기반 특수 문서가 제공하는 목록을 가져옵니다.", "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages|특수:오래된문서]]에서 결과를 반환합니다.", + "apihelp-query+random-summary": "임의 문서 집합을 가져옵니다.", + "apihelp-query+recentchanges-summary": "최근 바뀜을 열거합니다.", "apihelp-query+recentchanges-param-prop": "추가 정보를 포함합니다:", "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.", "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.", "apihelp-query+recentchanges-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.", + "apihelp-query+redirects-summary": "제시된 문서의 모든 넘겨주기를 반환합니다.", + "apihelp-query+revisions-summary": "판 정보를 가져옵니다.", + "apihelp-query+revisions-param-startid": "이 판의 타임스탬프에서 열거를 시작합니다. 이 판은 존재해야 하지만 이 문서에 속할 필요는 없습니다.", + "apihelp-query+revisions-param-endid": "이 판의 타임스탬프에서 열거를 중단합니다. 이 판은 존재해야 하지만 이 문서에 속할 필요는 없습니다.", "apihelp-query+revisions+base-paramvalue-prop-size": "판의 길이. (바이트)", "apihelp-query+revisions+base-paramvalue-prop-sha1": "판의 SHA-1 (base 16).", "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "판의 콘텐츠 모델 ID.", "apihelp-query+revisions+base-paramvalue-prop-content": "판의 텍스트.", "apihelp-query+revisions+base-paramvalue-prop-tags": "판의 태그.", - "apihelp-query+search-description": "전문 검색을 수행합니다.", + "apihelp-query+revisions+base-param-parse": "[[Special:ApiHelp/parse|action=parse]]를 대신 사용합니다. 판 내용의 구문을 분석합니다. ($1prop=content 필요) 성능 상의 이유로 이 옵션을 사용할 경우 $1limit은 1로 강제됩니다.", + "apihelp-query+search-summary": "전문 검색을 수행합니다.", "apihelp-query+search-param-qiprofile": "쿼리 독립적인 프로파일 사용(순위 알고리즘에 영향있음)", "apihelp-query+search-paramvalue-prop-size": "바이트 단위로 문서의 크기를 추가합니다.", "apihelp-query+search-paramvalue-prop-wordcount": "문서의 낱말 수를 추가합니다.", "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.", + "apihelp-query+search-paramvalue-prop-score": "무시됨.", + "apihelp-query+search-paramvalue-prop-hasrelated": "무시됨.", "apihelp-query+search-example-simple": "meaning을 검색합니다.", "apihelp-query+search-example-text": "meaning의 텍스트를 검색합니다.", - "apihelp-query+siteinfo-description": "사이트의 전반적인 정보를 반환합니다.", + "apihelp-query+siteinfo-summary": "사이트의 전반적인 정보를 반환합니다.", "apihelp-query+siteinfo-param-prop": "가져올 정보:", "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보입니다.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "등록된 이름공간 및 기본 이름의 목록입니다.", @@ -441,16 +507,19 @@ "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.", "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.", "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.", + "apihelp-query+templates-summary": "제시된 문서에 끼워넣은 모든 문서를 반환합니다.", + "apihelp-query+templates-param-namespace": "이 이름공간에 속한 틀만 표시합니다.", "apihelp-query+templates-param-limit": "반환할 틀 수.", "apihelp-query+tokens-param-type": "요청할 토큰의 종류.", "apihelp-query+tokens-example-simple": "csrf 토큰을 가져옵니다. (기본값)", + "apihelp-query+transcludedin-summary": "제시된 문서를 끼워넣은 모든 문서를 찾습니다.", "apihelp-query+transcludedin-paramvalue-prop-pageid": "각 문서의 페이지 ID.", "apihelp-query+transcludedin-paramvalue-prop-title": "각 문서의 제목.", "apihelp-query+transcludedin-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.", "apihelp-query+transcludedin-param-namespace": "이 이름공간의 문서만 포함합니다.", "apihelp-query+transcludedin-param-limit": "반환할 항목 수.", "apihelp-query+transcludedin-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", - "apihelp-query+usercontribs-description": "한 사용자의 모든 편집을 가져옵니다.", + "apihelp-query+usercontribs-summary": "한 사용자의 모든 편집을 가져옵니다.", "apihelp-query+usercontribs-param-limit": "반환할 기여의 최대 수.", "apihelp-query+usercontribs-paramvalue-prop-ids": "페이지 ID와 판 ID를 추가합니다.", "apihelp-query+usercontribs-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", @@ -463,7 +532,7 @@ "apihelp-query+usercontribs-param-toponly": "최신 판인 변경 사항만 나열합니다.", "apihelp-query+usercontribs-example-user": "사용자 Example의 기여를 표시합니다.", "apihelp-query+usercontribs-example-ipprefix": "192.0.2.로 시작하는 모든 IP 주소의 기여를 표시합니다.", - "apihelp-query+userinfo-description": "현재 사용자의 정보를 가져옵니다.", + "apihelp-query+userinfo-summary": "현재 사용자의 정보를 가져옵니다.", "apihelp-query+userinfo-param-prop": "포함할 정보:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "현재 사용자가 차단되면 누구에 의해 무슨 이유로 차단되었는지 태그합니다.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "현재 사용자가 대기 중인 메시지가 있다면 messages 태그를 추가합니다.", @@ -472,69 +541,150 @@ "apihelp-query+userinfo-paramvalue-prop-rights": "현재 사용자가 가진 모든 권한을 나열합니다.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "현재 사용자가 추가 및 제거할 수 있는 그룹을 나열합니다.", "apihelp-query+userinfo-paramvalue-prop-options": "현재 사용자가 설정한 모든 설정을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "현재의 사용자 환경 설정을 변경하기 위한 토큰을 가져옵니다.", "apihelp-query+userinfo-paramvalue-prop-editcount": "현재 사용자의 편집 수를 추가합니다.", "apihelp-query+userinfo-paramvalue-prop-realname": "사용자의 실명을 추가합니다.", "apihelp-query+userinfo-paramvalue-prop-email": "사용자의 이메일 주소와 이메일 인증 날짜를 추가합니다.", "apihelp-query+userinfo-paramvalue-prop-registrationdate": "사용자의 등록 날짜를 추가합니다.", "apihelp-query+userinfo-example-simple": "현재 사용자의 정보를 가져옵니다.", "apihelp-query+userinfo-example-data": "현재 사용자의 추가 정보를 가져옵니다.", - "apihelp-query+users-description": "사용자 목록에 대한 정보를 가져옵니다.", + "apihelp-query+users-summary": "사용자 목록에 대한 정보를 가져옵니다.", "apihelp-query+users-param-prop": "포함할 정보:", "apihelp-query+users-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.", "apihelp-query+users-paramvalue-prop-registration": "사용자의 등록 타임스탬프를 추가합니다.", "apihelp-query+users-param-userids": "정보를 가져올 사용자 ID의 목록입니다.", "apihelp-query+users-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]을 대신 사용하십시오.", "apihelp-query+users-example-simple": "사용자 Example의 정보를 반환합니다.", - "apihelp-query+watchlist-description": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.", + "apihelp-query+watchlist-summary": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.", "apihelp-query+watchlist-param-user": "이 사용자의 변경 사항만 나열합니다.", "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경사항을 나열하지 않습니다.", "apihelp-query+watchlist-paramvalue-prop-ids": "판 ID와 페이지 ID를 추가합니다.", "apihelp-query+watchlist-paramvalue-prop-title": "문서의 제목을 추가합니다.", "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.", "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.", - "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.", - "apihelp-resetpassword-description": "비밀번호 재설정 이메일을 사용자에게 보냅니다.", + "apihelp-query+watchlistraw-summary": "현재 사용자의 주시문서 목록의 모든 문서를 가져옵니다.", + "apihelp-removeauthenticationdata-summary": "현재 사용자의 인증 데이터를 제거합니다.", + "apihelp-resetpassword-summary": "비밀번호 재설정 이메일을 사용자에게 보냅니다.", "apihelp-resetpassword-param-user": "재설정할 사용자입니다.", "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.", "apihelp-resetpassword-example-user": "사용자 Example에게 비밀번호 재설정 이메일을 보냅니다.", "apihelp-resetpassword-example-email": "user@example.com 이메일 주소를 가진 모든 사용자에 대해 비밀번호 재설정 이메일을 보냅니다.", - "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.", + "apihelp-revisiondelete-summary": "판을 삭제하거나 되살립니다.", "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.", + "apihelp-rollback-summary": "문서의 마지막 편집을 취소합니다.", "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.", + "apihelp-rollback-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-rollback-example-simple": "Project:대문 문서의 예시의 마지막 판을 되돌리기", - "apihelp-setpagelanguage-description": "문서의 언어를 변경합니다.", - "apihelp-setpagelanguage-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]을 활성화하십시오.", + "apihelp-rsd-summary": "RSD (Really Simple Discovery) 스키마를 내보냅니다.", + "apihelp-setnotificationtimestamp-summary": "주시 중인 문서의 알림 타임스탬프를 업데이트합니다.", + "apihelp-setpagelanguage-summary": "문서의 언어를 변경합니다.", + "apihelp-setpagelanguage-extended-description-disabled": "이 위키에서 문서의 언어 변경은 허용되지 않습니다.\n\n이 동작을 사용하려면 [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]을 활성화하십시오.", + "apihelp-setpagelanguage-param-title": "언어를 변경하려는 문서의 제목입니다. $1pageid와 함께 사용할 수 없습니다.", + "apihelp-setpagelanguage-param-pageid": "언어를 변경하려는 문서의 ID입니다. $1title과 함께 사용할 수 없습니다.", + "apihelp-setpagelanguage-param-lang": "문서를 변경할 언어의 언어 코드입니다. 문서를 위키의 기본 콘텐츠 언어로 재설정하려면 default를 사용하십시오.", "apihelp-setpagelanguage-param-reason": "변경 이유.", "apihelp-setpagelanguage-example-language": "Main Page의 언어를 바스크어로 변경합니다.", + "apihelp-stashedit-summary": "공유된 캐시에서 편집을 준비합니다.", "apihelp-stashedit-param-sectiontitle": "새 문단을 위한 제목.", "apihelp-stashedit-param-text": "문서 내용.", "apihelp-stashedit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.", "apihelp-tag-param-reason": "변경 이유.", + "apihelp-tokens-summary": "데이터 수정 작업을 위해 토큰을 가져옵니다.", + "apihelp-tokens-extended-description": "이 모듈은 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]의 선호에 따라 사용이 권장되지 않습니다.", "apihelp-tokens-param-type": "요청할 토큰의 종류.", - "apihelp-unblock-description": "사용자를 차단 해제합니다.", + "apihelp-tokens-example-edit": "편집 토큰을 검색합니다. (기본값)", + "apihelp-tokens-example-emailmove": "편집 토큰과 이동 토큰을 검색합니다.", + "apihelp-unblock-summary": "사용자를 차단 해제합니다.", + "apihelp-unblock-param-id": "차단을 해제할 차단 ID입니다. (list=blocks를 통해 가져옴) $1user 또는 $1userid와 함께 사용할 수 없습니다.", "apihelp-unblock-param-user": "차단을 해제할 사용자 이름, IP 주소, IP 주소 대역입니다. $1id 또는 $1userid와(과) 함께 사용할 수 없습니다.", "apihelp-unblock-param-userid": "차단을 해제할 사용자 ID입니다. $1id 또는 $1user와(과) 함께 사용할 수 없습니다.", "apihelp-unblock-param-reason": "차단 해제 이유.", "apihelp-unblock-param-tags": "차단 기록의 항목에 적용할 태그를 변경합니다.", + "apihelp-unblock-example-id": "차단 ID #105의 차단을 해제합니다.", + "apihelp-unblock-example-user": "Sorry Bob이 이유인 Bob 사용자의 차단을 해제합니다.", + "apihelp-undelete-summary": "삭제된 문서의 판을 복구합니다.", + "apihelp-undelete-extended-description": "삭제된 판의 목록(타임스탬프 포함)은 [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]을 통해 검색할 수 있으며 삭제된 파일 ID의 목록은 [[Special:ApiHelp/query+filearchive|list=filearchive]]을 통해 검색할 수 있습니다.", + "apihelp-undelete-param-title": "복구할 문서의 제목입니다.", + "apihelp-undelete-param-reason": "복구할 이유입니다.", + "apihelp-undelete-param-tags": "삭제 기록의 항목에 적용할 태그를 변경합니다.", + "apihelp-undelete-param-timestamps": "복구할 판의 타임스탬프입니다. $1timestamps와 $1fileids가 둘 다 비어있으면 모든 판이 복구됩니다.", + "apihelp-undelete-param-fileids": "복구할 파일 판의 ID입니다. $1timestamps와 $1fileids가 둘 다 비어있으면 모든 판이 복구됩니다.", + "apihelp-undelete-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", + "apihelp-undelete-example-page": "대문 문서를 복구합니다.", + "apihelp-undelete-example-revisions": "대문 문서의 두 판을 복구합니다.", + "apihelp-unlinkaccount-summary": "현재 사용자에 연결된 타사 계정을 제거합니다.", + "apihelp-unlinkaccount-example-simple": "FooAuthenticationRequest와 연결된 제공자에 대한 현재 사용자의 토론 링크 제거를 시도합니다.", + "apihelp-upload-summary": "파일을 업로드하거나 대기 중인 업로드의 상태를 가져옵니다.", "apihelp-upload-param-filename": "대상 파일 이름.", + "apihelp-upload-param-comment": "업로드 주석입니다. 또, $1text가 지정되지 않은 경우 새로운 파일들의 초기 페이지 텍스트로 사용됩니다.", + "apihelp-upload-param-tags": "업로드 기록 항목과 파일 문서 판에 적용할 태그를 변경합니다.", + "apihelp-upload-param-text": "새로운 파일들에 대한 초기 문서 텍스트.", + "apihelp-upload-param-watch": "문서를 주시합니다.", + "apihelp-upload-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.", "apihelp-upload-param-ignorewarnings": "모든 경고를 무시합니다.", + "apihelp-upload-param-file": "파일의 내용입니다.", + "apihelp-upload-param-url": "파일을 가져올 URL입니다.", + "apihelp-upload-param-filekey": "임시로 보관한 이전의 업로드를 식별하는 키입니다.", + "apihelp-upload-param-sessionkey": "$1filekey와 동일하며, 하위 호환성을 위해 유지됩니다.", + "apihelp-upload-param-stash": "설정하면 서버는 저장소에 파일을 추가하는 대신 임시로 파일을 보관합니다.", + "apihelp-upload-param-filesize": "전체 업로드의 파일 크기입니다.", + "apihelp-upload-param-offset": "바이트 단위의 청크 오프셋.", + "apihelp-upload-param-chunk": "청크의 내용입니다.", + "apihelp-upload-param-async": "가능하면 잠재적으로 큰 파일 작업을 비동기로 처리합니다.", + "apihelp-upload-param-checkstatus": "제공된 파일 키의 업로드 상태만 가져옵니다.", + "apihelp-upload-example-url": "URL에서 업로드합니다.", + "apihelp-upload-example-filekey": "경고로 인해 실패한 업로드를 마칩니다.", + "apihelp-userrights-summary": "사용자의 그룹 권한을 변경합니다.", "apihelp-userrights-param-user": "사용자 이름.", "apihelp-userrights-param-userid": "사용자 ID.", + "apihelp-userrights-param-add": "이 그룹에 사용자를 추가하지만, 이미 회원이라면 해당 그룹의 회원 만료 날짜를 업데이트합니다.", + "apihelp-userrights-param-expiry": "만료 타임스탬프입니다. 상대값(예: 5 months 또는 2 weeks)이거나 절대값(예: 2014-09-18T12:34:56Z)이다. 타임스탬프만 설정할 경우, $1add 변수에 전달되는 모든 그룹에 사용됩니다. 만료되지 않는 사용자 그룹으로 지정하려면 infinite, indefinite, infinity, 또는 never를 사용하십시오.", + "apihelp-userrights-param-remove": "이 그룹에서 사용자를 제거합니다.", + "apihelp-userrights-param-reason": "변경 이유입니다.", + "apihelp-userrights-param-tags": "사용자 권한 기록의 항목에 적용할 태그를 변경합니다.", + "apihelp-userrights-example-user": "FooBot 사용자를 bot 그룹에 추가하며 sysop과 bureaucrat 그룹에서 제거합니다.", + "apihelp-userrights-example-userid": "ID가 123인 사용자를 bot 그룹에 추가하며, sysop과 bureaucrat 그룹에서 제거합니다.", + "apihelp-userrights-example-expiry": "사용자 SometimeSysop을 sysop 그룹에 1개월 간 추가합니다.", + "apihelp-validatepassword-summary": "위키의 비밀번호 정책에 근간하여 비밀번호를 확인합니다.", + "apihelp-validatepassword-extended-description": "비밀번호를 수용할 수 있으면 Good으로, 로그인 시 비밀번호를 사용할 수 있지만 변경이 필요한 경우 Change로, 비밀번호를 사용할 수 없으면 Invalid로 보고됩니다.", + "apihelp-validatepassword-param-password": "확인할 비밀번호.", + "apihelp-validatepassword-param-user": "계정 생성을 테스트할 때 사용할 사용자 이름입니다. 명명된 사용자는 존재하지 않습니다.", "apihelp-validatepassword-param-email": "계정 생성을 테스트할 때 사용할 이메일 주소입니다.", "apihelp-validatepassword-param-realname": "계정 생성을 테스트할 때 사용할 실명입니다.", - "apihelp-json-description": "데이터를 JSON 형식으로 출력합니다.", + "apihelp-validatepassword-example-1": "현재 사용자에 대해 비밀번호 foobar를 확인합니다.", + "apihelp-validatepassword-example-2": "사용자 Example를 만들기 위해 비밀번호 qwerty를 확인합니다.", + "apihelp-watch-summary": "현재 사용자의 주시목록에서 문서를 추가하거나 제거합니다.", + "apihelp-watch-param-title": "주시하거나 주시를 해제할 문서입니다. $1titles를 대신 사용하세요.", + "apihelp-watch-param-unwatch": "설정하면 문서의 주시는 해제됩니다.", + "apihelp-watch-example-watch": "대문 문서를 주시합니다.", + "apihelp-watch-example-unwatch": "대문 문서의 주시를 해제합니다.", + "apihelp-watch-example-generator": "일반 이름공간의 일부 첫 문서들을 주시합니다.", + "apihelp-json-summary": "데이터를 JSON 형식으로 출력합니다.", "apihelp-json-param-formatversion": "출력 형식:\n;1:하위 호환 포맷 (XML 스타일 불린, 콘텐츠 노드를 위한 * 키 등).\n;2:실험적인 모던 포맷. 상세 내용은 바뀔 수 있습니다!\n;latest:최신 포맷(현재 2)을 이용하지만 경고 없이 바뀔 수 있습니다.", - "apihelp-jsonfm-description": "데이터를 JSON 포맷으로 출력합니다. (HTML의 가독성 증가)", - "apihelp-rawfm-description": "디버깅 요소를 포함하여 데이터를 JSON 형식으로 출력합니다. (HTML의 가독성 증가)", + "apihelp-jsonfm-summary": "데이터를 JSON 포맷으로 출력합니다. (HTML의 가독성 증가)", + "apihelp-none-summary": "아무 것도 출력하지 않습니다.", + "apihelp-php-summary": "데이터를 직렬화된 PHP 포맷으로 출력합니다.", + "apihelp-phpfm-summary": "데이터를 PHP 포맷(HTML의 가독성 증가)으로 출력합니다.", + "apihelp-rawfm-summary": "디버깅 요소를 포함하여 데이터를 JSON 형식으로 출력합니다. (HTML의 가독성 증가)", + "apihelp-xml-summary": "데이터를 XML 형식으로 출력합니다.", "apihelp-xml-param-includexmlnamespace": "지정하면 XML 이름공간을 추가합니다.", + "apihelp-xmlfm-summary": "데이터를 XML 포맷(가독성 높은 HTML 방식)으로 출력합니다.", "api-format-title": "미디어위키 API 결과", + "api-login-fail-aborted": "인증은 사용자의 상호작용이 필요하지만, action=login에 의해 지원되지 않습니다. action=login으로 로그인할 수 있게 하려면 [[Special:BotPasswords]]를 참조하십시오. 주 계정 로그인의 사용을 계속하려면 [[Special:ApiHelp/clientlogin|action=clientlogin]]을 참조하십시오.", + "api-login-fail-aborted-nobotpw": "인증은 사용자의 상호작용이 필요하지만, action=login에 의해 지원되지 않습니다. 로그인하려면 [[Special:ApiHelp/clientlogin|action=clientlogin]]을 참조하십시오.", + "api-login-fail-badsessionprovider": "$1을(를) 사용할 경우 로그인할 수 없습니다.", + "api-login-fail-sameorigin": "기원이 동일한 정책이 적용되지 않으면 로그인할 수 없습니다.", "api-pageset-param-titles": "작업할 제목의 목록입니다.", "api-pageset-param-pageids": "작업할 페이지 ID의 목록입니다.", "api-pageset-param-revids": "작업할 판 ID의 목록입니다.", "api-pageset-param-generator": "특정 쿼리 모듈을 실행함으로써 작업할 페이지의 목록입니다.\n\n참고: 발생기 변수명은 \"g\"로 시작해야 합니다. 예시를 참고하십시오.", + "api-pageset-param-redirects-generator": "$1titles, $1pageids, $1revids 및 $1generator가 반환한 문서들의 넘겨주기를 자동으로 결정합니다.", + "api-pageset-param-redirects-nogenerator": "$1titles, $1pageids, $1revids의 넘겨주기를 자동으로 결정합니다.", + "api-pageset-param-converttitles": "필요하면 제목을 다른 형태로 변환합니다. 위키의 내용 언어가 형태 변환을 지원하는 경우에만 동작합니다. 형태 변환을 지원하는 언어는 $1을(를) 포함합니다.", "api-help-title": "미디어위키 API 도움말", "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API", "api-help-main-header": "메인 모듈", + "api-help-undocumented-module": "$1 모듈에 대한 설명문이 없습니다.", "api-help-flag-deprecated": "이 모듈은 사용되지 않습니다.", "api-help-flag-internal": "이 모듈은 내부용이거나 불안정합니다. 동작은 예고 없이 변경될 수 있습니다.", "api-help-flag-readrights": "이 모듈은 read 권한을 요구합니다.", @@ -554,6 +704,7 @@ "api-help-param-type-limit": "유형: 정수 또는 max", "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}", "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])", + "api-help-param-type-timestamp": "유형: {{PLURAL:$1|1=타임스탬프|2=타임스탬프 목록}} ([[Special:ApiHelp/main#main/datatypes|허용되는 포맷]])", "api-help-param-type-user": "유형: {{PLURAL:$1|1=사용자 이름|2=사용자 이름 목록}}", "api-help-param-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 ({{!}}로 구분)}}: $2 또는 [[Special:ApiHelp/main#main/datatypes|alternative]]: $2", "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}", @@ -562,6 +713,7 @@ "api-help-param-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.", "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.", "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.", + "api-help-param-upload": "여러 부분/폼 데이터를 사용한 파일 업로드로 게시되어야 합니다.", "api-help-param-multi-separate": "| 또는 [[Special:ApiHelp/main#main/datatypes|대안]]으로 값을 구분합니다.", "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})", "api-help-param-default": "기본값: $1", @@ -584,6 +736,9 @@ "api-help-authmanagerhelper-continue": "이 요청은 초기 UI 또는 REDIRECT 응답 이후에 계속됩니다. 이것 또는 $1returnurl 중 하나가 필요합니다.", "api-help-authmanagerhelper-additional-params": "이 모듈은 사용 가능한 인증 요청에 따라 추가 변수를 허용합니다. 사용 가능한 요청 및 사용되는 필드를 결정하려면 amirequestsfor=$1(또는 해당되는 경우 이 모듈의 과거 응답)과 함께 [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]을(를) 사용하십시오.", "apierror-articleexists": "작성하려는 문서가 이미 만들어져 있습니다.", + "apierror-assertbotfailed": "사용자의 bot 권한 보유 표명이 실패했습니다.", + "apierror-assertnameduserfailed": "사용자의 \"$1\" 지정 표명이 실패했습니다.", + "apierror-assertuserfailed": "사용자의 로그인 표명이 실패했습니다.", "apierror-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.", "apierror-badgenerator-unknown": "알 수 없는 generator=$1.", "apierror-badip": "IP 변수가 유효하지 않습니다.", @@ -613,6 +768,7 @@ "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.", "apierror-invalidoldimage": "oldimage 변수에 유효하지 않은 형식이 있습니다.", "apierror-invalidparammix-cannotusewith": "$1 변수는 $2와(과) 함께 사용할 수 없습니다.", + "apierror-invalidsection": "section 변수는 유효한 섹션 ID 또는 new이어야 합니다.", "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.", "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.", "apierror-invalidtitle": "잘못된 제목 \"$1\".", @@ -620,6 +776,7 @@ "apierror-invaliduserid": "$1 사용자 ID는 유효하지 않습니다.", "apierror-maxlag-generic": "데이터베이스 서버 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.", "apierror-maxlag": "$2 대기 중: $1 {{PLURAL:$1|초}} 지연되었습니다.", + "apierror-missingcontent-revid": "ID $1 판에 해당하는 내용이 없습니다.", "apierror-missingparam": "$1 변수는 설정해야 합니다.", "apierror-missingtitle": "지정한 페이지가 존재하지 않습니다.", "apierror-missingtitle-byname": "$1 문서가 존재하지 않습니다.", @@ -644,10 +801,12 @@ "apierror-ratelimited": "속도 제한을 초과했습니다. 잠시 기다렸다가 다시 시도하십시오.", "apierror-readapidenied": "이 모듈을 사용하려면 읽기 권한이 필요합니다.", "apierror-readonly": "위키는 현재 읽기 전용 모드입니다.", + "apierror-revisions-badid": "$1 변수에 대한 판을 발견하지 못했습니다.", "apierror-revwrongpage": "r$1은(는) $2의 판이 아닙니다.", "apierror-specialpage-cantexecute": "특수 문서의 결과를 볼 권한이 없습니다.", "apierror-stashwrongowner": "잘못된 소유자: $1", "apierror-systemblocked": "당신은 미디어위키에 의해서 자동으로 차단되었습니다.", + "apierror-timeout": "서버가 예측된 시간 내에 응답하지 않았습니다.", "apierror-unknownerror-editpage": "알 수 없는 EditPage 오류: $1.", "apierror-unknownerror-nocode": "알 수 없는 오류.", "apierror-unknownerror": "알 수 없는 오류: \"$1\"", diff --git a/includes/api/i18n/ksh.json b/includes/api/i18n/ksh.json index 7db9665dd9..1ed917a784 100644 --- a/includes/api/i18n/ksh.json +++ b/includes/api/i18n/ksh.json @@ -1,10 +1,11 @@ { "@metadata": { "authors": [ - "Purodha" + "Purodha", + "Macofe" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page/de|Dokemäntazjohn]]\n* [[mw:API:FAQ/de|Öff jefrohch]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mäileng_Leß]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Aanköndejonge zom API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Jemäldte Fähler un Wönsch]\n
    \nStatus: Alle op heh dä Sigg aanjzeischte Ußwahle sullte donn, ävver et API weed jrahd noch äntwekeld un et kann sesch alle Nahslangs jädd ändere. Holl Der de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ Mäileng_Leß med Aanköndejonge], öm automattesch övver Neujeschkeite enfommehrt ze wähde.\n\nKapodde Aanfrohre: Wam_mer kapodde Aanfroheaan et API API schek, kritt mer ene HTTP-Kopp ußjejovve met däm Täx „MediaWiki-API-Error“ dren, dä mer als ene Schlößel bedraachte kann. Mih dohzoh fengk met op dä Sigg [[mw:API:Errors_and_warnings|API: Fähler un Warnonge]].", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page/de|Dokemäntazjohn]]\n* [[mw:API:FAQ/de|Öff jefrohch]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mäileng_Leß]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Aanköndejonge zom API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Jemäldte Fähler un Wönsch]\n
    \nStatus: Alle op heh dä Sigg aanjzeischte Ußwahle sullte donn, ävver et API weed jrahd noch äntwekeld un et kann sesch alle Nahslangs jädd ändere. Holl Der de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ Mäileng_Leß med Aanköndejonge], öm automattesch övver Neujeschkeite enfommehrt ze wähde.\n\nKapodde Aanfrohre: Wam_mer kapodde Aanfroheaan et API API schek, kritt mer ene HTTP-Kopp ußjejovve met däm Täx „MediaWiki-API-Error“ dren, dä mer als ene Schlößel bedraachte kann. Mih dohzoh fengk met op dä Sigg [[mw:API:Errors_and_warnings|API: Fähler un Warnonge]].", "apihelp-main-param-action": "Wat för en Aufjahb.", "apihelp-main-param-format": "Et Fommaht för ußzejävve.", "apihelp-main-param-maxlag": "Der hühste zohjelohße Verzoch kann jenumme wähde, wann MehdijaWikki obb enem Knubbel Rääschner medd ene replezehrte (dadd es, lebänndesch koppehrte) Dahtebangk enschtallehrt weed. Öm kein Opdräschd aan de Dahtebangk ze scheke, di dat noch schlemmer maache dähte, kam_mer övver heh dä Parramehter et Projramm affwahde lohße, bes dat dä Verzoch vum Replezehre onger däm aanjejovve Wäät lit. Wann dä Verzoch övvermähßesch jruhs es, kritt mer dä Fähler maxlag jemälldt med ene Nohreesch esu wi Mer wahde op dä ẞööver $Maschihn un di es $Verzoch Sekonde hengerher.
    Op dä [[mw:Manual:Maxlag_parameter|Hanndbohchsigg zom \nMaxlag-Parramehter]] kam_mer noch mih zerdoh lässe.", @@ -15,7 +16,7 @@ "apihelp-main-param-servedby": "Donn däm ẞööver, dä et jedonn hät, singe Nahme med ußjävve.", "apihelp-main-param-curtimestamp": "Donn de aktoälle Zigg un et Dattum med ußjävve.", "apihelp-main-param-uselang": "De Schprohch för et Övversäzze vun Täxte un Nohreeschte. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] holle, met siprop=languages jidd en Leß met de Köözelle för Schprohche uß, udder jiff user aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm content öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.", - "apihelp-block-description": "Ene Metmaacher schpärre.", + "apihelp-block-summary": "Ene Metmaacher schpärre.", "apihelp-block-param-user": "Däm Nahme vun däm Metmaacher, de IP-Addräß udder dä Berätt, dä De Schpärre wells.", "apihelp-block-param-expiry": "De Zigg bes zom Ußloufe. Kam_mer als en Door aanjävve, esu wi „5 months“ udder „2 weeks“ un kam_mer als ene Zigg_Pongk aanjävve, esu wi „2014-09-18T12:34:56Z“, un wam_mer „infinite“, „indefinite“ udder „never“ aanjitt, dohrt di Schpärr för iiwesch.", "apihelp-block-param-reason": "Der Schpärrjrond.", @@ -29,14 +30,15 @@ "apihelp-block-param-watchuser": "Donn de Metmaachersigg un de Klaafsigg dohzoh op mig Oppaßleß säze.", "apihelp-block-example-ip-simple": "Donn de IP-Addräß 192.0.2.5 för drei ääsch schpärre mem Jrond: Eestschlaach.", "apihelp-block-example-user-complex": "Donn dä Metmaacher „Vandal“ för iiwesch schpärre, mem Jrond „Vandalism“, un donn_em neu Zohjäng aanzelähje un e-mail ze verscheke verbehde.", - "apihelp-checktoken-description": "Donn de Jölteschkeid vun enem Makkehrongsschlößel vun „[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]“ pröhve.", + "apihelp-checktoken-summary": "Donn de Jölteschkeid vun enem Makkehrongsschlößel vun „[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]“ pröhve.", "apihelp-checktoken-param-type": "De Zoot Makkehrongsschlößel zom Pröhfe.", "apihelp-checktoken-param-token": "Der Makkehrongsschlößel zom Pröhve.", "apihelp-checktoken-param-maxtokenage": "Et jrühßte zojelohße Allder fun däm Makkehrongsschlößel en Sekonde.", "apihelp-checktoken-example-simple": "Pröhf de Jölteschkeid vun däm Makkehrongsschlößel „csrf“.", - "apihelp-clearhasmsg-description": "Nemmp de Makkehrong „hasmsg“ fott vum aktoälle Metmaacher.", + "apihelp-clearhasmsg-summary": "Nemmp de Makkehrong „hasmsg“ fott vum aktoälle Metmaacher.", "apihelp-clearhasmsg-example-1": "Nemm de Makkehrong „hasmsg“ fott vum aktoälle Metmaacher.", - "apihelp-compare-description": "Donn de Ongerscheide zwesche zwai Sigge beschtemme.\n\nDo moß derför jeweils en Väsjohn, en Övverschreff för di Sigg, odder ener Sigg iehr Kännong aanjävve, för de beide Sigge.", + "apihelp-compare-summary": "Donn de Ongerscheide zwesche zwai Sigge beschtemme.", + "apihelp-compare-extended-description": "Do moß derför jeweils en Väsjohn, en Övverschreff för di Sigg, odder ener Sigg iehr Kännong aanjävve, för de beide Sigge.", "apihelp-compare-param-fromtitle": "De Övverschreff vun dä eezte Sigg zom verjlihsche.", "apihelp-compare-param-fromid": "De Kännong vun dä eezte Sigg zom verjlihsche.", "apihelp-compare-param-fromrev": "De Väsjohn vun dä zwaite Sigg zom verjlihsche.", @@ -44,7 +46,7 @@ "apihelp-compare-param-toid": "De Kännong vun dä zwaite Sigg zom verjlihsche.", "apihelp-compare-param-torev": "De Väsjohn vun dä zwaite Sigg zom verjlihsche.", "apihelp-compare-example-1": "Fengk de Ongerscheide zwesche dä Väsjohne 1 un 2", - "apihelp-createaccount-description": "Ene neue Zohjang för ene Metmaacher aanlähje.", + "apihelp-createaccount-summary": "Ene neue Zohjang för ene Metmaacher aanlähje.", "apihelp-createaccount-param-name": "Der Nahme för dä Metmaacher.", "apihelp-createaccount-param-password": "Et Paßwoot (Weed ävver it jebruc un övverjange, wann $1mailpassword jesaz es)", "apihelp-createaccount-param-domain": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje. Kam_mer fott_lohße.", @@ -56,7 +58,7 @@ "apihelp-createaccount-param-language": "Dat Schprohcheköözel, wadd als der Schtandatt för dä Metmaacher jesaz wähde sull. Kann läddesch blihve, dann es et di Schprohch vum Wikki.", "apihelp-createaccount-example-pass": "Lääsch dä Metmaacher testuser aan, mem Paßwood test123.", "apihelp-createaccount-example-mail": "Lääsch dä Metmaacher testmailuser aan med emem zohfällesch ußjewörfelte Paßwoot un schegg_em dat övver de e-mail.", - "apihelp-delete-description": "Schmieß en Sigg fott.", + "apihelp-delete-summary": "Schmieß en Sigg fott.", "apihelp-delete-param-title": "De Övverschreff vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „$1pageid“ bruche.", "apihelp-delete-param-pageid": "De Kännong vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „$1title“ bruche.", "apihelp-delete-param-reason": "Der Jrond för et Fottschmiiße. Wann dä nit aanjejovve es, weed ene automattesch usjräschnete Jrond jenumme.", @@ -67,8 +69,8 @@ "apihelp-delete-param-oldimage": "Der Nahme vom ahle Beld zom fottschmiiße, wi hä vun [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] kütt.", "apihelp-delete-example-simple": "Schmiiß de Sigg „Main Page“ fott.", "apihelp-delete-example-reason": "Schmiiß de „Main Page“ fott mem Jrond: Preparing for move.", - "apihelp-disabled-description": "Dat Moduhl wohd affjeschalldt.", - "apihelp-edit-description": "Sigge aanlähje un verändere.", + "apihelp-disabled-summary": "Dat Moduhl wohd affjeschalldt.", + "apihelp-edit-summary": "Sigge aanlähje un verändere.", "apihelp-edit-param-title": "De Övverschreff vun dä Sigg zom Ändere. Kam_mer nit zesamme met „$1pageid“ bruche.", "apihelp-edit-param-pageid": "De Känong vun dä Sigg zom Ändere. Kam_mer nit zesamme met „$1title“ bruche.", "apihelp-edit-param-section": "De Nommer vum Affschnedd. Nemm „0“ för wat vör der eezde Övverschreff schteihd. Ene neue Affscnedd määt mer met „new“.", @@ -98,13 +100,13 @@ "apihelp-edit-example-edit": "Veränder en Sigg.", "apihelp-edit-example-prepend": "Donn __NOTOC__ för en Sigg säze.", "apihelp-edit-example-undo": "Donn alle Väsjohne vun „13579“ bes zeläz „13585“ widder retuhr nämme u en autmatesche Zersamfaßong derför enndrahre.", - "apihelp-emailuser-description": "Donn en e-mail aan dä Metmaacher schecke.", + "apihelp-emailuser-summary": "Donn en e-mail aan dä Metmaacher schecke.", "apihelp-emailuser-param-target": "D ä Metmaacher, dä di e-mail krijje sull.", "apihelp-emailuser-param-subject": "Koppeih mem Beträff.", "apihelp-emailuser-param-text": "Dä Täx en dä e-mail.", "apihelp-emailuser-param-ccme": "scheck mer en Koppih vun heh dä e-mail.", "apihelp-emailuser-example-email": "Donn en e-mail aan dä Metmaacher „WikiSysop“ schecke mem Täx „Content“ dren.", - "apihelp-expandtemplates-description": "Deiht alle Schablohne en Wikkitäx ömsäze.", + "apihelp-expandtemplates-summary": "Deiht alle Schablohne en Wikkitäx ömsäze.", "apihelp-expandtemplates-param-title": "De Övverschreff vun dä Sigg.", "apihelp-expandtemplates-param-text": "Dä Wikkitäx zom ömwandelle.", "apihelp-expandtemplates-param-revid": "De Kännong vun dä Väsjohn, för \n„{{REVISIONID}}“ un verwandte Wääte.", @@ -119,7 +121,7 @@ "apihelp-expandtemplates-param-includecomments": "Ov Aanmärkonge em HTML-Fommaht med ußjejovve wähde sulle.", "apihelp-expandtemplates-param-generatexml": "Donn ene Boum vum XML-Paaser opboue. Es dorsch „$1prop=parsetree“ ässäz.", "apihelp-expandtemplates-example-simple": "Donn dä Wikkitäx {{Project:Sandbox}} en Täx wandelle.", - "apihelp-feedcontributions-description": "Jidd ene Kannahl met de Beijdrähsch vun enem Metmaacher uß.", + "apihelp-feedcontributions-summary": "Jidd ene Kannahl met de Beijdrähsch vun enem Metmaacher uß.", "apihelp-feedcontributions-param-feedformat": "Däm Kannahl sing Fommaht.", "apihelp-feedcontributions-param-user": "De Beijdrähsch för wat för en Metmaacher holle.", "apihelp-feedcontributions-param-namespace": "Wat för ene Appachtemang för de Beijdrähsch ußjeschloße wähde sull.", @@ -132,7 +134,7 @@ "apihelp-feedcontributions-param-hideminor": "Donn kein Minni-Ännderonge ennblände.", "apihelp-feedcontributions-param-showsizediff": "Zeijsch de Ongerscheijd en de Jrühße zwesche de Väsjohne.", "apihelp-feedcontributions-example-simple": "Zeijsch de Änderonge vum Metmaacher Example.", - "apihelp-feedrecentchanges-description": "Donn ene Kannahl för de neuste Änderonge ußjävve.", + "apihelp-feedrecentchanges-summary": "Donn ene Kannahl för de neuste Änderonge ußjävve.", "apihelp-feedrecentchanges-param-feedformat": "Däm Kannahl sing Fommaht.", "apihelp-feedrecentchanges-param-namespace": "Op wat för ene Appachtemang de Beijdrähsch beschrängk wähde sulle.", "apihelp-feedrecentchanges-param-invert": "Alle Appachtemangs ußer däm ußjesöhkte.", @@ -154,18 +156,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Donn deföhr blohß de Änderonge aan de Zohjehüreshkeit för öhndseijn fun heh dä Saachjroppe zeije.", "apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}", "apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.", - "apihelp-feedwatchlist-description": "Donn ene Kannahl met dä Oppaßleß zerökjävve.", + "apihelp-feedwatchlist-summary": "Donn ene Kannahl met dä Oppaßleß zerökjävve.", "apihelp-feedwatchlist-param-feedformat": "Däm Kannahl sing Fommaht.", "apihelp-feedwatchlist-param-hours": "Zeijsch de Sigge, di en de läzde su un esu vill Schtonde vun jäz aan veränder wohde sin.", "apihelp-feedwatchlist-param-linktosections": "Lengk tirägg od der veränderte Affschnedd, woh müjjelesch.", "apihelp-feedwatchlist-example-default": "Zeijsch ene Kannahl met dä Oppaßleß.", "apihelp-feedwatchlist-example-all6hrs": "Zeijsch alle Änderonge aan Sgge obb Oppaßleßte us de läzde 6 Schtunde.", - "apihelp-filerevert-description": "Säz en Dattei obb en ahle Väsohn zerök.", + "apihelp-filerevert-summary": "Säz en Dattei obb en ahle Väsohn zerök.", "apihelp-filerevert-param-filename": "De Zih_Dattei, der ohne „{{ne:file}}“ derför.", "apihelp-filerevert-param-comment": "Aanmärkong huh lahde.", "apihelp-filerevert-param-archivename": "Dä nahme vum Aschihv vun dä Väsjohn för wider drop zerök ze jon.", "apihelp-filerevert-example-revert": "Donn Wiki.png op di Väsohn vum 2011-03-05T15:27:40Z zerök säze.", - "apihelp-help-description": "zeisch Hölp för de aanjejovve Moduhle.", + "apihelp-help-summary": "zeisch Hölp för de aanjejovve Moduhle.", "apihelp-help-param-modules": "Moduhle, öm Hölp för de Wääte vun de „action“ un „format“ Parramehtere, udder „main“. aanzezeije. Mer kann Ongermoduhle met „+“ aanjävve.", "apihelp-help-param-submodules": "Donn Hölp för de Ongermoduhle vun dämm aanjejovve Moduhl enschschlehße.", "apihelp-help-param-recursivesubmodules": "Donn Hölp för de Ongermoduhle allesammp enschschlehße, esu deef, wi et jeiht.", @@ -177,7 +179,7 @@ "apihelp-help-example-recursive": "Alle Hölp en eine Sigg.", "apihelp-help-example-help": "Alle Hölp övver de Hölp säälver.", "apihelp-help-example-query": "Hölp för zwei Ongermoduhle för Frohre.", - "apihelp-imagerotate-description": "Ein udder mih Bellder driehje.", + "apihelp-imagerotate-summary": "Ein udder mih Bellder driehje.", "apihelp-imagerotate-param-rotation": "Öm wi vill Jrahd sulle de Bellder noh de Uhr drieh wääde?", "apihelp-imagerotate-example-simple": "Drieh de Dattei:Beijschpell.png öm 90 Jrahd.", "apihelp-imagerotate-example-generator": "Drieh alle Bellder en dä Saachjropp:Ömdriehje öm 180 Jrahd.", @@ -195,16 +197,16 @@ "apihelp-login-param-password": "Paßwoot.", "apihelp-login-param-domain": "De Domaijn (kann fott bliehve)", "apihelp-login-example-login": "Enlogge.", - "apihelp-logout-description": "Donn ußlogge un maach de Dahte övver de Sezong fott.", + "apihelp-logout-summary": "Donn ußlogge un maach de Dahte övver de Sezong fott.", "apihelp-logout-example-logout": "Donn dä aktoälle Metmaacher ußlogge.", - "apihelp-managetags-description": "Verwalldongsaufjahbe em Zersammehang met Makkehronge vun Änderonge donn.", + "apihelp-managetags-summary": "Verwalldongsaufjahbe em Zersammehang met Makkehronge vun Änderonge donn.", "apihelp-managetags-param-reason": "Ene Jrond för et Aanlähje, Fottschmiiße, Aanschallde un Ußschallde vun dä Makkehrong, dä mer ävver nit aanjävve moß.", "apihelp-managetags-param-ignorewarnings": "Ov alle Warnonge övverjange wähde sulle, di bei dämm Opdracht opkumme.", "apihelp-managetags-example-create": "Donn en Makkehrong aanlähje mem Nahme „spam“ mem Jrond „For use in edit patrolling“.", "apihelp-managetags-example-delete": "Schmiiß de Makkehrong mem Nahme „vandlaism“ fott mem Jrond „Misspelt“.", "apihelp-managetags-example-activate": "Donn en Makkehrong aktevehre mem Nahme „spam“ mem Jrond „For use in edit patrolling“.", "apihelp-managetags-example-deactivate": "Donn en Makkehrong mem Nahme „spam“ nit mieh aktihv maache, mem Jrond „For use in edit patrolling“.", - "apihelp-mergehistory-description": "Väsjohne fun Sigge zosamme lähje.", + "apihelp-mergehistory-summary": "Väsjohne fun Sigge zosamme lähje.", "apihelp-mergehistory-param-from": "De Övverschreff vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met $1fromid bruche.", "apihelp-mergehistory-param-fromid": "De Kännong vun dä Sigg, vun däh de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met $1fromid bruche.", "apihelp-mergehistory-param-to": "De Övverschreff vun dä Sigg, wohen de verjange Väsjohne zesamme jelaat wähde sulle. Kam_mer nit zesamme met $1toid bruche.", @@ -212,7 +214,7 @@ "apihelp-mergehistory-param-reason": "Der Jrond för et Zesammelähje vun dä älldere Väsjohne.", "apihelp-mergehistory-example-merge": "Donn de jannze älldere Väsjohne vun dä Sigg „Oldpage“ met dä Sigg „Newpage“ zesammelähje.", "apihelp-mergehistory-example-merge-timestamp": "Donn de älldere Väsjohne vun dä Sigg „Oldpage“ bes zom 2015-12-31T04:37:41Z met dä Sigg „Newpage“ zesammelähje.", - "apihelp-move-description": "Donn en Sigg ömbenänne", + "apihelp-move-summary": "Donn en Sigg ömbenänne", "apihelp-move-param-from": "De Övverschreff vun dä Sigg zom Ömbenänne. Kam_mer nit zesamme met „$1fromid“ bruche.", "apihelp-move-param-fromid": "De ännong vun dä Sigg zom Ömbenänne. Kam_mer nit zesamme met „$1from“ bruche.", "apihelp-move-param-to": "De neue Övverschreff för di Sigg drop ömzebenänne.", @@ -225,7 +227,7 @@ "apihelp-move-param-watchlist": "Donn di Sigg en dem aktoälle Metmaacher sing Oppaßleß udder nemm se eruß, donn de Enschtällonge nämme udder donn de Oppaßleß nid ändere.", "apihelp-move-param-ignorewarnings": "Donn alle Warnonge övverjonn", "apihelp-move-example-move": "Donn di Sigg „Badtitle“ noh „Goodtitle“ önnänne, der ohne en Ömleijdong aanzelähje.", - "apihelp-opensearch-description": "Em Wikki söhke mem OpenSearch", + "apihelp-opensearch-summary": "Em Wikki söhke mem OpenSearch", "apihelp-opensearch-param-search": "Noh wat söhke?", "apihelp-opensearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve", "apihelp-opensearch-param-namespace": "En wällschem Appachtemang söhke.", @@ -240,7 +242,7 @@ "apihelp-options-example-reset": "Alle Enschtälloonge retuhr schtälle.", "apihelp-options-example-change": "Donn de „skin“ un „hideminor“ Enschtällonge ändere.", "apihelp-options-example-complex": "Donn alle Enschtällonge op der Schtandatt säze, dann säz „skin“ un „nickname“.", - "apihelp-paraminfo-description": "Holl Aanjahbe övver dä API ier Moduhle.", + "apihelp-paraminfo-summary": "Holl Aanjahbe övver dä API ier Moduhle.", "apihelp-paraminfo-param-helpformat": "Et Fommaht vun de Täxe för Hölp.", "apihelp-paraminfo-param-formatmodules": "Leß met de Nahme vun de Moduhle zom Fommatehre (Wäät vum „format“-Parramehter). Nemm schtatt dämm „$1modules“.", "apihelp-paraminfo-example-1": "Zisch Aanjahbe övver [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], un [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", @@ -276,12 +278,12 @@ "apihelp-parse-example-text": "Donn Wikkitäx pahse.", "apihelp-parse-example-texttitle": "Donn Wikkitäx pahse, un jiff derför en Övverschreff för en Sigg aan.", "apihelp-parse-example-summary": "Donn Zersammefaßong pahse.", - "apihelp-patrol-description": "Donn en Sigg udder Väsjohn nohkike.", + "apihelp-patrol-summary": "Donn en Sigg udder Väsjohn nohkike.", "apihelp-patrol-param-rcid": "De Kännong in de läzde Änderonge zum Nohkike.", "apihelp-patrol-param-revid": "De Kännong vun dä Väsjohn zum Nohkike.", "apihelp-patrol-example-rcid": "Donn en läzde Änderonge nohkike.", "apihelp-patrol-example-revid": "Donn en Väsjohn nohkike.", - "apihelp-protect-description": "Änder der Siggeschoz för en Sigg.", + "apihelp-protect-summary": "Änder der Siggeschoz för en Sigg.", "apihelp-protect-param-title": "De Övverschreff vun dä Sigg zom Schöze udder Freijävve. Kam_mer nit zesamme met\n„$1pageid“ bruche.", "apihelp-protect-param-pageid": "De Kännong vun dä Sigg zom Schöze udder Freijävve. Kam_mer nit zesamme met\n„$1pageid“ bruche.", "apihelp-protect-param-reason": "Der Jrond för et Schöze udder Freijävve.", @@ -299,7 +301,7 @@ "apihelp-query-param-meta": "Wat för en Metta_Dahte ze holle.", "apihelp-query-param-rawcontinue": "Jivv Rühdahte „query-continue“ för et Wigger Maache us.", "apihelp-query-example-allpages": "Holl Väsjohne vun Sigge, di met „API“ bejenne.", - "apihelp-query+allcategories-description": "Alle Saachjroppe opzälle.", + "apihelp-query+allcategories-summary": "Alle Saachjroppe opzälle.", "apihelp-query+allcategories-param-from": "De Saachjropp, vun woh aan opzälle.", "apihelp-query+allcategories-param-to": "De Saachjropp, bes woh hen opzälle.", "apihelp-query+allcategories-param-prefix": "Söhk noh Saachjroppe, woh de Övverschrevv esu aanfängk.", @@ -311,7 +313,7 @@ "apihelp-query+allcategories-paramvalue-prop-size": "Deiht de Aanzahl Sigge en dä Saachjropp derbei.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Makehrt de veschtoche Sachjroppe met „__HIDDENCAT__“.", "apihelp-query+allcategories-example-generator": "Holl Ennfommazjuhne övver di Saaachjroppe_Sigg för Saachjroppe, di met „List“ bejenne.", - "apihelp-query+alldeletedrevisions-description": "Donn alle fottjeschmeße Väsjohne vun enem Metmaacher udder en enem Appachemang opleßte.", + "apihelp-query+alldeletedrevisions-summary": "Donn alle fottjeschmeße Väsjohne vun enem Metmaacher udder en enem Appachemang opleßte.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kam_mer blohß met $3user bruche.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kam_mer nit met $3user bruche.", "apihelp-query+alldeletedrevisions-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.", @@ -326,7 +328,7 @@ "apihelp-query+alldeletedrevisions-param-generatetitles": "Wann als ene Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.", "apihelp-query+alldeletedrevisions-example-user": "Donn de läzde fuffzisch fottjeschmeße Beijdrähsch vum Metmaacher „Example“ opleste.", "apihelp-query+alldeletedrevisions-example-ns-main": "Donn de läzde fuffzisch fottjeschmeße Väsjohne em Houp-Appachemang opleste.", - "apihelp-query+allfileusages-description": "Donn alle Dattei_Oprohfe opleste, och vun Datteije, di (noch) nit doh sin.", + "apihelp-query+allfileusages-summary": "Donn alle Dattei_Oprohfe opleste, och vun Datteije, di (noch) nit doh sin.", "apihelp-query+allfileusages-param-from": "De Övverschreff vun dä Dattei, woh de Leß medd aanfange sull.", "apihelp-query+allfileusages-param-to": "De Övverschreff vun dä Dattei, woh de Leß medd ophühre sull.", "apihelp-query+allfileusages-param-prefix": "Söhk noh alle Övverschreffte, di met heh däm Täx aanfange.", @@ -340,7 +342,7 @@ "apihelp-query+allfileusages-example-unique": "Donn ongerscheidlejje Övverschreffte vun Datteije opleßte.", "apihelp-query+allfileusages-example-unique-generator": "Hollt alle Övverschreffte vun Datteije, un makehr di (noch) nit doh sin.", "apihelp-query+allfileusages-example-generator": "Holl Sigge, woh Datteieje dren vorkumme.", - "apihelp-query+allimages-description": "Donn alle Bellder der Reih noh opzälle.", + "apihelp-query+allimages-summary": "Donn alle Bellder der Reih noh opzälle.", "apihelp-query+allimages-param-sort": "De Eijeschavv öm dernoh ze zottehre.", "apihelp-query+allimages-param-dir": "En wälsche Reijefollsch?", "apihelp-query+allimages-param-minsize": "Bejränz op Sigge met winneschßdens esu vill Bytes dren.", @@ -355,7 +357,7 @@ "apihelp-query+allimages-example-recent": "Zeijsch en Leß met de köözlesch huhjelahde Datteije, ähnlesch wi en [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Zeijsch en Leß met dä MIME-Zoote „image/png“ udder „image/gif“.", "apihelp-query+allimages-example-generator": "Zeisch Aanjahbe övver veer Bellder un bejenn mem Bohchschtabe T.", - "apihelp-query+alllinks-description": "Donn alle Lengk opzälle, di en e beschtemmpt Appachtemang jonn.", + "apihelp-query+alllinks-summary": "Donn alle Lengk opzälle, di en e beschtemmpt Appachtemang jonn.", "apihelp-query+alllinks-param-from": "De Övverschreff vun däm Lengk, woh de Leß medd aanfange sull.", "apihelp-query+alllinks-param-to": "De Övverschreff vun dä Dattei, woh et Zälle ophühre sull.", "apihelp-query+alllinks-param-prefix": "Söhk noh alle verlengk Övverschreffte, di met heh däm Täx aanfange.", @@ -370,7 +372,7 @@ "apihelp-query+alllinks-example-unique": "Leß ongerscheidlejje verlengk Övverschreffte.", "apihelp-query+alllinks-example-unique-generator": "Hollt alle Övverschreffte, woh Lengks drop jonnn un makehr di (noch) nit doh sin.", "apihelp-query+alllinks-example-generator": "Holl Sigge, di Lengks änthallde.", - "apihelp-query+allmessages-description": "Donn em Wikki sing Täxte un Nohreescht ußjävve.", + "apihelp-query+allmessages-summary": "Donn em Wikki sing Täxte un Nohreescht ußjävve.", "apihelp-query+allmessages-param-messages": "Wat för en Täxte un Nohreeschte usjävve. Der Schtandatt „*“ bedügg alle Täxte un Nohreeschte.", "apihelp-query+allmessages-param-prop": "Wat för en Eijeschaffte holle.", "apihelp-query+allmessages-param-nocontent": "Wann dat ennjeschalld es, donn dä ennhalt vun de Täxte un Nohreeschte nit medd ußjävve.", @@ -383,7 +385,7 @@ "apihelp-query+allmessages-param-prefix": "Jiv de Täxte un Nohreesche met heh däm Aanfang uß.", "apihelp-query+allmessages-example-ipb": "Zeijsch Täxde udder Nohreeschte di met „ipb“ aanfange.", "apihelp-query+allmessages-example-de": "Zeijsch de Täxde udder Nohreeschte „august“ un „mainpage“ en Deutsch aan.", - "apihelp-query+allpages-description": "Donn alle Sigge der Reih noh en enem jejovve Appachtemang aan.", + "apihelp-query+allpages-summary": "Donn alle Sigge der Reih noh en enem jejovve Appachtemang aan.", "apihelp-query+allpages-param-from": "De Övverschreff vun dä Sigg, woh de Leß medd aanfange sull.", "apihelp-query+allpages-param-to": "De Kännong vun dä Sigg, bes woh hen opzälle.", "apihelp-query+allpages-param-prefix": "Söhk noh alle Övverschreffte vun Sigge, di met heh dämm Wäät bejenne.", @@ -398,7 +400,7 @@ "apihelp-query+allpages-example-B": "Zeisch en Leß met Sigge un bejenn mem Bohchschtabe B.", "apihelp-query+allpages-example-generator": "Zeisch Aanjahbe övver veer Bellder un bejenn mem Bohchschtabe T.", "apihelp-query+allpages-example-generator-revisions": "Zeisch der Enhalld vu de eetsde zwai Sigg un bejenn bei Re.", - "apihelp-query+allredirects-description": "Alle Ömleidonge op e beschtemmp Appachtemang opleßte.", + "apihelp-query+allredirects-summary": "Alle Ömleidonge op e beschtemmp Appachtemang opleßte.", "apihelp-query+allredirects-param-from": "De Övverschreff vun dä Ömleidong, woh de Leß medd ophühre sull.", "apihelp-query+allredirects-param-to": "De Övverschreff vun dä Sigg, woh et Zälle ophühre sull.", "apihelp-query+allredirects-param-prefix": "Söhk not Sigge, di esu aanfange.", @@ -413,7 +415,7 @@ "apihelp-query+allredirects-example-unique": "Ongerscheidlijje Sigge opleste.", "apihelp-query+allredirects-example-unique-generator": "Hollt alle Zihlsigge un makkehr di (noch) nit doh sin.", "apihelp-query+allredirects-example-generator": "Holl de Sigge met de Ömleidonge.", - "apihelp-query+allrevisions-description": "Donn alle Väsjohne opleßte.", + "apihelp-query+allrevisions-summary": "Donn alle Väsjohne opleßte.", "apihelp-query+allrevisions-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.", "apihelp-query+allrevisions-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.", "apihelp-query+allrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.", @@ -422,7 +424,7 @@ "apihelp-query+allrevisions-param-generatetitles": "Wann als ene Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.", "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „Example“ opleßte.", "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.", - "apihelp-query+mystashedfiles-description": "Holl en Leß vun dem aktoälle Metmaacher singe upload stash.", + "apihelp-query+mystashedfiles-summary": "Holl en Leß vun dem aktoälle Metmaacher singe upload stash.", "apihelp-query+mystashedfiles-param-prop": "Wat för en Aanjahbe holle för di Datteije.", "apihelp-query+mystashedfiles-param-limit": "Wi vill Datteije holle?", "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.", @@ -439,7 +441,7 @@ "apihelp-query+alltransclusions-example-unique": "Donn de Övverschreffte vun ennjeföhschte Sigge opleßte, ävver jehde blohß eijmohl.", "apihelp-query+alltransclusions-example-unique-generator": "Hollt alle Övverschreffte vun ennjeföhschte Sigge, un makehr di (noch) nit doh sin.", "apihelp-query+alltransclusions-example-generator": "Holl Sigge, di Ennföhjonge änthallde.", - "apihelp-query+allusers-description": "Donn alle aanjemälldte Metmaacher opzälle.", + "apihelp-query+allusers-summary": "Donn alle aanjemälldte Metmaacher opzälle.", "apihelp-query+allusers-param-from": "Dä Metmaacher_Nahme vun woh aan opzälle.", "apihelp-query+allusers-param-to": "Dä Metmaacher_Nahme bes woh hen opzälle.", "apihelp-query+allusers-param-prefix": "Söhk noh alle Metmaacher_Nahme, di mit heh däm Wäät bejenne.", @@ -455,7 +457,7 @@ "apihelp-query+allusers-param-witheditsonly": "Blohß Metmahcher, di och ens jät verändert han.", "apihelp-query+allusers-param-activeusers": "Donn blohß Metmaacher opleßte, di {{PLURAL:$1|der läzde Daach|en de läzde $1 Dääsch|keine läzde Daach}} aktihf wohre.", "apihelp-query+allusers-example-Y": "Monn metmaacher opleßte, woh de Nahme vun met Y aanfange.", - "apihelp-query+backlinks-description": "Fengk alle Sigge, di op de aanjejovve Sigg lengke.", + "apihelp-query+backlinks-summary": "Fengk alle Sigge, di op de aanjejovve Sigg lengke.", "apihelp-query+backlinks-param-title": "De Övverschreff för noh ze Söhke. Kam_mer nit zesamme met „$1pageid“ bruche.", "apihelp-query+backlinks-param-pageid": "De Känong vun dä Sigg zom Söhke. Kam_mer nit zesamme met „$1title“ bruche.", "apihelp-query+backlinks-param-namespace": "Dat Appachtemang zom opzälle.", @@ -464,7 +466,7 @@ "apihelp-query+backlinks-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.", "apihelp-query+backlinks-example-simple": "Zeijsch Lengks op de Sigg „Main page“.", "apihelp-query+backlinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „Main Page“ lengke donn.", - "apihelp-query+blocks-description": "Donn alle jeschpächte Metmaacher un IP-Adräße opleßte.", + "apihelp-query+blocks-summary": "Donn alle jeschpächte Metmaacher un IP-Adräße opleßte.", "apihelp-query+blocks-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.", "apihelp-query+blocks-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.", "apihelp-query+blocks-param-ids": "Leß vun dä Kännonge vun Schpärre för dernoh ze söhke. Kann fott blihve.", @@ -484,7 +486,7 @@ "apihelp-query+blocks-paramvalue-prop-flags": "makkehrt di Spärr met „autoblock“, „anononly“, un esu.", "apihelp-query+blocks-example-simple": "Schpärre opleßte.", "apihelp-query+blocks-example-users": "Donn de Schpärre vun dä Metmaacher Alice
    un Bob opleßte.", - "apihelp-query+categories-description": "Donn alle Saachjroppe epleßte, woh di Sigge dren sin.", + "apihelp-query+categories-summary": "Donn alle Saachjroppe epleßte, woh di Sigge dren sin.", "apihelp-query+categories-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle för jehde Saachjropp:", "apihelp-query+categories-paramvalue-prop-sortkey": "Deiht dä Schlößel zom Zottehre vun dä Saachjropp derbei, en lange häxadezimahle Zahl, un der Schlößelvörsaz, woh ene Minsch jät med aanfange kann.", "apihelp-query+categories-paramvalue-prop-timestamp": "Deihd en Dattom un en Zigg derbei, wann di Sachjrobb aanjelaat woode es.", @@ -495,9 +497,9 @@ "apihelp-query+categories-param-dir": "En wälsche Reijefollsch?", "apihelp-query+categories-example-simple": "Holl en Leß med alle Saachjroppe, woh di Sigg Albert Einstein dren es.", "apihelp-query+categories-example-generator": "Holl Aanjahbe övver alle Saachjroppe, di en dä Sigg Albert Einstein jebruch wähde.", - "apihelp-query+categoryinfo-description": "Holl Aanjahbe övver de aanjejovve Saachjroppe.", + "apihelp-query+categoryinfo-summary": "Holl Aanjahbe övver de aanjejovve Saachjroppe.", "apihelp-query+categoryinfo-example-simple": "Holl Enfomazjuhne övver „Category:Foo“ un „Category:Bar“.", - "apihelp-query+categorymembers-description": "Donn alle Sigge en ener aanjejove saachjrobb opleste.", + "apihelp-query+categorymembers-summary": "Donn alle Sigge en ener aanjejove saachjrobb opleste.", "apihelp-query+categorymembers-param-title": "Wat för en Sachjropp opzälle. Moß aanjejovve sin. Moß der Vörsaz „{{ns:category}}:“ änthallde. Kam_mer nit zesamme met „$1pageid“ bruche.", "apihelp-query+categorymembers-param-pageid": "De Kännong vun dä Sigg zom opzälle. Kam_mer nit zersamme met „$1title“ bruche.", "apihelp-query+categorymembers-param-prop": "Wat för en Aanjahbe med enzschlehße:", @@ -514,7 +516,7 @@ "apihelp-query+categorymembers-param-endsortkey": "Söhk „$1endhexsortkey “ schtatt dämm.", "apihelp-query+categorymembers-example-simple": "Holl de eezde zehn Sigge de dä Category:Physics.", "apihelp-query+categorymembers-example-generator": "Holl anjahbe övver de eezde zehn Sigge de dä Category:Physics.", - "apihelp-query+contributors-description": "Holl de Leß met de ennjelogg Schrihver un de Aanzahl nahmelohse Metschrihver aan ene Sigg.", + "apihelp-query+contributors-summary": "Holl de Leß met de ennjelogg Schrihver un de Aanzahl nahmelohse Metschrihver aan ene Sigg.", "apihelp-query+contributors-param-limit": "Wi vill Metschrihver ze livvere?", "apihelp-query+contributors-example-simple": "Donn de Metschrihver aan dä Sigg „KMain PageBD“ aanzeije.", "apihelp-query+deletedrevisions-param-start": "Et Dattom un de Uhrzigg, von woh aan opzälle. Weed nit jebruch, wam_mer en Leß met Kännonge vun Väsjohne aam beärbeijde sin.", @@ -535,14 +537,14 @@ "apihelp-query+deletedrevs-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.", "apihelp-query+deletedrevs-param-limit": "De hühßde Aanzahl Väsjohne för opzeleßte.", "apihelp-query+deletedrevs-param-prop": "Wat för en Eijeschaffte holle:\n;revid:Deiht de Kännong vun dä fottjeschmeße Väsjohn derbei.\n;parentid:Deiht de Kännong vun dä vörijje Väsjohn vun dä Sigg derbei.\n;user:Deiht dä Metmaacher derbei, dä di Väsjohn jemaat hät.\n;userid:Deiht de Kännong vun däm Metmaacher derbei, dä di Väsjohn jemaat hät.\n;comment:Deiht de koote Zesammefaßong vun dä Väsjohn derbei.\n;parsedcomment:Adds dä de jepaaste koote Zesammefaßong vun dä Väsjohn derbei.\n;minor:Tags, wann di Väsjohn en kleine Minni-Änderong wohr.\n;len:Deiht de Aanzahl Bytes vun dä Väsjohn derbei.\n;sha1:Deiht dä SHA-1 (base 16) vun dä Väsjohn derbei.\n;content:Deiht dä Täx_Ennhalt vun dä Väsjohn derbei.\n;token:Nit mih jewönsch. Livvert de Makehrong vun dä Änderong.\n;tags:Makehronge vun dä Väsjohn.", - "apihelp-query+disabled-description": "Dat Moduhl för Frohre ze schtälle wohd affjeschalldt.", - "apihelp-query+duplicatefiles-description": "Donn alle Datteije opleßte, di desällve Prööfsomm han wi de aanjejovve Datteije.", + "apihelp-query+disabled-summary": "Dat Moduhl för Frohre ze schtälle wohd affjeschalldt.", + "apihelp-query+duplicatefiles-summary": "Donn alle Datteije opleßte, di desällve Prööfsomm han wi de aanjejovve Datteije.", "apihelp-query+duplicatefiles-param-limit": "Wi vell datteije ußjävve.", "apihelp-query+duplicatefiles-param-dir": "En wälsche Reihjefollsch opleßte.", "apihelp-query+duplicatefiles-param-localonly": "Lohr blohß noh Datteije heh em Wikki.", "apihelp-query+duplicatefiles-example-simple": "Lohr noh Datteije, di dubbelte vun dä Dattei „[[:File:Albert Einstein Head.jpg]]“ sin.", "apihelp-query+duplicatefiles-example-generated": "Lohr noh Dubbelte vun alle Datteije.", - "apihelp-query+embeddedin-description": "Fengk alle Sigge, di di aanjejovve Dattei enneschlehße.", + "apihelp-query+embeddedin-summary": "Fengk alle Sigge, di di aanjejovve Dattei enneschlehße.", "apihelp-query+embeddedin-param-title": "De Övverschreff för noh ze Söhke. Kam_mer nit zesamme met „$1pageid“ bruche.", "apihelp-query+embeddedin-param-pageid": "De Känong vun dä Sigg zom noh Söhke. Kam_mer nit zesamme met „$1title“ bruche.", "apihelp-query+embeddedin-param-namespace": "Dat Appachtemang zom opzälle.", @@ -551,10 +553,10 @@ "apihelp-query+embeddedin-param-limit": "Wi vill Sigge ensjesammp zem ußjävve?", "apihelp-query+embeddedin-example-simple": "Zeisch de Sigge, di di Schablohn „Template:Stub“ oprohfe.", "apihelp-query+embeddedin-example-generator": "Holl Aanjahbe övve de Sigge, di di Schablohn „Template:Stub“ oprohfe.", - "apihelp-query+extlinks-description": "Jitt alle URLs vun Lengks noh ußerhallef vum Wikki, ävver kein Engewiki_Lenks, vundä aanjejovve Sigge uß.", + "apihelp-query+extlinks-summary": "Jitt alle URLs vun Lengks noh ußerhallef vum Wikki, ävver kein Engewiki_Lenks, vundä aanjejovve Sigge uß.", "apihelp-query+extlinks-param-limit": "Wi vill Lengks ußjävve?", "apihelp-query+extlinks-example-simple": "Holl en Leß met Lengks noh ußerhallef vum Wikki uß dä Sigg „Main Page“.", - "apihelp-query+exturlusage-description": "Donn alle Sigge upzälle med däm aanjejovveURL dren.", + "apihelp-query+exturlusage-summary": "Donn alle Sigge upzälle med däm aanjejovveURL dren.", "apihelp-query+exturlusage-param-prop": "Wat för en Aanjahbe med enzschlehße:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Donn dä Sigg ier Kännong derbei.", "apihelp-query+exturlusage-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.", @@ -562,7 +564,7 @@ "apihelp-query+exturlusage-param-protocol": "Dat Schehma uß däm URL. Wann et läddesch jelohße es un „$1query“ aanjejogge es, es dat Schehma „http“. Lohß beeds dat un „1query“ läddesch, öm alle Lengks noh ußerhallef opzeleßte.", "apihelp-query+exturlusage-param-namespace": "Dat appachtemang met dä Sigge zom opzälle.", "apihelp-query+exturlusage-param-limit": "Wi vill Sigge zem ußjävve?", - "apihelp-query+filearchive-description": "Donn alle fottjeschmeße Datteije der Reih noh opzälle.", + "apihelp-query+filearchive-summary": "Donn alle fottjeschmeße Datteije der Reih noh opzälle.", "apihelp-query+filearchive-param-from": "De Övverschreff vun däm Beld, woh de Leß medd aanfange sull.", "apihelp-query+filearchive-param-to": "De Övverschreff vun däm Beld, woh de Leß medd ophühre sull.", "apihelp-query+filearchive-param-prefix": "Söhk noh alle Övverschreffte vun Bellder, di met heh dämm Wäät bejenne.", @@ -585,7 +587,7 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "Deiht dä Nahme vun dä Dattei vun dä Aschihf_Väsjohn för alle Väsjohne, bes op de läzde, derbei.", "apihelp-query+filearchive-example-simple": "Zeijsch en leß met alle fottjeschmeße Datteije.", "apihelp-query+filerepoinfo-example-simple": "Holl ennfommazjuhne övver de Reppossetohreje met Datteije.", - "apihelp-query+fileusage-description": "Fengk alle Sigge, di de aanjejovve Datteije bruche.", + "apihelp-query+fileusage-summary": "Fengk alle Sigge, di de aanjejovve Datteije bruche.", "apihelp-query+fileusage-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+fileusage-paramvalue-prop-pageid": "De Kännong för jehde Sigg.", "apihelp-query+fileusage-paramvalue-prop-title": "De Övverschreff för jehde Sigg.", @@ -594,7 +596,7 @@ "apihelp-query+fileusage-param-limit": "Wi vill holle?", "apihelp-query+fileusage-example-simple": "Holl Aanjahbe övver Sigge, di de Dattei „[[:File:Example.jpg]].“ bruche.", "apihelp-query+fileusage-example-generator": "Holl Aanjahbe övver Sigge, di de Dattei „[[:File:Example.jpg]].“ bruche", - "apihelp-query+imageinfo-description": "Jidd Enfommazjuhne övver Datteije un de Verjangeheid vum Huhlahde aan.", + "apihelp-query+imageinfo-summary": "Jidd Enfommazjuhne övver Datteije un de Verjangeheid vum Huhlahde aan.", "apihelp-query+imageinfo-param-prop": "Wat för en Schtöker aan Ennfommazjuhne holle:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Deihd en dattom un en Zigg aan de huhjelahde Väsjohn.", "apihelp-query+imageinfo-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä jehde Väsjohn vun dä Dattei huhjelahde hät.", @@ -620,13 +622,13 @@ "apihelp-query+imageinfo-param-localonly": "Belohr blohß de Datteije em eije Wikki singe Sammlong.", "apihelp-query+imageinfo-example-simple": "Holl Enformazjuhne övver de aktoälle Väsjohn fun dä Dattei „[[:File:Albert Einstein Head.jpg]]“", "apihelp-query+imageinfo-example-dated": "Holl Enformazjuhne övver de Väsjohne fun dä Dattei „[[:File:Test.jpg]]“ vum Johr 2008 un schpääder.", - "apihelp-query+images-description": "Jidd alle Datteije uß, di en dä aanjejovve Sigge sin.", + "apihelp-query+images-summary": "Jidd alle Datteije uß, di en dä aanjejovve Sigge sin.", "apihelp-query+images-param-limit": "Wi vill Datteije holle?", "apihelp-query+images-param-images": "Donn blohß heh di Datteije opleßte. Dadd es johd, öm eruß ze fenge ovv en en beschtemmpte Sigg beschtemmpte Datteije dren sin.", "apihelp-query+images-param-dir": "En wälsche Reijefollsch opleßte.", "apihelp-query+images-example-simple": "Holl en Leß vun Datteije, di en de „[[Main Page]]“.", "apihelp-query+images-example-generator": "Holl Ennfommazjuhne övver alle Datteije, di en de „[[Main Page]]“ jebruch wähde.", - "apihelp-query+imageusage-description": "Fengk alle Sigge, di en Beld medd ene bschtemmpte Övverschreff bruche.", + "apihelp-query+imageusage-summary": "Fengk alle Sigge, di en Beld medd ene bschtemmpte Övverschreff bruche.", "apihelp-query+imageusage-param-title": "De Övverschreff för noh ze Söhke. Kam_mer nit zesamme met „$1pageid“ bruche.", "apihelp-query+imageusage-param-pageid": "De Känong vun dä Sigg zom noh Söhke. Kam_mer nit zesamme met „$1title“ bruche.", "apihelp-query+imageusage-param-namespace": "Dat Appachtemang zom opzälle.", @@ -635,7 +637,7 @@ "apihelp-query+imageusage-param-redirect": "Wann de Sigg met dämm Lengk dren en Ömleijdong änthält, fengk derzoh och alle Sigge, di doh drop lengke. De Bovverjränz för de Aanzahl Sigge för opzeleßte weed hallbehrt.", "apihelp-query+imageusage-example-simple": "Zeijsch Sigge, di di Dattei „[[:File:Albert Einstein Head.jpg]]“ bruche.", "apihelp-query+imageusage-example-generator": "Holl Enformazjuhne övver de Sigge, di di Dattei „[[:File:Albert Einstein Head.jpg]]“ bruche.", - "apihelp-query+info-description": "Holl jrondlähje Ennfommazjuhne övver di Sigg.", + "apihelp-query+info-summary": "Holl jrondlähje Ennfommazjuhne övver di Sigg.", "apihelp-query+info-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:", "apihelp-query+info-paramvalue-prop-protection": "Donn der Siggeschoz för jehde Sigg opleßte.", "apihelp-query+info-paramvalue-prop-talkid": "De Kännong för de Klaafsigg för jehde Nit-Klaafsigg.", @@ -655,7 +657,7 @@ "apihelp-query+iwbacklinks-param-dir": "En wälsche Reihjefollsch opleßte.", "apihelp-query+iwbacklinks-example-simple": "Holl Sigge, di op „[[wikibooks:Test]]“ verlengke.", "apihelp-query+iwbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „[[wikibooks:Test]]“ verlengke.", - "apihelp-query+iwlinks-description": "Jiff alle Engerwikki_Lengks vun de aanjejovve Sigge uß.", + "apihelp-query+iwlinks-summary": "Jiff alle Engerwikki_Lengks vun de aanjejovve Sigge uß.", "apihelp-query+iwlinks-paramvalue-prop-url": "Deiht dä kumplätte URL derbei.", "apihelp-query+iwlinks-param-limit": "Wi vill Engerwikki_Lengks zem ußjävve?", "apihelp-query+iwlinks-param-prefix": "Jiff blohß de Engerwikki_Lengks uß, di dermet aanfange.", @@ -670,19 +672,19 @@ "apihelp-query+langbacklinks-param-dir": "En wälsche Reihjefollsch opleßte.", "apihelp-query+langbacklinks-example-simple": "Holl Sigge, di op „[[:fr:Test]]“ verlengke.", "apihelp-query+langbacklinks-example-generator": "Holl Ennfommazjuhne övver Sigge, di op „[[:fr:Test]]“ verlengke.", - "apihelp-query+langlinks-description": "Jiff alle Schprohche_Lengks vun de aanjejovve Sigge uß.", + "apihelp-query+langlinks-summary": "Jiff alle Schprohche_Lengks vun de aanjejovve Sigge uß.", "apihelp-query+langlinks-param-limit": "Wi vill Schprohche_Lengks holle?", "apihelp-query+langlinks-paramvalue-prop-url": "Deiht dä kumplätte URL derbei.", "apihelp-query+langlinks-paramvalue-prop-autonym": "Deiht dä Nahme vun de Moterschprohch derbei.", "apihelp-query+langlinks-param-lang": "Donn blohß de Schprohche_Lengks met däm aanjejovve Schprohche_Köözel.", "apihelp-query+langlinks-param-dir": "En wälsche Reihjefollsch opleßte.", - "apihelp-query+links-description": "Jiff alle Lengks vun de aanjejovve Sigge uß.", + "apihelp-query+links-summary": "Jiff alle Lengks vun de aanjejovve Sigge uß.", "apihelp-query+links-param-namespace": "Zeijsch blohß de Lengks en dä Appachtemangs.", "apihelp-query+links-param-limit": "Wi vill Lengks ußjävve?", "apihelp-query+links-param-titles": "Donn blohß e Lengks of heh di Övverschreffte opleßte. Dadd es johd, öm eruß ze fenge ovv en en beschtemmpte Sigg op ene beschtemmpte Övverschreff verlengk es.", "apihelp-query+links-param-dir": "En wälsche Reihjefollsch opleßte.", "apihelp-query+links-example-simple": "Holl de Lengks vun dä Sigg Main Page", - "apihelp-query+linkshere-description": "Fengk alle Sigge, di op de aanjejovve Sigge lengke.", + "apihelp-query+linkshere-summary": "Fengk alle Sigge, di op de aanjejovve Sigge lengke.", "apihelp-query+linkshere-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+linkshere-paramvalue-prop-pageid": "Page ID of each page.", "apihelp-query+linkshere-paramvalue-prop-title": "Title of each page.", @@ -691,7 +693,7 @@ "apihelp-query+linkshere-param-limit": "Wi vill holle?", "apihelp-query+linkshere-example-simple": "Holl en Leß vun Sigge, di op de Sigg „[[Main Page]]“ lengke donn.", "apihelp-query+linkshere-example-generator": "Holl Ennfommazjuhne övver Sigge, di op de Sigg „[[Main Page]]“ lengke.", - "apihelp-query+logevents-description": "Holl Enndrähsch us de Logböhscher.", + "apihelp-query+logevents-summary": "Holl Enndrähsch us de Logböhscher.", "apihelp-query+logevents-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+logevents-param-type": "Söhk blohß heh di Zood Enndrähsch us de Logböhscher.", "apihelp-query+logevents-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.", @@ -703,12 +705,12 @@ "apihelp-query+logevents-param-tag": "Donn blohß Väsjohne met heh dä Makkehrong opleßte.", "apihelp-query+logevents-param-limit": "Wi vill Enndrähsch enjesammp ußjävve?", "apihelp-query+logevents-example-simple": "Donn de neußte Enndrähsch uß de Logböhscher opleßte.", - "apihelp-query+pagepropnames-description": "Donn alle Nahme vun Eijeschaffte vun Sigge heh em Wikki opleßte.", + "apihelp-query+pagepropnames-summary": "Donn alle Nahme vun Eijeschaffte vun Sigge heh em Wikki opleßte.", "apihelp-query+pagepropnames-param-limit": "De jrüüßte Zahl Nahme för ußzejävve.", "apihelp-query+pagepropnames-example-simple": "Holl de eezde zehn Nahme vun Eijeschaffte.", - "apihelp-query+pageprops-description": "Jitt devärse Eijeschafte uß, di em Ennhald vun dä Sigg faßjelaat wohde sen.", + "apihelp-query+pageprops-summary": "Jitt devärse Eijeschafte uß, di em Ennhald vun dä Sigg faßjelaat wohde sen.", "apihelp-query+pageprops-example-simple": "Holl de Eijeschaffte för di Sigge „Main Page“ un „MediaWiki“.", - "apihelp-query+pageswithprop-description": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.", + "apihelp-query+pageswithprop-summary": "Donn alle Sigge met bechtemmpte Sigge_Eijeschaff opleßte.", "apihelp-query+pageswithprop-param-prop": "Wat för en Aanjahbe ennschlehße:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Deiht de Kännong vun de Sigge derbei.", "apihelp-query+pageswithprop-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för di Sigg derbei.", @@ -716,13 +718,13 @@ "apihelp-query+pageswithprop-param-limit": "De jrüüßte Zahl Sigge för ußzejävve.", "apihelp-query+pageswithprop-param-dir": "En wälsche Reihjefollsch opleßte.", "apihelp-query+pageswithprop-example-generator": "Holl zohsäzlejje Aanjahbe övver de eezde zehn Sigge, woh __NOTOC__ dren vörkütt.", - "apihelp-query+prefixsearch-description": "Söhk nohm Aanfang vun dä Övverschreffte vun de Sigge.", + "apihelp-query+prefixsearch-summary": "Söhk nohm Aanfang vun dä Övverschreffte vun de Sigge.", "apihelp-query+prefixsearch-param-search": "Noh wat söhke?", "apihelp-query+prefixsearch-param-namespace": "En wällschem Appachtemang söhke.", "apihelp-query+prefixsearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve", "apihelp-query+prefixsearch-param-offset": "De Aanzahl vun Äjeebnesse för ze övverjonn.", "apihelp-query+prefixsearch-example-simple": "Söhk noh Övverschreffte vun Sigge, di met \n„meaning“ bejenne.", - "apihelp-query+protectedtitles-description": "Donn alle Överschreffte vun Sigge opleßte, di verbodde sin, aanzelähje.", + "apihelp-query+protectedtitles-summary": "Donn alle Överschreffte vun Sigge opleßte, di verbodde sin, aanzelähje.", "apihelp-query+protectedtitles-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs opleßte.", "apihelp-query+protectedtitles-param-level": "Donn blohß de Övverschreffte vun Sigge met heh dämm Nivoh vum Sigge_Schoz opeleßte.", "apihelp-query+protectedtitles-param-limit": "Wi vill Sigge ensjesammp zem ußjävve?", @@ -738,7 +740,7 @@ "apihelp-query+random-param-filterredir": "Wi de Ömleijdonge ußzottehre?", "apihelp-query+random-example-simple": "Donn zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.", "apihelp-query+random-example-generator": "Donn Ennfommazjuhne övver zwai zohfälleje Sigge vum Houb_Appachtemang ußjävve.", - "apihelp-query+recentchanges-description": "Donn de neußte Änderonge opleßte.", + "apihelp-query+recentchanges-summary": "Donn de neußte Änderonge opleßte.", "apihelp-query+recentchanges-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.", "apihelp-query+recentchanges-param-end": "Dattum un Uhrzigg, bes wann opzälle.", "apihelp-query+recentchanges-param-namespace": "Donn de Änderonge blohß us de aanjejovve Appachtemans nämme.", @@ -757,7 +759,7 @@ "apihelp-query+recentchanges-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.", "apihelp-query+recentchanges-param-generaterevisions": "Wann als ene Jenerahtor enjesaz, brängk dat Kännonge vun Väsjohne un kein Övverschreffte. Enndrähsch en de neußte Änderonge der ohne en Väsjohnskännong, alsu de miehste Logbohchenndrähsch, bränge jaa nix.", "apihelp-query+recentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}", - "apihelp-query+redirects-description": "Jiff alle Ömleijdonge noh dä aanjejovve Sigge uß.", + "apihelp-query+redirects-summary": "Jiff alle Ömleijdonge noh dä aanjejovve Sigge uß.", "apihelp-query+redirects-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+redirects-paramvalue-prop-pageid": "De Sigge_Kännong för jehde Ömleijdong.", "apihelp-query+redirects-paramvalue-prop-title": "De Övverschreff för jehde Ömleijdong.", @@ -796,7 +798,7 @@ "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?", "apihelp-query+revisions+base-param-section": "Holl blohß der Ennhald vun däm Affschnett met heh dä Nommer.", "apihelp-query+revisions+base-param-difftotextpst": "Donn dä Täx ömsäze wi vör em Affseschere, ih de Ongerscheijde erus jefonge wähde. Jeihd blohß mem Parramehter $1difftotext zesamme.", - "apihelp-query+search-description": "Söhk em jannze Täx.", + "apihelp-query+search-summary": "Söhk em jannze Täx.", "apihelp-query+search-param-search": "Söhk noh alle Övverschreffte vun Sigge udder Ennhallde, woh dä Wäät drop paß. Mer kann heh met besönder Aufjahbe beim Söhke schtälle, jeh nohdämm wadd_em Wikki sing Projramm för et Söhke esu alles kann.", "apihelp-query+search-param-namespace": "Söhk blohß en heh dä Appachtemangs.", "apihelp-query+search-param-what": "Wat för en Aat ze Söhke?", @@ -810,7 +812,7 @@ "apihelp-query+search-example-simple": "Söhk noh „meaning“.", "apihelp-query+search-example-text": "Söhk en Täxte noh „meaning“.", "apihelp-query+search-example-generator": "Holl anjahbe övver di Sigge, di jefonge wähde beim söhke noh \n„meaning“", - "apihelp-query+siteinfo-description": "Jiff alljemeine Ennfommazjuhne övver heh di ẞaid_uß.", + "apihelp-query+siteinfo-summary": "Jiff alljemeine Ennfommazjuhne övver heh di ẞaid_uß.", "apihelp-query+siteinfo-param-prop": "Wat för en Ennfommazjuhne holle:", "apihelp-query+siteinfo-paramvalue-prop-general": "Alljemeine Aanjabe zom Süßtehm.", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Jivv Schtatistike vum Wikki uß.", @@ -822,7 +824,7 @@ "apihelp-query+siteinfo-example-simple": "Holl Ennfommazjuhe övver heh di ẞait.", "apihelp-query+siteinfo-example-interwiki": "Holl en Leß met de Vörsäz för de Engerwiki_Lenks em eije Wikki.", "apihelp-query+stashimageinfo-param-sessionkey": "Es et sällve wi „$1filekey“ un kütt vun fröjere Väsjohne.", - "apihelp-query+tags-description": "Leß de Makehronge vun Änderonge.", + "apihelp-query+tags-summary": "Leß de Makehronge vun Änderonge.", "apihelp-query+tags-param-limit": "De hühßde Zahl Makkehronge zom Opleste.", "apihelp-query+tags-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+tags-paramvalue-prop-name": "Deiht dä Nahme vun dä Makkehrong derbei.", @@ -833,7 +835,7 @@ "apihelp-query+tags-paramvalue-prop-source": "Hollt de Kwälle vun de Makkehrong, dat kann ömfaße: „extension“ för Makkehronge, di vun Zohsazprojramme faßjelaat wähde, un „manual“ för Makkehronge, di vun de Metmaacher vun Hand verjovve wohde.", "apihelp-query+tags-paramvalue-prop-active": "Ov de Makkehrong emmer noch aktihv es.", "apihelp-query+tags-example-simple": "Leß de verföhschbahre Makkehronge op.", - "apihelp-query+templates-description": "Jidd alle Datteije uß, di en dä aanjejovve Sigge enjebonge sin.", + "apihelp-query+templates-summary": "Jidd alle Datteije uß, di en dä aanjejovve Sigge enjebonge sin.", "apihelp-query+templates-param-namespace": "Zeijsch blohß de Schablohne en heh däm Appachtemang.", "apihelp-query+templates-param-limit": "Wi vill Schablohne sulle ußjejovve wähde?", "apihelp-query+templates-param-templates": "Donn blohß heh die Schablohne opleßte. Johd ze bruche zom Pröhve, ov en beschtemmpte Sigg en beschtemmpte Schlohn bruche deiht.", @@ -841,7 +843,7 @@ "apihelp-query+templates-example-simple": "Holl di Schablohne, di en dä Sigg „Main Page“ jebruch wähde.", "apihelp-query+templates-example-generator": "Holl Ennfommazjuhneövver di Sigge met di Schablohne, di en dä Sigg „Main Page“ jebruch wähde.", "apihelp-query+templates-example-namespaces": "Holl Sigge uß de {{ns:user}} un {{ns:template}} Appachtemangs, di en di Sigg „Main Page“ enjeschloße wähde.", - "apihelp-query+transcludedin-description": "Fengk alle Sigge, di di aanjejovve Sigge enneschlehße.", + "apihelp-query+transcludedin-summary": "Fengk alle Sigge, di di aanjejovve Sigge enneschlehße.", "apihelp-query+transcludedin-param-prop": "Wat för en Eijeschaffte holle:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "De Kännong för jehde Sigg.", "apihelp-query+transcludedin-paramvalue-prop-title": "De Övverschreff för jehde Sigg.", @@ -850,7 +852,7 @@ "apihelp-query+transcludedin-param-limit": "Wi vill ußjävve.", "apihelp-query+transcludedin-example-simple": "Holl en Leß met Sigge, di en dä Sigg „Main Page“ ennjeschloße wähde.", "apihelp-query+transcludedin-example-generator": "Holl Ennfommazjuhne övver Sigge, di vun dä Sigg „Main Page“ ohjerohfe wähde.", - "apihelp-query+usercontribs-description": "Holl alle Änderonge vun enem Metmaacher.", + "apihelp-query+usercontribs-summary": "Holl alle Änderonge vun enem Metmaacher.", "apihelp-query+usercontribs-param-limit": "De hühßte Aanzahl vun Meddeilonge för zeröck ze jävve", "apihelp-query+usercontribs-param-start": "Dattom un Zigg vun woh aan ußjävve.", "apihelp-query+usercontribs-param-end": "Dattom un Zigg bes woh hen ußjävve.", @@ -872,7 +874,7 @@ "apihelp-query+usercontribs-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.", "apihelp-query+usercontribs-example-user": "Zeijsch dem Metmaacher „Example“ sing Beijdrähsch.", "apihelp-query+usercontribs-example-ipprefix": "Zeijsch de Beijdrähsch vun alle IP-Adräße, di met „192.0.2.“ bejenne.", - "apihelp-query+userinfo-description": "Holl Aanjahbe övver dä aktoälle Metmaacher.", + "apihelp-query+userinfo-summary": "Holl Aanjahbe övver dä aktoälle Metmaacher.", "apihelp-query+userinfo-param-prop": "Wat för en Aanjahbe med enzschlehße:", "apihelp-query+userinfo-paramvalue-prop-groups": "Donn alle Jroppe opleßte, woh dä heh Metmaacher dren es.", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleßte, woh dä heh Metmaacher aotomattesch dren es.", @@ -886,7 +888,7 @@ "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.", "apihelp-query+userinfo-example-simple": "Holl Aanjahbe övver dä aktoälle Metmaacher.", "apihelp-query+userinfo-example-data": "Holl zohsäzlejje Aanjahbe övver dä aktoälle Metmaacher.", - "apihelp-query+users-description": "Holl Aanjahbe övver en Leß vun Metmaacher.", + "apihelp-query+users-summary": "Holl Aanjahbe övver en Leß vun Metmaacher.", "apihelp-query+users-param-prop": "Wat för en Aanjahbe med enzschlehße:", "apihelp-query+users-paramvalue-prop-groups": "Donn alle Jroppe opleßte, woh all de Metmaacher dren sin.", "apihelp-query+users-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleßte, woh ene Metmaacher aotomattesch dren es.", @@ -919,7 +921,7 @@ "apihelp-query+watchlist-paramvalue-type-new": "Neu aanjelaate Sigge.", "apihelp-query+watchlist-paramvalue-type-log": "Enndrähsch em Logbohch", "apihelp-query+watchlist-paramvalue-type-categorize": "Änderonge aan de Zohjehüreshkeit zoh Saachjroppe.", - "apihelp-query+watchlistraw-description": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.", + "apihelp-query+watchlistraw-summary": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.", "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.", "apihelp-query+watchlistraw-param-limit": "Wi vell Äjehbneße ennsjesammp pro Oprohv ußjejovve wähde sulle.", "apihelp-query+watchlistraw-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:", @@ -927,7 +929,7 @@ "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.", "apihelp-removeauthenticationdata-example-simple": "Versöhk dem aktoäle Metmaacher sing Dahte för FooAuthenticationRequest fott ze nämme.", "apihelp-resetpassword-example-email": "Schegg en e-mail mem Passwod neu säze aan alle Matmaacher met dä Addräß user@example.com.", - "apihelp-revisiondelete-description": "Versione fottschmieße un widder zeröck holle.", + "apihelp-revisiondelete-summary": "Versione fottschmieße un widder zeröck holle.", "apihelp-revisiondelete-param-hide": "Wat för jehde Väsjohn ze veschteijsche.", "apihelp-revisiondelete-param-show": "Wat för jehde Väsjohn zerökzeholle.", "apihelp-revisiondelete-param-suppress": "Ov dat och för de Wiki-Köbesse verschtoche wähde sull, wie för jede Andere.", @@ -941,7 +943,7 @@ "apihelp-stashedit-param-text": "Dä Sigg ehre Ennhalld.", "apihelp-stashedit-param-contentmodel": "Et Enhalltsmodäll för dä neue Ennhalld.", "apihelp-stashedit-param-summary": "Zosammefaßong änndere", - "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.", + "apihelp-tag-summary": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.", "apihelp-tag-param-rcid": "Ein udder mih Kännonge uß de neuste Ännderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.", "apihelp-tag-param-revid": "Ein Kännong udder mih, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.", "apihelp-tag-param-logid": "Ein Kännong udder mih uß de neuste Änderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.", @@ -950,7 +952,7 @@ "apihelp-tag-param-reason": "Dä Jrond för di Änderong.", "apihelp-tag-example-rev": "Donn de Makkehrong „vandalism“ vun dä Väsjohn met dä Kännong „123“ fott nämme, der ohne ene Jrond ze nänne.", "apihelp-tag-example-log": "Donn de Makkehrong „spam“ vun dämm Enndrahch met dä Kännong „123“ em Logbohch fott nämme un als Jrond draaach „Wrongly applied“ enn.", - "apihelp-unblock-description": "Don en Schpärr för ene Metmaacher ophävve.", + "apihelp-unblock-summary": "Don en Schpärr för ene Metmaacher ophävve.", "apihelp-unblock-param-reason": "Der Jrond för de Schpärr opzehävve.", "apihelp-unblock-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch vum Schpärre jesaz wähde sulle.", "apihelp-undelete-param-title": "De Övverschreff vun dä Sigg zom zerök holle.", @@ -959,7 +961,8 @@ "apihelp-undelete-param-watchlist": "Donn di Sigg ohne Bedengonge op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.", "apihelp-undelete-example-page": "Schmiiß de Sigg „Main Page“ fott.", "apihelp-undelete-example-revisions": "Holl zwai Väsjohne vun dä Sigg „Main Page“ zerök.", - "apihelp-upload-description": "Donn en Dattei huh lahde, udder holl der Zohschtand vun de onfähdesch huhjelahde Datteije .\n\nEt jitt ongerscheidlejje Metohde:\n* Donn de Ennhallde vun de Datteije tiräk huhlahde, övver der Parramehter „$1file“.\n* Donn de Datteije en en Aanzahl Rötsche huhlahde, övver de Parramehter „$1filesize“, „$1chunk“, un „$1offset“.\n* Lohß der ẞööver vum Wikki en Dattei vun enem URL holle, övver de Parramehter „$1url“.\n* Lohß en Dattei fähdesch huhlahde, di zeläz nit fähdesch wohd, un met Warnonge schtonn jeblevve es övver de Parramehter „$1filekey“.\nOpjepaß: dä „POST“-Befähl vum HTTP moß als e Dattei-Huhlahde aanjeschtüßße wähde, allsu met „multipart/form-data“, wam_mer dä Parramehter „$1file“ scheck.", + "apihelp-upload-summary": "Donn en Dattei huh lahde, udder holl der Zohschtand vun de onfähdesch huhjelahde Datteije .", + "apihelp-upload-extended-description": "Et jitt ongerscheidlejje Metohde:\n* Donn de Ennhallde vun de Datteije tiräk huhlahde, övver der Parramehter „$1file“.\n* Donn de Datteije en en Aanzahl Rötsche huhlahde, övver de Parramehter „$1filesize“, „$1chunk“, un „$1offset“.\n* Lohß der ẞööver vum Wikki en Dattei vun enem URL holle, övver de Parramehter „$1url“.\n* Lohß en Dattei fähdesch huhlahde, di zeläz nit fähdesch wohd, un met Warnonge schtonn jeblevve es övver de Parramehter „$1filekey“.\nOpjepaß: dä „POST“-Befähl vum HTTP moß als e Dattei-Huhlahde aanjeschtüßße wähde, allsu met „multipart/form-data“, wam_mer dä Parramehter „$1file“ scheck.", "apihelp-upload-param-filename": "Zihl-Dateiname.", "apihelp-upload-param-text": "Der aanfänglesche Täx op Sigge för neu aanjelahte Datteije.", "apihelp-upload-param-watch": "Op di Sigg heh oppaßße.", @@ -976,23 +979,23 @@ "apihelp-userrights-param-add": "Donn dä Metmaacher en heh di Jroppe eren.", "apihelp-userrights-param-remove": "Donn dä Metmaacher us heh dä Jroppe eruß nämme.", "apihelp-userrights-param-reason": "Dä Jrond för di Änderong.", - "apihelp-watch-description": "Donn di Sigg en däm aktoälle Metmaacher singe Oppaßless eren udder schmihß se erus.", + "apihelp-watch-summary": "Donn di Sigg en däm aktoälle Metmaacher singe Oppaßless eren udder schmihß se erus.", "apihelp-watch-example-watch": "Don di Sigg „Main Page“ en de Oppaßleß.", "apihelp-watch-example-unwatch": "Schmiiß di Sigg „Main Page“ uß dä Oppaßleß erus.", "apihelp-watch-example-generator": "Donn op de eezte paa Sigge em Schtanndadd_Appachtemang oppaße.", "apihelp-format-example-generic": "Jiff wadd_erus kohm em Fommaht $1 us.", - "apihelp-json-description": "Donn de Dahte em XML-Fommahd ußjävve.", + "apihelp-json-summary": "Donn de Dahte em XML-Fommahd ußjävve.", "apihelp-json-param-ascii": "Wann aanjejovve, deiht alle nit-ASCII-Zeijsche met hexadezimahle !escape-Sequänze koddehre. Dadd es der Schtandatt, wann „formatversion“ 1 es.", - "apihelp-jsonfm-description": "Dahte em JSON-Fommaht ußjävve un för schöhn en et HTML wandele.", - "apihelp-none-description": "Donn nix ußjävve.", - "apihelp-php-description": "Dahte em hengernader jeschrevve PHP-Fommaht ußjävve.", - "apihelp-phpfm-description": "Dahte em hengernannder jeschrevve PHP-Fommaht ußjävve un för schöhn en et HTML wandele.", - "apihelp-rawfm-description": "Dahte, met de Aandeijle för et Fählersöhke, em JSON-Fommaht ußjävve un för schöhn en et HTML wandele.", - "apihelp-xml-description": "Donn de Dahte em XML-Fommahd ußjävve.", + "apihelp-jsonfm-summary": "Dahte em JSON-Fommaht ußjävve un för schöhn en et HTML wandele.", + "apihelp-none-summary": "Donn nix ußjävve.", + "apihelp-php-summary": "Dahte em hengernader jeschrevve PHP-Fommaht ußjävve.", + "apihelp-phpfm-summary": "Dahte em hengernannder jeschrevve PHP-Fommaht ußjävve un för schöhn en et HTML wandele.", + "apihelp-rawfm-summary": "Dahte, met de Aandeijle för et Fählersöhke, em JSON-Fommaht ußjävve un för schöhn en et HTML wandele.", + "apihelp-xml-summary": "Donn de Dahte em XML-Fommahd ußjävve.", "apihelp-xml-param-includexmlnamespace": "Wann aanjejovve, deihd en XML-Appachtemand derbei.", - "apihelp-xmlfm-description": "Donn de Dahte em XML-Fommahd schöhn jemaht met HTML ußjävve.", + "apihelp-xmlfm-summary": "Donn de Dahte em XML-Fommahd schöhn jemaht met HTML ußjävve.", "api-format-title": "Wat et API ußjohv.", - "api-format-prettyprint-header-only-html": "Dat heh es en HTML_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.", + "api-format-prettyprint-header-only-html": "Dat heh es en HTML_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:Special:MyLanguage/API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.", "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.", "api-pageset-param-pageids": "En Leß vun Kännonge vun Sigge för ze beärbeide.", "api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.", @@ -1029,8 +1032,8 @@ "api-help-param-multi-max": "De jrühßte müjjelesche Zahl es {{PLURAL:$1|$1}}, un {{PLURAL:$2|$2}} för Botprojramme.", "api-help-param-default": "Schtandatt: $1", "api-help-param-default-empty": "Schtandatt: (läddesch)", - "api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Manual:$wgMiserMode|miser mode]] affjeschalldt.", - "api-help-param-limited-in-miser-mode": "Opjepaß: Weil der [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi $1limit Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.", + "api-help-param-disabled-in-miser-mode": "Dadd es wäje em [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] affjeschalldt.", + "api-help-param-limited-in-miser-mode": "Opjepaß: Weil der [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi $1limit Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.", "api-help-param-direction": "En wälsche Reihjefollsch opleßte:\n;newer:De Ählsde et eez. Opjepaß: „$1start“ moß fröhjer sin wi „$1end“.\n;older:De Neuste et eez, der Schtanndatt. Opjepaß: „$1start“ moß schpääder sin wi „$1end“.", "api-help-param-continue": "Wann mih ze holle es, nemm dat för wigger ze maache.", "api-help-param-no-description": "(nix drövver bikannt)", @@ -1039,6 +1042,7 @@ "api-help-permissions-granted-to": "Jejovve aan: $2{{PLURAL:$1|}}", "api-help-right-apihighlimits": "Donn de Beschängkonge vun Opdrähscht aan de API kleiner maache (langsamme Opdrähscht: $1; flöcke Opdrähscht: $2). De Beschränkonge för lahme Opdrähscht jällde och för Parramehtere met vill Wähte.", "api-help-open-in-apisandbox": "[en de Sandkeß opmaache]", + "apierror-timeout": "Dä ẞööver hät en dä jewennde Zick nit jeantwoot.", "api-credits-header": "Aanäkännong för Beijdrähsch", "api-credits": "Dä API ier Äntweklere:\n* Roan Kattouw (Aanföhrer zigg em Säptämber 2007 bes 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Bejenner un Aanföhrer vum Säptämber 2006 bes Säptämber 2007)\n* Brad Jorsch (Aanföhrer vun 2013 bes hük)\n\nDoht Ühr Aanmärkonge, Vörschlähsch un Frohre aan de Meijlengleß mediawiki-api@lists.wikimedia.org scheke, Ühr Vörschlähsch un Fählermälldong doht op https://phabricator.wikimedia.org/ ennjävve." } diff --git a/includes/api/i18n/ku-latn.json b/includes/api/i18n/ku-latn.json index be0919274b..3b47738474 100644 --- a/includes/api/i18n/ku-latn.json +++ b/includes/api/i18n/ku-latn.json @@ -6,18 +6,18 @@ "Ghybu" ] }, - "apihelp-block-description": "Bikarhênerekî asteng bike.", + "apihelp-block-summary": "Bikarhênerekî asteng bike.", "apihelp-block-param-reason": "Sedemê bo astengkirinê.", "apihelp-createaccount-param-name": "Navê bikarhêner.", - "apihelp-delete-description": "Rûpelekê jê bibe.", + "apihelp-delete-summary": "Rûpelekê jê bibe.", "apihelp-delete-example-simple": "Main Pageê jê bibe.", - "apihelp-edit-description": "Rûpelan çêke û biguherîne.", + "apihelp-edit-summary": "Rûpelan çêke û biguherîne.", "apihelp-edit-param-sectiontitle": "Sernavê bo beşeke nû.", "apihelp-edit-param-text": "Naveroka rûpelê.", "apihelp-edit-param-minor": "Guhertina biçûk.", "apihelp-edit-param-createonly": "Heke ku rûpel hebe wê neguherîne.", "apihelp-edit-example-edit": "Rûpelekê biguherîne.", - "apihelp-emailuser-description": "Ji bikarhêner re e-nameyekê bişîne.", + "apihelp-emailuser-summary": "Ji bikarhêner re e-nameyekê bişîne.", "apihelp-emailuser-param-target": "Bikarhênerê ku e-name jê rê bê şandin.", "apihelp-expandtemplates-param-title": "Sernavê rûpelê.", "apihelp-feedcontributions-param-deletedonly": "Tenê beşdariyên jêbirî nîşan bide.", @@ -36,7 +36,7 @@ "apihelp-opensearch-example-te": "Rûpelên ku bi Te dest pê dikin bibîne.", "apihelp-parse-example-page": "Rûpelekê analîz bike.", "apihelp-parse-example-summary": "Kurteyekê analîz bike", - "apihelp-protect-description": "Asta parastinê ya rûpelekê biguherîne.", + "apihelp-protect-summary": "Asta parastinê ya rûpelekê biguherîne.", "apihelp-protect-example-protect": "Rûpelekê biparêze.", "apihelp-query+alllinks-paramvalue-prop-title": "Sernavê girêdanê lê zêde dike.", "apihelp-tag-param-reason": "Sedemê bo guherandinê.", diff --git a/includes/api/i18n/ky.json b/includes/api/i18n/ky.json index 34b84618ce..2f837aa911 100644 --- a/includes/api/i18n/ky.json +++ b/includes/api/i18n/ky.json @@ -5,16 +5,16 @@ "Macofe" ] }, - "apihelp-block-description": "Колдонуучуну бөгөттөө", + "apihelp-block-summary": "Колдонуучуну бөгөттөө", "apihelp-block-param-reason": "Бөгөттөө себеби.", "apihelp-block-example-ip-simple": " 192.0.2.5 IP дарегин үч күнгө First strike себеби менен бөгөттөө.", "apihelp-checktoken-param-token": "Текшерүү белгиси.", "apihelp-createaccount-param-name": "Колдонуучунун аты:", "apihelp-createaccount-param-email": "Колдонуучунун email дареги (милдеттүү эмес)", "apihelp-createaccount-param-realname": "Колдонуучунун чыныгы аты (милдеттүү эмес)", - "apihelp-delete-description": "Баракты өчүрүү", + "apihelp-delete-summary": "Баракты өчүрүү", "apihelp-delete-example-simple": "Main Page өчүрүү.", - "apihelp-edit-description": "Барактарды түзүү жана оңдоо.", + "apihelp-edit-summary": "Барактарды түзүү жана оңдоо.", "apihelp-edit-param-text": "Барактын мазмуну.", "apihelp-edit-param-minor": "Майда оңдоо." } diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json index a803645fb8..085821cebe 100644 --- a/includes/api/i18n/lb.json +++ b/includes/api/i18n/lb.json @@ -7,7 +7,7 @@ }, "apihelp-main-param-assertuser": "Iwwerpréifen ob den aktuelle Benotzer de Benotzer mat deem Numm ass.", "apihelp-main-param-curtimestamp": "Den aktuellen Zäitstempel an d'Resultat integréieren.", - "apihelp-block-description": "E Benotzer spären.", + "apihelp-block-summary": "E Benotzer spären.", "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich fir ze spären. Kann net zesumme mat $1userid benotzt ginn.", "apihelp-block-param-reason": "Grond fir ze spären.", "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP-Adress ausschalten)", @@ -18,15 +18,16 @@ "apihelp-compare-param-fromrev": "Éischt Versioun fir ze vergläichen.", "apihelp-compare-param-totitle": "Zweeten Titel fir ze vergläichen.", "apihelp-compare-param-torev": "Zweet Versioun fir ze vergläichen.", - "apihelp-createaccount-description": "En neie Benotzerkont uleeën.", + "apihelp-createaccount-summary": "En neie Benotzerkont uleeën.", "apihelp-createaccount-param-name": "Benotzernumm.", "apihelp-createaccount-param-email": "E-Mail-Adress vum Benotzer (fakultativ).", "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).", - "apihelp-delete-description": "Eng Säit läschen.", + "apihelp-delete-summary": "Eng Säit läschen.", "apihelp-delete-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.", "apihelp-delete-param-unwatch": "D'Säit vun der Iwwerwaachungslëscht vum aktuelle Benotzer erofhuelen.", "apihelp-delete-example-simple": "D'Main Page läschen.", - "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.", + "apihelp-disabled-summary": "Dëse Modul gouf ausgeschalt.", + "apihelp-edit-summary": "Säiten uleeën an änneren.", "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.", "apihelp-edit-param-text": "Säiteninhalt.", "apihelp-edit-param-minor": "Kleng Ännerung.", @@ -35,6 +36,7 @@ "apihelp-edit-param-createonly": "D'Säit net ännere wann et se scho gëtt.", "apihelp-edit-param-watch": "D'Säit op dem aktuelle Benotzer seng Iwwerwaachungslëscht dobäisetzen.", "apihelp-edit-example-edit": "Eng Säit änneren", + "apihelp-emailuser-summary": "Engem Benotzer eng E-Mail schécken.", "apihelp-emailuser-example-email": "Dem Benotzer WikiSysop eng E-Mail mam Text Content schécken.", "apihelp-expandtemplates-param-title": "Titel vun der Säit.", "apihelp-expandtemplates-paramvalue-prop-ttl": "D'Maximalzäit no där den Tëschespäicher vum Resultat net méi valabel si soll.", @@ -56,7 +58,7 @@ "apihelp-filerevert-param-comment": "Bemierkung eroplueden.", "apihelp-help-example-main": "Hëllef fir den Haaptmodul.", "apihelp-help-example-recursive": "All Hëllef op enger Säit", - "apihelp-imagerotate-description": "Eent oder méi Biller dréinen.", + "apihelp-imagerotate-summary": "Eent oder méi Biller dréinen.", "apihelp-imagerotate-example-generator": "All Biller an der Category:Flip]] ëm 180 Grad dréinen.", "apihelp-import-param-summary": "Resumé vum importéiere vum Logbuch.", "apihelp-import-param-xml": "Eropgeluedenen XML-Fichier.", @@ -65,41 +67,45 @@ "apihelp-login-param-password": "Passwuert.", "apihelp-login-example-login": "Aloggen.", "apihelp-logout-example-logout": "Den aktuelle Benotzer ausloggen.", - "apihelp-move-description": "Eng Säit réckelen.", + "apihelp-mergehistory-summary": "Historique vun de Säite fusionéieren.", + "apihelp-move-summary": "Eng Säit réckelen.", "apihelp-move-param-reason": "Grond fir d'Ëmbenennen.", "apihelp-move-param-movetalk": "D'Diskussiounssäit ëmbenennen, wann et se gëtt.", "apihelp-move-param-noredirect": "Keng Viruleedung uleeën.", "apihelp-move-param-ignorewarnings": "All Warnungen ignoréieren.", - "apihelp-options-description": "Astellunge fir den aktuelle Benotzer änneren.\n\nNëmmen Optiounen aus dem Haaptdeel (core) oder aus enger vun den installéierten Erweiderunge, oder Optioune mat Schlësselen déi viragestallt si mat userjs- (geduecht fir mat Benotzer-Scripte benotzt ze ginn), kënnen agestallt ginn.", + "apihelp-opensearch-param-suggest": "Näischt maache wa(nn) [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] falsch ass.", + "apihelp-options-summary": "Astellunge vum aktuelle Benotzer änneren.", + "apihelp-options-extended-description": "Nëmmen Optiounen aus dem Haaptdeel (core) oder aus enger vun den installéierten Erweiderunge, oder Optioune mat Schlësselen déi viragestallt si mat userjs- (geduecht fir mat Benotzer-Scripte benotzt ze ginn), kënnen agestallt ginn.", "apihelp-options-param-optionname": "Den Numm vun der Optioun deen op de Wäert vun $1optionvalue gesat gi muss", "apihelp-options-example-reset": "All Astellungen zrécksetzen", "apihelp-parse-param-disablepp": "Benotzt an där Plaz $1disablelimitreport.", "apihelp-patrol-example-rcid": "Eng rezent Ännerung nokucken.", "apihelp-patrol-example-revid": "Eng Versioun nokucken.", "apihelp-protect-example-protect": "Eng Säit spären", - "apihelp-query+allcategories-description": "All Kategorien opzielen.", + "apihelp-query+allcategories-summary": "All Kategorien opzielen.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kann nëmme mam $3user benotzt ginn.", "apihelp-query+alldeletedrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.", "apihelp-query+allfileusages-paramvalue-prop-title": "Setzt den Titel vum Fichier derbäi.", "apihelp-query+alllinks-paramvalue-prop-title": "Setzt den Titel vum Link derbäi.", - "apihelp-query+allrevisions-description": "Lëscht vun alle Versiounen.", + "apihelp-query+allrevisions-summary": "Lëscht vun alle Versiounen.", "apihelp-query+allrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.", "apihelp-query+allrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.", "apihelp-query+allrevisions-param-namespace": "Nëmmen Säiten aus dësem Nummraum opzielen.", - "apihelp-query+allusers-description": "All registréiert Benotzer opzielen.", + "apihelp-query+allusers-summary": "All registréiert Benotzer opzielen.", "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lëscht vun alle Gruppen an deenen de Benotzer automatesch dran ass.", "apihelp-query+allusers-param-activeusers": "Nëmme Benotzer opzielen déi an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.", "apihelp-query+backlinks-example-simple": "Linken op d'Main page weisen.", - "apihelp-query+blocks-description": "Lëscht vun de gespaarte Benotzer an IP-Adressen.", + "apihelp-query+blocks-summary": "Lëscht vun de gespaarte Benotzer an IP-Adressen.", "apihelp-query+blocks-paramvalue-prop-range": "Setzt de Beräich vun den IP-Adressen derbäi déi vun der Spär betraff sinn.", "apihelp-query+blocks-example-simple": "Lëscht vun de Spären", - "apihelp-query+categories-description": "All Kategorien opzielen zu deenen dës Säit gehéiert.", + "apihelp-query+categories-summary": "All Kategorien opzielen zu deenen dës Säit gehéiert.", "apihelp-query+categories-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun dem Ament derbäi wou d'Kategorie derbäigesat gouf.", "apihelp-query+categories-example-generator": "Informatioun iwwer all Kategorien, déi an der Säit Albert Einstein benotzt ginn, kréien.", - "apihelp-query+categorymembers-description": "All Säiten aus enger bestëmmter Kategorie opzielen.", + "apihelp-query+categorymembers-summary": "All Säiten aus enger bestëmmter Kategorie opzielen.", "apihelp-query+categorymembers-example-simple": "Déi éischt 10 Säiten aus der Category:Physics kréien.", "apihelp-query+deletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.", + "apihelp-query+deletedrevs-summary": "Geläscht Versiounen oplëschten.", "apihelp-query+deletedrevs-param-unique": "Nëmmen eng Versioun fir all Säit weisen.", "apihelp-query+embeddedin-param-filterredir": "Wéi Viruleedungen gefiltert gi sollen.", "apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias fir Gréisst.", @@ -115,11 +121,13 @@ "apihelp-query+iwlinks-paramvalue-prop-url": "Setzt déi komplett URL derbäi.", "apihelp-query+langlinks-param-lang": "Nëmme Sproochlinke mat dësem Sproochcode zréckginn.", "apihelp-query+links-param-namespace": "Nëmme Linken an dësen Nummräim weisen.", + "apihelp-query+linkshere-summary": "All Säite fannen déi op déi Säit linken déi ugi gouf.", "apihelp-query+linkshere-paramvalue-prop-title": "Titel vun all Säit.", "apihelp-query+linkshere-paramvalue-prop-redirect": "Markéiere wann d'Säit eng Viruleedung ass.", "apihelp-query+pageswithprop-example-generator": "Zousätzlech Informatiounen iwwer déi 10 éischt Säite kréie mat __NOTOC__.", "apihelp-query+protectedtitles-param-namespace": "Nëmmen Titelen aus dësen Nummraim opzielen.", "apihelp-query+random-param-redirect": "Benotzt dofir $1filterredir=Viruleedungen.", + "apihelp-query+recentchanges-summary": "Rezent Ännerungen opzielen.", "apihelp-query+recentchanges-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.", "apihelp-query+recentchanges-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.", "apihelp-query+recentchanges-example-simple": "Rezent Ännerunge weisen", @@ -135,8 +143,11 @@ "apihelp-query+search-param-namespace": "Nëmmen an dësen Nummräim sichen.", "apihelp-query+search-paramvalue-prop-wordcount": "Setzt d'Zuel vun de Wierder vun der Säit derbäi.", "apihelp-query+search-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun der leschter Ännerung vun der Säit derbäi.", + "apihelp-query+search-paramvalue-prop-score": "Ignoréiert.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignoréiert.", + "apihelp-query+templates-param-namespace": "Schablounen nëmmen an dësen Nummräim weisen.", "apihelp-query+transcludedin-paramvalue-prop-title": "Titel vun all Säit.", - "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.", + "apihelp-query+usercontribs-summary": "All Ännerunge vun engem Benotzer kréien.", "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun derÄnnerung derbäi.", "apihelp-query+usercontribs-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.", "apihelp-query+userinfo-param-prop": "Informatioune fir dranzesetzen:", @@ -155,10 +166,12 @@ "apihelp-query+watchlist-paramvalue-type-new": "Ugeluecht Säiten.", "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.", "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen", - "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.", + "apihelp-revisiondelete-summary": "Versioune läschen a restauréieren.", "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.", + "apihelp-rollback-summary": "Déi lescht Ännerung vun der Säit zrécksetzen.", "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren", - "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren", + "apihelp-setpagelanguage-summary": "D'Sprooch vun enger Säit änneren", + "apihelp-setpagelanguage-extended-description-disabled": "Aschalten\n[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] fir dëse Aktioun ze benotzen", "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.", "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der Main Page op baskesch.", "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.", @@ -166,7 +179,7 @@ "apihelp-stashedit-param-text": "Inhalt vun der Säit", "apihelp-stashedit-param-summary": "Resumé änneren", "apihelp-tag-param-reason": "Grond fir d'Ännerung.", - "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.", + "apihelp-unblock-summary": "D'Spär vun engem Benotzer ophiewen.", "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen", "apihelp-undelete-param-reason": "Grond fir ze restauréieren.", "apihelp-undelete-example-page": "Main Page restauréieren.", @@ -178,6 +191,8 @@ "apihelp-validatepassword-param-password": "Passwuert fir ze validéieren.", "apihelp-validatepassword-example-1": "Validéiert d'Passwuert foobar fir den aktuelle Benotzer.", "apihelp-watch-example-watch": "D'Säit Main Page iwwerwaachen.", + "api-login-fail-badsessionprovider": "Net méiglech sech anzelogge mat $1.", + "api-help-undocumented-module": "Keng Dokumentatioun fir de Modul $1.", "api-help-source": "Quell: $1", "api-help-source-unknown": "Quell: onbekannt", "api-help-license": "Lizenz: [[$1|$2]]", @@ -201,6 +216,7 @@ "apierror-invalidcategory": "Den Numm vun der Kategorie deen Dir aginn hutt ass net valabel.", "apierror-invalidtitle": "Schlechten Titel \"$1\".", "apierror-invaliduserid": "Benotzer ID $1 ass net valabel.", + "apierror-missingrev-title": "Keng aktuell Versioun vum Titel $1.", "apierror-missingtitle": "D'Säit déi Dir spezifizéiert hutt gëtt et net.", "apierror-missingtitle-byname": "D'Säit $1 gëtt et net.", "apierror-moduledisabled": "De(n) $1 Modul gouf ausgeschalt.", @@ -216,9 +232,11 @@ "apierror-permissiondenied-generic": "Autorisatioun refuséiert.", "apierror-permissiondenied-unblock": "Dir hutt net d'Recht fir d'Spär vu Benotzer opzehiewen.", "apierror-readonly": "D'Wiki kann elo just geliest ginn.", + "apierror-revisions-badid": "Fir de Parameter $1 gouf keng Versioun fonnt.", "apierror-revwrongpage": "r$1 ass keng Versioun vu(n) $2.", "apierror-stashwrongowner": "Falsche Besëtzer: $1", "apierror-systemblocked": "Dir gouft automatesch vu MediaWiki gespaart.", + "apierror-timeout": "De Server huet net bannen där Zäit geäntwert déi virgesinn ass.", "apierror-unknownerror-editpage": "Onbekannten EditPage-Feeler: $1", "apierror-unknownerror-nocode": "Onbekannte Feeler.", "apierror-unknownerror": "Onbekannte Feeler: \"$1\".", diff --git a/includes/api/i18n/lij.json b/includes/api/i18n/lij.json index 45680f4ba3..cb902b3311 100644 --- a/includes/api/i18n/lij.json +++ b/includes/api/i18n/lij.json @@ -10,7 +10,7 @@ "apihelp-main-param-requestid": "Tutti i valoî fornii saian incruxi inta risposta. Porieivan ese doeuviæ pe distingue e receste.", "apihelp-main-param-servedby": "Inciodi into risultou o nomme de l'host ch'o l'ha servio a recesta.", "apihelp-main-param-curtimestamp": "Inciodi into risultou o timestamp attoâ.", - "apihelp-block-description": "Blocca un utente.", + "apihelp-block-summary": "Blocca un utente.", "apihelp-block-param-user": "Nomme utente, adresso IP o range di IP da bloccâ.", "apihelp-block-param-expiry": "Tempo de scadença. O poeu ese relativo (presempio, 5 months o 2 weeks) ò assoluo (presempio 2014-09-18T12:34:56Z). Se impostou a infinite, indefinite ò never, o blòcco o no descaziâ mai.", "apihelp-block-param-reason": "Raxon do blòcco.", @@ -22,19 +22,20 @@ "apihelp-block-param-watchuser": "Oserva a paggina utente e e paggine de discuscion utente de l'utente ò de l'adresso IP.", "apihelp-block-example-ip-simple": "Blocca l'adresso IP 192.0.2.5 pe trei giorni con motivaçion First strike.", "apihelp-block-example-user-complex": "Blocca l'utente Vandal a tempo indeterminou con motivaçion Vandalism, e impediscighe a creaçion de noeuve utençe e l'invio de e-mail.", - "apihelp-changeauthenticationdata-description": "Modificâ i dæti d'aotenticaçion pe l'utente corente.", + "apihelp-changeauthenticationdata-summary": "Modificâ i dæti d'aotenticaçion pe l'utente corente.", "apihelp-changeauthenticationdata-example-password": "Tentativo de modificâ a password de l'utente corente a ExamplePassword.", - "apihelp-checktoken-description": "Veifica a validitæ de 'n token da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Veifica a validitæ de 'n token da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo de token in corso de test.", "apihelp-checktoken-param-token": "Token da testâ.", "apihelp-checktoken-param-maxtokenage": "Mascima etæ consentia pe-o token, in segondi.", "apihelp-checktoken-example-simple": "Veifica a validitæ de 'n token csrf.", - "apihelp-clearhasmsg-description": "Scassa o flag hasmsg pe l'utente corente.", + "apihelp-clearhasmsg-summary": "Scassa o flag hasmsg pe l'utente corente.", "apihelp-clearhasmsg-example-1": "Scassa o flag hasmsg pe l'utente corente.", - "apihelp-clientlogin-description": "Accedi a-o wiki doeuviando o flusso interattivo.", + "apihelp-clientlogin-summary": "Accedi a-o wiki doeuviando o flusso interattivo.", "apihelp-clientlogin-example-login": "Avvia o processo d'accesso a-a wiki comme utente Example con password ExamplePassword.", "apihelp-clientlogin-example-login2": "Continnoa l'accesso doppo una risposta de l'UI pe l'aotenticaçion a doî fattoî, fornindo un OATHToken de 987654.", - "apihelp-compare-description": "Otegni e differençe tra 2 paggine.\n\nUn nummero de revixon, o tittolo de 'na paggina, ò un ID de paggina o dev'ese indicou segge pe-o \"da\" che pe-o \"a\".", + "apihelp-compare-summary": "Otegni e differençe tra 2 paggine.", + "apihelp-compare-extended-description": "Un nummero de revixon, o tittolo de 'na paggina, ò un ID de paggina o dev'ese indicou segge pe-o \"da\" che pe-o \"a\".", "apihelp-compare-param-fromtitle": "Primmo tittolo da confrontâ.", "apihelp-compare-param-fromid": "Primo ID de paggina da confrontâ.", "apihelp-compare-param-fromrev": "Primma revixon da confrontâ.", @@ -42,7 +43,7 @@ "apihelp-compare-param-toid": "Segondo ID de paggina da confrontâ.", "apihelp-compare-param-torev": "Segonda revixon da confrontâ.", "apihelp-compare-example-1": "Crea un diff tra revixon 1 e revixon 2.", - "apihelp-createaccount-description": "Crea una noeuva utença.", + "apihelp-createaccount-summary": "Crea una noeuva utença.", "apihelp-createaccount-param-preservestate": "Se [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] o l'ha restituto true pe hasprimarypreservedstate, e receste contrssegnæ comme primary-required dovieivan ese omisse. Se invece o l'ha restituio un valô non voeuo pe preservedusername, quello nomme utente o dev'ese doeuviou pe-o parammetro username.", "apihelp-createaccount-example-create": "Avvia o processo de creaçion d'utente Example con password ExamplePassword.", "apihelp-createaccount-param-name": "Nomme utente", @@ -55,7 +56,7 @@ "apihelp-createaccount-param-language": "Codiçe de lengua da impostâ comme predefinia pe l'utente (opçionâ, pe difetto a l'è a lengua do contegnuo).", "apihelp-createaccount-example-pass": "Crea l'utente testuser con password test123.", "apihelp-createaccount-example-mail": "Crea l'utente testmailuser e mandighe via e-mail una password generâ abrettio.", - "apihelp-delete-description": "Scassa 'na paggina", + "apihelp-delete-summary": "Scassa 'na paggina", "apihelp-delete-param-title": "Tittolo da paggina che se dexîa eliminâ. O no poeu vese doeuviou insemme a $1pageid.", "apihelp-delete-param-pageid": "ID de paggina da paggina da scassâ. O no poeu vese doeuviou insemme con $1title.", "apihelp-delete-param-reason": "Raxon da scassatua. S'a no saiâ indicâ, saiâ doeuviou 'na raxon generâ aotomaticamente.", @@ -64,8 +65,8 @@ "apihelp-delete-param-oldimage": "O nomme da vegia inmaggine da scassâ, comme fornia da [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Scassa Main Page.", "apihelp-delete-example-reason": "Scassa a Main Page con motivaçion Preparing for move.", - "apihelp-disabled-description": "Questo modulo o l'è stæto disabilitou.", - "apihelp-edit-description": "Crea e modifica paggine.", + "apihelp-disabled-summary": "Questo modulo o l'è stæto disabilitou.", + "apihelp-edit-summary": "Crea e modifica paggine.", "apihelp-edit-param-title": "Tittolo da paggina da modificâ. O no poeu vese doeuviou insemme a $1pageid.", "apihelp-edit-param-pageid": "ID de paggina da paggina da modificâ. O no poeu ese doeuviou insemme a $1title.", "apihelp-edit-param-section": "Nummero de seçion. 0 pe-a seçion de d'ato, new pe 'na noeuva seçion.", @@ -85,13 +86,13 @@ "apihelp-edit-param-token": "O token o dev'ese delongo inviou comme urtimo parammetro, ò aomeno doppo o parametro $1text.", "apihelp-edit-example-edit": "Modiffica 'na paggina.", "apihelp-edit-example-prepend": "Antepon-i __NOTOC__ a 'na paggina.", - "apihelp-emailuser-description": "Manda 'n'e-mail a 'n utente.", + "apihelp-emailuser-summary": "Manda 'n'e-mail a 'n utente.", "apihelp-emailuser-param-target": "Utente a chi inviâ l'e-mail.", "apihelp-emailuser-param-subject": "Ogetto de l'e-mail.", "apihelp-emailuser-param-text": "Testo de l'e-mail.", "apihelp-emailuser-param-ccme": "Mandime una copia de questa mail.", "apihelp-emailuser-example-email": "Manda un'e-mail a l'utente WikiSysop co-o testo Content.", - "apihelp-expandtemplates-description": "Espandi tutti i template into wikitesto.", + "apihelp-expandtemplates-summary": "Espandi tutti i template into wikitesto.", "apihelp-expandtemplates-param-title": "Tittolo da paggina.", "apihelp-expandtemplates-param-text": "Wikitesto da convertî.", "apihelp-expandtemplates-param-prop": "Quæ informaçion otegnî.\n\nNotta che se no l'è seleçionou arcun valô, o risultou o contegniâ o codiçe wiki, ma l'output o saiâ inte 'n formato obsoleto.", @@ -124,18 +125,18 @@ "apihelp-feedwatchlist-param-hours": "Elenca e paggine modificæ inte quest'urtime oe.", "apihelp-feedwatchlist-param-linktosections": "Collega direttamente a-e seçioin modificæ, se poscibbile.", "apihelp-feedwatchlist-example-all6hrs": "Mostra tutte e modiffiche a-e pagine oservæ inti urtime 6 oe.", - "apihelp-filerevert-description": "Ripristina un file a 'na verscion precedente.", + "apihelp-filerevert-summary": "Ripristina un file a 'na verscion precedente.", "apihelp-filerevert-param-filename": "Nomme do file de destinaçion, sença o prefisso 'File:'.", "apihelp-filerevert-param-comment": "Commento in sciô caregamento.", "apihelp-filerevert-param-archivename": "Nomme de l'archivvio da verscion da ripristinâ.", "apihelp-filerevert-example-revert": "Ripristina Wiki.png a-a verscion do 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Mostra a guidda pe-i modduli speçificæ.", + "apihelp-help-summary": "Mostra a guidda pe-i modduli speçificæ.", "apihelp-help-param-toc": "Inciodi un endexo inte l'output HTML.", "apihelp-help-example-main": "Agiutto pe-o moddulo prinçipâ.", "apihelp-help-example-submodules": "Agiutto pe action=query e tutti i so sotto-modduli.", "apihelp-help-example-recursive": "Tutti i agiutti inte 'na paggina.", "apihelp-help-example-help": "Agiutto pe-o moddulo d'agiutto mæximo.", - "apihelp-imagerotate-description": "Roeua un-a o ciù inmaggine.", + "apihelp-imagerotate-summary": "Roeua un-a o ciù inmaggine.", "apihelp-imagerotate-param-rotation": "Graddi de rotaçion de l'inmaggine in senso oaio.", "apihelp-imagerotate-example-simple": "Roeua File:Example.png de 90 graddi.", "apihelp-imagerotate-example-generator": "Roeua tutte e inmaggine in Category:Flip de 180 graddi.", @@ -148,18 +149,19 @@ "apihelp-import-param-namespace": "Importa inte questo namespace. O no poeu ese doeuviou insemme a $1rootpage.", "apihelp-import-param-rootpage": "Importa comme sottopaggina de questa paggina. O no poeu ese doeuviou insemme a $1namespace.", "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] into namespace 100 con cronologia completa.", - "apihelp-linkaccount-description": "Conligamento de 'n'utença de 'n provider de terçe parte a l'utente corente.", + "apihelp-linkaccount-summary": "Conligamento de 'n'utença de 'n provider de terçe parte a l'utente corente.", "apihelp-linkaccount-example-link": "Avvia o processo de collegamento a 'n'utença da Example.", - "apihelp-login-description": "Accedi e otegni i cookie d'aotenticaçion.\n\nQuest'açion dev'ese doeuviâ escluxivamente in combinaçion con [[Special:BotPasswords]]; doeuviâla pe l'accesso a l'account prinçipâ o l'è deprecou e o poeu fallî sença preaviso. Pe acedere in moddo seguo a l'utença prinçipâ, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Accedi e otegni i cookies d'aotenticaçion.\n\nQuest'açion a l'è deprecâ e a poeu fallî sença preaviso. Pe acede in moddo seguo, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Accedi e otegni i cookie d'aotenticaçion.", + "apihelp-login-extended-description": "Quest'açion dev'ese doeuviâ escluxivamente in combinaçion con [[Special:BotPasswords]]; doeuviâla pe l'accesso a l'account prinçipâ o l'è deprecou e o poeu fallî sença preaviso. Pe acedere in moddo seguo a l'utença prinçipâ, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Quest'açion a l'è deprecâ e a poeu fallî sença preaviso. Pe acede in moddo seguo, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nomme utente.", "apihelp-login-param-password": "Password.", "apihelp-login-param-domain": "Dominnio (opçionâ).", "apihelp-login-example-gettoken": "Recuppera un token de login.", "apihelp-login-example-login": "Intra", - "apihelp-logout-description": "Sciorti e scassa i dæti da sescion.", + "apihelp-logout-summary": "Sciorti e scassa i dæti da sescion.", "apihelp-logout-example-logout": "Disconnetti l'utente attoale.", - "apihelp-mergehistory-description": "O l'unisce e cronologie de paggine.", + "apihelp-mergehistory-summary": "O l'unisce e cronologie de paggine.", "apihelp-mergehistory-param-from": "O tittolo da paggina da-a quæ a cronologia a saiâ unia. O no poeu ese doeuviou insemme a $1fromid.", "apihelp-mergehistory-param-fromid": "L'ID da paggina da-a quæ a cronologia a saiâ unia. O no poeu ese doeuviou insemme a $1from.", "apihelp-mergehistory-param-to": "O tittolo da paggina inta quæ a cronologia a saiâ unia. O no poeu ese doeuviou insemme a $1toid.", @@ -168,7 +170,7 @@ "apihelp-mergehistory-param-reason": "Raxon pe l'union da cronologia.", "apihelp-mergehistory-example-merge": "Unisci l'intrega cronologia de Oldpage inte Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Unisci e verscioin da paggina Oldpage scin a 2015-12-31T04:37:41Z inte Newpage.", - "apihelp-move-description": "Mescia 'na paggina", + "apihelp-move-summary": "Mescia 'na paggina", "apihelp-move-param-from": "Tittolo da paggina da rinominâ. O no poeu vese doeuviou insemme a $1pageid.", "apihelp-move-param-fromid": "ID de paggina da paggina da rinominâ. O no poeu ese doeuviou insemme a $1title.", "apihelp-move-param-to": "Tittolo a-o quæ mesciâ a paggina.", @@ -186,14 +188,14 @@ "apihelp-opensearch-param-format": "O formato de l'output.", "apihelp-opensearch-example-te": "Troeuva e paggine che començan con Te.", "apihelp-options-example-reset": "Reimposta tutte e preferençe.", - "apihelp-paraminfo-description": "Otegni de informaçioin in scî modduli API.", + "apihelp-paraminfo-summary": "Otegni de informaçioin in scî modduli API.", "apihelp-paraminfo-param-helpformat": "Formato de stringhe d'agiutto.", "apihelp-parse-param-summary": "Ogetto da analizâ.", "apihelp-query+allcategories-param-prop": "Quæ propietæ otegnî:", "apihelp-query+allcategories-paramvalue-prop-size": "Azonzi o nummero de paggine inta categoria.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Etichetta e categorie che son ascose con __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Elenca e categorie con de informaçioin in sciô numero de paggine in ciascun-a.", - "apihelp-query+alldeletedrevisions-description": "Elenca tutte e verscioin scassæ da 'n utente ò inte 'n namespace.", + "apihelp-query+alldeletedrevisions-summary": "Elenca tutte e verscioin scassæ da 'n utente ò inte 'n namespace.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "O poeu ese doeuviou solo con $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "O no poeu ese doeuviou con $3user.", "apihelp-query+alldeletedrevisions-param-start": "O timestamp da-o quæ començâ l'elenco.", diff --git a/includes/api/i18n/lki.json b/includes/api/i18n/lki.json index aa115b7b1c..f16f76f0c1 100644 --- a/includes/api/i18n/lki.json +++ b/includes/api/i18n/lki.json @@ -8,12 +8,12 @@ }, "apihelp-main-param-action": "کام عملیات انجؤم بِ.", "apihelp-main-param-format": "فرمت خروجی", - "apihelp-block-description": "بستن کاربر.", + "apihelp-block-summary": "بستن کاربر.", "apihelp-createaccount-param-name": "نۆم کاربەری:", - "apihelp-delete-description": "حةذف وةڵگة", + "apihelp-delete-summary": "حةذف وةڵگة", "apihelp-delete-example-simple": "حذف Main Page.", - "apihelp-disabled-description": "اێ پودمانە إکار کەتێە(غیرفعال بیە).", - "apihelp-edit-description": "دؤرس کردن و دۀسکاری وۀلگۀ", + "apihelp-disabled-summary": "اێ پودمانە إکار کەتێە(غیرفعال بیە).", + "apihelp-edit-summary": "دؤرس کردن و دۀسکاری وۀلگۀ", "apihelp-edit-param-sectiontitle": "نام سۀر وۀلگ تازۀ", "apihelp-edit-example-edit": ".دةسکاری وةڵگة", "apihelp-emailuser-param-subject": "موضوع سةر وةڵگ", @@ -22,7 +22,7 @@ "apihelp-login-param-name": "نام کاربری", "apihelp-login-param-password": ".رمز", "apihelp-login-example-login": "إنۆم هەتِن.", - "apihelp-logout-description": "دۀرچئن و پاک کردن داده متن", + "apihelp-logout-summary": "دۀرچئن و پاک کردن داده متن", "apihelp-logout-example-logout": "خروج کاربر فعلی", "apihelp-options-example-reset": "بازنشانی همه تنظیمات." } diff --git a/includes/api/i18n/lt.json b/includes/api/i18n/lt.json index 0935c59ce7..2726944c91 100644 --- a/includes/api/i18n/lt.json +++ b/includes/api/i18n/lt.json @@ -7,24 +7,25 @@ }, "apihelp-main-param-action": "Kurį veiksmą atlikti.", "apihelp-main-param-curtimestamp": "Prie rezultato pridėti dabartinę laiko žymę.", - "apihelp-block-description": "Blokuoti vartotoją.", + "apihelp-block-summary": "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-compare-param-prop": "Kokią informaciją gauti.", + "apihelp-createaccount-summary": "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-summary": "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 Main Page.", "apihelp-delete-example-reason": "Ištrinti Main Page su priežastimi Preparing for move.", - "apihelp-disabled-description": "Šis modulis buvo išjungtas.", - "apihelp-edit-description": "Kurti ir redaguoti puslapius.", + "apihelp-disabled-summary": "Šis modulis buvo išjungtas.", + "apihelp-edit-summary": "Kurti ir redaguoti puslapius.", "apihelp-edit-param-title": "Redaguotino puslapio pavadinimas. Negali būti naudojamas kartu su $1pageid.", "apihelp-edit-param-pageid": "Redaguotino puslapio ID. Negali būti naudojamas kartu su $1title.", "apihelp-edit-param-section": "Sekcijos numeris. 0 - viršutinei sekcijai, new - naujai sekcijai.", @@ -41,13 +42,13 @@ "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-summary": "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 WikiSysop su tekstu Content.", "apihelp-expandtemplates-param-title": "Puslapio pavadinimas.", - "apihelp-feedcontributions-description": "Gražina vartotojo įnašų srautą.", + "apihelp-feedcontributions-summary": "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).", @@ -58,7 +59,7 @@ "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 Example.", - "apihelp-feedrecentchanges-description": "Gražina naujausių pakeitimų srautą.", + "apihelp-feedrecentchanges-summary": "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.", @@ -75,16 +76,16 @@ "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-summary": "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-summary": "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-summary": "Pasukti viena ar daugiau paveikslėlių.", "apihelp-imagerotate-param-rotation": "Kiek laipsnių pasukti paveikslėlį pagal laikrodžio rodyklę.", "apihelp-imagerotate-example-simple": "Pasukti File:Example.png 90 laipsnių.", "apihelp-imagerotate-example-generator": "Pasukti visus paveikslėlius Category:Flip 180 laipsnių.", @@ -93,15 +94,15 @@ "apihelp-login-param-password": "Slaptažodis.", "apihelp-login-param-domain": "Domenas (neprivaloma).", "apihelp-login-example-login": "Prisijungti.", - "apihelp-logout-description": "Atsijungti ir išvalyti sesijos duomenis.", + "apihelp-logout-summary": "Atsijungti ir išvalyti sesijos duomenis.", "apihelp-logout-example-logout": "Atjungti dabartinė vartotoją.", "apihelp-managetags-example-delete": "Ištrinti vandlaism žymę su priežastimi Misspelt", "apihelp-managetags-example-activate": "Aktyvuoti žymę pavadinimu spam su priežastimi For use in edit patrolling", "apihelp-managetags-example-deactivate": "Išjungti žymę pavadinimu spam su priežastimi No longer required", - "apihelp-mergehistory-description": "Sujungti puslapio istorijas.", + "apihelp-mergehistory-summary": "Sujungti puslapio istorijas.", "apihelp-mergehistory-param-reason": "Istorijos sujungimo priežastis.", "apihelp-mergehistory-example-merge": "Sujungti visą Oldpage istoriją į Newpage.", - "apihelp-move-description": "Perkelti puslapį.", + "apihelp-move-summary": "Perkelti puslapį.", "apihelp-move-param-to": "Pavadinimas, į kuri pervadinamas puslapis.", "apihelp-move-param-reason": "Pervadinimo priežastis.", "apihelp-move-param-movetalk": "Pervadinti aptarimo puslapį, jei jis egzistuoja.", @@ -110,13 +111,13 @@ "apihelp-move-param-unwatch": "Pašalinti puslapį ir nukreipimą iš dabartinio vartotojo stebimųjų sąrašo.", "apihelp-move-param-ignorewarnings": "Ignuoruoti bet kokius įspėjimus.", "apihelp-move-example-move": "Perkelti Badtitle į Goodtitle nepaliekant nukreipimo.", - "apihelp-opensearch-description": "Ieškoti viki naudojant OpenSearch protokolą.", + "apihelp-opensearch-summary": "Ieškoti viki naudojant OpenSearch protokolą.", "apihelp-opensearch-param-limit": "Maksimalus grąžinamas rezultatų skaičius.", "apihelp-opensearch-example-te": "Rasti puslapius prasidedančius su Te.", "apihelp-options-example-reset": "Nustatyti visus pageidavimus iš naujo.", "apihelp-options-example-change": "Keisti skin ir hideminor pageidavimus.", "apihelp-options-example-complex": "Nustatyti visus pageidavimus iš naujo, tada nustatyti skin ir nickname.", - "apihelp-paraminfo-description": "Gauti informaciją apie API modulius.", + "apihelp-paraminfo-summary": "Gauti informaciją apie API modulius.", "apihelp-protect-example-protect": "Apsaugoti puslapį.", "apihelp-query-param-list": "Kurios sąrašus gauti.", "apihelp-query-param-meta": "Kokius metaduomenis gauti.", @@ -156,9 +157,9 @@ "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 Y.", - "apihelp-query+backlinks-description": "Rasti visus puslapius, kurie nukreipia į pateiktą puslapį.", + "apihelp-query+backlinks-summary": "Rasti visus puslapius, kurie nukreipia į pateiktą puslapį.", "apihelp-query+backlinks-example-simple": "Rodyti nuorodas Pagrindinis puslapis.", - "apihelp-query+blocks-description": "Nurodyti visus užblokuotus vartotojus ir IP adresus.", + "apihelp-query+blocks-summary": "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ą.", @@ -171,15 +172,15 @@ "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ų Alice ir Bob blokavimus.", - "apihelp-query+categories-description": "Nurodo visas kategorijas, kurioms priklauso puslapiai.", + "apihelp-query+categories-summary": "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 Albert Einstein.", "apihelp-query+categories-example-generator": "Gauti informaciją apie visas kategorijas, panaudotas Albert Einstein puslapyje.", - "apihelp-query+categoryinfo-description": "Gražina informaciją apie pateiktas kategorijas.", + "apihelp-query+categoryinfo-summary": "Gražina informaciją apie pateiktas kategorijas.", "apihelp-query+categoryinfo-example-simple": "Gauti informaciją apie Category:Foo ir Category:Bar.", - "apihelp-query+categorymembers-description": "Nurodyti visus puslapius pateiktoje kategorijoje.", + "apihelp-query+categorymembers-summary": "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", @@ -214,7 +215,7 @@ "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-summary": "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ą.", @@ -227,8 +228,8 @@ "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+imageusage-summary": "Rasti visus puslapius, kurie naudoja duotą paveikslėlio pavadinimą.", + "apihelp-query+info-summary": "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.", @@ -251,7 +252,7 @@ "apihelp-query+links-param-limit": "Kiek nuorodų grąžinti.", "apihelp-query+links-example-simple": "Gauti nuorodas iš puslapio Main Page", "apihelp-query+links-example-generator": "Gauti informaciją apie puslapių nuorodas puslapyje Main Page.", - "apihelp-query+linkshere-description": "Rasti visus puslapius, kurie nurodo į pateiktus puslapius.", + "apihelp-query+linkshere-summary": "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.", @@ -260,21 +261,21 @@ "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-summary": "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+transcludedin-paramvalue-prop-pageid": "Kiekvieno puslapio ID.", "apihelp-query+transcludedin-paramvalue-prop-title": "Kiekvieno puslapio pavadinimas.", "apihelp-query+transcludedin-param-limit": "Kiek gražinti.", - "apihelp-query+usercontribs-description": "Gauti visus vartotojo keitimus.", + "apihelp-query+usercontribs-summary": "Gauti visus vartotojo keitimus.", "apihelp-query+usercontribs-param-limit": "Maksimalus gražinamų įnašų skaičius.", "apihelp-query+usercontribs-paramvalue-prop-comment": "Prideda keitimo komentarą.", "apihelp-query+usercontribs-paramvalue-prop-size": "Prideda naują keitimo dydį.", "apihelp-query+userinfo-paramvalue-prop-realname": "Prideda vartotojo tikrą vardą.", "apihelp-query+userinfo-example-simple": "Gauti informacijos apie dabartinį vartotoją.", "apihelp-query+userinfo-example-data": "Gauti papildomos informacijos apie dabartinį vartotoją.", - "apihelp-query+users-description": "Gauti informacijos apie vartotojų sąrašą.", + "apihelp-query+users-summary": "Gauti informacijos apie vartotojų sąrašą.", "apihelp-query+users-param-prop": "Kokią informaciją įtraukti:", "apihelp-query+users-paramvalue-prop-blockinfo": "Pažymi ar vartotojas užblokuotas, kas tai padarė ir dėl kokios priežasties.", "apihelp-query+users-paramvalue-prop-groups": "Nurodo grupes, kurioms priklauso kiekvienas vartotojas.", @@ -304,14 +305,14 @@ "apihelp-query+watchlist-paramvalue-type-log": "Žurnalo įrašai.", "apihelp-resetpassword-param-user": "Iš naujo nustatomas vartotojas.", "apihelp-resetpassword-param-email": "Iš naujo nustatomo vartotojo el. pašto adresas.", - "apihelp-setpagelanguage-description": "Keisti puslapio kalbą.", + "apihelp-setpagelanguage-summary": "Keisti puslapio kalbą.", "apihelp-setpagelanguage-param-reason": "Keitimo priežastis.", "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.", "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.", "apihelp-stashedit-param-text": "Puslapio turinys.", "apihelp-stashedit-param-summary": "Keisti santrauką.", "apihelp-tag-param-reason": "Keitimo priežastis.", - "apihelp-unblock-description": "Atblokuoti naudotoją.", + "apihelp-unblock-summary": "Atblokuoti naudotoją.", "apihelp-unblock-param-reason": "Atblokavimo priežastis.", "apihelp-unblock-example-id": "Atblokuoti blokavimo ID #105.", "apihelp-unblock-example-user": "Atblokuoti vartoją Bob su priežastimi Sorry Bob.", @@ -324,13 +325,13 @@ "apihelp-upload-param-url": "URL, iš kurio gauti failą.", "apihelp-upload-example-url": "Įkelti iš URL.", "apihelp-upload-example-filekey": "Baigti įkėlimą, kuris nepavyko dėl įspėjimų.", - "apihelp-userrights-description": "Keisti vartotoju grupės narystę.", + "apihelp-userrights-summary": "Keisti vartotoju grupės narystę.", "apihelp-userrights-param-user": "Vartotojo vardas.", "apihelp-userrights-param-userid": "Vartotojo ID.", "apihelp-userrights-param-add": "Pridėti vartotoją į šias grupes.", "apihelp-userrights-param-remove": "Pašalinti vartotoją iš šių grupių.", "apihelp-userrights-param-reason": "Keitimo priežastis.", - "apihelp-watch-description": "Pridėti ar pašalinti puslapius iš dabartinio vartotojo stebimųjų sąrašo.", + "apihelp-watch-summary": "Pridėti ar pašalinti puslapius iš dabartinio vartotojo stebimųjų sąrašo.", "apihelp-watch-example-watch": "Stebėti puslapį Main Page.", "apihelp-watch-example-unwatch": "Nebestebėti puslapio Main Page.", "api-format-title": "MedijaViki API rezultatas", @@ -403,6 +404,7 @@ "apierror-sectionreplacefailed": "Nepavyko sujungti atnaujinto skyriaus.", "apierror-specialpage-cantexecute": "Neturite teisės peržiūrėti šio specialaus puslapio rezultatus.", "apierror-stashwrongowner": "Neteisingas savininkas: $1", + "apierror-timeout": "Serveris neatsakė per numatytą laiką.", "apierror-unknownerror-nocode": "Nežinoma klaida.", "apierror-unknownerror": "Nežinoma klaida: „$1“.", "apierror-unknownformat": "Neatpažintas formatas „$1“.", diff --git a/includes/api/i18n/lv.json b/includes/api/i18n/lv.json index 6c90a3e5cc..270025ce9e 100644 --- a/includes/api/i18n/lv.json +++ b/includes/api/i18n/lv.json @@ -5,10 +5,10 @@ "Silraks" ] }, - "apihelp-block-description": "Bloķēt lietotāju", + "apihelp-block-summary": "Bloķēt lietotāju", "apihelp-block-param-reason": "Bloķēšanas iemesls:", - "apihelp-delete-description": "Dzēst lapas", - "apihelp-emailuser-description": "Sūtīt e-pastu lietotājam", + "apihelp-delete-summary": "Dzēst lapas", + "apihelp-emailuser-summary": "Sūtīt e-pastu lietotājam", "apihelp-userrights-param-userid": "Lietotāja ID:", "apierror-nosuchuserid": "Nav lietotāja ar ID $1." } diff --git a/includes/api/i18n/mg.json b/includes/api/i18n/mg.json index 156cf25b3b..58d50788d6 100644 --- a/includes/api/i18n/mg.json +++ b/includes/api/i18n/mg.json @@ -4,7 +4,8 @@ "Jagwar" ] }, - "apihelp-main-description": "
    \n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Baogy & hataka]\n
    \nStatus: \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\nHataka diso: \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [https://www.mediawiki.org/wiki/API:Main_page Torohevitra be kokoa]\n* [https://www.mediawiki.org/wiki/API:FAQ Fanontaniana miverina matetika]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lisitry ny mailaka manaraka]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Filazana API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Baogy & hataka]\n
    \nStatus: \nTokony mandeha avokoa ny fitaovana aseho eto amin'ity pehy ity, na dia izany aza mbola am-panamboarana ny API ary mety hiova na oviana na oviana. Araho amin'ny alalan'ny fisoratana ny mailakao ao amin'ny [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce lisitra fampielezana] ny fiovana.\n\nHataka diso: \nRehefa alefa ao amin'i API ny hata, ho alefa miaraka amin'ny lakile \"MediaWiki-API-Error\" ny header HTTP ary samy homen-tsanda mitovy ny header ary ny kaodin-kadisoana. Ho an'ny torohay fanampiny dia jereo https://www.mediawiki.org/wiki/API:Errors_and_warnings.", "apihelp-main-param-action": "Inona ny zavatra ho atao.", "apihelp-main-param-format": "Format mivoaka", "apihelp-block-param-user": "Anaram-pikambana, adiresy IP na valan' IP hosakanana.", @@ -26,7 +27,7 @@ "apihelp-compare-param-toid": "ID pejy faharoa ampitahaina.", "apihelp-compare-param-torev": "Versiona faharoa ampitahaina.", "apihelp-compare-example-1": "Hamorona raki-pahasamihafan'ny versiona 1 sy 2.", - "apihelp-createaccount-description": "Hamorona kaontim-pikambana vaovao.", + "apihelp-createaccount-summary": "Hamorona kaontim-pikambana vaovao.", "apihelp-createaccount-param-name": "Anaram-pikambana.", "apihelp-createaccount-param-password": "Tenimiafina (tsy raharahiana raha voafaritra i $1mailpassword).", "apihelp-createaccount-param-domain": "Vala ho an'ilay famantarana avy any ivelany (azo tsy fenoina).", diff --git a/includes/api/i18n/mk.json b/includes/api/i18n/mk.json index 3045332f3b..1d248e24e5 100644 --- a/includes/api/i18n/mk.json +++ b/includes/api/i18n/mk.json @@ -5,7 +5,7 @@ "Macofe" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Документација]]\n* [[mw:API:FAQ|ЧПП]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n
    \nСтатус: Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\nПогрешни барања: Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Документација]]\n* [[mw:API:FAQ|ЧПП]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Извршникот]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Грешки и барања]\n
    \nСтатус: Сите ставки на страницава би требало да работат, но Извршникот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\nПогрешни барања: Кога Извршникот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на [[mw:API:Errors_and_warnings|Извршник: Грешки и предупредувања]].", "apihelp-main-param-action": "Кое дејство да се изврши.", "apihelp-main-param-format": "Формат на изводот.", "apihelp-main-param-maxlag": "Најголемиот допуштен заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код maxlag со порака од обликот Го чекам $host: има заостаток од $lag секунди.
    Погл. [[mw:Manual:Maxlag_parameter|Прирачник: Параметар Maxlag]]", @@ -17,7 +17,7 @@ "apihelp-main-param-curtimestamp": "Вклучи тековно време и време и датум во исходот.", "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како https://mk.wikipedia.org or https://meta.wikimedia.org. Ако овој параметар не се совпаѓа со заглавието Origin:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието Access-Control-Allow-Origin.", "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] со siprop=languages или укажете user за да го користите тековно зададениот јазик корисникот, или пак укажете content за да го користите јазикот на содржината на ова вики.", - "apihelp-block-description": "Блокирај корисник.", + "apihelp-block-summary": "Блокирај корисник.", "apihelp-block-param-user": "Корисничко име, IP-адреса или IP-опсег ако сакате да блокирате.", "apihelp-block-param-expiry": "Време на истек. Може да биде релативно (на пр. 5 months или „2 недели“) или пак апсолутно (на пр. 2014-09-18T12:34:56Z). Ако го зададете infinite, indefinite или never, блокот ќе трае засекогаш.", "apihelp-block-param-reason": "Причина за блокирање.", @@ -31,14 +31,15 @@ "apihelp-block-param-watchuser": "Набљудувај ја корисничката страница и страницата за разговор на овој корисник или IP-адреса", "apihelp-block-example-ip-simple": "Блокирај ја IP-адресата 192.0.2.5 три дена со причината Прва опомена.", "apihelp-block-example-user-complex": "Блокирај го корисникот Vandal (Вандал) бесконечно со причината Vandal (Вандализам) и оневозможи создавање на нови сметки и праќање е-пошта.", - "apihelp-checktoken-description": "Проверка на полноважноста на шифрата од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Проверка на полноважноста на шифрата од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Тип на шифра што се испробува.", "apihelp-checktoken-param-token": "Шифра што се испробува.", "apihelp-checktoken-param-maxtokenage": "Најголема допуштена старост на шифрата, во секунди.", "apihelp-checktoken-example-simple": "Испробај ја полноважноста на csrf-шифрата.", - "apihelp-clearhasmsg-description": "Ја отстранува ознаката „hasmsg“ од тековниот корисник.", + "apihelp-clearhasmsg-summary": "Ја отстранува ознаката „hasmsg“ од тековниот корисник.", "apihelp-clearhasmsg-example-1": "Отстрани ја ознаката „hasmsg“ од тековниот корисник", - "apihelp-compare-description": "Добивање на разлика помеѓу две страници.\n\nМора да се даде бројот на преработката, насловот на страницата или пак нејзина назнака за „од“ и за „на“.", + "apihelp-compare-summary": "Добивање на разлика помеѓу две страници.", + "apihelp-compare-extended-description": "Мора да се даде бројот на преработката, насловот на страницата или пак нејзина назнака за „од“ и за „на“.", "apihelp-compare-param-fromtitle": "Прв наслов за споредба.", "apihelp-compare-param-fromid": "Прва назнака на страница за споредба.", "apihelp-compare-param-fromrev": "Прва преработка за споредба.", @@ -46,7 +47,7 @@ "apihelp-compare-param-toid": "Втора назнака на страница за споредба.", "apihelp-compare-param-torev": "Бтора преработка за споредба.", "apihelp-compare-example-1": "Дај разлика помеѓу преработките 1 и 2", - "apihelp-createaccount-description": "Создај нова корисничка сметка.", + "apihelp-createaccount-summary": "Создај нова корисничка сметка.", "apihelp-createaccount-param-name": "Корисничко име.", "apihelp-createaccount-param-password": "Лозинка (се занемарува ако е зададено $1mailpassword).", "apihelp-createaccount-param-domain": "Домен за надворешна заверка (незадолжително).", @@ -58,7 +59,7 @@ "apihelp-createaccount-param-language": "Јазичен код кој ќе биде стандарден за корисникот (незадолжително, по основно: јазикот на самото вики).", "apihelp-createaccount-example-pass": "Создај го корисникот testuser со лозинката test123.", "apihelp-createaccount-example-mail": "Создај го корисникот testmailuser и испрати случајно-создадена лозинка по е-пошта.", - "apihelp-delete-description": "Избриши страница.", + "apihelp-delete-summary": "Избриши страница.", "apihelp-delete-param-title": "Наслов на страницата што сакате да ја избришете. Не може да се користи заедно со $1pageid.", "apihelp-delete-param-pageid": "Назнака на страницата што сакате да ја избришете. Не може да се користи заедно со $1title.", "apihelp-delete-param-reason": "Причина за бришење. Ако не се зададе, ќе се наведе автоматска причина.", @@ -68,8 +69,8 @@ "apihelp-delete-param-oldimage": "Името на страта слика за бришење според добиеното од [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Избриши ја Main Page.", "apihelp-delete-example-reason": "Избриши ја Main Page со причината Preparing for move.", - "apihelp-disabled-description": "Модулот е деактивиран.", - "apihelp-edit-description": "Создај или уреди страници.", + "apihelp-disabled-summary": "Модулот е деактивиран.", + "apihelp-edit-summary": "Создај или уреди страници.", "apihelp-edit-param-title": "Наслов на страницата што сакате да ја уредите. Не може да се користи заедно со $1pageid.", "apihelp-edit-param-pageid": "Назнака на страницата што сакате да ја уредите. Не може да се користи заедно со $1title.", "apihelp-edit-param-section": "Број на поднасловот. 0 за првиот, new за нов.", @@ -100,13 +101,13 @@ "apihelp-edit-example-edit": "Уреди страница", "apihelp-edit-example-prepend": "Стави __NOTOC__ пред страницата", "apihelp-edit-example-undo": "Отповикај ги преработките од 13579 до 13585 со автоматски опис", - "apihelp-emailuser-description": "Испрати е-пошта на корисник.", + "apihelp-emailuser-summary": "Испрати е-пошта на корисник.", "apihelp-emailuser-param-target": "На кој корисник да му се испрати е-поштата.", "apihelp-emailuser-param-subject": "Наслов.", "apihelp-emailuser-param-text": "Содржина.", "apihelp-emailuser-param-ccme": "Прати ми примерок и мене.", "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот WikiSysop со текстот Content.", - "apihelp-expandtemplates-description": "Ги проширува сите шаблони во викитекст.", + "apihelp-expandtemplates-summary": "Ги проширува сите шаблони во викитекст.", "apihelp-expandtemplates-param-title": "Наслов на страница.", "apihelp-expandtemplates-param-text": "Викитекст за претворање.", "apihelp-expandtemplates-param-revid": "Назнака на преработката, за {{REVISIONID}} и слични променливи.", @@ -115,7 +116,7 @@ "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.", "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Прошири го викитекстот {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Дава канал со придонеси на корисник.", + "apihelp-feedcontributions-summary": "Дава канал со придонеси на корисник.", "apihelp-feedcontributions-param-feedformat": "Формат на каналот.", "apihelp-feedcontributions-param-user": "За кои корисници да се прикажуваат придонесите.", "apihelp-feedcontributions-param-namespace": "По кој именски простор да се филтрираат придонесите:", @@ -128,7 +129,7 @@ "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.", "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.", "apihelp-feedcontributions-example-simple": "Покажувај придонеси на Пример.", - "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.", + "apihelp-feedrecentchanges-summary": "Дава канал со скорешни промени.", "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.", "apihelp-feedrecentchanges-param-namespace": "На кој именски простор да се ограничи исходот.", "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.", @@ -150,18 +151,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.", "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени", "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена", - "apihelp-feedwatchlist-description": "Дава канал од набљудуваните.", + "apihelp-feedwatchlist-summary": "Дава канал од набљудуваните.", "apihelp-feedwatchlist-param-feedformat": "Форматот на каналот.", "apihelp-feedwatchlist-param-hours": "Испиши страници изменети во рок од олку часови отсега.", "apihelp-feedwatchlist-param-linktosections": "Давај ме право на изменетите делови, ако е можно.", "apihelp-feedwatchlist-example-default": "Прикажи го каналот од набљудуваните.", "apihelp-feedwatchlist-example-all6hrs": "Прикажи ги сите промени во набљудуваните во последните 6 часа", - "apihelp-filerevert-description": "Врати податотека на претходна верзија.", + "apihelp-filerevert-summary": "Врати податотека на претходна верзија.", "apihelp-filerevert-param-filename": "Име на целната податотека, без претставката „Податотека:“.", "apihelp-filerevert-param-comment": "Коментар за подигањето.", "apihelp-filerevert-param-archivename": "Архивски назив на преработката што ја повраќате.", "apihelp-filerevert-example-revert": "Врати ја Wiki.png на верзијата од 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Прикажувај помош за укажаните модули.", + "apihelp-help-summary": "Прикажувај помош за укажаните модули.", "apihelp-help-param-modules": "Модули за приказ на помош за (вредности на параметрите action и format, или пак main). Може да се укажат подмодули со +.", "apihelp-help-param-submodules": "Прикажувај и помош за подмодули на именуваниот модул.", "apihelp-help-param-recursivesubmodules": "Прикажувај и помош за подмодули рекурзивно.", @@ -173,12 +174,13 @@ "apihelp-help-example-recursive": "Сета помош на една страница", "apihelp-help-example-help": "Помош за самиот помошен модул", "apihelp-help-example-query": "Помош за два подмодула за барања", - "apihelp-imagerotate-description": "Сврти една или повеќе слики.", + "apihelp-imagerotate-summary": "Сврти една или повеќе слики.", "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.", "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.", "apihelp-imagerotate-example-simple": "Сврти ја Податотека:Пример.png за 90 степени.", "apihelp-imagerotate-example-generator": "Сврти ги сите слики во Категорија:Некоја за 180 степени.", - "apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот xml.", + "apihelp-import-summary": "Увези страница од друго вики или од XML-податотека.", + "apihelp-import-extended-description": "Имајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот xml.", "apihelp-import-param-summary": "Опис на увозот на дневнички запис.", "apihelp-import-param-xml": "Подигната XML-податотека.", "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.", @@ -188,16 +190,17 @@ "apihelp-import-param-namespace": "Увези во овој именски простор. Не може да се користи заедно со $1rootpage.", "apihelp-import-param-rootpage": "Увези како потстраница на страницава. Не може да се користи заедно со $1namespace.", "apihelp-import-example-import": "Увези [[meta:Help:ParserFunctions]] во именскиот простор 100 со целата историја.", - "apihelp-login-description": "Најавете се и добијте колачиња за заверка.\n\nВо случај кога ќе се најавите успешно, потребните колачиња ќе се придодадат кон заглавијата на HTTP-одѕивот. Во случај да не успеете да се најавите, понатамошните обиди може да се ограничат за да се ограничат нападите со автоматизирано погодување на лозинката.", + "apihelp-login-summary": "Најавете се и добијте колачиња за заверка.", + "apihelp-login-extended-description": "Во случај кога ќе се најавите успешно, потребните колачиња ќе се придодадат кон заглавијата на HTTP-одѕивот. Во случај да не успеете да се најавите, понатамошните обиди може да се ограничат за да се ограничат нападите со автоматизирано погодување на лозинката.", "apihelp-login-param-name": "Корисничко име.", "apihelp-login-param-password": "Лозинка.", "apihelp-login-param-domain": "Домен (незадолжително).", "apihelp-login-param-token": "Најавна шифра добиена со првото барање.", "apihelp-login-example-gettoken": "Набави најавна шифра.", "apihelp-login-example-login": "Најава", - "apihelp-logout-description": "Одјави се и исчисти ги податоците на седницата.", + "apihelp-logout-summary": "Одјави се и исчисти ги податоците на седницата.", "apihelp-logout-example-logout": "Одјави го тековниот корисник", - "apihelp-move-description": "Премести страница.", + "apihelp-move-summary": "Премести страница.", "apihelp-move-param-from": "Наслов на страницата што треба да се премести. Не може да се користи заедно со $1fromid.", "apihelp-move-param-fromid": "Назнака на страницата што треба да се премести. Не може да се користи заедно со $1from.", "apihelp-move-param-to": "Како да гласи новата страница.", @@ -210,7 +213,7 @@ "apihelp-move-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.", "apihelp-move-param-ignorewarnings": "Занемари предупредувања.", "apihelp-move-example-move": "Премести го Badtitle на Goodtitle, неоставајќи пренасочување", - "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.", + "apihelp-opensearch-summary": "Пребарување на викито со протоколот OpenSearch.", "apihelp-opensearch-param-search": "Низа за пребарување.", "apihelp-opensearch-param-limit": "Највеќе ставки за прикажување.", "apihelp-opensearch-param-namespace": "Именски простори за пребарување.", @@ -218,7 +221,8 @@ "apihelp-opensearch-param-redirects": "Како да се работи со пренасочувања:\n;return: Дај го самото пренасочување.\n;resolve: Дај ја целната страница. Може да даде помалку од $1limit ставки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.", "apihelp-opensearch-param-format": "Формат на изводот.", "apihelp-opensearch-example-te": "Најди страници што почнуваат со Те.", - "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката userjs- (предвиден за употреба од кориснички скрипти).", + "apihelp-options-summary": "Смени ги нагодувањата на тековниот корисник.", + "apihelp-options-extended-description": "Можат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката userjs- (предвиден за употреба од кориснички скрипти).", "apihelp-options-param-reset": "Ги враќа поставките по основно.", "apihelp-options-param-resetkinds": "Писок на типови можности за повраток кога е зададена можноста $1reset.", "apihelp-options-param-change": "Список на промени во форматот name=value (на пр. skin=vector). Вредностите не треба да содржат исправени црти. Ако не зададете вредност (дури ни знак за равенство), на пр., можност|другаможност|..., ќе биде зададена вредноста на можноста по основно.", @@ -227,7 +231,7 @@ "apihelp-options-example-reset": "Врати ги сите поставки по основно", "apihelp-options-example-change": "Смени ги поставките skinhideminor
    .", "apihelp-options-example-complex": "Врати ги сите нагодувања по основно, а потоа задај ги skin и nickname.", - "apihelp-paraminfo-description": "Набави информации за извршнички (API) модули.", + "apihelp-paraminfo-summary": "Набави информации за извршнички (API) модули.", "apihelp-paraminfo-param-modules": "Список на називи на модули (вредности на параметрите action и format, или пак main). Може да се укажат подмодули со +.", "apihelp-paraminfo-param-helpformat": "Формат на помошните низи.", "apihelp-paraminfo-param-querymodules": "Список на називи на модули за барања (вредност на параметарот prop, meta или list). Користете го $1modules=query+foo наместо $1querymodules=foo.", @@ -243,12 +247,12 @@ "apihelp-parse-example-text": "Расчлени викитекст.", "apihelp-parse-example-texttitle": "Расчлени страница, укажувајќи го насловот на страницата.", "apihelp-parse-example-summary": "Расчлени опис.", - "apihelp-patrol-description": "Испатролирај страница или преработка.", + "apihelp-patrol-summary": "Испатролирај страница или преработка.", "apihelp-patrol-param-rcid": "Назнака на спорешните промени за патролирање.", "apihelp-patrol-param-revid": "Назнака на преработката за патролирање.", "apihelp-patrol-example-rcid": "Испатролирај скорешна промена", "apihelp-patrol-example-revid": "Патролирај праработка", - "apihelp-protect-description": "Смени го степенот на заштита на страница.", + "apihelp-protect-summary": "Смени го степенот на заштита на страница.", "apihelp-protect-param-title": "Наслов на страница што се (од)заштитува. Не може да се користи заедно со $1pageid.", "apihelp-protect-param-pageid": "Назнака на страница што се (од)заштитува. Не може да се користи заедно со $1title.", "apihelp-protect-param-reason": "Причиина за (од)заштитување", @@ -257,7 +261,7 @@ "apihelp-purge-example-simple": "Превчитај ги Main Page и API.", "apihelp-query-param-list": "Кои списоци да се набават.", "apihelp-query-param-meta": "Кои метаподатоци да се набават.", - "apihelp-query+allcategories-description": "Наброј ги сите категории.", + "apihelp-query+allcategories-summary": "Наброј ги сите категории.", "apihelp-query+allcategories-param-from": "Од која категорија да почне набројувањето.", "apihelp-query+allcategories-param-to": "На која категорија да запре набројувањето.", "apihelp-query+allcategories-param-dir": "Насока на подредувањето.", @@ -268,7 +272,7 @@ "apihelp-query+allimages-example-B": "Прикажи список на податотеки што почнуваат со буквата B.", "apihelp-query+allimages-example-recent": "Прикажи список на неодамна подигнати податотеки сличен на [[Special:NewFiles]]", "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата T.", - "apihelp-query+alllinks-description": "Наброј ги сите врски што водат кон даден именски простор.", + "apihelp-query+alllinks-summary": "Наброј ги сите врски што водат кон даден именски простор.", "apihelp-query+alllinks-param-from": "Наслов на врската од која ќе почне набројувањето.", "apihelp-query+alllinks-param-to": "Наслов на врската на која ќе запре набројувањето.", "apihelp-query+alllinks-param-prefix": "Пребарај ги сите сврзани наслови што почнуваат со оваа вредност.", @@ -283,7 +287,7 @@ "apihelp-query+alllinks-example-unique": "Испиши единствени наслови со врски", "apihelp-query+alllinks-example-unique-generator": "Ги дава сите наслови со врски, означувајќи ги отсутните", "apihelp-query+alllinks-example-generator": "Дава страници што ги содржат врските", - "apihelp-query+allmessages-description": "Дава пораки од ова мрежно место.", + "apihelp-query+allmessages-summary": "Дава пораки од ова мрежно место.", "apihelp-query+allmessages-param-prop": "Кои својства да се дадат.", "apihelp-query+allmessages-param-filter": "Дај само пораки со називи што ја содржат оваа низа.", "apihelp-query+allmessages-param-customised": "Дај само пораки во оваа состојба на прилагоденост.", @@ -294,7 +298,7 @@ "apihelp-query+allmessages-param-prefix": "Дај пораки со оваа претставка.", "apihelp-query+allmessages-example-ipb": "Прикажи ги пораките што започнуваат со ipb-.", "apihelp-query+allmessages-example-de": "Прикажи ги пораките august and mainpage на германски.", - "apihelp-query+allpages-description": "Наброј ги сите страници последователно во даден именски простор.", + "apihelp-query+allpages-summary": "Наброј ги сите страници последователно во даден именски простор.", "apihelp-query+allpages-param-from": "Наслов на страницата од која ќе почне набројувањето.", "apihelp-query+allpages-param-to": "Наслов на страницата на која ќе запре набројувањето.", "apihelp-query+allpages-param-prefix": "Пребарај ги сите наслови на страници што почнуваат со оваа вредност.", @@ -305,7 +309,7 @@ "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.", "apihelp-query+backlinks-example-simple": "Прикажи врски до Main page.", "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до Main page.", - "apihelp-query+blocks-description": "Список на сите блокирани корисници и IP-адреси", + "apihelp-query+blocks-summary": "Список на сите блокирани корисници и IP-адреси", "apihelp-query+blocks-param-start": "Од кој датум и време да почне набројувањето.", "apihelp-query+blocks-param-end": "На кој датум и време да запре набројувањето.", "apihelp-query+blocks-param-ids": "Список на назнаки на блоковите за испис (незадолжително)", @@ -320,7 +324,7 @@ "apihelp-query+search-example-simple": "Побарај meaning.", "apihelp-query+search-example-text": "Побарај го meaning по текстовите.", "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на meaning.", - "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.", + "apihelp-query+siteinfo-summary": "Дај општи информации за мрежното место.", "apihelp-upload-param-filename": "Целно име на податотеката.", "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано $1text.", "apihelp-upload-param-text": "Првичен текст на страницата за нови податотеки.", @@ -345,30 +349,30 @@ "apihelp-userrights-param-reason": "Причина за промената.", "apihelp-userrights-example-user": "Додај го корисникот FooBot во групата bot и отстрани го од групите sysop и bureaucrat.", "apihelp-userrights-example-userid": "Додај го корисникот со назнака 123 во групата bot и отстрани го од групите sysop и bureaucrat.", - "apihelp-watch-description": "Додај или отстрани страници од набљудуваните на тековниот корисник.", + "apihelp-watch-summary": "Додај или отстрани страници од набљудуваните на тековниот корисник.", "apihelp-watch-param-title": "Страницата што се става во или отстранува од набљудуваните. Наместо ова, користете $1titles.", "apihelp-watch-param-unwatch": "Ако е зададено, страницата ќе биде отстранета од наместо ставена во набљуваните.", "apihelp-watch-example-watch": "Набљудувај ја страницата Главна страница.", "apihelp-watch-example-unwatch": "Отстрани ја страницата Главна страница од набљудуваните.", "apihelp-watch-example-generator": "Набљудувај ги првите неколку страници во главниот именски простор", "apihelp-format-example-generic": "Дај го исходот од барањето во $1-формат.", - "apihelp-json-description": "Давај го изводот во JSON-формат.", + "apihelp-json-summary": "Давај го изводот во JSON-формат.", "apihelp-json-param-callback": "Ако е укажано, го обвива изводот во даден повик на функција. За безбедност, ќе се ограничат сите податоци што се однесуваат на корисниците.", "apihelp-json-param-utf8": "Ако е укажано, ги шифрира највеќето (но не сите) не-ASCII знаци како UTF-8 наместо да ги заменува со хексадецимални изводни низи. Ова е стандардно кога formatversion не е 1.", "apihelp-json-param-ascii": "Ако е укажано, ги шифрира сите не-ASCII знаци како хексадецимални изводни низи. Ова е стандардно кога formatversion is 1.", "apihelp-json-param-formatversion": "Форматирање на изводот:\n;1:Назадно-складен формат (булови во XML-стил, клучеви * за содржински јазли и тн.).\n;2:Пробен современ формат. Поединостите може да се изменат!\n;најнов:Користење на најновиот формат (тековно 2), може да се смени без предупредување.", - "apihelp-jsonfm-description": "Давај го изводот во JSON-формат (подобрен испис во HTML).", - "apihelp-none-description": "Де давај извод.", - "apihelp-php-description": "Давај го изводот во серијализиран PHP-формат.", + "apihelp-jsonfm-summary": "Давај го изводот во JSON-формат (подобрен испис во HTML).", + "apihelp-none-summary": "Де давај извод.", + "apihelp-php-summary": "Давај го изводот во серијализиран PHP-формат.", "apihelp-php-param-formatversion": "Форматирање на изводот:\n;1:Назадно-складен формат (булови во XML-стил, клучеви * за содржински јазли и тн.).\n;2:Пробен современ формат. Поединостите може да се изменат!\n;најнов:Користење на најновиот формат (тековно 2), може да се смени без предупредување.", - "apihelp-phpfm-description": "Давај го изводот во серијализиран PHP-формат (подобрен испис во HTML).", - "apihelp-rawfm-description": "Давај го изводот со елементи за отстранување грешки во JSON-формат (подобрен испис во HTML).", - "apihelp-xml-description": "Давај го изводот во XML-формат.", + "apihelp-phpfm-summary": "Давај го изводот во серијализиран PHP-формат (подобрен испис во HTML).", + "apihelp-rawfm-summary": "Давај го изводот со елементи за отстранување грешки во JSON-формат (подобрен испис во HTML).", + "apihelp-xml-summary": "Давај го изводот во XML-формат.", "apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со .xsl.", "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.", - "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).", + "apihelp-xmlfm-summary": "Давај го изводот во XML-формат (подобрен испис во HTML).", "api-format-title": "Исход од Извршникот на МедијаВики", - "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот format за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте format=$2.\n\nПовеќе информации ќе најдете на [[mw:API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].", + "api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот format за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте format=$2.\n\nПовеќе информации ќе најдете на [[mw:Special:MyLanguage/API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].", "api-pageset-param-titles": "Список на наслови на кои ќе се работи", "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи", "api-pageset-param-revids": "Список на назнаки на преработки на кои ќе се работи", @@ -413,8 +417,8 @@ "api-help-param-default-empty": "По основно: (празно)", "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.", - "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].", - "api-help-param-limited-in-miser-mode": "Напомена: Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од $1limit исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.", + "api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Special:MyLanguage/Manual:$wgMiserMode|скржавиот режим]].", + "api-help-param-limited-in-miser-mode": "Напомена: Бидејќи сте во [[mw:Special:MyLanguage/Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од $1limit исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.", "api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.", "api-help-param-continue": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.", "api-help-param-no-description": "(нема опис)", @@ -422,6 +426,8 @@ "api-help-permissions": "{{PLURAL:$1|Дозвола|Дозволи}}:", "api-help-permissions-granted-to": "{{PLURAL:$1|Доделена на}: $2", "api-help-right-apihighlimits": "Уоптреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.", + "apierror-offline": "Не можев да продолжам поради проблем при поврзувањето со мрежата. Проверете дали сте поврзани со семрежјето и обидете се повторно.", + "apierror-timeout": "Опслужувачот не одговори во очекуваното време.", "api-credits-header": "Признанија", "api-credits": "Разработувачи на Извршникот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/mr.json b/includes/api/i18n/mr.json index 1580fcf7ef..8d4dac46a2 100644 --- a/includes/api/i18n/mr.json +++ b/includes/api/i18n/mr.json @@ -7,33 +7,33 @@ }, "apihelp-main-param-action": "कोणती कार्यवाही करावयाची.", "apihelp-main-param-curtimestamp": "निकालात सद्य वेळठश्याचा अंतर्भाव करा.", - "apihelp-block-description": "सदस्यास प्रतिबंधित करा.", + "apihelp-block-summary": "सदस्यास प्रतिबंधित करा.", "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका.", - "apihelp-delete-description": "पान वगळा", + "apihelp-delete-summary": "पान वगळा", "apihelp-edit-param-minor": "छोटे संपादन", "apihelp-edit-param-notminor": "छोटे नसलेले संपादन", "apihelp-edit-param-bot": "या संपादनावर सांगकाम्याचे संपादन म्हणून खूण करा.", "apihelp-edit-example-edit": "पान संपादा", - "apihelp-expandtemplates-description": "विकिमजकूरात सर्व साच्यांचा विस्तार करा.", + "apihelp-expandtemplates-summary": "विकिमजकूरात सर्व साच्यांचा विस्तार करा.", "apihelp-feedcontributions-param-toponly": "केवळ नवीनतम आवर्तने असलेलीच संपादने दाखवा.", "apihelp-feedrecentchanges-param-categories": "या सर्व वर्गात असलेल्या पानांमधील बदलच फक्त दाखवा.", "apihelp-feedrecentchanges-param-categories_any": "त्यापेक्षा,या कोणत्याही वर्गांमधील,पानांना झालेले बदलच फक्त दाखवा.", "apihelp-login-param-name": "सदस्य नाव.", "apihelp-login-param-password": "परवलीचा शब्द.", "apihelp-login-example-login": "सनोंद-प्रवेश करा.", - "apihelp-move-description": "पृष्ठाचे स्थानांतरण करा.", + "apihelp-move-summary": "पृष्ठाचे स्थानांतरण करा.", "apihelp-move-param-ignorewarnings": "सर्व सूचनांकडे दुर्लक्ष करा.", "apihelp-options-example-reset": "पसंतीक्रमाची पुनर्स्थापना", - "apihelp-patrol-description": "पानावर किंवा आवृत्तीवर पहारा द्या.", + "apihelp-patrol-summary": "पानावर किंवा आवृत्तीवर पहारा द्या.", "apihelp-patrol-example-rcid": "अलीकडील बदलावर पहारा द्या.", "apihelp-patrol-example-revid": "आवृत्तीवर पहारा द्या.", - "apihelp-protect-description": "पानाची सुरक्षापातळी बदला.", + "apihelp-protect-summary": "पानाची सुरक्षापातळी बदला.", "apihelp-protect-example-protect": "पानास सुरक्षित करा.", "apihelp-query-param-list": "कोणती यादी मागवायची.", "apihelp-query-param-meta": "कोणता मेटाडाटा हवा.", "apihelp-query+allpages-param-dir": "कोणत्या दिशेस यादी करावयाची.", "apihelp-query+allredirects-param-dir": "कोणत्या दिशेस यादी करावयाची.", - "apihelp-query+allrevisions-description": "सर्व आवृत्त्यांची यादी", + "apihelp-query+allrevisions-summary": "सर्व आवृत्त्यांची यादी", "apihelp-query+allrevisions-param-user": "फक्त या सदस्याच्याच आवृत्त्यांची यादी करा", "apihelp-query+allrevisions-param-excludeuser": "या सदस्याच्या आवृत्त्यांची यादी करु नका.", "apihelp-query+allusers-paramvalue-prop-rights": "सदस्यास असलेल्या अधिकारांची यादी करते.", @@ -44,7 +44,7 @@ "apihelp-query+allusers-param-activeusers": "मागील $1 {{PLURAL:$1|दिवसात}} सक्रिय सदस्यांचीच यादी करा.", "apihelp-query+allusers-param-attachedwiki": "$1prop=centralids याद्वारे असेही दर्शविण्यात येते कि सदस्य हा या विकिशी जुळलेला असून तो या ओळखणीद्वारे ओळखल्या जातो.", "apihelp-query+allusers-example-Y": "य पासून सदस्यनाव सुरु होणाऱ्या सदस्यांचीच यादी करा.", - "apihelp-query+backlinks-description": "दिलेल्या पानास दुवे असणारी सर्व पाने शोधा.", + "apihelp-query+backlinks-summary": "दिलेल्या पानास दुवे असणारी सर्व पाने शोधा.", "apihelp-query+backlinks-param-title": "शोधावयाचे शीर्षक.$1pageidयासमवेत वापरु शकत नाही.", "apihelp-query+backlinks-param-pageid": "शोधावयाची पान ओळखण.$1titleयासमवेत वापरु शकत नाही.", "apihelp-query+backlinks-param-namespace": "प्रगणन करावयाचे नामविश्व.", @@ -53,7 +53,7 @@ "apihelp-query+backlinks-param-redirect": "जर दुवा जोडणारे पान एक पुनर्निर्देशन असेल तर,त्या पुनर्निर्देशनास दुवे असलेली पानेही शोधा. महत्तम मर्यादा अर्धी केल्या जाते.", "apihelp-query+backlinks-example-simple": "मुखपृष्ठास असणारे दुवे दाखवा.", "apihelp-query+backlinks-example-generator": "मुखपृष्ठास दुवे असणाऱ्या पानांची माहिती घ्या.", - "apihelp-query+blocks-description": "सर्व प्रतिबंधित सदस्यांची व अंकपत्त्यांची यादी करा.", + "apihelp-query+blocks-summary": "सर्व प्रतिबंधित सदस्यांची व अंकपत्त्यांची यादी करा.", "apihelp-query+blocks-param-start": "च्यापासून प्रगणना सुरु करावयाची त्याचा वेळठसा.", "apihelp-query+blocks-param-end": "कुठपर्यंत प्रगणना संपवायची त्याचा वेळठसा.", "apihelp-query+blocks-paramvalue-prop-user": "प्रतिबंधित सदस्याचे सदस्यनाव जोडते.", @@ -66,12 +66,12 @@ "apihelp-query+blocks-paramvalue-prop-range": "प्रतिबंधनाने बाधित अंकपत्त्यांचा आवाका जोडते.", "apihelp-query+blocks-example-simple": "प्रतिबंधनाची यादी करा.", "apihelp-query+blocks-example-users": "सदस्यअलिस व बॉब या सदस्यांचे प्रतिबंधनाची यादी करा.", - "apihelp-query+categories-description": "ही पाने कोणकोणत्या वर्गात आहेत त्याची यादी करा.", + "apihelp-query+categories-summary": "ही पाने कोणकोणत्या वर्गात आहेत त्याची यादी करा.", "apihelp-query+categories-param-show": "कोणत्या प्रकारचे वर्ग दाखवायचेत.", "apihelp-query+categories-param-dir": "कोणत्या दिशेस यादी करावयाची.", "apihelp-query+categories-example-simple": "अल्बर्ट आईन्स्टाईनहे पान कोणकोणत्या वर्गात आहे त्याची यादी करा.", "apihelp-query+categories-example-generator": "अल्बर्ट आईन्स्टाईनया पानात वापरलेल्या सर्व वर्गांची माहिती द्या.", - "apihelp-query+categorymembers-description": "दिलेल्या वर्गात असलेल्या सर्व पानांची यादी करते.", + "apihelp-query+categorymembers-summary": "दिलेल्या वर्गात असलेल्या सर्व पानांची यादी करते.", "apihelp-query+deletedrevs-param-end": "कुठपर्यंत प्रगणना संपवायची त्याचा वेळठसा.", "apihelp-query+deletedrevs-param-from": "या शीर्षकापासून यादी करणे सुरु करा.", "apihelp-query+deletedrevs-param-to": "या शीर्षकास यादी करणे थांबवा.", diff --git a/includes/api/i18n/ms.json b/includes/api/i18n/ms.json index fba11682b9..0224a8acbb 100644 --- a/includes/api/i18n/ms.json +++ b/includes/api/i18n/ms.json @@ -17,17 +17,17 @@ "apihelp-query+prefixsearch-param-offset": "Bilangan hasil untuk dilangkau.", "apihelp-query+usercontribs-param-show": "Hanya paparkan item-item yang mematuhi kriteria ini, cth. suntingan selain yang kecil sahaja: $2show=!minor.\n\nJika ditetapkannya $2show=patrolled atau $2show=!patrolled, maka semakan-semakan yang lebih lama daripada [https://www.mediawiki.org/wiki/Manual:$wgRCMaxAge $wgRCMaxAge] ($1 saat) tidak akan dipaparkan.", "apihelp-userrights-param-userid": "ID pengguna.", - "apihelp-dbgfm-description": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).", - "apihelp-json-description": "Data output dalam format JSON.", + "apihelp-dbgfm-summary": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).", + "apihelp-json-summary": "Data output dalam format JSON.", "apihelp-json-param-utf8": "Jika dinyatakan, mengekodkan kenanyakan (tetapi bukan semua) aksara bukan ASCII sebagai UTF-8 daripada menggantikannya dengan jujukan lepasan perenambelasan.", - "apihelp-jsonfm-description": "Output data dalam format JSON (''pretty-print'' dalam HTML).", - "apihelp-php-description": "Data output dalam format PHP bersiri.", - "apihelp-txt-description": "Data output dalam format print_r() PHP.", - "apihelp-txtfm-description": "Data output dalam format print_r() PHP (''pretty-print'' dalam HTML).", - "apihelp-xml-description": "Data output dalam format XML.", - "apihelp-xmlfm-description": "Data output dalam format XML (''pretty-print'' dalam HTML).", - "apihelp-yaml-description": "Data output dalam format YAML.", - "apihelp-yamlfm-description": "Output data dalam format YAML (''pretty-print'' dalam HTML).", + "apihelp-jsonfm-summary": "Output data dalam format JSON (''pretty-print'' dalam HTML).", + "apihelp-php-summary": "Data output dalam format PHP bersiri.", + "apihelp-txt-summary": "Data output dalam format print_r() PHP.", + "apihelp-txtfm-summary": "Data output dalam format print_r() PHP (''pretty-print'' dalam HTML).", + "apihelp-xml-summary": "Data output dalam format XML.", + "apihelp-xmlfm-summary": "Data output dalam format XML (''pretty-print'' dalam HTML).", + "apihelp-yaml-summary": "Data output dalam format YAML.", + "apihelp-yamlfm-summary": "Output data dalam format YAML (''pretty-print'' dalam HTML).", "api-format-title": "Hasil API MediaWiki", "api-format-prettyprint-header": "Anda sedang menyaksikan representasi format $1 dalam bentuk HTML. HTML bagus untuk menyah pepijat, tetapi tidak sesuai untuk kegunaan aplikasi.\n\nNyatakan parameter format untuk mengubah format outputnya. Untuk melihat representasi format $1 yang bukan HTML, tetapkan format=$2.\n\nSila rujuk [https://www.mediawiki.org/wiki/API dokumentasi lengkapnya] ataupun [[Special:ApiHelp/main|bantuan API]] untuk keterangan lanjut.", "api-help-title": "Bantuan API MediaWiki", diff --git a/includes/api/i18n/nap.json b/includes/api/i18n/nap.json index 9235247b5e..1a6c3ba508 100644 --- a/includes/api/i18n/nap.json +++ b/includes/api/i18n/nap.json @@ -5,7 +5,8 @@ "C.R." ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentaziona]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista 'e mmasciate]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunziaziune 'e ll'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug e richieste]\n
    \nStato: Tuttuquante 'e funziune 'e sta paggena avesser'a funziunà, ma ll'API è ancora a se sviluppà, picciò chesto putesse cagnà a nu certo mumento. Iscriviteve ccà ncoppa: [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 'a lista 'e mmasciate] pe' n'avé cocche notifica 'e ll'agghiurnamente.\n\nRichieste sbagliate: Si se mannasse na richiesta sbagliata a ll'API, nu cap' 'e HTTP sarrà mannata c' 'a chiave 'e mmasciata \"MediaWiki-API-Error\" e po' tuttuquante 'e valure d' 'a cap' 'e mmasciata e codece 'errore se mannassero arreto e se mpustassero a 'o stesso valore. Pe n'avé cchiù nfurmaziune vedite [[mw:API:Errors_and_warnings|API: Errure e Avvise]].\n\nTest: Pe' ve ffà cchiù semprice 'e test 'e richieste API, vedite [[Special:ApiSandbox]].", + "apihelp-main-summary": "", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|Documentaziona]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista 'e mmasciate]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunziaziune 'e ll'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug e richieste]\n
    \nStato: Tuttuquante 'e funziune 'e sta paggena avesser'a funziunà, ma ll'API è ancora a se sviluppà, picciò chesto putesse cagnà a nu certo mumento. Iscriviteve ccà ncoppa: [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 'a lista 'e mmasciate] pe' n'avé cocche notifica 'e ll'agghiurnamente.\n\nRichieste sbagliate: Si se mannasse na richiesta sbagliata a ll'API, nu cap' 'e HTTP sarrà mannata c' 'a chiave 'e mmasciata \"MediaWiki-API-Error\" e po' tuttuquante 'e valure d' 'a cap' 'e mmasciata e codece 'errore se mannassero arreto e se mpustassero a 'o stesso valore. Pe n'avé cchiù nfurmaziune vedite [[mw:API:Errors_and_warnings|API: Errure e Avvise]].\n\nTest: Pe' ve ffà cchiù semprice 'e test 'e richieste API, vedite [[Special:ApiSandbox]].", "apihelp-main-param-action": "Quale aziona d'avess'a fà.", "apihelp-main-param-format": "Qualu furmato avess'ascì d'output.", "apihelp-main-param-maxlag": "'O massimo lag ca se putess'ausà quanno MediaWiki s'installasse ncopp'a nu cluster replicato 'e database. Pe' puté sarvà aziune ca causassero cchiù lag 'e replicato, stu parammetro putesse fà 'o cliente aspettà nfin'a quanno 'o tiempo 'e replicaziona fosse meno ca nu valore specificato. Si nce stesse cchiù assaje tiempo 'e lag, nu codece 'errore maxlag se turnasse comm'a na mmasciata tipo Aspettanno 'o $host: nu $lag secunde 'e lag.
    Vedite [[mw:Manual:Maxlag_parameter|Manuale: Parammetro Maxlag]] pe' n'avé cchiù nfurmaziune.", @@ -16,7 +17,7 @@ "apihelp-main-param-servedby": "Include 'o risultato 'e nomme d' 'o host ca servette 'a richiesta.", "apihelp-main-param-curtimestamp": "Include dint' 'o risultato 'o timestamp 'e mò.", "apihelp-main-param-origin": "Quanno se trasesse a ll'API ausanno richieste 'e cross-dominio AJAX (CORS), mpustate chesto a 'o dominio origgenale. Chesto s'avess'azzeccà dint'a qualsiasi richiesta 'e pre-volo, e picciò avess'a ffà parte d' 'a richiesta d'URI (nun fosse 'o cuorpo POST). Chesto s'avess'azzeccà a uno 'e ll'origgene dint' 'o cap' 'e paggena Origin pricisamente, picciò s'avessa mpustà coccosa tipo https://en.wikipedia.org o https://meta.wikimedia.org. Si stu parammetro nun s'azzeccasse c' 'o cap' 'e paggena Origin, allora na risposta 403 se turnasse. Si stu parammetro s'azzeccasse c' 'o cap' 'e paggena Origin e ll'origgene fosse dint' 'a lista janca, allora nu cap' 'e paggena Access-Control-Allow-Origin fosse mpustato.", - "apihelp-block-description": "Blocca n'utente.", + "apihelp-block-summary": "Blocca n'utente.", "apihelp-block-param-user": "Nomme utente, indirizzo IP o range IP 'a bluccà.", "apihelp-block-param-reason": "Mutive p' 'o blocco.", "apihelp-block-param-anononly": "Blocca surtanto ll'utente anonime (e.g. stuta 'a possibilità 'e ffà cuntribbute 'a st'indirizzo IP).", @@ -28,14 +29,15 @@ "apihelp-block-param-watchuser": "Vide 'a paggena utente o ll'indirizzo IP 'e ll'utente e paggene 'e chiacchiera.", "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP 192.0.2.5 pe' tre gghiuorne p' 'o mutivo First strike.", "apihelp-block-example-user-complex": "Blocca l'utente Vandal a tiempo indeterminato c' 'o mutivo Vandalism, nun 'o ffà crià cunte nuove nè mannà mmasciate e-mail.", - "apihelp-checktoken-description": "Cuntrolla 'a validità 'e nu token 'a [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Cuntrolla 'a validità 'e nu token 'a [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo 'e token ncurzo 'e test.", "apihelp-checktoken-param-token": "Token 'a testà.", "apihelp-checktoken-param-maxtokenage": "Massima ammaturità cunzentuta p' 'o token, 'n secunde.", "apihelp-checktoken-example-simple": "Verifica 'a validità 'e nu token csrf.", - "apihelp-clearhasmsg-description": "Scancella 'o flag hasmsg pe ll'utente currente.", + "apihelp-clearhasmsg-summary": "Scancella 'o flag hasmsg pe ll'utente currente.", "apihelp-clearhasmsg-example-1": "Scancella 'o flag hasmsg pe' l'utente currente.", - "apihelp-compare-description": "Piglia 'e differenze nfra 2 paggene.\n\nNu nummero 'e verziune, 'o titolo 'e na paggena, o ll'IDE 'e paggena adda essere nnicato fosse p' 'o \"'a\" ca pe' ll' \"a\".", + "apihelp-compare-summary": "Piglia 'e differenze nfra 2 paggene.", + "apihelp-compare-extended-description": "Nu nummero 'e verziune, 'o titolo 'e na paggena, o ll'IDE 'e paggena adda essere nnicato fosse p' 'o \"'a\" ca pe' ll' \"a\".", "apihelp-compare-param-fromtitle": "Primmo titolo 'a cunfruntà.", "apihelp-compare-param-fromid": "Primmo ID 'e paggena a cunfruntà.", "apihelp-compare-param-fromrev": "Primma verziona a cunfruntà.", @@ -43,7 +45,7 @@ "apihelp-compare-param-toid": "Secondo ID 'e paggena a cunfruntà.", "apihelp-compare-param-torev": "Seconda verziona a cunfruntà.", "apihelp-compare-example-1": "Crèa nu diff tra 'a verziona 1 e 'a verziona 2.", - "apihelp-createaccount-description": "Crèa cunto nnòvo.", + "apihelp-createaccount-summary": "Crèa cunto nnòvo.", "apihelp-createaccount-param-name": "Nomme utente.", "apihelp-createaccount-param-password": "Password (sarrà gnurata se mpustato nu $1mailpassword).", "apihelp-createaccount-param-domain": "Dumminio pe' ffà autenticaziona 'a fore (opzionale).", @@ -55,7 +57,7 @@ "apihelp-createaccount-param-language": "Codece 'e llengua a mpustà comme predefinita pe' n'utente (opzionale, 'e default fosse 'a lengue d' 'e cuntenute).", "apihelp-createaccount-example-pass": "Crèa utente testuser c' 'a password test123.", "apihelp-createaccount-example-mail": "Crea utente testmailuser e manna na mail cu na password criat' 'a ccaso.", - "apihelp-delete-description": "Scancella 'na paggena.", + "apihelp-delete-summary": "Scancella 'na paggena.", "apihelp-delete-param-title": "Titolo d' 'a paggena a scancellà. Nun se pò ausà nziem'a $1pageid.", "apihelp-delete-param-pageid": "ID d' 'a paggena a scancellà. Nun se pò ausà nziem'a $1title.", "apihelp-delete-param-reason": "Raggione p' 'o scancellà. Si nun s'è mpustato, na raggione generata automaticamente s'add'ausà.", @@ -66,8 +68,8 @@ "apihelp-delete-param-oldimage": "'O nomm' 'e ll'immaggene viecchia a se scancellà comme sta scritto ccà: [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Scancella Main Page.", "apihelp-delete-example-reason": "Scancella 'a Main Page c' 'o mutivo Preparing for move.", - "apihelp-disabled-description": "Stu modulo è stato stutato.", - "apihelp-edit-description": "Crèa e cagna paggene.", + "apihelp-disabled-summary": "Stu modulo è stato stutato.", + "apihelp-edit-summary": "Crèa e cagna paggene.", "apihelp-edit-param-title": "Titolo d' 'a paggena a cagnà. Nun se pò ausà nziem'a $1pageid.", "apihelp-edit-param-pageid": "ID d' 'a paggena a cagnà. Nun se pò ausà nziem'a $1title.", "apihelp-edit-param-section": "Nummero 'e sezione. 0 p' 'a sezione ncoppa, new pe' na seziona nova.", @@ -98,13 +100,13 @@ "apihelp-edit-example-edit": "Cagna paggena.", "apihelp-edit-example-prepend": "Pre-appenne __NOTOC__ a na paggena.", "apihelp-edit-example-undo": "Torna arreto 'e verziune 13579 nfin'a 13585 cu n'autosommario.", - "apihelp-emailuser-description": "E-mail a n'utente.", + "apihelp-emailuser-summary": "E-mail a n'utente.", "apihelp-emailuser-param-target": "Utente a 'e quale s'avess'a mannà na mmasciata mail.", "apihelp-emailuser-param-subject": "Oggetto d' 'a mail.", "apihelp-emailuser-param-text": "Testo d' 'a mail.", "apihelp-emailuser-param-ccme": "Manna na copia 'e sta mail a mme.", "apihelp-emailuser-example-email": "Manna na e-mail a ll'utente WikiSysop c' 'o testo Content.", - "apihelp-expandtemplates-description": "Spannere tuttuquante 'e template dint' 'o wikitesto.", + "apihelp-expandtemplates-summary": "Spannere tuttuquante 'e template dint' 'o wikitesto.", "apihelp-expandtemplates-param-title": "Titolo d' 'a paggena.", "apihelp-expandtemplates-param-text": "Wikitesto 'a scagnà/convertire.", "apihelp-expandtemplates-param-revid": "ID 'e cagnamento, pe' {{REVISIONID}} e variabbele ca s'assummigliassero.", @@ -121,7 +123,7 @@ "apihelp-expandtemplates-param-includecomments": "Si s'avess'azzeccà cocche cummento HTML dint'a ll'output.", "apihelp-expandtemplates-param-generatexml": "Generà ll'albero XML (scagnato 'a $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Spanne 'o wikitesto {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Tuorna nu feed 'e cuntribbute 'utente.", + "apihelp-feedcontributions-summary": "Tuorna nu feed 'e cuntribbute 'utente.", "apihelp-feedcontributions-param-feedformat": "'O furmato d' 'o feed.", "apihelp-feedcontributions-param-user": "'A quale 'utente nc'avimm'a piglià cuntribbute.", "apihelp-feedcontributions-param-namespace": "'A qualu namespace s'avesser'a filtrà 'e cuntribbute.", @@ -133,14 +135,14 @@ "apihelp-feedcontributions-param-newonly": "Fà vedé sulamente 'e contribbute ca songo criazione 'e paggene.", "apihelp-feedcontributions-param-showsizediff": "Fà vedé 'a differenza nfra verziune.", "apihelp-feedcontributions-example-simple": "Tuòrna cuntribbute 'a ll'utente Esempio.", - "apihelp-feedrecentchanges-description": "Tuorna 'o blocco 'e nutizie 'e ll'urdeme cagnamiente.", + "apihelp-feedrecentchanges-summary": "Tuorna 'o blocco 'e nutizie 'e ll'urdeme cagnamiente.", "apihelp-feedrecentchanges-param-feedformat": "'O furmato d' 'o feed.", "apihelp-feedwatchlist-param-feedformat": "'O furmato d' 'o feed.", "apihelp-filerevert-param-comment": "Carreca commento.", - "apihelp-help-description": "Fà veré l'aiuto p' 'e module specificate", + "apihelp-help-summary": "Fà veré l'aiuto p' 'e module specificate", "apihelp-help-param-submodules": "Azzecca n'aiuto p' 'e submodule 'e nu modulo ca téne nome.", "apihelp-login-example-login": "Tràse.", - "apihelp-move-description": "Mòve paggena.", + "apihelp-move-summary": "Mòve paggena.", "apihelp-opensearch-param-search": "Ascìa stringa.", "apihelp-opensearch-param-format": "'O furmato 'e ll'output." } diff --git a/includes/api/i18n/nb.json b/includes/api/i18n/nb.json index 65060369f8..8b86af58c7 100644 --- a/includes/api/i18n/nb.json +++ b/includes/api/i18n/nb.json @@ -9,17 +9,26 @@ "Kingu" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentasjon]]\n* [[mw:API:FAQ|Ofte stilte spørsmål]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-post-liste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-kunngjøringer]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Feil & forespørsler]\n
    \nStatus: Alle funksjonene som vises på denne siden skal virke, men API-en er fortsatt i aktiv utvikling, og kan bli endret når som helst. Abonner på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki sin API-kunnkjøringsepostliste] for nyheter om oppdateringer.\n\nFeile kall: Hvis det blir sendt feile kall til API-et, blir det sendt en HTTP-header med nøkkelen \"MediaWiki-API-Error\" og da blir både header-verdien og feilkoden sendt tilbake med samme verdi. For mer informasjon se [[mw:API:Errors_and_warnings|API: Feil og advarsler]].\n\nTesting: For enkelt å teste API-kall, se [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentasjon]]\n* [[mw:Special:MyLanguage/API:FAQ|Ofte stilte spørsmål]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-post-liste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-kunngjøringer]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Feil & forespørsler]\n
    \nStatus: Alle funksjonene som vises på denne siden skal virke, men API-en er fortsatt i aktiv utvikling, og kan bli endret når som helst. Abonner på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki sin API-kunnkjøringsepostliste] for nyheter om oppdateringer.\n\nFeile kall: Hvis det blir sendt feile kall til API-et, blir det sendt en HTTP-header med nøkkelen \"MediaWiki-API-Error\" og da blir både header-verdien og feilkoden sendt tilbake med samme verdi. For mer informasjon se [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Feil og advarsler]].\n\nTesting: For enkelt å teste API-kall, se [[Special:ApiSandbox]].", "apihelp-main-param-action": "Hvilken handling skal utføres", "apihelp-main-param-format": "Resultatets format.", + "apihelp-main-param-maxlag": "Maksimal forsinkelse kan brukes når MediaWiki er installert på et database-replikert cluster. For å unngå operasjoner som forårsaker replikasjonsforsinkelser, kan denne parameteren få klienten til å vente til replikasjonsforinkelsen er mindre enn angitt verdi. I tilfelle ytterliggående forsinkelser, blir feilkoden maxlag returnert med en melding som Venter på $host: $lag sekunders forsinkelse.
    Se [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for mer informasjon.", + "apihelp-main-param-smaxage": "Sett s-maxage HTTP cache control header til dette antall sekunder. Feil blir aldri mellomlagret.", + "apihelp-main-param-maxage": "Set max-age HTTP cache control header til dette antall sekunder. Feil blir aldri mellomlagret.", "apihelp-main-param-assert": "Verifiser at brukeren er logget inn om satt til user, eller har botrettighet om satt til bot.", - "apihelp-main-param-assertuser": "Verifiser at den nåværende brukeren er den navngitte brukeren.", + "apihelp-main-param-assertuser": "Verifiser at den gjeldende brukeren er den navngitte brukeren.", "apihelp-main-param-requestid": "En gitt verdi her vil inkluderes i responsen. Kan brukes til å skille forespørsler fra hverandre.", "apihelp-main-param-servedby": "Inkluder navnet på tjeneren som utførte forespørselen i resultatene.", "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.", + "apihelp-main-param-responselanginfo": "Inkluder språkene brukt for uselang og errorlang i resultatet.", + "apihelp-main-param-origin": "Når man aksesserer API-en som bruker en domene-kryssende AJAX-forespørsel (CORS), sett denne til det opprinnelige domenet. Denne må tas med i alle pre-flight-forespørsler, og derfor være en del av spørre-URI-en (ikke POST-kroppen).\n\nFor autentiserte forespørsler må denne stemme helt med en av de opprinnelige i Origin-headeren, slik at den må settes til noe a la https://en.wikipedia.org eller https://meta.wikimedia.org. Hvis denne parameteren ikke stemmer med Origin-headeren, returneres et 403-svar. Hvis denne parameteren stemmer med Origin-headeren og originalen er hvitlistet, vil Access-Control-Allow-Origin og Access-Control-Allow-Credentials-headere bli satt.\n\nFor ikke-autentiserte forepørsler, spesifiser *. Denne vil gjøre at Access-Control-Allow-Origin-headeren blir satt, men Access-Control-Allow-Credentials blir false og alle bruerspesifikke data blir begrenset.", "apihelp-main-param-uselang": "Språk å bruke for meldingsoversettelser. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages returnerer en liste over språkkoder, eller spesifiser user for å bruke den nåværende brukerens språkpreferanser, eller spesifiser content for å bruke denne wikiens innholdsspråk.", - "apihelp-block-description": "Blokker en bruker.", + "apihelp-main-param-errorformat": "Formater som kan brukes for advarsels- og feiltekster.\n; plaintext: Wikitext der HTML-tagger er fjernet og elementer byttet ut.\n; wikitext: Ubehandlet wikitext.\n; html: HTML.\n; raw: Meldingsnøkler og -parametre.\n; none: Ingen tekst, bare feilkoder.\n; bc: Format brukt før MediaWiki 1.29. errorlang og errorsuselocal ses bort fra.", + "apihelp-main-param-errorlang": "Språk som skal brukes for advarsler og feil. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages/ returnerer ei liste over språkkoder, eller angi content for å bruke wikiens innholdsspråk, eller angi uselang for å bruke samme verdi som uselang-parameteren.", + "apihelp-main-param-errorsuselocal": "Hvis gitt, vil feiltekster bruke lokalt tilpassede meldinger fra {{ns:MediaWiki}}-navnerommet.", + "apihelp-block-summary": "Blokker en bruker.", "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres. Kan ikke brukes sammen med $1userid", + "apihelp-block-param-userid": "Bruker-ID som skal blokkeres. Kan ikke brukes sammen med $1user.", "apihelp-block-param-expiry": "Utløpstid. Kan være relativ (f.eks. 5 months eller 2 weeks) eller absolutt (f.eks. 2014-09-18T12:34:56Z). Om den er satt til infinite, indefinite eller never vil blokkeringen ikke ha noen utløpsdato.", "apihelp-block-param-reason": "Årsak for blokkering.", "apihelp-block-param-anononly": "Blokker bare anonyme brukere (dvs. hindre anonyme redigeringer fra denne IP-adressen).", @@ -27,32 +36,51 @@ "apihelp-block-param-autoblock": "Blokker automatisk sist brukte IP-adresse og alle etterfølgende IP-adresser de prøver å logge inn fra.", "apihelp-block-param-noemail": "Hindre brukeren å sende e-post via wikien. (Krever rettigheten blockemail).", "apihelp-block-param-hidename": "Skjul brukernavnet fra blokkeringsloggen. (Krever rettigheten hideuser).", - "apihelp-block-param-allowusertalk": "La brukeren redigere sin egen diskusjonsside (avhenger av [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "La brukeren redigere sin egen diskusjonsside (avhenger av [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Overstyr den gamle blokkeringen om brukeren allerede er blokkert.", "apihelp-block-param-watchuser": "Overvåk brukerens eller IP-adressas bruker- og brukerdiskusjonssider.", + "apihelp-block-param-tags": "Endre taggene slik at de brukes på elementet i blokk-loggen.", "apihelp-block-example-ip-simple": "Blokker adressa 192.0.2.5 i tre dager med årsak First strike.", "apihelp-block-example-user-complex": "Blokker brukeren Vandal på ubestemnt tid med årsak Vandalism, og forhindre ny kontooppretting og sending av epost.", - "apihelp-changeauthenticationdata-description": "Endre autentiseringsdata for den nåværende brukeren.", - "apihelp-changeauthenticationdata-example-password": "Forsøk å endre den nåværende brukerens passord til ExamplePassword.", - "apihelp-checktoken-description": "Sjekk gyldigheten til et tegn fra [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-changeauthenticationdata-summary": "Endre autentiseringsdata for den nåværende brukeren.", + "apihelp-changeauthenticationdata-example-password": "Forsøk å endre den gjeldende brukerens passord til ExamplePassword.", + "apihelp-checktoken-summary": "Sjekk gyldigheten til et tegn fra [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Type tegn som testes.", "apihelp-checktoken-param-token": "Tegn å teste.", "apihelp-checktoken-param-maxtokenage": "Maksimalt tillatt alder på tegnet, i sekunder.", "apihelp-checktoken-example-simple": "Test gyldigheten til et csrf-tegn.", - "apihelp-clearhasmsg-description": "Fjerner hasmsg-flagget for den aktuelle brukeren.", + "apihelp-clearhasmsg-summary": "Fjerner hasmsg-flagget for den aktuelle brukeren.", "apihelp-clearhasmsg-example-1": "Fjern hasmsg-flagget for aktuell bruker.", - "apihelp-clientlogin-description": "Logg inn på wikien med den interaktive flyten.", + "apihelp-clientlogin-summary": "Logg inn på wikien med den interaktive flyten.", "apihelp-clientlogin-example-login": "Start prosessen med å logge inn til wikien som bruker Example med passord ExamplePassword.", "apihelp-clientlogin-example-login2": "Fortsett å logge inn etter en UI-respons for tofaktor-autentisering, ved å oppgi en OATHToken på 987654.", - "apihelp-compare-description": "Hent forskjellen mellom to sider.\n\nEt revisjonsnummer, en sidetittel eller en side-ID for både «fra» og «til» må sendes.", + "apihelp-compare-summary": "Hent forskjellen mellom to sider.", + "apihelp-compare-extended-description": "Et revisjonsnummer, en sidetittel eller en side-ID for både «fra» og «til» må sendes.", "apihelp-compare-param-fromtitle": "Første tittel å sammenligne.", "apihelp-compare-param-fromid": "Første side-ID å sammenligne.", "apihelp-compare-param-fromrev": "Første revisjon å sammenligne.", + "apihelp-compare-param-fromtext": "Bruk denne teksten i stedet for innholdet i revisjonen som angis med fromtitle, fromid eller fromrev.", + "apihelp-compare-param-frompst": "Gjør en transformering av fromtext før lagring.", + "apihelp-compare-param-fromcontentmodel": "Innholdsmodell for fromtext. Om den ikke angis vil den gjettes basert på de andre parameterne.", + "apihelp-compare-param-fromcontentformat": "Innholdsserialiseringsformat for fromtext.", "apihelp-compare-param-totitle": "Andre tittel å sammenligne.", "apihelp-compare-param-toid": "Andre side-ID å sammenligne.", "apihelp-compare-param-torev": "Andre revisjon å sammenligne.", + "apihelp-compare-param-totext": "Bruk denne teksten i stedet for innholdet i revisjonen spesifisert av totitle, toid eller torev.", + "apihelp-compare-param-topst": "Gjør en transformering av totext før lagring.", + "apihelp-compare-param-tocontentmodel": "Innholdsmodellen til totext. Om denne ikke angis vil den bli gjettet ut fra andre parametere.", + "apihelp-compare-param-tocontentformat": "Innholdsserialiseringsformat for totext.", + "apihelp-compare-param-prop": "Hvilke informasjonsdeler som skal hentes.", + "apihelp-compare-paramvalue-prop-diff": "Diffens HTML.", + "apihelp-compare-paramvalue-prop-diffsize": "Størrelsen på diffens HTML i byte.", + "apihelp-compare-paramvalue-prop-rel": "Revisjons-ID-en for revisjonene foran «from» og etter «to», om de finnes.", + "apihelp-compare-paramvalue-prop-ids": "Side- og revisjons-ID-ene til «from»- og «to»-revisjonene.", + "apihelp-compare-paramvalue-prop-title": "Sidetitlene for «from»- og «to»-revisjonene.", + "apihelp-compare-paramvalue-prop-user": "Brukernavnet og ID-en til «from»- og «to»-revisjonene.", + "apihelp-compare-paramvalue-prop-comment": "Kommentaren til «from»- og «to»-revisjonene.", + "apihelp-compare-paramvalue-prop-size": "Størrelsen til «from»- og «to»-revisjonene.", "apihelp-compare-example-1": "Lag en diff mellom revisjon 1 og 2.", - "apihelp-createaccount-description": "Opprett en ny brukerkonto.", + "apihelp-createaccount-summary": "Opprett en ny brukerkonto.", "apihelp-createaccount-param-preservestate": "Om [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] returnerte true for hashprimarypreservedstate bør forespørsler merket som primary-required omgås. Om den returnerte en ikke-tom verdi for preservedusername kan det brukernavnet brukes for username-parameteren.", "apihelp-createaccount-example-create": "Start prosessen med å opprette brukeren Example med passordet ExamplePassword.", "apihelp-createaccount-param-name": "Brukernavn.", @@ -66,8 +94,9 @@ "apihelp-createaccount-param-language": "Språkkode å bruke som standard for brukeren (valgfritt, standardverdien er innholdsspråket).", "apihelp-createaccount-example-pass": "Opprett bruker testuser med passordet test123.", "apihelp-createaccount-example-mail": "Opprett bruker testmailuser og send et tilfeldig generert passord med e-post.", - "apihelp-cspreport-description": "Brukes av nettlesere for å rapportere brudd på Content Security Policy. Denne modulen bør aldri brukes utenom av en CSP-mottakelig nettleser.", - "apihelp-delete-description": "Slett en side.", + "apihelp-cspreport-summary": "Brukes av nettlesere for å rapportere brudd på Content Security Policy. Denne modulen bør aldri brukes utenom av en CSP-mottakelig nettleser.", + "apihelp-cspreport-param-source": "Hva som genererte CSP-headeren som utløste denne rapporten", + "apihelp-delete-summary": "Slett en side.", "apihelp-delete-param-title": "Tittel til siden som skal slettes. Kan ikke brukes sammen med $1pageid.", "apihelp-delete-param-pageid": "Side-ID til siden som skal slettes. Kan ikke brukes sammen med $1title.", "apihelp-delete-param-reason": "Årsak for slettingen. Dersom ikke satt vil en automatisk generert årsak bli brukt.", @@ -77,8 +106,8 @@ "apihelp-delete-param-oldimage": "Navnet på det gamle bildet som skal slettes som oppgitt av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Slett Main Page.", "apihelp-delete-example-reason": "Slett Main Page med grunnen Preparing for move.", - "apihelp-disabled-description": "Denne modulen har blitt deaktivert", - "apihelp-edit-description": "Opprett og rediger sider.", + "apihelp-disabled-summary": "Denne modulen har blitt deaktivert", + "apihelp-edit-summary": "Opprett og rediger sider.", "apihelp-edit-param-title": "Tittelen til siden som skal redigeres. Kan ikke brukes sammen med $1pageid.", "apihelp-edit-param-pageid": "Side-ID til siden som skal redigeres. Kan ikke brukes sammen med $1title.", "apihelp-edit-param-section": "Avsnittsnummer. 0 for det øverste avsnittet, new for et nytt avsnitt.", @@ -101,12 +130,12 @@ "apihelp-edit-param-contentformat": "Innholdsserialiseringsformat brukt for inndatateksten.", "apihelp-edit-param-contentmodel": "Det nye innholdets innholdsmodell.", "apihelp-edit-example-edit": "Rediger en side.", - "apihelp-emailuser-description": "Send e-post til en bruker.", + "apihelp-emailuser-summary": "Send e-post til en bruker.", "apihelp-emailuser-param-target": "Bruker som det skal sendes e-post til.", "apihelp-emailuser-param-subject": "Emne.", "apihelp-emailuser-param-text": "E-post innhold.", "apihelp-emailuser-param-ccme": "Send en kopi av denne e-posten til meg.", - "apihelp-expandtemplates-description": "Ekspanderer alle maler i wikitekst.", + "apihelp-expandtemplates-summary": "Ekspanderer alle maler i wikitekst.", "apihelp-expandtemplates-param-title": "Sidetittel.", "apihelp-expandtemplates-param-text": "Wikitekst som skal konverteres.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "Den utvidede wikiteksten.", @@ -141,25 +170,83 @@ "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.", "apihelp-feedrecentchanges-example-simple": "Vis siste endringer.", "apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.", - "apihelp-feedwatchlist-description": "Returnerer en overvåkningslistemating.", + "apihelp-feedwatchlist-summary": "Returnerer en overvåkningslistemating.", "apihelp-feedwatchlist-param-feedformat": "Matingens format.", + "apihelp-filerevert-summary": "Tilbakestill en fil til en gammel versjon.", + "apihelp-filerevert-param-filename": "Målfilnavn, uten prefikset File:.", + "apihelp-filerevert-param-comment": "Opplastingskommentar.", + "apihelp-filerevert-example-revert": "Tilbakestiller Wiki.png til versjonen fra 2011-03-05T15:27:40Z.", + "apihelp-help-summary": "Vis hjelp for de gitte modulene.", + "apihelp-help-param-modules": "Moduler det skal vises hjelp for (verdiene til action- og format-parameterne, eller main). Kan angi undermoduler med en +.", + "apihelp-help-param-submodules": "Inkluder hjelp for undermoduler av den navngitte modulen.", + "apihelp-help-param-recursivesubmodules": "Inkluder hjelp for undermoduler rekursivt.", + "apihelp-help-param-helpformat": "Format for hjelperesultatet.", + "apihelp-help-param-wrap": "Omgi resultatet i en standard API-responsstruktur.", "apihelp-help-param-toc": "Inkluder en innholdsfortegnelse i HTML-utdataen.", "apihelp-help-example-main": "Hjelp for hovedmodulen.", + "apihelp-help-example-submodules": "Hjelp for action=query og alle dens undermoduler.", "apihelp-help-example-recursive": "All hjelp på en side.", "apihelp-help-example-help": "Hjelp for selve hjelpemodulen.", "apihelp-help-example-query": "Hjelp for to utspørringsundermoduler.", - "apihelp-imagerotate-description": "Roter ett eller flere bilder.", + "apihelp-imagerotate-summary": "Roter ett eller flere bilder.", + "apihelp-imagerotate-param-rotation": "Grader bildet skal roteres med klokka.", + "apihelp-imagerotate-param-tags": "Tagger som skal legges til oppslaget i opplastingsloggen.", + "apihelp-imagerotate-example-simple": "Roter File:Example.png 90 grader.", + "apihelp-imagerotate-example-generator": "Roter alle bilder i Category:Flip 180 grader.", + "apihelp-import-summary": "Importer en side fra en annen wiki eller fra en XML-fil.", + "apihelp-import-extended-description": "Merk at HTTP POST må gjøres som filopplasting (altså med bruk av multipart/form-data) når man sender en fil for parameteren xml.", "apihelp-import-param-summary": "Sammendrag for importering av loggelement.", "apihelp-import-param-xml": "Opplastet XML-fil.", + "apihelp-import-param-interwikisource": "For interwikiimport: wiki det skal importeres fra.", + "apihelp-import-param-interwikipage": "For interwikiimport: side som skal importeres.", + "apihelp-import-param-fullhistory": "For interwikiimport: importer hele historikken, ikke bare den nåværende versjonen.", + "apihelp-import-param-templates": "For interwikiimport: importer alle inkluderte maler i tillegg.", + "apihelp-import-param-namespace": "Importer til dette navnerommet: Kan ikke brukes sammen med $1rootpage.", + "apihelp-import-param-rootpage": "Importer som underside av denne siden. Kan ikke brukes sammen med $1namespace.", + "apihelp-import-param-tags": "Endringstagger som skal klistres på oppføringen i importloggen og nullrevisjonen til de importerte sidene.", + "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] til navnerom 100 med full historikk.", "apihelp-login-param-name": "Brukernavn.", "apihelp-login-param-password": "Passord.", "apihelp-login-param-domain": "Domene (valgfritt).", + "apihelp-login-example-gettoken": "Henter innloggingstegn.", "apihelp-login-example-login": "Logg inn.", - "apihelp-logout-description": "Logg ut og fjern sesjonsdata.", + "apihelp-logout-summary": "Logg ut og fjern sesjonsdata.", "apihelp-logout-example-logout": "Logg ut den aktuelle brukeren.", - "apihelp-move-description": "Flytt en side.", - "apihelp-json-description": "Resultatdata i JSON-format.", - "apihelp-none-description": "Ingen resultat.", + "apihelp-managetags-example-delete": "Slett taggen vandlaism med årsaken Misspelt", + "apihelp-managetags-example-activate": "Aktiver taggen spam med årsak For use in edit patrolling", + "apihelp-managetags-example-deactivate": "Deaktiver taggen med navn spam med årsak No longer required", + "apihelp-mergehistory-summary": "Flett sidehistorikker.", + "apihelp-mergehistory-param-from": "Tittelen på siden historikken skal flettes fra. Kan ikke brukes sammen med $1fromid.", + "apihelp-mergehistory-param-fromid": "Side-ID-en til siden historikken skal flettes fra. Kan ikke brukes sammen med $1from.", + "apihelp-mergehistory-param-to": "Tittelen på siden historikken skal flettes til. Kan ikke brukes sammen med $1toid.", + "apihelp-mergehistory-param-toid": "Side-ID-en til siden historikken skal flettes til. Kan ikke brukes sammen med $1to.", + "apihelp-mergehistory-param-reason": "Årsak for fletting av historikk.", + "apihelp-mergehistory-example-merge": "Flett hele historikken til Oldpage inn i Newpage.", + "apihelp-mergehistory-example-merge-timestamp": "Flett siderevisjonene av Oldpage til og med 2015-12-31T04:37:41Z inn i Newpage.", + "apihelp-move-summary": "Flytt en side.", + "apihelp-move-param-from": "Tittelen på siden det skal endres navn på. Kan ikke brukes sammen med $1fromid.", + "apihelp-move-param-fromid": "Side-ID til siden det skal endres navn på. Kan ikke brukes sammen med $1from.", + "apihelp-move-param-to": "Tittelen siden skal endre navn til.", + "apihelp-move-param-reason": "Årsak for navneendring.", + "apihelp-move-param-movetalk": "Bytt navn på diskusjonssiden om den finnes.", + "apihelp-move-param-movesubpages": "Bytt navn på undersider, om mulig.", + "apihelp-move-param-noredirect": "Ikke opprett en omdirigering.", + "apihelp-move-param-watch": "Legg til siden og omdirigeringen i den gjeldende brukerens overvåkningsliste.", + "apihelp-move-param-unwatch": "Fjern siden og omdirigeringen fra den gjeldende brukerens overvåkningsliste.", + "apihelp-opensearch-param-search": "Søkestreng.", + "apihelp-opensearch-param-limit": "Maksimalt antall resultater som skal returneres.", + "apihelp-opensearch-param-namespace": "Navnerom det skal søkes i.", + "apihelp-opensearch-param-suggest": "Gjør ingenting om [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] er falsk.", + "apihelp-opensearch-param-format": "Resultatets format.", + "apihelp-opensearch-example-te": "Finn sider som begynner på Te.", + "apihelp-options-param-reset": "Tilbakestiller innstillingene til sidestandarden.", + "apihelp-options-example-reset": "Tilbakestill alle innstillinger.", + "apihelp-options-example-change": "Endre innstillinger for skin og hideminor.", + "apihelp-options-example-complex": "Tilbakestill alle innstillinger, og sett så skin og nickname.", + "apihelp-paraminfo-summary": "Hent informasjon om API-moduler.", + "apihelp-paraminfo-param-helpformat": "Format for hjelpestrenger.", + "apihelp-json-summary": "Resultatdata i JSON-format.", + "apihelp-none-summary": "Ingen resultat.", "api-help-flag-readrights": "Denne modulen krever lesetilgang.", "api-help-flag-writerights": "Denne modulen krever skrivetilgang.", "api-help-flag-mustbeposted": "Denne modulen aksepterer bare POST forespørsler.", @@ -168,6 +255,9 @@ "api-help-param-deprecated": "Utgått.", "api-help-param-required": "Denne parameteren er påkrevd.", "apierror-multival-only-one": "Bare én verdi er tillatt for parameteret $1.", + "apierror-mustbeloggedin": "Du må være logget inn for å $1.", + "apierror-offline": "Kunne ikke fortsette på grunn av tilkoblingsproblemer. Sjekk at internettforbindelsen din virker og prøv igjen.", "apierror-permissiondenied-generic": "Tilgang nektet.", + "apierror-timeout": "Tjeneren svarte ikke innenfor forventet tid.", "apiwarn-validationfailed": "Bekreftelsesfeil $1: $2" } diff --git a/includes/api/i18n/ne.json b/includes/api/i18n/ne.json index f8718a55ff..1a122c6580 100644 --- a/includes/api/i18n/ne.json +++ b/includes/api/i18n/ne.json @@ -8,6 +8,6 @@ "apihelp-createaccount-param-name": "प्रयोगकर्ता नाम।", "apihelp-edit-param-minor": "सामान्य सम्पादन।", "apihelp-edit-example-edit": "पृष्ठ सम्पादन गर्नुहोस्।", - "apihelp-emailuser-description": "प्रयोगकर्तालाई इमेल गर्नुहोस्।", + "apihelp-emailuser-summary": "प्रयोगकर्तालाई इमेल गर्नुहोस्।", "apihelp-parse-param-prop": "जानकारीको कुन भाग लिनेः" } diff --git a/includes/api/i18n/nl.json b/includes/api/i18n/nl.json index a305bc2170..0273eca698 100644 --- a/includes/api/i18n/nl.json +++ b/includes/api/i18n/nl.json @@ -18,10 +18,10 @@ "Mainframe98" ] }, - "apihelp-main-description": "
    \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
    \nStatus: 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\nFoutieve verzoeken: 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\nTesten: u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentatie]]\n* [[mw:Special:MyLanguage/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
    \nStatus: 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\nFoutieve verzoeken: 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:Special:MyLanguage/API:Errors_and_warnings|API: Foutmeldingen en waarschuwingen]] voor meer informatie.\n\nTesten: u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].", "apihelp-main-param-action": "Welke handeling uit te voeren.", "apihelp-main-param-format": "De opmaak van de uitvoer.", - "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode maxlag teruggegeven met een bericht als Waiting for $host: $lag seconds lagged.
    Zie [[mw:Manual:Maxlag_parameter|Handboek: Maxlag parameter]] voor mee informatie.", + "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode maxlag teruggegeven met een bericht als Waiting for $host: $lag seconds lagged.
    Zie [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handleiding:Maxlag parameter]] voor meer informatie.", "apihelp-main-param-smaxage": "Stelt de s-maxage HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.", "apihelp-main-param-maxage": "Stelt de max-age HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.", "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als user is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als bot is meegegeven.", @@ -32,7 +32,7 @@ "apihelp-main-param-responselanginfo": "Toon de talen gebruikt voor uselang en errorlang in het resultaat.", "apihelp-main-param-errorlang": "De taal om te gebruiken voor waarschuwingen en fouten. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] met siprop=languages toont een lijst van taalcodes, of stel inhoud in om gebruik te maken van de inhoudstaal van deze wiki, of stel uselang in om gebruik te maken van dezelfde waarde als de uselang parameter.", "apihelp-main-param-errorsuselocal": "Indien ingesteld maken foutmeldingen gebruik van lokaal-aangepaste berichten in de {{ns:MediaWiki}} naamruimte.", - "apihelp-block-description": "Gebruiker blokkeren.", + "apihelp-block-summary": "Gebruiker blokkeren.", "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren. Kan niet samen worden gebruikt me $1userid", "apihelp-block-param-userid": "Gebruikers-ID om te blokkeren. Kan niet worden gebruikt in combinatie met $1user.", "apihelp-block-param-expiry": "Vervaldatum. Kan relatief zijn (bijv. 5 months of 2 weeks) of absoluut (2014-09-18T12:34:56Z). Indien ingesteld op infinite, indefinite, of never verloopt de blokkade nooit.", @@ -42,30 +42,31 @@ "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.", "apihelp-block-param-noemail": "Gebruiker weerhouden van het sturen van e-mail. (Vereist het blockemail recht).", "apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het hideuser recht).", - "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.", "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.", "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.", "apihelp-block-example-ip-simple": "Het IP-adres 192.0.2.5 voor drie dagen blokkeren met First strike als opgegeven reden.", "apihelp-block-example-user-complex": "Blokkeer gebruikerVandal voor altijd met reden Vandalism en voorkom het aanmaken van nieuwe accounts en het versturen van email", "apihelp-changeauthenticationdata-example-password": "Poging tot het wachtwoord van de huidige gebruiker te veranderen naar ExamplePassword.", - "apihelp-checktoken-description": "Controleer de geldigheid van een token van [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Controleer de geldigheid van een token van [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tokentype wordt getest.", "apihelp-checktoken-param-token": "Token om te controleren.", "apihelp-checktoken-param-maxtokenage": "Maximum levensduur van de token, in seconden.", "apihelp-checktoken-example-simple": "Test de geldigheid van een csrf token.", - "apihelp-clearhasmsg-description": "Wist de hasmsg vlag voor de huidige gebruiker.", + "apihelp-clearhasmsg-summary": "Wist de hasmsg vlag voor de huidige gebruiker.", "apihelp-clearhasmsg-example-1": "Wis de hasmsg vlag voor de huidige gebruiker.", - "apihelp-clientlogin-description": "Log in op de wiki met behulp van de interactieve flow.", + "apihelp-clientlogin-summary": "Log in op de wiki met behulp van de interactieve flow.", "apihelp-clientlogin-example-login": "Start het inlogproces op de wiki als gebruiker Example met wachtwoord ExamplePassword.", - "apihelp-compare-description": "Toon het verschil tussen 2 pagina's.\n\nEen versienummer, een paginatitel of een pagina-ID is vereist voor zowel de \"from\" en \"to\" parameter.", + "apihelp-compare-summary": "Toon het verschil tussen 2 pagina's.", + "apihelp-compare-extended-description": "Een versienummer, een paginatitel of een pagina-ID is vereist voor zowel de \"from\" en \"to\" parameter.", "apihelp-compare-param-fromtitle": "Eerste paginanaam om te vergelijken.", "apihelp-compare-param-fromid": "Eerste pagina-ID om te vergelijken.", "apihelp-compare-param-fromrev": "Eerste versie om te vergelijken.", "apihelp-compare-param-totitle": "Tweede paginanaam om te vergelijken.", "apihelp-compare-param-toid": "Tweede pagina-ID om te vergelijken.", "apihelp-compare-param-torev": "Tweede versie om te vergelijken.", - "apihelp-createaccount-description": "Nieuwe gebruikersaccount aanmaken.", + "apihelp-createaccount-summary": "Nieuwe gebruikersaccount aanmaken.", "apihelp-createaccount-example-create": "Start het proces voor het aanmaken van de gebruiker Example met het wachtwoord ExamplePassword.", "apihelp-createaccount-param-name": "Gebruikersnaam.", "apihelp-createaccount-param-password": "Wachtwoord (genegeerd als $1mailpassword is ingesteld).", @@ -76,7 +77,7 @@ "apihelp-createaccount-param-language": "Taalcode om als standaard in te stellen voor de gebruiker (optioneel, standaard de inhoudstaal).", "apihelp-createaccount-example-pass": "Maak gebruiker testuser aan met wachtwoord test123.", "apihelp-createaccount-example-mail": "Maak gebruiker testmailuser aan en e-mail een willekeurig gegenereerd wachtwoord.", - "apihelp-delete-description": "Een pagina verwijderen.", + "apihelp-delete-summary": "Een pagina verwijderen.", "apihelp-delete-param-title": "Titel van de pagina om te verwijderen. Kan niet samen worden gebruikt met $1pageid.", "apihelp-delete-param-pageid": "ID van de pagina om te verwijderen. Kan niet samen worden gebruikt met $1title.", "apihelp-delete-param-reason": "Reden voor verwijdering. Wanneer dit niet is opgegeven wordt een automatisch gegenereerde reden gebruikt.", @@ -85,8 +86,8 @@ "apihelp-delete-param-unwatch": "De pagina van de volglijst van de huidige gebruiker verwijderen.", "apihelp-delete-example-simple": "Verwijder Main Page.", "apihelp-delete-example-reason": "Verwijder Main Page met als reden Preparing for move.", - "apihelp-disabled-description": "Deze module is uitgeschakeld.", - "apihelp-edit-description": "Aanmaken en bewerken van pagina's.", + "apihelp-disabled-summary": "Deze module is uitgeschakeld.", + "apihelp-edit-summary": "Aanmaken en bewerken van pagina's.", "apihelp-edit-param-title": "Naam van de pagina om te bewerken. Kan niet gebruikt worden samen met $1pageid.", "apihelp-edit-param-pageid": "ID van de pagina om te bewerken. Kan niet samen worden gebruikt met $1title.", "apihelp-edit-param-sectiontitle": "De naam van de nieuwe sectie.", @@ -110,7 +111,7 @@ "apihelp-edit-example-edit": "Een pagina bewerken.", "apihelp-edit-example-prepend": "Voeg __NOTOC__ toe aan het begin van een pagina.", "apihelp-edit-example-undo": "Versies 13579 tot 13585 ongedaan maken met automatische beschrijving.", - "apihelp-emailuser-description": "Gebruiker e-mailen.", + "apihelp-emailuser-summary": "Gebruiker e-mailen.", "apihelp-emailuser-param-target": "Gebruiker naar wie de e-mail moet worden gestuurd.", "apihelp-emailuser-param-subject": "Onderwerpkoptekst.", "apihelp-emailuser-param-text": "E-mailtekst.", @@ -120,7 +121,7 @@ "apihelp-expandtemplates-param-text": "Wikitekst om om te zetten.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "De uitgevulde wikitekst.", "apihelp-expandtemplates-paramvalue-prop-ttl": "De maximale tijdsduur waarna de cache van het resultaat moet worden weggegooid.", - "apihelp-feedcontributions-description": "Haalt de feed van de gebruikersbijdragen op.", + "apihelp-feedcontributions-summary": "Haalt de feed van de gebruikersbijdragen op.", "apihelp-feedcontributions-param-feedformat": "De indeling van de feed.", "apihelp-feedcontributions-param-user": "De gebruiker om de bijdragen voor te verkrijgen.", "apihelp-feedcontributions-param-year": "Van jaar (en eerder).", @@ -134,6 +135,7 @@ "apihelp-feedrecentchanges-param-feedformat": "De indeling van de feed.", "apihelp-feedrecentchanges-param-namespace": "Naamruimte om de resultaten tot te beperken.", "apihelp-feedrecentchanges-param-invert": "Alle naamruimten behalve de geselecteerde.", + "apihelp-feedrecentchanges-param-days": "Aantal dagen om de resultaten tot te beperken.", "apihelp-feedrecentchanges-param-limit": "Het maximaal aantal weer te geven resultaten.", "apihelp-feedrecentchanges-param-hideminor": "Kleine wijzigingen verbergen.", "apihelp-feedrecentchanges-param-hidebots": "Wijzigingen gedaan door bots verbergen.", @@ -146,22 +148,23 @@ "apihelp-feedrecentchanges-example-simple": "Recente wijzigingen weergeven.", "apihelp-feedrecentchanges-example-30days": "Recente wijzigingen van de afgelopen 30 dagen weergeven.", "apihelp-feedwatchlist-param-feedformat": "De indeling van de feed.", - "apihelp-filerevert-description": "Een oude versie van een bestand terugplaatsen.", + "apihelp-filerevert-summary": "Een oude versie van een bestand terugplaatsen.", "apihelp-filerevert-param-filename": "Doel bestandsnaam, zonder het Bestand: voorvoegsel.", "apihelp-filerevert-param-comment": "Opmerking voor het uploaden.", "apihelp-filerevert-example-revert": "Zet Wiki.png terug naar de versie van 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Toon help voor de opgegeven modules.", + "apihelp-help-summary": "Toon help voor de opgegeven modules.", "apihelp-help-param-helpformat": "Indeling van de help uitvoer.", "apihelp-help-example-main": "Hulp voor de hoofdmodule.", "apihelp-help-example-submodules": "Hulp voor action=query en alle submodules.", "apihelp-help-example-recursive": "Alle hulp op een pagina.", "apihelp-help-example-help": "Help voor de help-module zelf.", - "apihelp-imagerotate-description": "Een of meerdere afbeeldingen draaien.", + "apihelp-imagerotate-summary": "Een of meerdere afbeeldingen draaien.", "apihelp-imagerotate-param-rotation": "Aantal graden om de afbeelding met de klok mee te draaien.", "apihelp-imagerotate-param-tags": "Labels om toe te voegen aan de regel in het uploadlogboek.", "apihelp-imagerotate-example-simple": "Roteer File:Example.png met 90 graden.", "apihelp-imagerotate-example-generator": "Roteer alle afbeeldingen in Category:Flip met 180 graden.", - "apihelp-import-description": "Importeer een pagina van een andere wiki, of van een XML bestand.\n\nMerk op dat de HTTP POST moet worden uitgevoerd als bestandsupload (bijv. door middel van multipart/form-data) wanneer een bestand wordt verstuurd voor de xml parameter.", + "apihelp-import-summary": "Importeer een pagina van een andere wiki, of van een XML bestand.", + "apihelp-import-extended-description": "Merk op dat de HTTP POST moet worden uitgevoerd als bestandsupload (bijv. door middel van multipart/form-data) wanneer een bestand wordt verstuurd voor de xml parameter.", "apihelp-import-param-summary": "Importsamenvatting voor het logboek.", "apihelp-import-param-xml": "Geüpload XML-bestand.", "apihelp-import-param-interwikisource": "Voor interwiki imports: wiki om van te importeren.", @@ -172,15 +175,15 @@ "apihelp-login-param-password": "Wachtwoord.", "apihelp-login-param-domain": "Domein (optioneel).", "apihelp-login-example-login": "Aanmelden", - "apihelp-logout-description": "Afmelden en sessiegegevens wissen.", + "apihelp-logout-summary": "Afmelden en sessiegegevens wissen.", "apihelp-logout-example-logout": "Meldt de huidige gebruiker af.", "apihelp-managetags-param-tag": "Label om aan te maken, te activeren of te deactiveren. Voor het aanmaken van een label, mag het niet bestaan. Voor het verwijderen van een label, moet het bestaan. Voor het activeren van een label, moet het bestaan en mag het niet gebruikt worden door een uitbreiding. Voor het deactiveren van een label, moet het gebruikt worden en handmatig gedefinieerd zijn.", "apihelp-managetags-example-create": "Maak een label met de naam spam aan met als reden For use in edit patrolling", "apihelp-managetags-example-delete": "Verwijder het vandlaism label met de reden Misspelt", - "apihelp-mergehistory-description": "Geschiedenis van pagina's samenvoegen.", + "apihelp-mergehistory-summary": "Geschiedenis van pagina's samenvoegen.", "apihelp-mergehistory-param-reason": "Reden voor samenvoegen van de geschiedenis.", "apihelp-mergehistory-example-merge": "Voeg de hele geschiedenis van Oldpage samen met Newpage.", - "apihelp-move-description": "Pagina hernoemen.", + "apihelp-move-summary": "Pagina hernoemen.", "apihelp-move-param-to": "Nieuwe paginanaam.", "apihelp-move-param-reason": "Reden voor de naamswijziging.", "apihelp-move-param-movetalk": "Hernoem de overlegpagina, indien deze bestaat.", @@ -190,7 +193,7 @@ "apihelp-move-param-watchlist": "De pagina onvoorwaardelijk toevoegen aan of verwijderen van de volglijst van de huidige gebruiker, gebruik voorkeuren of wijzig het volgen niet.", "apihelp-move-param-ignorewarnings": "Eventuele waarschuwingen negeren.", "apihelp-move-example-move": "Hernoem Badtitle naar Goodtitle zonder een doorverwijzing te laten staan.", - "apihelp-opensearch-description": "Zoeken in de wiki met het OpenSearchprotocol.", + "apihelp-opensearch-summary": "Zoeken in de wiki met het OpenSearchprotocol.", "apihelp-opensearch-param-search": "Zoektekst.", "apihelp-opensearch-param-limit": "Het maximaal aantal weer te geven resultaten.", "apihelp-opensearch-param-namespace": "Te doorzoeken naamruimten.", @@ -199,7 +202,8 @@ "apihelp-opensearch-param-format": "Het uitvoerformaat.", "apihelp-opensearch-param-warningsaserror": "Als er waarschuwingen zijn met format=json, geef dan een API-fout terug in plaats van deze te negeren.", "apihelp-opensearch-example-te": "Pagina's vinden die beginnen met Te.", - "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 userjs- (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.", + "apihelp-options-summary": "Voorkeuren van de huidige gebruiker wijzigen.", + "apihelp-options-extended-description": "Alleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met userjs- (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 $1reset is ingesteld.", "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als naam=waarde (bijvoorbeeld skin=vector). Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld optienaam|andereoptie|..., dan wordt de optie ingesteld op de standaardwaarde. Als een opgegeven waarde een sluisteken bevat (|), gebruik dan het [[Special:ApiHelp/main#main/datatypes|alternatieve scheidingsteken tussen meerdere waardes]] voor een juiste werking.", @@ -207,12 +211,12 @@ "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door $1optionname.", "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.", "apihelp-options-example-change": "Voorkeuren wijzigen voor skin en hideminor.", - "apihelp-paraminfo-description": "Verkrijg informatie over API-modules.", + "apihelp-paraminfo-summary": "Verkrijg informatie over API-modules.", "apihelp-parse-paramvalue-prop-categorieshtml": "Vraagt een HTML-versie van de categorieën op.", "apihelp-parse-example-page": "Een pagina verwerken.", "apihelp-parse-example-text": "Wikitext verwerken.", "apihelp-parse-example-summary": "Een samenvatting verwerken.", - "apihelp-patrol-description": "Een pagina of versie markeren als gecontroleerd.", + "apihelp-patrol-summary": "Een pagina of versie markeren als gecontroleerd.", "apihelp-patrol-example-rcid": "Een recente wijziging markeren als gecontroleerd.", "apihelp-patrol-example-revid": "Een versie markeren als gecontroleerd.", "apihelp-protect-param-reason": "Reden voor opheffen van de beveiliging.", @@ -220,6 +224,7 @@ "apihelp-purge-param-forcelinkupdate": "Werk de koppelingstabellen bij.", "apihelp-purge-param-forcerecursivelinkupdate": "Werk de koppelingentabel bij, en werk de koppelingstabellen bij voor alle pagina's die gebruik maken van deze pagina als sjabloon.", "apihelp-query+allcategories-param-dir": "Richting om in te sorteren.", + "apihelp-query+allcategories-param-limit": "Hoeveel categorieën te tonen.", "apihelp-query+allcategories-paramvalue-prop-size": "Voegt het aantal pagina's in de categorie toe.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met __HIDDENCAT__", "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.", @@ -234,7 +239,7 @@ "apihelp-query+allmessages-param-lang": "Toon berichten in deze taal.", "apihelp-query+allmessages-param-from": "Toon berichten vanaf dit bericht.", "apihelp-query+allmessages-param-to": "Toon berichten tot aan dit bericht.", - "apihelp-query+allredirects-description": "Toon alle doorverwijzingen naar een naamruimte.", + "apihelp-query+allredirects-summary": "Toon alle doorverwijzingen naar een naamruimte.", "apihelp-query+allrevisions-example-user": "Toon de laatste 50 bijdragen van de gebruiker Example.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Vraag het MIME- en mediatype van het bestand op.", "apihelp-query+mystashedfiles-param-limit": "Hoeveel bestanden te tonen.", @@ -248,13 +253,13 @@ "apihelp-query+allusers-param-witheditsonly": "Toon alleen gebruikers die bewerkingen hebben gemaakt.", "apihelp-query+allusers-param-activeusers": "Toon alleen gebruikers die actief zijn geweest in de laatste $1 {{PLURAL:$1|dag|dagen}}.", "apihelp-query+allusers-example-Y": "Toon gebruikers vanaf Y.", - "apihelp-query+authmanagerinfo-description": "Haal informatie op over de huidige authentificatie status.", - "apihelp-query+backlinks-description": "Vind alle pagina's die verwijzen naar de gegeven pagina.", + "apihelp-query+authmanagerinfo-summary": "Haal informatie op over de huidige authentificatie status.", + "apihelp-query+backlinks-summary": "Vind alle pagina's die verwijzen naar de gegeven pagina.", "apihelp-query+backlinks-param-title": "Titel om op te zoeken. Kan niet worden gebruikt in combinatie met$1pageid.", "apihelp-query+backlinks-param-pageid": "Pagina ID om op te zoeken. Kan niet worden gebruikt in combinatie met $1title.", "apihelp-query+backlinks-param-namespace": "De naamruimte om door te lopen.", "apihelp-query+backlinks-example-simple": "Toon verwijzingen naar de Hoofdpagina.", - "apihelp-query+blocks-description": "Toon alle geblokkeerde gebruikers en IP-adressen.", + "apihelp-query+blocks-summary": "Toon alle geblokkeerde gebruikers en IP-adressen.", "apihelp-query+blocks-param-limit": "Het maximum aantal blokkades te tonen.", "apihelp-query+blocks-paramvalue-prop-id": "Voegt de blokkade ID toe.", "apihelp-query+blocks-paramvalue-prop-user": "Voegt de gebruikernaam van de geblokeerde gebruiker toe.", @@ -262,7 +267,7 @@ "apihelp-query+blocks-paramvalue-prop-flags": "Labelt de blokkade met (automatische blokkade, alleen anoniem, enzovoort).", "apihelp-query+blocks-example-simple": "Toon blokkades.", "apihelp-query+blocks-example-users": "Toon blokkades van gebruikers Alice en Bob.", - "apihelp-query+categories-description": "Toon alle categorieën waar de pagina in zit.", + "apihelp-query+categories-summary": "Toon alle categorieën waar de pagina in zit.", "apihelp-query+categories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met __HIDDENCAT__", "apihelp-query+categories-param-show": "Welke soort categorieën te tonen.", "apihelp-query+categories-param-limit": "Hoeveel categorieën te tonen.", @@ -305,7 +310,7 @@ "apihelp-query+revisions+base-paramvalue-prop-content": "Versietekst.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Labels voor de versie.", "apihelp-query+revisions+base-param-difftotextpst": "\"pre-save\"-transformatie uitvoeren op de tekst alvorens de verschillen te bepalen. Alleen geldig als dit wordt gebruikt met $1difftotext.", - "apihelp-query+search-description": "Voer een volledige tekst zoekopdracht uit.", + "apihelp-query+search-summary": "Voer een volledige tekst zoekopdracht uit.", "apihelp-query+search-param-limit": "Hoeveel pagina's te tonen.", "apihelp-query+search-example-simple": "Zoeken naar betekenis.", "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Toon geregistreerde naamruimte aliassen.", @@ -316,23 +321,23 @@ "apihelp-query+siteinfo-paramvalue-prop-extensions": "Toont uitbreidingen die op de wiki zijn geïnstalleerd.", "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Geeft een lijst met bestandsextensies (bestandstypen) die geüpload mogen worden.", "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Toont wiki rechten (licentie) informatie als deze beschikbaar is.", - "apihelp-query+tags-description": "Wijzigingslabels weergeven.", + "apihelp-query+tags-summary": "Wijzigingslabels weergeven.", "apihelp-query+tags-paramvalue-prop-name": "Voegt de naam van het label toe.", "apihelp-query+tags-paramvalue-prop-displayname": "Voegt het systeembericht toe voor het label.", "apihelp-query+tags-paramvalue-prop-description": "Voegt beschrijving van het label toe.", "apihelp-query+tags-paramvalue-prop-defined": "Geeft aan of het label is gedefinieerd.", "apihelp-query+tags-paramvalue-prop-active": "Of het label nog steeds wordt toegepast.", "apihelp-query+tags-example-simple": "Toon beschikbare labels.", - "apihelp-query+templates-description": "Toon alle pagina's ingesloten op de gegeven pagina's.", + "apihelp-query+templates-summary": "Toon alle pagina's ingesloten op de gegeven pagina's.", "apihelp-query+templates-param-limit": "Het aantal sjablonen om te tonen.", "apihelp-query+transcludedin-paramvalue-prop-pageid": "Pagina ID van elke pagina.", "apihelp-query+transcludedin-paramvalue-prop-title": "Titel van elke pagina.", - "apihelp-query+usercontribs-description": "Toon alle bewerkingen door een gebruiker.", + "apihelp-query+usercontribs-summary": "Toon alle bewerkingen door een gebruiker.", "apihelp-query+usercontribs-param-limit": "Het maximum aantal bewerkingen om te tonen.", "apihelp-query+usercontribs-param-namespace": "Toon alleen bijdragen in deze naamruimten.", "apihelp-query+usercontribs-param-tag": "Alleen versies weergeven met dit label.", "apihelp-query+usercontribs-example-ipprefix": "Toon bijdragen van alle IP-adressen met het voorvoegsel 192.0.2..", - "apihelp-query+userinfo-description": "Toon informatie over de huidige gebruiker.", + "apihelp-query+userinfo-summary": "Toon informatie over de huidige gebruiker.", "apihelp-query+userinfo-paramvalue-prop-realname": "Toon de gebruikers echte naam.", "apihelp-query+watchlist-paramvalue-prop-loginfo": "Voegt logboekgegevens toe waar van toepassing.", "apihelp-query+watchlist-param-type": "Welke typen wijzigingen weer te geven:", @@ -346,13 +351,14 @@ "apihelp-unblock-param-userid": "Gebruikers-ID om te deblokkeren. Kan niet worden gebruikt in combinatie met $1id of $1user.", "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, *-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment 2), kan zonder waarschuwing wijzigen.", "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, *-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment 2), kan zonder waarschuwing wijzigen.", - "apihelp-rawfm-description": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).", + "apihelp-rawfm-summary": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).", "api-help-flag-readrights": "Voor deze module zijn leesrechten nodig.", "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.", "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:", "api-help-param-deprecated": "Verouderd.", "api-help-datatypes-header": "Gegevenstypen", "api-help-param-default": "Standaard: $1", + "api-help-examples": "{{PLURAL:$1|Voorbeeld|Voorbeelden}}:", "apierror-autoblocked": "Uw IP-adres is automatisch geblokeerd, omdat het gebruikt is door een geblokkeerde gebruiker.", "apierror-badmodule-nosubmodules": "De module $1 heeft geen submodules.", "apierror-blockedfrommail": "U bent geblokkeerd en kunt geen emails verzenden.", @@ -371,6 +377,7 @@ "apierror-permissiondenied-generic": "Toegang geweigerd.", "apierror-readonly": "De wiki is momenteel in alleen-lezen modus.", "apierror-systemblocked": "U bent automatisch geblokkeerd door MediaWiki.", + "apierror-timeout": "De server heeft niet binnen de verwachte tijd geantwoord.", "apierror-unknownerror-nocode": "Onbekende fout.", "apierror-unknownerror": "Onbekende fout: \"$1\".", "apierror-unrecognizedparams": "Niet-herkende {{PLURAL:$2|parameter|parameters}}: $1.", diff --git a/includes/api/i18n/oc.json b/includes/api/i18n/oc.json index 8d1f4a52a6..514646f50a 100644 --- a/includes/api/i18n/oc.json +++ b/includes/api/i18n/oc.json @@ -8,7 +8,7 @@ }, "apihelp-main-param-action": "Quina accion cal efectuar.", "apihelp-main-param-format": "Lo format de sortida.", - "apihelp-block-description": "Blocar un utilizaire.", + "apihelp-block-summary": "Blocar un utilizaire.", "apihelp-block-param-reason": "Motiu del blocatge.", "apihelp-block-param-nocreate": "Empachar la creacion de compte.", "apihelp-checktoken-param-token": "Geton de testar.", @@ -19,28 +19,28 @@ "apihelp-compare-param-toid": "ID de la segonda pagina de comparar.", "apihelp-compare-param-torev": "Segonda revision de comparar.", "apihelp-compare-example-1": "Crear un diff entre lei revisions 1 e 2", - "apihelp-createaccount-description": "Creatz un novèl compte d'utilizaire.", + "apihelp-createaccount-summary": "Creatz un novèl compte d'utilizaire.", "apihelp-createaccount-param-name": "Nom d'utilizaire.", "apihelp-createaccount-param-password": "Senhal (ignorat se $1mailpassword es definit).", "apihelp-createaccount-param-realname": "Nom vertadièr de l’utilizaire (facultatiu).", - "apihelp-delete-description": "Suprimir una pagina.", + "apihelp-delete-summary": "Suprimir una pagina.", "apihelp-delete-example-simple": "Suprimir la Main Page.", - "apihelp-disabled-description": "Aqueste modul es estat desactivat.", - "apihelp-edit-description": "Crear e modificar las paginas.", + "apihelp-disabled-summary": "Aqueste modul es estat desactivat.", + "apihelp-edit-summary": "Crear e modificar las paginas.", "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 efectuada per un robòt.", "apihelp-edit-example-edit": "Modificar una pagina", "apihelp-edit-example-prepend": "Prefixar una pagina per __NOTOC__", - "apihelp-emailuser-description": "Mandar un corrièr electronic un l’utilizaire.", + "apihelp-emailuser-summary": "Mandar un corrièr electronic un l’utilizaire.", "apihelp-emailuser-param-subject": "Entèsta del subjècte.", "apihelp-emailuser-param-text": "Còs del corrièr electronic.", "apihelp-emailuser-param-ccme": "Me mandar una còpia d'aqueste corrièr electronic.", "apihelp-expandtemplates-param-title": "Títol de la pagina.", "apihelp-expandtemplates-param-text": "Wikitèxte de convertir.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "Lo wikitèxte desvolopat.", - "apihelp-feedcontributions-description": "Renvia lo fial de las contribucions d’un utilizaire.", + "apihelp-feedcontributions-summary": "Renvia lo fial de las contribucions d’un utilizaire.", "apihelp-feedcontributions-param-feedformat": "Lo format del flux.", "apihelp-feedcontributions-param-year": "A partir de l’annada (e mai recent) :", "apihelp-feedcontributions-param-month": "A partir del mes (e mai recent) :", @@ -60,18 +60,18 @@ "apihelp-login-param-password": "Senhal.", "apihelp-login-param-domain": "Domeni (facultatiu).", "apihelp-login-example-login": "Se connectar.", - "apihelp-managetags-description": "Efectuar de prètzfaits de gestion relatius a la modificacion de las balisas.", - "apihelp-mergehistory-description": "Fusionar leis istorics de pagina", - "apihelp-move-description": "Desplaçar una pagina.", + "apihelp-managetags-summary": "Efectuar de prètzfaits de gestion relatius a la modificacion de las balisas.", + "apihelp-mergehistory-summary": "Fusionar leis istorics de pagina", + "apihelp-move-summary": "Desplaçar una pagina.", "apihelp-opensearch-param-search": "Cadena de recèrca.", "apihelp-parse-example-page": "Analisar una pagina.", "apihelp-parse-example-text": "Analisar lo wikitèxte.", "apihelp-parse-example-summary": "Analisar un resumit.", - "apihelp-patrol-description": "Patrolhar una pagina o una revision.", + "apihelp-patrol-summary": "Patrolhar una pagina o una revision.", "apihelp-protect-example-protect": "Protegir una pagina", "apihelp-query-param-list": "Quinas listas obténer.", "apihelp-query-param-meta": "Quinas metadonadas obténer.", - "apihelp-query+allcategories-description": "Enumerar totas las categorias.", + "apihelp-query+allcategories-summary": "Enumerar totas las categorias.", "apihelp-query+alldeletedrevisions-param-from": "Aviar la lista a aqueste títol.", "apihelp-query+allimages-param-sort": "Proprietat per la quala cal triar.", "apihelp-query+allredirects-paramvalue-prop-title": "Ajustatz lo títol de la redireccion.", @@ -82,10 +82,10 @@ "apihelp-query+revisions+base-paramvalue-prop-tags": "Balisas de la revision.", "apihelp-query+watchlist-paramvalue-type-external": "Cambiaments extèrnes", "apihelp-query+watchlist-paramvalue-type-new": "Creacions de pagina", - "apihelp-resetpassword-description": "Mandar un corrier electronic de reïnicializacion de son senhau a l'utilizaire.", + "apihelp-resetpassword-summary": "Mandar un corrier electronic de reïnicializacion de son senhau a l'utilizaire.", "apihelp-stashedit-param-text": "Contengut de la pagina", "apihelp-tag-param-reason": "Motiu de la modificacion.", - "apihelp-unblock-description": "Desblocar un utilizaire.", + "apihelp-unblock-summary": "Desblocar un utilizaire.", "apihelp-unblock-param-reason": "Motiu del desblocatge.", "apihelp-unblock-example-id": "Levar lo blocatge d’ID #105.", "apihelp-undelete-param-reason": "Motiu de restauracion.", diff --git a/includes/api/i18n/olo.json b/includes/api/i18n/olo.json index 5c2cb6fac2..47c36ddb2b 100644 --- a/includes/api/i18n/olo.json +++ b/includes/api/i18n/olo.json @@ -6,7 +6,7 @@ ] }, "apihelp-createaccount-param-name": "Käyttäitunnus.", - "apihelp-delete-description": "Ota sivu iäre.", + "apihelp-delete-summary": "Ota sivu iäre.", "apihelp-login-param-name": "Käyttäitunnus.", "apihelp-login-param-password": "Salasana.", "apihelp-login-example-login": "Kirjuttai." diff --git a/includes/api/i18n/or.json b/includes/api/i18n/or.json index d7d0295a9d..b008f02df8 100644 --- a/includes/api/i18n/or.json +++ b/includes/api/i18n/or.json @@ -6,9 +6,9 @@ }, "apihelp-main-param-action": "କେଉଁ କାମ କରାଯିବ ।", "apihelp-main-param-format": "ଆଉଟପୁଟ୍‌ର ଫର୍ମାଟ ।", - "apihelp-block-description": "ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ବ୍ଲକ କରନ୍ତୁ ।", + "apihelp-block-summary": "ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ବ୍ଲକ କରନ୍ତୁ ।", "apihelp-block-param-reason": "ବ୍ଲକ କରିବାର କାରଣ ।", "apihelp-block-param-nocreate": "ଆକାଉଣ୍ଟ ତିଆରି ହେବାକୁ ପ୍ରତିରୋଧ କରନ୍ତୁ ।", "apihelp-createaccount-param-name": "ବ୍ୟବହାରକାରୀଙ୍କ ନାମ", - "apihelp-delete-description": "ପୃଷ୍ଠାଟି ଲିଭାଇଦେବେ" + "apihelp-delete-summary": "ପୃଷ୍ଠାଟି ଲିଭାଇଦେବେ" } diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json index 91e3e5037a..9b509ee60b 100644 --- a/includes/api/i18n/pl.json +++ b/includes/api/i18n/pl.json @@ -13,13 +13,14 @@ "The Polish", "Matma Rex", "Sethakill", - "Woytecr" + "Woytecr", + "InternerowyGołąb" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentacja]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n
    \nStan: Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\nBłędne żądania: Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\nTestowanie: Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentacja]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n
    \nStan: Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\nBłędne żądania: Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\nTestowanie: Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].", "apihelp-main-param-action": "Wybierz akcję do wykonania.", "apihelp-main-param-format": "Format danych wyjściowych.", - "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu maxlag jest zwracany z wiadomością jak Oczekiwanie na $host: $lag sekund opóźnienia.
    Zobacz [[mw:Manual:Maxlag_parameter|Podręcznik:Parametr Maxlag]] by uzyskać więcej informacji.", + "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu maxlag jest zwracany z wiadomością jak Oczekiwanie na $host: $lag sekund opóźnienia.
    Zobacz [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Podręcznik:Parametr Maxlag]] by uzyskać więcej informacji.", "apihelp-main-param-smaxage": "Ustaw nagłówek HTTP kontrolujący pamięć podręczną s-maxage na taką ilość sekund. Błędy nie będą nigdy przechowywane w pamięci podręcznej.", "apihelp-main-param-maxage": "Ustaw nagłówek HTTP kontrolujący pamięć podręczną maxage na taką ilość sekund. Błędy nie będą nigdy przechowywane w pamięci podręcznej.", "apihelp-main-param-assert": "Zweryfikuj, czy użytkownik jest zalogowany, jeżeli wybrano user, lub czy ma uprawnienia bota, jeżeli wybrano bot.", @@ -28,7 +29,7 @@ "apihelp-main-param-servedby": "Dołącz do odpowiedzi nazwę hosta, który obsłużył żądanie.", "apihelp-main-param-curtimestamp": "Dołącz obecny znacznik czasu do wyniku.", "apihelp-main-param-uselang": "Język, w którym mają być pokazywane tłumaczenia wiadomości. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] z siprop=languages zwróci listę języków lub ustaw jako user, aby pobrać z preferencji zalogowanego użytkownika lub content, aby wykorzystać język zawartości tej wiki.", - "apihelp-block-description": "Zablokuj użytkownika.", + "apihelp-block-summary": "Zablokuj użytkownika.", "apihelp-block-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz zablokować. Nie można używać razem z $1userid.", "apihelp-block-param-expiry": "Czas trwania. Może być względny (np. 5 months or 2 weeks) lub konkretny (np. 2014-09-18T12:34:56Z). Jeśli jest ustawiony na infinite, indefinite, lub never, blokada nigdy nie wygaśnie.", "apihelp-block-param-reason": "Powód blokady.", @@ -36,45 +37,48 @@ "apihelp-block-param-nocreate": "Zapobiegnij utworzeniu konta.", "apihelp-block-param-autoblock": "Zablokuj ostatni adres IP tego użytkownika i automatycznie wszystkie kolejne, z których będzie się logował.", "apihelp-block-param-noemail": "Uniemożliwia użytkownikowi wysyłanie wiadomości e-mail za pośrednictwem interfejsu wiki. (Wymagane uprawnienie blockemail).", - "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienia hideuser)", - "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienie hideuser)", + "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Jeżeli ten użytkownik jest już zablokowany, nadpisz blokadę.", - "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika i jego IP oraz ich strony dyskusji.", + "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika lub IP oraz ich strony dyskusji.", + "apihelp-block-param-tags": "Zmieniaj tagi by potwierdzić wejście do bloku logów.", "apihelp-block-example-ip-simple": "Zablokuj IP 192.0.2.5 na 3 dni z powodem First strike.", "apihelp-block-example-user-complex": "Zablokuj użytkownika Vandal na zawsze z powodem Vandalism i uniemożliw utworzenie nowego konta oraz wysyłanie emaili.", - "apihelp-changeauthenticationdata-description": "Zmień dane logowania bieżącego użytkownika.", + "apihelp-changeauthenticationdata-summary": "Zmień dane logowania bieżącego użytkownika.", "apihelp-changeauthenticationdata-example-password": "Spróbuj zmienić hasło bieżącego użytkownika na ExamplePassword.", - "apihelp-checktoken-description": "Sprawdź poprawność tokenu z [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Sprawdź poprawność tokenu z [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Typ tokenu do przetestowania.", "apihelp-checktoken-param-token": "Token do przetestowania.", "apihelp-checktoken-param-maxtokenage": "Maksymalny wiek tokenu, w sekundach.", "apihelp-checktoken-example-simple": "Sprawdź poprawność tokenu csrf.", - "apihelp-clearhasmsg-description": "Czyści flagę hasmsg dla bieżącego użytkownika.", + "apihelp-clearhasmsg-summary": "Czyści flagę hasmsg dla bieżącego użytkownika.", "apihelp-clearhasmsg-example-1": "Wyczyść flagę hasmsg dla bieżącego użytkownika.", + "apihelp-compare-summary": "Zauważ różnicę między dwoma stronami", "apihelp-compare-param-fromtitle": "Pierwszy tytuł do porównania.", "apihelp-compare-param-fromid": "ID pierwszej strony do porównania.", "apihelp-compare-param-fromrev": "Pierwsza wersja do porównania.", + "apihelp-compare-param-frompst": "Dokonaj zapisu wersji roboczej transformacji przeprowadzonej na fromtext.", "apihelp-compare-param-totitle": "Drugi tytuł do porównania.", "apihelp-compare-param-toid": "Numer drugiej strony do porównania.", "apihelp-compare-param-torev": "Druga wersja do porównania.", - "apihelp-createaccount-description": "Utwórz nowe konto.", + "apihelp-createaccount-summary": "Utwórz nowe konto.", "apihelp-createaccount-param-name": "Nazwa użytkownika", - "apihelp-createaccount-param-password": "Hasło (ignorowane jeśli $1mailpassword jest ustawione).", + "apihelp-createaccount-param-password": "Hasło (ignorowane jeśli ustawiono $1mailpassword).", "apihelp-createaccount-param-domain": "Domena uwierzytelniania zewnętrznego (opcjonalnie).", "apihelp-createaccount-param-token": "Token tworzenia konta uzyskany w pierwszym zapytaniu.", "apihelp-createaccount-param-email": "Adres email użytkownika (opcjonalne).", "apihelp-createaccount-param-realname": "Prawdziwe imię i nazwisko użytkownika (opcjonalne).", - "apihelp-createaccount-param-reason": "Opcjionalny powód tworzenia konta (aby został umieszczony w logu).", + "apihelp-createaccount-param-reason": "Opcjonalny powód tworzenia konta, który zostanie umieszczony w rejestrze.", "apihelp-createaccount-example-pass": "Utwórz użytkownika testuser z hasłem test123.", "apihelp-createaccount-example-mail": "Utwórz użytkownika testmailuser i wyślij losowo wygenerowane hasło na emaila.", - "apihelp-delete-description": "Usuń stronę.", - "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostaiwsz to pole puste, zostanie on wygenerowany automatycznie.", + "apihelp-delete-summary": "Usuń stronę.", + "apihelp-delete-param-reason": "Powód usuwania. Jeśli pozostawisz to pole puste, zostanie użyty powód wygenerowany automatycznie.", "apihelp-delete-param-watch": "Dodaj stronę do obecnej listy obserwowanych.", "apihelp-delete-param-unwatch": "Usuń stronę z obecnej listy obserwowanych.", "apihelp-delete-example-simple": "Usuń Main Page.", "apihelp-delete-example-reason": "Usuń Main Page z powodem Preparing for move.", - "apihelp-disabled-description": "Ten moduł został wyłączony.", - "apihelp-edit-description": "Twórz i edytuj strony.", + "apihelp-disabled-summary": "Ten moduł został wyłączony.", + "apihelp-edit-summary": "Twórz i edytuj strony.", "apihelp-edit-param-title": "Tytuł strony do edycji. Nie może być użyty równocześnie z $1pageid.", "apihelp-edit-param-pageid": "ID strony do edycji. Nie może być używany równocześnie z $1title.", "apihelp-edit-param-section": "Numer sekcji. 0 dla górnej sekcji, new dla nowej sekcji.", @@ -88,7 +92,7 @@ "apihelp-edit-param-basetimestamp": "Czas wersji, która jest edytowana. Służy do wykrywania konfliktów edycji. Można pobrać poprzez [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].", "apihelp-edit-param-starttimestamp": "Czas rozpoczęcia procesu edycji. Służy do wykrywania konfliktów edycji. Odpowiednia wartość może być pobrana za pomocą [[Special:ApiHelp/main|curtimestamp]] podczas rozpoczynania procesu edycji (np. podczas ładowania zawartości strony do edycji).", "apihelp-edit-param-recreate": "Ignoruj błędy o usunięciu strony w międzyczasie.", - "apihelp-edit-param-createonly": "Nie edytuj strony, jesli już istnieje.", + "apihelp-edit-param-createonly": "Nie edytuj strony, jeśli już istnieje.", "apihelp-edit-param-nocreate": "Zwróć błąd, jeśli strona nie istnieje.", "apihelp-edit-param-watch": "Dodaj stronę do listy obserwowanych bieżącego użytkownika.", "apihelp-edit-param-unwatch": "Usuń stronę z listy obserwowanych bieżącego użytkownika.", @@ -103,18 +107,18 @@ "apihelp-edit-param-token": "Token powinien być wysyłany jako ostatni parametr albo przynajmniej po parametrze $1text.", "apihelp-edit-example-edit": "Edytuj stronę.", "apihelp-edit-example-prepend": "Dopisz __NOTOC__ na początku strony.", - "apihelp-emailuser-description": "Wyślij e‐mail do użytkownika.", - "apihelp-emailuser-param-target": "Użytkownik, do którego wysyłany jest e-mail.", + "apihelp-emailuser-summary": "Wyślij e‐mail do użytkownika.", + "apihelp-emailuser-param-target": "Użytkownik, do którego wysłać e-mail.", "apihelp-emailuser-param-subject": "Nagłówek tematu.", "apihelp-emailuser-param-text": "Treść emaila.", "apihelp-emailuser-param-ccme": "Wyślij kopię wiadomości do mnie.", "apihelp-emailuser-example-email": "Wyślij e-mail do użytkownika WikiSysop z tekstem Content.", - "apihelp-expandtemplates-description": "Rozwija wszystkie szablony zawarte w wikitekście.", + "apihelp-expandtemplates-summary": "Rozwija wszystkie szablony zawarte w wikitekście.", "apihelp-expandtemplates-param-title": "Tytuł strony.", "apihelp-expandtemplates-param-text": "Wikitext do przekonwertowania.", "apihelp-expandtemplates-param-revid": "ID wersji, dla {{REVISIONID}} i podobnych zmiennych.", - "apihelp-expandtemplates-paramvalue-prop-wikitext": "Rozszerzony wikitext.", - "apihelp-feedcontributions-description": "Zwraca kanał wkładu użytkownika.", + "apihelp-expandtemplates-paramvalue-prop-wikitext": "Rozwinięty wikitekst.", + "apihelp-feedcontributions-summary": "Zwraca kanał wkładu użytkownika.", "apihelp-feedcontributions-param-feedformat": "Format danych wyjściowych.", "apihelp-feedcontributions-param-user": "Jakich użytkowników pobrać wkład.", "apihelp-feedcontributions-param-namespace": "Z jakiej przestrzeni nazw wyświetlać wkład użytkownika.", @@ -127,7 +131,7 @@ "apihelp-feedcontributions-param-hideminor": "Ukryj drobne zmiany.", "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.", "apihelp-feedcontributions-example-simple": "Zwróć liste edycji dokonanych przez użytkownika Example.", - "apihelp-feedrecentchanges-description": "Zwraca kanał ostatnich zmian.", + "apihelp-feedrecentchanges-summary": "Zwraca kanał ostatnich zmian.", "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.", "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.", "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.", @@ -149,17 +153,17 @@ "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.", "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.", "apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.", - "apihelp-feedwatchlist-description": "Zwraca kanał listy obserwowanych.", + "apihelp-feedwatchlist-summary": "Zwraca kanał listy obserwowanych.", "apihelp-feedwatchlist-param-feedformat": "Format kanału.", "apihelp-feedwatchlist-param-hours": "Wymień strony zmienione w ciągu tylu godzin licząc od teraz.", "apihelp-feedwatchlist-param-linktosections": "Linkuj bezpośrednio do zmienionych sekcji jeżeli to możliwe.", "apihelp-feedwatchlist-example-default": "Pokaż kanał listy obserwowanych.", "apihelp-feedwatchlist-example-all6hrs": "Pokaż wszystkie zmiany na obserwowanych stronach dokonane w ciągu ostatnich 6 godzin.", - "apihelp-filerevert-description": "Przywróć plik do starej wersji.", + "apihelp-filerevert-summary": "Przywróć plik do starej wersji.", "apihelp-filerevert-param-filename": "Docelowa nazwa pliku bez prefiksu Plik:", "apihelp-filerevert-param-comment": "Prześlij komentarz.", "apihelp-filerevert-example-revert": "Przywróć Wiki.png do wersji z 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.", + "apihelp-help-summary": "Wyświetl pomoc dla określonych modułów.", "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości action i format parametry, lub main). Może określić podmoduły z +.", "apihelp-help-param-submodules": "Dołącz pomoc podmodułów nazwanego modułu.", "apihelp-help-param-recursivesubmodules": "Zawiera pomoc dla podmodułów rekursywnie.", @@ -170,16 +174,17 @@ "apihelp-help-example-recursive": "Cała pomoc na jednej stronie.", "apihelp-help-example-help": "Pomoc dla modułu pomocy", "apihelp-help-example-query": "Pomoc dla dwóch podmodułów zapytań.", - "apihelp-imagerotate-description": "Obróć jeden lub wiecej obrazków.", + "apihelp-imagerotate-summary": "Obróć jeden lub wiecej obrazków.", "apihelp-imagerotate-param-rotation": "Stopni w prawo, aby obrócić zdjęcie.", "apihelp-imagerotate-example-simple": "Obróć Plik:Przykład.png o 90 stopni.", "apihelp-imagerotate-example-generator": "Obróć wszystkie obrazki w Kategorii:Flip o 180 stopni.", + "apihelp-import-summary": "Zaimportuj stronę z innej wiki, lub sformułuj plik XML.", "apihelp-import-param-summary": "Podsumowanie importu rekordów dziennika.", "apihelp-import-param-xml": "Przesłany plik XML.", - "apihelp-import-param-interwikisource": "Dla importów mediawiki: źródłowa wiki.", + "apihelp-import-param-interwikisource": "Dla importów interwiki: wiki, z której importować.", "apihelp-import-param-interwikipage": "Dla importów interwiki: strona do importu.", "apihelp-import-param-fullhistory": "Dla importów interwiki: importuj całą historię, a nie tylko obecną wersję.", - "apihelp-import-param-templates": "Dla importów mediawiki: importuj też wszystkie użyte szablony.", + "apihelp-import-param-templates": "Dla importów interwiki: importuj też wszystkie użyte szablony.", "apihelp-import-param-namespace": "Importuj do tej przestrzeni nazw. Nie może być użyte razem z $1rootpage.", "apihelp-import-param-rootpage": "Importuj jako podstronę tej strony. Nie może być użyte razem z $1namespace.", "apihelp-login-param-name": "Nazwa użytkownika.", @@ -188,9 +193,9 @@ "apihelp-login-param-token": "Token logowania zdobyty w pierwszym zapytaniu.", "apihelp-login-example-gettoken": "Zdobądź token logowania.", "apihelp-login-example-login": "Zaloguj się", - "apihelp-logout-description": "Wyloguj i wyczyść dane sesji.", + "apihelp-logout-summary": "Wyloguj i wyczyść dane sesji.", "apihelp-logout-example-logout": "Wyloguj obecnego użytkownika.", - "apihelp-managetags-description": "Wykonywanie zadań związanych z zarządzaniem znacznikami zmian.", + "apihelp-managetags-summary": "Wykonywanie zadań związanych z zarządzaniem znacznikami zmian.", "apihelp-managetags-param-operation": "Jakiej operacji dokonać:\n;create:Stworzenie nowego znacznika zmian do ręcznego użycia.\n;delete:Usunięcie znacznika zmian z bazy danych, włącznie z usunięciem danego znacznika z wszystkich oznaczonych nim zmian i wpisów rejestru i ostatnich zmian.\n;activate:Aktywuj znacznik zmian, użytkownicy będą mogli go ręcznie przypisywać.\n;deactivate:Dezaktywuj znacznik zmian, użytkownicy nie będą mogli przypisywać go ręcznie.", "apihelp-managetags-param-tag": "Znacznik do utworzenia, usunięcia, aktywacji lub dezaktywacji. Do utworzenia znacznika, nazwa nie misi istnieć. Do usunięcia znacznika, musi on istnieć. Do aktywacji znacznika, musi on istnieć i nie może być w użyciu przez żadne rozszerzenie. Do dezaktywowania znacznika, musi on być do tej pory aktywowany i ręcznie zdefiniowany.", "apihelp-managetags-param-reason": "Opcjonalny powód utworzenia, usunięcia, włączenia lub wyłączenia znacznika.", @@ -199,14 +204,14 @@ "apihelp-managetags-example-delete": "Usunięcie znacznika vandlaism z powodu Misspelt", "apihelp-managetags-example-activate": "Aktywacja znacznika o nazwie spam z powodem For use in edit patrolling", "apihelp-managetags-example-deactivate": "Dezaktywacja znacznika o nazwie spam z powodu No longer required", - "apihelp-mergehistory-description": "Łączenie historii edycji.", + "apihelp-mergehistory-summary": "Łączenie historii edycji.", "apihelp-mergehistory-param-from": "Tytuł strony, z której historia ma zostać połączona. Nie może być używane z $1fromid.", "apihelp-mergehistory-param-fromid": "ID strony, z której historia ma zostać połączona. Nie może być używane z $1from.", "apihelp-mergehistory-param-to": "Tytuł strony, z którą połączyć historię. Nie może być używane z $1toid.", "apihelp-mergehistory-param-toid": "ID strony, z którą połączyć historię. Nie może być używane z $1to.", "apihelp-mergehistory-param-reason": "Powód łączenia historii.", "apihelp-mergehistory-example-merge": "Połącz całą historię strony Oldpage ze stroną Newpage.", - "apihelp-move-description": "Przenieś stronę.", + "apihelp-move-summary": "Przenieś stronę.", "apihelp-move-param-from": "Tytuł strony do zmiany nazwy. Nie można używać razem z $1fromid.", "apihelp-move-param-to": "Tytuł na jaki zmienić nazwę strony.", "apihelp-move-param-reason": "Powód zmiany nazwy.", @@ -217,16 +222,17 @@ "apihelp-move-param-unwatch": "Usuń stronę i przekierowanie z listy obserwowanych bieżącego użytkownika.", "apihelp-move-param-ignorewarnings": "Ignoruj wszystkie ostrzeżenia.", "apihelp-move-example-move": "Przenieś Badtitle na Goodtitle bez pozostawienia przekierowania.", - "apihelp-opensearch-description": "Przeszukaj wiki przy użyciu protokołu OpenSearch.", + "apihelp-opensearch-summary": "Przeszukaj wiki przy użyciu protokołu OpenSearch.", "apihelp-opensearch-param-search": "Wyszukaj tekst.", "apihelp-opensearch-param-limit": "Maksymalna liczba zwracanych wyników.", "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania.", - "apihelp-opensearch-param-suggest": "Nie działa jeżeli [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] ustawiono na false.", + "apihelp-opensearch-param-suggest": "Nic nie robi, jeżeli [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] ustawiono na false.", "apihelp-opensearch-param-redirects": "Jak obsługiwać przekierowania:\n;return:Zwróć samo przekierowanie.\n;resolve:Zwróć stronę docelową. Może zwrócić mniej niż wyników określonych w $1limit.\nZ powodów historycznych, domyślnie jest to \"return\" dla $1format=json, a \"resolve\" dla innych formatów.", "apihelp-opensearch-param-format": "Format danych wyjściowych.", "apihelp-opensearch-param-warningsaserror": "Jeżeli pojawią się ostrzeżenia związane z format=json, zwróć błąd API zamiast ignorowania ich.", "apihelp-opensearch-example-te": "Znajdź strony zaczynające się od Te.", - "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 userjs- (do wykorzystywania przez skrypty użytkowników).", + "apihelp-options-summary": "Zmienia preferencje bieżącego użytkownika.", + "apihelp-options-extended-description": "Można ustawiać tylko opcje zarejestrowane w rdzeniu, w zainstalowanych rozszerzeniach lub z kluczami o prefiksie userjs- (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ę $1reset.", "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 (|), użyj [[Special:ApiHelp/main#main/datatypes|alternatywnego separatora wielu wartości]] aby operacja się powiodła.", @@ -235,11 +241,11 @@ "apihelp-options-example-reset": "Resetuj wszystkie preferencje.", "apihelp-options-example-change": "Zmień preferencje skin (skórka) i hideminor (ukryj drobne edycje).", "apihelp-options-example-complex": "Zresetuj wszystkie preferencje, a następnie ustaw skin i nickname.", - "apihelp-paraminfo-description": "Zdobądź informacje o modułach API.", + "apihelp-paraminfo-summary": "Zdobądź informacje o modułach API.", "apihelp-paraminfo-param-modules": "Lista nazw modułów (wartości parametrów action i format lub main). Można określić podmoduły za pomocą + lub wszystkie podmoduły, wpisując +*, lub wszystkie podmoduły rekursywnie +**.", - "apihelp-paraminfo-param-helpformat": "Format tekstów pomocnicznych.", + "apihelp-paraminfo-param-helpformat": "Format tekstów pomocy.", "apihelp-paraminfo-param-querymodules": "Lista nazw modułów zapytań (wartość parametrów prop, meta lub list). Użyj $1modules=query+foo zamiast $1querymodules=foo.", - "apihelp-parse-param-summary": "Powód do analizy.", + "apihelp-parse-param-summary": "Powód do sparsowania.", "apihelp-parse-param-prop": "Jakie porcje informacji otrzymać:", "apihelp-parse-paramvalue-prop-text": "Przetworzony tekst z wikitekstu.", "apihelp-parse-paramvalue-prop-langlinks": "Linki językowe z przetworzonego wikitekstu.", @@ -251,44 +257,44 @@ "apihelp-parse-paramvalue-prop-externallinks": "Linki zewnętrzne z przetworzonego wikitekstu.", "apihelp-parse-paramvalue-prop-sections": "Sekcje z przetworzonego wikitekstu.", "apihelp-parse-paramvalue-prop-displaytitle": "Dodaje tytuł parsowanego wikitekstu.", - "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitext, który został przeanalizowany.", - "apihelp-parse-param-preview": "Analizuj w trybie podglądu.", + "apihelp-parse-paramvalue-prop-wikitext": "Zwróć oryginalny wikitekst, który został sparsowany.", + "apihelp-parse-param-preview": "Parsuj w trybie podglądu.", "apihelp-parse-param-disabletoc": "Pomiń spis treści na wyjściu.", "apihelp-parse-example-page": "Przeanalizuj stronę.", - "apihelp-parse-example-text": "Analizuj wikitext.", - "apihelp-parse-example-summary": "Analizuj powód.", - "apihelp-patrol-description": "Sprawdź stronę lub edycję.", - "apihelp-patrol-param-rcid": "ID ostatnich zmian do patrolowania.", + "apihelp-parse-example-text": "Parsuj wikitekst.", + "apihelp-parse-example-summary": "Parsuj powód.", + "apihelp-patrol-summary": "Sprawdź stronę lub edycję.", + "apihelp-patrol-param-rcid": "ID z ostatnich zmian do oznaczenia jako sprawdzone.", "apihelp-patrol-param-revid": "Numer edycji do sprawdzenia.", "apihelp-patrol-example-rcid": "Sprawdź ostatnią zmianę.", "apihelp-patrol-example-revid": "Sprawdź edycje.", - "apihelp-protect-description": "Zmień poziom zabezpieczenia strony.", + "apihelp-protect-summary": "Zmień poziom zabezpieczenia strony.", "apihelp-protect-param-reason": "Powód zabezpieczania/odbezpieczania.", "apihelp-protect-param-cascade": "Włącz ochronę kaskadową (chronione są wszystkie osadzone szablony i obrazki na tej stronie). Ignorowane, jeśli żaden z danych poziomów ochrony nie wspiera kaskadowania.", "apihelp-protect-example-protect": "Zabezpiecz stronę", "apihelp-protect-example-unprotect": "Odbezpiecz stronę ustawiając ograniczenia na all (czyli każdy może wykonać działanie).", "apihelp-protect-example-unprotect2": "Odbezpiecz stronę ustawiając brak ograniczeń.", - "apihelp-purge-description": "Wyczyść pamięć podręczną dla stron o podanych tytułach.", + "apihelp-purge-summary": "Wyczyść pamięć podręczną dla stron o podanych tytułach.", "apihelp-purge-param-forcelinkupdate": "Uaktualnij tabele linków.", "apihelp-purge-param-forcerecursivelinkupdate": "Uaktualnij tabele linków włącznie z linkami dotyczącymi każdej strony wykorzystywanej jako szablon na tej stronie.", "apihelp-purge-example-simple": "Wyczyść strony Main Page i API.", "apihelp-purge-example-generator": "Przeczyść pierwsze 10 stron w przestrzeni głównej.", - "apihelp-query+allcategories-description": "Emuluj wszystkie kategorie.", + "apihelp-query+allcategories-summary": "Wymień 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-limit": "Liczba kategorii do zwrócenia.", "apihelp-query+allcategories-param-prop": "Jakie właściwości otrzymać:", "apihelp-query+allcategories-paramvalue-prop-size": "Dodaje liczbę stron w kategorii.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Oznacza kategorie ukryte za pomocą __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Wymień kategorie z informacjami o liczbie stron w każdej z nich.", - "apihelp-query+alldeletedrevisions-description": "Wymień wszystkie usunięte wersje użytkownika lub z przestrzeni nazw.", + "apihelp-query+alldeletedrevisions-summary": "Wymień wszystkie usunięte wersje użytkownika lub z przestrzeni nazw.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Może być użyte tylko z $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Nie może być używane z $3user.", "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-from": "Zacznij listowanie na tym tytule.", + "apihelp-query+alldeletedrevisions-param-to": "Skończ listowanie na tym tytule.", "apihelp-query+alldeletedrevisions-param-prefix": "Szukaj tytułów stron zaczynających się na tę wartość.", "apihelp-query+alldeletedrevisions-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.", "apihelp-query+alldeletedrevisions-param-user": "Pokazuj tylko zmiany dokonane przez tego użytkownika.", @@ -296,7 +302,7 @@ "apihelp-query+alldeletedrevisions-param-namespace": "Listuj tylko strony z tej przestrzeni nazw.", "apihelp-query+alldeletedrevisions-example-user": "Wymień ostatnie 50 usuniętych edycji przez użytkownika Example.", "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-summary": "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ć:", @@ -314,7 +320,7 @@ "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-param-namespace": "Przestrzeń nazw, z której wymieniać.", "apihelp-query+alllinks-param-limit": "Łączna liczba obiektów do zwrócenia.", "apihelp-query+alllinks-example-unique": "Lista unikatowych tytułów plików.", "apihelp-query+allmessages-param-prop": "Właściwości do odczytu.", @@ -330,14 +336,14 @@ "apihelp-query+allpages-example-B": "Pokaż listę stron rozpoczynających się na literę B.", "apihelp-query+allpages-example-generator": "Pokaż informacje o 4 stronach rozpoczynających się na literę T.", "apihelp-query+allpages-example-generator-revisions": "Pokaż zawartość pierwszych dwóch nieprzekierowujących stron, zaczynających się na Re.", - "apihelp-query+allredirects-description": "Lista wszystkich przekierowań do przestrzeni nazw.", + "apihelp-query+allredirects-summary": "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-namespace": "Przestrzeń nazw, z której wymieniać.", "apihelp-query+allredirects-param-limit": "Łączna liczba obiektów do zwrócenia.", - "apihelp-query+allrevisions-description": "Wyświetl wszystkie wersje.", + "apihelp-query+allrevisions-summary": "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.", @@ -347,7 +353,7 @@ "apihelp-query+mystashedfiles-param-limit": "Liczba plików do pobrania.", "apihelp-query+alltransclusions-param-prop": "Jakie informacje dołączyć:", "apihelp-query+alltransclusions-paramvalue-prop-title": "Dodaje tytuł osadzenia.", - "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw do emulacji.", + "apihelp-query+alltransclusions-param-namespace": "Przestrzeń nazw, z której wymieniać.", "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.", @@ -360,10 +366,10 @@ "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 Y.", - "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-summary": "Znajdź wszystkie strony, które linkują do danej strony.", + "apihelp-query+backlinks-param-namespace": "Przestrzeń nazw, z której wymieniać.", "apihelp-query+backlinks-example-simple": "Pokazuj linki do Main page.", - "apihelp-query+blocks-description": "Lista wszystkich zablokowanych użytkowników i adresów IP.", + "apihelp-query+blocks-summary": "Lista wszystkich zablokowanych użytkowników i adresów IP.", "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).", @@ -377,10 +383,11 @@ "apihelp-query+blocks-paramvalue-prop-reason": "Dodaje powód zablokowania.", "apihelp-query+blocks-paramvalue-prop-range": "Dodaje zakres adresów IP, na który zastosowano blokadę.", "apihelp-query+blocks-example-simple": "Listuj blokady.", + "apihelp-query+categories-summary": "Lista kategorii, do których należą strony", "apihelp-query+categories-paramvalue-prop-timestamp": "Dodaje znacznik czasu dodania kategorii.", "apihelp-query+categories-param-limit": "Liczba kategorii do zwrócenia.", - "apihelp-query+categoryinfo-description": "Zwraca informacje o danych kategoriach.", - "apihelp-query+categorymembers-description": "Wszystkie strony w danej kategorii.", + "apihelp-query+categoryinfo-summary": "Zwraca informacje o danych kategoriach.", + "apihelp-query+categorymembers-summary": "Wszystkie strony w danej kategorii.", "apihelp-query+categorymembers-param-title": "Kategoria, której zawartość wymienić (wymagane). Musi zawierać prefiks {{ns:category}}:. Nie może być używany równocześnie z $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID strony kategorii, z której wymienić strony. Nie może być użyty równocześnie z $1title.", "apihelp-query+categorymembers-param-prop": "Jakie informacje dołączyć:", @@ -392,21 +399,22 @@ "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-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.", "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-unique": "Listuj tylko jedną edycję dla każdej strony.", + "apihelp-query+deletedrevs-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.", "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+disabled-summary": "Ten moduł zapytań został wyłączony.", + "apihelp-query+duplicatefiles-summary": "Lista wszystkich plików które są duplikatami danych plików bazujących na wartościach z hashem.", + "apihelp-query+duplicatefiles-example-generated": "Szukaj duplikatów wśród wszystkich plików.", + "apihelp-query+embeddedin-param-filterredir": "Jak 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ć:", @@ -419,40 +427,40 @@ "apihelp-query+filearchive-paramvalue-prop-mime": "Dodaje typ MIME 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-summary": "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-summary": "Zwraca informacje o pliku i historię przesyłania.", "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Dodaje kanoniczny tytuł pliku.", "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias rozmiaru.", - "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dodaj sumę kontrolną SHA-1 dla tego pliku.", + "apihelp-query+imageinfo-paramvalue-prop-sha1": "Dołączy sumę kontrolną SHA-1 dla tego 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-summary": "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-param-prefix": "Prefix interwiki.", "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.", "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.", "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Dodaje tytuł interwiki.", - "apihelp-query+iwlinks-description": "Wyświetla wszystkie liki interwiki z danych stron.", + "apihelp-query+iwlinks-summary": "Wyświetla wszystkie liki interwiki z danych stron.", "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-description": "Zwraca wszystkie linki z danych stron.", + "apihelp-query+links-summary": "Zwraca wszystkie linki z danych stron.", "apihelp-query+links-param-namespace": "Pokaż linki tylko w tych przestrzeniach nazw.", "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-summary": "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-summary": "Pobierz zdarzenia z rejestru.", "apihelp-query+logevents-example-simple": "Lista ostatnich zarejestrowanych zdarzeń.", "apihelp-query+pagepropnames-param-limit": "Maksymalna liczba zwracanych nazw.", "apihelp-query+pageswithprop-param-prop": "Jakie informacje dołączyć:", @@ -465,11 +473,11 @@ "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.", "apihelp-query+prefixsearch-param-limit": "Maksymalna liczba zwracanych wyników.", "apihelp-query+prefixsearch-param-offset": "Liczba wyników do pominięcia.", - "apihelp-query+protectedtitles-description": "Lista wszystkich tytułów zabezpieczonych przed tworzeniem.", + "apihelp-query+protectedtitles-summary": "Lista wszystkich tytułów zabezpieczonych przed tworzeniem.", "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-paramvalue-prop-level": "Dodaje poziom zabezpieczeń.", - "apihelp-query+protectedtitles-example-simple": "Lista chronionych nagłówków", + "apihelp-query+protectedtitles-example-simple": "Wymień zabezpieczone tytuły.", "apihelp-query+querypage-param-page": "Nazwa strony specjalnej. Należy pamiętać o wielkości liter.", "apihelp-query+querypage-param-limit": "Liczba zwracanych wyników.", "apihelp-query+random-param-namespace": "Zwraca strony tylko w tych przestrzeniach nazw.", @@ -477,10 +485,10 @@ "apihelp-query+random-example-simple": "Zwraca dwie losowe strony z głównej przestrzeni 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+recentchanges-param-tag": "Pokazuj tylko zmiany oznaczone tym znacznikiem.", "apihelp-query+recentchanges-paramvalue-prop-comment": "Dodaje komentarz do edycji.", "apihelp-query+recentchanges-example-simple": "Lista ostatnich zmian.", - "apihelp-query+redirects-description": "Zwraca wszystkie przekierowania do danej strony.", + "apihelp-query+redirects-summary": "Zwraca wszystkie przekierowania do danej strony.", "apihelp-query+redirects-paramvalue-prop-title": "Nazwa każdego przekierowania.", "apihelp-query+redirects-param-limit": "Ile przekierowań zwrócić.", "apihelp-query+revisions+base-paramvalue-prop-ids": "Identyfikator wersji.", @@ -492,11 +500,12 @@ "apihelp-query+revisions+base-paramvalue-prop-content": "Tekst wersji.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Znaczniki wersji.", "apihelp-query+revisions+base-param-limit": "Ograniczenie na liczbę wersji, które będą zwrócone.", - "apihelp-query+search-description": "Wykonaj wyszukiwanie pełnotekstowe.", + "apihelp-query+search-summary": "Wykonaj wyszukiwanie pełnotekstowe.", "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-paramvalue-prop-hasrelated": "Zignorowano", "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 meaning.", @@ -507,14 +516,14 @@ "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-summary": "Lista znaczników zmian.", + "apihelp-query+tags-param-limit": "Maksymalna liczba znacznikó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+tags-example-simple": "Wymień dostępne znaczniki.", + "apihelp-query+templates-summary": "Zwraca wszystkie strony osadzone w danych stronach.", "apihelp-query+templates-param-namespace": "Pokaż szablony tylko w tych przestrzeniach nazw.", "apihelp-query+templates-param-limit": "Ile szablonów zwrócić?", "apihelp-query+transcludedin-paramvalue-prop-title": "Nazwa każdej strony.", @@ -522,16 +531,17 @@ "apihelp-query+transcludedin-param-limit": "Ile zwrócić.", "apihelp-query+usercontribs-paramvalue-prop-comment": "Dodaje komentarz edycji.", "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Dodaje sparsowany komentarz edycji.", - "apihelp-query+userinfo-description": "Pobierz informacje o aktualnym użytkowniku.", + "apihelp-query+userinfo-summary": "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-preferencestoken": "Zdobądź token, by zmienić bieżące preferencje użytkownika.", "apihelp-query+userinfo-paramvalue-prop-editcount": "Dodaje liczbę edycji bieżącego użytkownika.", "apihelp-query+userinfo-paramvalue-prop-email": "Dodaje adres e-mail użytkownika i datę jego potwierdzenia.", "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-summary": "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.", @@ -543,20 +553,21 @@ "apihelp-query+watchlist-paramvalue-prop-timestamp": "Dodaje znacznik czasu edycji.", "apihelp-query+watchlist-paramvalue-prop-sizes": "Dodaje starą i nową długość strony.", "apihelp-query+watchlist-paramvalue-type-external": "Zmiany zewnętrzne.", - "apihelp-resetpassword-description": "Wyślij użytkownikowi e-mail do resetowania hasła.", + "apihelp-resetpassword-summary": "Wyślij użytkownikowi e-mail do resetowania hasła.", "apihelp-resetpassword-example-email": "Wyślij e-mail do resetowania hasła do wszystkich użytkowników posiadających adres user@example.com.", "apihelp-revisiondelete-param-ids": "Identyfikatory wersji do usunięcia.", "apihelp-revisiondelete-param-hide": "Co ukryć w każdej z wersji.", "apihelp-revisiondelete-param-show": "Co pokazać w każdej z wersji.", "apihelp-revisiondelete-param-reason": "Powód usunięcia lub przywrócenia.", - "apihelp-setpagelanguage-description": "Zmień język strony.", + "apihelp-setpagelanguage-summary": "Zmień język strony.", + "apihelp-setpagelanguage-extended-description-disabled": "Zmiana języka strony nie jest dozwolona na tej wiki.\n\nWłącz [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] by użyć tej akcji.", "apihelp-setpagelanguage-param-reason": "Powód zmiany.", "apihelp-stashedit-param-title": "Tytuł edytowanej strony.", "apihelp-stashedit-param-sectiontitle": "Tytuł nowej sekcji.", "apihelp-stashedit-param-text": "Zawartość strony.", "apihelp-stashedit-param-summary": "Opis zmian.", "apihelp-tag-param-reason": "Powód zmiany.", - "apihelp-unblock-description": "Odblokuj użytkownika.", + "apihelp-unblock-summary": "Odblokuj użytkownika.", "apihelp-unblock-param-user": "Nazwa użytkownika, adres IP albo zakres adresów IP, które chcesz odblokować. Nie można używać jednocześnie z $1id lub $1userid.", "apihelp-unblock-param-reason": "Powód odblokowania.", "apihelp-undelete-param-title": "Tytuł strony do przywrócenia.", @@ -567,18 +578,18 @@ "apihelp-upload-param-file": "Zawartość pliku.", "apihelp-userrights-param-user": "Nazwa użytkownika.", "apihelp-userrights-param-userid": "Identyfikator użytkownika.", - "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup.", + "apihelp-userrights-param-add": "Dodaj użytkownika do tych grup, lub, jeżeli jest już ich członkiem, zmień czas wygaśnięcia członkostwa w tych grupach.", "apihelp-userrights-param-remove": "Usuń użytkownika z tych grup.", "apihelp-userrights-param-reason": "Powód zmiany.", "apihelp-validatepassword-param-password": "Hasło do walidacji.", - "apihelp-json-description": "Dane wyjściowe w formacie JSON.", - "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).", - "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.", - "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).", - "apihelp-xml-description": "Dane wyjściowe w formacie XML.", + "apihelp-json-summary": "Dane wyjściowe w formacie JSON.", + "apihelp-jsonfm-summary": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).", + "apihelp-php-summary": "Dane wyjściowe w serializowany formacie PHP.", + "apihelp-phpfm-summary": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).", + "apihelp-xml-summary": "Dane wyjściowe w formacie XML.", "apihelp-xml-param-xslt": "Jeśli określony, dodaje podaną stronę jako arkusz styli XSL. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwa kończy się na .xsl.", "apihelp-xml-param-includexmlnamespace": "Jeśli zaznaczono, dodaje przestrzeń nazw XML.", - "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).", + "apihelp-xmlfm-summary": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).", "api-format-title": "Wynik MediaWiki API", "api-pageset-param-titles": "Lista tytułów, z którymi pracować.", "api-pageset-param-pageids": "Lista identyfikatorów stron, z którymi pracować.", @@ -589,6 +600,7 @@ "api-help-title": "Pomoc MediaWiki API", "api-help-lead": "To jest automatycznie wygenerowana strona dokumentacji MediaWiki API.\nDokumentacja i przykłady: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Moduł główny", + "api-help-undocumented-module": "Brak dokumentacji dla modułu $1.", "api-help-flag-deprecated": "Ten moduł jest przestarzały.", "api-help-flag-internal": "Ten moduł jest wewnętrzny lub niestabilny. Jego działanie może się zmienić bez uprzedzenia.", "api-help-flag-readrights": "Ten moduł wymaga praw odczytu.", @@ -627,6 +639,7 @@ "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2", "api-help-right-apihighlimits": "Użyj wyższych limitów w zapytaniach API (dla zapytań powolnych: $1; dla zapytań szbkich: $2). Limity zapytań powolnych są także stosowane dla parametrów z podanymi wieloma wartościami.", "api-help-open-in-apisandbox": "[otwórz w brudnopisie]", + "apierror-articleexists": "Artykuł, który próbowałeś utworzyć, już został utworzony.", "apierror-baddiff": "Różnicy wersji nie można odtworzyć. Jedna lub obie wersje nie istnieją, lub nie masz uprawnień do ich wyświetlenia.", "apierror-badgenerator-unknown": "Nieznany generator=$1.", "apierror-badip": "Parametr IP nie jest prawidłowy.", @@ -682,6 +695,7 @@ "apierror-sectionsnotsupported-what": "Sekcje nie są obsługiwane przez $1.", "apierror-specialpage-cantexecute": "Nie masz uprawnień, aby zobaczyć wyniki tej strony specjalnej.", "apierror-stashwrongowner": "Nieprawidłowy właściciel: $1", + "apierror-timeout": "Serwer nie odpowiedział w spodziewanym czasie.", "apierror-unknownerror-nocode": "Nieznany błąd.", "apierror-unknownerror": "Nieznany błąd: „$1”.", "apierror-unknownformat": "Nierozpoznany format „$1”.", diff --git a/includes/api/i18n/ps.json b/includes/api/i18n/ps.json index c2545fc2ab..d3d3b7aa8c 100644 --- a/includes/api/i18n/ps.json +++ b/includes/api/i18n/ps.json @@ -6,20 +6,20 @@ ] }, "apihelp-main-param-action": "کومه کړنه ترسره کړم.", - "apihelp-block-description": "په يو کارن بنديز لگول.", + "apihelp-block-summary": "په يو کارن بنديز لگول.", "apihelp-block-param-user": "کارن-نوم، IP پته، يا IP سيمې باندې بنديز لگول.", "apihelp-block-param-reason": "د بنديز سبب.", "apihelp-block-param-nocreate": "د گڼون جوړولو مخ نيول.", "apihelp-createaccount-param-name": "کارن-نوم.", - "apihelp-delete-description": "يو مخ ړنگول.", + "apihelp-delete-summary": "يو مخ ړنگول.", "apihelp-delete-example-simple": "لومړی مخ ړنگول.", - "apihelp-edit-description": "مخونه جوړول او سمول.", + "apihelp-edit-summary": "مخونه جوړول او سمول.", "apihelp-edit-param-sectiontitle": "د يوې نوې برخې سرليک.", "apihelp-edit-param-text": "مخ مېنځپانگه.", "apihelp-edit-param-minor": "وړوکی سمون.", "apihelp-edit-param-bot": "دا سمون د روباټ په توگه په نښه کول.", "apihelp-edit-example-edit": "يو مخ سمول.", - "apihelp-emailuser-description": "کارن ته برېښليک لېږل.", + "apihelp-emailuser-summary": "کارن ته برېښليک لېږل.", "apihelp-emailuser-param-target": "هغه کارن چې برېښليک ورلېږې.", "apihelp-emailuser-param-subject": "د سکالو سرليک.", "apihelp-emailuser-param-text": "د برېښليک جوسه.", @@ -37,7 +37,7 @@ "apihelp-login-param-password": "پټنوم.", "apihelp-login-param-domain": "شپول (اختياري).", "apihelp-login-example-login": "ننوتل.", - "apihelp-move-description": "يو مخ لېږدول.", + "apihelp-move-summary": "يو مخ لېږدول.", "apihelp-protect-example-protect": "يو مخ ژغورل.", "apihelp-query+allpages-param-filterredir": "کوم مخونه چې لړليک کې راشي.", "apihelp-query+search-example-simple": "د meaning پلټل.", diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json index c340d4abdd..b09f57068d 100644 --- a/includes/api/i18n/pt-br.json +++ b/includes/api/i18n/pt-br.json @@ -11,202 +11,421 @@ "Caçador de Palavras", "LucyDiniz", "Eduardo Addad de Oliveira", - "Warley Felipe C." + "Warley Felipe C.", + "TheEduGobi", + "Felipe L. Ewald" ] }, + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentação]]\n* [[mw:Special:MyLanguage/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 Bugs & solicitações]\n
    \nStatus: Todos os recursos exibidos nesta página devem estar funcionando, mas a API ainda está em desenvolvimento ativo e pode mudar a qualquer momento. Inscrever-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para aviso de atualizações.\n\nRequisições incorretas: Quando requisições erradas são enviadas para a API, um cabeçalho HTTP será enviado com a chave \"MediaWiki-API-Error\" e então o valor do cabeçalho e o código de erro enviados de volta serão definidos para o mesmo valor. Para mais informações, veja [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\nTestando: Para facilitar o teste das requisições da API, consulte [[Special:ApiSandbox]].", "apihelp-main-param-action": "Qual ação executar.", "apihelp-main-param-format": "O formato da saída.", - "apihelp-main-param-smaxage": "Define o cabeçalho s-maxage para esta quantidade de segundos. Os erros não são armazenados em cache.", - "apihelp-main-param-maxage": "Define o cabeçalho max-age para esta quantidade de segundos. Os erros não são armazenados em cache.", - "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.", + "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki está instalado em um cluster replicado no banco de dados. Para salvar as ações que causam mais atraso na replicação do site, esse parâmetro pode fazer o cliente aguardar até que o atraso da replicação seja menor do que o valor especificado. Em caso de atraso excessivo, o código de erro maxlag é retornado com uma mensagem como Waiting for $host: $lag seconds lagged.
    Veja [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] para mais informações.", + "apihelp-main-param-smaxage": "Define o cabeçalho HTTP de controle de cache s-maxage para esta quantidade de segundos. Erros não são armazenados em cache.", + "apihelp-main-param-maxage": "Define o cabeçalho HTTP de controle de cache max-age para esta quantidade de segundos. Erros não são armazenados em cache.", + "apihelp-main-param-assert": "Verifique se o usuário está logado se configurado para user ou tem o direito do usuário do bot se bot.", + "apihelp-main-param-assertuser": "Verificar que o usuário atual é o utilizador nomeado.", "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.", "apihelp-main-param-servedby": "Inclua o nome de host que atendeu a solicitação nos resultados.", - "apihelp-main-param-curtimestamp": "Inclui a data atual no resultado.", - "apihelp-block-description": "Bloquear um usuário", - "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.", + "apihelp-main-param-curtimestamp": "Inclui o timestamp atual no resultado.", + "apihelp-main-param-responselanginfo": "Inclua os idiomas usados para uselang e errorlang no resultado.", + "apihelp-main-param-origin": "Ao acessar a API usando uma solicitação AJAX por domínio cruzado (CORS), defina isto como o domínio de origem. Isto deve estar incluso em toda solicitação ''pre-flight'', sendo portanto parte do URI da solicitação (ao invés do corpo do POST).\n\nPara solicitações autenticadas, isto deve corresponder a uma das origens no cabeçalho Origin, para que seja algo como https://pt.wikipedia.org ou https://meta.wikimedia.org. Se este parâmetro não corresponder ao cabeçalho Origin, uma resposta 403 será retornada. Se este parâmetro corresponder ao cabeçalho Origin e a origem for permitida (''whitelisted''), os cabeçalhos Access-Control-Allow-Origin e Access-Control-Allow-Credentials serão definidos.\n\nPara solicitações não autenticadas, especifique o valor *. Isto fará com que o cabeçalho Access-Control-Allow-Origin seja definido, porém o Access-Control-Allow-Credentials será false e todos os dados específicos para usuários tornar-se-ão restritos.", + "apihelp-main-param-uselang": "Linguagem a ser usada para traduções de mensagens. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] com siprop=languages retorna uma lista de códigos de idioma ou especifique user para usar a preferência de idioma do usuário atual ou especifique content para usar o idioma de conteúdo desta wiki.", + "apihelp-main-param-errorformat": "Formato a ser usado aviso e saída de texto de erro.\n; Texto simples: Texto wiki com tags HTML removidas e entidades substituídas.\n; Wikitext: Unparsed wikitext. \n; html: HTML.\n; Bruto: chave e parâmetros da mensagem.\n; Nenhum: sem saída de texto, apenas os códigos de erro.\n; Bc: Formato usado antes do MediaWiki 1.29. errorlang e errorsuselocal são ignorados.", + "apihelp-main-param-errorlang": "Linguagem a utilizar para avisos e erros. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] com siprop=languages retorna uma lista de códigos de idioma ou especifique content para usar o idioma do conteúdo desta wiki ou especifique uselang para usar o mesmo valor que o parâmetro uselang.", + "apihelp-main-param-errorsuselocal": "Se for dado, os textos de erro usarão mensagens customizadas localmente a partir do espaço nominal {{ns: MediaWiki}}.", + "apihelp-block-summary": "Bloquear um usuário.", + "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear. Não pode ser usado junto com $1userid", + "apihelp-block-param-userid": "ID de usuário para bloquear. Não pode ser usado em conjunto com $1user.", + "apihelp-block-param-expiry": "Tempo de expiração. Pode ser relativo (por exemplo 5 meses ou 2 semanas) ou absoluto (por exemplo 2014-09-18T12:34:56Z). Se definido para infinite, indefinite ou never, o bloqueio nunca irá expirar.", "apihelp-block-param-reason": "Razão do bloqueio.", - "apihelp-block-param-anononly": "Bloqueia apenas usuários anônimos (ou seja desativa edições anônimas para este endereço IP).", + "apihelp-block-param-anononly": "Bloqueia apenas usuários anônimos (ou seja. desativa edições anônimas para este endereço IP).", "apihelp-block-param-nocreate": "Prevenir a criação de conta.", - "apihelp-block-param-autoblock": "Bloquear automaticamente o endereço IP usado e quaisquer endereços IPs subseqüentes que tentarem acessar a partir deles.", + "apihelp-block-param-autoblock": "Bloquear automaticamente o endereço IP usado e quaisquer endereços IPs subsequentes que tentarem acessar a partir deles.", + "apihelp-block-param-noemail": "Impedir que o usuário envie e-mails através da wiki. (Requer o direito blockemail).", "apihelp-block-param-hidename": "Oculta o nome do usuário do ''log'' de bloqueio. (Requer o direito hideuser).", + "apihelp-block-param-allowusertalk": "Permitir que o usuário edite sua própria página de discussão (depende de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Se o usuário já estiver bloqueado, sobrescrever o bloqueio 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 endereço IP 192.0.2.5 por três dias com razão Primeira medida.", - "apihelp-block-example-user-complex": "Bloquear usuário Vandal indefinidamente com razão Vandalism e o impede de criar nova conta e envio de emails.", + "apihelp-block-param-watchuser": "Vigiar as páginas de usuário e de discussão, do usuário ou do endereço IP.", + "apihelp-block-param-tags": "Alterar as tags para se inscrever na entrada no registro de bloqueio.", + "apihelp-block-example-ip-simple": "Bloquear endereço IP 192.0.2.5 por três dias com razão First strike.", + "apihelp-block-example-user-complex": "Bloquear usuário Vandal indefinidamente com razão Vandalism e o impedir de criar nova conta e de enviar e-mails.", + "apihelp-changeauthenticationdata-summary": "Alterar os dados de autenticação para o usuário atual.", + "apihelp-changeauthenticationdata-example-password": "Tenta alterar a senha do usuário atual para ExamplePassword.", + "apihelp-checktoken-summary": "Verificar a validade de um token de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-param-type": "Tipo de token que está sendo testado.", + "apihelp-checktoken-param-token": "Token para testar.", + "apihelp-checktoken-param-maxtokenage": "Idade máxima permitida do token, em segundos.", + "apihelp-checktoken-example-simple": "Testa a validade de um token csrf.", + "apihelp-clearhasmsg-summary": "Limpa a etiqueta hasmsg do usuário atual.", + "apihelp-clearhasmsg-example-1": "Limpa a etiqueta hasmsg do usuário atual.", + "apihelp-clientlogin-summary": "Faça o login no wiki usando o fluxo interativo.", + "apihelp-clientlogin-example-login": "Comeca o processo de logar na wiki como usuário Exemple com a senha ExamplePassword.", + "apihelp-clientlogin-example-login2": "Continuar efetuando login após uma resposta UI para autenticação de dois fatores, fornecendo um OATHToken de 987654.", + "apihelp-compare-summary": "Obter a diferença entre duas páginas.", + "apihelp-compare-extended-description": "Um número de revisão, um título de página, um ID de página, um texto ou uma referência relativa para \"de\" e \"para\" devem ser fornecidos.", "apihelp-compare-param-fromtitle": "Primeiro título para comparar.", "apihelp-compare-param-fromid": "Primeiro ID de página para comparar.", "apihelp-compare-param-fromrev": "Primeira revisão para comparar.", + "apihelp-compare-param-fromtext": "Use este texto em vez do conteúdo da revisão especificada por fromtitle, fromid ou fromrev.", + "apihelp-compare-param-frompst": "Faz uma transformação pré-salvar em fromtext.", + "apihelp-compare-param-fromcontentmodel": "Modelo de conteúdo de fromtext. Se não for fornecido, será adivinhado com base nos outros parâmetros.", + "apihelp-compare-param-fromcontentformat": "Formato de serialização de conteúdo de fromtext.", "apihelp-compare-param-totitle": "Segundo título para comparar.", "apihelp-compare-param-toid": "Segundo ID de página para comparar.", "apihelp-compare-param-torev": "Segunda revisão para comparar.", + "apihelp-compare-param-torelative": "Use uma revisão relativa à revisão determinada de fromtitle, fromid ou fromrev. Todas as outras opções 'to' serão ignoradas.", + "apihelp-compare-param-totext": "Use este texto em vez do conteúdo da revisão especificada por totitle, toid ou torev.", + "apihelp-compare-param-topst": "Faz uma transformação pré-salvar em totext.", + "apihelp-compare-param-tocontentmodel": "Modelo de conteúdo de totext. Se não for fornecido, será adivinhado com base nos outros parâmetros.", + "apihelp-compare-param-tocontentformat": "Formato de serialização de conteúdo de totext.", + "apihelp-compare-param-prop": "Quais peças de informação incluir.", + "apihelp-compare-paramvalue-prop-diff": "O dif do HTML.", + "apihelp-compare-paramvalue-prop-diffsize": "O tamanho do diff HTML, em bytes.", + "apihelp-compare-paramvalue-prop-rel": "Os IDs de revisão da revisão anteriores a 'from' e depois 'to', se houver.", + "apihelp-compare-paramvalue-prop-ids": "Os Ids da página e de revisão das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-title": "O título das páginas 'from' e 'to' das revisões.", + "apihelp-compare-paramvalue-prop-user": "O nome de usuário e o ID das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-comment": "O comentário das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-parsedcomment": "O comentário analisado sobre as revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-size": "O tamanho das revisões 'from' e 'to'.", "apihelp-compare-example-1": "Criar um diff entre a revisão 1 e 2.", - "apihelp-createaccount-description": "Criar uma nova conta de usuário.", + "apihelp-createaccount-summary": "Criar uma nova conta de usuário.", + "apihelp-createaccount-param-preservestate": "Se [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] retornar true para hasprimarypreservedstate, pedidos marcados como hasprimarypreservedstate devem ser omitidos. Se retornou um valor não vazio para preservedusername, esse nome de usuário deve ser usado pelo parâmetro username.", + "apihelp-createaccount-example-create": "Inicie o processo de criação do usuário Example com a senha ExamplePassword.", "apihelp-createaccount-param-name": "Nome de usuário.", "apihelp-createaccount-param-password": "Senha (ignorada se $1mailpassword está definida).", "apihelp-createaccount-param-domain": "Domínio para autenticação externa (opcional).", - "apihelp-createaccount-param-email": "Endereço de email para o usuário (opcional).", + "apihelp-createaccount-param-token": "Token de criação de conta obtido no primeiro pedido.", + "apihelp-createaccount-param-email": "Endereço de e-mail para o usuário (opcional).", "apihelp-createaccount-param-realname": "Nome real do usuário (opcional).", - "apihelp-delete-description": "Excluir uma página.", + "apihelp-createaccount-param-mailpassword": "Se configurado para qualquer valor, uma senha aleatória será enviada por e-mail ao usuário.", + "apihelp-createaccount-param-reason": "Razão opcional para criar a conta a ser colocada nos logs.", + "apihelp-createaccount-param-language": "Código de idioma para definir como padrão para o usuário (opcional, padrão para o idioma do conteúdo).", + "apihelp-createaccount-example-pass": "Criar usuário testuser com senha test123.", + "apihelp-createaccount-example-mail": "Criar usuário testmailuser e enviar um e-mail com uma senha gerada aleatoriamente.", + "apihelp-cspreport-summary": "Usado por navegadores para denunciar violações da Política de Segurança de Conteúdo. Este módulo nunca deve ser usado, exceto quando usado automaticamente por um navegador web compatível com CSP.", + "apihelp-cspreport-param-reportonly": "Marque como sendo um relatório de uma política de monitoramento, não uma política forçada", + "apihelp-cspreport-param-source": "O que gerou o cabeçalho CSP que desencadeou este relatório", + "apihelp-delete-summary": "Excluir uma página.", "apihelp-delete-param-title": "Título da página para excluir. Não pode ser usado em conjunto com $1pageid.", - "apihelp-delete-param-pageid": "ID da página para excluir. Não pode ser usada juntamente com $1title.", - "apihelp-delete-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.", - "apihelp-delete-param-unwatch": "Remove a página para a lista de vigiados do usuário atual.", + "apihelp-delete-param-pageid": "ID da página para excluir. Não pode ser usada em conjunto com $1title.", + "apihelp-delete-param-reason": "Razão para a exclusão. Se não for definido, um motivo gerado automaticamente será usado.", + "apihelp-delete-param-tags": "Alterar as tags para se inscrever na entrada no registro de exclusão.", + "apihelp-delete-param-watch": "Adiciona a página para a lista de páginas vigiadas do usuário atual.", + "apihelp-delete-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", + "apihelp-delete-param-unwatch": "Remove a página da lista de páginas vigiadas do usuário atual.", + "apihelp-delete-param-oldimage": "O nome da imagem antiga para excluir, conforme fornecido por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Excluir Main Page.", - "apihelp-disabled-description": "Este módulo foi desativado.", - "apihelp-edit-description": "Criar e editar páginas.", + "apihelp-delete-example-reason": "Excluir Main Page com o motivo Preparing for move.", + "apihelp-disabled-summary": "Este módulo foi desativado.", + "apihelp-edit-summary": "Criar e editar páginas.", "apihelp-edit-param-title": "Título da página para editar. Não pode ser usado em conjunto com $1pageid.", - "apihelp-edit-param-pageid": "ID da página para editar. Não pode ser usada juntamente com $1title.", + "apihelp-edit-param-pageid": "ID da página para editar. Não pode ser usada em conjunto com $1title.", + "apihelp-edit-param-section": "Número da seção. 0 para a seção superior, new para uma nova seção.", "apihelp-edit-param-sectiontitle": "O título para uma nova seção.", - "apihelp-edit-param-text": "Conteúdo da página", + "apihelp-edit-param-text": "Conteúdo da página.", + "apihelp-edit-param-summary": "Edit o resumo. Também o título da seção quando $1section=new e $1sectiontitle não está definido.", + "apihelp-edit-param-tags": "Alterar as tags para aplicar à revisão.", "apihelp-edit-param-minor": "Edição menor.", "apihelp-edit-param-notminor": "Edição não-menor.", - "apihelp-edit-param-bot": "Marcar esta edição como feita por bot.", - "apihelp-edit-param-createonly": "Não editar a página se já existir.", + "apihelp-edit-param-bot": "Marcar esta edição como uma edição de bot.", + "apihelp-edit-param-basetimestamp": "Timestamp da revisão base, usada para detectar conflitos de edição. Pode ser obtido através de [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].", + "apihelp-edit-param-starttimestamp": "Timestamp quando o processo de edição começou, usado para detectar conflitos de edição. Um valor apropriado pode ser obtido usando [[Special:ApiHelp/main|curtimestamp]] ao iniciar o processo de edição (por exemplo, ao carregar o conteúdo da página a editar).", + "apihelp-edit-param-recreate": "Substitua quaisquer erros sobre a página que foram eliminados enquanto isso.", + "apihelp-edit-param-createonly": "Não editar a página se ela já existir.", "apihelp-edit-param-nocreate": "Mostra um erro se a página não existir.", - "apihelp-edit-param-watch": "Adiciona a página para a lista de vigiados do usuário atual.", - "apihelp-edit-param-unwatch": "Remove a página para a lista de vigiados do usuário atual.", - "apihelp-edit-param-watchlist": "Incondicionalmente adiciona ou página para a lista de vigiados do usuário atual, usa as preferências ou não modifica.", + "apihelp-edit-param-watch": "Adiciona a página para a lista de páginas vigiadas do usuário atual.", + "apihelp-edit-param-unwatch": "Remove a página da lista de páginas vigiadas do usuário atual.", + "apihelp-edit-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", + "apihelp-edit-param-md5": "O hash MD5 do parâmetro $1text ou os parâmetros $1prependtext e $1appendtext concatenados. Se configurado, a edição não será feita a menos que o hash esteja correto.", + "apihelp-edit-param-prependtext": "Adiciona este texto ao início da página. Substitui $1text.", + "apihelp-edit-param-appendtext": "Adiciona este texto ao fim da página. Substitui $1text.\n\nUse $1section=new para anexar uma nova seção, 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 de $1undo para este. Se não estiver configurado, desfaz uma revisão.", + "apihelp-edit-param-redirect": "Resolve redirecionamento automaticamente.", "apihelp-edit-param-contentformat": "Formato de serialização de conteúdo usado para o texto de entrada.", "apihelp-edit-param-contentmodel": "Modelo de conteúdo do novo conteúdo.", + "apihelp-edit-param-token": "O token sempre deve ser enviado como o último parâmetro, ou pelo menos após o parâmetro $1text.", "apihelp-edit-example-edit": "Edita uma página.", "apihelp-edit-example-prepend": "Antecende __NOTOC__ a página.", - "apihelp-emailuser-description": "Envia email para o usuário.", - "apihelp-emailuser-param-target": "Usuário a se enviar o email.", + "apihelp-edit-example-undo": "Desfazer as revisões 13579 até 13585 com sumário automático.", + "apihelp-emailuser-summary": "Envia e-mail para o usuário.", + "apihelp-emailuser-param-target": "Usuário a se enviar o e-mail.", "apihelp-emailuser-param-subject": "Cabeçalho do assunto.", - "apihelp-emailuser-param-text": "Corpo do email.", - "apihelp-emailuser-param-ccme": "Envie uma cópia deste email para mim.", + "apihelp-emailuser-param-text": "Corpo do e-mail.", + "apihelp-emailuser-param-ccme": "Envie uma cópia deste e-mail para mim.", "apihelp-emailuser-example-email": "Enviar um e-mail ao usuário WikiSysop com o texto Content.", - "apihelp-expandtemplates-description": "Expande todas a predefinições em wikitexto.", + "apihelp-expandtemplates-summary": "Expande todas a predefinições em texto wiki.", "apihelp-expandtemplates-param-title": "Título da página.", - "apihelp-expandtemplates-param-text": "Wikitexto para converter.", - "apihelp-expandtemplates-paramvalue-prop-wikitext": "O wikitexto expandido.", - "apihelp-feedcontributions-description": "Retorna o feed de contribuições de um usuário.", + "apihelp-expandtemplates-param-text": "Texto wiki para converter.", + "apihelp-expandtemplates-param-revid": "ID da revisão, para {{REVISIONID}} e variáveis semelhantes.", + "apihelp-expandtemplates-param-prop": "Quais peças de informação obter.\n\nNote que se nenhum valor for selecionado, o resultado conterá o texto wiki, mas o resultado será em um formato obsoleto.", + "apihelp-expandtemplates-paramvalue-prop-wikitext": "O texto wiki expandido.", + "apihelp-expandtemplates-paramvalue-prop-categories": "Quaisquer categorias presentes na entrada que não estão representadas na saída wikitext.", + "apihelp-expandtemplates-paramvalue-prop-properties": "Propriedades da página definidas por palavras mágicas expandidas no texto wiki.", + "apihelp-expandtemplates-paramvalue-prop-volatile": "Se a saída é volátil e não deve ser reutilizada em outro lugar dentro da página.", + "apihelp-expandtemplates-paramvalue-prop-ttl": "O tempo máximo após o qual os caches do resultado devem ser invalidados.", + "apihelp-expandtemplates-paramvalue-prop-modules": "Quaisquer módulos ResourceLoader que as funções do analisador solicitaram foram adicionados à saída. Contudo, jsconfigvars ou encodedjsconfigvars devem ser solicitados em conjunto com modules.", + "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página.", + "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página como uma string JSON.", + "apihelp-expandtemplates-paramvalue-prop-parsetree": "A árvore de analise XML da entrada.", + "apihelp-expandtemplates-param-includecomments": "Se devem ser incluídos comentários HTML na saída.", + "apihelp-expandtemplates-param-generatexml": "Gerar XML parse tree (substituído por $1prop=parsetree).", + "apihelp-expandtemplates-example-simple": "Expandir o texto wiki {{Project:Sandbox}}.", + "apihelp-feedcontributions-summary": "Retorna o feed de contribuições de um usuário.", "apihelp-feedcontributions-param-feedformat": "O formato do feed.", + "apihelp-feedcontributions-param-user": "De quais usuários receber as contribuições.", "apihelp-feedcontributions-param-namespace": "A partir de qual espaço nominal filtrar contribuições.", - "apihelp-feedcontributions-param-year": "Ano (inclusive anteriores):", - "apihelp-feedcontributions-param-month": "Mês (inclusive anteriores).", + "apihelp-feedcontributions-param-year": "Do ano (inclusive anteriores).", + "apihelp-feedcontributions-param-month": "Do mês (inclusive anteriores).", "apihelp-feedcontributions-param-tagfilter": "Filtrar contribuições que têm essas tags.", "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições excluídas.", "apihelp-feedcontributions-param-toponly": "Mostrar somente as edições que sejam a última revisão.", "apihelp-feedcontributions-param-newonly": "Mostrar somente as edições que são criação de páginas.", "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar a diferença de tamanho entre as revisões.", - "apihelp-feedrecentchanges-description": "Retorna um feed de alterações recentes.", + "apihelp-feedcontributions-example-simple": "Retornar contribuições do usuário Example.", + "apihelp-feedrecentchanges-summary": "Retorna um ''feed'' de mudanças recentes.", "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.", "apihelp-feedrecentchanges-param-namespace": "Espaço nominal a partir do qual limitar resultados.", "apihelp-feedrecentchanges-param-invert": "Todos os espaços nominais, exceto o selecionado.", - "apihelp-feedrecentchanges-param-limit": "O número máximo a se retornar.", + "apihelp-feedrecentchanges-param-associated": "Inclua espaço nominal associado (discussão ou principal).", + "apihelp-feedrecentchanges-param-days": "Dias para limitar os resultados.", + "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados.", "apihelp-feedrecentchanges-param-from": "Mostra modificações desde então.", "apihelp-feedrecentchanges-param-hideminor": "Ocultar modificações menores.", - "apihelp-feedrecentchanges-param-hidebots": "Ocultar modificações menores feitas por bots.", + "apihelp-feedrecentchanges-param-hidebots": "Ocultar modificações feitas por bots.", + "apihelp-feedrecentchanges-param-hideanons": "Ocultar alterações feitas por usuários anônimos.", + "apihelp-feedrecentchanges-param-hideliu": "Ocultar alterações feitas por usuários registrados.", "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar mudanças patrulhadas.", "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas pelo usuário atual.", - "apihelp-feedrecentchanges-param-hidecategorization": "Alterações de membros pertencentes à uma categoria.", + "apihelp-feedrecentchanges-param-hidecategorization": "Ocultar alterações de associação de categoria.", "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.", + "apihelp-feedrecentchanges-param-target": "Mostrar apenas as alterações nas páginas vinculadas por esta página.", + "apihelp-feedrecentchanges-param-showlinkedto": "Mostra as alterações nas páginas vigiadas à página selecionada.", + "apihelp-feedrecentchanges-param-categories": "Mostre apenas as alterações em páginas em todas essas categorias.", + "apihelp-feedrecentchanges-param-categories_any": "Mostre apenas as alterações em páginas em qualquer uma das categorias.", "apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.", - "apihelp-feedrecentchanges-example-30days": "Mostrar as alterações recentes por 30 dias.", - "apihelp-feedwatchlist-description": "Retornar um feed da lista de vigiados.", + "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.", + "apihelp-feedwatchlist-summary": "Retornar um feed da lista de páginas vigiadas.", "apihelp-feedwatchlist-param-feedformat": "O formato do feed.", "apihelp-feedwatchlist-param-hours": "Lista páginas modificadas dentro dessa quantia de horas a partir de agora.", "apihelp-feedwatchlist-param-linktosections": "Cria link diretamente para seções alteradas, se possível.", "apihelp-feedwatchlist-example-default": "Mostra o feed de páginas vigiadas.", - "apihelp-filerevert-description": "Reverte um arquivo para uma versão antiga.", - "apihelp-filerevert-param-filename": "Nome do arquivo destino, sem o prefixo File:.", + "apihelp-feedwatchlist-example-all6hrs": "Mostre todas as alterações nas páginas vigiadas nas últimas 6 horas.", + "apihelp-filerevert-summary": "Reverte um arquivo para uma versão antiga.", + "apihelp-filerevert-param-filename": "Nome do arquivo de destino, sem o prefixo File:.", "apihelp-filerevert-param-comment": "Enviar comentário.", "apihelp-filerevert-param-archivename": "Nome do arquivo da revisão para qual reverter.", "apihelp-filerevert-example-revert": "Reverter Wiki.png para a versão de 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Mostra a ajuda para os módulos especificados.", + "apihelp-help-summary": "Mostra a ajuda para os módulos especificados.", + "apihelp-help-param-modules": "Módulos para exibir ajuda para (valores do parâmetro action e format ou main). Pode-se especificar submódulos com um +.", "apihelp-help-param-submodules": "Inclui a ajuda para submódulos do módulo nomeado.", "apihelp-help-param-recursivesubmodules": "Inclui a ajuda para submódulos de forma recursiva.", "apihelp-help-param-helpformat": "Formato da saída da ajuda.", "apihelp-help-param-wrap": "Encapsula a saída em uma estrutura de resposta da API padrão.", - "apihelp-help-param-toc": "Inclui uma tabela de conteúdo na saída HTML.", + "apihelp-help-param-toc": "Inclui uma tabela de conteúdos na saída HTML.", "apihelp-help-example-main": "Ajuda para o módulo principal.", - "apihelp-help-example-recursive": "Toda ajuda em uma página.", - "apihelp-help-example-help": "Ajuda para o próprio módulo de ajuda", - "apihelp-imagerotate-description": "Gira uma ou mais imagens.", + "apihelp-help-example-submodules": "Ajuda para action=query e todos os seus submódulos.", + "apihelp-help-example-recursive": "Toda a ajuda em uma 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-summary": "Gira uma ou mais imagens.", "apihelp-imagerotate-param-rotation": "Graus para girar imagem no sentido horário.", + "apihelp-imagerotate-param-tags": "Tags para se inscrever na entrada no registro de upload.", "apihelp-imagerotate-example-simple": "Girar File:Example.png em 90 graus.", "apihelp-imagerotate-example-generator": "Girar todas as imagens em Category:Flip em 180 graus.", - "apihelp-import-param-summary": "Importar sumário.", + "apihelp-import-summary": "Importar uma página de outra wiki ou de um arquivo XML.", + "apihelp-import-extended-description": "Observe que o POST HTTP deve ser feito como um upload de arquivos (ou seja, usar multipart/form-data) ao enviar um arquivo para o parâmetro xml.", + "apihelp-import-param-summary": "Resumo de importação do log de entrada.", "apihelp-import-param-xml": "Enviar arquivo XML.", + "apihelp-import-param-interwikisource": "Para importações de interwiki: wiki para importar de.", + "apihelp-import-param-interwikipage": "Para importações de interwiki: página para importar.", + "apihelp-import-param-fullhistory": "Para importações de interwiki: importa o histórico completo, não apenas a versão atual.", + "apihelp-import-param-templates": "Para importações de interwiki: importa 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 $1rootpage.", - "apihelp-import-param-rootpage": "Importar como subpágina para esta página. Não pode ser usada juntamente com $1namespace.", + "apihelp-import-param-rootpage": "Importar como subpágina para esta página. Não pode ser usada em conjunto com $1namespace.", + "apihelp-import-param-tags": "Alterar as tags para aplicar à entrada no registro de importação e à revisão nula nas páginas importadas.", + "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] para espaço nominal 100 com histórico completo.", + "apihelp-linkaccount-summary": "Vincule uma conta de um provedor de terceiros ao usuário atual.", + "apihelp-linkaccount-example-link": "Inicie o processo de vincular uma conta de Example.", + "apihelp-login-summary": "Faça login e obtenha cookies de autenticação.", + "apihelp-login-extended-description": "Esta ação só deve ser usada em combinação com[[Special:BotPasswords]]; O uso para login da conta principal está obsoleto e pode falhar sem aviso prévio. Para fazer login com segurança na conta principal, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Esta ação está depreciada e pode falhar sem aviso prévio. Para efetuar login com segurança, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nome de usuário.", "apihelp-login-param-password": "Senha.", "apihelp-login-param-domain": "Domínio (opcional).", - "apihelp-login-example-login": "Log in.", - "apihelp-move-description": "Mover uma página.", + "apihelp-login-param-token": "Token de login obtido no primeiro pedido.", + "apihelp-login-example-gettoken": "Recupere um token de login.", + "apihelp-login-example-login": "Entrar.", + "apihelp-logout-summary": "Faça o logout e limpe os dados da sessão.", + "apihelp-logout-example-logout": "Finaliza a sessão do usuário atual.", + "apihelp-managetags-summary": "Execute tarefas de gerenciamento relacionadas às tags de alteração.", + "apihelp-managetags-param-operation": "Qual operação para executar:\n;create: Crie uma nova tag de mudança para uso manual.\n;delete: Remove uma tag de mudança do banco de dados, incluindo a remoção da tag de todas as revisões, entradas recentes de alterações e entradas de log em que é usada.\n;active: Ativar uma tag de alteração, permitindo aos usuários aplicá-la manualmente.\n; deactivate: Desative uma tag de alteração, impedindo que usuários a apliquem manualmente.", + "apihelp-managetags-param-tag": "Tag para criar, excluir, ativar ou desativar. Para a criação de tags, a tag não deve existir. Para exclusão de tags, a tag deve existir. Para a ativação da tag, a tag deve existir e não ser usada por uma extensão. Para a desativação da tag, a tag deve estar atualmente ativa e definida manualmente.", + "apihelp-managetags-param-reason": "Uma razão opcional para criar, excluir, ativar ou desativar a tag.", + "apihelp-managetags-param-ignorewarnings": "Se deseja ignorar quaisquer avisos emitidos durante a operação.", + "apihelp-managetags-param-tags": "Alterar as tags para se inscrever na entrada no registro de gerenciamento de tags.", + "apihelp-managetags-example-create": "Criar uma tag chamada spam com o motivo For use in edit patrolling", + "apihelp-managetags-example-delete": "Excluir a tag vandlaism com o motivo Misspelt", + "apihelp-managetags-example-activate": "Ativar uma tag nomeada spam com a razão For use in edit patrolling", + "apihelp-managetags-example-deactivate": "Desative uma tag chamada spam com o motivo No longer required", + "apihelp-mergehistory-summary": "Fundir históricos das páginas.", + "apihelp-mergehistory-param-from": "Título da página a partir da qual o histórico será mesclado. Não pode ser usado em conjunto com $1fromid.", + "apihelp-mergehistory-param-fromid": "ID da página da qual o histórico será mesclado. Não pode ser usado em conjunto com $1from.", + "apihelp-mergehistory-param-to": "Título da página ao qual o histórico será mesclado. Não pode ser usado em conjunto com $1toid.", + "apihelp-mergehistory-param-toid": "ID da página em que o histórico será mesclado. Não pode ser usado em conjunto com $1to.", + "apihelp-mergehistory-param-timestamp": "Timestamp até as revisões que serão movidas do histórico da página de origem para o histórico da página de destino. Se omitido, todo o histórico da página de origem será incorporado na página de destino.", + "apihelp-mergehistory-param-reason": "Razão para a fusão de histórico.", + "apihelp-mergehistory-example-merge": "Junte todo o histórico de Oldpage em Newpage.", + "apihelp-mergehistory-example-merge-timestamp": "Junte as revisões da página de Oldpage datando até 2015-12-31T04:37:41Z em Newpage.", + "apihelp-move-summary": "Mover uma página.", "apihelp-move-param-from": "Título da página para renomear. Não pode ser usado em conjunto com $1fromid.", "apihelp-move-param-fromid": "ID da página a se renomear. Não pode ser usado em conjunto com $1from.", + "apihelp-move-param-to": "Título para o qual renomear a página.", + "apihelp-move-param-reason": "Motivo para a alteração do nome.", "apihelp-move-param-movetalk": "Renomear a página de discussão, se existir.", "apihelp-move-param-movesubpages": "Renomeia subpáginas, se aplicável.", "apihelp-move-param-noredirect": "Não cria um redirecionamento.", - "apihelp-move-param-watch": "Adiciona a página e o redirecionamento para a lista de vigiados do usuário atual.", - "apihelp-move-param-unwatch": "Remove a página e o redirecionamento para a lista de vigiados do usuário atual.", + "apihelp-move-param-watch": "Adiciona a página e o redirecionamento para a lista de páginas vigiadas do usuário atual.", + "apihelp-move-param-unwatch": "Remove a página e o redirecionamento para a lista de paginas vigiadas do usuário atual.", + "apihelp-move-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.", + "apihelp-move-param-tags": "Alterar as tags para aplicar à entrada no log de movimento e à revisão nula na página de destino.", + "apihelp-move-example-move": "Mover Badtitle para Goodtitle sem deixar um redirecionamento.", + "apihelp-opensearch-summary": "Procure na wiki usando o protocolo OpenSearch.", "apihelp-opensearch-param-search": "Pesquisar string.", - "apihelp-opensearch-param-limit": "O número máximo a se retornar.", + "apihelp-opensearch-param-limit": "Número máximo de resultados.", "apihelp-opensearch-param-namespace": "Espaço nominal para pesquisar.", + "apihelp-opensearch-param-suggest": "Não fazer nada se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] é false.", + "apihelp-opensearch-param-redirects": "Como lidar com os redirecionamentos:\n;return: Retornar o redirecionamento em si.\n;resolve: Retornar a página de destino. Pode retornar menos de $1 resultados.\nPor razões históricas, o padrão é \"return\" para $1format=json e \"resolve\" para outros formatos.", "apihelp-opensearch-param-format": "O formato da saída.", + "apihelp-opensearch-param-warningsaserror": "Se os avisos forem gerados com format=json, devolva um erro de API em vez de ignorá-los.", "apihelp-opensearch-example-te": "Encontra páginas começando com Te.", + "apihelp-options-summary": "Alterar as preferências do usuário atual.", + "apihelp-options-extended-description": "Somente as opções que estão registradas no núcleo ou em uma das extensões instaladas, ou as opções com as chaves com prefixo com userjs- (que podem ser usadas pelos scripts do usuário) podem ser definidas.", "apihelp-options-param-reset": "Redefinir preferências para os padrões do site.", - "apihelp-options-example-reset": "Resetar todas as preferências", - "apihelp-options-example-complex": "Redefine todas as preferências, então define skin e apelido.", - "apihelp-paraminfo-description": "Obtém informações sobre módulos de API.", + "apihelp-options-param-resetkinds": "Lista de tipos de opções para redefinir quando a opção $1reset está definida.", + "apihelp-options-param-change": "Lista de alterações, nome formatado = valor (por exemplo, skin=vector). Se nenhum valor for dado (nem mesmo um sinal de igual), por exemplo, optionname|otheroption|..., a opção será redefinida para seu valor padrão. Se algum valor passado contém o caractere de pipe (|), use o [[Special:ApiHelp/main#main/datatypes|separador de múltiplo valor alternativo]] para a operação correta.", + "apihelp-options-param-optionname": "O nome da opção que deve ser configurado para o valor dado por $1optionvalue.", + "apihelp-options-param-optionvalue": "O valor da opção especificada por $1optionname.", + "apihelp-options-example-reset": "Resetar todas as preferências.", + "apihelp-options-example-change": "Mudar preferências skin e hideminor.", + "apihelp-options-example-complex": "Redefine todas as preferências, então define skin e nickname.", + "apihelp-paraminfo-summary": "Obter informações sobre módulos da API.", + "apihelp-paraminfo-param-modules": "Lista de nomes de módulos (valores do parâmetro action e format ou main). Pode-se especificar submódulos com um +, todos os submódulos com +* ou todos os submódulos recursivamente com +**.", + "apihelp-paraminfo-param-helpformat": "Formato das strings de ajuda.", + "apihelp-paraminfo-param-querymodules": "Lista de nomes de módulos de consulta (valor de parâmetro prop, meta ou list). Use $1modules=query+foo em vez de $1querymodules=foo.", + "apihelp-paraminfo-param-mainmodule": "Obter também informações sobre o módulo principal (de nível superior). Use $1modules=main em vez disso.", + "apihelp-paraminfo-param-pagesetmodule": "Obter informações sobre o módulo do conjunto de páginas (fornecendo titles= and friends) também.", + "apihelp-paraminfo-param-formatmodules": "Lista de nomes de módulos de formato (valor do parâmetro format). Use $1modules em vez disso.", + "apihelp-paraminfo-example-1": "Mostrar informações para [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] e [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", + "apihelp-paraminfo-example-2": "Mostrar informações para todos os submódulos de [[Special:ApiHelp/query|action=query]].", + "apihelp-parse-summary": "Analisa o conteúdo e retorna a saída do analisador.", + "apihelp-parse-extended-description": "Veja os vários módulos de suporte de [[Special:ApiHelp/query|action=query]] para obter informações da versão atual de uma página.\n\nHá várias maneiras de especificar o texto para analisar:\n# Especifique uma página ou revisão, usando $1page, $1pageid, ou $1oldid.\n#Especifica o conteúdo explicitamente, Usando $1text, $1title e $1contentmodel.\n# Especifique apenas um resumo a analisar. $1prop deve ter um valor vazio.", + "apihelp-parse-param-title": "Título da página ao qual o texto pertence. Se omitido, $1contentmodel deve ser especificado e [[API]] será usado como título.", + "apihelp-parse-param-text": "Texto para analisar. Use $1title ou $1contentmodel para controlar o modelo de conteúdo.", "apihelp-parse-param-summary": "Sumário para analisar.", "apihelp-parse-param-page": "Analisa o conteúdo desta página. Não pode ser usado em conjunto com $1text e $1title.", - "apihelp-parse-param-pageid": "Analisa o conteúdo desta página. sobrepõe $1page.", + "apihelp-parse-param-pageid": "Analisa o conteúdo desta página. Sobrepõe $1page.", + "apihelp-parse-param-redirects": "Se$1page ou $1pageid é definido com um redirecionamento, resolva-o.", + "apihelp-parse-param-oldid": "Analise o conteúdo desta revisão. Substitui $1page e $1pageid.", "apihelp-parse-param-prop": "Qual pedaço de informação obter:", - "apihelp-parse-paramvalue-prop-text": "Fornece o texto analisado do wikitexto.", - "apihelp-parse-paramvalue-prop-langlinks": "Fornece os links de idiomas do wikitexto analisado", - "apihelp-parse-paramvalue-prop-categories": "Fornece as categorias no wikitexto analisado.", + "apihelp-parse-paramvalue-prop-text": "Fornece o texto analisado do texto wiki.", + "apihelp-parse-paramvalue-prop-langlinks": "Fornece os links de idiomas do texto wiki analisado.", + "apihelp-parse-paramvalue-prop-categories": "Fornece as categorias no texto wiki analisado.", "apihelp-parse-paramvalue-prop-categorieshtml": "Fornece a versão HTML das categorias.", - "apihelp-parse-paramvalue-prop-links": "Fornece os links internos do wikitexto analisado.", - "apihelp-parse-paramvalue-prop-templates": "Fornece a predefinição no wikitexto analisado.", - "apihelp-parse-paramvalue-prop-images": "Fornece as imagens no wikitexto analisado.", - "apihelp-parse-paramvalue-prop-externallinks": "Fornece os links externos no wikitexto analisado.", - "apihelp-parse-paramvalue-prop-sections": "Fornece as seções no wikitexto analisado.", + "apihelp-parse-paramvalue-prop-links": "Fornece os links internos do texto wiki analisado.", + "apihelp-parse-paramvalue-prop-templates": "Fornece a predefinição no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-images": "Fornece as imagens no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-externallinks": "Fornece os links externos no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-sections": "Fornece as seções no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-revid": "Adiciona o ID da revisão da página analisada.", + "apihelp-parse-paramvalue-prop-displaytitle": "Adiciona o título do texto wiki analisado.", "apihelp-parse-paramvalue-prop-headitems": "Fornece itens para colocar no <head> da página.", "apihelp-parse-paramvalue-prop-headhtml": "Fornece <head> analisado da página.", - "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos do ResourceLoader usados na página. Ou jsconfigvars ou encodedjsconfigvars deve ser solicitado conjuntamente com modules.", - "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página.", + "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos do ResourceLoader usados na página. Para carregar, use mw.loader.using(). Contudo, jsconfigvars ou encodedjsconfigvars deve ser solicitado conjuntamente com modules.", + "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página. Para aplicar, use mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página como uma string JSON.", "apihelp-parse-paramvalue-prop-indicators": "Fornece o HTML de indicadores de ''status'' de página utilizados na página.", - "apihelp-parse-paramvalue-prop-iwlinks": "Fornece links interwiki no wikitexto analisado.", - "apihelp-parse-paramvalue-prop-wikitext": "Fornece o wikitexto original que foi analisado.", - "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no wikitexto analisado.", - "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando$1disablelimitreport se definido.", + "apihelp-parse-paramvalue-prop-iwlinks": "Fornece links interwiki no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-wikitext": "Fornece o texto wiki original que foi analisado.", + "apihelp-parse-paramvalue-prop-properties": "Fornece várias propriedades definidas no texto wiki analisado.", + "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório limite de uma forma estruturada. Não informa dado, quando$1disablelimitreport está definido.", + "apihelp-parse-paramvalue-prop-limitreporthtml": "Retorna a versão HTML do relatório de limite. Não retorna dados quando $1disablelimitreport está definido.", + "apihelp-parse-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer modelo de conteúdo $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Fornece os avisos que ocorreram ao analisar o conteúdo.", + "apihelp-parse-param-wrapoutputclass": "Classe CSS usada para envolver a saída do analisador.", + "apihelp-parse-param-pst": "Faz uma transformação pré-salvar na entrada antes de analisá-la. Apenas válido quando usado com texto.", + "apihelp-parse-param-onlypst": "Faz uma transformação pré-salvar (PST) na entrada, mas não analisa. Retorna o mesmo texto wiki, depois que um PST foi aplicado. Apenas válido quando usado com $1text.", + "apihelp-parse-param-effectivelanglinks": "Inclui links de idiomas fornecidos por extensões (para uso com $1prop=langlinks).", + "apihelp-parse-param-section": "Apenas analise o conteúdo deste número de seção.\n\nQuando new, analise $1text e $1sectiontitle como se adicionasse uma nova seção a página.\n\nnew é permitido somente ao especificar text.", + "apihelp-parse-param-sectiontitle": "Novo título de seção quando section é new.\n\nAo contrário da edição de páginas Isso não recai sobre summary quando omitido ou vazio.", + "apihelp-parse-param-disablelimitreport": "Omita o relatório de limite (\"Relatório de limite NewPP\") da saída do analisador.", + "apihelp-parse-param-disablepp": "Use $1disablelimitreport em vez.", + "apihelp-parse-param-disableeditsection": "Omita os links da seção de edição da saída do analisador.", + "apihelp-parse-param-disabletidy": "Não executa a limpeza HTML (por exemplo, tidy) na saída do analisador.", + "apihelp-parse-param-generatexml": "Gerar XML parse tree (requer modelo de conteúdo $1, substituído por $2prop=parsetree).", + "apihelp-parse-param-preview": "Analisar no mode de visualização.", + "apihelp-parse-param-sectionpreview": "Analise no modo de visualização de seção (também permite o modo de visualização).", + "apihelp-parse-param-disabletoc": "Omitir tabela de conteúdos na saída.", + "apihelp-parse-param-useskin": "Aplique a skin selecionada na saída do analisador. Pode afetar as seguintes propriedades: langlinks, headitems, modules, jsconfigvars, indicators.", + "apihelp-parse-param-contentformat": "Formato de serialização de conteúdo usado para o texto de entrada. Válido apenas quando usado com $1text.", + "apihelp-parse-param-contentmodel": "Modelo de conteúdo do texto de entrada. Se omitido, $1title deve ser especificado e o padrão será o modelo do título especificado. Válido apenas quando usado com $1text.", "apihelp-parse-example-page": "Analisa uma página.", - "apihelp-parse-example-text": "Analisa wikitexto.", - "apihelp-parse-example-texttitle": "Analisa wikitexto, especificando o título da página.", + "apihelp-parse-example-text": "Analisa texto wiki.", + "apihelp-parse-example-texttitle": "Analisa texto wiki, especificando o título da página.", "apihelp-parse-example-summary": "Analisa uma sumário.", - "apihelp-patrol-description": "Patrulha uma página ou revisão.", + "apihelp-patrol-summary": "Patrulha uma página ou revisão.", "apihelp-patrol-param-rcid": "ID de Mudanças recentes para patrulhar.", "apihelp-patrol-param-revid": "ID de revisão para patrulhar.", + "apihelp-patrol-param-tags": "Alterar as tags para se inscrever na entrada no registro de patrulha.", "apihelp-patrol-example-rcid": "Patrulha uma modificação recente.", "apihelp-patrol-example-revid": "Patrulha uma revisão.", - "apihelp-protect-description": "Modifica o nível de proteção de uma página.", + "apihelp-protect-summary": "Modifica o nível de proteção de uma página.", "apihelp-protect-param-title": "Título da página para (des)proteger. Não pode ser usado em conjunto com $1pageid.", "apihelp-protect-param-pageid": "ID da página a se (des)proteger. Não pode ser usado em conjunto com $1title.", + "apihelp-protect-param-protections": "Lista de níveis de proteção, formatados action=level (por exemplo, edit=sysop). Um nível com all significa que todos podem tomar a ação, ou seja, sem restrição.\n\n Nota: Qualquer ação não listada terá restrições removidas.", + "apihelp-protect-param-expiry": "Expiração de timestamps. Se apenas um timestamp for configurado, ele sera usado para todas as proteções. Use infinite, indefinite, infinity ou never, para uma protecção que nunca expirar.", "apihelp-protect-param-reason": "Motivo para (des)proteger.", + "apihelp-protect-param-tags": "Alterar as tags para se inscrever na entrada no registro de proteção.", + "apihelp-protect-param-cascade": "Ativa a proteção em cascata (ou seja, proteja as predefinições transcluídas e imagens utilizados nesta página). Ignorado se nenhum dos níveis de proteção fornecidos suporte cascata.", + "apihelp-protect-param-watch": "Se configurado, adicione a página sendo (des)protegida para a lista de páginas vigiadas do usuário atual.", + "apihelp-protect-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", "apihelp-protect-example-protect": "Protege uma página.", - "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para all.", + "apihelp-protect-example-unprotect": "Desprotege uma página definindo restrições para all (isto é, todos são autorizados a tomar a ação).", "apihelp-protect-example-unprotect2": "Desprotege uma página ao não definir restrições.", + "apihelp-purge-summary": "Limpe o cache para os títulos especificados.", "apihelp-purge-param-forcelinkupdate": "Atualiza as tabelas de links.", - "apihelp-purge-param-forcerecursivelinkupdate": "Atualiza a tabela de links, e atualiza as tabelas de links para qualquer página que usa essa página como um modelo.", + "apihelp-purge-param-forcerecursivelinkupdate": "Atualiza a tabela de links e atualiza as tabelas de links para qualquer página que usa essa página como uma predefinição.", + "apihelp-purge-example-simple": "Purga as páginas Main Page e API.", + "apihelp-purge-example-generator": "Purga as primeiras 10 páginas no espaço nominal principal.", + "apihelp-query-summary": "Obtenha dados de e sobre o MediaWiki.", + "apihelp-query-extended-description": "Todas as modificações de dados terão que usar a consulta para adquirir um token para evitar abusos de sites maliciosos.", "apihelp-query-param-prop": "Quais propriedades obter para as páginas consultadas.", "apihelp-query-param-list": "Quais listas obter.", "apihelp-query-param-meta": "Quais metadados obter.", - "apihelp-query+allcategories-description": "Enumera todas as categorias.", + "apihelp-query-param-indexpageids": "Inclua uma seção adicional de pageids listando todas as IDs de página retornadas.", + "apihelp-query-param-export": "Exporte as revisões atuais de todas as páginas dadas ou geradas.", + "apihelp-query-param-exportnowrap": "Retorna o XML de exportação sem envolvê-lo em um resultado XML (mesmo formato que [[Special:Export]]). Só pode ser usado com $1export.", + "apihelp-query-param-iwurl": "Obter o URL completo se o título for um link interwiki.", + "apihelp-query-param-rawcontinue": "Retorne os dados de query-continue para continuar.", + "apihelp-query-example-revisions": "Obter [[Special:ApiHelp/query+siteinfo|site info]] e [[Special:ApiHelp/query+revisions|revisions]] da Main Page.", + "apihelp-query-example-allpages": "Obter revisões de páginas começando com API/.", + "apihelp-query+allcategories-summary": "Enumera todas as categorias.", + "apihelp-query+allcategories-param-from": "A categoria da qual começar a enumeração.", + "apihelp-query+allcategories-param-to": "A categoria na qual parar a enumeração.", "apihelp-query+allcategories-param-prefix": "Pesquisa por todo os título de categoria que começam com este valor.", "apihelp-query+allcategories-param-dir": "Direção para ordenar.", "apihelp-query+allcategories-param-min": "Retorna apenas as categorias com pelo menos esta quantidade de membros.", "apihelp-query+allcategories-param-max": "Retorna apenas as categorias com no máximo esta quantidade de membros.", "apihelp-query+allcategories-param-limit": "Quantas categorias retornar.", - "apihelp-query+allcategories-param-prop": "Que propriedades obter:", + "apihelp-query+allcategories-param-prop": "Quais propriedades obter:", + "apihelp-query+allcategories-paramvalue-prop-size": "Adiciona o número de páginas na categoria.", + "apihelp-query+allcategories-paramvalue-prop-hidden": "Tags categorias que estão ocultas com __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Lista categorias com a informação sobre o número de páginas em cada uma.", - "apihelp-query+alldeletedrevisions-description": "Lista todas as revisões excluídas por um usuário ou em um espaço nominal.", + "apihelp-query+allcategories-example-generator": "Recupera informações sobre a página da categoria em si para as categorias que começam List.", + "apihelp-query+alldeletedrevisions-summary": "Lista todas as revisões excluídas por um usuário ou em um espaço nominal.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Só pode ser usada com $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Não pode ser usada com $3user.", "apihelp-query+alldeletedrevisions-param-start": "A data a partir da qual começar a enumeração.", @@ -217,171 +436,1315 @@ "apihelp-query+alldeletedrevisions-param-tag": "Lista apenas as revisões com esta tag.", "apihelp-query+alldeletedrevisions-param-user": "Lista apenas revisões desse usuário.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Não lista as revisões deste usuário.", - "apihelp-query+alldeletedrevisions-param-namespace": "Lista páginas apenas neste espaço nominal.", + "apihelp-query+alldeletedrevisions-param-namespace": "Lista apenas páginas neste espaço nominal.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], usar $1user e $1namespace juntos pode resultar em menos de $1limit resultados antes de continuar; em casos extremos, nenhum resultado pode ser retornado.", + "apihelp-query+alldeletedrevisions-param-generatetitles": "Quando usado como gerador, gera títulos em vez de IDs de revisão.", "apihelp-query+alldeletedrevisions-example-user": "Lista as últimas 50 contribuições excluídas pelo usuário Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Lista as primeiras 50 edições excluídas no espaço nominal principal.", - "apihelp-query+allfileusages-description": "Lista todas as utilizações de arquivo, incluindo os não-existentes.", + "apihelp-query+allfileusages-summary": "Lista todas as utilizações de arquivo, incluindo os não-existentes.", "apihelp-query+allfileusages-param-from": "O título do arquivo a partir do qual começar a enumerar.", "apihelp-query+allfileusages-param-to": "O título do arquivo onde parar de enumerar.", + "apihelp-query+allfileusages-param-prefix": "Procure todos os títulos de arquivos que começam com esse valor.", + "apihelp-query+allfileusages-param-unique": "Somente mostra títulos de arquivos distintos. Não pode ser usado com $1prop=ids.\nQuando usado como gerador, produz páginas de destino em vez de páginas de origem.", + "apihelp-query+allfileusages-param-prop": "Quais peças de informação incluir:", + "apihelp-query+allfileusages-paramvalue-prop-ids": "Adiciona o ID das páginas em uso (não pode ser usado com $1unique).", "apihelp-query+allfileusages-paramvalue-prop-title": "Adiciona o título do arquivo.", "apihelp-query+allfileusages-param-limit": "Quantos itens retornar.", - "apihelp-query+allfileusages-example-unique": "Listar títulos únicos de arquivos", - "apihelp-query+allfileusages-example-generator": "Obter as páginas contendo os arquivos", + "apihelp-query+allfileusages-param-dir": "A direção na qual listar.", + "apihelp-query+allfileusages-example-B": "Listar títulos de arquivos, incluindo os que faltam, com IDs de página de que são, começando em B.", + "apihelp-query+allfileusages-example-unique": "Listar títulos únicos de arquivos.", + "apihelp-query+allfileusages-example-unique-generator": "Obtém todos os títulos de arquivo, marcando os que faltam.", + "apihelp-query+allfileusages-example-generator": "Obter as páginas contendo os arquivos.", + "apihelp-query+allimages-summary": "Enumera todas as imagens sequencialmente.", + "apihelp-query+allimages-param-sort": "Propriedade pela qual ordenar.", + "apihelp-query+allimages-param-dir": "A direção na qual listar.", + "apihelp-query+allimages-param-from": "O título da imagem do qual começar a enumeração. Só pode ser usado com $1sort=name.", + "apihelp-query+allimages-param-to": "O título da imagem no qual parar a enumeração. Só pode ser usado com $1sort=nome.", + "apihelp-query+allimages-param-start": "O timestamp do qual começar a enumeração. Só pode ser usado com $1sort=timestamp.", + "apihelp-query+allimages-param-end": "O timestamp no qual parar a enumeração. Só pode ser usado com $1sort=timestamp.", + "apihelp-query+allimages-param-prefix": "Procure todos os títulos de imagens que começam com esse valor. Só pode ser usado com $1sort=nome.", + "apihelp-query+allimages-param-minsize": "Limite à imagens com, pelo menos, esses bytes.", + "apihelp-query+allimages-param-maxsize": "Limite as imagens com, no máximo, esses bytes.", + "apihelp-query+allimages-param-sha1": "SHA1 de imagem. Substitui $1sha1base36.", + "apihelp-query+allimages-param-sha1base36": "SHA1 de imagem na base 36 (usado em MediaWiki).", "apihelp-query+allimages-param-user": "Retorna apenas os arquivos enviados por este usuário. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.", "apihelp-query+allimages-param-filterbots": "Como filtrar arquivos enviados por bots. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.", - "apihelp-query+allimages-param-mime": "Quais tipos MIME pesquisar, ex.: image/jpeg.", + "apihelp-query+allimages-param-mime": "Quais tipos MIME pesquisar, por exemplo: image/jpeg.", "apihelp-query+allimages-param-limit": "Quantas imagens retornar.", "apihelp-query+allimages-example-B": "Mostra uma lista de arquivos começando com a letra B.", - "apihelp-query+allimages-example-recent": "Mostra uma lista de arquivos recentemente enviados, semelhante ao [[Special:NewFiles]].", + "apihelp-query+allimages-example-recent": "Mostra uma lista de arquivos recentemente enviados, semelhante a [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Mostra uma lista de arquivos com o tipo MIME image/png ou image/gif", "apihelp-query+allimages-example-generator": "Mostra informações sobre 4 arquivos começando com a letra T.", - "apihelp-query+alllinks-description": "Enumerar todos os links que apontam para um determinado espaço nominal.", + "apihelp-query+alllinks-summary": "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 começar a enumerar.", "apihelp-query+alllinks-param-to": "O título do link onde parar de enumerar.", "apihelp-query+alllinks-param-prefix": "Pesquisa por todos os títulos com link que começam com este valor.", + "apihelp-query+alllinks-param-unique": "Somente mostra títulos vinculados diferenciados. Não pode ser usado com $1prop=ids.\nQuando usado como um gerador, produz páginas de destino em vez de páginas de origem.", + "apihelp-query+alllinks-param-prop": "Quais peças de informação incluir:", + "apihelp-query+alllinks-paramvalue-prop-ids": "Adiciona o ID da página da página de ligação (não pode ser usada com $1unique).", + "apihelp-query+alllinks-paramvalue-prop-title": "Adiciona o título do link.", "apihelp-query+alllinks-param-namespace": "O espaço nominal a se enumerar.", "apihelp-query+alllinks-param-limit": "Quantos itens retornar.", - "apihelp-query+alllinks-example-generator": "Obtém páginas contendo os links.", - "apihelp-query+allmessages-description": "Devolver as mensagens deste site.", + "apihelp-query+alllinks-param-dir": "A direção na qual listar.", + "apihelp-query+alllinks-example-B": "Listar títulos vinculados, incluindo os que faltam, com IDs de página de que são, começando em B.", + "apihelp-query+alllinks-example-unique": "Lista de títulos vinculados exclusivos.", + "apihelp-query+alllinks-example-unique-generator": "Obtém todos os títulos vinculados, marcando as que faltam.", + "apihelp-query+alllinks-example-generator": "Obter páginas contendo os links.", + "apihelp-query+allmessages-summary": "Devolver as mensagens deste site.", + "apihelp-query+allmessages-param-messages": "Quais mensagens para retornar. * (padrão) indica todas as mensagens.", "apihelp-query+allmessages-param-prop": "Quais propriedades obter.", - "apihelp-query+allmessages-param-customised": "Retornar apenas mensagens neste estado personalização.", + "apihelp-query+allmessages-param-enableparser": "Defina para ativar o analisador, irá processar o texto wiki da mensagem (substituir palavras mágicas, predefinições manipuladoras, etc.).", + "apihelp-query+allmessages-param-nocontent": "Se configurado, não inclua o conteúdo das mensagens na saída.", + "apihelp-query+allmessages-param-includelocal": "Inclua também mensagens locais, ou seja, mensagens que não existem no software, mas existem como no {{ns:MediaWiki}} namespace.\nIsso lista todas as páginas de espaço nominal-{{ns: MediaWiki}}, então também irá listar aqueles que não são realmente mensagens, como [[MediaWiki:Common.js|Common.js]].", + "apihelp-query+allmessages-param-args": "Argumentos para serem substituídos pela mensagem.", + "apihelp-query+allmessages-param-filter": "Retornar apenas mensagens com nomes que contêm essa string.", + "apihelp-query+allmessages-param-customised": "Retornar apenas mensagens neste estado de personalização.", "apihelp-query+allmessages-param-lang": "Retornar mensagens neste idioma.", "apihelp-query+allmessages-param-from": "Retornar mensagens começando com esta mensagem.", "apihelp-query+allmessages-param-to": "Retornar mensagens terminando com esta mensagem.", + "apihelp-query+allmessages-param-title": "Nome da página para usar como contexto ao analisar a mensagem (para a opção $1enableparser).", "apihelp-query+allmessages-param-prefix": "Retornar apenas mensagens com este prefixo.", "apihelp-query+allmessages-example-ipb": "Mostrar mensagens começando com ipb-.", + "apihelp-query+allmessages-example-de": "Mostrar mensagens august e mainpage em alemão.", + "apihelp-query+allpages-summary": "Enumerar todas as páginas sequencialmente em um determinado espaço nominal.", + "apihelp-query+allpages-param-from": "O título da página da qual começar a enumeração.", + "apihelp-query+allpages-param-to": "O título da página no qual parar de enumerar.", + "apihelp-query+allpages-param-prefix": "Pesquisa por todo os título que começam com este valor.", "apihelp-query+allpages-param-namespace": "O espaço nominal a se enumerar.", "apihelp-query+allpages-param-filterredir": "Quais páginas listar.", "apihelp-query+allpages-param-minsize": "Limitar a páginas com pelo menos essa quantidade de bytes.", "apihelp-query+allpages-param-maxsize": "Limitar a páginas com no máximo essa quantidade de bytes.", + "apihelp-query+allpages-param-prtype": "Limite apenas às páginas protegidas.", + "apihelp-query+allpages-param-prlevel": "Proteções de filtro com base no nível de proteção (deve ser usado com $1prtype= parameter).", + "apihelp-query+allpages-param-prfiltercascade": "Proteções de filtro baseadas em cascata (ignoradas quando o valor de $1 não está definido).", "apihelp-query+allpages-param-limit": "Quantas páginas retornar.", - "apihelp-query+allredirects-description": "Lista todos os redirecionamentos para um espaço nominal.", + "apihelp-query+allpages-param-dir": "A direção na qual listar.", + "apihelp-query+allpages-param-filterlanglinks": "Filtrar com base em se uma página tem lingulinks. Observe que isso pode não considerar os langlinks adicionados por extensões.", + "apihelp-query+allpages-param-prexpiry": "Qual proteção expira para filtrar a página em:\n;indefinite: Obtém apenas páginas com expiração de proteção indefinida.\n;definite: Obtém apenas páginas com uma expiração de proteção definida (específica).\n;all: Obtém páginas com qualquer validade de proteção.", + "apihelp-query+allpages-example-B": "Mostrar uma lista de páginas a partir da letra B.", + "apihelp-query+allpages-example-generator": "Mostre informações sobre 4 páginas começando na letra T.", + "apihelp-query+allpages-example-generator-revisions": "Mostre o conteúdo das primeiras 2 páginas não redirecionadas que começam em Re.", + "apihelp-query+allredirects-summary": "Lista todos os redirecionamentos para um espaço nominal.", "apihelp-query+allredirects-param-from": "O título do redirecionamento a partir do qual começar a enumerar.", "apihelp-query+allredirects-param-to": "O título do redirecionamento onde parar de enumerar.", + "apihelp-query+allredirects-param-prefix": "Procure todas as páginas de destino que começam com esse valor.", + "apihelp-query+allredirects-param-unique": "Somente mostra páginas de destino distintas. Não pode ser usado com $1prop=ids|fragment|interwiki.\nQuando usado como gerador, produz páginas de destino em vez de páginas de origem.", + "apihelp-query+allredirects-param-prop": "Quais peças de informação incluir:", + "apihelp-query+allredirects-paramvalue-prop-ids": "Adiciona o ID da página da página de redirecionamento (não pode ser usada com $1unique).", + "apihelp-query+allredirects-paramvalue-prop-title": "Adiciona o título do redirecionamento.", + "apihelp-query+allredirects-paramvalue-prop-fragment": "Adiciona o fragmento do redirecionamento, se houver (não pode ser usado com $1unique).", + "apihelp-query+allredirects-paramvalue-prop-interwiki": "Adiciona o prefixo interwiki do redirecionamento, se houver (não pode ser usado com $1unique).", "apihelp-query+allredirects-param-namespace": "O espaço nominal a se enumerar.", - "apihelp-query+allrevisions-description": "Listar todas as revisões.", + "apihelp-query+allredirects-param-limit": "Quantos itens retornar.", + "apihelp-query+allredirects-param-dir": "A direção na qual listar.", + "apihelp-query+allredirects-example-B": "Lista de páginas de destino, incluindo as que faltam, com IDs de página de que são, começando em B.", + "apihelp-query+allredirects-example-unique": "Listar páginas de destino únicas.", + "apihelp-query+allredirects-example-unique-generator": "Obtém todas as páginas alvo, marcando as que faltam.", + "apihelp-query+allredirects-example-generator": "Obtém páginas contendo os redirecionamentos.", + "apihelp-query+allrevisions-summary": "Listar todas as revisões.", + "apihelp-query+allrevisions-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+allrevisions-param-end": "A data onde parar a enumeração.", + "apihelp-query+allrevisions-param-user": "Lista apenas revisões desse usuário.", + "apihelp-query+allrevisions-param-excludeuser": "Não lista as revisões deste usuário.", + "apihelp-query+allrevisions-param-namespace": "Lista apenas páginas neste espaço nominal.", + "apihelp-query+allrevisions-param-generatetitles": "Quando usado como gerador, gera títulos em vez de IDs de revisão.", + "apihelp-query+allrevisions-example-user": "Lista as últimas 50 contribuições por usuário Example.", + "apihelp-query+allrevisions-example-ns-main": "Lista as primeiras 50 revisões no espaço nominal principal.", + "apihelp-query+mystashedfiles-summary": "Obter uma lista de arquivos no stash de dados do usuário atual.", + "apihelp-query+mystashedfiles-param-prop": "Quais propriedades buscar para os arquivos.", + "apihelp-query+mystashedfiles-paramvalue-prop-size": "Obtenha o tamanho do arquivo e as dimensões da imagem.", + "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obtenha o tipo MIME e o tipo de mídia do arquivo.", + "apihelp-query+mystashedfiles-param-limit": "Quantos arquivos a serem retornados.", + "apihelp-query+mystashedfiles-example-simple": "Obter a chave de arquivo, o tamanho do arquivo e o tamanho de pixels dos arquivos no stash de dados do usuário atual.", + "apihelp-query+alltransclusions-summary": "Liste todas as transclusões (páginas incorporadas usando {{x}}), incluindo não-existentes.", + "apihelp-query+alltransclusions-param-from": "O título da transclusão do qual começar a enumeração.", + "apihelp-query+alltransclusions-param-to": "O título da transclusão na qual parar a enumeração.", + "apihelp-query+alltransclusions-param-prefix": "Procure todos os títulos transcluídos que começam com esse valor.", + "apihelp-query+alltransclusions-param-unique": "Somente mostra páginas transcluídas distintas. Não pode ser usado com $1prop=ids. Quando usado como gerador, produz páginas de destino em vez de páginas de origem.", + "apihelp-query+alltransclusions-param-prop": "Quais peças de informação incluir:", + "apihelp-query+alltransclusions-paramvalue-prop-ids": "Adiciona o ID da página da página de transclusão (não pode ser usado com $1unique).", + "apihelp-query+alltransclusions-paramvalue-prop-title": "Adiciona o título da transclusão.", "apihelp-query+alltransclusions-param-namespace": "O espaço nominal a se enumerar.", "apihelp-query+alltransclusions-param-limit": "Quantos itens retornar.", + "apihelp-query+alltransclusions-param-dir": "A direção na qual listar.", + "apihelp-query+alltransclusions-example-B": "Lista de títulos transcluídos, incluindo os que faltam, com IDs de página de onde são, começando em B.", + "apihelp-query+alltransclusions-example-unique": "Listar títulos translúcidos exclusivos.", + "apihelp-query+alltransclusions-example-unique-generator": "Obtém todas as páginas transcluídas, marcando as que faltam.", + "apihelp-query+alltransclusions-example-generator": "Obtém páginas contendo as transclusões.", + "apihelp-query+allusers-summary": "Enumerar todos os usuários registrados.", + "apihelp-query+allusers-param-from": "O nome do usuário do qual começar a enumeração.", + "apihelp-query+allusers-param-to": "O nome do usuário para parar de enumerar em.", + "apihelp-query+allusers-param-prefix": "Procurar por todos os usuários que começam com esse valor.", + "apihelp-query+allusers-param-dir": "Direção para ordenar.", + "apihelp-query+allusers-param-group": "Somente inclua usuários nos grupos fornecidos.", + "apihelp-query+allusers-param-excludegroup": "Excluir os usuários nos grupos fornecidos.", + "apihelp-query+allusers-param-rights": "Somente inclui usuários com os direitos dados. Não inclui direitos concedidos por grupos implícitos ou auto-promovidos como *, usuário ou autoconfirmados.", + "apihelp-query+allusers-param-prop": "Quais peças de informação incluir:", + "apihelp-query+allusers-paramvalue-prop-blockinfo": "Adiciona a informação sobre um bloco atual no usuário.", + "apihelp-query+allusers-paramvalue-prop-groups": "Lista grupos em que o usuário está. Isso usa mais recursos do servidor e pode retornar menos resultados do que o limite.", + "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Lista todos os grupos em que o usuário está automaticamente.", + "apihelp-query+allusers-paramvalue-prop-rights": "Lista os direitos que o usuário possui.", + "apihelp-query+allusers-paramvalue-prop-editcount": "Adiciona a contagem de edições do usuário.", + "apihelp-query+allusers-paramvalue-prop-registration": "Adiciona o timestamp de quando o usuário se registrou se disponível (pode estar em branco).", + "apihelp-query+allusers-paramvalue-prop-centralids": "Adiciona os IDs centrais e o status do anexo do usuário.", + "apihelp-query+allusers-param-limit": "Quantos nomes de usuário a serem retornados.", + "apihelp-query+allusers-param-witheditsonly": "Apenas lista os usuários que fizeram edições.", + "apihelp-query+allusers-param-activeusers": "Apenas lista os usuários ativos no último $1 {{PLURAL:$1|dia|dias}}.", + "apihelp-query+allusers-param-attachedwiki": "Com $1prop=centralids, também indica se o usuário está conectado com a wiki identificado por este ID.", + "apihelp-query+allusers-example-Y": "Listar usuários começando em Y.", + "apihelp-query+authmanagerinfo-summary": "Recupere informações sobre o status de autenticação atual.", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Teste se o status de autenticação atual do usuário é suficiente para a operação específica de segurança especificada.", + "apihelp-query+authmanagerinfo-param-requestsfor": "Obtenha informações sobre os pedidos de autenticação necessários para a ação de autenticação especificada.", + "apihelp-query+authmanagerinfo-example-login": "Obtenha os pedidos que podem ser usados ao iniciar um login.", + "apihelp-query+authmanagerinfo-example-login-merged": "Obtenha os pedidos que podem ser usados ao iniciar um login, com campos de formulário mesclados.", + "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Teste se a autenticação é suficiente para ação foo.", + "apihelp-query+backlinks-summary": "Encontre todas as páginas que apontam para a página dada.", "apihelp-query+backlinks-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+backlinks-param-pageid": "ID da página a se pesquisar. Não pode ser usado em conjunto com $1title.", "apihelp-query+backlinks-param-namespace": "O espaço nominal a se enumerar.", - "apihelp-query+blocks-param-ip": "Obtém todos os blocos aplicando a este IP ou intervalos CIDR, incluindo intervalos de blocos.\nNão pode ser usado em conjunto com $3users. Intervalos CIDR mais largos do que IPv4/$1 ou IPv6/$2 não são aceitos.", + "apihelp-query+backlinks-param-dir": "A direção na qual listar.", + "apihelp-query+backlinks-param-filterredir": "Como filtrar para redirecionamentos. Se configurado para nonredirects quando $1redirect estiver ativado, isso só é aplicado ao segundo nível.", + "apihelp-query+backlinks-param-limit": "Quantas páginas retornar. Se $1redirect estiver ativado, o limite se aplica a cada nível separadamente (o que significa até 2 * $1limit resultados podem ser retornados).", + "apihelp-query+backlinks-param-redirect": "Se a página de link for um redirecionamento, encontre todas as páginas que se liguem a esse redirecionamento também. O limite máximo é reduzido para metade.", + "apihelp-query+backlinks-example-simple": "Mostrar links para Main page.", + "apihelp-query+backlinks-example-generator": "Obter informações sobre páginas que ligam para Main page.", + "apihelp-query+blocks-summary": "Liste todos os usuários e endereços IP bloqueados.", + "apihelp-query+blocks-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+blocks-param-end": "A data onde parar a enumeração.", + "apihelp-query+blocks-param-ids": "Lista de IDs de bloco para listar (opcional).", + "apihelp-query+blocks-param-users": "Lista de usuários para procurar (opcional).", + "apihelp-query+blocks-param-ip": "Obter todos os blocos aplicando a este IP ou intervalos CIDR, incluindo intervalos de blocos.\nNão pode ser usado em conjunto com $3users. Intervalos CIDR mais largos do que IPv4/$1 ou IPv6/$2 não são aceitos.", + "apihelp-query+blocks-param-limit": "O número máximo de blocos para listar.", + "apihelp-query+blocks-param-prop": "Quais propriedades obter:", + "apihelp-query+blocks-paramvalue-prop-id": "Adiciona o ID do bloco.", + "apihelp-query+blocks-paramvalue-prop-user": "Adiciona o nome de usuário do usuário bloqueado.", + "apihelp-query+blocks-paramvalue-prop-userid": "Adiciona o ID do usuário bloqueado.", + "apihelp-query+blocks-paramvalue-prop-by": "Adiciona o nome de usuário do usuário bloqueador.", + "apihelp-query+blocks-paramvalue-prop-byid": "Adiciona o ID do usuário bloqueador.", + "apihelp-query+blocks-paramvalue-prop-timestamp": "Adiciona o timestamp de quando o bloqueio foi criado.", + "apihelp-query+blocks-paramvalue-prop-expiry": "Adiciona o timestamp de quando o bloqueio expira.", + "apihelp-query+blocks-paramvalue-prop-reason": "Adiciona a razão dada para o bloqueio.", + "apihelp-query+blocks-paramvalue-prop-range": "Adiciona o intervalo de endereços IP afetados pelo bloqueio.", + "apihelp-query+blocks-paramvalue-prop-flags": "Etiqueta a proibição com (autobloqueio, anononly, etc.).", + "apihelp-query+blocks-param-show": "Mostre apenas itens que atendam a esses critérios. Por exemplo, para ver apenas blocos indefinidos nos endereços IP, defina $1show=ip|!temp.", + "apihelp-query+blocks-example-simple": "Listar bloqueios.", + "apihelp-query+blocks-example-users": "Liste os bloqueios dos usuários Alice e Bob.", + "apihelp-query+categories-summary": "Liste todas as categorias às quais as páginas pertencem.", + "apihelp-query+categories-param-prop": "Quais propriedades adicionais obter para cada categoria:", + "apihelp-query+categories-paramvalue-prop-sortkey": "Adiciona a sortkey (string hexadecimal) e o prefixo da sortkey (parte legível para humanos) para a categoria.", + "apihelp-query+categories-paramvalue-prop-timestamp": "Adiciona o timestamp de quando a categoria foi adicionada.", + "apihelp-query+categories-paramvalue-prop-hidden": "Tags categorias que estão ocultas com __HIDDENCAT__.", + "apihelp-query+categories-param-show": "Quais tipos de categorias mostrar.", "apihelp-query+categories-param-limit": "Quantas categorias retornar.", + "apihelp-query+categories-param-categories": "Apenas liste essas categorias. Útil para verificar se uma determinada página está em uma determinada categoria.", + "apihelp-query+categories-param-dir": "A direção na qual listar.", + "apihelp-query+categories-example-simple": "Obter uma lista de categorias para as quais a página Albert Einstein pertence.", + "apihelp-query+categories-example-generator": "Obter informações sobre todas as categorias usadas na página Albert Einstein.", + "apihelp-query+categoryinfo-summary": "Retorna informações sobre as categorias dadas.", + "apihelp-query+categoryinfo-example-simple": "Obter informações sobre Category:Foo e Category:Bar.", + "apihelp-query+categorymembers-summary": "Lista todas as páginas numa categoria específica.", "apihelp-query+categorymembers-param-title": "Qual categoria enumerar (obrigatório). Deve incluir o prefixo {{ns:category}}:. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID da página da categoria para enumerar. Não pode ser usado em conjunto com $1title.", + "apihelp-query+categorymembers-param-prop": "Quais peças de informação incluir:", + "apihelp-query+categorymembers-paramvalue-prop-ids": "Adiciona o ID da página.", + "apihelp-query+categorymembers-paramvalue-prop-title": "Adiciona o título e o ID do espaço nominal da página.", + "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Adiciona a sortkey usada para classificar na categoria (string hexadecimal).", + "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Adiciona o prefixo da sortkey usado para classificar na categoria (parte da sortkey legível para humanos).", + "apihelp-query+categorymembers-paramvalue-prop-type": "Adiciona o tipo em que a página foi categorizada como (page, subcat ou file).", + "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Adiciona o timestamp de quando a página foi incluida.", + "apihelp-query+categorymembers-param-namespace": "Somente inclua páginas nesses espaços de nomes. Observe que $1type=subcat OU $1type=file pode ser usado aon invéz de $1namespace=14 ou 6.", + "apihelp-query+categorymembers-param-type": "Quais tipos de membros da categoria incluir. Ignorado quando $1sort=timestamp está ativado.", + "apihelp-query+categorymembers-param-limit": "O número máximo de páginas para retornar.", + "apihelp-query+categorymembers-param-sort": "Propriedade pela qual ordenar.", + "apihelp-query+categorymembers-param-dir": "Em qual sentido ordenar.", + "apihelp-query+categorymembers-param-start": "O timestamp do qual começar a lista. Só pode ser usado com $1sort=timestamp.", + "apihelp-query+categorymembers-param-end": "Timestamp para encerrar a lista em. Só pode ser usado com $1sort=timestamp.", + "apihelp-query+categorymembers-param-starthexsortkey": "Sortkey para iniciar a listagem como retornado por $1prop=sortkey. Só pode ser usado com $1sort=sortkey.", + "apihelp-query+categorymembers-param-endhexsortkey": "Sortkey para terminar a listagem, como retornado por $1prop=sortkey. Só pode ser usado com $1sort=sortkey.", + "apihelp-query+categorymembers-param-startsortkeyprefix": "Prefixo Sortkey para começar a listagem. Só pode ser usado com $1sort=sortkey. Substitui $1starthexsortkey.", + "apihelp-query+categorymembers-param-endsortkeyprefix": "Sortkey prefix para terminar a lista before (não at; se esse valor ocorrer, não será incluído!). Só pode ser usado com $1sort=sortkey. Substitui $1endhexsortkey.", + "apihelp-query+categorymembers-param-startsortkey": "Use $1starthexsortkey em vez.", + "apihelp-query+categorymembers-param-endsortkey": "Use $1endhexsortkey em vez.", + "apihelp-query+categorymembers-example-simple": "Obter as 10 primeiras páginas em Category:Physics.", + "apihelp-query+categorymembers-example-generator": "Obter informações da página sobre as primeiras 10 páginas em Category:Physics.", + "apihelp-query+contributors-summary": "Obter a lista de contribuidores logados e a contagem de contribuidores anônimos para uma página.", + "apihelp-query+contributors-param-group": "Somente inclui usuários nos grupos dados. Não inclui grupos implícitos ou auto-promovidos como *, usuário ou autoconfirmados.", + "apihelp-query+contributors-param-excludegroup": "Excluir os usuários nos grupos fornecidos. Não inclui grupos implícitos ou auto-promovidos como *, usuário ou autoconfirmados.", + "apihelp-query+contributors-param-rights": "Somente inclui usuários com os direitos dados. Não inclui direitos concedidos por grupos implícitos ou auto-promovidos como *, usuário ou autoconfirmados.", + "apihelp-query+contributors-param-excluderights": "Excluir usuários com os direitos dados. Não inclui direitos concedidos por grupos implícitos ou auto-promovidos como *, usuário ou autoconfirmados.", "apihelp-query+contributors-param-limit": "Quantas contribuições retornar.", + "apihelp-query+contributors-example-simple": "Mostrar contribuidores para a página Main Page.", + "apihelp-query+deletedrevisions-summary": "Obtem informações de revisão excluídas.", + "apihelp-query+deletedrevisions-extended-description": "Pode ser usado de várias maneiras:\n# Obtenha revisões excluídas para um conjunto de páginas, definindo títulos ou pageids. Ordenado por título e timestamp.\n# Obter dados sobre um conjunto de revisões excluídas, definindo seus IDs com revids. Ordenado por ID de revisão.", + "apihelp-query+deletedrevisions-param-start": "O timestamp no qual começar a enumerar. Ignorado ao processar uma lista de IDs de revisão.", + "apihelp-query+deletedrevisions-param-end": "O timestamp no qual parar de enumerar. Ignorado ao processar uma lista de IDs de revisão.", + "apihelp-query+deletedrevisions-param-tag": "Lista apenas as revisões com esta tag.", + "apihelp-query+deletedrevisions-param-user": "Lista apenas revisões desse usuário.", + "apihelp-query+deletedrevisions-param-excludeuser": "Não lista as revisões deste usuário.", + "apihelp-query+deletedrevisions-example-titles": "Lista as revisões excluídas das páginas Main Page e Talk:Main Page, com conteúdo.", + "apihelp-query+deletedrevisions-example-revids": "Lista as informações para a revisão excluída 123456.", + "apihelp-query+deletedrevs-summary": "Listar revisões excluídas.", + "apihelp-query+deletedrevs-extended-description": "Opera em três modos:\n# Lista revisões excluídas para os títulos fornecidos, ordenados por timestamp.\n# Lista contribuições eliminadas para o usuário fornecido, ordenadas por timestamp (sem títulos especificados).\n# Liste todas as revisões excluídas no espaço nominal dado, classificado por título e timestamp (sem títulos especificados, $1user não definido).\n \nCertos parâmetros aplicam-se apenas a alguns modos e são ignorados em outros.", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2", + "apihelp-query+deletedrevs-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+deletedrevs-param-end": "A data onde parar a enumeração.", + "apihelp-query+deletedrevs-param-from": "Começar listando desse título.", + "apihelp-query+deletedrevs-param-to": "Parar a listagem neste título.", + "apihelp-query+deletedrevs-param-prefix": "Pesquisa por todo os título que começam com este valor.", + "apihelp-query+deletedrevs-param-unique": "Liste apenas uma revisão para cada página.", + "apihelp-query+deletedrevs-param-tag": "Lista apenas as revisões com esta tag.", + "apihelp-query+deletedrevs-param-user": "Lista apenas revisões desse usuário.", + "apihelp-query+deletedrevs-param-excludeuser": "Não lista as revisões deste usuário.", + "apihelp-query+deletedrevs-param-namespace": "Lista apenas páginas neste espaço nominal.", + "apihelp-query+deletedrevs-param-limit": "A quantidade máxima de revisões para listar.", + "apihelp-query+deletedrevs-param-prop": "Quais as propriedades a serem obtidas: \n; revid: Adiciona a ID da revisão da revisão excluída.\n; parentid: Adiciona a ID da revisão da revisão anterior à página.\n;user: Adiciona o usuário que fez a revisão.\n; userid: Adiciona o ID do usuário que fez a revisão. \n; comment: Adiciona o comentário da revisão.\n; parsedcomment: Adiciona o comentário analisado da revisão.\n; minor: Etiqueta se a revisão for menor.\n; len: Adiciona o comprimento (bytes) da revisão.\n; sha1: Adiciona o SHA-1 (base 16) da revisão.\n; content: Adiciona o conteúdo da revisão.\n; token: Depreciado. Dá o token de edição.\n; tags: Tags para a revisão.", + "apihelp-query+deletedrevs-example-mode1": "Lista as últimas revisões excluídas das páginas Main Page e Talk:Main Page, com conteúdo (modo 1).", + "apihelp-query+deletedrevs-example-mode2": "Lista as últimas 50 contribuições excluídas por Bob (modo 2).", + "apihelp-query+deletedrevs-example-mode3-main": "Lista as primeiras 50 revisões excluídas no espaço nominal principal (modo 3).", + "apihelp-query+deletedrevs-example-mode3-talk": "Lista as primeiras 50 páginas excluídas no espaço nominal {{ns:talk}} (modo 3).", + "apihelp-query+disabled-summary": "Este módulo de consulta foi desativado.", + "apihelp-query+duplicatefiles-summary": "Liste todos os arquivos que são duplicatas dos arquivos fornecidos com base em valores de hash.", "apihelp-query+duplicatefiles-param-limit": "Quantos arquivos duplicados retornar.", + "apihelp-query+duplicatefiles-param-dir": "A direção na qual listar.", + "apihelp-query+duplicatefiles-param-localonly": "Procure apenas arquivos no repositório local.", + "apihelp-query+duplicatefiles-example-simple": "Procurar por duplicatas de [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+duplicatefiles-example-generated": "Procure duplicatas de todos os arquivos.", + "apihelp-query+embeddedin-summary": "Encontre todas as páginas que incorporam (transcluam) o título dado.", "apihelp-query+embeddedin-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com $1pageid.", - "apihelp-query+embeddedin-param-pageid": "ID da página a se pesquisar. Não pode ser usado em conjunto com $1title.", + "apihelp-query+embeddedin-param-pageid": "ID da página para pesquisar. Não pode ser usado em conjunto com $1title.", "apihelp-query+embeddedin-param-namespace": "O espaço nominal a se enumerar.", + "apihelp-query+embeddedin-param-dir": "A direção na qual listar.", "apihelp-query+embeddedin-param-filterredir": "Como filtrar por redirecionamentos.", "apihelp-query+embeddedin-param-limit": "Quantas páginas retornar.", "apihelp-query+embeddedin-example-simple": "Mostrar páginas transcluíndo Template:Stub.", - "apihelp-query+embeddedin-example-generator": "Obtém informação sobre páginas transcluindo Template:Stub.", - "apihelp-query+extlinks-description": "Retorna todas as URLs externas (não interwikis) a partir das páginas de dados.", + "apihelp-query+embeddedin-example-generator": "Obter informação sobre páginas transcluindo Template:Stub.", + "apihelp-query+extlinks-summary": "Retorna todos os URLs externas (não interwikis) a partir das páginas dadas.", "apihelp-query+extlinks-param-limit": "Quantos links retornar.", + "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se estiver vazio e $1query estiver definido, o protocolo é http. Deixe o anterior e $1query vazios para listar todos os links externos.", + "apihelp-query+extlinks-param-query": "Pesquisar string sem protocolo. Útil para verificar se uma determinada página contém uma determinada URL externa.", + "apihelp-query+extlinks-param-expandurl": "Expandir URLs relativos ao protocolo com o protocolo canônico.", + "apihelp-query+extlinks-example-simple": "Obter uma lista de links externos em Main Page.", + "apihelp-query+exturlusage-summary": "Enumere páginas que contenham um determinado URL.", + "apihelp-query+exturlusage-param-prop": "Quais peças de informação incluir:", + "apihelp-query+exturlusage-paramvalue-prop-ids": "Adiciona o ID da página.", + "apihelp-query+exturlusage-paramvalue-prop-title": "Adiciona o título e o ID do espaço nominal 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 estiver vazio e $1query estiver definido, o protocolo é http. Deixe o anterior e $1query vazios para listar todos os links externos.", + "apihelp-query+exturlusage-param-query": "Sequência de pesquisa sem protocolo. Veja [[Special:LinkSearch]]. Deixe vazio para listar todos os links externos.", + "apihelp-query+exturlusage-param-namespace": "O espaço nominal das páginas para enumerar.", "apihelp-query+exturlusage-param-limit": "Quantas páginas retornar.", + "apihelp-query+exturlusage-param-expandurl": "Expandir URLs relativos ao protocolo com o protocolo canônico.", + "apihelp-query+exturlusage-example-simple": "Mostra páginas vigiadas à http://www.mediawiki.org.", + "apihelp-query+filearchive-summary": "Enumerar todos os arquivos excluídos sequencialmente.", + "apihelp-query+filearchive-param-from": "O título da imagem do qual começar a enumeração.", + "apihelp-query+filearchive-param-to": "O título da imagem no qual parar a enumeração.", + "apihelp-query+filearchive-param-prefix": "Procure todos os títulos de imagens que começam com esse valor.", "apihelp-query+filearchive-param-limit": "Quantas imagens retornar.", + "apihelp-query+filearchive-param-dir": "A direção na qual listar.", + "apihelp-query+filearchive-param-sha1": "SHA1 de imagem. Substitui $1sha1base36.", + "apihelp-query+filearchive-param-sha1base36": "SHA1 de imagem na base 36 (usado em MediaWiki).", + "apihelp-query+filearchive-param-prop": "Quais informação de imagem obter:", + "apihelp-query+filearchive-paramvalue-prop-sha1": "Adiciona o SHA-1 da imagem.", + "apihelp-query+filearchive-paramvalue-prop-timestamp": "Adiciona o timestamp para a versão carregada.", + "apihelp-query+filearchive-paramvalue-prop-user": "Adiciona o usuário que carregou a versão da imagem.", + "apihelp-query+filearchive-paramvalue-prop-size": "Adiciona o tamanho da imagem em bytes e a altura, largura e contagem de páginas (se aplicável).", + "apihelp-query+filearchive-paramvalue-prop-dimensions": "Apelido para tamanho.", + "apihelp-query+filearchive-paramvalue-prop-description": "Adiciona descrição da versão da imagem.", + "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Analise a descrição da versão.", + "apihelp-query+filearchive-paramvalue-prop-mime": "Adiciona o tipo MIME da imagem.", + "apihelp-query+filearchive-paramvalue-prop-mediatype": "Adiciona o tipo de mídia da imagem.", + "apihelp-query+filearchive-paramvalue-prop-metadata": "Lista metadados Exif para a versão da imagem.", + "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Adiciona a profundidade de bits da versão.", + "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome do arquivo da versão arquivada para as versões não-mais recentes.", + "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os arquivos excluídos.", + "apihelp-query+filerepoinfo-summary": "Retorna informações meta sobre repositórios de imagens configurados na wiki.", + "apihelp-query+filerepoinfo-param-prop": "Quais propriedades do repositório obter (pode haver mais disponível em algumas wikis):\n;apiurl: URL para a API do repositório - útil para obter informações de imagem do host.\n;name: A chave do repositório - usado em por exemplo, [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] e [[Special:ApiHelp/query+imageinfo|imageinfo]] valores de retorno.\n;displayname: O legível para humanos do repositório wiki.\n;rooturl: URL raiz para caminhos de imagem.\n; local: Se esse repositório é o local ou não.", + "apihelp-query+filerepoinfo-example-simple": "Obter informações sobre repositórios de arquivos.", + "apihelp-query+fileusage-summary": "Encontre todas as páginas que usam os arquivos dados.", + "apihelp-query+fileusage-param-prop": "Quais propriedades obter:", + "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de cada página.", + "apihelp-query+fileusage-paramvalue-prop-title": "O título de cada página.", + "apihelp-query+fileusage-paramvalue-prop-redirect": "Sinalizar se a página é um redirecionamento.", + "apihelp-query+fileusage-param-namespace": "Listar apenas páginas neste espaço nominal.", "apihelp-query+fileusage-param-limit": "Quantos retornar.", + "apihelp-query+fileusage-param-show": "Mostre apenas itens que atendam a esses critérios.\n;redirect:Apenas mostra redirecionamentos.\n;!redirect:Não mostra redirecionamentos.", + "apihelp-query+fileusage-example-simple": "Obter uma lista de páginas usando [[:File:Example.jpg]].", + "apihelp-query+fileusage-example-generator": "Obter informação sobre páginas usando [[:File:Example.jpg]].", + "apihelp-query+imageinfo-summary": "Retorna a informação do arquivo e o histórico de upload.", + "apihelp-query+imageinfo-param-prop": "Quais informações de arquivo para obter:", + "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adiciona o timestamp para a versão carregada.", + "apihelp-query+imageinfo-paramvalue-prop-user": "Adiciona o usuário que carregou cada versão do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-userid": "Adiciona a identificação do usuário que carregou cada versão do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-comment": "Comente sobre a versão.", + "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Analise o comentário na versão.", + "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Adiciona o título canônico do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-url": "Fornece o URL para o arquivo e a página de descrição.", + "apihelp-query+imageinfo-paramvalue-prop-size": "Adiciona o tamanho do arquivo em bytes e a altura, largura e contagem de páginas (se aplicável).", + "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Apelido para tamanho.", + "apihelp-query+imageinfo-paramvalue-prop-sha1": "Adiciona o SHA-1 do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-mime": "Adiciona o tipo MIME do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Adiciona o tipo MIME da miniatura da imagem (requer url e param $1urlwidth).", + "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Adiciona o tipo de mídia do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-metadata": "Lista metadados Exif para a versão do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Lista os metadados genéricos do formato de arquivo para a versão do arquivo.", + "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Lista metadados formatados combinados de várias fontes. Os resultados são formatados em HTML.", + "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adiciona o nome do arquivo da versão arquivada para as versões não-mais recentes.", + "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adiciona a profundidade de bits da versão.", + "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pela página Special:Upload para obter informações sobre um arquivo existente. Não está destinado a ser usado fora do núcleo do MediaWiki.", + "apihelp-query+imageinfo-paramvalue-prop-badfile": "Adiciona se o arquivo está no [[MediaWiki:Bad image list]]", "apihelp-query+imageinfo-param-limit": "Quantas revisões de arquivos retornar por arquivo.", + "apihelp-query+imageinfo-param-start": "O timestamp do qual começar a enumeração.", + "apihelp-query+imageinfo-param-end": "Data e hora para a listagem.", + "apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url estiver definido, um URL para uma imagem dimensionada para essa largura será retornado.\nPor motivos de desempenho, se essa opção for usada, não serão retornadas mais de $1 imagens dimensionadas.", + "apihelp-query+imageinfo-param-urlheight": "Semelhante a $1urlwidth.", + "apihelp-query+imageinfo-param-metadataversion": "Versão dos metadados para usar. Se latest for especificado, use a versão mais recente. Por padrão, 1 para compatibilidade com versões anteriores.", + "apihelp-query+imageinfo-param-extmetadatalanguage": "Em qual idioma procurar por extmetadata. Isso afeta tanto a tradução a ser buscada, quanto várias estão disponíveis, bem como a forma como as coisas como números e vários valores são formatados.", + "apihelp-query+imageinfo-param-extmetadatamultilang": "Se as traduções para a propriedade extmetadata estiverem disponíveis, procure todas elas.", + "apihelp-query+imageinfo-param-extmetadatafilter": "Se especificado e não vazio, apenas essas chaves serão retornadas para $1prop=extmetadata.", + "apihelp-query+imageinfo-param-urlparam": "Uma sequência de parâmetro específico do manipulador. Por exemplo, PDFs podem usar page15-100px. $1urlwidth deve ser usado e ser consistente com $1urlparam.", + "apihelp-query+imageinfo-param-badfilecontexttitle": "Se $2prop=badfile estiver definido, este é o título da página usado ao avaliar a [[MediaWiki:Bad image list]]", + "apihelp-query+imageinfo-param-localonly": "Procure apenas arquivos no repositório local.", + "apihelp-query+imageinfo-example-simple": "Obtenha informações sobre a versão atual do [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+imageinfo-example-dated": "Obtenha informações sobre versões do [[:File:Test.jpg]] a partir de 2008 e posterior.", + "apihelp-query+images-summary": "Retorna todos os arquivos contidos nas páginas fornecidas.", "apihelp-query+images-param-limit": "Quantos arquivos retornar.", + "apihelp-query+images-param-images": "Apenas liste esses arquivos. Útil para verificar se uma determinada página possui um determinado arquivo.", + "apihelp-query+images-param-dir": "A direção na qual listar.", + "apihelp-query+images-example-simple": "Obter uma lista de arquivos usados na [[Main Page]].", + "apihelp-query+images-example-generator": "Obter informações sobre todos os arquivos usados na [[Main Page]].", + "apihelp-query+imageusage-summary": "Encontre todas as páginas que usam o título da imagem dada.", "apihelp-query+imageusage-param-title": "Título a se pesquisar. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+imageusage-param-pageid": "ID da página para pesquisar. Não pode ser usado em conjunto com $1title.", "apihelp-query+imageusage-param-namespace": "O espaço nominal a se enumerar.", + "apihelp-query+imageusage-param-dir": "A direção na qual listar.", + "apihelp-query+imageusage-param-filterredir": "Como filtrar para redirecionamentos. Se configurado para não-redirecionamentos quando $1redirect estiver habilitado, isso só é aplicado ao segundo nível.", + "apihelp-query+imageusage-param-limit": "Quantas páginas retornar. Se $1redirect estiver ativado, o limite se aplica a cada nível separadamente (o que significa até 2 * $1limit resultados podem ser retornados).", + "apihelp-query+imageusage-param-redirect": "Se a página de link for um redirecionamento, encontre todas as páginas que se liguem a esse redirecionamento também. O limite máximo é reduzido para metade.", + "apihelp-query+imageusage-example-simple": "Mostrar páginas usando [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+imageusage-example-generator": "Obter informação sobre páginas usando [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+info-summary": "Obter informações básicas sobre a página.", + "apihelp-query+info-param-prop": "Quais propriedades adicionais obter:", + "apihelp-query+info-paramvalue-prop-protection": "Liste o nível de proteção de cada página.", + "apihelp-query+info-paramvalue-prop-talkid": "O ID da página de discussão para cada página de não-discussão.", + "apihelp-query+info-paramvalue-prop-watched": "Liste o estado de vigilância de cada página.", + "apihelp-query+info-paramvalue-prop-watchers": "Número de observadores, se permitido.", + "apihelp-query+info-paramvalue-prop-visitingwatchers": "O número de observadores de cada página que visitou edições recentes para essa página, se permitido.", + "apihelp-query+info-paramvalue-prop-notificationtimestamp": "O timestamp da notificação da lista de páginas vigiadas de cada página.", + "apihelp-query+info-paramvalue-prop-subjectid": "O ID da página principal para cada página de discussão.", + "apihelp-query+info-paramvalue-prop-url": "Retorna um URL completo, de edição e o canônico para cada página.", "apihelp-query+info-paramvalue-prop-readable": "Se o usuário pode ler esta página.", "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto retornado por EditFormPreloadText.", "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.", "apihelp-query+info-param-testactions": "Testa se o usuário atual pode executar determinadas ações na página.", - "apihelp-query+info-example-simple": "Obtém informações sobre a página Página principal.", - "apihelp-query+iwbacklinks-description": "Encontra todas as páginas que apontam para o determinado link interwiki.\n\nPode ser usado para encontrar todos os links com um prefixo, ou todos os links para um título (com um determinado prefixo). Usar nenhum parâmetro é efetivamente \"todos os links interwiki\".", + "apihelp-query+info-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] em vez.", + "apihelp-query+info-example-simple": "Obter informações sobre a página Main Page.", + "apihelp-query+info-example-protection": "Obter informações gerais e de proteção sobre a página Main Page.", + "apihelp-query+iwbacklinks-summary": "Encontra todas as páginas que apontam para o link interwiki dado.", + "apihelp-query+iwbacklinks-extended-description": "Pode ser usado para encontrar todos os links com um prefixo, ou todos os links para um título (com um determinado prefixo). Usar nenhum parâmetro é efetivamente \"todos os links interwiki\".", "apihelp-query+iwbacklinks-param-prefix": "Prefixo para o interwiki.", + "apihelp-query+iwbacklinks-param-title": "Link interwiki para pesquisar. Deve ser usado com $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "Quantas páginas retornar.", + "apihelp-query+iwbacklinks-param-prop": "Quais propriedades obter:", + "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo do interwiki.", + "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Adiciona o título do interwiki.", + "apihelp-query+iwbacklinks-param-dir": "A direção na qual listar.", + "apihelp-query+iwbacklinks-example-simple": "Obter páginas apontando para [[wikibooks:Test]].", + "apihelp-query+iwbacklinks-example-generator": "Obter informações sobre páginas que ligam para [[wikibooks:Test]].", + "apihelp-query+iwlinks-summary": "Retorna todos os links interwiki das páginas fornecidas.", + "apihelp-query+iwlinks-param-url": "Obter o URL completo (não pode ser usado com $1prop).", + "apihelp-query+iwlinks-param-prop": "Quais propriedades adicionais obter para cada link interlanguage:", "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.", + "apihelp-query+iwlinks-param-limit": "Quantos interwiki links a serem retornados.", + "apihelp-query+iwlinks-param-prefix": "Retornar apenas links interwiki com este prefixo.", + "apihelp-query+iwlinks-param-title": "Link interwiki para pesquisar por. Deve ser usado com $1prefix.", + "apihelp-query+iwlinks-param-dir": "A direção na qual listar.", + "apihelp-query+iwlinks-example-simple": "Obtenha links interwiki da página Main Page.", + "apihelp-query+langbacklinks-summary": "Encontre todas as páginas que apontam para o link de idioma dado.", + "apihelp-query+langbacklinks-extended-description": "Pode ser usado para encontrar todos os links com um código de idioma ou todos os links para um título (com um determinado idioma). Usar nenhum dos parâmetros é efetivamente \"todos os links de linguagem\". \n\nNote que isso pode não considerar os links de idiomas adicionados por extensões.", + "apihelp-query+langbacklinks-param-lang": "Idioma para o link de idioma.", + "apihelp-query+langbacklinks-param-title": "Link de idioma para procurar. Deve ser usado com $1lang.", "apihelp-query+langbacklinks-param-limit": "Quantas páginas retornar.", + "apihelp-query+langbacklinks-param-prop": "Quais propriedades obter:", + "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adiciona o código de idioma do link de idioma.", + "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Adiciona o título do link de idioma.", + "apihelp-query+langbacklinks-param-dir": "A direção na qual listar.", + "apihelp-query+langbacklinks-example-simple": "Obter páginas apontando para [[:fr:Test]].", + "apihelp-query+langbacklinks-example-generator": "Obter informações sobre páginas que ligam para [[:fr:Test]].", + "apihelp-query+langlinks-summary": "Retorna todos os links interlanguage das páginas fornecidas.", "apihelp-query+langlinks-param-limit": "Quantos links de idioma retornar.", + "apihelp-query+langlinks-param-url": "Obter o URL completo (não pode ser usado com $1prop).", + "apihelp-query+langlinks-param-prop": "Quais propriedades adicionais obter para cada link interlanguage:", + "apihelp-query+langlinks-paramvalue-prop-url": "Adiciona o URL completo.", + "apihelp-query+langlinks-paramvalue-prop-langname": "Adiciona o nome do idioma localizado (melhor esforço). Use $1inlanguagecode para controlar o idioma.", + "apihelp-query+langlinks-paramvalue-prop-autonym": "Adiciona o nome do idioma nativo.", + "apihelp-query+langlinks-param-lang": "Retornar apenas os links de idioma com este código de idioma.", + "apihelp-query+langlinks-param-title": "Link para pesquisar. Deve ser usado com $1lang.", + "apihelp-query+langlinks-param-dir": "A direção na qual listar.", + "apihelp-query+langlinks-param-inlanguagecode": "Código de idioma para nomes de idiomas localizados.", + "apihelp-query+langlinks-example-simple": "Obter links de interligação da página Main Page.", + "apihelp-query+links-summary": "Retorna todos os links das páginas fornecidas.", + "apihelp-query+links-param-namespace": "Mostre apenas links nesses espaços de nominais.", "apihelp-query+links-param-limit": "Quantos links retornar.", + "apihelp-query+links-param-titles": "Apenas lista links para esses títulos. Útil para verificar se uma determinada página liga a um certo título.", + "apihelp-query+links-param-dir": "A direção na qual listar.", + "apihelp-query+links-example-simple": "Obter links da página Main Page", + "apihelp-query+links-example-generator": "Obter informações sobre os links de páginas na página Main Page.", + "apihelp-query+links-example-namespaces": "Obter links da página Main Page nos espaços nominais {{ns:user}} e {{ns:template}}.", + "apihelp-query+linkshere-summary": "Encontre todas as páginas que apontam para as páginas dadas.", + "apihelp-query+linkshere-param-prop": "Quais propriedades obter:", + "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de cada página.", + "apihelp-query+linkshere-paramvalue-prop-title": "O título de cada página.", + "apihelp-query+linkshere-paramvalue-prop-redirect": "Sinalizar se a página é um redirecionamento.", + "apihelp-query+linkshere-param-namespace": "Listar apenas páginas neste espaço nominal.", "apihelp-query+linkshere-param-limit": "Quantos retornar.", + "apihelp-query+linkshere-param-show": "Mostre apenas itens que atendam a esses critérios.\n;redirect:Apenas mostra redirecionamentos.\n;!redirect:Não mostra redirecionamentos.", + "apihelp-query+linkshere-example-simple": "Obter uma lista de páginas que ligam para a [[Main Page]].", + "apihelp-query+linkshere-example-generator": "Obter informações sobre páginas que ligam para [[Main Page]].", + "apihelp-query+logevents-summary": "Recuperar eventos dos logs.", + "apihelp-query+logevents-param-prop": "Quais propriedades obter:", + "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o ID do log de eventos.", + "apihelp-query+logevents-paramvalue-prop-title": "Adiciona o título da página para o log de eventos.", + "apihelp-query+logevents-paramvalue-prop-type": "Adiciona o tipo do log de eventos.", + "apihelp-query+logevents-paramvalue-prop-user": "Adiciona o usuário responsável pelo evento de log.", + "apihelp-query+logevents-paramvalue-prop-userid": "Adiciona o ID do usuário responsável pelo evento de log.", + "apihelp-query+logevents-paramvalue-prop-timestamp": "Adiciona o timestamp para o log de eventos.", + "apihelp-query+logevents-paramvalue-prop-comment": "Adiciona o comentário do evento de log.", + "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Adiciona o comentário analisado do log de eventos.", + "apihelp-query+logevents-paramvalue-prop-details": "Lista detalhes adicionais sobre o evento de log.", + "apihelp-query+logevents-paramvalue-prop-tags": "Lista as tags para o evento de log.", + "apihelp-query+logevents-param-type": "Filtre as entradas de log para apenas esse tipo.", + "apihelp-query+logevents-param-action": "Filtre as ações de log para apenas essa ação. Substitui $1type. Na lista de valores possíveis, os valores com asterisco, como action/*, podem ter strings diferentes após a barra (/).", + "apihelp-query+logevents-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+logevents-param-end": "O timestamp para terminar de enumerar.", + "apihelp-query+logevents-param-user": "Filtrar entradas para aquelas feitas pelo usuário fornecido.", + "apihelp-query+logevents-param-title": "Filtre as entradas para aquelas relacionadas a uma página.", + "apihelp-query+logevents-param-namespace": "Filtrar as entradas para aqueles no espaço nominal fornecido.", + "apihelp-query+logevents-param-prefix": "Filtrar as entradas que começam com este prefixo.", + "apihelp-query+logevents-param-tag": "Apenas lista as entradas de eventos marcadas com esta etiqueta.", + "apihelp-query+logevents-param-limit": "Quantas entradas de eventos a serem retornadas.", "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.", - "apihelp-query+prefixsearch-param-limit": "O número máximo a se retornar.", + "apihelp-query+pagepropnames-summary": "Liste todos os nomes de propriedade da página em uso na wiki.", + "apihelp-query+pagepropnames-param-limit": "O número máximo de nomes a retornar.", + "apihelp-query+pagepropnames-example-simple": "Obtenha os primeiros 10 nomes de propriedade.", + "apihelp-query+pageprops-summary": "Obter várias propriedades da página definidas no conteúdo da página.", + "apihelp-query+pageprops-param-prop": "Apenas liste as propriedades desta página ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] retorna nomes de propriedade da página em uso). Útil para verificar se as páginas usam uma determinada propriedade da página.", + "apihelp-query+pageprops-example-simple": "Obter propriedades para as páginas Main Page e MediaWiki.", + "apihelp-query+pageswithprop-summary": "Liste todas as páginas usando uma propriedade de página determinada.", + "apihelp-query+pageswithprop-param-propname": "Propriedade da página para a qual enumeram páginas ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] retorna nomes de propriedade da página em uso).", + "apihelp-query+pageswithprop-param-prop": "Quais peças de informação incluir:", + "apihelp-query+pageswithprop-paramvalue-prop-ids": "Adiciona o ID da página.", + "apihelp-query+pageswithprop-paramvalue-prop-title": "Adiciona o título e o ID 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 para retornar.", + "apihelp-query+pageswithprop-param-dir": "Em qual sentido ordenar.", + "apihelp-query+pageswithprop-example-simple": "Lista as primeiras 10 páginas usando {{DISPLAYTITLE:}}.", + "apihelp-query+pageswithprop-example-generator": "Obter informações adicionais sobre as primeiras 10 páginas usando __NOTOC__.", + "apihelp-query+prefixsearch-summary": "Execute uma pesquisa de prefixo para títulos de página.", + "apihelp-query+prefixsearch-extended-description": "Apesar da semelhança nos nomes, este módulo não se destina a ser equivalente a[[Special:PrefixIndex]]; para isso, veja [[Special:ApiHelp/query+allpages|action=query&list=allpages]] com o parâmetro apprefix.O propósito deste módulo é semelhante a [[Special:ApiHelp/opensearch|action=opensearch]]: para inserir o usuário e fornecer os títulos de melhor correspondência. Dependendo do backend do mecanismo de pesquisa, isso pode incluir correção de digitação, evasão de redirecionamento ou outras heurísticas.", + "apihelp-query+prefixsearch-param-search": "Pesquisar string.", + "apihelp-query+prefixsearch-param-namespace": "Espaço nominal para pesquisar.", + "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados.", + "apihelp-query+prefixsearch-param-offset": "Número de resultados a ignorar.", + "apihelp-query+prefixsearch-example-simple": "Procure títulos de páginas começando com meaning.", + "apihelp-query+prefixsearch-param-profile": "Pesquisar perfil para usar.", + "apihelp-query+protectedtitles-summary": "Liste todos os títulos protegidos contra criação.", + "apihelp-query+protectedtitles-param-namespace": "Somente lista títulos nesses espaços de nominais.", + "apihelp-query+protectedtitles-param-level": "Lista apenas os títulos com esses níveis de proteção.", "apihelp-query+protectedtitles-param-limit": "Quantas páginas retornar.", - "apihelp-query+protectedtitles-paramvalue-prop-level": "Adicionar o nível de proteção", - "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos", - "apihelp-query+querypage-param-limit": "O número máximo a se retornar.", + "apihelp-query+protectedtitles-param-start": "Iniciar a listar neste timestamp de proteção.", + "apihelp-query+protectedtitles-param-end": "Pare de listar neste timestamp de proteção.", + "apihelp-query+protectedtitles-param-prop": "Quais propriedades obter:", + "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Adiciona o timestamp de quando a proteção foi adicionada.", + "apihelp-query+protectedtitles-paramvalue-prop-user": "Adiciona o usuário que adicionou a proteção.", + "apihelp-query+protectedtitles-paramvalue-prop-userid": "Adiciona a ID do usuário que adicionou a proteção.", + "apihelp-query+protectedtitles-paramvalue-prop-comment": "Adiciona o comentário para a proteção.", + "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Adiciona o comentário analisado para a proteção.", + "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Adiciona o timestamp de quando a proteção será encerrada.", + "apihelp-query+protectedtitles-paramvalue-prop-level": "Adicionar o nível de proteção.", + "apihelp-query+protectedtitles-example-simple": "Listar títulos protegidos.", + "apihelp-query+protectedtitles-example-generator": "Encontre links para títulos protegidos no espaço nominal principal.", + "apihelp-query+querypage-summary": "Obter uma lista fornecida por uma página especial baseada em QueryPage.", + "apihelp-query+querypage-param-page": "O nome da página especial. Note, isso diferencia maiúsculas de minúsculas.", + "apihelp-query+querypage-param-limit": "Número de resultados a se retornado.", + "apihelp-query+querypage-example-ancientpages": "Retorna resultados de [[Special:Ancientpages]].", + "apihelp-query+random-summary": "Obter um conjunto de páginas aleatórias.", + "apihelp-query+random-extended-description": "As páginas são listadas em uma sequência fixa, apenas o ponto de partida é aleatório. Isso significa que, se, por exemplo, Main Page é a primeira página aleatória da lista, List of fictional monkeys será sempre a segunda, List of people on stamps of Vanuatu terceiro, etc.", + "apihelp-query+random-param-namespace": "Retorne páginas apenas nesses espaços nominais.", + "apihelp-query+random-param-limit": "Limita quantas páginas aleatórias serão retornadas.", + "apihelp-query+random-param-redirect": "Use $1filterredir=redirects em vez.", "apihelp-query+random-param-filterredir": "Como filtrar por redirecionamentos.", - "apihelp-query+recentchanges-param-user": "Listar apenas alterações de usuário.", + "apihelp-query+random-example-simple": "Retorna duas páginas aleatórias do espaço nominal principal.", + "apihelp-query+random-example-generator": "Retorna informações da página sobre duas páginas aleatórias do espaço nominal principal.", + "apihelp-query+recentchanges-summary": "Enumere as mudanças recentes.", + "apihelp-query+recentchanges-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+recentchanges-param-end": "O timestamp para terminar de enumerar.", + "apihelp-query+recentchanges-param-namespace": "Filtrar apenas as mudanças destes espaços nominais.", + "apihelp-query+recentchanges-param-user": "Listar apenas alterações deste usuário.", "apihelp-query+recentchanges-param-excludeuser": "Não listar as alterações deste usuário.", "apihelp-query+recentchanges-param-tag": "Listar apenas as alterações marcadas com esta etiqueta.", - "apihelp-query+recentchanges-paramvalue-prop-flags": "Adicionar indicadores para a edição.", - "apihelp-query+recentchanges-paramvalue-prop-tags": "Listar as etiquetas para entrada.", + "apihelp-query+recentchanges-param-prop": "Incluir elementos de informação adicional:", + "apihelp-query+recentchanges-paramvalue-prop-user": "Adiciona o usuário responsável pela edição e marca se ele é um IP.", + "apihelp-query+recentchanges-paramvalue-prop-userid": "Adiciona o ID do usuário responsável pela edição.", + "apihelp-query+recentchanges-paramvalue-prop-comment": "Adiciona o comentário para a edição.", + "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Adiciona o comentário analisado para a edição.", + "apihelp-query+recentchanges-paramvalue-prop-flags": "Adiciona etiquetas para a edição.", + "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Adiciona o timestamp da edição.", + "apihelp-query+recentchanges-paramvalue-prop-title": "Adiciona o título da página da edição.", + "apihelp-query+recentchanges-paramvalue-prop-ids": "Adiciona o ID da página, das alterações recentes e dA revisão nova e antiga.", + "apihelp-query+recentchanges-paramvalue-prop-sizes": "Adiciona o comprimento novo e antigo da página em bytes.", + "apihelp-query+recentchanges-paramvalue-prop-redirect": "Etiqueta a edição se a página é um redirecionamento.", + "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Etiquete edições patrulháveis como sendo patrulhadas ou não-patrulhadas.", + "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adiciona informações de registro (ID de registro, tipo de registro, etc.) às entradas do log.", + "apihelp-query+recentchanges-paramvalue-prop-tags": "Listar as etiquetas para a entrada.", + "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adiciona o checksum do conteúdo para entradas associadas a uma revisão.", + "apihelp-query+recentchanges-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] em vez.", + "apihelp-query+recentchanges-param-show": "Mostre apenas itens que atendam a esses critérios. Por exemplo, para ver apenas edições menores feitas por usuários conectados, set $1show=minor|!anon.", + "apihelp-query+recentchanges-param-limit": "Quantas alterações a serem retornadas.", + "apihelp-query+recentchanges-param-type": "Quais tipos de mudanças mostrar.", + "apihelp-query+recentchanges-param-toponly": "Somente lista as alterações que são as últimas revisões.", + "apihelp-query+recentchanges-param-generaterevisions": "Quando usado como gerador, gere IDs de revisão em vez de títulos. As entradas de alterações recentes sem IDs de revisão associadas (por exemplo, a maioria das entradas de log) não gerarão nada.", "apihelp-query+recentchanges-example-simple": "Listar mudanças recentes.", + "apihelp-query+recentchanges-example-generator": "Obter informações da página sobre as mudanças recentes não patrulhadas.", + "apihelp-query+redirects-summary": "Retorna todos os redirecionamentos para as páginas indicadas.", + "apihelp-query+redirects-param-prop": "Quais propriedades obter:", + "apihelp-query+redirects-paramvalue-prop-pageid": "ID de cada redirecionamento.", "apihelp-query+redirects-paramvalue-prop-title": "Título de cada redirecionamento.", "apihelp-query+redirects-paramvalue-prop-fragment": "Fragmento de cada redirecionamento, se há algum.", - "apihelp-query+redirects-param-namespace": "Listar páginas apenas neste espaço nominal.", - "apihelp-query+revisions-example-last5": "Mostrar as 5 últimas revisões do Main Page.", - "apihelp-query+revisions-example-first5": "Mostrar as 5 primeiras revisões do Main Page.", - "apihelp-query+revisions-example-first5-after": "Mostrar as 5 primeiras revisões do Main Page feitas depois de 05/01/2006.", - "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as 5 primeiras revisões do Main Page que não foram feitas pelo usuário anônimo 127.0.0.1.", + "apihelp-query+redirects-param-namespace": "Listar apenas páginas neste espaço nominal.", + "apihelp-query+redirects-param-limit": "Quantos redirecionamentos a serem retornados.", + "apihelp-query+redirects-param-show": "Mostrar apenas itens que atendam a esses critérios:\n; fragment: mostra apenas redirecionamentos com um fragmento.\n;!fragment: mostra apenas redirecionamentos sem um fragmento.", + "apihelp-query+redirects-example-simple": "Obter uma lista de redirecionamento para [[Main Page]].", + "apihelp-query+redirects-example-generator": "Obter informações sobre todos os redirecionamentos para a [[Main Page]].", + "apihelp-query+revisions-summary": "Obter informações de revisão.", + "apihelp-query+revisions-extended-description": "Pode ser usado de várias maneiras:\n#Obter dados sobre um conjunto de páginas (última revisão), definindo títulos ou pageids.\n# Obter revisões para uma página determinada, usando títulos ou pageids com início, fim ou limite.\n# Obter dados sobre um conjunto de revisões, definindo seus IDs com revids.", + "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode ser usado com uma única página (modo #2).", + "apihelp-query+revisions-param-startid": "Comece a enumeração do timestamp desta revisão. A revisão deve existir, mas não precisa pertencer a esta página.", + "apihelp-query+revisions-param-endid": "Pare a enumeração no timestamp desta revisão. A revisão deve existir, mas não precisa pertencer a esta página.", + "apihelp-query+revisions-param-start": "De qual timestamp de revisão iniciar a enumeração.", + "apihelp-query+revisions-param-end": "Enumerar até este timestamp.", + "apihelp-query+revisions-param-user": "Somente incluir revisões feitas pelo usuário.", + "apihelp-query+revisions-param-excludeuser": "Excluir revisões feitas pelo usuário.", + "apihelp-query+revisions-param-tag": "Lista apenas as revisões com esta tag.", + "apihelp-query+revisions-param-token": "Que tokens obter para cada revisão.", + "apihelp-query+revisions-example-content": "Obter dados com conteúdo para a última revisão de títulos API e Main Page.", + "apihelp-query+revisions-example-last5": "Mostrar as 5 últimas revisões da Main Page.", + "apihelp-query+revisions-example-first5": "Mostrar as 5 primeiras revisões da Main Page.", + "apihelp-query+revisions-example-first5-after": "Mostrar as 5 primeiras revisões da Main Page feitas depois de 05/01/2006.", + "apihelp-query+revisions-example-first5-not-localhost": "Mostrar as 5 primeiras revisões da Main Page que não foram feitas pelo usuário anônimo 127.0.0.1.", "apihelp-query+revisions-example-first5-user": "Mostrar as 5 primeiras revisões da Main Page que foram feitas pelo usuário MediaWiki default.", - "apihelp-query+revisions+base-param-prop": "Que propriedades mostrar para cada modificação:", + "apihelp-query+revisions+base-param-prop": "Quais propriedades mostrar para cada modificação:", + "apihelp-query+revisions+base-paramvalue-prop-ids": "O ID da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-flags": "Etiqueta de revisão (menor).", + "apihelp-query+revisions+base-paramvalue-prop-timestamp": "O timestamp da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-user": "Usuário que fez a revisão.", + "apihelp-query+revisions+base-paramvalue-prop-userid": "ID de usuário do criador da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-size": "Comprimento (bytes) da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID do modelo de conteúdo da revisão.", + "apihelp-query+revisions+base-paramvalue-prop-comment": "Comentário do usuário para a revisão.", + "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Analisar comentário do usuário para a revisão.", "apihelp-query+revisions+base-paramvalue-prop-content": "Texto da revisão.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Etiquetas para a revisão.", - "apihelp-query+search-description": "Fazer uma buscar completa de texto.", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Obsoleto. Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]] em vez. A árvore de análise XML de conteúdo da revisão (requer o modelo de conteúdo $1).", + "apihelp-query+revisions+base-param-limit": "Limita quantas revisões serão retornadas.", + "apihelp-query+revisions+base-param-expandtemplates": "Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] em vez disso. Expande predefinições no conteúdo de revisão (requer $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]] em vez disso. Gerar árvore de analise XML para o conteúdo de revisão (requer $1prop=content).", + "apihelp-query+revisions+base-param-parse": "Use [[Special:ApiHelp/parse|action=parse]] em vez disso. Analisa o conteúdo da revisão (requer $1prop=content). Por motivos de desempenho, se esta opção for usada, $1limit é definindo para 1.", + "apihelp-query+revisions+base-param-section": "Apenas recuperar o conteúdo deste número de seção.", + "apihelp-query+revisions+base-param-diffto": "Use [[Special:ApiHelp/compare|action=compare]] em vez disso. ID de revisão para diff cada revisão. Use prev, next e cur para a revisão anterior, próxima e atual, respectivamente.", + "apihelp-query+revisions+base-param-difftotext": "Use [[Special:ApiHelp/compare|action=compare]] em vez disso. Texto para diff cada revisão. Apenas diff um número limitado de revisões. Substitui $1diffto. Se $1section estiver definido, apenas essa seção será diferente desse texto.", + "apihelp-query+revisions+base-param-difftotextpst": "Use [[Special:ApiHelp/compare|action=compare]] em vez disso. Executa uma transformação pré-salvar no texto antes de o difundir. Apenas válido quando usado com $1difftotext.", + "apihelp-query+revisions+base-param-contentformat": "Formato de serialização usado para $1difftotext e esperado para saída de conteúdo.", + "apihelp-query+search-summary": "Fazer uma buscar completa de texto.", + "apihelp-query+search-param-search": "Procura por títulos de páginas ou conteúdo que corresponda a este valor. Você pode usar a sequência de pesquisa para invocar recursos de pesquisa especiais, dependendo do que implementa o backend de pesquisa da wiki.", + "apihelp-query+search-param-namespace": "Procure apenas nesses espaços de nominais.", + "apihelp-query+search-param-what": "Qual tipo de pesquisa realizada.", + "apihelp-query+search-param-info": "Quais metadados retornar.", "apihelp-query+search-param-prop": "Que propriedades retornar:", + "apihelp-query+search-param-qiprofile": "Perfil independente da consulta para usar (afeta o algoritmo de classificação).", "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em bytes.", "apihelp-query+search-paramvalue-prop-wordcount": "Adiciona a contagem de palavras da página.", "apihelp-query+search-paramvalue-prop-timestamp": "Adiciona a marcação de data (timestamp) de quando a página foi editada pela última vez.", "apihelp-query+search-paramvalue-prop-snippet": "Adiciona um fragmento analisado da página.", "apihelp-query+search-paramvalue-prop-titlesnippet": "Adiciona um fragmento analisado do título da página.", + "apihelp-query+search-paramvalue-prop-redirectsnippet": "Adiciona um fragmento analisado do redirecionamento do título.", + "apihelp-query+search-paramvalue-prop-redirecttitle": "Adiciona o título do redirecionamento correspondente.", + "apihelp-query+search-paramvalue-prop-sectionsnippet": "Adiciona um parsed snippet do título da seção correspondente.", + "apihelp-query+search-paramvalue-prop-sectiontitle": "Adiciona o título da seção correspondente.", + "apihelp-query+search-paramvalue-prop-categorysnippet": "Adiciona um parsed snippet da categoria correspondente.", + "apihelp-query+search-paramvalue-prop-isfilematch": "Adiciona um booleano que indica se a pesquisa corresponde ao conteúdo do arquivo.", + "apihelp-query+search-paramvalue-prop-score": "Ignorado.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorado.", "apihelp-query+search-param-limit": "Quantas páginas retornar.", + "apihelp-query+search-param-interwiki": "Inclua resultados de interwiki na pesquisa, se disponível.", + "apihelp-query+search-param-backend": "Qual o backend de pesquisa a ser usado, se não for o padrão.", + "apihelp-query+search-param-enablerewrites": "Habilita a reescrita de consulta interna. Alguns backends de pesquisa podem reescrever a consulta em outro que é pensado para fornecer melhores resultados, por exemplo, corrigindo erros de ortografia.", "apihelp-query+search-example-simple": "Procurar por meaning.", "apihelp-query+search-example-text": "Procurar textos para meaning.", - "apihelp-query+siteinfo-paramvalue-prop-general": "Informação geral de sistema", + "apihelp-query+search-example-generator": "Obter informações da página sobre as páginas retornadas para uma pesquisa por meaning.", + "apihelp-query+siteinfo-summary": "Retorna informações gerais sobre o site.", + "apihelp-query+siteinfo-param-prop": "Quais informação obter:", + "apihelp-query+siteinfo-paramvalue-prop-general": "Informação geral do sistema.", + "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Lista de espaços nominais registrados e seus nomes canônicos.", + "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lista de aliases dos espaços nominais registrados.", + "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Lista de alias de página especiais.", + "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Lista de palavras mágicas e seus alias.", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Voltar às estatísticas do site.", + "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Retorna o mapa interwiki (opcionalmente filtrado, opcionalmente localizado usando $1inlanguagecode).", + "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Retorna o servidor de banco de dados com o atraso de replicação mais alto.", + "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Retorna os grupos de usuários e as permissões associadas.", + "apihelp-query+siteinfo-paramvalue-prop-libraries": "Retorna as bibliotecas instaladas na wiki.", + "apihelp-query+siteinfo-paramvalue-prop-extensions": "Retorna as extensões instaladas na wiki.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Retorna um lista de extensões de arquivo (tipos de arquivo) permitidos para serem carregados.", + "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Retorna a informação sobre os direitos wiki (licença), se disponível.", + "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Retorna informações sobre os tipos de restrição (proteção) disponíveis.", + "apihelp-query+siteinfo-paramvalue-prop-languages": "Retorna uma lista de idiomas suportada pelo MediaWiki (opcionalmente localizada usando $1inlanguagecode).", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Retorna uma lista de códigos de idioma para os quais [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está ativado e as variantes suportadas para cada um.", + "apihelp-query+siteinfo-paramvalue-prop-skins": "Retorna uma lista de todas as skins protegidas (opcionalmente localizadas usando $1inlanguagecode, caso contrário no idioma do conteúdo).", + "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Retorna uma lista de tags de extensão do analisador.", + "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Retorna uma lista de ganchos de função do analisador.", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Retorna uma lista de todos os ganchos subscritos (conteúdo de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-variables": "Retorna uma lista de IDs variáveis.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "Retorna uma lista de protocolos que são permitidos em links externos.", + "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Retorna os valores padrão para as preferências do usuário.", + "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Retorna a configuração da caixa de diálogo de upload.", + "apihelp-query+siteinfo-param-filteriw": "Retorna apenas entradas locais ou únicas não locais do mapa interwiki.", + "apihelp-query+siteinfo-param-showalldb": "Liste todos os servidores de banco de dados, e não apenas o que está atrasando.", "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuários nos grupos de usuário.", + "apihelp-query+siteinfo-param-inlanguagecode": "Código de idioma para nomes de idiomas localizados (melhor esforço) e nomes de skin.", "apihelp-query+siteinfo-example-simple": "Obter informação do site.", + "apihelp-query+siteinfo-example-interwiki": "Obtenha uma lista de prefixos interwiki locais.", + "apihelp-query+siteinfo-example-replag": "Verificar o atraso de replicação atual.", + "apihelp-query+stashimageinfo-summary": "Retorna a informação do arquivo para arquivos stashed.", + "apihelp-query+stashimageinfo-param-filekey": "Chave que identifica um upload anterior que foi temporariamente armazenado.", + "apihelp-query+stashimageinfo-param-sessionkey": "Apelido para $1filekey, para compatibilidade com versões anteriores.", + "apihelp-query+stashimageinfo-example-simple": "Retorna informações de um arquivo stashed.", + "apihelp-query+stashimageinfo-example-params": "Retorna as miniaturas para dois arquivos stashed.", + "apihelp-query+tags-summary": "Lista etiquetas da modificação.", + "apihelp-query+tags-param-limit": "O número máximo de tags a serem listadas.", + "apihelp-query+tags-param-prop": "Quais propriedades obter:", + "apihelp-query+tags-paramvalue-prop-name": "Adiciona o nome da tag.", + "apihelp-query+tags-paramvalue-prop-displayname": "Adiciona mensagem do sistema para a tag.", + "apihelp-query+tags-paramvalue-prop-description": "Adiciona descrição da tag.", + "apihelp-query+tags-paramvalue-prop-hitcount": "Adiciona o número de revisões e entradas do log que tem esta tag.", + "apihelp-query+tags-paramvalue-prop-defined": "Indique se a etiqueta está definida.", + "apihelp-query+tags-paramvalue-prop-source": "Obtém as fontes da etiqueta, que podem incluir extension para tags definidas em extensão e extension para tags que podem ser aplicadas manualmente pelos usuários.", + "apihelp-query+tags-paramvalue-prop-active": "Se a tag ainda está sendo aplicada.", + "apihelp-query+tags-example-simple": "Listar as tags disponíveis.", + "apihelp-query+templates-summary": "Mostrar apenas as alterações nas páginas associadas desta página.", + "apihelp-query+templates-param-namespace": "Mostra as predefinições neste espaços nominais apenas.", "apihelp-query+templates-param-limit": "Quantas predefinições retornar.", + "apihelp-query+templates-param-templates": "Apenas liste essas predefinições. Útil para verificar se uma determinada página usa uma determinada predefinição.", + "apihelp-query+templates-param-dir": "A direção na qual listar.", + "apihelp-query+templates-example-simple": "Obter predefinições usadas na página Main Page.", + "apihelp-query+templates-example-generator": "Obter informações sobre as páginas de predefinições usada na Main Page.", + "apihelp-query+templates-example-namespaces": "Obter páginas nos espaços nominais {{ns: user}} e {{ns: template}} que são transcluídos na página Main Page.", + "apihelp-query+tokens-summary": "Obtém tokens para ações de modificação de dados.", + "apihelp-query+tokens-param-type": "Tipos de token para solicitar.", + "apihelp-query+tokens-example-simple": "Recupere um token csrf (o padrão).", + "apihelp-query+tokens-example-types": "Recupere um token de vigilância e um token de patrulha.", + "apihelp-query+transcludedin-summary": "Encontre todas as páginas que transcluam as páginas dadas.", + "apihelp-query+transcludedin-param-prop": "Quais propriedades obter:", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de cada página.", + "apihelp-query+transcludedin-paramvalue-prop-title": "O título de cada página.", + "apihelp-query+transcludedin-paramvalue-prop-redirect": "Sinalizar se a página é um redirecionamento.", + "apihelp-query+transcludedin-param-namespace": "Listar apenas páginas neste espaço nominal.", "apihelp-query+transcludedin-param-limit": "Quantos retornar.", - "apihelp-query+users-description": "Obter informação sobre uma lista de usuários.", + "apihelp-query+transcludedin-param-show": "Mostre apenas itens que atendam a esses critérios.\n;redirect:Apenas mostra redirecionamentos.\n;!redirect:Não mostra redirecionamentos.", + "apihelp-query+transcludedin-example-simple": "Obter uma lista de páginas que transcluem Main Page.", + "apihelp-query+transcludedin-example-generator": "Obter informações sobre páginas que transcluem Main Page.", + "apihelp-query+usercontribs-summary": "Obtêm todas as edições de um usuário.", + "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições para retornar.", + "apihelp-query+usercontribs-param-start": "O timestamp de início para retornar.", + "apihelp-query+usercontribs-param-end": "O timestamp final para retornar.", + "apihelp-query+usercontribs-param-user": "Os usuários dos quais recuperar contribuições. Não pode ser usado com $1userids ou $1userprefix.", + "apihelp-query+usercontribs-param-userprefix": "Recupera contribuições para todos os usuários cujos nomes começam com esse valor. Não pode ser usado com $1user ou $1userids.", + "apihelp-query+usercontribs-param-userids": "As IDs de usuário das quais recuperar as contribuições. Não pode ser usado com$1user ou $1userprefix.", + "apihelp-query+usercontribs-param-namespace": "Apenas lista as contribuições nesses espaços nominais.", + "apihelp-query+usercontribs-param-prop": "Incluir elementos de informação adicional:", + "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona o ID da página e revisão.", + "apihelp-query+usercontribs-paramvalue-prop-title": "Adiciona o título e o ID do espaço nominal da página.", + "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Adiciona o timestamp da edição.", + "apihelp-query+usercontribs-paramvalue-prop-comment": "Adiciona o comentário da edição.", + "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Adiciona o comentário analisado da edição.", + "apihelp-query+usercontribs-paramvalue-prop-size": "Adiciona o novo tamanho da edição.", + "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Adiciona o tamanho delta da edição contra o seu pai.", + "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona etiqueta da edição.", + "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiquetas de edições patrulhadas.", + "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as tags para editar.", + "apihelp-query+usercontribs-param-show": "Mostre apenas itens que atendam a esses critérios, por exemplo, apenas edições não-menores: $2show=!minor.\n\nSe $2show=patrolled ou $2show=!patrolled estiver definido, revisões mais antigas do que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) não serão exibidas.", + "apihelp-query+usercontribs-param-tag": "Lista apenas as revisões com esta tag.", + "apihelp-query+usercontribs-param-toponly": "Somente lista as alterações que são as últimas revisões.", + "apihelp-query+usercontribs-example-user": "Mostra as contribuições do usuário Example.", + "apihelp-query+usercontribs-example-ipprefix": "Mostrar contribuições de todos os endereços IP com o prefixo 192.0.2..", + "apihelp-query+userinfo-summary": "Ober informações sobre o usuário atual.", + "apihelp-query+userinfo-param-prop": "Quais peças de informação incluir:", + "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiqueta se o usuário atual está bloqueado, por quem e por que motivo.", + "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adiciona a tag messages se o usuário atual tiver mensagens pendentes.", + "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos aos quais o usuário atual pertence.", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lista grupos aos quais o usuário atual foi explicitamente designado, incluindo a data de expiração de cada associação de grupo.", + "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais o usuário atual é automaticamente membro.", + "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todos os direitos que o usuário atual possui.", + "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos aos quais o usuário atual pode adicionar e remover.", + "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas as preferências que o usuário atual estabeleceu.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obter um token para alterar as preferências do usuário atual.", + "apihelp-query+userinfo-paramvalue-prop-editcount": "Adiciona a contagem de edições do usuário atual.", + "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todos os limites de taxa aplicáveis ao usuário atual.", + "apihelp-query+userinfo-paramvalue-prop-realname": "Adiciona o nome real do usuário.", + "apihelp-query+userinfo-paramvalue-prop-email": "Adiciona o endereço de e-mail e a data de autenticação do e-mail.", + "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Ecoa o cabeçalho Accept-Language enviado pelo cliente em um formato estruturado.", + "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Adiciona a data de registro do usuário.", + "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adiciona a contagem de páginas não lidas na lista de páginas vigiadas do usuário (máximo $1; retorna $2 se mais).", + "apihelp-query+userinfo-paramvalue-prop-centralids": "Adiciona os IDs centrais e o status do anexo do usuário.", + "apihelp-query+userinfo-param-attachedwiki": "Com $1prop=centralids, indique se o usuário está conectado com a wiki identificada por este ID.", + "apihelp-query+userinfo-example-simple": "Ober informações sobre o usuário atual.", + "apihelp-query+userinfo-example-data": "Obter informações adicionais sobre o usuário atual.", + "apihelp-query+users-summary": "Obter informação sobre uma lista de usuários.", + "apihelp-query+users-param-prop": "Quais peças de informação incluir:", + "apihelp-query+users-paramvalue-prop-blockinfo": "Etiqueta se o usuário estiver bloqueado, por quem e por que motivo.", + "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos aos quais cada usuário pertence.", + "apihelp-query+users-paramvalue-prop-groupmemberships": "Lista grupos aos quais cada usuário foi explicitamente designado, incluindo a data de expiração de cada associação de grupo.", + "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais um usuário é automaticamente membro.", + "apihelp-query+users-paramvalue-prop-rights": "Lista todos os direitos que cada usuário possui.", + "apihelp-query+users-paramvalue-prop-editcount": "Adiciona a contagem de edição do usuário.", + "apihelp-query+users-paramvalue-prop-registration": "Adiciona o timestamp de registro do usuário.", + "apihelp-query+users-paramvalue-prop-emailable": "Etiquetar se o usuário pode e deseja receber e-mails através de [[Special:Emailuser]].", + "apihelp-query+users-paramvalue-prop-gender": "Etiqueta o gênero do usuário. Retorna \"male\", \"female\" ou \"unknown\".", + "apihelp-query+users-paramvalue-prop-centralids": "Adiciona os IDs centrais e o status do anexo do usuário.", + "apihelp-query+users-paramvalue-prop-cancreate": "Indica se uma conta para nomes de usuário válidos mas não registrados pode ser criada.", + "apihelp-query+users-param-attachedwiki": "Com $1prop=centralids, indique se o usuário está conectado com a wiki identificada por este ID.", + "apihelp-query+users-param-users": "Uma lista de usuários dos quais obter informações.", + "apihelp-query+users-param-userids": "Uma lista de IDs de usuários dos quais obter informações.", + "apihelp-query+users-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] em vez.", + "apihelp-query+users-example-simple": "Retornar informações para o usuário Example.", + "apihelp-query+watchlist-summary": "Obter alterações recentes nas páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-param-allrev": "Inclua várias revisões da mesma página dentro de um prazo determinado.", + "apihelp-query+watchlist-param-start": "A data a partir da qual começar a enumeração.", + "apihelp-query+watchlist-param-end": "O timestamp para terminar de enumerar.", + "apihelp-query+watchlist-param-namespace": "Filtrar apenas as mudanças dos espaços nominais dados.", + "apihelp-query+watchlist-param-user": "Listar apenas alterações deste usuário.", + "apihelp-query+watchlist-param-excludeuser": "Não listar as alterações deste usuário.", "apihelp-query+watchlist-param-limit": "Quantos resultados retornar por solicitação.", - "apihelp-query+watchlist-paramvalue-prop-title": "Adicionar título da página.", + "apihelp-query+watchlist-param-prop": "Quais propriedades adicionais obter:", + "apihelp-query+watchlist-paramvalue-prop-ids": "Adiciona o ID de revisão e de página.", + "apihelp-query+watchlist-paramvalue-prop-title": "Adiciona o título da página.", + "apihelp-query+watchlist-paramvalue-prop-flags": "Adiciona etiquetas para a edição.", + "apihelp-query+watchlist-paramvalue-prop-user": "Adiciona o usuário que fez a edição.", + "apihelp-query+watchlist-paramvalue-prop-userid": "Adiciona o ID de usuário de quem fez a edição.", "apihelp-query+watchlist-paramvalue-prop-comment": "Adicionar comentário à edição.", + "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Adiciona o comentário analisado da edição.", + "apihelp-query+watchlist-paramvalue-prop-timestamp": "Adiciona o timestamp da edição.", + "apihelp-query+watchlist-paramvalue-prop-patrol": "Edições de tags que são patrulhadas.", + "apihelp-query+watchlist-paramvalue-prop-sizes": "Adiciona os velhos e novos comprimentos da página.", + "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adiciona o timestamp de quando o usuário foi notificado pela última vez sobre a edição.", + "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adiciona informações de log, quando apropriado.", + "apihelp-query+watchlist-param-show": "Mostre apenas itens que atendam a esses critérios. Por exemplo, para ver apenas edições menores feitas por usuários conectados, set $1show=minor|!anon.", + "apihelp-query+watchlist-param-type": "Quais tipos de mudanças mostrar:", "apihelp-query+watchlist-paramvalue-type-edit": "Edições comuns nas páginas.", - "apihelp-query+watchlist-paramvalue-type-external": "Alterações externas", + "apihelp-query+watchlist-paramvalue-type-external": "Alterações externas.", "apihelp-query+watchlist-paramvalue-type-new": "Criação de páginas.", "apihelp-query+watchlist-paramvalue-type-log": "Registro de entradas.", "apihelp-query+watchlist-paramvalue-type-categorize": "Alterações de membros pertencentes à uma categoria.", + "apihelp-query+watchlist-param-owner": "Usado juntamente com $1 para acessar a lista de páginas vigiadas de um usuário diferente.", + "apihelp-query+watchlist-param-token": "Um token seguro (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do usuário) para permitir o acesso à lista de páginas vigiadas de outro usuário.", + "apihelp-query+watchlist-example-simple": "Liste a revisão superior para páginas recentemente alteradas na lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-example-props": "Obtenha informações adicionais sobre a revisão superior das páginas alteradas recentemente na lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-example-allrev": "Obtenha informações sobre todas as mudanças recentes nas páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-example-generator": "Obtenha informações de página para páginas recentemente alteradas na lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-example-generator-rev": "Obtenha informações de revisão para as mudanças recentes nas páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlist-example-wlowner": "Listar a revisão superior para páginas alteradas recentemente na lista de páginas vigiadas do usuário Exemplo.", + "apihelp-query+watchlistraw-summary": "Obtenha todas as páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlistraw-param-namespace": "Listar apenas páginas dos espaços nominais dados.", "apihelp-query+watchlistraw-param-limit": "Quantos resultados retornar por solicitação.", + "apihelp-query+watchlistraw-param-prop": "Quais propriedades adicionais obter:", + "apihelp-query+watchlistraw-paramvalue-prop-changed": "Adiciona o timestamp de quando o usuário foi notificado pela última vez sobre a edição.", + "apihelp-query+watchlistraw-param-show": "Listar apenas itens que atendam a esses critérios.", + "apihelp-query+watchlistraw-param-owner": "Usado juntamente com $1 para acessar a lista de páginas vigiadas de um usuário diferente.", + "apihelp-query+watchlistraw-param-token": "Um token seguro (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do usuário) para permitir o acesso à lista de páginas vigiadas de outro usuário.", + "apihelp-query+watchlistraw-param-dir": "A direção na qual listar.", + "apihelp-query+watchlistraw-param-fromtitle": "Título (com prefixo do espaço nominal) do qual começar a enumerar.", + "apihelp-query+watchlistraw-param-totitle": "Título (com prefixo do espaço nominal) do qual parar de enumerar.", + "apihelp-query+watchlistraw-example-simple": "Listar páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-query+watchlistraw-example-generator": "Obtenha informações de página para páginas na lista de páginas vigiadas do usuário atual.", + "apihelp-removeauthenticationdata-summary": "Remova os dados de autenticação para o usuário atual.", + "apihelp-removeauthenticationdata-example-simple": "Tente remover os dados do usuário atual para FooAuthenticationRequest.", + "apihelp-resetpassword-summary": "Envia um e-mail de redefinição de senha para o usuário atual.", + "apihelp-resetpassword-extended-description-noroutes": "Não há rotas de redefinição de senha disponíveis.\n\nAtive rotas em [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] para usar este módulo.", + "apihelp-resetpassword-param-user": "Usuário sendo reiniciado.", + "apihelp-resetpassword-param-email": "Endereço de e-mail do usuário sendo redefinido.", + "apihelp-resetpassword-example-user": "Envia um e-mail de redefinição de senha para o usuário Example.", + "apihelp-resetpassword-example-email": "Envia um e-mail de redefinição de senha para todos os usuários com e-mail user@example.com.", + "apihelp-revisiondelete-summary": "Excluir e recuperar revisões.", + "apihelp-revisiondelete-param-type": "Tipo de exclusão de revisão em execução.", + "apihelp-revisiondelete-param-target": "Título da página para a eliminação da revisão, se necessário para o tipo.", + "apihelp-revisiondelete-param-ids": "Identificadores para as revisões a serem excluídas.", + "apihelp-revisiondelete-param-hide": "O que ocultar para cada revisão.", + "apihelp-revisiondelete-param-show": "O que exibir para cada revisão.", + "apihelp-revisiondelete-param-suppress": "Seja para suprimir dados de administradores, bem como de outros.", + "apihelp-revisiondelete-param-reason": "Razão para a exclusão ou recuperação.", + "apihelp-revisiondelete-param-tags": "Etiquetas para se inscrever na entrada no registo de eliminação.", + "apihelp-revisiondelete-example-revision": "Ocultar conteúdo da revisão 12345 na página Main Page.", + "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada de log 67890 com razão BLP violation.", + "apihelp-rollback-summary": "Desfazer a última edição para a página.", + "apihelp-rollback-extended-description": "Se o último usuário que editou a página efetuou várias edições consecutivas, todas serão revertidas.", "apihelp-rollback-param-title": "Título da página para reverter. Não pode ser usado em conjunto com $1pageid.", "apihelp-rollback-param-pageid": "ID da página para reverter. Não pode ser usado em conjunto com $1title.", + "apihelp-rollback-param-tags": "Tags para aplicar ao rollback.", + "apihelp-rollback-param-user": "Nome do usuário cujas edições devem ser revertidas.", + "apihelp-rollback-param-summary": "Resumo de edição personalizado. Se estiver vazio, o resumo padrão será usado.", + "apihelp-rollback-param-markbot": "Marca as edições revertidas e a reversão como edições de bot.", + "apihelp-rollback-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", + "apihelp-rollback-example-simple": "Reverter as últimas edições de página Main Page pelo usuário Example.", + "apihelp-rollback-example-summary": "Reverter as últimas edições de página Main Page pelo IP 192.0.2.5 com resumo Reverting vandalism e marque essas edições e reversões como edições de bot.", + "apihelp-rsd-summary": "Exportar um esquema RSD (Really Simple Discovery).", + "apihelp-rsd-example-simple": "Exportar o esquema RSD.", + "apihelp-setnotificationtimestamp-summary": "Atualize o timestamp de notificação para páginas vigiadas.", + "apihelp-setnotificationtimestamp-extended-description": "Isso afeta o destaque das páginas alteradas na lista de exibição e no histórico e o envio de e-mail quando a preferência \"{{int:tog-enotifwatchlistpages}}\" estiver habilitada.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabalhar em todas as páginas vigiadas.", + "apihelp-setnotificationtimestamp-param-timestamp": "Timestamp para o qual definir o timestamp de notificação.", + "apihelp-setnotificationtimestamp-param-torevid": "Revisão para definir o timestamp de notificação para (apenas uma página).", + "apihelp-setnotificationtimestamp-param-newerthanrevid": "Revisão para definir o timestamp de notificação mais recente do que (apenas uma página).", + "apihelp-setnotificationtimestamp-example-all": "Redefinir o status da notificação para toda a lista de páginas vigiadas.", + "apihelp-setnotificationtimestamp-example-page": "Redefinir o status de notificação para a Main page.", + "apihelp-setnotificationtimestamp-example-pagetimestamp": "Define o timestamp da notificação para Main page para que todas as edições a partir de 1 de janeiro de 2012 não sejam visualizadas.", + "apihelp-setnotificationtimestamp-example-allpages": "Restaura o status de notificação para páginas no espaço nominal {{ns:user}}.", + "apihelp-setpagelanguage-summary": "Mudar o idioma de uma página.", + "apihelp-setpagelanguage-extended-description-disabled": "Mudar o idioma de uma página não é permitido nesta wiki.\n\nAtive [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para usar esta ação.", + "apihelp-setpagelanguage-param-title": "Título da página cujo idioma você deseja alterar. Não pode ser usado em conjunto com $1pageid.", + "apihelp-setpagelanguage-param-pageid": "ID da página cujo idioma você deseja alterar. Não pode ser usado em conjunto com $1title.", + "apihelp-setpagelanguage-param-lang": "Código de idioma do idioma para mudar a página para. Usar default para redefinir a página para o idioma de conteúdo padrão da wiki.", + "apihelp-setpagelanguage-param-reason": "Motivo para a mudança.", + "apihelp-setpagelanguage-param-tags": "Alterar as tags para aplicar à entrada de log resultante dessa ação.", + "apihelp-setpagelanguage-example-language": "Mudar o idioma da Main Page para Basque.", + "apihelp-setpagelanguage-example-default": "Mudar o idioma da página com ID 123 para o idioma padrão da wiki.", + "apihelp-stashedit-summary": "Prepare uma edição no cache compartilhado.", + "apihelp-stashedit-extended-description": "Isto é destinado a ser usado via AJAX a partir do formulário de edição para melhorar o desempenho da página salvar.", + "apihelp-stashedit-param-title": "Título da página que está sendo editada.", + "apihelp-stashedit-param-section": "Número da seção. 0 para a seção superior, new para uma nova seção.", "apihelp-stashedit-param-sectiontitle": "O título para uma nova seção.", - "apihelp-stashedit-param-text": "Conteúdo da página", + "apihelp-stashedit-param-text": "Conteúdo da página.", + "apihelp-stashedit-param-stashedtexthash": "Hash do conteúdo da página de um stash anterior para usar em vez disso.", "apihelp-stashedit-param-contentmodel": "Modelo de conteúdo do novo conteúdo.", "apihelp-stashedit-param-contentformat": "Formato de serialização de conteúdo usado para o texto de entrada.", - "apihelp-stashedit-param-summary": "Mudar sumário.", + "apihelp-stashedit-param-baserevid": "ID de revisão da revisão base.", + "apihelp-stashedit-param-summary": "Mudar resumo.", + "apihelp-tag-summary": "Adicionar ou remover tags de alteração de revisões individuais ou entradas de log.", + "apihelp-tag-param-rcid": "Uma ou mais IDs de alterações recentes a partir das quais adicionar ou remover a etiqueta.", + "apihelp-tag-param-revid": "Uma ou mais IDs de revisão a partir das quais adicionar ou remover a etiqueta.", + "apihelp-tag-param-logid": "Uma ou mais IDs de entrada de log a partir das quais adicionar ou remover a etiqueta.", + "apihelp-tag-param-add": "Tags para adicionar. Apenas as tags manualmente definidas podem ser adicionadas.", + "apihelp-tag-param-remove": "Tags para remover. Somente as tags que são definidas manualmente ou completamente indefinidas podem ser removidas.", "apihelp-tag-param-reason": "Motivo para a mudança.", - "apihelp-unblock-description": "Desbloquear usuário", - "apihelp-unblock-param-id": "ID do bloco para desbloquear (obtido através de list=blocks). Não pode ser usado em conjunto com $1user.", - "apihelp-unblock-param-user": "Nome de usuário, endereço IP ou intervalo de IP para a se desbloquear. Não pode ser usado em conjunto com $1id.", + "apihelp-tag-param-tags": "Etiquetas para aplicar à entrada de log que será criada como resultado dessa ação.", + "apihelp-tag-example-rev": "Adicionar a tag vandalism a ID de revisão 123 sem especificar uma razão", + "apihelp-tag-example-log": "Remova a tag spam da ID de entrada de registro 123 com o motivo Wrongly applied", + "apihelp-tokens-summary": "Obter tokens para ações de modificação de dados.", + "apihelp-tokens-extended-description": "Este módulo está depreciado em favor de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-param-type": "Tipos de token para solicitar.", + "apihelp-tokens-example-edit": "Recupera um token de edição (o padrão).", + "apihelp-tokens-example-emailmove": "Recupere um token de e-mail e um token de movimento.", + "apihelp-unblock-summary": "Desbloquear usuário.", + "apihelp-unblock-param-id": "ID do bloco para desbloquear (obtido através de list=blocks). Não pode ser usado em conjunto com $1user ou $1userid.", + "apihelp-unblock-param-user": "Nome de usuário, endereço IP ou intervalo de IP para desbloquear. Não pode ser usado em conjunto com $1id ou $1userid.", + "apihelp-unblock-param-userid": "ID do usuário para desbloquear. Não pode ser usado em conjunto com $1id ou $1user.", "apihelp-unblock-param-reason": "Motivo para o desbloqueio.", + "apihelp-unblock-param-tags": "Alterar as tags para se inscrever na entrada no registro de bloqueio.", "apihelp-unblock-example-id": "Desbloquear bloqueio ID #105.", + "apihelp-unblock-example-user": "Desbloquear o usuário Bob com o motivo Sorry Bob.", + "apihelp-undelete-summary": "Restaure as revisões de uma página excluída.", + "apihelp-undelete-extended-description": "Uma lista de revisões excluídas (incluindo timestamps) pode ser recuperada através de [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]] e uma lista de IDs de arquivo excluídos pode ser recuperada através de [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-param-title": "Título da página a ser restaurada.", "apihelp-undelete-param-reason": "Razão para restaurar.", + "apihelp-undelete-param-tags": "Alterar as tags para se inscrever na entrada no registro de exclusão.", + "apihelp-undelete-param-timestamps": "Timestamps das revisões para restaurar. Se ambos $1timestamps e $1fileids estiverem vazios, tudo será restaurado.", + "apihelp-undelete-param-fileids": "IDs das revisões de arquivos para restaurar. Se ambos, $1timestamps e $1fileids estiverem, vazios, tudo será restaurado.", + "apihelp-undelete-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", "apihelp-undelete-example-page": "Restaurar página Main Page.", - "apihelp-upload-param-watch": "Vigiar esta página", - "apihelp-upload-param-ignorewarnings": "Ignorar todos os avisos.", + "apihelp-undelete-example-revisions": "Recupere duas revisões da página Main Page.", + "apihelp-unlinkaccount-summary": "Remova uma conta de terceiros vinculada ao usuário atual.", + "apihelp-unlinkaccount-example-simple": "Tente remover o link do usuário atual para o provedor associado com FooAuthenticationRequest.", + "apihelp-upload-summary": "Carregue um arquivo ou obtenha o status dos carregamentos pendentes.", + "apihelp-upload-extended-description": "Vários métodos estão disponíveis:\n* Carrega o conteúdo do arquivo diretamente, usando o parâmetro $1file.\n* Carrega o arquivo em pedaços, usando os parâmetros $1filesize, $1chunk e $1offset.\n* Tenha o servidor MediaWiki buscando um arquivo de um URL, usando o parâmetro $1url.\n* Complete um carregamento anterior que falhou devido a avisos, usando o parâmetro $1filekey.\nNote que o HTTP POST deve ser feito como um upload de arquivo (ou seja, usando multipart/form-data) ao enviar o $1file.", + "apihelp-upload-param-filename": "Nome do arquivo de destino.", + "apihelp-upload-param-comment": "Faça o upload do comentário. Também usado como o texto da página inicial para novos arquivos, se $1text não for especificado.", + "apihelp-upload-param-tags": "Alterar as tags para aplicar à entrada do log de upload e à revisão da página do arquivo.", + "apihelp-upload-param-text": "Texto inicial da página para novos arquivos.", + "apihelp-upload-param-watch": "Vigiar esta página.", + "apihelp-upload-param-watchlist": "Adicione ou remova incondicionalmente a página da lista de páginas vigiadas do usuário atual, use preferências ou não mude a vigilância.", + "apihelp-upload-param-ignorewarnings": "Ignorar quaisquer avisos.", + "apihelp-upload-param-file": "Conteúdo do arquivo.", + "apihelp-upload-param-url": "URL do qual para buscar o arquivo.", + "apihelp-upload-param-filekey": "Chave que identifica um upload anterior que foi temporariamente armazenado.", + "apihelp-upload-param-sessionkey": "Igual a $1filekey, mantido para compatibilidade com versões anteriores.", + "apihelp-upload-param-stash": "Se configurado, o servidor armazenará o arquivo temporariamente em vez de adicioná-lo ao repositório.", + "apihelp-upload-param-filesize": "Tamanho completo do upload.", + "apihelp-upload-param-offset": "Deslocamento de pedaços em bytes.", + "apihelp-upload-param-chunk": "Conteúdo do pedaço.", + "apihelp-upload-param-async": "Tornar as operações de arquivo potencialmente grandes assíncronas quando possível.", + "apihelp-upload-param-checkstatus": "Apenas obtenha o status de upload para a chave de arquivo fornecida.", + "apihelp-upload-example-url": "Enviar a partir de um URL.", + "apihelp-upload-example-filekey": "Complete um upload que falhou devido a avisos.", + "apihelp-userrights-summary": "Alterar a associação de um grupo de usuários.", "apihelp-userrights-param-user": "Nome de usuário.", "apihelp-userrights-param-userid": "ID de usuário.", - "apihelp-userrights-param-add": "Adicionar o usuário para estes grupos.", + "apihelp-userrights-param-add": "Adiciona o usuário a esses grupos ou, se ele já for membro, atualiza a expiração de sua associação nesse grupo.", + "apihelp-userrights-param-expiry": "Expiração de timestamps. Pode ser relativo (por exemplo 5 meses ou 2 semanas) ou absoluto (por exemplo 2014-09-18T12:34:56Z). Se apenas um timestamp for configurado, ele sera usado para todos os grupos passados pelo parâmetro $1add. Use infinite, indefinite, infinity ou never, para um grupo de usuários que nunca expiram.", "apihelp-userrights-param-remove": "Remover o usuário destes grupos.", "apihelp-userrights-param-reason": "Motivo para a mudança.", - "apihelp-none-description": "Nenhuma saída.", + "apihelp-userrights-param-tags": "Alterar as tags para se inscrever na entrada no registro de direitos do usuário.", + "apihelp-userrights-example-user": "Adicionar o usuário FooBot ao grupo bot e remover dos grupos sysop e bureaucrat.", + "apihelp-userrights-example-userid": "Adicionar o usuário com a ID 123 ao grupo global bot e remover dos grupos sysop e bureaucrat.", + "apihelp-userrights-example-expiry": "Adicionar o usuário SometimeSysop ao grupo sysop por 1 mês.", + "apihelp-validatepassword-summary": "Valide uma senha de acordo as políticas de senha da wiki.", + "apihelp-validatepassword-extended-description": "A validade é relatada como Good se a senha for aceitável, Change se a senha for usada para entrar, mas deve ser alterada, ou Invalid se a senha não é utilizável.", + "apihelp-validatepassword-param-password": "Senha para validar.", + "apihelp-validatepassword-param-user": "Nome do usuário, para uso ao testar a criação da conta. O usuário nomeado não deve existir.", + "apihelp-validatepassword-param-email": "Endereço de e-mail, para uso ao testar a criação de conta.", + "apihelp-validatepassword-param-realname": "Nome real, para uso ao testar a criação de conta.", + "apihelp-validatepassword-example-1": "Valide a senha foobar para o usuário atual.", + "apihelp-validatepassword-example-2": "Valide a senha qwerty para o usuário Example criado.", + "apihelp-watch-summary": "Adicionar ou remover páginas da lista de páginas vigiadas do usuário atual.", + "apihelp-watch-param-title": "A página para (não)vigiar. Use $1titles em vez disso.", + "apihelp-watch-param-unwatch": "Se configurado, a página deixara de ser vigiada ao invés de vigiada.", + "apihelp-watch-example-watch": "Vigiar a página Main Page.", + "apihelp-watch-example-unwatch": "Deixar de vigiar a página Main Page.", + "apihelp-watch-example-generator": "Vigiar as primeiras páginas no espaço nominal principal.", + "apihelp-format-example-generic": "Retornar o resultado da consulta no formato $1.", + "apihelp-format-param-wrappedhtml": "Retorna o HTML pretty-printed e módulos ResourceLoader associados como um objeto JSON.", + "apihelp-json-summary": "Dados de saída em formato JSON.", + "apihelp-json-param-callback": "Se especificado, envolve a saída para uma determinada chamada de função. Por segurança, todos os dados específicos do usuário serão restritos.", + "apihelp-json-param-utf8": "Se especificado, codifica a maioria (mas não todos) caracteres não-ASCII como UTF-8 em vez de substituí-los por sequências de escape hexadecimais. Padrão quando formatversion não é 1.", + "apihelp-json-param-ascii": "Se especificado, codifica todos os não-ASCII usando sequências de escape hexadecimais. Padrão quando formatversion é 1.", + "apihelp-json-param-formatversion": "Formatação de saída:\n;1:formato compatível com versões anteriores (XML-style booleans, * chaves para nós de conteúdo, etc.).\n;2: formato moderno experimental. Detalhes podem ser alterados!\n;mais recente: use o formato mais recente (atualmente 2), pode mudar sem aviso prévio.", + "apihelp-jsonfm-summary": "Dados de saída no formato JSON (pretty-print em HTML).", + "apihelp-none-summary": "Nenhuma saída.", + "apihelp-php-summary": "Dados de saída no formato PHP serializado.", + "apihelp-php-param-formatversion": "Formatação de saída:\n;1:formato compatível com versões anteriores (XML-style booleans, * chaves para nós de conteúdo, etc.).\n;2: formato moderno experimental. Detalhes podem ser alterados!\n;mais recente: use o formato mais recente (atualmente 2), pode mudar sem aviso prévio.", + "apihelp-phpfm-summary": "Dados de saída em formato serializado em PHP (pretty-print em HTML).", + "apihelp-rawfm-summary": "Dados de saída, incluindo elementos de depuração, no formato JSON (pretty-print em HTML).", + "apihelp-xml-summary": "Dados de saída em formato XML.", + "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor deve ser um título no espaço nominal {{ns: MediaWiki}} que termina em .xsl.", + "apihelp-xml-param-includexmlnamespace": "Se especificado, adiciona um espaço nominal XML.", + "apihelp-xmlfm-summary": "Dados de saída em formato XML (impressão bonita em HTML).", + "api-format-title": "Resultado da API MediaWiki", + "api-format-prettyprint-header": "Esta é a representação HTML do formato $1. O HTML é bom para depuração, mas não é adequado para o uso da aplicação.\n\nEspecifique o parâmetro format para alterar o formato de saída. Para ver a representação não-HTML do formato $1, defina format=$2.\n\nVeja a [[mw:Special:MyLanguage/API|documentação completa]] ou a [[Special:ApiHelp/main|ajuda da API]] para obter mais informações.", + "api-format-prettyprint-header-only-html": "Esta é uma representação HTML destinada a depuração e não é apropriada para o uso da aplicação.\n\nVeja a documentação completa [[mw:Special:MyLanguage/API|complete documentation]] ou a ajuda [[Special:ApiHelp/main|API help]] para maiores informações.", + "api-format-prettyprint-header-hyperlinked": "Esta é a representação HTML do formato $1. O HTML é bom para depuração, mas não é adequado para o uso da aplicação.\n\nEspecifique o parâmetro format para alterar o formato de saída. Para ver a representação não-HTML do formato $1, defina [$3 format=$2].\n\nVeja a [[mw:API|documentação completa]] ou a [[Special:ApiHelp/main|ajuda da API]] para obter mais informações.", + "api-format-prettyprint-status": "Essa resposta seria retornada com o status HTTP $1 $2.", + "api-login-fail-aborted": "A autenticação requer interação do usuário, que não é suportada por action=login. Para poder fazer login com action=login, veja [[Special:BotPasswords]]. Para continuar usando main-account loign, veja [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "A autenticação requer interação do usuário, que não é suportada por action=login. Para fazer loging veja [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "Não é possível fazer o login ao usar $1.", + "api-login-fail-sameorigin": "Não é possível iniciar sessão quando a mesma política de origem não é aplicada.", + "api-pageset-param-titles": "Uma lista de IDs de título para trabalhar.", + "api-pageset-param-pageids": "Uma lista de IDs de página para trabalhar.", + "api-pageset-param-revids": "Uma lista de IDs de revisão para trabalhar.", + "api-pageset-param-generator": "Obter a lista de páginas para trabalhar executando o módulo de consulta especificado.\n\nNota:Os nomes dos parâmetros do gerador devem ser prefixados com um \"g\", veja exemplos.", + "api-pageset-param-redirects-generator": "Resolve automaticamente redirecionamentos em $1titles, $1pageids e $1revids e em páginas retornadas por $1generator.", + "api-pageset-param-redirects-nogenerator": "Resolve automaticamente redirecionamentos em $1titles, $1pageids e $1revids.", + "api-pageset-param-converttitles": "Converte títulos para outras variantes, se necessário. Só funciona se o idioma do conteúdo do wiki suportar a conversão variante. Os idiomas que suportam a conversão variante incluem $1.", + "api-help-title": "Ajuda da API MediaWiki", + "api-help-lead": "Esta é uma página de documentação da API MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API", + "api-help-main-header": "Módulo principal", + "api-help-undocumented-module": "Nenhuma documentação para o módulo $1.", "api-help-flag-deprecated": "Este módulo é obsoleto.", + "api-help-flag-internal": "Este módulo é interno ou instável. Sua operação pode mudar 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 gravação.", + "api-help-flag-mustbeposted": "Este módulo aceita apenas pedidos POST.", + "api-help-flag-generator": "Este módulo pode ser usado como um gerador.", "api-help-source": "Fonte: $1", "api-help-source-unknown": "Fonte: desconhecida", "api-help-license": "Licença: [[$1|$2]]", "api-help-license-noname": "Licença: [[$1|Ver ligação]]", - "api-help-license-unknown": "Fonte: desconhecida", + "api-help-license-unknown": "Licensa: desconhecida", "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:", - "api-help-param-deprecated": "Obsoleto", - "api-help-param-required": "Este parâmetro é obrigatório." + "api-help-param-deprecated": "Obsoleto.", + "api-help-param-required": "Este parâmetro é obrigatório.", + "api-help-datatypes-header": "Tipos de dados", + "api-help-datatypes": "A entrada para MediaWiki deve ser UTF-8 normalizada pelo NFC. O MediaWiki pode tentar converter outra entrada, mas isso pode causar a falha de algumas operações (como [[Special:ApiHelp/edit|editar]] com verificações MD5).\n\nAlguns tipos de parâmetros em solicitações de API precisam de uma explicação adicional:\n;boolean\n:Os parâmetros booleanos funcionam como caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omita o parâmetro inteiramente.\n;timestamp\n: As marcas de tempo podem ser especificadas em vários formatos. É recomendada a data e a hora ISO 8601. Todos os horários estão em UTC, qualquer fuso horário incluído é ignorado.\n:* Data e hora ISO 8601, 2001-01-15T14:56:00Z (pontuação e Z são opcionais)\n:* ISO 8601 data e hora com segundos fracionados (ignorados), 2001-01-15T14:56:00.00001Z (traços, dois pontos e Z são opcionais)\n:* Formato MediaWiki, 20010115145600\n:* Formato numérico genérico, 2001-01-15 14:56:00 (fuso horário opcional de GMT, +## ou -## é ignorado)\n:* Formato EXIF, 2001:01:15 14:56:00\n:* Formato RFC 2822 (o fuso horário pode ser omitido), Mon, 15 Jan 2001 14:56:00\n:* Formato RFC 850 (fuso horário Pode ser omitido), Monday, 15-Jan-2001 14:56:00\n:* C ctime format, Mon Jan 15 14:56:00 2001\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo 0)\n:* A string now\n; valor múltiplo alternativo separador\n: Os parâmetros que levam vários valores são normalmente enviados com os valores separados usando o caractere do pipe, por exemplo param=value1|value2 ou param=value1%7Cvalue2. Se um valor deve conter o caractere de pipe, use U+001F (separador de unidade) como o separador ''and'' prefixa o valor com U+001F, por exemplo, param=%1Fvalue1%1Fvalue2.", + "api-help-param-type-limit": "Tipo: inteiro ou max", + "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=inteiro|2=lista de inteiros}}", + "api-help-param-type-boolean": "Tipo: boleano ([[Special:ApiHelp/main#main/datatypes|details]])", + "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=timestamp|2=lista de timestamps}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])", + "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de usuário|2=lista de nomes de usuários}}", + "api-help-param-list": "{{PLURAL:$1|1=Um dos seguintes valores|2=Valores (separados com {{!}} ou [[Special:ApiHelp/main#main/datatypes|alternativos]])}}: $2", + "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Deve estar vazio|Pode estar vazio, ou $2}}", + "api-help-param-limit": "Não mais do que $1 permitido.", + "api-help-param-limit2": "Não são permitidos mais de $1 ($2 por bots).", + "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 deve ser maior que|2=Os valores devem ser maiores que}} $3.", + "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor deve estar entre|2=Os valores devem estar entre}} $2 e $3.", + "api-help-param-upload": "Deve ser postado como um upload de arquivo usando multipart/form-data.", + "api-help-param-multi-separate": "Valores separados com | 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 bots).", + "api-help-param-multi-all": "Para especificar todos os valores, use $1.", + "api-help-param-default": "Padrão: $1", + "api-help-param-default-empty": "Padrão: (vazio)", + "api-help-param-token": "Um token \"$1\" token recuperado de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", + "api-help-param-token-webui": "Para compatibilidade, o token usado na interface web também é aceito.", + "api-help-param-disabled-in-miser-mode": "Desabilitado devido a [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].", + "api-help-param-limited-in-miser-mode": "Nota: Devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], usar isso pode resultar em menos de $1limit resultados antes de continuar; em casos extremos, nenhum resultado pode ser retornado.", + "api-help-param-direction": "Em qual direção enumerar:\n;newer: Lista primeiro mais antigo. Nota: $1start deve ser anterior a $1end.\n;older: Lista mais recente primeiro (padrão). Nota: $1start deve ser posterior a $1end.", + "api-help-param-continue": "Quando houver mais resultados disponíveis, use isso para continuar.", + "api-help-param-no-description": "(sem descrição)", + "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:", + "api-help-permissions": "{{PLURAL:$1|Permissão|Permissões}}:", + "api-help-permissions-granted-to": "{{PLURAL:$1|Concedido a|Concedidos a}}: $2", + "api-help-right-apihighlimits": "Use limites mais altos nas consultas da API (consultas lentas: $1; consultas rápidas: $2). Os limites para consultas lentas também se aplicam a parâmetros multivalores.", + "api-help-open-in-apisandbox": "[abrir na página de testes]", + "api-help-authmanager-general-usage": "O procedimento geral para usar este módulo é:\n# Procure os campos disponíveis de [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] com amirequestsfor=$4 e um token $5 de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Apresentar os campos para o usuário e obtenha a sua submissão.\n# Poste em este módulo, fornecendo $1returnurl e quaisquer campos relevantes.\n# Verifique o status na resposta.\n#* Se você recebeu PASS ou FAIL, você terminou. A operação foi bem sucedida ou não.\n#* Se você recebeu UI, apresente os novos campos ao usuário e obtenha seu envio. Em seguida, publique neste módulo com $1continue e os campos relevantes sejam definidos e repita a etapa 4.\n#* Se você recebeu REDIRECT, direcione o usuário para o redirecttarget e aguarde o retorno para $1returnurl. Em seguida, publique neste módulo com $1continue e quaisquer campos passados para o URL de retorno e repita a etapa 4.\n#* Se você recebeu RESTART, isso significa que a autenticação funcionou mas não temos uma conta de usuário vinculada. Você pode tratar isso como UI ou como FAIL.", + "api-help-authmanagerhelper-requests": "Utilize apenas estes pedidos de autenticação, pelo id retornado de [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] com amirequestsfor=$1 ou de uma resposta anterior deste módulo.", + "api-help-authmanagerhelper-request": "Use este pedido de autenticação, pelo id retornado de [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] com amirequestsfor=$1.", + "api-help-authmanagerhelper-messageformat": "Formato a ser usado para retornar mensagens.", + "api-help-authmanagerhelper-mergerequestfields": "Fundir informações de campo para todos os pedidos de autenticação em uma matriz.", + "api-help-authmanagerhelper-preservestate": "Preserva o estado de uma tentativa de login anterior com falha, se possível.", + "api-help-authmanagerhelper-returnurl": "O URL de retorno para fluxos de autenticação de terceiros deve ser absoluto. Isso ou $1continue é necessário.\n\nQuando receber uma resposta REDIRECT, você normalmente abrirá um navegador ou uma visão da web para o redirecttarget URL para um fluxo de autenticação de terceiros. Quando isso for concluído, o terceiro enviará ao navegador ou a web para este URL. Você deve extrair qualquer consulta ou parâmetros POST do URL e passá-los como uma solicitação $1continue para este módulo de API.", + "api-help-authmanagerhelper-continue": "Esse pedido é uma continuação após uma resposta UI ou REDIRECT anterior. Ou $1returnurl é requerido.", + "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais dependendo dos pedidos de autenticação disponíveis. Use [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] com amirequestsfor=$1 (ou uma resposta anterior deste módulo, se aplicável) para determinar as solicitações disponíveis e os campos que eles usam.", + "apierror-allimages-redirect": "Use gapfilterredir=nonredirects em vez de redirects ao usar allimages como um gerador.", + "apierror-allpages-generator-redirects": "Use gapfilterredir=nonredirects em vez de redirects ao usar allpages como um gerador.", + "apierror-appendnotsupported": "Não é possível anexar páginas usando o modelo de conteúdo $1.", + "apierror-articleexists": "O artigo que você tentou criar já foi criado.", + "apierror-assertbotfailed": "Afirmação de que o usuário tem o direito bot falhou.", + "apierror-assertnameduserfailed": "Afirmação de que o usuário é \"$1\" falhou.", + "apierror-assertuserfailed": "Afirmação de que o usuário está logado falhou.", + "apierror-autoblocked": "O seu endereço de IP foi bloqueado automaticamente, porque ele foi usado por um usuário bloqueado.", + "apierror-badconfig-resulttoosmall": "O valor de $wgAPIMaxResultSize nesta wiki é muito pequeno para manter a informação básica de resultados.", + "apierror-badcontinue": "Parâmetro continue inválido. Você deve passar o valor original retornado pela consulta anterior.", + "apierror-baddiff": "O diff não pode ser recuperado. Uma ou ambas as revisões não existem ou você não tem permissão para visualizá-las.", + "apierror-baddiffto": "$1diffto deve ser configurado para um número não negativo, prev, next ou cur.", + "apierror-badformat-generic": "O formato solicitado $1 não é suportado para o modelo de conteúdo $2.", + "apierror-badformat": "O formato solicitado $1 não é suportado para o modelo de conteúdo $2 usado por $3.", + "apierror-badgenerator-notgenerator": "O módulo $1 não pode ser usado como um gerador.", + "apierror-badgenerator-unknown": "generator=$1 desconhecido.", + "apierror-badip": "O parâmetro IP não é válido.", + "apierror-badmd5": "O hash MD5 fornecido estava incorreto.", + "apierror-badmodule-badsubmodule": "O módulo $1 não possui um submódulo \"$2\".", + "apierror-badmodule-nosubmodules": "O módulo $1 não tem submódulos.", + "apierror-badparameter": "Valor inválido para o parâmetro $1.", + "apierror-badquery": "Consulta inválida.", + "apierror-badtimestamp": "Valor \"$2\" inválido para o parâmetro timestamp $1.", + "apierror-badtoken": "Token de CSRF inválido.", + "apierror-badupload": "O parâmetro de upload do arquivo $1 não é um upload de arquivo; Certifique-se de usar multipart/form-data para o seu POST e incluir um nome de arquivo no cabeçalho Content-Disposition.", + "apierror-badurl": "Valor \"$2\" não é válido para o parâmetro $1 da URL.", + "apierror-baduser": "Valor \"$2\" inválido para o parâmetro de usuário $1.", + "apierror-badvalue-notmultivalue": "U+001F separação de múltiplos valores só pode ser usada para parâmetros de vários valores.", + "apierror-bad-watchlist-token": "Foi fornecido um token da lista de páginas vigiadas incorreto. Defina um token correto em [[Special:Preferences]].", + "apierror-blockedfrommail": "Você foi bloqueado de enviar e-mail.", + "apierror-blocked": "Você foi bloqueado de editar.", + "apierror-botsnotsupported": "Esta interface não é suportada por bots.", + "apierror-cannot-async-upload-file": "Os parâmetros async e file não podem ser combinados. Se você deseja o processamento assíncrono do seu arquivo carregado, primeiro faça o upload para armazenar (usando o parâmetro stash) e depois publique o arquivo armazenado de forma assíncrona (usando filekey e async).", + "apierror-cannotreauthenticate": "Esta ação não está disponível porque sua identidade não pode ser verificada.", + "apierror-cannotviewtitle": "Você não tem permissão para ver $1.", + "apierror-cantblock-email": "Você não tem permissão para impedir que os usuários enviem e-mails através da wiki.", + "apierror-cantblock": "Você não tem permissão para bloquear usuários.", + "apierror-cantchangecontentmodel": "Você não tem permissão para mudar o modelo de conteúdo de uma página.", + "apierror-canthide": "Você não tem permissão para ocultar nomes de usuários do registro de bloqueios.", + "apierror-cantimport-upload": "Você não tem permissão para importar páginas enviadas.", + "apierror-cantimport": "Você não tem permissão para importar páginas.", + "apierror-cantoverwrite-sharedfile": "O arquivo de destino existe em um repositório compartilhado e você não tem permissão para substituí-lo.", + "apierror-cantsend": "Você não está logado, não possui um endereço de e-mail confirmado ou não tem permissão para enviar e-mails para outros usuários, por isso não pode enviar e-mails.", + "apierror-cantundelete": "Não foi possível recuperar arquivos: as revisões solicitadas podem não existir ou talvez já tenham sido eliminadas.", + "apierror-changeauth-norequest": "Falha ao criar pedido de mudança.", + "apierror-chunk-too-small": "O tamanho mínimo do bloco é $1 {{PLURAL:$1|byte|bytes}} para os pedaços não finais.", + "apierror-cidrtoobroad": "Os intervalos CIDR $1 maiores que /$2 não são aceitos.", + "apierror-compare-no-title": "Não é possível pré-salvar a transformação sem um título. Tente especificar fromtitle ou totitle.", + "apierror-compare-relative-to-nothing": "Nenhuma revisão 'from' para torelative para ser relativa à.", + "apierror-contentserializationexception": "Falha na serialização de conteúdo: $1", + "apierror-contenttoobig": "O conteúdo fornecido excede o limite de tamanho do artigo de $1 {{PLURAL: $1|kilobyte|kilobytes}}.", + "apierror-copyuploadbaddomain": "Os uploads por URL não são permitidos deste domínio.", + "apierror-copyuploadbadurl": "Envio não permitido a partir deste URL.", + "apierror-create-titleexists": "Os títulos existentes não podem ser protegidos com create.", + "apierror-csp-report": "Erro ao processar o relatório CSP: $1.", + "apierror-databaseerror": "[$1] Houve um erro na consulta ao banco de dados.", + "apierror-deletedrevs-param-not-1-2": "O parâmetro $1 não pode ser usado nos modos 1 ou 2.", + "apierror-deletedrevs-param-not-3": "O parâmetro $1 não pode ser usado no modo 3.", + "apierror-emptynewsection": "A criação de novas seções vazias não é possível.", + "apierror-emptypage": "Não é permitido criar páginas novas e vazias.", + "apierror-exceptioncaught": "[$1] Exceção detectada: $2", + "apierror-filedoesnotexist": "Arquivo não existe.", + "apierror-fileexists-sharedrepo-perm": "O arquivo de destino existe em um repositório compartilhado. Use o parâmetro ignorewarnings para substituí-lo.", + "apierror-filenopath": "Não é possível obter o caminho do arquivo local.", + "apierror-filetypecannotberotated": "O tipo de arquivo não pode ser girado.", + "apierror-formatphp": "Esta resposta não pode ser representada usando o formato format=php. Consulte https://phabricator.wikimedia.org/T68776.", + "apierror-imageusage-badtitle": "O título para $1 deve ser um arquivo.", + "apierror-import-unknownerror": "Erro desconhecido na importação: $1.", + "apierror-integeroutofrange-abovebotmax": "$1 não pode ser maior que $2 (definido para $3) para bots ou sysops.", + "apierror-integeroutofrange-abovemax": "$1 não pode ser maior que $2 (definido para $3) para usuários.", + "apierror-integeroutofrange-belowminimum": "$1 não pode ser menor que $2 (definido para $3).", + "apierror-invalidcategory": "O nome da categoria que você inseriu não é válido.", + "apierror-invalid-chunk": "O deslocamento mais o pedaço atual é maior que o tamanho do arquivo reivindicado.", + "apierror-invalidexpiry": "Tempo de expiração \"$1\" não válido.", + "apierror-invalid-file-key": "Não é uma chave de arquivo válida.", + "apierror-invalidlang": "Código de idioma inválido para o parâmetro $1.", + "apierror-invalidoldimage": "O parâmetro oldimage possui um formato inválido.", + "apierror-invalidparammix-cannotusewith": "O parâmetro $1 não pode ser usado com $2.", + "apierror-invalidparammix-mustusewith": "O parâmetro $1 só pode ser usado com $2.", + "apierror-invalidparammix-parse-new-section": "section=new não pode ser combinado com os parâmetros oldid, pageid ou page. Por favor, use title e text.", + "apierror-invalidparammix": "{{PLURAL:$2|Os parâmetros }} $1 não podem ser usado em conjunto.", + "apierror-invalidsection": "O parâmetro section deve ser um ID de seção válida ou new.", + "apierror-invalidsha1base36hash": "O hash SHA1Base36 fornecido não é válido.", + "apierror-invalidsha1hash": "O hash SHA1 informado não é válido.", + "apierror-invalidtitle": "Título incorreto \"$1\".", + "apierror-invalidurlparam": "Valor inválido para $1urlparam ($2=$3).", + "apierror-invaliduser": "Nome de usuário \"$1\" é inválido.", + "apierror-invaliduserid": "O ID de usuário $1 não é permitido.", + "apierror-maxlag-generic": "Aguardando um servidor de banco de dados: $1 {{PLURAL:$1|segundo|segundos}} atraso.", + "apierror-maxlag": "Esperando $2: $1 {{PLURAL: $1|segundo|segundos}} atrasado.", + "apierror-mimesearchdisabled": "A pesquisa MIME está desativada no Miser Mode.", + "apierror-missingcontent-pageid": "Falta conteúdo para a ID da página $1.", + "apierror-missingcontent-revid": "Falta conteúdo para a ID de revisão $1.", + "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|O parâmetro|Ao menos um dos parâmetros}} $1 é necessário.", + "apierror-missingparam-one-of": "{{PLURAL:$2|O parâmetro|Um dos parâmetros}} $1 é necessário.", + "apierror-missingparam": "O parâmetro $1 precisa ser definido.", + "apierror-missingrev-pageid": "Nenhuma revisão atual da página com ID $1.", + "apierror-missingrev-title": "Nenhuma revisão atual do título $1.", + "apierror-missingtitle-createonly": "Os títulos em falta só podem ser protegidos com create.", + "apierror-missingtitle": "A página que você especificou não existe.", + "apierror-missingtitle-byname": "A página $1 não existe.", + "apierror-moduledisabled": "O módulo $1 foi desativado.", + "apierror-multival-only-one-of": "{{PLURAL:$3|Somente|Somente um de}} $2 é permitido para parâmetro $1.", + "apierror-multival-only-one": "Apenas um valor é permitido para o parâmetro $1.", + "apierror-multpages": "$1 só pode ser usada com uma única página.", + "apierror-mustbeloggedin-changeauth": "Você precisa estar autenticado para alterar dados de autenticação.", + "apierror-mustbeloggedin-generic": "Você deve estar logado.", + "apierror-mustbeloggedin-linkaccounts": "Você precisa estar autenticado para vincular contas.", + "apierror-mustbeloggedin-removeauth": "Você precisa estar autenticado para remover dados de autenticação.", + "apierror-mustbeloggedin-uploadstash": "O upload do stash só está disponível para usuários registrados.", + "apierror-mustbeloggedin": "Você precisa estar logado para $1.", + "apierror-mustbeposted": "O módulo $1 requer uma solicitação POST.", + "apierror-mustpostparams": "{{PLURAL:$2|O seguinte parâmetro foi encontrado|Os seguintes parâmetros foram encontrados}} na string de consulta, mas deve estar no corpo POST: $1.", + "apierror-noapiwrite": "A edição deste wiki através da API está desabilitada. Certifique-se de que a declaração $wgEnableWriteAPI=true; está incluída no arquivo LocalSettings.php.", + "apierror-nochanges": "Nenhuma alteração foi solicitada.", + "apierror-nodeleteablefile": "Nenhuma versão antiga do arquivo.", + "apierror-no-direct-editing": "A edição direta via API não é suportada para o modelo de conteúdo $1 usado por $2.", + "apierror-noedit-anon": "Os usuários anônimos não podem editar páginas.", + "apierror-noedit": "Você não tem permissão para editar páginas.", + "apierror-noimageredirect-anon": "Os usuários anônimos não podem criar redirecionamentos de imagem.", + "apierror-noimageredirect": "Você não tem permissão para criar redirecionamentos de imagens.", + "apierror-nosuchlogid": "Não há entrada de log com ID $1.", + "apierror-nosuchpageid": "Não há página com ID $1.", + "apierror-nosuchrcid": "Não há mudança recente com ID $1.", + "apierror-nosuchrevid": "Não há revisão com ID $1.", + "apierror-nosuchsection": "Não há seção $1.", + "apierror-nosuchsection-what": "Não há seção $1 em $2.", + "apierror-nosuchuserid": "Não há usuário com ID $1.", + "apierror-notarget": "Você não especificou um alvo válido para esta ação.", + "apierror-notpatrollable": "A revisão r$1 não pode ser patrulhada, já que é muito antiga.", + "apierror-nouploadmodule": "Módulo de upload não definido.", + "apierror-offline": "Não foi possível prosseguir devido a problemas de conectividade de rede. Certifique-se de ter uma conexão à internet e tente novamente.", + "apierror-opensearch-json-warnings": "Os avisos não podem ser representados no formato JSON do OpenSearch.", + "apierror-pagecannotexist": "O espaço nominal não permite as páginas atuais.", + "apierror-pagedeleted": "A página foi excluída desde que você obteve seu timestamp.", + "apierror-pagelang-disabled": "Mudar o idioma de uma página não é permitido nesta wiki.", + "apierror-paramempty": "O parâmetro $1 pode não estar vazio.", + "apierror-parsetree-notwikitext": "prop=parsetree só é suportado por conteúdo wikitext.", + "apierror-parsetree-notwikitext-title": "prop=parsetree só é suportado por conteúdo texto wiki, $1 usa conteúdo do modelo $2.", + "apierror-pastexpiry": "Tempo de expiração \"$1\" está no passado.", + "apierror-permissiondenied": "Você não tem permissão para $1.", + "apierror-permissiondenied-generic": "Permissão negada.", + "apierror-permissiondenied-patrolflag": "Você precisa do direito patrol ou patrolmarks para requisitar a etiqueta \"patrulhado\".", + "apierror-permissiondenied-unblock": "Você não tem permissão para desbloquear usuários.", + "apierror-prefixsearchdisabled": "A pesquisa de prefixos está desativada no Miser Mode.", + "apierror-promised-nonwrite-api": "O cabeçalho HTTP Promise-Non-Write-API-Action não pode ser enviado para módulos de API em modo de gravação.", + "apierror-protect-invalidaction": "Tipo de proteção \"$1\" inválida.", + "apierror-protect-invalidlevel": "Nível de proteção inválido \"$1\".", + "apierror-ratelimited": "Você excedeu o limite. Por favor, aguarde algum tempo e tente novamente.", + "apierror-readapidenied": "Você precisa da permissão de leitura para usar este módulo.", + "apierror-readonly": "Esta wiki está atualmente em modo somente leitura.", + "apierror-reauthenticate": "Você não se autenticou recentemente nesta sessão, por favor, se autentique.", + "apierror-redirect-appendonly": "Você tentou editar usando o modo de redirecionamento, que deve ser usado em conjunto com section=new, prependtext ou appendtext.", + "apierror-revdel-mutuallyexclusive": "O mesmo campo não pode ser usado em ambos hide e show.", + "apierror-revdel-needtarget": "Um título de destino é necessário para este tipo RevDel.", + "apierror-revdel-paramneeded": "Pelo menos um valor é necessário para hide e/ou show.", + "apierror-revisions-badid": "Nenhuma revisão foi encontrada para o parâmetro $1.", + "apierror-revisions-norevids": "O parâmetro revids não pode ser usado com as opções da lista ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end).", + "apierror-revisions-singlepage": "titles, pageids ou um gerador foi usado para fornecer várias páginas, mas os parâmetros $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end só podem ser usados em uma única página.", + "apierror-revwrongpage": "r$1 não é uma revisão de $2.", + "apierror-searchdisabled": "$1 pesquisa está desativada.", + "apierror-sectionreplacefailed": "Não foi possível mesclar a seção atualizada.", + "apierror-sectionsnotsupported": "As seções não são suportadas para o modelo de conteúdo $1.", + "apierror-sectionsnotsupported-what": "As seções não são suportadas por $1.", + "apierror-show": "Parâmetro incorreto - valores mutuamente exclusivos podem não ser fornecidos.", + "apierror-siteinfo-includealldenied": "Não é possível visualizar a informação de todos os servidores, a menos que $wgShowHostNames seja true.", + "apierror-sizediffdisabled": "A diferença de tamanho está desativada no Miser Mode.", + "apierror-spamdetected": "Sua edição foi bloqueada porque contem um fragmento de spam: $1.", + "apierror-specialpage-cantexecute": "Você não tem permissão para ver os resultados desta página especial.", + "apierror-stashedfilenotfound": "Não foi possível encontrar o arquivo no stash: $1.", + "apierror-stashedit-missingtext": "Nenhum texto stashed foi encontrado com o hash informado.", + "apierror-stashfailed-complete": "O carregamento fragmentado já está concluído, verifique o status para obter detalhes.", + "apierror-stashfailed-nosession": "Nenhuma sessão de upload fragmentada com esta chave.", + "apierror-stashfilestorage": "Não foi possível armazenar o upload no stash: $1", + "apierror-stashinvalidfile": "Arquivo stashed inválido.", + "apierror-stashnosuchfilekey": "Nenhuma dessas chaves de arquivo: $1.", + "apierror-stashpathinvalid": "Chave de arquivo de formato impróprio ou inválido: $1.", + "apierror-stashwrongowner": "Dono incorreto: $1", + "apierror-stashzerolength": "O arquivo é de comprimento zero e não pode ser armazenado no stash: $1.", + "apierror-systemblocked": "Você foi bloqueado automaticamente pelo MediaWiki.", + "apierror-templateexpansion-notwikitext": "A expansão da predefinição só é suportada pelo conteúdo do texto wiki. $1 usa o modelo de conteúdo $2.", + "apierror-timeout": "O servidor não respondeu dentro do tempo esperado.", + "apierror-toofewexpiries": "{{PLURAL:$1|Foi fornecida $1 data e hora|Foram fornecidas $1 datas e horas}} de expiração quando {{PLURAL:$2|era necessária|eram necessárias}} $2.", + "apierror-unknownaction": "A ação especificada, $1, não é reconhecida.", + "apierror-unknownerror-editpage": "Erro EditPage desconhecido: $1.", + "apierror-unknownerror-nocode": "Erro desconhecido.", + "apierror-unknownerror": "Erro desconhecido: \"$1\".", + "apierror-unknownformat": "Formato desconhecido \"$1\".", + "apierror-unrecognizedparams": "{{PLURAL: $2|Parâmetro não reconhecido|Parâmetros não reconhecidos}}: $1.", + "apierror-unrecognizedvalue": "Valor não reconhecido para o parâmetro $1: $2.", + "apierror-unsupportedrepo": "O repositório de arquivos locais não suporta a consulta de todas as imagens.", + "apierror-upload-filekeyneeded": "Deve fornecer uma filekey quando offset for diferente de zero.", + "apierror-upload-filekeynotallowed": "Não é possível fornecer uma filekey quando offset é 0.", + "apierror-upload-inprogress": "Carregar do stash já em andamento.", + "apierror-upload-missingresult": "Nenhum resultado em dados de status.", + "apierror-urlparamnormal": "Não foi possível normalizar parâmetros de imagem para $1.", + "apierror-writeapidenied": "Você não está autorizado a editar esta wiki através da API.", + "apiwarn-alldeletedrevisions-performance": "Para um melhor desempenho ao gerar títulos, defina $1dir=newer.", + "apiwarn-badurlparam": "Não foi possível analisar $1urlparam por $2. Usando apenas largura e altura.", + "apiwarn-badutf8": "O valor passado para $1 contém dados inválidos ou não normalizados. Os dados textuais devem ser válidos, NFC-normalizado Unicode sem caracteres de controle C0 diferentes de HT (\\t), LF (\\n) e CR (\\r).", + "apiwarn-checktoken-percentencoding": "Verificar se os símbolos, como \"+\" no token, estão codificados corretamente na URL.", + "apiwarn-compare-nocontentmodel": "Nenhum modelo de conteúdo pode ser determinado, assumindo $1.", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs foi depreciado. Por favor, use prop=deletedrevisions ou list=alldeletedrevisions em vez.", + "apiwarn-deprecation-expandtemplates-prop": "Como nenhum valor foi especificado para o parâmetro prop, um formato herdado foi usado para a saída. Este formato está obsoleto e no futuro um valor padrão será definido para o parâmetro prop, fazendo com que o novo formato sempre seja usado.", + "apiwarn-deprecation-httpsexpected": "HTTP usado quando o HTTPS era esperado.", + "apiwarn-deprecation-login-botpw": "O login da conta principal via action=login está obsoleto e pode parar de funcionar sem aviso prévio. Para continuar com o login com action=login, consulte [[Special:BotPasswords]]. Para continuar com segurança usando o login da conta principal, veja action=clientlogin.", + "apiwarn-deprecation-login-nobotpw": "O login da conta principal via action=login está obsoleto e pode parar de funcionar sem aviso prévio. Para fazer login com segurança, veja action=clientlogin.", + "apiwarn-deprecation-login-token": "Obter um token via action=login está obsoleto. Use action=query&meta=tokens&type=login em vez.", + "apiwarn-deprecation-parameter": "O parâmetro $1 é obsoleto.", + "apiwarn-deprecation-parse-headitems": "prop=headitems está depreciado desde o MediaWiki 1.28. Use prop=headhtml quando for criar novos documentos HTML, ou prop=modules|jsconfigvars quando for atualizar um documento no lado do cliente.", + "apiwarn-deprecation-purge-get": "O uso de action=purge via GET está obsoleto. Use o POST em vez disso.", + "apiwarn-deprecation-withreplacement": "$1 está obsoleto. Por favor, use $2 em vez.", + "apiwarn-difftohidden": "Não foi possível diferenciar r$1: o conteúdo está oculto.", + "apiwarn-errorprinterfailed": "Falha na impressora de erro. Repetirá sem parâmetros.", + "apiwarn-errorprinterfailed-ex": "Falha na impressora de erro (repetirá sem parâmetros): $1", + "apiwarn-invalidcategory": "\"$1\" não é uma categoria.", + "apiwarn-invalidtitle": "\"$1\" não é um título válido.", + "apiwarn-invalidxmlstylesheetext": "Stylesheet deve ter extensão .xsl.", + "apiwarn-invalidxmlstylesheet": "Especificada folha de estilos inválida ou inexistente.", + "apiwarn-invalidxmlstylesheetns": "Stylesheet deve estar no espaço nominal {{ns:MediaWiki}}.", + "apiwarn-moduleswithoutvars": "A propriedade modules foi definida, mas não jsconfigvars ou encodedjsconfigvars. As variáveis de configuração são necessárias para o uso adequado do módulo.", + "apiwarn-notfile": "\"$1\" não é um arquivo.", + "apiwarn-nothumb-noimagehandler": "Não foi possível criar uma miniatura porque $1 não possui um manipulador de imagem associado.", + "apiwarn-parse-nocontentmodel": "Não foi dado title ou contentmodel, assumindo $1.", + "apiwarn-parse-titlewithouttext": "title usado sem text, e as propriedades da página analisada foram solicitadas. Você quis usar page ao invés de title?", + "apiwarn-redirectsandrevids": "A resolução de redirecionamento não pode ser usada em conjunto com o parâmetro revids. Qualquer redirecionamento revids apontando para não foi resolvido.", + "apiwarn-tokennotallowed": "A ação \"$1\" não é permitida para o usuário atual.", + "apiwarn-tokens-origin": "Os tokens não podem ser obtidos quando a política de origem não é aplicada.", + "apiwarn-toomanyvalues": "Muitos valores são fornecidos para o parâmetro $1. O limite é de $2.", + "apiwarn-truncatedresult": "Esse resultado foi truncado porque, de outra forma, seria maior do que o limite de $1 bytes.", + "apiwarn-unclearnowtimestamp": "Passar \"$2\" para o parâmetro timestamp $1 está obsoleto. Se, por algum motivo, você precisa especificar explicitamente o tempo atual sem calcular o lado do cliente, use now.", + "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor não reconhecido para o parâmetro|Valores não reconhecidos para o parâmetro}} $1: $2.", + "apiwarn-unsupportedarray": "Parâmetro $1 usa sintaxe de array PHP não suportada.", + "apiwarn-urlparamwidth": "Ignorando o valor de largura definido em $1urlparam ($2) em favor do valor da largura derivado de $1urlwidth/$1urlheight ($3).", + "apiwarn-validationfailed-badchars": "caracteres inválidos na chave (apenas a-z, A-Z, 0-9, _ e - é permitido).", + "apiwarn-validationfailed-badpref": "não é uma preferência válida.", + "apiwarn-validationfailed-cannotset": "não pode ser configurado por este módulo.", + "apiwarn-validationfailed-keytoolong": "chave muito longa (não é permitido mais de $1 bytes).", + "apiwarn-validationfailed": "Erro de validação para $1: $2", + "apiwarn-wgDebugAPI": "Aviso de Segurança: $wgDebugAPI está ativado.", + "api-feed-error-title": "Erro ($1)", + "api-usage-docref": "Veja $1 para uso da API.", + "api-usage-mailinglist-ref": "Inscreva-se na lista de discussão mediawiki-api-announce em <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> Para aviso de depreciações de API e alterações.", + "api-exception-trace": "$1 em $2($3)\n$4", + "api-credits-header": "Créditos", + "api-credits": "Desenvolvedores da API:\n* Yuri Astrakhan (criador, desenvolvedor-chefe Set 2006–Set 2007)\n* Roan Kattouw (desenvolvedor-chefe Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (desenvolvedor-chefe 2013–presente)\n\nPor favor, envie seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org\nou apresente um relatório de erro em https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json index cb5997b25f..775cd15ca9 100644 --- a/includes/api/i18n/pt.json +++ b/includes/api/i18n/pt.json @@ -6,13 +6,14 @@ "Macofe", "Jkb8", "Hamilton Abreu", - "Mansil" + "Mansil", + "Felipe L. Ewald" ] }, - "apihelp-main-description": "
    \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
    \nEstado: 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\nPedidos incorretos: 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\nTestes: Para testar facilmente pedidos à API, visite [[Special:ApiSandbox|Testes da API]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Documentação]]\n* [[mw:Special:MyLanguage/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
    \nEstado: 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\nPedidos incorretos: 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:Special:MyLanguage/API:Errors_and_warnings|API:Erros e avisos]].\n\nTestes: 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 ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', 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 maxlag é devolvido com uma mensagem como À espera do servidor $host: $lag segundos de atraso.
    Consulte [[mw:Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.", + "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', 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 maxlag é devolvido com uma mensagem como À espera do servidor $host: $lag segundos de atraso.
    Consulte [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.", "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP s-maxage de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.", "apihelp-main-param-maxage": "Definir no cabeçalho HTTP max-age de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.", "apihelp-main-param-assert": "Se definido com o valor user, verificar que o utilizador está autenticado. Se definido com o valor bot, verificar que o utilizador tem o privilégio de conta robô.", @@ -26,7 +27,7 @@ "apihelp-main-param-errorformat": "O formato a ser usado no texto de avisos e erros.\n; plaintext: Texto wiki com os elementos HTML removidos e as entidades substituídas.\n; wikitext: Texto wiki sem análise sintática.\n; html: HTML.\n; raw: Chave e parâmetros da mensagem.\n; none: Sem saída de texto, só os códigos de erro.\n; bc: Formato usado antes do MediaWiki 1.29. errorlang e errorsuselocal são ignorados.", "apihelp-main-param-errorlang": "A língua a ser usada para avisos e erros. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] com siprop=languages devolve uma lista de códigos de língua, ou especifique content para usar a língua de conteúdo desta wiki, ou especifique uselang para usar o mesmo valor que o parâmetro uselang.", "apihelp-main-param-errorsuselocal": "Se fornecido, os textos de erro utilizarão mensagens personalizadas localmente do espaço nominal {{ns:MediaWiki}}.", - "apihelp-block-description": "Bloquear um utilizador.", + "apihelp-block-summary": "Bloquear um utilizador.", "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados. Não pode ser usado em conjunto com $1userid", "apihelp-block-param-userid": "O identificador do utilizador a ser bloqueado. Não pode ser usado em conjunto com $1user.", "apihelp-block-param-expiry": "O período de expiração. Pode ser relativo (p. ex. 5 meses ou 2 semanas) ou absoluto (p. ex. 2014-09-18T12:34:56Z). Se definido como infinite, indefinite ou never, o bloqueio nunca expirará.", @@ -36,33 +37,53 @@ "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 blockemail).", "apihelp-block-param-hidename": "Ocultar o nome do utilizador do registo de bloqueios. (Requer o privilégio hideuser).", - "apihelp-block-param-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Permitir que o utilizador edite a sua própria página de discussão (depende de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "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-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de bloqueios.", "apihelp-block-example-ip-simple": "Bloquear o endereço IP 192.0.2.5 por três dias com o motivo First strike.", "apihelp-block-example-user-complex": "Bloquear o utilizador Vandal indefinidamente com o motivo Vandalism, 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-summary": "Alterar os dados de autenticação do utilizador atual.", "apihelp-changeauthenticationdata-example-password": "Tentar alterar a palavra-passe do utilizador atual para ExamplePassword.", - "apihelp-checktoken-description": "Verificar a validade de uma chave a partir de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Verificar a validade de uma chave a partir de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "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 csrf.", - "apihelp-clearhasmsg-description": "Limpa a indicação hasmsg do utilizador atual.", + "apihelp-clearhasmsg-summary": "Limpa a indicação hasmsg do utilizador atual.", "apihelp-clearhasmsg-example-1": "Limpar a indicação hasmsg do utilizador atual.", - "apihelp-clientlogin-description": "Entrar na wiki usando o processo interativo.", + "apihelp-clientlogin-summary": "Entrar na wiki usando o processo interativo.", "apihelp-clientlogin-example-login": "Inicia o processo de entrada na wiki com o utilizador Example e a palavra-passe ExamplePassword.", "apihelp-clientlogin-example-login2": "Continuar o processo de autenticação após uma resposta UI para autenticação de dois fatores, fornecendo uma OATHToken de 987654.", - "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-summary": "Obter a diferença entre duas páginas.", + "apihelp-compare-extended-description": "Tem de ser passado um número de revisão, ou um título de página, ou um identificador de página, ou uma referência relativa para \"from\" e \"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-fromtext": "Usar este texto em vez do conteúdo da revisão especificada por fromtitle, fromid ou fromrev.", + "apihelp-compare-param-frompst": "Fazer uma transformação anterior à gravação, de fromtext.", + "apihelp-compare-param-fromcontentmodel": "Modelo de conteúdo de fromtext. Se não for fornecido, ele será deduzido a partir dos outros parâmetros.", + "apihelp-compare-param-fromcontentformat": "Formato de seriação do conteúdo de fromtext.", "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-param-torelative": "Usar uma revisão relativa à revisão determinada a partir de fromtitle, fromid ou fromrev. Todas as outras opções 'to' serão ignoradas.", + "apihelp-compare-param-totext": "Usar este texto em vez do conteúdo da revisão especificada por totitle, toid ou torev.", + "apihelp-compare-param-topst": "Fazer uma transformação anterior à gravação, de totext.", + "apihelp-compare-param-tocontentmodel": "Modelo de conteúdo de totext. Se não for fornecido, ele será deduzido a partir dos outros parâmetros.", + "apihelp-compare-param-tocontentformat": "Formato de seriação do conteúdo de totext.", + "apihelp-compare-param-prop": "As informações que devem ser obtidas.", + "apihelp-compare-paramvalue-prop-diff": "O HTML da lista de diferenças.", + "apihelp-compare-paramvalue-prop-diffsize": "O tamanho do HTML da lista de diferenças, em bytes.", + "apihelp-compare-paramvalue-prop-rel": "Os identificadores da revisão anterior a 'from' e da posterior a 'to', se existirem.", + "apihelp-compare-paramvalue-prop-ids": "Os identificadores de página e de revisão das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-title": "Os títulos de página das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-user": "O nome e o identificador de utilizador das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-comment": "O comentário das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-parsedcomment": "O comentário após análise sintática, das revisões 'from' e 'to'.", + "apihelp-compare-paramvalue-prop-size": "O tamanho das revisões 'from' e 'to'.", "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-summary": "Criar uma conta de utilizador nova.", "apihelp-createaccount-param-preservestate": "Se [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] devolveu o valor verdadeiro para hasprimarypreservedstate, pedidos marcados como primary-required devem ser omitidos. Se devolveu um valor não vazio em preservedusername, esse nome de utilizador tem de ser usado no parâmetro username.", "apihelp-createaccount-example-create": "Iniciar o processo de criação do utilizador Example com a palavra-passe ExamplePassword.", "apihelp-createaccount-param-name": "Nome de utilizador.", @@ -76,10 +97,10 @@ "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 testuser com a palavra-passe test123.", "apihelp-createaccount-example-mail": "Criar o utilizador testmailuser 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-summary": "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-summary": "Eliminar uma página.", "apihelp-delete-param-title": "Título da página a eliminar. Não pode ser usado em conjunto com $1pageid.", "apihelp-delete-param-pageid": "Identificador da página a eliminar. Não pode ser usado em conjunto com $1title.", "apihelp-delete-param-reason": "Motivo para a eliminação. Se não for definido, será usado um motivo gerado automaticamente.", @@ -90,8 +111,8 @@ "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 a página Main Page.", "apihelp-delete-example-reason": "Eliminar Main Page com o motivo Preparing for move.", - "apihelp-disabled-description": "Este módulo foi desativado.", - "apihelp-edit-description": "Criar e editar páginas.", + "apihelp-disabled-summary": "Este módulo foi desativado.", + "apihelp-edit-summary": "Criar e editar páginas.", "apihelp-edit-param-title": "Título da página a ser editada. Não pode ser usado em conjunto com $1pageid.", "apihelp-edit-param-pageid": "Identificador da página a ser editada. Não pode ser usado em conjunto com $1title.", "apihelp-edit-param-section": "Número da secção. 0 para a secção de topo, new para uma secção nova.", @@ -122,13 +143,13 @@ "apihelp-edit-example-edit": "Editar uma página.", "apihelp-edit-example-prepend": "Acrescentar __NOTOC__ 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-summary": "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.", "apihelp-emailuser-example-email": "Enviar uma mensagem de correio ao utilizador WikiSysop com o texto Content.", - "apihelp-expandtemplates-description": "Expande todas as predefinições incluídas num texto em notação wiki.", + "apihelp-expandtemplates-summary": "Expande todas as predefinições incluídas num texto em notação wiki.", "apihelp-expandtemplates-param-title": "Título da página.", "apihelp-expandtemplates-param-text": "Texto em notação wiki a converter.", "apihelp-expandtemplates-param-revid": "Identificador da revisão, para {{REVISIONID}} e variáveis semelhantes.", @@ -145,7 +166,7 @@ "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 {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Devolve um ''feed'' das contribuições do utilizador.", + "apihelp-feedcontributions-summary": "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.", @@ -158,7 +179,7 @@ "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.", "apihelp-feedcontributions-example-simple": "Devolver as contribuições do utilizador Example.", - "apihelp-feedrecentchanges-description": "Devolve um ''feed'' das mudanças recentes.", + "apihelp-feedrecentchanges-summary": "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.", @@ -177,21 +198,21 @@ "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.", "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-param-categories_any": "Mostrar apenas mudanças nas páginas que estão em qualquer uma das 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-summary": "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-summary": "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 Wiki.png para a revisão de 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Apresentar ajuda para os módulos especificados.", + "apihelp-help-summary": "Apresentar ajuda para os módulos especificados.", "apihelp-help-param-modules": "Módulos para os quais apresentar ajuda (valores dos parâmetros action e format, ou main). Pode-se especificar submódulos com um +.", "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.", @@ -203,12 +224,13 @@ "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-summary": "Rodar uma ou mais imagens.", "apihelp-imagerotate-param-rotation": "Graus de rotação da imagem no sentido horário.", "apihelp-imagerotate-param-tags": "Etiquetas a aplicar à entrada no registo de carregamentos.", "apihelp-imagerotate-example-simple": "Rodar File:Example.png 90 graus.", "apihelp-imagerotate-example-generator": "Rodar todas as imagens na categoria Category:Flip em 180 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 xml.", + "apihelp-import-summary": "Importar uma página de outra wiki ou de um ficheiro XML.", + "apihelp-import-extended-description": "Note que o pedido POST de HTTP tem de ser feito como um carregamento de ficheiro (isto é, usando \"multipart/form-data\") ao enviar um ficheiro para o parâmetro xml.", "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.", @@ -219,19 +241,20 @@ "apihelp-import-param-rootpage": "Importar como subpágina desta página. Não pode ser usado em conjunto com $1namespace.", "apihelp-import-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de importações e à revisão nula nas páginas importadas.", "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-summary": "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 Example.", - "apihelp-login-description": "Entrar e obter ''cookies'' 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 [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Entrar e obter ''cookies'' de autenticação.\n\nEsta operação é obsoleta e poderá falhar sem aviso. Para entrar de forma segura, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Iniciar uma sessão e obter cookies de autenticação.", + "apihelp-login-extended-description": "Esta 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 [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Esta operação foi descontinuada e poderá falhar sem aviso. Para entrar de forma segura, use [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Nome de utilizador.", "apihelp-login-param-password": "Palavra-passe.", "apihelp-login-param-domain": "Domínio (opcional).", "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-summary": "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 etiquetas de modificação.", + "apihelp-managetags-summary": "Executar tarefas de gestão relacionadas com etiquetas de modificação.", "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.", @@ -241,7 +264,7 @@ "apihelp-managetags-example-delete": "Eliminar a etiqueta vandlaism com o motivo Misspelt", "apihelp-managetags-example-activate": "Ativar uma etiqueta com o nome spam e o motivo For use in edit patrolling", "apihelp-managetags-example-deactivate": "Desativar uma etiqueta com o nome spam e o motivo No longer required", - "apihelp-mergehistory-description": "Fundir o historial de páginas.", + "apihelp-mergehistory-summary": "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 $1fromid.", "apihelp-mergehistory-param-fromid": "Identificador da página cujo historial será fundido. Não pode ser usado em conjunto com $1from.", "apihelp-mergehistory-param-to": "Título da página à qual o historial será fundido. Não pode ser usado em conjunto com $1toid.", @@ -250,7 +273,7 @@ "apihelp-mergehistory-param-reason": "Motivo para fundir o historial.", "apihelp-mergehistory-example-merge": "Fundir todo o historial da página Oldpage com o da página Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Fundir as revisões de Oldpage até à data e hora 2015-12-31T04:37:41Z com Newpage.", - "apihelp-move-description": "Mover uma página.", + "apihelp-move-summary": "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 $1fromid.", "apihelp-move-param-fromid": "Identificador da página cujo nome será alterado. Não pode ser usado em conjunto com $1from.", "apihelp-move-param-to": "Novo título da página.", @@ -264,16 +287,17 @@ "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.", "apihelp-move-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de movimentações e à revisão nula na página de destino.", "apihelp-move-example-move": "Mover Badtitle para Goodtitle sem deixar um redirecionamento.", - "apihelp-opensearch-description": "Pesquisar a wiki usando o protocolo OpenSearch.", + "apihelp-opensearch-summary": "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 [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] for falso.", + "apihelp-opensearch-param-suggest": "Não fazer nada se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] 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 format=json, devolver um erro da API em vez de ignorá-los.", "apihelp-opensearch-example-te": "Encontrar as páginas que começam por Te.", - "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 userjs- (que são supostas ser usadas por ''scripts'' de utilizador).", + "apihelp-options-summary": "Alterar as preferências do utilizador atual.", + "apihelp-options-extended-description": "Só 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 userjs- (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 $1reset 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 (|), use um [[Special:ApiHelp/main#main/datatypes|separador alternativo para valores múltiplos]] de forma a obter o comportamento correto.", @@ -282,7 +306,7 @@ "apihelp-options-example-reset": "Reiniciar todas as preferências.", "apihelp-options-example-change": "Alterar as preferências skin e hideminor.", "apihelp-options-example-complex": "Reiniciar todas as preferências e depois definir skin e nickname.", - "apihelp-paraminfo-description": "Obter informação sobre os módulos da API.", + "apihelp-paraminfo-summary": "Obter informação sobre os módulos da API.", "apihelp-paraminfo-param-modules": "Lista dos nomes dos módulos (valores dos parâmetros action e format, ou main). Podem ser especificados submódulos com +, ou todos os submódulos com +*, ou todos os submódulos de forma recursiva com +**.", "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 prop, meta ou list). Usar $1modules=query+foo em vez de $1querymodules=foo.", @@ -291,7 +315,8 @@ "apihelp-paraminfo-param-formatmodules": "Lista de nomes de módulos de formato (valor do parâmetro format). Em vez de usá-lo, use $1modules.", "apihelp-paraminfo-example-1": "Mostrar informação para [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] e [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Mostrar informação de todos os módulos de [[Special:ApiHelp/query|action=query]].", - "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 [[Special:ApiHelp/query|action=query]] 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 $1page, $1pageid ou $1oldid.\n# Especificar o conteúdo de forma explícita, usando $1text, $1title e $1contentmodel.\n# Especificar só um resumo a analisar. $1prop deve receber o valor vazio.", + "apihelp-parse-summary": "Faz a análise sintática do conteúdo e devolve o resultado da análise.", + "apihelp-parse-extended-description": "Consulte os vários módulos disponíveis no parâmetro prop de [[Special:ApiHelp/query|action=query]] 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 $1page, $1pageid ou $1oldid.\n# Especificar o conteúdo de forma explícita, usando $1text, $1title e $1contentmodel.\n# Especificar só um resumo a analisar. $1prop deve receber o valor vazio.", "apihelp-parse-param-title": "Título da página à qual o texto pertence. Se omitido, é preciso especificar $1contentmodel e deve usar [[API]] como título.", "apihelp-parse-param-text": "Texto a analisar. Usar $1title ou $1contentmodel para controlar o modelo de conteúdo.", "apihelp-parse-param-summary": "Resumo a analisar.", @@ -311,7 +336,7 @@ "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": "Obsoleto. Fornece os elementos a colocar no <head> da página.", + "apihelp-parse-paramvalue-prop-headitems": "Fornece os elementos a colocar no <head> da página.", "apihelp-parse-paramvalue-prop-headhtml": "Fornece o <head> analisado da página.", "apihelp-parse-paramvalue-prop-modules": "Fornece os módulos ResourceLoader usados na página. Para carregá-los, usar mw.loader.using(). Uma das variáveis jsconfigvars ou encodedjsconfigvars tem de ser pedida em conjunto com modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Fornece as variáveis de configuração JavaScript específicas da página. Para aplicá-las, usar mw.config.set().", @@ -323,8 +348,10 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório de limites de forma estruturada. Não fornece dados quando $1disablelimitreport está definido.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Fornece a versão HTML do relatório de limites. Não fornece dados quando $1disablelimitreport 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 $1).", - "apihelp-parse-param-pst": "Fazer uma transformação de pré-gravação ao texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.", - "apihelp-parse-param-onlypst": "Fazer uma transformação de pré-gravação (PST, ''pre-save transform'') ao texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com $1text.", + "apihelp-parse-paramvalue-prop-parsewarnings": "Fornece os avisos gerados durante a análise sintática do conteúdo.", + "apihelp-parse-param-wrapoutputclass": "A classe CSS a utilizar para envolver o resultado do analisador sintático.", + "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 $1text.", "apihelp-parse-param-effectivelanglinks": "Inclui links interlínguas fornecidos por extensões (para ser usado com $1prop=langlinks).", "apihelp-parse-param-section": "Analisar apenas o conteúdo desta secção.\n\nQuando tiver o valor new, analisar $1text e $1sectiontitle como se fosse adicionar uma nova secção à página.\n\nnew só é permitido quando se especifica text.", "apihelp-parse-param-sectiontitle": "O novo título da secção quando section tem o valor new.\n\nAo contrário da edição de páginas, este não toma o valor de summary se for omitido ou estiver vazio.", @@ -336,19 +363,20 @@ "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-useskin": "Aplicar o tema selecionado ao resultado do analisador sintático. Pode afetar as seguintes propriedades: langlinks, headitems, modules, jsconfigvars, indicators.", "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-summary": "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 no registo de edições patrulhadas.", "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-summary": "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 action=level (por exemplo, edit=sysop). O nível all significada que todos podem executar a operação, isto é, sem restrição.\n\nNota: Serão removidas as restrições de quaisquer operações não listadas.", @@ -361,12 +389,13 @@ "apihelp-protect-example-protect": "Proteger uma página.", "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição all (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 ''cache'' para os títulos especificados.", + "apihelp-purge-summary": "Limpar a ''cache'' para os títulos especificados.", "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 Main Page e API.", "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 que usar um pedido para adquirir uma chave, de forma a impedir ações abusivas de ''sites'' maliciosos.", + "apihelp-query-summary": "Obter dados de, e sobre, o MediaWiki.", + "apihelp-query-extended-description": "Todas as modificações de dados terão primeiro que usar uma consulta para adquirir uma chave, o que visa impedir abusos de sites 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.", @@ -377,7 +406,7 @@ "apihelp-query-param-rawcontinue": "Devolver os dados em bruto de query-continue 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 Main Page.", "apihelp-query-example-allpages": "Obter as revisões das páginas que começam por API/.", - "apihelp-query+allcategories-description": "Enumerar todas as categorias.", + "apihelp-query+allcategories-summary": "Enumerar todas as categorias.", "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.", @@ -390,7 +419,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Etiqueta as categorias ocultadas com __HIDDENCAT__.", "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 List.", - "apihelp-query+alldeletedrevisions-description": "Listar todas as revisões eliminadas por um utilizador ou de um espaço nominal.", + "apihelp-query+alldeletedrevisions-summary": "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 $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Não pode ser usado com $3user.", "apihelp-query+alldeletedrevisions-param-start": "A data e hora da revisão a partir da qual será começada a enumeração.", @@ -402,11 +431,11 @@ "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": "Nota: Devido ao [[mw:Manual:$wgMiserMode|modo avarento]], o uso de $1user e $1namespace em conjunto pode resultar na devolução de menos de $1limit resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]], o uso de $1user e $1namespace em conjunto pode resultar na devolução de menos de $1limit 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 Example.", "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-summary": "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.", @@ -420,7 +449,7 @@ "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-summary": "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.", @@ -440,7 +469,7 @@ "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 image/png ou image/gif.", "apihelp-query+allimages-example-generator": "Mostrar informação sobre 4 ficheiros, começando pela letra T.", - "apihelp-query+alllinks-description": "Enumerar todos os ''links'' que apontam para um determinado espaço nominal.", + "apihelp-query+alllinks-summary": "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.", @@ -455,7 +484,7 @@ "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-summary": "Devolver as mensagens deste ''site''.", "apihelp-query+allmessages-param-messages": "Mensagens a serem produzidas no resultado. * (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.).", @@ -471,7 +500,7 @@ "apihelp-query+allmessages-param-prefix": "Devolver as mensagens com este prefixo.", "apihelp-query+allmessages-example-ipb": "Mostrar mensagens que começam por ipb-.", "apihelp-query+allmessages-example-de": "Mostrar as mensagens august e mainpage em Alemão.", - "apihelp-query+allpages-description": "Enumerar sequencialmente todas as páginas de um determinado espaço nominal.", + "apihelp-query+allpages-summary": "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.", @@ -489,7 +518,7 @@ "apihelp-query+allpages-example-B": "Mostrar uma lista de páginas, começando na letra B.", "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas, começando na letra T.", "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 Re.", - "apihelp-query+allredirects-description": "Listar todos os redirecionamentos para um espaço nominal.", + "apihelp-query+allredirects-summary": "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.", @@ -506,7 +535,7 @@ "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-summary": "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.", @@ -515,13 +544,13 @@ "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 Example.", "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-summary": "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+mystashedfiles-example-simple": "Obter a chave, o tamanho e as dimensões em píxeis dos ficheiros na área de ficheiros escondidos do utilizador.", - "apihelp-query+alltransclusions-description": "Listar todas as transclusões (páginas incorporadas utilizando {{x}}), incluindo as que estejam em falta.", + "apihelp-query+alltransclusions-summary": "Listar todas as transclusões (páginas incorporadas utilizando {{x}}), incluindo as que estejam em falta.", "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.", @@ -536,7 +565,7 @@ "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-summary": "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.", @@ -557,13 +586,13 @@ "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 $1prop=centralids, indicar também se o utilizador tem ligação com a wiki designada por este identificador.", "apihelp-query+allusers-example-Y": "Listar utilizadores, começando pelo Y.", - "apihelp-query+authmanagerinfo-description": "Obter informação sobre o atual estado de autenticação.", + "apihelp-query+authmanagerinfo-summary": "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-login": "Obter os pedidos que podem ser usados ao iniciar uma sessão.", "apihelp-query+authmanagerinfo-example-login-merged": "Obter os pedidos que podem ser usados ao iniciar uma sessão, com os campos combinados.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Testar se a autenticação é suficiente para a operação foo.", - "apihelp-query+backlinks-description": "Encontrar todas as páginas que contêm ligações para a página indicada.", + "apihelp-query+backlinks-summary": "Encontrar todas as páginas que contêm ligações para a página indicada.", "apihelp-query+backlinks-param-title": "O título a ser procurado. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+backlinks-param-pageid": "O identificador do título a ser procurado. Não pode ser usado em conjunto com $1title.", "apihelp-query+backlinks-param-namespace": "O espaço nominal a ser enumerado.", @@ -573,7 +602,7 @@ "apihelp-query+backlinks-param-redirect": "Se a página que contém a ligação é um redirecionamento, procurar também todas as páginas que contêm ligações para esse redirecionamento. O limite máximo é reduzido para metade.", "apihelp-query+backlinks-example-simple": "Mostrar as ligações para Main page.", "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligações para Main page.", - "apihelp-query+blocks-description": "Listar todos os utilizadores e endereços IP bloqueados.", + "apihelp-query+blocks-summary": "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).", @@ -594,7 +623,7 @@ "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 $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Listar bloqueios.", "apihelp-query+blocks-example-users": "Listar os bloqueios dos utilizadores Alice e Bob.", - "apihelp-query+categories-description": "Listar todas as categorias às quais as páginas pertencem.", + "apihelp-query+categories-summary": "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-paramvalue-prop-timestamp": "Adiciona a data e hora a que a categoria foi adicionada.", @@ -605,9 +634,9 @@ "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 Albert Einstein.", "apihelp-query+categories-example-generator": "Obter informação sobre todas as categorias usadas na página Albert Einstein.", - "apihelp-query+categoryinfo-description": "Devolve informação sobre as categorias indicadas.", + "apihelp-query+categoryinfo-summary": "Devolve informação sobre as categorias indicadas.", "apihelp-query+categoryinfo-example-simple": "Obter informações sobre Category:Foo e Category:Bar.", - "apihelp-query+categorymembers-description": "Listar todas as páginas numa categoria específica.", + "apihelp-query+categorymembers-summary": "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 {{ns:category}}:. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+categorymembers-param-pageid": "Identificador da categoria a ser enumerada. Não pode ser usado em conjunto com $1title.", "apihelp-query+categorymembers-param-prop": "As informações que devem ser incluídas:", @@ -632,14 +661,15 @@ "apihelp-query+categorymembers-param-endsortkey": "Em vez dele, usar $1endhexsortkey.", "apihelp-query+categorymembers-example-simple": "Obter as primeiras 10 páginas na categoria Category:Physics.", "apihelp-query+categorymembers-example-generator": "Obter informações sobre as primeiras 10 páginas na categoria Category:Physics.", - "apihelp-query+contributors-description": "Obter a lista do contribuidores autenticados e a contagem dos contribuidores anónimos de uma página.", + "apihelp-query+contributors-summary": "Obter a lista do contribuidores autenticados e a contagem dos contribuidores anónimos de uma página.", "apihelp-query+contributors-param-group": "Incluir só os utilizadores nos grupos indicados. Não inclui os grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.", "apihelp-query+contributors-param-excludegroup": "Excluir os utilizadores nos grupos indicados. Não inclui os grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.", "apihelp-query+contributors-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+contributors-param-excluderights": "Excluir 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+contributors-param-limit": "O número de contribuidores a serem devolvidos.", "apihelp-query+contributors-example-simple": "Mostrar os contribuidores da página Main Page.", - "apihelp-query+deletedrevisions-description": "Obter informações sobre as revisões eliminadas.\n\nPode ser usado de várias maneiras:\n# Obter as revisões eliminadas para um conjunto de páginas, definindo títulos ou identificadores de página. Ordenados por título e data e hora.\n# Obter dados sobre um conjunto de revisões eliminadas definindo os respetivos ids: com identificadores de revisão. Ordenados pelo identificador de revisão.", + "apihelp-query+deletedrevisions-summary": "Obter informações sobre as revisões eliminadas.", + "apihelp-query+deletedrevisions-extended-description": "Pode ser usado de várias maneiras:\n# Obter as revisões eliminadas para um conjunto de páginas, definindo títulos ou identificadores de página. Ordenados por título e data e hora.\n# Obter dados sobre um conjunto de revisões eliminadas definindo os respetivos ids: com identificadores de revisão. Ordenados pelo identificador de revisão.", "apihelp-query+deletedrevisions-param-start": "A data e hora da revisão 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 da revisão 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.", @@ -647,7 +677,8 @@ "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 Main Page e Talk:Main Page, com o conteúdo.", "apihelp-query+deletedrevisions-example-revids": "Listar a informação da revisão eliminada 123456.", - "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-summary": "Listar as revisões eliminadas.", + "apihelp-query+deletedrevs-extended-description": "Opera 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 da revisão a partir da qual será começada a enumeração.", "apihelp-query+deletedrevs-param-end": "A data e hora da revisão na qual será terminada a enumeração.", @@ -665,14 +696,14 @@ "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribuições eliminadas do utilizador Bob (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+disabled-description": "Este módulo de consulta foi desativado.", - "apihelp-query+duplicatefiles-description": "Listar todos os ficheiros que são duplicados dos ficheiros indicados com base no seu resumo criptográfico.", + "apihelp-query+disabled-summary": "Este módulo de consulta foi desativado.", + "apihelp-query+duplicatefiles-summary": "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+duplicatefiles-param-localonly": "Procurar ficheiros só no repositório local.", "apihelp-query+duplicatefiles-example-simple": "Procurar os ficheiros duplicados de [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Procurar duplicados de todos os ficheiros.", - "apihelp-query+embeddedin-description": "Encontrar todas as páginas que incorporam (transcluem) o título indicado.", + "apihelp-query+embeddedin-summary": "Encontrar todas as páginas que incorporam (transcluem) o título indicado.", "apihelp-query+embeddedin-param-title": "O título a procurar. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+embeddedin-param-pageid": "O identificador da página a procurar. Não pode ser usado em conjunto com $1title.", "apihelp-query+embeddedin-param-namespace": "O espaço nominal a ser enumerado.", @@ -681,13 +712,13 @@ "apihelp-query+embeddedin-param-limit": "O número total de páginas a serem devolvidas.", "apihelp-query+embeddedin-example-simple": "Mostrar as páginas que transcluem Template:Stub.", "apihelp-query+embeddedin-example-generator": "Obter informação sobre as páginas que transcluem Template:Stub.", - "apihelp-query+extlinks-description": "Devolve todos os URL externos (que não sejam interwikis) das páginas especificadas.", + "apihelp-query+extlinks-summary": "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 $1query está definido, o protocolo é http. Deixe isto e $1query vazios para listar todos os ''links'' 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-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.", "apihelp-query+extlinks-example-simple": "Obter uma lista das ligações externas na Main Page.", - "apihelp-query+exturlusage-description": "Enumerar as páginas que contêm um determinado URL.", + "apihelp-query+exturlusage-summary": "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-title": "Adiciona o título e o identificador do espaço nominal da página.", @@ -698,7 +729,7 @@ "apihelp-query+exturlusage-param-limit": "O número de páginas a serem devolvidas.", "apihelp-query+exturlusage-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.", "apihelp-query+exturlusage-example-simple": "Mostrar as páginas com ligações para http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Enumerar todos os ficheiros eliminados sequencialmente.", + "apihelp-query+filearchive-summary": "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.", @@ -720,10 +751,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.", "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os ficheiros eliminados.", - "apihelp-query+filerepoinfo-description": "Devolver meta informação sobre os repositórios de imagens configurados na wiki.", - "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 [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] 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+filerepoinfo-summary": "Devolver meta informação sobre os repositórios de imagens configurados na wiki.", + "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 [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] 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+filerepoinfo-example-simple": "Obter informações sobre os repositórios de ficheiros.", - "apihelp-query+fileusage-description": "Encontrar todas as páginas que usam os ficheiros indicados.", + "apihelp-query+fileusage-summary": "Encontrar todas as páginas que usam os ficheiros indicados.", "apihelp-query+fileusage-param-prop": "As propriedades a serem obtidas:", "apihelp-query+fileusage-paramvalue-prop-pageid": "O identificador de cada página.", "apihelp-query+fileusage-paramvalue-prop-title": "O título de cada página.", @@ -733,7 +764,7 @@ "apihelp-query+fileusage-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só os não redirecionamentos.", "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-summary": "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-user": "Adiciona o utilizador que carregou cada versão de ficheiro.", @@ -769,13 +800,13 @@ "apihelp-query+imageinfo-param-localonly": "Procurar ficheiros só no repositório local.", "apihelp-query+imageinfo-example-simple": "Obter informação sobre a versão atual do ficheiro [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "Obter informação sobre as versões de [[:File:Test.jpg]] a partir de 2008.", - "apihelp-query+images-description": "Devolve todos os ficheiros contidos nas páginas indicadas.", + "apihelp-query+images-summary": "Devolve todos os ficheiros contidos nas páginas indicadas.", "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-description": "Encontrar todas as páginas que utilizam o título da imagem indicada.", + "apihelp-query+imageusage-summary": "Encontrar todas as páginas que utilizam o título da imagem indicada.", "apihelp-query+imageusage-param-title": "O título a procurar. Não pode ser usado em conjunto com $1pageid.", "apihelp-query+imageusage-param-pageid": "O identificador da página a procurar. Não pode ser usado em conjunto com $1title.", "apihelp-query+imageusage-param-namespace": "O espaço nominal a ser enumerado.", @@ -785,7 +816,7 @@ "apihelp-query+imageusage-param-redirect": "Se a página que contém a ligação é um redirecionamento, procurar também todas as páginas que contêm ligações para esse redirecionamento. O limite máximo é reduzido para metade.", "apihelp-query+imageusage-example-simple": "Mostrar as páginas que usam [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "Obter informações sobre as páginas que usam o ficheiro [[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "Obter a informação básica da página.", + "apihelp-query+info-summary": "Obter a informação básica da página.", "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.", @@ -802,7 +833,8 @@ "apihelp-query+info-param-token": "Em substituição, usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-query+info-example-simple": "Obter informações sobre a página Main Page.", "apihelp-query+info-example-protection": "Obter informação geral e de proteção sobre a página Main Page.", - "apihelp-query+iwbacklinks-description": "Encontrar todas as páginas que contêm o ''link'' interwikis indicado.\n\nPode ser usado para encontrar todos os ''links'' com um determinado prefixo, ou todos os ''links'' para um título (com um prefixo indicado). Não usar nenhum dos dois parâmetros significa efetivamente ''todos os ''links'' interwikis''.", + "apihelp-query+iwbacklinks-summary": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.", + "apihelp-query+iwbacklinks-extended-description": "Pode ser usado para encontrar todos os ''links'' com um prefixo, ou todos os ''links'' para um título (com um prefixo especificado). Se nenhum parâmetro for usado, isso efetivamente significa \"todos os ''links'' interwikis\".", "apihelp-query+iwbacklinks-param-prefix": "O prefixo interwikis.", "apihelp-query+iwbacklinks-param-title": "O ''link'' interwikis a ser procurado. Tem de ser usado em conjunto com $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "O número total de páginas a serem devolvidas.", @@ -812,7 +844,7 @@ "apihelp-query+iwbacklinks-param-dir": "A direção de listagem.", "apihelp-query+iwbacklinks-example-simple": "Obter as páginas que contêm ligações para [[wikibooks:Test]].", "apihelp-query+iwbacklinks-example-generator": "Obter informação sobre as páginas que contêm ligações para [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Devolve todos os ''links'' interwikis das páginas indicadas.", + "apihelp-query+iwlinks-summary": "Devolve todos os ''links'' interwikis das páginas indicadas.", "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.", @@ -821,7 +853,8 @@ "apihelp-query+iwlinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com $1prefix.", "apihelp-query+iwlinks-param-dir": "A direção de listagem.", "apihelp-query+iwlinks-example-simple": "Obter os ''links'' interwikis da página Main Page.", - "apihelp-query+langbacklinks-description": "Encontrar todas as páginas que contêm ligações para o ''link'' interlínguas indicado.\n\nPode ser usado para encontrar todos os ''links'' para um determinado código de língua, ou todos os ''links'' para um determinado título (de uma língua). Se nenhum for usado, isso efetivamente significa \"todos os ''links'' interlínguas\".\n\nNote que os ''links'' interlínguas adicionados por extensões podem não ser considerados.", + "apihelp-query+langbacklinks-summary": "Encontrar todas as páginas que contêm ''links'' para o ''link'' interlínguas indicado.", + "apihelp-query+langbacklinks-extended-description": "Pode ser usado para encontrar todos os ''links'' para um determinado código de língua, ou todos os ''links'' para um determinado título (de uma língua). Se nenhum for usado, isso efetivamente significa \"todos os ''links'' interlínguas\".\n\nNote que os ''links'' interlínguas adicionados por extensões podem não ser considerados.", "apihelp-query+langbacklinks-param-lang": "A língua do ''link'' interlínguas.", "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.", @@ -831,7 +864,7 @@ "apihelp-query+langbacklinks-param-dir": "A direção de listagem.", "apihelp-query+langbacklinks-example-simple": "Obter as páginas que contêm ligações para [[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "Obter informações sobre as páginas que contêm ligações para [[:fr:Test]].", - "apihelp-query+langlinks-description": "Devolve todos os ''links'' interlínguas das páginas indicadas.", + "apihelp-query+langlinks-summary": "Devolve todos os ''links'' interlínguas das páginas indicadas.", "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:", @@ -843,7 +876,7 @@ "apihelp-query+langlinks-param-dir": "A direção de listagem.", "apihelp-query+langlinks-param-inlanguagecode": "O código de língua para os nomes de língua localizados.", "apihelp-query+langlinks-example-simple": "Obter os ''links'' interlínguas da página Main Page.", - "apihelp-query+links-description": "Devolve todos os ''links'' das páginas indicadas.", + "apihelp-query+links-summary": "Devolve todos os ''links'' das páginas indicadas.", "apihelp-query+links-param-namespace": "Mostrar apenas os ''links'' destes espaços nominais.", "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.", @@ -851,7 +884,7 @@ "apihelp-query+links-example-simple": "Obter os ''links'' da página Main Page.", "apihelp-query+links-example-generator": "Obter informação sobre as páginas ligadas na página Main Page.", "apihelp-query+links-example-namespaces": "Obter os ''links'' da página Main Page nos espaços nominais {{ns:user}} e {{ns:template}}.", - "apihelp-query+linkshere-description": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.", + "apihelp-query+linkshere-summary": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.", "apihelp-query+linkshere-param-prop": "As propriedades a serem obtidas:", "apihelp-query+linkshere-paramvalue-prop-pageid": "O identificador de cada página.", "apihelp-query+linkshere-paramvalue-prop-title": "O título de cada página.", @@ -861,7 +894,7 @@ "apihelp-query+linkshere-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só os não redirecionamentos.", "apihelp-query+linkshere-example-simple": "Obter uma lista das páginas com ligações para a página [[Main Page]].", "apihelp-query+linkshere-example-generator": "Obter informação sobre as páginas com ligações para a página [[Main Page]].", - "apihelp-query+logevents-description": "Obter eventos dos registos.", + "apihelp-query+logevents-summary": "Obter eventos dos registos.", "apihelp-query+logevents-param-prop": "As propriedades a serem obtidas:", "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o identificador do evento do registo.", "apihelp-query+logevents-paramvalue-prop-title": "Adiciona o título da página do evento do registo.", @@ -884,13 +917,13 @@ "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-summary": "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-summary": "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 ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] 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 Main Page e MediaWiki.", - "apihelp-query+pageswithprop-description": "Listar todas as páginas que usam uma determinada propriedade.", + "apihelp-query+pageswithprop-summary": "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 ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] 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.", @@ -900,14 +933,15 @@ "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 {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Obter informação adicional sobre as primeiras 10 páginas que usam __NOTOC__.", - "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 [[Special:ApiHelp/query+allpages|action=query&list=allpages]] com o parâmetro apprefix. O propósito deste módulo é semelhante a [[Special:ApiHelp/opensearch|action=opensearch]]: 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-summary": "Realizar uma procura de prefixo nos títulos de página.", + "apihelp-query+prefixsearch-extended-description": "Apesar da semelhança de nomes, este módulo não pretende ser equivalente a [[Special:PrefixIndex]]; para este, consulte [[Special:ApiHelp/query+allpages|action=query&list=allpages]] com o parâmetro apprefix. O propósito deste módulo é semelhante a [[Special:ApiHelp/opensearch|action=opensearch]]: 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 meaning.", "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-summary": "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.", @@ -923,18 +957,19 @@ "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-description": "Obter uma lista fornecida por uma página especial baseada em consultas (''QueryPage'').", + "apihelp-query+querypage-summary": "Obter uma lista fornecida por uma página especial baseada em consultas (''QueryPage'').", "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+querypage-example-ancientpages": "Devolver os resultados da página [[Special:Ancientpages]].", - "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 é Main Page, a página List of fictional monkeys será sempre a segunda, a página List of people on stamps of Vanuatu a terceira, etc.", + "apihelp-query+random-summary": "Obter um conjunto de páginas aleatórias.", + "apihelp-query+random-extended-description": "As 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 é Main Page, a página List of fictional monkeys será sempre a segunda, a página List of people on stamps of Vanuatu 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 $1filterredir=redirects.", "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-summary": "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 as mudanças para produzir só as destes espaços nominais.", @@ -964,7 +999,7 @@ "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-summary": "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.", @@ -974,10 +1009,11 @@ "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 start, end ou limit.\n# Obter dados sobre um conjunto de revisões definindo os respetivos identificadores de revisões.", + "apihelp-query+revisions-summary": "Obter informação da revisão.", + "apihelp-query+revisions-extended-description": "Pode 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 start, end ou limit.\n# Obter dados sobre um conjunto de revisões definindo os respetivos 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-startid": "Iniciar a enumeração a partir da data e hora desta revisão. A revisão tem de existir, mas não precisa de pertencer a esta página.", + "apihelp-query+revisions-param-endid": "Terminar a enumeração na data e hora desta revisão. A revisão tem de existir, mas não precisa de pertencer a esta página.", "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.", @@ -1003,17 +1039,17 @@ "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 $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Descontinuado. Em substituição, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo $1).", "apihelp-query+revisions+base-param-limit": "Limitar o número de revisões que serão devolvidas.", - "apihelp-query+revisions+base-param-expandtemplates": "Expandir predefinições no conteúdo da revisão (requer $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "Gerar a árvore de análise sintática em XML do conteúdo da revisão (requer $1prop=content; substituído por $1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "Fazer a análise sintática do conteúdo da revisão (requer $1prop=content). Por motivos de desempenho, se esta opção for usada $1limit é forçado a ser 1.", + "apihelp-query+revisions+base-param-expandtemplates": "Em substituição, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Expandir predefinições no conteúdo da revisão (requer $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Em substituição, use [[Special:ApiHelp/expandtemplates|action=expandtemplates]] ou [[Special:ApiHelp/parse|action=parse]]. Gerar a árvore de análise sintática em XML do conteúdo da revisão (requer $1prop=content).", + "apihelp-query+revisions+base-param-parse": "Em substituição, use [[Special:ApiHelp/parse|action=parse]]. Fazer a análise sintática do conteúdo da revisão (requer $1prop=content). Por motivos de desempenho, se esta opção for usada $1limit é forçado a ser 1.", "apihelp-query+revisions+base-param-section": "Obter apenas o conteúdo da secção que tem este número.", - "apihelp-query+revisions+base-param-diffto": "O identificador da revisão contra a qual será tirada uma lista de diferenças de cada revisão. Usar prev (anterior), next (seguinte) e cur (atual).", - "apihelp-query+revisions+base-param-difftotext": "O texto contra o qual será tirada uma lista de diferenças de cada revisão. Só produz as diferenças para um número limitado de revisões. Tem precedência sobre $1diffto. Se $1section estiver definido, só o conteúdo dessa secção será comparado contra o texto.", - "apihelp-query+revisions+base-param-difftotextpst": "Fazer uma transformação de pré-gravação ao texto antes de calcular as diferenças. Só é válido quando usado com $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "Em substituição, use [[Special:ApiHelp/compare|action=compare]]. O identificador da revisão contra a qual será tirada uma lista de diferenças de cada revisão. Usar prev (anterior), next (seguinte) e cur (atual).", + "apihelp-query+revisions+base-param-difftotext": "Em substituição, use [[Special:ApiHelp/compare|action=compare]]. O texto contra o qual será tirada uma lista de diferenças de cada revisão. Só produz as diferenças para um número limitado de revisões. Tem precedência sobre $1diffto. Se $1section estiver definido, só o conteúdo dessa secção será comparado contra o texto.", + "apihelp-query+revisions+base-param-difftotextpst": "Em substituição, use [[Special:ApiHelp/compare|action=compare]]. Fazer uma transformação anterior à gravação do texto, antes de calcular as diferenças. Só é válido quando usado com $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "O formato de seriação usado para $1difftotext e esperado para o conteúdo produzido.", - "apihelp-query+search-description": "Efetuar uma pesquisa do texto integral.", + "apihelp-query+search-summary": "Efetuar uma pesquisa do texto integral.", "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-namespace": "Pesquisar só nestes espaços nominais.", "apihelp-query+search-param-what": "O tipo de pesquisa a executar.", @@ -1031,16 +1067,16 @@ "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": "Obsoleto e ignorado.", - "apihelp-query+search-paramvalue-prop-hasrelated": "Obsoleto e ignorado.", + "apihelp-query+search-paramvalue-prop-score": "Ignorado.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorado.", "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 a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.", + "apihelp-query+search-param-enablerewrites": "Ativar a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa substituindo-a por outra que consideram que dará melhores resultados, por exemplo, por corrigir erros de ortografia.", "apihelp-query+search-example-simple": "Pesquisar meaning.", "apihelp-query+search-example-text": "Pesquisar meaning nos textos.", "apihelp-query+search-example-generator": "Obter informação sobre as páginas devolvidas por uma pesquisa do termo meaning.", - "apihelp-query+siteinfo-description": "Devolver informação geral sobre o ''site''.", + "apihelp-query+siteinfo-summary": "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.", @@ -1057,11 +1093,11 @@ "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 $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve uma lista dos códigos de língua para os quais o [[mw:LanguageConverter|LanguageConverter]] está ativado, e as variantes suportadas para cada código.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve uma lista dos códigos de língua para os quais o [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está ativado, e as variantes suportadas para cada código.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve uma lista de todos os temas ativados (opcionalmente localizada, usando $1inlanguagecode, 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 [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve uma lista de todos os ''hooks'' subscritos (conteúdo de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "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.", @@ -1073,12 +1109,12 @@ "apihelp-query+siteinfo-example-simple": "Obter as informações 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-summary": "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-summary": "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.", @@ -1089,7 +1125,7 @@ "apihelp-query+tags-paramvalue-prop-source": "Obter as fontes da etiqueta, que podem incluir extension para etiquetas definidas por extensões e manual 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-summary": "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.", @@ -1097,11 +1133,11 @@ "apihelp-query+templates-example-simple": "Obter as predefinições usadas na página Main Page.", "apihelp-query+templates-example-generator": "Obter informação sobre as páginas das predefinições usadas na página Main Page.", "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 Main Page.", - "apihelp-query+tokens-description": "Obtém chaves para operações de modificação de dados.", + "apihelp-query+tokens-summary": "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-summary": "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.", @@ -1111,7 +1147,7 @@ "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 Main Page.", "apihelp-query+transcludedin-example-generator": "Obter informação sobre as páginas que transcluem Main Page.", - "apihelp-query+usercontribs-description": "Obter todas as edições de um utilizador.", + "apihelp-query+usercontribs-summary": "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.", @@ -1130,21 +1166,22 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona as etiquetas da edição.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiqueta as edições patrulhadas.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da edição.", - "apihelp-query+usercontribs-param-show": "Mostrar só as contribuições que correspondem a estes critérios; por exemplo, só as edições não menores: $2show=!minor.\n\nSe um dos valores $2show=patrolled ou $2show=!patrolled estiver definido, as revisões feitas há mais de [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) não serão mostradas.", + "apihelp-query+usercontribs-param-show": "Mostrar só as contribuições que correspondem a estes critérios; por exemplo, só as edições não menores: $2show=!minor.\n\nSe um dos valores $2show=patrolled ou $2show=!patrolled estiver definido, as revisões feitas há mais de [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) não serão mostradas.", "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-user": "Mostrar as contribuições do utilizador Example.", "apihelp-query+usercontribs-example-ipprefix": "Mostrar as contribuições de todos os endereços IP com o prefixo 192.0.2..", - "apihelp-query+userinfo-description": "Obter informações sobre o utilizador atual.", + "apihelp-query+userinfo-summary": "Obter informações sobre o utilizador atual.", "apihelp-query+userinfo-param-prop": "As informações que devem ser incluídas:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador atual está bloqueado, por quem, e qual o motivo.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adiciona uma etiqueta messages se o utilizador atual tem mensagens pendentes.", "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos aos quais o utilizador atual pertence.", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Lista os grupos aos quais o utilizador atual foi explicitamente atribuído, incluindo a data de expiração da sua pertença a cada grupo.", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais o utilizador atual pertence automaticamente.", "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todas as permissões que o utilizador atual tem.", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos aos quais o utilizador atual pode ser adicionado ou de onde pode ser removido.", "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas as preferências que o utilizador atual definiu.", - "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Obsoleto. Obter uma chave para alterar as preferências do utilizador atual.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "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-ratelimits": "Lista todas as frequências limite do utilizador atual.", "apihelp-query+userinfo-paramvalue-prop-realname": "Adiciona o nome real do utilizador.", @@ -1156,10 +1193,11 @@ "apihelp-query+userinfo-param-attachedwiki": "Com $1prop=centralids, indicar se o utilizador tem ligação com a wiki designada por este identificador.", "apihelp-query+userinfo-example-simple": "Obter informações sobre o utilizador atual.", "apihelp-query+userinfo-example-data": "Obter informações adicionais sobre o utilizador atual.", - "apihelp-query+users-description": "Obter informações sobre uma lista de utilizadores.", + "apihelp-query+users-summary": "Obter informações sobre uma lista de utilizadores.", "apihelp-query+users-param-prop": "As informações que devem ser incluídas:", "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador está bloqueado, por quem, e qual o motivo.", "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos aos quais cada utilizador pertence.", + "apihelp-query+users-paramvalue-prop-groupmemberships": "Lista os grupos aos quais cada utilizador foi explicitamente atribuído, incluindo a data de expiração da sua pertença a cada grupo.", "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais um utilizador pertence automaticamente.", "apihelp-query+users-paramvalue-prop-rights": "Lista todas as permissões que cada utilizador tem.", "apihelp-query+users-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador.", @@ -1173,8 +1211,8 @@ "apihelp-query+users-param-userids": "Uma lista de identificadores dos utilizadores de que serão obtidas informações.", "apihelp-query+users-param-token": "Em substituição, usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-query+users-example-simple": "Devolver informações sobre o utilizador Example.", - "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.", - "apihelp-query+watchlist-param-allrev": "Incluir múltiplas revisões da mesma página dentro do intervalo de tempo indicado.", + "apihelp-query+watchlist-summary": "Obter mudanças recentes das páginas vigiadas do utilizador atual.", + "apihelp-query+watchlist-param-allrev": "Incluir revisões múltiplas da mesma página dentro do intervalo de tempo indicado.", "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-namespace": "Filtrar as mudanças para produzir só as dos espaços nominais indicados.", @@ -1209,7 +1247,7 @@ "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-generator-rev": "Obter informações de revisão para as mudanças recentes às páginas vigiadas do utilizador atual.", "apihelp-query+watchlist-example-wlowner": "Listar a revisão mais recente das páginas na lista de páginas vigiadas do utilizador Example que tenham sido recentemente alteradas.", - "apihelp-query+watchlistraw-description": "Obter todas as páginas na lista de páginas vigiadas do utilizador atual.", + "apihelp-query+watchlistraw-summary": "Obter todas as páginas na lista de páginas vigiadas do utilizador atual.", "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:", @@ -1222,15 +1260,15 @@ "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-removeauthenticationdata-summary": "Remover os dados de autenticação do utilizador atual.", "apihelp-removeauthenticationdata-example-simple": "Tentar remover os dados do utilizador atual para o pedido de autenticação FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Enviar a um utilizador uma mensagem eletrónica de reinício da palavra-passe.", - "apihelp-resetpassword-description-noroutes": "Não estão disponíveis rotas de reinício da palavra-passe.\n\nPara usar este módulo, ative uma rota em [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", + "apihelp-resetpassword-summary": "Enviar a um utilizador uma mensagem eletrónica de reinício da palavra-passe.", + "apihelp-resetpassword-extended-description-noroutes": "Não estão disponíveis rotas de reinício da palavra-passe.\n\nPara usar este módulo, ative uma rota em [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", "apihelp-resetpassword-param-user": "O utilizar cuja palavra-passe será reiniciada.", "apihelp-resetpassword-param-email": "O correio eletrónico do utilizador cuja palavra-passe será reiniciada.", "apihelp-resetpassword-example-user": "Enviar uma mensagem eletrónica para reinício da palavra-passe ao utilizador Example.", "apihelp-resetpassword-example-email": "Enviar uma mensagem eletrónica para reinício da palavra-passe a todos os utilizadores com o correio eletrónico user@example.com.", - "apihelp-revisiondelete-description": "Eliminar e restaurar revisões.", + "apihelp-revisiondelete-summary": "Eliminar e restaurar revisões.", "apihelp-revisiondelete-param-type": "O tipo de eliminação de revisão que está a ser feito.", "apihelp-revisiondelete-param-target": "O título de página para a eliminação da revisão, se for necessário para o tipo de eliminação.", "apihelp-revisiondelete-param-ids": "Os identificadores das revisões a serem eliminadas.", @@ -1241,7 +1279,8 @@ "apihelp-revisiondelete-param-tags": "Etiquetas a aplicar à entrada no registo de eliminações.", "apihelp-revisiondelete-example-revision": "Ocultar o conteúdo da revisão 12345 na página Main Page.", "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada 67890 do registo com o motivo BLP violation.", - "apihelp-rollback-description": "Desfazer a última edição da página.\n\nSe o último utilizador a editar a página realizou várias edições em sequência, estas serão todas desfeitas.", + "apihelp-rollback-summary": "Desfazer a última edição da página.", + "apihelp-rollback-extended-description": "Se o último utilizador que editou a página tiver realizado várias edições consecutivas, elas serão todas revertidas.", "apihelp-rollback-param-title": "O título da página a reverter. Não pode ser usado em conjunto com $1pageid.", "apihelp-rollback-param-pageid": "O identificador da página a reverter. Não pode ser usado em conjunto com $1title.", "apihelp-rollback-param-tags": "As etiquetas a aplicar à reversão.", @@ -1251,9 +1290,10 @@ "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-simple": "Reverter as últimas edições da página Main Page pelo utilizador Example.", "apihelp-rollback-example-summary": "Reverter as últimas edições da página Main Page pelo utilizador IP 192.0.2.5 com o resumo Reverting vandalism, e marcar essas edições e a reversão como edições de robôs.", - "apihelp-rsd-description": "Exportar um esquema (''schema'') RSD (Really Simple Discovery).", + "apihelp-rsd-summary": "Exportar um esquema (''schema'') RSD (Really Simple Discovery).", "apihelp-rsd-example-simple": "Exportar o esquema RSD.", - "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-summary": "Atualizar a data e hora de notificação de alterações às páginas vigiadas.", + "apihelp-setnotificationtimestamp-extended-description": "Isto 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-entirewatchlist": "Trabalhar em todas as páginas vigiadas.", "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).", @@ -1262,8 +1302,8 @@ "apihelp-setnotificationtimestamp-example-page": "Reiniciar o estado de notificação da página Main page.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página Main page 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 {{ns:user}}.", - "apihelp-setpagelanguage-description": "Alterar a língua de uma página.", - "apihelp-setpagelanguage-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para usar esta operação.", + "apihelp-setpagelanguage-summary": "Alterar a língua de uma página.", + "apihelp-setpagelanguage-extended-description-disabled": "Não é permitido alterar a língua de uma página nesta wiki.\n\nAtivar [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para usar esta operação.", "apihelp-setpagelanguage-param-title": "O título da página cuja língua pretende alterar. Não pode ser usado em conjunto com $1pageid.", "apihelp-setpagelanguage-param-pageid": "O identificador da página cuja língua pretende alterar. Não pode ser usado em conjunto com $1title.", "apihelp-setpagelanguage-param-lang": "O código de língua, da língua para a qual a página será alterada. Usar default para redefinir a língua da página para a língua padrão de conteúdo da wiki.", @@ -1271,7 +1311,8 @@ "apihelp-setpagelanguage-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que resultar desta operação.", "apihelp-setpagelanguage-example-language": "Alterar a língua da página Main Page para basco.", "apihelp-setpagelanguage-example-default": "Alterar a língua da página com o identificador 123 para a língua padrão de conteúdo da wiki.", - "apihelp-stashedit-description": "Preparar uma edição na ''cache'' 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-summary": "Preparar uma edição na cache partilhada.", + "apihelp-stashedit-extended-description": "É pretendido que isto seja usado através de 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-stashedit-param-section": "Número da secção. 0 para a secção do topo, new para uma secção nova.", "apihelp-stashedit-param-sectiontitle": "O título para uma secção nova.", @@ -1281,7 +1322,7 @@ "apihelp-stashedit-param-contentformat": "O formato de seriação do conteúdo usado para o texto de entrada.", "apihelp-stashedit-param-baserevid": "O identificador de revisão da revisão de base.", "apihelp-stashedit-param-summary": "O resumo da mudança.", - "apihelp-tag-description": "Adicionar ou remover as etiquetas de modificação aplicadas a revisões individuais ou a entradas do registo.", + "apihelp-tag-summary": "Adicionar ou remover as etiquetas de modificação aplicadas a revisões individuais ou a entradas do registo.", "apihelp-tag-param-rcid": "Um ou mais identificadores de mudanças recentes às quais adicionar ou remover a etiqueta.", "apihelp-tag-param-revid": "Um ou mais identificadores de revisões às quais adicionar ou remover a etiqueta.", "apihelp-tag-param-logid": "Um ou mais identificadores de entradas do registo às quais adicionar ou remover a etiqueta.", @@ -1291,11 +1332,12 @@ "apihelp-tag-param-tags": "As etiquetas de modificação a aplicar à entrada no registo que será criada em resultado desta operação.", "apihelp-tag-example-rev": "Adicionar a etiqueta vandalism à revisão com o identificador 123, sem especificar um motivo.", "apihelp-tag-example-log": "Remover a etiqueta spam da entrada do registo com o identificador 123, com o motivo Wrongly applied.", - "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-summary": "Obter chaves para operações de modificação de dados.", + "apihelp-tokens-extended-description": "Este módulo foi descontinuado e 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-summary": "Desbloquear um utilizador.", "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com list=blocks). Não pode ser usado em conjunto com $1user ou $1userid.", "apihelp-unblock-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a ser desbloqueado. Não pode ser usado em conjunto com $1id ou $1userid.", "apihelp-unblock-param-userid": "O identificador do utilizador a ser desbloqueado. Não pode ser usado em conjunto com $1id ou $1user.", @@ -1303,7 +1345,8 @@ "apihelp-unblock-param-tags": "As etiquetas de modificação a aplicar à entrada no registo de bloqueios.", "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #105.", "apihelp-unblock-example-user": "Desbloquear o utilizador Bob com o motivo Sorry Bob.", - "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "Restaurar revisões de uma página eliminada.", + "apihelp-undelete-extended-description": "Pode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "Título da página a restaurar.", "apihelp-undelete-param-reason": "Motivo para restaurar a página.", "apihelp-undelete-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de eliminações.", @@ -1312,9 +1355,10 @@ "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-undelete-example-page": "Restaurar a página Main Page.", "apihelp-undelete-example-revisions": "Restaurar duas revisões da página Main Page.", - "apihelp-unlinkaccount-description": "Remover do utilizador atual uma conta ligada de uma wiki terceira.", + "apihelp-unlinkaccount-summary": "Remover do utilizador atual uma conta ligada de uma wiki terceira.", "apihelp-unlinkaccount-example-simple": "Tentar remover a ligação do utilizador atual ao fornecedor associado com FooAuthenticationRequest.", - "apihelp-upload-description": "Atualizar um ficheiro, ou obter o estado de carregamentos pendentes.\n\nEstão disponíveis vários métodos:\n* Carregar diretamente o conteúdo do ficheiro, usando o parâmetro $1file.\n* Carregar o ficheiro por segmentos, usando os parâmetros $1filesize, $1chunk e $1offset.\n* Instruir o servidor do MediaWiki para obter o ficheiro a partir de um URL, usando o parâmetro $1url.\n* Terminar um carregamento anterior que falhou devido a avisos, usando o parâmetro $1filekey.\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, usando multipart/form-data) ao enviar o $1file.", + "apihelp-upload-summary": "Carregar um ficheiro, ou obter o estado dos carregamentos pendentes.", + "apihelp-upload-extended-description": "Estão disponíveis vários métodos:\n* Carregar diretamente o conteúdo do ficheiro, usando o parâmetro $1file.\n* Carregar o ficheiro por segmentos, usando os parâmetros $1filesize, $1chunk e $1offset.\n* Instruir o servidor do MediaWiki para obter o ficheiro a partir de um URL, usando o parâmetro $1url.\n* Terminar um carregamento anterior que falhou devido a avisos, usando o parâmetro $1filekey.\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, usando multipart/form-data) ao enviar o $1file.", "apihelp-upload-param-filename": "O nome de destino do ficheiro.", "apihelp-upload-param-comment": "O comentário do carregamento. Também é usado como texto da página inicial para ficheiros novos se $1text não for especificado.", "apihelp-upload-param-tags": "Etiquetas de modificação a aplicar à entrada do carregamento no registo e à revisão da página de ficheiro.", @@ -1334,23 +1378,26 @@ "apihelp-upload-param-checkstatus": "Obter só o estado de carregamento para a chave de ficheiro indicada.", "apihelp-upload-example-url": "Carregar de um URL.", "apihelp-upload-example-filekey": "Prosseguir um carregamento que falhou devido a avisos.", - "apihelp-userrights-description": "Alterar os grupos a que um utilizador pertence.", + "apihelp-userrights-summary": "Alterar os grupos a que um utilizador pertence.", "apihelp-userrights-param-user": "O nome de utilizador.", "apihelp-userrights-param-userid": "O identificador de utilizador.", "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos ou, se já for membro de um grupo, atualizar a data de expiração da sua pertença a esse grupo.", + "apihelp-userrights-param-expiry": "Datas e horas de expiração. Podem ser relativas (por exemplo, 5 meses ou 2 semanas) ou absolutas (p. ex., 2014-09-18T12:34:56Z). Se só estiver definida uma data e hora, ela será usada para todos os grupos passados ao parâmetro $1add. Use infinite, indefinite, infinity ou never quando a pertença a um grupo não tem expiração.", "apihelp-userrights-param-remove": "Remover o utilizador destes grupos.", "apihelp-userrights-param-reason": "O motivo da alteração.", "apihelp-userrights-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de privilégios de utilizadores.", "apihelp-userrights-example-user": "Adicionar o utilizador FooBot ao grupo bot e removê-lo dos grupos sysop e bureaucrat.", "apihelp-userrights-example-userid": "Adicionar o utilizador com o identificador 123 ao grupo bot e removê-lo dos grupos sysop e bureaucrat.", - "apihelp-validatepassword-description": "Validar uma palavra-passe face às regras para palavras-passe da wiki.\n\nA validade é reportada Good (Boa) se a palavra-passe é aceitável, Change (Alterar) se a palavra-passe pode ser usada para iniciar uma sessão mas terá de ser alterada, ou Invalid (Inválida) se a palavra-passe não é utilizável.", + "apihelp-userrights-example-expiry": "Adicionar o utilizador SometimeSysop ao grupo sysop por 1 mês.", + "apihelp-validatepassword-summary": "Validar uma palavra-passe face às regras para palavras-passe da wiki.", + "apihelp-validatepassword-extended-description": "A validade é reportada Good (Boa) se a palavra-passe é aceitável, Change (Alterar) se a palavra-passe pode ser usada para iniciar uma sessão mas terá de ser alterada, ou Invalid (Inválida) se a palavra-passe não é utilizável.", "apihelp-validatepassword-param-password": "A palavra-passe a ser validada.", "apihelp-validatepassword-param-user": "O nome de utilizador, para ser usado ao testar a criação de conta. O nome de utilizador não pode existir.", "apihelp-validatepassword-param-email": "O endereço de correio eletrónico, para ser usado ao testar a criação de conta.", "apihelp-validatepassword-param-realname": "O nome verdadeiro, para ser usado ao testar a criação de conta.", "apihelp-validatepassword-example-1": "Validar a palavra-passe foobar para o utilizador atual.", "apihelp-validatepassword-example-2": "Validar a palavra-passe qwerty para a criação do utilizador Example.", - "apihelp-watch-description": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.", + "apihelp-watch-summary": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.", "apihelp-watch-param-title": "A página a vigiar ou deixar de ser vigiada. Em vez disto, usar $1titles.", "apihelp-watch-param-unwatch": "Se definido, a página deixará de ser vigiada, em vez de o ser.", "apihelp-watch-example-watch": "Vigiar a página Main Page.", @@ -1358,25 +1405,30 @@ "apihelp-watch-example-generator": "Vigiar as primeiras páginas do espaço nominal principal.", "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.", "apihelp-format-param-wrappedhtml": "Devolver o HTML com realce sintático e os módulos ResourceLoader associados, na forma de um objeto JSON.", - "apihelp-json-description": "Produzir os dados de saída no formato JSON.", + "apihelp-json-summary": "Produzir os dados de saída no formato JSON.", "apihelp-json-param-callback": "Se especificado, envolve o resultado de saída na forma de uma chamada para uma função. Por segurança, todos os dados específicos do utilizador estarão restringidos.", "apihelp-json-param-utf8": "Se especificado, codifica a maioria dos caracteres não ASCII (mas não todos) em UTF-8, em vez de substitui-los por sequências de escape hexadecimais. É o comportamento padrão quando formatversion não tem o valor 1.", "apihelp-json-param-ascii": "Se especificado, codifica todos caracteres não ASCII usando sequências de escape hexadecimais. É o comportamento padrão quando formatversion tem o valor 1.", "apihelp-json-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", - "apihelp-jsonfm-description": "Produzir os dados de saída em formato JSON (realce sintático em HTML).", - "apihelp-none-description": "Não produzir nada.", - "apihelp-php-description": "Produzir os dados de saída em formato PHP seriado.", + "apihelp-jsonfm-summary": "Produzir os dados de saída em formato JSON (realce sintático em HTML).", + "apihelp-none-summary": "Não produzir nada.", + "apihelp-php-summary": "Produzir os dados de saída em formato PHP seriado.", "apihelp-php-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, * chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente 2), mas pode ser alterado sem aviso prévio.", - "apihelp-phpfm-description": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).", - "apihelp-rawfm-description": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).", - "apihelp-xml-description": "Produzir os dados de saída em formato XML.", + "apihelp-phpfm-summary": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).", + "apihelp-rawfm-summary": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).", + "apihelp-xml-summary": "Produzir os dados de saída em formato XML.", "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 .xsl.", "apihelp-xml-param-includexmlnamespace": "Se especificado, adiciona um espaço nominal XML.", - "apihelp-xmlfm-description": "Produzir os dados de saída em formato XML (realce sintático em HTML).", + "apihelp-xmlfm-summary": "Produzir os dados de saída em formato XML (realce sintático em HTML).", "api-format-title": "Resultado da API do MediaWiki.", - "api-format-prettyprint-header": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro format para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina format=$2.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.", - "api-format-prettyprint-header-only-html": "Esta é uma representação em HTML para ser usada no despiste de erros, mas inadequada para uso na aplicação.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.", + "api-format-prettyprint-header": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro format para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina format=$2.\n\nConsulte a [[mw:Special:MyLanguage/API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.", + "api-format-prettyprint-header-only-html": "Esta é uma representação em HTML para ser usada no despiste de erros, mas inadequada para uso na aplicação.\n\nConsulte a [[mw:Special:MyLanguage/API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.", + "api-format-prettyprint-header-hyperlinked": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro format para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina [$3 format=$2].\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.", "api-format-prettyprint-status": "Esta resposta seria devolvida com o estado de HTTP: $1 $2.", + "api-login-fail-aborted": "A autenticação requer interação com o utilizador, que não é suportada por action=login. Para poder entrar com action=login, consulte [[Special:BotPasswords]]. Para continuar a usar a autenticação da conta principal, consulte [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "A autenticação requer interação com o utilizador, que não é suportada por action=login. Para entrar, consulte [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "Não é possível entrar usando $1.", + "api-login-fail-sameorigin": "Não é possível entrar quando a norma da mesma origem não é aplicada.", "api-pageset-param-titles": "Uma lista dos títulos a serem trabalhados.", "api-pageset-param-pageids": "Uma lista dos identificadores de página a serem trabalhados.", "api-pageset-param-revids": "Uma lista dos identificadores de revisões a serem trabalhados.", @@ -1387,7 +1439,8 @@ "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 é obsoleto.", + "api-help-undocumented-module": "Não existe documentação para o módulo $1.", + "api-help-flag-deprecated": "Este módulo foi descontinuado.", "api-help-flag-internal": "Este módulo é interno ou instável. 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 escrita.", @@ -1423,8 +1476,8 @@ "api-help-param-default-empty": "Padrão: (vazio)", "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 ''web'' também é aceite.", - "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode'').", - "api-help-param-limited-in-miser-mode": "Nota: devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de $1limit resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.", + "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]] (''miser mode'').", + "api-help-param-limited-in-miser-mode": "Nota: devido ao [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de $1limit 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": "(sem descrição)", @@ -1442,6 +1495,250 @@ "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 $1continue.\n\nTipicamente, após receber uma resposta REDIRECT, abrirá um ''browser'' ou uma ''web view'' para o URL redirecttarget especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o ''browser'' ou a ''web view'' para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido $1continue a este módulo da API.", "api-help-authmanagerhelper-continue": "Este pedido é uma continuação após uma resposta anterior com o valor UI ou REDIRECT. É obrigatório fornecer este parâmetro ou o parâmetro $1returnurl.", "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais, dependendo dos pedidos de autenticação disponíveis. Use [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] com amirequestsfor=$1 (ou uma resposta anterior deste módulo, se aplicável) para determinar os pedidos disponíveis e os campos que estes utilizam.", + "apierror-allimages-redirect": "Usar gaifilterredir=nonredirects em vez de redirects ao utilizar allimages como gerador.", + "apierror-allpages-generator-redirects": "Usar gapfilterredir=nonredirects em vez de redirects ao utilizar allpages como gerador.", + "apierror-appendnotsupported": "Não é possível acrescentar conteúdo a páginas que usam o modelo de conteúdo $1.", + "apierror-articleexists": "O artigo que tentou criar já existe.", + "apierror-assertbotfailed": "A asserção de que o utilizador tem o privilégio bot falhou.", + "apierror-assertnameduserfailed": "A asserção de que o utilizador é \"$1\" falhou.", + "apierror-assertuserfailed": "A asserção de que o utilizador está autenticado falhou.", + "apierror-autoblocked": "O seu endereço IP foi bloqueado automaticamente, porque foi usado por um utilizador bloqueado.", + "apierror-badconfig-resulttoosmall": "O valor de $wgAPIMaxResultSize nesta wiki é demasiado pequeno para conter informação básica de resultados.", + "apierror-badcontinue": "Parâmetro de continuação inválido. Deve passar o valor original devolvido pela consulta anterior.", + "apierror-baddiff": "Não foi possível obter a lista de diferenças. Uma das revisões, ou ambas, não existem, ou não tem permissão para vê-las.", + "apierror-baddiffto": "$1diffto tem de ser um número não negativo, prev, next ou cur.", + "apierror-badformat-generic": "O formato solicitado $1 não é suportado pelo modelo de conteúdo $2.", + "apierror-badformat": "O formato solicitado $1 não é suportado pelo modelo de conteúdo $2 usado por $3.", + "apierror-badgenerator-notgenerator": "O módulo $1 não pode ser usado como gerador.", + "apierror-badgenerator-unknown": "generator=$1 desconhecido.", + "apierror-badip": "O parâmetro IP não é válido.", + "apierror-badmd5": "A chave MD5 fornecida estava incorreta.", + "apierror-badmodule-badsubmodule": "O módulo $1 não tem um submódulo \"$2\".", + "apierror-badmodule-nosubmodules": "O módulo $1 não tem submódulos.", + "apierror-badparameter": "Valor inválido para o parâmetro $1.", + "apierror-badquery": "Consulta inválida.", + "apierror-badtimestamp": "Valor inválido \"$2\" para o parâmetro de data e hora $1.", + "apierror-badtoken": "Chave CSRF inválida.", + "apierror-badupload": "O parâmetro para carregamento de ficheiros $1 não é um carregamento de ficheiro; verifique que usou multipart/form-data no seu POST e inclua um nome de ficheiro no cabeçalho Content-Disposition.", + "apierror-badurl": "Valor inválido \"$2\" para o parâmetro $1 do URL.", + "apierror-baduser": "Valor inválido \"$2\" para o parâmetro de utilizador $1.", + "apierror-badvalue-notmultivalue": "O separador de valores múltiplos U+001F só pode ser usado em parâmetros de valores múltiplos.", + "apierror-bad-watchlist-token": "A chave secreta da lista de páginas vigiadas que foi fornecida está incorreta. Configure uma chave correta em [[Special:Preferences]], por favor.", + "apierror-blockedfrommail": "Foi-lhe bloqueada a capacidade de enviar correio eletrónico.", + "apierror-blocked": "Foi-lhe bloqueada a capacidade de editar.", + "apierror-botsnotsupported": "Esta interface não é suportada para robôs.", + "apierror-cannot-async-upload-file": "Os parâmetros async e file não podem ser combinados. Se pretende o processamento assíncrono do seu ficheiro carregado, carregue-o primeiro na área de ficheiros escondidos (usando o parâmetro stash) e depois publique de forma assíncrona este ficheiro escondido (usando filekey e async).", + "apierror-cannotreauthenticate": "Esta operação não está disponível porque não é possível verificar a sua identidade.", + "apierror-cannotviewtitle": "Não tem permissão para ver $1.", + "apierror-cantblock-email": "Não tem permissão para bloquear a capacidade dos utilizadores enviarem correio eletrónico através da wiki.", + "apierror-cantblock": "Não tem permissão para bloquear utilizadores.", + "apierror-cantchangecontentmodel": "Não tem permissão para alterar o modelo de conteúdo de uma página.", + "apierror-canthide": "Não tem permissão para ocultar nomes de utilizadores no registo de bloqueios.", + "apierror-cantimport-upload": "Não tem permissão para importar páginas carregadas.", + "apierror-cantimport": "Não tem permissão para importar páginas.", + "apierror-cantoverwrite-sharedfile": "O ficheiro alvo existe num repositório partilhado e você não tem permissão para o substituir.", + "apierror-cantsend": "Não está autenticado, não tem um endereço de correio eletrónico confirmado, ou não lhe é permitido enviar correio a outros utilizadores, por isso não pode enviar correios eletrónicos.", + "apierror-cantundelete": "Não foi possível restaurar: as revisões solicitadas podem não existir ou podem já ter sido restauradas.", + "apierror-changeauth-norequest": "A criação do pedido de modificação falhou.", + "apierror-chunk-too-small": "O tamanho de segmento mínimo é $1 {{PLURAL:$1|byte|bytes}} para segmentos que não sejam segmentos finais.", + "apierror-cidrtoobroad": "Não são aceites intervalos CIDR $1 maiores do que /$2.", + "apierror-compare-no-title": "Não é possível transformar antes da gravação, sem um título. Tente especificar fromtitle ou totitle.", + "apierror-compare-relative-to-nothing": "Não existe uma revisão 'from' em relação à qual torelative possa ser relativo.", + "apierror-contentserializationexception": "A seriação do conteúdo falhou: $1", + "apierror-contenttoobig": "O conteúdo que forneceu excede o tamanho máximo dos artigos que é $1 {{PLURAL:$1|kilobyte|kilobytes}}.", + "apierror-copyuploadbaddomain": "Não são permitidos carregamentos por URL a partir deste domínio.", + "apierror-copyuploadbadurl": "Não são permitidos carregamentos a partir deste URL.", + "apierror-create-titleexists": "Os títulos existentes não podem ser protegidos com create.", + "apierror-csp-report": "Ocorreu um erro no processamento do relatório CSP: $1.", + "apierror-databaseerror": "[$1] Erro na consulta da base de dados.", + "apierror-deletedrevs-param-not-1-2": "O parâmetro $1 não pode ser usado nos modos 1 e 2.", + "apierror-deletedrevs-param-not-3": "O parâmetro $1 não pode ser usado no modo 3.", + "apierror-emptynewsection": "Não é possível criar secções novas vazias.", + "apierror-emptypage": "Não é permitido criar páginas novas vazias.", + "apierror-exceptioncaught": "[$1] Exceção intercetada: $2", + "apierror-filedoesnotexist": "O ficheiro não existe.", + "apierror-fileexists-sharedrepo-perm": "O ficheiro de destino já existe num repositório partilhado. Use o parâmetro ignorewarnings para substituí-lo.", + "apierror-filenopath": "Não é possível obter o caminho local do ficheiro.", + "apierror-filetypecannotberotated": "O tipo do ficheiro não pode ser rodado.", + "apierror-formatphp": "Esta resposta não pode ser representada com format=php. Consulte https://phabricator.wikimedia.org/T68776.", + "apierror-imageusage-badtitle": "O título para $1 tem de ser um ficheiro.", + "apierror-import-unknownerror": "Ocorreu um erro desconhecido na importação: $1.", + "apierror-integeroutofrange-abovebotmax": "$1 não pode ultrapassar $2 (definido como $3) para robôs e administradores.", + "apierror-integeroutofrange-abovemax": "$1 não pode ultrapassar $2 (definido como $3) para utilizadores.", + "apierror-integeroutofrange-belowminimum": "$1 não pode ser inferior a $2 (definido como $3).", + "apierror-invalidcategory": "O nome de categoria que introduziu não é válido.", + "apierror-invalid-chunk": "A posição mais o segmento atual ultrapassam o tamanho do ficheiro.", + "apierror-invalidexpiry": "A hora de expiração \"$1\" é inválida.", + "apierror-invalid-file-key": "Não é uma chave de ficheiro válida.", + "apierror-invalidlang": "Código de língua inválido para o parâmetro $1.", + "apierror-invalidoldimage": "O parâmetro oldimage tem um formato inválido.", + "apierror-invalidparammix-cannotusewith": "O parâmetro $1 não pode ser usado com $2.", + "apierror-invalidparammix-mustusewith": "O parâmetro $1 só pode ser usado com $2.", + "apierror-invalidparammix-parse-new-section": "section=new não pode ser combinado com os parâmetros oldid, pageid e page. Use title e text, por favor.", + "apierror-invalidparammix": "{{PLURAL:$2||Os parâmetros}} $1 não podem ser usados em conjunto.", + "apierror-invalidsection": "O parâmetro section tem de ser um identificador de secção válido ou new.", + "apierror-invalidsha1base36hash": "O resumo criptográfico SHA1Base36 fornecido não é válido.", + "apierror-invalidsha1hash": "O resumo criptográfico SHA1 fornecido não é válido.", + "apierror-invalidtitle": "Título inválido \"$1\".", + "apierror-invalidurlparam": "Valor inválido para $1urlparam ($2=$3).", + "apierror-invaliduser": "Nome de utilizador inválido \"$1\".", + "apierror-invaliduserid": "O identificador de utilizador $1 não é válido.", + "apierror-maxlag-generic": "À espera de um servidor de base de dados: $1 {{PLURAL:$1|segundo|segundos}} de atraso.", + "apierror-maxlag": "À espera de $2: $1 {{PLURAL:$1|segundo|segundos}} de atraso.", + "apierror-mimesearchdisabled": "A pesquisa MIME é desativada no modo avarento.", + "apierror-missingcontent-pageid": "Conteúdo em falta para a página com o identificador $1.", + "apierror-missingcontent-revid": "Conteúdo em falta para a revisão com o identificador $1.", + "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|O parâmetro|Pelo menos um dos parâmetros}} $1 é obrigatório.", + "apierror-missingparam-one-of": "{{PLURAL:$2|O parâmetro|Um dos parâmetros}} $1 é obrigatório.", + "apierror-missingparam": "O parâmetro $1 tem de ser definido.", + "apierror-missingrev-pageid": "Não há nenhuma revisão atual da página com o identificador $1.", + "apierror-missingrev-title": "Não há nenhuma revisão atual do título $1.", + "apierror-missingtitle-createonly": "Os títulos em falta só podem ser protegidos com create.", + "apierror-missingtitle": "A página que especificou não existe.", + "apierror-missingtitle-byname": "A página $1 não existe.", + "apierror-moduledisabled": "O módulo $1 foi desativado.", + "apierror-multival-only-one-of": "Só é permitido {{PLURAL:$3|o valor|um dos valores}} $2 para o parâmetro $1.", + "apierror-multival-only-one": "Só é permitido um valor para o parâmetro $1.", + "apierror-multpages": "$1 só pode ser usado com uma única página.", + "apierror-mustbeloggedin-changeauth": "Tem de estar autenticado para alterar dados de autenticação.", + "apierror-mustbeloggedin-generic": "Tem de estar autenticado.", + "apierror-mustbeloggedin-linkaccounts": "Tem de estar autenticado para ligar contas.", + "apierror-mustbeloggedin-removeauth": "Tem de estar autenticado para remover dados de autenticação.", + "apierror-mustbeloggedin-uploadstash": "A área dos ficheiros escondidos só está disponível para utilizadores autenticados.", + "apierror-mustbeloggedin": "Tem de ter uma sessão iniciada para $1.", + "apierror-mustbeposted": "O módulo $1 requer um pedido POST.", + "apierror-mustpostparams": "{{PLURAL:$2|O seguinte parâmetro foi encontrado|Os seguintes parâmetros foram encontrados}} no texto da pesquisa, mas têm de estar no corpo do POST: $1.", + "apierror-noapiwrite": "A edição desta wiki através da API foi impossibilitada. Certifique-se de que a declaração $wgEnableWriteAPI=true; está incluída no ficheiro LocalSettings.php da wiki.", + "apierror-nochanges": "Não foi pedida nenhuma mudança.", + "apierror-nodeleteablefile": "Essa versão antiga do ficheiro não existe.", + "apierror-no-direct-editing": "A edição direta através da API não é suportada para o modelo de conteúdo $1 usado por $2.", + "apierror-noedit-anon": "Os utilizadores anónimos não podem editar páginas.", + "apierror-noedit": "Não tem permissão para editar páginas.", + "apierror-noimageredirect-anon": "Os utilizadores anónimos não podem criar redirecionamentos de imagens.", + "apierror-noimageredirect": "Não tem permissão para criar redirecionamentos de imagens.", + "apierror-nosuchlogid": "Não existe nenhuma entrada de registo com o identificador $1.", + "apierror-nosuchpageid": "Não existe nenhuma página com o identificador $1.", + "apierror-nosuchrcid": "Não existe nenhuma mudança recente com o identificador $1.", + "apierror-nosuchrevid": "Não existe nenhuma revisão com o identificador $1.", + "apierror-nosuchsection": "Não existe nenhuma secção $1.", + "apierror-nosuchsection-what": "Não existe nenhuma secção $1 em $2.", + "apierror-nosuchuserid": "Não existe nenhum utilizador com o identificador $1.", + "apierror-notarget": "Não especificou um destino válido para esta operação.", + "apierror-notpatrollable": "A revisão r$1 não pode ser patrulhada porque é demasiado antiga.", + "apierror-nouploadmodule": "Não foi definido nenhum módulo de carregamento.", + "apierror-offline": "Não foi possível continuar devido a problemas de conectividade da rede. Certifique-se de que tem ligação à Internet e tente novamente.", + "apierror-opensearch-json-warnings": "Os avisos não podem ser representados no formato OpenSearch JSON.", + "apierror-pagecannotexist": "O espaço nominal não permite páginas reais.", + "apierror-pagedeleted": "A página foi eliminada depois de obter a data e hora da mesma.", + "apierror-pagelang-disabled": "Nesta wiki não é permitido alterar a língua de uma página.", + "apierror-paramempty": "O parâmetro $1 não pode estar vazio.", + "apierror-parsetree-notwikitext": "prop=parsetree só é suportado para conteúdo em texto wiki.", + "apierror-parsetree-notwikitext-title": "prop=parsetree só é suportado para conteúdo em texto wiki. A página $1 usa o modelo de conteúdo $2.", + "apierror-pastexpiry": "A data de expiração \"$1\" é uma data passada.", + "apierror-permissiondenied": "Não tem permissão para $1.", + "apierror-permissiondenied-generic": "Permissão negada.", + "apierror-permissiondenied-patrolflag": "Necessita ter a permissão patrol ou patrolmarks para solicitar a marca de patrulhado.", + "apierror-permissiondenied-unblock": "Não tem permissão para desbloquear utilizadores.", + "apierror-prefixsearchdisabled": "A pesquisa por prefixo está desativada no modo avarento.", + "apierror-promised-nonwrite-api": "O cabeçalho HTTP Promise-Non-Write-API-Action não pode ser enviado a módulos da API em modo de escrita.", + "apierror-protect-invalidaction": "O tipo de proteção \"$1\" é inválido.", + "apierror-protect-invalidlevel": "O nível de proteção \"$1\" é inválido.", + "apierror-ratelimited": "Excedeu a sua frequência limite de edições. Aguarde um pouco e tente novamente, por favor.", + "apierror-readapidenied": "Precisa de ter permissão de leitura para usar este módulo.", + "apierror-readonly": "A wiki está em modo exclusivo de leitura.", + "apierror-reauthenticate": "Não se autenticou recentemente nesta sessão. Volte a autenticar-se, por favor.", + "apierror-redirect-appendonly": "Tentou editar usando o modo de seguimento de redirecionamentos, que só pode ser usado em conjunto com section=new, prependtext, ou appendtext.", + "apierror-revdel-mutuallyexclusive": "Não pode usar o mesmo campo em hide e em show.", + "apierror-revdel-needtarget": "É necessário um título de destino para este tipo RevDel.", + "apierror-revdel-paramneeded": "É necessário pelo menos um valor para hide ou show.", + "apierror-revisions-badid": "Não foi encontrada nenhuma revisão para o parâmetro $1.", + "apierror-revisions-norevids": "O parâmetro revids não pode ser usado com as opções de listagem ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end).", + "apierror-revisions-singlepage": "Foi usado titles, pageids ou um gerador para fornecer diversas páginas, mas os parâmetros $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start e $1end só podem ser usados sobre uma única página.", + "apierror-revwrongpage": "r$1 não é uma revisão de $2.", + "apierror-searchdisabled": "A pesquisa $1 está desativada.", + "apierror-sectionreplacefailed": "Não foi possível combinar a secção atualizada.", + "apierror-sectionsnotsupported": "Secções não são suportadas pelo modelo de conteúdo $1.", + "apierror-sectionsnotsupported-what": "Secções não são suportadas por $1.", + "apierror-show": "Parâmetro incorreto - não podem ser fornecidos valores mutuamente exclusivos.", + "apierror-siteinfo-includealldenied": "Não é possível ver a informação de todos os servidores, a menos que $wgShowHostNames tenha o valor \"true\".", + "apierror-sizediffdisabled": "A diferença de tamanho está desativada no modo avarento.", + "apierror-spamdetected": "A sua edição foi recusada porque continha um fragmento de spam: $1.", + "apierror-specialpage-cantexecute": "Não tem permissão para ver os resultados desta página especial.", + "apierror-stashedfilenotfound": "O ficheiro não foi encontrado na área de ficheiros escondidos: $1.", + "apierror-stashedit-missingtext": "Não foi encontrado nenhum texto na área de ficheiros escondidos com a chave criptográfica fornecida.", + "apierror-stashfailed-complete": "O carregamento por segmentos já terminou. Para mais detalhes, verifique o estado.", + "apierror-stashfailed-nosession": "Não há nenhuma sessão de carregamento por segmentos com esta chave.", + "apierror-stashfilestorage": "Não foi possível armazenar na área de ficheiros escondidos o ficheiro enviado: $1.", + "apierror-stashinvalidfile": "Ficheiro escondido inválido.", + "apierror-stashnosuchfilekey": "A chave de ficheiro não existe: $1.", + "apierror-stashpathinvalid": "A chave de ficheiro tem um formato incorreto ou é inválida: $1.", + "apierror-stashwrongowner": "Proprietário incorreto: $1", + "apierror-stashzerolength": "O ficheiro tem comprimento zero e não foi possível armazená-lo na área de ficheiros escondidos: $1.", + "apierror-systemblocked": "Foi automaticamente bloqueado pelo MediaWiki.", + "apierror-templateexpansion-notwikitext": "A expansão de predefinições só é suportada para conteúdo em texto wiki. A página $1 usa o modelo de conteúdo $2.", + "apierror-timeout": "O servidor não respondeu no prazo esperado.", + "apierror-toofewexpiries": "{{PLURAL:$1|Foi fornecida $1 data e hora|Foram fornecidas $1 datas e horas}} de expiração quando {{PLURAL:$2|era necessária|eram necessárias}} $2.", + "apierror-unknownaction": "A operação especificada, $1, não é reconhecida.", + "apierror-unknownerror-editpage": "Erro EditPage desconhecido: $1.", + "apierror-unknownerror-nocode": "Erro desconhecido.", + "apierror-unknownerror": "Erro desconhecido: \"$1\".", + "apierror-unknownformat": "Formato não reconhecido \"$1\".", + "apierror-unrecognizedparams": "{{PLURAL:$2|Parâmetro não reconhecido|Parâmetros não reconhecidos}}: $1.", + "apierror-unrecognizedvalue": "Valor não reconhecido para o parâmetro $1: $2.", + "apierror-unsupportedrepo": "O repositório de ficheiros local não suporta consultas sobre todas as imagens.", + "apierror-upload-filekeyneeded": "Tem de ser fornecida uma filekey quando o offset é diferente de zero.", + "apierror-upload-filekeynotallowed": "Não pode ser fornecida uma filekey quando o offset é 0.", + "apierror-upload-inprogress": "O carregamento a partir da área de ficheiros escondidos já está em progresso.", + "apierror-upload-missingresult": "Não há nenhum resultado nos dados de estado.", + "apierror-urlparamnormal": "Não foi possível normalizar os parâmetros de imagem para $1.", + "apierror-writeapidenied": "Não lhe é permitido editar esta wiki através da API.", + "apiwarn-alldeletedrevisions-performance": "Para obter um desempenho melhor ao gerar títulos, defina $1dir=newer.", + "apiwarn-badurlparam": "Não foi possível analisar $1urlparam para $2. Serão utilizadas somente a largura e a altura.", + "apiwarn-badutf8": "O valor passado para $1 contém dados inválidos ou não normalizados. Os dados textuais devem estar em formato Unicode válido, normalizado em NFC, sem caracteres de controlo C0 exceto HT (\\t), LF (\\n) e CR (\\r).", + "apiwarn-checktoken-percentencoding": "Verifique que símbolos como \"+\" na chave estão devidamente codificados com percentagem no URL.", + "apiwarn-compare-nocontentmodel": "Não foi possível determinar nenhum modelo de conteúdo; será assumido $1.", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs foi descontinuado. Em substituição, use prop=deletedrevisions ou list=alldeletedrevisions, por favor.", + "apiwarn-deprecation-expandtemplates-prop": "Dado que não foi especificado nenhum valor para o parâmetro prop foi usado um formato antigo para o resultado. Esse formato está descontinuado e, de futuro, será definido um valor por omissão para o parâmetro prop, de forma que seja sempre usado um formato novo.", + "apiwarn-deprecation-httpsexpected": "Foi usado HTTP quando era esperado HTTPS.", + "apiwarn-deprecation-login-botpw": "O início de sessões com uma conta principal através de action=login foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para continuar a iniciar sessões com action=login, consulte [[Special:BotPasswords]]. Para continuar a iniciar sessões com a conta principal de forma segura, consulte action=clientlogin.", + "apiwarn-deprecation-login-nobotpw": "O início de sessões com uma conta principal através de action=login foi descontinuado e poderá deixar de funcionar sem aviso prévio. Para iniciar uma sessão de forma segura, consulte action=clientlogin.", + "apiwarn-deprecation-login-token": "A obtenção de uma chave através de action=login foi descontinuada. Em substituição, use action=query&meta=tokens&type=login.", + "apiwarn-deprecation-parameter": "O parâmetro $1 foi descontinuado.", + "apiwarn-deprecation-parse-headitems": "prop=headitems está obsoleto desde o MediaWiki 1.28. Use prop=headhtml ao criar novos documentos de HTML, ou prop=modules|jsconfigvars ao atualizar um documento no lado do cliente.", + "apiwarn-deprecation-purge-get": "O uso de action=purge através de um GET foi descontinuado. Em substituição, use um POST.", + "apiwarn-deprecation-withreplacement": "$1 foi descontinuado. Em substituição, use $2, por favor.", + "apiwarn-difftohidden": "Não foi possível criar uma lista das diferenças em relação à r$1: o conteúdo está ocultado.", + "apiwarn-errorprinterfailed": "A impressora de erros falhou. Será feita nova tentativa sem parâmetros.", + "apiwarn-errorprinterfailed-ex": "A impressora de erros falhou (será feita nova tentativa sem parâmetros): $1", + "apiwarn-invalidcategory": "\"$1\" não é uma categoria.", + "apiwarn-invalidtitle": "\"$1\" não é um título válido.", + "apiwarn-invalidxmlstylesheetext": "Uma folha de estilos deve ter a extensão .xsl.", + "apiwarn-invalidxmlstylesheet": "Foi especificada uma folha de estilos inválida ou inexistente.", + "apiwarn-invalidxmlstylesheetns": "A folha de estilos deveria estar no espaço nominal {{ns:MediaWiki}}.", + "apiwarn-moduleswithoutvars": "A propriedade modules foi definida mas jsconfigvars ou encodedjsconfigvars não o foram. Variáveis de configuração são necessárias para utilização correta de módulos.", + "apiwarn-notfile": "\"$1\" não é um ficheiro.", + "apiwarn-nothumb-noimagehandler": "Não foi possível criar a miniatura porque $1 não tem uma rotina associada de tratamento de imagens.", + "apiwarn-parse-nocontentmodel": "Não foi fornecido um title ou contentmodel, será assumido $1.", + "apiwarn-parse-titlewithouttext": "title foi usado sem text, e foram pedidas as propriedades da página analisada. Pretendia usar page em vez de title?", + "apiwarn-redirectsandrevids": "Resolução de redirecionamentos não pode ser usada em conjunto com o parâmetro revids. Quaisquer redirecionamentos para os quais revids aponta não foram resolvidos.", + "apiwarn-tokennotallowed": "A operação \"$1\" não é permitida para o utilizador atual.", + "apiwarn-tokens-origin": "Não é possível obter chaves quando a norma da mesma origem não é aplicada.", + "apiwarn-toomanyvalues": "Foram fornecidos demasiados valores para o parâmetro $1. O limite é $2.", + "apiwarn-truncatedresult": "Este resultado foi truncado porque ultrapassaria o limite de $1 bytes.", + "apiwarn-unclearnowtimestamp": "A passagem de \"$2\" no parâmetro de data e hora $1 foi tornada obsoleta. Se, por qualquer razão, precisa de especificar de forma explícita a hora atual sem a calcular no lado do cliente, use now.", + "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor não reconhecido|Valores não reconhecidos}} para o parâmetro $1: $2.", + "apiwarn-unsupportedarray": "O parâmetro $1 usa sintaxe PHP de matrizes não suportada.", + "apiwarn-urlparamwidth": "O valor da largura definido em $1urlparam ($2) foi ignorado em favor da largura obtida a partir de $1urlwidth/$1urlheight ($3).", + "apiwarn-validationfailed-badchars": "caracteres inválidos na chave (só são permitidos a-z, A-Z, 0-9, _, e -).", + "apiwarn-validationfailed-badpref": "não é uma preferência válida.", + "apiwarn-validationfailed-cannotset": "não pode ser definido por este módulo.", + "apiwarn-validationfailed-keytoolong": "chave demasiado longa (não pode ter mais de $1 bytes).", + "apiwarn-validationfailed": "Erro de validação de $1: $2", + "apiwarn-wgDebugAPI": "Aviso de segurança: $wgDebugAPI está ativado.", + "api-feed-error-title": "Erro ($1)", + "api-usage-docref": "Consulte $1 para a utilização da API.", + "api-usage-mailinglist-ref": "Subscreva a lista de distribuição mediawiki-api-announce em <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> para receber anúncios de descontinuação e de alterações disruptivas da API.", + "api-exception-trace": "$1 em $2($3)\n$4", "api-credits-header": "Créditos", "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\nPode enviar os seus comentários, sugestões e perguntas para o endereço mediawiki-api@lists.wikimedia.org, ou reportar quaisquer defeitos que encontre em https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json index cca3a3c6e6..4336c29349 100644 --- a/includes/api/i18n/qqq.json +++ b/includes/api/i18n/qqq.json @@ -16,7 +16,8 @@ "D41D8CD98F" ] }, - "apihelp-main-description": "{{doc-apihelp-description|main}}", + "apihelp-main-summary": "{{doc-apihelp-summary|main}}", + "apihelp-main-extended-description": "{{doc-apihelp-extended-description|main}}", "apihelp-main-param-action": "{{doc-apihelp-param|main|action}}", "apihelp-main-param-format": "{{doc-apihelp-param|main|format}}", "apihelp-main-param-maxlag": "{{doc-apihelp-param|main|maxlag}}", @@ -33,7 +34,7 @@ "apihelp-main-param-errorformat": "{{doc-apihelp-param|main|errorformat}}", "apihelp-main-param-errorlang": "{{doc-apihelp-param|main|errorlang}}", "apihelp-main-param-errorsuselocal": "{{doc-apihelp-param|main|errorsuselocal}}", - "apihelp-block-description": "{{doc-apihelp-description|block}}", + "apihelp-block-summary": "{{doc-apihelp-summary|block}}", "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}", "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}", "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}", @@ -49,27 +50,47 @@ "apihelp-block-param-tags": "{{doc-apihelp-param|block|tags}}", "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}", "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}", - "apihelp-changeauthenticationdata-description": "{{doc-apihelp-description|changeauthenticationdata}}", + "apihelp-changeauthenticationdata-summary": "{{doc-apihelp-summary|changeauthenticationdata}}", "apihelp-changeauthenticationdata-example-password": "{{doc-apihelp-example|changeauthenticationdata}}", - "apihelp-checktoken-description": "{{doc-apihelp-description|checktoken}}", + "apihelp-checktoken-summary": "{{doc-apihelp-summary|checktoken}}", "apihelp-checktoken-param-type": "{{doc-apihelp-param|checktoken|type}}", "apihelp-checktoken-param-token": "{{doc-apihelp-param|checktoken|token}}", "apihelp-checktoken-param-maxtokenage": "{{doc-apihelp-param|checktoken|maxtokenage}}", "apihelp-checktoken-example-simple": "{{doc-apihelp-example|checktoken}}", - "apihelp-clearhasmsg-description": "{{doc-apihelp-description|clearhasmsg}}", + "apihelp-clearhasmsg-summary": "{{doc-apihelp-summary|clearhasmsg}}", "apihelp-clearhasmsg-example-1": "{{doc-apihelp-example|clearhasmsg}}", - "apihelp-clientlogin-description": "{{doc-apihelp-description|clientlogin}}", + "apihelp-clientlogin-summary": "{{doc-apihelp-summary|clientlogin}}", "apihelp-clientlogin-example-login": "{{doc-apihelp-example|clientlogin}}", "apihelp-clientlogin-example-login2": "{{doc-apihelp-example|clientlogin}}", - "apihelp-compare-description": "{{doc-apihelp-description|compare}}", + "apihelp-compare-summary": "{{doc-apihelp-summary|compare}}", + "apihelp-compare-extended-description": "{{doc-apihelp-extended-description|compare}}", "apihelp-compare-param-fromtitle": "{{doc-apihelp-param|compare|fromtitle}}", "apihelp-compare-param-fromid": "{{doc-apihelp-param|compare|fromid}}", "apihelp-compare-param-fromrev": "{{doc-apihelp-param|compare|fromrev}}", + "apihelp-compare-param-fromtext": "{{doc-apihelp-param|compare|fromtext}}", + "apihelp-compare-param-frompst": "{{doc-apihelp-param|compare|frompst}}", + "apihelp-compare-param-fromcontentmodel": "{{doc-apihelp-param|compare|fromcontentmodel}}", + "apihelp-compare-param-fromcontentformat": "{{doc-apihelp-param|compare|fromcontentformat}}", "apihelp-compare-param-totitle": "{{doc-apihelp-param|compare|totitle}}", "apihelp-compare-param-toid": "{{doc-apihelp-param|compare|toid}}", "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}", + "apihelp-compare-param-torelative": "{{doc-apihelp-param|compare|torelative}}", + "apihelp-compare-param-totext": "{{doc-apihelp-param|compare|totext}}", + "apihelp-compare-param-topst": "{{doc-apihelp-param|compare|topst}}", + "apihelp-compare-param-tocontentmodel": "{{doc-apihelp-param|compare|tocontentmodel}}", + "apihelp-compare-param-tocontentformat": "{{doc-apihelp-param|compare|tocontentformat}}", + "apihelp-compare-param-prop": "{{doc-apihelp-param|compare|prop}}", + "apihelp-compare-paramvalue-prop-diff": "{{doc-apihelp-paramvalue|compare|prop|diff}}", + "apihelp-compare-paramvalue-prop-diffsize": "{{doc-apihelp-paramvalue|compare|prop|diffsize}}", + "apihelp-compare-paramvalue-prop-rel": "{{doc-apihelp-paramvalue|compare|prop|rel}}", + "apihelp-compare-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|compare|prop|ids}}", + "apihelp-compare-paramvalue-prop-title": "{{doc-apihelp-paramvalue|compare|prop|title}}", + "apihelp-compare-paramvalue-prop-user": "{{doc-apihelp-paramvalue|compare|prop|user}}", + "apihelp-compare-paramvalue-prop-comment": "{{doc-apihelp-paramvalue|compare|prop|comment}}", + "apihelp-compare-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|compare|prop|parsedcomment}}", + "apihelp-compare-paramvalue-prop-size": "{{doc-apihelp-paramvalue|compare|prop|size}}", "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}", - "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}", + "apihelp-createaccount-summary": "{{doc-apihelp-summary|createaccount}}", "apihelp-createaccount-param-preservestate": "{{doc-apihelp-param|createaccount|preservestate|info=This message is displayed in addition to {{msg-mw|api-help-authmanagerhelper-preservestate}}.}}", "apihelp-createaccount-example-create": "{{doc-apihelp-example|createaccount}}", "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}\n{{Identical|Username}}", @@ -83,10 +104,10 @@ "apihelp-createaccount-param-language": "{{doc-apihelp-param|createaccount|language}}", "apihelp-createaccount-example-pass": "{{doc-apihelp-example|createaccount}}", "apihelp-createaccount-example-mail": "{{doc-apihelp-example|createaccount}}", - "apihelp-cspreport-description": "{{doc-apihelp-description|cspreport}}", + "apihelp-cspreport-summary": "{{doc-apihelp-summary|cspreport}}", "apihelp-cspreport-param-reportonly": "{{doc-apihelp-param|cspreport|reportonly}}", "apihelp-cspreport-param-source": "{{doc-apihelp-param|cspreport|source}}", - "apihelp-delete-description": "{{doc-apihelp-description|delete}}", + "apihelp-delete-summary": "{{doc-apihelp-summary|delete}}", "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}", "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}", "apihelp-delete-param-reason": "{{doc-apihelp-param|delete|reason}}", @@ -97,8 +118,8 @@ "apihelp-delete-param-oldimage": "{{doc-apihelp-param|delete|oldimage}}", "apihelp-delete-example-simple": "{{doc-apihelp-example|delete}}", "apihelp-delete-example-reason": "{{doc-apihelp-example|delete}}", - "apihelp-disabled-description": "{{doc-apihelp-description|disabled}}", - "apihelp-edit-description": "{{doc-apihelp-description|edit}}", + "apihelp-disabled-summary": "{{doc-apihelp-summary|disabled}}", + "apihelp-edit-summary": "{{doc-apihelp-summary|edit}}", "apihelp-edit-param-title": "{{doc-apihelp-param|edit|title}}", "apihelp-edit-param-pageid": "{{doc-apihelp-param|edit|pageid}}", "apihelp-edit-param-section": "{{doc-apihelp-param|edit|section}}", @@ -129,13 +150,13 @@ "apihelp-edit-example-edit": "{{doc-apihelp-example|edit}}", "apihelp-edit-example-prepend": "{{doc-apihelp-example|edit}}", "apihelp-edit-example-undo": "{{doc-apihelp-example|edit}}", - "apihelp-emailuser-description": "{{doc-apihelp-description|emailuser}}", + "apihelp-emailuser-summary": "{{doc-apihelp-summary|emailuser}}", "apihelp-emailuser-param-target": "{{doc-apihelp-param|emailuser|target}}", "apihelp-emailuser-param-subject": "{{doc-apihelp-param|emailuser|subject}}", "apihelp-emailuser-param-text": "{{doc-apihelp-param|emailuser|text}}", "apihelp-emailuser-param-ccme": "{{doc-apihelp-param|emailuser|ccme}}", "apihelp-emailuser-example-email": "{{doc-apihelp-example|emailuser}}", - "apihelp-expandtemplates-description": "{{doc-apihelp-description|expandtemplates}}", + "apihelp-expandtemplates-summary": "{{doc-apihelp-summary|expandtemplates}}", "apihelp-expandtemplates-param-title": "{{doc-apihelp-param|expandtemplates|title}}", "apihelp-expandtemplates-param-text": "{{doc-apihelp-param|expandtemplates|text}}", "apihelp-expandtemplates-param-revid": "{{doc-apihelp-param|expandtemplates|revid}}\n{{doc-important|Do not translate <nowiki>{{REVISIONID}}</nowiki>}}", @@ -152,7 +173,7 @@ "apihelp-expandtemplates-param-includecomments": "{{doc-apihelp-param|expandtemplates|includecomments}}", "apihelp-expandtemplates-param-generatexml": "{{doc-apihelp-param|expandtemplates|generatexml}}", "apihelp-expandtemplates-example-simple": "{{doc-apihelp-example|expandtemplates}}", - "apihelp-feedcontributions-description": "{{doc-apihelp-description|feedcontributions}}", + "apihelp-feedcontributions-summary": "{{doc-apihelp-summary|feedcontributions}}", "apihelp-feedcontributions-param-feedformat": "{{doc-apihelp-param|feedcontributions|feedformat}}", "apihelp-feedcontributions-param-user": "{{doc-apihelp-param|feedcontributions|user}}", "apihelp-feedcontributions-param-namespace": "{{doc-apihelp-param|feedcontributions|namespace}}", @@ -165,7 +186,7 @@ "apihelp-feedcontributions-param-hideminor": "{{doc-apihelp-param|feedcontributions|hideminor}}", "apihelp-feedcontributions-param-showsizediff": "{{doc-apihelp-param|feedcontributions|showsizediff}}", "apihelp-feedcontributions-example-simple": "{{doc-apihelp-example|feedcontributions}}", - "apihelp-feedrecentchanges-description": "{{doc-apihelp-description|feedrecentchanges}}", + "apihelp-feedrecentchanges-summary": "{{doc-apihelp-summary|feedrecentchanges}}", "apihelp-feedrecentchanges-param-feedformat": "{{doc-apihelp-param|feedrecentchanges|feedformat}}", "apihelp-feedrecentchanges-param-namespace": "{{doc-apihelp-param|feedrecentchanges|namespace}}", "apihelp-feedrecentchanges-param-invert": "{{doc-apihelp-param|feedrecentchanges|invert}}", @@ -187,18 +208,18 @@ "apihelp-feedrecentchanges-param-categories_any": "{{doc-apihelp-param|feedrecentchanges|categories_any}}", "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}", "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}", - "apihelp-feedwatchlist-description": "{{doc-apihelp-description|feedwatchlist}}", + "apihelp-feedwatchlist-summary": "{{doc-apihelp-summary|feedwatchlist}}", "apihelp-feedwatchlist-param-feedformat": "{{doc-apihelp-param|feedwatchlist|feedformat}}", "apihelp-feedwatchlist-param-hours": "{{doc-apihelp-param|feedwatchlist|hours}}", "apihelp-feedwatchlist-param-linktosections": "{{doc-apihelp-param|feedwatchlist|linktosections}}", "apihelp-feedwatchlist-example-default": "{{doc-apihelp-example|feedwatchlist}}", "apihelp-feedwatchlist-example-all6hrs": "{{doc-apihelp-example|feedwatchlist}}", - "apihelp-filerevert-description": "{{doc-apihelp-description|filerevert}}", + "apihelp-filerevert-summary": "{{doc-apihelp-summary|filerevert}}", "apihelp-filerevert-param-filename": "{{doc-apihelp-param|filerevert|filename}}", "apihelp-filerevert-param-comment": "Translate as \"a comment about the upload\".\n\n{{doc-apihelp-param|filerevert|comment}}", "apihelp-filerevert-param-archivename": "{{doc-apihelp-param|filerevert|archivename}}", "apihelp-filerevert-example-revert": "{{doc-apihelp-example|filerevert}}", - "apihelp-help-description": "{{doc-apihelp-description|help}}", + "apihelp-help-summary": "{{doc-apihelp-summary|help}}", "apihelp-help-param-modules": "{{doc-apihelp-param|help|modules}}", "apihelp-help-param-submodules": "{{doc-apihelp-param|help|submodules}}", "apihelp-help-param-recursivesubmodules": "{{doc-apihelp-param|help|recursivesubmodules}}", @@ -210,12 +231,13 @@ "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}", "apihelp-help-example-help": "{{doc-apihelp-example|help}}", "apihelp-help-example-query": "{{doc-apihelp-example|help}}", - "apihelp-imagerotate-description": "{{doc-apihelp-description|imagerotate}}", + "apihelp-imagerotate-summary": "{{doc-apihelp-summary|imagerotate}}", "apihelp-imagerotate-param-rotation": "{{doc-apihelp-param|imagerotate|rotation}}", "apihelp-imagerotate-param-tags": "{{doc-apihelp-param|imagerotate|tags}}", "apihelp-imagerotate-example-simple": "{{doc-apihelp-example|imagerotate}}", "apihelp-imagerotate-example-generator": "{{doc-apihelp-example|imagerotate}}", - "apihelp-import-description": "{{doc-apihelp-description|import}}", + "apihelp-import-summary": "{{doc-apihelp-summary|import}}", + "apihelp-import-extended-description": "{{doc-apihelp-extended-description|import}}", "apihelp-import-param-summary": "{{doc-apihelp-param|import|summary|info=The parameter being documented here provides the summary used on the log messages about the import. The phrase \"Import summary\" here is grammatically equivalent to a phrase such as \"science book\", not \"eat food\".}}", "apihelp-import-param-xml": "{{doc-apihelp-param|import|xml}}", "apihelp-import-param-interwikisource": "{{doc-apihelp-param|import|interwikisource}}", @@ -226,19 +248,20 @@ "apihelp-import-param-rootpage": "{{doc-apihelp-param|import|rootpage}}", "apihelp-import-param-tags": "{{doc-apihelp-param|import|tags}}", "apihelp-import-example-import": "{{doc-apihelp-example|import}}", - "apihelp-linkaccount-description": "{{doc-apihelp-description|linkaccount}}", + "apihelp-linkaccount-summary": "{{doc-apihelp-summary|linkaccount}}", "apihelp-linkaccount-example-link": "{{doc-apihelp-example|linkaccount}}", - "apihelp-login-description": "{{doc-apihelp-description|login|info=This message is used when $wgEnableBotPasswords is true.|seealso=* {{msg-mw|apihelp-login-description-nobotpasswords}}}}", - "apihelp-login-description-nobotpasswords": "{{doc-apihelp-description|login|info=This message is used when $wgEnableBotPasswords is false.|seealso=* {{msg-mw|apihelp-login-description}}}}", + "apihelp-login-summary": "{{doc-apihelp-summary|login}}", + "apihelp-login-extended-description": "{{doc-apihelp-extended-description|login|info=This message is used when $wgEnableBotPasswords is true.|seealso=* {{msg-mw|apihelp-login-extended-description-nobotpasswords}}}}", + "apihelp-login-extended-description-nobotpasswords": "{{doc-apihelp-extended-description|login|info=This message is used when $wgEnableBotPasswords is false.|seealso=* {{msg-mw|apihelp-login-extended-description}}}}", "apihelp-login-param-name": "{{doc-apihelp-param|login|name}}\n{{Identical|Username}}", "apihelp-login-param-password": "{{doc-apihelp-param|login|password}}\n{{Identical|Password}}", "apihelp-login-param-domain": "{{doc-apihelp-param|login|domain}}", "apihelp-login-param-token": "{{doc-apihelp-param|login|token}}", "apihelp-login-example-gettoken": "{{doc-apihelp-example|login}}", "apihelp-login-example-login": "{{doc-apihelp-example|login}}\n{{Identical|Log in}}", - "apihelp-logout-description": "{{doc-apihelp-description|logout}}", + "apihelp-logout-summary": "{{doc-apihelp-summary|logout}}", "apihelp-logout-example-logout": "{{doc-apihelp-example|logout}}", - "apihelp-managetags-description": "{{doc-apihelp-description|managetags}}", + "apihelp-managetags-summary": "{{doc-apihelp-summary|managetags}}", "apihelp-managetags-param-operation": "{{doc-apihelp-param|managetags|operation}}", "apihelp-managetags-param-tag": "{{doc-apihelp-param|managetags|tag}}", "apihelp-managetags-param-reason": "{{doc-apihelp-param|managetags|reason}}", @@ -248,7 +271,7 @@ "apihelp-managetags-example-delete": "{{doc-apihelp-example|managetags|info={{doc-important|The text \"vandlaism\" in this message is intentionally misspelled; the example being documented by this message is the deletion of a misspelled tag.}}}}", "apihelp-managetags-example-activate": "{{doc-apihelp-example|managetags}}", "apihelp-managetags-example-deactivate": "{{doc-apihelp-example|managetags}}", - "apihelp-mergehistory-description": "{{doc-apihelp-description|mergehistory}}", + "apihelp-mergehistory-summary": "{{doc-apihelp-summary|mergehistory}}", "apihelp-mergehistory-param-from": "{{doc-apihelp-param|mergehistory|from}}", "apihelp-mergehistory-param-fromid": "{{doc-apihelp-param|mergehistory|fromid}}", "apihelp-mergehistory-param-to": "{{doc-apihelp-param|mergehistory|to}}", @@ -257,7 +280,7 @@ "apihelp-mergehistory-param-reason": "{{doc-apihelp-param|mergehistory|reason}}", "apihelp-mergehistory-example-merge": "{{doc-apihelp-example|mergehistory}}", "apihelp-mergehistory-example-merge-timestamp": "{{doc-apihelp-example|mergehistory}}", - "apihelp-move-description": "{{doc-apihelp-description|move}}", + "apihelp-move-summary": "{{doc-apihelp-summary|move}}", "apihelp-move-param-from": "{{doc-apihelp-param|move|from}}", "apihelp-move-param-fromid": "{{doc-apihelp-param|move|fromid}}", "apihelp-move-param-to": "{{doc-apihelp-param|move|to}}", @@ -271,7 +294,7 @@ "apihelp-move-param-ignorewarnings": "{{doc-apihelp-param|move|ignorewarnings}}", "apihelp-move-param-tags": "{{doc-apihelp-param|move|tags}}", "apihelp-move-example-move": "{{doc-apihelp-example|move}}", - "apihelp-opensearch-description": "{{doc-apihelp-description|opensearch}}", + "apihelp-opensearch-summary": "{{doc-apihelp-summary|opensearch}}", "apihelp-opensearch-param-search": "{{doc-apihelp-param|opensearch|search}}", "apihelp-opensearch-param-limit": "{{doc-apihelp-param|opensearch|limit}}", "apihelp-opensearch-param-namespace": "{{doc-apihelp-param|opensearch|namespace}}", @@ -280,7 +303,8 @@ "apihelp-opensearch-param-format": "{{doc-apihelp-param|opensearch|format}}", "apihelp-opensearch-param-warningsaserror": "{{doc-apihelp-param|opensearch|warningsaserror}}", "apihelp-opensearch-example-te": "{{doc-apihelp-example|opensearch}}", - "apihelp-options-description": "{{doc-apihelp-description|options}}", + "apihelp-options-summary": "{{doc-apihelp-summary|options}}", + "apihelp-options-extended-description": "{{doc-apihelp-extended-description|options}}", "apihelp-options-param-reset": "{{doc-apihelp-param|options|reset}}", "apihelp-options-param-resetkinds": "{{doc-apihelp-param|options|resetkinds}}", "apihelp-options-param-change": "{{doc-apihelp-param|options|change}}", @@ -289,7 +313,7 @@ "apihelp-options-example-reset": "{{doc-apihelp-example|options}}", "apihelp-options-example-change": "{{doc-apihelp-example|options}}", "apihelp-options-example-complex": "{{doc-apihelp-example|options}}", - "apihelp-paraminfo-description": "{{doc-apihelp-description|paraminfo}}", + "apihelp-paraminfo-summary": "{{doc-apihelp-summary|paraminfo}}", "apihelp-paraminfo-param-modules": "{{doc-apihelp-param|paraminfo|modules}}", "apihelp-paraminfo-param-helpformat": "{{doc-apihelp-param|paraminfo|helpformat}}", "apihelp-paraminfo-param-querymodules": "{{doc-apihelp-param|paraminfo|querymodules}}", @@ -298,7 +322,8 @@ "apihelp-paraminfo-param-formatmodules": "{{doc-apihelp-param|paraminfo|formatmodules}}", "apihelp-paraminfo-example-1": "{{doc-apihelp-example|paraminfo}}", "apihelp-paraminfo-example-2": "{{doc-apihelp-example|paraminfo}}", - "apihelp-parse-description": "{{doc-apihelp-description|parse}}", + "apihelp-parse-summary": "{{doc-apihelp-summary|parse}}", + "apihelp-parse-extended-description": "{{doc-apihelp-extended-description|parse}}", "apihelp-parse-param-title": "{{doc-apihelp-param|parse|title}}", "apihelp-parse-param-text": "{{doc-apihelp-param|parse|text}}", "apihelp-parse-param-summary": "{{doc-apihelp-param|parse|summary}}", @@ -330,6 +355,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "{{doc-apihelp-paramvalue|parse|prop|limitreportdata}}", "apihelp-parse-paramvalue-prop-limitreporthtml": "{{doc-apihelp-paramvalue|parse|prop|limitreporthtml}}", "apihelp-parse-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|parse|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}", + "apihelp-parse-paramvalue-prop-parsewarnings": "{{doc-apihelp-paramvalue|parse|prop|parsewarnings}}", + "apihelp-parse-param-wrapoutputclass": "{{doc-apihelp-param|parse|wrapoutputclass}}", "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}", "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}", "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}", @@ -343,19 +370,20 @@ "apihelp-parse-param-preview": "{{doc-apihelp-param|parse|preview}}", "apihelp-parse-param-sectionpreview": "{{doc-apihelp-param|parse|sectionpreview}}", "apihelp-parse-param-disabletoc": "{{doc-apihelp-param|parse|disabletoc}}", + "apihelp-parse-param-useskin": "{{doc-apihelp-param|parse|useskin}}", "apihelp-parse-param-contentformat": "{{doc-apihelp-param|parse|contentformat}}", "apihelp-parse-param-contentmodel": "{{doc-apihelp-param|parse|contentmodel}}", "apihelp-parse-example-page": "{{doc-apihelp-example|parse}}", "apihelp-parse-example-text": "{{doc-apihelp-example|parse}}", "apihelp-parse-example-texttitle": "{{doc-apihelp-example|parse}}", "apihelp-parse-example-summary": "{{doc-apihelp-example|parse}}", - "apihelp-patrol-description": "{{doc-apihelp-description|patrol}}", + "apihelp-patrol-summary": "{{doc-apihelp-summary|patrol}}", "apihelp-patrol-param-rcid": "{{doc-apihelp-param|patrol|rcid}}", "apihelp-patrol-param-revid": "{{doc-apihelp-param|patrol|revid}}", "apihelp-patrol-param-tags": "{{doc-apihelp-param|patrol|tags}}", "apihelp-patrol-example-rcid": "{{doc-apihelp-example|patrol}}", "apihelp-patrol-example-revid": "{{doc-apihelp-example|patrol}}", - "apihelp-protect-description": "{{doc-apihelp-description|protect}}", + "apihelp-protect-summary": "{{doc-apihelp-summary|protect}}", "apihelp-protect-param-title": "{{doc-apihelp-param|protect|title}}", "apihelp-protect-param-pageid": "{{doc-apihelp-param|protect|pageid}}", "apihelp-protect-param-protections": "{{doc-apihelp-param|protect|protections}}", @@ -368,12 +396,13 @@ "apihelp-protect-example-protect": "{{doc-apihelp-example|protect}}", "apihelp-protect-example-unprotect": "{{doc-apihelp-example|protect}}", "apihelp-protect-example-unprotect2": "{{doc-apihelp-example|protect}}", - "apihelp-purge-description": "{{doc-apihelp-description|purge}}", + "apihelp-purge-summary": "{{doc-apihelp-summary|purge}}", "apihelp-purge-param-forcelinkupdate": "{{doc-apihelp-param|purge|forcelinkupdate}}", "apihelp-purge-param-forcerecursivelinkupdate": "{{doc-apihelp-param|purge|forcerecursivelinkupdate}}", "apihelp-purge-example-simple": "{{doc-apihelp-example|purge}}", "apihelp-purge-example-generator": "{{doc-apihelp-example|purge}}", - "apihelp-query-description": "{{doc-apihelp-description|query}}", + "apihelp-query-summary": "{{doc-apihelp-summary|query}}", + "apihelp-query-extended-description": "{{doc-apihelp-extended-description|query}}", "apihelp-query-param-prop": "{{doc-apihelp-param|query|prop}}", "apihelp-query-param-list": "{{doc-apihelp-param|query|list}}", "apihelp-query-param-meta": "{{doc-apihelp-param|query|meta}}", @@ -384,7 +413,7 @@ "apihelp-query-param-rawcontinue": "{{doc-apihelp-param|query|rawcontinue}}", "apihelp-query-example-revisions": "{{doc-apihelp-example|query}}", "apihelp-query-example-allpages": "{{doc-apihelp-example|query}}", - "apihelp-query+allcategories-description": "{{doc-apihelp-description|query+allcategories}}", + "apihelp-query+allcategories-summary": "{{doc-apihelp-summary|query+allcategories}}", "apihelp-query+allcategories-param-from": "{{doc-apihelp-param|query+allcategories|from}}", "apihelp-query+allcategories-param-to": "{{doc-apihelp-param|query+allcategories|to}}", "apihelp-query+allcategories-param-prefix": "{{doc-apihelp-param|query+allcategories|prefix}}", @@ -397,7 +426,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "{{doc-apihelp-paramvalue|query+allcategories|prop|hidden}}", "apihelp-query+allcategories-example-size": "{{doc-apihelp-example|query+allcategories}}", "apihelp-query+allcategories-example-generator": "{{doc-apihelp-example|query+allcategories}}", - "apihelp-query+alldeletedrevisions-description": "{{doc-apihelp-description|query+alldeletedrevisions}}", + "apihelp-query+alldeletedrevisions-summary": "{{doc-apihelp-summary|query+alldeletedrevisions}}", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "{{doc-apihelp-paraminfo|query+alldeletedrevisions|useronly}}", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "{{doc-apihelp-paraminfo|query+alldeletedrevisions|nonuseronly}}", "apihelp-query+alldeletedrevisions-param-start": "{{doc-apihelp-param|query+alldeletedrevisions|start}}", @@ -413,7 +442,7 @@ "apihelp-query+alldeletedrevisions-param-generatetitles": "{{doc-apihelp-param|query+alldeletedrevisions|generatetitles}}", "apihelp-query+alldeletedrevisions-example-user": "{{doc-apihelp-example|query+alldeletedrevisions}}", "apihelp-query+alldeletedrevisions-example-ns-main": "{{doc-apihelp-example|query+alldeletedrevisions}}", - "apihelp-query+allfileusages-description": "{{doc-apihelp-description|query+allfileusages}}", + "apihelp-query+allfileusages-summary": "{{doc-apihelp-summary|query+allfileusages}}", "apihelp-query+allfileusages-param-from": "{{doc-apihelp-param|query+allfileusages|from}}", "apihelp-query+allfileusages-param-to": "{{doc-apihelp-param|query+allfileusages|to}}", "apihelp-query+allfileusages-param-prefix": "{{doc-apihelp-param|query+allfileusages|prefix}}", @@ -427,7 +456,7 @@ "apihelp-query+allfileusages-example-unique": "{{doc-apihelp-example|query+allfileusages}}", "apihelp-query+allfileusages-example-unique-generator": "{{doc-apihelp-example|query+allfileusages}}", "apihelp-query+allfileusages-example-generator": "{{doc-apihelp-example|query+allfileusages}}", - "apihelp-query+allimages-description": "{{doc-apihelp-description|query+allimages}}", + "apihelp-query+allimages-summary": "{{doc-apihelp-summary|query+allimages}}", "apihelp-query+allimages-param-sort": "{{doc-apihelp-param|query+allimages|sort}}", "apihelp-query+allimages-param-dir": "{{doc-apihelp-param|query+allimages|dir}}", "apihelp-query+allimages-param-from": "{{doc-apihelp-param|query+allimages|from}}", @@ -447,7 +476,7 @@ "apihelp-query+allimages-example-recent": "{{doc-apihelp-example|query+allimages}}", "apihelp-query+allimages-example-mimetypes": "{{doc-apihelp-example|query+allimages}}", "apihelp-query+allimages-example-generator": "{{doc-apihelp-example|query+allimages}}", - "apihelp-query+alllinks-description": "{{doc-apihelp-description|query+alllinks}}", + "apihelp-query+alllinks-summary": "{{doc-apihelp-summary|query+alllinks}}", "apihelp-query+alllinks-param-from": "{{doc-apihelp-param|query+alllinks|from}}", "apihelp-query+alllinks-param-to": "{{doc-apihelp-param|query+alllinks|to}}", "apihelp-query+alllinks-param-prefix": "{{doc-apihelp-param|query+alllinks|prefix}}", @@ -462,7 +491,7 @@ "apihelp-query+alllinks-example-unique": "{{doc-apihelp-example|query+alllinks}}", "apihelp-query+alllinks-example-unique-generator": "{{doc-apihelp-example|query+alllinks}}", "apihelp-query+alllinks-example-generator": "{{doc-apihelp-example|query+alllinks}}", - "apihelp-query+allmessages-description": "{{doc-apihelp-description|query+allmessages}}", + "apihelp-query+allmessages-summary": "{{doc-apihelp-summary|query+allmessages}}", "apihelp-query+allmessages-param-messages": "{{doc-apihelp-param|query+allmessages|messages}}", "apihelp-query+allmessages-param-prop": "{{doc-apihelp-param|query+allmessages|prop}}", "apihelp-query+allmessages-param-enableparser": "{{doc-apihelp-param|query+allmessages|enableparser}}", @@ -478,7 +507,7 @@ "apihelp-query+allmessages-param-prefix": "{{doc-apihelp-param|query+allmessages|prefix}}", "apihelp-query+allmessages-example-ipb": "{{doc-apihelp-example|query+allmessages}}", "apihelp-query+allmessages-example-de": "{{doc-apihelp-example|query+allmessages}}", - "apihelp-query+allpages-description": "{{doc-apihelp-description|query+allpages}}", + "apihelp-query+allpages-summary": "{{doc-apihelp-summary|query+allpages}}", "apihelp-query+allpages-param-from": "{{doc-apihelp-param|query+allpages|from}}", "apihelp-query+allpages-param-to": "{{doc-apihelp-param|query+allpages|to}}", "apihelp-query+allpages-param-prefix": "{{doc-apihelp-param|query+allpages|prefix}}", @@ -496,7 +525,7 @@ "apihelp-query+allpages-example-B": "{{doc-apihelp-example|query+allpages}}", "apihelp-query+allpages-example-generator": "{{doc-apihelp-example|query+allpages}}", "apihelp-query+allpages-example-generator-revisions": "{{doc-apihelp-example|query+allpages}}", - "apihelp-query+allredirects-description": "{{doc-apihelp-description|query+allredirects}}", + "apihelp-query+allredirects-summary": "{{doc-apihelp-summary|query+allredirects}}", "apihelp-query+allredirects-param-from": "{{doc-apihelp-param|query+allredirects|from}}", "apihelp-query+allredirects-param-to": "{{doc-apihelp-param|query+allredirects|to}}", "apihelp-query+allredirects-param-prefix": "{{doc-apihelp-param|query+allredirects|prefix}}", @@ -513,7 +542,7 @@ "apihelp-query+allredirects-example-unique": "{{doc-apihelp-example|query+allredirects}}", "apihelp-query+allredirects-example-unique-generator": "{{doc-apihelp-example|query+allredirects}}", "apihelp-query+allredirects-example-generator": "{{doc-apihelp-example|query+allredirects}}", - "apihelp-query+allrevisions-description": "{{doc-apihelp-description|query+allrevisions}}", + "apihelp-query+allrevisions-summary": "{{doc-apihelp-summary|query+allrevisions}}", "apihelp-query+allrevisions-param-start": "{{doc-apihelp-param|query+allrevisions|start}}", "apihelp-query+allrevisions-param-end": "{{doc-apihelp-param|query+allrevisions|end}}", "apihelp-query+allrevisions-param-user": "{{doc-apihelp-param|query+allrevisions|user}}", @@ -522,13 +551,13 @@ "apihelp-query+allrevisions-param-generatetitles": "{{doc-apihelp-param|query+allrevisions|generatetitles}}", "apihelp-query+allrevisions-example-user": "{{doc-apihelp-example|query+allrevisions}}", "apihelp-query+allrevisions-example-ns-main": "{{doc-apihelp-example|query+allrevisions}}", - "apihelp-query+mystashedfiles-description": "{{doc-apihelp-description|query+mystashedfiles}}", + "apihelp-query+mystashedfiles-summary": "{{doc-apihelp-summary|query+mystashedfiles}}", "apihelp-query+mystashedfiles-param-prop": "{{doc-apihelp-param|query+mystashedfiles|prop|paramvalues=1}}", "apihelp-query+mystashedfiles-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+mystashedfiles|prop|size}}", "apihelp-query+mystashedfiles-paramvalue-prop-type": "{{doc-apihelp-paramvalue|query+mystashedfiles|prop|type}}", "apihelp-query+mystashedfiles-param-limit": "{{doc-apihelp-param|query+mystashedfiles|limit}}", "apihelp-query+mystashedfiles-example-simple": "{{doc-apihelp-example|query+mystashedfiles}}", - "apihelp-query+alltransclusions-description": "{{doc-apihelp-description|query+alltransclusions}}", + "apihelp-query+alltransclusions-summary": "{{doc-apihelp-summary|query+alltransclusions}}", "apihelp-query+alltransclusions-param-from": "{{doc-apihelp-param|query+alltransclusions|from}}", "apihelp-query+alltransclusions-param-to": "{{doc-apihelp-param|query+alltransclusions|to}}", "apihelp-query+alltransclusions-param-prefix": "{{doc-apihelp-param|query+alltransclusions|prefix}}", @@ -543,7 +572,7 @@ "apihelp-query+alltransclusions-example-unique": "{{doc-apihelp-example|query+alltransclusions}}", "apihelp-query+alltransclusions-example-unique-generator": "{{doc-apihelp-example|query+alltransclusions}}", "apihelp-query+alltransclusions-example-generator": "{{doc-apihelp-example|query+alltransclusions}}", - "apihelp-query+allusers-description": "{{doc-apihelp-description|query+allusers}}", + "apihelp-query+allusers-summary": "{{doc-apihelp-summary|query+allusers}}", "apihelp-query+allusers-param-from": "{{doc-apihelp-param|query+allusers|from}}", "apihelp-query+allusers-param-to": "{{doc-apihelp-param|query+allusers|to}}", "apihelp-query+allusers-param-prefix": "{{doc-apihelp-param|query+allusers|prefix}}", @@ -564,13 +593,13 @@ "apihelp-query+allusers-param-activeusers": "{{doc-apihelp-param|query+allusers|activeusers|params=* $1 - Value of [[mw:Manual:$wgActiveUserDays]]|paramstart=2}}", "apihelp-query+allusers-param-attachedwiki": "{{doc-apihelp-param|query+allusers|attachedwiki}}", "apihelp-query+allusers-example-Y": "{{doc-apihelp-example|query+allusers}}", - "apihelp-query+authmanagerinfo-description": "{{doc-apihelp-description|query+authmanagerinfo}}", + "apihelp-query+authmanagerinfo-summary": "{{doc-apihelp-summary|query+authmanagerinfo}}", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "{{doc-apihelp-param|query+authmanagerinfo|securitysensitiveoperation}}", "apihelp-query+authmanagerinfo-param-requestsfor": "{{doc-apihelp-param|query+authmanagerinfo|requestsfor}}", "apihelp-query+authmanagerinfo-example-login": "{{doc-apihelp-example|query+authmanagerinfo}}", "apihelp-query+authmanagerinfo-example-login-merged": "{{doc-apihelp-example|query+authmanagerinfo}}", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "{{doc-apihelp-example|query+authmanagerinfo}}", - "apihelp-query+backlinks-description": "{{doc-apihelp-description|query+backlinks}}", + "apihelp-query+backlinks-summary": "{{doc-apihelp-summary|query+backlinks}}", "apihelp-query+backlinks-param-title": "{{doc-apihelp-param|query+backlinks|title}}", "apihelp-query+backlinks-param-pageid": "{{doc-apihelp-param|query+backlinks|pageid}}", "apihelp-query+backlinks-param-namespace": "{{doc-apihelp-param|query+backlinks|namespace}}", @@ -580,7 +609,7 @@ "apihelp-query+backlinks-param-redirect": "\"Is halved\" means that the limits are half of the usual ones.\n----\n{{doc-apihelp-param|query+backlinks|redirect}}", "apihelp-query+backlinks-example-simple": "{{doc-apihelp-example|query+backlinks}}", "apihelp-query+backlinks-example-generator": "{{doc-apihelp-example|query+backlinks}}", - "apihelp-query+blocks-description": "{{doc-apihelp-description|query+blocks}}", + "apihelp-query+blocks-summary": "{{doc-apihelp-summary|query+blocks}}", "apihelp-query+blocks-param-start": "{{doc-apihelp-param|query+blocks|start}}", "apihelp-query+blocks-param-end": "{{doc-apihelp-param|query+blocks|end}}", "apihelp-query+blocks-param-ids": "{{doc-apihelp-param|query+blocks|ids}}", @@ -601,7 +630,7 @@ "apihelp-query+blocks-param-show": "{{doc-apihelp-param|query+blocks|show}}", "apihelp-query+blocks-example-simple": "{{doc-apihelp-example|query+blocks}}", "apihelp-query+blocks-example-users": "{{doc-apihelp-example|query+blocks}}", - "apihelp-query+categories-description": "{{doc-apihelp-description|query+categories}}", + "apihelp-query+categories-summary": "{{doc-apihelp-summary|query+categories}}", "apihelp-query+categories-param-prop": "{{doc-apihelp-param|query+categories|prop|paramvalues=1}}", "apihelp-query+categories-paramvalue-prop-sortkey": "{{doc-apihelp-paramvalue|query+categories|prop|sortkey}}", "apihelp-query+categories-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+categories|prop|timestamp}}", @@ -612,9 +641,9 @@ "apihelp-query+categories-param-dir": "{{doc-apihelp-param|query+categories|dir}}", "apihelp-query+categories-example-simple": "{{doc-apihelp-example|query+categories}}", "apihelp-query+categories-example-generator": "{{doc-apihelp-example|query+categories}}", - "apihelp-query+categoryinfo-description": "{{doc-apihelp-description|query+categoryinfo}}", + "apihelp-query+categoryinfo-summary": "{{doc-apihelp-summary|query+categoryinfo}}", "apihelp-query+categoryinfo-example-simple": "{{doc-apihelp-example|query+categoryinfo}}", - "apihelp-query+categorymembers-description": "{{doc-apihelp-description|query+categorymembers}}", + "apihelp-query+categorymembers-summary": "{{doc-apihelp-summary|query+categorymembers}}", "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}", "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}", "apihelp-query+categorymembers-param-prop": "{{doc-apihelp-param|query+categorymembers|prop|paramvalues=1}}", @@ -639,14 +668,15 @@ "apihelp-query+categorymembers-param-endsortkey": "{{doc-apihelp-param|query+categorymembers|endsortkey}}", "apihelp-query+categorymembers-example-simple": "{{doc-apihelp-example|query+categorymembers}}", "apihelp-query+categorymembers-example-generator": "{{doc-apihelp-example|query+categorymembers}}", - "apihelp-query+contributors-description": "{{doc-apihelp-description|query+contributors}}", + "apihelp-query+contributors-summary": "{{doc-apihelp-summary|query+contributors}}", "apihelp-query+contributors-param-group": "{{doc-apihelp-param|query+contributors|group}}", "apihelp-query+contributors-param-excludegroup": "{{doc-apihelp-param|query+contributors|excludegroup}}", "apihelp-query+contributors-param-rights": "{{doc-apihelp-param|query+contributors|rights}}", "apihelp-query+contributors-param-excluderights": "{{doc-apihelp-param|query+contributors|excluderights}}", "apihelp-query+contributors-param-limit": "{{doc-apihelp-param|query+contributors|limit}}", "apihelp-query+contributors-example-simple": "{{doc-apihelp-example|query+contributors}}", - "apihelp-query+deletedrevisions-description": "{{doc-apihelp-description|query+deletedrevisions}}", + "apihelp-query+deletedrevisions-summary": "{{doc-apihelp-summary|query+deletedrevisions}}", + "apihelp-query+deletedrevisions-extended-description": "{{doc-apihelp-extended-description|query+deletedrevisions}}", "apihelp-query+deletedrevisions-param-start": "{{doc-apihelp-param|query+deletedrevisions|start}}", "apihelp-query+deletedrevisions-param-end": "{{doc-apihelp-param|query+deletedrevisions|end}}", "apihelp-query+deletedrevisions-param-tag": "{{doc-apihelp-param|query+deletedrevisions|tag}}", @@ -654,7 +684,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "{{doc-apihelp-param|query+deletedrevisions|excludeuser}}", "apihelp-query+deletedrevisions-example-titles": "{{doc-apihelp-example|query+deletedrevisions}}", "apihelp-query+deletedrevisions-example-revids": "{{doc-apihelp-example|query+deletedrevisions}}", - "apihelp-query+deletedrevs-description": "{{doc-apihelp-description|query+deletedrevs}}", + "apihelp-query+deletedrevs-summary": "{{doc-apihelp-summary|query+deletedrevs}}", + "apihelp-query+deletedrevs-extended-description": "{{doc-apihelp-extended-description|query+deletedrevs}}", "apihelp-query+deletedrevs-paraminfo-modes": "{{doc-apihelp-paraminfo|query+deletedrevs|modes}}\n{{Identical|Mode}}", "apihelp-query+deletedrevs-param-start": "{{doc-apihelp-param|query+deletedrevs|start}}", "apihelp-query+deletedrevs-param-end": "{{doc-apihelp-param|query+deletedrevs|end}}", @@ -672,14 +703,14 @@ "apihelp-query+deletedrevs-example-mode2": "{{doc-apihelp-example|query+deletedrevs}}", "apihelp-query+deletedrevs-example-mode3-main": "{{doc-apihelp-example|query+deletedrevs}}", "apihelp-query+deletedrevs-example-mode3-talk": "{{doc-apihelp-example|query+deletedrevs}}", - "apihelp-query+disabled-description": "{{doc-apihelp-description|query+disabled}}", - "apihelp-query+duplicatefiles-description": "{{doc-apihelp-description|query+duplicatefiles}}", + "apihelp-query+disabled-summary": "{{doc-apihelp-summary|query+disabled}}", + "apihelp-query+duplicatefiles-summary": "{{doc-apihelp-summary|query+duplicatefiles}}", "apihelp-query+duplicatefiles-param-limit": "{{doc-apihelp-param|query+duplicatefiles|limit}}", "apihelp-query+duplicatefiles-param-dir": "{{doc-apihelp-param|query+duplicatefiles|dir}}", "apihelp-query+duplicatefiles-param-localonly": "{{doc-apihelp-param|query+duplicatefiles|localonly}}", "apihelp-query+duplicatefiles-example-simple": "{{doc-apihelp-example|query+duplicatefiles}}", "apihelp-query+duplicatefiles-example-generated": "{{doc-apihelp-example|query+duplicatefiles}}", - "apihelp-query+embeddedin-description": "{{doc-apihelp-description|query+embeddedin}}", + "apihelp-query+embeddedin-summary": "{{doc-apihelp-summary|query+embeddedin}}", "apihelp-query+embeddedin-param-title": "{{doc-apihelp-param|query+embeddedin|title}}", "apihelp-query+embeddedin-param-pageid": "{{doc-apihelp-param|query+embeddedin|pageid}}", "apihelp-query+embeddedin-param-namespace": "{{doc-apihelp-param|query+embeddedin|namespace}}", @@ -688,13 +719,13 @@ "apihelp-query+embeddedin-param-limit": "{{doc-apihelp-param|query+embeddedin|limit}}", "apihelp-query+embeddedin-example-simple": "{{doc-apihelp-example|query+embeddedin}}", "apihelp-query+embeddedin-example-generator": "{{doc-apihelp-example|query+embeddedin}}", - "apihelp-query+extlinks-description": "{{doc-apihelp-description|query+extlinks}}", + "apihelp-query+extlinks-summary": "{{doc-apihelp-summary|query+extlinks}}", "apihelp-query+extlinks-param-limit": "{{doc-apihelp-param|query+extlinks|limit}}", "apihelp-query+extlinks-param-protocol": "{{doc-apihelp-param|query+extlinks|protocol}}", "apihelp-query+extlinks-param-query": "{{doc-apihelp-param|query+extlinks|query}}", "apihelp-query+extlinks-param-expandurl": "{{doc-apihelp-param|query+extlinks|expandurl}}", "apihelp-query+extlinks-example-simple": "{{doc-apihelp-example|query+extlinks}}", - "apihelp-query+exturlusage-description": "{{doc-apihelp-description|query+exturlusage}}", + "apihelp-query+exturlusage-summary": "{{doc-apihelp-summary|query+exturlusage}}", "apihelp-query+exturlusage-param-prop": "{{doc-apihelp-param|query+exturlusage|prop|paramvalues=1}}", "apihelp-query+exturlusage-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+exturlusage|prop|ids}}", "apihelp-query+exturlusage-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+exturlusage|prop|title}}", @@ -705,7 +736,7 @@ "apihelp-query+exturlusage-param-limit": "{{doc-apihelp-param|query+exturlusage|limit}}", "apihelp-query+exturlusage-param-expandurl": "{{doc-apihelp-param|query+exturlusage|expandurl}}", "apihelp-query+exturlusage-example-simple": "{{doc-apihelp-example|query+exturlusage}}", - "apihelp-query+filearchive-description": "{{doc-apihelp-description|query+filearchive}}", + "apihelp-query+filearchive-summary": "{{doc-apihelp-summary|query+filearchive}}", "apihelp-query+filearchive-param-from": "{{doc-apihelp-param|query+filearchive|from}}", "apihelp-query+filearchive-param-to": "{{doc-apihelp-param|query+filearchive|to}}", "apihelp-query+filearchive-param-prefix": "{{doc-apihelp-param|query+filearchive|prefix}}", @@ -727,10 +758,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "{{doc-apihelp-paramvalue|query+filearchive|prop|bitdepth}}", "apihelp-query+filearchive-paramvalue-prop-archivename": "{{doc-apihelp-paramvalue|query+filearchive|prop|archivename}}", "apihelp-query+filearchive-example-simple": "{{doc-apihelp-example|query+filearchive}}", - "apihelp-query+filerepoinfo-description": "{{doc-apihelp-description|query+filerepoinfo}}", + "apihelp-query+filerepoinfo-summary": "{{doc-apihelp-summary|query+filerepoinfo}}", "apihelp-query+filerepoinfo-param-prop": "{{doc-apihelp-param|query+filerepoinfo|prop}}", "apihelp-query+filerepoinfo-example-simple": "{{doc-apihelp-example|query+filerepoinfo}}", - "apihelp-query+fileusage-description": "{{doc-apihelp-description|query+fileusage}}", + "apihelp-query+fileusage-summary": "{{doc-apihelp-summary|query+fileusage}}", "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop|paramvalues=1}}", "apihelp-query+fileusage-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+fileusage|prop|pageid}}", "apihelp-query+fileusage-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+fileusage|prop|title}}", @@ -740,7 +771,7 @@ "apihelp-query+fileusage-param-show": "{{doc-apihelp-param|query+fileusage|show}}", "apihelp-query+fileusage-example-simple": "{{doc-apihelp-example|query+fileusage}}", "apihelp-query+fileusage-example-generator": "{{doc-apihelp-example|query+fileusage}}", - "apihelp-query+imageinfo-description": "{{doc-apihelp-description|query+imageinfo}}", + "apihelp-query+imageinfo-summary": "{{doc-apihelp-summary|query+imageinfo}}", "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop|paramvalues=1}}", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+imageinfo|prop|timestamp}}", "apihelp-query+imageinfo-paramvalue-prop-user": "{{doc-apihelp-paramvalue|query+imageinfo|prop|user}}", @@ -776,13 +807,13 @@ "apihelp-query+imageinfo-param-localonly": "{{doc-apihelp-param|query+imageinfo|localonly}}", "apihelp-query+imageinfo-example-simple": "{{doc-apihelp-example|query+imageinfo}}", "apihelp-query+imageinfo-example-dated": "{{doc-apihelp-example|query+imageinfo}}", - "apihelp-query+images-description": "{{doc-apihelp-description|query+images}}", + "apihelp-query+images-summary": "{{doc-apihelp-summary|query+images}}", "apihelp-query+images-param-limit": "{{doc-apihelp-param|query+images|limit}}", "apihelp-query+images-param-images": "{{doc-apihelp-param|query+images|images}}", "apihelp-query+images-param-dir": "{{doc-apihelp-param|query+images|dir}}", "apihelp-query+images-example-simple": "{{doc-apihelp-example|query+images}}", "apihelp-query+images-example-generator": "{{doc-apihelp-example|query+images}}", - "apihelp-query+imageusage-description": "{{doc-apihelp-description|query+imageusage}}", + "apihelp-query+imageusage-summary": "{{doc-apihelp-summary|query+imageusage}}", "apihelp-query+imageusage-param-title": "{{doc-apihelp-param|query+imageusage|title}}", "apihelp-query+imageusage-param-pageid": "{{doc-apihelp-param|query+imageusage|pageid}}", "apihelp-query+imageusage-param-namespace": "{{doc-apihelp-param|query+imageusage|namespace}}", @@ -792,7 +823,7 @@ "apihelp-query+imageusage-param-redirect": "{{doc-apihelp-param|query+imageusage|redirect}}", "apihelp-query+imageusage-example-simple": "{{doc-apihelp-example|query+imageusage}}", "apihelp-query+imageusage-example-generator": "{{doc-apihelp-example|query+imageusage}}", - "apihelp-query+info-description": "{{doc-apihelp-description|query+info}}", + "apihelp-query+info-summary": "{{doc-apihelp-summary|query+info}}", "apihelp-query+info-param-prop": "{{doc-apihelp-param|query+info|prop|paramvalues=1}}", "apihelp-query+info-paramvalue-prop-protection": "{{doc-apihelp-paramvalue|query+info|prop|protection}}", "apihelp-query+info-paramvalue-prop-talkid": "{{doc-apihelp-paramvalue|query+info|prop|talkid}}", @@ -809,7 +840,8 @@ "apihelp-query+info-param-token": "{{doc-apihelp-param|query+info|token}}", "apihelp-query+info-example-simple": "{{doc-apihelp-example|query+info}}", "apihelp-query+info-example-protection": "{{doc-apihelp-example|query+info}}", - "apihelp-query+iwbacklinks-description": "{{doc-apihelp-description|query+iwbacklinks}}", + "apihelp-query+iwbacklinks-summary": "{{doc-apihelp-summary|query+iwbacklinks}}", + "apihelp-query+iwbacklinks-extended-description": "{{doc-apihelp-extended-description|query+iwbacklinks}}", "apihelp-query+iwbacklinks-param-prefix": "{{doc-apihelp-param|query+iwbacklinks|prefix}}", "apihelp-query+iwbacklinks-param-title": "{{doc-apihelp-param|query+iwbacklinks|title}}", "apihelp-query+iwbacklinks-param-limit": "{{doc-apihelp-param|query+iwbacklinks|limit}}", @@ -819,7 +851,7 @@ "apihelp-query+iwbacklinks-param-dir": "{{doc-apihelp-param|query+iwbacklinks|dir}}", "apihelp-query+iwbacklinks-example-simple": "{{doc-apihelp-example|query+iwbacklinks}}", "apihelp-query+iwbacklinks-example-generator": "{{doc-apihelp-example|query+iwbacklinks}}", - "apihelp-query+iwlinks-description": "{{doc-apihelp-description|query+iwlinks}}", + "apihelp-query+iwlinks-summary": "{{doc-apihelp-summary|query+iwlinks}}", "apihelp-query+iwlinks-param-url": "{{doc-apihelp-param|query+iwlinks|url}}", "apihelp-query+iwlinks-param-prop": "{{doc-apihelp-param|query+iwlinks|prop|paramvalues=1}}", "apihelp-query+iwlinks-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+iwlinks|prop|url}}", @@ -828,7 +860,8 @@ "apihelp-query+iwlinks-param-title": "{{doc-apihelp-param|query+iwlinks|title}}", "apihelp-query+iwlinks-param-dir": "{{doc-apihelp-param|query+iwlinks|dir}}", "apihelp-query+iwlinks-example-simple": "{{doc-apihelp-example|query+iwlinks}}", - "apihelp-query+langbacklinks-description": "{{doc-apihelp-description|query+langbacklinks}}", + "apihelp-query+langbacklinks-summary": "{{doc-apihelp-summary|query+langbacklinks}}", + "apihelp-query+langbacklinks-extended-description": "{{doc-apihelp-extended-description|query+langbacklinks}}", "apihelp-query+langbacklinks-param-lang": "{{doc-apihelp-param|query+langbacklinks|lang}}", "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}", "apihelp-query+langbacklinks-param-limit": "{{doc-apihelp-param|query+langbacklinks|limit}}", @@ -838,7 +871,7 @@ "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}", "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}", "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}", - "apihelp-query+langlinks-description": "{{doc-apihelp-description|query+langlinks}}", + "apihelp-query+langlinks-summary": "{{doc-apihelp-summary|query+langlinks}}", "apihelp-query+langlinks-param-limit": "{{doc-apihelp-param|query+langlinks|limit}}", "apihelp-query+langlinks-param-url": "{{doc-apihelp-param|query+langlinks|url}}", "apihelp-query+langlinks-param-prop": "{{doc-apihelp-param|query+langlinks|prop|paramvalues=1}}", @@ -850,7 +883,7 @@ "apihelp-query+langlinks-param-dir": "{{doc-apihelp-param|query+langlinks|dir}}", "apihelp-query+langlinks-param-inlanguagecode": "{{doc-apihelp-param|query+langlinks|inlanguagecode}}", "apihelp-query+langlinks-example-simple": "{{doc-apihelp-example|query+langlinks}}", - "apihelp-query+links-description": "{{doc-apihelp-description|query+links}}", + "apihelp-query+links-summary": "{{doc-apihelp-summary|query+links}}", "apihelp-query+links-param-namespace": "{{doc-apihelp-param|query+links|namespace}}", "apihelp-query+links-param-limit": "{{doc-apihelp-param|query+links|limit}}", "apihelp-query+links-param-titles": "{{doc-apihelp-param|query+links|titles}}", @@ -858,7 +891,7 @@ "apihelp-query+links-example-simple": "{{doc-apihelp-example|query+links}}", "apihelp-query+links-example-generator": "{{doc-apihelp-example|query+links}}", "apihelp-query+links-example-namespaces": "{{doc-apihelp-example|query+links}}", - "apihelp-query+linkshere-description": "{{doc-apihelp-description|query+linkshere}}", + "apihelp-query+linkshere-summary": "{{doc-apihelp-summary|query+linkshere}}", "apihelp-query+linkshere-param-prop": "{{doc-apihelp-param|query+linkshere|prop|paramvalues=1}}", "apihelp-query+linkshere-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+linkshere|prop|pageid}}", "apihelp-query+linkshere-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+linkshere|prop|title}}", @@ -868,7 +901,7 @@ "apihelp-query+linkshere-param-show": "{{doc-apihelp-param|query+linkshere|show}}", "apihelp-query+linkshere-example-simple": "{{doc-apihelp-example|query+linkshere}}", "apihelp-query+linkshere-example-generator": "{{doc-apihelp-example|query+linkshere}}", - "apihelp-query+logevents-description": "{{doc-apihelp-description|query+logevents}}", + "apihelp-query+logevents-summary": "{{doc-apihelp-summary|query+logevents}}", "apihelp-query+logevents-param-prop": "{{doc-apihelp-param|query+logevents|prop|paramvalues=1}}", "apihelp-query+logevents-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+logevents|prop|ids}}", "apihelp-query+logevents-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+logevents|prop|title}}", @@ -891,13 +924,13 @@ "apihelp-query+logevents-param-tag": "{{doc-apihelp-param|query+logevents|tag}}", "apihelp-query+logevents-param-limit": "{{doc-apihelp-param|query+logevents|limit}}", "apihelp-query+logevents-example-simple": "{{doc-apihelp-example|query+logevents}}", - "apihelp-query+pagepropnames-description": "{{doc-apihelp-description|query+pagepropnames}}", + "apihelp-query+pagepropnames-summary": "{{doc-apihelp-summary|query+pagepropnames}}", "apihelp-query+pagepropnames-param-limit": "{{doc-apihelp-param|query+pagepropnames|limit}}", "apihelp-query+pagepropnames-example-simple": "{{doc-apihelp-example|query+pagepropnames}}", - "apihelp-query+pageprops-description": "{{doc-apihelp-description|query+pageprops}}", + "apihelp-query+pageprops-summary": "{{doc-apihelp-summary|query+pageprops}}", "apihelp-query+pageprops-param-prop": "{{doc-apihelp-param|query+pageprops|prop}}", "apihelp-query+pageprops-example-simple": "{{doc-apihelp-example|query+pageprops}}", - "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}", + "apihelp-query+pageswithprop-summary": "{{doc-apihelp-summary|query+pageswithprop}}", "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}", "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop|paramvalues=1}}", "apihelp-query+pageswithprop-paramvalue-prop-ids": "{{doc-apihelp-paramvalue|query+pageswithprop|prop|ids}}", @@ -907,14 +940,15 @@ "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}", "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}", "apihelp-query+pageswithprop-example-generator": "{{doc-apihelp-example|query+pageswithprop}}", - "apihelp-query+prefixsearch-description": "{{doc-apihelp-description|query+prefixsearch}}", + "apihelp-query+prefixsearch-summary": "{{doc-apihelp-summary|query+prefixsearch}}", + "apihelp-query+prefixsearch-extended-description": "{{doc-apihelp-extended-description|query+prefixsearch}}", "apihelp-query+prefixsearch-param-search": "{{doc-apihelp-param|query+prefixsearch|search}}", "apihelp-query+prefixsearch-param-namespace": "{{doc-apihelp-param|query+prefixsearch|namespace}}", "apihelp-query+prefixsearch-param-limit": "{{doc-apihelp-param|query+prefixsearch|limit}}", "apihelp-query+prefixsearch-param-offset": "{{doc-apihelp-param|query+prefixsearch|offset}}", "apihelp-query+prefixsearch-example-simple": "{{doc-apihelp-example|query+prefixsearch}}", "apihelp-query+prefixsearch-param-profile": "{{doc-apihelp-param|query+prefixsearch|profile|paramvalues=1}}", - "apihelp-query+protectedtitles-description": "{{doc-apihelp-description|query+protectedtitles}}", + "apihelp-query+protectedtitles-summary": "{{doc-apihelp-summary|query+protectedtitles}}", "apihelp-query+protectedtitles-param-namespace": "{{doc-apihelp-param|query+protectedtitles|namespace}}", "apihelp-query+protectedtitles-param-level": "{{doc-apihelp-param|query+protectedtitles|level}}", "apihelp-query+protectedtitles-param-limit": "{{doc-apihelp-param|query+protectedtitles|limit}}", @@ -930,18 +964,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "{{doc-apihelp-paramvalue|query+protectedtitles|prop|level}}", "apihelp-query+protectedtitles-example-simple": "{{doc-apihelp-example|query+protectedtitles}}", "apihelp-query+protectedtitles-example-generator": "{{doc-apihelp-example|query+protectedtitles}}", - "apihelp-query+querypage-description": "{{doc-apihelp-description|query+querypage}}", + "apihelp-query+querypage-summary": "{{doc-apihelp-summary|query+querypage}}", "apihelp-query+querypage-param-page": "{{doc-apihelp-param|query+querypage|page}}", "apihelp-query+querypage-param-limit": "{{doc-apihelp-param|query+querypage|limit}}", "apihelp-query+querypage-example-ancientpages": "{{doc-apihelp-example|query+querypage}}", - "apihelp-query+random-description": "{{doc-apihelp-description|query+random}}", + "apihelp-query+random-summary": "{{doc-apihelp-summary|query+random}}", + "apihelp-query+random-extended-description": "{{doc-apihelp-extended-description|query+random}}", "apihelp-query+random-param-namespace": "{{doc-apihelp-param|query+random|namespace}}", "apihelp-query+random-param-limit": "{{doc-apihelp-param|query+random|limit}}", "apihelp-query+random-param-redirect": "{{doc-apihelp-param|query+random|redirect}}", "apihelp-query+random-param-filterredir": "{{doc-apihelp-param|query+random|filterredir}}", "apihelp-query+random-example-simple": "{{doc-apihelp-example|query+random}}", "apihelp-query+random-example-generator": "{{doc-apihelp-example|query+random}}", - "apihelp-query+recentchanges-description": "{{doc-apihelp-description|query+recentchanges}}", + "apihelp-query+recentchanges-summary": "{{doc-apihelp-summary|query+recentchanges}}", "apihelp-query+recentchanges-param-start": "{{doc-apihelp-param|query+recentchanges|start}}", "apihelp-query+recentchanges-param-end": "{{doc-apihelp-param|query+recentchanges|end}}", "apihelp-query+recentchanges-param-namespace": "{{doc-apihelp-param|query+recentchanges|namespace}}", @@ -971,7 +1006,7 @@ "apihelp-query+recentchanges-param-generaterevisions": "{{doc-apihelp-param|query+recentchanges|generaterevisions}}", "apihelp-query+recentchanges-example-simple": "{{doc-apihelp-example|query+recentchanges}}", "apihelp-query+recentchanges-example-generator": "{{doc-apihelp-example|query+recentchanges}}", - "apihelp-query+redirects-description": "{{doc-apihelp-description|query+redirects}}", + "apihelp-query+redirects-summary": "{{doc-apihelp-summary|query+redirects}}", "apihelp-query+redirects-param-prop": "{{doc-apihelp-param|query+redirects|prop|paramvalues=1}}", "apihelp-query+redirects-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+redirects|prop|pageid}}", "apihelp-query+redirects-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+redirects|prop|title}}", @@ -981,7 +1016,8 @@ "apihelp-query+redirects-param-show": "{{doc-apihelp-param|query+redirects|show}}", "apihelp-query+redirects-example-simple": "{{doc-apihelp-example|query+redirects}}", "apihelp-query+redirects-example-generator": "{{doc-apihelp-example|query+redirects}}", - "apihelp-query+revisions-description": "{{doc-apihelp-description|query+revisions}}", + "apihelp-query+revisions-summary": "{{doc-apihelp-summary|query+revisions}}", + "apihelp-query+revisions-extended-description": "{{doc-apihelp-extended-description|query+revisions}}", "apihelp-query+revisions-paraminfo-singlepageonly": "{{doc-apihelp-paraminfo|query+revisions|singlepageonly}}", "apihelp-query+revisions-param-startid": "{{doc-apihelp-param|query+revisions|startid}}", "apihelp-query+revisions-param-endid": "{{doc-apihelp-param|query+revisions|endid}}", @@ -1020,7 +1056,7 @@ "apihelp-query+revisions+base-param-difftotext": "{{doc-apihelp-param|query+revisions+base|difftotext|description=the \"difftotext\" parameter to revision querying modules|noseealso=1}}", "apihelp-query+revisions+base-param-difftotextpst": "{{doc-apihelp-param|query+revisions+base|difftotextpst|description=the \"difftotextpst\" parameter to revision querying modules|noseealso=1}}", "apihelp-query+revisions+base-param-contentformat": "{{doc-apihelp-param|query+revisions+base|contentformat|description=the \"contentformat\" parameter to revision querying modules|noseealso=1}}", - "apihelp-query+search-description": "{{doc-apihelp-description|query+search}}", + "apihelp-query+search-summary": "{{doc-apihelp-summary|query+search}}", "apihelp-query+search-param-search": "{{doc-apihelp-param|query+search|search}}", "apihelp-query+search-param-namespace": "{{doc-apihelp-param|query+search|namespace}}", "apihelp-query+search-param-what": "{{doc-apihelp-param|query+search|what}}", @@ -1038,8 +1074,8 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "{{doc-apihelp-paramvalue|query+search|prop|sectiontitle}}", "apihelp-query+search-paramvalue-prop-categorysnippet": "{{doc-apihelp-paramvalue|query+search|prop|categorysnippet}}", "apihelp-query+search-paramvalue-prop-isfilematch": "{{doc-apihelp-paramvalue|query+search|prop|isfilematch}}", - "apihelp-query+search-paramvalue-prop-score": "{{doc-apihelp-paramvalue|query+search|prop|score}}\n{{doc-important|Please do not alter the class=\"apihelp-deprecated\" attribute}}", - "apihelp-query+search-paramvalue-prop-hasrelated": "{{doc-apihelp-paramvalue|query+search|prop|hasrelated}}\n{{doc-important|Please do not alter the class=\"apihelp-deprecated\" attribute}}", + "apihelp-query+search-paramvalue-prop-score": "{{doc-apihelp-paramvalue|query+search|prop|score}}\n{{Identical|Ignored}}", + "apihelp-query+search-paramvalue-prop-hasrelated": "{{doc-apihelp-paramvalue|query+search|prop|hasrelated}}\n{{Identical|Ignored}}", "apihelp-query+search-param-limit": "{{doc-apihelp-param|query+search|limit}}", "apihelp-query+search-param-interwiki": "{{doc-apihelp-param|query+search|interwiki}}", "apihelp-query+search-param-backend": "{{doc-apihelp-param|query+search|backend}}", @@ -1047,7 +1083,7 @@ "apihelp-query+search-example-simple": "{{doc-apihelp-example|query+search}}", "apihelp-query+search-example-text": "{{doc-apihelp-example|query+search}}", "apihelp-query+search-example-generator": "{{doc-apihelp-example|query+search}}", - "apihelp-query+siteinfo-description": "{{doc-apihelp-description|query+siteinfo}}", + "apihelp-query+siteinfo-summary": "{{doc-apihelp-summary|query+siteinfo}}", "apihelp-query+siteinfo-param-prop": "{{doc-apihelp-param|query+siteinfo|prop|paramvalues=1}}", "apihelp-query+siteinfo-paramvalue-prop-general": "{{doc-apihelp-paramvalue|query+siteinfo|prop|general}}", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "{{doc-apihelp-paramvalue|query+siteinfo|prop|namespaces}}", @@ -1080,12 +1116,12 @@ "apihelp-query+siteinfo-example-simple": "{{doc-apihelp-example|query+siteinfo}}", "apihelp-query+siteinfo-example-interwiki": "{{doc-apihelp-example|query+siteinfo}}", "apihelp-query+siteinfo-example-replag": "{{doc-apihelp-example|query+siteinfo}}", - "apihelp-query+stashimageinfo-description": "{{doc-apihelp-description|query+stashimageinfo}}", + "apihelp-query+stashimageinfo-summary": "{{doc-apihelp-summary|query+stashimageinfo}}", "apihelp-query+stashimageinfo-param-filekey": "{{doc-apihelp-param|query+stashimageinfo|filekey}}", "apihelp-query+stashimageinfo-param-sessionkey": "{{doc-apihelp-param|query+stashimageinfo|sessionkey}}", "apihelp-query+stashimageinfo-example-simple": "{{doc-apihelp-example|query+stashimageinfo}}", "apihelp-query+stashimageinfo-example-params": "{{doc-apihelp-example|query+stashimageinfo}}", - "apihelp-query+tags-description": "{{doc-apihelp-description|query+tags}}", + "apihelp-query+tags-summary": "{{doc-apihelp-summary|query+tags}}", "apihelp-query+tags-param-limit": "{{doc-apihelp-param|query+tags|limit}}", "apihelp-query+tags-param-prop": "{{doc-apihelp-param|query+tags|prop|paramvalues=1}}", "apihelp-query+tags-paramvalue-prop-name": "{{doc-apihelp-paramvalue|query+tags|prop|name}}", @@ -1096,7 +1132,7 @@ "apihelp-query+tags-paramvalue-prop-source": "{{doc-apihelp-paramvalue|query+tags|prop|source}}", "apihelp-query+tags-paramvalue-prop-active": "{{doc-apihelp-paramvalue|query+tags|prop|active}}", "apihelp-query+tags-example-simple": "{{doc-apihelp-example|query+tags}}", - "apihelp-query+templates-description": "{{doc-apihelp-description|query+templates}}", + "apihelp-query+templates-summary": "{{doc-apihelp-summary|query+templates}}", "apihelp-query+templates-param-namespace": "{{doc-apihelp-param|query+templates|namespace}}", "apihelp-query+templates-param-limit": "{{doc-apihelp-param|query+templates|limit}}", "apihelp-query+templates-param-templates": "{{doc-apihelp-param|query+templates|templates}}", @@ -1104,11 +1140,11 @@ "apihelp-query+templates-example-simple": "{{doc-apihelp-example|query+templates}}", "apihelp-query+templates-example-generator": "{{doc-apihelp-example|query+templates}}", "apihelp-query+templates-example-namespaces": "{{doc-apihelp-example|query+templates}}", - "apihelp-query+tokens-description": "{{doc-apihelp-description|query+tokens}}", + "apihelp-query+tokens-summary": "{{doc-apihelp-summary|query+tokens}}", "apihelp-query+tokens-param-type": "{{doc-apihelp-param|query+tokens|type}}", "apihelp-query+tokens-example-simple": "{{doc-apihelp-example|query+tokens}}", "apihelp-query+tokens-example-types": "{{doc-apihelp-example|query+tokens}}", - "apihelp-query+transcludedin-description": "{{doc-apihelp-description|query+transcludedin}}", + "apihelp-query+transcludedin-summary": "{{doc-apihelp-summary|query+transcludedin}}", "apihelp-query+transcludedin-param-prop": "{{doc-apihelp-param|query+transcludedin|prop|paramvalues=1}}", "apihelp-query+transcludedin-paramvalue-prop-pageid": "{{doc-apihelp-paramvalue|query+transcludedin|prop|pageid}}", "apihelp-query+transcludedin-paramvalue-prop-title": "{{doc-apihelp-paramvalue|query+transcludedin|prop|title}}", @@ -1118,7 +1154,7 @@ "apihelp-query+transcludedin-param-show": "{{doc-apihelp-param|query+transcludedin|show}}", "apihelp-query+transcludedin-example-simple": "{{doc-apihelp-example|query+transcludedin}}", "apihelp-query+transcludedin-example-generator": "{{doc-apihelp-example|query+transcludedin}}", - "apihelp-query+usercontribs-description": "{{doc-apihelp-description|query+usercontribs}}", + "apihelp-query+usercontribs-summary": "{{doc-apihelp-summary|query+usercontribs}}", "apihelp-query+usercontribs-param-limit": "{{doc-apihelp-param|query+usercontribs|limit}}", "apihelp-query+usercontribs-param-start": "{{doc-apihelp-param|query+usercontribs|start}}", "apihelp-query+usercontribs-param-end": "{{doc-apihelp-param|query+usercontribs|end}}", @@ -1142,7 +1178,7 @@ "apihelp-query+usercontribs-param-toponly": "{{doc-apihelp-param|query+usercontribs|toponly}}", "apihelp-query+usercontribs-example-user": "{{doc-apihelp-example|query+usercontribs}}", "apihelp-query+usercontribs-example-ipprefix": "{{doc-apihelp-example|query+usercontribs}}", - "apihelp-query+userinfo-description": "{{doc-apihelp-description|query+userinfo}}", + "apihelp-query+userinfo-summary": "{{doc-apihelp-summary|query+userinfo}}", "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|paramvalues=1}}", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "{{doc-apihelp-paramvalue|query+userinfo|prop|blockinfo}}", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "{{doc-apihelp-paramvalue|query+userinfo|prop|hasmsg}}", @@ -1164,7 +1200,7 @@ "apihelp-query+userinfo-param-attachedwiki": "{{doc-apihelp-param|query+userinfo|attachedwiki}}", "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}", "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}", - "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}", + "apihelp-query+users-summary": "{{doc-apihelp-summary|query+users}}", "apihelp-query+users-param-prop": "{{doc-apihelp-param|query+users|prop|paramvalues=1}}", "apihelp-query+users-paramvalue-prop-blockinfo": "{{doc-apihelp-paramvalue|query+users|prop|blockinfo}}", "apihelp-query+users-paramvalue-prop-groups": "{{doc-apihelp-paramvalue|query+users|prop|groups}}", @@ -1182,7 +1218,7 @@ "apihelp-query+users-param-userids": "{{doc-apihelp-param|query+users|userids}}", "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}", "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}", - "apihelp-query+watchlist-description": "{{doc-apihelp-description|query+watchlist}}", + "apihelp-query+watchlist-summary": "{{doc-apihelp-summary|query+watchlist}}", "apihelp-query+watchlist-param-allrev": "{{doc-apihelp-param|query+watchlist|allrev}}", "apihelp-query+watchlist-param-start": "{{doc-apihelp-param|query+watchlist|start}}", "apihelp-query+watchlist-param-end": "{{doc-apihelp-param|query+watchlist|end}}", @@ -1218,7 +1254,7 @@ "apihelp-query+watchlist-example-generator": "{{doc-apihelp-example|query+watchlist}}", "apihelp-query+watchlist-example-generator-rev": "{{doc-apihelp-example|query+watchlist}}", "apihelp-query+watchlist-example-wlowner": "{{doc-apihelp-example|query+watchlist}}", - "apihelp-query+watchlistraw-description": "{{doc-apihelp-description|query+watchlistraw}}", + "apihelp-query+watchlistraw-summary": "{{doc-apihelp-summary|query+watchlistraw}}", "apihelp-query+watchlistraw-param-namespace": "{{doc-apihelp-param|query+watchlistraw|namespace}}", "apihelp-query+watchlistraw-param-limit": "{{doc-apihelp-param|query+watchlistraw|limit}}", "apihelp-query+watchlistraw-param-prop": "{{doc-apihelp-param|query+watchlistraw|prop|paramvalues=1}}", @@ -1231,15 +1267,15 @@ "apihelp-query+watchlistraw-param-totitle": "{{doc-apihelp-param|query+watchlistraw|totitle}}", "apihelp-query+watchlistraw-example-simple": "{{doc-apihelp-example|query+watchlistraw}}", "apihelp-query+watchlistraw-example-generator": "{{doc-apihelp-example|query+watchlistraw}}", - "apihelp-removeauthenticationdata-description": "{{doc-apihelp-description|removeauthenticationdata}}", + "apihelp-removeauthenticationdata-summary": "{{doc-apihelp-summary|removeauthenticationdata}}", "apihelp-removeauthenticationdata-example-simple": "{{doc-apihelp-example|removeauthenticationdata}}", - "apihelp-resetpassword-description": "{{doc-apihelp-description|resetpassword|seealso=* {{msg-mw|apihelp-resetpassword-description-noroutes}}}}", - "apihelp-resetpassword-description-noroutes": "{{doc-apihelp-description|resetpassword|info=This message is used when no known routes are enabled in [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].|seealso={{msg-mw|apihelp-resetpassword-description}}}}", + "apihelp-resetpassword-summary": "{{doc-apihelp-summary|resetpassword}}", + "apihelp-resetpassword-extended-description-noroutes": "{{doc-apihelp-extended-description|resetpassword|info=This message is used when no known routes are enabled in [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].|seealso={{msg-mw|apihelp-resetpassword-extended-description}}}}", "apihelp-resetpassword-param-user": "{{doc-apihelp-param|resetpassword|user}}", "apihelp-resetpassword-param-email": "{{doc-apihelp-param|resetpassword|email}}", "apihelp-resetpassword-example-user": "{{doc-apihelp-example|resetpassword}}", "apihelp-resetpassword-example-email": "{{doc-apihelp-example|resetpassword}}", - "apihelp-revisiondelete-description": "{{doc-apihelp-description|revisiondelete}}", + "apihelp-revisiondelete-summary": "{{doc-apihelp-summary|revisiondelete}}", "apihelp-revisiondelete-param-type": "{{doc-apihelp-param|revisiondelete|type}}", "apihelp-revisiondelete-param-target": "{{doc-apihelp-param|revisiondelete|target}}", "apihelp-revisiondelete-param-ids": "{{doc-apihelp-param|revisiondelete|ids}}", @@ -1250,7 +1286,8 @@ "apihelp-revisiondelete-param-tags": "{{doc-apihelp-param|revisiondelete|tags}}", "apihelp-revisiondelete-example-revision": "{{doc-apihelp-example|revisiondelete}}", "apihelp-revisiondelete-example-log": "{{doc-apihelp-example|revisiondelete}}", - "apihelp-rollback-description": "{{doc-apihelp-description|rollback}}", + "apihelp-rollback-summary": "{{doc-apihelp-summary|rollback}}", + "apihelp-rollback-extended-description": "{{doc-apihelp-extended-description|rollback}}", "apihelp-rollback-param-title": "{{doc-apihelp-param|rollback|title}}", "apihelp-rollback-param-pageid": "{{doc-apihelp-param|rollback|pageid}}", "apihelp-rollback-param-tags": "{{doc-apihelp-param|rollback|tags}}", @@ -1260,9 +1297,10 @@ "apihelp-rollback-param-watchlist": "{{doc-apihelp-param|rollback|watchlist}}", "apihelp-rollback-example-simple": "{{doc-apihelp-example|rollback}}", "apihelp-rollback-example-summary": "{{doc-apihelp-example|rollback}}", - "apihelp-rsd-description": "{{doc-apihelp-description|rsd}}", + "apihelp-rsd-summary": "{{doc-apihelp-summary|rsd}}", "apihelp-rsd-example-simple": "{{doc-apihelp-example|rsd}}", - "apihelp-setnotificationtimestamp-description": "{{doc-apihelp-description|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-summary": "{{doc-apihelp-summary|setnotificationtimestamp}}", + "apihelp-setnotificationtimestamp-extended-description": "{{doc-apihelp-extended-description|setnotificationtimestamp}}", "apihelp-setnotificationtimestamp-param-entirewatchlist": "{{doc-apihelp-param|setnotificationtimestamp|entirewatchlist}}", "apihelp-setnotificationtimestamp-param-timestamp": "{{doc-apihelp-param|setnotificationtimestamp|timestamp}}", "apihelp-setnotificationtimestamp-param-torevid": "{{doc-apihelp-param|setnotificationtimestamp|torevid}}", @@ -1271,8 +1309,8 @@ "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}", "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}", "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}", - "apihelp-setpagelanguage-description": "{{doc-apihelp-description|setpagelanguage}}", - "apihelp-setpagelanguage-description-disabled": "{{doc-apihelp-description|setpagelanguage|info=This message is used when changing the language of a page is not allowed on the wiki because [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] is not enabled.|seealso={{msg-mw|apihelp-setpagelanguage-description}}}}", + "apihelp-setpagelanguage-summary": "{{doc-apihelp-summary|setpagelanguage}}", + "apihelp-setpagelanguage-extended-description-disabled": "{{doc-apihelp-extended-description|setpagelanguage|info=This message is used when changing the language of a page is not allowed on the wiki because [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] is not enabled.|seealso={{msg-mw|apihelp-setpagelanguage-extended-description}}}}", "apihelp-setpagelanguage-param-title": "{{doc-apihelp-param|setpagelanguage|title}}", "apihelp-setpagelanguage-param-pageid": "{{doc-apihelp-param|setpagelanguage|pageid}}", "apihelp-setpagelanguage-param-lang": "{{doc-apihelp-param|setpagelanguage|lang}}", @@ -1280,7 +1318,8 @@ "apihelp-setpagelanguage-param-tags": "{{doc-apihelp-param|setpagelanguage|tags}}", "apihelp-setpagelanguage-example-language": "{{doc-apihelp-example|setpagelanguage}}", "apihelp-setpagelanguage-example-default": "{{doc-apihelp-example|setpagelanguage}}", - "apihelp-stashedit-description": "{{doc-apihelp-description|stashedit}}", + "apihelp-stashedit-summary": "{{doc-apihelp-summary|stashedit}}", + "apihelp-stashedit-extended-description": "{{doc-apihelp-extended-description|stashedit}}", "apihelp-stashedit-param-title": "{{doc-apihelp-param|stashedit|title}}", "apihelp-stashedit-param-section": "{{doc-apihelp-param|stashedit|section}}", "apihelp-stashedit-param-sectiontitle": "{{doc-apihelp-param|stashedit|sectiontitle}}", @@ -1290,7 +1329,7 @@ "apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}", "apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}", "apihelp-stashedit-param-summary": "{{doc-apihelp-param|stashedit|summary}}", - "apihelp-tag-description": "{{doc-apihelp-description|tag}}", + "apihelp-tag-summary": "{{doc-apihelp-summary|tag}}", "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}", "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}", "apihelp-tag-param-logid": "{{doc-apihelp-param|tag|logid}}", @@ -1300,11 +1339,12 @@ "apihelp-tag-param-tags": "{{doc-apihelp-param|tag|tags}}", "apihelp-tag-example-rev": "{{doc-apihelp-example|tag}}", "apihelp-tag-example-log": "{{doc-apihelp-example|tag}}", - "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}", + "apihelp-tokens-summary": "{{doc-apihelp-summary|tokens}}", + "apihelp-tokens-extended-description": "{{doc-apihelp-extended-description|tokens}}", "apihelp-tokens-param-type": "{{doc-apihelp-param|tokens|type}}", "apihelp-tokens-example-edit": "{{doc-apihelp-example|tokens}}", "apihelp-tokens-example-emailmove": "{{doc-apihelp-example|tokens}}", - "apihelp-unblock-description": "{{doc-apihelp-description|unblock}}", + "apihelp-unblock-summary": "{{doc-apihelp-summary|unblock}}", "apihelp-unblock-param-id": "{{doc-apihelp-param|unblock|id}}", "apihelp-unblock-param-user": "{{doc-apihelp-param|unblock|user}}", "apihelp-unblock-param-userid": "{{doc-apihelp-param|unblock|userid}}", @@ -1312,7 +1352,8 @@ "apihelp-unblock-param-tags": "{{doc-apihelp-param|unblock|tags}}", "apihelp-unblock-example-id": "{{doc-apihelp-example|unblock}}", "apihelp-unblock-example-user": "{{doc-apihelp-example|unblock}}", - "apihelp-undelete-description": "{{doc-apihelp-description|undelete}}", + "apihelp-undelete-summary": "{{doc-apihelp-summary|undelete}}", + "apihelp-undelete-extended-description": "{{doc-apihelp-extended-description|undelete}}", "apihelp-undelete-param-title": "{{doc-apihelp-param|undelete|title}}", "apihelp-undelete-param-reason": "{{doc-apihelp-param|undelete|reason}}", "apihelp-undelete-param-tags": "{{doc-apihelp-param|undelete|tags}}", @@ -1321,9 +1362,10 @@ "apihelp-undelete-param-watchlist": "{{doc-apihelp-param|undelete|watchlist}}", "apihelp-undelete-example-page": "{{doc-apihelp-example|undelete}}", "apihelp-undelete-example-revisions": "{{doc-apihelp-example|undelete}}", - "apihelp-unlinkaccount-description": "{{doc-apihelp-description|unlinkaccount}}", + "apihelp-unlinkaccount-summary": "{{doc-apihelp-summary|unlinkaccount}}", "apihelp-unlinkaccount-example-simple": "{{doc-apihelp-example|unlinkaccount}}", - "apihelp-upload-description": "{{doc-apihelp-description|upload}}", + "apihelp-upload-summary": "{{doc-apihelp-summary|upload}}", + "apihelp-upload-extended-description": "{{doc-apihelp-extended-description|upload}}", "apihelp-upload-param-filename": "{{doc-apihelp-param|upload|filename}}", "apihelp-upload-param-comment": "{{doc-apihelp-param|upload|comment}}", "apihelp-upload-param-tags": "{{doc-apihelp-param|upload|tags}}", @@ -1343,7 +1385,7 @@ "apihelp-upload-param-checkstatus": "{{doc-apihelp-param|upload|checkstatus}}", "apihelp-upload-example-url": "{{doc-apihelp-example|upload}}", "apihelp-upload-example-filekey": "{{doc-apihelp-example|upload}}", - "apihelp-userrights-description": "{{doc-apihelp-description|userrights}}", + "apihelp-userrights-summary": "{{doc-apihelp-summary|userrights}}", "apihelp-userrights-param-user": "{{doc-apihelp-param|userrights|user}}\n{{Identical|Username}}", "apihelp-userrights-param-userid": "{{doc-apihelp-param|userrights|userid}}\n{{Identical|User ID}}", "apihelp-userrights-param-add": "{{doc-apihelp-param|userrights|add}}", @@ -1354,14 +1396,15 @@ "apihelp-userrights-example-user": "{{doc-apihelp-example|userrights}}", "apihelp-userrights-example-userid": "{{doc-apihelp-example|userrights}}", "apihelp-userrights-example-expiry": "{{doc-apihelp-example|userrights}}", - "apihelp-validatepassword-description": "{{doc-apihelp-description|validatepassword}}", + "apihelp-validatepassword-summary": "{{doc-apihelp-summary|validatepassword}}", + "apihelp-validatepassword-extended-description": "{{doc-apihelp-extended-description|validatepassword}}", "apihelp-validatepassword-param-password": "{{doc-apihelp-param|validatepassword|password}}", "apihelp-validatepassword-param-user": "{{doc-apihelp-param|validatepassword|user}}", "apihelp-validatepassword-param-email": "{{doc-apihelp-param|validatepassword|email}}", "apihelp-validatepassword-param-realname": "{{doc-apihelp-param|validatepassword|realname}}", "apihelp-validatepassword-example-1": "{{doc-apihelp-example|validatepassword}}", "apihelp-validatepassword-example-2": "{{doc-apihelp-example|validatepassword}}", - "apihelp-watch-description": "{{doc-apihelp-description|watch}}", + "apihelp-watch-summary": "{{doc-apihelp-summary|watch}}", "apihelp-watch-param-title": "{{doc-apihelp-param|watch|title}}", "apihelp-watch-param-unwatch": "{{doc-apihelp-param|watch|unwatch}}", "apihelp-watch-example-watch": "{{doc-apihelp-example|watch}}", @@ -1369,25 +1412,30 @@ "apihelp-watch-example-generator": "{{doc-apihelp-example|watch}}", "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}", "apihelp-format-param-wrappedhtml": "{{doc-apihelp-param|format|wrappedhtml|description=the \"wrappedhtml\" parameter in pretty-printing format modules}}", - "apihelp-json-description": "{{doc-apihelp-description|json|seealso=* {{msg-mw|apihelp-jsonfm-description}}}}", + "apihelp-json-summary": "{{doc-apihelp-summary|json|seealso=* {{msg-mw|apihelp-jsonfm-summary}}}}", "apihelp-json-param-callback": "{{doc-apihelp-param|json|callback}}", "apihelp-json-param-utf8": "{{doc-apihelp-param|json|utf8}}", "apihelp-json-param-ascii": "{{doc-apihelp-param|json|ascii}}", "apihelp-json-param-formatversion": "{{doc-apihelp-param|json|formatversion}}", - "apihelp-jsonfm-description": "{{doc-apihelp-description|jsonfm|seealso=* {{msg-mw|apihelp-json-description}}}}", - "apihelp-none-description": "{{doc-apihelp-description|none}}", - "apihelp-php-description": "{{doc-apihelp-description|php|seealso=* {{msg-mw|apihelp-phpfm-description}}}}", + "apihelp-jsonfm-summary": "{{doc-apihelp-summary|jsonfm|seealso=* {{msg-mw|apihelp-json-summary}}}}", + "apihelp-none-summary": "{{doc-apihelp-summary|none}}", + "apihelp-php-summary": "{{doc-apihelp-summary|php|seealso=* {{msg-mw|apihelp-phpfm-summary}}}}", "apihelp-php-param-formatversion": "{{doc-apihelp-param|php|formatversion}}", - "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}", - "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}", - "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}", + "apihelp-phpfm-summary": "{{doc-apihelp-summary|phpfm|seealso=* {{msg-mw|apihelp-php-summary}}}}", + "apihelp-rawfm-summary": "{{doc-apihelp-summary|rawfm|seealso=* {{msg-mw|apihelp-raw-summary}}}}", + "apihelp-xml-summary": "{{doc-apihelp-summary|xml|seealso=* {{msg-mw|apihelp-xmlfm-summary}}}}", "apihelp-xml-param-xslt": "{{doc-apihelp-param|xml|xslt}}", "apihelp-xml-param-includexmlnamespace": "{{doc-apihelp-param|xml|includexmlnamespace}}", - "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}", + "apihelp-xmlfm-summary": "{{doc-apihelp-summary|xmlfm|seealso=* {{msg-mw|apihelp-xml-summary}}}}", "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.", - "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name", + "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but a post request is received.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name", "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name", + "api-format-prettyprint-header-hyperlinked": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name\n* $3 - URL to Non-pretty-printing module", "api-format-prettyprint-status": "{{technical}} Displayed as a header when API pretty-printed output is used for a response that uses an unusual HTTP status code.\n\nParameters:\n* $1 - HTTP status code (integer)\n* $2 - Standard English text for the status code.", + "api-login-fail-aborted": "{{technical}} Displayed as an error when API login fails due to AuthManager requiring user interaction.\n\nSee also:\n* {{msg-mw|api-login-fail-aborted-nobotpw}}", + "api-login-fail-aborted-nobotpw": "{{technical}} Displayed as an error when API login fails due to AuthManager requiring user interaction. Used when BotPasswords is disabled.\n\nSee also:\n* {{msg-mw|api-login-fail-aborted}}", + "api-login-fail-badsessionprovider": "{{technical}} Displayed as an error when API login is not possible due to a session provider that doesn't support login.\n\nParameters:\n* $1 - Session type in use that makes it not possible to log in, from a message like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.", + "api-login-fail-sameorigin": "{{technical}} Displayed as an error when API login is not possible because the request does not enforce the Same-Origin policy.", "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}", "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}", "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}", @@ -1398,6 +1446,7 @@ "api-help-title": "Page title for the auto-generated help output", "api-help-lead": "Text displayed at the top of the API help page", "api-help-main-header": "Text for the header of the main module", + "api-help-undocumented-module": "Text displayed for the summary of a submodule parameter when the module can't be loaded.\n\nParameters:\n* $1 - The module path.", "api-help-fallback-description": "{{notranslate}}", "api-help-fallback-parameter": "{{notranslate}}", "api-help-fallback-example": "{{notranslate}}", @@ -1450,6 +1499,7 @@ "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated", "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries", "api-help-open-in-apisandbox": "Text for the link to open an API example in [[Special:ApiSandbox]].", + "api-help-no-extended-description": "{{notranslate}} Message used when no extended description is provided. Should be empty.", "api-help-authmanager-general-usage": "{{doc-important|Do not translate text that either quoted, or inside , , , or in this message.}}\nText giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.", "api-help-authmanagerhelper-requests": "{{doc-apihelp-param|description=the \"requests\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}", "api-help-authmanagerhelper-request": "{{doc-apihelp-param|description=the \"request\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}", @@ -1506,7 +1556,8 @@ "apierror-changeauth-norequest": "{{doc-apierror}}", "apierror-chunk-too-small": "{{doc-apierror}}\n\nParameters:\n* $1 - Minimum size in bytes.", "apierror-cidrtoobroad": "{{doc-apierror}}\n\nParameters:\n* $1 - \"IPv4\" or \"IPv6\"\n* $2 - Minimum CIDR mask length.", - "apierror-compare-inputneeded": "{{doc-apierror}}", + "apierror-compare-no-title": "{{doc-apierror}}", + "apierror-compare-relative-to-nothing": "{{doc-apierror}}", "apierror-contentserializationexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, may end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.", "apierror-contenttoobig": "{{doc-apierror}}\n\nParameters:\n* $1 - Maximum article size in kilobytes.", "apierror-copyuploadbaddomain": "{{doc-apierror}}", @@ -1514,8 +1565,8 @@ "apierror-create-titleexists": "{{doc-apierror}}", "apierror-csp-report": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code, e.g. \"toobig\".", "apierror-databaseerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.", - "apierror-deletedrevs-param-not-1-2": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}", - "apierror-deletedrevs-param-not-3": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-description}}", + "apierror-deletedrevs-param-not-1-2": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-extended-description}}", + "apierror-deletedrevs-param-not-3": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n\nSee also:\n* {{msg-mw|apihelp-query+deletedrevs-extended-description}}", "apierror-emptynewsection": "{{doc-apierror}}", "apierror-emptypage": "{{doc-apierror}}", "apierror-exceptioncaught": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception log ID code. This is meaningless to the end user, but can be used by people with access to the logs to easily find the logged error.\n* $2 - Exception message, which may end with punctuation. Probably in English.", @@ -1550,10 +1601,12 @@ "apierror-maxlag": "{{doc-apierror}}\n\nParameters:\n* $1 - Database lag in seconds.\n* $2 - Database server that is lagged.", "apierror-mimesearchdisabled": "{{doc-apierror}}", "apierror-missingcontent-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.", + "apierror-missingcontent-revid": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number", "apierror-missingparam-at-least-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.", "apierror-missingparam-one-of": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameter names.\n* $2 - Number of parameters.", "apierror-missingparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.", "apierror-missingrev-pageid": "{{doc-apierror}}\n\nParameters:\n* $1 - Page ID number.", + "apierror-missingrev-title": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.", "apierror-missingtitle-createonly": "{{doc-apierror}}", "apierror-missingtitle": "{{doc-apierror}}", "apierror-missingtitle-byname": "{{doc-apierror}}", @@ -1587,6 +1640,7 @@ "apierror-notarget": "{{doc-apierror}}", "apierror-notpatrollable": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.", "apierror-nouploadmodule": "{{doc-apierror}}", + "apierror-offline": "{{doc-apierror}}\nError message for when files could not be uploaded as a result of bad/lost internet connection.", "apierror-opensearch-json-warnings": "{{doc-apierror}}", "apierror-pagecannotexist": "{{doc-apierror}}", "apierror-pagedeleted": "{{doc-apierror}}", @@ -1611,6 +1665,7 @@ "apierror-revdel-mutuallyexclusive": "{{doc-apierror}}", "apierror-revdel-needtarget": "{{doc-apierror}}", "apierror-revdel-paramneeded": "{{doc-apierror}}", + "apierror-revisions-badid": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter in question, e.g. \"rvstartid\".", "apierror-revisions-norevids": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".", "apierror-revisions-singlepage": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".", "apierror-revwrongpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n* $2 - Page title.", @@ -1636,6 +1691,7 @@ "apierror-stashzerolength": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text. Currently this is probably English, hopefully we'll fix that in the future.", "apierror-systemblocked": "{{doc-apierror}}", "apierror-templateexpansion-notwikitext": "{{doc-apierror}}\n\nParameters:\n* $1 - Page title.\n* $2 - Content model.", + "apierror-timeout": "{{doc-apierror}}\nAPI error message that can be used for client side localisation of API errors.", "apierror-toofewexpiries": "{{doc-apierror}}\n\nParameters:\n* $1 - Number provided.\n* $2 - Number needed.", "apierror-unknownaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Action provided.", "apierror-unknownerror-editpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (an integer).", @@ -1655,6 +1711,7 @@ "apiwarn-badurlparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".\n* $2 - Image title.", "apiwarn-badutf8": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n{{doc-important|Do not translate \"\\t\", \"\\n\", and \"\\r\"}}", "apiwarn-checktoken-percentencoding": "{{doc-apierror}}", + "apiwarn-compare-nocontentmodel": "{{doc-apierror}}\n\nParameters:\n* $1 - Content model being assumed.", "apiwarn-deprecation-deletedrevs": "{{doc-apierror}}", "apiwarn-deprecation-expandtemplates-prop": "{{doc-apierror}}", "apiwarn-deprecation-httpsexpected": "{{doc-apierror}}", diff --git a/includes/api/i18n/ro.json b/includes/api/i18n/ro.json index 6577423329..30f4bdae99 100644 --- a/includes/api/i18n/ro.json +++ b/includes/api/i18n/ro.json @@ -7,12 +7,12 @@ "apihelp-createaccount-param-email": "Adresa de e-mail a utilizatorului (opțional).", "apihelp-createaccount-param-realname": "Numele real al utilizatorului (opțional).", "apihelp-createaccount-param-mailpassword": "Dacă este setat la orice valoare, o parolă aleatoare va fi trimisă utilizatorului prin e-mail.", - "apihelp-delete-description": "Șterge o pagină.", + "apihelp-delete-summary": "Șterge o pagină.", "apihelp-delete-param-title": "Titlul paginii de șters. Nu poate fi folosit împreună cu $1pageid.", "apihelp-delete-param-pageid": "ID-ul paginii de șters. Nu poate fi folosit împreună cu $1title.", "apihelp-delete-param-reason": "Motivul ștergerii. Dacă nu e specificat, va fi folosit un motiv generat automat.", - "apihelp-disabled-description": "Acest modul a fost dezactivat.", - "apihelp-edit-description": "Creează și modifică pagini.", + "apihelp-disabled-summary": "Acest modul a fost dezactivat.", + "apihelp-edit-summary": "Creează și modifică pagini.", "apihelp-edit-example-edit": "Modifică o pagină.", "apihelp-expandtemplates-param-title": "Titlul paginii.", "apihelp-expandtemplates-param-text": "Wikitext de convertit." diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json index 007c9d7f70..795e81b5a0 100644 --- a/includes/api/i18n/ru.json +++ b/includes/api/i18n/ru.json @@ -23,403 +23,1741 @@ "Kareyac", "Mailman", "Ping08", - "Ivan-r" + "Ivan-r", + "Redredsonia", + "Alexey zakharenkov", + "Facenapalm" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n
    \nСтатус: Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\nОшибочные запросы: Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\nТестирование: для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n
    \nСтатус: Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\nОшибочные запросы: Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\nТестирование: для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].", "apihelp-main-param-action": "Действие, которое следует выполнить.", "apihelp-main-param-format": "Формат вывода.", - "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki устанавливается на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «maxlag» с сообщением «Waiting for $host: $lag seconds lagged».
    См. подробнее на странице с описанием [[mw:Manual:Maxlag_parameter|параметра maxlag]].", - "apihelp-main-param-smaxage": "Устанавливает значение HTTP-заголовка Cache-Control s-maxage в заданное число секунд. Ошибки никогда не кэшируются.", - "apihelp-main-param-maxage": "Устанавливает значение HTTP-заголовка Cache-Control s-maxage в заданное число секунд. Ошибки никогда не кэшируются.", - "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано user, или что имеет права бота, если задано bot.", - "apihelp-main-param-assertuser": "Убедитесь, что текущий пользователь является именем пользователя.", + "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki установлена на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «maxlag» с сообщением «Waiting for $host: $lag seconds lagged».
    См. подробнее на странице с описанием [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: параметра Maxlag]].", + "apihelp-main-param-smaxage": "Установить значение HTTP-заголовка Cache-Control s-maxage в заданное число секунд. Ошибки никогда не кэшируются.", + "apihelp-main-param-maxage": "Установить значение HTTP-заголовка Cache-Control max-age в заданное число секунд. Ошибки никогда не кэшируются.", + "apihelp-main-param-assert": "Проверить, что участник авторизован, если задано user, или что он имеет права бота, если задано bot.", + "apihelp-main-param-assertuser": "Проверить, что ник текущего участника совпадает с заданным.", "apihelp-main-param-requestid": "Любое заданное здесь значение будет включено в ответ. Может быть использовано для различения запросов.", "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.", - "apihelp-main-param-curtimestamp": "Включить в результаты временную метку.", - "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX-запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST).\n\nДля аутентифицированных запросов он должен точно соответствовать одному из источников в заголовке Origin, так что он должен быть задан наподобие https://ru.wikipedia.org или https://meta.wikimedia.org. Если параметр не соответствует заголовку Origin, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку Origin, и источник находится в белом списке, будут установлены заголовки Access-Control-Allow-Origin и Access-Control-Allow-Credentials.\n\nДля неаутентифицированных запросов укажите значение *. Это приведёт к установке заголовка Access-Control-Allow-Origin заголовка должен быть установлен, но Access-Control-Allow-Credentials примет значение false и все пользовательские данные будут ограничены.", - "apihelp-main-param-uselang": "Язык, используемый для перевода сообщений. Запрос «[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]» с «siprop=languages» возвращает список кодов языков; укажите «user», чтобы использовать текущие языковые настройки пользователя, или «content» для использования основного языка этой вики.", + "apihelp-main-param-curtimestamp": "Включить в результат временную метку.", + "apihelp-main-param-responselanginfo": "Включить языки, использованные для uselang и errorlang, в результат.", + "apihelp-main-param-origin": "При обращении к API с использованием кросс-доменного AJAX-запроса (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI-запроса (не тела POST).\n\nДля аутентифицированных запросов он должен точно соответствовать одному из источников в заголовке Origin, так что он должен быть задан наподобие https://ru.wikipedia.org или https://meta.wikimedia.org. Если параметр не соответствует заголовку Origin, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку Origin, и источник находится в белом списке, будут установлены заголовки Access-Control-Allow-Origin и Access-Control-Allow-Credentials.\n\nДля неаутентифицированных запросов укажите значение *. В результате заголовок Access-Control-Allow-Origin будет установлен, но Access-Control-Allow-Credentials примет значение false и все пользовательские данные будут ограничены.", + "apihelp-main-param-uselang": "Язык, используемый для перевода сообщений. Запрос «[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]» с «siprop=languages» возвращает список кодов языков; укажите «user», чтобы использовать текущие языковые настройки участника, или «content» для использования основного языка этой вики.", + "apihelp-main-param-errorformat": "Формат, используемый для вывода текста предупреждений и ошибок.\n; plaintext: Вики-текст с удалёнными HTML-тегами и замещёнными мнемониками.\n; wikitext: Нераспарсенный вики-текст.\n; html: HTML.\n; raw: Ключ сообщения и параметры.\n; none: Без текстового вывода, только коды ошибок.\n; bc: Формат, используемый до MediaWiki 1.29. errorlang и errorsuselocal игнорируются.", "apihelp-main-param-errorlang": "Язык, используемый для вывода предупреждений и сообщений об ошибках. Запрос «[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]» с «siprop=languages» возвращает список кодов языков; укажите «content» для использования основного языка этой вики, или «uselang» для использования того же значения, что и в параметре «uselang».", - "apihelp-block-description": "Блокировка участника.", + "apihelp-main-param-errorsuselocal": "Если задан, тексты ошибок будут использовать локально модифицированные сообщения из пространства имён {{ns:MediaWiki}}.", + "apihelp-block-summary": "Блокировка участника.", "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать. Нельзя использовать вместе с $1userid", - "apihelp-block-param-userid": "ID участника, которого вы хотите заблокировать. Нельзя использовать одновременно вместе с $1user.", - "apihelp-block-param-expiry": "Время истечения срока действия. Могут быть относительными (например, 5 месяцев или 2 недели) или абсолютными (например, 2014-09-18T12:34:56Z). Если задано бессрочно, бессрочно, или не, блок никогда не истекает.", + "apihelp-block-param-userid": "Идентификатор блокируемого участника. Нельзя использовать одновременно с $1user.", + "apihelp-block-param-expiry": "Время истечения срока действия. Может быть относительными (например, 5 months или 2 weeks) или абсолютными (например, 2014-09-18T12:34:56Z). Если задано infinite, indefinite, или never, блок никогда не истечёт.", "apihelp-block-param-reason": "Причина блокировки.", - "apihelp-block-param-anononly": "Блокировать только анонимных пользователей (т. е. запретить анонимные правки для этого IP-адреса).", + "apihelp-block-param-anononly": "Заблокировать только анонимных участников (т. е. запретить анонимные правки для этого IP-адреса).", "apihelp-block-param-nocreate": "Запретить создание учётных записей.", "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный IP-адрес и все последующие, с которых будут совершаться попытки авторизации.", "apihelp-block-param-noemail": "Запретить участнику отправлять электронную почту через интерфейс вики. (Требуется право blockemail).", "apihelp-block-param-hidename": "Скрыть имя участника из журнала блокировок. (Требуется право hideuser).", - "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.", - "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.", - "apihelp-block-example-ip-simple": "Заблокировать IP-адрес 192.0.2.5 в течение трех дней с причиной первого удара.", - "apihelp-block-example-user-complex": "Заблокировать пользователя Вандал на бессрочно срок по причине вандализма, и предотвратить появление новых счет создания и отправки электронной почты.", - "apihelp-changeauthenticationdata-description": "Изменить данные проверки подлинности для текущего пользователя.", - "apihelp-changeauthenticationdata-example-password": "Попытка изменить текущий пароль пользователя в ExamplePassword.", - "apihelp-checktoken-description": "Проверить валидность токена от [[Special:ApiHelp/query+tokens|action=query&meta=token]].", - "apihelp-checktoken-param-type": "Тип маркера проходит тестирование.", - "apihelp-checktoken-param-token": "токен для проверки", + "apihelp-block-param-watchuser": "Следить за страницей участника или IP-участника и страницей обсуждения.", + "apihelp-block-param-tags": "Изменить метки записи в журнале блокировок.", + "apihelp-block-example-ip-simple": "Заблокировать IP-адрес 192.0.2.5 на три дня с причиной First strike.", + "apihelp-block-example-user-complex": "Бессрочно заблокировать участника Vandal по причине Vandalism и предотвратить создание новых аккаунтов и отправку электронной почты.", + "apihelp-changeauthenticationdata-summary": "Смена параметров аутентификации для текущего участника.", + "apihelp-changeauthenticationdata-example-password": "Попытаться изменить текущий пароль участника на ExamplePassword.", + "apihelp-checktoken-summary": "Проверить корректность токена из [[Special:ApiHelp/query+tokens|action=query&meta=token]].", + "apihelp-checktoken-param-type": "Тип проверяемого токена.", + "apihelp-checktoken-param-token": "Проверяемый токен.", "apihelp-checktoken-param-maxtokenage": "Максимально допустимый возраст токена (в секундах).", - "apihelp-checktoken-example-simple": "Проверить годность csrf-токена.", - "apihelp-clearhasmsg-description": "Очищает флаг hasmsg для текущего участника.", + "apihelp-checktoken-example-simple": "Проверить корректность csrf-токена.", + "apihelp-clearhasmsg-summary": "Очистить флаг hasmsg для текущего участника.", "apihelp-clearhasmsg-example-1": "Очистить флаг hasmsg для текущего участника.", - "apihelp-clientlogin-description": "Войдите в вики с помощью интерактивного потока.", - "apihelp-clientlogin-example-login": "Начать процесс регистрации в вики в качестве пользователя пример с паролем ExamplePassword.", - "apihelp-clientlogin-example-login2": "Продолжить ведение журнала в после интерфейс ответ для двухфакторной аутентификации, поставляя OATHToken из 987654.", - "apihelp-compare-description": "Сделать разницу между 2 страницами.\n\nНомер редакции, Заголовок страницы, или страницы с ID для обоих \"из\" и \"в\" должны быть переданы.", - "apihelp-compare-param-fromtitle": "Первый заголовок для сравнения.", - "apihelp-compare-param-fromid": "Первый идентификатор страницы для сравнения.", - "apihelp-compare-param-fromrev": "Первая редакция для сравнения.", - "apihelp-compare-param-totitle": "Второй заголовок для сравнения.", - "apihelp-compare-param-toid": "Второй идентификатор страницы для сравнения", - "apihelp-compare-param-torev": "Вторая версия для сравнения", - "apihelp-compare-example-1": "Создание различий между версиями 1 и 2.", - "apihelp-createaccount-description": "Создайте новую учётную запись.", - "apihelp-createaccount-param-preservestate": "Если [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] возвращается True для hasprimarypreservedstate, просит отмечен как основной-обязательно должен быть опущен. Если он возвращает непустое значение для preservedusername, что имя пользователя должно быть использовано для пользователя параметр.", - "apihelp-createaccount-example-create": "Запустить процесс создания пользователя пример с паролем ExamplePassword.", + "apihelp-clientlogin-summary": "Вход в вики с помощью интерактивного потока.", + "apihelp-clientlogin-example-login": "Начать вход в вики в качестве участника Example с паролем ExamplePassword.", + "apihelp-clientlogin-example-login2": "Продолжить вход после ответа UI для двухфакторной авторизации, предоставив 987654 в качестве токена OATHToken.", + "apihelp-compare-summary": "Получение разницы между двумя страницами.", + "apihelp-compare-extended-description": "Номер версии, заголовок страницы, её идентификатор, текст, или относительная сноска должна быть задана как для «from», так и для «to».", + "apihelp-compare-param-fromtitle": "Заголовок первой сравниваемой страницы.", + "apihelp-compare-param-fromid": "Идентификатор первой сравниваемой страницы.", + "apihelp-compare-param-fromrev": "Первая сравниваемая версия.", + "apihelp-compare-param-fromtext": "Используйте этот текст вместо содержимого версии, заданной fromtitle, fromid или fromrev.", + "apihelp-compare-param-frompst": "Выполнить преобразование перед записью правки (PST) над fromtext.", + "apihelp-compare-param-fromcontentmodel": "Модель содержимого fromtext. Если не задана, будет угадана по другим параметрам.", + "apihelp-compare-param-fromcontentformat": "Формат сериализации содержимого fromtext.", + "apihelp-compare-param-totitle": "Заголовок второй сравниваемой страницы.", + "apihelp-compare-param-toid": "Идентификатор второй сравниваемой страницы.", + "apihelp-compare-param-torev": "Вторая сравниваемая версия.", + "apihelp-compare-param-torelative": "Использовать версию, относящуюся к определённойfromtitle, fromid или fromrev Все другие опции 'to' будут проигнорированы.", + "apihelp-compare-param-totext": "Используйте этот текст вместо содержимого версии, заданной totitle, toid или torev.", + "apihelp-compare-param-topst": "Выполнить преобразование перед записью правки (PST) над totext.", + "apihelp-compare-param-tocontentmodel": "Модель содержимого totext. Если не задана, будет угадана по другим параметрам.", + "apihelp-compare-param-tocontentformat": "Формат сериализации содержимого totext.", + "apihelp-compare-param-prop": "Какую информацию получить.", + "apihelp-compare-paramvalue-prop-diff": "HTML разницы.", + "apihelp-compare-paramvalue-prop-diffsize": "Размер HTML разницы в байтах.", + "apihelp-compare-paramvalue-prop-rel": "Идентификаторы предыдущей к 'from' и следующей за 'to' версий.", + "apihelp-compare-paramvalue-prop-ids": "Идентификаторы страниц и версий 'from' и 'to'.", + "apihelp-compare-paramvalue-prop-title": "Названия страниц для версий 'from' и 'to'.", + "apihelp-compare-paramvalue-prop-user": "Имя и идентификатор участника для версий 'from' и 'to'.", + "apihelp-compare-paramvalue-prop-comment": "Описания правок для версий 'from' и 'to'.", + "apihelp-compare-paramvalue-prop-parsedcomment": "Распарсенные описания правок для версий 'from' и 'to'.", + "apihelp-compare-paramvalue-prop-size": "Размер версий 'from' и 'to'.", + "apihelp-compare-example-1": "Создать разницу между версиями 1 и 2.", + "apihelp-createaccount-summary": "Создание новой учётной записи.", + "apihelp-createaccount-param-preservestate": "Если запрос [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] возвращает true для hasprimarypreservedstate, то запросы, отмеченные как primary-required, должны быть пропущены. Если запрос возвращает непустое значение поля preservedusername, то это значение должно быть использовано в параметре username.", + "apihelp-createaccount-example-create": "Начать создание участника Example с паролем ExamplePassword.", "apihelp-createaccount-param-name": "Имя участника.", - "apihelp-createaccount-param-password": "Пароль (ignored if $1mailpassword is set).", - "apihelp-createaccount-param-domain": "Домен для внешней аутентификации (дополнительно).", - "apihelp-createaccount-param-token": "Создание учетной записи токена, полученные в первом запросе.", - "apihelp-createaccount-param-email": "Адрес электронной почты пользователя (дополнительно).", - "apihelp-createaccount-param-realname": "Настоящее имя пользователя (дополнительно).", - "apihelp-createaccount-param-mailpassword": "Если установлено любое значение, случайный пароль будет выслан пользователю.", - "apihelp-createaccount-param-reason": "Дополнительная причина создания учетной записи для записи в журнал.", - "apihelp-createaccount-param-language": "Установить код языка по умолчанию для пользователя (необязательный, по умолчанию используется язык содержимого).", - "apihelp-createaccount-example-pass": "Создать пользователя testuser с паролем test123.", - "apihelp-createaccount-example-mail": "Создать пользователя testmailuser и адрес электронной почты, сгенерировать случайный пароль.", - "apihelp-cspreport-description": "Используемые браузеры сообщать о нарушениях политики безопасности. Этот модуль никогда не должно использоваться, за исключением, когда автоматически используется совместимый КРИПТОПРОВАЙДЕР веб-браузер.", - "apihelp-cspreport-param-reportonly": "Отметить как доклад по мониторингу политики, а не принудительная политика", - "apihelp-cspreport-param-source": "Что генерируется Заголовок СКП, которые вызвали этот доклад", - "apihelp-delete-description": "Удалить страницу.", - "apihelp-delete-param-title": "Заголовок страницы удалить. Совместное использование с $1страницы невозможно.", - "apihelp-delete-param-pageid": "Идентификатор страницы для удаления. Нельзя использовать вместе с $1титул.", - "apihelp-delete-param-reason": "Причиной для удаления. Если не задано, автоматически сгенерированный причина будет использоваться.", - "apihelp-delete-param-tags": "Изменить теги для подачи заявки на запись в журнале удаления.", - "apihelp-delete-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.", - "apihelp-delete-param-watchlist": "Безоговорочно добавить или удалить страницы из списка наблюдения текущего пользователя, используйте предпочтения или не менять часы.", - "apihelp-delete-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.", - "apihelp-delete-example-simple": "удалить Main Page.", - "apihelp-delete-example-reason": "Удалить Main Page причина Preparing for move.", - "apihelp-disabled-description": "Этот модуль был отключен.", - "apihelp-edit-description": "Создать и отредактировать страницы.", - "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.", - "apihelp-edit-param-text": "Содержание страницы.", - "apihelp-edit-param-tags": "Изменить теги для подачи заявки на пересмотр.", - "apihelp-edit-param-minor": "Незначительное изменение (малая правка).", - "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).", + "apihelp-createaccount-param-password": "Пароль (будет проигнорирован, если задан параметр $1mailpassword).", + "apihelp-createaccount-param-domain": "Домен для внешней аутентификации (необязательно).", + "apihelp-createaccount-param-token": "Токен создания учётной записи, полученный в первом запросе.", + "apihelp-createaccount-param-email": "Адрес электронной почты участника (необязательно).", + "apihelp-createaccount-param-realname": "Настоящее имя участника (необязательно).", + "apihelp-createaccount-param-mailpassword": "При установке любого значения, случайный пароль будет выслан участнику по электронной почте.", + "apihelp-createaccount-param-reason": "Причина создания учетной записи для записи в журнал (необязательно).", + "apihelp-createaccount-param-language": "Языковой код, который будет установлен в качестве основного языка участника (необязательно, по умолчанию используется основной язык вики).", + "apihelp-createaccount-example-pass": "Создать участника testuser с паролем test123.", + "apihelp-createaccount-example-mail": "Создать участника testmailuser и прислать на электронную почту случайно сгенерированный пароль.", + "apihelp-cspreport-summary": "Используется браузерами, чтобы сообщать о нарушениях политики безопасности (CSP). Этот модуль никогда не должен использоваться, за исключением случаев автоматического использования совместимыми с CSP браузерами.", + "apihelp-cspreport-param-reportonly": "Отметить как доклад от политики мониторинга, не от принудительной политики", + "apihelp-cspreport-param-source": "Что сгенерировало заголовок SCP, вызвавший этот доклад", + "apihelp-delete-summary": "Удаление страницы.", + "apihelp-delete-param-title": "Заголовок удаляемой страницы. Нельзя использовать одновременно с $1pageid.", + "apihelp-delete-param-pageid": "Идентификатор удаляемой страницы. Нельзя использовать одновременно с $1title.", + "apihelp-delete-param-reason": "Причина удаления. Если не задана, будет использована автоматически сгенерированная причина.", + "apihelp-delete-param-tags": "Изменить метки записи в журнале удалений.", + "apihelp-delete-param-watch": "Добавить страницу в список наблюдения текущего участника.", + "apihelp-delete-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", + "apihelp-delete-param-unwatch": "Удалить страницу из списка наблюдения текущего участника.", + "apihelp-delete-param-oldimage": "Название старого удаляемого изображения, предоставляемое [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", + "apihelp-delete-example-simple": "Удалить Main Page.", + "apihelp-delete-example-reason": "Удалить Main Page с причиной Preparing for move.", + "apihelp-disabled-summary": "Этот модуль был отключен.", + "apihelp-edit-summary": "Создание и редактирование страниц.", + "apihelp-edit-param-title": "Название редактируемой страницы. Нельзя использовать одновременно с $1pageid.", + "apihelp-edit-param-pageid": "Идентификатор редактируемой страницы. Нельзя использовать одновременно с $1title.", + "apihelp-edit-param-section": "Номер раздела. 0 для верхнего раздела, new для нового раздела.", + "apihelp-edit-param-sectiontitle": "Заголовок нового раздела.", + "apihelp-edit-param-text": "Содержимое страницы.", + "apihelp-edit-param-summary": "Описание изменений. Также является заголовком раздела, когда используется $1section=new, а $1sectiontitle не задано.", + "apihelp-edit-param-tags": "Изменить метки записи в истории изменений.", + "apihelp-edit-param-minor": "Малая правка.", + "apihelp-edit-param-notminor": "Не малая правка.", "apihelp-edit-param-bot": "Пометить правку как сделанную ботом.", - "apihelp-edit-param-recreate": "Возвращает сообщение об ошибке не, если страница тем временем был удален.", + "apihelp-edit-param-basetimestamp": "Временная метка редактируемой версии, используется для обнаружения конфликтов редактирования. Может быть получена посредством [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].", + "apihelp-edit-param-starttimestamp": "Метка времени начала редактирования, используется для обнаружения конфликтов редактирования. Необходимое значение может быть получено с помощью [[Special:ApiHelp/main|curtimestamp]] в начале редактирования (то есть, после загрузки содержимого редактируемой страницы).", + "apihelp-edit-param-recreate": "Игнорировать предупреждение о том, что страница была удалена во время редактирования.", "apihelp-edit-param-createonly": "Не редактировать страницу, если она уже существует.", "apihelp-edit-param-nocreate": "Выбрасывать ошибку, если страницы не существует.", - "apihelp-edit-param-watch": "Добавить страницу к текущему списку наблюдения пользователя.", - "apihelp-edit-param-unwatch": "Удалить страницу из списка наблюдения текущего пользователя.", - "apihelp-edit-param-watchlist": "Безоговорочно добавить или удалить страницы из списка наблюдения текущего пользователя, используйте предпочтения или не менять часы.", - "apihelp-edit-param-md5": "MD5-хеша $1текстовый параметр, или $1prependtext и $1appendtext параметры объединяются. Если установлен, то изменение не будет сделано, если хэш является правильным.", - "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-edit-param-token": "Маркер всегда должен быть послан в качестве последнего параметра, или, по крайней мере, после $1текстовый параметр.", - "apihelp-edit-example-edit": "Редактировать страницу", + "apihelp-edit-param-watch": "Добавить страницу в список наблюдения текущего участника.", + "apihelp-edit-param-unwatch": "Удалить страницу из списка наблюдения текущего участника.", + "apihelp-edit-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", + "apihelp-edit-param-md5": "MD5-хеш параметра $1text, или конкатенации параметров $1prependtext и $1apendtext. Если задан, правка не будет выполнена, если хеш некорректен.", + "apihelp-edit-param-prependtext": "Добавить этот текст в начало страницы. Переопределяет $1text.", + "apihelp-edit-param-appendtext": "Добавить этот текст в конец страницы. Переопределяет $text.\n\nДля создания нового раздела, используйте $1section=new, а не этот параметр.", + "apihelp-edit-param-undo": "Отменить это изменение. Переопределяет $text, $1prependtext и $1appendtext.", + "apihelp-edit-param-undoafter": "Отменить все изменения от $1undo до данного. Если не задано, просто отменить одно изменение.", + "apihelp-edit-param-redirect": "Автоматически разрешать перенаправления.", + "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для введённого текста.", + "apihelp-edit-param-contentmodel": "Модель нового содержимого.", + "apihelp-edit-param-token": "Токен всегда должен быть послан в качестве последнего параметра, или, по крайней мере, после параметра $1text.", + "apihelp-edit-example-edit": "Редактировать страницу.", "apihelp-edit-example-prepend": "Добавить магическое слово __NOTOC__ в начало страницы.", - "apihelp-edit-example-undo": "Отменить изменения с 13579 по 13585 с добавлением автоматического описания правки.", - "apihelp-emailuser-description": "Письмо участнику", - "apihelp-emailuser-param-target": "Адресат электронного письма", + "apihelp-edit-example-undo": "Отменить изменения с 13579 по 13585 с автоматическим описанием правки.", + "apihelp-emailuser-summary": "Написание электронных писем участнику.", + "apihelp-emailuser-param-target": "Адресат электронного письма.", "apihelp-emailuser-param-subject": "Заголовок темы.", - "apihelp-emailuser-param-text": "Содержание письма", + "apihelp-emailuser-param-text": "Содержание письма.", "apihelp-emailuser-param-ccme": "Отправить копию этого сообщения мне.", - "apihelp-emailuser-example-email": "Отправить письмо пользователю WikiSysop с текстом Content.", - "apihelp-expandtemplates-description": "Разворачивает все шаблоны в викитекст.", + "apihelp-emailuser-example-email": "Отправить письмо участнику WikiSysop с текстом Content.", + "apihelp-expandtemplates-summary": "Разворачивание всех шаблонов в вики-текст.", "apihelp-expandtemplates-param-title": "Заголовок страницы.", - "apihelp-expandtemplates-param-text": "Викитекст для конвертирования", + "apihelp-expandtemplates-param-text": "Конвертируемый вики-текст.", "apihelp-expandtemplates-param-revid": "Номер версии, для {{REVISIONID}} и аналогичных переменных.", - "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-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-namespace": "По какому пространству имён фильтровать вклад.", + "apihelp-expandtemplates-paramvalue-prop-modules": "Любые модули ResourceLoader, запрашиваемые функциями парсера на добавление в результат. Одновременно с modules должен быть запрошен либо jsconfigvars, либо encodedjsconfigvars.", + "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-expandtemplates-example-simple": "Развернуть вики-текст {{Project:Sandbox}}.", + "apihelp-feedcontributions-summary": "Возвращает ленту с вкладом участников.", + "apihelp-feedcontributions-param-feedformat": "Формат ленты.", + "apihelp-feedcontributions-param-user": "Вклад каких участников получить.", + "apihelp-feedcontributions-param-namespace": "Вклад в каком пространстве имён показать.", "apihelp-feedcontributions-param-year": "От года (и ранее).", "apihelp-feedcontributions-param-month": "От месяца (и ранее).", - "apihelp-feedcontributions-param-tagfilter": "Взносы фильтра, которые имеют эти теги.", + "apihelp-feedcontributions-param-tagfilter": "Показать вклад, содержащий данные метки.", "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.", "apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.", - "apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.", + "apihelp-feedcontributions-param-newonly": "Показать только правки, являющиеся созданием страниц.", "apihelp-feedcontributions-param-hideminor": "Скрыть малые правки.", - "apihelp-feedcontributions-param-showsizediff": "Показать размер различия между версиями.", + "apihelp-feedcontributions-param-showsizediff": "Показать объём изменений между версиями.", "apihelp-feedcontributions-example-simple": "Показать вклад участника Example.", + "apihelp-feedrecentchanges-summary": "Возвращает ленту последних изменений.", + "apihelp-feedrecentchanges-param-feedformat": "Формат ленты.", + "apihelp-feedrecentchanges-param-namespace": "Пространство имён, которым ограничить результат.", "apihelp-feedrecentchanges-param-invert": "Все пространства имён, кроме выбранного.", + "apihelp-feedrecentchanges-param-associated": "Включить связанное (обсуждения или основное) пространство имён.", + "apihelp-feedrecentchanges-param-days": "Сколькими днями ограничить результат.", "apihelp-feedrecentchanges-param-limit": "Максимальное число возвращаемых результатов.", "apihelp-feedrecentchanges-param-from": "Показать изменения с тех пор.", "apihelp-feedrecentchanges-param-hideminor": "Скрыть малые правки.", "apihelp-feedrecentchanges-param-hidebots": "Скрыть правки ботов.", - "apihelp-feedrecentchanges-param-hideanons": "Скрыть изменения, внесённые анонимными участниками.", + "apihelp-feedrecentchanges-param-hideanons": "Скрыть правки анонимных участников.", "apihelp-feedrecentchanges-param-hideliu": "Скрыть правки зарегистрированных участников.", - "apihelp-feedrecentchanges-param-hidepatrolled": "Скрыть отпатруллированные правки.", - "apihelp-feedrecentchanges-param-hidemyself": "Скрыть изменения, сделанные текущим участником.", - "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по тегам.", + "apihelp-feedrecentchanges-param-hidepatrolled": "Скрыть отпатрулированные правки.", + "apihelp-feedrecentchanges-param-hidemyself": "Скрыть правки текущего участника.", + "apihelp-feedrecentchanges-param-hidecategorization": "Скрыть категоризацию страниц.", + "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по меткам.", "apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.", "apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.", + "apihelp-feedrecentchanges-param-categories": "Показать только правки на страницах, включённых во все данные категории.", + "apihelp-feedrecentchanges-param-categories_any": "Показать только правки на страницах, включённых в хотя бы одну из данных категорий.", "apihelp-feedrecentchanges-example-simple": "Список последних изменений.", - "apihelp-feedrecentchanges-example-30days": "Показать последние изменения в течение 30 дней.", - "apihelp-feedwatchlist-param-feedformat": "Биреү форматы.", - "apihelp-feedwatchlist-param-hours": "Был ваҡыттан алып үҙгәртелгән биттәр исемлеге", + "apihelp-feedrecentchanges-example-30days": "Список последних изменений за 30 дней.", + "apihelp-feedwatchlist-summary": "Возвращает ленту списка наблюдения.", + "apihelp-feedwatchlist-param-feedformat": "Формат ленты.", + "apihelp-feedwatchlist-param-hours": "Список страниц, отредактированных столько часов назад.", "apihelp-feedwatchlist-param-linktosections": "Ссылаться прямо на разделы с изменениями, если возможно.", - "apihelp-feedwatchlist-example-default": "Күҙәтеү каналын күрһәтергә", - "apihelp-feedwatchlist-example-all6hrs": "Күҙәтелгән биттәрҙә һуңғы 6 сәғәт эсендәге үҙгәрештәрҙе күрһәтергә.", - "apihelp-filerevert-description": "Файлды иҫке версияға ҡайтарырға.", - "apihelp-filerevert-param-filename": "Целевое имя файла без префикса File:.", - "apihelp-filerevert-param-comment": "Загрузить комментарий.", + "apihelp-feedwatchlist-example-default": "Показать ленту списка наблюдения.", + "apihelp-feedwatchlist-example-all6hrs": "Показать все изменения на наблюдаемых страницах за последние 6 часов.", + "apihelp-filerevert-summary": "Возвращение файла к старой версии.", + "apihelp-filerevert-param-filename": "Целевое имя файла без префикса «Файл:».", + "apihelp-filerevert-param-comment": "Комментарий загрузки.", + "apihelp-filerevert-param-archivename": "Архивное название возвращаемой версии.", "apihelp-filerevert-example-revert": "Откат Wiki.png к версии от 2011-03-05T15:27:40Z.", - "apihelp-help-param-helpformat": "Белешмә яҙыу форматы.", + "apihelp-help-summary": "Отображение справки указанных модулей.", + "apihelp-help-param-modules": "Модули, справку которых необходимо отобразить (значения параметров action и format, или main). Можно указывать подмодули с помощью +.", + "apihelp-help-param-submodules": "Включить справку подмодулей заданного модуля.", + "apihelp-help-param-recursivesubmodules": "Включить справку подмодулей рекурсивно.", + "apihelp-help-param-helpformat": "Формат вывода справки.", + "apihelp-help-param-wrap": "Обернуть вывод в стандартную структуру API-ответа.", + "apihelp-help-param-toc": "Включить содержание в вывод HTML.", "apihelp-help-example-main": "Помощь по главному модулю.", - "apihelp-help-example-recursive": "Вся справка в одном разделе.", - "apihelp-imagerotate-description": "Поворот одного или нескольких изображений.", + "apihelp-help-example-submodules": "Помощь по модулю action=query и его подмодулям.", + "apihelp-help-example-recursive": "Вся справка на одной странице.", + "apihelp-help-example-help": "Справка по самому модулю справки.", + "apihelp-help-example-query": "Справка по двум подмодулям query.", + "apihelp-imagerotate-summary": "Поворот одного или нескольких изображений.", "apihelp-imagerotate-param-rotation": "На сколько градусов по часовой стрелке повернуть изображение.", + "apihelp-imagerotate-param-tags": "Изменить метки записи в журнале загрузок.", "apihelp-imagerotate-example-simple": "Повернуть File:Example.png на 90 градусов.", "apihelp-imagerotate-example-generator": "Повернуть все изображения в Category:Flip на 180 градусов.", + "apihelp-import-summary": "Импорт страницы из другой вики, или из XML-файла.", + "apihelp-import-extended-description": "Обратите внимание, что HTTP POST-запрос должен быть осуществлён как загрузка файла (то есть, с использованием многотомных данных) при отправки файла через параметр xml.", "apihelp-import-param-summary": "Описание записи журнала импорта.", "apihelp-import-param-xml": "Загруженный XML-файл.", - "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей в пространство имён 100.", + "apihelp-import-param-interwikisource": "Для импорта из других вики: импортируемая вики.", + "apihelp-import-param-interwikipage": "Для импорта из других вики: импортируемая страница.", + "apihelp-import-param-fullhistory": "Для импорта из других вики: импортировать полную историю, а не только текущую страницу.", + "apihelp-import-param-templates": "Для импорта из других вики: также импортировать все включённые шаблоны.", + "apihelp-import-param-namespace": "Импортировать в это пространство имён. Не может быть использовано одновременно с $1rootpage.", + "apihelp-import-param-rootpage": "Импортировать в качестве подстраницы данной страницы. Не может быть использовано одновременно с $1namespace.", + "apihelp-import-param-tags": "Изменить метки записи в журнале импорта и нулевой правки в импортируемых страницах.", + "apihelp-import-example-import": "Импортировать [[meta:Help:ParserFunctions]] с полной историей правок в пространство имён 100.", + "apihelp-linkaccount-summary": "Связать аккаунт третьей стороны с текущим участником.", + "apihelp-linkaccount-example-link": "Начать связывание аккаунта с Example
    .", + "apihelp-login-summary": "Вход и получение аутентификационных cookie.", + "apihelp-login-extended-description": "Это действие должно быть использовано только в комбинации со [[Special:BotPasswords]]; использование этого модуля для входа в основной аккаунт не поддерживается и может сбиться без предупреждения. Для безопасного входа в основной аккаунт, используйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Это действие не поддерживается и может сбиться без предупреждения. Для безопасного входа, используйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Имя участника.", "apihelp-login-param-password": "Пароль.", "apihelp-login-param-domain": "Домен (необязательно).", + "apihelp-login-param-token": "Токен входа, полученный при первом запросе.", "apihelp-login-example-gettoken": "Получить токен входа.", "apihelp-login-example-login": "Войти", - "apihelp-logout-description": "Выйти и очистить данные сессии.", - "apihelp-mergehistory-description": "Объединение историй правок", + "apihelp-logout-summary": "Выйти и очистить данные сессии.", + "apihelp-logout-example-logout": "Выйти из текущего участника.", + "apihelp-managetags-summary": "Осуществление задач, связанных с изменением меток.", + "apihelp-managetags-param-operation": "Какую операцию выполнить:\n;create: Создать новую метку для ручного использования.\n;delete: Удалить метку из базы данных, что включает в себя удаление метки со всех версий и записей журналов, где она использовалось.\n;activate: Активировать изменение метки, позволив участникам устанавливать её вручную.\n;deactivate: Деактивировать изменение метки, запретив участникам устанавливать её вручную.", + "apihelp-managetags-param-tag": "Создаваемая, удаляемая, активируемая или деактивируемая метка. Создаваемая метка должна не существовать. Удаляемая метка должна существовать. Активируемая метка должна существовать и не быть использованной в каком-либо расширении. Деактивируемая метка должна существовать и быть заданной вручную.", + "apihelp-managetags-param-reason": "Причина создания, удаления, активирования или деактивирования метки (необязательно).", + "apihelp-managetags-param-ignorewarnings": "Игнорировать ли все предупреждения, возникающие во время операции.", + "apihelp-managetags-param-tags": "Изменить метки записи в журнале управления метками.", + "apihelp-managetags-example-create": "Создать метку с названием spam с причиной For use in edit patrolling.", + "apihelp-managetags-example-delete": "Удалить метку vandlaism с причиной Misspelt.", + "apihelp-managetags-example-activate": "Активировать метку spam с причиной For use in edit patrolling.", + "apihelp-managetags-example-deactivate": "Деактивировать метку spam с причиной No longer required.", + "apihelp-mergehistory-summary": "Объединение историй правок.", + "apihelp-mergehistory-param-from": "Название страницы, история из которой будет объединяться. Не может быть использовано одновременно с $1fromid.", + "apihelp-mergehistory-param-fromid": "Идентификатор страницы, история из которой будет объединяться. Не может быть использовано одновременно с $1from.", + "apihelp-mergehistory-param-to": "Название страницы, в историю которой будет добавлено объединяемое. Не может быть использовано одновременно с $1toid.", + "apihelp-mergehistory-param-toid": "Идентификатор страницы, в историю которой будет добавлено объединяемое. Не может быть использовано одновременно с $1to.", + "apihelp-mergehistory-param-timestamp": "Временная метка, до которой версии будут перемещены из истории страницы-источника в историю целевой страницы. Если опущено, в целевую страницу будет перемещена вся история правок страницы-источника.", "apihelp-mergehistory-param-reason": "Причина для объединения истории.", - "apihelp-move-description": "Переместить страницу.", - "apihelp-move-param-to": "Заголовок, в который следует переименовать страницу.", + "apihelp-mergehistory-example-merge": "Переместить всю историю правок страницы Oldpage на страницу Newpage
    .", + "apihelp-mergehistory-example-merge-timestamp": "Переместить историю правок из Oldpage, совершённых до 2015-12-31T04:37:41Z, на страницу Newpage
    .", + "apihelp-move-summary": "Переименование страницы.", + "apihelp-move-param-from": "Название переименовываемой страницы. Нельзя использовать одновременно с $1fromid.", + "apihelp-move-param-fromid": "Идентификатор переименовываемой страницы. Нельзя использовать одновременно с $1from.", + "apihelp-move-param-to": "Новое название страницы.", "apihelp-move-param-reason": "Причина переименования.", "apihelp-move-param-movetalk": "Переименовать страницу обсуждения, если она есть.", "apihelp-move-param-movesubpages": "Переименовать подстраницы, если это применимо.", "apihelp-move-param-noredirect": "Не создавать перенаправление.", - "apihelp-move-param-watch": "Добавить страницу и перенаправление в список наблюдения текущего пользователя.", - "apihelp-move-param-unwatch": "Удалить страницу и перенаправление из списка наблюдения текущего пользователя.", - "apihelp-move-param-ignorewarnings": "Игнорировать предупреждения", + "apihelp-move-param-watch": "Добавить страницу и перенаправление в список наблюдения текущего участника.", + "apihelp-move-param-unwatch": "Удалить страницу и перенаправление из списка наблюдения текущего участника.", + "apihelp-move-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", + "apihelp-move-param-ignorewarnings": "Игнорировать все предупреждения.", + "apihelp-move-param-tags": "Изменить метки записи в журнале переименований и нулевой правки на переименованной странице.", "apihelp-move-example-move": "Переименовать Badtitle в Goodtitle без оставления перенаправления.", + "apihelp-opensearch-summary": "Поиск по вики с использованием протокола OpenSearch.", "apihelp-opensearch-param-search": "Строка поиска.", "apihelp-opensearch-param-limit": "Максимальное число возвращаемых результатов.", "apihelp-opensearch-param-namespace": "Пространства имён для поиска.", + "apihelp-opensearch-param-suggest": "Ничего не делать, если [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] ложно.", + "apihelp-opensearch-param-redirects": "Как обрабатывать перенаправления:\n;return: Вернуть само перенаправление.\n;resolve: Вернуть целевую страницу. Может вернуть меньше $1limit результатов.\nПо историческим причинам значением по умолчанию является «return» для $1format=json и «resolve» для остальных форматов.", "apihelp-opensearch-param-format": "Формат вывода.", + "apihelp-opensearch-param-warningsaserror": "Если предупреждения возникают при format=json, вернуть ошибку API вместо того, чтобы игнорировать их.", + "apihelp-opensearch-example-te": "Найти страницы, начинающиеся с Te.", + "apihelp-options-summary": "Смена настроек текущего участника.", + "apihelp-options-extended-description": "Менять можно только настройки, зарегистрированные в ядре или в одном из установленных расширений, а также настройки, чьи ключи начинаются с userjs- (предназначенные для использования в пользовательских скриптах).", "apihelp-options-param-reset": "Сбрасывает настройки на установленные по умолчанию.", + "apihelp-options-param-resetkinds": "Список типов сбрасываемых настроек, если задана опция $1reset.", + "apihelp-options-param-change": "Список изменений в формате название=значение (например, skin=vector). Если значения не даётся (нет даже знака равенства), например, названиенастройки|другаянастройка|, настройка будет возвращена в своё значение по умолчанию. Если какое-либо значение должно содержать знак пайпа (|), используйте [[Special:ApiHelp/main#main/datatypes|альтернативный разделитель значений]] для корректного проведения операции.", + "apihelp-options-param-optionname": "Название настройки, которая должна быть установлена в значение, переданное через $1optionvalue.", + "apihelp-options-param-optionvalue": "Значение настройки, заданной $1optionname.", "apihelp-options-example-reset": "Сбросить все настройки.", - "apihelp-paraminfo-description": "Получить информацию о модулях API.", + "apihelp-options-example-change": "Изменить настройки skin и hideminor.", + "apihelp-options-example-complex": "Сбросить все настройки, а затем изменить skin и nickname.", + "apihelp-paraminfo-summary": "Получение информации о модулях API.", + "apihelp-paraminfo-param-modules": "Список названий модулей (значения параметров action и format, или main). Можно указать подмодули с помощью +, все подмодули с помощью +*, или все подмодули рекурсивно с помощью +**.", "apihelp-paraminfo-param-helpformat": "Формат строк справки.", - "apihelp-parse-param-prop": "Какие части информации получить:", - "apihelp-parse-paramvalue-prop-text": "Дает разобранного текста в тексте.", - "apihelp-parse-paramvalue-prop-langlinks": "Возвращает язык ссылки в анализируемой wikitext.", + "apihelp-paraminfo-param-querymodules": "Список модулей query (значения параметров prop, meta или list). Используйте $1modules=query+foo вместо $1querymodules=foo.", + "apihelp-paraminfo-param-mainmodule": "Также получить информацию о главном модуле. Вместо этого используйте $1modules=main.", + "apihelp-paraminfo-param-pagesetmodule": "Также получить информацию о модуле pageset (предоставляющем titles= и синонимы).", + "apihelp-paraminfo-param-formatmodules": "Список названий форматных модулей (значения параметра format). Вместо этого используйте $1modules.", + "apihelp-paraminfo-example-1": "Показать информацию для [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], и [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", + "apihelp-paraminfo-example-2": "Показать информацию для всех подмодулей [[Special:ApiHelp/query|action=query]].", + "apihelp-parse-summary": "Парсит содержимое и возвращает результат парсинга.", + "apihelp-parse-extended-description": "См. различные prop-модули [[Special:ApiHelp/query|action=query]] для получения информации о текущей версии страницы.\n\nЕсть несколько способов указать текст для парсинга:\n# Указать страницы или версию, используя $1page, $1pageid или $1oldid.\n# Явно указать содержимое, используя $1text, $1title и $1contentmodel.\n# Указать описание правки. Параметру $1prop должно быть присвоено пустое значение.", + "apihelp-parse-param-title": "Название страницы, которой принадлежит текст. Если опущено, должен быть указан параметр $1contentmodel, и в качестве заголовка будет использовано [[API]].", + "apihelp-parse-param-text": "Распарсиваемый текст. Используйте $1title или $1contentmodel для управления моделью содержимого.", + "apihelp-parse-param-summary": "Анализируемое описание правки.", + "apihelp-parse-param-page": "Распарсить содержимое этой страницы. Не может быть использовано совместно с $1text и $1title.", + "apihelp-parse-param-pageid": "Анализировать содержимое этой страницы. Переопределяет $1page.", + "apihelp-parse-param-redirects": "Если значением $1page или $1pageid указано перенаправление, разрешить его.", + "apihelp-parse-param-oldid": "Распарсить содержимое этой версии. Переопределяет $1page и $1pageid.", + "apihelp-parse-param-prop": "Какую информацию включить:", + "apihelp-parse-paramvalue-prop-text": "Возвращает текст распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-langlinks": "Возвращает языковые ссылки из распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-categories": "Возвращает категории из проанализированного вики-текста.", "apihelp-parse-paramvalue-prop-categorieshtml": "Возвращает HTML-версию категорий.", - "apihelp-parse-param-disablepp": "Урынына $1disablelimitreport ҡулланырға.", - "apihelp-parse-param-preview": "Алдан ҡарау режимында синтаксик анализ", - "apihelp-parse-param-disabletoc": "Не включать в вывод таблицу содержания.", - "apihelp-parse-example-page": "анализ страницы", - "apihelp-parse-example-text": "Анализ wikitext.", - "apihelp-parse-example-summary": "Һығымтаны тикшереү.", - "apihelp-patrol-param-rcid": "Яңы үҙгәртеүҙәрҙе ҡарау идентификаторы.", - "apihelp-patrol-param-revid": "Ҡарау версияһы идентификаторы.", - "apihelp-patrol-example-rcid": "Һуңғы үҙгәрештәрҙе ҡарау.", - "apihelp-patrol-example-revid": "Яңынан ҡарау.", - "apihelp-protect-description": "Изменить уровень защиты страницы.", - "apihelp-protect-param-title": "Бит атамаһы. $1pageid менән бергә ҡулланылмай.", - "apihelp-protect-param-reason": "(ООН) һағы сәбәптәре.", + "apihelp-parse-paramvalue-prop-links": "Возвращает внутренние ссылки из распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-templates": "Возвращает шаблоны из проанализированного вики-текста.", + "apihelp-parse-paramvalue-prop-images": "Возвращает изображения из распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-externallinks": "Возвращает внешние ссылки из распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-sections": "Возвращает разделы из проанализированного вики-текста.", + "apihelp-parse-paramvalue-prop-revid": "Добавляет идентификатор версии распарсенной страницы.", + "apihelp-parse-paramvalue-prop-displaytitle": "Добавляет название проанализированного вики-текста.", + "apihelp-parse-paramvalue-prop-headitems": "Возвращает элементы, которые следует поместить в <head> страницы.", + "apihelp-parse-paramvalue-prop-headhtml": "Возвращает распарсенный <head> страницы.", + "apihelp-parse-paramvalue-prop-modules": "Возвращает использованные на странице модули ResourceLoader. Для загрузки, используйте mw.loader.using(). Одновременно с modules должно быть запрошено либо jsconfigvars, либо encodedjsconfigvars.", + "apihelp-parse-paramvalue-prop-jsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы. Для их применения используйте mw.condig.set().", + "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Возвращает переменные JavaScript с данными настроек для этой страницы в виде JSON-строки.", + "apihelp-parse-paramvalue-prop-indicators": "Возвращает HTML-код индикаторов, использованных на данной странице.", + "apihelp-parse-paramvalue-prop-iwlinks": "Возвращает интервики-ссылки из распарсенного вики-текста.", + "apihelp-parse-paramvalue-prop-wikitext": "Возвращает исходный распарсиваемый вики-текст.", + "apihelp-parse-paramvalue-prop-properties": "Возвращает различные свойства, объявленные в проанализированном вики-тексте.", + "apihelp-parse-paramvalue-prop-limitreportdata": "Возвращает структурированный отчёт о лимите. Не возвращает данных, если задан $1disablelimitreport.", + "apihelp-parse-paramvalue-prop-limitreporthtml": "Возвращает HTML-версию отчёта о лимите. Не возвращает данных, если задан $1disablelimitreport.", + "apihelp-parse-paramvalue-prop-parsetree": "Дерево парсинга XML содержимого версии (требуется модель содержимого $1).", + "apihelp-parse-paramvalue-prop-parsewarnings": "Возвращает предупреждения, возникшие во время анализа.", + "apihelp-parse-param-wrapoutputclass": "CSS-класс, используемый для оборачивания вывода парсера.", + "apihelp-parse-param-pst": "Выполнить преобразование перед записью правки (PST) до того, как начать анализировать текст. Доступно только когда используется с текстом.", + "apihelp-parse-param-onlypst": "Выполнить преобразование перед записью правки (PST) входных данных, но не парсить их. Возвращает тот же вики-текст после применения PST. Доступно только при применении с $1text.", + "apihelp-parse-param-effectivelanglinks": "Включает языковые ссылки, обеспечиваемые расширениями (для использования с $1prop=langlinks).", + "apihelp-parse-param-section": "Распарсить содержимое только секции с заданным номером.\n\nЕсли задан new, распарсить $1text и $1sectiontitle так, как будто добавлена новая секция на страницу.\n\nnew доступен только при заданном text.", + "apihelp-parse-param-sectiontitle": "Название новой секции, когда section имеет значение new.\n\nВ отличие от редактирования страницы, оно не примет значение параметра summary, если опустить его или оставить пустым.", + "apihelp-parse-param-disablelimitreport": "Опустить отчёт о лимите («NewPP limit report») из результата парсинга.", + "apihelp-parse-param-disablepp": "Вместо этого используйте $1disablelimitreport.", + "apihelp-parse-param-disableeditsection": "Опустить ссылки на редактирование разделов из результата парсинга.", + "apihelp-parse-param-disabletidy": "Не проводить очистку HTML (например, с помощью tidy) результатов парсинга.", + "apihelp-parse-param-generatexml": "Сгенерировать дерево парсинга XML (требуется модель содержимого $1, замещено $2prop=parsetree).", + "apihelp-parse-param-preview": "Проанализировать в режиме препросмотра.", + "apihelp-parse-param-sectionpreview": "Распарсить в режиме предпросмотра раздела (также активирует режим предпросмотра).", + "apihelp-parse-param-disabletoc": "Не включать в вывод содержание.", + "apihelp-parse-param-useskin": "Применить выбранную тему оформления к результату работы парсера. Может затронуть следующие свойства: langlinks, headitems, modules, jsconfigvars, indicators.", + "apihelp-parse-param-contentformat": "Формат сериализации содержимого, использующийся во входном тексте. Доступен только при использовании с $1text.", + "apihelp-parse-param-contentmodel": "Модель содержимого входного текста. Если пропущена, должен быть задан $1title, и значение по умолчанию будет взято в зависимости от указанного названия. Доступно только при использовании с $1text.", + "apihelp-parse-example-page": "Парсинг страницы.", + "apihelp-parse-example-text": "Анализ вики-текста.", + "apihelp-parse-example-texttitle": "Парсинг вики-текста с заданным заголовком страницы.", + "apihelp-parse-example-summary": "Анализ описания правки.", + "apihelp-patrol-summary": "Патрулирование страницы или версии.", + "apihelp-patrol-param-rcid": "Идентификатор патрулируемой последней правки.", + "apihelp-patrol-param-revid": "Идентификатор патрулируемой версии.", + "apihelp-patrol-param-tags": "Изменить метки записи в журнале патрулирования.", + "apihelp-patrol-example-rcid": "Патрулировать недавние изменения.", + "apihelp-patrol-example-revid": "Отпатрулировать версию.", + "apihelp-protect-summary": "Изменение уровня защиты страницы.", + "apihelp-protect-param-title": "Название (раз)защищаемой страницы. Не может использоваться одновременно с $1pageid.", + "apihelp-protect-param-pageid": "Идентификатор (раз)защищаемой страницы. Не может использоваться одновременно с $1title.", + "apihelp-protect-param-protections": "Список уровней защиты в формате действие=уровень (например, edit=sysop). Уровень all означает, что кто угодно может осуществлять действие, то есть, нет ограничений.\n\nПримечания: Все неперечисленные действия потеряют уровни защиты.", + "apihelp-protect-param-expiry": "Временная метка истечения защиты. Если задана только одна метка, она будет использована для всех защит. Используйте infinite, indefinite, infinity или never для бессрочных защит.", + "apihelp-protect-param-reason": "Причина (раз)защиты.", + "apihelp-protect-param-tags": "Изменить метки записи в журнале защиты.", + "apihelp-protect-param-cascade": "Активировать каскадную защиту (то есть, защитить включённые шаблоны и использованные изображения). Игнорируется, если ни один из заданных уровней не поддерживает каскадную защиту.", + "apihelp-protect-param-watch": "Если задан, добавить (раз)защищаемую страницу в список наблюдения текущего участника.", + "apihelp-protect-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", "apihelp-protect-example-protect": "Защитить страницу.", - "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения all (т. е. любой желающий может принять меры).", - "apihelp-protect-example-unprotect2": "Бер ниндәй сикләүҙәр ҡуймай биттән һаҡлауҙы алырға.", - "apihelp-purge-param-forcelinkupdate": "Обновление связей таблиц.", + "apihelp-protect-example-unprotect": "Снять защиту страницы, установив ограничения all (то есть, позволив всем проводить действия над страницей).", + "apihelp-protect-example-unprotect2": "Снять защиту страницу, не указав ограничений.", + "apihelp-purge-summary": "Очистка кэша заданных страниц.", + "apihelp-purge-param-forcelinkupdate": "Обновить таблицы ссылок.", "apihelp-purge-param-forcerecursivelinkupdate": "Обновить таблицу ссылок для данной страницы, а также всех страниц, использующих данную как шаблон.", - "apihelp-purge-example-generator": "Продувка первые 10 страниц в основном пространстве имен.", - "apihelp-query-param-list": "Какие списки использовать", - "apihelp-query-param-meta": "Какие метаданные использовать", - "apihelp-query+allcategories-description": "Перечислить все категории.", - "apihelp-query+allcategories-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", - "apihelp-query+allcategories-param-dir": "Сортлау йүнәлештәре.", + "apihelp-purge-example-simple": "Очистить кэш для страниц Main Page и API.", + "apihelp-purge-example-generator": "Очистить кэш первых 10 страниц в основном пространстве имен.", + "apihelp-query-summary": "Запросить данные с и о MediaWiki.", + "apihelp-query-extended-description": "Все модификации данных сначала должны запросить соответствующий токен для предотвращения злоупотреблений с вредоносных сайтов.", + "apihelp-query-param-prop": "Какие использовать свойства для запрашиваемых страниц.", + "apihelp-query-param-list": "Какие списки использовать.", + "apihelp-query-param-meta": "Какие метаданные использовать.", + "apihelp-query-param-indexpageids": "Включить дополнительную секцию pageids, содержащую список идентификаторов всех возвращённых страниц.", + "apihelp-query-param-export": "Экспортировать текущую версию для всех данных или сгенерированных страниц.", + "apihelp-query-param-exportnowrap": "Вернуть экспортируемый XML без оборачивания его в XML-результат (тот же формат, что и в [[Special:Export]]). Можно использовать только одновременно с $1export.", + "apihelp-query-param-iwurl": "Возвращать ли полную ссылку, если названием является интервики-ссылка.", + "apihelp-query-param-rawcontinue": "Вернуть сырые данные в query-continue для продолжения.", + "apihelp-query-example-revisions": "Получить [[Special:ApiHelp/query+siteinfo|site info]] и [[Special:ApiHelp/query+revisions|последнее изменение]] для Main Page.", + "apihelp-query-example-allpages": "Получить последнее изменение для страниц, начиная с API/.", + "apihelp-query+allcategories-summary": "Перечисление всех категорий.", + "apihelp-query+allcategories-param-from": "Категория, с которой начать перечисление.", + "apihelp-query+allcategories-param-to": "Категория, на которой закончить перечисление.", + "apihelp-query+allcategories-param-prefix": "Найти все названия категорий, начинающиеся с этого значения.", + "apihelp-query+allcategories-param-dir": "Порядок сортировки.", + "apihelp-query+allcategories-param-min": "Вернуть только категории, в которых не меньше заданного числа страниц.", + "apihelp-query+allcategories-param-max": "Вернуть только категории, в которых не больше заданного числа страниц.", "apihelp-query+allcategories-param-limit": "Сколько категорий вернуть.", "apihelp-query+allcategories-param-prop": "Какие свойства получить:", - "apihelp-query+allcategories-paramvalue-prop-size": "Категорияларға биттәр һаны өҫтәү", - "apihelp-query+allcategories-example-size": "Биттәр һаны буйынса мәғлүмәтле категориялар исемлеге.", - "apihelp-query+allcategories-example-generator": "исемлек категориялар битенән мәғлүмәт алырға.", - "apihelp-query+alldeletedrevisions-description": "Бар мөхәррирләү исемлеге ҡулланыусы тарафынан юйылған.", - "apihelp-query+alldeletedrevisions-paraminfo-useronly": "$3ҡулланыусының менән генә ҡулланыла ала.", - "apihelp-query+alldeletedrevisions-param-start": "Һанауҙы башлау ваҡытын билдәләү", - "apihelp-query+alldeletedrevisions-param-end": "Һанай башлау ваҡытын билдәләү.", - "apihelp-query+alldeletedrevisions-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", - "apihelp-query+alldeletedrevisions-param-user": "Бары тик был ҡулланыусының үҙгәртеүҙәр исемлеге.", - "apihelp-query+alldeletedrevisions-param-excludeuser": "Был ҡулланыусының үҙгәртеүҙәр исемлеге түгел.", - "apihelp-query+alldeletedrevisions-param-namespace": "Бары тик был исемдәр арауығындағы биттәр исемлеге.", - "apihelp-query+alldeletedrevisions-example-ns-main": "Төп исемдәр арауығында юйылған тәүге 50 үҙгәртеү исемлеге.", - "apihelp-query+allfileusages-description": "Юйылғандар менән бергә барлыҡ файлдар тәртибе исемлеге.", - "apihelp-query+allfileusages-param-from": "Һанауҙы башлау өсөн файл атамаһы.", - "apihelp-query+allfileusages-param-to": "Һанауҙы туҡтатыу файлы атамаһы.", - "apihelp-query+allfileusages-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.", - "apihelp-query+allfileusages-param-prop": "Ҡайһы мәғлүмәтте күрһәтергә:", - "apihelp-query+allfileusages-paramvalue-prop-title": "Файл атамаһына ҡуша.", - "apihelp-query+allfileusages-param-limit": "Нисә битте тергеҙергә?", - "apihelp-query+allfileusages-param-dir": "Һанау йүнәлеше.", - "apihelp-query+allfileusages-example-unique": "Атамаларҙың уҙенсәлекле файлдары исемлеге.", - "apihelp-query+allfileusages-example-unique-generator": "Төшөп ҡалғандарҙы айырып, барлыҡ исем-һылтанмаларҙы алырға.", - "apihelp-query+allfileusages-example-generator": "Файлдар менән биттәр бар.", - "apihelp-query+allimages-description": "Бер-бер артлы бөтә образдарҙы һанап сығырға.", - "apihelp-query+allimages-param-sort": "Сортировкалау үҙенсәлектәре.", - "apihelp-query+allimages-param-dir": "Һанау йүнәлеше.", - "apihelp-query+allimages-param-minsize": "Һүрәттәр лимиты (байттарҙа).", - "apihelp-query+allimages-param-maxsize": "Бар һүрәттәр лимиты (байттарҙа).", - "apihelp-query+allimages-param-limit": "Кире ҡайтыу өсөн образдар һаны.", - "apihelp-query+allimages-example-B": "Б хәрефенән башланған файлдар исемлеген күрһәтергә.", + "apihelp-query+allcategories-paramvalue-prop-size": "Добавляет количество страниц в категории.", + "apihelp-query+allcategories-paramvalue-prop-hidden": "Отмечает категории, скрытые магическим словом __HIDDENCAT__.", + "apihelp-query+allcategories-example-size": "Составить список категорий с информацией о числе страниц в каждой из них.", + "apihelp-query+allcategories-example-generator": "Получить информацию о самой странице категории для категорий, начинающихся с List.", + "apihelp-query+alldeletedrevisions-summary": "Перечисление всех удалённых версий указанного участника или в указанном пространстве имён.", + "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Может быть использовано только одновременно с $3user.", + "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Не может быть использовано одновременно с $3user.", + "apihelp-query+alldeletedrevisions-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+alldeletedrevisions-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+alldeletedrevisions-param-from": "Начать перечисление на этом заголовке.", + "apihelp-query+alldeletedrevisions-param-to": "Закончить перечисление на этом заголовке.", + "apihelp-query+alldeletedrevisions-param-prefix": "Найти все названия страниц, начинающиеся с этого значения.", + "apihelp-query+alldeletedrevisions-param-tag": "Только правки с заданной меткой.", + "apihelp-query+alldeletedrevisions-param-user": "Только правки данного участника.", + "apihelp-query+alldeletedrevisions-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+alldeletedrevisions-param-namespace": "Перечислять только страницы этого пространства имён.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Примечание: Из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]] одновременное использование $1user и $1namespace может привести к меньшему, чем $1limit, числу результатов перед продолжением; в крайнем случае, может вернуться и ноль результатов.", + "apihelp-query+alldeletedrevisions-param-generatetitles": "При использовании в качестве генератора, генерирует названия страниц вместо идентификаторов версий.", + "apihelp-query+alldeletedrevisions-example-user": "Перечислить последние 50 удалённых правок участника Example.", + "apihelp-query+alldeletedrevisions-example-ns-main": "Перечислить первые 50 удалённых правок в основном пространстве.", + "apihelp-query+allfileusages-summary": "Перечисление всех использований файлов, в том числе несуществующих.", + "apihelp-query+allfileusages-param-from": "Название файла, с которого начать перечисление.", + "apihelp-query+allfileusages-param-to": "Название файла, на котором закончить перечисление.", + "apihelp-query+allfileusages-param-prefix": "Найти все названия файлов, начинающиеся с этого значения.", + "apihelp-query+allfileusages-param-unique": "Показывать только уникальные названия файлов. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.", + "apihelp-query+allfileusages-param-prop": "Какую информацию включить:", + "apihelp-query+allfileusages-paramvalue-prop-ids": "Добавляет идентификаторы страниц, использующих файл (не может быть использовано одновременно с $1unique).", + "apihelp-query+allfileusages-paramvalue-prop-title": "Добавляет название файла.", + "apihelp-query+allfileusages-param-limit": "Сколько элементов вернуть.", + "apihelp-query+allfileusages-param-dir": "Порядок перечисления.", + "apihelp-query+allfileusages-example-B": "Список названий файлов, включая несуществующих, с идентификаторами использующих их страниц, начиная с B.", + "apihelp-query+allfileusages-example-unique": "Список уникальных названий файлов.", + "apihelp-query+allfileusages-example-unique-generator": "Список всех названий файлов с отметкой несуществующих.", + "apihelp-query+allfileusages-example-generator": "Список страниц, содержащих файлы.", + "apihelp-query+allimages-summary": "Перечисление всех файлов.", + "apihelp-query+allimages-param-sort": "Свойство для сортировки.", + "apihelp-query+allimages-param-dir": "Порядок перечисления.", + "apihelp-query+allimages-param-from": "Название изображения, с которого начать перечисление. Можно использовать только одновременно с $1sort=name.", + "apihelp-query+allimages-param-to": "Название изображения, на котором закончить перечисление. Можно использовать только одновременно с $1sort=name.", + "apihelp-query+allimages-param-start": "Временная метка, с которой начать перечисление. Можно использовать только одновременно с $1sort=timestamp.", + "apihelp-query+allimages-param-end": "Временная метка, на которой закончить перечисление. Можно использовать только одновременно с $1sort=timestamp.", + "apihelp-query+allimages-param-prefix": "Найти все названия файлов, начинающиеся с этого значения. Можно использовать только одновременно с $1sort=name.", + "apihelp-query+allimages-param-minsize": "Ограничить изображения этим числом байтов снизу.", + "apihelp-query+allimages-param-maxsize": "Ограничить изображения этим числом байтов сверху.", + "apihelp-query+allimages-param-sha1": "SHA1-хэш этого изображения. Переопределяет $1sha1base36.", + "apihelp-query+allimages-param-sha1base36": "SHA1-хэш этого изображения в base 36 (используется в MediaWiki).", + "apihelp-query+allimages-param-user": "Вернуть только файлы, загруженные этим участником. Может быть использовано только одновременно с $1sort=timestamp и не может одновременно с $1filterbots.", + "apihelp-query+allimages-param-filterbots": "Как отфильтровывать файлы, загруженные ботами. Может быть использовано только одновременно с $1sort=timestamp и не может одновременно с $1user.", + "apihelp-query+allimages-param-mime": "Какие типы MIME искать, например, image/jpeg.", + "apihelp-query+allimages-param-limit": "Сколько изображений вернуть.", + "apihelp-query+allimages-example-B": "Показать список файлов, начиная с буквы B.", "apihelp-query+allimages-example-recent": "Показать список недавно загруженных файлов, аналогично [[Special:NewFiles]].", - "apihelp-query+allimages-example-generator": "Т хәрефенән башланған 4 файл хаҡында мәғлүмәтте күрһәтергә.", - "apihelp-query+alllinks-description": "Бирелгән исемдәр арауығына йүнәлткән барлыҡ һылтанмаларҙы һанап сығырға.", - "apihelp-query+alllinks-param-from": "Һанауҙы башлау өсөн һылтанма атамаһы.", - "apihelp-query+alllinks-param-to": "Һанауҙы туҡтатыу һылтанмаһы атамаһы.", - "apihelp-query+alllinks-param-prefix": "Был мәғәнәнән башланған бәйләнешле бар атамаларҙы эҙләргә.", - "apihelp-query+alllinks-param-prop": "Ҡайһы мәғлүмәтте күрһәтергә:", - "apihelp-query+alllinks-paramvalue-prop-title": "Һылтанма атамаһын ҡуша.", - "apihelp-query+alllinks-param-namespace": "Һанау өсөн исемдәр арауығы.", - "apihelp-query+alllinks-param-limit": "Нисә элементты тергеҙергә?", - "apihelp-query+alllinks-param-dir": "Һанау йүнәлеше.", - "apihelp-query+alllinks-example-unique": "Атамаларҙың үҙенсәлекле исемдәре бәйләнгән.", - "apihelp-query+alllinks-example-unique-generator": "Получить все названия-ссылки, выделяя пропущенные.", - "apihelp-query+alllinks-example-generator": "Һылтанмалы биттәр бар.", - "apihelp-query+allmessages-description": "Был сайттан хәбәр ҡайтарыу.", - "apihelp-query+allmessages-param-prop": "Ниндәй үҙенсәлектәрҙе ҡайтарырға.", - "apihelp-query+allmessages-param-args": "Аргументтар Хәбәрҙәрҙә биреләсәк.", + "apihelp-query+allimages-example-mimetypes": "Показать список файлов с MIME-типом image/png или image/gif.", + "apihelp-query+allimages-example-generator": "Показать информацию о 4 файлах, начиная с буквы T.", + "apihelp-query+alllinks-summary": "Перечисление всех ссылок, указывающих на заданное пространство имён.", + "apihelp-query+alllinks-param-from": "Название ссылки, с которой начать перечисление.", + "apihelp-query+alllinks-param-to": "Название ссылки, на которой закончить перечисление.", + "apihelp-query+alllinks-param-prefix": "Найти все названия ссылаемых страниц, начинающиеся с этого значения.", + "apihelp-query+alllinks-param-unique": "Показывать только уникальные названия ссылаемых страниц. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.", + "apihelp-query+alllinks-param-prop": "Какую информацию включить:", + "apihelp-query+alllinks-paramvalue-prop-ids": "Добавляет идентификатор ссылаемой страницы (не может быть использовано одновременно с $1unique).", + "apihelp-query+alllinks-paramvalue-prop-title": "Добавляет название ссылки.", + "apihelp-query+alllinks-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+alllinks-param-limit": "Сколько элементов вернуть.", + "apihelp-query+alllinks-param-dir": "Порядок перечисления.", + "apihelp-query+alllinks-example-B": "Список заголовков ссылаемых страниц, включая несуществующих, с идентификаторами страниц, ссылающихся на них, начиная с B.", + "apihelp-query+alllinks-example-unique": "Список уникальных названий ссылаемых страниц.", + "apihelp-query+alllinks-example-unique-generator": "Список всех ссылаемых страниц с отметкой несуществующих.", + "apihelp-query+alllinks-example-generator": "Список страниц, содержащих ссылки.", + "apihelp-query+allmessages-summary": "Возвращает сообщения с этого сайта.", + "apihelp-query+allmessages-param-messages": "Какие сообщения выводить. * (по умолчанию) означает «все сообщения».", + "apihelp-query+allmessages-param-prop": "Какие свойства получить:", + "apihelp-query+allmessages-param-enableparser": "Установите, чтобы активировать парсер, который будет обрабатывать вики-текст сообщений (подставлять магические слова, обрабатывать шаблоны, и так далее).", + "apihelp-query+allmessages-param-nocontent": "Если установлен, ничего не делать с содержимым сообщений перед выводом.", + "apihelp-query+allmessages-param-includelocal": "Также включить локальные сообщения, то есть, сообщения, не существующие в программе, но существующие в пространстве имён {{ns:MediaWiki}}. Это перечислит все страницы из пространства {{ns:MediaWiki}}, поэтому в результат также могут попасть страницы, не являющимися сообщениями — например, [[MediaWiki:Common.js|Common.js]].", + "apihelp-query+allmessages-param-args": "Аргументы, подставляемые в сообщение.", + "apihelp-query+allmessages-param-filter": "Вернуть только сообщения, чьи названия содержат эту подстроку.", + "apihelp-query+allmessages-param-customised": "Вернуть только сообщения в этом состоянии кастомизации.", "apihelp-query+allmessages-param-lang": "Вернуть сообщения на этом языке.", - "apihelp-query+blocks-example-simple": "Список блоков.", - "apihelp-query+categories-param-limit": "Сколько категорий на возврат.", + "apihelp-query+allmessages-param-from": "Вернуть сообщения, начиная с данного.", + "apihelp-query+allmessages-param-to": "Вернуть сообщения, заканчивая на данном.", + "apihelp-query+allmessages-param-title": "Название страницы, используемой для контекста при анализе сообщения (для опции $1enableparser).", + "apihelp-query+allmessages-param-prefix": "Вернуть сообщения с заданным префиксом.", + "apihelp-query+allmessages-example-ipb": "Показать сообщения, начинающиеся с ipb-.", + "apihelp-query+allmessages-example-de": "Показать сообщения august и mainpage на немецком языке.", + "apihelp-query+allpages-summary": "Перечисление всех страниц в данном пространстве имён.", + "apihelp-query+allpages-param-from": "Название страницы, с которой начать перечисление.", + "apihelp-query+allpages-param-to": "Название страницы, на которой закончить перечисление.", + "apihelp-query+allpages-param-prefix": "Найти все названия страниц, начинающиеся с этого значения.", + "apihelp-query+allpages-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+allpages-param-filterredir": "Какие страницы перечислять.", + "apihelp-query+allpages-param-minsize": "Ограничить страницы этим числом байтов снизу.", + "apihelp-query+allpages-param-maxsize": "Ограничить страницы этим числом байтов сверху.", + "apihelp-query+allpages-param-prtype": "Перечислить только защищённые страницы.", + "apihelp-query+allpages-param-prlevel": "Отфильтровывать страницы, основываясь на уровне защиты (должно быть использовано одновременно с параметром $1prtype=).", + "apihelp-query+allpages-param-prfiltercascade": "Отфильтровывать страницы, основываясь на каскадности (игнорируется, если $1prtype не задан).", + "apihelp-query+allpages-param-limit": "Сколько страниц вернуть.", + "apihelp-query+allpages-param-dir": "Порядок перечисления.", + "apihelp-query+allpages-param-filterlanglinks": "Отфильтровывать страницы, основываясь на наличие на странице языковых ссылок. Обратите внимание: языковые ссылки, добавленные расширениями, могут не учитываться.", + "apihelp-query+allpages-param-prexpiry": "Отфильтровывать страницы, основываясь на длительности защиты:\n;indefinite: Получить только страницы с неограниченной защитой.\n;definite: Получить только страницы с заданной длительностью защиты.\n;all: Получить страницы с любой длительностью защиты.", + "apihelp-query+allpages-example-B": "Показать список страниц, начиная с буквы B.", + "apihelp-query+allpages-example-generator": "Получить информацию о четырёх страницах, начиная с буквы T.", + "apihelp-query+allpages-example-generator-revisions": "Показать содержимое первых двух страниц, не являющихся перенаправлениями, начиная с Re.", + "apihelp-query+allredirects-summary": "Перечисление всех перенаправлений на заданное пространство имён.", + "apihelp-query+allredirects-param-from": "Название перенаправления, с которого начать перечисление.", + "apihelp-query+allredirects-param-to": "Название перенаправления, на котором закончить перечисление.", + "apihelp-query+allredirects-param-prefix": "Найти все названия целевых страниц, начинающихся с этого значения.", + "apihelp-query+allredirects-param-unique": "Показывать только уникальные целевые страницы. Не может быть использовано одновременно с $1prop=ids|fragment|interwiki. При использовании в качестве генератора, перечисляет целевые страницы вместо исходных.", + "apihelp-query+allredirects-param-prop": "Какую информацию включить:", + "apihelp-query+allredirects-paramvalue-prop-ids": "Добавляет идентификатор перенаправляемой страницы (не может быть использовано одновременно с $1unique).", + "apihelp-query+allredirects-paramvalue-prop-title": "Добавляет название перенаправления.", + "apihelp-query+allredirects-paramvalue-prop-fragment": "Добавляет фрагмент из перенаправления при наличии (не может быть использовано одновременно с $1unique).", + "apihelp-query+allredirects-paramvalue-prop-interwiki": "Добавляет префикс интервики к редиректу при наличии (не может быть использовано одновременно с $1unique).", + "apihelp-query+allredirects-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+allredirects-param-limit": "Сколько элементов вернуть.", + "apihelp-query+allredirects-param-dir": "Порядок перечисления.", + "apihelp-query+allredirects-example-B": "Список целевых страниц, в включая несуществующих, с идентификаторами перенаправлений, начиная с буквы B.", + "apihelp-query+allredirects-example-unique": "Список уникальных целевых страниц.", + "apihelp-query+allredirects-example-unique-generator": "Список всех целевых страниц с отметкой несуществующих.", + "apihelp-query+allredirects-example-generator": "Список страниц, содержащих перенаправления.", + "apihelp-query+allrevisions-summary": "Перечисление всех версий.", + "apihelp-query+allrevisions-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+allrevisions-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+allrevisions-param-user": "Только правки данного участника.", + "apihelp-query+allrevisions-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+allrevisions-param-namespace": "Перечислять только страницы этого пространства имён.", + "apihelp-query+allrevisions-param-generatetitles": "При использовании в качестве генератора, генерирует названия страниц вместо идентификаторов версий.", + "apihelp-query+allrevisions-example-user": "Перечислить последние 50 правок участника Example.", + "apihelp-query+allrevisions-example-ns-main": "Перечислить первые 50 правок в основном пространстве.", + "apihelp-query+mystashedfiles-summary": "Получить список файлов в тайнике (upload stash) текущего участника.", + "apihelp-query+mystashedfiles-param-prop": "Какие свойства файлов запрашивать.", + "apihelp-query+mystashedfiles-paramvalue-prop-size": "Запросить размер и разрешение изображения.", + "apihelp-query+mystashedfiles-paramvalue-prop-type": "Запросить MIME- и медиа-тип файла.", + "apihelp-query+mystashedfiles-param-limit": "Сколько файлов получить.", + "apihelp-query+mystashedfiles-example-simple": "Получить ключ, размер и разрешение файлов в тайнике текущего участника.", + "apihelp-query+alltransclusions-summary": "Перечисление всех включений (страниц, вставленных с помощью {{x}}), включая несуществующие.", + "apihelp-query+alltransclusions-param-from": "Название включения, с которого начать перечисление.", + "apihelp-query+alltransclusions-param-to": "Название включения, на котором закончить перечисление.", + "apihelp-query+alltransclusions-param-prefix": "Найти все названия включений, начинающиеся с этого значения.", + "apihelp-query+alltransclusions-param-unique": "Показывать только уникальные названия включений. Не может быть использовано одновременно с $1prop=ids.\nПри использовании в качестве генератора, перечисляет целевые страницы вместо исходных.", + "apihelp-query+alltransclusions-param-prop": "Какую информацию включить:", + "apihelp-query+alltransclusions-paramvalue-prop-ids": "Добавляет идентификаторы включающих страниц (не может быть использовано одновременно с $1unique).", + "apihelp-query+alltransclusions-paramvalue-prop-title": "Добавляет название включения.", + "apihelp-query+alltransclusions-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+alltransclusions-param-limit": "Сколько элементов вернуть.", + "apihelp-query+alltransclusions-param-dir": "Порядок перечисления.", + "apihelp-query+alltransclusions-example-B": "Списки заголовков включаемых страниц, в том числе несуществующих, с идентификаторами включающих их страниц, начиная с буквы B.", + "apihelp-query+alltransclusions-example-unique": "Список уникальных включаемых названий.", + "apihelp-query+alltransclusions-example-unique-generator": "Список всех включаемых страниц с отметкой несуществующих.", + "apihelp-query+alltransclusions-example-generator": "Список страниц, содержащих включения.", + "apihelp-query+allusers-summary": "Перечисление всех зарегистрированных участников.", + "apihelp-query+allusers-param-from": "Ник, с которого начать перечисление.", + "apihelp-query+allusers-param-to": "Ник, на котором закончить перечисление.", + "apihelp-query+allusers-param-prefix": "Найти все ники, начинающиеся с этого значения.", + "apihelp-query+allusers-param-dir": "Порядок сортировки.", + "apihelp-query+allusers-param-group": "Включать участников только из данных групп.", + "apihelp-query+allusers-param-excludegroup": "Исключать участников из данных групп.", + "apihelp-query+allusers-param-rights": "Включать только участников с данными правами. Участники с правами, предоставляемыми автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не включаются.", + "apihelp-query+allusers-param-prop": "Какую информацию включить:", + "apihelp-query+allusers-paramvalue-prop-blockinfo": "Добавляет информацию о текущих блокировках участника.", + "apihelp-query+allusers-paramvalue-prop-groups": "Перечисляет группы, в которые входит участник. Это значительно нагружает сервера, что может привести к возвращению меньшего числа результатов, чем указанный лимит.", + "apihelp-query+allusers-paramvalue-prop-implicitgroups": "Перечисляет группы, в которые участник был включён автоматически.", + "apihelp-query+allusers-paramvalue-prop-rights": "Перечисляет права, которые есть у участника.", + "apihelp-query+allusers-paramvalue-prop-editcount": "Добавляет счётчик правок участника.", + "apihelp-query+allusers-paramvalue-prop-registration": "Добавляет метку времени, когда участник был зарегистрирован, если она доступна (может быть пустым).", + "apihelp-query+allusers-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.", + "apihelp-query+allusers-param-limit": "Сколько ников вернуть.", + "apihelp-query+allusers-param-witheditsonly": "Перечислять только участников, совершавших правки.", + "apihelp-query+allusers-param-activeusers": "Перечислять только участников, которые были активны в последние $1 {{PLURAL:$1|день|дня|дней}}.", + "apihelp-query+allusers-param-attachedwiki": "С $1prop=centralids, также отображает, прикреплён ли к вики участник с этим идентификатором.", + "apihelp-query+allusers-example-Y": "Список участников, начиная с Y.", + "apihelp-query+authmanagerinfo-summary": "Получение информации о текущем статусе аутентификации.", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Проверить, достаточен ли текущий статус для осуществления чувствительных к безопасности операций.", + "apihelp-query+authmanagerinfo-param-requestsfor": "Получить информацию о аутентификационных запросах, необходимых для указанного действия аутентификации.", + "apihelp-query+authmanagerinfo-example-login": "Получить запросы, которые могут быть использованы на момент начала входа.", + "apihelp-query+authmanagerinfo-example-login-merged": "Получить запросы, которые могут быть использованы в момент начала авторизации с объединёнными полями формы.", + "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Проверить, необходима ли аутентификация для действия foo.", + "apihelp-query+backlinks-summary": "Получение списка страниц, ссылающихся на данную страницу.", + "apihelp-query+backlinks-param-title": "Заголовок для поиска. Не может быть использован одновременно с $1pageid.", + "apihelp-query+backlinks-param-pageid": "Идентификатор страницы для поиска. Не может быть использован одновременно с $1title.", + "apihelp-query+backlinks-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+backlinks-param-dir": "Порядок перечисления.", + "apihelp-query+backlinks-param-filterredir": "Как обрабатывать перенаправления. Если присвоено значение nonredirects при заданном $1redirect, это применяется только ко второму уровню.", + "apihelp-query+backlinks-param-limit": "Сколько страниц вернуть. Если задан $1redirect, лимит применяется к каждому уровню по отдельности (что означает, что всего может вернуться до 2 * $1limit результатов).", + "apihelp-query+backlinks-param-redirect": "Если ссылающаяся страница является перенаправлением, найти также все страницы, которые ссылаются на это перенаправление. Максимальный лимит становится в два раза меньше.", + "apihelp-query+backlinks-example-simple": "Показать ссылки на Main page.", + "apihelp-query+backlinks-example-generator": "Получить информацию о страницах, ссылающихся на Main page.", + "apihelp-query+blocks-summary": "Перечисление всех заблокированных участников и IP-адресов.", + "apihelp-query+blocks-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+blocks-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+blocks-param-ids": "Список идентификаторов блокировки (необязательно).", + "apihelp-query+blocks-param-users": "Список искомых участников (необязательно).", + "apihelp-query+blocks-param-ip": "Получить все блокировки, применённые к этому IP-адресу или диапазону CIDR, включая блокировки диапазонов.\nНе может быть использовано одновременно с $3users. Диапазоны CIDR шире IPv4/$1 или IPv6/$2 не поддерживаются.", + "apihelp-query+blocks-param-limit": "Максимальное число блокировок в списке.", + "apihelp-query+blocks-param-prop": "Какие свойства получить:", + "apihelp-query+blocks-paramvalue-prop-id": "Добавляет идентификатор блокировки.", + "apihelp-query+blocks-paramvalue-prop-user": "Добавляет ник заблокированного участника.", + "apihelp-query+blocks-paramvalue-prop-userid": "Добавляет идентификатор заблокированного участника.", + "apihelp-query+blocks-paramvalue-prop-by": "Добавляет ник заблокировавшего участника.", + "apihelp-query+blocks-paramvalue-prop-byid": "Добавляет идентификатор заблокировавшего участника.", + "apihelp-query+blocks-paramvalue-prop-timestamp": "Добавляет метку времени, когда была дана блокировка.", + "apihelp-query+blocks-paramvalue-prop-expiry": "Добавляет метку времени, когда блокировка истечёт.", + "apihelp-query+blocks-paramvalue-prop-reason": "Добавляет причину блокировки.", + "apihelp-query+blocks-paramvalue-prop-range": "Добавляет диапазон IP-адресов, затронутых блокировкой.", + "apihelp-query+blocks-paramvalue-prop-flags": "Добавляет бану метку (autoblock, anonoly, и так далее).", + "apihelp-query+blocks-param-show": "Показать только элементы, удовлетворяющие этим критериям.\nНапример, чтобы отобразить только бессрочные блокировки IP-адресов, установите $1show=ip|!temp.", + "apihelp-query+blocks-example-simple": "Список блокировок.", + "apihelp-query+blocks-example-users": "Список блокировок участников Alice и Bob.", + "apihelp-query+categories-summary": "Перечисление всех категорий, которым принадлежит страница.", + "apihelp-query+categories-param-prop": "Какие дополнительные свойства получить для каждой категории:", + "apihelp-query+categories-paramvalue-prop-sortkey": "Добавляет ключ сортировки (шестнадцатеричная строка) и префикс ключа сортировки (человеко-читаемая часть) для категории.", + "apihelp-query+categories-paramvalue-prop-timestamp": "Добавляет метку времени, когда категория была добавлена.", + "apihelp-query+categories-paramvalue-prop-hidden": "Отмечает категории, скрытые магическим словом __HIDDENCAT__.", + "apihelp-query+categories-param-show": "Какие типы категорий показать.", + "apihelp-query+categories-param-limit": "Сколько категорий вернуть.", + "apihelp-query+categories-param-categories": "Перечислять только данные категории. Полезно для проверки, включена ли конкретная страница в конкретную категорию.", + "apihelp-query+categories-param-dir": "Порядок перечисления.", + "apihelp-query+categories-example-simple": "Получить список категорий, в которые включена страница Albert Einstein.", + "apihelp-query+categories-example-generator": "Получить информацию о всех категориях, использованных на странице Albert Einstein.", + "apihelp-query+categoryinfo-summary": "Возвращение информации о конкретных категориях.", + "apihelp-query+categoryinfo-example-simple": "Получить информацию о Category:Foo и Category:Bar.", + "apihelp-query+categorymembers-summary": "Перечисление всех страниц в данной категории.", + "apihelp-query+categorymembers-param-title": "Страницы какой категории перечислять (обязательно). Префикс {{ns:category}}: должен быть включён. Не может быть использовано одновременно с $1pageid.", + "apihelp-query+categorymembers-param-pageid": "Идентификатор перечисляемой категории. Не может быть использовано одновременно с $1title.", + "apihelp-query+categorymembers-param-prop": "Какую информацию включить:", + "apihelp-query+categorymembers-paramvalue-prop-ids": "Добавляет идентификатор страницы.", + "apihelp-query+categorymembers-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.", + "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Добавляет ключ, используемый для сортировки внутри категории (шестнадцатеричная строка).", + "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Добавляет префикс ключа, используемого для сортировки внутри категории (человеко-читаемая часть ключа).", + "apihelp-query+categorymembers-paramvalue-prop-type": "Добавляет тип категоризованной страницы (page, subcat или file).", + "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Добавляет метку времени, когда страница была включена.", + "apihelp-query+categorymembers-param-namespace": "Включать только страница из этих пространств имён. Обратите внимание, что вместо $1namespace=14 или 6 могут быть использованы $1type=subcat или $1type=file.", + "apihelp-query+categorymembers-param-type": "Какие типы страниц включать. Игнорируется при $1sort=timestamp.", + "apihelp-query+categorymembers-param-limit": "Максимальное число возвращаемых страниц.", "apihelp-query+categorymembers-param-sort": "Свойство для сортировки.", - "apihelp-query+categorymembers-param-startsortkey": "Использовать $1starthexsortkey вместо.", - "apihelp-query+categorymembers-param-endsortkey": "Использовать $1endhexsortkey вместо.", - "apihelp-query+deletedrevs-param-limit": "Исемлектәге яҙмаларҙың иң күбе.", - "apihelp-query+deletedrevs-example-mode1": "Юҡ ителгән һуңғы биттәрҙең исемлеге, баш биттең-һы һәмәйтергә:баш биттең /kbd>-һы,континент менән(режим 1).", - "apihelp-query+deletedrevs-example-mode3-talk": "Юҡ ителгән тәүге 50 биттең исемлеге {{НС:фекер алышыу}} исемдәр арауығы(режим 3).", + "apihelp-query+categorymembers-param-dir": "Порядок сортировки.", + "apihelp-query+categorymembers-param-start": "Временная метка, с которой начать перечисление. Может быть использовано только одновременно с $1sort=timestamp.", + "apihelp-query+categorymembers-param-end": "Временная метка, на которой закончить перечисление. Может быть использовано только одновременно с $1sort=timestamp.", + "apihelp-query+categorymembers-param-starthexsortkey": "Ключ сортировки, с которого начать перечисление, возвращённый $1prop=sortkey. Может быть использовано только одновременно с $1sort=sortkey.", + "apihelp-query+categorymembers-param-endhexsortkey": "Ключ сортировки, на котором закончить перечисление, возвращённый $1prop=sortkey. Может быть использовано только одновременно с $1sort=sortkey.", + "apihelp-query+categorymembers-param-startsortkeyprefix": "Префикс ключа сортировки, с которого начать перечисление. Может быть использовано только с $1sort=sortkey. Переопределяет $1starthexsortkey.", + "apihelp-query+categorymembers-param-endsortkeyprefix": "Префикс ключа сортировки, перед которым закончить перечисление (не на котором; если это значение существует, оно не будет включено!). Может быть использовано только одновременно с $1sort=sortkey. Переопределяет $1endhexsortkey.", + "apihelp-query+categorymembers-param-startsortkey": "Используйте вместо этого $1starthexsortkey.", + "apihelp-query+categorymembers-param-endsortkey": "Используйте вместо этого $1endhexsortkey.", + "apihelp-query+categorymembers-example-simple": "Получить первые 10 страниц в Category:Physics.", + "apihelp-query+categorymembers-example-generator": "Получить информацию о первых 10 страницах в Category:Physics.", + "apihelp-query+contributors-summary": "Получение списка зарегистрированных и количества анонимных редакторов страницы.", + "apihelp-query+contributors-param-group": "Включать только участников из данных групп. Неявные или автоматически присваиваемые группы, вроде *, user или autoconfirmed, не считаются.", + "apihelp-query+contributors-param-excludegroup": "Исключать участников из заданных групп. Неявные или автоматически присваиваемые группы, вроде *, user или autoconfirmed, не считаются.", + "apihelp-query+contributors-param-rights": "Включать только участников с данными правами. Участники с правами, предоставляемыми неявными или автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не считаются.", + "apihelp-query+contributors-param-excluderights": "Исключать участников с данными правами. Участники с правами, предоставляемыми неявными или автоматически присваиваемыми группами — такими, как *, user или autoconfirmed, — не считаются.", + "apihelp-query+contributors-param-limit": "Сколько редакторов вернуть.", + "apihelp-query+contributors-example-simple": "Показать редакторов страницы Main Page.", + "apihelp-query+deletedrevisions-summary": "Получение информации об удалённых правках.", + "apihelp-query+deletedrevisions-extended-description": "Может быть использовано несколькими способами:\n# Получение удалённых правок для набора страниц, заданного с помощью названий или идентификаторов. Сортируется по названиям и временным меткам.\n# Получение данных о наборе удалённых правок, заданных с помощью их revid. Сортируется по идентификаторам версий.", + "apihelp-query+deletedrevisions-param-start": "Временная метка, с которой начать перечисление. Игнорируется при обработке списка идентификаторов версий.", + "apihelp-query+deletedrevisions-param-end": "Временная метка, на которой закончить перечисление. Игнорируется при обработке списка идентификаторов версий.", + "apihelp-query+deletedrevisions-param-tag": "Только правки с заданной меткой.", + "apihelp-query+deletedrevisions-param-user": "Только правки данного участника.", + "apihelp-query+deletedrevisions-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+deletedrevisions-example-titles": "Список удалённых правок страниц Main Page и Talk:Main Page с содержимым.", + "apihelp-query+deletedrevisions-example-revids": "Список информации для удалённой правки 123456.", + "apihelp-query+deletedrevs-summary": "Перечисление удалённых правок.", + "apihelp-query+deletedrevs-extended-description": "Работает в трёх режимах:\n# Перечисление удалённых правок для заданных названий страниц, сортируется по временным меткам.\n# Перечисление удалённого вклада заданного участника, сортируется по временным меткам (названия страниц не указываются).\n# Перечисление удалённых правок в заданном пространстве имён, сортируется по названиям страниц и временным меткам (названия страниц и $1user не указываются).\n\nОпределённые параметры применяются только к некоторым режимам и игнорируются в других.", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Мод|Моды}}: $2", + "apihelp-query+deletedrevs-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+deletedrevs-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+deletedrevs-param-from": "Начать перечисление на этом заголовке.", + "apihelp-query+deletedrevs-param-to": "Закончить перечисление на этом заголовке.", + "apihelp-query+deletedrevs-param-prefix": "Найти все названия страниц, начинающиеся с этого значения.", + "apihelp-query+deletedrevs-param-unique": "Перечислять только одну правку на каждую страницу.", + "apihelp-query+deletedrevs-param-tag": "Только правки с заданной меткой.", + "apihelp-query+deletedrevs-param-user": "Только правки данного участника.", + "apihelp-query+deletedrevs-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+deletedrevs-param-namespace": "Перечислять только страницы этого пространства имён.", + "apihelp-query+deletedrevs-param-limit": "Максимальное количество правок в списке.", + "apihelp-query+deletedrevs-param-prop": "Какие свойства возвращать:\n;revid: Добавляет идентификатор удалённой правки.\n;parentid: Добавляет идентификатор предыдущей версии страницы.\n;user: Добавляет ник участника, сделавшего правку.\n;userid: Добавляет идентификатор участника, сделавшего правку.\n;comment: Добавляет описание правки.\n;parsedcomment: Добавляет распарсенное описание правки.\n;minor: Отмечает, была ли правка малым.\n;len: Добавляет длину (в байтах) правки.\n;sha1: Добавляет хэш SHA-1 (base 16) правки.\n;content: Добавляет содержимое правки.\n;token: Не поддерживается. Возвращает токен редактирования.\n;tags: Теги правки.", + "apihelp-query+deletedrevs-example-mode1": "Список последних удалённых правок страниц Main Page и Talk:Main Page с содержимым (режим 1).", + "apihelp-query+deletedrevs-example-mode2": "Список последних 50 удалённых правок участника Bob (режим 2).", + "apihelp-query+deletedrevs-example-mode3-main": "Список последних 50 удалённых правок в основном пространстве имён (режим 3)", + "apihelp-query+deletedrevs-example-mode3-talk": "Список последних 50 удалённых страниц в пространстве имён {{ns:talk}} (режим 3).", + "apihelp-query+disabled-summary": "Этот запрос-модуль был отключён.", + "apihelp-query+duplicatefiles-summary": "Перечисление всех файлов, являющихся дубликатами данных, основываясь на сравнении хэш-сумм.", + "apihelp-query+duplicatefiles-param-limit": "Сколько дубликатов вернуть.", + "apihelp-query+duplicatefiles-param-dir": "Порядок перечисления.", + "apihelp-query+duplicatefiles-param-localonly": "Искать только файлы в локальном репозитории.", + "apihelp-query+duplicatefiles-example-simple": "Поиск дубликатов [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Поиск дубликатов всех файлов.", + "apihelp-query+embeddedin-summary": "Поиск всех страниц, встраивающих (включающих) данное название.", + "apihelp-query+embeddedin-param-title": "Искомое название. Не может использоваться вместе с $1pageid.", + "apihelp-query+embeddedin-param-pageid": "Искомый идентификатор страницы. Не может быть использован одновременно с $1title.", + "apihelp-query+embeddedin-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+embeddedin-param-dir": "Порядок перечисления.", + "apihelp-query+embeddedin-param-filterredir": "Как фильтровать перенаправления.", + "apihelp-query+embeddedin-param-limit": "Сколько страниц вернуть.", + "apihelp-query+embeddedin-example-simple": "Показать включения Template:Stub.", + "apihelp-query+embeddedin-example-generator": "Получить информацию о страницах, включающих Template:Stub.", + "apihelp-query+extlinks-summary": "Получение всех внешних ссылок (не интервик) для данной страницы.", + "apihelp-query+extlinks-param-limit": "Сколько ссылок вернуть.", + "apihelp-query+extlinks-param-protocol": "Протокол ссылки. Если оставлено пустым, а $1query задано, будут найдены ссылки с протоколом http. Оставьте пустым и $1query, и данный параметр, чтобы получить список всех внешних ссылок.", + "apihelp-query+extlinks-param-query": "Поисковый запрос без протокола. Полезно для проверки, содержит ли определённая страница определённую внешнюю ссылку.", + "apihelp-query+extlinks-param-expandurl": "Раскрыть зависимые от протокола ссылки с какноничным протоколом.", + "apihelp-query+extlinks-example-simple": "Получить внешние ссылки на странице Main Page.", + "apihelp-query+exturlusage-summary": "Перечислить страницы, содержащие данную ссылку.", + "apihelp-query+exturlusage-param-prop": "Какую информацию включить:", + "apihelp-query+exturlusage-paramvalue-prop-ids": "Добавляет идентификатор страницы.", + "apihelp-query+exturlusage-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.", + "apihelp-query+exturlusage-paramvalue-prop-url": "Добавляет ссылку, использованную на этой странице.", + "apihelp-query+exturlusage-param-protocol": "Протокол ссылки. Если оставлено пустым, а $1query задано, будут найдены ссылки с протоколом http. Оставьте пустым и $1query, и данный параметр, чтобы получить список всех внешних ссылок.", + "apihelp-query+exturlusage-param-query": "Поисковый запрос без протокола. См. [[Special:LinkSearch]]. Оставьте пустым для получение списка всех внешних ссылок.", + "apihelp-query+exturlusage-param-namespace": "Пространства имён для перечисления.", + "apihelp-query+exturlusage-param-limit": "Сколько страниц вернуть.", + "apihelp-query+exturlusage-param-expandurl": "Раскрыть зависимые от протокола ссылки с какноничным протоколом.", + "apihelp-query+exturlusage-example-simple": "Показать страницы, ссылающиеся на http://www.mediawiki.org.", + "apihelp-query+filearchive-summary": "Перечисление всех удалённых файлов.", + "apihelp-query+filearchive-param-from": "Название изображения, с которого начать перечисление.", + "apihelp-query+filearchive-param-to": "Название изображения, на котором закончить перечисление.", + "apihelp-query+filearchive-param-prefix": "Найти все названия файлов, начинающиеся с этого значения.", + "apihelp-query+filearchive-param-limit": "Сколько всего изображений вернуть.", + "apihelp-query+filearchive-param-dir": "Порядок перечисления.", + "apihelp-query+filearchive-param-sha1": "SHA1-хэш этого изображения. Переопределяет $1sha1base36.", + "apihelp-query+filearchive-param-sha1base36": "SHA1-хэш этого изображения в base 36 (используется в MediaWiki).", + "apihelp-query+filearchive-param-prop": "Какую информацию получить:", + "apihelp-query+filearchive-paramvalue-prop-sha1": "Добавляет SHA1-хэш изображения.", + "apihelp-query+filearchive-paramvalue-prop-timestamp": "Добавляет метку времени загрузки файловой версии.", + "apihelp-query+filearchive-paramvalue-prop-user": "Добавляет участника, загрузившего изображение.", + "apihelp-query+filearchive-paramvalue-prop-size": "Добавляет размер изображения в байтах, высоту, ширину и количество использующих страниц (если применимо).", + "apihelp-query+filearchive-paramvalue-prop-dimensions": "Синоним для size.", + "apihelp-query+filearchive-paramvalue-prop-description": "Добавляет описание файловой версии.", + "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Распарсить описание файловой версии.", + "apihelp-query+filearchive-paramvalue-prop-mime": "Добавляет MIME-тип изображения.", + "apihelp-query+filearchive-paramvalue-prop-mediatype": "Добавляет медиа-тип изображения.", + "apihelp-query+filearchive-paramvalue-prop-metadata": "Перечисляет метаданные Exif для файловой версии.", + "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Добавляет глубину цвета файловой версии.", + "apihelp-query+filearchive-paramvalue-prop-archivename": "Добавляет имя архивной версии файла.", + "apihelp-query+filearchive-example-simple": "Список всех удалённых файлов.", + "apihelp-query+filerepoinfo-summary": "Возвращает мета-информацию о файловых репозиториях, настроенных в вики.", + "apihelp-query+filerepoinfo-param-prop": "Какие свойства хранилища получить (на некоторых вики может быть доступно больше):\n;apiutl: Ссылка на API хранилища — полезно для получения информации об изображении с хоста.\n;name: Ключ хранилища — используется, например, [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] и возвращаемых [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname: Человеко-читаемое название хранилища.\n;rooturl: Корневая ссылка для путей к файлам.\n;local: Определяет, является ли хранилище локальным, или нет.", + "apihelp-query+filerepoinfo-example-simple": "Получить информацию о файловых репозиториях.", + "apihelp-query+fileusage-summary": "Поиск всех страниц, использующих данный файл.", + "apihelp-query+fileusage-param-prop": "Какие свойства получить:", + "apihelp-query+fileusage-paramvalue-prop-pageid": "Идентификатор каждой страницы.", + "apihelp-query+fileusage-paramvalue-prop-title": "Заголовок каждой страницы.", + "apihelp-query+fileusage-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.", + "apihelp-query+fileusage-param-namespace": "Включить страницы только из данных пространств имён.", + "apihelp-query+fileusage-param-limit": "Сколько страниц вернуть.", + "apihelp-query+fileusage-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.", + "apihelp-query+fileusage-example-simple": "Получить список страниц, использующих [[:File:Example.jpg]].", + "apihelp-query+fileusage-example-generator": "Получить информацию о страницах, использующих [[:File:Example.jpg]].", + "apihelp-query+imageinfo-summary": "Возвращает информацию о файле и историю загрузок.", + "apihelp-query+imageinfo-param-prop": "Какую информацию о файле получить:", + "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Добавляет метку времени загрузки файловой версии.", + "apihelp-query+imageinfo-paramvalue-prop-user": "Добавляет участников, загрузивших каждую файловую версию.", + "apihelp-query+imageinfo-paramvalue-prop-userid": "Добавляет идентификаторы участников, загрузивших каждую файловую версию.", + "apihelp-query+imageinfo-paramvalue-prop-comment": "Комментарий к версии.", + "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Распарсенный комментарий к версии.", + "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Добавляет каноничное название файла.", + "apihelp-query+imageinfo-paramvalue-prop-url": "Возвращает ссылку на файл и страницу описания.", + "apihelp-query+imageinfo-paramvalue-prop-size": "Добавляет размер файла в байтах, высоту, ширину и количество использующих страниц (если применимо).", + "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Синоним для size.", + "apihelp-query+imageinfo-paramvalue-prop-sha1": "Добавляет SHA1-хэш файла.", + "apihelp-query+imageinfo-paramvalue-prop-mime": "Добавляет MIME-тип файла.", + "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Добавляет MIME-тип миниатюры файла (требуется url и параметр $1urlwidth).", + "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Добавляет медиа-тип файла.", + "apihelp-query+imageinfo-paramvalue-prop-metadata": "Перечисляет метаданные Exif для файловой версии.", + "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Перечисляет общие для данного формата метаданные для файловой версии.", + "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Перечисляет структурированные метаданные, собранные из нескольких источников. Результат отдаётся в формате HTML.", + "apihelp-query+imageinfo-paramvalue-prop-archivename": "Добавляет имя архивной версии файла.", + "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Добавляет глубину цвета файловой версии.", + "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Используется страницей Special:Upload для получения информации о существовании файла. Не предназначено для использования за пределами ядра MediaWiki.", "apihelp-query+imageinfo-paramvalue-prop-badfile": "Добавляет указание на то, находится ли файл в списке [[MediaWiki:Bad image list]]", - "apihelp-query+logevents-description": "Получать события из журналов.", - "apihelp-query+logevents-example-simple": "Список последних зарегистрированных событий.", - "apihelp-query+pagepropnames-example-simple": "Получить первые 10 имен свойств.", - "apihelp-query+pageswithprop-param-limit": "Максимальное количество страниц для возврата", - "apihelp-query+pageswithprop-param-dir": "В каком направлении сортировать", - "apihelp-query+prefixsearch-param-search": "Строка поиска.", - "apihelp-query+prefixsearch-param-offset": "Количество результатов для пропуска", + "apihelp-query+imageinfo-param-limit": "Сколько версий каждого файла вернуть.", + "apihelp-query+imageinfo-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+imageinfo-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+imageinfo-param-urlwidth": "Если задан $2prop=url, будет возвращена ссылка на изображение, масштабированное до указанной ширины. Из соображений производительности, при использовании этой опции будет возвращено не более $1 файлов.", + "apihelp-query+imageinfo-param-urlheight": "Аналогично $1urlwidth.", + "apihelp-query+imageinfo-param-metadataversion": "Какую версию метаданных использовать. Если указано latest, будет использована последняя версия. Для обратной совместимости, значение по умолчанию — 1.", + "apihelp-query+imageinfo-param-extmetadatalanguage": "На каком языке запрашивать расширенные метаданные. Это затрагивает как переводы, если их доступно несколько, так и способ форматирования чисел и других значений.", + "apihelp-query+imageinfo-param-extmetadatamultilang": "Если для свойства расширенных метаданных доступны переводы, запросить их все.", + "apihelp-query+imageinfo-param-extmetadatafilter": "Если задано и непустое, только эти ключи будут возвращены для $1prop=extmetadata.", + "apihelp-query+imageinfo-param-urlparam": "Строковой параметр, зависящий от обработчика. Например, для PDF можно использовать page15-100px. Должен быть использован $1urlwidth, не противоречащий с $1urlparam.", + "apihelp-query+imageinfo-param-badfilecontexttitle": "Если задан $2prop=badfile, этот заголовок страницы будет использован для анализа [[MediaWiki:Bad image list]].", + "apihelp-query+imageinfo-param-localonly": "Искать только файлы в локальном репозитории.", + "apihelp-query+imageinfo-example-simple": "Заросить информацию о текущей версии [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+imageinfo-example-dated": "Запросить информацию о версиях [[:File:Test.jpg]] с 2008 года и позже.", + "apihelp-query+images-summary": "Возвращает все файлы, содержащиеся на данных страницах.", + "apihelp-query+images-param-limit": "Сколько файлов вернуть.", + "apihelp-query+images-param-images": "Перечислять только данные файлы. Полезно для проверки, включает ли конкретная страница конкретный файл.", + "apihelp-query+images-param-dir": "Порядок перечисления.", + "apihelp-query+images-example-simple": "Получить список файлов, использованных на [[Main Page]].", + "apihelp-query+images-example-generator": "Получить информацию о всех файлах, использованных на [[Main Page]].", + "apihelp-query+imageusage-summary": "Поиск всех страниц, использующих данный файл.", + "apihelp-query+imageusage-param-title": "Искомое название. Не может использоваться вместе с $1pageid.", + "apihelp-query+imageusage-param-pageid": "Искомый идентификатор страницы. Не может быть использован одновременно с $1title.", + "apihelp-query+imageusage-param-namespace": "Пространство имён для перечисления.", + "apihelp-query+imageusage-param-dir": "Порядок перечисления.", + "apihelp-query+imageusage-param-filterredir": "Как обрабатывать перенаправления. Если присвоено значение nonredirects при заданном $1redirect, это применяется только ко второму уровню.", + "apihelp-query+imageusage-param-limit": "Сколько страниц вернуть. Если задан $1redirect, лимит применяется к каждому уровню по отдельности (что означает, что всего может вернуться до 2 * $1limit результатов).", + "apihelp-query+imageusage-param-redirect": "Если ссылающаяся страница является перенаправлением, найти также все страницы, которые ссылаются на это перенаправление. Максимальный лимит становится в два раза меньше.", + "apihelp-query+imageusage-example-simple": "Показать страницы, использующие [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+imageusage-example-generator": "Получить информацию о страницах, использующих [[:File:Albert Einstein Head.jpg]].", + "apihelp-query+info-summary": "Получение основной информации о страницах.", + "apihelp-query+info-param-prop": "Какие дополнительные свойства получить:", + "apihelp-query+info-paramvalue-prop-protection": "Перечисление уровней защиты каждой страницы.", + "apihelp-query+info-paramvalue-prop-talkid": "Идентификатор страницы обсуждения для каждой страницы не-обсуждения.", + "apihelp-query+info-paramvalue-prop-watched": "Перечислить статус наблюдения за каждой страницей.", + "apihelp-query+info-paramvalue-prop-watchers": "Количество наблюдающих, если разрешено.", + "apihelp-query+info-paramvalue-prop-visitingwatchers": "Количество наблюдающих за каждой страницей, просмотревших последние правки, если разрешено.", + "apihelp-query+info-paramvalue-prop-notificationtimestamp": "Временная метка уведомления для списка наблюдения для каждой страницы.", + "apihelp-query+info-paramvalue-prop-subjectid": "Идентификатор родительской страницы для каждой страницы обсуждения.", + "apihelp-query+info-paramvalue-prop-url": "Возвращает полную ссылку, ссылку на редактирование и каноничную ссылку для каждой страницы.", + "apihelp-query+info-paramvalue-prop-readable": "Может ли участник просматривать эту страницу.", + "apihelp-query+info-paramvalue-prop-preload": "Текст, возвращённый EditFormPreloadText.", + "apihelp-query+info-paramvalue-prop-displaytitle": "Возвращает стиль отображения заголовка страницы.", + "apihelp-query+info-param-testactions": "Проверить, может ли текущий участник провести указанные действия над страницей.", + "apihelp-query+info-param-token": "Вместо этого используйте [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-query+info-example-simple": "Получить информацию о странице Main Page.", + "apihelp-query+info-example-protection": "Получить основную информацию и информацию о защите страницы Main Page.", + "apihelp-query+iwbacklinks-summary": "Поиск всех страниц, ссылающихся на заданную интервики ссылку.", + "apihelp-query+iwbacklinks-extended-description": "Может быть использована для поиска всех ссылок с префиксом, или всех ссылок на название (с заданным префиксом). Неиспользование никакого параметра фактически означает «все интервики-ссылки».", + "apihelp-query+iwbacklinks-param-prefix": "Префикс интервики.", + "apihelp-query+iwbacklinks-param-title": "Искомая интервики-ссылка. Должна быть использована вместе с $1blprefix.", + "apihelp-query+iwbacklinks-param-limit": "Сколько страниц вернуть.", + "apihelp-query+iwbacklinks-param-prop": "Какие свойства получить:", + "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Добавляет префикс интервики.", + "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Добавляет название интервики.", + "apihelp-query+iwbacklinks-param-dir": "Порядок перечисления.", + "apihelp-query+iwbacklinks-example-simple": "Получить список страниц, ссылающихся на [[wikibooks:Test]].", + "apihelp-query+iwbacklinks-example-generator": "Получить информацию о страницах, ссылающихся на [[wikibooks:Test]].", + "apihelp-query+iwlinks-summary": "Возвращает все интервики-ссылки с данных страниц.", + "apihelp-query+iwlinks-param-url": "Следует ли возвращать полный URL (не может быть использовано одновременно с $1prop).", + "apihelp-query+iwlinks-param-prop": "Какие дополнительные свойства получить для каждой межъязыковой ссылки:", + "apihelp-query+iwlinks-paramvalue-prop-url": "Добавляет полный URL.", + "apihelp-query+iwlinks-param-limit": "Сколько интервики-ссылок вернуть.", + "apihelp-query+iwlinks-param-prefix": "Вернуть только интервики с этим префиксом.", + "apihelp-query+iwlinks-param-title": "Искомая интервики-ссылка. Должна быть использована вместе с $1prefix.", + "apihelp-query+iwlinks-param-dir": "Порядок перечисления.", + "apihelp-query+iwlinks-example-simple": "Получить интервики-ссылки со страницы Main Page.", + "apihelp-query+langbacklinks-summary": "Поиск всех страниц, ссылающихся на заданную языковую ссылку.", + "apihelp-query+langbacklinks-extended-description": "Может быть использовано для поиска всех ссылок с языковым кодом, или всех ссылок на страницу с заданным языком. Неиспользование этого параметра фактически вернёт все языковые ссылки.\n\nОбратите внимания, что ссылки, добавляемые расширениями, могут не рассматриваться.", + "apihelp-query+langbacklinks-param-lang": "Язык ссылки.", + "apihelp-query+langbacklinks-param-title": "Искомая языковая ссылка. Должно быть использовано с $1lang.", + "apihelp-query+langbacklinks-param-limit": "Сколько страниц вернуть.", + "apihelp-query+langbacklinks-param-prop": "Какие свойства получить:", + "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Добавляет языковой код ссылки.", + "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Добавляет название ссылки.", + "apihelp-query+langbacklinks-param-dir": "Порядок перечисления.", + "apihelp-query+langbacklinks-example-simple": "Получить список страниц, ссылающихся на [[:fr:Test]].", + "apihelp-query+langbacklinks-example-generator": "Получить информацию о страницах, ссылающихся на [[:fr:Test]].", + "apihelp-query+langlinks-summary": "Возвращает все межъязыковые ссылки с данных страниц.", + "apihelp-query+langlinks-param-limit": "Сколько ссылок вернуть.", + "apihelp-query+langlinks-param-url": "Следует ли вернуть полный URL (не может быть использовано одновременно с $1prop).", + "apihelp-query+langlinks-param-prop": "Какие дополнительные свойства получить для каждой межъязыковой ссылки:", + "apihelp-query+langlinks-paramvalue-prop-url": "Добавляет полный URL.", + "apihelp-query+langlinks-paramvalue-prop-langname": "Добавляет локализованное название языка (лучший вариант). Используйте $1inlanguagecode для указания языка.", + "apihelp-query+langlinks-paramvalue-prop-autonym": "Добавляет самоназвание языка.", + "apihelp-query+langlinks-param-lang": "Возвращает только ссылки с данным языковым кодом.", + "apihelp-query+langlinks-param-title": "Искомая ссылка. Должна быть использована вместе с $1lang.", + "apihelp-query+langlinks-param-dir": "Порядок перечисления.", + "apihelp-query+langlinks-param-inlanguagecode": "Языковой код для локализованных названий языков.", + "apihelp-query+langlinks-example-simple": "Получить межъязыковые ссылки со страницы Main Page.", + "apihelp-query+links-summary": "Возвращает все ссылки с данных страниц.", + "apihelp-query+links-param-namespace": "Показывать ссылки только на данные пространства имён.", + "apihelp-query+links-param-limit": "Сколько ссылок вернуть.", + "apihelp-query+links-param-titles": "Перечислять только данные ссылки. Полезно для проверки, содержит ли конкретная страница конкретную ссылку.", + "apihelp-query+links-param-dir": "Порядок перечисления.", + "apihelp-query+links-example-simple": "Получить ссылки со страницы Main Page.", + "apihelp-query+links-example-generator": "Получить информацию о страницах, на которые ссылается Main Page.", + "apihelp-query+links-example-namespaces": "Получить ссылки с Main Page на пространства имён {{ns:user}} и {{ns:template}}.", + "apihelp-query+linkshere-summary": "Поиск всех страниц, ссылающихся на данную.", + "apihelp-query+linkshere-param-prop": "Какие свойства получить:", + "apihelp-query+linkshere-paramvalue-prop-pageid": "Идентификатор каждой страницы.", + "apihelp-query+linkshere-paramvalue-prop-title": "Заголовок каждой страницы.", + "apihelp-query+linkshere-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.", + "apihelp-query+linkshere-param-namespace": "Включить страницы только из данных пространств имён.", + "apihelp-query+linkshere-param-limit": "Сколько страниц вернуть.", + "apihelp-query+linkshere-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.", + "apihelp-query+linkshere-example-simple": "Получить список страниц, ссылающихся на [[Main Page]].", + "apihelp-query+linkshere-example-generator": "Получить информацию о страницах, ссылающихся на [[Main Page]].", + "apihelp-query+logevents-summary": "Получение записей журналов.", + "apihelp-query+logevents-param-prop": "Какие свойства получить:", + "apihelp-query+logevents-paramvalue-prop-ids": "Добавляет идентификатор записи журнала.", + "apihelp-query+logevents-paramvalue-prop-title": "Добавляет заголовок страницы, связанной с записью журнала.", + "apihelp-query+logevents-paramvalue-prop-type": "Добавляет тип записи журнала.", + "apihelp-query+logevents-paramvalue-prop-user": "Добавляет участника, ответственного за запись журнала.", + "apihelp-query+logevents-paramvalue-prop-userid": "Добавляет идентификатор участника, ответственного за запись журнала.", + "apihelp-query+logevents-paramvalue-prop-timestamp": "Добавляет временную метку записи журнала.", + "apihelp-query+logevents-paramvalue-prop-comment": "Добавляет комментарий записи журнала.", + "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Добавляет распарсенный комментарий записи журнала.", + "apihelp-query+logevents-paramvalue-prop-details": "Перечисляет дополнительные сведения о записи в журнале.", + "apihelp-query+logevents-paramvalue-prop-tags": "Перечисляет метки записи журнала.", + "apihelp-query+logevents-param-type": "Вернуть только записи этого типа.", + "apihelp-query+logevents-param-action": "Вернуть только указанные действия журнала. Переопределяет $1type. В списке возможных значений можно использовать звёздочку, например, action/* найдёт различные подстроки после слэша (/).", + "apihelp-query+logevents-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+logevents-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+logevents-param-user": "Вернуть записи, созданные указанным участником.", + "apihelp-query+logevents-param-title": "Вернуть записи, связанные с указанными страницами.", + "apihelp-query+logevents-param-namespace": "Вернуть записи, связанные с указанными пространствами имён.", + "apihelp-query+logevents-param-prefix": "Вернуть записи, начинающиеся с заданного префикса.", + "apihelp-query+logevents-param-tag": "Только записи с заданной меткой.", + "apihelp-query+logevents-param-limit": "Сколько записей вернуть.", + "apihelp-query+logevents-example-simple": "Список последних записей.", + "apihelp-query+pagepropnames-summary": "Перечисление всех названий свойств, использованных в вики.", + "apihelp-query+pagepropnames-param-limit": "Максимальное число возвращаемых названий.", + "apihelp-query+pagepropnames-example-simple": "Получить первые 10 названий свойств.", + "apihelp-query+pageprops-summary": "Получение различных свойств страниц, определённых в содержании страницы.", + "apihelp-query+pageprops-param-prop": "Перечислить только эти свойства страницы ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] возвращает список используемых названий свойств). Полезно для проверки, используют ли страницы конкретные свойства.", + "apihelp-query+pageprops-example-simple": "Получить свойства страниц Main Page и MediaWiki.", + "apihelp-query+pageswithprop-summary": "Перечисление всех страниц, использующих заданное свойство.", + "apihelp-query+pageswithprop-param-propname": "Искомое свойство ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] возвращает список используемых названий свойств).", + "apihelp-query+pageswithprop-param-prop": "Какую информацию включить:", + "apihelp-query+pageswithprop-paramvalue-prop-ids": "Добавляет идентификатор страницы.", + "apihelp-query+pageswithprop-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.", + "apihelp-query+pageswithprop-paramvalue-prop-value": "Добавляет значение свойства страницы.", + "apihelp-query+pageswithprop-param-limit": "Максимальное число возвращаемых страниц.", + "apihelp-query+pageswithprop-param-dir": "Порядок сортировки.", + "apihelp-query+pageswithprop-example-simple": "Список первых 10 страниц, использующих {{DISPLAYTITLE:}}.", + "apihelp-query+pageswithprop-example-generator": "Получение дополнительной информации о первых десяти страницах, использующих __NOTOC__.", + "apihelp-query+prefixsearch-summary": "Осуществление поиска по префиксу названий страниц.", + "apihelp-query+prefixsearch-extended-description": "Не смотря на похожесть названий, этот модуль не является эквивалентом [[Special:PrefixIndex]]; если вы ищете его, см. [[Special:ApiHelp/query+allpages|action=query&list=allpages]] с параметром apprefix. Задача этого модуля близка к [[Special:ApiHelp/opensearch|action=opensearch]]: получение пользовательского ввода и представление наиболее подходящих заголовков. В зависимости от поискового движка, используемого на сервере, сюда может включаться исправление опечаток, избегание перенаправлений и другие эвристики.", + "apihelp-query+prefixsearch-param-search": "Поисковый запрос.", + "apihelp-query+prefixsearch-param-namespace": "Пространства имён для поиска.", + "apihelp-query+prefixsearch-param-limit": "Максимальное число возвращаемых результатов.", + "apihelp-query+prefixsearch-param-offset": "Количество пропускаемых результатов.", + "apihelp-query+prefixsearch-example-simple": "Поиск названий страниц, начинающихся с meaning.", + "apihelp-query+prefixsearch-param-profile": "Используемый поисковый профиль.", + "apihelp-query+protectedtitles-summary": "Перечисление всех названий, защищённых от создания.", + "apihelp-query+protectedtitles-param-namespace": "Перечислять только страницы этих пространств имён.", + "apihelp-query+protectedtitles-param-level": "Перечислять только названия с этим уровнем защиты.", + "apihelp-query+protectedtitles-param-limit": "Сколько страниц вернуть.", + "apihelp-query+protectedtitles-param-start": "Начать перечисление с этой метки времени защиты.", + "apihelp-query+protectedtitles-param-end": "Закончить перечисление на этой метке времени защиты.", + "apihelp-query+protectedtitles-param-prop": "Какие свойства получить:", + "apihelp-query+protectedtitles-paramvalue-prop-timestamp": "Добавляет метку времени установки защиты.", + "apihelp-query+protectedtitles-paramvalue-prop-user": "Добавляет участника, установившего защиту.", + "apihelp-query+protectedtitles-paramvalue-prop-userid": "Добавляет идентификатор участника, установившего защиту.", + "apihelp-query+protectedtitles-paramvalue-prop-comment": "Добавляет описание защиты.", + "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание защиты.", + "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Добавляет метку времени снятия защиты.", + "apihelp-query+protectedtitles-paramvalue-prop-level": "Добавляет уровень защиты.", "apihelp-query+protectedtitles-example-simple": "Список защищенных заголовков", + "apihelp-query+protectedtitles-example-generator": "Поиск ссылок на защищённые заголовки в основном пространстве имён.", + "apihelp-query+querypage-summary": "Получение списка, предоставляемого служебной страницей, основанной на QueryPage.", + "apihelp-query+querypage-param-page": "Название служебной страницы. Обратите внимание: чувствительно к регистру.", "apihelp-query+querypage-param-limit": "Количество возвращаемых результатов.", - "apihelp-query+recentchanges-param-limit": "Какое общее количество возвращать", - "apihelp-query+recentchanges-param-type": "Какие типы изменений показать.", + "apihelp-query+querypage-example-ancientpages": "Вернуть результаты [[Special:Ancientpages]].", + "apihelp-query+random-summary": "Получение набора случайных страниц.", + "apihelp-query+random-extended-description": "Страницы перечисляются в строгой последовательности, случайна только входная точка. Это означает, что если, например, Main Page — первая страница в списке, то List of fictional monkeys всегда будет второй, List of people on stamps of Vanuatu — третьей, и так далее.", + "apihelp-query+random-param-namespace": "Вернуть только страницы этих пространств имён.", + "apihelp-query+random-param-limit": "Ограничение на количество возвращаемых страниц.", + "apihelp-query+random-param-redirect": "Вместо этого, используйте $1filterredir=redirects.", + "apihelp-query+random-param-filterredir": "Как фильтровать перенаправления.", + "apihelp-query+random-example-simple": "Вернуть две случайные страницы из основного пространства имён.", + "apihelp-query+random-example-generator": "Вернуть информацию о двух случайных страницах из основного пространства имён.", + "apihelp-query+recentchanges-summary": "Перечисление последних правок.", + "apihelp-query+recentchanges-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+recentchanges-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+recentchanges-param-namespace": "Только правки в этих пространствах имён.", + "apihelp-query+recentchanges-param-user": "Только правки данного участника.", + "apihelp-query+recentchanges-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+recentchanges-param-tag": "Только правки с заданной меткой.", + "apihelp-query+recentchanges-param-prop": "Включить дополнительную информацию:", + "apihelp-query+recentchanges-paramvalue-prop-user": "Добавить анонимных участников, ответственных за правку или метку.", + "apihelp-query+recentchanges-paramvalue-prop-userid": "Добавить идентификатор ответственного за правку участника.", + "apihelp-query+recentchanges-paramvalue-prop-comment": "Добавляет описание правки.", + "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.", + "apihelp-query+recentchanges-paramvalue-prop-flags": "Добавляет метки правки.", + "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Добавляет временную метку правки.", + "apihelp-query+recentchanges-paramvalue-prop-title": "Добавляет заголовок отредактированной страницы.", + "apihelp-query+recentchanges-paramvalue-prop-ids": "Добавляет идентификаторы страницы, правки, старой и новой версии.", + "apihelp-query+recentchanges-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы в байтах.", + "apihelp-query+recentchanges-paramvalue-prop-redirect": "Отмечает правку, если страница является перенаправлением.", + "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Отмечает патрулируемые правки как отпатрулированные или неотпатрулированные.", + "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Добавляет информацию о записи журнала (идентификатор записи, её тип, и так далее).", + "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет теги записи.", + "apihelp-query+recentchanges-paramvalue-prop-sha1": "Добавляет значение контрольных сумм для записей, связанных с версией.", + "apihelp-query+recentchanges-param-token": "Вместо этого используйте [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-query+recentchanges-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.", + "apihelp-query+recentchanges-param-limit": "Сколько правок вернуть.", + "apihelp-query+recentchanges-param-type": "Какие типы правок показать.", + "apihelp-query+recentchanges-param-toponly": "Перечислять только последние правки страниц.", + "apihelp-query+recentchanges-param-generaterevisions": "При использовании в качестве генератора, генерировать идентификаторы версий вместо их названий. Записи последних изменений без привязанного идентификатора версии (например, большинство записей журналов) не сгенерируют ничего.", "apihelp-query+recentchanges-example-simple": "Список последних изменений.", + "apihelp-query+recentchanges-example-generator": "Получить информацию о последних страницах с неотпатрулированными изменениями.", + "apihelp-query+redirects-summary": "Возвращает все перенаправления на данную страницу.", + "apihelp-query+redirects-param-prop": "Какие свойства получить:", + "apihelp-query+redirects-paramvalue-prop-pageid": "Идентификатор каждого перенаправления.", + "apihelp-query+redirects-paramvalue-prop-title": "Название каждого перенаправления.", + "apihelp-query+redirects-paramvalue-prop-fragment": "Фрагемнт каждого перенаправления, если доступен.", + "apihelp-query+redirects-param-namespace": "Включить страницы только из данных пространств имён.", "apihelp-query+redirects-param-limit": "Сколько перенаправлений вернуть.", + "apihelp-query+redirects-param-show": "Показывать только элементы, удовлетворяющие данным критериям:\n;fragment: Показывать только перенаправления с фрагментами.\n;!fragment: Показывать только перенаправления без фрагментов.", + "apihelp-query+redirects-example-simple": "Получить список перенаправлений на [[Main Page]].", + "apihelp-query+redirects-example-generator": "Получить информацию о всех перенаправлениях на [[Main Page]].", + "apihelp-query+revisions-summary": "Получение информации о версии страницы.", + "apihelp-query+revisions-extended-description": "Может использоваться в трёх режимах:\n# Получение данных о наборе страниц (последних версий) с помощью передачи названий или идентификаторов страниц.\n# Получение версий одной данной страницы, используя названия или идентификаторы с началом, концом или лимитом.\n# Получение данных о наборе версий, передаваемых с помощью их идентификаторов.", + "apihelp-query+revisions-paraminfo-singlepageonly": "Может быть использовано только с одной страницей (режим №2).", + "apihelp-query+revisions-param-startid": "Начать перечисление с этой временной метки версии. Версия обязана существовать, но не обязана принадлежать этой странице.", + "apihelp-query+revisions-param-endid": "Закончить перечисление на этой временной метке версии. Версия обязана существовать, но не обязана принадлежать этой странице.", + "apihelp-query+revisions-param-start": "С какой временной метки начать перечисление.", + "apihelp-query+revisions-param-end": "Перечислять до данной временной метки.", + "apihelp-query+revisions-param-user": "Только версии данного участника.", + "apihelp-query+revisions-param-excludeuser": "Исключить версии данного участника.", + "apihelp-query+revisions-param-tag": "Только версии с заданной меткой.", + "apihelp-query+revisions-param-token": "Какие токены получить для каждой версии.", + "apihelp-query+revisions-example-content": "Получить данные с содержимым для последних версий страниц API и Main Page.", "apihelp-query+revisions-example-last5": "Получить последние 5 версий Main Page.", - "apihelp-query+revisions-example-first5": "Получить 5 первых версий Main Page.", - "apihelp-query+revisions-example-first5-after": "Получить 5 первых версий Main Page созданных после 2006-05-01.", - "apihelp-query+revisions-example-first5-not-localhost": "Получить 5 первых версий Main Page которые не созданы анонимными пользователями 127.0.0.1.", - "apihelp-query+revisions-example-first5-user": "Получить 5 первых версий Main Page которые созданы пользователями MediaWiki default.", - "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено", - "apihelp-query+search-description": "Выполнить полнотекстовый поиск.", - "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке", - "apihelp-query+tags-description": "Список изменерий тегов.", - "apihelp-query+tags-example-simple": "Лист доступных тегов", - "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен", - "apihelp-query+templates-param-limit": "Как много шаблонов для возврата", - "apihelp-query+transcludedin-param-limit": "Сколько возвращать", - "apihelp-query+usercontribs-description": "Получить все правки пользователя", - "apihelp-revisiondelete-description": "удалить и восстановить редакции", + "apihelp-query+revisions-example-first5": "Получить первые 5 версий Main Page.", + "apihelp-query+revisions-example-first5-after": "Получить первые 5 версий Main Page созданных после 2006-05-01.", + "apihelp-query+revisions-example-first5-not-localhost": "Получить первые 5 версий Main Page, сделанных не анонимным участником 127.0.0.1.", + "apihelp-query+revisions-example-first5-user": "Получить первые 5 версий Main Page, сделанных участником MediaWiki default.", + "apihelp-query+revisions+base-param-prop": "Какие свойства каждой версии получить:", + "apihelp-query+revisions+base-paramvalue-prop-ids": "Идентификатор версии.", + "apihelp-query+revisions+base-paramvalue-prop-flags": "Флаги версии (малая правка).", + "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Временная метка версии.", + "apihelp-query+revisions+base-paramvalue-prop-user": "Участник, создавший версию.", + "apihelp-query+revisions+base-paramvalue-prop-userid": "Идентификатор создателя версии.", + "apihelp-query+revisions+base-paramvalue-prop-size": "Длина версии (в байтах).", + "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-хэш (base 16) версии.", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Идентификатор модели содержимого версии.", + "apihelp-query+revisions+base-paramvalue-prop-comment": "Описание правки.", + "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Распарсенное описание правки.", + "apihelp-query+revisions+base-paramvalue-prop-content": "Текст версии.", + "apihelp-query+revisions+base-paramvalue-prop-tags": "Метки версии.", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Не поддерживается. Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]] или [[Special:ApiHelp/parse|action=parse]]. Дерево парсинга XML содержимого версии (требуется модель содержимого $1).", + "apihelp-query+revisions+base-param-limit": "Сколько версий вернуть.", + "apihelp-query+revisions+base-param-expandtemplates": "Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Раскрыть шаблоны в содержимом версии (требуется $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Вместо этого используйте [[Special:ApiHelp/expandtemplates|action=expandtemplates]] или [[Special:ApiHelp/parse|action=parse]]. Сгенерировать дерево парсинга XML содержимого версии (требуется $1prop=content).", + "apihelp-query+revisions+base-param-parse": "Вместо этого используйте [[Special:ApiHelp/parse|action=parse]]. Распарсить содержимое версии (требуется $1prop=content). Из соображений производительности, при использовании этой опции, в качестве $1limit принудительно устанавливается 1.", + "apihelp-query+revisions+base-param-section": "Вернуть содержимое только секции с заданным номером.", + "apihelp-query+revisions+base-param-diffto": "Вместо этого используйте [[Special:ApiHelp/compare|action=compare]]. Идентификатор версии, с которым сравнивать каждую версию. Используйте prev, next и cur для предыдущей, следующей и текущей версии соответственно.", + "apihelp-query+revisions+base-param-difftotext": "Вместо этого используйте [[Special:ApiHelp/compare|action=compare]]. Текст, с которым сравнивать каждую версию. Сравнивает ограниченное число версий. Переопределяет $1diffto. Если задано $1section, сравнение будет произведено только с этой секцией.", + "apihelp-query+revisions+base-param-difftotextpst": "Вместо этого используйте [[Special:ApiHelp/compare|action=compare]]. Выполнить преобразование перед записью правки до сравнения. Доступно только при использовании с $1difftotext.", + "apihelp-query+revisions+base-param-contentformat": "Формат серилиализации, использованный в $1difftotext и ожидаемый в результате.", + "apihelp-query+search-summary": "Проведение полнотекстового поиска.", + "apihelp-query+search-param-search": "Искать страницы, названия или тексты которых содержат это значение. Вы можете использовать в поисковом запросе служебные функции в зависимости от того, какой поисковый движок используется на сервере.", + "apihelp-query+search-param-namespace": "Искать только в этих пространствах имён.", + "apihelp-query+search-param-what": "Какой тип поиска осуществить.", + "apihelp-query+search-param-info": "Какие метаданные вернуть.", + "apihelp-query+search-param-prop": "Какие свойства вернуть:", + "apihelp-query+search-param-qiprofile": "Используемый запросонезависимый профиль (затрагивает оценивающий алгоритм).", + "apihelp-query+search-paramvalue-prop-size": "Добавляет размер страницы в байтах.", + "apihelp-query+search-paramvalue-prop-wordcount": "Добавляет количество слов на странице.", + "apihelp-query+search-paramvalue-prop-timestamp": "Добавляет метку времени последнего редактирования страницы.", + "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": "Добавляет распарсенный фрагмент заголовка найденного раздела.", + "apihelp-query+search-paramvalue-prop-sectiontitle": "Добавляет заголовок найденного раздела.", + "apihelp-query+search-paramvalue-prop-categorysnippet": "Добавляет распарсенный фрагмент найденной категории.", + "apihelp-query+search-paramvalue-prop-isfilematch": "Добавляет логическое значение, обозначающее, удовлетворяет ли поисковому запросу содержимое файла.", + "apihelp-query+search-paramvalue-prop-score": "Игнорируется.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Игнорируется.", + "apihelp-query+search-param-limit": "Сколько страниц вернуть.", + "apihelp-query+search-param-interwiki": "Включить результаты из других вики, если доступны.", + "apihelp-query+search-param-backend": "Какой поисковый движок использовать, если не стандартный.", + "apihelp-query+search-param-enablerewrites": "Разрешить редактирование запроса. Некоторые поисковые движки могут отредактировать запрос, например, исправив опечатку, если посчитают, что это приведёт к лучшим результатам.", + "apihelp-query+search-example-simple": "Найти meaning.", + "apihelp-query+search-example-text": "Найти тексты, содержащие meaning.", + "apihelp-query+search-example-generator": "Получить информацию о страницах, возвращённых по поисковому запросу meaning.", + "apihelp-query+siteinfo-summary": "Получение основной информации о сайте.", + "apihelp-query+siteinfo-param-prop": "Какую информацию получить:", + "apihelp-query+siteinfo-paramvalue-prop-general": "Общую системную информацию.", + "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Список зарегистрированных пространств имён и их каноничные имена.", + "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Список зарегистрированных синонимов пространств имён.", + "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Список синонимов служебных страниц.", + "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Список магических слов и их синонимы.", + "apihelp-query+siteinfo-paramvalue-prop-statistics": "Статистика сайта.", + "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Карта интервик (может быть отфильтрована, или локализована с помощью $1inlanguagecode).", + "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Возвращает сервер базы данных с наибольшим отставанием репликации.", + "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Список групп участников и связанных прав.", + "apihelp-query+siteinfo-paramvalue-prop-libraries": "Библиотеки, установленные в вики.", + "apihelp-query+siteinfo-paramvalue-prop-extensions": "Расширения, установленные в вики.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Список файловых расширений, разрешённых к загрузке.", + "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Возвращает правовую информацию (лицензию), если доступно.", + "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Возвращает информацию о доступных типах защиты страниц.", + "apihelp-query+siteinfo-paramvalue-prop-languages": "Возвращает список языков, поддерживаемых MediaWiki (опционально локализованных с помощью $1inlanguagecode).", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список языковых кодов, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты, поддерживаемые для каждого языка.", + "apihelp-query+siteinfo-paramvalue-prop-skins": "Возвращает список доступных скинов (опционально локализованных с помощью $1inlanguagecode, в противном случае — на языке вики).", + "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Возвращает список тегов рашсирений парсера.", + "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Возвращает список перехватчиков функций парсера.", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Возвращает список всех подписанных перехватчиков (содержимое [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-variables": "Возвращает список идентификаторов переменных.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "Возвращает список протоколов, разрешённых во внешних ссылках.", + "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Возвращает значения по умолчанию настроек участников.", + "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Возвращает конфигурацию диалога загрузки.", + "apihelp-query+siteinfo-param-filteriw": "Вернуть только локальные или только нелокальные записи карты интервик.", + "apihelp-query+siteinfo-param-showalldb": "Перечисляет все сервера баз данных, а не только самый отстающий.", + "apihelp-query+siteinfo-param-numberingroup": "Перечисляет количество участников в группах.", + "apihelp-query+siteinfo-param-inlanguagecode": "Языковой код для перевода названий языков и скинов.", + "apihelp-query+siteinfo-example-simple": "Запросить информацию о сайте.", + "apihelp-query+siteinfo-example-interwiki": "Запросить список локальных префиксов интервик.", + "apihelp-query+siteinfo-example-replag": "Проверить текущее отставание репликации.", + "apihelp-query+stashimageinfo-summary": "Возвращает информацию о файлах в тайнике (upload stash).", + "apihelp-query+stashimageinfo-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.", + "apihelp-query+stashimageinfo-param-sessionkey": "Синоним $1filekey для обратной совместимости.", + "apihelp-query+stashimageinfo-example-simple": "Вернуть информацию о файле в тайнике.", + "apihelp-query+stashimageinfo-example-params": "Вернуть эскизы двух файлов в тайнике.", + "apihelp-query+tags-summary": "Список меток правок.", + "apihelp-query+tags-param-limit": "Максимальное количество меток в списке.", + "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+tags-paramvalue-prop-hitcount": "Добавляет количество правок и записей в журналах, использующих эту метку.", + "apihelp-query+tags-paramvalue-prop-defined": "Показывает, определена ли метка.", + "apihelp-query+tags-paramvalue-prop-source": "Получить источники меток, которыми могут быть extension для меток, определённых расширениями, и manual для меток, определённых участниками вручную.", + "apihelp-query+tags-paramvalue-prop-active": "Применима ли метка до сих пор.", + "apihelp-query+tags-example-simple": "Список доступных меток.", + "apihelp-query+templates-summary": "Возвращает все страницы, включённые в данную.", + "apihelp-query+templates-param-namespace": "Показать шаблоны только данного пространства имён.", + "apihelp-query+templates-param-limit": "Сколько шаблонов вернуть.", + "apihelp-query+templates-param-templates": "Перечислять только эти шаблоны. Полезно для проверки, включает ли конкретная страница конкретный шаблон.", + "apihelp-query+templates-param-dir": "Порядок перечисления.", + "apihelp-query+templates-example-simple": "Получить список шаблонов, использующихся на Main Page.", + "apihelp-query+templates-example-generator": "Получить информацию о шаблонах, использующихся на Main Page.", + "apihelp-query+templates-example-namespaces": "Получить страницы из пространств имён {{ns:user}} и {{ns:template}}, включённые в Main Page.", + "apihelp-query+tokens-summary": "Получение токенов для действий, связанных с редактированием данных.", + "apihelp-query+tokens-param-type": "Типы запрашиваемых токенов.", + "apihelp-query+tokens-example-simple": "Получить csrf-токен (по умолчанию).", + "apihelp-query+tokens-example-types": "Получить токен наблюдения и токен патрулирования.", + "apihelp-query+transcludedin-summary": "Поиск всех страниц, включающих данные страницы.", + "apihelp-query+transcludedin-param-prop": "Какие свойства получить:", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "Идентификатор каждой страницы.", + "apihelp-query+transcludedin-paramvalue-prop-title": "Заголовок каждой страницы.", + "apihelp-query+transcludedin-paramvalue-prop-redirect": "Метка, является ли страница перенаправлением.", + "apihelp-query+transcludedin-param-namespace": "Включить страницы только из данных пространств имён.", + "apihelp-query+transcludedin-param-limit": "Сколько страниц вернуть.", + "apihelp-query+transcludedin-param-show": "Показать только элементы, соответствующие этим критериям:\n;redirect: Показать только перенаправления.\n;!redirect: Показать только не перенаправления.", + "apihelp-query+transcludedin-example-simple": "Получить список страниц, включающих Main Page.", + "apihelp-query+transcludedin-example-generator": "Получить информацию о страницах, включающих Main Page.", + "apihelp-query+usercontribs-summary": "Получение всех правок участника.", + "apihelp-query+usercontribs-param-limit": "Максимальное количество возвращаемых правок.", + "apihelp-query+usercontribs-param-start": "Временная метка, с которой начать возврат.", + "apihelp-query+usercontribs-param-end": "Временная метка, на которой закончить возврат.", + "apihelp-query+usercontribs-param-user": "Участники, чей вклад необходимо получить. Не может быть использовано с $1userids или $1userprefix.", + "apihelp-query+usercontribs-param-userprefix": "Получить вклад всех участников, имена которых начинаются с этого значения. Не может быть использовано с $1user или $1userids.", + "apihelp-query+usercontribs-param-userids": "Идентификаторы участников, чей вклад необходимо получить. Не может быть использовано с $1user или $1userprefix.", + "apihelp-query+usercontribs-param-namespace": "Перечислять только правки в этих пространствах имён.", + "apihelp-query+usercontribs-param-prop": "Включить дополнительную информацию:", + "apihelp-query+usercontribs-paramvalue-prop-ids": "Добавляет идентификатор страницы и версии.", + "apihelp-query+usercontribs-paramvalue-prop-title": "Добавляет заголовок и идентификатор пространства имён страницы.", + "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Добавляет временную метку правки.", + "apihelp-query+usercontribs-paramvalue-prop-comment": "Добавляет описание правки.", + "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.", + "apihelp-query+usercontribs-paramvalue-prop-size": "Добавляет новый размер страницы.", + "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Добавляет разницу между размерами страницы до и после правки.", + "apihelp-query+usercontribs-paramvalue-prop-flags": "Добавляет флаги правки.", + "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Отмечает отпатрулированные правки.", + "apihelp-query+usercontribs-paramvalue-prop-tags": "Перечисляет метки правки.", + "apihelp-query+usercontribs-param-show": "Показать только элементы, удовлетворяющие данным критериям, например, только не малые правки: $2show=!minor.\n\nЕсли установлено $2show=patrolled или $2show=!patrolled, правки старее [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|секунды|секунд}}) не будут показаны.", + "apihelp-query+usercontribs-param-tag": "Только правки с заданной меткой.", + "apihelp-query+usercontribs-param-toponly": "Перечислять только последние правки страниц.", + "apihelp-query+usercontribs-example-user": "Показать вклад участника Example.", + "apihelp-query+usercontribs-example-ipprefix": "Показать вклад со всех IP-адресов, начинающихся на 192.0.2..", + "apihelp-query+userinfo-summary": "Получение информации о текущем участнике.", + "apihelp-query+userinfo-param-prop": "Какую информацию включить:", + "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Определяет, заблокирован ли текущий участник, кем и по какой причине.", + "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Добавляет метку messages, если у текущего участника есть непрочитанные сообщения.", + "apihelp-query+userinfo-paramvalue-prop-groups": "Перечисляет все группы, в которые входит участник.", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "Возвращает группы, в которые участник был явно включён, включая дату окончания членства для каждой группы.", + "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Перечисляет все группы, в которые участник был включён автоматически.", + "apihelp-query+userinfo-paramvalue-prop-rights": "Перечисляет все права текущего участника.", + "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Перечисляет группы, в которые или из которых участник может добавить или удалить других участников.", + "apihelp-query+userinfo-paramvalue-prop-options": "Перечисляет все настройки, установленные текущим участником.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Возвращает токен для смены настроек текущего участника.", + "apihelp-query+userinfo-paramvalue-prop-editcount": "Добавляет счётчик правок текущего участника.", + "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Добавляет все скоростные лимиты, применимые к текущему участнику.", + "apihelp-query+userinfo-paramvalue-prop-realname": "Добавляет настоящее имя участника.", + "apihelp-query+userinfo-paramvalue-prop-email": "Добавляет электронный адрес участника и дату проверки его подлинности.", + "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Возвращает назад заголовок Accept-Language, отосланный клиентом, в структурированном формате.", + "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Добавляет дату регистрации участника.", + "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Добавляет число непрочитанных страниц в странице наблюдения участника (максимум $1; возвращает $2, если их больше).", + "apihelp-query+userinfo-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.", + "apihelp-query+userinfo-param-attachedwiki": "Вместе с $1prop=centralids отображает, прикреплён ли к вики участник с этим идентификатором.", + "apihelp-query+userinfo-example-simple": "Получение информации о текущем участнике.", + "apihelp-query+userinfo-example-data": "Получение дополнительной информации о текущем участнике.", + "apihelp-query+users-summary": "Получение информации о списке участников.", + "apihelp-query+users-param-prop": "Какую информацию включить:", + "apihelp-query+users-paramvalue-prop-blockinfo": "Определяет, заблокирован ли участник, кем и по какой причине.", + "apihelp-query+users-paramvalue-prop-groups": "Перечисляет все группы, в которые входит каждый участник.", + "apihelp-query+users-paramvalue-prop-groupmemberships": "Возвращает группы, в которые каждый участник был явно включён, включая дату окончания членства для каждой группы.", + "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": "Отмечает, может ли и хочет ли участник получать электронную почту посредством [[Special:Emailuser]].", + "apihelp-query+users-paramvalue-prop-gender": "Отмечает пол текущего участника. Возвращает «male», «female» или «unknown».", + "apihelp-query+users-paramvalue-prop-centralids": "Добавляет центральный идентификатор и статус прикрепления участника.", + "apihelp-query+users-paramvalue-prop-cancreate": "Определяет, могут ли быть созданы аккаунты с корректными, но незарегистрированными именами.", + "apihelp-query+users-param-attachedwiki": "Вместе с $1prop=centralids отображает, прикреплён ли к вики участник с этим идентификатором.", + "apihelp-query+users-param-users": "Список участников, для которых получить информацию.", + "apihelp-query+users-param-userids": "Список идентификаторов участников, для которых получить информацию.", + "apihelp-query+users-param-token": "Вместо этого используйте [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-query+users-example-simple": "Вернуть информацию о участнике Example.", + "apihelp-query+watchlist-summary": "Получение последних правок страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-param-allrev": "Включить несколько правок одной страницы из заданного временного промежутка.", + "apihelp-query+watchlist-param-start": "Временная метка, с которой начать перечисление.", + "apihelp-query+watchlist-param-end": "Временная метка, на которой закончить перечисление.", + "apihelp-query+watchlist-param-namespace": "Только правки в этих пространствах имён.", + "apihelp-query+watchlist-param-user": "Только правки данного участника.", + "apihelp-query+watchlist-param-excludeuser": "Не перечислять правки данного участника.", + "apihelp-query+watchlist-param-limit": "Сколько результатов возвращать за один запрос.", + "apihelp-query+watchlist-param-prop": "Какие дополнительные свойства получить:", + "apihelp-query+watchlist-paramvalue-prop-ids": "Добавляет идентификаторы страницы и версии.", + "apihelp-query+watchlist-paramvalue-prop-title": "Добавляет заголовок страницы.", + "apihelp-query+watchlist-paramvalue-prop-flags": "Добавляет флаги правки.", + "apihelp-query+watchlist-paramvalue-prop-user": "Добавляет участника, сделавшего правку.", + "apihelp-query+watchlist-paramvalue-prop-userid": "Добавляет идентификатор участника, сделавшего правку.", + "apihelp-query+watchlist-paramvalue-prop-comment": "Добавляет описание правки.", + "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.", + "apihelp-query+watchlist-paramvalue-prop-timestamp": "Добавляет временную метку правки.", + "apihelp-query+watchlist-paramvalue-prop-patrol": "Определяет, была ли правка отпатрулирована.", + "apihelp-query+watchlist-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы.", + "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Добавляет метку времени, когда участник был уведомлён о правке.", + "apihelp-query+watchlist-paramvalue-prop-loginfo": "Добавляет информацию о журнале, где уместно.", + "apihelp-query+watchlist-param-show": "Показать только элементы, удовлетворяющие данным критериям. Например, чтобы отобразить только малые правки, сделанные зарегистрированными участниками, установите $1show=minor|!anon.", + "apihelp-query+watchlist-param-type": "Какие типы правок показать:", + "apihelp-query+watchlist-paramvalue-type-edit": "Обычные правки страниц.", + "apihelp-query+watchlist-paramvalue-type-external": "Внешние правки.", + "apihelp-query+watchlist-paramvalue-type-new": "Создания страниц.", + "apihelp-query+watchlist-paramvalue-type-log": "Записи журнала.", + "apihelp-query+watchlist-paramvalue-type-categorize": "Правки категоризации.", + "apihelp-query+watchlist-param-owner": "Используется вместе с $1token для получения списка наблюдения другого участника.", + "apihelp-query+watchlist-param-token": "Токен безопасности (доступен в [[Special:Preferences#mw-prefsection-watchlist|настройках]] участника), предоставляющий доступ к списку наблюдения другого участника.", + "apihelp-query+watchlist-example-simple": "Список последних правок недавно отредактированных страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-example-props": "Запросить дополнительную информацию о последних правках недавно отредактированных страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-example-allrev": "Запросить информацию о всех недавних правках страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-example-generator": "Запросить информацию о страницах для недавно отредактированных страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-example-generator-rev": "Запросить информацию о версиях для последних правок страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlist-example-wlowner": "Список последних правок недавно отредактированных страниц из списка наблюдения участника Example.", + "apihelp-query+watchlistraw-summary": "Получение всех страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlistraw-param-namespace": "Перечислять только страницы этих пространств имён.", + "apihelp-query+watchlistraw-param-limit": "Сколько результатов возвращать за один запрос.", + "apihelp-query+watchlistraw-param-prop": "Какие дополнительные свойства получить:", + "apihelp-query+watchlistraw-paramvalue-prop-changed": "Добавляет метку времени, когда участник был уведомлён о правке.", + "apihelp-query+watchlistraw-param-show": "Перечислять только элементы, соответствующие этим критериям.", + "apihelp-query+watchlistraw-param-owner": "Используется вместе с $1token для получения списка наблюдения другого участника.", + "apihelp-query+watchlistraw-param-token": "Токен безопасности (доступен в [[Special:Preferences#mw-prefsection-watchlist|настройках]] участника), предоставляющий доступ к списку наблюдения другого участника.", + "apihelp-query+watchlistraw-param-dir": "Порядок перечисления.", + "apihelp-query+watchlistraw-param-fromtitle": "Название (с префиксом пространства имён), с которого начать перечисление.", + "apihelp-query+watchlistraw-param-totitle": "Название (с префиксом пространства имён), на котором закончить перечисление.", + "apihelp-query+watchlistraw-example-simple": "Получение страниц из списка наблюдения текущего участника.", + "apihelp-query+watchlistraw-example-generator": "Запросить информацию о страницах из списка наблюдения текущего участника.", + "apihelp-removeauthenticationdata-summary": "Удаление аутентификационных данных для текущего участника.", + "apihelp-removeauthenticationdata-example-simple": "Попытка удалить данные текущего участника для FooAuthenticationRequest.", + "apihelp-resetpassword-summary": "Отправить участнику письмо для сброса пароля.", + "apihelp-resetpassword-extended-description-noroutes": "Маршруты смены пароля не доступны.\n\nВключите маршруты в [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] для использования этого модуля.", + "apihelp-resetpassword-param-user": "Сбрасываемый участник.", + "apihelp-resetpassword-param-email": "Электронный адрес сбрасываемого участника.", + "apihelp-resetpassword-example-user": "Послать письмо для сброса пароля участнику Example.", + "apihelp-resetpassword-example-email": "Послать письмо для сброса пароля всем участникам с электронным адресом user@example.com.", + "apihelp-revisiondelete-summary": "Удаление и восстановление версий страниц.", + "apihelp-revisiondelete-param-type": "Тип осуществляемого удаления версии.", + "apihelp-revisiondelete-param-target": "Название страницы удаляемой версии, если это требуется для выбранного типа.", + "apihelp-revisiondelete-param-ids": "Идентификаторы удаляемых версий.", + "apihelp-revisiondelete-param-hide": "Что скрыть для каждой версии.", + "apihelp-revisiondelete-param-show": "Что показать для каждой версии.", + "apihelp-revisiondelete-param-suppress": "Следует ли скрыть данные от администраторов так же, как и от остальных участников.", + "apihelp-revisiondelete-param-reason": "Причина удаления или восстановления.", + "apihelp-revisiondelete-param-tags": "Изменить метки записи в журнале удалений.", + "apihelp-revisiondelete-example-revision": "Скрыть содержимое версии 12345 страницы Main Page.", + "apihelp-revisiondelete-example-log": "Скрыть все данные записи 67890 в журнале с причиной BLP violation.", + "apihelp-rollback-summary": "Отмена последней правки на странице.", + "apihelp-rollback-extended-description": "Если последний редактировавший страницу участник сделал несколько правок подряд, все они будут откачены.", + "apihelp-rollback-param-title": "Заголовок откатываемой страницы. Не может быть использовано одновременно с $1pageid.", + "apihelp-rollback-param-pageid": "Идентификатор откатываемой страницы. Не может быть использовано одновременно с $1title.", + "apihelp-rollback-param-tags": "Метки, применяемые к откату.", + "apihelp-rollback-param-user": "Имя участника, чьи правки следует откатить.", + "apihelp-rollback-param-summary": "Пользовательское описание правки. При пустом значении будет использовано стандартное описание.", + "apihelp-rollback-param-markbot": "Отметить откатываемые правки и откат как правки бота.", + "apihelp-rollback-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", + "apihelp-rollback-example-simple": "Откатить последние изменения страницы Main Page участника Example.", + "apihelp-rollback-example-summary": "Откатить последние правки страницы Main Page анонимного участника 192.0.2.5 с описанием Reverting vandalism, и отметить эти правки и их откат как правки ботов.", + "apihelp-rsd-summary": "Экспорт схемы RSD (Really Simple Discovery).", + "apihelp-rsd-example-simple": "Экспортировать схему RSD.", + "apihelp-setnotificationtimestamp-summary": "Обновление временной метки уведомления для отслеживаемых страниц.", + "apihelp-setnotificationtimestamp-extended-description": "Это затрагивает подсвечивание изменённых страниц в списке наблюдения и истории, и отправляет письмо, если включена настройка «{{int:tog-enotifwatchlistpages}}».", + "apihelp-setnotificationtimestamp-param-entirewatchlist": "Работать над всеми отслеживаемыми страницами.", + "apihelp-setnotificationtimestamp-param-timestamp": "Новая временная метка уведомления.", + "apihelp-setnotificationtimestamp-param-torevid": "Версия, к временной метке которой приравнять временную метку уведомления (только для одной страницы).", + "apihelp-setnotificationtimestamp-param-newerthanrevid": "Версия, новее которой сделать временную метку уведомления (только для одной страницы).", + "apihelp-setnotificationtimestamp-example-all": "Сбросить статус уведомления для всего списка наблюдения.", + "apihelp-setnotificationtimestamp-example-page": "Сбросить статус уведомления для Main page.", + "apihelp-setnotificationtimestamp-example-pagetimestamp": "Установить временную метку уведомления для страницы Main page таким образом, чтобы сделать все правки с 1 января 2012 года непросмотренными.", + "apihelp-setnotificationtimestamp-example-allpages": "Сбросить статус уведомления для страниц из пространства имён {{ns:user}}.", + "apihelp-setpagelanguage-summary": "Изменить язык страницы.", + "apihelp-setpagelanguage-extended-description-disabled": "Изменение языка страницы не разрешено в этой вики.\n\nАктивируйте [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] для использования этого действия.", + "apihelp-setpagelanguage-param-title": "Название страницы, язык которой вы желаете поменять. Не может быть использовано одновременно с $1pageid.", + "apihelp-setpagelanguage-param-pageid": "Идентификатор страницы, язык которой вы желаете поменять. Не может быть использовано одновременно с $1title.", + "apihelp-setpagelanguage-param-lang": "Код нового языка. Используйте default для смены на язык содержимого по умолчанию для этой вики.", + "apihelp-setpagelanguage-param-reason": "Причина изменения.", + "apihelp-setpagelanguage-param-tags": "Изменить теги записей в журнале, возникающих в результате этого действия.", + "apihelp-setpagelanguage-example-language": "Изменить язык Main Page на баскский.", + "apihelp-setpagelanguage-example-default": "Изменить язык страницы с идентификатором 123 на язык по умолчанию.", + "apihelp-stashedit-summary": "Подготовка правки в общем кэше.", + "apihelp-stashedit-extended-description": "Предназначено для использования через AJAX из формы редактирования для увеличения производительности сохранения страницы.", + "apihelp-stashedit-param-title": "Заголовок редактируемой страницы.", + "apihelp-stashedit-param-section": "Номер раздела. 0 для верхнего раздела, new для нового раздела.", "apihelp-stashedit-param-sectiontitle": "Заголовок нового раздела.", - "apihelp-unblock-description": "Разблокировать участника.", - "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с $1id или $1userid.", - "apihelp-unblock-param-userid": "ID участника, которого вы хотите разблокировать. Нельзя использовать одновременно с $1id или $1user.", - "apihelp-unblock-param-reason": "Причина разблокировки", - "apihelp-unblock-example-id": "Разблокировать блок с идентификатором #105.", - "apihelp-unblock-example-user": "Разблокировать пользователя Bob по причине Sorry Bob.", - "apihelp-undelete-param-title": "Заголовок страницы для восстановления.", - "apihelp-undelete-param-reason": "Причины восстановления.", + "apihelp-stashedit-param-text": "Содержимое страницы.", + "apihelp-stashedit-param-stashedtexthash": "Хэш содержимого страницы в кэше.", + "apihelp-stashedit-param-contentmodel": "Модель нового содержимого.", + "apihelp-stashedit-param-contentformat": "Формат сериализации содержимого, используемый для введённого текста.", + "apihelp-stashedit-param-baserevid": "Идентификатор предыдущей версии.", + "apihelp-stashedit-param-summary": "Описание правки.", + "apihelp-tag-summary": "Добавление или удаление меток отдельных правок или записей журналов.", + "apihelp-tag-param-rcid": "Один или более идентификаторов правок, метки которых нужно добавить или удалить.", + "apihelp-tag-param-revid": "Один или более идентификаторов версий, метки которых нужно добавить или удалить.", + "apihelp-tag-param-logid": "Один или более идентификаторов записей журналов, метки которых нужно добавить или удалить.", + "apihelp-tag-param-add": "Добавляемые метки. Добавлять можно только метки, заданные вручную.", + "apihelp-tag-param-remove": "Удаляемые метки. Удалять можно только метки, заданные вручную или не заданные.", + "apihelp-tag-param-reason": "Причина изменения.", + "apihelp-tag-param-tags": "Метки, применяемые к записи в журнале, создаваемой в результате этого действия.", + "apihelp-tag-example-rev": "Добавить метку vandalism к версии с идентификатором 123 без указания причины.", + "apihelp-tag-example-log": "Удаление метки spam из записи журнала с идентификатором 123 с причиной Wrongly applied.", + "apihelp-tokens-summary": "Получение токенов для действий, связанных с редактированием данных.", + "apihelp-tokens-extended-description": "Этот модуль не поддерживается в пользу [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-param-type": "Типы запрашиваемых токенов.", + "apihelp-tokens-example-edit": "Получить токен редактирования (по умолчанию).", + "apihelp-tokens-example-emailmove": "Получить токен электронной почты и переименования.", + "apihelp-unblock-summary": "Разблокировка участника.", + "apihelp-unblock-param-id": "Идентификатор снимаемой блокировки (получается с помощью list=blocks). Не может быть использовано одновременно с $1user или $1userid.", + "apihelp-unblock-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите разблокировать. Нельзя использовать одновременно с $1userid", + "apihelp-unblock-param-userid": "Идентификатор участника, которого вы хотите разблокировать. Нельзя использовать одновременно с $1id или $1user.", + "apihelp-unblock-param-reason": "Причина разблокировки.", + "apihelp-unblock-param-tags": "Изменить метки записи в журнале блокировок.", + "apihelp-unblock-example-id": "Снять блокировку с идентификатором #105.", + "apihelp-unblock-example-user": "Разблокировать участника Bob по причине Sorry Bob.", + "apihelp-undelete-summary": "Восстановление версий удалённой страницы.", + "apihelp-undelete-extended-description": "Список удалённых версий с временными метками может быть получен с помощью [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], а список идентификаторов удалённых файлов может быть получен с помощью [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-param-title": "Заголовок восстанавливаемой страницы.", + "apihelp-undelete-param-reason": "Причина восстановления.", + "apihelp-undelete-param-tags": "Изменить метки записи в журнале удалений.", + "apihelp-undelete-param-timestamps": "Временные метки восстанавливаемых версий. Если и $1timestamps, и $1fileids пустые, все версии будут восстановлены.", + "apihelp-undelete-param-fileids": "Идентификаторы восстанавливаемых файловых версий. Если и $1timestamps, и $1fileids пустые, все версии будут восстановлены.", + "apihelp-undelete-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", "apihelp-undelete-example-page": "Восстановить страницу Main Page.", "apihelp-undelete-example-revisions": "Восстановить две версии страницы Main Page.", - "apihelp-upload-param-filename": "целевое название файла", - "apihelp-upload-param-text": "Первоначальный текст страницы для новых файлов.", + "apihelp-unlinkaccount-summary": "Удаление связанного стороннего аккаунта с текущим участником.", + "apihelp-unlinkaccount-example-simple": "Попытаться удалить связь между текущим участником и FooAuthenticationRequest.", + "apihelp-upload-summary": "Загрузка файла или получение статуса незавершённых загрузок.", + "apihelp-upload-extended-description": "Доступно несколько режимов:\n* Прямо загрузить содержимое файла, используя параметр $1file.\n* Загрузить файл по кусочком, используя параметры $1filesize, $1chunk и $1offset.\n* Заставить сервер MediaWiki запросить файл по ссылке, используя параметр $1url.\n* Завершить старую загрузку, провалившуюся из-за предупреждений, используя параметр $1filekey.\nОбратите внимание, что запрос HTTP POST должен быть выполнен как загрузка файла (то есть, с использованием multipart/form-data) при отправке $1file.", + "apihelp-upload-param-filename": "Целевое название файла.", + "apihelp-upload-param-comment": "Описание загрузки. Также используется как начальный текст страницы при загрузке нового файла, если параметр $1text не задан.", + "apihelp-upload-param-tags": "Изменить метки записи в журнале загрузок и версии файловой страницы.", + "apihelp-upload-param-text": "Начальный текст страницы для новых файлов.", "apihelp-upload-param-watch": "Наблюдать за этой страницей", - "apihelp-upload-param-ignorewarnings": "Игнорируйте любые предупреждения.", + "apihelp-upload-param-watchlist": "Безусловно добавить или удалить страницу из списка наблюдения текущего участника, использовать настройки или не менять наблюдение.", + "apihelp-upload-param-ignorewarnings": "Игнорировать все предупреждения.", "apihelp-upload-param-file": "Содержимое файла.", - "apihelp-upload-param-url": "URL-Адрес для извлечения файла из.", + "apihelp-upload-param-url": "Ссылка на запрашиваемый файл.", + "apihelp-upload-param-filekey": "Ключ, идентифицирующий предыдущую временную загрузку.", + "apihelp-upload-param-sessionkey": "Синоним $1filekey, обслуживаемый для обратной совместимости.", + "apihelp-upload-param-stash": "Если задано, сервер временно поместит файл в тайник вместо загрузки его в хранилище.", + "apihelp-upload-param-filesize": "Полны размер файла.", "apihelp-upload-param-offset": "Смещение блока в байтах.", - "apihelp-upload-param-chunk": "Кусок содержимого.", - "apihelp-upload-example-url": "Загрузить через URL", - "apihelp-userrights-description": "Изменить членство в группе пользователей.", - "apihelp-userrights-param-user": "Имя учётной записи.", - "apihelp-userrights-param-userid": "Идентификатор пользователя.", - "apihelp-userrights-param-add": "Добавить пользователя в эти группы.", - "apihelp-userrights-param-remove": "Удалить пользователя из этих групп.", - "apihelp-userrights-param-reason": "Причина изменений", - "apihelp-userrights-param-tags": "Изменить теги для подачи заявки на запись в журнале прав пользователей.", + "apihelp-upload-param-chunk": "Содержимое кусочка.", + "apihelp-upload-param-async": "Сделать операции над потенциально большими файлами асинхронными, когда это возможно.", + "apihelp-upload-param-checkstatus": "Только запросить статус загрузки для данного файлового ключа.", + "apihelp-upload-example-url": "Загрузка через URL.", + "apihelp-upload-example-filekey": "Завершение загрузки, провалившейся из-за предупреждений.", + "apihelp-userrights-summary": "Изменение групп участника.", + "apihelp-userrights-param-user": "Имя участника.", + "apihelp-userrights-param-userid": "Идентификатор участника.", + "apihelp-userrights-param-add": "Добавить участника в эти группы, или, если они уже являются её членами, обновить дату истечения членства в этих группах.", + "apihelp-userrights-param-expiry": "Временная метка истечения. Может быть относительной (например, 5 months или 2 weeks) или абсолютной (например, 2014-09-18T12:34:56Z). Если задана только одна временная метка, она будет использована для всех групп, переданных в параметре $1add. Используйте infinite, indefinite, infinity или never для неистекаемой группы.", + "apihelp-userrights-param-remove": "Удалить участника из этих групп.", + "apihelp-userrights-param-reason": "Причина изменения.", + "apihelp-userrights-param-tags": "Изменить метки записи в журнале прав.", + "apihelp-userrights-example-user": "Добавить участника FooBot в группу bot и удалить его из групп sysop и bureaucrat.", + "apihelp-userrights-example-userid": "Добавить участника с идентификатором 123 в группу bot и удалить его из групп sysop и bureaucrat.", + "apihelp-userrights-example-expiry": "Добавить участника SometimeSysop в группу sysop на один месяц.", + "apihelp-validatepassword-summary": "Проверка пароля на удовлетворение политики вики.", + "apihelp-validatepassword-extended-description": "Результатом проверки является Good, если пароль приемлемый, Change, если пароль может быть использован для входа, но должен быть сменён, и Invalid, если пароль не может быть использован.", + "apihelp-validatepassword-param-password": "Проверяемый пароль.", + "apihelp-validatepassword-param-user": "Имя участника, при использовании во время создания аккаунта. Такого участника не должно существовать.", + "apihelp-validatepassword-param-email": "Электронная почта, при использовании во время создания аккаунта.", + "apihelp-validatepassword-param-realname": "Настоящее имя, при использовании во время создания аккаунта.", + "apihelp-validatepassword-example-1": "Проверка пароля foobar для текущего участника.", + "apihelp-validatepassword-example-2": "Проверка пароля querty для создаваемого участника Example.", + "apihelp-watch-summary": "Добавление или удаление страниц из списка наблюдения текущего участника.", + "apihelp-watch-param-title": "Название страницы. Используйте $1titles вместо этого.", + "apihelp-watch-param-unwatch": "Если установлено, страницы будут удалены из списка наблюдения, а не добавлены в него.", "apihelp-watch-example-watch": "Следить за страницей Main Page.", "apihelp-watch-example-unwatch": "Не следить за страницей Main Page.", - "apihelp-json-description": "Выходные данные в формате json.", - "apihelp-jsonfm-description": "Выходные данные в JSON формате (pretty-print in HTML).", - "apihelp-none-description": "Нечего выводить", - "apihelp-php-description": "Выходные данные в сериализованном формате PHP.", - "apihelp-phpfm-description": "Выходные данные в сериализованном формате PHP (pretty-print in HTML).", - "apihelp-xml-description": "Выходные данные в формате XML.", + "apihelp-watch-example-generator": "Следить за первым несколькими страницами основного пространства имён.", + "apihelp-format-example-generic": "Вернуть результат запроса в формате $1.", + "apihelp-format-param-wrappedhtml": "Вернуть хорошо читаемый HTML со связанными модулями ResourceLoader в виде объекта JSON.", + "apihelp-json-summary": "Выводить данные в формате JSON.", + "apihelp-json-param-callback": "Если задано, оборачивает вывод в вызов данной функции. Из соображении безопасности, вся пользовательская информация будет удалена.", + "apihelp-json-param-utf8": "Если задано, кодирует большинство (но не все) не-ASCII символов в UTF-8 вместо замены их на шестнадцатеричные коды. Применяется по умолчанию, когда formatversion не равно 1.", + "apihelp-json-param-ascii": "Если задано, заменяет все не-ASCII-символы на шестнадцатеричные коды. Применяется по умолчанию, когда formatversion равно 1.", + "apihelp-json-param-formatversion": "Формат вывода:\n;1: Обратно совместимый формат (логические значения в стиле XML, ключи * для узлов данных, и так далее).\n;2: Экспериментальный современный формат. Детали могут меняться!\n;latest: Использовать последний формат (сейчас 2), может меняться без предупреждения.", + "apihelp-jsonfm-summary": "Выводить данные в формате JSON (отформатированном в HTML).", + "apihelp-none-summary": "Ничего не выводить.", + "apihelp-php-summary": "Выводить данные в сериализованном формате PHP.", + "apihelp-php-param-formatversion": "Формат вывода:\n;1: Обратно совместимый формат (логические значения в стиле XML, ключи * для узлов данных, и так далее).\n;2: Экспериментальный современный формат. Детали могут меняться!\n;latest: Использовать последний формат (сейчас 2), может меняться без предупреждения.", + "apihelp-phpfm-summary": "Выводить данные в сериализованном формате PHP (отформатированном в HTML).", + "apihelp-rawfm-summary": "Выводить данные, включая элементы отладки, в формате JSON (отформатированном в HTML).", + "apihelp-xml-summary": "Выводить данные в формате XML.", + "apihelp-xml-param-xslt": "Если задано, добавляет названную страницу в качестве листа XSL. Значением должно быть название в пространстве имён {{ns:MediaWiki}}, заканчивающееся на .xsl.", + "apihelp-xml-param-includexmlnamespace": "Если задано, добавляет пространство имён XML.", + "apihelp-xmlfm-summary": "Выводить данные в формате XML (отформатированном в HTML).", "api-format-title": "Результат MediaWiki API", + "api-format-prettyprint-header": "Это HTML-представление формата $1. HTML хорош для отладки, но неудобен для практического применения.\n\nУкажите параметр format для изменения формата вывода. Для отображения не-HTML-представления формата $1, присвойте format=$2.\n\nСм. [[mw:Special:MyLanguage/API|полную документацию]] или [[Special:ApiHelp/main|справку API]] для получения дополнительной информации.", + "api-format-prettyprint-header-only-html": "Это HTML-представление для отладки, не рассчитанное на практическое применение.\n\nСм. [[mw:Special:MyLanguage/API|полную документацию]] или [[Special:ApiHelp/main|справку API]] для получения дополнительной информации.", + "api-format-prettyprint-header-hyperlinked": "Это HTML-представление формата $1. HTML хорош для отладки, но неудобен для практического применения.\n\nУкажите параметр format для изменения формата вывода. Для отображения не-HTML-представления формата $1, присвойте [$3 format=$2].\n\nСм. [[mw:API|полную документацию]] или [[Special:ApiHelp/main|справку API]] для получения дополнительной информации.", + "api-format-prettyprint-status": "Этот ответ будет возвращён HTTP статусом $1 $2.", + "api-login-fail-aborted": "Аутентификация требует взаимодействия с пользователем, что не поддерживается action=login. Чтобы авторизовываться через action=login, см. [[Special:BotPasswords]]. Для продолжения использования авторизации основного аккаунта см. [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-aborted-nobotpw": "Аутентификация требует взаимодействия с пользователем, что не поддерживается action=login. Для авторизации см. [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "api-login-fail-badsessionprovider": "Авторизация при использовании $1 невозможна.", + "api-login-fail-sameorigin": "Авторизация при использовании правила ограничения домена невозможна.", "api-pageset-param-titles": "Список заголовков для работы.", - "api-pageset-param-pageids": "Список страниц идентификаторов для работы.", + "api-pageset-param-pageids": "Список идентификаторов страниц для работы.", "api-pageset-param-revids": "Список идентификаторов версий для работы.", + "api-pageset-param-generator": "Получить список страниц для работы, запустив указанный запрос-модуль.\n\nПримечание: названия параметров генераторов должны начинаться с «g», см. примеры.", + "api-pageset-param-redirects-generator": "Автоматически разрешать перенаправления в $1titles, $1pageids и $1revids, а также на страницах, возвращённых $1generator.", + "api-pageset-param-redirects-nogenerator": "Автоматически разрешать перенаправления в $1titles, $1pageids и $1revids.", + "api-pageset-param-converttitles": "Преобразовать заголовки в другой вариант, если это необходимо. Работает только если язык содержимого вики поддерживает преобразование вариантов. Языки, поддерживающие преобразование, включают в себя $1.", "api-help-title": "Справка MediaWiki API", + "api-help-lead": "Это автоматически сгенерированная страница документации MediaWiki API.\n\nДокументация и примеры: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Главный модуль", - "api-help-flag-deprecated": "Этот модуль устарел.", + "api-help-undocumented-module": "Нет документации для модуля $1.", + "api-help-flag-deprecated": "Этот модуль не поддерживается.", + "api-help-flag-internal": "Этот модуль внутренний или нестабильный. Его операции могут измениться без предупреждения.", "api-help-flag-readrights": "Этот модуль требует прав на чтение.", - "api-help-flag-writerights": "Этот модуль требует права на запись.", - "api-help-flag-mustbeposted": "Этот модуль принимает только Post-запросы.", + "api-help-flag-writerights": "Этот модуль требует прав на запись.", + "api-help-flag-mustbeposted": "Этот модуль принимает только POST-запросы.", "api-help-flag-generator": "Этот модуль может быть использован в качестве генератора.", "api-help-source": "Источник: $1", "api-help-source-unknown": "Источник: unknown", "api-help-license": "Лицензия: [[$1|$2]]", - "api-help-license-noname": "Лицензия: [[$1|See link]]", + "api-help-license-noname": "Лицензия: [[$1|см. ссылку]]", "api-help-license-unknown": "Лицензия: unknown", "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:", - "api-help-param-deprecated": "Устаревший.", + "api-help-param-deprecated": "Не поддерживается.", "api-help-param-required": "Это обязательный параметр.", "api-help-datatypes-header": "Типы данных", + "api-help-datatypes": "Ввод в MediaWiki должен быть NFC-нормализованным UTF-8. MediaWiki может попытаться преобразовать другой ввод, но это приведёт к провалу некоторых операций (таких, как [[Special:ApiHelp/edit|редактирование]] со сверкой MD5).\n\nНекоторые типы параметров в запросах API требуют дополнительных пояснений:\n;логический\n:Логические параметры работают как флажки (checkboxes) в HTML: если параметр задан, независимо от его значения, он воспринимается за истину. Для передачи ложного значения просто опустите параметр.\n;временные метки\n:Временные метки могут быть заданы в нескольких форматах. Рекомендуемым является дата и время ISO 8601. Всё время считается в UTC, любые включённые часовые пояса игнорируются.\n:* Дата и время ISO 8601: 2001-01-15T14:56:00Z (знаки препинания и Z необязательны)\n:* Дата и время ISO 8601 с (игнорируемой) дробной частью секунд: 2001-01-15T14:56:00.00001Z (дефисы, двоеточия и Z необязательны)\n:* Формат MediaWiki: 20010115145600\n:* Общий числовой формат: 2001-01-15 14:56:00 (необязательный часовой пояс GMT, +## или -## игнорируется)\n:* Формат EXIF: 2001:01:15 14:56:00\n:* Формат RFC 2822 (часовой пояс может быть опущен): Mon, 15 Jan 2001 14:56:00\n:* Формат RFC 850 (часовой пояс может быть опущен): Monday, 15-Jan-2001 14:56:00\n:* Формат ctime языка программирования C: Mon Jan 15 14:56:00 2001\n:* Количество секунд, прошедших с 1970-01-01T00:00:00Z, в виде челого числа с от 1 до 13 знаками (исключая 0)\n:* Строка now\n;альтернативный разделитель значений\n:Параметры, принимающие несколько значений, обычно отправляются со значениями, разделёнными с помощью символа пайпа, например, param=value1|value2 или param=value1%7Cvalue2. Если значение должно содержать символ пайпа, используйте U+001F (Unit Separator) в качестве разделителя ''и'' добавьте в начало значения U+001F, например, param=%1Fvalue1%1Fvalue2.", "api-help-param-type-limit": "Тип: целое число или max", - "api-help-param-type-integer": "Тип: {{PLURAL:$1|1=integer|2=list of integers}}", - "api-help-param-type-boolean": "Тип: двоичный ([[Special:ApiHelp/main#main/datatypes|details]])", - "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=timestamp|2=list of timestamps}} ([[Special:ApiHelp/main#main/datatypes|allowed formats]])", - "api-help-param-type-user": "Тип: {{PLURAL:$1|1=user name|2=list of user names}}", - "api-help-param-list": "{{PLURAL:$1|1=Одно из следующих значений|2=Значения (разделённые с помощью {{!}} или [[Special:ApiHelp/main#main/datatypes|альтернативного варианта]])}}: $2", - "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Должен быть пустым|может быть пустым, или $2}}", - "api-help-param-limit": "Не более чем $1 разрешено.", - "api-help-param-limit2": "Разрешено не более чем $1 ($2 для ботов).", - "api-help-param-integer-min": "{{PLURAL:$1|1=value|2=values}} должен быть не меньше чем $2.", - "api-help-param-integer-max": "{{PLURAL:$1|1=value|2=values}} должен быть не больше чем $3.", - "api-help-param-integer-minmax": "{{PLURAL:$1|1=value|2=values}} должен быть между $2 и $3.", - "api-help-param-multi-separate": "Разделяйте значения с помощью | или [[Special:ApiHelp/main#main/datatypes|альтернативного варианта]].", - "api-help-param-multi-max": "Максимальное количество значений должно быть {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} для ботов).", + "api-help-param-type-integer": "Тип: {{PLURAL:$1|1=целое число|2=список целых чисел}}", + "api-help-param-type-boolean": "Тип: логический ([[Special:ApiHelp/main#main/datatypes|подробнее]])", + "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=временная метка|2=список временных меток}} ([[Special:ApiHelp/main#main/datatypes|разрешённые форматы]])", + "api-help-param-type-user": "Тип: {{PLURAL:$1|1=имя участника|2=список имён участников}}", + "api-help-param-list": "{{PLURAL:$1|1=Одно из следующих значений|2=Значения (разделённые с помощью {{!}} или [[Special:ApiHelp/main#main/datatypes|альтернативного разделителя]])}}: $2", + "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Должен быть пустым|Может быть пустым или $2}}", + "api-help-param-limit": "Разрешено не более $1.", + "api-help-param-limit2": "Разрешено не более $1 ($2 для ботов).", + "api-help-param-integer-min": "{{PLURAL:$1|1=Значение должно|2=Значения должны}} быть не меньше $2.", + "api-help-param-integer-max": "{{PLURAL:$1|1=Значение должно|2=Значения должны}} быть не больше $3.", + "api-help-param-integer-minmax": "{{PLURAL:$1|1=Значение должно|2=Значения должны}} быть между $2 и $3.", + "api-help-param-upload": "Должно быть отправлено как файл с использованием multipart/form-data.", + "api-help-param-multi-separate": "Разделяйте значения с помощью | или [[Special:ApiHelp/main#main/datatypes|альтернативного разделителя]].", + "api-help-param-multi-max": "Максимально разрешённое количество значений — {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} для ботов).", + "api-help-param-multi-all": "Для указания всех значений, используйте $1.", "api-help-param-default": "По умолчанию: $1", "api-help-param-default-empty": "По умолчанию: (пусто)", - "api-help-param-continue": "Когда доступно больше результатов, использовать этот чтобы продолжить.", + "api-help-param-token": "Токен «$1», полученный из [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", + "api-help-param-token-webui": "Для обратной совместимости, токен, используемый в веб-интерфейсе, также применим.", + "api-help-param-disabled-in-miser-mode": "Отключено из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]].", + "api-help-param-limited-in-miser-mode": "Примечание: Из-за [[mw:Special:MyLanguage/Manual:$wgMiserMode|жадного режима]], использование этого может привести к меньшему, чем $1limit, числу результатов перед продолжением; в крайнем случае, может вернуться и ноль результатов.", + "api-help-param-direction": "В каком порядке перечислять:\n;newer: Начать с самых старых. Обратите внимание: $1start должно быть раньше $1end.\n;older: Начать с самых новых (по умолчанию). Обратите внимание: $1start должно быть позже $1end.", + "api-help-param-continue": "Когда доступно больше результатов, используйте это для продолжения.", "api-help-param-no-description": "(описание отсутствует)", "api-help-examples": "Пример{{PLURAL:$1||ы}}:", "api-help-permissions": "{{PLURAL:$1|Разрешение|Разрешения}}:", - "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2", - "apierror-integeroutofrange-abovemax": "$1 не может быть более $2 (на $3) для пользователей.", - "apierror-nosuchuserid": "Нет пользователя с ID $1.", - "apierror-pagelang-disabled": "Меняется язык страницы не допускается в этой Вики.", - "apierror-protect-invalidaction": "Недопустимый тип защиты \"$1\".", - "apierror-systemblocked": "Вы были заблокированы автоматически Медиавики.", - "apierror-unknownformat": "Неизвестный Формат \"$1\".", - "apierror-urlparamnormal": "Не могли нормализовать параметры изображения для $1.", + "api-help-permissions-granted-to": "{{PLURAL:$1|Гарантируется}}: $2", + "api-help-right-apihighlimits": "Использовать высокие лимиты в запросах API (медленные запросы: $1, быстрые запросы: $2). Лимиты для медленных запросов также применимы к параметрам со множеством значений.", + "api-help-open-in-apisandbox": "[открыть в песочнице]", + "api-help-authmanager-general-usage": "Стандартная процедура использования этого модуля такова:\n# Запрос полей, доступных из [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] с amirequestsfor=$4, и токена $5 из [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Предоставление полей пользователю и получение его данных.\n# Запрос к этому модулю, содержащий $1returnurl или аналогичное поле.\n# Проверка поля status ответа.\n#* Если вы получили PASS или FAIL, вы закончили. Операция либо завершилась успехом, либо нет.\n#* Если вы получили UI, предоставьте новые поля польззователю и получите новые данные. Затем совершите новый запрос с параметром $1continue и новыми полями, после чего повторите пункт 4.\n#* Если вы получили REDIRECT, отправьте пользователя на redirecttarget и подождите возвращения на $1returnurl. Затем совершите запрос к этому модулю с параметром $1continue и всеми полями, содержащимися в возвращённой ссылке, и повторите пункт 4.\n#* Если вы получили RESTART, это означает, что аутентификация работает, но мы не привязали пользовательский аккаунт. Вы можете рассматривать это как UI или FAIL.", + "api-help-authmanagerhelper-requests": "Использовать только эти аутентификационные запросы, с id, возвращённом из [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] с amirequestsfor=$1, или из предыдущего ответа этого модуля.", + "api-help-authmanagerhelper-request": "Использовать этот аутентификационный запрос, с id, возвращённом из [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] с amirequestsfor=$1.", + "api-help-authmanagerhelper-messageformat": "Формат, используемый для возвращаемых сообщений.", + "api-help-authmanagerhelper-mergerequestfields": "Слить поля информации со всех аутентификационных запросов в один массив.", + "api-help-authmanagerhelper-preservestate": "Сохранить состояние с предыдущей провалившейся попытки авторизации, если возможно.", + "api-help-authmanagerhelper-returnurl": "Вернуть ссылку для стороннего процесса аутентификации, должна быть абсолютной. Либо этот параметр, либо $1continue, обязателен.\n\nПосле получения ответа REDIRECT, вы, как правило, должны открыть в браузере или вэб-просмотрщике указанную в redirecttarget ссылку для продолжения стороннего процесса аутентификации. По завершению, сторонний сервис отошлёт браузеру или веб-просмотрщику эту ссылку. Вы должны извлечь все параметры из ссылки и отослать их в параметр $1continue запроса к этому модулю.", + "api-help-authmanagerhelper-continue": "Этот запрос — продолжение после предшествующего ответа UI или REDIRECT. Либо этот параметр, либо $1returnurl, обязателен.", + "api-help-authmanagerhelper-additional-params": "Этот модуль принимает дополнительные параметры в зависимости от доступных аутентификационных запросов. Используйте [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] с amirequestsfor=$1 (или предыдущий ответ этого модуля, если доступен) для определения, какие запросы доступны и какие поля они используют.", + "apierror-allimages-redirect": "Используйте gaifilterredir=nonredirects вместо redirects при использовании allimages в качестве генератора.", + "apierror-allpages-generator-redirects": "Используйте gaifilterredir=nonredirects вместо redirects при использовании allpages в качестве генератора.", + "apierror-appendnotsupported": "Невозможно дописать страницы, использующие модель содержимого $1.", + "apierror-articleexists": "Статья, которую вы пытаетесь создать, уже создана.", + "apierror-assertbotfailed": "Проверка того, что у участника есть право bot, провалилась.", + "apierror-assertnameduserfailed": "Проверка того, что участник — «$1», провалилась.", + "apierror-assertuserfailed": "Проверка того, что участник авторизован, провалилась.", + "apierror-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.", + "apierror-badconfig-resulttoosmall": "Значение $wgAPIMaxResultSize этой вики слишком мало, чтобы вместить базовую информацию о результате.", + "apierror-badcontinue": "Некорректный параметр continue. Вы должны передать значение, возвращённое предыдущим запросом.", + "apierror-baddiff": "Сравнение версий не может быть проведено. Одна или обе версии не существуют или у вас не достаточно прав чтобы просматривать их.", + "apierror-baddiffto": "$1diffto должно быть неотрицательным числом, prev, next или cur.", + "apierror-badformat-generic": "Запрашиваемый формат $1 не поддерживается моделью содержимого $2.", + "apierror-badformat": "Запрашиваемый формат $1 не поддерживается моделью содержимого $2, используемой $3.", + "apierror-badgenerator-notgenerator": "Модуль $1 не может быть использован в качестве генератора.", + "apierror-badgenerator-unknown": "Неизвестный generator=$1.", + "apierror-badip": "Параметр IP некорректен.", + "apierror-badmd5": "Предоставленный хэш MD5 был некорректным.", + "apierror-badmodule-badsubmodule": "У модуля $1 нет подмодуля «$2».", + "apierror-badmodule-nosubmodules": "У модуля $1 нет подмодулей.", + "apierror-badparameter": "Некорректное значение параметра $1.", + "apierror-badquery": "Некорректный запрос.", + "apierror-badtimestamp": "Некорректное значение «$2» параметра временной метки $1.", + "apierror-badtoken": "Некорректный токен CSRF.", + "apierror-badupload": "Параметр загрузки файла $1 не является загрузкой файла; убедитесь, что вы используете multipart/form-data в вашем POST запросе и включаете название файла в заголовок Content-Disposition.", + "apierror-badurl": "Некорректное значения «$2» параметра ссылки $1.", + "apierror-baduser": "Некорректное значение «$2» параметра участника $1.", + "apierror-badvalue-notmultivalue": "Разделение значений с помощью U+001F может быть использовано только в параметрах, принимающих несколько значений.", + "apierror-bad-watchlist-token": "Предоставлен некорректный токен списка наблюдения. Пожалуйста, установите корректный токен в [[Special:Preferences]].", + "apierror-blockedfrommail": "Отправка электронной почты была для вас заблокирована.", + "apierror-blocked": "Редактирование было для вас заблокировано.", + "apierror-botsnotsupported": "Этот интерфейс не поддерживается для ботов.", + "apierror-cannot-async-upload-file": "Параметры async и file не могут применяться вместе. Если вы хотите ассинхронно обработать загруженный файл, сначала загрузите его в тайник (используя параметр stash), а затем опубликуйте этот файл ассинхронно (используя параметры filekey и async).", + "apierror-cannotreauthenticate": "Это действие недоступно, так как ваша личность не может быть подтверждена.", + "apierror-cannotviewtitle": "У вас нет прав на просмотр $1.", + "apierror-cantblock-email": "У вас нет прав блокировать участникам отправку электронной почты через интерфейс вики.", + "apierror-cantblock": "У вас нет прав блокировать участников.", + "apierror-cantchangecontentmodel": "У вас нет прав изменять модель содержимого страницы.", + "apierror-canthide": "У вас нет прав скрывать имена участников из журнала блокировок.", + "apierror-cantimport-upload": "У вас нет прав импортировать загруженные страницы.", + "apierror-cantimport": "У вас нет прав импортировать страницы.", + "apierror-cantoverwrite-sharedfile": "Целевой файл существует в общем репозитории и у вас нет прав перезаписать его.", + "apierror-cantsend": "Вы не авторизованы, ваш электронный адрес не подтверждён или у вас нет прав на отправку электронной почты другим участникам, поэтому вы не можете отправить электронное письмо.", + "apierror-cantundelete": "Невозможно восстановить: возможно, запрашиваемые версии не существуют или уже были восстановлены.", + "apierror-changeauth-norequest": "Попытка создать запрос правки провалилась.", + "apierror-chunk-too-small": "Минимальный размер кусочка — $1 {{PLURAL:$1|байт|байта|байт}}, если кусочек не является последним.", + "apierror-cidrtoobroad": "Диапазоны $1 CIDR, шире /$2, не разрешены.", + "apierror-compare-no-title": "Невозможно выполнить преобразование перед записью правки без заголовка. Попробуйте задать fromtitle или totitle.", + "apierror-compare-relative-to-nothing": "Нет версии 'from', к которой относится torelative.", + "apierror-contentserializationexception": "Сериализация содержимого провалилась: $1", + "apierror-contenttoobig": "Предоставленное вами содержимое превышает максимальный размер страницы в $1 {{PLURAL:$1|килобайт|килобайта|килобайтов}}.", + "apierror-copyuploadbaddomain": "Загрузка по ссылке недоступна с этого домена.", + "apierror-copyuploadbadurl": "Загрузка по этой ссылке недоступна.", + "apierror-create-titleexists": "Существующие названия не могут быть защищены с помощью create.", + "apierror-csp-report": "Ошибка при обработке отчёта CSP: $1.", + "apierror-databaseerror": "[$1] Ошибка запроса к базе данных.", + "apierror-deletedrevs-param-not-1-2": "Параметр $1 не может быть использован в режимах 1 и 2.", + "apierror-deletedrevs-param-not-3": "Параметр $1 не может быть использован в третьем режиме.", + "apierror-emptynewsection": "Создание пустых секций невозможно.", + "apierror-emptypage": "Создание новых пустых страниц не разрешено.", + "apierror-exceptioncaught": "[$1] Поймано исключение: $2", + "apierror-filedoesnotexist": "Файл не существует.", + "apierror-fileexists-sharedrepo-perm": "Целевой файл существует в общем репозитории. Используйте параметр ignorewarnings, чтобы перезаписать его.", + "apierror-filenopath": "Невозможно получить локальный путь к файлу.", + "apierror-filetypecannotberotated": "Этот тип файлов не может быть повёрнут.", + "apierror-formatphp": "Этот ответ не может быть представлен с использованием format=php. См. https://phabricator.wikimedia.org/T68776.", + "apierror-imageusage-badtitle": "Название для модуля $1 должно быть файлом.", + "apierror-import-unknownerror": "Неизвестная ошибка при импорте: $1.", + "apierror-integeroutofrange-abovebotmax": "$1 не может быть больше $2 (присвоено $3) для ботов и администраторов.", + "apierror-integeroutofrange-abovemax": "$1 не может быть больше $2 (присвоено $3) для участников.", + "apierror-integeroutofrange-belowminimum": "$1 не может быть меньше $2 (присвоено $3).", + "apierror-invalidcategory": "Введённое вами название категории некорректно.", + "apierror-invalid-chunk": "Сумма смещения и размера текущего кусочка превышает заявленный размер файла.", + "apierror-invalidexpiry": "Некорректное время истечения «$1».", + "apierror-invalid-file-key": "Некорректный ключ файла.", + "apierror-invalidlang": "Некорректный код языка для параметра $1.", + "apierror-invalidoldimage": "Параметр oldimage имеет недопустимый формат.", + "apierror-invalidparammix-cannotusewith": "Параметр $1 не может быть использован одновременно с $2.", + "apierror-invalidparammix-mustusewith": "Параметр $1 может быть использован только одновременно с $2.", + "apierror-invalidparammix-parse-new-section": "section=new не может быть совмещено с параметрами oldid, pageid или page. Пожалуйста, используйте title и text.", + "apierror-invalidparammix": "{{PLURAL:$2|Параметры}} $1 не могут быть использованы одновременно.", + "apierror-invalidsection": "Параметр section должен быть корректным идентификатором секции или new.", + "apierror-invalidsha1base36hash": "Предоставленный хэш SHA1Base36 некорректен.", + "apierror-invalidsha1hash": "Предоставленный хэш SHA1 некорректен.", + "apierror-invalidtitle": "Плохой заголовок «$1».", + "apierror-invalidurlparam": "Некорректное значение $1urlparam ($2=$3).", + "apierror-invaliduser": "Некорректное имя участника «$1».", + "apierror-invaliduserid": "Некорректный идентификатор участника $1.", + "apierror-maxlag-generic": "Ожидание сервера базы данных: $1 {{PLURAL:$1|секунда|секунды|секунд}} задержки.", + "apierror-maxlag": "Ожидание $2: $1 {{PLURAL:$1|секунда|секунды|секунд}} задержки.", + "apierror-mimesearchdisabled": "Поиск по MIME отключен в жадном режиме.", + "apierror-missingcontent-pageid": "Отсутствует содержимое страницы с идентификатором $1.", + "apierror-missingcontent-revid": "Отсутствует содержимое версии с идентификатором $1.", + "apierror-missingparam-at-least-one-of": "{{PLURAL:$2|Параметр|Как минимум один из параметров}} $1 обязателен.", + "apierror-missingparam-one-of": "{{PLURAL:$2|Параметр|Один из параметров}} $1 обязателен.", + "apierror-missingparam": "Параметр $1 должен быть задан.", + "apierror-missingrev-pageid": "Нет текущей версии страницы с идентификатором $1.", + "apierror-missingrev-title": "Нет текущей версии для заголовка $1.", + "apierror-missingtitle-createonly": "Несуществующие названия страниц могут быть защищены только с помощью create.", + "apierror-missingtitle": "Указанная вами страница не существует.", + "apierror-missingtitle-byname": "Страница $1 не существует.", + "apierror-moduledisabled": "Модуль $1 был отключён.", + "apierror-multival-only-one-of": "Параметру $1 может быть присвоено только {{PLURAL:$3|значение|одно из значений}} $2.", + "apierror-multival-only-one": "Параметру $1 может быть присвоено только одно значение.", + "apierror-multpages": "Параметр $1 может быть применён только к одной странице.", + "apierror-mustbeloggedin-changeauth": "Вы должны быть авторизованы для смены аутентификационных данных.", + "apierror-mustbeloggedin-generic": "Вы должны быть авторизованы.", + "apierror-mustbeloggedin-linkaccounts": "Вы должны быть авторизованы для привязывания аккаунтов.", + "apierror-mustbeloggedin-removeauth": "Вы должны быть авторизованы для удаления аутентификационных данных.", + "apierror-mustbeloggedin-uploadstash": "Тайник загрузки (upload stash) доступен только для авторизованных участников.", + "apierror-mustbeloggedin": "Вы должны быть авторизованы в $1.", + "apierror-mustbeposted": "Модуль $1 требует запроса POST.", + "apierror-mustpostparams": "{{PLURAL:$2|Следующий параметр был найден|Следующие параметры были найдены}} в строке запроса, но {{PLURAL:$2|должен|должны}} находиться в теле POST: $1.", + "apierror-noapiwrite": "Редактирование этой вики посредством API отключено. Убедитесь, что инструкция $wgEnableWriteAPI=true; включена в файл LocalSettings.php вики.", + "apierror-nochanges": "Никаких правок запрошено не было.", + "apierror-nodeleteablefile": "Нет такой старой версии файла.", + "apierror-no-direct-editing": "Прямое редактирование посредством API не поддерживается моделью содержимого $1, используемой $2.", + "apierror-noedit-anon": "Анонимные участники не могут редактировать страницы.", + "apierror-noedit": "У вас нет прав на редактирование страниц.", + "apierror-noimageredirect-anon": "Анонимные участники не могут создавать перенаправления на изображения.", + "apierror-noimageredirect": "У вас нет прав на создание перенаправлений на изображения.", + "apierror-nosuchlogid": "Нет записей журналов с идентификатором $1.", + "apierror-nosuchpageid": "Нет страницы с идентификатором $1.", + "apierror-nosuchrcid": "Нет недавней правки с идентификатором $1.", + "apierror-nosuchrevid": "Нет версии с идентификатором $1.", + "apierror-nosuchsection": "Нет секции $1.", + "apierror-nosuchsection-what": "Нет секции $1 в $2.", + "apierror-nosuchuserid": "Нет участника с идентификатором $1.", + "apierror-notarget": "Вы не указали корректной цели этого действия.", + "apierror-notpatrollable": "Версия r$1 не может быть отпатрулирована, так как она слишком стара.", + "apierror-nouploadmodule": "Модуль загрузки не задан.", + "apierror-offline": "Невозможно продолжить из-за проблем с сетевым подключением. Убедитесь, что у вас есть подключение к Интернету и повторите попытку.", + "apierror-opensearch-json-warnings": "Предупреждения не могут быть представлены в формате OpenSearch JSON.", + "apierror-pagecannotexist": "Данное пространство имён не может содержать эти страницы.", + "apierror-pagedeleted": "Страница была удалена с тех пор, как вы запросили её временную метку.", + "apierror-pagelang-disabled": "Смена языка страницы не разрешена в этой вики.", + "apierror-paramempty": "Параметр $1 не может быть пустым.", + "apierror-parsetree-notwikitext": "prop=parsetree разрешён только для вики-текстового содержимого.", + "apierror-parsetree-notwikitext-title": "prop=parsetree разрешён только для вики-текстового содержимого. $1 использует модель содержимого $2.", + "apierror-pastexpiry": "Время окончания «$1» находится в прошлом.", + "apierror-permissiondenied": "У вас нет прав на $1.", + "apierror-permissiondenied-generic": "Доступ запрещён.", + "apierror-permissiondenied-patrolflag": "Вам нужно право patrol или patrolmarks для запроса статуса патрулирования.", + "apierror-permissiondenied-unblock": "У вас нет прав снимать блокировку с участников.", + "apierror-prefixsearchdisabled": "Поиск по префиксу отключен в жадном режиме.", + "apierror-promised-nonwrite-api": "Заголовок HTTP Promise-Non-Write-API-Action не может быть передан в записывающие модули API.", + "apierror-protect-invalidaction": "Недопустимый тип защиты «$1».", + "apierror-protect-invalidlevel": "Недопустимый уровень защиты «$1».", + "apierror-ratelimited": "Вы превысили ваше ограничение скорости. Пожалуйста, подождите некоторое время и попробуйте снова.", + "apierror-readapidenied": "Вам нужны права на чтение для использования этого модуля.", + "apierror-readonly": "Эта вики находится в режиме «только для чтения».", + "apierror-reauthenticate": "Вы ещё не авторизовывались в этой сессии, пожалуйста, переавторизуйтесь.", + "apierror-redirect-appendonly": "Вы попытались отредактировать страницу в режиме следования по перенаправлениям, который должен быть использован в связке с section=new, prependtext или appendtext.", + "apierror-revdel-mutuallyexclusive": "Одно и то же поле не может быть использовано и в hide, и в show.", + "apierror-revdel-needtarget": "Для этого типа RevDel требуется указание целевого названия страницы.", + "apierror-revdel-paramneeded": "Как минимум одно значение требуется в hide и/или show.", + "apierror-revisions-badid": "Не было найдено версий по параметру $1.", + "apierror-revisions-norevids": "Параметр revids не может быть использован с настройками списка ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start и $1end).", + "apierror-revisions-singlepage": "Параметры titles и pageids и генераторы используются для обработки множества страниц, но параметры $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start и $1end могут быть применены только к одной странице.", + "apierror-revwrongpage": "r$1 не является версией $2.", + "apierror-searchdisabled": "Поисковый параметр $1 отключён.", + "apierror-sectionreplacefailed": "Невозможно слить обновлённую секцию.", + "apierror-sectionsnotsupported": "Разбиение на секции не поддерживается моделью содержимого $1.", + "apierror-sectionsnotsupported-what": "Разбиение на секции не поддерживается $1.", + "apierror-show": "Некорректный параметр — вручную исключённые значения не могут быть обработаны.", + "apierror-siteinfo-includealldenied": "Невозможно отобразить информацию о всех серверах, если $wgShowHostNames не истинно.", + "apierror-sizediffdisabled": "Подсчёт разницы размеров отключён в жадном режиме.", + "apierror-spamdetected": "Ваша правка была отклонена, так как содержит спам: $1.", + "apierror-specialpage-cantexecute": "У вас нет прав, чтобы просматривать результаты этой служебной страницы.", + "apierror-stashedfilenotfound": "Невозможно найти файл в тайнике: $1.", + "apierror-stashedit-missingtext": "Не найдено содержимого тайника для данного хэша.", + "apierror-stashfailed-complete": "Загрузка по кусочкам уже завершена, проверьте статус для получения подробной информации.", + "apierror-stashfailed-nosession": "Не найдено сессии загрузки по кусочкам с заданным ключом.", + "apierror-stashfilestorage": "Невозможно сохранить загрузку в тайник: $1", + "apierror-stashinvalidfile": "Некорректный файл в тайнике.", + "apierror-stashnosuchfilekey": "Нет такого ключа файла: $1.", + "apierror-stashpathinvalid": "Ключ файла относится к некорректному формату или сам некорректен: $1.", + "apierror-stashwrongowner": "Некорректный владелец: $1", + "apierror-stashzerolength": "Файл имеет нулевую длину и не может быть сохранён в тайник: $1", + "apierror-systemblocked": "Вы были заблокированы автоматически MediaWiki.", + "apierror-templateexpansion-notwikitext": "Раскрытие шаблонов разрешено только для вики-текстового содержимого. $1 использует модель содержимого $2.", + "apierror-timeout": "Сервер не ответил за ожидаемое время.", + "apierror-toofewexpiries": "Задано $1 {{PLURAL:$1|временная метка|временные метки|временных меток}} истечения, необходимо $2.", + "apierror-unknownaction": "Заданное действие, $1, не распознано.", + "apierror-unknownerror-editpage": "Неизвестная ошибка EditPage: $1.", + "apierror-unknownerror-nocode": "Неизвестная ошибка.", + "apierror-unknownerror": "Неизвестная ошибка: «$1».", + "apierror-unknownformat": "Нераспознанный формат «$1».", + "apierror-unrecognizedparams": "{{PLURAL:$2|Нераспознанный параметр|Нераспознанные параметры}}: $1", + "apierror-unrecognizedvalue": "Нераспознанное значение параметра $1: $2.", + "apierror-unsupportedrepo": "Локальное хранилище файлов не поддерживает запрос всех изображений.", + "apierror-upload-filekeyneeded": "Необходимо задать filekey, если offset не ноль.", + "apierror-upload-filekeynotallowed": "Невозможно обработать filekey, если offset равен 0.", + "apierror-upload-inprogress": "Процесс загрузки из тайника уже запущен.", + "apierror-upload-missingresult": "Нет результатов данных статуса.", + "apierror-urlparamnormal": "Невозможно нормализовать параметры изображения для $1.", + "apierror-writeapidenied": "У вас нет прав на редактирование этой вики через API.", + "apiwarn-alldeletedrevisions-performance": "Для повышения производительности, при генерировании заголовков установите $1dir=newer.", + "apiwarn-badurlparam": "Невозможно распарсить $2 из $1urlparam. Используется только ширина и высота.", + "apiwarn-badutf8": "Значение, переданное $1, содержит некорректные или ненормализованные данные. Текстовые данные должны быть корректным NFC-нормализованным Юникодом без символов управления C0, кроме HT (\\t), LF (\\n) и CR (\\r).", + "apiwarn-checktoken-percentencoding": "Проверьте, что символы вроде «+» в токене корректно закодированы %-последовательностями в ссылке.", + "apiwarn-compare-nocontentmodel": "Модель содержимого не может быть определена, предполагается $1.", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs не поддерживается. Пожалуйста, вместо него используйте prop=deletedrevisions или list=alldeletedrevisions.", + "apiwarn-deprecation-expandtemplates-prop": "Поскольку никакие значения не были указаны в параметре prop, был использован наследованный формат. Этот формат является устаревшим, и в будущем параметру prop будет присвоено значение по умолчанию, что приведёт к повсеместному использованию нового формата.", + "apiwarn-deprecation-httpsexpected": "Использован HTTP, где ожидался HTTPS.", + "apiwarn-deprecation-login-botpw": "Вход в основной аккаунт через action=login не поддерживается и может быть отключен без предупреждения. Для продолжения авторизации с action=login, см.\n[[Special:BotPasswords]]. Для безопасного продолжения использования входа в основной аккаунт, см. action=clientlogin.", + "apiwarn-deprecation-login-nobotpw": "Вход в основной аккаунт через action=login не поддерживается и может быть отключен без предупреждения. Для безопасной авторизации, см. action=clientlogin.", + "apiwarn-deprecation-login-token": "Запрос токена через action=login не поддерживается. Вместо этого, см. action=query&meta=tokens&type=login.", + "apiwarn-deprecation-parameter": "Параметр $1 не поддерживается.", + "apiwarn-deprecation-parse-headitems": "prop=headitems не поддерживается с MediaWiki 1.28. Используйте prop=headhtml при создании новых HTML документов, или prop=modules|jsconfigvars при обновлении документов на стороне клиента.", + "apiwarn-deprecation-purge-get": "Использование action=purge посредством GET не поддерживается. Используйте POST.", + "apiwarn-deprecation-withreplacement": "$1 не поддерживается. Пожалуйста, используйте $2.", + "apiwarn-difftohidden": "Невозможно сравнить с r$1: содержимое скрыто.", + "apiwarn-errorprinterfailed": "Сборщик ошибок упал. Будет совершена повторная попытка без параметров.", + "apiwarn-errorprinterfailed-ex": "Сборщик ошибок упал (будет совершена повторная попытка без параметров): $1", + "apiwarn-invalidcategory": "«$1» не является категорией.", + "apiwarn-invalidtitle": "«$1» не является некорректным заголовком.", + "apiwarn-invalidxmlstylesheetext": "Таблицы стилей должны иметь расширение .xsl.", + "apiwarn-invalidxmlstylesheet": "Задана некорректная или несуществующая таблица стилей.", + "apiwarn-invalidxmlstylesheetns": "Таблица стилей должна находиться в пространстве имён {{ns:MediaWiki}}.", + "apiwarn-moduleswithoutvars": "Было задано свойство kbd>modules, но не были —jsconfigvars или encodedjsconfigvars. Конфигурационные переменные обязательны для корректного использования модуля.", + "apiwarn-notfile": "«$1» не является файлом.", + "apiwarn-nothumb-noimagehandler": "Невозможно создать эскиз, поскольку у $1 нет связанного обработчика изображений.", + "apiwarn-parse-nocontentmodel": "Параметры title или contentmodel не заданы, предполагается $1.", + "apiwarn-parse-titlewithouttext": "title использован без text, при этом запрошены распарсенные свойства страницы. Возможно, вы хотели использовать page вместо title?", + "apiwarn-redirectsandrevids": "Раскрытие перенаправлений не может быть использовано вместе с параметром revids. Все перенаправления на точку revids не должны быть раскрыты.", + "apiwarn-tokennotallowed": "Действие «$1» не разрешено для текущего участника.", + "apiwarn-tokens-origin": "Токены не могут быть получены, пока не применено правило ограничения домена.", + "apiwarn-toomanyvalues": "Слишком много значений передано параметру $1. Максимальное число — $2.", + "apiwarn-truncatedresult": "Результат был усечён, поскольку в противном случае он был бы больше лимита в $1 {{PLURAL:$1|байт|байта|байт}}.", + "apiwarn-unclearnowtimestamp": "Передача «$2» в качестве параметра временной метки $1 не поддерживается. Если по какой-то причине вы хотите прямо указать текущее время без вычисления его на стороне клиента, используйте now.", + "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Нераспознанное значение|Нераспознанные значения}} параметра $1: $2.", + "apiwarn-unsupportedarray": "Параметр $1 использует неподдерживаемый синтаксис массивов PHP.", + "apiwarn-urlparamwidth": "Значение ширины ($2), переданное в $1urlparam, было проигнорировано в пользу значения ($3), полученного из параметров $1urlwidth/$1urlheight.", + "apiwarn-validationfailed-badchars": "некорректные символы в ключе (разрешены только a-z, A-Z, 0-9, _ и -).", + "apiwarn-validationfailed-badpref": "некорректная настройка.", + "apiwarn-validationfailed-cannotset": "не может быть задано этим модулем.", + "apiwarn-validationfailed-keytoolong": "ключ слишком длинен (разрешено не более $1 {{PLURAL:$1|байт|байта|байт}}).", + "apiwarn-validationfailed": "Ошибка проверки для $1: $2", + "apiwarn-wgDebugAPI": "Предупреждение безопасности: активирован $wgDebugAPI.", "api-feed-error-title": "Ошибка ($1)", - "api-credits-header": "Создатели" + "api-usage-docref": "См. $1 для использования API.", + "api-usage-mailinglist-ref": "Подпишитесь на электронную рассылку MediaWiki API на <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce>, чтобы получать информацию о неподдерживаемых функциях и ломающих изменениях.", + "api-exception-trace": "$1 в $2($3)\n$4", + "api-credits-header": "Создатели", + "api-credits": "Разработчики API:\n* Yuri Astrakhan (создатель, ведущий разработчик с сентября 2006 по сентябрь 2007)\n* Roan Kattouw (ведущий разработчик 2007—2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (ведущий разработчик с 2013)\n\nПожалуйста, присылайте ваши комментарии, предложения и вопросы на адрес mediawiki-api@lists.wikimedia.org\nили присылайте отчёты об ошибках на https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/sd.json b/includes/api/i18n/sd.json index fdf003d356..589fb64927 100644 --- a/includes/api/i18n/sd.json +++ b/includes/api/i18n/sd.json @@ -5,7 +5,7 @@ "Aursani" ] }, - "apihelp-query+allrevisions-description": "سمورن ڀيرن جي فهرست پيش ڪريو.", + "apihelp-query+allrevisions-summary": "سمورن ڀيرن جي فهرست پيش ڪريو.", "apihelp-query+watchlist-param-type": "ڪهڙن قسمن جون تبديليون ڏيکارجن:", "apihelp-query+watchlist-paramvalue-type-edit": "قاعديوار صفحاتي ترميمون.", "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.", diff --git a/includes/api/i18n/si.json b/includes/api/i18n/si.json index ab5469898c..a73785acac 100644 --- a/includes/api/i18n/si.json +++ b/includes/api/i18n/si.json @@ -10,7 +10,7 @@ "apihelp-main-param-requestid": "මෙහි ඇති සියලුම වටිනාකම් ප්‍රතිචාරයන්හි අන්තර්ගතකොට ඇත. ඇතැම් විට පැහැදිලිව වටහාගත් ඉල්ලීම් සදහා භාවිතා වේ.", "apihelp-main-param-servedby": "ප්‍රතිපලයන්හි ඉල්ලීම් ඉටුකළ ධාරකනාමය ඇතුලත් කරන්න.", "apihelp-main-param-curtimestamp": "ප්‍රථිපලයන්හි කාල මුද්‍රාව ඇතුලත් කරන්න.", - "apihelp-help-description": "නිරූපිත ඒකක සදහා උදවු පෙන්වන්න.", + "apihelp-help-summary": "නිරූපිත ඒකක සදහා උදවු පෙන්වන්න.", "apihelp-help-param-submodules": "නම් කරන ලද ඒකකයේ, අනුඒකක සදහා උදවු ඇතුලත් කරන්න.", "apihelp-help-param-helpformat": "උදවු ප්‍රතිදානයේ ආකෘතිය.", "apihelp-help-param-wrap": "ප්‍රතිදානය නියමිත API අනුකූලතා ආකෘතියකට හරවන්න.", @@ -23,14 +23,14 @@ "apihelp-userrights-param-user": "පරිශීලක නාමය.", "apihelp-userrights-param-userid": "පරිශීලක අනන්‍යාංකය.", "apihelp-format-example-generic": "$1 ආකෘතියේ ඇති සැක සහිත ප්‍රථිපල පරිවර්තනය කරන්න", - "apihelp-json-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී.", - "apihelp-jsonfm-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", - "apihelp-none-description": "ප්‍රතිදානයේ කිසිවක් නොමැත.", - "apihelp-php-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී.", - "apihelp-phpfm-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", - "apihelp-xml-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී.", + "apihelp-json-summary": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී.", + "apihelp-jsonfm-summary": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", + "apihelp-none-summary": "ප්‍රතිදානයේ කිසිවක් නොමැත.", + "apihelp-php-summary": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී.", + "apihelp-phpfm-summary": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", + "apihelp-xml-summary": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී.", "apihelp-xml-param-includexmlnamespace": "නිරූපණය කළා නම්, XML නාමාවකාශයක් එකතු කරන්න.", - "apihelp-xmlfm-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", + "apihelp-xmlfm-summary": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).", "api-format-title": "මාධ්‍යවිකි API ප්‍රථිපල", "api-help-title": "මාධ්‍යවිකි API උදවු", "api-help-lead": "මෙය ස්වයං-ජනිත මාධ්‍යවිකි API \tප්‍රලේඛන පිටුවකි.\n\nප්‍රලේඛනය සහ උදාහරණ:\nhttps://www.mediawiki.org/wiki/API", diff --git a/includes/api/i18n/sq.json b/includes/api/i18n/sq.json index a02fd8affc..a685096f47 100644 --- a/includes/api/i18n/sq.json +++ b/includes/api/i18n/sq.json @@ -9,7 +9,7 @@ "apihelp-move-param-reason": "Arsyeja për riemërtim.", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Kthehet në faqen e statistikave.", "apihelp-tag-param-reason": "Arsyeja për ndërrimin.", - "apihelp-unblock-description": "Zhblloko një përdorues.", + "apihelp-unblock-summary": "Zhblloko një përdorues.", "apihelp-upload-param-file": "Përmbajtja e skedave.", - "apihelp-userrights-description": "Ndërro anëtarësinë e grupit të një përdoruesit." + "apihelp-userrights-summary": "Ndërro anëtarësinë e grupit të një përdoruesit." } diff --git a/includes/api/i18n/sr-ec.json b/includes/api/i18n/sr-ec.json index d7c3d06a18..6eba3155fc 100644 --- a/includes/api/i18n/sr-ec.json +++ b/includes/api/i18n/sr-ec.json @@ -6,23 +6,23 @@ "Сербијана" ] }, - "apihelp-block-description": "Блокирај корисника.", + "apihelp-block-summary": "Блокирај корисника.", "apihelp-block-param-reason": "Разлог за блокирање.", "apihelp-createaccount-param-name": "Корисничко име.", - "apihelp-delete-description": "Обриши страницу.", + "apihelp-delete-summary": "Обриши страницу.", "apihelp-edit-param-text": "Страница са садржајем.", "apihelp-edit-param-minor": "Мања измена.", "apihelp-edit-example-edit": "Уређивање странице.", - "apihelp-emailuser-description": "Слање имејла кориснику.", + "apihelp-emailuser-summary": "Слање имејла кориснику.", "apihelp-emailuser-param-target": "Корисник је послао имејл.", "apihelp-feedcontributions-param-year": "Од године (и раније).", "apihelp-feedrecentchanges-param-hidepatrolled": "Сакриј патролиране измене.", - "apihelp-filerevert-description": "Вратити датотеку у ранију верзију.", + "apihelp-filerevert-summary": "Вратити датотеку у ранију верзију.", "apihelp-help-example-recursive": "Сва помоћ у једној страници.", "apihelp-login-param-name": "Корисничко име.", "apihelp-login-param-password": "Лозинка.", "apihelp-login-example-login": "Пријавa.", - "apihelp-move-description": "Премештање странице.", + "apihelp-move-summary": "Премештање странице.", "apihelp-query+allrevisions-param-namespace": "Само списак страница у овом именском простору.", "apihelp-stashedit-param-text": "Страница са садржајем." } diff --git a/includes/api/i18n/sr-el.json b/includes/api/i18n/sr-el.json index f6d1b62139..151542638d 100644 --- a/includes/api/i18n/sr-el.json +++ b/includes/api/i18n/sr-el.json @@ -4,9 +4,9 @@ "Milicevic01" ] }, - "apihelp-block-description": "Blokiraj korisnika.", + "apihelp-block-summary": "Blokiraj korisnika.", "apihelp-block-param-reason": "Razlog za blokiranje.", - "apihelp-delete-description": "Obriši stranicu.", + "apihelp-delete-summary": "Obriši stranicu.", "apihelp-edit-param-minor": "Manja izmena.", "apihelp-feedrecentchanges-param-hidepatrolled": "Sakrij patrolirane izmene." } diff --git a/includes/api/i18n/sv.json b/includes/api/i18n/sv.json index 13964584d2..086a726a0e 100644 --- a/includes/api/i18n/sv.json +++ b/includes/api/i18n/sv.json @@ -18,7 +18,7 @@ "Magol" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-postlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aviseringar]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R|Buggar & förslag]\n
    \nStatus: Alla funktioner som visas på denna sida borde fungera. API:et är dock fortfarande under aktiv utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/mediawiki-api-announce e-postlistan] för att få aviseringar om uppdateringar.\n\nFelaktiga förfrågningar: När felaktiga förfrågningar skickas till API:et skickas en HTTP-header med nyckeln \"MediaWiki-API-Error\" och sedan sätts både värdet på headern och den felkoden som returneras till samma värde. För mer information läs [[mw:API:Errors_and_warnings|API: Fel och varningar]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Dokumentation]]\n* [[mw:Special:MyLanguage/API:FAQ|Vanliga frågor]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Sändlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-nyheter]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Buggar och begäran]\n
    \nStatus: Alla funktioner som visas på denna sida bör fungera, men API:et är fortfarande under utveckling och kan ändras när som helst. Prenumerera på [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ sändlistan mediawiki-api-announce] för uppdateringsaviseringar.\n\nFelaktiga begäran: När felaktiga begäran skickas till API:et kommer en HTTP-header skickas med nyckeln \"MediaWiki-API-Error\" och sedan kommer både värdet i headern och felkoden som skickades tillbaka anges som samma värde. För mer information se [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Fel och varningar]].\n\nTestning: För enkelt testning av API-begäran, se [[Special:ApiSandbox]].", "apihelp-main-param-action": "Vilken åtgärd som ska utföras.", "apihelp-main-param-format": "Formatet för utdata.", "apihelp-main-param-smaxage": "Ange headervärdet s-maxage till så här många sekunder. Fel cachelagras aldrig.", @@ -30,8 +30,10 @@ "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.", "apihelp-main-param-responselanginfo": "Inkluderar de språk som används för uselang och errorlang i resultatet.", "apihelp-main-param-origin": "När API:et används genom en cross-domain AJAX-begäran (CORS), ange detta till den ursprungliga domänen. Detta måste inkluderas i alla pre-flight-begäran, och mpste därför vara en del av den begärda URI:n (inte i POST-datat). Detta måste överensstämma med en av källorna i headern Origin exakt, så den måste sättas till något i stil med http://en.wikipedia.org eller https://meta.wikimedia.org. Om denna parameter inte överensstämmer med headern Origin, returneras ett 403-svar. Om denna parameter överensstämmer med headern Origin och källan är vitlistad, sätts en Access-Control-Allow-Origin-header.", - "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. En lista med koder kan hämtas från [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages, eller ange user för att använda den aktuella användarens språkpreferenser, eller ange content för att använda innehållsspråket.", - "apihelp-block-description": "Blockera en användare.", + "apihelp-main-param-uselang": "Språk som ska användas för meddelandeöversättningar. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages returnerar en lista med språkkoder, eller ange user för att använda den aktuella användarens språkpreferenser, eller ange content för att använda innehållsspråket.", + "apihelp-main-param-errorlang": "Språk att använda för varningar och fel. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] med siprop=languages returnerar en lista över språkkoder eller specifikt content för att använda innehållsspråket på denna wiki, eller specifikt uselang för att använda samma värde som parametern uselang.", + "apihelp-main-param-errorsuselocal": "Om angivet kommer feltexter att använda lokalt anpassade meddelande från namnrymden {{ns:MediaWiki}}.", + "apihelp-block-summary": "Blockera en användare.", "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall att blockera. Kan inte användas tillsammans med $1userid", "apihelp-block-param-userid": "Användar-ID att blocker. Kan inte användas tillsammans med $1user.", "apihelp-block-param-expiry": "Förfallotid. Kan vara Kan vara relativt (t.ex. 5 months eller 2 weeks) eller absolut (t.ex. 2014-09-18T12:34:56Z). Om satt till infinite, indefinite eller never, kommer blockeringen aldrig att löpa ut.", @@ -41,26 +43,36 @@ "apihelp-block-param-autoblock": "Blockera automatiskt den senast använda IP-adressen, och alla efterföljande IP-adresser de försöker logga in från.", "apihelp-block-param-noemail": "Hindra användaren från att skicka e-post via wikin. (Kräver rättigheten blockemail).", "apihelp-block-param-hidename": "Döljer användarnamnet från blockeringsloggen. (Kräver rättigheten hideuser).", - "apihelp-block-param-allowusertalk": "Låt användaren redigera sin egen diskussionssida (beror på [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Låt användaren redigera sin egen diskussionssida (beror på [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Skriv över befintlig blockering om användaren redan är blockerad.", "apihelp-block-param-watchuser": "Bevaka användarens eller IP-adressens användarsida och diskussionssida", + "apihelp-block-param-tags": "Ändra märken att tillämpa i blockloggens post.", "apihelp-block-example-ip-simple": "Blockera IP-adressen 192.0.2.5 i tre dagar med motivationen First strike", "apihelp-block-example-user-complex": "Blockera användare Vandal på obegränsad tid med motivationen Vandalism, och förhindra kontoskapande och e-post.", + "apihelp-changeauthenticationdata-summary": "Ändra autentiseringsdata för aktuell användare.", + "apihelp-changeauthenticationdata-example-password": "Försök att ändra aktuell användares lösenord till ExamplePassword.", + "apihelp-checktoken-summary": "Kontrollera giltigheten av en nyckel från [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Typ av token som testas.", "apihelp-checktoken-param-token": "Token att testa.", "apihelp-checktoken-param-maxtokenage": "Högsta tillåtna åldern för token, i sekunder.", "apihelp-checktoken-example-simple": "Testa giltigheten av en csrf-token.", - "apihelp-clearhasmsg-description": "Rensa hasmsg-flaggan för den aktuella användaren.", + "apihelp-clearhasmsg-summary": "Rensa hasmsg-flaggan för den aktuella användaren.", "apihelp-clearhasmsg-example-1": "Rensa hasmsg-flaggan för den aktuella användaren", - "apihelp-compare-description": "Hämta skillnaden mellan två sidor.\n\nEtt versionsnummer, en sidtitel, eller ett sid-Id för både \"from\" och \"to\" måste skickas.", + "apihelp-clientlogin-summary": "Logga till på wikin med det interaktiva flödet.", + "apihelp-clientlogin-example-login": "Börja att logga in wikin som användaren Example med lösenordet ExamplePassword.", + "apihelp-clientlogin-example-login2": "Fortsätt logga in efter ett svar av typen UI för en tvåstegsverifiering, som uppger en OATHToken med värdet 987654.", + "apihelp-compare-summary": "Hämta skillnaden mellan två sidor.", + "apihelp-compare-extended-description": "Ett versionsnummer, en sidtitel, ett sid-ID, text eller en relativ referens för både \"from\" och \"to\" måste godkännas.", "apihelp-compare-param-fromtitle": "Första titeln att jämföra.", "apihelp-compare-param-fromid": "Första sid-ID att jämföra.", "apihelp-compare-param-fromrev": "Första version att jämföra.", + "apihelp-compare-param-fromtext": "Använd denna text istället för innehållet i sidversionen som anges i fromtitle, fromid eller fromrev.", + "apihelp-compare-param-fromcontentmodel": "Innehållsmodell för fromtext. Om det inte anges kommer den gissas fram baserat på de andra parametrarna.", "apihelp-compare-param-totitle": "Andra titeln att jämföra.", "apihelp-compare-param-toid": "Andra sid-ID att jämföra.", "apihelp-compare-param-torev": "Andra version att jämföra.", "apihelp-compare-example-1": "Skapa en diff mellan version 1 och 2", - "apihelp-createaccount-description": "Skapa ett nytt användarkonto.", + "apihelp-createaccount-summary": "Skapa ett nytt användarkonto.", "apihelp-createaccount-param-name": "Användarnamn.", "apihelp-createaccount-param-password": "Lösenord (ignoreras om $1mailpassword angetts).", "apihelp-createaccount-param-domain": "Domän för extern autentisering (frivillig).", @@ -72,7 +84,7 @@ "apihelp-createaccount-param-language": "Språkkod att använda som standard för användaren (valfri, standardvärdet är innehållsspråket).", "apihelp-createaccount-example-pass": "Skapa användaren testuser med lösenordet test123", "apihelp-createaccount-example-mail": "Skapa användaren testmailuser och skicka ett slumpgenererat lösenord via e-post", - "apihelp-delete-description": "Radera en sida.", + "apihelp-delete-summary": "Radera en sida.", "apihelp-delete-param-title": "Titel på sidan du vill radera. Kan inte användas tillsammans med $1pageid.", "apihelp-delete-param-pageid": "Sid-ID för sidan att radera. Kan inte användas tillsammans med $1titel.", "apihelp-delete-param-reason": "Orsak till radering. Om orsak inte ges kommer en orsak att automatiskt genereras och användas.", @@ -82,8 +94,8 @@ "apihelp-delete-param-oldimage": "Namnet på den gamla bilden att radera som tillhandahålls av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Radera Main Page.", "apihelp-delete-example-reason": "Raderar Main Page med orsaken Preparing for move.", - "apihelp-disabled-description": "Denna modul har inaktiverats.", - "apihelp-edit-description": "Skapa och redigera sidor.", + "apihelp-disabled-summary": "Denna modul har inaktiverats.", + "apihelp-edit-summary": "Skapa och redigera sidor.", "apihelp-edit-param-title": "Titel på sidan du vill redigera. Kan inte användas tillsammans med $1pageid.", "apihelp-edit-param-pageid": "Sid-ID för sidan du vill redigera. Kan inte användas tillsammans med $1titel.", "apihelp-edit-param-section": "Avsnittsnummer. 0 för det översta avsnittet, new för ett nytt avsnitt.", @@ -112,14 +124,15 @@ "apihelp-edit-param-contentmodel": "Det nya innehållets innehållsmodell.", "apihelp-edit-param-token": "Token ska alltid skickas som sista parameter, eller åtminstone efter $1text-parametern", "apihelp-edit-example-edit": "Redigera en sida", + "apihelp-edit-example-prepend": "Lägg till __NOTOC__ i början på en sida.", "apihelp-edit-example-undo": "Ångra sidversioner 13579 till 13585 med automatisk sammanfattning.", - "apihelp-emailuser-description": "Skicka e-post till en användare.", + "apihelp-emailuser-summary": "Skicka e-post till en användare.", "apihelp-emailuser-param-target": "Användare att skicka e-post till.", "apihelp-emailuser-param-subject": "Ämnesrubrik.", "apihelp-emailuser-param-text": "E-postmeddelandets innehåll.", "apihelp-emailuser-param-ccme": "Skicka en kopia av detta e-postmeddelande till mig.", "apihelp-emailuser-example-email": "Skicka ett e-postmeddelande till användaren WikiSysop med texten Content.", - "apihelp-expandtemplates-description": "Expanderar alla mallar inom wikitext.", + "apihelp-expandtemplates-summary": "Expanderar alla mallar inom wikitext.", "apihelp-expandtemplates-param-title": "Sidans rubrik.", "apihelp-expandtemplates-param-text": "Wikitext att konvertera.", "apihelp-expandtemplates-param-revid": "Revision ID, för {{REVISIONID}} och liknande variabler.", @@ -127,7 +140,7 @@ "apihelp-expandtemplates-param-includecomments": "Om HTML-kommentarer skall inkluderas i utdata.", "apihelp-expandtemplates-param-generatexml": "Generera ett XML tolknings träd (ersatt av $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Expandera wikitexten {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Returnerar en användares bidragsflöde.", + "apihelp-feedcontributions-summary": "Returnerar en användares bidragsflöde.", "apihelp-feedcontributions-param-feedformat": "Flödets format.", "apihelp-feedcontributions-param-user": "De användare vars bidrag ska hämtas.", "apihelp-feedcontributions-param-namespace": "Vilken namnrymd att filtrera bidrag med.", @@ -140,7 +153,7 @@ "apihelp-feedcontributions-param-hideminor": "Göm mindre ändringar.", "apihelp-feedcontributions-param-showsizediff": "Visa skillnaden i storlek mellan revisioner.", "apihelp-feedcontributions-example-simple": "Returnera bidrag för Exempel", - "apihelp-feedrecentchanges-description": "Returnerar ett flöde med senaste ändringar.", + "apihelp-feedrecentchanges-summary": "Returnerar ett flöde med senaste ändringar.", "apihelp-feedrecentchanges-param-feedformat": "Flödets format.", "apihelp-feedrecentchanges-param-namespace": "Namnrymder att begränsa resultaten till.", "apihelp-feedrecentchanges-param-invert": "Alla namnrymder utom den valda.", @@ -156,20 +169,22 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.", "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.", "apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.", + "apihelp-feedrecentchanges-param-categories": "Visa endast ändringar på sidor i alla dessa kategorier.", + "apihelp-feedrecentchanges-param-categories_any": "Visa endast ändringar på sidor i någon av kategorierna istället.", "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar", "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn", - "apihelp-feedwatchlist-description": "Returnerar ett flöde från bevakningslistan.", + "apihelp-feedwatchlist-summary": "Returnerar ett flöde från bevakningslistan.", "apihelp-feedwatchlist-param-feedformat": "Flödets format.", "apihelp-feedwatchlist-param-hours": "Lista sidor ändrade inom så här många timmar från nu.", "apihelp-feedwatchlist-param-linktosections": "Länka direkt till ändrade avsnitt om möjligt.", "apihelp-feedwatchlist-example-default": "Visa flödet från bevakningslistan.", "apihelp-feedwatchlist-example-all6hrs": "Visa alla ändringar på besökta sidor under de senaste sex timmarna.", - "apihelp-filerevert-description": "Återställ en fil till en äldre version.", + "apihelp-filerevert-summary": "Återställ en fil till en äldre version.", "apihelp-filerevert-param-filename": "Målfilens namn, utan prefixet Fil:.", "apihelp-filerevert-param-comment": "Ladda upp kommentar.", "apihelp-filerevert-param-archivename": "Arkiv-namn för revisionen att gå tillbaka till.", "apihelp-filerevert-example-revert": "Återställ Wiki.png till versionen från 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Visa hjälp för de angivna modulerna.", + "apihelp-help-summary": "Visa hjälp för de angivna modulerna.", "apihelp-help-param-modules": "Vilka moduler som hjälpen ska visas för (värdena på parametrarna action och format, eller main). Undermoduler kan anges med ett plustecken (+).", "apihelp-help-param-submodules": "Inkludera hjälp för undermoduler av den namngivna modulen.", "apihelp-help-param-recursivesubmodules": "Inkludera hjälp för undermoduler rekursivt.", @@ -177,15 +192,18 @@ "apihelp-help-param-wrap": "Omge utdatan i en standard API respons struktur.", "apihelp-help-param-toc": "Inkludera en innehållsförteckning i HTML-utdata.", "apihelp-help-example-main": "Hjälp för huvudmodul", + "apihelp-help-example-submodules": "Hjälp för action=query och alla dess undermoduler.", "apihelp-help-example-recursive": "All hjälp på en sida", "apihelp-help-example-help": "Hjälp för själva hjälpmodulen", "apihelp-help-example-query": "Hjälp för två frågeundermoduler.", - "apihelp-imagerotate-description": "Rotera en eller flera bilder.", + "apihelp-imagerotate-summary": "Rotera en eller flera bilder.", "apihelp-imagerotate-param-rotation": "Grader att rotera bild medurs.", + "apihelp-imagerotate-param-tags": "Märken att tillämpa i uppladdningsloggens post.", "apihelp-imagerotate-example-simple": "Rotera File:Example.png med 90 grader", "apihelp-imagerotate-example-generator": "Rotera alla bilder i Category:Flip med 180 grader.", - "apihelp-import-description": "Importera en sida från en annan wiki, eller en XML fil. \n\nNotera att HTTP POST måste bli gjord som en fil uppladdning (d.v.s med multipart/form-data) när man skickar en fil för xml parametern.", - "apihelp-import-param-summary": "Importera sammanfattning.", + "apihelp-import-summary": "Importer en sida från en annan wiki eller från en XML-fil.", + "apihelp-import-extended-description": "Notera att HTTP POST måste bli gjord som en fil uppladdning (d.v.s med multipart/form-data) när man skickar en fil för xml parametern.", + "apihelp-import-param-summary": "Sammanfattning för importering av loggpost.", "apihelp-import-param-xml": "Uppladdad XML-fil.", "apihelp-import-param-interwikisource": "För interwiki-importer: wiki som du vill importera från.", "apihelp-import-param-interwikipage": "För interwiki-importer: sidan som du vill importera.", @@ -193,17 +211,21 @@ "apihelp-import-param-templates": "För interwiki-importer: importera även alla mallar som ingår.", "apihelp-import-param-namespace": "Importera till denna namnrymd. Kan inte användas tillsammans med $1rootpage.", "apihelp-import-param-rootpage": "Importera som undersida till denna sida. Kan inte användas tillsammans med $1namespace.", + "apihelp-import-param-tags": "Ändringsmärken att tillämpa i importeringsloggens post och i nullsidversionen på de importerade sidorna.", "apihelp-import-example-import": "Importera [[meta:Help:ParserFunctions]] till namnrymd 100 med full historik.", - "apihelp-login-description": "Logga in och hämta autentiserings-cookies.\n\nOm inloggningen lyckas, finns de cookies som krävs med i HTTP-svarshuvuden. Om inloggningen misslyckas kan ytterligare försök per tidsenhet begränsas, som ett sätt att försöka minska risken för automatiserade lösenordsgissningar.", + "apihelp-linkaccount-summary": "Länka ett konto från en tredjepartsleverantör till nuvarande användare.", + "apihelp-linkaccount-example-link": "Börja länka till ett konto från Example.", + "apihelp-login-summary": "Logga in och hämta autentiseringskakor.", + "apihelp-login-extended-description": "Om inloggningen lyckas, finns de cookies som krävs med i HTTP-svarshuvuden. Om inloggningen misslyckas kan ytterligare försök per tidsenhet begränsas, som ett sätt att försöka minska risken för automatiserade lösenordsgissningar.", "apihelp-login-param-name": "Användarnamn.", "apihelp-login-param-password": "Lösenord.", "apihelp-login-param-domain": "Domän (valfritt).", "apihelp-login-param-token": "Login nyckel erhållen i första begäran.", "apihelp-login-example-gettoken": "Hämta en login nyckel.", "apihelp-login-example-login": "Logga in", - "apihelp-logout-description": "Logga ut och rensa sessionsdata.", + "apihelp-logout-summary": "Logga ut och rensa sessionsdata.", "apihelp-logout-example-logout": "Logga ut den aktuella användaren", - "apihelp-managetags-description": "Utför hanterings uppgifter relaterade till förändrings taggar.", + "apihelp-managetags-summary": "Utför hanterings uppgifter relaterade till förändrings taggar.", "apihelp-managetags-param-tag": "Tagg för att skapa, radera, aktivera eller inaktivera. Vid skapande av tagg kan taggen inte existera. Vid raderande av tagg måste taggen existera. För aktiverande av tagg måste taggen existera och inte användas i ett tillägg. För inaktivering av tagg måste taggen användas just nu och vara manuellt definierad.", "apihelp-managetags-param-reason": "En icke-obligatorisk orsak för att skapa, radera, aktivera, eller inaktivera taggen.", "apihelp-managetags-param-ignorewarnings": "Om du vill ignorera varningar som utfärdas under operationen.", @@ -211,11 +233,11 @@ "apihelp-managetags-example-delete": "Radera vandalims taggen med andledningen: Felstavat", "apihelp-managetags-example-activate": "Aktivera en tagg med namn spam med anledningen: For use in edit patrolling", "apihelp-managetags-example-deactivate": "Inaktivera en tagg vid namn spam med anledningen: No longer required", - "apihelp-mergehistory-description": "Sammanfoga sidhistoriker.", + "apihelp-mergehistory-summary": "Sammanfoga sidhistoriker.", "apihelp-mergehistory-param-reason": "Orsaken till sammanfogning av historik.", "apihelp-mergehistory-example-merge": "Sammanfoga hela historiken för Oldpage i Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Sammanfoga den sidversion av Oldpage daterad fram till 2015-12-31T04:37:41Z till Newpage.", - "apihelp-move-description": "Flytta en sida.", + "apihelp-move-summary": "Flytta en sida.", "apihelp-move-param-from": "Titeln på sidan du vill flytta. Kan inte användas tillsammans med $1fromid.", "apihelp-move-param-fromid": "Sid-ID för sidan att byta namn. Kan inte användas tillsammans med $1from.", "apihelp-move-param-to": "Titel att byta namn på sidan till.", @@ -228,17 +250,18 @@ "apihelp-move-param-watchlist": "Lägg till eller ta bort sidan ovillkorligen från den aktuella användarens bevakningslista, använd inställningar eller ändra inte bevakning.", "apihelp-move-param-ignorewarnings": "Ignorera alla varningar.", "apihelp-move-example-move": "Flytta Badtitle till Goodtitle utan att lämna en omdirigering.", - "apihelp-opensearch-description": "Sök wikin med protokollet OpenSearch.", + "apihelp-opensearch-summary": "Sök wikin med protokollet OpenSearch.", "apihelp-opensearch-param-search": "Söksträng.", "apihelp-opensearch-param-limit": "Maximalt antal resultat att returnera.", "apihelp-opensearch-param-namespace": "Namnrymder att genomsöka.", - "apihelp-opensearch-param-suggest": "Gör ingenting om [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] är falskt.", + "apihelp-opensearch-param-suggest": "Gör ingenting om [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] är falskt.", "apihelp-opensearch-param-format": "Formatet för utdata.", "apihelp-opensearch-example-te": "Hitta sidor som börjar med Te.", + "apihelp-options-summary": "Ändra inställningar för nuvarande användare.", "apihelp-options-param-reset": "Återställer inställningarna till sidans standardvärden.", "apihelp-options-example-reset": "Återställ alla inställningar", "apihelp-options-example-complex": "Återställ alla inställningar, ställ sedan in skin och nickname.", - "apihelp-paraminfo-description": "Få information om API moduler.", + "apihelp-paraminfo-summary": "Få information om API moduler.", "apihelp-paraminfo-param-helpformat": "Format för hjälpsträngar.", "apihelp-paraminfo-param-mainmodule": "Få information om huvud-modulen (top-level) också. Använd $1modules=main istället.", "apihelp-parse-param-summary": "Sammanfattning att tolka.", @@ -251,13 +274,13 @@ "apihelp-parse-example-text": "Tolka wikitext.", "apihelp-parse-example-texttitle": "Tolka wikitext, specificera sid-titeln.", "apihelp-parse-example-summary": "Tolka en sammanfattning.", - "apihelp-patrol-description": "Patrullera en sida eller en version.", + "apihelp-patrol-summary": "Patrullera en sida eller en version.", "apihelp-patrol-param-revid": "Versions ID att patrullera.", "apihelp-patrol-example-rcid": "Patrullera en nykommen ändring.", "apihelp-patrol-example-revid": "Patrullera en sidversion", - "apihelp-protect-description": "Ändra skyddsnivån för en sida.", + "apihelp-protect-summary": "Ändra skyddsnivån för en sida.", "apihelp-protect-example-protect": "Skydda en sida", - "apihelp-purge-description": "Rensa cachen för angivna titlar.", + "apihelp-purge-summary": "Rensa cachen för angivna titlar.", "apihelp-query-param-list": "Vilka listor att hämta.", "apihelp-query-param-meta": "Vilka metadata att hämta.", "apihelp-query-example-allpages": "Hämta sidversioner av sidor som börjar med API/.", @@ -268,7 +291,7 @@ "apihelp-query+allcategories-param-limit": "Hur många kategorier att returnera.", "apihelp-query+allcategories-paramvalue-prop-size": "Lägger till antal sidor i kategorin.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Märker kategorier som är dolda med __HIDDENCAT__.", - "apihelp-query+alldeletedrevisions-description": "Lista alla raderade revisioner av en användare or inom en namnrymd.", + "apihelp-query+alldeletedrevisions-summary": "Lista alla raderade revisioner av en användare or inom en namnrymd.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kan endast användas med $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kan inte användas med $3user.", "apihelp-query+alldeletedrevisions-param-from": "Börja lista vid denna titel.", @@ -280,7 +303,7 @@ "apihelp-query+alldeletedrevisions-param-namespace": "Lista bara sidor i denna namnrymd.", "apihelp-query+alldeletedrevisions-example-user": "List de senaste 50 raderade bidragen av användaren Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Lista dem första 50 revideringarna i huvud-namnrymden", - "apihelp-query+allfileusages-description": "Lista all fil användningsområden, inklusive icke-existerande.", + "apihelp-query+allfileusages-summary": "Lista all fil användningsområden, inklusive icke-existerande.", "apihelp-query+allfileusages-param-prefix": "Sök för all fil-titlar som börjar med detta värde.", "apihelp-query+allfileusages-param-limit": "Hur många saker att returnera totalt.", "apihelp-query+allfileusages-param-dir": "Riktningen att lista mot.", @@ -309,7 +332,7 @@ "apihelp-query+alllinks-example-unique": "Lista unika länkade titlar.", "apihelp-query+alllinks-example-unique-generator": "Hämtar alla länkade titlar, markera de saknade.", "apihelp-query+alllinks-example-generator": "Hämtar sidor som innehåller länkarna.", - "apihelp-query+allmessages-description": "Returnera meddelande från denna sida.", + "apihelp-query+allmessages-summary": "Returnera meddelande från denna sida.", "apihelp-query+allmessages-param-messages": "Vilka meddelande att ge som utdata. * (standard) betyder alla meddelande .", "apihelp-query+allmessages-param-prop": "Vilka egenskaper att hämta.", "apihelp-query+allmessages-param-args": "Argument som ska substitueras i meddelandet.", @@ -331,10 +354,11 @@ "apihelp-query+allpages-param-dir": "Riktningen att lista mot.", "apihelp-query+allpages-example-B": "Visa en lista över sidor som börjar på bokstaven B.", "apihelp-query+allpages-example-generator": "Visa information om fyra sidor som börjar på bokstaven T.", - "apihelp-query+allredirects-description": "Lista alla omdirigeringar till en namnrymd.", + "apihelp-query+allredirects-summary": "Lista alla omdirigeringar till en namnrymd.", "apihelp-query+allredirects-param-dir": "Riktningen att lista mot.", "apihelp-query+allredirects-example-unique-generator": "Hämtar alla målsidor, markerar de som saknas.", - "apihelp-query+alltransclusions-description": "Lista alla mallinkluderingar (sidor inbäddade med {{x}}), inklusive icke-befintliga.", + "apihelp-query+allrevisions-summary": "Lista alla sidversioner.", + "apihelp-query+alltransclusions-summary": "Lista alla mallinkluderingar (sidor inbäddade med {{x}}), inklusive icke-befintliga.", "apihelp-query+alltransclusions-param-limit": "Hur många objekt att returnera.", "apihelp-query+alltransclusions-param-dir": "Riktningen att lista mot.", "apihelp-query+alltransclusions-example-unique": "Lista unika mallinkluderade titlar.", @@ -348,10 +372,11 @@ "apihelp-query+allusers-param-witheditsonly": "Lista bara användare som har gjort redigeringar.", "apihelp-query+allusers-param-activeusers": "Lista bara användare aktiva i dem sista $1{{PLURAL:$1|dagen|dagarna}}.", "apihelp-query+allusers-example-Y": "Lista användare som börjar på Y.", - "apihelp-query+backlinks-description": "Hitta alla sidor som länkar till den givna sidan.", + "apihelp-query+authmanagerinfo-summary": "Hämta information om aktuell autentiseringsstatus.", + "apihelp-query+backlinks-summary": "Hitta alla sidor som länkar till den givna sidan.", "apihelp-query+backlinks-param-dir": "Riktningen att lista mot.", "apihelp-query+backlinks-example-simple": "Visa länkar till Main page.", - "apihelp-query+blocks-description": "Lista alla blockerade användare och IP-adresser.", + "apihelp-query+blocks-summary": "Lista alla blockerade användare och IP-adresser.", "apihelp-query+blocks-param-prop": "Vilka egenskaper att hämta.", "apihelp-query+blocks-paramvalue-prop-id": "Lägger till ID på blocket.", "apihelp-query+blocks-paramvalue-prop-user": "Lägger till användarnamn för den blockerade användaren.", @@ -362,15 +387,15 @@ "apihelp-query+blocks-paramvalue-prop-range": "Lägger till intervallet av IP-adresser som berörs av blockeringen.", "apihelp-query+blocks-example-simple": "Lista blockeringar.", "apihelp-query+blocks-example-users": "Lista blockeringar av användarna Alice och Bob.", - "apihelp-query+categories-description": "Lista alla kategorier sidorna tillhör.", + "apihelp-query+categories-summary": "Lista alla kategorier sidorna tillhör.", "apihelp-query+categories-param-show": "Vilka sorters kategorier att visa.", "apihelp-query+categories-param-limit": "Hur många kategorier att returnera.", "apihelp-query+categories-param-dir": "Riktningen att lista mot.", "apihelp-query+categories-example-simple": "Hämta en lista över kategorier som sidan Albert Einstein tillhör.", "apihelp-query+categories-example-generator": "Hämta information om alla kategorier som används på sidan Albert Einstein.", - "apihelp-query+categoryinfo-description": "Returnerar information om angivna kategorier.", + "apihelp-query+categoryinfo-summary": "Returnerar information om angivna kategorier.", "apihelp-query+categoryinfo-example-simple": "Hämta information om Category:Foo och Category:Bar.", - "apihelp-query+categorymembers-description": "Lista alla sidor i en angiven kategori.", + "apihelp-query+categorymembers-summary": "Lista alla sidor i en angiven kategori.", "apihelp-query+categorymembers-paramvalue-prop-ids": "Lägger till sid-ID.", "apihelp-query+categorymembers-paramvalue-prop-title": "Lägger till titeln och namnrymds-ID för sidan.", "apihelp-query+categorymembers-param-dir": "I vilken riktning att sortera.", @@ -378,15 +403,20 @@ "apihelp-query+categorymembers-param-endsortkey": "Använd $1endhexsortkey istället.", "apihelp-query+categorymembers-example-simple": "Hämta de tio första sidorna i Category:Physics.", "apihelp-query+categorymembers-example-generator": "Hämta sidinformation om de tio första sidorna i Category:Physics.", - "apihelp-query+contributors-description": "Hämta listan över inloggade bidragsgivare och antalet anonyma bidragsgivare för en sida.", + "apihelp-query+contributors-summary": "Hämta listan över inloggade bidragsgivare och antalet anonyma bidragsgivare för en sida.", "apihelp-query+contributors-param-limit": "Hur många bidragsgivare att returnera.", + "apihelp-query+deletedrevisions-summary": "Hämta information om raderad sidversion.", "apihelp-query+deletedrevisions-param-user": "Lista endast sidversioner av denna användare.", "apihelp-query+deletedrevisions-param-excludeuser": "Lista inte sidversioner av denna användare.", + "apihelp-query+deletedrevs-summary": "Lista raderade sidversioner.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Läge|Lägen}}: $2", "apihelp-query+deletedrevs-param-from": "Börja lista vid denna titel.", "apihelp-query+deletedrevs-param-to": "Sluta lista vid denna titel.", + "apihelp-query+disabled-summary": "Denna frågemodul har inaktiverats.", + "apihelp-query+duplicatefiles-summary": "Lista alla filer som är dubbletter av angivna filer baserat på hashvärden.", "apihelp-query+duplicatefiles-param-dir": "Riktningen att lista mot.", "apihelp-query+duplicatefiles-example-generated": "Leta efter kopior av alla filer.", + "apihelp-query+embeddedin-summary": "Hitta alla sidor som bäddar in (inkluderar) angiven titel.", "apihelp-query+embeddedin-param-dir": "Riktningen att lista mot.", "apihelp-query+embeddedin-param-limit": "Hur många sidor att returnera totalt.", "apihelp-query+extlinks-example-simple": "Hämta en lista över externa länkar på Main Page.", @@ -394,14 +424,18 @@ "apihelp-query+filearchive-paramvalue-prop-timestamp": "Lägger till tidsstämpel för den uppladdade versionen.", "apihelp-query+filearchive-paramvalue-prop-user": "Lägger till användaren som laddade upp bildversionen.", "apihelp-query+filearchive-example-simple": "Visa en lista över alla borttagna filer.", + "apihelp-query+filerepoinfo-summary": "Returnera metainformation om bildegenskaper som konfigureras på wikin.", + "apihelp-query+fileusage-summary": "Hitta alla sidor som använder angivna filer.", "apihelp-query+fileusage-paramvalue-prop-title": "Titel för varje sida.", "apihelp-query+fileusage-paramvalue-prop-redirect": "Flagga om sidan är en omdirigering.", + "apihelp-query+imageinfo-summary": "Returnerar filinformation och uppladdningshistorik.", "apihelp-query+imageinfo-paramvalue-prop-userid": "Lägg till det användar-ID som laddade upp varje filversion.", "apihelp-query+images-param-dir": "Riktningen att lista mot.", + "apihelp-query+imageusage-summary": "Hitta alla sidor som användare angiven bildtitel.", "apihelp-query+imageusage-param-dir": "Riktningen att lista mot.", "apihelp-query+imageusage-example-simple": "Visa sidor med hjälp av [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "Hämta information om sidor med hjälp av [[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "Få grundläggande sidinformation.", + "apihelp-query+info-summary": "Få grundläggande sidinformation.", "apihelp-query+iwbacklinks-param-limit": "Hur många sidor att returnera totalt.", "apihelp-query+iwbacklinks-param-dir": "Riktningen att lista mot.", "apihelp-query+iwlinks-param-dir": "Riktningen att lista mot.", @@ -409,35 +443,69 @@ "apihelp-query+langbacklinks-param-dir": "Riktningen att lista mot.", "apihelp-query+langbacklinks-example-simple": "Hämta sidor som länkar till [[:fr:Test]].", "apihelp-query+langlinks-param-dir": "Riktningen att lista mot.", + "apihelp-query+links-summary": "Returnerar alla länkar från angivna sidor.", "apihelp-query+links-param-dir": "Riktningen att lista mot.", + "apihelp-query+linkshere-summary": "Hitta alla sidor som länkar till angivna sidor.", + "apihelp-query+logevents-summary": "Hämta händelser från loggar.", + "apihelp-query+pageswithprop-summary": "Lista alla sidor som använder en angiven sidegenskap.", "apihelp-query+prefixsearch-param-profile": "Sök profil att använda.", "apihelp-query+protectedtitles-param-limit": "Hur många sidor att returnera totalt.", "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.", + "apihelp-query+random-summary": "Hämta en uppsättning slumpsidor.", "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.", - "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"", + "apihelp-query+redirects-summary": "Returnerar alla omdirigeringar till angivna sidor.", + "apihelp-query+revisions-summary": "Hämta information om sidversion.", + "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av huvudsidan och som inte gjorts av anonym användare 127.0.0.1", + "apihelp-query+search-summary": "Utför en heltextsökning.", + "apihelp-query+search-paramvalue-prop-score": "Ignorerad.", + "apihelp-query+search-paramvalue-prop-hasrelated": "Ignorerad.", + "apihelp-query+siteinfo-summary": "Returnera allmän information om webbplatsen.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returnerar en lista över språkkoder som [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] har aktiverat och de varianter som varje stöder.", "apihelp-query+siteinfo-example-simple": "Hämta information om webbplatsen.", - "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.", + "apihelp-query+stashimageinfo-summary": "Returnerar filinformation för temporära filer.", "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.", "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil", + "apihelp-query+tags-summary": "Lista ändringsmärken.", "apihelp-query+tags-example-simple": "Lista tillgängliga taggar.", + "apihelp-query+templates-summary": "Returnerar alla sidinkluderingar på angivna sidor.", + "apihelp-query+templates-param-namespace": "Visa mallar i endast denna namnrymd.", + "apihelp-query+transcludedin-summary": "Hitta alla sidor som inkluderar angivna sidor.", + "apihelp-query+usercontribs-summary": "Hämta alla redigeringar av en användare.", + "apihelp-query+userinfo-summary": "Få information om den aktuella användaren.", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "Hämta en nyckel för att ändra aktuell användares inställningar.", "apihelp-query+userinfo-example-simple": "Få information om den aktuella användaren.", "apihelp-query+userinfo-example-data": "Få ytterligare information om den aktuella användaren.", - "apihelp-query+watchlist-description": "Hämta de senaste ändringarna på sidor i den nuvarande användarens bevakningslista.", + "apihelp-query+users-summary": "Hämta information om en lista över användare.", + "apihelp-query+watchlist-summary": "Hämta de senaste ändringarna på sidor i den nuvarande användarens bevakningslista.", "apihelp-query+watchlist-example-allrev": "Hämta information om de senaste ändringarna på sidor på den aktuella användarens bevakningslista.", "apihelp-query+watchlist-example-generator": "Hämta sidinformation för nyligen uppdaterade sidor på nuvarande användares bevakningslista.", "apihelp-query+watchlist-example-generator-rev": "Hämta ändringsinformation för nyligen uppdaterade sidor på nuvarande användares bevakningslista.", - "apihelp-query+watchlistraw-description": "Hämta alla sidor på den aktuella användarens bevakningslista.", + "apihelp-query+watchlistraw-summary": "Hämta alla sidor på den aktuella användarens bevakningslista.", "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.", + "apihelp-revisiondelete-summary": "Radera och återställ sidversioner.", + "apihelp-rollback-summary": "Ångra den senaste redigeringen på sidan.", + "apihelp-rollback-extended-description": "Om den senaste användaren som redigerade sidan gjorde flera redigeringar i rad kommer alla rullas tillbaka.", "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.", + "apihelp-setpagelanguage-summary": "Ändra språket på en sida.", "apihelp-stashedit-param-summary": "Ändra sammanfattning.", + "apihelp-tag-summary": "Lägg till eller ta bort ändringsmärken från individuella sidversioner eller loggposter.", + "apihelp-tokens-summary": "Hämta nycklar för datamodifierande handlingar.", + "apihelp-unblock-summary": "Upphäv en användares blockering.", "apihelp-unblock-param-id": "ID för blockeringen att häva (hämtas genom list=blocks). Kan inte användas tillsammans med $1user eller $1userid.", "apihelp-unblock-param-user": "Användarnamn, IP-adresser eller IP-adressintervall att häva blockering för. Kan inte användas tillsammans med $1id eller $1userid.", "apihelp-unblock-param-userid": "Användar-ID att häva blockering för. Kan inte användas tillsammans med $1id eller $1user.", + "apihelp-undelete-summary": "Återställ sidversioner för en raderad sida.", + "apihelp-unlinkaccount-summary": "Ta bort ett länkat tredjepartskonto från aktuell användare.", + "apihelp-upload-summary": "Ladda upp en fil eller hämta status för väntande uppladdningar.", "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.", "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.", "apihelp-upload-example-url": "Ladda upp från URL.", "apihelp-upload-example-filekey": "Slutför en uppladdning som misslyckades på grund av varningar.", + "apihelp-userrights-summary": "Ändra en användares gruppmedlemskap.", + "apihelp-watch-summary": "Lägg till eller ta bort sidor från aktuell användares bevakningslista.", + "api-login-fail-badsessionprovider": "Kan inte logga in med $1.", "api-help-main-header": "Huvudmodul", + "api-help-undocumented-module": "Ingen dokumentation för modulen $1.", "api-help-flag-deprecated": "Denna modul är föråldrad.", "api-help-flag-internal": "Denna modul är intern eller instabil. Dess funktion kan ändras utan föregående meddelande.", "api-help-flag-readrights": "Denna modul kräver läsrättigheter.", @@ -454,10 +522,14 @@ "api-help-param-multi-separate": "Separera värden med | eller [[Special:ApiHelp/main#main/datatypes|alternativ]].", "apierror-articleexists": "Artikeln du försökte skapa har redan skapats.", "apierror-baddiff": "Diff kan inte hämtas. En eller båda sidversioner finns inte eller du har inte behörighet för att visa dem.", + "apierror-invalidoldimage": "Parametern oldimage har ett ogiltigt format.", "apierror-invalidsection": "Parametern section måste vara ett giltigt avsnitts-ID eller new.", "apierror-nosuchuserid": "Det finns ingen användare med ID $1.", + "apierror-offline": "Kunde inte fortsätta p.g.a. problem med nätverksanslutningen. Se till att du har en fungerande Internetanslutning och försök igen.", "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".", + "apierror-revisions-badid": "Ingen revision hittades för parametern $1.", "apierror-systemblocked": "Du har blockerats automatiskt av MediaWiki.", + "apierror-timeout": "Servern svarade inte inom förväntad tid.", "apierror-unknownformat": "Okänt format \"$1\".", "api-feed-error-title": "Fel ($1)" } diff --git a/includes/api/i18n/tcy.json b/includes/api/i18n/tcy.json index 2f3d4c9e49..4951ba0f83 100644 --- a/includes/api/i18n/tcy.json +++ b/includes/api/i18n/tcy.json @@ -7,7 +7,7 @@ ] }, "apihelp-createaccount-param-name": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:", - "apihelp-delete-description": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ", + "apihelp-delete-summary": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ", "apihelp-edit-param-minor": "ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು", "apihelp-edit-example-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ", "apihelp-feedcontributions-param-year": "ಈ ಒರ್ಸೊರ್ದು(ಬೊಕ್ಕ ದುಂಬುದ):", diff --git a/includes/api/i18n/te.json b/includes/api/i18n/te.json index b7491b5837..fc1f0a34c5 100644 --- a/includes/api/i18n/te.json +++ b/includes/api/i18n/te.json @@ -7,15 +7,15 @@ "Jedimaster26" ] }, - "apihelp-block-description": "ఓ వాడుకరిని నిరోధించండి.", + "apihelp-block-summary": "ఓ వాడుకరిని నిరోధించండి.", "apihelp-block-param-reason": "నిరోధానికి కారణం.", "apihelp-block-param-nocreate": "ఖాతా సృష్టింపుని నివారించు", "apihelp-createaccount-param-name": "వాడుకరి పేరు:", - "apihelp-delete-description": "ఓ పేజీని తొలగించు.", + "apihelp-delete-summary": "ఓ పేజీని తొలగించు.", "apihelp-edit-param-minor": "చిన్న మార్పు", "apihelp-edit-example-edit": "ఓ పేజీని మార్చు.", - "apihelp-emailuser-description": "వాడుకరికి ఈమెయిలు పంపించండి.", + "apihelp-emailuser-summary": "వాడుకరికి ఈమెయిలు పంపించండి.", "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి", "apihelp-query+users-param-userids": "వివరములు సేకరించవలసిన ఉపయోగదారుల పేర్లు", - "apihelp-rawfm-description": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతో కలిపి, JSON పద్ధతిలో (HTMLలో అందంగా-ముద్రించు)" + "apihelp-rawfm-summary": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతో కలిపి, JSON పద్ధతిలో (HTMLలో అందంగా-ముద్రించు)" } diff --git a/includes/api/i18n/th.json b/includes/api/i18n/th.json index d2ea18f060..db8fabd5dd 100644 --- a/includes/api/i18n/th.json +++ b/includes/api/i18n/th.json @@ -4,6 +4,6 @@ "Aefgh39622" ] }, - "apihelp-imagerotate-description": "หมุนรูปภาพอย่างน้อยหนึ่งรูป", + "apihelp-imagerotate-summary": "หมุนรูปภาพอย่างน้อยหนึ่งรูป", "api-help-param-continue": "เมื่อมีผลลัพธ์เพิ่มเติมพร้อมใช้งาน ใช้ตัวเลือกนี้เพื่อดำเนินการต่อ" } diff --git a/includes/api/i18n/tr.json b/includes/api/i18n/tr.json index f611160ef0..0a2fad0a58 100644 --- a/includes/api/i18n/tr.json +++ b/includes/api/i18n/tr.json @@ -10,22 +10,22 @@ "İnternion" ] }, - "apihelp-block-description": "Bir kullanıcıyı engelle.", + "apihelp-block-summary": "Bir kullanıcıyı engelle.", "apihelp-block-param-reason": "Engelleme sebebi.", - "apihelp-createaccount-description": "Yeni bir kullanıcı hesabı oluşturun.", + "apihelp-createaccount-summary": "Yeni bir kullanıcı hesabı oluşturun.", "apihelp-createaccount-param-name": "Kullanıcı adı.", "apihelp-createaccount-param-password": "Parola (ignored if $1mailpassword is set).", "apihelp-createaccount-param-email": "Kullanıcının e-posta adresi (isteğe bağlı).", "apihelp-createaccount-param-realname": "Kullanıcının gerçek adı (isteğe bağlı).", - "apihelp-delete-description": "Sayfayı sil.", - "apihelp-edit-description": "Sayfa oluştur ve düzenle.", + "apihelp-delete-summary": "Sayfayı sil.", + "apihelp-edit-summary": "Sayfa oluştur ve düzenle.", "apihelp-edit-param-text": "Sayfa içeriği.", "apihelp-edit-param-minor": "Küçük değişiklik.", "apihelp-edit-param-nocreate": "Sayfa mevcut değilse hata oluştur.", "apihelp-edit-param-watch": "Sayfayı izleme listenize ekleyin.", "apihelp-edit-param-unwatch": "Sayfayı izleme listenizden çıkarın.", "apihelp-edit-param-redirect": "Yönlendirmeleri otomatik olarak çöz.", - "apihelp-emailuser-description": "Bir kullanıcıya e-posta gönder.", + "apihelp-emailuser-summary": "Bir kullanıcıya e-posta gönder.", "apihelp-emailuser-param-target": "E-posta gönderilecek kullanıcı.", "apihelp-emailuser-param-subject": "Konu başlığı.", "apihelp-emailuser-param-text": "E-posta metni.", @@ -41,10 +41,10 @@ "apihelp-feedrecentchanges-param-hidemyself": "Kendi değişikliklerini gizle.", "apihelp-feedrecentchanges-example-simple": "Son değişiklikleri göster", "apihelp-feedrecentchanges-example-30days": "Son 30 gündeki değişiklikleri göster", - "apihelp-filerevert-description": "Bir dosyayı eski bir sürümüne geri döndür.", + "apihelp-filerevert-summary": "Bir dosyayı eski bir sürümüne geri döndür.", "apihelp-login-param-name": "Kullanıcı adı.", "apihelp-login-param-password": "Parola.", - "apihelp-move-description": "Bir sayfayı taşı.", + "apihelp-move-summary": "Bir sayfayı taşı.", "apihelp-move-param-from": "Taşımak istediğiniz sayfanın başlığı. $1fromid ile birlikte kullanılamaz.", "apihelp-move-param-noredirect": "Yönlendirme oluşturmayın.", "apihelp-opensearch-param-limit": "Verilecek azami sonuç sayısı.", diff --git a/includes/api/i18n/udm.json b/includes/api/i18n/udm.json index 9aaba317d4..420612cf07 100644 --- a/includes/api/i18n/udm.json +++ b/includes/api/i18n/udm.json @@ -5,7 +5,7 @@ "Mouse21" ] }, - "apihelp-block-description": "Блокировка пыриськисьёс.", + "apihelp-block-summary": "Блокировка пыриськисьёс.", "apihelp-edit-example-edit": "Бамез тупатъяно.", "apihelp-login-example-login": "Пырыны." } diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json index 996f26e529..e9a7f9b154 100644 --- a/includes/api/i18n/uk.json +++ b/includes/api/i18n/uk.json @@ -6,19 +6,19 @@ "Ahonc", "Base", "Dars", - "Umherirrender", "Macofe", "Mix Gerder", "Piramidion", "Andriykopanytsia", "Максим Підліснюк", - "AS" + "AS", + "Umherirrender" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n
    \nСтатус: Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\nХибні запити: Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\nТестування: Для зручності тестування запитів API, див. [[Special:ApiSandbox]].", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|Документація]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n
    \nСтатус: Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\nХибні запити: Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\nТестування: Для зручності тестування запитів API, див. [[Special:ApiSandbox]].", "apihelp-main-param-action": "Яку дію виконати.", "apihelp-main-param-format": "Формат виводу.", - "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки maxlag з повідомленням на зразок Очікування на $host: $lag секунд(и) затримки.
    Див. [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.", + "apihelp-main-param-maxlag": "Максимальна затримка може використовуватися, коли MediaWiki інстальовано на реплікований кластер бази даних. Щоб зберегти дії, які спричиняють більшу затримку реплікації, цей параметр може змусити клієнт почекати, поки затримка реплікації не буде меншою за вказане значення. У випадку непомірної затримки, видається код помилки maxlag з повідомленням на зразок Очікування на $host: $lag секунд(и) затримки.
    Див. [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] для детальнішої інформації.", "apihelp-main-param-smaxage": "Встановити s-maxage HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.", "apihelp-main-param-maxage": "Встановити max-age HTTP кеш-контроль заголовок на стільки секунд. Помилки ніколи не кешуються.", "apihelp-main-param-assert": "Перевірити, що користувач увійшов у систему, якщо задано user, або має права бота, якщо задано bot.", @@ -32,7 +32,7 @@ "apihelp-main-param-errorformat": "Формат попереджень і тексту помилок.\n; plaintext: вікітекст із прираними HTML-тегами і заміненими HTML-мнемоніками.\n; wikitext: неопрацьований вікітекст.\n; html: HTML.\n; raw: лише ключ і параметри повідомлення.\n; none: без тексту, тільки коди помилок.\n; bc: формат, який використовувався до MediaWiki 1.29. errorlang і errorsuselocal ігноруються.", "apihelp-main-param-errorlang": "Мова, яку використовувати для попереджень і помилок. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] із siprop=languages повертає список кодів мов, або ж вкажіть content, щоб використати мову вмісту поточної вікі, або вкажіть uselang, щоб використовувати те ж значення, що й параметр uselang.", "apihelp-main-param-errorsuselocal": "Якщо задано, тексти помилок використовуватимуть локальні повідомлення з простору назв {{ns:MediaWiki}}.", - "apihelp-block-description": "Заблокувати користувача.", + "apihelp-block-summary": "Заблокувати користувача.", "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування. Не може бути використано разом із $1userid", "apihelp-block-param-userid": "Ідентифікатор користувача, який заблокувати. Не може бути використано разом із $1user.", "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., 5 місяців або 2 тижні) чи абсолютним (напр., 2014-09-18T12:34:56Z). Якщо вказано infinite, indefinite або never, блокування не закінчиться ніколи.", @@ -42,33 +42,53 @@ "apihelp-block-param-autoblock": "Автоматично блокувати IP-адреси, які цей користувач використовував останніми, та будь-які наступні адреси, з яких він спробує зайти в систему.", "apihelp-block-param-noemail": "Заборонити користувачеві надсилати електронні листи через вікі. (Вимагає права blockemail).", "apihelp-block-param-hidename": "Приховати ім'я користувача з журналу блокувань. (Вимагає права hideuser).", - "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Дозволити користувачу редагувати власну сторінку обговорення (залежить від [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Якщо користувач уже заблокований, переписати наявне блокування.", "apihelp-block-param-watchuser": "Спостерігати за сторінкою користувача чи IP-адреси і сторінкою обговорення.", "apihelp-block-param-tags": "Змінити теги для застосування їх до запису в журналі блокувань.", "apihelp-block-example-ip-simple": "Блокувати IP-адресу 192.0.2.5 на три дні з причиною First strike.", "apihelp-block-example-user-complex": "Блокувати користувачаVandal на невизначений термін з причиною Vandalism і заборонити створення нових облікових записів та надсилання електронної пошти.", - "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.", + "apihelp-changeauthenticationdata-summary": "Зміна параметрів аутентифікації для поточного користувача.", "apihelp-changeauthenticationdata-example-password": "Спроба змінити поточний пароль користувача на ExamplePassword.", - "apihelp-checktoken-description": "Перевірити коректність токена з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-checktoken-summary": "Перевірити коректність токена з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Тип токена, який тестується.", "apihelp-checktoken-param-token": "Токен для тесту.", "apihelp-checktoken-param-maxtokenage": "Максимально допустимий вік токена (у секундах).", "apihelp-checktoken-example-simple": "Перевірити дійсність токена csrf.", - "apihelp-clearhasmsg-description": "Очищає прапорець hasmsg для поточного користувача.", + "apihelp-clearhasmsg-summary": "Очищає прапорець hasmsg для поточного користувача.", "apihelp-clearhasmsg-example-1": "Очистити прапорець hasmsg для поточного користувача.", - "apihelp-clientlogin-description": "Увійдіть у вікі з допомогою інтерактивного потоку.", + "apihelp-clientlogin-summary": "Увійдіть у вікі з допомогою інтерактивного потоку.", "apihelp-clientlogin-example-login": "Почати процес входу у вікі як користувач Example з паролем ExamplePassword.", "apihelp-clientlogin-example-login2": "Продовжити вхід в систему після відповіді UI для двофакторної автентифікації, надаючи OATHToken як 987654.", - "apihelp-compare-description": "Отримати порівняння двох сторінок.\n\nПовинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».", + "apihelp-compare-summary": "Отримати порівняння двох сторінок.", + "apihelp-compare-extended-description": "Повинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».", "apihelp-compare-param-fromtitle": "Перший заголовок для порівняння.", "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.", "apihelp-compare-param-fromrev": "Перша версія для порівняння.", + "apihelp-compare-param-fromtext": "Використати цей текст замість контенту версії, вказаної через fromtitle, fromid або fromrev.", + "apihelp-compare-param-frompst": "Зробити трансформацію перед збереженням на fromtext.", + "apihelp-compare-param-fromcontentmodel": "Контентна модель fromtext. Якщо не вказано, буде використано припущення на основі інших параметрів.", + "apihelp-compare-param-fromcontentformat": "Формат серіалізації контенту fromtext.", "apihelp-compare-param-totitle": "Другий заголовок для порівняння.", "apihelp-compare-param-toid": "Другий ID сторінки для порівняння.", "apihelp-compare-param-torev": "Друга версія для порівняння.", + "apihelp-compare-param-torelative": "Використати версію, яка стосується версії, визначеної через fromtitle, fromid або fromrev. Усі інші опції 'to' буде проігноровано.", + "apihelp-compare-param-totext": "Використати цей текст замість контенту версії, вказаної через totitle, toid або torev.", + "apihelp-compare-param-topst": "Виконати трансформацію перед збереженням на totext.", + "apihelp-compare-param-tocontentmodel": "Контентна модель totext. Якщо не вказано, буде використано припущення на основі інших параметрів.", + "apihelp-compare-param-tocontentformat": "Формат серіалізації контенту totext.", + "apihelp-compare-param-prop": "Які уривки інформації отримати.", + "apihelp-compare-paramvalue-prop-diff": "HTML різниці версій.", + "apihelp-compare-paramvalue-prop-diffsize": "Розмір HTML різниці версій, у байтах.", + "apihelp-compare-paramvalue-prop-rel": "Іддентифікатори версій, які передують 'from' і йдуть після 'to', якщо такі взагалі існують.", + "apihelp-compare-paramvalue-prop-ids": "Ідентифікатори сторінки й версій 'from' і 'to'.", + "apihelp-compare-paramvalue-prop-title": "Назви сторінок версій 'from' і 'to'.", + "apihelp-compare-paramvalue-prop-user": "Ім'я користувача й ідентифікатор версій 'from' і 'to'.", + "apihelp-compare-paramvalue-prop-comment": "Опис редагування версій 'from' і 'to'.", + "apihelp-compare-paramvalue-prop-parsedcomment": "Опрацьований опис редагування версій 'from' і 'to'.", + "apihelp-compare-paramvalue-prop-size": "Розмір версій 'from' і 'to'.", "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.", - "apihelp-createaccount-description": "Створити новий обліковий запис користувача.", + "apihelp-createaccount-summary": "Створити новий обліковий запис користувача.", "apihelp-createaccount-param-preservestate": "Якщо запит [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] повернув істину для hasprimarypreservedstate, запити позначені як primary-required повинні бути пропущені. Якщо він повернув не порожнє значення для preservedusername, це ім'я користувача повинно бути використано для параметру username.", "apihelp-createaccount-example-create": "Почати процес створення користувача Example з паролем ExamplePassword.", "apihelp-createaccount-param-name": "Ім'я користувача.", @@ -82,10 +102,10 @@ "apihelp-createaccount-param-language": "Код мови для встановлення за замовчуванням для користувача (необов'язково, за замовчуванням — мова вмісту).", "apihelp-createaccount-example-pass": "Створити користувача testuser з паролем test123.", "apihelp-createaccount-example-mail": "Створити користувача testmailuser і надіслати на електронну пошту випадково-згенерований пароль.", - "apihelp-cspreport-description": "Використовується браузерами для повідомлення порушень Правил безпеки контенту (Content Security Policy). Цей модуль не повинен використовуватися, окрім випадків автоматичного використання веб-браузером для CSP-скарги.", + "apihelp-cspreport-summary": "Використовується браузерами для повідомлення порушень Правил безпеки контенту (Content Security Policy). Цей модуль не повинен використовуватися, окрім випадків автоматичного використання веб-браузером для CSP-скарги.", "apihelp-cspreport-param-reportonly": "Позначити як доповідь із моніторингової політики, не примусової політики", "apihelp-cspreport-param-source": "Що згенерувало CSP-заголовок, який запустив цю доповідь", - "apihelp-delete-description": "Вилучити сторінку.", + "apihelp-delete-summary": "Вилучити сторінку.", "apihelp-delete-param-title": "Назва сторінки для вилучення. Не можна використати разом з $1pageid.", "apihelp-delete-param-pageid": "ID-сторінки на вилучення. Не можна використати разом з $1title.", "apihelp-delete-param-reason": "Причина вилучення. Якщо не вказана, буде використано автоматично-згенеровану.", @@ -96,8 +116,8 @@ "apihelp-delete-param-oldimage": "Назва старого зображення на вилучення, як вказано у [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].", "apihelp-delete-example-simple": "Вилучити Main Page.", "apihelp-delete-example-reason": "Вилучити Main Page з причиною Preparing for move.", - "apihelp-disabled-description": "Цей модуль було вимкнено.", - "apihelp-edit-description": "Створювати і редагувати сторінки.", + "apihelp-disabled-summary": "Цей модуль було вимкнено.", + "apihelp-edit-summary": "Створювати і редагувати сторінки.", "apihelp-edit-param-title": "Назва сторінки для редагування. Не можна використати разом з $1pageid.", "apihelp-edit-param-pageid": "ID-сторінки для редагування. Не можна використати разом з $1title.", "apihelp-edit-param-section": "Номер розділу. 0 для вступного розділу, new для нового розділу.", @@ -128,13 +148,13 @@ "apihelp-edit-example-edit": "Редагувати сторінку", "apihelp-edit-example-prepend": "Додати зміст на початок сторінки", "apihelp-edit-example-undo": "Скасувати версії з 13579 по 13585 з автоматичним описом змін", - "apihelp-emailuser-description": "Надіслати електронного листа користувачеві", + "apihelp-emailuser-summary": "Надіслати електронного листа користувачеві", "apihelp-emailuser-param-target": "Користувач, якому відправляється електронний лист.", "apihelp-emailuser-param-subject": "Заголовок теми.", "apihelp-emailuser-param-text": "Тіло листа.", "apihelp-emailuser-param-ccme": "Надіслати копію цього повідомлення мені.", "apihelp-emailuser-example-email": "Відправити листа користувачу WikiSysop з текстом Content.", - "apihelp-expandtemplates-description": "Розгортає усі шаблони в межах вікірозмітки.", + "apihelp-expandtemplates-summary": "Розгортає усі шаблони в межах вікірозмітки.", "apihelp-expandtemplates-param-title": "Заголовок сторінки.", "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.", "apihelp-expandtemplates-param-revid": "ID версії, для {{REVISIONID}} і подібних змінних.", @@ -151,7 +171,7 @@ "apihelp-expandtemplates-param-includecomments": "Чи включати HTML-коментарі у результат.", "apihelp-expandtemplates-param-generatexml": "Дерево парсу XML вхідних даних (замінене на $1prop=parsetree).", "apihelp-expandtemplates-example-simple": "Розгорнути вікітекст {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "Повертає стрічку внеску користувача.", + "apihelp-feedcontributions-summary": "Повертає стрічку внеску користувача.", "apihelp-feedcontributions-param-feedformat": "Формат стрічки.", "apihelp-feedcontributions-param-user": "Для яких користувачів отримати внесок.", "apihelp-feedcontributions-param-namespace": "За яким простором назв фільтрувати внески.", @@ -164,7 +184,7 @@ "apihelp-feedcontributions-param-hideminor": "Приховати незначні редагування.", "apihelp-feedcontributions-param-showsizediff": "Показати різницю розміру між версіями.", "apihelp-feedcontributions-example-simple": "Вивести внесок для користувача Example.", - "apihelp-feedrecentchanges-description": "Видає стрічку нових редагувань.", + "apihelp-feedrecentchanges-summary": "Видає стрічку нових редагувань.", "apihelp-feedrecentchanges-param-feedformat": "Формат стрічки.", "apihelp-feedrecentchanges-param-namespace": "Простір назв, до якого обмежити результати.", "apihelp-feedrecentchanges-param-invert": "Усі простори назв, крім вибраного.", @@ -186,18 +206,18 @@ "apihelp-feedrecentchanges-param-categories_any": "Показати натомість лише зміни на сторінках у будь-якій з цих категорій.", "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.", "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.", - "apihelp-feedwatchlist-description": "Видає стрічку списку спостереження.", + "apihelp-feedwatchlist-summary": "Видає стрічку списку спостереження.", "apihelp-feedwatchlist-param-feedformat": "Формат стрічки.", "apihelp-feedwatchlist-param-hours": "Список сторінок, змінених за цю кількість годин від зараз.", "apihelp-feedwatchlist-param-linktosections": "За можливості, посилатися безпосередньо на змінені розділи.", "apihelp-feedwatchlist-example-default": "Показати стрічку списку спостереження.", "apihelp-feedwatchlist-example-all6hrs": "Показати всі зміни до спостережуваних сторінок за останні 6 годин.", - "apihelp-filerevert-description": "Повернути файл до старої версії.", + "apihelp-filerevert-summary": "Повернути файл до старої версії.", "apihelp-filerevert-param-filename": "Цільова назва файлу, без префіксу File:.", "apihelp-filerevert-param-comment": "Завантажити коментар.", "apihelp-filerevert-param-archivename": "Архівна назва версії, до якої повернути.", "apihelp-filerevert-example-revert": "Повернути Wiki.png до версії 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Відображати довідку для зазначених модулів.", + "apihelp-help-summary": "Відображати довідку для зазначених модулів.", "apihelp-help-param-modules": "Модулі, для яких відображати довідку (значення параметрів action і format або main). Можна вказати підмодулі через +.", "apihelp-help-param-submodules": "Включити довідку для підмодулів вказаного модуля.", "apihelp-help-param-recursivesubmodules": "Включити довідку для підмодулів рекурсивно.", @@ -209,12 +229,13 @@ "apihelp-help-example-recursive": "Уся довідка на одній сторінці.", "apihelp-help-example-help": "Довідка для самого модуля довідки.", "apihelp-help-example-query": "Довідка для двох підмодулів запитів.", - "apihelp-imagerotate-description": "Поворот одного або декількох зображень.", + "apihelp-imagerotate-summary": "Поворот одного або декількох зображень.", "apihelp-imagerotate-param-rotation": "Градуси для повороту зображення за годинниковою стрілкою.", "apihelp-imagerotate-param-tags": "Теги для застосування до запису в журналі завантажень.", "apihelp-imagerotate-example-simple": "Повернути File:Example.png на 90 градусів.", "apihelp-imagerotate-example-generator": "Повернути усі зображення у Category:Flip на 180 градусів.", - "apihelp-import-description": "Імпортувати сторінку з іншої вікі або з XML-файлу.\n\nЗважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра xml.", + "apihelp-import-summary": "Імпортувати сторінку з іншої вікі або з XML-файлу.", + "apihelp-import-extended-description": "Зважте, що HTTP POST має бути виконано як завантаження файлу (тобто з використанням даних різних частин/форм) під час надсилання файлу для параметра xml.", "apihelp-import-param-summary": "Підсумок імпорту записів журналу.", "apihelp-import-param-xml": "Завантажено XML-файл.", "apihelp-import-param-interwikisource": "Для інтервікі-імпорту: вікі, з якої імпортувати.", @@ -225,19 +246,20 @@ "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з $1namespace.", "apihelp-import-param-tags": "Змінити теги для застосування до запису в журналі імпорту і до нульової версії імпортованих сторінок.", "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.", - "apihelp-linkaccount-description": "Пов'язати обліковий запис третьої сторони з поточним користувачем.", + "apihelp-linkaccount-summary": "Пов'язати обліковий запис третьої сторони з поточним користувачем.", "apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з Example.", - "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nЦю дію треба використовувати лише в комбінації з [[Special:BotPasswords]]; використання для входу в основний обліковий запис застаріле і може ламатися без попередження. Щоб безпечно увійти в основний обліковий запис, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", - "apihelp-login-description-nobotpasswords": "Увійти й отримати куки автентифікації.\n\nЦя дія застаріла і може ламатися без попередження. Щоб безпечно входити в систему, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-summary": "Увійти в систему й отримати куки автентифікації.", + "apihelp-login-extended-description": "Цю дію треба використовувати лише в комбінації з [[Special:BotPasswords]]; використання для входу в основний обліковий запис застаріле і може ламатися без попередження. Щоб безпечно увійти в основний обліковий запис, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-extended-description-nobotpasswords": "Ця дія застаріла і може ламатися без попередження. Щоб безпечно входити в систему, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", "apihelp-login-param-name": "Ім'я користувача.", "apihelp-login-param-password": "Пароль.", "apihelp-login-param-domain": "Домен (необов'язково).", "apihelp-login-param-token": "Токен входу в систему, отриманий у першому запиті.", "apihelp-login-example-gettoken": "Отримати токен входу в систему.", "apihelp-login-example-login": "Увійти в систему.", - "apihelp-logout-description": "Вийти й очистити дані сесії.", + "apihelp-logout-summary": "Вийти й очистити дані сесії.", "apihelp-logout-example-logout": "Вийти з поточного облікового запису.", - "apihelp-managetags-description": "Виконати керівні завдання щодо зміни теґів.", + "apihelp-managetags-summary": "Виконати керівні завдання щодо зміни теґів.", "apihelp-managetags-param-operation": "Яку операцію виконати:\n;create:Створити нову мітку редагування для використання вручну.\n;delete:Вилучити мітку редагування з бази даних, включно з вилученням її з усіх версій, записів нових редагувань та записів журналів, де вона використана.\n;activate:Активувати мітку редагування, дозволивши користувачам застосовувати її вручну.\n;deactivate:Деактивувати мітку редагування, заборонивши користувачам застосовувати її вручну.", "apihelp-managetags-param-tag": "Мітка для створення, вилучення, активування чи деактивування. Для створення мітки, вона повинна не існувати. Для вилучення мітки, вона повинна існувати. Для активування мітки, вона повинна існувати і не використовуватися жодним розширенням. Для деактивування мітки, вона має бути жива і визначена вручну.", "apihelp-managetags-param-reason": "Необов'язкова причина створення, вилучення, активування чи деактивування мітки.", @@ -247,7 +269,7 @@ "apihelp-managetags-example-delete": "Вилучити мітку vandlaism з причиною Misspelt", "apihelp-managetags-example-activate": "Активувати мітку з назвою spam з причиною For use in edit patrolling", "apihelp-managetags-example-deactivate": "Деактивувати мітку з назвою spam з причиною No longer required", - "apihelp-mergehistory-description": "Об'єднання історій редагувань.", + "apihelp-mergehistory-summary": "Об'єднання історій редагувань.", "apihelp-mergehistory-param-from": "Назва сторінки, з якої буде приєднана історія редагувань. Не можна використовувати разом із $1fromid.", "apihelp-mergehistory-param-fromid": "ID сторінки, з якої буде приєднана історія редагувань. Не можна використовувати разом із $1from.", "apihelp-mergehistory-param-to": "Назва сторінки, до якої буде приєднана історія редагувань. Не можна використовувати разом із $1toid.", @@ -256,7 +278,7 @@ "apihelp-mergehistory-param-reason": "Причина об'єднання історій.", "apihelp-mergehistory-example-merge": "Приєднання всієї історії редагувань сторінки Oldpage до Newpage.", "apihelp-mergehistory-example-merge-timestamp": "Приєднання версій до 2015-12-31T04:37:41Z із Oldpage до Newpage.", - "apihelp-move-description": "Перейменувати сторінку.", + "apihelp-move-summary": "Перейменувати сторінку.", "apihelp-move-param-from": "Назва сторінки для перейменування. Не можна використати разом з $1fromid.", "apihelp-move-param-fromid": "ID сторінки для перейменування. Не можна використати разом з $1from.", "apihelp-move-param-to": "Назва сторінки, на яку перейменувати.", @@ -270,16 +292,17 @@ "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження", "apihelp-move-param-tags": "Змінити теги для застосування до запису в журналі перейменувань і до нульової версії цільової сторінки.", "apihelp-move-example-move": "Перейменувати Badtitle на Goodtitle без збереження перенаправлення.", - "apihelp-opensearch-description": "Шукати у вікі з використанням протоколу OpenSearch.", + "apihelp-opensearch-summary": "Шукати у вікі з використанням протоколу OpenSearch.", "apihelp-opensearch-param-search": "Рядок пошуку.", "apihelp-opensearch-param-limit": "Максимальна кількість результатів для виведення.", "apihelp-opensearch-param-namespace": "Простори назв, у яких шукати.", - "apihelp-opensearch-param-suggest": "Нічого не робити, якщо [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] хибний.", + "apihelp-opensearch-param-suggest": "Нічого не робити, якщо [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] хибний.", "apihelp-opensearch-param-redirects": "Як обробляти перенаправлення:\n;return:Видати саме перенаправлення.\n;resolve:Видати цільову сторінку. Може видати менше, ніж $1limit результат{{PLURAL:$1limit||и|ів}}.\nЗ історичних причин, за замовчуванням стоїть «return» для $1format=json і «resolve» — для інших форматів.", "apihelp-opensearch-param-format": "Формат виводу.", "apihelp-opensearch-param-warningsaserror": "Якщо при format=json з'являються попередження, видати помилку API замість того, щоб їх ігнорувати.", "apihelp-opensearch-example-te": "Знайти сторінки, що починаються з Te.", - "apihelp-options-description": "Змінити налаштування поточного користувача.\n\nМожна встановити лише опції, які зареєстровані у ядрі або в одному з інстальованих розширень, або опції з префіксом ключів userjs- (призначені для використання користувацькими скриптами).", + "apihelp-options-summary": "Змінити налаштування поточного користувача.", + "apihelp-options-extended-description": "Можна встановити лише опції, які зареєстровані у ядрі або в одному з інстальованих розширень, або опції з префіксом ключів userjs- (призначені для використання користувацькими скриптами).", "apihelp-options-param-reset": "Встановлює налаштування сайту за замовчуванням.", "apihelp-options-param-resetkinds": "Список типів опцій для перевстановлення, коли вказана опція $1reset.", "apihelp-options-param-change": "Список змін, відформатованих як назва=значення (напр., skin=vector). Якщо значення не вказане (навіть немає знака рівності) , напр., optionname|otheroption|…, опцію буде перевстановлено до її значення за замовчуванням. Якщо будь-яке зі значень містить символ вертикальної риски (|), використайте [[Special:ApiHelp/main#main/datatypes|альтернативний розділювач значень]] для коректного виконання операції.", @@ -288,7 +311,7 @@ "apihelp-options-example-reset": "Скинути всі налаштування.", "apihelp-options-example-change": "Змінити налаштування skin та hideminor.", "apihelp-options-example-complex": "Скинути всі налаштування, потім встановити skin та nickname.", - "apihelp-paraminfo-description": "Отримати інформацію про модулі API.", + "apihelp-paraminfo-summary": "Отримати інформацію про модулі API.", "apihelp-paraminfo-param-modules": "Список назв модулів (значення параметрів action і format або main). Можна вказати підмодулі через +, усі підмодулі через +* або усі підмодулі рекурсивно через +**.", "apihelp-paraminfo-param-helpformat": "Формат рядків довідки.", "apihelp-paraminfo-param-querymodules": "Список назв модулів запитів (значення параметра prop, meta або list). Використати $1modules=query+foo замість $1querymodules=foo.", @@ -297,7 +320,8 @@ "apihelp-paraminfo-param-formatmodules": "Список назв модулів форматування (значення параметра format). Використати натомість $1modules.", "apihelp-paraminfo-example-1": "Показати інформацію для [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]] та [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]].", "apihelp-paraminfo-example-2": "Показати інформацію про всі підмодулі [[Special:ApiHelp/query|action=query]].", - "apihelp-parse-description": "Аналізує вміст і видає парсер виходу.\n\nДив. різні prop-модулі [[Special:ApiHelp/query|action=query]], щоб отримати інформацію з поточної версії сторінки.\n\nЄ декілька способів вказати текст для аналізу:\n# Вказати сторінку або версію, використавши $1page, $1pageid або $1oldid.\n# Вказати безпосередньо, використавши $1text, $1title і $1contentmodel.\n# Вказати лише підсумок аналізу. $1prop повинен мати порожнє значення.", + "apihelp-parse-summary": "Аналізує вміст і видає парсер виходу.", + "apihelp-parse-extended-description": "Див. різні prop-модулі [[Special:ApiHelp/query|action=query]], щоб отримати інформацію з поточної версії сторінки.\n\nЄ декілька способів вказати текст для аналізу:\n# Вказати сторінку або версію, використавши $1page, $1pageid або $1oldid.\n# Вказати безпосередньо, використавши $1text, $1title і $1contentmodel.\n# Вказати лише підсумок аналізу. $1prop повинен мати порожнє значення.", "apihelp-parse-param-title": "Назва сторінки, якій належить текст. Якщо пропущена, має бути вказано $1contentmodel, а як назву буде вжито [[API]].", "apihelp-parse-param-text": "Текст для аналізу. Використати $1title або $1contentmodel для контролю моделі вмісту.", "apihelp-parse-param-summary": "Підсумок для аналізу.", @@ -329,6 +353,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено $1disablelimitreport.", "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено $1disablelimitreport.", "apihelp-parse-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "Виводить попередження, які з'явилися при обробці контенту.", + "apihelp-parse-param-wrapoutputclass": "CSS-клас для загортання в нього виводу парсера.", "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.", "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з $1text.", "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з $1prop=langlinks).", @@ -342,19 +368,20 @@ "apihelp-parse-param-preview": "Аналізувати у режимі попереднього перегляду.", "apihelp-parse-param-sectionpreview": "Аналізувати у режимі попереднього перегляду розділу (також вмикає попередній перегляд).", "apihelp-parse-param-disabletoc": "Пропустити зміст на виході.", + "apihelp-parse-param-useskin": "Застосувати вибрану тему оформлення до виводу парсера. Може вплинути на такі властивості: langlinks, headitems, modules, jsconfigvars, indicators.", "apihelp-parse-param-contentformat": "Формат серіалізації вмісту, використаний у вхідному тексті. Дійсний лише при використанні разом з $1text.", "apihelp-parse-param-contentmodel": "Модель вмісту вхідного тексту. Якщо пропущено, має бути вказано $1title, і за замовчуванням буде модель вказаного заголовка. Дійсне лише при використанні з $1text.", "apihelp-parse-example-page": "Аналізувати сторінку.", "apihelp-parse-example-text": "Аналізувати вікітекст.", "apihelp-parse-example-texttitle": "Аналізувати вікітекст, вказуючи назву сторінки.", "apihelp-parse-example-summary": "Аналізувати опис.", - "apihelp-patrol-description": "Відпатрулювати сторінку чи версію.", + "apihelp-patrol-summary": "Відпатрулювати сторінку чи версію.", "apihelp-patrol-param-rcid": "ID нещодавніх змін для патрулювання.", "apihelp-patrol-param-revid": "Ідентифікатор версії для патрулювання.", "apihelp-patrol-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі патрулювання.", "apihelp-patrol-example-rcid": "Відпатрулювати останню зміну.", "apihelp-patrol-example-revid": "Відпатрулювати версію.", - "apihelp-protect-description": "Змінити рівень захисту сторінки.", + "apihelp-protect-summary": "Змінити рівень захисту сторінки.", "apihelp-protect-param-title": "Заголовок сторінки для (зняття) захисту. Не може використовуватися разом із $1pageid.", "apihelp-protect-param-pageid": "ID сторінки для (зняття) захисту. Не може використовуватися разом з $1title.", "apihelp-protect-param-protections": "Список рівнів захисту у форматі action=level (напр., edit=sysop). Рівень all означає, що будь-хто може робити дію, тобто обмежень немає.\n\nПримітка: Обмеження на дії, яких нема в списку, буде знято.", @@ -367,12 +394,13 @@ "apihelp-protect-example-protect": "Захистити сторінку.", "apihelp-protect-example-unprotect": "Зняти захист зі сторінки, встановивши обмеження для all (тобто будь-хто зможе робити дії).", "apihelp-protect-example-unprotect2": "Зняти захист з сторінки, встановивши відсутність обмежень.", - "apihelp-purge-description": "Очистити кеш для вказаних заголовків.", + "apihelp-purge-summary": "Очистити кеш для вказаних заголовків.", "apihelp-purge-param-forcelinkupdate": "Оновити таблиці посилань.", "apihelp-purge-param-forcerecursivelinkupdate": "Оновити таблицю посилань, і оновити таблиці посилань для кожної сторінки, що використовує цю сторінку як шаблон.", "apihelp-purge-example-simple": "Очистити кеш Main Page і сторінки API.", "apihelp-purge-example-generator": "Очистити кеш перших десяти сторінок у головному просторі назв.", - "apihelp-query-description": "Вибірка даних з і про MediaWiki.\n\nУсі зміни даних у першу чергу мають використовувати запит на отримання токена, щоб запобігти зловживанням зі шкідливих сайтів.", + "apihelp-query-summary": "Вибірка даних з і про MediaWiki.", + "apihelp-query-extended-description": "Усі зміни даних у першу чергу мають використовувати запит на отримання токена, щоб запобігти зловживанням зі шкідливих сайтів.", "apihelp-query-param-prop": "Властивості, які потрібно отримати для запитуваних сторінок.", "apihelp-query-param-list": "Які списки отримати.", "apihelp-query-param-meta": "Які метадані отримати.", @@ -383,7 +411,7 @@ "apihelp-query-param-rawcontinue": "Видати сирі дані query-continue для продовження.", "apihelp-query-example-revisions": "Вибірка [[Special:ApiHelp/query+siteinfo|інформації про сайт]] та [[Special:ApiHelp/query+revisions|версій]] Main Page.", "apihelp-query-example-allpages": "Вибрати версії сторінок, які починаються з API/.", - "apihelp-query+allcategories-description": "Перерахувати всі категорії.", + "apihelp-query+allcategories-summary": "Перерахувати всі категорії.", "apihelp-query+allcategories-param-from": "Категорія, з якої почати перелічувати.", "apihelp-query+allcategories-param-to": "Категорія, на якій закінчити перелічувати.", "apihelp-query+allcategories-param-prefix": "Шукати усі назви категорій, які починаються з цього значення.", @@ -396,7 +424,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "Теґує категорії, приховані з __HIDDENCAT__.", "apihelp-query+allcategories-example-size": "Перерахувати категорії з інформацією про кількість сторінок у кожній.", "apihelp-query+allcategories-example-generator": "Отримати інформацію про саму сторінку категорії для категорій, що починаються з List.", - "apihelp-query+alldeletedrevisions-description": "Перерахувати усі вилучені версії за користувачем або у просторі назв.", + "apihelp-query+alldeletedrevisions-summary": "Перерахувати усі вилучені версії за користувачем або у просторі назв.", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Може використовуватися лише з $3user.", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Не може використовуватися з $3user.", "apihelp-query+alldeletedrevisions-param-start": "Часова мітка початку переліку.", @@ -408,11 +436,11 @@ "apihelp-query+alldeletedrevisions-param-user": "Перерахувати лише версії цього користувача.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Не перераховувати версії цього користувача.", "apihelp-query+alldeletedrevisions-param-namespace": "Перерахувати сторінки лише в цьому просторі назв.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Примітка: через [[mw:Manual:$wgMiserMode|«скупий режим»]], використання $1user і $1namespace одночасно можуть вилитися у видачу результатів менше ніж $1limit перед продовженням; в особливих випадках можуть видаватися нульові результати.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Примітка: через [[mw:Special:MyLanguage/Manual:$wgMiserMode|«скупий режим»]], використання $1user і $1namespace одночасно можуть вилитися у видачу результатів менше ніж $1limit перед продовженням; в особливих випадках можуть видаватися нульові результати.", "apihelp-query+alldeletedrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.", "apihelp-query+alldeletedrevisions-example-user": "Перерахувати останні 50 вилучених редагувань користувача Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Перерахувати останні 50 вилучених версій у головному просторі назв.", - "apihelp-query+allfileusages-description": "Перерахувати усі використання файлів, включно з тими, що не існують.", + "apihelp-query+allfileusages-summary": "Перерахувати усі використання файлів, включно з тими, що не існують.", "apihelp-query+allfileusages-param-from": "Назва файлу, з якої почати перераховувати.", "apihelp-query+allfileusages-param-to": "Назва файлу, якою закінчувати перераховувати.", "apihelp-query+allfileusages-param-prefix": "Шукати усі назви файлів, які починаються з цього значення.", @@ -426,7 +454,7 @@ "apihelp-query+allfileusages-example-unique": "Перерахувати унікальні назви файлів.", "apihelp-query+allfileusages-example-unique-generator": "Отримує всі назви файлів, позначаючи відсутні.", "apihelp-query+allfileusages-example-generator": "Отримує сторінки, на яких є файли.", - "apihelp-query+allimages-description": "Перерахувати усі зображення послідовно.", + "apihelp-query+allimages-summary": "Перерахувати усі зображення послідовно.", "apihelp-query+allimages-param-sort": "Властивість, за якою сортувати.", "apihelp-query+allimages-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+allimages-param-from": "Назва зображення, з якої почати перерахунок. Можна використати лише з $1sort=name.", @@ -446,7 +474,7 @@ "apihelp-query+allimages-example-recent": "Показати список нещодавно завантажених файлів, подібно до [[Special:NewFiles]].", "apihelp-query+allimages-example-mimetypes": "Показати список файлів з MIME-типом image/png або image/gif", "apihelp-query+allimages-example-generator": "Показати інформацію про 4 файли, що починаються на літеру T.", - "apihelp-query+alllinks-description": "Перераховувати всі посилання, які вказують на заданий простір назв.", + "apihelp-query+alllinks-summary": "Перераховувати всі посилання, які вказують на заданий простір назв.", "apihelp-query+alllinks-param-from": "Назва посилання, з якої почати перераховувати.", "apihelp-query+alllinks-param-to": "Назва посилання, якою закінчити перераховувати.", "apihelp-query+alllinks-param-prefix": "Шукати усі пов'язані назви, які починаються з цього значення.", @@ -461,7 +489,7 @@ "apihelp-query+alllinks-example-unique": "Перерахувати унікальні назви з посиланнями.", "apihelp-query+alllinks-example-unique-generator": "Отримує всі назви з посиланнями, позначаючи відсутні.", "apihelp-query+alllinks-example-generator": "Отримує сторінки, на яких є посилання.", - "apihelp-query+allmessages-description": "Видати повідомлення від цього сайту.", + "apihelp-query+allmessages-summary": "Видати повідомлення від цього сайту.", "apihelp-query+allmessages-param-messages": "Які повідомлення виводити. * (за замовчуванням) означає усі повідомлення.", "apihelp-query+allmessages-param-prop": "Які властивості отримати.", "apihelp-query+allmessages-param-enableparser": "Встановити увімкнення парсеру, це попередньо обробить вікітекст повідомлення (підставити магічні слова, розкрити шаблони тощо).", @@ -477,7 +505,7 @@ "apihelp-query+allmessages-param-prefix": "Видати повідомлення з цим префіксом.", "apihelp-query+allmessages-example-ipb": "Показати повідомлення, які починаються на ipb-.", "apihelp-query+allmessages-example-de": "Показати повідомлення august і mainpage німецькою.", - "apihelp-query+allpages-description": "Перераховувати всі сторінки послідовно в заданому просторі назв.", + "apihelp-query+allpages-summary": "Перераховувати всі сторінки послідовно в заданому просторі назв.", "apihelp-query+allpages-param-from": "Заголовок сторінки, з якого почати перелічувати.", "apihelp-query+allpages-param-to": "Заголовок сторінки, яким закінчувати перелічувати.", "apihelp-query+allpages-param-prefix": "Шукати усі назви сторінок, які починаються з цього значення.", @@ -495,7 +523,7 @@ "apihelp-query+allpages-example-B": "Показати список сторінок, які починаються на літеру B.", "apihelp-query+allpages-example-generator": "Показати інформацію про 4 сторінки, що починаються на літеру T.", "apihelp-query+allpages-example-generator-revisions": "Показати вміст перших двох сторінок, що не є перенаправленнями і починаються на Re.", - "apihelp-query+allredirects-description": "Перерахувати усі перенаправлення на простір назв.", + "apihelp-query+allredirects-summary": "Перерахувати усі перенаправлення на простір назв.", "apihelp-query+allredirects-param-from": "Назва перенаправлення, з якої почати перераховувати.", "apihelp-query+allredirects-param-to": "Назва перенаправлення, якою закінчувати перераховувати.", "apihelp-query+allredirects-param-prefix": "Шукати усі цільові сторінки, які починаються з цього значення.", @@ -512,7 +540,7 @@ "apihelp-query+allredirects-example-unique": "Перерахувати унікальні цільові сторінки.", "apihelp-query+allredirects-example-unique-generator": "Отримує всі цільові сторінки, позначаючи відсутні.", "apihelp-query+allredirects-example-generator": "Отримує сторінки, які містять перенаправлення.", - "apihelp-query+allrevisions-description": "Список усіх версій.", + "apihelp-query+allrevisions-summary": "Список усіх версій.", "apihelp-query+allrevisions-param-start": "Часова мітка, з якої почати перелік.", "apihelp-query+allrevisions-param-end": "Часова мітка закінчення переліку.", "apihelp-query+allrevisions-param-user": "Перерахувати лише версії цього користувача.", @@ -521,13 +549,13 @@ "apihelp-query+allrevisions-param-generatetitles": "Коли використовується як генератор, генерувати заголовки замість ідентифікаторів версій.", "apihelp-query+allrevisions-example-user": "Перерахувати останні 50 редагувань користувача Example.", "apihelp-query+allrevisions-example-ns-main": "Перерахувати перші 50 версій у головному просторі назв.", - "apihelp-query+mystashedfiles-description": "Отримати список файлів у сховку завантажень поточного користувача.", + "apihelp-query+mystashedfiles-summary": "Отримати список файлів у сховку завантажень поточного користувача.", "apihelp-query+mystashedfiles-param-prop": "Які властивості файлів отримати.", "apihelp-query+mystashedfiles-paramvalue-prop-size": "Отримати розмір файлу та виміри зображення.", "apihelp-query+mystashedfiles-paramvalue-prop-type": "Отримати MIME-тип та тип даних файлу.", "apihelp-query+mystashedfiles-param-limit": "Скільки файлів виводити.", "apihelp-query+mystashedfiles-example-simple": "Отримати ключі файлів (filekey), розміри файлів та піксельні виміри файлів у сховку завантажень поточного користувача.", - "apihelp-query+alltransclusions-description": "Список усіх включень (сторінки, вставлені з використанням {{x}}), включно з неіснуючими.", + "apihelp-query+alltransclusions-summary": "Список усіх включень (сторінки, вставлені з використанням {{x}}), включно з неіснуючими.", "apihelp-query+alltransclusions-param-from": "Назва включення, з якої почати перераховувати.", "apihelp-query+alltransclusions-param-to": "Назва включення, якою закінчити перераховувати.", "apihelp-query+alltransclusions-param-prefix": "Шукати усі включені назви, які починаються з цього значення.", @@ -542,7 +570,7 @@ "apihelp-query+alltransclusions-example-unique": "Перерахувати унікальні включені назв.", "apihelp-query+alltransclusions-example-unique-generator": "Отримує всі включені назви, позначаючи відсутні.", "apihelp-query+alltransclusions-example-generator": "Отримує сторінки, на яких є включення.", - "apihelp-query+allusers-description": "Перерахувати усіх зареєстрованих користувачів.", + "apihelp-query+allusers-summary": "Перерахувати усіх зареєстрованих користувачів.", "apihelp-query+allusers-param-from": "Ім'я користувача, з якого почати перелічувати.", "apihelp-query+allusers-param-to": "Ім'я користувача, на якому закінчити перелічувати.", "apihelp-query+allusers-param-prefix": "Шукати усіх користувачів, які починаються з цього значення.", @@ -563,13 +591,13 @@ "apihelp-query+allusers-param-activeusers": "Перерахувати лише користувачів, що були активні $1 {{PLURAL:$1|останній день|останні дні|останніх днів}}.", "apihelp-query+allusers-param-attachedwiki": "Із $1prop=centralids, також вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.", "apihelp-query+allusers-example-Y": "Перерахувати користувачів, починаючи з Y.", - "apihelp-query+authmanagerinfo-description": "Отримати інформацію про поточний стан автентифікації.", + "apihelp-query+authmanagerinfo-summary": "Отримати інформацію про поточний стан автентифікації.", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Перевірити, чи поточний стан автентифікації користувача є достатнім для даної конфіденційної операції.", "apihelp-query+authmanagerinfo-param-requestsfor": "Отримати інформацію про запити автентифікації, потрібні для даної дії автентифікації.", "apihelp-query+authmanagerinfo-example-login": "Вибірка запитів, що можуть бути використані при початку входу.", "apihelp-query+authmanagerinfo-example-login-merged": "Отримати запити, які можуть бути використані при початку входу, з об'єднаними полями форми.", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Перевірити чи автентифікація є достатньою для дії foo.", - "apihelp-query+backlinks-description": "Знайти усі сторінки, що посилаються на подану сторінку.", + "apihelp-query+backlinks-summary": "Знайти усі сторінки, що посилаються на подану сторінку.", "apihelp-query+backlinks-param-title": "Назва для пошуку. Не можна використати разом з $1pageid.", "apihelp-query+backlinks-param-pageid": "ID сторінки для пошуку. Не можна використати разом з $1title.", "apihelp-query+backlinks-param-namespace": "Простір назв для переліку.", @@ -579,7 +607,7 @@ "apihelp-query+backlinks-param-redirect": "Якщо сторінка, яка посилається, є перенаправленням, знайти всі сторінки, які посилаються на це перенаправлення, теж. Максимальний ліміт зменшується наполовину.", "apihelp-query+backlinks-example-simple": "Показати посилання на Main page.", "apihelp-query+backlinks-example-generator": "Отримати інформацію про сторінки, що посилаються на Main page.", - "apihelp-query+blocks-description": "Перерахувати усіх заблокованих користувачів і IP-адреси.", + "apihelp-query+blocks-summary": "Перерахувати усіх заблокованих користувачів і IP-адреси.", "apihelp-query+blocks-param-start": "Часова мітка, з якої почати перелік.", "apihelp-query+blocks-param-end": "Часова мітка закінчення переліку.", "apihelp-query+blocks-param-ids": "Вивести список заблокованих ID (необов'язково).", @@ -600,7 +628,7 @@ "apihelp-query+blocks-param-show": "Показувати лише елементи, які відповідають цим критеріям.\nНаприклад, щоб побачити лише незалежні блокування IP-адрес, встановіть $1show=ip|!temp.", "apihelp-query+blocks-example-simple": "Вивести список блокувань.", "apihelp-query+blocks-example-users": "Вивести список блокувань користувачів Alice та Bob.", - "apihelp-query+categories-description": "Перерахувати категорії, до яких сторінки належать.", + "apihelp-query+categories-summary": "Перерахувати категорії, до яких сторінки належать.", "apihelp-query+categories-param-prop": "Які додаткові властивості отримати для кожної категорії:", "apihelp-query+categories-paramvalue-prop-sortkey": "Додає ключ сортування (шістнадцятковий рядок) і префікс ключа сортування (людиночитна частина) для категорії.", "apihelp-query+categories-paramvalue-prop-timestamp": "Додає мітку часу, коли категорію було додано.", @@ -611,9 +639,9 @@ "apihelp-query+categories-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+categories-example-simple": "Отримати список категорій, до яких належить сторінка Albert Einstein.", "apihelp-query+categories-example-generator": "Отримати інформацію про усі категорії, використані на сторінці Albert Einstein.", - "apihelp-query+categoryinfo-description": "Видає інформацію про подані категорії.", + "apihelp-query+categoryinfo-summary": "Видає інформацію про подані категорії.", "apihelp-query+categoryinfo-example-simple": "Отримати інформацію про Category:Foo і Category:Bar.", - "apihelp-query+categorymembers-description": "Перерахувати усі сторінки у поданій категорії.", + "apihelp-query+categorymembers-summary": "Перерахувати усі сторінки у поданій категорії.", "apihelp-query+categorymembers-param-title": "Яку категорію вивести (обов'язково). Мусить включати префікс {{ns:category}}:. Не можна використати разом з $1pageid.", "apihelp-query+categorymembers-param-pageid": "ID сторінки категорії для виведення. Не можна використати разом з $1title.", "apihelp-query+categorymembers-param-prop": "Які відомості включати:", @@ -638,14 +666,15 @@ "apihelp-query+categorymembers-param-endsortkey": "Використати натомість $1endhexsortkey.", "apihelp-query+categorymembers-example-simple": "Отримати перші 10 сторінок у Category:Physics.", "apihelp-query+categorymembers-example-generator": "Отримати інформацію про перші 10 сторінок у Category:Physics.", - "apihelp-query+contributors-description": "Отримати список залогінених дописувачів і кількість анонімних дописувачів до сторінки.", + "apihelp-query+contributors-summary": "Отримати список залогінених дописувачів і кількість анонімних дописувачів до сторінки.", "apihelp-query+contributors-param-group": "Включати лише користувачів з даних груп. Не включає безумовні або автоматичні групи на зразок *, користувач або автопідтверджені.", "apihelp-query+contributors-param-excludegroup": "Виключати користувачів з даних груп. Не включає безумовні або автоматичні групи на зразок *, користувач або автопідтверджені.", "apihelp-query+contributors-param-rights": "Включати лише користувачів з даними правами. Не включає права, надані безумовними або автоматичними групами на зразок *, користувач або автопідтверджені.", "apihelp-query+contributors-param-excluderights": "Виключати користувачів з даними правами. Не включає права, надані безумовними або автоматичними групами на зразок *, користувач або автопідтверджені.", "apihelp-query+contributors-param-limit": "Скільки дописувачів виводити.", "apihelp-query+contributors-example-simple": "Показати дописувачів до сторінки Main Page.", - "apihelp-query+deletedrevisions-description": "Отримати інформацію про вилучену версію.\n\nМожна використати кількома способами:\n# Отримати вилучені версії набору сторінок, вказавши заголовки або ідентифікатори сторінок. Сортується за назвою і часовою міткою.\n# Отримати дані про набір вилучених версій, вказавши їх ID з ідентифікаторами версій. Сортується за ID версії.", + "apihelp-query+deletedrevisions-summary": "Отримати інформацію про вилучену версію.", + "apihelp-query+deletedrevisions-extended-description": "Можна використати кількома способами:\n# Отримати вилучені версії набору сторінок, вказавши заголовки або ідентифікатори сторінок. Сортується за назвою і часовою міткою.\n# Отримати дані про набір вилучених версій, вказавши їх ID з ідентифікаторами версій. Сортується за ID версії.", "apihelp-query+deletedrevisions-param-start": "Мітка часу, з якої почати перелік. Ігнорується, якщо обробляється список ідентифікаторів версій.", "apihelp-query+deletedrevisions-param-end": "Мітка часу, якою закінчити перелік. Ігнорується, якщо обробляється список ідентифікаторів версій.", "apihelp-query+deletedrevisions-param-tag": "Перерахувати лише версії, помічені цим теґом.", @@ -653,7 +682,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "Не перераховувати версії цього користувача.", "apihelp-query+deletedrevisions-example-titles": "Перерахувати вилучені версії сторінок Main Page і Talk:Main Page, з вмістом.", "apihelp-query+deletedrevisions-example-revids": "Вивести інформацію вилученої версії 123456.", - "apihelp-query+deletedrevs-description": "Перелічити вилучені версії.\n\nПрацює у трьох режимах:\n# Перелічити вилучені версії поданих назв, відсортованих за часовою міткою.\n# Перелічити вилучений внесок поданого користувача, відсортований за часовою міткою (без вказання заголовків).\n# Перелічити усі вилучені версії у поданому просторі назв, відсортовані за назвою та часовою міткою (без вказання заголовків, $1user не вказаний).\n\nОкремі параметри можуть застосовуватися в одному режимі й ігноруватися в іншому.", + "apihelp-query+deletedrevs-summary": "Перелічити вилучені версії.", + "apihelp-query+deletedrevs-extended-description": "Працює у трьох режимах:\n# Перелічити вилучені версії поданих назв, відсортованих за часовою міткою.\n# Перелічити вилучений внесок поданого користувача, відсортований за часовою міткою (без вказання заголовків).\n# Перелічити усі вилучені версії у поданому просторі назв, відсортовані за назвою та часовою міткою (без вказання заголовків, $1user не вказаний).\n\nОкремі параметри можуть застосовуватися в одному режимі й ігноруватися в іншому.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Режим|Режими}}: $2", "apihelp-query+deletedrevs-param-start": "Часова мітка початку переліку.", "apihelp-query+deletedrevs-param-end": "Часова мітка закінчення переліку.", @@ -671,14 +701,14 @@ "apihelp-query+deletedrevs-example-mode2": "Перерахувати останні 50 вилучених редагувань Bob (режим 2).", "apihelp-query+deletedrevs-example-mode3-main": "Перерахувати перші 50 вилучених версій у головному просторі назв (режим 3).", "apihelp-query+deletedrevs-example-mode3-talk": "Перерахувати перші 50 вилучених сторінок у просторі назв {{ns:talk}} (режим 3).", - "apihelp-query+disabled-description": "Цей модуль запитів було вимкнено.", - "apihelp-query+duplicatefiles-description": "Перерахувати усі файли, які є дублікатами поданих файлів з огляду на значення хешу.", + "apihelp-query+disabled-summary": "Цей модуль запитів було вимкнено.", + "apihelp-query+duplicatefiles-summary": "Перерахувати усі файли, які є дублікатами поданих файлів з огляду на значення хешу.", "apihelp-query+duplicatefiles-param-limit": "Скільки файлів-дублікатів виводити.", "apihelp-query+duplicatefiles-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+duplicatefiles-param-localonly": "Шукати лише файли у локальному репозиторії.", "apihelp-query+duplicatefiles-example-simple": "Шукати дублікати [[:File:Albert Einstein Head.jpg]].", "apihelp-query+duplicatefiles-example-generated": "Шукати дублікати усіх файлів.", - "apihelp-query+embeddedin-description": "Знайти всі сторінки, які вбудовують (включають) подану назву.", + "apihelp-query+embeddedin-summary": "Знайти всі сторінки, які вбудовують (включають) подану назву.", "apihelp-query+embeddedin-param-title": "Назва для пошуку. Не можна використати разом з $1pageid.", "apihelp-query+embeddedin-param-pageid": "ID сторінки для пошуку. Не можна використати разом з $1title.", "apihelp-query+embeddedin-param-namespace": "Простір назв для переліку.", @@ -687,13 +717,13 @@ "apihelp-query+embeddedin-param-limit": "Скільки всього сторінок виводити.", "apihelp-query+embeddedin-example-simple": "Показати сторінки, які включають Template:Stub.", "apihelp-query+embeddedin-example-generator": "Отримати інформацію про сторінки, які включають Template:Stub.", - "apihelp-query+extlinks-description": "Видати усі зовнішні URL (не інтервікі) з поданих сторінок.", + "apihelp-query+extlinks-summary": "Видати усі зовнішні URL (не інтервікі) з поданих сторінок.", "apihelp-query+extlinks-param-limit": "Скільки посилань виводити.", "apihelp-query+extlinks-param-protocol": "Протокол URL. Якщо пусто і вказано $1query, протокол http. Залиште пустими і це, і $1query, щоб перелічити усі зовнішні посилання.", "apihelp-query+extlinks-param-query": "Шукати рядок без протоколу. Корисно для перевірки, чи містить певна сторінка певне зовнішнє посилання.", "apihelp-query+extlinks-param-expandurl": "Розгорнути протокол-залежні URL за канонічним протоколом.", "apihelp-query+extlinks-example-simple": "Отримати список зовнішніх посилань на Main Page.", - "apihelp-query+exturlusage-description": "Перерахувати сторінки, які містять поданий URL.", + "apihelp-query+exturlusage-summary": "Перерахувати сторінки, які містять поданий URL.", "apihelp-query+exturlusage-param-prop": "Які відомості включати:", "apihelp-query+exturlusage-paramvalue-prop-ids": "Додає ID сторінки.", "apihelp-query+exturlusage-paramvalue-prop-title": "Додає заголовок і ID простору назв сторінки.", @@ -704,7 +734,7 @@ "apihelp-query+exturlusage-param-limit": "Скільки сторінок виводити.", "apihelp-query+exturlusage-param-expandurl": "Розгорнути протокол-залежні URL за канонічним протоколом.", "apihelp-query+exturlusage-example-simple": "Показати сторінки, які посилаються на http://www.mediawiki.org.", - "apihelp-query+filearchive-description": "Перерахувати всі вилучені файли послідовно.", + "apihelp-query+filearchive-summary": "Перерахувати всі вилучені файли послідовно.", "apihelp-query+filearchive-param-from": "Назва зображення, з якої почати перелічувати.", "apihelp-query+filearchive-param-to": "Назва зображення, якою закінчити перелічувати.", "apihelp-query+filearchive-param-prefix": "Шукати усі назви зображень, які починаються з цього значення.", @@ -726,10 +756,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Додає бітну глибину версії.", "apihelp-query+filearchive-paramvalue-prop-archivename": "Додає до імені версію архіву для неостаточного варіанту файлу.", "apihelp-query+filearchive-example-simple": "Показати список усіх вилучених файлів.", - "apihelp-query+filerepoinfo-description": "Видати мета-інформацію про репозиторії зображень, налаштовані на вікі.", - "apihelp-query+filerepoinfo-param-prop": "Які властивості репозиторію отримати (на деяких вікі може бути більше):\n;apiurl:URL до репозиторію API — корисне для отримання інформації про зображення з хосту.\n;name:Ключ репозиторію — використано в e.g. [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] і значення [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Людиночита назва репозиторію вікі.\n;rooturl:Корінний URL для шляху зображення.\n;local:Чи репозиторій локальний, чи ні.", + "apihelp-query+filerepoinfo-summary": "Видати мета-інформацію про репозиторії зображень, налаштовані на вікі.", + "apihelp-query+filerepoinfo-param-prop": "Які властивості репозиторію отримати (на деяких вікі може бути більше):\n;apiurl:URL до репозиторію API — корисне для отримання інформації про зображення з хосту.\n;name:Ключ репозиторію — використано в e.g. [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] і значення [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Людиночита назва репозиторію вікі.\n;rooturl:Корінний URL для шляху зображення.\n;local:Чи репозиторій локальний, чи ні.", "apihelp-query+filerepoinfo-example-simple": "Отримати інформацію про репозиторії файлів.", - "apihelp-query+fileusage-description": "Знайти всі сторінки, що використовують дані файли.", + "apihelp-query+fileusage-summary": "Знайти всі сторінки, що використовують дані файли.", "apihelp-query+fileusage-param-prop": "Які властивості отримати:", "apihelp-query+fileusage-paramvalue-prop-pageid": "ID кожної сторінки.", "apihelp-query+fileusage-paramvalue-prop-title": "Назва кожної сторінки.", @@ -739,7 +769,7 @@ "apihelp-query+fileusage-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.", "apihelp-query+fileusage-example-simple": "Отримати список сторінок, які використовують [[:File:Example.jpg]].", "apihelp-query+fileusage-example-generator": "Отримати інформацію про сторінки, які використовують [[:File:Example.jpg]].", - "apihelp-query+imageinfo-description": "Видає інформацію про файл й історію завантаження.", + "apihelp-query+imageinfo-summary": "Видає інформацію про файл й історію завантаження.", "apihelp-query+imageinfo-param-prop": "Яку інформацію отримати:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Додає мітку часу для завантаженої версії.", "apihelp-query+imageinfo-paramvalue-prop-user": "Додає користувача, який завантажив кожну версію файлу.", @@ -775,13 +805,13 @@ "apihelp-query+imageinfo-param-localonly": "Шукати лише файли у локальному репозиторії.", "apihelp-query+imageinfo-example-simple": "Вибрати інформацію про поточну версію [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageinfo-example-dated": "Вибрати інформацію про версії [[:File:Test.jpg]] від 2008 і раніше.", - "apihelp-query+images-description": "Видає усі файли, які містяться на вказаних сторінках.", + "apihelp-query+images-summary": "Видає усі файли, які містяться на вказаних сторінках.", "apihelp-query+images-param-limit": "Скільки файлів виводити.", "apihelp-query+images-param-images": "Перерахувати лише ці файли. Корисно для перевірки, чи певна сторінка має певний файл.", "apihelp-query+images-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+images-example-simple": "Отримати список файлів, використаних на [[Main Page]].", "apihelp-query+images-example-generator": "Отримати інформацію про всі файли, використані на [[Main Page]].", - "apihelp-query+imageusage-description": "Знайти всі сторінки, що використовують дану назву зображення.", + "apihelp-query+imageusage-summary": "Знайти всі сторінки, що використовують дану назву зображення.", "apihelp-query+imageusage-param-title": "Назва для пошуку. Не можна використати разом з $1pageid.", "apihelp-query+imageusage-param-pageid": "ID сторінки для пошуку. Не можна використати разом з $1title.", "apihelp-query+imageusage-param-namespace": "Простір назв для переліку.", @@ -791,7 +821,7 @@ "apihelp-query+imageusage-param-redirect": "Якщо сторінка, яка посилається, є перенаправленням, знайти всі сторінки, які посилаються на це перенаправлення, теж. Максимальний ліміт зменшується наполовину.", "apihelp-query+imageusage-example-simple": "Показати сторінки, які використовують [[:File:Albert Einstein Head.jpg]].", "apihelp-query+imageusage-example-generator": "Отримати інформацію про сторінки, які використовують [[:File:Albert Einstein Head.jpg]].", - "apihelp-query+info-description": "Отримати основні відомості про сторінку.", + "apihelp-query+info-summary": "Отримати основні відомості про сторінку.", "apihelp-query+info-param-prop": "Які додаткові властивості отримати:", "apihelp-query+info-paramvalue-prop-protection": "Вивести рівень захисту кожної сторінки.", "apihelp-query+info-paramvalue-prop-talkid": "Ідентифікатор сторінки обговорення для кожної сторінки, що не є обговоренням.", @@ -808,7 +838,8 @@ "apihelp-query+info-param-token": "Використати натомість [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-query+info-example-simple": "Отримати інформацію про сторінку Main Page.", "apihelp-query+info-example-protection": "Отримати загальну інформацію і дані про захист сторінки Main Page.", - "apihelp-query+iwbacklinks-description": "Знайти всі сторінки, які посилаються на дане інтервікі-посилання.\n\nМоже використовуватися, щоб знайти всі посилання з префіксом або всі посилання на назву (з даним префіксом). Без використання жодного параметра це, по суті, «всі інтервікі-посилання».", + "apihelp-query+iwbacklinks-summary": "Знайти всі сторінки, які посилаються на дане інтервікі-посилання.", + "apihelp-query+iwbacklinks-extended-description": "Може використовуватися, щоб знайти всі посилання з префіксом або всі посилання на назву (з даним префіксом). Без використання жодного параметра це, по суті, «всі інтервікі-посилання».", "apihelp-query+iwbacklinks-param-prefix": "Префікс для інтервікі.", "apihelp-query+iwbacklinks-param-title": "Інтервікі-посилання для пошуку. Повинно використовуватися з $1blprefix.", "apihelp-query+iwbacklinks-param-limit": "Скільки всього сторінок виводити.", @@ -818,7 +849,7 @@ "apihelp-query+iwbacklinks-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+iwbacklinks-example-simple": "Отримати сторінки, що посилаються на [[wikibooks:Test]].", "apihelp-query+iwbacklinks-example-generator": "Отримати інформацію про сторінки, що посилаються на [[wikibooks:Test]].", - "apihelp-query+iwlinks-description": "Видає усі інтервікі-посилання із вказаних сторінок.", + "apihelp-query+iwlinks-summary": "Видає усі інтервікі-посилання із вказаних сторінок.", "apihelp-query+iwlinks-param-url": "Чи отримувати повну URL-адресу (не може використовуватися з $1prop).", "apihelp-query+iwlinks-param-prop": "Які додаткові властивості отримати для кожного міжмовного посилання:", "apihelp-query+iwlinks-paramvalue-prop-url": "Додає повну URL-адресу.", @@ -827,7 +858,8 @@ "apihelp-query+iwlinks-param-title": "Інтервікі-посилання для пошуку. Повинно використовуватися з $1prefix.", "apihelp-query+iwlinks-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+iwlinks-example-simple": "Отримати інтервікі-посилання зі сторінки Main Page.", - "apihelp-query+langbacklinks-description": "Знайти всі сторінки, які посилаються на дане мовне посилання.\n\nМоже бути використано для пошуку всіх посилань з кодом мови або всіх посилань на назву (з урахуванням мови). \nБез жодного параметра це «усі мовні посилання».\n\nЗверніть увагу, що це може не розглядати мовні посилання, додані розширеннями.", + "apihelp-query+langbacklinks-summary": "Знайти всі сторінки, які посилаються на дане мовне посилання.", + "apihelp-query+langbacklinks-extended-description": "Може бути використано для пошуку всіх посилань з кодом мови або всіх посилань на назву (з урахуванням мови). \nБез жодного параметра це «усі мовні посилання».\n\nЗверніть увагу, що це може не розглядати мовні посилання, додані розширеннями.", "apihelp-query+langbacklinks-param-lang": "Мова мовного посилання.", "apihelp-query+langbacklinks-param-title": "Мовне посилання для пошуку. Мусить бути використане з $1lang.", "apihelp-query+langbacklinks-param-limit": "Скільки всього сторінок виводити.", @@ -837,7 +869,7 @@ "apihelp-query+langbacklinks-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+langbacklinks-example-simple": "Отримати сторінки, що посилаються на [[:fr:Test]].", "apihelp-query+langbacklinks-example-generator": "Отримати інформацію про сторінки, що посилаються на [[:fr:Test]].", - "apihelp-query+langlinks-description": "Видає усі міжмовні посилання із вказаних сторінок.", + "apihelp-query+langlinks-summary": "Видає усі міжмовні посилання із вказаних сторінок.", "apihelp-query+langlinks-param-limit": "Скільки мовних посилань виводити.", "apihelp-query+langlinks-param-url": "Чи отримувати повну URL-адресу (не може використовуватися з $1prop).", "apihelp-query+langlinks-param-prop": "Які додаткові властивості для отримання кожного із міжмовного посилання:", @@ -849,7 +881,7 @@ "apihelp-query+langlinks-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+langlinks-param-inlanguagecode": "Код мови для локалізованих назв мов.", "apihelp-query+langlinks-example-simple": "Отримати міжмовні посилання зі сторінки Main Page.", - "apihelp-query+links-description": "Видає усі посилання із вказаних сторінок.", + "apihelp-query+links-summary": "Видає усі посилання із вказаних сторінок.", "apihelp-query+links-param-namespace": "Показати посилання лише у цих просторах назв.", "apihelp-query+links-param-limit": "Скільки посилань виводити.", "apihelp-query+links-param-titles": "Перерахувати лише посилання на ці назви. Корисно для перевірки, чи певна сторінка посилається на певну назву.", @@ -857,7 +889,7 @@ "apihelp-query+links-example-simple": "Отримати посилання зі сторінки Main Page.", "apihelp-query+links-example-generator": "Отримати інформацію про сторінки посилань на сторінці Main Page.", "apihelp-query+links-example-namespaces": "Отримати посилання зі сторінки Main Page у просторах назв {{ns:user}} і {{ns:template}}.", - "apihelp-query+linkshere-description": "Знайти усі сторінки, що посилаються на подані сторінки.", + "apihelp-query+linkshere-summary": "Знайти усі сторінки, що посилаються на подані сторінки.", "apihelp-query+linkshere-param-prop": "Які властивості отримати:", "apihelp-query+linkshere-paramvalue-prop-pageid": "ID кожної сторінки.", "apihelp-query+linkshere-paramvalue-prop-title": "Назва кожної сторінки.", @@ -867,7 +899,7 @@ "apihelp-query+linkshere-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.", "apihelp-query+linkshere-example-simple": "Отримати список сторінок, що посилаються на [[Main Page]].", "apihelp-query+linkshere-example-generator": "Отримати інформацію про сторінки, що посилаються на [[Main Page]].", - "apihelp-query+logevents-description": "Отримати події з журналів.", + "apihelp-query+logevents-summary": "Отримати події з журналів.", "apihelp-query+logevents-param-prop": "Які властивості отримати:", "apihelp-query+logevents-paramvalue-prop-ids": "Додає ID події в журналі.", "apihelp-query+logevents-paramvalue-prop-title": "Додає назву сторінки події в журналі.", @@ -890,13 +922,13 @@ "apihelp-query+logevents-param-tag": "Перерахувати лише записи подій, помічені цим теґом.", "apihelp-query+logevents-param-limit": "Скільки всього виводити записів подій.", "apihelp-query+logevents-example-simple": "Перелічити останні подій в журналі.", - "apihelp-query+pagepropnames-description": "Перелічити усі назви властивостей сторінки, що використовуються у вікі.", + "apihelp-query+pagepropnames-summary": "Перелічити усі назви властивостей сторінки, що використовуються у вікі.", "apihelp-query+pagepropnames-param-limit": "Максимальна кількість назв для виведення.", "apihelp-query+pagepropnames-example-simple": "Отримати перші 10 назв властивостей.", - "apihelp-query+pageprops-description": "Дає різні властивості сторінки, визначені у вмісті сторінки.", + "apihelp-query+pageprops-summary": "Дає різні властивості сторінки, визначені у вмісті сторінки.", "apihelp-query+pageprops-param-prop": "Перерахувати лише ці властивості сторінки. ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] видає назви властивостей сторінки, що використовуються). Корисно для перевірки, чи сторінка використовує певну властивість сторінки.", "apihelp-query+pageprops-example-simple": "Отримати властивості для сторінок Main Page і MediaWiki.", - "apihelp-query+pageswithprop-description": "Перелічити усі сторінки, що використовують подану властивість сторінки.", + "apihelp-query+pageswithprop-summary": "Перелічити усі сторінки, що використовують подану властивість сторінки.", "apihelp-query+pageswithprop-param-propname": "Властивість сторі́нки, для якої перелічити сторінки́ ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] видає назви властивостей сторінки, що використовуються).", "apihelp-query+pageswithprop-param-prop": "Які відомості включати:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "Додає ID сторінки.", @@ -906,14 +938,15 @@ "apihelp-query+pageswithprop-param-dir": "У якому напрямку сортувати.", "apihelp-query+pageswithprop-example-simple": "Перелічити перші 10, що використовують {{DISPLAYTITLE:}}.", "apihelp-query+pageswithprop-example-generator": "Отримати додаткову інформацію про перші 10 сторінок, що використовують __NOTOC__.", - "apihelp-query+prefixsearch-description": "Виконати пошук назв сторінок за префіксом.\n\nНезважаючи на подібність назв, цей модуль не призначений для того, аби бути еквівалентом [[Special:PrefixIndex]]; щодо цього, перегляньте [[Special:ApiHelp/query+allpages|action=query&list=allpages]] із параметром apprefix. Мета цього модуля така ж, як і [[Special:ApiHelp/opensearch|action=opensearch]]: взяти текст, введений користувачем, і вивести найбільш відповідні назви. Залежно від програмної підоснови пошукової системи, сюди можуть також входити виправлення орфографії, уникнення перенаправлень чи інша евристика.", + "apihelp-query+prefixsearch-summary": "Виконати пошук назв сторінок за префіксом.", + "apihelp-query+prefixsearch-extended-description": "Незважаючи на подібність назв, цей модуль не призначений для того, аби бути еквівалентом [[Special:PrefixIndex]]; щодо цього, перегляньте [[Special:ApiHelp/query+allpages|action=query&list=allpages]] із параметром apprefix. Мета цього модуля така ж, як і [[Special:ApiHelp/opensearch|action=opensearch]]: взяти текст, введений користувачем, і вивести найбільш відповідні назви. Залежно від програмної підоснови пошукової системи, сюди можуть також входити виправлення орфографії, уникнення перенаправлень чи інша евристика.", "apihelp-query+prefixsearch-param-search": "Рядок пошуку.", "apihelp-query+prefixsearch-param-namespace": "Простори назв, у яких шукати.", "apihelp-query+prefixsearch-param-limit": "Максимальна кількість результатів для виведення.", "apihelp-query+prefixsearch-param-offset": "Кількість результатів, які пропустити.", "apihelp-query+prefixsearch-example-simple": "Шукати назви сторінок, які починаються з meaning.", "apihelp-query+prefixsearch-param-profile": "Профіль пошуку для використання.", - "apihelp-query+protectedtitles-description": "Вивести список усіх назв, захищених від створення.", + "apihelp-query+protectedtitles-summary": "Вивести список усіх назв, захищених від створення.", "apihelp-query+protectedtitles-param-namespace": "Перерахувати назви лише в цих просторах назв.", "apihelp-query+protectedtitles-param-level": "Перерахувати лише назви з цими рівням захисту.", "apihelp-query+protectedtitles-param-limit": "Скільки всього сторінок виводити.", @@ -929,18 +962,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "Додає рівень захисту.", "apihelp-query+protectedtitles-example-simple": "Вивести список захищених назв.", "apihelp-query+protectedtitles-example-generator": "Знайти посилання на захищені назви в основному просторі назв.", - "apihelp-query+querypage-description": "Отримати список, кий дає спеціальна сторінка на базі QueryPage.", + "apihelp-query+querypage-summary": "Отримати список, кий дає спеціальна сторінка на базі QueryPage.", "apihelp-query+querypage-param-page": "Назва спеціальної сторінки. Зважте, що чутлива до регістру.", "apihelp-query+querypage-param-limit": "Кількість результатів, які виводити.", "apihelp-query+querypage-example-ancientpages": "Видати результати з [[Special:Ancientpages]].", - "apihelp-query+random-description": "Отримати набір випадкових сторінок.\n\nСторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, Main Page є першою випадковою сторінкою у списку, List of fictional monkeys завжди буде другою, List of people on stamps of Vanuatu — третьою, і т. д.", + "apihelp-query+random-summary": "Отримати набір випадкових сторінок.", + "apihelp-query+random-extended-description": "Сторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, Main Page є першою випадковою сторінкою у списку, List of fictional monkeys завжди буде другою, List of people on stamps of Vanuatu — третьою, і т. д.", "apihelp-query+random-param-namespace": "Вивести сторінки лише у цих просторах назв.", "apihelp-query+random-param-limit": "Обмежити кількість випадкових сторінок, які буде видано.", "apihelp-query+random-param-redirect": "Використати натомість $1filterredir=redirects.", "apihelp-query+random-param-filterredir": "Як фільтрувати перенаправлення.", "apihelp-query+random-example-simple": "Отримати дві випадкові сторінки з основного простору назв.", "apihelp-query+random-example-generator": "Видати інформацію про дві випадкові сторінки з основного простору назв.", - "apihelp-query+recentchanges-description": "Перерахувати нещодавні зміни.", + "apihelp-query+recentchanges-summary": "Перерахувати нещодавні зміни.", "apihelp-query+recentchanges-param-start": "Часова мітка початку переліку.", "apihelp-query+recentchanges-param-end": "Часова мітка завершення переліку.", "apihelp-query+recentchanges-param-namespace": "Відфільтрувати до змін лише у цих просторах назв.", @@ -970,7 +1004,7 @@ "apihelp-query+recentchanges-param-generaterevisions": "Коли використовується як генератор, генерувати ідентифікатори версій замість заголовків. Записи нещодавніх редагувань без прив'язаних ID версій (наприклад, більшість записів журналів) не згенерують нічого.", "apihelp-query+recentchanges-example-simple": "Вивести нещодавні зміни.", "apihelp-query+recentchanges-example-generator": "Отримати інформацію про сторінки з недавніми невідпатрульованими змінами.", - "apihelp-query+redirects-description": "Видає усі перенаправлення на дані сторінки.", + "apihelp-query+redirects-summary": "Видає усі перенаправлення на дані сторінки.", "apihelp-query+redirects-param-prop": "Які властивості отримати:", "apihelp-query+redirects-paramvalue-prop-pageid": "Ідентифікатор сторінки кожного перенаправлення.", "apihelp-query+redirects-paramvalue-prop-title": "Назва кожного перенаправлення.", @@ -980,10 +1014,11 @@ "apihelp-query+redirects-param-show": "Показати лише елементи, які відповідають цим критеріям:\n;fragment:Показати лише перенаправлення з фрагментом.\n;!fragment:Показати лише перенаправлення без фрагмента.", "apihelp-query+redirects-example-simple": "Отримати список перенаправлень на [[Main Page]].", "apihelp-query+redirects-example-generator": "Отримати інформацію про всі перенаправлення на [[Main Page]].", - "apihelp-query+revisions-description": "Отримати інформацію про версію.\n\nМоже бути використано кількома способами:\n# Отримати дані про набір сторінок (останні версії), вказавши назви або ідентифікатори сторінок.\n# Отримати версії для однієї вказаної сторінки, використавши назви або ідентифікатори і початок, кінець чи ліміт.\n# Отримати дані про набір версій, встановивши їх ID й ідентифікатори версій.", + "apihelp-query+revisions-summary": "Отримати інформацію про версію.", + "apihelp-query+revisions-extended-description": "Може бути використано кількома способами:\n# Отримати дані про набір сторінок (останні версії), вказавши назви або ідентифікатори сторінок.\n# Отримати версії для однієї вказаної сторінки, використавши назви або ідентифікатори і початок, кінець чи ліміт.\n# Отримати дані про набір версій, встановивши їх ID й ідентифікатори версій.", "apihelp-query+revisions-paraminfo-singlepageonly": "Може використовуватися тільки з однією сторінкою (режим #2).", - "apihelp-query+revisions-param-startid": "З якого ID версії почати перелік.", - "apihelp-query+revisions-param-endid": "Зупинити перелік версій на цьому ID версії.", + "apihelp-query+revisions-param-startid": "Почати нумерацію з мітки часу цієї версії. Версія повинна існувати, але не обов'язково має належати до цієї сторінки.", + "apihelp-query+revisions-param-endid": "Зупинити нумерацію на мітці часу цієї версії. Ця версія повинна існувати, але не обов'язково мусить належати до цієї сторінки.", "apihelp-query+revisions-param-start": "З якої часової мітки версії почати перелік.", "apihelp-query+revisions-param-end": "Перелічувати до цієї часової мітки.", "apihelp-query+revisions-param-user": "Включати лише версій, зроблені цим користувачем.", @@ -1009,17 +1044,17 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "Проаналізований коментар користувача до версії.", "apihelp-query+revisions+base-paramvalue-prop-content": "Текст версії.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Мітки версії.", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту $1).", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Deprecated. Використовуйте натомість [[Special:ApiHelp/expandtemplates|action=expandtemplates]] або [[Special:ApiHelp/parse|action=parse]]. Синтаксичне дерево XML вмісту версії (передбачає модель вмісту $1).", "apihelp-query+revisions+base-param-limit": "Обмежити кількість версій, які буде видано.", - "apihelp-query+revisions+base-param-expandtemplates": "Розгорнути шаблони у вмісті версії (передбачає $1prop=content).", - "apihelp-query+revisions+base-param-generatexml": "Генерувати синтаксичне дерево XML для вмісту версії (передбачає $1prop=content; замінено на $1prop=parsetree).", - "apihelp-query+revisions+base-param-parse": "Аналізувати вміст версії (передбачає $1prop=content). З причин продуктивності, якщо використовується ця опція, $1limit встановлюється як 1.", + "apihelp-query+revisions+base-param-expandtemplates": "Використовуйте натомість [[Special:ApiHelp/expandtemplates|action=expandtemplates]]. Розгорнути шаблони у вмісті версії (передбачає $1prop=content).", + "apihelp-query+revisions+base-param-generatexml": "Використовуйте натомість [[Special:ApiHelp/expandtemplates|action=expandtemplates]] або [[Special:ApiHelp/parse|action=parse]]. Генерувати синтаксичне дерево XML для вмісту версії (передбачає $1prop=content; замінено на $1prop=parsetree).", + "apihelp-query+revisions+base-param-parse": "Використовуйте натомість [[Special:ApiHelp/parse|action=parse]]. Аналізувати вміст версії (передбачає $1prop=content). З причин продуктивності, якщо використовується ця опція, $1limit встановлюється як 1.", "apihelp-query+revisions+base-param-section": "Витягнути вміст лише розділу з цим номером.", - "apihelp-query+revisions+base-param-diffto": "ID версії, з якою порівняти кожну версію. Використайте prev, next і cur для попередньої, наступної та поточної версій відповідно.", - "apihelp-query+revisions+base-param-difftotext": "Текст, з яким порівняти кожну версію. Порівнює лише обмежену кількість версій. Перевизначає $1diffto. Якщо вказано $1section, лише ця версія буде порівняна з цим текстом.", - "apihelp-query+revisions+base-param-difftotextpst": "Виконати попередню трансформацію тексту перед виведенням дифу. Дійсне лише з використанням $1difftotext.", + "apihelp-query+revisions+base-param-diffto": "Використовуйте натомість [[Special:ApiHelp/compare|action=compare]]. ID версії, з якою порівняти кожну версію. Використайте prev, next і cur для попередньої, наступної та поточної версій відповідно.", + "apihelp-query+revisions+base-param-difftotext": "Використовуйте натомість [[Special:ApiHelp/compare|action=compare]]. Текст, з яким порівняти кожну версію. Порівнює лише обмежену кількість версій. Перевизначає $1diffto. Якщо вказано $1section, лише ця версія буде порівняна з цим текстом.", + "apihelp-query+revisions+base-param-difftotextpst": "Використовуйте натомість [[Special:ApiHelp/compare|action=compare]]. Виконати попередню трансформацію тексту перед виведенням дифу. Дійсне лише з використанням $1difftotext.", "apihelp-query+revisions+base-param-contentformat": "Формат серіалізації, використаний для $1difftotext й очікуваний для контенту-результату.", - "apihelp-query+search-description": "Виконати повнотекстовий пошук.", + "apihelp-query+search-summary": "Виконати повнотекстовий пошук.", "apihelp-query+search-param-search": "Шукати назви сторінок або вміст, що співпадає з цим значенням. Ви можете використати рядок пошуку для виклику спеціальних функцій пошуку, залежно від внутрішніх установок пошуку у вікі.", "apihelp-query+search-param-namespace": "Шукати лише в межах цих просторів назв.", "apihelp-query+search-param-what": "Який тип пошуку виконати.", @@ -1042,11 +1077,11 @@ "apihelp-query+search-param-limit": "Скільки всього сторінок виводити.", "apihelp-query+search-param-interwiki": "Включати інтервікі в результатах пошуку, якщо доступно.", "apihelp-query+search-param-backend": "Який бекенд пошуку використовувати, якщо не за замовчуванням.", - "apihelp-query+search-param-enablerewrites": "Включити внутрішнє переписування запиту. Деякі пошукові бекенди можуть переписати запит так, як, на його думку, він дасть кращі результати, наприклад, виправивши орфографічні помилки.", + "apihelp-query+search-param-enablerewrites": "Включити внутрішнє переписування запиту. Деякі пошукові бекенди можуть переписати запит так, щоб вони, теоретично, давали кращі результати, наприклад, виправивши орфографічні помилки.", "apihelp-query+search-example-simple": "Шукати meaning.", "apihelp-query+search-example-text": "Шукати в текстах meaning.", "apihelp-query+search-example-generator": "Отримати інформацію про сторінки, на яких знайдено meaning.", - "apihelp-query+siteinfo-description": "Видати загальну інформацію про сайт.", + "apihelp-query+siteinfo-summary": "Видати загальну інформацію про сайт.", "apihelp-query+siteinfo-param-prop": "Яку інформацію отримати:", "apihelp-query+siteinfo-paramvalue-prop-general": "Загальна системна інформація.", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Список зареєстрованих просторів назв та їхні канонічні назви.", @@ -1063,11 +1098,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).", "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Виводить список кодів мов, для яких увімкнено [[mw:LanguageConverter|LanguageConverter]], а також варіанти, підтримувані кожною з цих мов.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Виводить список кодів мов, для яких увімкнено [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а також варіанти, підтримувані кожною з цих мов.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Видає список усіх доступних тем оформлення (опціонально локалізовані з використанням $1inlanguagecode, в іншому разі — мовою вмісту).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Видає список теґів розширення парсеру.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Видає список гуків парсерних функцій.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Видає список усіх підписаних гуків (вміст [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Видає список усіх підписаних гуків (вміст [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "Видає список змінних ID.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "Видає список протоколів, дозволених у зовнішніх посиланнях.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Видає значення налаштувань користувача за замовчуванням.", @@ -1079,12 +1114,12 @@ "apihelp-query+siteinfo-example-simple": "Вибрати інформацію про сайт.", "apihelp-query+siteinfo-example-interwiki": "Отримати список локальних інтервікі-префіксів.", "apihelp-query+siteinfo-example-replag": "Перевірити поточне відставання реплікації.", - "apihelp-query+stashimageinfo-description": "Видає інформацію про приховані файли.", + "apihelp-query+stashimageinfo-summary": "Видає інформацію про приховані файли.", "apihelp-query+stashimageinfo-param-filekey": "Ключ, який ідентифікує попереднє завантаження, що було тимчасово приховане.", "apihelp-query+stashimageinfo-param-sessionkey": "Аліас для $1filekey, для зворотної сумісності.", "apihelp-query+stashimageinfo-example-simple": "Видає інформацію про прихований файл.", "apihelp-query+stashimageinfo-example-params": "Видає мініатюри для двох прихованих файлів.", - "apihelp-query+tags-description": "Перелічити мітки змін.", + "apihelp-query+tags-summary": "Перелічити мітки змін.", "apihelp-query+tags-param-limit": "Максимальна кількість міток у списку.", "apihelp-query+tags-param-prop": "Які властивості отримати:", "apihelp-query+tags-paramvalue-prop-name": "Додає назву мітки.", @@ -1095,7 +1130,7 @@ "apihelp-query+tags-paramvalue-prop-source": "Отримує джерела мітки, що може включати extension для визначених розширеннями міток і manual для міток, які користувачі можуть застосовувати вручну.", "apihelp-query+tags-paramvalue-prop-active": "І все ж позначка досі задіяна.", "apihelp-query+tags-example-simple": "Перелічити доступні мітки.", - "apihelp-query+templates-description": "Видає усі сторінки, які включені на вказаних сторінках.", + "apihelp-query+templates-summary": "Видає усі сторінки, які включені на вказаних сторінках.", "apihelp-query+templates-param-namespace": "Показати шаблони лише у цьому просторі назв.", "apihelp-query+templates-param-limit": "Скільки шаблонів виводити.", "apihelp-query+templates-param-templates": "Перерахувати лише ці шаблони. Корисно для перевірки, чи певна сторінка використовує певний шаблон.", @@ -1103,11 +1138,11 @@ "apihelp-query+templates-example-simple": "Отримати шаблони, використані на сторінці Main Page.", "apihelp-query+templates-example-generator": "Отримати інформацію про сторінки шаблонів, використаних на сторінці Main Page.", "apihelp-query+templates-example-namespaces": "Отримати сторінки у просторах назв {{ns:user}} і {{ns:template}}, які включені на сторінці Main Page.", - "apihelp-query+tokens-description": "Отримує токени для дій, що змінюють дані.", + "apihelp-query+tokens-summary": "Отримує токени для дій, що змінюють дані.", "apihelp-query+tokens-param-type": "Типи токена для запиту.", "apihelp-query+tokens-example-simple": "Отримати csrf-токен (за замовчуванням).", "apihelp-query+tokens-example-types": "Отримати токен спостереження і токен патрулювання.", - "apihelp-query+transcludedin-description": "Знайти усі сторінки, що включають подані сторінки.", + "apihelp-query+transcludedin-summary": "Знайти усі сторінки, що включають подані сторінки.", "apihelp-query+transcludedin-param-prop": "Які властивості отримати:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID кожної сторінки.", "apihelp-query+transcludedin-paramvalue-prop-title": "Назва кожної сторінки.", @@ -1117,7 +1152,7 @@ "apihelp-query+transcludedin-param-show": "Показати лише елементи, що відповідають цим критеріям:\n;redirect:Показати лише перенаправлення.\n;!redirect:Показати лише не перенаправлення.", "apihelp-query+transcludedin-example-simple": "Отримати список сторінок, що включають Main Page.", "apihelp-query+transcludedin-example-generator": "Отримати інформацію про сторінки, які включають Main Page.", - "apihelp-query+usercontribs-description": "Отримати всі редагування користувача.", + "apihelp-query+usercontribs-summary": "Отримати всі редагування користувача.", "apihelp-query+usercontribs-param-limit": "Максимальна кількість елементів внеску для виведення.", "apihelp-query+usercontribs-param-start": "З якої часової мітки виводити.", "apihelp-query+usercontribs-param-end": "До якої часової мітки виводити.", @@ -1136,12 +1171,12 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Додає прапорці редагування.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Відзначає патрульовані редагування.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Перелічує мітки редагування.", - "apihelp-query+usercontribs-param-show": "Показати лише елементи, що відповідають цим критеріям, наприклад, лише не незначні редагування: $2show=!minor.\n\nЯкщо вказано $2show=patrolled або $2show=!patrolled, версії, старіші ніж [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|секунда|секунди|секунд}}) не будуть показуватися.", + "apihelp-query+usercontribs-param-show": "Показати лише елементи, що відповідають цим критеріям, наприклад, лише не незначні редагування: $2show=!minor.\n\nЯкщо вказано $2show=patrolled або $2show=!patrolled, версії, старіші ніж [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|секунда|секунди|секунд}}) не будуть показуватися.", "apihelp-query+usercontribs-param-tag": "Перерахувати лише версії, помічені цим теґом.", "apihelp-query+usercontribs-param-toponly": "Виводити лише зміни, які є останньою версією.", "apihelp-query+usercontribs-example-user": "Показати внесок користувача Example.", "apihelp-query+usercontribs-example-ipprefix": "Показати внесок з усіх IP-адрес з префіксом 192.0.2..", - "apihelp-query+userinfo-description": "Отримати інформацію про поточного користувача.", + "apihelp-query+userinfo-summary": "Отримати інформацію про поточного користувача.", "apihelp-query+userinfo-param-prop": "Які саме відомості включати:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Позначає, чи поточний користувач заблокований, ким, з якої причини.", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Додає мітку messages, якщо у користувача є непроглянуті повідомлення.", @@ -1163,7 +1198,7 @@ "apihelp-query+userinfo-param-attachedwiki": "Із $1prop=centralids, вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.", "apihelp-query+userinfo-example-simple": "Отримати інформацію про поточного користувача.", "apihelp-query+userinfo-example-data": "Отримати додаткову інформацію про поточного користувача.", - "apihelp-query+users-description": "Отримати інформацію про список користувачів.", + "apihelp-query+users-summary": "Отримати інформацію про список користувачів.", "apihelp-query+users-param-prop": "Яку інформацію включити:", "apihelp-query+users-paramvalue-prop-blockinfo": "Мітки про те чи є користувач заблокованим, ким, і з якою причиною.", "apihelp-query+users-paramvalue-prop-groups": "Перелічує всі групи, до яких належить кожен з користувачів.", @@ -1181,7 +1216,7 @@ "apihelp-query+users-param-userids": "Список ідентифікаторів користувачів, щодо яких треба отримати інформацію.", "apihelp-query+users-param-token": "Використати натомість [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-query+users-example-simple": "Вивести інформацію для користувача Example.", - "apihelp-query+watchlist-description": "Отримати нещодавні зміни сторінок у списку спостереження поточного користувача.", + "apihelp-query+watchlist-summary": "Отримати нещодавні зміни сторінок у списку спостереження поточного користувача.", "apihelp-query+watchlist-param-allrev": "Включити декілька версій тієї з сторінки у поданому часовому діапазоні.", "apihelp-query+watchlist-param-start": "Часова мітка, з якої почати перелік.", "apihelp-query+watchlist-param-end": "Часова мітка завершення переліку.", @@ -1217,7 +1252,7 @@ "apihelp-query+watchlist-example-generator": "Видати інформацію про сторінку для нещодавно змінених сторінок у списку спостереження поточного користувача.", "apihelp-query+watchlist-example-generator-rev": "Вибрати інформацію про версію для усіх нещодавніх змін на сторінках у списку спостереження поточного користувача.", "apihelp-query+watchlist-example-wlowner": "Перелічити верхні версії для нещодавно змінених сторінок у списку спостереження користувача Example.", - "apihelp-query+watchlistraw-description": "Отримати усі сторінки у списку спостереження поточного користувача.", + "apihelp-query+watchlistraw-summary": "Отримати усі сторінки у списку спостереження поточного користувача.", "apihelp-query+watchlistraw-param-namespace": "Перерахувати сторінки лише в поданих просторах назв.", "apihelp-query+watchlistraw-param-limit": "Скільки всього видати результатів за один запит.", "apihelp-query+watchlistraw-param-prop": "Які додаткові властивості отримати:", @@ -1230,15 +1265,15 @@ "apihelp-query+watchlistraw-param-totitle": "Назва (з префіксом простору назв), якою закінчити перерахування.", "apihelp-query+watchlistraw-example-simple": "Перелічити сторінки у списку спостереження поточного користувача.", "apihelp-query+watchlistraw-example-generator": "Вибрати інформацію про сторінку для сторінок у списку спостереження поточного користувача.", - "apihelp-removeauthenticationdata-description": "Вилучити параметри автентифікації для поточного користувача.", + "apihelp-removeauthenticationdata-summary": "Вилучити параметри автентифікації для поточного користувача.", "apihelp-removeauthenticationdata-example-simple": "Спроба вилучити дані поточного користувача для FooAuthenticationRequest.", - "apihelp-resetpassword-description": "Відправити користувачу лист для відновлення пароля.", - "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]], щоб використовувати цей модуль.", + "apihelp-resetpassword-summary": "Відправити користувачу лист для відновлення пароля.", + "apihelp-resetpassword-extended-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]], щоб використовувати цей модуль.", "apihelp-resetpassword-param-user": "Користувача відновлено.", "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.", "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу Example.", "apihelp-resetpassword-example-email": "Надіслати лист для скидання пароля усім користувачам з адресою електронної пошти user@example.com.", - "apihelp-revisiondelete-description": "Вилучити або відновити версії.", + "apihelp-revisiondelete-summary": "Вилучити або відновити версії.", "apihelp-revisiondelete-param-type": "Тип здійснюваного вилучення версії.", "apihelp-revisiondelete-param-target": "Назва сторінки, версію якої вилучити, якщо вимагається для цього типу.", "apihelp-revisiondelete-param-ids": "Ідентифікатори версій, які слід вилучити.", @@ -1249,7 +1284,8 @@ "apihelp-revisiondelete-param-tags": "Теги для застосування до запису в журналі вилучень", "apihelp-revisiondelete-example-revision": "Приховати вміст версії 12345 сторінки Main Page.", "apihelp-revisiondelete-example-log": "Приховати всі дані у записі журналу 67890 з причиною BLP violation.", - "apihelp-rollback-description": "Скасувати останнє редагування цієї сторінки.\n\nЯкщо користувач, який редагував сторінку, зробив декілька редагувань підряд, їх усі буде відкочено.", + "apihelp-rollback-summary": "Скасувати останнє редагування цієї сторінки.", + "apihelp-rollback-extended-description": "Якщо користувач, який редагував сторінку, зробив декілька редагувань підряд, їх усі буде відкочено.", "apihelp-rollback-param-title": "Назва сторінки, у якій здійснити відкіт. Не може використовуватись разом з $1pageid.", "apihelp-rollback-param-pageid": "Ідентифікатор сторінки у якій здійснити відкіт. Не може використовуватись разом з $1title.", "apihelp-rollback-param-tags": "Теги, які будуть застосовані до відкоту.", @@ -1259,9 +1295,10 @@ "apihelp-rollback-param-watchlist": "Безумовно додати або вилучити сторінку із списку спостереження поточного користувача, використати налаштування, або не змінювати статус (не)спостереження.", "apihelp-rollback-example-simple": "Відкинути останні редагування сторінки Main Page здійснені користувачем Example.", "apihelp-rollback-example-summary": "Відкинути останні редагування сторінки Main Page здійснені IP-користувачем 192.0.2.5 з причиною Reverting vandalism, та позначити ці редагування та відкіт як редагування бота.", - "apihelp-rsd-description": "Експортувати як схему RSD (Really Simple Discovery).", + "apihelp-rsd-summary": "Експортувати як схему RSD (Really Simple Discovery).", "apihelp-rsd-example-simple": "Експортувати RSD-схему.", - "apihelp-setnotificationtimestamp-description": "Оновити часову мітку сповіщень для сторінок, що спостерігаються.\n\nЦе зачепить підсвічування змінених сторінок у списку спостереження та історії, а також надсилання електронного листа якщо опція налаштувань «{{int:tog-enotifwatchlistpages}}» увімкнена.", + "apihelp-setnotificationtimestamp-summary": "Оновити часову мітку сповіщень для сторінок, що спостерігаються.", + "apihelp-setnotificationtimestamp-extended-description": "Це зачепить підсвічування змінених сторінок у списку спостереження та історії, а також надсилання електронного листа якщо опція налаштувань «{{int:tog-enotifwatchlistpages}}» увімкнена.", "apihelp-setnotificationtimestamp-param-entirewatchlist": "Опрацювати всі сторінки, що спостерігаються.", "apihelp-setnotificationtimestamp-param-timestamp": "Часова мітка, яку вказати у якості часової мітки сповіщень.", "apihelp-setnotificationtimestamp-param-torevid": "Версія до якої вказати часову мітку сповіщень (лише одна сторінка).", @@ -1270,8 +1307,8 @@ "apihelp-setnotificationtimestamp-example-page": "Стерти статус сповіщень для Main page.", "apihelp-setnotificationtimestamp-example-pagetimestamp": "Встановити часову мітку сповіщень для Main page так, що всі редагування після 1 січня 2012 будуть виглядати як не переглянуті.", "apihelp-setnotificationtimestamp-example-allpages": "Стерти статус сповіщень для сторінок у просторі назв {{ns:user}}.", - "apihelp-setpagelanguage-description": "Змінити мову сторінки.", - "apihelp-setpagelanguage-description-disabled": "Зміна мови сторінки заборонена в цій вікі. \n\nУвімкніть [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], щоб використовувати цю дію.", + "apihelp-setpagelanguage-summary": "Змінити мову сторінки.", + "apihelp-setpagelanguage-extended-description-disabled": "Зміна мови сторінки заборонена в цій вікі. \n\nУвімкніть [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], щоб використовувати цю дію.", "apihelp-setpagelanguage-param-title": "Назва сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з $1pageid.", "apihelp-setpagelanguage-param-pageid": "Ідентифікатор сторінки, мову якої Ви хочете змінити. Не можна використовувати разом з $1title.", "apihelp-setpagelanguage-param-lang": "Код мови, якою треба замінити поточну мову сторінки. Використовуйте default, щоб встановити стандартну мову вмісту цієї вікі як мову сторінки.", @@ -1279,7 +1316,8 @@ "apihelp-setpagelanguage-param-tags": "Змінити теги для застосування до запису в журналі, який буде результатом цієї дії.", "apihelp-setpagelanguage-example-language": "Змінити мову сторінки Main Page на «баскська».", "apihelp-setpagelanguage-example-default": "Змінити мову сторінки з ідентифікатором 123 на стандартну мову вмісту вікі.", - "apihelp-stashedit-description": "Підготувати редагування в загальний кеш.\n\nЦе призначено для використання через AJAX з форми редагування, щоб поліпшити продуктивність збереження сторінки.", + "apihelp-stashedit-summary": "Підготувати редагування в загальний кеш.", + "apihelp-stashedit-extended-description": "Це призначено для використання через AJAX з форми редагування, щоб поліпшити продуктивність збереження сторінки.", "apihelp-stashedit-param-title": "Назва редагованої сторінки.", "apihelp-stashedit-param-section": "Номер розділу. 0 для вступного розділу, new для нового розділу.", "apihelp-stashedit-param-sectiontitle": "Назва нового розділу.", @@ -1289,7 +1327,7 @@ "apihelp-stashedit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.", "apihelp-stashedit-param-baserevid": "Ідентифікатор базової версії.", "apihelp-stashedit-param-summary": "Змінити опис.", - "apihelp-tag-description": "Додати або вилучити зміни міток з окремих версій або записів журналу.", + "apihelp-tag-summary": "Додати або вилучити зміни міток з окремих версій або записів журналу.", "apihelp-tag-param-rcid": "Один або більше ідентифікаторів останніх змін, до яких додати або вилучити мітки.", "apihelp-tag-param-revid": "Один або більше ідентифікатор з якого додати або вилучити мітку.", "apihelp-tag-param-logid": "Один або більше ідентифікатор запису журналу з якого вилучити або додати мітку.", @@ -1299,11 +1337,12 @@ "apihelp-tag-param-tags": "Теги для застосування до запису в журналі, що буде створений в результаті цієї дії.", "apihelp-tag-example-rev": "Додати мітку vandalism до версії з ідентифікатором 123 без вказання причини", "apihelp-tag-example-log": "Вилучити мітку spam з запису журналу з ідентифікатором 123 з причиною Wrongly applied", - "apihelp-tokens-description": "Отримати жетони для дій пов'язаних зі зміною даних.\n\nЦей модуль застарів на користь [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", + "apihelp-tokens-summary": "Отримати жетони для дій пов'язаних зі зміною даних.", + "apihelp-tokens-extended-description": "Цей модуль застарів на користь [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-tokens-param-type": "Які типи жетонів запитати.", "apihelp-tokens-example-edit": "Отримати жетон редагування (за замовчуванням).", "apihelp-tokens-example-emailmove": "Отримати жетон електронної пошти та жетон перейменування.", - "apihelp-unblock-description": "Розблокувати користувача.", + "apihelp-unblock-summary": "Розблокувати користувача.", "apihelp-unblock-param-id": "Ідентифікатор блоку чи розблокування (отриманий через list=blocks). Не може бути використано разом із $1user або $1userid.", "apihelp-unblock-param-user": "Ім'я користувача, IP-адреса чи IP-діапазон до розблокування. Не може бути використано разом із $1id або $1userid.", "apihelp-unblock-param-userid": "Ідентифікатор користувача до розблокування. Не може бути використано разом із $1id або $1user.", @@ -1311,7 +1350,8 @@ "apihelp-unblock-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі блокувань.", "apihelp-unblock-example-id": "Зняти блокування з ідентифікатором #105.", "apihelp-unblock-example-user": "Розблокувати користувача Bob з причиною Sorry Bob.", - "apihelp-undelete-description": "Відновити версії вилученої сторінки.\n\nСписок вилучених версій (включено з часовими мітками) може бути отримано через [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], а список ідентифікаторів вилучених файлів може бути отримано через [[Special:ApiHelp/query+filearchive|list=filearchive]].", + "apihelp-undelete-summary": "Відновити версії вилученої сторінки.", + "apihelp-undelete-extended-description": "Список вилучених версій (включено з часовими мітками) може бути отримано через [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], а список ідентифікаторів вилучених файлів може бути отримано через [[Special:ApiHelp/query+filearchive|list=filearchive]].", "apihelp-undelete-param-title": "Назва сторінки, яку слід відновити.", "apihelp-undelete-param-reason": "Причина відновлення.", "apihelp-undelete-param-tags": "Змінити теги, що мають бути застосовані до запису в журналі вилучень.", @@ -1320,9 +1360,10 @@ "apihelp-undelete-param-watchlist": "Безумовно додати або вилучити сторінку із списку спостереження поточного користувача, використати налаштування, або не змінювати статус (не)спостереження.", "apihelp-undelete-example-page": "Відновити сторінку Main Page.", "apihelp-undelete-example-revisions": "Відновити дві версії сторінки Main Page.", - "apihelp-unlinkaccount-description": "Вилучити пов'язаний обліковий запис третьої сторони з поточного користувача.", + "apihelp-unlinkaccount-summary": "Вилучити пов'язаний обліковий запис третьої сторони з поточного користувача.", "apihelp-unlinkaccount-example-simple": "Здійснити спробу вилучити посилання поточного користувача для провайдера, асоційованого з FooAuthenticationRequest.", - "apihelp-upload-description": "Завантажити файл, або отримати статус завантажень у процесі.\n\nДоступні декілька методів:\n* Завантажити вміст файлу напряму, використовуючи параметр $1file.\n* Завантажити файл шматками, використовуючи параметри $1filesize, $1chunk, та $1offset.\n* Змусити сервер Медіавікі отримати файл за URL, використовуючи параметр $1url.\n* Завершити раніше розпочате завантаження, яке не вдалось через попередження, використовуючи параметр $1filekey.\nЗауважте, що HTTP POST повинен бути здійснений як завантаження файлу (наприклад, використовуючи multipart/form-data)", + "apihelp-upload-summary": "Завантажити файл, або отримати статус завантажень у процесі.", + "apihelp-upload-extended-description": "Доступні декілька методів:\n* Завантажити вміст файлу напряму, використовуючи параметр $1file.\n* Завантажити файл шматками, використовуючи параметри $1filesize, $1chunk, та $1offset.\n* Змусити сервер Медіавікі отримати файл за URL, використовуючи параметр $1url.\n* Завершити раніше розпочате завантаження, яке не вдалось через попередження, використовуючи параметр $1filekey.\nЗауважте, що HTTP POST повинен бути здійснений як завантаження файлу (наприклад, використовуючи multipart/form-data)", "apihelp-upload-param-filename": "Цільова назва файлу.", "apihelp-upload-param-comment": "Коментар завантаження. Також використовується як початковий текст сторінок для нових файлів, якщо $1text не вказано.", "apihelp-upload-param-tags": "Змінити теги, які будуть застосовані до запису журналу завантажень та відповідної версії в історії редагувань сторінки файлу.", @@ -1342,7 +1383,7 @@ "apihelp-upload-param-checkstatus": "Отримувати статус завантаження лише для даного ключа файлу.", "apihelp-upload-example-url": "Завантаження з URL.", "apihelp-upload-example-filekey": "Завершити завантаження, що не вдалось через попередження.", - "apihelp-userrights-description": "Змінити членство користувача у групах.", + "apihelp-userrights-summary": "Змінити членство користувача у групах.", "apihelp-userrights-param-user": "Ім'я користувача.", "apihelp-userrights-param-userid": "Ідентифікатор користувача.", "apihelp-userrights-param-add": "Додати користувача до цих груп. Якщо він вже є членом групи, оновити термін дії членства.", @@ -1353,14 +1394,15 @@ "apihelp-userrights-example-user": "Додати користувача FooBot до групи bot та вилучити із груп sysop та bureaucrat.", "apihelp-userrights-example-userid": "Додати користувача з ідентифікатором 123 до групи bot та вилучити із груп sysop та bureaucrat.", "apihelp-userrights-example-expiry": "Додати користувача SometimeSysop в групу sysop на 1 місяць.", - "apihelp-validatepassword-description": "Перевірити пароль на предмет відповідності політикам вікі щодо паролів.\n\nРезультати перевірки вказуються як Good якщо пароль прийнятний, Change якщо пароль може використовуватись для входу, але його треба змінити, і Invalid — якщо пароль використовувати не можна.", + "apihelp-validatepassword-summary": "Перевірити пароль на предмет відповідності політикам вікі щодо паролів.", + "apihelp-validatepassword-extended-description": "Результати перевірки вказуються як Good якщо пароль прийнятний, Change якщо пароль може використовуватись для входу, але його треба змінити, і Invalid — якщо пароль використовувати не можна.", "apihelp-validatepassword-param-password": "Пароль до перевірки.", "apihelp-validatepassword-param-user": "Ім'я користувача, для використання при тестуванні створення облікового запису. Вказаний користувач не повинен існувати.", "apihelp-validatepassword-param-email": "Адреса електронної пошти, для використання при тестуванні створення облікового запису.", "apihelp-validatepassword-param-realname": "Справжнє ім'я, для використання при тестуванні створення облікового запису.", "apihelp-validatepassword-example-1": "Перевірити пароль foobar для поточного користувача.", "apihelp-validatepassword-example-2": "Перевірити пароль qwerty для створення користувача Example.", - "apihelp-watch-description": "Додати або вилучити сторінки з списку спостереження поточного користувача.", + "apihelp-watch-summary": "Додати або вилучити сторінки з списку спостереження поточного користувача.", "apihelp-watch-param-title": "Сторінки до додання/вилучення. Використовуйте $1titles натомість.", "apihelp-watch-param-unwatch": "Якщо вказано, сторінку буде вилучено зі списку спостереження замість додання до нього.", "apihelp-watch-example-watch": "Спостерігати за сторінкою Main Page.", @@ -1368,24 +1410,25 @@ "apihelp-watch-example-generator": "Додати перші декілька сторінок основного простору назв до списку спостереження.", "apihelp-format-example-generic": "Повернути результат запиту у форматі $1.", "apihelp-format-param-wrappedhtml": "Повернути візуально пристосований HTML та пов'язані модулі ResourceLoader як об'єкт JSON.", - "apihelp-json-description": "Вивести дані у форматі JSON.", + "apihelp-json-summary": "Вивести дані у форматі JSON.", "apihelp-json-param-callback": "Якщо вказано, огортає вивід викликом даної функції. З міркувань безпеки, усі специфічні до користувача дані буде утримано.", "apihelp-json-param-utf8": "Якщо вказано, кодує більшість (але не всі) не-ASCII символів як UTF-8, замість заміни їх шістнадцятковими екрануючими послідовностями. За замовчуванням коли formatversion не є 1.", "apihelp-json-param-ascii": "Якщо вказано, кодує всі не-ASCII використовуючи шістнадцяткові екрануючі послідовності. За замовчуванням коли formatversion є 1.", "apihelp-json-param-formatversion": "Форматування виводу:\n;1:Формат зворотної сумісності (булеви XML-стилю, * ключі для вузлів вмісту тощо).\n;2:Експериментальний сучасний формат. Деталі можуть змінюватись.\n;latest:Використовувати найостанніший формат (наразі 2). Може змінюватись без попередження.", - "apihelp-jsonfm-description": "Вивести дані у форматі JSON (вивід відформатованого коду за допомогою HTML).", - "apihelp-none-description": "Нічого не виводити.", - "apihelp-php-description": "Виводити дані у форматі серіалізованого PHP.", + "apihelp-jsonfm-summary": "Вивести дані у форматі JSON (вивід відформатованого коду за допомогою HTML).", + "apihelp-none-summary": "Нічого не виводити.", + "apihelp-php-summary": "Виводити дані у форматі серіалізованого PHP.", "apihelp-php-param-formatversion": "Форматування виводу:\n;1:Формат зворотної сумісності (булеви XML-стилю, * ключі для вузлів вмісту тощо).\n;2:Експериментальний сучасний формат. Деталі можуть змінюватись.\n;latest:Використовувати найостанніший формат (наразі 2). Може змінюватись без попередження.", - "apihelp-phpfm-description": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).", - "apihelp-rawfm-description": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).", - "apihelp-xml-description": "Виводити дані у форматі XML.", + "apihelp-phpfm-summary": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).", + "apihelp-rawfm-summary": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).", + "apihelp-xml-summary": "Виводити дані у форматі XML.", "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:MediaWiki}}, що закінчується на .xsl.", "apihelp-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.", - "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).", + "apihelp-xmlfm-summary": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).", "api-format-title": "Результат запиту до API MediaWiki", - "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра format, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть format=$2.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.", - "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.", + "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра format, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть format=$2.\n\nДив. [[mw:Special:MyLanguage/API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.", + "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:Special:MyLanguage/API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.", + "api-format-prettyprint-header-hyperlinked": "Це — HTML-репрезентація формату $1. HTML добрий для виправлення помилок, але непридатний для використання додатків.\n\nВкажіть параметр format, щоб змінити формат виводу. Щоб побачити репрезентацію формату $1 не у формі HTML, вкажіть [$3 format=$2].\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку API]], щоб дізнатися більше.", "api-format-prettyprint-status": "Відповідь повернеться із HTTP-статусом $1 $2.", "api-pageset-param-titles": "Список назв над якими працювати.", "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.", @@ -1433,8 +1476,8 @@ "api-help-param-default-empty": "За замовчуванням: (пусто)", "api-help-param-token": "Токен «$1» отримано з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Для сумісності, приймається також токен, використаний у користувацькому веб-інтерфейсі.", - "api-help-param-disabled-in-miser-mode": "Вимкнено через [[mw:Manual:$wgMiserMode|скупий режим]].", - "api-help-param-limited-in-miser-mode": "Примітка: через [[mw:Manual:$wgMiserMode|«скупий режим»]], використання цього може вилитися у видачу результатів менше ніж $1limit перед продовженням; в особливих випадках можуть видаватися нульові результати.", + "api-help-param-disabled-in-miser-mode": "Вимкнено через [[mw:Special:MyLanguage/Manual:$wgMiserMode|скупий режим]].", + "api-help-param-limited-in-miser-mode": "Примітка: через [[mw:Special:MyLanguage/Manual:$wgMiserMode|«скупий режим»]], використання цього може вилитися у видачу результатів менше ніж $1limit перед продовженням; в особливих випадках можуть видаватися нульові результати.", "api-help-param-direction": "У якому напрямку перелічувати:\n;newer:Спочатку найстарші. Примітка: $1start має бути перед $1end.\n;older:Спочатку найновіші (за замовчуванням). Примітка: $1start має бути перед $1end.", "api-help-param-continue": "Коли доступно більше результатів, використовуйте це, щоб продовжити.", "api-help-param-no-description": "(без опису)", @@ -1499,7 +1542,6 @@ "apierror-changeauth-norequest": "Не вдалося створити запит на зміну.", "apierror-chunk-too-small": "Мінімальний розмір шматка становить $1 {{PLURAL:$1|байт|байти|байтів}} для некінцевих шматків.", "apierror-cidrtoobroad": "$1 CIDR-діапазони, ширші ніж /$2, недозволені.", - "apierror-compare-inputneeded": "Назва, ідентифікатор сторінки, або номер версії потрібні як для параметра from, так і для to.", "apierror-contentserializationexception": "Невдача серіалізації вмісту: $1", "apierror-contenttoobig": "Наданий Вами вміст перевищує ліміт у $1 {{PLURAL:$1|кілобайт|кілобайти|кілобайтів}} розміру сторінки.", "apierror-copyuploadbaddomain": "Завантаження за URL-адресою недозволені з цього домену.", @@ -1580,6 +1622,7 @@ "apierror-notarget": "Ви не вказали дійсної цілі для цієї дії.", "apierror-notpatrollable": "Версія r$1 не може бути відпатрульована, оскільки вона надто стара.", "apierror-nouploadmodule": "Не встановлено модуля завантаження.", + "apierror-offline": "Не вдалося продовжити через проблеми з підключенням до мережі. Перевірте підключення до інтернету й спробуйте ще раз.", "apierror-opensearch-json-warnings": "Попередження не можуть бути представлені у форматі OpenSearch JSON.", "apierror-pagecannotexist": "Простір назв не дозволяє фактичних сторінок.", "apierror-pagedeleted": "Цю сторінку було вилучено після того, як Ви отримали її мітку часу.", @@ -1604,6 +1647,7 @@ "apierror-revdel-mutuallyexclusive": "Одне й те ж поле не може використовуватись у hide і show водночас.", "apierror-revdel-needtarget": "Для цього типу RevDel необхідна цільова назва.", "apierror-revdel-paramneeded": "Щонайменше одне значення необхідне для hide та/або show.", + "apierror-revisions-badid": "Для параметра $1 не знайдено жодної версії.", "apierror-revisions-norevids": "Параметр revids не можна використовувати з опціями списку ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, і $1end).", "apierror-revisions-singlepage": "Було використано titles, pageids або генератор для постачання декількох сторінок, але параметри $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, і $1end можуть використовуватися тільки на одній сторінці.", "apierror-revwrongpage": "r$1 не є версією сторінки $2.", @@ -1628,6 +1672,7 @@ "apierror-stashzerolength": "Довжина файлу дорівнює нулю, і його не можна зберегти у сховку: $1.", "apierror-systemblocked": "Вас автоматично заблоковано MediaWiki.", "apierror-templateexpansion-notwikitext": "Розширення шаблонів підтримується лише для вмісту у форматі вікірозмітки. $1 використовує контентну модель $2.", + "apierror-timeout": "Сервер не відповів протягом відведеного на це часу.", "apierror-toofewexpiries": "$1 {{PLURAL:$1|мітка часу завершення була надана|мітки часу завершення були надані|міток часу завершення було надано}}, тоді як {{PLURAL:$2|потрібна була $2 така мітка|потрібні були $2 таких мітки|потрібно було $2 таких міток}}.", "apierror-unknownaction": "Вказана дія, $1, нерозпізнана.", "apierror-unknownerror-editpage": "Невідома помилка EditPage: $1.", diff --git a/includes/api/i18n/vi.json b/includes/api/i18n/vi.json index 4a4989f4c7..c3fd889a59 100644 --- a/includes/api/i18n/vi.json +++ b/includes/api/i18n/vi.json @@ -10,7 +10,7 @@ "apihelp-main-param-action": "Tác vụ để thực hiện.", "apihelp-main-param-format": "Định dạng của dữ liệu được cho ra.", "apihelp-main-param-uselang": "Ngôn ngữ để sử dụng cho các bản dịch thông điệp. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] với siprop=languages trả về một danh sách các mã ngôn ngữ, hoặc định rõ user để sử dụng ngôn ngữ của người dùng hiện tại, hoặc định rõ content để sử dụng ngôn ngữ nội dung của wiki này.", - "apihelp-block-description": "Cấm người dùng.", + "apihelp-block-summary": "Cấm người dùng.", "apihelp-block-param-user": "Tên truy nhập, địa chỉ IP hoặc dãi IP mà bạn muốn chặn.", "apihelp-block-param-reason": "Lý do cấm.", "apihelp-block-param-nocreate": "Cấm tạo tài khoản.", @@ -20,7 +20,7 @@ "apihelp-checktoken-param-type": "Kiểu dấu hiệu được kiểm thử.", "apihelp-checktoken-param-token": "Dấu hiệu để kiểm thử.", "apihelp-checktoken-example-simple": "Kiểm thử dấu hiệu csrf có hợp lệ hay không.", - "apihelp-clearhasmsg-description": "Xóa cờ hasmsg cho người dùng hiện tại.", + "apihelp-clearhasmsg-summary": "Xóa cờ hasmsg cho người dùng hiện tại.", "apihelp-clearhasmsg-example-1": "Xóa cờ hasmsg cho người dùng hiện tại", "apihelp-compare-param-fromtitle": "So sánh tiêu đề đầu tiên.", "apihelp-compare-param-fromid": "So sánh ID trang đầu tiên.", @@ -29,7 +29,7 @@ "apihelp-compare-param-toid": "So sánh ID tran thứ hai.", "apihelp-compare-param-torev": "So sánh sửa đổi thứ hai.", "apihelp-compare-example-1": "Tạo một so sánh giữa phiên bản 1 và 2.", - "apihelp-createaccount-description": "Mở tài khoản mới.", + "apihelp-createaccount-summary": "Mở tài khoản mới.", "apihelp-createaccount-param-name": "Tên người dùng.", "apihelp-createaccount-param-password": "Mật khẩu (được bỏ qua nếu $1mailpassword được đặt).", "apihelp-createaccount-param-domain": "Tên miền để xác thực bên ngoài (tùy chọn).", @@ -41,15 +41,15 @@ "apihelp-createaccount-param-language": "Mã ngôn ngữ để thiết lập mặc định cho người dùng (tùy chọn, mặc định là ngôn ngữ nội dung).", "apihelp-createaccount-example-pass": "Tạo người dùng người kiểm tra với mật khẩu test123.", "apihelp-createaccount-example-mail": "Tạo người dùng người dùng thử gửi và gửi một mật khẩu được tạo ra ngẫu nhiên qua thư điện tử.", - "apihelp-delete-description": "Xóa trang.", + "apihelp-delete-summary": "Xóa trang.", "apihelp-delete-param-title": "Xóa tiêu đề của trang. Không thể sử dụng cùng với $1pageid.", "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với $1title.", "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của người dùng hiện tại.", "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của người dùng hiện tại.", "apihelp-delete-example-simple": "Xóa Main Page.", "apihelp-delete-example-reason": "Xóa Main Page với lý do Preparing for move.", - "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.", - "apihelp-edit-description": "Tạo và sửa trang.", + "apihelp-disabled-summary": "Mô đun này đã bị vô hiệu hóa.", + "apihelp-edit-summary": "Tạo và sửa trang.", "apihelp-edit-param-section": "Số phần trang. 0 là phần đầu; new là phần mới.", "apihelp-edit-param-sectiontitle": "Tên của phần mới.", "apihelp-edit-param-text": "Nội dung trang.", @@ -68,18 +68,18 @@ "apihelp-edit-example-edit": "Sửa đổi trang", "apihelp-edit-example-prepend": "Đưa __NOTOC__ vào đầu trang", "apihelp-edit-example-undo": "Lùi sửa các thay đổi 13579–13585 và tự động tóm lược", - "apihelp-emailuser-description": "Gửi thư cho người dùng.", + "apihelp-emailuser-summary": "Gửi thư cho người dùng.", "apihelp-emailuser-param-target": "Người dùng để gửi thư điện tử cho.", "apihelp-emailuser-param-subject": "Tiêu đề bức thư.", "apihelp-emailuser-param-text": "Nội dung bức thư.", "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.", "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên WikiSysop với văn bản Content.", - "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.", + "apihelp-expandtemplates-summary": "Bung tất cả bản mẫu trong văn bản wiki.", "apihelp-expandtemplates-param-title": "Tên trang.", "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "Wikitext mở rộng.", "apihelp-expandtemplates-paramvalue-prop-parsetree": "Cây phân tích XML của đầu vào.", - "apihelp-feedcontributions-description": "Trả về nguồn cấp đóng góp người dùng.", + "apihelp-feedcontributions-summary": "Trả về nguồn cấp đóng góp người dùng.", "apihelp-feedcontributions-param-feedformat": "Định dạng nguồn cấp.", "apihelp-feedcontributions-param-user": "Người dùng nhận được những đóng góp gì.", "apihelp-feedcontributions-param-namespace": "Không gian tên để lọc các khoản đóng góp của.", @@ -90,7 +90,7 @@ "apihelp-feedcontributions-param-toponly": "Chỉ hiện các phiên bản mới nhất.", "apihelp-feedcontributions-param-newonly": "Chỉ hiện các sửa đổi tạo trang.", "apihelp-feedcontributions-example-simple": "Trả về các đóng góp của người dùng Ví dụ.", - "apihelp-feedrecentchanges-description": "Trả về nguồn cấp thay đổi gần đây.", + "apihelp-feedrecentchanges-summary": "Trả về nguồn cấp thay đổi gần đây.", "apihelp-feedrecentchanges-param-feedformat": "Định dạng nguồn cấp.", "apihelp-feedrecentchanges-param-days": "Ngày để giới hạn kết quả.", "apihelp-feedrecentchanges-param-limit": "Số kết quả lớn nhất để cho ra.", @@ -103,20 +103,20 @@ "apihelp-feedrecentchanges-param-tagfilter": "Lọc theo thẻ.", "apihelp-feedrecentchanges-example-simple": "Xem thay đổi gần đây.", "apihelp-feedrecentchanges-example-30days": "Hiển thị các thay đổi trong 30 ngày gần đây.", - "apihelp-feedwatchlist-description": "Trả về nguồn cấp danh sách theo dõi.", + "apihelp-feedwatchlist-summary": "Trả về nguồn cấp danh sách theo dõi.", "apihelp-feedwatchlist-param-feedformat": "Định dạng nguồn cấp.", "apihelp-feedwatchlist-example-default": "Xem nguồn cấp danh sách theo dõi.", - "apihelp-filerevert-description": "Phục hồi một tập tin sang một phiên bản cũ.", + "apihelp-filerevert-summary": "Phục hồi một tập tin sang một phiên bản cũ.", "apihelp-filerevert-param-comment": "Tải lên bình luận.", "apihelp-filerevert-param-archivename": "Tên lưu trữ của bản sửa đổi để trở lại .", "apihelp-filerevert-example-revert": "Hoàn nguyên Wiki.png veef phiên bản 2011-03-05T15:27:40Z.", - "apihelp-help-description": "Hiển thị trợ giúp cho các mô-đun xác định.", + "apihelp-help-summary": "Hiển thị trợ giúp cho các mô-đun xác định.", "apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.", "apihelp-help-example-main": "Trợ giúp cho các mô-đun chính.", "apihelp-help-example-recursive": "Tất cả trợ giúp trong một trang", "apihelp-help-example-help": "Trợ giúp cho chính bản thân module trợ giúp", "apihelp-help-example-query": "Trợ giúp cho hai module con truy vấn", - "apihelp-imagerotate-description": "Xoay một hoặc nhiều hình ảnh.", + "apihelp-imagerotate-summary": "Xoay một hoặc nhiều hình ảnh.", "apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.", "apihelp-imagerotate-example-simple": "Xoay Tập tin:Ví dụ.jpg 90 độ.", "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong Thể loại:Búng 180 độ.", @@ -129,18 +129,18 @@ "apihelp-login-param-token": "Dấu hiệu đăng nhập được lấy trong yêu cầu đầu tiên.", "apihelp-login-example-gettoken": "Lấy dấu hiệu đăng nhập", "apihelp-login-example-login": "Đăng nhập", - "apihelp-logout-description": "Thoát ra và xóa dữ liệu phiên làm việc.", + "apihelp-logout-summary": "Thoát ra và xóa dữ liệu phiên làm việc.", "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại", - "apihelp-mergehistory-description": "Hợp nhất lịch sử trang.", + "apihelp-mergehistory-summary": "Hợp nhất lịch sử trang.", "apihelp-mergehistory-param-reason": "Lý do hợp nhất lịch sử.", - "apihelp-move-description": "Di chuyển trang.", + "apihelp-move-summary": "Di chuyển trang.", "apihelp-move-param-to": "Đặt tiêu đề để đổi tên trang.", "apihelp-move-param-reason": "Lý do đổi tên.", "apihelp-move-param-movetalk": "Đổi tên trang thảo luận, nếu nó tồn tại.", "apihelp-move-param-movesubpages": "Đổi tên trang con, nếu có thể áp dụng.", "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.", "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.", - "apihelp-opensearch-description": "Tìm kiếm trong wiki qua giao thức OpenSearch.", + "apihelp-opensearch-summary": "Tìm kiếm trong wiki qua giao thức OpenSearch.", "apihelp-opensearch-param-search": "Chuỗi tìm kiếm.", "apihelp-opensearch-param-limit": "Đa số kết quả để cho ra.", "apihelp-opensearch-param-namespace": "Không gian tên để tìm kiếm.", @@ -148,7 +148,7 @@ "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.", "apihelp-opensearch-example-te": "Tìm trang bắt đầu với Te.", "apihelp-options-example-reset": "Mặc định lại các tùy chọn", - "apihelp-paraminfo-description": "Lấy thông tin về các module API.", + "apihelp-paraminfo-summary": "Lấy thông tin về các module API.", "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.", "apihelp-parse-param-summary": "Lời tóm lược để phân tích.", "apihelp-parse-param-prop": "Những mẩu thông tin nào muốn có:", @@ -166,7 +166,7 @@ "apihelp-query-param-prop": "Các thuộc tính để lấy khi truy vấn các trang.", "apihelp-query-param-list": "Các danh sách để lấy.", "apihelp-query-param-meta": "Siêu dữ liệu để lấy.", - "apihelp-query+allcategories-description": "Liệt kê tất cả các thể loại.", + "apihelp-query+allcategories-summary": "Liệt kê tất cả các thể loại.", "apihelp-query+allcategories-param-from": "Chọn thể loại để bắt đầu đếm.", "apihelp-query+allcategories-param-to": "Chọn thể loại để dừng đếm.", "apihelp-query+allcategories-param-dir": "Hướng xếp loại.", @@ -192,14 +192,15 @@ "apihelp-query+logevents-param-limit": "Tổng cộng có bao nhiêu bài viết sự kiện được trả về.", "apihelp-query+transcludedin-param-limit": "Có bao nhiêu được trả về.", "apihelp-query+watchlist-param-limit": "Cả bao nhiêu kết quả được trả về trên mỗi yêu cầu.", - "apihelp-rollback-description": "Lùi lại sửa đổi cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã sửa đổi trang này nhiều lần, tất cả chúng sẽ được lùi lại cùng một lúc.", + "apihelp-rollback-summary": "Lùi lại sửa đổi cuối cùng của trang này.", + "apihelp-rollback-extended-description": "Nếu người dùng cuối cùng đã sửa đổi trang này nhiều lần, tất cả chúng sẽ được lùi lại cùng một lúc.", "apihelp-format-example-generic": "Cho ra kết quả truy vấn dưới dạng $1.", - "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.", - "apihelp-jsonfm-description": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).", - "apihelp-none-description": "Không cho ra gì.", - "apihelp-rawfm-description": "Cho ra dữ liệu bao gồm các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).", - "apihelp-xml-description": "Cho ra dữ liệu dưới dạng XML.", - "apihelp-xmlfm-description": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).", + "apihelp-json-summary": "Cho ra dữ liệu dưới dạng JSON.", + "apihelp-jsonfm-summary": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).", + "apihelp-none-summary": "Không cho ra gì.", + "apihelp-rawfm-summary": "Cho ra dữ liệu bao gồm các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).", + "apihelp-xml-summary": "Cho ra dữ liệu dưới dạng XML.", + "apihelp-xmlfm-summary": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).", "api-format-title": "Kết quả API MediaWiki", "api-help-title": "Trợ giúp về API MediaWiki", "api-help-main-header": "Mô đun chính", diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json index 731a9c0101..d8fbfe0ecb 100644 --- a/includes/api/i18n/zh-hans.json +++ b/includes/api/i18n/zh-hans.json @@ -15,20 +15,20 @@ "Zhxy 519", "御坂美琴", "RyRubyy", - "Umherirrender", "Apflu", "Hzy980512", "PhiLiP", "Arthur2e5", "損齋", "Myy730", - "D41D8CD98F" + "D41D8CD98F", + "Umherirrender" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n
    \n状态信息:本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n错误请求:当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n测试中:测试API请求的易用性,请参见[[Special:ApiSandbox]]。", + "apihelp-main-extended-description": "
    \n* [[mw:Special:MyLanguage/API:Main_page|文档]]\n* [[mw:Special:MyLanguage/API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n
    \n状态信息:本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n错误请求:当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API:错误与警告]]。\n\n测试中:测试API请求的易用性,请参见[[Special:ApiSandbox]]。", "apihelp-main-param-action": "要执行的操作。", "apihelp-main-param-format": "输出的格式。", - "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码maxlag会返回消息,例如等待$host中:延迟$lag秒。
    参见[[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。", + "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码maxlag会返回消息,例如等待$host中:延迟$lag秒。
    参见[[mw:Special:MyLanguage/Manual:Maxlag_parameter|手册:Maxlag参数]]以获取更多信息。", "apihelp-main-param-smaxage": "设置s-maxage HTTP缓存控制头至这些秒。错误不会缓存。", "apihelp-main-param-maxage": "设置max-age HTTP缓存控制头至这些秒。错误不会缓存。", "apihelp-main-param-assert": "如果设置为user就验证用户是否登录,或如果设置为bot就验证是否有机器人用户权限。", @@ -37,12 +37,12 @@ "apihelp-main-param-servedby": "包含保存结果请求的主机名。", "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。", "apihelp-main-param-responselanginfo": "包含在结果中用于uselang和errorlang的语言。", - "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配Origin标头中的原点之一,因此它已经设置为像https://zh.wikipedia.org或https://meta.wikimedia.org的东西。如果此参数不匹配Origin页顶,就返回403错误响应。如果此参数匹配Origin页顶并且起点被白名单,将设置Access-Control-Allow-Origin和Access-Control-Allow-Credentials开头。\n\n对于未验证的请求,会指定值*。这将导致Access-Control-Allow-Origin标头被设置,但Access-Control-Allow-Credentials将为false,且所有用户特定数据将受限制。", + "apihelp-main-param-origin": "当通过跨域名AJAX请求(CORS)访问API时,设置此作为起始域名。这必须包括在任何pre-flight请求中,并因此必须是请求的URI的一部分(而不是POST正文)。\n\n对于已验证的请求,这必须正确匹配Origin标头中的原点之一,因此它已经设置为像https://en.wikipedia.org或https://meta.wikimedia.org的东西。如果此参数不匹配Origin页顶,就返回403错误响应。如果此参数匹配Origin页顶并且起点被白名单,将设置Access-Control-Allow-Origin和Access-Control-Allow-Credentials开头。\n\n对于未验证的请求,会指定值*。这将导致Access-Control-Allow-Origin标头被设置,但Access-Control-Allow-Credentials将为false,且所有用户特定数据将受限制。", "apihelp-main-param-uselang": "用于消息翻译的语言。[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]与siprop=languages可返回语言代码列表,或指定user以使用当前用户的语言设置,或指定content以使用此wiki的内容语言。", "apihelp-main-param-errorformat": "用于警告和错误文本输出的格式。\n; plaintext:已移除HTML标签,并被替换实体的Wiki文本。\n; wikitext:未解析的wiki文本。\n; html:HTML。\n; raw:消息关键词和参数。\n; none:无文本输出,仅包含错误代码。\n; bc:在MediaWiki 1.29以前版本使用的格式。errorlang和errorsuselocal会被忽略。", "apihelp-main-param-errorlang": "用于警告和错误的语言。[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]带siprop=languages返回语言代码的列表,或指定content以使用此wiki的内容语言,或指定uselang以使用与uselang参数相同的值。", "apihelp-main-param-errorsuselocal": "如果指定,错误文本将使用来自{{ns:MediaWiki}}名字空间的本地自定义消息。", - "apihelp-block-description": "封禁一位用户。", + "apihelp-block-summary": "封禁一位用户。", "apihelp-block-param-user": "要封禁的用户、IP地址或IP地址段。不能与$1userid一起使用", "apihelp-block-param-userid": "要封禁的用户ID。不能与$1user一起使用。", "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如5 months或2 weeks)或绝对时间(例如2014-09-18T12:34:56Z)。如果设置为infinite、indefinite或never,封禁将无限期。", @@ -52,33 +52,53 @@ "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。", "apihelp-block-param-noemail": "阻止用户通过wiki发送电子邮件。(需要blockemail权限)。", "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要hideuser权限)。", - "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]])。", + "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]])。", "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。", "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。", "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。", "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因First strike。", "apihelp-block-example-user-complex": "无限期封禁用户Vandal,原因Vandalism,并阻止新账户创建和电子邮件发送。", - "apihelp-changeauthenticationdata-description": "更改当前用户的身份验证数据。", + "apihelp-changeauthenticationdata-summary": "更改当前用户的身份验证数据。", "apihelp-changeauthenticationdata-example-password": "尝试更改当前用户的密码至ExamplePassword。", - "apihelp-checktoken-description": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]检查令牌有效性。", + "apihelp-checktoken-summary": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]检查令牌有效性。", "apihelp-checktoken-param-type": "已开始测试的令牌类型。", "apihelp-checktoken-param-token": "要测试的令牌。", "apihelp-checktoken-param-maxtokenage": "令牌的最大允许年龄,以秒计。", "apihelp-checktoken-example-simple": "测试csrf令牌的有效性。", - "apihelp-clearhasmsg-description": "清除当前用户的hasmsg标记。", + "apihelp-clearhasmsg-summary": "清除当前用户的hasmsg标记。", "apihelp-clearhasmsg-example-1": "清除当前用户的hasmsg标记。", - "apihelp-clientlogin-description": "使用交互式流登录wiki。", + "apihelp-clientlogin-summary": "使用交互式流登录wiki。", "apihelp-clientlogin-example-login": "开始作为用户Example和密码ExamplePassword登录至wiki的过程。", "apihelp-clientlogin-example-login2": "在UI响应双因素验证后继续登录,补充OATHToken 987654。", - "apihelp-compare-description": "获取2个页面之间的差别。\n\n必须传递用于“from”和“to”的修订版本号、页面标题或页面 ID 。", + "apihelp-compare-summary": "获取两页面之间的差异。", + "apihelp-compare-extended-description": "必须传递“from”和“to”之间的修订版本号、页面标题、页面ID、文本或相关参考资料。", "apihelp-compare-param-fromtitle": "要比较的第一个标题。", "apihelp-compare-param-fromid": "要比较的第一个页面 ID。", "apihelp-compare-param-fromrev": "要比较的第一个修订版本。", + "apihelp-compare-param-fromtext": "使用该文本而不是由fromtitle、fromid或fromrev指定的修订版本内容。", + "apihelp-compare-param-frompst": "在fromtext执行预保存转变。", + "apihelp-compare-param-fromcontentmodel": "fromtext的内容模型。如果未指定,这将基于其他参数猜想。", + "apihelp-compare-param-fromcontentformat": "fromtext的内容序列化格式。", "apihelp-compare-param-totitle": "要比较的第二个标题。", "apihelp-compare-param-toid": "要比较的第二个页面 ID。", "apihelp-compare-param-torev": "要比较的第二个修订版本。", + "apihelp-compare-param-torelative": "使用与定义自fromtitle、fromid或fromrev的修订版本相关的修订版本。所有其他“to”的选项将被忽略。", + "apihelp-compare-param-totext": "使用该文本而不是由totitle、toid或torev指定的修订版本内容。", + "apihelp-compare-param-topst": "在totext执行预保存转换。", + "apihelp-compare-param-tocontentmodel": "totext的内容模型。如果未指定,这将基于其他参数猜想。", + "apihelp-compare-param-tocontentformat": "totext的内容序列化格式。", + "apihelp-compare-param-prop": "要获取的信息束。", + "apihelp-compare-paramvalue-prop-diff": "差异HTML。", + "apihelp-compare-paramvalue-prop-diffsize": "差异HTML的大小(字节)。", + "apihelp-compare-paramvalue-prop-rel": "“from”之前及“to”之后修订版本的修订ID,如果有。", + "apihelp-compare-paramvalue-prop-ids": "“from”和“to”修订版本的页面及修订ID。", + "apihelp-compare-paramvalue-prop-title": "“from”和“to”修订版本的页面标题。", + "apihelp-compare-paramvalue-prop-user": "“from”和“to”修订版本的用户名和ID。", + "apihelp-compare-paramvalue-prop-comment": "“from”和“to”修订版本的注释。", + "apihelp-compare-paramvalue-prop-parsedcomment": "“from”和“to”修订版本的已解析注释。", + "apihelp-compare-paramvalue-prop-size": "“from”和“to”修订版本的大小。", "apihelp-compare-example-1": "在版本1和2中创建差异。", - "apihelp-createaccount-description": "创建一个新用户账户。", + "apihelp-createaccount-summary": "创建一个新用户账户。", "apihelp-createaccount-param-preservestate": "如果[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]返回用于hasprimarypreservedstate的真值,标记为primary-required的请求应被忽略。如果它返回用于preservedusername的非空值,用户名必须用于username参数。", "apihelp-createaccount-example-create": "开始创建用户Example和密码ExamplePassword的过程。", "apihelp-createaccount-param-name": "用户名。", @@ -92,10 +112,10 @@ "apihelp-createaccount-param-language": "要为用户设置为默认值的语言代码(可选,默认为内容语言)。", "apihelp-createaccount-example-pass": "创建用户testuser和密码test123。", "apihelp-createaccount-example-mail": "创建用户testmailuser并电邮发送一个随机生成的密码。", - "apihelp-cspreport-description": "由浏览器使用以报告违反内容安全方针的内容。此模块应永不使用,除了在被CSP兼容的浏览器自动使用时。", + "apihelp-cspreport-summary": "由浏览器使用以报告违反内容安全方针的内容。此模块应永不使用,除了在被CSP兼容的浏览器自动使用时。", "apihelp-cspreport-param-reportonly": "标记作为来自监视方针的报告,而不是执行方针的报告", "apihelp-cspreport-param-source": "生成引发此报告的CSP标头的事物", - "apihelp-delete-description": "删除一个页面。", + "apihelp-delete-summary": "删除一个页面。", "apihelp-delete-param-title": "要删除的页面标题。不能与$1pageid一起使用。", "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与$1title一起使用。", "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。", @@ -106,8 +126,8 @@ "apihelp-delete-param-oldimage": "由[[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]]提供的要删除的旧图片名称。", "apihelp-delete-example-simple": "删除Main Page。", "apihelp-delete-example-reason": "删除Main Page,原因Preparing for move。", - "apihelp-disabled-description": "此模块已禁用。", - "apihelp-edit-description": "创建和编辑页面。", + "apihelp-disabled-summary": "此模块已禁用。", + "apihelp-edit-summary": "创建和编辑页面。", "apihelp-edit-param-title": "要编辑的页面标题。不能与$1pageid一起使用。", "apihelp-edit-param-pageid": "要编辑的页面的页面 ID。不能与$1title一起使用。", "apihelp-edit-param-section": "段落数。0用于首段,new用于新的段落。", @@ -138,13 +158,13 @@ "apihelp-edit-example-edit": "编辑一个页面。", "apihelp-edit-example-prepend": "页面中预置__NOTOC__。", "apihelp-edit-example-undo": "撤销修订版本13579至13585并自动填写编辑摘要。", - "apihelp-emailuser-description": "电子邮件联系一位用户。", + "apihelp-emailuser-summary": "电子邮件联系一位用户。", "apihelp-emailuser-param-target": "电子邮件的目标用户。", "apihelp-emailuser-param-subject": "主题页眉。", "apihelp-emailuser-param-text": "邮件正文。", "apihelp-emailuser-param-ccme": "给我发送一份该邮件的副本。", "apihelp-emailuser-example-email": "向用户WikiSysop发送邮件,带文字Content。", - "apihelp-expandtemplates-description": "展开维基文本中的所有模板。", + "apihelp-expandtemplates-summary": "展开wiki文本中的所有模板。", "apihelp-expandtemplates-param-title": "页面标题。", "apihelp-expandtemplates-param-text": "要转换的wiki文本。", "apihelp-expandtemplates-param-revid": "修订版本ID,用于{{REVISIONID}}和类似变体。", @@ -161,7 +181,7 @@ "apihelp-expandtemplates-param-includecomments": "输出时是否包含HTML注释。", "apihelp-expandtemplates-param-generatexml": "生成XML解析树(取代自$1prop=parsetree)。", "apihelp-expandtemplates-example-simple": "展开wiki文本{{Project:Sandbox}}。", - "apihelp-feedcontributions-description": "返回用户贡献纲要。", + "apihelp-feedcontributions-summary": "返回用户贡献纲要。", "apihelp-feedcontributions-param-feedformat": "纲要的格式。", "apihelp-feedcontributions-param-user": "获取哪些用户的贡献。", "apihelp-feedcontributions-param-namespace": "过滤哪些命名空间的贡献。", @@ -174,7 +194,7 @@ "apihelp-feedcontributions-param-hideminor": "隐藏小编辑。", "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。", "apihelp-feedcontributions-example-simple": "返回用户Example的贡献。", - "apihelp-feedrecentchanges-description": "返回最近更改的摘要。", + "apihelp-feedrecentchanges-summary": "返回最近更改的摘要。", "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。", "apihelp-feedrecentchanges-param-namespace": "用于限制结果的命名空间。", "apihelp-feedrecentchanges-param-invert": "除所选定者外的所有命名空间。", @@ -196,18 +216,18 @@ "apihelp-feedrecentchanges-param-categories_any": "只显示这些分类以外页面的更改。", "apihelp-feedrecentchanges-example-simple": "显示最近更改。", "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改。", - "apihelp-feedwatchlist-description": "返回监视列表纲要。", + "apihelp-feedwatchlist-summary": "返回监视列表纲要。", "apihelp-feedwatchlist-param-feedformat": "纲要的格式。", "apihelp-feedwatchlist-param-hours": "列出从现在起数小时内修改的页面。", "apihelp-feedwatchlist-param-linktosections": "如果可能的话,直接链接到已变更的小节。", "apihelp-feedwatchlist-example-default": "显示监视列表订阅。", "apihelp-feedwatchlist-example-all6hrs": "显示过去6小时内受监视页面的所有更改。", - "apihelp-filerevert-description": "回退一个文件至某一旧版本。", + "apihelp-filerevert-summary": "回退一个文件至某一旧版本。", "apihelp-filerevert-param-filename": "目标文件名,不包含前缀“File:”。", "apihelp-filerevert-param-comment": "上传评论。", "apihelp-filerevert-param-archivename": "恢复到修订版存档名称。", "apihelp-filerevert-example-revert": "回退Wiki.png至2011-03-05T15:27:40Z的版本。", - "apihelp-help-description": "显示指定模块的帮助。", + "apihelp-help-summary": "显示指定模块的帮助。", "apihelp-help-param-modules": "用于显示帮助的模块(action和format参数值,或main)。可通过+指定子模块。", "apihelp-help-param-submodules": "包括给定名称模块的子模块的帮助。", "apihelp-help-param-recursivesubmodules": "包括递归子模块的帮助。", @@ -219,12 +239,13 @@ "apihelp-help-example-recursive": "一个页面中的所有帮助。", "apihelp-help-example-help": "帮助模块本身的帮助。", "apihelp-help-example-query": "两个查询子模块的帮助。", - "apihelp-imagerotate-description": "旋转一幅或多幅图像。", + "apihelp-imagerotate-summary": "旋转一幅或多幅图像。", "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。", "apihelp-imagerotate-param-tags": "要在上传日志中应用到实体的标签。", "apihelp-imagerotate-example-simple": "90度旋转File:Example.png。", "apihelp-imagerotate-example-generator": "将Category:Flip之中的所有图像旋转180度。", - "apihelp-import-description": "从另一个wiki或从一个XML文件导入页面。\n\n注意当发送一个用于xml参数的文件时,HTTP POST必须作为一次文件上传完成(也就是使用multipart/form-data)。", + "apihelp-import-summary": "从其他wiki,或从XML文件导入页面。", + "apihelp-import-extended-description": "注意当发送用于xml参数的文件时,HTTP POST必须作为文件上传完成(即使用multipart/form-data)", "apihelp-import-param-summary": "日志记录导入摘要。", "apihelp-import-param-xml": "上传的XML文件。", "apihelp-import-param-interwikisource": "用于跨wiki导入:导入的来源wiki。", @@ -235,19 +256,20 @@ "apihelp-import-param-rootpage": "作为此页面的子页面导入。不能与$1namespace一起使用。", "apihelp-import-param-tags": "要在导入日志,以及在导入页面的空修订版本中应用到实体的更改标签。", "apihelp-import-example-import": "将页面[[meta:Help:ParserFunctions]]连带完整历史导入至100名字空间。", - "apihelp-linkaccount-description": "将来自第三方提供商的账户链接至当前用户。", + "apihelp-linkaccount-summary": "将来自第三方提供商的账户链接至当前用户。", "apihelp-linkaccount-example-link": "开始从Example链接至账户的过程。", - "apihelp-login-description": "登录并获取身份验证Cookie。\n\n此操作只应与[[Special:BotPasswords]]一起使用;用于主账户登录的方式已弃用,并可能在没有警告的情况下失败。要安全登录主账户,请使用[[Special:ApiHelp/clientlogin|action=clientlogin]]。", - "apihelp-login-description-nobotpasswords": "登录并获取身份验证Cookie。\n\n此操作已弃用,并可能在没有警告的情况下失败。要安全登录,请使用[[Special:ApiHelp/clientlogin|action=clientlogin]]。", + "apihelp-login-summary": "登录并获取身份验证cookie。", + "apihelp-login-extended-description": "此操作只应与[[Special:BotPasswords]]一起使用;用于主账户登录的方式已弃用,并可能在没有警告的情况下失败。要安全登录主账户,请使用[[Special:ApiHelp/clientlogin|action=clientlogin]]。", + "apihelp-login-extended-description-nobotpasswords": "此操作已弃用,并可能在没有警告的情况下失败。要安全登录,请使用[[Special:ApiHelp/clientlogin|action=clientlogin]]。", "apihelp-login-param-name": "用户名。", "apihelp-login-param-password": "密码。", "apihelp-login-param-domain": "域名(可选)。", "apihelp-login-param-token": "在首个请求中获得的登录令牌。", "apihelp-login-example-gettoken": "检索登录令牌。", "apihelp-login-example-login": "登录。", - "apihelp-logout-description": "退出并清除会话数据。", + "apihelp-logout-summary": "退出并清除会话数据。", "apihelp-logout-example-logout": "退出当前用户。", - "apihelp-managetags-description": "执行有关更改标签的管理任务。", + "apihelp-managetags-summary": "执行有关更改标签的管理任务。", "apihelp-managetags-param-operation": "要执行哪个操作:\n;create:创建一个新的更改标签供手动使用。\n;delete:从数据库中移除一个更改标签,包括移除已使用在所有修订版本、最近更改记录和日志记录上的该标签。\n;activate:激活一个更改标签,允许用户手动应用它。\n;deactivate:停用一个更改标签,阻止用户手动应用它。", "apihelp-managetags-param-tag": "要创建、删除、激活或取消激活的标签。要创建标签,标签必须不存在。要删除标签,标签必须存在。要激活标签,标签必须存在,且不被任何扩展使用。要取消激活标签,标签必须当前处于激活状态,且被手动定义。", "apihelp-managetags-param-reason": "一个创建、删除、激活或停用标签时的原因,可选。", @@ -257,7 +279,7 @@ "apihelp-managetags-example-delete": "删除vandlaism标签,原因Misspelt", "apihelp-managetags-example-activate": "激活一个名为spam的标签,原因For use in edit patrolling", "apihelp-managetags-example-deactivate": "停用一个名为spam的标签,原因No longer required", - "apihelp-mergehistory-description": "合并页面历史。", + "apihelp-mergehistory-summary": "合并页面历史。", "apihelp-mergehistory-param-from": "将被合并历史的页面的标题。不能与$1fromid一起使用。", "apihelp-mergehistory-param-fromid": "将被合并历史的页面的页面ID。不能与$1from一起使用。", "apihelp-mergehistory-param-to": "将要合并历史的页面的标题。不能与$1toid一起使用。", @@ -266,7 +288,7 @@ "apihelp-mergehistory-param-reason": "历史合并的原因。", "apihelp-mergehistory-example-merge": "将Oldpage的完整历史合并至Newpage。", "apihelp-mergehistory-example-merge-timestamp": "将Oldpage直到2015-12-31T04:37:41Z的页面修订版本合并至Newpage。", - "apihelp-move-description": "移动一个页面。", + "apihelp-move-summary": "移动一个页面。", "apihelp-move-param-from": "要重命名的页面标题。不能与$1fromid一起使用。", "apihelp-move-param-fromid": "您希望移动的页面ID。不能与$1from一起使用。", "apihelp-move-param-to": "页面重命名的目标标题。", @@ -280,16 +302,17 @@ "apihelp-move-param-ignorewarnings": "忽略任何警告。", "apihelp-move-param-tags": "要在移动日志,以及在目标页面的空修订版本中应用到实体的更改标签。", "apihelp-move-example-move": "移动Badtitle到Goodtitle,不保留重定向。", - "apihelp-opensearch-description": "使用OpenSearch协议搜索wiki。", + "apihelp-opensearch-summary": "使用OpenSearch协议搜索wiki。", "apihelp-opensearch-param-search": "搜索字符串。", "apihelp-opensearch-param-limit": "要返回的结果最大数。", "apihelp-opensearch-param-namespace": "搜索的名字空间。", - "apihelp-opensearch-param-suggest": "如果[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]设置为false则不做任何事情。", + "apihelp-opensearch-param-suggest": "如果[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]设置为false则不做任何事情。", "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"。", "apihelp-opensearch-param-format": "输出格式。", "apihelp-opensearch-param-warningsaserror": "如果警告通过format=json提升,返回一个API错误而不是忽略它们。", "apihelp-opensearch-example-te": "查找以Te开头的页面。", - "apihelp-options-description": "更改当前用户的偏好设置。\n\n只有注册在核心或者已安装扩展中的选项,或者具有userjs-键值前缀(旨在被用户脚本使用)的选项可被设置。", + "apihelp-options-summary": "更改当前用户的参数设置。", + "apihelp-options-extended-description": "只有注册在核心或者已安装扩展中的选项,或者具有userjs-键值前缀(旨在被用户脚本使用)的选项可被设置。", "apihelp-options-param-reset": "将参数设置重置为网站默认值。", "apihelp-options-param-resetkinds": "当$1reset选项被设置时,要重置的选项类型列表。", "apihelp-options-param-change": "更改列表,以name=value格式化(例如skin=vector)。如果没提供值(甚至没有等号),例如optionname|otheroption|...,选项将重置为默认值。如果任何传递的值包含管道字符(|),请改用[[Special:ApiHelp/main#main/datatypes|替代多值分隔符]]以正确操作。", @@ -298,7 +321,7 @@ "apihelp-options-example-reset": "重置所有用户设置。", "apihelp-options-example-change": "更改skin和hideminor设置。", "apihelp-options-example-complex": "重置所有设置,然后设置skin和nickname。", - "apihelp-paraminfo-description": "获得关于API模块的信息。", + "apihelp-paraminfo-summary": "获得关于API模块的信息。", "apihelp-paraminfo-param-modules": "模块名称(action和format参数值,或main)的列表。可通过+指定子模块,或通过+*指定所有子模块,或通过+**指定所有递归子模块。", "apihelp-paraminfo-param-helpformat": "帮助字符串的格式。", "apihelp-paraminfo-param-querymodules": "查询模块名称(prop、meta或list参数值)的列表。使用$1modules=query+foo而不是$1querymodules=foo。", @@ -307,7 +330,8 @@ "apihelp-paraminfo-param-formatmodules": "格式模块名称(format参数的值)的列表。也可使用$1modules。", "apihelp-paraminfo-example-1": "显示[[Special:ApiHelp/parse|action=parse]]、[[Special:ApiHelp/jsonfm|format=jsonfm]]、[[Special:ApiHelp/query+allpages|action=query&list=allpages]]和[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]的信息。", "apihelp-paraminfo-example-2": "显示[[Special:ApiHelp/query|action=query]]的所有子模块的信息。", - "apihelp-parse-description": "解析内容并返回解析器输出。\n\n参见[[Special:ApiHelp/query|action=query]]的各种prop-module以从页面的当前版本获得信息。\n\n这里有几种方法可以指定解析的文本:\n# 指定一个页面或修订,使用$1page、$1pageid或$1oldid。\n# 明确指定内容,使用$1text、$1title和$1contentmodel。\n# 只指定一段摘要解析。$1prop应提供一个空值。", + "apihelp-parse-summary": "解析内容并返回解析器输出。", + "apihelp-parse-extended-description": "参见[[Special:ApiHelp/query|action=query]]的各种prop-module以从页面的当前版本获得信息。\n\n这里有几种方法可以指定解析的文本:\n# 指定一个页面或修订,使用$1page、$1pageid或$1oldid。\n# 明确指定内容,使用$1text、$1title和$1contentmodel。\n# 只指定一段摘要解析。$1prop应提供一个空值。", "apihelp-parse-param-title": "文本属于的页面标题。如果省略,$1contentmodel就必须被指定,且[[API]]将作为标题使用。", "apihelp-parse-param-text": "要解析的文本。使用$1title或$1contentmodel以控制内容模型。", "apihelp-parse-param-summary": "要解析的摘要。", @@ -327,7 +351,7 @@ "apihelp-parse-paramvalue-prop-sections": "在被解析的wiki文本中提供段落。", "apihelp-parse-paramvalue-prop-revid": "添加被解析页面的修订ID。", "apihelp-parse-paramvalue-prop-displaytitle": "为被解析的wiki文本添加标题。", - "apihelp-parse-paramvalue-prop-headitems": "已弃用。提供项目以插入至页面的<head>。", + "apihelp-parse-paramvalue-prop-headitems": "提供项目以插入至页面的<head>。", "apihelp-parse-paramvalue-prop-headhtml": "提供页面的被解析<head>。", "apihelp-parse-paramvalue-prop-modules": "提供在页面中使用的ResourceLoader模块。要加载,请使用mw.loader.using()。无论jsconfigvars还是encodedjsconfigvars都必须与modules共同被请求。", "apihelp-parse-paramvalue-prop-jsconfigvars": "针对页面提供JavaScript配置变量。要应用,请使用mw.config.set()。", @@ -339,6 +363,8 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果$1disablelimitreport被设定则不提供数据。", "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当$1disablelimitreport被设置时不会提供数据。", "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型$1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "在解析内容时提供发生的警告", + "apihelp-parse-param-wrapoutputclass": "要用于包裹解析输出的CSS类。", "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。", "apihelp-parse-param-onlypst": "在输入内容中执行预保存转换(PST),但不解析它。在PST被应用后返回相同的wiki文本。只当与$1text一起使用时有效。", "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与$1prop=langlinks一起使用)。", @@ -352,19 +378,20 @@ "apihelp-parse-param-preview": "在预览模式下解析。", "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。", "apihelp-parse-param-disabletoc": "在输出中省略目录。", + "apihelp-parse-param-useskin": "为解析器输出应用选择的皮肤。会影响以下属性:langlinks、headitems、modules、jsconfigvars和indicators。", "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。", "apihelp-parse-param-contentmodel": "输入文本的内容模型。如果省略,$1title必须指定,并且默认将为指定标题的模型。只当与$1text一起使用时有效。", "apihelp-parse-example-page": "解析一个页面。", "apihelp-parse-example-text": "解析wiki文本。", "apihelp-parse-example-texttitle": "解析wiki文本,指定页面标题。", "apihelp-parse-example-summary": "解析一个摘要。", - "apihelp-patrol-description": "巡查页面或修订版本。", + "apihelp-patrol-summary": "巡查页面或修订版本。", "apihelp-patrol-param-rcid": "要巡查的最近更改 ID。", "apihelp-patrol-param-revid": "要巡查的修订版本ID。", "apihelp-patrol-param-tags": "要在巡查日志中应用到实体的更改标签。", "apihelp-patrol-example-rcid": "巡查一次最近更改。", "apihelp-patrol-example-revid": "巡查一次修订。", - "apihelp-protect-description": "更改页面的保护等级。", + "apihelp-protect-summary": "更改页面的保护等级。", "apihelp-protect-param-title": "要(解除)保护的页面标题。不能与$1pageid一起使用。", "apihelp-protect-param-pageid": "要(解除)保护的页面ID。不能与$1title一起使用。", "apihelp-protect-param-protections": "保护等级列表,格式:action=level(例如edit=sysop)。等级all意味着任何人都可以执行操作,也就是说没有限制。\n\n注意:未列出的操作将移除限制。", @@ -377,12 +404,13 @@ "apihelp-protect-example-protect": "保护一个页面。", "apihelp-protect-example-unprotect": "通过设置限制为all解除保护一个页面(就是说任何人都可以执行操作)。", "apihelp-protect-example-unprotect2": "通过设置没有限制解除保护一个页面。", - "apihelp-purge-description": "为指定标题刷新缓存。", + "apihelp-purge-summary": "为指定标题刷新缓存。", "apihelp-purge-param-forcelinkupdate": "更新链接表。", "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。", "apihelp-purge-example-simple": "刷新Main Page和API页面。", "apihelp-purge-example-generator": "刷新主名字空间的前10个页面。", - "apihelp-query-description": "获取来自和有关MediaWiki的数据。\n\n所有数据修改将首先要使用查询以获得令牌以阻止来自恶意网站的滥用破坏。", + "apihelp-query-summary": "取得来自并有关MediaWiki的数据。", + "apihelp-query-extended-description": "所有数据修改将首先不得不使用查询来获得令牌,以阻止来自恶意网站的滥用行为。", "apihelp-query-param-prop": "要为已查询页面获取的属性。", "apihelp-query-param-list": "要获取的列表。", "apihelp-query-param-meta": "要获取的元数据。", @@ -393,7 +421,7 @@ "apihelp-query-param-rawcontinue": "为继续返回原始query-continue数据。", "apihelp-query-example-revisions": "获取Main Page的[[Special:ApiHelp/query+siteinfo|网站信息]]和[[Special:ApiHelp/query+revisions|修订版本]]。", "apihelp-query-example-allpages": "获取以API/开头的页面的修订版本。", - "apihelp-query+allcategories-description": "列举所有分类。", + "apihelp-query+allcategories-summary": "列举所有分类。", "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。", "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。", "apihelp-query+allcategories-param-prefix": "搜索所有以此值开头的分类标题。", @@ -406,7 +434,7 @@ "apihelp-query+allcategories-paramvalue-prop-hidden": "标记由__HIDDENCAT__隐藏的分类。", "apihelp-query+allcategories-example-size": "列出分类及其含有多少页面的信息。", "apihelp-query+allcategories-example-generator": "为以List的分类检索有关分类页面本身的信息。", - "apihelp-query+alldeletedrevisions-description": "列举由一位用户或在一个名字空间中所有已删除的修订。", + "apihelp-query+alldeletedrevisions-summary": "列举由一位用户或在一个名字空间中所有已删除的修订。", "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与$3user一起使用。", "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与$3user一起使用。", "apihelp-query+alldeletedrevisions-param-start": "枚举的起始时间戳。", @@ -418,11 +446,11 @@ "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。", "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。", "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意:由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用$1user和$1namespace将导致继续前返回少于$1limit个结果,在极端条件下可能不返回任何结果。", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意:由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],同时使用$1user和$1namespace将导致继续前返回少于$1limit个结果,在极端条件下可能不返回任何结果。", "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。", "apihelp-query+alldeletedrevisions-example-user": "列出由Example作出的最近50次已删除贡献。", "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。", - "apihelp-query+allfileusages-description": "列出所有文件用途,包括不存在的。", + "apihelp-query+allfileusages-summary": "列出所有文件用途,包括不存在的。", "apihelp-query+allfileusages-param-from": "要列举的起始文件标题。", "apihelp-query+allfileusages-param-to": "要列举的最终文件标题。", "apihelp-query+allfileusages-param-prefix": "搜索所有以此值开头的文件标题。", @@ -436,7 +464,7 @@ "apihelp-query+allfileusages-example-unique": "列出唯一文件标题。", "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者。", "apihelp-query+allfileusages-example-generator": "获取包含这些文件的页面。", - "apihelp-query+allimages-description": "按顺序枚举所有图像。", + "apihelp-query+allimages-summary": "按顺序枚举所有图像。", "apihelp-query+allimages-param-sort": "要作为排序方式的属性。", "apihelp-query+allimages-param-dir": "罗列所采用的方向。", "apihelp-query+allimages-param-from": "要列举的起始图片标题。只能与$1sort=name一起使用。", @@ -456,7 +484,7 @@ "apihelp-query+allimages-example-recent": "显示一个最近上传文件的列表,类似[[Special:NewFiles]]。", "apihelp-query+allimages-example-mimetypes": "显示带MIME类型image/png或image/gif的文件列表", "apihelp-query+allimages-example-generator": "显示有关4个以T开头的文件的信息。", - "apihelp-query+alllinks-description": "列举所有指向至指定名字空间的链接。", + "apihelp-query+alllinks-summary": "列举所有指向至指定名字空间的链接。", "apihelp-query+alllinks-param-from": "要列举的起始标题链接。", "apihelp-query+alllinks-param-to": "要列举的最终标题链接。", "apihelp-query+alllinks-param-prefix": "搜索所有以此值开头的已链接标题。", @@ -471,7 +499,7 @@ "apihelp-query+alllinks-example-unique": "列出唯一的链接标题。", "apihelp-query+alllinks-example-unique-generator": "获取所有已链接的标题,标记缺少的。", "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面。", - "apihelp-query+allmessages-description": "返回来自该网站的消息。", + "apihelp-query+allmessages-summary": "返回来自该网站的消息。", "apihelp-query+allmessages-param-messages": "要输出的消息。*(默认)表示所有消息。", "apihelp-query+allmessages-param-prop": "要获取的属性。", "apihelp-query+allmessages-param-enableparser": "设置以启用解析器,将处理消息的wiki文本(替代魔术字、处理模板等)。", @@ -487,7 +515,7 @@ "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。", "apihelp-query+allmessages-example-ipb": "显示以ipb-开始的消息。", "apihelp-query+allmessages-example-de": "显示德语版的august和mainpage消息。", - "apihelp-query+allpages-description": "循序列举在指定名字空间中的所有页面。", + "apihelp-query+allpages-summary": "循序列举在指定名字空间中的所有页面。", "apihelp-query+allpages-param-from": "枚举的起始页面标题。", "apihelp-query+allpages-param-to": "枚举的结束页面标题。", "apihelp-query+allpages-param-prefix": "搜索所有以此值开头的页面标题。", @@ -505,7 +533,7 @@ "apihelp-query+allpages-example-B": "显示以字母B开头的页面的列表。", "apihelp-query+allpages-example-generator": "显示有关4个以字母T开头的页面的信息。", "apihelp-query+allpages-example-generator-revisions": "显示前2个以Re开头的非重定向页面的内容。", - "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。", + "apihelp-query+allredirects-summary": "列出至一个名字空间的重定向。", "apihelp-query+allredirects-param-from": "要列举的起始重定向标题。", "apihelp-query+allredirects-param-to": "要列举的最终重定向标题。", "apihelp-query+allredirects-param-prefix": "搜索所有以此值开头的目标页面。", @@ -522,7 +550,7 @@ "apihelp-query+allredirects-example-unique": "列出孤立目标页面。", "apihelp-query+allredirects-example-unique-generator": "获取所有目标页面,标记丢失的。", "apihelp-query+allredirects-example-generator": "获取包含重定向的页面。", - "apihelp-query+allrevisions-description": "列举所有修订。", + "apihelp-query+allrevisions-summary": "列举所有修订。", "apihelp-query+allrevisions-param-start": "枚举的起始时间戳。", "apihelp-query+allrevisions-param-end": "枚举的结束时间戳。", "apihelp-query+allrevisions-param-user": "只列出此用户做出的修订。", @@ -531,13 +559,13 @@ "apihelp-query+allrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。", "apihelp-query+allrevisions-example-user": "列出由用户Example作出的最近50次贡献。", "apihelp-query+allrevisions-example-ns-main": "列举主名字空间中的前50次修订。", - "apihelp-query+mystashedfiles-description": "获取当前用户上传暂存库中的文件列表。", + "apihelp-query+mystashedfiles-summary": "获取当前用户上传暂存库中的文件列表。", "apihelp-query+mystashedfiles-param-prop": "要检索文件的属性。", "apihelp-query+mystashedfiles-paramvalue-prop-size": "检索文件大小和图片尺寸。", "apihelp-query+mystashedfiles-paramvalue-prop-type": "检索文件的MIME类型和媒体类型。", "apihelp-query+mystashedfiles-param-limit": "要获取文件的数量。", "apihelp-query+mystashedfiles-example-simple": "获取当前用户上传暂存库中的文件的filekey、大小和像素尺寸。", - "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用{{x}}嵌入的页面),包括不存在的。", + "apihelp-query+alltransclusions-summary": "列出所有嵌入页面(使用{{x}}嵌入的页面),包括不存在的。", "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。", "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。", "apihelp-query+alltransclusions-param-prefix": "搜索所有以此值开头的嵌入的标题。", @@ -552,7 +580,7 @@ "apihelp-query+alltransclusions-example-unique": "列出孤立嵌入标题", "apihelp-query+alltransclusions-example-unique-generator": "获取所有嵌入的标题,并标记缺失的。", "apihelp-query+alltransclusions-example-generator": "获得包含嵌入内容的页面。", - "apihelp-query+allusers-description": "列举所有注册用户。", + "apihelp-query+allusers-summary": "列举所有注册用户。", "apihelp-query+allusers-param-from": "枚举的起始用户名。", "apihelp-query+allusers-param-to": "枚举的结束用户名。", "apihelp-query+allusers-param-prefix": "搜索所有以此值开头的用户。", @@ -573,13 +601,13 @@ "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。", "apihelp-query+allusers-param-attachedwiki": "与$1prop=centralids一起使用,也表明用户是否附加于此ID定义的wiki。", "apihelp-query+allusers-example-Y": "列出以Y开头的用户。", - "apihelp-query+authmanagerinfo-description": "检索有关当前身份验证状态的信息。", + "apihelp-query+authmanagerinfo-summary": "检索有关当前身份验证状态的信息。", "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "测试用户当前的身份验证状态是否足够用于指定的安全敏感操作。", "apihelp-query+authmanagerinfo-param-requestsfor": "取得指定身份验证操作所需的有关身份验证请求的信息。", "apihelp-query+authmanagerinfo-example-login": "检索当开始登录时可能使用的请求。", "apihelp-query+authmanagerinfo-example-login-merged": "检索当开始登录时可能使用的请求,并合并表单字段。", "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "测试身份验证对操作foo是否足够。", - "apihelp-query+backlinks-description": "查找所有链接至指定页面的页面。", + "apihelp-query+backlinks-summary": "查找所有链接至指定页面的页面。", "apihelp-query+backlinks-param-title": "要搜索的标题。不能与$1pageid一起使用。", "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与$1title一起使用。", "apihelp-query+backlinks-param-namespace": "要列举的名字空间。", @@ -589,7 +617,7 @@ "apihelp-query+backlinks-param-redirect": "如果链入页面是一个重定向,则寻找所有链接至此重定向的页面。最大限制减半。", "apihelp-query+backlinks-example-simple": "显示至Main page的链接。", "apihelp-query+backlinks-example-generator": "获取关于链接至Main page的页面的信息。", - "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。", + "apihelp-query+blocks-summary": "列出所有被封禁的用户和IP地址。", "apihelp-query+blocks-param-start": "枚举的起始时间戳。", "apihelp-query+blocks-param-end": "枚举的结束时间戳。", "apihelp-query+blocks-param-ids": "要列出的封禁ID列表(可选)。", @@ -610,7 +638,7 @@ "apihelp-query+blocks-param-show": "只显示符合这些标准的项目。\n例如,要只查看IP地址的无限期封禁,设置$1show=ip|!temp。", "apihelp-query+blocks-example-simple": "封禁列表。", "apihelp-query+blocks-example-users": "列出用户Alice和Bob的封禁。", - "apihelp-query+categories-description": "页面属于的所有分类列表。", + "apihelp-query+categories-summary": "页面属于的所有分类列表。", "apihelp-query+categories-param-prop": "要为每个分类获取的额外属性:", "apihelp-query+categories-paramvalue-prop-sortkey": "为每个分类添加关键词(十六进制字符串)和关键词前缀(人类可读部分)。", "apihelp-query+categories-paramvalue-prop-timestamp": "添加分类添加时的时间戳。", @@ -620,10 +648,10 @@ "apihelp-query+categories-param-categories": "只列出这些分类。对于检查某一页面使用某一分类很有用。", "apihelp-query+categories-param-dir": "罗列所采用的方向。", "apihelp-query+categories-example-simple": "获取属于Albert Einstein的分类列表。", - "apihelp-query+categories-example-generator": "获得有关用于Albert Einstein的分类的信息。", - "apihelp-query+categoryinfo-description": "返回有关给定分类的信息。", + "apihelp-query+categories-example-generator": "获取有关用于Albert Einstein的分类的信息。", + "apihelp-query+categoryinfo-summary": "返回有关给定分类的信息。", "apihelp-query+categoryinfo-example-simple": "获取有关Category:Foo和Category:Bar的信息。", - "apihelp-query+categorymembers-description": "在指定的分类中列出所有页面。", + "apihelp-query+categorymembers-summary": "在指定的分类中列出所有页面。", "apihelp-query+categorymembers-param-title": "要列举的分类(必需)。必须包括{{ns:category}}:前缀。不能与$1pageid一起使用。", "apihelp-query+categorymembers-param-pageid": "要枚举的分类的页面 ID。不能与$1title一起使用。", "apihelp-query+categorymembers-param-prop": "要包含的信息束:", @@ -648,14 +676,15 @@ "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。", "apihelp-query+categorymembers-example-simple": "获取Category:Physics中的前10个页面。", "apihelp-query+categorymembers-example-generator": "获取有关Category:Physics中的前10个页面的页面信息。", - "apihelp-query+contributors-description": "获取对一个页面的登录贡献者列表和匿名贡献数。", + "apihelp-query+contributors-summary": "获取对一个页面的登录贡献者列表和匿名贡献数。", "apihelp-query+contributors-param-group": "只包括指定用户组中的用户。不包括隐性的或自动提升的用户组,例如*、用户或自动确认用户。", "apihelp-query+contributors-param-excludegroup": "排除指定用户组中的用户。不包括隐性的或自动提升的用户组,例如*、用户或自动确认用户。", "apihelp-query+contributors-param-rights": "只包括拥有指定权限的用户。不包括隐性的或自动提升的用户组,例如*、用户或自动确认用户。", "apihelp-query+contributors-param-excluderights": "排除拥有指定权限的用户。不包括隐性的或自动提升的用户组,例如*、用户或自动确认用户。", "apihelp-query+contributors-param-limit": "返回的贡献数。", "apihelp-query+contributors-example-simple": "显示Main Page的贡献。", - "apihelp-query+deletedrevisions-description": "获得删除修订版本信息。\n\n可在很多途径中使用:\n# 获得一组页面的已删除修订,通过设置标题或页面ID。以标题和时间戳排序。\n# 通过设置它们的ID与修订ID获得关于一组已删除修订。以修订ID排序。", + "apihelp-query+deletedrevisions-summary": "获取删除的修订版本信息。", + "apihelp-query+deletedrevisions-extended-description": "可在很多途径中使用:\n# 获得一组页面的已删除修订,通过设置标题或页面ID。以标题和时间戳排序。\n# 通过设置它们的ID与修订ID获得关于一组已删除修订。以修订ID排序。", "apihelp-query+deletedrevisions-param-start": "要开始枚举的时间戳。当处理修订ID列表时会被忽略。", "apihelp-query+deletedrevisions-param-end": "要停止枚举的时间戳。当处理修订ID列表时会被忽略。", "apihelp-query+deletedrevisions-param-tag": "只列出被此标签标记的修订。", @@ -663,7 +692,8 @@ "apihelp-query+deletedrevisions-param-excludeuser": "不要列出此用户做出的修订。", "apihelp-query+deletedrevisions-example-titles": "列出页面Main Page和Talk:Main Page的已删除修订,包含内容。", "apihelp-query+deletedrevisions-example-revids": "列出已删除修订123456的信息。", - "apihelp-query+deletedrevs-description": "列出被删除修订。\n\n操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# 为指定用户列举已删除贡献,按时间戳排列(未指定标题)。\n# 在指定名字空间中列举所有已删除修订,按标题和时间戳排列(无指定标题,未设置$1user)。\n\n任一参数只应用于一些模式,并忽略其他参数。", + "apihelp-query+deletedrevs-summary": "列举删除的修订版本。", + "apihelp-query+deletedrevs-extended-description": "操作于三种模式中:\n# 为指定标题列举已删除修订,按时间戳排列。\n# 为指定用户列举已删除贡献,按时间戳排列(未指定标题)。\n# 在指定名字空间中列举所有已删除修订,按标题和时间戳排列(无指定标题,未设置$1user)。\n\n任一参数只应用于一些模式,并忽略其他参数。", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2", "apihelp-query+deletedrevs-param-start": "枚举的起始时间戳。", "apihelp-query+deletedrevs-param-end": "枚举的结束时间戳。", @@ -681,14 +711,14 @@ "apihelp-query+deletedrevs-example-mode2": "列出由Bob作出的最近50次已删除贡献(模式2)。", "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)。", "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次{{ns:talk}}名字空间已删除页面(模式3)。", - "apihelp-query+disabled-description": "此查询模块已被禁用。", - "apihelp-query+duplicatefiles-description": "根据哈希值列出此给定文件的所有副本。", + "apihelp-query+disabled-summary": "此查询模块已被禁用。", + "apihelp-query+duplicatefiles-summary": "根据哈希值列出此给定文件的所有副本。", "apihelp-query+duplicatefiles-param-limit": "返回多少重复文件。", "apihelp-query+duplicatefiles-param-dir": "罗列所采用的方向。", "apihelp-query+duplicatefiles-param-localonly": "只看本地存储库的文件。", "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件。", "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件。", - "apihelp-query+embeddedin-description": "查找所有嵌入指定标题的页面。", + "apihelp-query+embeddedin-summary": "查找所有嵌入指定标题的页面。", "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。", "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。", "apihelp-query+embeddedin-param-namespace": "列举的名字空间。", @@ -697,13 +727,13 @@ "apihelp-query+embeddedin-param-limit": "返回的总计页面数。", "apihelp-query+embeddedin-example-simple": "显示嵌入Template:Stub的页面。", "apihelp-query+embeddedin-example-generator": "获取有关显示嵌入Template:Stub的页面的信息。", - "apihelp-query+extlinks-description": "从指定页面返回所有外部URL(非跨wiki链接)。", + "apihelp-query+extlinks-summary": "从指定页面返回所有外部URL(非跨wiki链接)。", "apihelp-query+extlinks-param-limit": "返回多少链接。", "apihelp-query+extlinks-param-protocol": "URL协议。如果为空并且$1query被设置,协议为http。将此和$1query都留空以列举所有外部链接。", "apihelp-query+extlinks-param-query": "不使用协议搜索字符串。对于检查某一页面是否包含某一外部URL很有用。", "apihelp-query+extlinks-param-expandurl": "扩展协议相对URL与规范协议。", "apihelp-query+extlinks-example-simple": "获取Main Page的外部链接列表。", - "apihelp-query+exturlusage-description": "列举包含一个指定URL的页面。", + "apihelp-query+exturlusage-summary": "列举包含一个指定URL的页面。", "apihelp-query+exturlusage-param-prop": "要包含的信息束:", "apihelp-query+exturlusage-paramvalue-prop-ids": "添加页面ID。", "apihelp-query+exturlusage-paramvalue-prop-title": "添加页面的标题和名字空间ID。", @@ -714,7 +744,7 @@ "apihelp-query+exturlusage-param-limit": "返回多少页面。", "apihelp-query+exturlusage-param-expandurl": "用标准协议展开协议相关URL。", "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面。", - "apihelp-query+filearchive-description": "循序列举所有被删除的文件。", + "apihelp-query+filearchive-summary": "循序列举所有被删除的文件。", "apihelp-query+filearchive-param-from": "枚举的起始图片标题。", "apihelp-query+filearchive-param-to": "枚举的结束图片标题。", "apihelp-query+filearchive-param-prefix": "搜索所有以此值开头的图像标题。", @@ -736,10 +766,10 @@ "apihelp-query+filearchive-paramvalue-prop-bitdepth": "添加版本的字节深度。", "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。", "apihelp-query+filearchive-example-simple": "显示已删除文件列表。", - "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。", - "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]],并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。", + "apihelp-query+filerepoinfo-summary": "返回有关wiki配置的图片存储库的元信息。", + "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]],并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。", "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。", - "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。", + "apihelp-query+fileusage-summary": "查找所有使用指定文件的页面。", "apihelp-query+fileusage-param-prop": "要获取的属性:", "apihelp-query+fileusage-paramvalue-prop-pageid": "每个页面的页面ID。", "apihelp-query+fileusage-paramvalue-prop-title": "每个页面的标题。", @@ -749,7 +779,7 @@ "apihelp-query+fileusage-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。", "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表。", "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息。", - "apihelp-query+imageinfo-description": "返回文件信息和上传历史。", + "apihelp-query+imageinfo-summary": "返回文件信息和上传历史。", "apihelp-query+imageinfo-param-prop": "要获取的文件信息:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "添加时间戳至上传的版本。", "apihelp-query+imageinfo-paramvalue-prop-user": "添加上传了每个文件版本的用户。", @@ -785,13 +815,13 @@ "apihelp-query+imageinfo-param-localonly": "只看本地存储库的文件。", "apihelp-query+imageinfo-example-simple": "取得有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息。", "apihelp-query+imageinfo-example-dated": "取得有关[[:File:Test.jpg]]自2008年以来版本的信息。", - "apihelp-query+images-description": "返回指定页面上包含的所有文件。", + "apihelp-query+images-summary": "返回指定页面上包含的所有文件。", "apihelp-query+images-param-limit": "返回多少文件。", "apihelp-query+images-param-images": "只列出这些文件。对于检查某一页面是否使用某一文件很有用。", "apihelp-query+images-param-dir": "罗列所采用的方向。", "apihelp-query+images-example-simple": "获取[[Main Page]]使用的文件列表。", "apihelp-query+images-example-generator": "获取有关[[Main Page]]使用的文件的信息。", - "apihelp-query+imageusage-description": "查找所有使用指定图片标题的页面。", + "apihelp-query+imageusage-summary": "查找所有使用指定图片标题的页面。", "apihelp-query+imageusage-param-title": "要搜索的标题。不能与$1pageid一起使用。", "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。", "apihelp-query+imageusage-param-namespace": "要列举的名字空间。", @@ -801,7 +831,7 @@ "apihelp-query+imageusage-param-redirect": "如果链接页面是重定向,则查找所有链接至该重定向的页面。最大限制减半。", "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面。", "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息。", - "apihelp-query+info-description": "获取基本页面信息。", + "apihelp-query+info-summary": "获取基本页面信息。", "apihelp-query+info-param-prop": "要获取的额外属性:", "apihelp-query+info-paramvalue-prop-protection": "列出每个页面的保护等级。", "apihelp-query+info-paramvalue-prop-talkid": "每个非讨论页面的讨论页的页面ID。", @@ -818,8 +848,9 @@ "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。", "apihelp-query+info-example-simple": "获取有关页面Main Page的信息。", "apihelp-query+info-example-protection": "获取Main Page相关的常规和保护信息。", - "apihelp-query+iwbacklinks-description": "查找所有链接至指定跨wiki链接的页面。\n\n可被用于查找带某一前缀的所有链接,或所有至某一标题的链接(带指定前缀)。两参数都不使用就意味着“所有跨wiki链接”。", - "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。", + "apihelp-query+iwbacklinks-summary": "查找所有链接至指定跨wiki链接的页面。", + "apihelp-query+iwbacklinks-extended-description": "可用于查找所有有前缀的链接,或是链至某一标题的所有链接(带指定前缀)。两参数均不使用实际上就是“all interwiki links”。", + "apihelp-query+iwbacklinks-param-prefix": "跨wiki前缀。", "apihelp-query+iwbacklinks-param-title": "要搜索的跨wiki链接。必须与$1blprefix一起使用。", "apihelp-query+iwbacklinks-param-limit": "返回的总计页面数。", "apihelp-query+iwbacklinks-param-prop": "要获取的属性:", @@ -828,7 +859,7 @@ "apihelp-query+iwbacklinks-param-dir": "罗列所采用的方向。", "apihelp-query+iwbacklinks-example-simple": "获取链接至[[wikibooks:Test]]的页面。", "apihelp-query+iwbacklinks-example-generator": "获取有关链接至[[wikibooks:Test]]的页面的信息。", - "apihelp-query+iwlinks-description": "从指定页面返回所有跨wiki链接。", + "apihelp-query+iwlinks-summary": "从指定页面返回所有跨wiki链接。", "apihelp-query+iwlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。", "apihelp-query+iwlinks-param-prop": "要为每个跨语言链接获取的额外属性:", "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整URL。", @@ -837,7 +868,8 @@ "apihelp-query+iwlinks-param-title": "用于搜索的跨wiki链接。必须与$1prefix一起使用。", "apihelp-query+iwlinks-param-dir": "罗列所采用的方向。", "apihelp-query+iwlinks-example-simple": "从页面Main Page获得跨wiki链接。", - "apihelp-query+langbacklinks-description": "发现所有链接至指定语言链接的页面。\n\n可被用于查找所有带某一语言代码的链接,或所有至某一标题的链接(带指定语言)。不使用任何参数就意味着“所有语言链接”。\n\n注意这可能不考虑由扩展添加的语言链接。", + "apihelp-query+langbacklinks-summary": "查找所有链接至指定语言链接的页面。", + "apihelp-query+langbacklinks-extended-description": "可被用于查找所有带某一语言代码的链接,或所有至某一标题的链接(带指定语言)。不使用任何参数就意味着“all language links”。\n\n注意这可能不考虑由扩展添加的语言链接。", "apihelp-query+langbacklinks-param-lang": "用于语言链接的语言。", "apihelp-query+langbacklinks-param-title": "要搜索的语言链接。必须与$1lang一起使用。", "apihelp-query+langbacklinks-param-limit": "返回的总计页面数。", @@ -847,7 +879,7 @@ "apihelp-query+langbacklinks-param-dir": "罗列所采用的方向。", "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面。", "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息。", - "apihelp-query+langlinks-description": "从指定页面返回所有跨语言链接。", + "apihelp-query+langlinks-summary": "从指定页面返回所有跨语言链接。", "apihelp-query+langlinks-param-limit": "返回多少语言链接。", "apihelp-query+langlinks-param-url": "是否获取完整URL(不能与$1prop一起使用)。", "apihelp-query+langlinks-param-prop": "要为每个跨语言链接获取的额外属性:", @@ -859,7 +891,7 @@ "apihelp-query+langlinks-param-dir": "罗列所采用的方向。", "apihelp-query+langlinks-param-inlanguagecode": "本地化语言名称的语言代码。", "apihelp-query+langlinks-example-simple": "从页面Main Page获取跨语言链接。", - "apihelp-query+links-description": "从指定页面返回所有链接。", + "apihelp-query+links-summary": "从指定页面返回所有链接。", "apihelp-query+links-param-namespace": "只显示这些名字空间的链接。", "apihelp-query+links-param-limit": "返回多少链接。", "apihelp-query+links-param-titles": "只列出这些标题。对于检查某一页面是否使用某一标题很有用。", @@ -867,7 +899,7 @@ "apihelp-query+links-example-simple": "从页面Main Page获取链接。", "apihelp-query+links-example-generator": "获取有关在页面Main Page中连接的页面的信息。", "apihelp-query+links-example-namespaces": "获取在{{ns:user}}和{{ns:template}}名字空间中来自页面Main Page的链接。", - "apihelp-query+linkshere-description": "查找所有链接至指定页面的页面。", + "apihelp-query+linkshere-summary": "查找所有链接至指定页面的页面。", "apihelp-query+linkshere-param-prop": "要获取的属性:", "apihelp-query+linkshere-paramvalue-prop-pageid": "每个页面的页面ID。", "apihelp-query+linkshere-paramvalue-prop-title": "每个页面的标题。", @@ -877,7 +909,7 @@ "apihelp-query+linkshere-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。", "apihelp-query+linkshere-example-simple": "获取链接至[[Main Page]]的页面列表。", "apihelp-query+linkshere-example-generator": "获取有关链接至[[Main Page]]的页面的信息。", - "apihelp-query+logevents-description": "从日志获取事件。", + "apihelp-query+logevents-summary": "从日志获取事件。", "apihelp-query+logevents-param-prop": "要获取的属性:", "apihelp-query+logevents-paramvalue-prop-ids": "添加日志活动的ID。", "apihelp-query+logevents-paramvalue-prop-title": "为日志事件添加页面标题。", @@ -900,13 +932,13 @@ "apihelp-query+logevents-param-tag": "只列举带此标签的事件日志记录。", "apihelp-query+logevents-param-limit": "返回的事件日志记录总数。", "apihelp-query+logevents-example-simple": "列出最近日志事件。", - "apihelp-query+pagepropnames-description": "列出wiki中所有使用中的页面属性名称。", + "apihelp-query+pagepropnames-summary": "列出wiki中所有使用中的页面属性名称。", "apihelp-query+pagepropnames-param-limit": "返回名称的最大数量。", "apihelp-query+pagepropnames-example-simple": "获取前10个属性名称。", - "apihelp-query+pageprops-description": "获取页面内容中定义的各种页面属性。", + "apihelp-query+pageprops-summary": "获取页面内容中定义的各种页面属性。", "apihelp-query+pageprops-param-prop": "只列出这些页面属性([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]返回使用中的页面属性名称)。在检查页面是否使用某一页面属性时有用。", "apihelp-query+pageprops-example-simple": "获取用于页面Main Page和MediaWiki的属性。", - "apihelp-query+pageswithprop-description": "列出所有使用指定页面属性的页面。", + "apihelp-query+pageswithprop-summary": "列出所有使用指定页面属性的页面。", "apihelp-query+pageswithprop-param-propname": "要用于列举页面的页面属性([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]返回正在使用中的页面属性名称)。", "apihelp-query+pageswithprop-param-prop": "要包含的信息束:", "apihelp-query+pageswithprop-paramvalue-prop-ids": "添加页面ID。", @@ -916,14 +948,15 @@ "apihelp-query+pageswithprop-param-dir": "排序的方向。", "apihelp-query+pageswithprop-example-simple": "列出前10个使用{{DISPLAYTITLE:}}的页面。", "apihelp-query+pageswithprop-example-generator": "获取有关前10个使用__NOTOC__的页面的额外信息。", - "apihelp-query+prefixsearch-description": "执行页面标题的带前缀搜索。\n\n尽管名称类似,但此模块不等于[[Special:PrefixIndex]];详见[[Special:ApiHelp/query+allpages|action=query&list=allpages]]中的apprefix参数。此模块的目的类似[[Special:ApiHelp/opensearch|action=opensearch]]:基于用户的输入提供最佳匹配的标题。取决于搜索引擎后端,这可能包括错拼纠正、避免重定向和其他启发性行为。", + "apihelp-query+prefixsearch-summary": "为页面标题执行前缀搜索。", + "apihelp-query+prefixsearch-extended-description": "尽管名称类似,但此模块不等于[[Special:PrefixIndex]];详见[[Special:ApiHelp/query+allpages|action=query&list=allpages]]中的apprefix参数。此模块的目的类似[[Special:ApiHelp/opensearch|action=opensearch]]:基于用户的输入提供最佳匹配的标题。取决于搜索引擎后端,这可能包括错拼纠正、避免重定向和其他启发性行为。", "apihelp-query+prefixsearch-param-search": "搜索字符串。", "apihelp-query+prefixsearch-param-namespace": "搜索的名字空间。", "apihelp-query+prefixsearch-param-limit": "要返回的结果最大数。", "apihelp-query+prefixsearch-param-offset": "跳过的结果数。", "apihelp-query+prefixsearch-example-simple": "搜索以meaning开头的页面标题。", "apihelp-query+prefixsearch-param-profile": "搜索要使用的配置文件。", - "apihelp-query+protectedtitles-description": "列出所有被限制创建的标题。", + "apihelp-query+protectedtitles-summary": "列出所有被限制创建的标题。", "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。", "apihelp-query+protectedtitles-param-level": "只列出带这些保护级别的标题。", "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。", @@ -939,18 +972,19 @@ "apihelp-query+protectedtitles-paramvalue-prop-level": "添加保护级别。", "apihelp-query+protectedtitles-example-simple": "受保护标题列表。", "apihelp-query+protectedtitles-example-generator": "找到主命名空间中已保护的标题的链接。", - "apihelp-query+querypage-description": "获取由基于QueryPage的特殊页面提供的列表。", + "apihelp-query+querypage-summary": "获取由基于QueryPage的特殊页面提供的列表。", "apihelp-query+querypage-param-page": "特殊页面的名称。注意其区分大小写。", "apihelp-query+querypage-param-limit": "返回的结果数。", "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。", - "apihelp-query+random-description": "获取一组随机页面。\n\n页面列举在一个固定序列中,只有起始点是随机的。这意味着如果Main Page是列表中第一个随机页面的话,List of fictional monkeys将总是第二个,List of people on stamps of Vanuatu是第三个等。", + "apihelp-query+random-summary": "获取随机页面集。", + "apihelp-query+random-extended-description": "页面列举在一个固定序列中,只有起始点是随机的。这意味着如果Main Page是列表中第一个随机页面的话,List of fictional monkeys将总是第二个,List of people on stamps of Vanuatu是第三个等。", "apihelp-query+random-param-namespace": "只返回这些名字空间的页面。", "apihelp-query+random-param-limit": "限制返回多少随机页面。", "apihelp-query+random-param-redirect": "请改用$1filterredir=redirects。", "apihelp-query+random-param-filterredir": "如何过滤重定向。", "apihelp-query+random-example-simple": "从主名字空间返回两个随机页面。", "apihelp-query+random-example-generator": "返回有关来自主名字空间的两个随机页面的页面信息。", - "apihelp-query+recentchanges-description": "列举最近更改。", + "apihelp-query+recentchanges-summary": "列举最近更改。", "apihelp-query+recentchanges-param-start": "枚举的起始时间戳。", "apihelp-query+recentchanges-param-end": "枚举的结束时间戳。", "apihelp-query+recentchanges-param-namespace": "过滤更改为仅限这些名字空间。", @@ -980,7 +1014,7 @@ "apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。", "apihelp-query+recentchanges-example-simple": "最近更改列表。", "apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。", - "apihelp-query+redirects-description": "返回至指定页面的所有重定向。", + "apihelp-query+redirects-summary": "返回至指定页面的所有重定向。", "apihelp-query+redirects-param-prop": "要获取的属性:", "apihelp-query+redirects-paramvalue-prop-pageid": "每个重定向的页面ID。", "apihelp-query+redirects-paramvalue-prop-title": "每个重定向的标题。", @@ -990,10 +1024,11 @@ "apihelp-query+redirects-param-show": "只显示符合这些标准的项目:\n;fragment:只显示带碎片的重定向。\n;!fragment:只显示不带碎片的重定向。", "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。", "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。", - "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# 通过设置标题或页面ID获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的标题或页面ID获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。", + "apihelp-query+revisions-summary": "获取修订版本信息。", + "apihelp-query+revisions-extended-description": "可用于以下几个方面:\n# 通过设置标题或页面ID获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的标题或页面ID获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。", "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。", - "apihelp-query+revisions-param-startid": "从哪个修订版本ID开始列举。", - "apihelp-query+revisions-param-endid": "在此修订版本ID停止修订列举。", + "apihelp-query+revisions-param-startid": "从这个修订版本时间戳开始列举。修订版本必须存在,但未必与该页面相关。", + "apihelp-query+revisions-param-endid": "在这个修订版本时间戳停止列举。修订版本必须存在,但未必与该页面相关。", "apihelp-query+revisions-param-start": "从哪个修订版本时间戳开始列举。", "apihelp-query+revisions-param-end": "列举直至此时间戳。", "apihelp-query+revisions-param-user": "只包含由用户做出的修订。", @@ -1019,17 +1054,17 @@ "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "由用户对修订做出的被解析的摘要。", "apihelp-query+revisions+base-paramvalue-prop-content": "修订文本。", "apihelp-query+revisions+base-paramvalue-prop-tags": "修订标签。", - "apihelp-query+revisions+base-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型$1)。", + "apihelp-query+revisions+base-paramvalue-prop-parsetree": "已弃用。请改用[[Special:ApiHelp/expandtemplates|action=expandtemplates]]或[[Special:ApiHelp/parse|action=parse]]。修订内容的XML解析树(需要内容模型$1)。", "apihelp-query+revisions+base-param-limit": "限制返回多少修订。", - "apihelp-query+revisions+base-param-expandtemplates": "展开修订内容中的模板(需要$1prop=content)。", - "apihelp-query+revisions+base-param-generatexml": "生成用于修订内容的XML解析树(需要$1prop=content;被$1prop=parsetree所取代)。", - "apihelp-query+revisions+base-param-parse": "解析修订内容(需要$1prop=content)。由于性能原因,如果此选项被使用,$1limit会被强制为1。", + "apihelp-query+revisions+base-param-expandtemplates": "请改用[[Special:ApiHelp/expandtemplates|action=expandtemplates]]。展开修订内容中的模板(需要$1prop=content)。", + "apihelp-query+revisions+base-param-generatexml": "请改用[[Special:ApiHelp/expandtemplates|action=expandtemplates]]或[[Special:ApiHelp/parse|action=parse]]。生成用于修订内容的XML解析树(需要$1prop=content;被$1prop=parsetree所取代)。", + "apihelp-query+revisions+base-param-parse": "请改用[[Special:ApiHelp/parse|action=parse]]。解析修订内容(需要$1prop=content)。由于性能原因,如果此选项被使用,$1limit会被强制为1。", "apihelp-query+revisions+base-param-section": "只检索此段落数的内容。", - "apihelp-query+revisions+base-param-diffto": "要比较修订差异的修订ID。使用prev、next和cur分别用于上个、下个和当前修订。", - "apihelp-query+revisions+base-param-difftotext": "要比较修订差异的文本。只有修订的有限数字内的差异。覆盖$1diffto。如果$1section被设置,只有那个段落将与此文本之间比较差异", - "apihelp-query+revisions+base-param-difftotextpst": "在编辑文本前对其执行预保存转换。只当与$1difftotext一起使用时有效。", + "apihelp-query+revisions+base-param-diffto": "请改用[[Special:ApiHelp/compare|action=compare]]。要比较修订差异的修订ID。使用prev、next和cur分别用于上个、下个和当前修订。", + "apihelp-query+revisions+base-param-difftotext": "请改用[[Special:ApiHelp/compare|action=compare]]。要比较修订差异的文本。只有修订的有限数字内的差异。覆盖$1diffto。如果$1section被设置,只有那个段落将与此文本之间比较差异", + "apihelp-query+revisions+base-param-difftotextpst": "请改用[[Special:ApiHelp/compare|action=compare]]。在编辑文本前对其执行预保存转换。只当与$1difftotext一起使用时有效。", "apihelp-query+revisions+base-param-contentformat": "序列化用于$1difftotext的格式并预估内容输出。", - "apihelp-query+search-description": "执行一次全文本搜索。", + "apihelp-query+search-summary": "执行一次全文本搜索。", "apihelp-query+search-param-search": "搜索所有匹配此值的页面标题或内容。根据wiki的搜索后端工具,您可以使用搜索字符串以调用特殊搜索功能。", "apihelp-query+search-param-namespace": "只在这些名字空间搜索。", "apihelp-query+search-param-what": "要执行的搜索类型。", @@ -1047,16 +1082,16 @@ "apihelp-query+search-paramvalue-prop-sectiontitle": "添加匹配章节的标题。", "apihelp-query+search-paramvalue-prop-categorysnippet": "添加已解析的匹配分类片段。", "apihelp-query+search-paramvalue-prop-isfilematch": "添加布尔值,表明搜索是否匹配文件内容。", - "apihelp-query+search-paramvalue-prop-score": "已弃用并已忽略。", - "apihelp-query+search-paramvalue-prop-hasrelated": "已弃用并已忽略。", + "apihelp-query+search-paramvalue-prop-score": "已忽略。", + "apihelp-query+search-paramvalue-prop-hasrelated": "已忽略。", "apihelp-query+search-param-limit": "返回的总计页面数。", "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。", "apihelp-query+search-param-backend": "要使用的搜索后端,如果没有则为默认。", - "apihelp-query+search-param-enablerewrites": "启用内部查询重写。一些搜索后端可以重写查询到它认为会给出更好结果的地方,例如纠正拼写错误。", + "apihelp-query+search-param-enablerewrites": "启用内部查询重写。一些搜索后端可以重写查询到另一个被认为能提供更好结果的位置,例如纠正拼写错误。", "apihelp-query+search-example-simple": "搜索meaning。", "apihelp-query+search-example-text": "搜索文本meaning。", "apihelp-query+search-example-generator": "获取有关搜索meaning返回页面的页面信息。", - "apihelp-query+siteinfo-description": "返回有关网站的一般信息。", + "apihelp-query+siteinfo-summary": "返回有关网站的一般信息。", "apihelp-query+siteinfo-param-prop": "要获取的信息:", "apihelp-query+siteinfo-paramvalue-prop-general": "全部系统信息。", "apihelp-query+siteinfo-paramvalue-prop-namespaces": "注册的名字空间及其规范名称列表。", @@ -1073,11 +1108,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "当可用时返回wiki的版权(许可协议)信息。", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。", "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用$1inlanguagecode本地化)。", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:Special:MyLanguage/LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。", "apihelp-query+siteinfo-paramvalue-prop-skins": "返回所有启用的皮肤列表(可选择使用$1inlanguagecode本地化,否则是内容语言)。", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "返回解析器扩展标签列表。", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "返回解析器函数钩列表。", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表([[mw:Manual:$wgHooks|$wgHooks]]的内容)。", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表([[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]的内容)。", "apihelp-query+siteinfo-paramvalue-prop-variables": "返回变量ID列表。", "apihelp-query+siteinfo-paramvalue-prop-protocols": "返回外部链接中允许的协议列表。", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "返回用户设置的默认值。", @@ -1089,12 +1124,12 @@ "apihelp-query+siteinfo-example-simple": "取得网站信息。", "apihelp-query+siteinfo-example-interwiki": "取得本地跨wiki前缀列表。", "apihelp-query+siteinfo-example-replag": "检查当前的响应延迟。", - "apihelp-query+stashimageinfo-description": "返回用于藏匿文件的文件信息。", + "apihelp-query+stashimageinfo-summary": "返回用于藏匿文件的文件信息。", "apihelp-query+stashimageinfo-param-filekey": "用于识别一次临时藏匿的早前上传的关键字。", "apihelp-query+stashimageinfo-param-sessionkey": "$1filekey的别名,用于向后兼容。", "apihelp-query+stashimageinfo-example-simple": "返回藏匿文件的信息。", "apihelp-query+stashimageinfo-example-params": "返回两个藏匿文件的缩略图。", - "apihelp-query+tags-description": "列出更改标签。", + "apihelp-query+tags-summary": "列出更改标签。", "apihelp-query+tags-param-limit": "列出标签的最大数量。", "apihelp-query+tags-param-prop": "要获取的属性:", "apihelp-query+tags-paramvalue-prop-name": "添加标签名称。", @@ -1105,7 +1140,7 @@ "apihelp-query+tags-paramvalue-prop-source": "获得标签来源,它可能包括用于扩展定义的标签的extension,以及用于可被用户手动应用的标签的manual。", "apihelp-query+tags-paramvalue-prop-active": "标签是否仍可被应用。", "apihelp-query+tags-example-simple": "可用标签列表。", - "apihelp-query+templates-description": "返回指定页面上所有被嵌入的页面。", + "apihelp-query+templates-summary": "返回指定页面上所有被嵌入的页面。", "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。", "apihelp-query+templates-param-limit": "返回的模板数量。", "apihelp-query+templates-param-templates": "只列出这些模板。对于检查某一页面使用某一模板很有用。", @@ -1113,11 +1148,11 @@ "apihelp-query+templates-example-simple": "获取在页面Main Page使用的模板。", "apihelp-query+templates-example-generator": "获取有关Main Page中使用的模板页面的信息。", "apihelp-query+templates-example-namespaces": "获取在{{ns:user}}和{{ns:template}}名字空间中,嵌入在Main Page页面的页面。", - "apihelp-query+tokens-description": "获取可修改数据的操作的令牌。", + "apihelp-query+tokens-summary": "获取可修改数据的操作的令牌。", "apihelp-query+tokens-param-type": "要请求的令牌类型。", "apihelp-query+tokens-example-simple": "检索一个csrf令牌(默认)。", "apihelp-query+tokens-example-types": "检索一个监视令牌和一个巡查令牌。", - "apihelp-query+transcludedin-description": "查找所有嵌入指定页面的页面。", + "apihelp-query+transcludedin-summary": "查找所有嵌入指定页面的页面。", "apihelp-query+transcludedin-param-prop": "要获取的属性:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "每个页面的页面ID。", "apihelp-query+transcludedin-paramvalue-prop-title": "每个页面的标题。", @@ -1127,7 +1162,7 @@ "apihelp-query+transcludedin-param-show": "只显示符合以下标准的项:\n;redirect:只显示重定向。\n;!redirect:只显示非重定向。", "apihelp-query+transcludedin-example-simple": "获取嵌入Main Page的页面列表。", "apihelp-query+transcludedin-example-generator": "获取有关嵌入Main Page的页面的信息。", - "apihelp-query+usercontribs-description": "获取一位用户的所有编辑。", + "apihelp-query+usercontribs-summary": "获取一位用户的所有编辑。", "apihelp-query+usercontribs-param-limit": "返回贡献的最大数量。", "apihelp-query+usercontribs-param-start": "返回的起始时间戳。", "apihelp-query+usercontribs-param-end": "返回的最终时间戳。", @@ -1146,21 +1181,22 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "添加编辑标记。", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。", "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。", - "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:$2show=!minor。\n\n如果$2show=patrolled或$2show=!patrolled被设定,早于[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]($1秒)的修订不会被显示。", + "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:$2show=!minor。\n\n如果$2show=patrolled或$2show=!patrolled被设定,早于[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]($1秒)的修订不会被显示。", "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。", "apihelp-query+usercontribs-param-toponly": "只列举作为最新修订的更改。", "apihelp-query+usercontribs-example-user": "显示用户Example的贡献。", "apihelp-query+usercontribs-example-ipprefix": "显示来自192.0.2.前缀所有 IP 地址的贡献。", - "apihelp-query+userinfo-description": "获取有关当前用户的信息。", + "apihelp-query+userinfo-summary": "获取有关当前用户的信息。", "apihelp-query+userinfo-param-prop": "要包含的信息束:", "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签messages。", "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "列举明确分配给当前用户的用户组,包括每个用户组成员的过期时间。", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。", "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "列举当前用户可以添加并移除的用户组。", "apihelp-query+userinfo-paramvalue-prop-options": "列举当前用户设置的所有参数设置。", - "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "已弃用。获取令牌以更改当前用户的参数设置。", + "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "获取令牌以更改当前用户的参数设置。", "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。", "apihelp-query+userinfo-paramvalue-prop-ratelimits": "列举所有应用到当前用户的速率限制。", "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。", @@ -1172,10 +1208,11 @@ "apihelp-query+userinfo-param-attachedwiki": "与$1prop=centralids一起使用,表明用户是否附加于此ID定义的wiki。", "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。", "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息。", - "apihelp-query+users-description": "获取有关列出用户的信息。", + "apihelp-query+users-summary": "获取有关列出用户的信息。", "apihelp-query+users-param-prop": "要包含的信息束:", "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。", "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。", + "apihelp-query+users-paramvalue-prop-groupmemberships": "列举明确分配给每位用户的用户组,包括每个用户组成员的过期时间。", "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。", "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。", "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。", @@ -1189,7 +1226,7 @@ "apihelp-query+users-param-userids": "要获得信息的用户ID列表。", "apihelp-query+users-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。", "apihelp-query+users-example-simple": "返回用户Example的信息。", - "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。", + "apihelp-query+watchlist-summary": "在当前用户的监视列表中获取对页面的最近更改。", "apihelp-query+watchlist-param-allrev": "将同一页面的多个修订包含于指定的时间表内。", "apihelp-query+watchlist-param-start": "枚举的起始时间戳。", "apihelp-query+watchlist-param-end": "枚举的结束时间戳。", @@ -1225,7 +1262,7 @@ "apihelp-query+watchlist-example-generator": "在当前用户的监视列表中检索用于最近更改页面的页面信息。", "apihelp-query+watchlist-example-generator-rev": "在当前用户的监视列表中检索用于对页面最近更改的修订信息。", "apihelp-query+watchlist-example-wlowner": "在用户Example的监视列表中列出用于最近更改页面的最新修订。", - "apihelp-query+watchlistraw-description": "获得当前用户的监视列表上的所有页面。", + "apihelp-query+watchlistraw-summary": "获得当前用户的监视列表上的所有页面。", "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。", "apihelp-query+watchlistraw-param-limit": "根据结果返回的结果总数。", "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:", @@ -1238,15 +1275,15 @@ "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。", "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。", "apihelp-query+watchlistraw-example-generator": "检索当前用户监视列表上的页面的页面信息。", - "apihelp-removeauthenticationdata-description": "从当前用户移除身份验证数据。", + "apihelp-removeauthenticationdata-summary": "从当前用户移除身份验证数据。", "apihelp-removeauthenticationdata-example-simple": "尝试移除当前用户的FooAuthenticationRequest数据。", - "apihelp-resetpassword-description": "向用户发送密码重置邮件。", - "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]中启用路由以使用此模块。", + "apihelp-resetpassword-summary": "向用户发送密码重置邮件。", + "apihelp-resetpassword-extended-description-noroutes": "没有密码重置路由可用。\n\n在[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]中启用路由以使用此模块。", "apihelp-resetpassword-param-user": "正在重置的用户。", "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。", "apihelp-resetpassword-example-user": "向用户Example发送密码重置邮件。", "apihelp-resetpassword-example-email": "向所有电子邮件地址为user@example.com的用户发送密码重置邮件。", - "apihelp-revisiondelete-description": "删除和恢复修订版本。", + "apihelp-revisiondelete-summary": "删除和恢复修订版本。", "apihelp-revisiondelete-param-type": "正在执行的修订版本删除类型。", "apihelp-revisiondelete-param-target": "要进行修订版本删除的页面标题,如果对某一类型需要。", "apihelp-revisiondelete-param-ids": "用于将被删除的修订的标识符。", @@ -1257,7 +1294,8 @@ "apihelp-revisiondelete-param-tags": "要在删除日志中应用到实体的标签。", "apihelp-revisiondelete-example-revision": "隐藏首页的修订版本12345的内容。", "apihelp-revisiondelete-example-log": "隐藏日志记录67890上的所有数据,原因BLP violation。", - "apihelp-rollback-description": "撤销对页面的最近编辑。\n\n如果最近编辑页面的用户在一行中进行多次编辑,所有编辑将被回退。", + "apihelp-rollback-summary": "撤销对页面的最近编辑。", + "apihelp-rollback-extended-description": "如果上一对页面做出编辑的用户连续做出了多次编辑,它们将全数被回退。", "apihelp-rollback-param-title": "要回退的页面标题。不能与$1pageid一起使用。", "apihelp-rollback-param-pageid": "要回退的页面的页面 ID。不能与$1title一起使用。", "apihelp-rollback-param-tags": "要应用在回退上的标签。", @@ -1267,9 +1305,10 @@ "apihelp-rollback-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。", "apihelp-rollback-example-simple": "回退由用户Example对Main Page做出的最近编辑。", "apihelp-rollback-example-summary": "回退由IP用户192.0.2.5对页面Main Page做出的最近编辑,带编辑摘要Reverting vandalism,并将这些编辑和回退标记为机器人编辑。", - "apihelp-rsd-description": "导出一个RSD(Really Simple Discovery)架构。", + "apihelp-rsd-summary": "导出一个RSD(Really Simple Discovery)架构。", "apihelp-rsd-example-simple": "导出RSD架构。", - "apihelp-setnotificationtimestamp-description": "更新用于监视页面的通知时间戳。\n\n这会影响监视列表和历史中已更改页面的高亮度,并且如果“{{int:tog-enotifwatchlistpages}}”设置被启用的话,也会影响电子邮件的发送。", + "apihelp-setnotificationtimestamp-summary": "更新监视页面的通知时间戳。", + "apihelp-setnotificationtimestamp-extended-description": "这会影响监视列表和历史中已更改页面的高亮度,并且如果“{{int:tog-enotifwatchlistpages}}”设置被启用的话,也会影响电子邮件的发送。", "apihelp-setnotificationtimestamp-param-entirewatchlist": "工作于所有已监视页面。", "apihelp-setnotificationtimestamp-param-timestamp": "要设置通知时间戳的时间戳。", "apihelp-setnotificationtimestamp-param-torevid": "要设置通知时间戳的修订(只限一个页面)。", @@ -1278,8 +1317,8 @@ "apihelp-setnotificationtimestamp-example-page": "重置用于Main page的通知状态。", "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置Main page的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。", "apihelp-setnotificationtimestamp-example-allpages": "重置在{{ns:user}}名字空间中的页面的通知状态。", - "apihelp-setpagelanguage-description": "更改页面的语言。", - "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]以使用此操作。", + "apihelp-setpagelanguage-summary": "更改页面的语言。", + "apihelp-setpagelanguage-extended-description-disabled": "此wiki不允许更改页面的语言。\n\n启用[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]以使用此操作。", "apihelp-setpagelanguage-param-title": "您希望更改语言的页面标题。不能与$1pageid一起使用。", "apihelp-setpagelanguage-param-pageid": "您希望更改语言的页面ID。不能与$1title一起使用。", "apihelp-setpagelanguage-param-lang": "更改页面的目标语言的语言代码。使用default以重置页面为wiki的默认内容语言。", @@ -1287,7 +1326,8 @@ "apihelp-setpagelanguage-param-tags": "要应用到此操作导致的日志记录的更改标签。", "apihelp-setpagelanguage-example-language": "更改Main Page的语言为巴斯克语。", "apihelp-setpagelanguage-example-default": "更改ID为123的页面的语言为wiki的默认内容语言。", - "apihelp-stashedit-description": "在分享的缓存中准备一次编辑。\n\n这是为了从编辑表单中通过AJAX使用,以改进页面保存的性能。", + "apihelp-stashedit-summary": "在分享缓存中准备编辑。", + "apihelp-stashedit-extended-description": "这是打算通过使用来自编辑表单的AJAX以改进页面保存的性能。", "apihelp-stashedit-param-title": "已开始编辑的页面标题。", "apihelp-stashedit-param-section": "段落数。0用于首段,new用于新的段落。", "apihelp-stashedit-param-sectiontitle": "新段落的标题。", @@ -1297,7 +1337,7 @@ "apihelp-stashedit-param-contentformat": "用于输入文本的内容序列化格式。", "apihelp-stashedit-param-baserevid": "基础修订的修订ID。", "apihelp-stashedit-param-summary": "更改摘要。", - "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。", + "apihelp-tag-summary": "从个别修订或日志记录中添加或移除更改标签。", "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。", "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。", "apihelp-tag-param-logid": "要添加或移除标签的一个或更多的日志记录ID。", @@ -1307,11 +1347,12 @@ "apihelp-tag-param-tags": "要应用到将被创建为此操作结果的日志实体的标签。", "apihelp-tag-example-rev": "将vandalism标签添加至修订ID 123,而不指定原因", "apihelp-tag-example-log": "从日志记录ID 123移除spam标签,原因为Wrongly applied", - "apihelp-tokens-description": "获取可修改数据的操作的令牌。\n\n此模块被弃用以有利于[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。", + "apihelp-tokens-summary": "获取数据修改操作的令牌。", + "apihelp-tokens-extended-description": "此模块已弃用,以便[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]使用。", "apihelp-tokens-param-type": "要请求的令牌类型。", "apihelp-tokens-example-edit": "检索一个编辑令牌(默认)。", "apihelp-tokens-example-emailmove": "检索一个电子邮件令牌和一个移动令牌。", - "apihelp-unblock-description": "解封一位用户。", + "apihelp-unblock-summary": "解封一位用户。", "apihelp-unblock-param-id": "解封时需要的封禁ID(通过list=blocks获得)。不能与$1user或$1userid一起使用。", "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP地址段。不能与$1id或$1userid一起使用。", "apihelp-unblock-param-userid": "要封禁的用户ID。不能与$1id或$1user一起使用。", @@ -1319,7 +1360,8 @@ "apihelp-unblock-param-tags": "要在封禁日志中应用到实体的更改标签。", "apihelp-unblock-example-id": "解封封禁ID #105。", "apihelp-unblock-example-user": "解封用户Bob,原因Sorry Bob。", - "apihelp-undelete-description": "恢复一个被删除页面的修订。\n\n被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。", + "apihelp-undelete-summary": "恢复删除页面的修订版本。", + "apihelp-undelete-extended-description": "被删除修订的列表(包括时间戳)可通过[[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]检索到,并且被删除的文件ID列表可通过[[Special:ApiHelp/query+filearchive|list=filearchive]]检索到。", "apihelp-undelete-param-title": "要恢复的页面标题。", "apihelp-undelete-param-reason": "恢复的原因。", "apihelp-undelete-param-tags": "要在删除日志中应用到实体的更改标签。", @@ -1328,9 +1370,10 @@ "apihelp-undelete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。", "apihelp-undelete-example-page": "恢复页面Main Page。", "apihelp-undelete-example-revisions": "恢复Main Page的两个修订。", - "apihelp-unlinkaccount-description": "从当前用户移除已连接的第三方账户。", + "apihelp-unlinkaccount-summary": "从当前用户移除已连接的第三方账户。", "apihelp-unlinkaccount-example-simple": "尝试移除当前用户的,与FooAuthenticationRequest相关联提供方的链接。", - "apihelp-upload-description": "上传一个文件,或获取正在等待中的上传的状态。\n\n可以使用的几种方法:\n* 直接上传文件内容,使用$1file参数。\n* 成批上传文件,使用$1filesize、$1chunk和$1offset参数。\n* 有MediaWiki服务器从URL检索一个文件,使用$1url参数。\n* 完成一次由于警告而失败的早前上传,使用$1filekey参数。\n需要注意,当发送$1file时,HTTP POST必须做为一次文件上传(也就是使用multipart/form-data)完成。", + "apihelp-upload-summary": "上传文件,或获取正在等待中的上传的状态。", + "apihelp-upload-extended-description": "可以使用的几种方法:\n* 直接上传文件内容,使用$1file参数。\n* 成批上传文件,使用$1filesize、$1chunk和$1offset参数。\n* 有MediaWiki服务器从URL检索一个文件,使用$1url参数。\n* 完成一次由于警告而失败的早前上传,使用$1filekey参数。\n需要注意,当发送$1file时,HTTP POST必须做为一次文件上传(也就是使用multipart/form-data)完成。", "apihelp-upload-param-filename": "目标文件名。", "apihelp-upload-param-comment": "上传注释。如果没有指定$1text,那么它也被用于新文件的初始页面文本。", "apihelp-upload-param-tags": "更改标签以应用于上传日志记录和文件页面修订中。", @@ -1350,7 +1393,7 @@ "apihelp-upload-param-checkstatus": "只检索指定文件密钥的上传状态。", "apihelp-upload-example-url": "从URL上传。", "apihelp-upload-example-filekey": "完成一次由于警告而失败的上传。", - "apihelp-userrights-description": "更改一位用户的组成员。", + "apihelp-userrights-summary": "更改一位用户的组成员。", "apihelp-userrights-param-user": "用户名。", "apihelp-userrights-param-userid": "用户ID。", "apihelp-userrights-param-add": "将用户加入至这些组中,或如果其已作为成员,更新其所在用户组成员资格的终止时间。", @@ -1361,14 +1404,15 @@ "apihelp-userrights-example-user": "将用户FooBot添加至bot用户组,并从sysop和bureaucrat组移除。", "apihelp-userrights-example-userid": "将ID为123的用户加入至机器人组,并将其从管理员和行政员组移除。", "apihelp-userrights-example-expiry": "添加用户SometimeSysop至用户组sysop,为期1个月。", - "apihelp-validatepassword-description": "验证密码是否符合wiki的密码方针。\n\n如果密码可以接受,就报告有效性为Good,如果密码可用于登录但必须更改,则报告为Change,或如果密码不可使用,则报告为Invalid。", + "apihelp-validatepassword-summary": "验证密码是否符合wiki的密码方针。", + "apihelp-validatepassword-extended-description": "如果密码可以接受,就报告有效性为Good,如果密码可用于登录但必须更改,则报告为Change,或如果密码不可使用,则报告为Invalid。", "apihelp-validatepassword-param-password": "要验证的密码。", "apihelp-validatepassword-param-user": "用户名,供测试账户创建时使用。命名的用户必须不存在。", "apihelp-validatepassword-param-email": "电子邮件,供测试账户创建时使用。", "apihelp-validatepassword-param-realname": "真实姓名,供测试账户创建时使用。", "apihelp-validatepassword-example-1": "验证当前用户的密码foobar。", "apihelp-validatepassword-example-2": "为创建用户Example验证密码qwerty。", - "apihelp-watch-description": "从当前用户的监视列表中添加或移除页面。", + "apihelp-watch-summary": "从当前用户的监视列表中添加或移除页面。", "apihelp-watch-param-title": "要(取消)监视的页面。也可使用$1titles。", "apihelp-watch-param-unwatch": "如果设置页面将被取消监视而不是被监视。", "apihelp-watch-example-watch": "监视页面Main Page。", @@ -1376,25 +1420,30 @@ "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。", "apihelp-format-example-generic": "返回查询结果为$1格式。", "apihelp-format-param-wrappedhtml": "作为一个JSON对象返回优质打印的HTML和关联的ResouceLoader模块。", - "apihelp-json-description": "输出数据为JSON格式。", + "apihelp-json-summary": "输出数据为JSON格式。", "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。", "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当formatversion不是1时。", "apihelp-json-param-ascii": "如果指定,使用十六进制转义序列将所有非ASCII编码。默认当formatversion为1时。", "apihelp-json-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的*键等)。\n;2:实验现代格式。细节可能更改!\n;latest:使用最新格式(当前为2),格式可能在没有警告的情况下更改。", - "apihelp-jsonfm-description": "输出数据为JSON格式(HTML优质打印效果)。", - "apihelp-none-description": "不输出任何东西。", - "apihelp-php-description": "输出数据为序列化PHP格式。", + "apihelp-jsonfm-summary": "输出数据为JSON格式(HTML优质打印效果)。", + "apihelp-none-summary": "不输出任何东西。", + "apihelp-php-summary": "输出数据为序列化PHP格式。", "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的*键等)。\n;2:实验现代格式。细节可能更改!\n;latest:使用最新格式(当前为2),格式可能在没有警告的情况下更改。", - "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。", - "apihelp-rawfm-description": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。", - "apihelp-xml-description": "输出数据为XML格式。", + "apihelp-phpfm-summary": "输出数据为序列化PHP格式(HTML优质打印效果)。", + "apihelp-rawfm-summary": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。", + "apihelp-xml-summary": "输出数据为XML格式。", "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:MediaWiki}}名字空间以.xsl为结尾的标题。", "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。", - "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。", + "apihelp-xmlfm-summary": "输出数据为XML格式(HTML优质打印效果)。", "api-format-title": "MediaWiki API 结果", - "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定format参数以更改输出格式。要查看$1格式的非HTML表示,设置format=$2。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。", - "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", + "api-format-prettyprint-header": "这是$1格式的HTML实现。HTML对调试很有用,但不适合应用程序使用。\n\n指定format参数以更改输出格式。要查看$1格式的非HTML实现,设置format=$2。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", + "api-format-prettyprint-header-only-html": "这是用来调试的HTML实现,不适合实际使用。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", + "api-format-prettyprint-header-hyperlinked": "这是$1格式的HTML实现。HTML对调试很有用,但不适合应用程序使用。\n\n指定format参数以更改输出格式。要查看$1格式的非HTML实现,设置[$3 format=$2]。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", "api-format-prettyprint-status": "此响应将会返回HTTP状态$1 $2。", + "api-login-fail-aborted": "身份验证需要用户交互,而其不被action=login支持。要通过action=login登录,请参见[[Special:BotPasswords]]。要继续使用主账户登录,请参见[[Special:ApiHelp/clientlogin|action=clientlogin]]。", + "api-login-fail-aborted-nobotpw": "身份验证需要用户交互,而其不被action=login支持。要登录,请参见[[Special:ApiHelp/clientlogin|action=clientlogin]]。", + "api-login-fail-badsessionprovider": "当使用$1时不能登录。", + "api-login-fail-sameorigin": "当同源协议未应用时不能登录。", "api-pageset-param-titles": "要工作的标题列表。", "api-pageset-param-pageids": "要工作的页面ID列表。", "api-pageset-param-revids": "要工作的修订ID列表。", @@ -1405,6 +1454,7 @@ "api-help-title": "MediaWiki API 帮助", "api-help-lead": "这是自动生成的MediaWiki API文档页面。\n\n文档和例子:https://www.mediawiki.org/wiki/API:Main_page/zh", "api-help-main-header": "主模块", + "api-help-undocumented-module": "没有用于模块$1的文档。", "api-help-flag-deprecated": "此模块已弃用。", "api-help-flag-internal": "此模块是内部或不稳定的。它的操作可以更改而不另行通知。", "api-help-flag-readrights": "此模块需要读取权限。", @@ -1441,8 +1491,8 @@ "api-help-param-default-empty": "默认:(空)", "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌", "api-help-param-token-webui": "出于兼容性考虑,web UI中使用的令牌也被接受。", - "api-help-param-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。", - "api-help-param-limited-in-miser-mode": "注意:由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于$1limit个结果;极端情况下可能不会返回任何结果。", + "api-help-param-disabled-in-miser-mode": "由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]]而禁用。", + "api-help-param-limited-in-miser-mode": "注意:由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于$1limit个结果;极端情况下可能不会返回任何结果。", "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。", "api-help-param-continue": "当更多结果可用时,使用这个继续。", "api-help-param-no-description": "(没有说明)", @@ -1457,7 +1507,7 @@ "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。", "api-help-authmanagerhelper-mergerequestfields": "合并用于所有身份验证请求的字段信息至一个数组中。", "api-help-authmanagerhelper-preservestate": "从之前失败的登录尝试中保持状态,如果可能。", - "api-help-authmanagerhelper-returnurl": "为第三方身份验证流返回URL,必须为绝对值。需要此值或$1continue两者之一。\n\nUpon receiving a REDIRECT response, you will typically open a browser or web view to the specified redirecttarget 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 $1continue request to this API module.", + "api-help-authmanagerhelper-returnurl": "为第三方身份验证流返回URL,必须为绝对值。需要此值或$1continue两者之一。\n\n在接收REDIRECT响应时,您将代表性的打开浏览器或web视图到特定用于第三方身份验证流的redirecttarget URL。当它完成时,第三方将发生浏览器或web视图至此URL。您应当提取任何来自URL的查询或POST参数,并作为$1continue请求传递至此API模块。", "api-help-authmanagerhelper-continue": "此请求是在早先的UI或REDIRECT响应之后的附加请求。必需此值或$1returnurl。", "api-help-authmanagerhelper-additional-params": "此模块允许额外参数,取决于可用的身份验证请求。使用[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]与amirequestsfor=$1(或之前来自此模块的相应,如果可以)以决定可用请求及其使用的字段。", "apierror-allimages-redirect": "当使用allimages作为发生器时,请使用gaifilterredir=nonredirects而不是redirects。", @@ -1507,7 +1557,8 @@ "apierror-changeauth-norequest": "创建更改请求失败。", "apierror-chunk-too-small": "对于非最终块,最小块大小为$1{{PLURAL:$1|字节}}。", "apierror-cidrtoobroad": "比/$2更宽的$1 CIDR地址段不被接受。", - "apierror-compare-inputneeded": "需要标题、页面ID或修订版本号以用于from和to参数。", + "apierror-compare-no-title": "不能在没有标题的情况下预保存转换。尝试指定fromtitle或totitle。", + "apierror-compare-relative-to-nothing": "没有与torelative的“from”修订版本相对的版本。", "apierror-contentserializationexception": "内容序列化失败:$1", "apierror-contenttoobig": "您提供的内容超过了$1{{PLURAL:$1|千字节}}的条目大小限制。", "apierror-copyuploadbaddomain": "不允许从此域名通过URL上传。", @@ -1551,10 +1602,12 @@ "apierror-maxlag": "正在等待$2:已延迟$1{{PLURAL:$1|秒}}。", "apierror-mimesearchdisabled": "MIME搜索在Miser模式中被禁用。", "apierror-missingcontent-pageid": "丢失ID为$1的页面的内容。", + "apierror-missingcontent-revid": "丢失ID为$1的修订版本的内容。", "apierror-missingparam-at-least-one-of": "需要{{PLURAL:$2|参数$1|$1中的至少一个参数}}。", "apierror-missingparam-one-of": "需要{{PLURAL:$2|参数$1|$1中的一个参数}}。", "apierror-missingparam": "$1参数必须被设置。", "apierror-missingrev-pageid": "没有ID为$1的页面的当前修订版本。", + "apierror-missingrev-title": "没有标题$1的当前修订版本。", "apierror-missingtitle-createonly": "丢失标题只可以通过create保护。", "apierror-missingtitle": "您指定的页面不存在。", "apierror-missingtitle-byname": "页面$1不存在。", @@ -1588,6 +1641,7 @@ "apierror-notarget": "您没有为此章节指定有效目标。", "apierror-notpatrollable": "修订版本r$1不能巡查,因为它太旧了。", "apierror-nouploadmodule": "未设置上传模块。", + "apierror-offline": "由于网络连接问题无法进行。请确保您的网络连接正常工作,并重试。", "apierror-opensearch-json-warnings": "警告不能以OpenSearch JSON格式表示。", "apierror-pagecannotexist": "名字空间不允许实际页面。", "apierror-pagedeleted": "在您取得页面时间戳以来,页面已被删除。", @@ -1612,6 +1666,7 @@ "apierror-revdel-mutuallyexclusive": "同一字段不能同时用于hide和show。", "apierror-revdel-needtarget": "此修订版本删除类型需要目标标题。", "apierror-revdel-paramneeded": "需要hide和/或show的至少一个值。", + "apierror-revisions-badid": "未找到参数$1的修订版本。", "apierror-revisions-norevids": "revids参数不能与列表选项($1limit、$1startid、$1endid、$1dir=newer、$1user、$1excludeuser、$1start和$1end)一起使用", "apierror-revisions-singlepage": "titles、pageids或发生器用于提供多个页面,但$1limit、$1startid、$1endid、$1dir=newer、$1user、$1excludeuser、$1start和$1end参数只能在一个页面上使用。", "apierror-revwrongpage": "r$1不是$2的修订版本。", @@ -1631,10 +1686,13 @@ "apierror-stashfilestorage": "不能在暂存处存储上传:$1", "apierror-stashinvalidfile": "无效暂存文件。", "apierror-stashnosuchfilekey": "没有这个filekey:$1。", + "apierror-stashpathinvalid": "文件密钥的格式不正确,或属于其他无效格式:$1。", "apierror-stashwrongowner": "错误所有者:$1", "apierror-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。", "apierror-systemblocked": "您已被MediaWiki自动封禁。", "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。", + "apierror-timeout": "服务器没有在预期时间内响应。", + "apierror-toofewexpiries": "提供了$1个逾期{{PLURAL:$1|时间戳}},实际则需要$2个。", "apierror-unknownaction": "指定的操作$1不被承认。", "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。", "apierror-unknownerror-nocode": "未知错误。", @@ -1652,7 +1710,9 @@ "apiwarn-alldeletedrevisions-performance": "当生成标题时,为获得更好性能,请设置$1dir=newer。", "apiwarn-badurlparam": "不能为$2解析$1urlparam。请只使用宽和高。", "apiwarn-badutf8": "$1通过的值包含无效或非标准化数据。正文数据应为有效的NFC标准化Unicode,没有除HT(\\t)、LF(\\n)和CR(\\r)以外的C0控制字符。", - "apiwarn-deprecation-deletedrevs": "list=deletedrevs已被弃用。请改用prop=deletedrevisions或list=alldeletedrevisions。", + "apiwarn-checktoken-percentencoding": "在令牌中检查例如“+”的符号会在URL中适当进行百分号编码。", + "apiwarn-compare-nocontentmodel": "没有可以定义的模型,假定为$1。", + "apiwarn-deprecation-deletedrevs": "list=deletedrevs已弃用。请改用prop=deletedrevisions或list=alldeletedrevisions。", "apiwarn-deprecation-expandtemplates-prop": "因为没有为prop参数指定值,所以在输出上使用了遗留格式。这种格式已弃用,并且将来会为prop参数设置默认值,这会导致新格式总会被使用。", "apiwarn-deprecation-httpsexpected": "当应为HTTPS时,HTTP被使用。", "apiwarn-deprecation-login-botpw": "通过action=login的主账户登录已被弃用,并可能在未事先警告的情况下停止工作。要继续通过action=login登录,请参见[[Special:BotPasswords]]。要安全继续使用主账户登录,请参见action=clientlogin。", @@ -1660,7 +1720,7 @@ "apiwarn-deprecation-login-token": "通过action=login取得令牌已弃用。请改用action=query&meta=tokens&type=login。", "apiwarn-deprecation-parameter": "参数$1已被弃用。", "apiwarn-deprecation-parse-headitems": "prop=headitems从MediaWiki 1.28版开始已弃用。在创建新HTML文档时请使用prop=headhtml,或当更新文档客户端时请使用prop=modules|jsconfigvars。", - "apiwarn-deprecation-purge-get": "通过GET使用action=purge已被弃用。请改用POST。", + "apiwarn-deprecation-purge-get": "通过GET使用action=purge已弃用。请改用POST。", "apiwarn-deprecation-withreplacement": "$1已弃用。请改用$2。", "apiwarn-difftohidden": "不能与r$1做差异比较:内容被隐藏。", "apiwarn-errorprinterfailed": "错误打印失败。将在没有参数的前提下重试。", @@ -1675,12 +1735,15 @@ "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。", "apiwarn-parse-nocontentmodel": "title或contentmodel未提供,假设$1。", "apiwarn-parse-titlewithouttext": "title在没有text的情况下被使用,并且请求了已解析页面的属性。您是想用page而不是title么?", + "apiwarn-redirectsandrevids": "重定向解决方案不能与revids参数一起使用。任何revids所指向的重定向都未被解决。", "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。", + "apiwarn-tokens-origin": "在未应用同来源方针时,令牌可能无法获得。", "apiwarn-toomanyvalues": "参数$1指定了太多的值。上限为$2。", "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。", "apiwarn-unclearnowtimestamp": "为时间戳参数$1传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用now。", "apiwarn-unrecognizedvalues": "参数$1有无法识别的{{PLURAL:$3|值}}:$2。", "apiwarn-unsupportedarray": "参数$1使用未受支持的PHP数组语法。", + "apiwarn-urlparamwidth": "为了获得衍生自$1urlwidth/$1urlheight的宽度值($3),正在忽略$1urlparam的宽度值集($2)。", "apiwarn-validationfailed-badchars": "关键词中的字符无效(只允许a-z、A-Z、0-9、_和-)。", "apiwarn-validationfailed-badpref": "不是有效的偏好。", "apiwarn-validationfailed-cannotset": "不能通过此模块设置。", diff --git a/includes/api/i18n/zh-hant.json b/includes/api/i18n/zh-hant.json index 6f2bcd61dc..a311728662 100644 --- a/includes/api/i18n/zh-hant.json +++ b/includes/api/i18n/zh-hant.json @@ -10,10 +10,12 @@ "Jasonzhuocn", "Winstonyin", "Arthur2e5", - "烈羽" + "烈羽", + "Corainn", + "A2093064" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n
    \n狀態資訊:本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n錯誤的請求:當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n測試:要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。", + "apihelp-main-extended-description": "
    \n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n
    \n狀態資訊:本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n錯誤的請求:當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n測試:要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。", "apihelp-main-param-action": "要執行的動作。", "apihelp-main-param-format": "輸出的格式。", "apihelp-main-param-smaxage": "將HTTP緩存控制頭欄位設為s-maxage秒。錯誤不會做緩存。", @@ -24,7 +26,7 @@ "apihelp-main-param-servedby": "在結果中包括提出請求的主機名。", "apihelp-main-param-curtimestamp": "在結果中包括目前的時間戳。", "apihelp-main-param-responselanginfo": "在結果中包括uselang和errorlang所用的語言。", - "apihelp-block-description": "封鎖使用者。", + "apihelp-block-summary": "封鎖使用者。", "apihelp-block-param-user": "您要封鎖的使用者名稱、IP 位址或 IP 範圍。", "apihelp-block-param-reason": "封鎖原因。", "apihelp-block-param-anononly": "僅封鎖匿名使用者 (禁止這個 IP 位址的匿名使用者編輯)。", @@ -37,14 +39,15 @@ "apihelp-block-param-watchuser": "監視使用者或 IP 位址的使用者頁面與對話頁面。", "apihelp-block-example-ip-simple": "封鎖 IP 位址 192.0.2.5 三天,原因為 First strike。", "apihelp-block-example-user-complex": "永久封鎖 IP 位址 Vandal,原因為 Vandalism。", - "apihelp-checktoken-description": "檢查來自 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 的密鑰有效性。", + "apihelp-checktoken-summary": "檢查來自 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 的密鑰有效性。", "apihelp-checktoken-param-type": "要測試的密鑰類型。", "apihelp-checktoken-param-token": "要測試的密鑰。", "apihelp-checktoken-param-maxtokenage": "密鑰的有效期間,以秒為單位。", "apihelp-checktoken-example-simple": "測試 csrf 密鑰的有效性。", - "apihelp-clearhasmsg-description": "清除目前使用者的 hasmsg 標記。", + "apihelp-clearhasmsg-summary": "清除目前使用者的 hasmsg 標記。", "apihelp-clearhasmsg-example-1": "清除目前使用者的 hasmsg 標記。", - "apihelp-compare-description": "比較 2 個頁面間的差異。\n\n\"from\" 以及 \"to\" 的修訂編號,頁面標題或頁面 ID 為必填。", + "apihelp-compare-summary": "比較 2 個頁面間的差異。", + "apihelp-compare-extended-description": "\"from\" 以及 \"to\" 的修訂編號,頁面標題或頁面 ID 為必填。", "apihelp-compare-param-fromtitle": "要比對的第一個標題。", "apihelp-compare-param-fromid": "要比對的第一個頁面 ID。", "apihelp-compare-param-fromrev": "要比對的第一個修訂。", @@ -52,10 +55,10 @@ "apihelp-compare-param-toid": "要比對的第二個頁面 ID。", "apihelp-compare-param-torev": "要比對的第二個修訂。", "apihelp-compare-example-1": "建立修訂 1 與 1 的差異檔", - "apihelp-createaccount-description": "建立新使用者帳號。", + "apihelp-createaccount-summary": "建立新使用者帳號。", "apihelp-createaccount-param-name": "使用者名稱。", "apihelp-createaccount-param-password": "密碼 (若有設定 $1mailpassword 則可略過)。", - "apihelp-createaccount-param-domain": "外部認証使用的網域 (選填)。", + "apihelp-createaccount-param-domain": "外部認證使用的網域 (選填)。", "apihelp-createaccount-param-token": "在第一次請求時已取得的帳號建立金鑰。", "apihelp-createaccount-param-email": "使用者的電子郵件地址 (選填) 。", "apihelp-createaccount-param-realname": "使用者的真實姓名 (選填)。", @@ -64,7 +67,7 @@ "apihelp-createaccount-param-language": "要設定的使用者預設語言代碼 (選填,預設依據內容語言)。", "apihelp-createaccount-example-pass": "建立使用者 testuser 使用密碼 test123", "apihelp-createaccount-example-mail": "建立使用者 testmailuser 並且電子郵件通知隨機產生的密碼。", - "apihelp-delete-description": "刪除頁面。", + "apihelp-delete-summary": "刪除頁面。", "apihelp-delete-param-title": "您欲刪除的頁面標題。 無法與 $1pageid 同時使用。", "apihelp-delete-param-pageid": "您欲刪除頁面的頁面 ID。 無法與 $1title 同時使用。", "apihelp-delete-param-reason": "刪除的原因。 若未設定,將會使用自動產生的原因。", @@ -74,8 +77,8 @@ "apihelp-delete-param-oldimage": "由 [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] 所提供要刪除的舊圖片名稱。", "apihelp-delete-example-simple": "刪除 Main Page。", "apihelp-delete-example-reason": "刪除 Main Page 原因為 Preparing for move。", - "apihelp-disabled-description": "已停用此模組。", - "apihelp-edit-description": "建立與編輯頁面。", + "apihelp-disabled-summary": "已停用此模組。", + "apihelp-edit-summary": "建立與編輯頁面。", "apihelp-edit-param-title": "您欲編輯的頁面標題。 無法與 $1pageid 同時使用。", "apihelp-edit-param-pageid": "您欲編輯頁面的頁面 ID。 無法與 $1title 同時使用。", "apihelp-edit-param-section": "章節編號。 0 代表最上層章節,new 代表新章節。", @@ -91,21 +94,21 @@ "apihelp-edit-param-watch": "加入目前頁面至您的監視清單。", "apihelp-edit-param-unwatch": "從您的監視清單中移除目前頁面。", "apihelp-edit-example-edit": "編輯頁面", - "apihelp-emailuser-description": "寄送電子郵件給使用者。", + "apihelp-emailuser-summary": "寄送電子郵件給使用者。", "apihelp-emailuser-param-target": "電子郵件的收件使用者。", "apihelp-emailuser-param-subject": "郵件主旨。", "apihelp-emailuser-param-text": "郵件內容。", "apihelp-emailuser-param-ccme": "寄送一份此郵件的複本給我。", "apihelp-emailuser-example-email": "寄送電子郵件給使用者 WikiSysop 使用內容 Content", - "apihelp-expandtemplates-description": "展開所有於 wikitext 中模板。", + "apihelp-expandtemplates-summary": "展開所有於 wikitext 中模板。", "apihelp-expandtemplates-param-title": "頁面標題。", "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。", - "apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。", + "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。", "apihelp-feedcontributions-param-feedformat": "Feed 的格式。", "apihelp-feedcontributions-param-hideminor": "隱藏小修改。", "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。", "apihelp-feedcontributions-example-simple": "返回使用者Example的貢獻。", - "apihelp-feedrecentchanges-description": "返回最近變更摘要。", + "apihelp-feedrecentchanges-summary": "返回最近變更摘要。", "apihelp-feedrecentchanges-param-feedformat": "摘要格式。", "apihelp-feedrecentchanges-param-namespace": "用於限制結果的命名空間。", "apihelp-feedrecentchanges-param-invert": "除所選定者外的所有命名空間。", @@ -117,13 +120,13 @@ "apihelp-feedrecentchanges-param-hidepatrolled": "隱藏已巡查的變更。", "apihelp-feedrecentchanges-example-simple": "顯示近期變更。", "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動", - "apihelp-feedwatchlist-description": "返回監視清單 feed。", + "apihelp-feedwatchlist-summary": "返回監視清單 feed。", "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。", "apihelp-filerevert-param-comment": "上載意見。", "apihelp-help-example-main": "主模組使用說明", "apihelp-help-example-recursive": "一個頁面中的所有說明。", "apihelp-help-example-help": "說明模組自身的說明。", - "apihelp-imagerotate-description": "旋轉一張或多張圖片。", + "apihelp-imagerotate-summary": "旋轉一張或多張圖片。", "apihelp-import-param-summary": "匯入摘要。", "apihelp-import-param-xml": "上載的 XML 檔。", "apihelp-import-param-interwikisource": "用於跨 wiki 匯入:匯入的來源 wiki。", @@ -136,13 +139,13 @@ "apihelp-login-param-password": "密碼。", "apihelp-login-param-domain": "網域名稱(可選)。", "apihelp-login-example-login": "登入", - "apihelp-logout-description": "登出並清除 session 資料。", + "apihelp-logout-summary": "登出並清除 session 資料。", "apihelp-logout-example-logout": "登出當前使用者", - "apihelp-mergehistory-description": "合併頁面歷史", + "apihelp-mergehistory-summary": "合併頁面歷史", "apihelp-mergehistory-param-reason": "合併歷史的原因。", "apihelp-mergehistory-example-merge": "將Oldpage的整個歷史合併至Newpage。", "apihelp-mergehistory-example-merge-timestamp": "將Oldpage直至2015-12-31T04:37:41Z的頁面修訂版本合併至Newpage。", - "apihelp-move-description": "移動頁面。", + "apihelp-move-summary": "移動頁面。", "apihelp-move-param-from": "重新命名本頁面的標題。不能與 $1fromid 一起出現。", "apihelp-move-param-fromid": "重新命名本頁面的 ID 。不能與 $1fromid 一起出現。", "apihelp-move-param-to": "將本頁面的標題重新命名為", @@ -155,7 +158,7 @@ "apihelp-move-param-watchlist": "在目前使用者的監視清單中無條件地加入或移除頁面,或使用設定,或不變更監視清單。", "apihelp-move-param-ignorewarnings": "忽略所有警告。", "apihelp-move-example-move": "將Badtitle移動至Goodtitle,不留下重定向。", - "apihelp-opensearch-description": "使用 OpenSearch 協定搜尋本 wiki。", + "apihelp-opensearch-summary": "使用 OpenSearch 協定搜尋本 wiki。", "apihelp-opensearch-param-search": "搜尋字串。", "apihelp-opensearch-param-limit": "回傳的結果數量上限。", "apihelp-opensearch-param-namespace": "搜尋的命名空間。", @@ -168,63 +171,72 @@ "apihelp-parse-example-text": "解析 wikitext。", "apihelp-parse-example-texttitle": "解析 wikitext,指定頁面標題。", "apihelp-parse-example-summary": "解析一個摘要。", - "apihelp-patrol-description": "巡查一個頁面或修訂。", + "apihelp-patrol-summary": "巡查一個頁面或修訂。", "apihelp-patrol-param-rcid": "要巡查的最近變更 ID。", "apihelp-patrol-param-revid": "要巡查的修訂 ID。", "apihelp-patrol-example-rcid": "巡查一次最近變更。", "apihelp-patrol-example-revid": "巡查一個修訂。", - "apihelp-protect-description": "變更頁面的保護層級。", + "apihelp-protect-summary": "變更頁面的保護層級。", "apihelp-protect-param-title": "要(解除)保護頁面的標題。 不能與 $1pageid 一起使用。", "apihelp-protect-param-pageid": "要(解除)保護頁面的 ID。 不能與 $1title 一起使用。", "apihelp-protect-param-protections": "保護層級清單,格式為 action=level (例如 edit=sysop)。\n\n注意: 任何未列入清單項目的限制將會被移除。", "apihelp-protect-param-expiry": "期限時間戳記,若只設定一個時間戳記,該時間戳記將會套用至所有的保護層級。 使用 infinite、indefinite、infinity 或 never 來設定保護層級期限為永遠。", "apihelp-protect-param-reason": "(解除)保護的原因。", + "apihelp-query-summary": "擷取來自及有關MediaWiki的數據。", "apihelp-query+allcategories-param-limit": "要回傳的分類數量。", "apihelp-query+allfileusages-param-limit": "要回傳的項目總數。", "apihelp-query+allimages-param-limit": "要回傳的圖片總數。", "apihelp-query+alllinks-param-limit": "要回傳的項目總數。", + "apihelp-query+allmessages-summary": "返回來自該網站的訊息。", "apihelp-query+allpages-param-limit": "要回傳的頁面總數。", "apihelp-query+allredirects-param-limit": "要回傳的項目總數。", + "apihelp-query+allrevisions-summary": "列出所有修訂版本。", "apihelp-query+alltransclusions-param-limit": "要回傳的項目總數。", "apihelp-query+categories-param-limit": "要回傳的分類數量。", - "apihelp-query+categoryinfo-description": "回傳有關指定分類的資訊。", + "apihelp-query+categoryinfo-summary": "回傳有關指定分類的資訊。", + "apihelp-query+categorymembers-summary": "在指定的分類中列出所有頁面。", "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。", "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。", "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。", "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。", "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。", - "apihelp-query+extlinks-description": "回傳所有指定頁面的外部 URL (非 interwiki)。", + "apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。", "apihelp-query+extlinks-param-limit": "要回傳的連結數量。", "apihelp-query+exturlusage-param-limit": "要回傳的頁面數量。", "apihelp-query+filearchive-param-limit": "要回傳的圖片總數。", "apihelp-query+fileusage-param-limit": "要回傳的數量。", - "apihelp-query+imageinfo-description": "回傳檔案資訊與上傳日誌。", + "apihelp-query+imageinfo-summary": "回傳檔案資訊與上傳日誌。", "apihelp-query+imageinfo-param-limit": "每個檔案要回傳的檔案修訂數量。", - "apihelp-query+images-description": "回傳指定頁面中包含的所有檔案。", + "apihelp-query+images-summary": "回傳指定頁面中包含的所有檔案。", "apihelp-query+images-param-limit": "要回傳的檔案數量。", - "apihelp-query+iwlinks-description": "回傳指定頁面的所有 interwiki 連結。", + "apihelp-query+info-summary": "取得基本頁面訊息。", + "apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。", "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。", "apihelp-query+langbacklinks-param-limit": "要回傳的頁面總數。", - "apihelp-query+langlinks-description": "回傳指定頁面的所有跨語言連結。", + "apihelp-query+langlinks-summary": "回傳指定頁面的所有跨語言連結。", "apihelp-query+langlinks-param-limit": "要回傳的 langlinks 數量。", - "apihelp-query+links-description": "回傳指定頁面的所有連結。", + "apihelp-query+links-summary": "回傳指定頁面的所有連結。", "apihelp-query+links-param-limit": "要回傳的連結數量。", "apihelp-query+linkshere-param-limit": "要回傳的數量。", + "apihelp-query+logevents-summary": "從日誌中獲取事件。", "apihelp-query+logevents-param-limit": "要回傳的事件項目總數。", "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。", "apihelp-query+pageswithprop-param-limit": "回傳的頁面數量上限。", "apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。", "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。", "apihelp-query+querypage-param-limit": "回傳的結果數量。", - "apihelp-query+recentchanges-description": "列舉出最近變更。", + "apihelp-query+recentchanges-summary": "列舉出最近變更。", "apihelp-query+recentchanges-param-limit": "要回傳變更總數。", "apihelp-query+recentchanges-example-simple": "最近變更清單", - "apihelp-query+redirects-description": "回傳連結至指定頁面的所有重新導向。", + "apihelp-query+redirects-summary": "回傳連結至指定頁面的所有重新導向。", "apihelp-query+redirects-param-limit": "要回傳的重新導向數量。", + "apihelp-query+search-paramvalue-prop-score": "已忽略", + "apihelp-query+search-paramvalue-prop-hasrelated": "已忽略", "apihelp-query+search-param-limit": "要回傳的頁面總數。", - "apihelp-query+stashimageinfo-description": "回傳多筆儲藏檔案的檔案資訊。", + "apihelp-query+stashimageinfo-summary": "回傳多筆儲藏檔案的檔案資訊。", "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。", - "apihelp-query+templates-description": "回傳指定頁面中所有引用的頁面。", + "apihelp-query+tags-summary": "列出更改標籤。", + "apihelp-query+templates-summary": "回傳指定頁面中所有引用的頁面。", "apihelp-query+templates-param-limit": "要回傳的模板數量。", "apihelp-query+tokens-param-type": "要求的權杖類型。", "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。", @@ -233,27 +245,30 @@ "apihelp-query+usercontribs-param-limit": "回傳的貢獻數量上限。", "apihelp-query+watchlist-param-limit": "每個請求要回傳的結果總數。", "apihelp-query+watchlistraw-param-limit": "每個請求要回傳的結果總數。", + "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。", "apihelp-stashedit-param-title": "正在編輯此頁面的標題。", "apihelp-stashedit-param-text": "頁面內容。", - "apihelp-tokens-description": "取得資料修改動作的密鑰。\n\n此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。", + "apihelp-tokens-summary": "取得資料修改動作的密鑰。", + "apihelp-tokens-extended-description": "此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。", + "apihelp-unblock-summary": "解除封鎖一位使用者。", "apihelp-unblock-param-reason": "解除封鎖的原因。", "apihelp-unblock-example-id": "解除封銷 ID #105。", "apihelp-undelete-param-reason": "還原的原因。", - "apihelp-userrights-description": "更改一位使用者的群組成員。", + "apihelp-userrights-summary": "更改一位使用者的群組成員。", "apihelp-userrights-param-user": "使用者名稱。", "apihelp-userrights-param-userid": "使用者 ID。", "apihelp-userrights-param-add": "加入使用者至這些群組。", "apihelp-userrights-param-remove": "從這些群組移除使用者。", "apihelp-userrights-param-reason": "變更的原因。", "apihelp-format-example-generic": "格式化查詢結果為 $1 格式", - "apihelp-json-description": "使用 JSON 格式輸出資料。", - "apihelp-jsonfm-description": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。", - "apihelp-none-description": "不輸出。", - "apihelp-php-description": "使用序列化 PHP 格式輸出資料。", - "apihelp-phpfm-description": "使用序列化 PHP 格式輸出資料 (使用 HTML 格式顯示)。", - "apihelp-rawfm-description": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。", - "apihelp-xml-description": "使用 XML 格式輸出資料。", - "apihelp-xmlfm-description": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。", + "apihelp-json-summary": "使用 JSON 格式輸出資料。", + "apihelp-jsonfm-summary": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。", + "apihelp-none-summary": "不輸出。", + "apihelp-php-summary": "使用序列化 PHP 格式輸出資料。", + "apihelp-phpfm-summary": "使用序列化 PHP 格式輸出資料 (使用 HTML 格式顯示)。", + "apihelp-rawfm-summary": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。", + "apihelp-xml-summary": "使用 XML 格式輸出資料。", + "apihelp-xmlfm-summary": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。", "api-format-title": "MediaWiki API 結果", "api-pageset-param-titles": "要使用的標題清單。", "api-pageset-param-pageids": "要使用的頁面 ID 清單。", @@ -286,6 +301,7 @@ "api-help-permissions": "{{PLURAL:$1|權限}}:", "api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2", "api-help-authmanager-general-usage": "使用此模組的一般程式是:\n# 通過amirequestsfor=$4取得來自[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]的可用欄位,和來自[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]的$5令牌。\n# 向用戶顯示欄位,並獲得其提交的內容。\n# 提交(POST)至此模組,提供$1returnurl及任何相關欄位。\n# 在回应中檢查status。\n#* 如果您收到了PASS(成功)或FAIL(失敗),則認為操作結束。成功與否如上句所示。\n#* 如果您收到了UI,向用戶顯示新欄位,並再次獲取其提交的內容。然後再次使用$1continue,向本模組提交相關欄位,並重復第四步。\n#* 如果您收到了REDIRECT,將使用者指向redirecttarget中的目標,等待其返回$1returnurl。然後再次使用$1continue,向本模組提交返回URL中提供的一切欄位,並重復第四步。\n#* 如果您收到了RESTART,這意味著身份驗證正常運作,但我們沒有連結的使用者賬戶。您可以將此看做UI或FAIL。", + "apierror-timeout": "伺服器沒有在預期的時間內回應。", "api-credits-header": "製作群", "api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。" } diff --git a/includes/api/i18n/zu.json b/includes/api/i18n/zu.json index f9a5eb6c10..6536d37a2f 100644 --- a/includes/api/i18n/zu.json +++ b/includes/api/i18n/zu.json @@ -4,7 +4,7 @@ "Irus" ] }, - "apihelp-block-description": "Vimbela umsebenzisi", + "apihelp-block-summary": "Vimbela umsebenzisi", "apihelp-block-param-user": "Igama lomsebenzisi, ikheli le-IP, noma ikheli le-IP uhla ukuvimba.", "apihelp-block-param-reblock": "Uma umsebenzisi usevele ivinjiwe, isula block ekhona." } diff --git a/includes/auth/AbstractAuthenticationProvider.php b/includes/auth/AbstractAuthenticationProvider.php index 9e38eccb3f..58cec118c8 100644 --- a/includes/auth/AbstractAuthenticationProvider.php +++ b/includes/auth/AbstractAuthenticationProvider.php @@ -50,7 +50,7 @@ abstract class AbstractAuthenticationProvider implements AuthenticationProvider } /** - * @inheritdoc + * @inheritDoc * @note Override this if it makes sense to support more than one instance */ public function getUniqueId() { diff --git a/includes/auth/AbstractPrimaryAuthenticationProvider.php b/includes/auth/AbstractPrimaryAuthenticationProvider.php index ea3dfa3bd6..ca947b61a8 100644 --- a/includes/auth/AbstractPrimaryAuthenticationProvider.php +++ b/includes/auth/AbstractPrimaryAuthenticationProvider.php @@ -46,7 +46,7 @@ abstract class AbstractPrimaryAuthenticationProvider extends AbstractAuthenticat } /** - * @inheritdoc + * @inheritDoc * @note Reimplement this if you do anything other than * User::getCanonicalName( $req->username ) to determine the user being * authenticated. @@ -57,7 +57,7 @@ abstract class AbstractPrimaryAuthenticationProvider extends AbstractAuthenticat } /** - * @inheritdoc + * @inheritDoc * @note Reimplement this if self::getAuthenticationRequests( AuthManager::ACTION_REMOVE ) * doesn't return requests that will revoke all access for the user. */ diff --git a/includes/auth/AbstractSecondaryAuthenticationProvider.php b/includes/auth/AbstractSecondaryAuthenticationProvider.php index 00493bc7a4..4a2accafcb 100644 --- a/includes/auth/AbstractSecondaryAuthenticationProvider.php +++ b/includes/auth/AbstractSecondaryAuthenticationProvider.php @@ -43,7 +43,7 @@ abstract class AbstractSecondaryAuthenticationProvider extends AbstractAuthentic } /** - * @inheritdoc + * @inheritDoc * @note Reimplement this if self::getAuthenticationRequests( AuthManager::ACTION_REMOVE ) * doesn't return requests that will revoke all access for the user. */ diff --git a/includes/auth/AuthManager.php b/includes/auth/AuthManager.php index e9a6edc224..c3f798fd49 100644 --- a/includes/auth/AuthManager.php +++ b/includes/auth/AuthManager.php @@ -1660,7 +1660,7 @@ class AuthManager implements LoggerAwareInterface { } } - $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) ); + $backoffKey = $cache->makeKey( 'AuthManager', 'autocreate-failed', md5( $username ) ); if ( $cache->get( $backoffKey ) ) { $this->logger->debug( __METHOD__ . ': {username} denied by prior creation attempt failures', [ 'username' => $username, diff --git a/includes/auth/AuthenticationResponse.php b/includes/auth/AuthenticationResponse.php index 6684fb958f..956c985069 100644 --- a/includes/auth/AuthenticationResponse.php +++ b/includes/auth/AuthenticationResponse.php @@ -133,7 +133,7 @@ class AuthenticationResponse { */ public static function newPass( $username = null ) { $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::PASS; + $ret->status = self::PASS; $ret->username = $username; return $ret; } @@ -145,7 +145,7 @@ class AuthenticationResponse { */ public static function newFail( Message $msg ) { $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::FAIL; + $ret->status = self::FAIL; $ret->message = $msg; $ret->messageType = 'error'; return $ret; @@ -158,7 +158,7 @@ class AuthenticationResponse { */ public static function newRestart( Message $msg ) { $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::RESTART; + $ret->status = self::RESTART; $ret->message = $msg; return $ret; } @@ -169,7 +169,7 @@ class AuthenticationResponse { */ public static function newAbstain() { $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::ABSTAIN; + $ret->status = self::ABSTAIN; return $ret; } @@ -189,7 +189,7 @@ class AuthenticationResponse { } $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::UI; + $ret->status = self::UI; $ret->neededRequests = $reqs; $ret->message = $msg; $ret->messageType = $msgtype; @@ -209,7 +209,7 @@ class AuthenticationResponse { } $ret = new AuthenticationResponse; - $ret->status = AuthenticationResponse::REDIRECT; + $ret->status = self::REDIRECT; $ret->neededRequests = $reqs; $ret->redirectTarget = $redirectTarget; $ret->redirectApiData = $redirectApiData; diff --git a/includes/auth/LocalPasswordPrimaryAuthenticationProvider.php b/includes/auth/LocalPasswordPrimaryAuthenticationProvider.php index fd36887c06..7f93c12d4c 100644 --- a/includes/auth/LocalPasswordPrimaryAuthenticationProvider.php +++ b/includes/auth/LocalPasswordPrimaryAuthenticationProvider.php @@ -297,7 +297,7 @@ class LocalPasswordPrimaryAuthenticationProvider // Nothing we can do besides claim it, because the user isn't in // the DB yet if ( $req->username !== $user->getName() ) { - $req = clone( $req ); + $req = clone $req; $req->username = $user->getName(); } $ret = AuthenticationResponse::newPass( $req->username ); diff --git a/includes/auth/PrimaryAuthenticationProvider.php b/includes/auth/PrimaryAuthenticationProvider.php index 4033613f75..5d82f8995c 100644 --- a/includes/auth/PrimaryAuthenticationProvider.php +++ b/includes/auth/PrimaryAuthenticationProvider.php @@ -81,7 +81,7 @@ interface PrimaryAuthenticationProvider extends AuthenticationProvider { const TYPE_NONE = 'none'; /** - * {@inheritdoc} + * @inheritDoc * * Of the requests returned by this method, exactly one should have * {@link AuthenticationRequest::$required} set to REQUIRED. diff --git a/includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php b/includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php index 44c28241e2..4a2d0094eb 100644 --- a/includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php +++ b/includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php @@ -360,7 +360,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider if ( $req->username !== null && $req->password !== null ) { // Nothing we can do yet, because the user isn't in the DB yet if ( $req->username !== $user->getName() ) { - $req = clone( $req ); + $req = clone $req; $req->username = $user->getName(); } diff --git a/includes/auth/Throttler.php b/includes/auth/Throttler.php index 6d3b2f46e6..3125bd3fd8 100644 --- a/includes/auth/Throttler.php +++ b/includes/auth/Throttler.php @@ -127,10 +127,10 @@ class Throttler implements LoggerAwareInterface { continue; } - $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey ); + $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey ); $throttleCount = $this->cache->get( $throttleKey ); - if ( !$throttleCount ) { // counter not started yet + if ( !$throttleCount ) { // counter not started yet $this->cache->add( $throttleKey, 1, $expiry ); } elseif ( $throttleCount < $count ) { // throttle limited not yet reached $this->cache->incr( $throttleKey ); @@ -170,7 +170,7 @@ class Throttler implements LoggerAwareInterface { $userKey = $username ? md5( $username ) : null; foreach ( $this->conditions as $index => $specificThrottle ) { $ipKey = isset( $specificThrottle['allIPs'] ) ? null : $ip; - $throttleKey = wfGlobalCacheKey( 'throttler', $this->type, $index, $ipKey, $userKey ); + $throttleKey = $this->cache->makeGlobalKey( 'throttler', $this->type, $index, $ipKey, $userKey ); $this->cache->delete( $throttleKey ); } } diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php index 0a07a936e4..4341daafe6 100644 --- a/includes/cache/BacklinkCache.php +++ b/includes/cache/BacklinkCache.php @@ -20,7 +20,6 @@ * * @file * @author Tim Starling - * @author Aaron Schulz * @copyright © 2009, Tim Starling, Domas Mituzas * @copyright © 2010, Max Sem * @copyright © 2011, Antoine Musso @@ -28,6 +27,7 @@ use Wikimedia\Rdbms\ResultWrapper; use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Class for fetching backlink lists, approximate backlink counts and @@ -142,7 +142,7 @@ class BacklinkCache { /** * Get the replica DB connection to the database * When non existing, will initialize the connection. - * @return Database + * @return IDatabase */ protected function getDB() { if ( !isset( $this->db ) ) { @@ -174,7 +174,6 @@ class BacklinkCache { * @return ResultWrapper */ protected function queryLinks( $table, $startId, $endId, $max, $select = 'all' ) { - $fromField = $this->getPrefix( $table ) . '_from'; if ( !$startId && !$endId && is_infinite( $max ) @@ -338,7 +337,11 @@ class BacklinkCache { return min( $max, $this->fullResultCache[$table]->numRows() ); } - $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table ); + $memcKey = $cache->makeKey( + 'numbacklinks', + md5( $this->title->getPrefixedDBkey() ), + $table + ); // 3) ... fallback to memcached ... $count = $cache->get( $memcKey ); @@ -392,7 +395,7 @@ class BacklinkCache { return $cacheEntry['batches']; } - $memcKey = wfMemcKey( + $memcKey = $cache->makeKey( 'backlinks', md5( $this->title->getPrefixedDBkey() ), $table, @@ -435,7 +438,11 @@ class BacklinkCache { $cache->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY ); // Save backlink count to memcached - $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table ); + $memcKey = $cache->makeKey( + 'numbacklinks', + md5( $this->title->getPrefixedDBkey() ), + $table + ); $cache->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY ); wfDebug( __METHOD__ . ": got from database\n" ); diff --git a/includes/cache/FileCacheBase.php b/includes/cache/FileCacheBase.php index 0a302b6ec1..f2da08a394 100644 --- a/includes/cache/FileCacheBase.php +++ b/includes/cache/FileCacheBase.php @@ -242,14 +242,14 @@ abstract class FileCacheBase { : IP::sanitizeRange( "$ip/16" ); # Bail out if a request already came from this range... - $key = wfMemcKey( static::class, 'attempt', $this->mType, $this->mKey, $ip ); + $key = $cache->makeKey( static::class, 'attempt', $this->mType, $this->mKey, $ip ); if ( $cache->get( $key ) ) { return; // possibly the same user } $cache->set( $key, 1, self::MISS_TTL_SEC ); # Increment the number of cache misses... - $key = $this->cacheMissKey(); + $key = $this->cacheMissKey( $cache ); if ( $cache->get( $key ) === false ) { $cache->set( $key, 1, self::MISS_TTL_SEC ); } else { @@ -265,13 +265,14 @@ abstract class FileCacheBase { public function getMissesRecent() { $cache = ObjectCache::getLocalClusterInstance(); - return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() ); + return self::MISS_FACTOR * $cache->get( $this->cacheMissKey( $cache ) ); } /** + * @param BagOStuff $cache Instance that the key will be used with * @return string */ - protected function cacheMissKey() { - return wfMemcKey( static::class, 'misses', $this->mType, $this->mKey ); + protected function cacheMissKey( BagOStuff $cache ) { + return $cache->makeKey( static::class, 'misses', $this->mType, $this->mKey ); } } diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php index 77ab2d59d3..38cb6be566 100644 --- a/includes/cache/LinkBatch.php +++ b/includes/cache/LinkBatch.php @@ -23,6 +23,7 @@ use MediaWiki\Linker\LinkTarget; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Class representing a list of titles @@ -42,7 +43,6 @@ class LinkBatch { protected $caller; /** - * LinkBatch constructor. * @param LinkTarget[] $arr Initial items to be added to the batch */ public function __construct( $arr = [] ) { @@ -131,7 +131,7 @@ class LinkBatch { * Do the query and add the results to a given LinkCache object * Return an array mapping PDBK to ID * - * @param LinkCache $cache + * @param LinkCache &$cache * @return array Remaining IDs */ protected function executeInto( &$cache ) { diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php index b720decb86..2d088952b6 100644 --- a/includes/cache/LinkCache.php +++ b/includes/cache/LinkCache.php @@ -20,6 +20,9 @@ * @file * @ingroup Cache */ + +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; use MediaWiki\Linker\LinkTarget; use MediaWiki\MediaWikiServices; diff --git a/includes/cache/MessageBlobStore.php b/includes/cache/MessageBlobStore.php index 5d48c03dfc..b076a083c9 100644 --- a/includes/cache/MessageBlobStore.php +++ b/includes/cache/MessageBlobStore.php @@ -26,6 +26,7 @@ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; +use Wikimedia\Rdbms\Database; /** * This class generates message blobs for use by ResourceLoader modules. @@ -238,6 +239,7 @@ class MessageBlobStore implements LoggerAwareInterface { } $json = FormatJson::encode( (object)$messages ); + // @codeCoverageIgnoreStart if ( $json === false ) { $this->logger->warning( 'Failed to encode message blob for {module} ({lang})', [ 'module' => $module->getName(), @@ -245,6 +247,7 @@ class MessageBlobStore implements LoggerAwareInterface { ] ); $json = '{}'; } + // codeCoverageIgnoreEnd return $json; } } diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 7cd489a620..16c1ac55fc 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\ScopedCallback; use MediaWiki\Logger\LoggerFactory; +use Wikimedia\Rdbms\Database; /** * MediaWiki message cache structure version. @@ -191,11 +192,22 @@ class MessageCache { // either. $po = ParserOptions::newFromAnon(); $po->setEditSection( false ); + $po->setAllowUnsafeRawHtml( false ); + $po->setWrapOutputClass( false ); return $po; } $this->mParserOptions = new ParserOptions; $this->mParserOptions->setEditSection( false ); + // Messages may take parameters that could come + // from malicious sources. As a precaution, disable + // the parser tag when parsing messages. + $this->mParserOptions->setAllowUnsafeRawHtml( false ); + // Wrapping messages in an extra
    is probably not expected. If + // they're outside the content area they probably shouldn't be + // targeted by CSS that's targeting the parser output, and if + // they're inside they already are from the outer div. + $this->mParserOptions->setWrapOutputClass( false ); } return $this->mParserOptions; @@ -208,7 +220,7 @@ class MessageCache { * @return array|bool The cache array, or false if not in cache. */ protected function getLocalCache( $code ) { - $cacheKey = wfMemcKey( __CLASS__, $code ); + $cacheKey = $this->srvCache->makeKey( __CLASS__, $code ); return $this->srvCache->get( $cacheKey ); } @@ -220,7 +232,7 @@ class MessageCache { * @param array $cache The cache array */ protected function saveToLocalCache( $code, $cache ) { - $cacheKey = wfMemcKey( __CLASS__, $code ); + $cacheKey = $this->srvCache->makeKey( __CLASS__, $code ); $this->srvCache->set( $cacheKey, $cache ); } @@ -296,7 +308,7 @@ class MessageCache { } if ( !$success ) { - $cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages + $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Key in memc for messages # Try the global cache. If it is empty, try to acquire a lock. If # the lock can't be acquired, wait for the other thread to finish # and then try the global cache a second time. @@ -383,14 +395,14 @@ class MessageCache { /** * @param string $code - * @param array $where List of wfDebug() comments + * @param array &$where List of wfDebug() comments * @param integer $mode Use MessageCache::FOR_UPDATE to use DB_MASTER * @return bool|string True on success or one of ("cantacquire", "disabled") */ protected function loadFromDBWithLock( $code, array &$where, $mode = null ) { # If cache updates on all levels fail, give up on message overrides. # This is to avoid easy site outages; see $saveSuccess comments below. - $statusKey = wfMemcKey( 'messages', $code, 'status' ); + $statusKey = $this->clusterCache->makeKey( 'messages', $code, 'status' ); $status = $this->clusterCache->get( $statusKey ); if ( $status === 'error' ) { $where[] = "could not load; method is still globally disabled"; @@ -404,7 +416,7 @@ class MessageCache { # This lock is non-blocking so stale cache can quickly be used. # Note that load() will call a blocking getReentrantScopedLock() # after this if it really need to wait for any current thread. - $cacheKey = wfMemcKey( 'messages', $code ); + $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); $scopedLock = $this->getReentrantScopedLock( $cacheKey, 0 ); if ( !$scopedLock ) { $where[] = 'could not acquire main lock'; @@ -452,7 +464,11 @@ class MessageCache { protected function loadFromDB( $code, $mode = null ) { global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache; - $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA ); + // (T164666) The query here performs really poorly on WMF's + // contributions replicas. We don't have a way to say "any group except + // contributions", so for the moment let's specify 'api'. + // @todo: Get rid of this hack. + $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA, 'api' ); $cache = []; @@ -480,7 +496,8 @@ class MessageCache { } else { # Effectively disallows use of '/' character in NS_MEDIAWIKI for uses # other than language code. - $conds[] = 'page_title NOT' . $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() ); + $conds[] = 'page_title NOT' . + $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() ); } # Conditions to fetch oversized pages to ignore them @@ -502,15 +519,18 @@ class MessageCache { # Conditions to load the remaining pages with their contents $smallConds = $conds; - $smallConds[] = 'page_latest=rev_id'; - $smallConds[] = 'rev_text_id=old_id'; $smallConds[] = 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ); $res = $dbr->select( [ 'page', 'revision', 'text' ], [ 'page_title', 'old_id', 'old_text', 'old_flags' ], $smallConds, - __METHOD__ . "($code)-small" + __METHOD__ . "($code)-small", + [], + [ + 'revision' => [ 'JOIN', 'page_latest=rev_id' ], + 'text' => [ 'JOIN', 'rev_text_id=old_id' ], + ] ); foreach ( $res as $row ) { @@ -546,7 +566,7 @@ class MessageCache { /** * Updates cache as necessary when message page is changed * - * @param string $title Message cache key with initial uppercase letter. + * @param string $title Message cache key with initial uppercase letter * @param string|bool $text New contents of the page (false if deleted) */ public function replace( $title, $text ) { @@ -576,7 +596,9 @@ class MessageCache { function () use ( $title, $msg, $code ) { global $wgContLang, $wgMaxMsgCacheEntrySize; // Allow one caller at a time to avoid race conditions - $scopedLock = $this->getReentrantScopedLock( wfMemcKey( 'messages', $code ) ); + $scopedLock = $this->getReentrantScopedLock( + $this->clusterCache->makeKey( 'messages', $code ) + ); if ( !$scopedLock ) { LoggerFactory::getInstance( 'MessageCache' )->error( __METHOD__ . ': could not acquire lock to update {title} ({code})', @@ -591,9 +613,8 @@ class MessageCache { $page->loadPageData( $page::READ_LATEST ); $text = $this->getMessageTextFromContent( $page->getContent() ); // Check if an individual cache key should exist and update cache accordingly - $titleKey = $this->wanCache->makeKey( - 'messages-big', $this->mCache[$code]['HASH'], $title ); if ( is_string( $text ) && strlen( $text ) > $wgMaxMsgCacheEntrySize ) { + $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title ); $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry ); } // Mark this cache as definitely being "latest" (non-volatile) so @@ -609,7 +630,7 @@ class MessageCache { // Relay the purge. Touching this check key expires cache contents // and local cache (APC) validation hash across all datacenters. - $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) ); + $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) ); // Also delete cached sidebar... just in case it is affected // @TODO: shouldn't this be $code === $wgLanguageCode? if ( $code === 'en' ) { @@ -620,7 +641,7 @@ class MessageCache { $codes = [ $code ]; } foreach ( $codes as $code ) { - $this->wanCache->delete( wfMemcKey( 'sidebar', $code ) ); + $this->wanCache->delete( $this->wanCache->makeKey( 'sidebar', $code ) ); } // Purge the message in the message blob store @@ -665,7 +686,7 @@ class MessageCache { */ protected function saveToCaches( array $cache, $dest, $code = false ) { if ( $dest === 'all' ) { - $cacheKey = wfMemcKey( 'messages', $code ); + $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); $success = $this->clusterCache->set( $cacheKey, $cache ); $this->setValidationHash( $code, $cache ); } else { @@ -688,7 +709,7 @@ class MessageCache { $value = $this->wanCache->get( $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ), $curTTL, - [ wfMemcKey( 'messages', $code ) ] + [ $this->wanCache->makeKey( 'messages', $code ) ] ); if ( $value ) { @@ -795,7 +816,7 @@ class MessageCache { } // Normalise title-case input (with some inlining) - $lckey = MessageCache::normalizeKey( $key ); + $lckey = self::normalizeKey( $key ); Hooks::run( 'MessageCache::get', [ &$lckey ] ); @@ -962,8 +983,8 @@ class MessageCache { * some callers require this behavior. LanguageConverter::parseCachedTable() * and self::get() are some examples in core. * - * @param string $title Message cache key with initial uppercase letter. - * @param string $code Code denoting the language to try. + * @param string $title Message cache key with initial uppercase letter + * @param string $code Code denoting the language to try * @return string|bool The message, or false if it does not exist or on error */ public function getMsgFromNamespace( $title, $code ) { @@ -990,8 +1011,8 @@ class MessageCache { return false; } - // Try the individual message cache - $titleKey = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title ); + // Individual message cache key + $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title ); if ( $this->mCacheVolatile[$code] ) { $entry = false; @@ -1000,6 +1021,7 @@ class MessageCache { __METHOD__ . ': loading volatile key \'{titleKey}\'', [ 'titleKey' => $titleKey, 'code' => $code ] ); } else { + // Try the individual message cache $entry = $this->wanCache->get( $titleKey ); } @@ -1052,7 +1074,8 @@ class MessageCache { $message = false; // negative caching } - if ( $message === false ) { // negative caching + if ( $message === false ) { + // Negative caching in case a "too big" message is no longer available (deleted) $this->mCache[$code][$title] = '!NONEXISTENT'; $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts ); } @@ -1191,7 +1214,7 @@ class MessageCache { $langs = Language::fetchLanguageNames( null, 'mw' ); foreach ( array_keys( $langs ) as $code ) { # Global and local caches - $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) ); + $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) ); } $this->mLoadedLanguages = []; @@ -1296,4 +1319,13 @@ class MessageCache { return $msgText; } + + /** + * @param string $hash Hash for this version of the entire key/value overrides map + * @param string $title Message cache key with initial uppercase letter + * @return string + */ + private function bigMessageCacheKey( $hash, $title ) { + return $this->wanCache->makeKey( 'messages-big', $hash, $title ); + } } diff --git a/includes/cache/localisation/LCStoreDB.php b/includes/cache/localisation/LCStoreDB.php index e7e2d10308..c57145c04d 100644 --- a/includes/cache/localisation/LCStoreDB.php +++ b/includes/cache/localisation/LCStoreDB.php @@ -18,6 +18,9 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBQueryError; + /** * LCStore implementation which uses the standard DB functions to store data. * This will work on any MediaWiki installation. diff --git a/includes/cache/localisation/LocalisationCache.php b/includes/cache/localisation/LocalisationCache.php index cbff113761..e0da22eaaa 100644 --- a/includes/cache/localisation/LocalisationCache.php +++ b/includes/cache/localisation/LocalisationCache.php @@ -183,7 +183,6 @@ class LocalisationCache { private $mergeableKeys = null; /** - * Constructor. * For constructor parameters, see the documentation in DefaultSettings.php * for $wgLocalisationCacheConf. * @@ -212,19 +211,17 @@ class LocalisationCache { case 'detect': if ( !empty( $conf['storeDirectory'] ) ) { $storeClass = 'LCStoreCDB'; + } elseif ( $wgCacheDirectory ) { + $storeConf['directory'] = $wgCacheDirectory; + $storeClass = 'LCStoreCDB'; } else { - $cacheDir = $wgCacheDirectory ?: wfTempDir(); - if ( $cacheDir ) { - $storeConf['directory'] = $cacheDir; - $storeClass = 'LCStoreCDB'; - } else { - $storeClass = 'LCStoreDB'; - } + $storeClass = 'LCStoreDB'; } break; default: throw new MWException( - 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' ); + 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' + ); } } @@ -690,7 +687,7 @@ class LocalisationCache { * exists, the data array is returned, otherwise false is returned. * * @param string $code - * @param array $deps + * @param array &$deps * @return array */ protected function readSourceFilesAndRegisterDeps( $code, &$deps ) { @@ -722,7 +719,7 @@ class LocalisationCache { * Merge two localisation values, a primary and a fallback, overwriting the * primary value in place. * @param string $key - * @param mixed $value + * @param mixed &$value * @param mixed $fallbackValue */ protected function mergeItem( $key, &$value, $fallbackValue ) { @@ -752,7 +749,7 @@ class LocalisationCache { } /** - * @param mixed $value + * @param mixed &$value * @param mixed $fallbackValue */ protected function mergeMagicWords( &$value, $fallbackValue ) { @@ -778,7 +775,7 @@ class LocalisationCache { * otherwise. * @param array $codeSequence * @param string $key - * @param mixed $value + * @param mixed &$value * @param mixed $fallbackValue * @return bool */ diff --git a/includes/changes/ChangesFeed.php b/includes/changes/ChangesFeed.php index cffb59a4a8..df964e0a2b 100644 --- a/includes/changes/ChangesFeed.php +++ b/includes/changes/ChangesFeed.php @@ -31,8 +31,6 @@ class ChangesFeed { public $format, $type, $titleMsg, $descMsg; /** - * Constructor - * * @param string $format Feed's format (either 'rss' or 'atom') * @param string $type Type of feed (for cache keys) */ @@ -167,7 +165,7 @@ class ChangesFeed { /** * Generate the feed items given a row from the database, printing the feed. * @param object $rows IDatabase resource with recentchanges rows - * @param ChannelFeed $feed + * @param ChannelFeed &$feed */ public static function generateFeed( $rows, &$feed ) { $items = self::buildItems( $rows ); diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php index 92a3d3f2e2..cac476929b 100644 --- a/includes/changes/ChangesList.php +++ b/includes/changes/ChangesList.php @@ -41,6 +41,9 @@ class ChangesList extends ContextSource { protected $rclistOpen; protected $rcMoveIndex; + /** @var callable */ + protected $changeLinePrefixer; + /** @var BagOStuff */ protected $watchMsgCache; @@ -102,7 +105,7 @@ class ChangesList extends ContextSource { * * @since 1.27 * - * @param RecentChange $rc Passed by reference + * @param RecentChange &$rc Passed by reference * @param bool $watched (default false) * @param int $linenumber (default null) * @@ -169,14 +172,18 @@ class ChangesList extends ContextSource { * @return array of classes */ protected function getHTMLClasses( $rc, $watched ) { - $classes = []; + $classes = [ self::CSS_CLASS_PREFIX . 'line' ]; $logType = $rc->mAttribs['rc_log_type']; if ( $logType ) { + $classes[] = self::CSS_CLASS_PREFIX . 'log'; $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'log-' . $logType ); } else { + $classes[] = self::CSS_CLASS_PREFIX . 'edit'; $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] ); + $classes[] = Sanitizer::escapeClass( self::CSS_CLASS_PREFIX . 'ns-' . + $rc->mAttribs['rc_namespace'] ); } // Indicate watched status on the line to allow for more @@ -360,7 +367,7 @@ class ChangesList extends ContextSource { } /** - * @param string $s HTML to update + * @param string &$s HTML to update * @param mixed $rc_timestamp */ public function insertDateHeader( &$s, $rc_timestamp ) { @@ -377,7 +384,7 @@ class ChangesList extends ContextSource { } /** - * @param string $s HTML to update + * @param string &$s HTML to update * @param Title $title * @param string $logtype */ @@ -390,8 +397,8 @@ class ChangesList extends ContextSource { } /** - * @param string $s HTML to update - * @param RecentChange $rc + * @param string &$s HTML to update + * @param RecentChange &$rc * @param bool|null $unpatrolled Unused variable, since 1.27. */ public function insertDiffHist( &$s, &$rc, $unpatrolled = null ) { @@ -440,7 +447,7 @@ class ChangesList extends ContextSource { } /** - * @param string $s Article link will be appended to this string, in place. + * @param string &$s Article link will be appended to this string, in place. * @param RecentChange $rc * @param bool $unpatrolled * @param bool $watched @@ -451,7 +458,7 @@ class ChangesList extends ContextSource { } /** - * @param RecentChange $rc + * @param RecentChange &$rc * @param bool $unpatrolled * @param bool $watched * @return string HTML @@ -506,7 +513,7 @@ class ChangesList extends ContextSource { /** * Insert time timestamp string from $rc into $s * - * @param string $s HTML to update + * @param string &$s HTML to update * @param RecentChange $rc */ public function insertTimestamp( &$s, $rc ) { @@ -618,8 +625,8 @@ class ChangesList extends ContextSource { /** Inserts a rollback link * - * @param string $s - * @param RecentChange $rc + * @param string &$s + * @param RecentChange &$rc */ public function insertRollback( &$s, &$rc ) { if ( $rc->mAttribs['rc_type'] == RC_EDIT @@ -656,9 +663,9 @@ class ChangesList extends ContextSource { } /** - * @param string $s - * @param RecentChange $rc - * @param array $classes + * @param string &$s + * @param RecentChange &$rc + * @param array &$classes */ public function insertTags( &$s, &$rc, &$classes ) { if ( empty( $rc->mAttribs['ts_tags'] ) ) { @@ -676,7 +683,7 @@ class ChangesList extends ContextSource { /** * @param RecentChange $rc - * @param array $classes + * @param array &$classes * @return string * @since 1.26 */ @@ -739,4 +746,40 @@ class ChangesList extends ContextSource { && intval( $rcObj->getAttribute( 'rc_this_oldid' ) ) === 0; } + /** + * Get recommended data attributes for a change line. + * @param RecentChange $rc + * @return string[] attribute name => value + */ + protected function getDataAttributes( RecentChange $rc ) { + $attrs = []; + + $type = $rc->getAttribute( 'rc_source' ); + switch ( $type ) { + case RecentChange::SRC_EDIT: + case RecentChange::SRC_NEW: + $attrs['data-mw-revid'] = $rc->mAttribs['rc_this_oldid']; + break; + case RecentChange::SRC_LOG: + $attrs['data-mw-logid'] = $rc->mAttribs['rc_logid']; + $attrs['data-mw-logaction'] = + $rc->mAttribs['rc_log_type'] . '/' . $rc->mAttribs['rc_log_action']; + break; + } + + $attrs[ 'data-mw-ts' ] = $rc->getAttribute( 'rc_timestamp' ); + + return $attrs; + } + + /** + * Sets the callable that generates a change line prefix added to the beginning of each line. + * + * @param callable $prefixer Callable to run that generates the change line prefix. + * Takes three parameters: a RecentChange object, a ChangesList object, + * and whether the current entry is a grouped entry. + */ + public function setChangeLinePrefixer( callable $prefixer ) { + $this->changeLinePrefixer = $prefixer; + } } diff --git a/includes/changes/ChangesListBooleanFilter.php b/includes/changes/ChangesListBooleanFilter.php index b6be1f99af..01e67f5079 100644 --- a/includes/changes/ChangesListBooleanFilter.php +++ b/includes/changes/ChangesListBooleanFilter.php @@ -22,18 +22,14 @@ * @author Matthew Flaschen */ +use Wikimedia\Rdbms\IDatabase; + /** * An individual filter in a boolean group * * @since 1.29 */ class ChangesListBooleanFilter extends ChangesListFilter { - /** - * Name. Used as URL parameter - * - * @var string $name - */ - // This can sometimes be different on Special:RecentChanges // and Special:Watchlist, due to the double-legacy hooks // (SpecialRecentChangesFilters and SpecialWatchlistFilters) @@ -82,37 +78,31 @@ class ChangesListBooleanFilter extends ChangesListFilter { * it's for. * * @param array $filterDefinition ChangesListFilter definition - * - * $filterDefinition['name'] string Name. Used as URL parameter. - * $filterDefinition['group'] ChangesListFilterGroup Group. Filter group this - * belongs to. - * $filterDefinition['label'] string i18n key of label for structured UI. - * $filterDefinition['description'] string i18n key of description for structured - * UI. - * $filterDefinition['showHide'] string Main i18n key used for unstructured UI. - * $filterDefinition['isReplacedInStructuredUi'] bool Whether there is an - * equivalent feature available in the structured UI; this is optional, defaulting - * to true. It does not need to be set if the exact same filter is simply visible - * on both. - * $filterDefinition['default'] bool Default - * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters, - * the class name of the special page and an IContextSource, and returning true - * if and only if the current user is permitted to use this filter on the current - * wiki. If it returns false, it will both hide the UI (in all UIs) and prevent - * the DB query modification from taking effect. (optional, defaults to allowed) - * $filterDefinition['priority'] int Priority integer. Higher value means higher - * up in the group's filter list. - * $filterDefinition['queryCallable'] callable Callable accepting parameters, used - * to implement filter's DB query modification. Callback parameters: - * string $specialPageClassName Class name of current special page - * IContextSource $context Context, for e.g. user - * IDatabase $dbr Database, for addQuotes, makeList, and similar - * array &$tables Array of tables; see IDatabase::select $table - * array &$fields Array of fields; see IDatabase::select $vars - * array &$conds Array of conditions; see IDatabase::select $conds - * array &$query_options Array of query options; see IDatabase::select $options - * array &$join_conds Array of join conditions; see IDatabase::select $join_conds - * Optional only for legacy filters that still use the query hooks directly + * * $filterDefinition['name'] string Name. Used as URL parameter. + * * $filterDefinition['group'] ChangesListFilterGroup Group. Filter group this + * belongs to. + * * $filterDefinition['label'] string i18n key of label for structured UI. + * * $filterDefinition['description'] string i18n key of description for structured + * UI. + * * $filterDefinition['showHide'] string Main i18n key used for unstructured UI. + * * $filterDefinition['isReplacedInStructuredUi'] bool Whether there is an + * equivalent feature available in the structured UI; this is optional, defaulting + * to true. It does not need to be set if the exact same filter is simply visible + * on both. + * * $filterDefinition['default'] bool Default + * * $filterDefinition['priority'] int Priority integer. Higher value means higher + * up in the group's filter list. + * * $filterDefinition['queryCallable'] callable Callable accepting parameters, used + * to implement filter's DB query modification. Required, except for legacy + * filters that still use the query hooks directly. Callback parameters: + * * string $specialPageClassName Class name of current special page + * * IContextSource $context Context, for e.g. user + * * IDatabase $dbr Database, for addQuotes, makeList, and similar + * * array &$tables Array of tables; see IDatabase::select $table + * * array &$fields Array of fields; see IDatabase::select $vars + * * array &$conds Array of conditions; see IDatabase::select $conds + * * array &$query_options Array of query options; see IDatabase::select $options + * * array &$join_conds Array of join conditions; see IDatabase::select $join_conds */ public function __construct( $filterDefinition ) { parent::__construct( $filterDefinition ); @@ -139,16 +129,21 @@ class ChangesListBooleanFilter extends ChangesListFilter { } /** + * Get the default value + * + * @param bool $structuredUI Are we currently showing the structured UI * @return bool|null Default value */ - public function getDefault() { - return $this->defaultValue; + public function getDefault( $structuredUI = false ) { + return $this->isReplacedInStructuredUi && $structuredUI ? + false : + $this->defaultValue; } /** * Sets default * - * @param bool Default value + * @param bool $defaultValue */ public function setDefault( $defaultValue ) { $this->defaultValue = $defaultValue; @@ -162,19 +157,18 @@ class ChangesListBooleanFilter extends ChangesListFilter { } /** - * @inheritdoc + * @inheritDoc */ - public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) { - return $this->showHide && - $this->isAllowed( $specialPage ); + public function displaysOnUnstructuredUi() { + return !!$this->showHide; } /** - * @inheritdoc + * @inheritDoc */ - public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) { + public function isFeatureAvailableOnStructuredUi() { return $this->isReplacedInStructuredUi || - parent::isFeatureAvailableOnStructuredUi( $specialPage ); + parent::isFeatureAvailableOnStructuredUi(); } /** @@ -190,8 +184,8 @@ class ChangesListBooleanFilter extends ChangesListFilter { * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds */ public function modifyQuery( IDatabase $dbr, ChangesListSpecialPage $specialPage, - &$tables, &$fields, &$conds, &$query_options, &$join_conds ) { - + &$tables, &$fields, &$conds, &$query_options, &$join_conds + ) { if ( $this->queryCallable === null ) { return; } @@ -212,7 +206,7 @@ class ChangesListBooleanFilter extends ChangesListFilter { } /** - * @inheritdoc + * @inheritDoc */ public function getJsData() { $output = parent::getJsData(); @@ -222,4 +216,13 @@ class ChangesListBooleanFilter extends ChangesListFilter { return $output; } + /** + * @inheritDoc + */ + public function isSelected( FormOptions $opts ) { + return !$opts[ $this->getName() ] && + array_filter( $this->getSiblings(), function ( $sibling ) use ( $opts ) { + return $opts[ $sibling->getName() ]; + } ); + } } diff --git a/includes/changes/ChangesListBooleanFilterGroup.php b/includes/changes/ChangesListBooleanFilterGroup.php index 1fdcd0021e..0622211f0a 100644 --- a/includes/changes/ChangesListBooleanFilterGroup.php +++ b/includes/changes/ChangesListBooleanFilterGroup.php @@ -19,13 +19,21 @@ class ChangesListBooleanFilterGroup extends ChangesListFilterGroup { * @param array $groupDefinition Configuration of group * * $groupDefinition['name'] string Group name * * $groupDefinition['title'] string i18n key for title (optional, can be omitted - * * only if none of the filters in the group display in the structured UI) + * only if none of the filters in the group display in the structured UI) * * $groupDefinition['priority'] int Priority integer. Higher means higher in the - * * group list. + * group list. * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which - * * is an associative array to be passed to the filter constructor. However, - * * 'priority' is optional for the filters. Any filter that has priority unset - * * will be put to the bottom, in the order given. + * is an associative array to be passed to the filter constructor. However, + * 'priority' is optional for the filters. Any filter that has priority unset + * will be put to the bottom, in the order given. + * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's + * This" popup (optional). + * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of + * "What's This" popup (optional). */ public function __construct( array $groupDefinition ) { $groupDefinition['isFullCoverage'] = true; @@ -35,7 +43,7 @@ class ChangesListBooleanFilterGroup extends ChangesListFilterGroup { } /** - * @inheritdoc + * @inheritDoc */ protected function createFilter( array $filterDefinition ) { return new ChangesListBooleanFilter( $filterDefinition ); @@ -51,7 +59,7 @@ class ChangesListBooleanFilterGroup extends ChangesListFilterGroup { } /** - * @inheritdoc + * @inheritDoc */ public function isPerGroupRequestParameter() { return false; diff --git a/includes/changes/ChangesListFilter.php b/includes/changes/ChangesListFilter.php index 22e797d1cf..0b34a5d969 100644 --- a/includes/changes/ChangesListFilter.php +++ b/includes/changes/ChangesListFilter.php @@ -74,32 +74,25 @@ abstract class ChangesListFilter { protected $description; /** - * Callable used to check whether this filter is allowed to take effect + * Array of associative arrays with conflict information. See + * setUnidirectionalConflict * - * @var callable $isAllowedCallable - */ - protected $isAllowedCallable; - - /** - * List of conflicting groups - * - * @var array $conflictingGroups Array of associative arrays with conflict - * information. See setUnidirectionalConflict + * @var array $conflictingGroups */ protected $conflictingGroups = []; /** - * List of conflicting filters + * Array of associative arrays with conflict information. See + * setUnidirectionalConflict * - * @var array $conflictingFilters Array of associative arrays with conflict - * information. See setUnidirectionalConflict + * @var array $conflictingFilters */ protected $conflictingFilters = []; /** - * List of filters that are a subset of the current filter + * Array of associative arrays with subset information * - * @var array $subsetFilters Array of associative arrays with subset information + * @var array $subsetFilters */ protected $subsetFilters = []; @@ -124,28 +117,22 @@ abstract class ChangesListFilter { * UI it's for. * * @param array $filterDefinition ChangesListFilter definition - * - * $filterDefinition['name'] string Name of filter; use lowercase with no - * punctuation - * $filterDefinition['cssClassSuffix'] string CSS class suffix, used to mark - * that a particular row belongs to this filter (when a row is included by the - * filter) (optional) - * $filterDefinition['isRowApplicableCallable'] Callable taking two parameters, the - * IContextSource, and the RecentChange object for the row, and returning true if - * the row is attributed to this filter. The above CSS class will then be - * automatically added (optional, required if cssClassSuffix is used). - * $filterDefinition['group'] ChangesListFilterGroup Group. Filter group this - * belongs to. - * $filterDefinition['label'] string i18n key of label for structured UI. - * $filterDefinition['description'] string i18n key of description for structured - * UI. - * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters, - * the class name of the special page and an IContextSource, and returning true - * if and only if the current user is permitted to use this filter on the current - * wiki. If it returns false, it will both hide the UI (in all UIs) and prevent - * the DB query modification from taking effect. (optional, defaults to allowed) - * $filterDefinition['priority'] int Priority integer. Higher value means higher - * up in the group's filter list. + * * $filterDefinition['name'] string Name of filter; use lowercase with no + * punctuation + * * $filterDefinition['cssClassSuffix'] string CSS class suffix, used to mark + * that a particular row belongs to this filter (when a row is included by the + * filter) (optional) + * * $filterDefinition['isRowApplicableCallable'] Callable taking two parameters, the + * IContextSource, and the RecentChange object for the row, and returning true if + * the row is attributed to this filter. The above CSS class will then be + * automatically added (optional, required if cssClassSuffix is used). + * * $filterDefinition['group'] ChangesListFilterGroup Group. Filter group this + * belongs to. + * * $filterDefinition['label'] string i18n key of label for structured UI. + * * $filterDefinition['description'] string i18n key of description for structured + * UI. + * * $filterDefinition['priority'] int Priority integer. Higher value means higher + * up in the group's filter list. */ public function __construct( array $filterDefinition ) { if ( isset( $filterDefinition['group'] ) ) { @@ -179,10 +166,6 @@ abstract class ChangesListFilter { $this->description = $filterDefinition['description']; } - if ( isset( $filterDefinition['isAllowedCallable'] ) ) { - $this->isAllowedCallable = $filterDefinition['isAllowedCallable']; - } - $this->priority = $filterDefinition['priority']; $this->group->registerFilter( $this ); @@ -203,12 +186,8 @@ abstract class ChangesListFilter { * @param string $backwardKey i18n key for conflict message in reverse * direction (when in UI context of $other object) */ - public function conflictsWith( $other, $globalKey, $forwardKey, - $backwardKey ) { - - if ( $globalKey === null || $forwardKey === null || - $backwardKey === null ) { - + public function conflictsWith( $other, $globalKey, $forwardKey, $backwardKey ) { + if ( $globalKey === null || $forwardKey === null || $backwardKey === null ) { throw new MWException( 'All messages must be specified' ); } @@ -237,12 +216,11 @@ abstract class ChangesListFilter { * @param string $contextDescription i18n key for conflict message in this * direction (when in UI context of $this object) */ - public function setUnidirectionalConflict( $other, $globalDescription, - $contextDescription ) { - + public function setUnidirectionalConflict( $other, $globalDescription, $contextDescription ) { if ( $other instanceof ChangesListFilterGroup ) { $this->conflictingGroups[] = [ 'group' => $other->getName(), + 'groupObject' => $other, 'globalDescription' => $globalDescription, 'contextDescription' => $contextDescription, ]; @@ -250,6 +228,7 @@ abstract class ChangesListFilter { $this->conflictingFilters[] = [ 'group' => $other->getGroup()->getName(), 'filter' => $other->getName(), + 'filterObject' => $other, 'globalDescription' => $globalDescription, 'contextDescription' => $contextDescription, ]; @@ -265,7 +244,7 @@ abstract class ChangesListFilter { * This means that anything in the results for the other filter is also in the * results for this one. * - * @param ChangesListFilter The filter the current instance is a superset of + * @param ChangesListFilter $other The filter the current instance is a superset of */ public function setAsSupersetOf( ChangesListFilter $other ) { if ( $other->getGroup() !== $this->getGroup() ) { @@ -311,20 +290,18 @@ abstract class ChangesListFilter { /** * Checks whether the filter should display on the unstructured UI * - * @param ChangesListSpecialPage $specialPage Current special page * @return bool Whether to display */ - abstract public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ); + abstract public function displaysOnUnstructuredUi(); /** * Checks whether the filter should display on the structured UI * This refers to the exact filter. See also isFeatureAvailableOnStructuredUi. * - * @param ChangesListSpecialPage $specialPage Current special page * @return bool Whether to display */ - public function displaysOnStructuredUi( ChangesListSpecialPage $specialPage ) { - return $this->label !== null && $this->isAllowed( $specialPage ); + public function displaysOnStructuredUi() { + return $this->label !== null; } /** @@ -333,8 +310,8 @@ abstract class ChangesListFilter { * * This can either be the exact filter, or a new filter that replaces it. */ - public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) { - return $this->displaysOnStructuredUi( $specialPage ); + public function isFeatureAvailableOnStructuredUi() { + return $this->displaysOnStructuredUi(); } /** @@ -344,24 +321,6 @@ abstract class ChangesListFilter { return $this->priority; } - /** - * Checks whether the filter is allowed for the current context - * - * @param ChangesListSpecialPage $specialPage Current special page - * @return bool Whether it is allowed - */ - public function isAllowed( ChangesListSpecialPage $specialPage ) { - if ( $this->isAllowedCallable === null ) { - return true; - } else { - return call_user_func( - $this->isAllowedCallable, - get_class( $specialPage ), - $specialPage->getContext() - ); - } - } - /** * Gets the CSS class * @@ -380,7 +339,7 @@ abstract class ChangesListFilter { * * @param IContextSource $ctx Context source * @param RecentChange $rc Recent changes object - * @param Non-associative array of CSS class names; appended to if needed + * @param array &$classes Non-associative array of CSS class names; appended to if needed */ public function applyCssClassIfNeeded( IContextSource $ctx, RecentChange $rc, array &$classes ) { if ( $this->isRowApplicableCallable === null ) { @@ -421,6 +380,8 @@ abstract class ChangesListFilter { ); foreach ( $conflicts as $conflictInfo ) { + unset( $conflictInfo['filterObject'] ); + unset( $conflictInfo['groupObject'] ); $output['conflicts'][] = $conflictInfo; array_push( $output['messageKeys'], @@ -431,4 +392,105 @@ abstract class ChangesListFilter { return $output; } + + /** + * Checks whether this filter is selected in the provided options + * + * @param FormOptions $opts + * @return bool + */ + abstract public function isSelected( FormOptions $opts ); + + /** + * Get groups conflicting with this filter + * + * @return ChangesListFilterGroup[] + */ + public function getConflictingGroups() { + return array_map( + function ( $conflictDesc ) { + return $conflictDesc[ 'groupObject' ]; + }, + $this->conflictingGroups + ); + } + + /** + * Get filters conflicting with this filter + * + * @return ChangesListFilter[] + */ + public function getConflictingFilters() { + return array_map( + function ( $conflictDesc ) { + return $conflictDesc[ 'filterObject' ]; + }, + $this->conflictingFilters + ); + } + + /** + * Check if the conflict with a group is currently "active" + * + * @param ChangesListFilterGroup $group + * @param FormOptions $opts + * @return bool + */ + public function activelyInConflictWithGroup( ChangesListFilterGroup $group, FormOptions $opts ) { + if ( $group->anySelected( $opts ) && $this->isSelected( $opts ) ) { + /** @var ChangesListFilter $siblingFilter */ + foreach ( $this->getSiblings() as $siblingFilter ) { + if ( $siblingFilter->isSelected( $opts ) && !$siblingFilter->hasConflictWithGroup( $group ) ) { + return false; + } + } + return true; + } + return false; + } + + private function hasConflictWithGroup( ChangesListFilterGroup $group ) { + return in_array( $group, $this->getConflictingGroups() ); + } + + /** + * Check if the conflict with a filter is currently "active" + * + * @param ChangesListFilter $filter + * @param FormOptions $opts + * @return bool + */ + public function activelyInConflictWithFilter( ChangeslistFilter $filter, FormOptions $opts ) { + if ( $this->isSelected( $opts ) && $filter->isSelected( $opts ) ) { + /** @var ChangesListFilter $siblingFilter */ + foreach ( $this->getSiblings() as $siblingFilter ) { + if ( + $siblingFilter->isSelected( $opts ) && + !$siblingFilter->hasConflictWithFilter( $filter ) + ) { + return false; + } + } + return true; + } + return false; + } + + private function hasConflictWithFilter( ChangeslistFilter $filter ) { + return in_array( $filter, $this->getConflictingFilters() ); + } + + /** + * Get filters in the same group + * + * @return ChangesListFilter[] + */ + protected function getSiblings() { + return array_filter( + $this->getGroup()->getFilters(), + function ( $filter ) { + return $filter !== $this; + } + ); + } } diff --git a/includes/changes/ChangesListFilterGroup.php b/includes/changes/ChangesListFilterGroup.php index d2ad204546..57627525a3 100644 --- a/includes/changes/ChangesListFilterGroup.php +++ b/includes/changes/ChangesListFilterGroup.php @@ -106,18 +106,18 @@ abstract class ChangesListFilterGroup { protected $isFullCoverage; /** - * List of conflicting groups + * Array of associative arrays with conflict information. See + * setUnidirectionalConflict * - * @var array $conflictingGroups Array of associative arrays with conflict - * information. See setUnidirectionalConflict + * @var array $conflictingGroups */ protected $conflictingGroups = []; /** - * List of conflicting filters + * Array of associative arrays with conflict information. See + * setUnidirectionalConflict * - * @var array $conflictingFilters Array of associative arrays with conflict - * information. See setUnidirectionalConflict + * @var array $conflictingFilters */ protected $conflictingFilters = []; @@ -131,17 +131,25 @@ abstract class ChangesListFilterGroup { * @param array $groupDefinition Configuration of group * * $groupDefinition['name'] string Group name; use camelCase with no punctuation * * $groupDefinition['title'] string i18n key for title (optional, can be omitted - * * only if none of the filters in the group display in the structured UI) + * only if none of the filters in the group display in the structured UI) * * $groupDefinition['type'] string A type constant from a subclass of this one * * $groupDefinition['priority'] int Priority integer. Higher value means higher - * * up in the group list (optional, defaults to -100). + * up in the group list (optional, defaults to -100). * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which - * * is an associative array to be passed to the filter constructor. However, - * * 'priority' is optional for the filters. Any filter that has priority unset - * * will be put to the bottom, in the order given. + * is an associative array to be passed to the filter constructor. However, + * 'priority' is optional for the filters. Any filter that has priority unset + * will be put to the bottom, in the order given. * * $groupDefinition['isFullCoverage'] bool Whether the group is full coverage; - * * if true, this means that checking every item in the group means no - * * changes list entries are filtered out. + * if true, this means that checking every item in the group means no + * changes list entries are filtered out. + * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's + * This" popup (optional). + * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of + * "What's This" popup (optional). */ public function __construct( array $groupDefinition ) { if ( strpos( $groupDefinition['name'], self::RESERVED_NAME_CHAR ) !== false ) { @@ -157,7 +165,7 @@ abstract class ChangesListFilterGroup { $this->title = $groupDefinition['title']; } - if ( isset ( $groupDefinition['whatsThisHeader'] ) ) { + if ( isset( $groupDefinition['whatsThisHeader'] ) ) { $this->whatsThisHeader = $groupDefinition['whatsThisHeader']; $this->whatsThisBody = $groupDefinition['whatsThisBody']; $this->whatsThisUrl = $groupDefinition['whatsThisUrl']; @@ -221,12 +229,8 @@ abstract class ChangesListFilterGroup { * @param string $backwardKey i18n key for conflict message in reverse * direction (when in UI context of $other object) */ - public function conflictsWith( $other, $globalKey, $forwardKey, - $backwardKey ) { - - if ( $globalKey === null || $forwardKey === null || - $backwardKey === null ) { - + public function conflictsWith( $other, $globalKey, $forwardKey, $backwardKey ) { + if ( $globalKey === null || $forwardKey === null || $backwardKey === null ) { throw new MWException( 'All messages must be specified' ); } @@ -255,12 +259,11 @@ abstract class ChangesListFilterGroup { * @param string $contextDescription i18n key for conflict message in this * direction (when in UI context of $this object) */ - public function setUnidirectionalConflict( $other, $globalDescription, - $contextDescription ) { - + public function setUnidirectionalConflict( $other, $globalDescription, $contextDescription ) { if ( $other instanceof ChangesListFilterGroup ) { $this->conflictingGroups[] = [ 'group' => $other->getName(), + 'groupObject' => $other, 'globalDescription' => $globalDescription, 'contextDescription' => $contextDescription, ]; @@ -268,6 +271,7 @@ abstract class ChangesListFilterGroup { $this->conflictingFilters[] = [ 'group' => $other->getGroup()->getName(), 'filter' => $other->getName(), + 'filterObject' => $other, 'globalDescription' => $globalDescription, 'contextDescription' => $contextDescription, ]; @@ -305,7 +309,8 @@ abstract class ChangesListFilterGroup { } /** - * @return array Associative array of ChangesListFilter objects, with filter name as key + * @return ChangesListFilter[] Associative array of ChangesListFilter objects, with + * filter name as key */ public function getFilters() { return $this->filters; @@ -332,12 +337,11 @@ abstract class ChangesListFilterGroup { /** * Gets the JS data in the format required by the front-end of the structured UI * - * @param ChangesListSpecialPage $specialPage * @return array|null Associative array, or null if there are no filters that * display in the structured UI. messageKeys is a special top-level value, with * the value being an array of the message keys to send to the client. */ - public function getJsData( ChangesListSpecialPage $specialPage ) { + public function getJsData() { $output = [ 'name' => $this->name, 'type' => $this->type, @@ -348,7 +352,7 @@ abstract class ChangesListFilterGroup { 'messageKeys' => [ $this->title ] ]; - if ( isset ( $this->whatsThisHeader ) ) { + if ( isset( $this->whatsThisHeader ) ) { $output['whatsThisHeader'] = $this->whatsThisHeader; $output['whatsThisBody'] = $this->whatsThisBody; $output['whatsThisUrl'] = $this->whatsThisUrl; @@ -367,7 +371,7 @@ abstract class ChangesListFilterGroup { } ); foreach ( $this->filters as $filterName => $filter ) { - if ( $filter->displaysOnStructuredUi( $specialPage ) ) { + if ( $filter->displaysOnStructuredUi() ) { $filterData = $filter->getJsData(); $output['messageKeys'] = array_merge( $output['messageKeys'], @@ -391,6 +395,8 @@ abstract class ChangesListFilterGroup { foreach ( $conflicts as $conflictInfo ) { $output['conflicts'][] = $conflictInfo; + unset( $conflictInfo['filterObject'] ); + unset( $conflictInfo['groupObject'] ); array_push( $output['messageKeys'], $conflictInfo['globalDescription'], @@ -400,4 +406,47 @@ abstract class ChangesListFilterGroup { return $output; } + + /** + * Get groups conflicting with this filter group + * + * @return ChangesListFilterGroup[] + */ + public function getConflictingGroups() { + return array_map( + function ( $conflictDesc ) { + return $conflictDesc[ 'groupObject' ]; + }, + $this->conflictingGroups + ); + } + + /** + * Get filters conflicting with this filter group + * + * @return ChangesListFilter[] + */ + public function getConflictingFilters() { + return array_map( + function ( $conflictDesc ) { + return $conflictDesc[ 'filterObject' ]; + }, + $this->conflictingFilters + ); + } + + /** + * Check if any filter in this group is selected + * + * @param FormOptions $opts + * @return bool + */ + public function anySelected( FormOptions $opts ) { + return !!count( array_filter( + $this->getFilters(), + function ( ChangesListFilter $filter ) use ( $opts ) { + return $filter->isSelected( $opts ); + } + ) ); + } } diff --git a/includes/changes/ChangesListStringOptionsFilter.php b/includes/changes/ChangesListStringOptionsFilter.php index b6a877473c..930ba128f6 100644 --- a/includes/changes/ChangesListStringOptionsFilter.php +++ b/includes/changes/ChangesListStringOptionsFilter.php @@ -9,9 +9,22 @@ */ class ChangesListStringOptionsFilter extends ChangesListFilter { /** - * @inheritdoc + * @inheritDoc */ - public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) { + public function displaysOnUnstructuredUi() { return false; } + + /** + * @inheritDoc + */ + public function isSelected( FormOptions $opts ) { + $option = $opts[ $this->getGroup()->getName() ]; + if ( $option === ChangesListStringOptionsFilterGroup::ALL ) { + return true; + } + + $values = explode( ChangesListStringOptionsFilterGroup::SEPARATOR, $option ); + return in_array( $this->getName(), $values ); + } } diff --git a/includes/changes/ChangesListStringOptionsFilterGroup.php b/includes/changes/ChangesListStringOptionsFilterGroup.php index befc2136f2..59efd82bca 100644 --- a/includes/changes/ChangesListStringOptionsFilterGroup.php +++ b/includes/changes/ChangesListStringOptionsFilterGroup.php @@ -22,6 +22,8 @@ * @author Matthew Flaschen */ +use Wikimedia\Rdbms\IDatabase; + /** * Represents a filter group with multiple string options. They are passed to the server as * a single form parameter separated by a delimiter. The parameter name is the @@ -58,12 +60,6 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { */ const NONE = ''; - /** - * Group name; used as form parameter. - * - * @var string $name - */ - /** * Defaul parameter value * @@ -84,27 +80,35 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { * @param array $groupDefinition Configuration of group * * $groupDefinition['name'] string Group name * * $groupDefinition['title'] string i18n key for title (optional, can be omitted - * * only if none of the filters in the group display in the structured UI) + * only if none of the filters in the group display in the structured UI) * * $groupDefinition['priority'] int Priority integer. Higher means higher in the - * * group list. + * group list. * * $groupDefinition['filters'] array Numeric array of filter definitions, each of which - * * is an associative array to be passed to the filter constructor. However, - * * 'priority' is optional for the filters. Any filter that has priority unset - * * will be put to the bottom, in the order given. + * is an associative array to be passed to the filter constructor. However, + * 'priority' is optional for the filters. Any filter that has priority unset + * will be put to the bottom, in the order given. * * $groupDefinition['default'] string Default for group. * * $groupDefinition['isFullCoverage'] bool Whether the group is full coverage; - * * if true, this means that checking every item in the group means no - * * changes list entries are filtered out. + * if true, this means that checking every item in the group means no + * changes list entries are filtered out. * * $groupDefinition['queryCallable'] callable Callable accepting parameters: - * * string $specialPageClassName Class name of current special page - * * IContextSource $context Context, for e.g. user - * * IDatabase $dbr Database, for addQuotes, makeList, and similar - * * array &$tables Array of tables; see IDatabase::select $table - * * array &$fields Array of fields; see IDatabase::select $vars - * * array &$conds Array of conditions; see IDatabase::select $conds - * * array &$query_options Array of query options; see IDatabase::select $options - * * array &$join_conds Array of join conditions; see IDatabase::select $join_conds - * * array $selectedValues The allowed and requested values, lower-cased and sorted + * * string $specialPageClassName Class name of current special page + * * IContextSource $context Context, for e.g. user + * * IDatabase $dbr Database, for addQuotes, makeList, and similar + * * array &$tables Array of tables; see IDatabase::select $table + * * array &$fields Array of fields; see IDatabase::select $vars + * * array &$conds Array of conditions; see IDatabase::select $conds + * * array &$query_options Array of query options; see IDatabase::select $options + * * array &$join_conds Array of join conditions; see IDatabase::select $join_conds + * * array $selectedValues The allowed and requested values, lower-cased and sorted + * * $groupDefinition['whatsThisHeader'] string i18n key for header of "What's + * This" popup (optional). + * * $groupDefinition['whatsThisBody'] string i18n key for body of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisUrl'] string URL for main link of "What's This" + * popup (optional). + * * $groupDefinition['whatsThisLinkText'] string i18n key of text for main link of + * "What's This" popup (optional). */ public function __construct( array $groupDefinition ) { if ( !isset( $groupDefinition['isFullCoverage'] ) ) { @@ -125,7 +129,7 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { } /** - * @inheritdoc + * @inheritDoc */ public function isPerGroupRequestParameter() { return true; @@ -150,7 +154,7 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { } /** - * @inheritdoc + * @inheritDoc */ protected function createFilter( array $filterDefinition ) { return new ChangesListStringOptionsFilter( $filterDefinition ); @@ -181,13 +185,11 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { * @param string $value URL parameter value */ public function modifyQuery( IDatabase $dbr, ChangesListSpecialPage $specialPage, - &$tables, &$fields, &$conds, &$query_options, &$join_conds, $value ) { - + &$tables, &$fields, &$conds, &$query_options, &$join_conds, $value + ) { $allowedFilterNames = []; foreach ( $this->filters as $filter ) { - if ( $filter->isAllowed( $specialPage ) ) { - $allowedFilterNames[] = $filter->getName(); - } + $allowedFilterNames[] = $filter->getName(); } if ( $value === self::ALL ) { @@ -230,10 +232,10 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup { } /** - * @inheritdoc + * @inheritDoc */ - public function getJsData( ChangesListSpecialPage $specialPage ) { - $output = parent::getJsData( $specialPage ); + public function getJsData() { + $output = parent::getJsData(); $output['separator'] = self::SEPARATOR; $output['default'] = $this->getDefault(); diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php index b8a2ac8575..def6457ebf 100644 --- a/includes/changes/EnhancedChangesList.php +++ b/includes/changes/EnhancedChangesList.php @@ -32,6 +32,11 @@ class EnhancedChangesList extends ChangesList { */ protected $rc_cache; + /** + * @var TemplateParser + */ + protected $templateParser; + /** * @param IContextSource|Skin $obj * @param array $filterGroups Array of ChangesListFilterGroup objects (currently optional) @@ -58,6 +63,7 @@ class EnhancedChangesList extends ChangesList { $this->message, $this->linkRenderer ); + $this->templateParser = new TemplateParser(); } /** @@ -85,27 +91,28 @@ class EnhancedChangesList extends ChangesList { /** * Format a line for enhanced recentchange (aka with javascript and block of lines). * - * @param RecentChange $rc + * @param RecentChange &$rc * @param bool $watched * @param int $linenumber (default null) * * @return string */ public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) { - $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() ); + if ( $this->lastdate === '' ) { + $this->lastdate = $date; + } $ret = ''; - # If it's a new day, add the headline and flush the cache - if ( $date != $this->lastdate ) { - # Process current cache + # If it's a new day, flush the cache and update $this->lastdate + if ( $date !== $this->lastdate ) { + # Process current cache (uses $this->lastdate to generate a heading) $ret = $this->recentChangesBlock(); $this->rc_cache = []; - $ret .= Xml::element( 'h4', null, $date ) . "\n"; $this->lastdate = $date; } @@ -165,12 +172,14 @@ class EnhancedChangesList extends ChangesList { $recentChangesFlags = $this->getConfig()->get( 'RecentChangesFlags' ); # Add the namespace and title of the block as part of the class - $tableClasses = [ 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' ]; + $tableClasses = [ 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc', 'mw-changeslist-line' ]; if ( $block[0]->mAttribs['rc_log_type'] ) { # Log entry + $tableClasses[] = 'mw-changeslist-log'; $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $block[0]->mAttribs['rc_log_type'] ); } else { + $tableClasses[] = 'mw-changeslist-edit'; $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-ns' . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] ); } @@ -237,8 +246,7 @@ class EnhancedChangesList extends ChangesList { $text = $userlink; $text .= $this->getLanguage()->getDirMark(); if ( $count > 1 ) { - // @todo FIXME: Hardcoded '×'. Should be a message. - $formattedCount = $this->getLanguage()->formatNum( $count ) . '×'; + $formattedCount = $this->msg( 'ntimes' )->numParams( $count )->escaped(); $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $formattedCount )->escaped(); } array_push( $users, $text ); @@ -324,6 +332,11 @@ class EnhancedChangesList extends ChangesList { implode( $this->message['semicolon-separator'], $users ) )->escaped(); + $prefix = ''; + if ( is_callable( $this->changeLinePrefixer ) ) { + $prefix = call_user_func( $this->changeLinePrefixer, $block[0], $this, true ); + } + $templateParams = [ 'articleLink' => $articleLink, 'charDifference' => $charDifference, @@ -332,6 +345,7 @@ class EnhancedChangesList extends ChangesList { 'lines' => $lines, 'logText' => $logText, 'numberofWatchingusers' => $numberofWatchingusers, + 'prefix' => $prefix, 'rev-deleted-event' => $revDeletedMsg, 'tableClasses' => $tableClasses, 'timestamp' => $block[0]->timestamp, @@ -340,8 +354,7 @@ class EnhancedChangesList extends ChangesList { $this->rcCacheIndex++; - $templateParser = new TemplateParser(); - return $templateParser->processTemplate( + return $this->templateParser->processTemplate( 'EnhancedChangesListGroup', $templateParams ); @@ -361,7 +374,7 @@ class EnhancedChangesList extends ChangesList { $type = $rcObj->mAttribs['rc_type']; $data = []; - $lineParams = []; + $lineParams = [ 'targetTitle' => $rcObj->getTitle() ]; $classes = [ 'mw-enhanced-rc' ]; if ( $rcObj->watched @@ -442,13 +455,16 @@ class EnhancedChangesList extends ChangesList { # Tags $data['tags'] = $this->getTags( $rcObj, $classes ); + $attribs = $this->getDataAttributes( $rcObj ); + // give the hook a chance to modify the data $success = Hooks::run( 'EnhancedChangesListModifyLineData', - [ $this, &$data, $block, $rcObj, &$classes ] ); + [ $this, &$data, $block, $rcObj, &$classes, &$attribs ] ); if ( !$success ) { // skip entry if hook aborted it return []; } + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); $lineParams['recentChangesFlagsRaw'] = []; if ( isset( $data['recentChangesFlags'] ) ) { @@ -464,6 +480,7 @@ class EnhancedChangesList extends ChangesList { } $lineParams['classes'] = array_values( $classes ); + $lineParams['attribs'] = Html::expandAttributes( $attribs ); // everything else: makes it easier for extensions to add or remove data $lineParams['data'] = array_values( $data ); @@ -600,8 +617,10 @@ class EnhancedChangesList extends ChangesList { if ( $logType ) { # Log entry + $classes[] = 'mw-changeslist-log'; $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' . $logType ); } else { + $classes[] = 'mw-changeslist-edit'; $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' . $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] ); } @@ -666,6 +685,8 @@ class EnhancedChangesList extends ChangesList { # Show how many people are watching this if enabled $data['watchingUsers'] = $this->numberofWatchingusers( $rcObj->numberofWatchingusers ); + $data['attribs'] = array_merge( $this->getDataAttributes( $rcObj ), [ 'class' => $classes ] ); + // give the hook a chance to modify the data $success = Hooks::run( 'EnhancedChangesListModifyBlockLineData', [ $this, &$data, $rcObj ] ); @@ -673,10 +694,21 @@ class EnhancedChangesList extends ChangesList { // skip entry if hook aborted it return ''; } + $attribs = $data['attribs']; + unset( $data['attribs'] ); + $attribs = wfArrayFilterByKey( $attribs, function ( $key ) { + return $key === 'class' || Sanitizer::isReservedDataAttribute( $key ); + } ); + + $prefix = ''; + if ( is_callable( $this->changeLinePrefixer ) ) { + $prefix = call_user_func( $this->changeLinePrefixer, $rcObj, $this, false ); + } - $line = Html::openElement( 'table', [ 'class' => $classes ] ) . - Html::openElement( 'tr' ); - $line .= ''; + $line = Html::openElement( 'table', $attribs ) . Html::openElement( 'tr' ); + $line .= Html::rawElement( 'td', [], '' ); + $line .= Html::rawElement( 'td', [ 'class' => 'mw-changeslist-line-prefix' ], $prefix ); + $line .= ''; if ( isset( $data['recentChangesFlags'] ) ) { $line .= $this->recentChangesFlags( $data['recentChangesFlags'] ); @@ -687,7 +719,12 @@ class EnhancedChangesList extends ChangesList { $line .= ' ' . $data['timestampLink']; unset( $data['timestampLink'] ); } - $line .= ' '; + $line .= ' '; + $line .= Html::openElement( 'td', [ + 'class' => 'mw-changeslist-line-inner', + // Used for reliable determination of the affiliated page + 'data-target-page' => $rcObj->getTitle(), + ] ); // everything else: makes it easier for extensions to add or remove data $line .= implode( '', $data ); @@ -712,6 +749,11 @@ class EnhancedChangesList extends ChangesList { if ( $rc->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) { // For categorizations we must swap the category title with the page title! $pageTitle = Title::newFromID( $rc->getAttribute( 'rc_cur_id' ) ); + if ( !$pageTitle ) { + // The page has been deleted, but the RC entry + // deletion job has not run yet. Just skip. + return ''; + } } $retVal = ' ' . $this->msg( 'parentheses' ) @@ -745,7 +787,11 @@ class EnhancedChangesList extends ChangesList { } } - return '
    ' . $blockOut . '
    '; + if ( $blockOut === '' ) { + return ''; + } + // $this->lastdate is kept up to date by recentChangesLine() + return Xml::element( 'h4', null, $this->lastdate ) . "\n
    " . $blockOut . '
    '; } /** diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php index a5d5191da8..88c3c226cd 100644 --- a/includes/changes/OldChangesList.php +++ b/includes/changes/OldChangesList.php @@ -25,14 +25,13 @@ class OldChangesList extends ChangesList { /** * Format a line using the old system (aka without any javascript). * - * @param RecentChange $rc Passed by reference + * @param RecentChange &$rc Passed by reference * @param bool $watched (default false) * @param int $linenumber (default null) * * @return string|bool */ public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) { - $classes = $this->getHTMLClasses( $rc, $watched ); // use mw-line-even/mw-line-odd class only if linenumber is given (feature from T16468) if ( $linenumber ) { @@ -50,16 +49,23 @@ class OldChangesList extends ChangesList { $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] ); } + $attribs = $this->getDataAttributes( $rc ); + // Avoid PHP 7.1 warning from passing $this by reference $list = $this; - if ( !Hooks::run( 'OldChangesListRecentChangesLine', [ &$list, &$html, $rc, &$classes ] ) ) { + if ( !Hooks::run( 'OldChangesListRecentChangesLine', + [ &$list, &$html, $rc, &$classes, &$attribs ] ) + ) { return false; } + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); $dateheader = ''; // $html now contains only
  • ...
  • , for hooks' convenience. $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] ); - return "$dateheader
  • " . $html . "
  • \n"; + $attribs['class'] = implode( ' ', $classes ); + + return $dateheader . Html::rawElement( 'li', $attribs, $html ) . "\n"; } /** @@ -76,7 +82,7 @@ class OldChangesList extends ChangesList { if ( $rc->mAttribs['rc_log_type'] ) { $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] ); $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] ); - $flags = $this->recentChangesFlags( [ 'unpatrolled' =>$unpatrolled, + $flags = $this->recentChangesFlags( [ 'unpatrolled' => $unpatrolled, 'bot' => $rc->mAttribs['rc_bot'] ], '' ); if ( $flags !== '' ) { $html .= ' ' . $flags; @@ -136,6 +142,15 @@ class OldChangesList extends ChangesList { $html .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers ); } + $html = Html::rawElement( 'span', [ + 'class' => 'mw-changeslist-line-inner', + 'data-target-page' => $rc->getTitle(), // Used for reliable determination of the affiliated page + ], $html ); + if ( is_callable( $this->changeLinePrefixer ) ) { + $prefix = call_user_func( $this->changeLinePrefixer, $rc, $this, false ); + $html = Html::rawElement( 'span', [ 'class' => 'mw-changeslist-line-prefix' ], $prefix ) . $html; + } + return $html; } } diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php index dcab158ddb..f1233639fe 100644 --- a/includes/changes/RecentChange.php +++ b/includes/changes/RecentChange.php @@ -130,7 +130,7 @@ class RecentChange { if ( is_array( $type ) ) { $retval = []; foreach ( $type as $t ) { - $retval[] = RecentChange::parseToRCType( $t ); + $retval[] = self::parseToRCType( $t ); } return $retval; @@ -426,6 +426,7 @@ class RecentChange { * @since 1.22 * @deprecated since 1.29 Use RCFeed::factory() instead * @param string $uri URI to get the engine object for + * @param array $params * @return RCFeedEngine The engine object * @throws MWException */ @@ -459,7 +460,7 @@ class RecentChange { $change = $change instanceof RecentChange ? $change - : RecentChange::newFromId( $change ); + : self::newFromId( $change ); if ( !$change instanceof RecentChange ) { return null; @@ -552,9 +553,9 @@ class RecentChange { * Makes an entry in the database corresponding to an edit * * @param string $timestamp - * @param Title $title + * @param Title &$title * @param bool $minor - * @param User $user + * @param User &$user * @param string $comment * @param int $oldId * @param string $lastTimestamp @@ -629,9 +630,9 @@ class RecentChange { * Note: the title object must be loaded with the new id using resetArticleID() * * @param string $timestamp - * @param Title $title + * @param Title &$title * @param bool $minor - * @param User $user + * @param User &$user * @param string $comment * @param bool $bot * @param string $ip @@ -699,8 +700,8 @@ class RecentChange { /** * @param string $timestamp - * @param Title $title - * @param User $user + * @param Title &$title + * @param User &$user * @param string $actionComment * @param string $ip * @param string $type @@ -730,8 +731,8 @@ class RecentChange { /** * @param string $timestamp - * @param Title $title - * @param User $user + * @param Title &$title + * @param User &$user * @param string $actionComment * @param string $ip * @param string $type @@ -874,7 +875,7 @@ class RecentChange { 'rc_logid' => 0, 'rc_log_type' => null, 'rc_log_action' => '', - 'rc_params' => serialize( [ + 'rc_params' => serialize( [ 'hidden-cat' => WikiCategoryPage::factory( $categoryTitle )->isHidden() ] ) ]; @@ -911,7 +912,16 @@ class RecentChange { public function loadFromRow( $row ) { $this->mAttribs = get_object_vars( $row ); $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] ); - $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set + // rc_deleted MUST be set + $this->mAttribs['rc_deleted'] = $row->rc_deleted; + + if ( isset( $this->mAttribs['rc_ip'] ) ) { + // Clean up CIDRs for Postgres per T164898. ("127.0.0.1" casts to "127.0.0.1/32") + $n = strpos( $this->mAttribs['rc_ip'], '/' ); + if ( $n !== false ) { + $this->mAttribs['rc_ip'] = substr( $this->mAttribs['rc_ip'], 0, $n ); + } + } } /** diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index d2239eb0be..fa981247c2 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -21,6 +21,9 @@ * @ingroup Change tagging */ +use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\Database; + class ChangeTags { /** * Can't delete tags with more than this many uses. Similar in intent to @@ -117,6 +120,32 @@ class ChangeTags { return $msg->parse(); } + /** + * Get the message object for the tag's long description. + * + * Checks if message key "mediawiki:tag-$tag-description" exists. If it does not, + * or if message is disabled, returns false. Otherwise, returns the message object + * for the long description. + * + * @param string $tag Tag + * @param IContextSource $context + * @return Message|bool Message object of the tag long description or false if + * there is no description. + */ + public static function tagLongDescriptionMessage( $tag, IContextSource $context ) { + $msg = $context->msg( "tag-$tag-description" ); + if ( !$msg->exists() ) { + return false; + } + if ( $msg->isDisabled() ) { + // The message exists but is disabled, hide the description. + return false; + } + + // Message exists and isn't disabled, use it. + return $msg; + } + /** * Add tags to a change given its rc_id, rev_id and/or log_id * @@ -172,7 +201,6 @@ class ChangeTags { &$rev_id = null, &$log_id = null, $params = null, RecentChange $rc = null, User $user = null ) { - $tagsToAdd = array_filter( (array)$tagsToAdd ); // Make sure we're submitting all tags... $tagsToRemove = array_filter( (array)$tagsToRemove ); @@ -246,8 +274,8 @@ class ChangeTags { // update the tag_summary row $prevTags = []; if ( !self::updateTagSummaryRow( $tagsToAdd, $tagsToRemove, $rc_id, $rev_id, - $log_id, $prevTags ) ) { - + $log_id, $prevTags ) + ) { // nothing to do return [ [], [], $prevTags ]; } @@ -314,8 +342,8 @@ class ChangeTags { * @since 1.25 */ protected static function updateTagSummaryRow( &$tagsToAdd, &$tagsToRemove, - $rc_id, $rev_id, $log_id, &$prevTags = [] ) { - + $rc_id, $rev_id, $log_id, &$prevTags = [] + ) { $dbw = wfGetDB( DB_MASTER ); $tsConds = array_filter( [ @@ -390,9 +418,7 @@ class ChangeTags { * @return Status * @since 1.25 */ - public static function canAddTagsAccompanyingChange( array $tags, - User $user = null ) { - + public static function canAddTagsAccompanyingChange( array $tags, User $user = null ) { if ( !is_null( $user ) ) { if ( !$user->isAllowed( 'applychangetags' ) ) { return Status::newFatal( 'tags-apply-no-permission' ); @@ -402,8 +428,8 @@ class ChangeTags { } // to be applied, a tag has to be explicitly defined - // @todo Allow extensions to define tags that can be applied by users... $allowedTags = self::listExplicitlyDefinedTags(); + Hooks::run( 'ChangeTagsAllowedAdd', [ &$allowedTags, $tags, $user ] ); $disallowedTags = array_diff( $tags, $allowedTags ); if ( $disallowedTags ) { return self::restrictedTagError( 'tags-apply-not-allowed-one', @@ -436,7 +462,6 @@ class ChangeTags { public static function addTagsAccompanyingChangeWithChecks( array $tags, $rc_id, $rev_id, $log_id, $params, User $user ) { - // are we allowed to do this? $result = self::canAddTagsAccompanyingChange( $tags, $user ); if ( !$result->isOK() ) { @@ -462,8 +487,8 @@ class ChangeTags { * @since 1.25 */ public static function canUpdateTags( array $tagsToAdd, array $tagsToRemove, - User $user = null ) { - + User $user = null + ) { if ( !is_null( $user ) ) { if ( !$user->isAllowed( 'changetags' ) ) { return Status::newFatal( 'tags-update-no-permission' ); @@ -525,8 +550,8 @@ class ChangeTags { * @since 1.25 */ public static function updateTagsWithChecks( $tagsToAdd, $tagsToRemove, - $rc_id, $rev_id, $log_id, $params, $reason, User $user ) { - + $rc_id, $rev_id, $log_id, $params, $reason, User $user + ) { if ( is_null( $tagsToAdd ) ) { $tagsToAdd = []; } @@ -618,24 +643,32 @@ class ChangeTags { * Handles selecting tags, and filtering. * Needs $tables to be set up properly, so we can figure out which join conditions to use. * - * @param string|array $tables Table names, see Database::select - * @param string|array $fields Fields used in query, see Database::select - * @param string|array $conds Conditions used in query, see Database::select - * @param array $join_conds Join conditions, see Database::select - * @param array $options Options, see Database::select - * @param bool|string $filter_tag Tag to select on + * WARNING: If $filter_tag contains more than one tag, this function will add DISTINCT, + * which may cause performance problems for your query unless you put the ID field of your + * table at the end of the ORDER BY, and set a GROUP BY equal to the ORDER BY. For example, + * if you had ORDER BY foo_timestamp DESC, you will now need GROUP BY foo_timestamp, foo_id + * ORDER BY foo_timestamp DESC, foo_id DESC. + * + * @param string|array &$tables Table names, see Database::select + * @param string|array &$fields Fields used in query, see Database::select + * @param string|array &$conds Conditions used in query, see Database::select + * @param array &$join_conds Join conditions, see Database::select + * @param string|array &$options Options, see Database::select + * @param string|array $filter_tag Tag(s) to select on * * @throws MWException When unable to determine appropriate JOIN condition for tagging */ public static function modifyDisplayQuery( &$tables, &$fields, &$conds, - &$join_conds, &$options, $filter_tag = false ) { - global $wgRequest, $wgUseTagFilter; + &$join_conds, &$options, $filter_tag = '' ) { + global $wgUseTagFilter; - if ( $filter_tag === false ) { - $filter_tag = $wgRequest->getVal( 'tagfilter' ); - } + // Normalize to arrays + $tables = (array)$tables; + $fields = (array)$fields; + $conds = (array)$conds; + $options = (array)$options; - // Figure out which conditions can be done. + // Figure out which ID field to use if ( in_array( 'recentchanges', $tables ) ) { $join_cond = 'ct_rc_id=rc_id'; } elseif ( in_array( 'logging', $tables ) ) { @@ -659,6 +692,12 @@ class ChangeTags { $tables[] = 'change_tag'; $join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ]; $conds['ct_tag'] = $filter_tag; + if ( + is_array( $filter_tag ) && count( $filter_tag ) > 1 && + !in_array( 'DISTINCT', $options ) + ) { + $options[] = 'DISTINCT'; + } } } @@ -763,8 +802,8 @@ class ChangeTags { * @since 1.25 */ protected static function logTagManagementAction( $action, $tag, $reason, - User $user, $tagCount = null, array $logEntryTags = [] ) { - + User $user, $tagCount = null, array $logEntryTags = [] + ) { $dbw = wfGetDB( DB_MASTER ); $logEntry = new ManualLogEntry( 'managetags', $action ); @@ -840,8 +879,8 @@ class ChangeTags { * @since 1.25 */ public static function activateTagWithChecks( $tag, $reason, User $user, - $ignoreWarnings = false, array $logEntryTags = [] ) { - + $ignoreWarnings = false, array $logEntryTags = [] + ) { // are we allowed to do this? $result = self::canActivateTag( $tag, $user ); if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) { @@ -903,8 +942,8 @@ class ChangeTags { * @since 1.25 */ public static function deactivateTagWithChecks( $tag, $reason, User $user, - $ignoreWarnings = false, array $logEntryTags = [] ) { - + $ignoreWarnings = false, array $logEntryTags = [] + ) { // are we allowed to do this? $result = self::canDeactivateTag( $tag, $user ); if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) { @@ -922,6 +961,37 @@ class ChangeTags { return Status::newGood( $logId ); } + /** + * Is the tag name valid? + * + * @param string $tag Tag that you are interested in creating + * @return Status + * @since 1.30 + */ + public static function isTagNameValid( $tag ) { + // no empty tags + if ( $tag === '' ) { + return Status::newFatal( 'tags-create-no-name' ); + } + + // tags cannot contain commas (used as a delimiter in tag_summary table), + // pipe (used as a delimiter between multiple tags in + // SpecialRecentchanges and friends), or slashes (would break tag description messages in + // MediaWiki namespace) + if ( strpos( $tag, ',' ) !== false || strpos( $tag, '|' ) !== false + || strpos( $tag, '/' ) !== false ) { + return Status::newFatal( 'tags-create-invalid-chars' ); + } + + // could the MediaWiki namespace description messages be created? + $title = Title::makeTitleSafe( NS_MEDIAWIKI, "Tag-$tag-description" ); + if ( is_null( $title ) ) { + return Status::newFatal( 'tags-create-invalid-title-chars' ); + } + + return Status::newGood(); + } + /** * Is it OK to allow the user to create this tag? * @@ -940,21 +1010,9 @@ class ChangeTags { } } - // no empty tags - if ( $tag === '' ) { - return Status::newFatal( 'tags-create-no-name' ); - } - - // tags cannot contain commas (used as a delimiter in tag_summary table) or - // slashes (would break tag description messages in MediaWiki namespace) - if ( strpos( $tag, ',' ) !== false || strpos( $tag, '/' ) !== false ) { - return Status::newFatal( 'tags-create-invalid-chars' ); - } - - // could the MediaWiki namespace description messages be created? - $title = Title::makeTitleSafe( NS_MEDIAWIKI, "Tag-$tag-description" ); - if ( is_null( $title ) ) { - return Status::newFatal( 'tags-create-invalid-title-chars' ); + $status = self::isTagNameValid( $tag ); + if ( !$status->isGood() ) { + return $status; } // does the tag already exist? @@ -986,8 +1044,8 @@ class ChangeTags { * @since 1.25 */ public static function createTagWithChecks( $tag, $reason, User $user, - $ignoreWarnings = false, array $logEntryTags = [] ) { - + $ignoreWarnings = false, array $logEntryTags = [] + ) { // are we allowed to do this? $result = self::canCreateTag( $tag, $user ); if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) { @@ -1117,8 +1175,8 @@ class ChangeTags { * @since 1.25 */ public static function deleteTagWithChecks( $tag, $reason, User $user, - $ignoreWarnings = false, array $logEntryTags = [] ) { - + $ignoreWarnings = false, array $logEntryTags = [] + ) { // are we allowed to do this? $result = self::canDeleteTag( $tag, $user ); if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) { @@ -1156,8 +1214,9 @@ class ChangeTags { if ( !Hooks::isRegistered( 'ChangeTagsListActive' ) ) { return $tags; } - return ObjectCache::getMainWANInstance()->getWithSetCallback( - wfMemcKey( 'active-tags' ), + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + return $cache->getWithSetCallback( + $cache->makeKey( 'active-tags' ), WANObjectCache::TTL_MINUTE * 5, function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) { $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) ); @@ -1167,7 +1226,7 @@ class ChangeTags { return $tags; }, [ - 'checkKeys' => [ wfMemcKey( 'active-tags' ) ], + 'checkKeys' => [ $cache->makeKey( 'active-tags' ) ], 'lockTSE' => WANObjectCache::TTL_MINUTE * 5, 'pcTTL' => WANObjectCache::TTL_PROC_LONG ] @@ -1210,8 +1269,9 @@ class ChangeTags { public static function listExplicitlyDefinedTags() { $fname = __METHOD__; - return ObjectCache::getMainWANInstance()->getWithSetCallback( - wfMemcKey( 'valid-tags-db' ), + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + return $cache->getWithSetCallback( + $cache->makeKey( 'valid-tags-db' ), WANObjectCache::TTL_MINUTE * 5, function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) { $dbr = wfGetDB( DB_REPLICA ); @@ -1223,7 +1283,7 @@ class ChangeTags { return array_filter( array_unique( $tags ) ); }, [ - 'checkKeys' => [ wfMemcKey( 'valid-tags-db' ) ], + 'checkKeys' => [ $cache->makeKey( 'valid-tags-db' ) ], 'lockTSE' => WANObjectCache::TTL_MINUTE * 5, 'pcTTL' => WANObjectCache::TTL_PROC_LONG ] @@ -1245,8 +1305,9 @@ class ChangeTags { if ( !Hooks::isRegistered( 'ListDefinedTags' ) ) { return $tags; } - return ObjectCache::getMainWANInstance()->getWithSetCallback( - wfMemcKey( 'valid-tags-hook' ), + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + return $cache->getWithSetCallback( + $cache->makeKey( 'valid-tags-hook' ), WANObjectCache::TTL_MINUTE * 5, function ( $oldValue, &$ttl, array &$setOpts ) use ( $tags ) { $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) ); @@ -1255,7 +1316,7 @@ class ChangeTags { return array_filter( array_unique( $tags ) ); }, [ - 'checkKeys' => [ wfMemcKey( 'valid-tags-hook' ) ], + 'checkKeys' => [ $cache->makeKey( 'valid-tags-hook' ) ], 'lockTSE' => WANObjectCache::TTL_MINUTE * 5, 'pcTTL' => WANObjectCache::TTL_PROC_LONG ] @@ -1267,6 +1328,7 @@ class ChangeTags { * * @see listSoftwareDefinedTags * @deprecated since 1.28 + * @return array */ public static function listExtensionDefinedTags() { wfDeprecated( __METHOD__, '1.28' ); @@ -1279,11 +1341,11 @@ class ChangeTags { * @since 1.25 */ public static function purgeTagCacheAll() { - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); - $cache->touchCheckKey( wfMemcKey( 'active-tags' ) ); - $cache->touchCheckKey( wfMemcKey( 'valid-tags-db' ) ); - $cache->touchCheckKey( wfMemcKey( 'valid-tags-hook' ) ); + $cache->touchCheckKey( $cache->makeKey( 'active-tags' ) ); + $cache->touchCheckKey( $cache->makeKey( 'valid-tags-db' ) ); + $cache->touchCheckKey( $cache->makeKey( 'valid-tags-hook' ) ); self::purgeTagUsageCache(); } @@ -1293,9 +1355,9 @@ class ChangeTags { * @since 1.25 */ public static function purgeTagUsageCache() { - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); - $cache->touchCheckKey( wfMemcKey( 'change-tag-statistics' ) ); + $cache->touchCheckKey( $cache->makeKey( 'change-tag-statistics' ) ); } /** @@ -1310,8 +1372,9 @@ class ChangeTags { */ public static function tagUsageStatistics() { $fname = __METHOD__; - return ObjectCache::getMainWANInstance()->getWithSetCallback( - wfMemcKey( 'change-tag-statistics' ), + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + return $cache->getWithSetCallback( + $cache->makeKey( 'change-tag-statistics' ), WANObjectCache::TTL_MINUTE * 5, function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) { $dbr = wfGetDB( DB_REPLICA, 'vslow' ); @@ -1334,7 +1397,7 @@ class ChangeTags { return $out; }, [ - 'checkKeys' => [ wfMemcKey( 'change-tag-statistics' ) ], + 'checkKeys' => [ $cache->makeKey( 'change-tag-statistics' ) ], 'lockTSE' => WANObjectCache::TTL_MINUTE * 5, 'pcTTL' => WANObjectCache::TTL_PROC_LONG ] diff --git a/includes/changetags/ChangeTagsList.php b/includes/changetags/ChangeTagsList.php index dd8bab9878..afbbb2bf5b 100644 --- a/includes/changetags/ChangeTagsList.php +++ b/includes/changetags/ChangeTagsList.php @@ -39,8 +39,8 @@ abstract class ChangeTagsList extends RevisionListBase { * @throws Exception If you give an unknown $typeName */ public static function factory( $typeName, IContextSource $context, - Title $title, array $ids ) { - + Title $title, array $ids + ) { switch ( $typeName ) { case 'revision': $className = 'ChangeTagsRevisionList'; @@ -49,8 +49,9 @@ abstract class ChangeTagsList extends RevisionListBase { $className = 'ChangeTagsLogList'; break; default: - throw new Exception( "Class $className requested, but does not exist" ); + throw new Exception( "Class $typeName requested, but does not exist" ); } + return new $className( $context, $title, $ids ); } diff --git a/includes/changetags/ChangeTagsLogList.php b/includes/changetags/ChangeTagsLogList.php index 480aaced7d..e6d918a63c 100644 --- a/includes/changetags/ChangeTagsLogList.php +++ b/includes/changetags/ChangeTagsLogList.php @@ -19,6 +19,8 @@ * @ingroup Change tagging */ +use Wikimedia\Rdbms\IDatabase; + /** * Stores a list of taggable log entries. * @since 1.25 @@ -69,9 +71,7 @@ class ChangeTagsLogList extends ChangeTagsList { * @param User $user * @return Status */ - public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params, - $reason, $user ) { - + public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params, $reason, $user ) { // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed for ( $this->reset(); $this->current(); $this->next() ) { // @codingStandardsIgnoreEnd diff --git a/includes/changetags/ChangeTagsRevisionList.php b/includes/changetags/ChangeTagsRevisionList.php index 8eae238444..91193b0ecd 100644 --- a/includes/changetags/ChangeTagsRevisionList.php +++ b/includes/changetags/ChangeTagsRevisionList.php @@ -19,6 +19,8 @@ * @ingroup Change tagging */ +use Wikimedia\Rdbms\IDatabase; + /** * Stores a list of taggable revisions. * @since 1.25 @@ -79,9 +81,7 @@ class ChangeTagsRevisionList extends ChangeTagsList { * @param User $user * @return Status */ - public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params, - $reason, $user ) { - + public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params, $reason, $user ) { // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed for ( $this->reset(); $this->current(); $this->next() ) { // @codingStandardsIgnoreEnd diff --git a/includes/collation/BashkirUppercaseCollation.php b/includes/collation/BashkirUppercaseCollation.php new file mode 100644 index 0000000000..33ed9bc8d8 --- /dev/null +++ b/includes/collation/BashkirUppercaseCollation.php @@ -0,0 +1,71 @@ + "\xd8\xa1", + "\xd9\x88" => "\xd9\x89", + "\xd9\xb2" => "\xF3\xB3\x80\x81", + "\xd9\xb3" => "\xF3\xB3\x80\x82", + ]; public function __construct() { parent::__construct( 'fa' ); - $this->tertiaryCollator = Collator::create( 'fa' ); } - public function getPrimarySortKey( $string ) { - $primary = parent::getPrimarySortKey( $string ); - // We have to use a tertiary sortkey for everything with the primary sortkey of 2627. - // Otherwise, the "Remove duplicate prefixes" logic in IcuCollation would remove them. - // This matches sortkeys for the following characters: Ø¡ ئ ا و Ù² Ù³ - if ( substr( $primary, 0, 2 ) === "\x26\x27" ) { - wfDebug( "Using tertiary sortkey for '$string'\n" ); - return $this->tertiaryCollator->getSortKey( $string ); + public function getSortKey( $string ) { + $modified = strtr( $string, $this->override ); + return parent::getSortKey( $modified ); + } + + public function getFirstLetter( $string ) { + if ( isset( $this->override[substr( $string, 0, 2 )] ) ) { + return substr( $string, 0, 2 ); } - return $primary; + return parent::getFirstLetter( $string ); } } diff --git a/includes/collation/CustomUppercaseCollation.php b/includes/collation/CustomUppercaseCollation.php new file mode 100644 index 0000000000..301972d90c --- /dev/null +++ b/includes/collation/CustomUppercaseCollation.php @@ -0,0 +1,87 @@ += 64 ) { + throw new UnexpectedValueException( "Alphabet must be < 64 items" ); + } + $this->alphabet = $alphabet; + + $this->puaSubset = []; + $len = count( $alphabet ); + for ( $i = 0; $i < $len; $i++ ) { + $this->puaSubset[] = "\xF3\xB3\x80" . chr( $i + 128 ); + } + parent::__construct( $lang ); + } + + private function convertToPua( $string ) { + return str_replace( $this->alphabet, $this->puaSubset, $string ); + } + + public function getSortKey( $string ) { + return $this->convertToPua( parent::getSortKey( $string ) ); + } + + public function getFirstLetter( $string ) { + // In case a title has a PUA code in it, make it sort + // under the header for the character it would replace + // to avoid inconsistent behaviour. This class mostly + // assumes that people will not use PUA codes. + return parent::getFirstLetter( + str_replace( $this->puaSubset, $this->alphabet, $string ) + ); + } +} diff --git a/includes/collation/IcuCollation.php b/includes/collation/IcuCollation.php index e0eb1c13c8..d93362bcaa 100644 --- a/includes/collation/IcuCollation.php +++ b/includes/collation/IcuCollation.php @@ -22,7 +22,7 @@ * @since 1.16.3 */ class IcuCollation extends Collation { - const FIRST_LETTER_VERSION = 2; + const FIRST_LETTER_VERSION = 3; /** @var Collator */ private $primaryCollator; @@ -180,7 +180,7 @@ class IcuCollation extends Collation { 'mk' => [ "Ѓ", "Ќ" ], 'ml' => [], 'mn' => [], - 'mo' => [ "Ă", "Â", "Î", "Ş", "Å¢" ], // not in libicu + 'mo' => [ "Ă", "Â", "Î", "Ș", "Ț" ], // not in libicu 'mr' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष", "ज्ञ" ], 'ms' => [], 'mt' => [ "Ċ", "Ä ", "Għ", "Ħ", "Å»" ], @@ -196,9 +196,9 @@ class IcuCollation extends Collation { 'pl' => [ "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Å»" ], 'pt' => [], 'rm' => [], // not in libicu - 'ro' => [ "Ă", "Â", "Î", "Ş", "Å¢" ], + 'ro' => [ "Ă", "Â", "Î", "Ș", "Ț" ], 'ru' => [], - 'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Å¢" ], // not in libicu + 'rup' => [ "Ă", "Â", "Î", "Ľ", "Ń", "Ș", "Ț" ], // not in libicu 'sco' => [], 'se' => [ 'Á', 'Č', 'Æ·', 'Ç®', 'Đ', 'Ǧ', 'Ǥ', 'Ǩ', 'Ŋ', @@ -535,7 +535,7 @@ class IcuCollation extends Collation { * @return string|bool */ static function getUnicodeVersionForICU() { - $icuVersion = IcuCollation::getICUVersion(); + $icuVersion = self::getICUVersion(); if ( !$icuVersion ) { return false; } diff --git a/includes/collation/NumericUppercaseCollation.php b/includes/collation/NumericUppercaseCollation.php index 2d2ca47bcf..da78a05143 100644 --- a/includes/collation/NumericUppercaseCollation.php +++ b/includes/collation/NumericUppercaseCollation.php @@ -40,9 +40,7 @@ class NumericUppercaseCollation extends UppercaseCollation { private $digitTransformLang; /** - * Constructor - * - * @param $lang Language How to convert digits. + * @param Language $lang How to convert digits. * For example, if given language "my" than ၇ is treated like 7. * * It is expected that usually this is given $wgContLang. @@ -78,8 +76,8 @@ class NumericUppercaseCollation extends UppercaseCollation { * * based on Language::parseFormattedNumber but without commas. * - * @param $string String sortkey to unlocalize digits of - * @return String Sortkey with all localized digits replaced with ASCII digits. + * @param string $string sortkey to unlocalize digits of + * @return string Sortkey with all localized digits replaced with ASCII digits. */ private function convertDigits( $string ) { $table = $this->digitTransformLang->digitTransformTable(); diff --git a/includes/compat/normal/UtfNormal.php b/includes/compat/normal/UtfNormal.php index c9c05a0759..9b35cad485 100644 --- a/includes/compat/normal/UtfNormal.php +++ b/includes/compat/normal/UtfNormal.php @@ -120,7 +120,7 @@ class UtfNormal { /** * Returns true if the string is _definitely_ in NFC. * Returns false if not or uncertain. - * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML. + * @param string &$string a UTF-8 string, altered on output to be valid UTF-8 safe for XML. * @return bool */ static function quickIsNFCVerify( &$string ) { diff --git a/includes/config/EtcdConfig.php b/includes/config/EtcdConfig.php new file mode 100644 index 0000000000..6605c38d5a --- /dev/null +++ b/includes/config/EtcdConfig.php @@ -0,0 +1,278 @@ + 'http', + 'encoding' => 'JSON', + 'cacheTTL' => 10, + 'skewTTL' => 1, + 'timeout' => 2 + ]; + + $this->host = $params['host']; + $this->protocol = $params['protocol']; + $this->directory = trim( $params['directory'], '/' ); + $this->encoding = $params['encoding']; + $this->skewCacheTTL = $params['skewTTL']; + $this->baseCacheTTL = max( $params['cacheTTL'] - $this->skewCacheTTL, 0 ); + $this->timeout = $params['timeout']; + + if ( !isset( $params['cache'] ) ) { + $this->srvCache = new HashBagOStuff(); + } elseif ( $params['cache'] instanceof BagOStuff ) { + $this->srvCache = $params['cache']; + } else { + $this->srvCache = ObjectFactory::getObjectFromSpec( $params['cache'] ); + } + + $this->logger = new Psr\Log\NullLogger(); + $this->http = new MultiHttpClient( [ + 'connTimeout' => $this->timeout, + 'reqTimeout' => $this->timeout, + 'logger' => $this->logger + ] ); + } + + public function setLogger( LoggerInterface $logger ) { + $this->logger = $logger; + $this->http->setLogger( $logger ); + } + + public function has( $name ) { + $this->load(); + + return array_key_exists( $name, $this->procCache['config'] ); + } + + public function get( $name ) { + $this->load(); + + if ( !array_key_exists( $name, $this->procCache['config'] ) ) { + throw new ConfigException( "No entry found for '$name'." ); + } + + return $this->procCache['config'][$name]; + } + + /** + * @throws ConfigException + */ + private function load() { + if ( $this->procCache !== null ) { + return; // already loaded + } + + $now = microtime( true ); + $key = $this->srvCache->makeGlobalKey( + __CLASS__, + $this->host, + $this->directory + ); + + // Get the cached value or block until it is regenerated (by this or another thread)... + $data = null; // latest config info + $error = null; // last error message + $loop = new WaitConditionLoop( + function () use ( $key, $now, &$data, &$error ) { + // Check if the values are in cache yet... + $data = $this->srvCache->get( $key ); + if ( is_array( $data ) && $data['expires'] > $now ) { + $this->logger->debug( "Found up-to-date etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } + + // Cache is either empty or stale; + // refresh the cache from etcd, using a mutex to reduce stampedes... + if ( $this->srvCache->lock( $key, 0, $this->baseCacheTTL ) ) { + try { + list( $config, $error, $retry ) = $this->fetchAllFromEtcd(); + if ( is_array( $config ) ) { + // Avoid having all servers expire cache keys at the same time + $expiry = microtime( true ) + $this->baseCacheTTL; + $expiry += mt_rand( 0, 1e6 ) / 1e6 * $this->skewCacheTTL; + + $data = [ 'config' => $config, 'expires' => $expiry ]; + $this->srvCache->set( $key, $data, BagOStuff::TTL_INDEFINITE ); + + $this->logger->info( "Refreshed stale etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } else { + $this->logger->error( "Failed to fetch configuration: $error" ); + if ( !$retry ) { + // Fail fast since the error is likely to keep happening + return WaitConditionLoop::CONDITION_FAILED; + } + } + } finally { + $this->srvCache->unlock( $key ); // release mutex + } + } + + if ( is_array( $data ) ) { + $this->logger->info( "Using stale etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } + + return WaitConditionLoop::CONDITION_CONTINUE; + }, + $this->timeout + ); + + if ( $loop->invoke() !== WaitConditionLoop::CONDITION_REACHED ) { + // No cached value exists and etcd query failed; throw an error + throw new ConfigException( "Failed to load configuration from etcd: $error" ); + } + + $this->procCache = $data; + } + + /** + * @return array (config array or null, error string, allow retries) + */ + public function fetchAllFromEtcd() { + $dsd = new DnsSrvDiscoverer( $this->host ); + $servers = $dsd->getServers(); + if ( !$servers ) { + return $this->fetchAllFromEtcdServer( $this->host ); + } + + do { + // Pick a random etcd server from dns + $server = $dsd->pickServer( $servers ); + $host = IP::combineHostAndPort( $server['target'], $server['port'] ); + // Try to load the config from this particular server + list( $config, $error, $retry ) = $this->fetchAllFromEtcdServer( $host ); + if ( is_array( $config ) || !$retry ) { + break; + } + + // Avoid the server next time if that failed + $servers = $dsd->removeServer( $server, $servers ); + } while ( $servers ); + + return [ $config, $error, $retry ]; + } + + /** + * @param string $address Host and port + * @return array (config array or null, error string, whether to allow retries) + */ + protected function fetchAllFromEtcdServer( $address ) { + // Retrieve all the values under the MediaWiki config directory + list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->http->run( [ + 'method' => 'GET', + 'url' => "{$this->protocol}://{$address}/v2/keys/{$this->directory}/", + 'headers' => [ 'content-type' => 'application/json' ] + ] ); + + static $terminalCodes = [ 404 => true ]; + if ( $rcode < 200 || $rcode > 399 ) { + return [ + null, + strlen( $rerr ) ? $rerr : "HTTP $rcode ($rdesc)", + empty( $terminalCodes[$rcode] ) + ]; + } + + $info = json_decode( $rbody, true ); + if ( $info === null || !isset( $info['node']['nodes'] ) ) { + return [ null, "Unexpected JSON response; missing 'nodes' list.", false ]; + } + + $config = []; + foreach ( $info['node']['nodes'] as $node ) { + if ( !empty( $node['dir'] ) ) { + continue; // skip directories + } + + $name = basename( $node['key'] ); + $value = $this->unserialize( $node['value'] ); + if ( !is_array( $value ) || !array_key_exists( 'val', $value ) ) { + return [ null, "Failed to parse value for '$name'.", false ]; + } + + $config[$name] = $value['val']; + } + + return [ $config, null, false ]; + } + + /** + * @param string $string + * @return mixed + */ + private function unserialize( $string ) { + if ( $this->encoding === 'YAML' ) { + return yaml_parse( $string ); + } else { // JSON + return json_decode( $string, true ); + } + } +} diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php index 811b241798..1d472e0509 100644 --- a/includes/content/AbstractContent.php +++ b/includes/content/AbstractContent.php @@ -488,8 +488,8 @@ abstract class AbstractContent implements Content { $po = new ParserOutput(); if ( Hooks::run( 'ContentGetParserOutput', - [ $this, $title, $revId, $options, $generateHtml, &$po ] ) ) { - + [ $this, $title, $revId, $options, $generateHtml, &$po ] ) + ) { // Save and restore the old value, just in case something is reusing // the ParserOptions object in some weird way. $oldRedir = $options->getRedirectTarget(); diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index bccb147e5b..90364f397f 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -136,7 +136,7 @@ abstract class ContentHandler { $modelId = $title->getContentModel(); } - $handler = ContentHandler::getForModelID( $modelId ); + $handler = self::getForModelID( $modelId ); return $handler->unserializeContent( $text, $format ); } @@ -240,7 +240,7 @@ abstract class ContentHandler { public static function getForTitle( Title $title ) { $modelId = $title->getContentModel(); - return ContentHandler::getForModelID( $modelId ); + return self::getForModelID( $modelId ); } /** @@ -256,7 +256,7 @@ abstract class ContentHandler { public static function getForContent( Content $content ) { $modelId = $content->getModel(); - return ContentHandler::getForModelID( $modelId ); + return self::getForModelID( $modelId ); } /** @@ -293,8 +293,8 @@ abstract class ContentHandler { public static function getForModelID( $modelId ) { global $wgContentHandlers; - if ( isset( ContentHandler::$handlers[$modelId] ) ) { - return ContentHandler::$handlers[$modelId]; + if ( isset( self::$handlers[$modelId] ) ) { + return self::$handlers[$modelId]; } if ( empty( $wgContentHandlers[$modelId] ) ) { @@ -327,9 +327,9 @@ abstract class ContentHandler { wfDebugLog( 'ContentHandler', 'Created handler for ' . $modelId . ': ' . get_class( $handler ) ); - ContentHandler::$handlers[$modelId] = $handler; + self::$handlers[$modelId] = $handler; - return ContentHandler::$handlers[$modelId]; + return self::$handlers[$modelId]; } /** @@ -372,7 +372,7 @@ abstract class ContentHandler { $formats = []; foreach ( $wgContentHandlers as $model => $class ) { - $handler = ContentHandler::getForModelID( $model ); + $handler = self::getForModelID( $model ); $formats = array_merge( $formats, $handler->getSupportedFormats() ); } @@ -619,8 +619,8 @@ abstract class ContentHandler { */ public function createDifferenceEngine( IContextSource $context, $old = 0, $new = 0, $rcid = 0, // FIXME: Deprecated, no longer used - $refreshCache = false, $unhide = false ) { - + $refreshCache = false, $unhide = false + ) { // hook: get difference engine $differenceEngine = null; if ( !Hooks::run( 'GetDifferenceEngine', @@ -1007,22 +1007,22 @@ abstract class ContentHandler { * @return ParserOptions */ public function makeParserOptions( $context ) { - global $wgContLang, $wgEnableParserLimitReporting; + global $wgContLang; if ( $context instanceof IContextSource ) { - $options = ParserOptions::newFromContext( $context ); + $user = $context->getUser(); + $lang = $context->getLanguage(); } elseif ( $context instanceof User ) { // settings per user (even anons) - $options = ParserOptions::newFromUser( $context ); + $user = $context; + $lang = null; } elseif ( $context === 'canonical' ) { // canonical settings - $options = ParserOptions::newFromUserAndLang( new User, $wgContLang ); + $user = new User; + $lang = $wgContLang; } else { throw new MWException( "Bad context for parser options: $context" ); } - $options->enableLimitReport( $wgEnableParserLimitReporting ); // show inclusion/loop reports - $options->setTidy( true ); // fix bad HTML - - return $options; + return ParserOptions::newCanonical( $user, $lang ); } /** @@ -1134,7 +1134,7 @@ abstract class ContentHandler { /** * Add new field definition to array. - * @param SearchIndexField[] $fields + * @param SearchIndexField[] &$fields * @param SearchEngine $engine * @param string $name * @param int $type diff --git a/includes/content/FileContentHandler.php b/includes/content/FileContentHandler.php index 843d54056a..3028dfdac8 100644 --- a/includes/content/FileContentHandler.php +++ b/includes/content/FileContentHandler.php @@ -6,7 +6,7 @@ * but instead manually called by WikitextHandler. * This should be fixed in the future. */ -class FileContentHandler extends WikitextContentHandler { +class FileContentHandler extends WikitextContentHandler { public function getFieldsForSearchIndex( SearchEngine $engine ) { $fields['file_media_type'] = diff --git a/includes/content/JsonContent.php b/includes/content/JsonContent.php index 14c81823cf..2b94f3f71e 100644 --- a/includes/content/JsonContent.php +++ b/includes/content/JsonContent.php @@ -22,6 +22,7 @@ class JsonContent extends TextContent { /** * @param string $text JSON + * @param string $modelId */ public function __construct( $text, $modelId = CONTENT_MODEL_JSON ) { parent::__construct( $text, $modelId ); @@ -96,7 +97,7 @@ class JsonContent extends TextContent { * @param int $revId * @param ParserOptions $options * @param bool $generateHtml - * @param ParserOutput $output + * @param ParserOutput &$output */ protected function fillParserOutput( Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php index 7bb4def2a6..5f585bc98a 100644 --- a/includes/content/TextContent.php +++ b/includes/content/TextContent.php @@ -157,7 +157,7 @@ class TextContent extends AbstractContent { * changes. * * @since 1.28 - * @param $text + * @param string $text * @return string */ public static function normalizeLineEndings( $text ) { @@ -233,7 +233,7 @@ class TextContent extends AbstractContent { * @param int $revId Revision ID (for {{REVISIONID}}) * @param ParserOptions $options Parser options * @param bool $generateHtml Whether or not to generate HTML - * @param ParserOutput $output The output object to fill (reference). + * @param ParserOutput &$output The output object to fill (reference). */ protected function fillParserOutput( Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output diff --git a/includes/content/WikiTextStructure.php b/includes/content/WikiTextStructure.php index 9f79aa8d08..aeb96b6531 100644 --- a/includes/content/WikiTextStructure.php +++ b/includes/content/WikiTextStructure.php @@ -37,6 +37,9 @@ class WikiTextStructure { 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', // Collapsed fields are hidden by default so we don't want them showing up. '.autocollapse', + // Content explicitly decided to be not searchable by editors such + // as custom navigation templates. + '.navigation-not-searchable' ]; /** @@ -56,7 +59,6 @@ class WikiTextStructure { ]; /** - * WikiTextStructure constructor. * @param ParserOutput $parserOutput */ public function __construct( ParserOutput $parserOutput ) { diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php index d649baf89c..942390f68f 100644 --- a/includes/content/WikitextContent.php +++ b/includes/content/WikitextContent.php @@ -68,7 +68,6 @@ class WikitextContent extends TextContent { * @see Content::replaceSection() */ public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) { - $myModelId = $this->getModel(); $sectionModelId = $with->getModel(); diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php index ea5278fc06..cea84605ea 100644 --- a/includes/context/ContextSource.php +++ b/includes/context/ContextSource.php @@ -19,6 +19,7 @@ * @file */ use Liuggio\StatsdClient\Factory\StatsdDataFactory; +use MediaWiki\MediaWikiServices; /** * The simplest way of implementing IContextSource is to hold a RequestContext as a @@ -169,10 +170,10 @@ abstract class ContextSource implements IContextSource { * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected) * * @since 1.25 - * @return StatsdDataFactory + * @return IBufferingStatsdDataFactory */ public function getStats() { - return $this->getContext()->getStats(); + return MediaWikiServices::getInstance()->getStatsdDataFactory(); } /** @@ -180,10 +181,12 @@ abstract class ContextSource implements IContextSource { * Parameters are the same as wfMessage() * * @since 1.18 - * @param mixed ... + * @param string|string[]|MessageSpecifier $key Message key, or array of keys, + * or a MessageSpecifier. + * @param mixed $args,... * @return Message */ - public function msg( /* $args */ ) { + public function msg( $key /* $args */ ) { $args = func_get_args(); return call_user_func_array( [ $this->getContext(), 'msg' ], $args ); diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php index e77a058d1d..6e3eda6f9c 100644 --- a/includes/context/DerivativeContext.php +++ b/includes/context/DerivativeContext.php @@ -75,7 +75,6 @@ class DerivativeContext extends ContextSource implements MutableContext { private $timing; /** - * Constructor * @param IContextSource $context Context to inherit from */ public function __construct( IContextSource $context ) { @@ -109,7 +108,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected) * - * @return StatsdDataFactory + * @return IBufferingStatsdDataFactory */ public function getStats() { return MediaWikiServices::getInstance()->getStatsdDataFactory(); @@ -324,10 +323,12 @@ class DerivativeContext extends ContextSource implements MutableContext { * it would set only the original context, and not take * into account any changes. * + * @param string|string[]|MessageSpecifier $key Message key, or array of keys, + * or a MessageSpecifier. * @param mixed $args,... Arguments to wfMessage * @return Message */ - public function msg() { + public function msg( $key ) { $args = func_get_args(); return call_user_func_array( 'wfMessage', $args )->setContext( $this ); diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php index ccefc72f1b..895e9e4b55 100644 --- a/includes/context/IContextSource.php +++ b/includes/context/IContextSource.php @@ -52,7 +52,7 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory; * belong here either. Session state changes should only be propagated on * shutdown by separate persistence handler objects, for example. */ -interface IContextSource { +interface IContextSource extends MessageLocalizer { /** * Get the WebRequest object * @@ -131,7 +131,7 @@ interface IContextSource { * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected) * * @since 1.25 - * @return StatsdDataFactory + * @return IBufferingStatsdDataFactory */ public function getStats(); @@ -143,14 +143,6 @@ interface IContextSource { */ public function getTiming(); - /** - * Get a Message object with context set. See wfMessage for parameters. - * - * @param mixed ... - * @return Message - */ - public function msg(); - /** * Export the resolved user IP, HTTP headers, user ID, and session ID. * The result will be reasonably sized to allow for serialization. diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php index 3dfa456400..4a772eecd2 100644 --- a/includes/context/RequestContext.php +++ b/includes/context/RequestContext.php @@ -138,7 +138,7 @@ class RequestContext implements IContextSource, MutableContext { * * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected) * - * @return StatsdDataFactory + * @return IBufferingStatsdDataFactory */ public function getStats() { return MediaWikiServices::getInstance()->getStatsdDataFactory(); @@ -449,10 +449,12 @@ class RequestContext implements IContextSource, MutableContext { * Get a Message object with context set * Parameters are the same as wfMessage() * - * @param mixed ... + * @param string|string[]|MessageSpecifier $key Message key, or array of keys, + * or a MessageSpecifier. + * @param mixed $args,... * @return Message */ - public function msg() { + public function msg( $key ) { $args = func_get_args(); return call_user_func_array( 'wfMessage', $args )->setContext( $this ); diff --git a/includes/dao/DBAccessBase.php b/includes/dao/DBAccessBase.php index da660bdcae..0f8d7f7301 100644 --- a/includes/dao/DBAccessBase.php +++ b/includes/dao/DBAccessBase.php @@ -1,5 +1,6 @@ newTablePrefix ); $newTableName = $this->db->tableName( $tbl, 'raw' ); + // Postgres: Temp tables are automatically deleted upon end of session + // Same Temp table name hides existing table for current session if ( $this->dropCurrentTables - && !in_array( $this->db->getType(), [ 'postgres', 'oracle' ] ) + && !in_array( $this->db->getType(), [ 'oracle' ] ) ) { if ( $oldTableName === $newTableName ) { // Last ditch check to avoid data loss diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index ef5a8fe942..556fe75547 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -20,8 +20,12 @@ * @file * @ingroup Database */ + +use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\Blob; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\DBConnectionError; +use Wikimedia\Rdbms\DBUnexpectedError; /** * @ingroup Database @@ -554,19 +558,9 @@ class DatabaseOracle extends Database { } function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, - $insertOptions = [], $selectOptions = [] + $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { $destTable = $this->tableName( $destTable ); - if ( !is_array( $selectOptions ) ) { - $selectOptions = [ $selectOptions ]; - } - list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) = - $this->makeSelectOptions( $selectOptions ); - if ( is_array( $srcTable ) ) { - $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) ); - } else { - $srcTable = $this->tableName( $srcTable ); - } $sequenceData = $this->getSequenceData( $destTable ); if ( $sequenceData !== false && @@ -581,13 +575,16 @@ class DatabaseOracle extends Database { $val = $val . ' field' . ( $i++ ); } - $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' . - " SELECT $startOpts " . implode( ',', $varMap ) . - " FROM $srcTable $useIndex $ignoreIndex "; - if ( $conds != '*' ) { - $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND ); - } - $sql .= " $tailOpts"; + $selectSql = $this->selectSQLText( + $srcTable, + array_values( $varMap ), + $conds, + $fname, + $selectOptions, + $selectJoinConds + ); + + $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ') ' . $selectSql; if ( in_array( 'IGNORE', $insertOptions ) ) { $this->ignoreDupValOnIndex = true; diff --git a/includes/db/MWLBFactory.php b/includes/db/MWLBFactory.php index fe063f20b1..464a91827f 100644 --- a/includes/db/MWLBFactory.php +++ b/includes/db/MWLBFactory.php @@ -33,9 +33,12 @@ abstract class MWLBFactory { /** * @param array $lbConf Config for LBFactory::__construct() * @param Config $mainConfig Main config object from MediaWikiServices + * @param ConfiguredReadOnlyMode $readOnlyMode * @return array */ - public static function applyDefaultConfig( array $lbConf, Config $mainConfig ) { + public static function applyDefaultConfig( array $lbConf, Config $mainConfig, + ConfiguredReadOnlyMode $readOnlyMode + ) { global $wgCommandLineMode; static $typesWithSchema = [ 'postgres', 'msssql' ]; @@ -55,8 +58,7 @@ abstract class MWLBFactory { 'errorLogger' => [ MWExceptionHandler::class, 'logException' ], 'cliMode' => $wgCommandLineMode, 'hostname' => wfHostname(), - // TODO: replace the global wfConfiguredReadOnlyReason() with a service. - 'readOnlyReason' => wfConfiguredReadOnlyReason(), + 'readOnlyReason' => $readOnlyMode->getReason(), ]; // When making changes here, remember to also specify MediaWiki-specific options diff --git a/includes/db/ORAResult.php b/includes/db/ORAResult.php index 07c6fc7cf8..aafd386138 100644 --- a/includes/db/ORAResult.php +++ b/includes/db/ORAResult.php @@ -1,5 +1,7 @@ channel = $channel; + } + + public function log( $level, $message, array $context = [] ) { + fwrite( STDERR, "[$level] " . + LegacyLogger::format( $this->channel, $message, $context ) ); + } +} diff --git a/includes/debug/logger/ConsoleSpi.php b/includes/debug/logger/ConsoleSpi.php new file mode 100644 index 0000000000..e29b98d3b7 --- /dev/null +++ b/includes/debug/logger/ConsoleSpi.php @@ -0,0 +1,11 @@ + - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class LegacyLogger extends AbstractLogger { diff --git a/includes/debug/logger/LegacySpi.php b/includes/debug/logger/LegacySpi.php index 4cf8313dc1..8e750cab25 100644 --- a/includes/debug/logger/LegacySpi.php +++ b/includes/debug/logger/LegacySpi.php @@ -32,8 +32,7 @@ namespace MediaWiki\Logger; * * @see \MediaWiki\Logger\LoggerFactory * @since 1.25 - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class LegacySpi implements Spi { diff --git a/includes/debug/logger/LoggerFactory.php b/includes/debug/logger/LoggerFactory.php index ce92dbd508..c183ff1538 100644 --- a/includes/debug/logger/LoggerFactory.php +++ b/includes/debug/logger/LoggerFactory.php @@ -40,8 +40,7 @@ use ObjectFactory; * * @see \MediaWiki\Logger\Spi * @since 1.25 - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class LoggerFactory { diff --git a/includes/debug/logger/MonologSpi.php b/includes/debug/logger/MonologSpi.php index f44ff1ceef..197b269b0a 100644 --- a/includes/debug/logger/MonologSpi.php +++ b/includes/debug/logger/MonologSpi.php @@ -110,8 +110,7 @@ use ObjectFactory; * * @see https://github.com/Seldaek/monolog * @since 1.25 - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class MonologSpi implements Spi { diff --git a/includes/debug/logger/NullSpi.php b/includes/debug/logger/NullSpi.php index 82308d0e9f..4862157d8c 100644 --- a/includes/debug/logger/NullSpi.php +++ b/includes/debug/logger/NullSpi.php @@ -34,8 +34,7 @@ use Psr\Log\NullLogger; * * @see \MediaWiki\Logger\LoggerFactory * @since 1.25 - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class NullSpi implements Spi { diff --git a/includes/debug/logger/Spi.php b/includes/debug/logger/Spi.php index 044789f201..8e0875f212 100644 --- a/includes/debug/logger/Spi.php +++ b/includes/debug/logger/Spi.php @@ -31,8 +31,7 @@ namespace MediaWiki\Logger; * * @see \MediaWiki\Logger\LoggerFactory * @since 1.25 - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ interface Spi { diff --git a/includes/debug/logger/monolog/AvroFormatter.php b/includes/debug/logger/monolog/AvroFormatter.php index 2700daa66f..2a50566912 100644 --- a/includes/debug/logger/monolog/AvroFormatter.php +++ b/includes/debug/logger/monolog/AvroFormatter.php @@ -23,7 +23,6 @@ namespace MediaWiki\Logger\Monolog; use AvroIODatumWriter; use AvroIOBinaryEncoder; use AvroIOTypeException; -use AvroNamedSchemata; use AvroSchema; use AvroStringIO; use AvroValidator; diff --git a/includes/debug/logger/monolog/BufferHandler.php b/includes/debug/logger/monolog/BufferHandler.php index 331b718c18..650d01274b 100644 --- a/includes/debug/logger/monolog/BufferHandler.php +++ b/includes/debug/logger/monolog/BufferHandler.php @@ -34,7 +34,7 @@ use Monolog\Handler\BufferHandler as BaseBufferHandler; */ class BufferHandler extends BaseBufferHandler { /** - * {@inheritDoc} + * @inheritDoc */ public function handle( array $record ) { if ( !$this->initialized ) { diff --git a/includes/debug/logger/monolog/KafkaHandler.php b/includes/debug/logger/monolog/KafkaHandler.php index 6670fe932d..8e7113164a 100644 --- a/includes/debug/logger/monolog/KafkaHandler.php +++ b/includes/debug/logger/monolog/KafkaHandler.php @@ -128,7 +128,7 @@ class KafkaHandler extends AbstractProcessingHandler { } /** - * {@inheritDoc} + * @inheritDoc */ protected function write( array $record ) { if ( $record['formatted'] !== null ) { @@ -138,7 +138,7 @@ class KafkaHandler extends AbstractProcessingHandler { } /** - * {@inheritDoc} + * @inheritDoc */ public function handleBatch( array $batch ) { $channels = []; diff --git a/includes/debug/logger/monolog/LegacyFormatter.php b/includes/debug/logger/monolog/LegacyFormatter.php index 9ec15cb85b..92624a0b3d 100644 --- a/includes/debug/logger/monolog/LegacyFormatter.php +++ b/includes/debug/logger/monolog/LegacyFormatter.php @@ -29,8 +29,7 @@ use Monolog\Formatter\NormalizerFormatter; * delegating the formatting to \MediaWiki\Logger\LegacyLogger. * * @since 1.25 - * @author Bryan Davis - * @copyright © 2013 Bryan Davis and Wikimedia Foundation. + * @copyright © 2013 Wikimedia Foundation and contributors * @see \MediaWiki\Logger\LegacyLogger */ class LegacyFormatter extends NormalizerFormatter { diff --git a/includes/debug/logger/monolog/LegacyHandler.php b/includes/debug/logger/monolog/LegacyHandler.php index d40414ce90..dbeb13691a 100644 --- a/includes/debug/logger/monolog/LegacyHandler.php +++ b/includes/debug/logger/monolog/LegacyHandler.php @@ -44,8 +44,7 @@ use UnexpectedValueException; * replacement for \Monolog\Handler\StreamHandler. * * @since 1.25 - * @author Bryan Davis - * @copyright © 2013 Bryan Davis and Wikimedia Foundation. + * @copyright © 2013 Wikimedia Foundation and contributors */ class LegacyHandler extends AbstractProcessingHandler { @@ -195,7 +194,6 @@ class LegacyHandler extends AbstractProcessingHandler { $text = (string)$record['formatted']; if ( $this->useUdp() ) { - // Clean it up for the multiplexer if ( $this->prefix !== '' ) { $leader = ( $this->prefix === '{channel}' ) ? diff --git a/includes/debug/logger/monolog/LineFormatter.php b/includes/debug/logger/monolog/LineFormatter.php index 0ad9b159fa..cdc4da3aa0 100644 --- a/includes/debug/logger/monolog/LineFormatter.php +++ b/includes/debug/logger/monolog/LineFormatter.php @@ -37,8 +37,7 @@ use MWExceptionHandler; * will be used to redact the trace information. * * @since 1.26 - * @author Bryan Davis - * @copyright © 2015 Bryan Davis and Wikimedia Foundation. + * @copyright © 2015 Wikimedia Foundation and contributors */ class LineFormatter extends MonologLineFormatter { @@ -61,7 +60,7 @@ class LineFormatter extends MonologLineFormatter { } /** - * {@inheritdoc} + * @inheritDoc */ public function format( array $record ) { // Drop the 'private' flag from the context diff --git a/includes/debug/logger/monolog/SyslogHandler.php b/includes/debug/logger/monolog/SyslogHandler.php index 104ee5808f..780ea94d20 100644 --- a/includes/debug/logger/monolog/SyslogHandler.php +++ b/includes/debug/logger/monolog/SyslogHandler.php @@ -43,8 +43,7 @@ use Monolog\Logger; * default Logstash syslog input handler. * * @since 1.25 - * @author Bryan Davis - * @copyright © 2015 Bryan Davis and Wikimedia Foundation. + * @copyright © 2015 Wikimedia Foundation and contributors */ class SyslogHandler extends SyslogUdpHandler { diff --git a/includes/debug/logger/monolog/WikiProcessor.php b/includes/debug/logger/monolog/WikiProcessor.php index ad939a0932..5e32887a17 100644 --- a/includes/debug/logger/monolog/WikiProcessor.php +++ b/includes/debug/logger/monolog/WikiProcessor.php @@ -25,8 +25,7 @@ namespace MediaWiki\Logger\Monolog; * wiki / request ID, and MediaWiki version. * * @since 1.25 - * @author Bryan Davis - * @copyright © 2013 Bryan Davis and Wikimedia Foundation. + * @copyright © 2013 Wikimedia Foundation and contributors */ class WikiProcessor { diff --git a/includes/deferred/AtomicSectionUpdate.php b/includes/deferred/AtomicSectionUpdate.php index 6585575dc3..8b62989b53 100644 --- a/includes/deferred/AtomicSectionUpdate.php +++ b/includes/deferred/AtomicSectionUpdate.php @@ -1,5 +1,7 @@ = $stage ) { + // This is a sub-DeferredUpdate; run it right after its parent update. + // Also, while post-send updates are running, push any "pre-send" jobs to the + // active post-send queue to make sure they get run this round (or at all). self::$executeContext['subqueue'][] = $update; + return; } @@ -89,12 +91,6 @@ class DeferredUpdates { self::push( self::$postSendUpdates, $update ); } - if ( self::$immediateMode ) { - // No more explicit doUpdates() calls will happen, so run this now - self::doUpdates( 'run' ); - return; - } - // Try to run the updates now if in CLI mode and no transaction is active. // This covers scripts that don't/barely use the DB but make updates to other stores. if ( $wgCommandLineMode ) { @@ -139,9 +135,10 @@ class DeferredUpdates { /** * @param bool $value Whether to just immediately run updates in addUpdate() * @since 1.28 + * @deprecated 1.29 Causes issues in Web-executed jobs - see T165714 and T100085. */ public static function setImmediateMode( $value ) { - self::$immediateMode = (bool)$value; + wfDeprecated( __METHOD__, '1.29' ); } /** @@ -189,16 +186,6 @@ class DeferredUpdates { while ( $updates ) { $queue = []; // clear the queue - if ( $mode === 'enqueue' ) { - try { - // Push enqueuable updates to the job queue and get the rest - $updates = self::enqueueUpdates( $updates ); - } catch ( Exception $e ) { - // Let other updates have a chance to run if this failed - MWExceptionHandler::rollbackMasterChangesAndLog( $e ); - } - } - // Order will be DataUpdate followed by generic DeferrableUpdate tasks $updatesByType = [ 'data' => [], 'generic' => [] ]; foreach ( $updates as $du ) { @@ -218,13 +205,9 @@ class DeferredUpdates { // Execute all remaining tasks... foreach ( $updatesByType as $updatesForType ) { foreach ( $updatesForType as $update ) { - self::$executeContext = [ - 'update' => $update, - 'stage' => $stage, - 'subqueue' => [] - ]; + self::$executeContext = [ 'stage' => $stage, 'subqueue' => [] ]; /** @var DeferrableUpdate $update */ - $guiError = self::runUpdate( $update, $lbFactory, $stage ); + $guiError = self::runUpdate( $update, $lbFactory, $mode, $stage ); $reportableError = $reportableError ?: $guiError; // Do the subqueue updates for $update until there are none while ( self::$executeContext['subqueue'] ) { @@ -236,7 +219,7 @@ class DeferredUpdates { $subUpdate->setTransactionTicket( $ticket ); } - $guiError = self::runUpdate( $subUpdate, $lbFactory, $stage ); + $guiError = self::runUpdate( $subUpdate, $lbFactory, $mode, $stage ); $reportableError = $reportableError ?: $guiError; } self::$executeContext = null; @@ -254,16 +237,26 @@ class DeferredUpdates { /** * @param DeferrableUpdate $update * @param LBFactory $lbFactory + * @param string $mode * @param integer $stage * @return ErrorPageError|null */ - private static function runUpdate( DeferrableUpdate $update, LBFactory $lbFactory, $stage ) { + private static function runUpdate( + DeferrableUpdate $update, LBFactory $lbFactory, $mode, $stage + ) { $guiError = null; try { - $fnameTrxOwner = get_class( $update ) . '::doUpdate'; - $lbFactory->beginMasterChanges( $fnameTrxOwner ); - $update->doUpdate(); - $lbFactory->commitMasterChanges( $fnameTrxOwner ); + if ( $mode === 'enqueue' && $update instanceof EnqueueableDataUpdate ) { + // Run only the job enqueue logic to complete the update later + $spec = $update->getAsJobSpecification(); + JobQueueGroup::singleton( $spec['wiki'] )->push( $spec['job'] ); + } else { + // Run the bulk of the update now + $fnameTrxOwner = get_class( $update ) . '::doUpdate'; + $lbFactory->beginMasterChanges( $fnameTrxOwner ); + $update->doUpdate(); + $lbFactory->commitMasterChanges( $fnameTrxOwner ); + } } catch ( Exception $e ) { // Reporting GUI exceptions does not work post-send if ( $e instanceof ErrorPageError && $stage === self::PRESEND ) { @@ -292,7 +285,7 @@ class DeferredUpdates { } // Avoiding running updates without them having outer scope - if ( !self::getBusyDbConnections() ) { + if ( !self::areDatabaseTransactionsActive() ) { self::doUpdates( $mode ); return true; } @@ -338,6 +331,7 @@ class DeferredUpdates { /** * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL) + * @return DeferrableUpdate[] * @since 1.29 */ public static function getPendingUpdates( $stage = self::ALL ) { @@ -361,16 +355,19 @@ class DeferredUpdates { } /** - * @return IDatabase[] Connection where commit() cannot be called yet + * @return bool If a transaction round is active or connection is not ready for commit() */ - private static function getBusyDbConnections() { - $connsBusy = []; - + private static function areDatabaseTransactionsActive() { $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + if ( $lbFactory->hasTransactionRound() ) { + return true; + } + + $connsBusy = false; $lbFactory->forEachLB( function ( LoadBalancer $lb ) use ( &$connsBusy ) { $lb->forEachOpenMasterConnection( function ( IDatabase $conn ) use ( &$connsBusy ) { if ( $conn->writesOrCallbacksPending() || $conn->explicitTrxActive() ) { - $connsBusy[] = $conn; + $connsBusy = true; } } ); } ); diff --git a/includes/deferred/LinksDeletionUpdate.php b/includes/deferred/LinksDeletionUpdate.php index 7215696c14..3dd9de6f91 100644 --- a/includes/deferred/LinksDeletionUpdate.php +++ b/includes/deferred/LinksDeletionUpdate.php @@ -21,6 +21,7 @@ */ use MediaWiki\MediaWikiServices; use Wikimedia\ScopedCallback; +use Wikimedia\Rdbms\IDatabase; /** * Update object handling the cleanup of links tables after a page was deleted. @@ -105,7 +106,11 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate { __METHOD__ ); if ( $row ) { - Category::newFromRow( $row, $title )->refreshCounts(); + $cat = Category::newFromRow( $row, $title ); + // T166757: do the update after the main job DB commit + DeferredUpdates::addCallableUpdate( function () use ( $cat ) { + $cat->refreshCounts(); + } ); } } diff --git a/includes/deferred/LinksUpdate.php b/includes/deferred/LinksUpdate.php index 0133f1909e..c6facd9bf8 100644 --- a/includes/deferred/LinksUpdate.php +++ b/includes/deferred/LinksUpdate.php @@ -20,6 +20,7 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; use MediaWiki\MediaWikiServices; use Wikimedia\ScopedCallback; @@ -101,8 +102,6 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { private $db; /** - * Constructor - * * @param Title $title Title of the page we're updating * @param ParserOutput $parserOutput Output from a full parse of this page * @param bool $recursive Queue jobs for recursive updates? @@ -363,21 +362,24 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { private function updateCategoryCounts( array $added, array $deleted ) { global $wgUpdateRowsPerQuery; + if ( !$added && !$deleted ) { + return; + } + + $wikiId = $this->getDB()->getWikiID(); $wp = WikiPage::factory( $this->mTitle ); - $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + $lbf = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + // T163801: try to release any row locks to reduce contention + $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] ); foreach ( array_chunk( array_keys( $added ), $wgUpdateRowsPerQuery ) as $addBatch ) { $wp->updateCategoryCounts( $addBatch, [], $this->mId ); - $factory->commitAndWaitForReplication( - __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ] - ); + $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] ); } foreach ( array_chunk( array_keys( $deleted ), $wgUpdateRowsPerQuery ) as $deleteBatch ) { $wp->updateCategoryCounts( [], $deleteBatch, $this->mId ); - $factory->commitAndWaitForReplication( - __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ] - ); + $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $wikiId ] ); } } @@ -398,7 +400,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { private function incrTableUpdate( $table, $prefix, $deletions, $insertions ) { $services = MediaWikiServices::getInstance(); $bSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' ); - $factory = $services->getDBLoadBalancerFactory(); + $lbf = $services->getDBLoadBalancerFactory(); if ( $table === 'page_props' ) { $fromField = 'pp_page'; @@ -408,7 +410,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { $deleteWheres = []; // list of WHERE clause arrays for each DB delete() call if ( $table === 'pagelinks' || $table === 'templatelinks' || $table === 'iwlinks' ) { - $baseKey = ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace"; + $baseKey = ( $table === 'iwlinks' ) ? 'iwl_prefix' : "{$prefix}_namespace"; $curBatchSize = 0; $curDeletionBatch = []; @@ -450,7 +452,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { foreach ( $deleteWheres as $deleteWhere ) { $this->getDB()->delete( $table, $deleteWhere, __METHOD__ ); - $factory->commitAndWaitForReplication( + $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ] ); } @@ -458,7 +460,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { $insertBatches = array_chunk( $insertions, $bSize ); foreach ( $insertBatches as $insertBatch ) { $this->getDB()->insert( $table, $insertBatch, __METHOD__, 'IGNORE' ); - $factory->commitAndWaitForReplication( + $lbf->commitAndWaitForReplication( __METHOD__, $this->ticket, [ 'wiki' => $this->getDB()->getWikiID() ] ); } diff --git a/includes/deferred/MWCallableUpdate.php b/includes/deferred/MWCallableUpdate.php index 5247e97cf1..5b822af492 100644 --- a/includes/deferred/MWCallableUpdate.php +++ b/includes/deferred/MWCallableUpdate.php @@ -1,5 +1,7 @@ getStats(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); foreach ( [ 'edits', 'articles', 'pages', 'users', 'images' ] as $type ) { $delta = $this->$type; if ( $delta !== 0 ) { @@ -187,7 +189,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { } /** - * @param string $sql + * @param string &$sql * @param string $field * @param int $delta */ @@ -205,12 +207,13 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { } /** + * @param BagOStuff $cache * @param string $type * @param string $sign ('+' or '-') * @return string */ - private function getTypeCacheKey( $type, $sign ) { - return wfMemcKey( 'sitestatsupdate', 'pendingdelta', $type, $sign ); + private function getTypeCacheKey( BagOStuff $cache, $type, $sign ) { + return $cache->makeKey( 'sitestatsupdate', 'pendingdelta', $type, $sign ); } /** @@ -220,11 +223,11 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { * @param int $delta Delta (positive or negative) */ protected function adjustPending( $type, $delta ) { - $cache = ObjectCache::getMainStashInstance(); + $cache = MediaWikiServices::getInstance()->getMainObjectStash(); if ( $delta < 0 ) { // decrement - $key = $this->getTypeCacheKey( $type, '-' ); + $key = $this->getTypeCacheKey( $cache, $type, '-' ); } else { // increment - $key = $this->getTypeCacheKey( $type, '+' ); + $key = $this->getTypeCacheKey( $cache, $type, '+' ); } $magnitude = abs( $delta ); @@ -236,7 +239,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { * @return array Positive and negative deltas for each type */ protected function getPendingDeltas() { - $cache = ObjectCache::getMainStashInstance(); + $cache = MediaWikiServices::getInstance()->getMainObjectStash(); $pending = []; foreach ( [ 'ss_total_edits', @@ -244,8 +247,8 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { ) { // Get pending increments and pending decrements $flg = BagOStuff::READ_LATEST; - $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg ); - $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg ); + $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '+' ), $flg ); + $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $cache, $type, '-' ), $flg ); } return $pending; @@ -256,12 +259,12 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { * @param array $pd Result of getPendingDeltas(), used for DB update */ protected function removePendingDeltas( array $pd ) { - $cache = ObjectCache::getMainStashInstance(); + $cache = MediaWikiServices::getInstance()->getMainObjectStash(); foreach ( $pd as $type => $deltas ) { foreach ( $deltas as $sign => $magnitude ) { // Lower the pending counter now that we applied these changes - $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude ); + $cache->decr( $this->getTypeCacheKey( $cache, $type, $sign ), $magnitude ); } } } diff --git a/includes/deferred/SqlDataUpdate.php b/includes/deferred/SqlDataUpdate.php index 25e884114b..2411beff89 100644 --- a/includes/deferred/SqlDataUpdate.php +++ b/includes/deferred/SqlDataUpdate.php @@ -21,6 +21,8 @@ * @file */ +use Wikimedia\Rdbms\IDatabase; + /** * @deprecated Since 1.28 Use DataUpdate directly, injecting the database */ diff --git a/includes/deferred/WANCacheReapUpdate.php b/includes/deferred/WANCacheReapUpdate.php index 33ddc59cbd..cbeb1fc77c 100644 --- a/includes/deferred/WANCacheReapUpdate.php +++ b/includes/deferred/WANCacheReapUpdate.php @@ -1,6 +1,7 @@ getNamespace() >= 0 ) { + $entities[] = WikiPage::factory( Title::newFromTitleValue( $t ) ); + } + if ( $t->inNamespace( NS_FILE ) ) { $entities[] = wfLocalFile( $t->getText() ); } diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php index a08bd9ed9b..d76af31aea 100644 --- a/includes/diff/DairikiDiff.php +++ b/includes/diff/DairikiDiff.php @@ -211,7 +211,6 @@ class Diff { protected $bailoutComplexity = 0; /** - * Constructor. * Computes diff between sequences of strings. * * @param string[] $from_lines An array of strings. diff --git a/includes/diff/DiffEngine.php b/includes/diff/DiffEngine.php index 25d50d371d..53378e5827 100644 --- a/includes/diff/DiffEngine.php +++ b/includes/diff/DiffEngine.php @@ -79,7 +79,6 @@ class DiffEngine { * @return DiffOp[] */ public function diff( $from_lines, $to_lines ) { - // Diff and store locally $this->diffInternal( $from_lines, $to_lines ); diff --git a/includes/diff/DiffFormatter.php b/includes/diff/DiffFormatter.php index 4b44b3c4b2..07124c02ce 100644 --- a/includes/diff/DiffFormatter.php +++ b/includes/diff/DiffFormatter.php @@ -60,7 +60,6 @@ abstract class DiffFormatter { * @return string The formatted output. */ public function format( $diff ) { - $xi = $yi = 1; $block = false; $context = []; @@ -126,7 +125,7 @@ abstract class DiffFormatter { * @param int $xlen * @param int $ybeg * @param int $ylen - * @param array $edits + * @param array &$edits * * @throws MWException If the edit type is not known. */ diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index 148e50cf7c..7f9af604fd 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -20,6 +20,7 @@ * @file * @ingroup DifferenceEngine */ +use MediaWiki\MediaWikiServices; /** @deprecated use class constant instead */ define( 'MW_DIFF_VERSION', '1.11a' ); @@ -103,7 +104,6 @@ class DifferenceEngine extends ContextSource { /**#@-*/ /** - * Constructor * @param IContextSource $context Context to use, anything else will be ignored * @param int $old Old ID we want to show and diff with. * @param string|int $new Either revision ID or 'prev' or 'next'. Default: 0. @@ -376,6 +376,11 @@ class DifferenceEngine extends ContextSource { } } + $out->addJsConfigVars( [ + 'wgDiffOldId' => $this->mOldid, + 'wgDiffNewId' => $this->mNewid, + ] ); + # Make "next revision link" # Skip next link on the top revision if ( $samePage && !$this->mNewRev->isCurrent() ) { @@ -846,13 +851,13 @@ class DifferenceEngine extends ContextSource { * @return bool|string */ public function generateTextDiffBody( $otext, $ntext ) { - $diff = function() use ( $otext, $ntext ) { + $diff = function () use ( $otext, $ntext ) { $time = microtime( true ); $result = $this->textDiff( $otext, $ntext ); $time = intval( ( microtime( true ) - $time ) * 1000 ); - $this->getStats()->timing( 'diff_time', $time ); + MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'diff_time', $time ); // Log requests slower than 99th percentile if ( $time > 100 && $this->mOldPage && $this->mNewPage ) { wfDebugLog( 'diff', @@ -866,7 +871,7 @@ class DifferenceEngine extends ContextSource { * @param Status $status * @throws FatalError */ - $error = function( $status ) { + $error = function ( $status ) { throw new FatalError( $status->getWikiText() ); }; @@ -907,10 +912,35 @@ class DifferenceEngine extends ContextSource { $wgExternalDiffEngine = false; } + // Better external diff engine, the 2 may some day be dropped + // This one does the escaping and segmenting itself if ( function_exists( 'wikidiff2_do_diff' ) && $wgExternalDiffEngine === false ) { - # Better external diff engine, the 2 may some day be dropped - # This one does the escaping and segmenting itself - $text = wikidiff2_do_diff( $otext, $ntext, 2 ); + $wikidiff2Version = phpversion( 'wikidiff2' ); + if ( + $wikidiff2Version !== false && + version_compare( $wikidiff2Version, '0.3.0', '>=' ) + ) { + $text = wikidiff2_do_diff( + $otext, + $ntext, + 2, + $this->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ) + ); + } else { + // Don't pass the 4th parameter for compatibility with older versions of wikidiff2 + $text = wikidiff2_do_diff( + $otext, + $ntext, + 2 + ); + + // Log a warning in case the configuration value is set to not silently ignore it + if ( $this->getConfig()->get( 'WikiDiff2MovedParagraphDetectionCutoff' ) > 0 ) { + wfLogWarning( '$wgWikiDiff2MovedParagraphDetectionCutoff is set but has no + effect since the used version of WikiDiff2 does not support it.' ); + } + } + $text .= $this->debug( 'wikidiff2' ); return $text; @@ -1144,17 +1174,17 @@ class DifferenceEngine extends ContextSource { if ( !$diff && !$otitle ) { $header .= " - - {$ntitle} + + {$ntitle} "; $multiColspan = 1; } else { if ( $diff ) { // Safari/Chrome show broken output if cols not used $header .= " - - - - "; + + + + "; $colspan = 2; $multiColspan = 4; } else { @@ -1163,20 +1193,20 @@ class DifferenceEngine extends ContextSource { } if ( $otitle || $ntitle ) { $header .= " - - {$otitle} - {$ntitle} + + {$otitle} + {$ntitle} "; } } if ( $multi != '' ) { - $header .= "{$multi}"; + $header .= "{$multi}"; } if ( $notice != '' ) { - $header .= "{$notice}"; + $header .= "{$notice}"; } return $header . $diff . ""; diff --git a/includes/diff/TableDiffFormatter.php b/includes/diff/TableDiffFormatter.php index bcae7467f7..14307b5844 100644 --- a/includes/diff/TableDiffFormatter.php +++ b/includes/diff/TableDiffFormatter.php @@ -196,7 +196,6 @@ class TableDiffFormatter extends DiffFormatter { * @param string[] $closing */ protected function changed( $orig, $closing ) { - $diff = new WordLevelDiff( $orig, $closing ); $del = $diff->orig(); $add = $diff->closing(); diff --git a/includes/diff/WordLevelDiff.php b/includes/diff/WordLevelDiff.php index 9c9b1c9c57..0b318bdb39 100644 --- a/includes/diff/WordLevelDiff.php +++ b/includes/diff/WordLevelDiff.php @@ -33,7 +33,7 @@ use MediaWiki\Diff\WordAccumulator; */ class WordLevelDiff extends \Diff { /** - * @inheritdoc + * @inheritDoc */ protected $bailoutComplexity = 40000000; // Roughly 6K x 6K words changed diff --git a/includes/edit/PreparedEdit.php b/includes/edit/PreparedEdit.php new file mode 100644 index 0000000000..62624f4d91 --- /dev/null +++ b/includes/edit/PreparedEdit.php @@ -0,0 +1,113 @@ +showErrorPage( $this->title, $this->msg, $this->params ); - $wgOut->output(); + if ( self::isCommandLine() || defined( 'MW_API' ) ) { + parent::report(); + } else { + global $wgOut; + $wgOut->showErrorPage( $this->title, $this->msg, $this->params ); + $wgOut->output(); + } } } diff --git a/includes/exception/HttpError.php b/includes/exception/HttpError.php index 48bc3bd4e1..f464d8af66 100644 --- a/includes/exception/HttpError.php +++ b/includes/exception/HttpError.php @@ -31,8 +31,6 @@ class HttpError extends MWException { private $httpCode, $header, $content; /** - * Constructor - * * @param int $httpCode HTTP status code to send to the client * @param string|Message $content Content of the message * @param string|Message|null $header Content of the header (\ and \) diff --git a/includes/exception/LocalizedException.php b/includes/exception/LocalizedException.php index cbdb53ef4f..d2cb5d17ec 100644 --- a/includes/exception/LocalizedException.php +++ b/includes/exception/LocalizedException.php @@ -56,7 +56,7 @@ class LocalizedException extends Exception implements ILocalizedException { // customizations, and make a basic attempt to turn markup into text. $msg = $this->getMessageObject()->inLanguage( 'en' )->useDatabase( false )->text(); $msg = preg_replace( '!!', '"', $msg ); - $msg = html_entity_decode( strip_tags( $msg ), ENT_QUOTES | ENT_HTML5 ); + $msg = Sanitizer::stripAllTags( $msg ); parent::__construct( $msg, $code, $previous ); } diff --git a/includes/exception/MWException.php b/includes/exception/MWException.php index 4ff8636e2e..8c1f8dc968 100644 --- a/includes/exception/MWException.php +++ b/includes/exception/MWException.php @@ -63,17 +63,6 @@ class MWException extends Exception { return $wgLang instanceof Language; } - /** - * Run hook to allow extensions to modify the text of the exception - * - * @param string $name Class name of the exception - * @param array $args Arguments to pass to the callback functions - * @return string|null String to output or null if any hook has been called - */ - public function runHooks( $name, $args = [] ) { - return MWExceptionRenderer::runHooks( $this, $name, $args ); - } - /** * Get a message from i18n * @@ -164,12 +153,7 @@ class MWException extends Exception { if ( $this->useOutputPage() ) { $wgOut->prepareErrorPage( $this->getPageTitle() ); - $hookResult = $this->runHooks( static::class ); - if ( $hookResult ) { - $wgOut->addHTML( $hookResult ); - } else { - $wgOut->addHTML( $this->getHTML() ); - } + $wgOut->addHTML( $this->getHTML() ); $wgOut->output(); } else { @@ -183,12 +167,7 @@ class MWException extends Exception { '' . "\n"; - $hookResult = $this->runHooks( static::class . 'Raw' ); - if ( $hookResult ) { - echo $hookResult; - } else { - echo $this->getHTML(); - } + echo $this->getHTML(); echo "\n"; } diff --git a/includes/exception/MWExceptionHandler.php b/includes/exception/MWExceptionHandler.php index 749be3c6cb..a2867a1879 100644 --- a/includes/exception/MWExceptionHandler.php +++ b/includes/exception/MWExceptionHandler.php @@ -21,6 +21,7 @@ use MediaWiki\Logger\LoggerFactory; use MediaWiki\MediaWikiServices; use Psr\Log\LogLevel; +use Wikimedia\Rdbms\DBError; /** * Handler class for MWExceptions @@ -82,29 +83,32 @@ class MWExceptionHandler { } /** - * If there are any open database transactions, roll them back and log - * the stack trace of the exception that should have been caught so the - * transaction could be aborted properly. + * Roll back any open database transactions and log the stack trace of the exception + * + * This method is used to attempt to recover from exceptions * * @since 1.23 * @param Exception|Throwable $e */ public static function rollbackMasterChangesAndLog( $e ) { $services = MediaWikiServices::getInstance(); - if ( $services->isServiceDisabled( 'DBLoadBalancerFactory' ) ) { - return; // T147599 + if ( !$services->isServiceDisabled( 'DBLoadBalancerFactory' ) ) { + // Rollback DBs to avoid transaction notices. This might fail + // to rollback some databases due to connection issues or exceptions. + // However, any sane DB driver will rollback implicitly anyway. + try { + $services->getDBLoadBalancerFactory()->rollbackMasterChanges( __METHOD__ ); + } catch ( DBError $e2 ) { + // If the DB is unreacheable, rollback() will throw an error + // and the error report() method might need messages from the DB, + // which would result in an exception loop. PHP may escalate such + // errors to "Exception thrown without a stack frame" fatals, but + // it's better to be explicit here. + self::logException( $e2, self::CAUGHT_BY_HANDLER ); + } } - $lbFactory = $services->getDBLoadBalancerFactory(); - if ( $lbFactory->hasMasterChanges() ) { - $logger = LoggerFactory::getInstance( 'Bug56269' ); - $logger->warning( - 'Exception thrown with an uncommited database transaction: ' . - self::getLogMessage( $e ), - self::getLogContext( $e ) - ); - } - $lbFactory->rollbackMasterChanges( __METHOD__ ); + self::logException( $e, self::CAUGHT_BY_HANDLER ); } /** @@ -122,25 +126,8 @@ class MWExceptionHandler { * @param Exception|Throwable $e */ public static function handleException( $e ) { - try { - // Rollback DBs to avoid transaction notices. This may fail - // to rollback some DB due to connection issues or exceptions. - // However, any sane DB driver will rollback implicitly anyway. - self::rollbackMasterChangesAndLog( $e ); - } catch ( DBError $e2 ) { - // If the DB is unreacheable, rollback() will throw an error - // and the error report() method might need messages from the DB, - // which would result in an exception loop. PHP may escalate such - // errors to "Exception thrown without a stack frame" fatals, but - // it's better to be explicit here. - self::logException( $e2, self::CAUGHT_BY_HANDLER ); - } - - self::logException( $e, self::CAUGHT_BY_HANDLER ); + self::rollbackMasterChangesAndLog( $e ); self::report( $e ); - - // Exit value should be nonzero for the benefit of shell jobs - exit( 1 ); } /** diff --git a/includes/exception/MWExceptionRenderer.php b/includes/exception/MWExceptionRenderer.php index a569bcd808..60d760f3aa 100644 --- a/includes/exception/MWExceptionRenderer.php +++ b/includes/exception/MWExceptionRenderer.php @@ -16,9 +16,13 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ +use Wikimedia\Rdbms\DBConnectionError; +use Wikimedia\Rdbms\DBError; +use Wikimedia\Rdbms\DBReadOnlyError; +use Wikimedia\Rdbms\DBExpectedError; + /** * Class to expose exceptions to the client (API bots, users, admins using CLI scripts) * @since 1.28 @@ -42,10 +46,10 @@ class MWExceptionRenderer { } elseif ( self::isCommandLine() ) { self::printError( self::getText( $e ) ); } elseif ( $mode === self::AS_PRETTY ) { + self::statusHeader( 500 ); if ( $e instanceof DBConnectionError ) { self::reportOutageHTML( $e ); } else { - self::statusHeader( 500 ); self::header( "Content-Type: $wgMimeType; charset=utf-8" ); self::reportHTML( $e ); } @@ -79,51 +83,6 @@ class MWExceptionRenderer { } } - /** - * Run hook to allow extensions to modify the text of the exception - * - * Called by MWException for b/c - * - * @param Exception|Throwable $e - * @param string $name Class name of the exception - * @param array $args Arguments to pass to the callback functions - * @return string|null String to output or null if any hook has been called - */ - public static function runHooks( $e, $name, $args = [] ) { - global $wgExceptionHooks; - - if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) { - return null; // Just silently ignore - } - - if ( !array_key_exists( $name, $wgExceptionHooks ) || - !is_array( $wgExceptionHooks[$name] ) - ) { - return null; - } - - $hooks = $wgExceptionHooks[$name]; - $callargs = array_merge( [ $e ], $args ); - - foreach ( $hooks as $hook ) { - if ( - is_string( $hook ) || - ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) - ) { - // 'function' or [ 'class', 'hook' ] - $result = call_user_func_array( $hook, $callargs ); - } else { - $result = null; - } - - if ( is_string( $result ) ) { - return $result; - } - } - - return null; - } - /** * @param Exception|Throwable $e * @return bool Should the exception use $wgOut to output the error? @@ -136,9 +95,14 @@ class MWExceptionRenderer { } } + // Don't even bother with OutputPage if there's no Title context set, + // (e.g. we're in RL code on load.php) - the Skin system (and probably + // most of MediaWiki) won't work. + return ( !empty( $GLOBALS['wgFullyInitialised'] ) && !empty( $GLOBALS['wgOut'] ) && + RequestContext::getMain()->getTitle() && !defined( 'MEDIAWIKI_INSTALL' ) ); } @@ -162,16 +126,11 @@ class MWExceptionRenderer { $wgOut->prepareErrorPage( self::msg( 'internalerror', 'Internal error' ) ); } - $hookResult = self::runHooks( $e, get_class( $e ) ); - if ( $hookResult ) { - $wgOut->addHTML( $hookResult ); - } else { - // Show any custom GUI message before the details - if ( $e instanceof MessageSpecifier ) { - $wgOut->addHTML( Message::newFromSpecifier( $e )->escaped() ); - } - $wgOut->addHTML( self::getHTML( $e ) ); + // Show any custom GUI message before the details + if ( $e instanceof MessageSpecifier ) { + $wgOut->addHTML( Message::newFromSpecifier( $e )->escaped() ); } + $wgOut->addHTML( self::getHTML( $e ) ); $wgOut->output(); } else { @@ -186,12 +145,7 @@ class MWExceptionRenderer { '' . "\n"; - $hookResult = self::runHooks( $e, get_class( $e ) . 'Raw' ); - if ( $hookResult ) { - echo $hookResult; - } else { - echo self::getHTML( $e ); - } + echo self::getHTML( $e ); echo "\n"; } @@ -257,7 +211,7 @@ class MWExceptionRenderer { "\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $e ) . "\n"; } else { - return self::getShowBacktraceError( $e ); + return self::getShowBacktraceError( $e ) . "\n"; } } @@ -288,7 +242,7 @@ class MWExceptionRenderer { $vars[] = '$wgShowDBErrorBacktrace = true;'; } $vars = implode( ' and ', $vars ); - return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information"; + return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information."; } /** @@ -351,7 +305,7 @@ class MWExceptionRenderer { if ( $wgShowHostnames || $wgShowSQLErrors ) { $info = str_replace( '$1', - Html::element( 'span', [ 'dir' => 'ltr' ], htmlspecialchars( $e->getMessage() ) ), + Html::element( 'span', [ 'dir' => 'ltr' ], $e->getMessage() ), htmlspecialchars( self::msg( 'dberr-info', '($1)' ) ) ); } else { diff --git a/includes/export/DumpFilter.php b/includes/export/DumpFilter.php index 5c27658af5..1349c54b95 100644 --- a/includes/export/DumpFilter.php +++ b/includes/export/DumpFilter.php @@ -42,7 +42,7 @@ class DumpFilter { protected $sendingThisPage; /** - * @param DumpOutput $sink + * @param DumpOutput &$sink */ function __construct( &$sink ) { $this->sink =& $sink; diff --git a/includes/export/DumpNamespaceFilter.php b/includes/export/DumpNamespaceFilter.php index c20e299ef7..2b71db00f2 100644 --- a/includes/export/DumpNamespaceFilter.php +++ b/includes/export/DumpNamespaceFilter.php @@ -34,7 +34,7 @@ class DumpNamespaceFilter extends DumpFilter { public $namespaces = []; /** - * @param DumpOutput $sink + * @param DumpOutput &$sink * @param array $param * @throws MWException */ diff --git a/includes/export/WikiExporter.php b/includes/export/WikiExporter.php index e41ab54ee3..e0ebaa2411 100644 --- a/includes/export/WikiExporter.php +++ b/includes/export/WikiExporter.php @@ -28,6 +28,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * @ingroup SpecialPage Dump @@ -90,8 +91,8 @@ class WikiExporter { * @param int $buffer One of WikiExporter::BUFFER or WikiExporter::STREAM * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB */ - function __construct( $db, $history = WikiExporter::CURRENT, - $buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) { + function __construct( $db, $history = self::CURRENT, + $buffer = self::BUFFER, $text = self::TEXT ) { $this->db = $db; $this->history = $history; $this->buffer = $buffer; @@ -105,7 +106,7 @@ class WikiExporter { * various row objects and XML output for filtering. Filters * can be chained or used as callbacks. * - * @param DumpOutput $sink + * @param DumpOutput &$sink */ public function setOutputSink( &$sink ) { $this->sink =& $sink; @@ -252,6 +253,7 @@ class WikiExporter { /** * @param string $cond + * @param bool $orderRevs * @throws MWException * @throws Exception */ @@ -271,7 +273,7 @@ class WikiExporter { # Get logging table name for logging.* clause $logging = $this->db->tableName( 'logging' ); - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $prev = $this->db->bufferResults( false ); } $result = null; // Assuring $result is not undefined, if exception occurs early @@ -283,7 +285,7 @@ class WikiExporter { [ 'ORDER BY' => 'log_id', 'USE INDEX' => [ 'logging' => 'PRIMARY' ] ] ); $this->outputLogStream( $result ); - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $this->db->bufferResults( $prev ); } } catch ( Exception $e ) { @@ -302,7 +304,7 @@ class WikiExporter { // Putting database back in previous buffer mode try { - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $this->db->bufferResults( $prev ); } } catch ( Exception $e2 ) { @@ -340,10 +342,10 @@ class WikiExporter { if ( !empty( $this->history['limit'] ) ) { $opts['LIMIT'] = intval( $this->history['limit'] ); } - } elseif ( $this->history & WikiExporter::FULL ) { + } elseif ( $this->history & self::FULL ) { # Full history dumps... # query optimization for history stub dumps - if ( $this->text == WikiExporter::STUB && $orderRevs ) { + if ( $this->text == self::STUB && $orderRevs ) { $tables = [ 'revision', 'page' ]; $opts[] = 'STRAIGHT_JOIN'; $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ]; @@ -352,13 +354,13 @@ class WikiExporter { } else { $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ]; } - } elseif ( $this->history & WikiExporter::CURRENT ) { + } elseif ( $this->history & self::CURRENT ) { # Latest revision dumps... if ( $this->list_authors && $cond != '' ) { // List authors, if so desired $this->do_list_authors( $cond ); } $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ]; - } elseif ( $this->history & WikiExporter::STABLE ) { + } elseif ( $this->history & self::STABLE ) { # "Stable" revision dumps... # Default JOIN, to be overridden... $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ]; @@ -366,7 +368,7 @@ class WikiExporter { if ( Hooks::run( 'WikiExporter::dumpStableQuery', [ &$tables, &$opts, &$join ] ) ) { throw new MWException( __METHOD__ . " given invalid history dump type." ); } - } elseif ( $this->history & WikiExporter::RANGE ) { + } elseif ( $this->history & self::RANGE ) { # Dump of revisions within a specified range $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ]; $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ]; @@ -380,12 +382,12 @@ class WikiExporter { $opts['USE INDEX']['page'] = 'PRIMARY'; } # Build text join options - if ( $this->text != WikiExporter::STUB ) { // 1-pass + if ( $this->text != self::STUB ) { // 1-pass $tables[] = 'text'; $join['text'] = [ 'INNER JOIN', 'rev_text_id=old_id' ]; } - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $prev = $this->db->bufferResults( false ); } $result = null; // Assuring $result is not undefined, if exception occurs early @@ -398,7 +400,7 @@ class WikiExporter { # Output dump results $this->outputPageStream( $result ); - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $this->db->bufferResults( $prev ); } } catch ( Exception $e ) { @@ -417,7 +419,7 @@ class WikiExporter { // Putting database back in previous buffer mode try { - if ( $this->buffer == WikiExporter::STREAM ) { + if ( $this->buffer == self::STREAM ) { $this->db->bufferResults( $prev ); } } catch ( Exception $e2 ) { diff --git a/includes/export/XmlDumpWriter.php b/includes/export/XmlDumpWriter.php index 5a1f92c4cc..943408cc98 100644 --- a/includes/export/XmlDumpWriter.php +++ b/includes/export/XmlDumpWriter.php @@ -199,7 +199,6 @@ class XmlDumpWriter { * @access private */ function writeRevision( $row ) { - $out = " \n"; $out .= " " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n"; if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) { @@ -287,7 +286,6 @@ class XmlDumpWriter { * @access private */ function writeLogItem( $row ) { - $out = " \n"; $out .= " " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n"; diff --git a/includes/externalstore/ExternalStoreDB.php b/includes/externalstore/ExternalStoreDB.php index d907c304f4..6bb1618ff6 100644 --- a/includes/externalstore/ExternalStoreDB.php +++ b/includes/externalstore/ExternalStoreDB.php @@ -21,6 +21,9 @@ */ use Wikimedia\Rdbms\LoadBalancer; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBConnRef; +use Wikimedia\Rdbms\MaintainableDBConnRef; /** * DB accessable external objects. diff --git a/includes/externalstore/ExternalStoreMedium.php b/includes/externalstore/ExternalStoreMedium.php index 260ee172b3..6cfa08389e 100644 --- a/includes/externalstore/ExternalStoreMedium.php +++ b/includes/externalstore/ExternalStoreMedium.php @@ -19,7 +19,6 @@ * * @file * @ingroup ExternalStorage - * @author Aaron Schulz */ /** diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php index e65a5945ff..5d0da6d32a 100644 --- a/includes/filebackend/FileBackendGroup.php +++ b/includes/filebackend/FileBackendGroup.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ use \MediaWiki\Logger\LoggerFactory; use MediaWiki\MediaWikiServices; diff --git a/includes/filebackend/filejournal/DBFileJournal.php b/includes/filebackend/filejournal/DBFileJournal.php index 62e635dd23..4269f91ef9 100644 --- a/includes/filebackend/filejournal/DBFileJournal.php +++ b/includes/filebackend/filejournal/DBFileJournal.php @@ -19,10 +19,11 @@ * * @file * @ingroup FileJournal - * @author Aaron Schulz */ use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBError; /** * Version of FileJournal that logs to a DB table @@ -182,7 +183,7 @@ class DBFileJournal extends FileJournal { protected function getMasterDB() { if ( !$this->dbw ) { // Get a separate connection in autocommit mode - $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB(); + $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB(); $this->dbw = $lb->getConnection( DB_MASTER, [], $this->wiki ); $this->dbw->clearFlag( DBO_TRX ); } diff --git a/includes/filebackend/lockmanager/LockManagerGroup.php b/includes/filebackend/lockmanager/LockManagerGroup.php index 1e66e6e011..e6f992c321 100644 --- a/includes/filebackend/lockmanager/LockManagerGroup.php +++ b/includes/filebackend/lockmanager/LockManagerGroup.php @@ -27,7 +27,6 @@ use MediaWiki\Logger\LoggerFactory; * Class to handle file lock manager registration * * @ingroup LockManager - * @author Aaron Schulz * @since 1.19 */ class LockManagerGroup { diff --git a/includes/filebackend/lockmanager/MySqlLockManager.php b/includes/filebackend/lockmanager/MySqlLockManager.php index 5936e7d1d2..2108aed4e1 100644 --- a/includes/filebackend/lockmanager/MySqlLockManager.php +++ b/includes/filebackend/lockmanager/MySqlLockManager.php @@ -1,4 +1,8 @@ scriptDirUrl ) ) { return $this->makeUrl( @@ -1602,9 +1602,15 @@ class FileRepo { $path = $this->resolveToStoragePath( $virtualUrl ); $params = [ 'src' => $path, 'headers' => $headers, 'options' => $optHeaders ]; + // T172851: HHVM does not flush the output properly, causing OOM + ob_start( null, 1048576 ); + ob_implicit_flush( true ); + $status = $this->newGood(); $status->merge( $this->backend->streamFile( $params ) ); + ob_end_flush(); + return $status; } diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php index 43f1d211b3..56ccc64499 100644 --- a/includes/filerepo/ForeignAPIRepo.php +++ b/includes/filerepo/ForeignAPIRepo.php @@ -528,7 +528,7 @@ class ForeignAPIRepo extends FileRepo { } $req = MWHttpRequest::factory( $url, $options, __METHOD__ ); - $req->setUserAgent( ForeignAPIRepo::getUserAgent() ); + $req->setUserAgent( self::getUserAgent() ); $status = $req->execute(); if ( $status->isOK() ) { diff --git a/includes/filerepo/ForeignDBRepo.php b/includes/filerepo/ForeignDBRepo.php index 3e8850823e..bce3005c67 100644 --- a/includes/filerepo/ForeignDBRepo.php +++ b/includes/filerepo/ForeignDBRepo.php @@ -21,6 +21,9 @@ * @ingroup FileRepo */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; + /** * A foreign repository with an accessible MediaWiki database * diff --git a/includes/filerepo/ForeignDBViaLBRepo.php b/includes/filerepo/ForeignDBViaLBRepo.php index f83fd1c813..bcd253fb4a 100644 --- a/includes/filerepo/ForeignDBViaLBRepo.php +++ b/includes/filerepo/ForeignDBViaLBRepo.php @@ -73,7 +73,7 @@ class ForeignDBViaLBRepo extends LocalRepo { * @return Closure */ protected function getDBFactory() { - return function( $index ) { + return function ( $index ) { return wfGetLB( $this->wiki )->getConnectionRef( $index, [], $this->wiki ); }; } diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php index d5e29aba83..20d51c254a 100644 --- a/includes/filerepo/LocalRepo.php +++ b/includes/filerepo/LocalRepo.php @@ -23,6 +23,8 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; /** * A repository that stores files in the local filesystem and registers them @@ -481,7 +483,7 @@ class LocalRepo extends FileRepo { * @return Closure */ protected function getDBFactory() { - return function( $index ) { + return function ( $index ) { return wfGetDB( $index ); }; } diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php index f7e85a8a40..9aa2b186e5 100644 --- a/includes/filerepo/file/File.php +++ b/includes/filerepo/file/File.php @@ -5,6 +5,7 @@ * * Represents files in a repository. */ +use MediaWiki\MediaWikiServices; /** * Base code for files. @@ -436,7 +437,7 @@ abstract class File implements IDBAccessObject { $this->fsFile = $this->repo->getLocalReference( $this->getPath() ); $statTiming = microtime( true ) - $starttime; - RequestContext::getMain()->getStats()->timing( + MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming ); if ( !$this->fsFile ) { @@ -1117,7 +1118,7 @@ abstract class File implements IDBAccessObject { public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) { global $wgIgnoreImageErrors; - $stats = RequestContext::getMain()->getStats(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); $handler = $this->getHandler(); @@ -1227,7 +1228,7 @@ abstract class File implements IDBAccessObject { // this object exists $tmpFile->bind( $this ); - RequestContext::getMain()->getStats()->timing( + MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'media.thumbnail.generate.bucket', 1000 * $buckettime ); return true; @@ -2148,15 +2149,34 @@ abstract class File implements IDBAccessObject { } /** - * @return array HTTP header name/value map to use for HEAD/GET request responses + * @deprecated since 1.30, use File::getContentHeaders instead */ function getStreamHeaders() { + wfDeprecated( __METHOD__, '1.30' ); + return $this->getContentHeaders(); + } + + /** + * @return array HTTP header name/value map to use for HEAD/GET request responses + * @since 1.30 + */ + function getContentHeaders() { $handler = $this->getHandler(); if ( $handler ) { - return $handler->getStreamHeaders( $this->getMetadata() ); - } else { - return []; + $metadata = $this->getMetadata(); + + if ( is_string( $metadata ) ) { + $metadata = MediaWiki\quietCall( 'unserialize', $metadata ); + } + + if ( !is_array( $metadata ) ) { + $metadata = []; + } + + return $handler->getContentHeaders( $metadata ); } + + return []; } /** diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php index f6f44e610a..cf211618fc 100644 --- a/includes/filerepo/file/ForeignDBFile.php +++ b/includes/filerepo/file/ForeignDBFile.php @@ -21,6 +21,8 @@ * @ingroup FileAbstraction */ +use Wikimedia\Rdbms\DBUnexpectedError; + /** * Foreign file with an accessible MediaWiki database * diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index a633fd2f8d..33177d3f6f 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -21,7 +21,9 @@ * @ingroup FileAbstraction */ -use \MediaWiki\Logger\LoggerFactory; +use MediaWiki\Logger\LoggerFactory; +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; /** * Class to represent a local file in the wiki's own database @@ -213,7 +215,6 @@ class LocalFile extends File { } /** - * Constructor. * Do not call this except from inside a repo class. * @param Title $title * @param FileRepo $repo @@ -591,7 +592,7 @@ class LocalFile extends File { if ( $upgrade ) { $this->upgrading = true; // Defer updates unless in auto-commit CLI mode - DeferredUpdates::addCallableUpdate( function() { + DeferredUpdates::addCallableUpdate( function () { $this->upgrading = false; // avoid duplicate updates try { $this->upgradeRow(); @@ -714,6 +715,11 @@ class LocalFile extends File { * @return int */ public function getWidth( $page = 1 ) { + $page = (int)$page; + if ( $page < 1 ) { + $page = 1; + } + $this->load(); if ( $this->isMultipage() ) { @@ -741,6 +747,11 @@ class LocalFile extends File { * @return int */ public function getHeight( $page = 1 ) { + $page = (int)$page; + if ( $page < 1 ) { + $page = 1; + } + $this->load(); if ( $this->isMultipage() ) { @@ -1020,9 +1031,15 @@ class LocalFile extends File { $purgeList = []; foreach ( $files as $file ) { - # Check that the base file name is part of the thumb name + if ( $this->repo->supportsSha1URLs() ) { + $reference = $this->getSha1(); + } else { + $reference = $this->getName(); + } + + # Check that the reference (filename or sha1) is part of the thumb name # This is a basic sanity check to avoid erasing unrelated directories - if ( strpos( $file, $this->getName() ) !== false + if ( strpos( $file, $reference ) !== false || strpos( $file, "-thumbnail" ) !== false // "short" thumb name ) { $purgeList[] = "{$dir}/{$file}"; @@ -1198,7 +1215,13 @@ class LocalFile extends File { $options = []; $handler = MediaHandler::getHandler( $props['mime'] ); if ( $handler ) { - $options['headers'] = $handler->getStreamHeaders( $props['metadata'] ); + $metadata = MediaWiki\quietCall( 'unserialize', $props['metadata'] ); + + if ( !is_array( $metadata ) ) { + $metadata = []; + } + + $options['headers'] = $handler->getContentHeaders( $metadata ); } else { $options['headers'] = []; } diff --git a/includes/filerepo/file/UnregisteredLocalFile.php b/includes/filerepo/file/UnregisteredLocalFile.php index 5ee25cd86c..b22f8cb34e 100644 --- a/includes/filerepo/file/UnregisteredLocalFile.php +++ b/includes/filerepo/file/UnregisteredLocalFile.php @@ -111,6 +111,11 @@ class UnregisteredLocalFile extends File { * @return bool */ private function cachePageDimensions( $page = 1 ) { + $page = (int)$page; + if ( $page < 1 ) { + $page = 1; + } + if ( !isset( $this->dims[$page] ) ) { if ( !$this->getHandler() ) { return false; diff --git a/includes/gallery/ImageGalleryBase.php b/includes/gallery/ImageGalleryBase.php index 6884f65626..eeb8a8ff84 100644 --- a/includes/gallery/ImageGalleryBase.php +++ b/includes/gallery/ImageGalleryBase.php @@ -38,6 +38,11 @@ abstract class ImageGalleryBase extends ContextSource { */ protected $mShowBytes; + /** + * @var bool Whether to show the dimensions in categories + */ + protected $mShowDimensions; + /** * @var bool Whether to show the filename. Default: true */ @@ -136,6 +141,7 @@ abstract class ImageGalleryBase extends ContextSource { $galleryOptions = $this->getConfig()->get( 'GalleryOptions' ); $this->mImages = []; $this->mShowBytes = $galleryOptions['showBytes']; + $this->mShowDimensions = $galleryOptions['showDimensions']; $this->mShowFilename = true; $this->mParser = false; $this->mHideBadImages = false; @@ -283,6 +289,16 @@ abstract class ImageGalleryBase extends ContextSource { return empty( $this->mImages ); } + /** + * Enable/Disable showing of the dimensions of an image in the gallery. + * Enabled by default. + * + * @param bool $f Set to false to disable + */ + function setShowDimensions( $f ) { + $this->mShowDimensions = (bool)$f; + } + /** * Enable/Disable showing of the file size of an image in the gallery. * Enabled by default. diff --git a/includes/gallery/PackedOverlayImageGallery.php b/includes/gallery/PackedOverlayImageGallery.php index e1ee7fafbd..db8ce68b9a 100644 --- a/includes/gallery/PackedOverlayImageGallery.php +++ b/includes/gallery/PackedOverlayImageGallery.php @@ -31,7 +31,6 @@ class PackedOverlayImageGallery extends PackedImageGallery { * @return string */ protected function wrapGalleryText( $galleryText, $thumb ) { - // If we have no text, do not output anything to avoid // ugly white overlay. if ( trim( $galleryText ) === '' ) { diff --git a/includes/gallery/TraditionalImageGallery.php b/includes/gallery/TraditionalImageGallery.php index 1fd7b0a362..7a520bcbd1 100644 --- a/includes/gallery/TraditionalImageGallery.php +++ b/includes/gallery/TraditionalImageGallery.php @@ -174,15 +174,20 @@ class TraditionalImageGallery extends ImageGalleryBase { // ":{$ut}" ); // $ul = Linker::link( $linkTarget, $ut ); - if ( $this->mShowBytes ) { - if ( $img ) { - $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) ); - } else { - $fileSize = $this->msg( 'filemissing' )->escaped(); + $meta = []; + if ( $img ) { + if ( $this->mShowDimensions ) { + $meta[] = $img->getDimensionsString(); } - $fileSize = "$fileSize
    \n"; - } else { - $fileSize = ''; + if ( $this->mShowBytes ) { + $meta[] = htmlspecialchars( $lang->formatSize( $img->getSize() ) ); + } + } elseif ( $this->mShowDimensions || $this->mShowBytes ) { + $meta[] = $this->msg( 'filemissing' )->escaped(); + } + $meta = $lang->semicolonList( $meta ); + if ( $meta ) { + $meta .= "
    \n"; } $textlink = $this->mShowFilename ? @@ -201,7 +206,7 @@ class TraditionalImageGallery extends ImageGalleryBase { ) . "\n" : ''; - $galleryText = $textlink . $text . $fileSize; + $galleryText = $textlink . $text . $meta; $galleryText = $this->wrapGalleryText( $galleryText, $thumb ); # Weird double wrapping (the extra div inside the li) needed due to FF2 bug @@ -343,7 +348,7 @@ class TraditionalImageGallery extends ImageGalleryBase { * * Used by a subclass to insert extra high resolution images. * @param MediaTransformOutput $thumb The thumbnail - * @param array $imageParameters Array of options + * @param array &$imageParameters Array of options */ protected function adjustImageParameters( $thumb, &$imageParameters ) { } diff --git a/includes/htmlform/HTMLForm.php b/includes/htmlform/HTMLForm.php index 399147b89a..7293b99e38 100644 --- a/includes/htmlform/HTMLForm.php +++ b/includes/htmlform/HTMLForm.php @@ -271,7 +271,7 @@ class HTMLForm extends ContextSource { * Construct a HTMLForm object for given display type. May return a HTMLForm subclass. * * @param string $displayFormat - * @param mixed $arguments... Additional arguments to pass to the constructor. + * @param mixed $arguments,... Additional arguments to pass to the constructor. * @return HTMLForm */ public static function factory( $displayFormat/*, $arguments...*/ ) { @@ -285,7 +285,7 @@ class HTMLForm extends ContextSource { return ObjectFactory::constructClassInstance( OOUIHTMLForm::class, $arguments ); default: /** @var HTMLForm $form */ - $form = ObjectFactory::constructClassInstance( HTMLForm::class, $arguments ); + $form = ObjectFactory::constructClassInstance( self::class, $arguments ); $form->setDisplayFormat( $displayFormat ); return $form; } @@ -400,7 +400,13 @@ class HTMLForm extends ContextSource { if ( !in_array( $format, $this->availableDisplayFormats, true ) ) { throw new MWException( 'Display format must be one of ' . - print_r( $this->availableDisplayFormats, true ) ); + print_r( + array_merge( + $this->availableDisplayFormats, + $this->availableSubclassDisplayFormats + ), + true + ) ); } // Evil hack for mobile :( @@ -444,7 +450,7 @@ class HTMLForm extends ContextSource { * @since 1.23 * * @param string $fieldname Name of the field - * @param array $descriptor Input Descriptor, as described above + * @param array &$descriptor Input Descriptor, as described above * * @throws MWException * @return string Name of a HTMLFormField subclass @@ -1686,7 +1692,7 @@ class HTMLForm extends ContextSource { $attributes = []; if ( $fieldsetIDPrefix ) { - $attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" ); + $attributes['id'] = Sanitizer::escapeIdForAttribute( "$fieldsetIDPrefix$key" ); } $subsectionHtml .= $this->wrapFieldSetSection( $legend, $section, $attributes ); } else { @@ -1735,7 +1741,7 @@ class HTMLForm extends ContextSource { ]; if ( $sectionName ) { - $attribs['id'] = Sanitizer::escapeId( $sectionName ); + $attribs['id'] = Sanitizer::escapeIdForAttribute( $sectionName ); } if ( $displayFormat === 'table' ) { diff --git a/includes/htmlform/HTMLFormElement.php b/includes/htmlform/HTMLFormElement.php index 089213cff5..10db90cca2 100644 --- a/includes/htmlform/HTMLFormElement.php +++ b/includes/htmlform/HTMLFormElement.php @@ -26,7 +26,7 @@ trait HTMLFormElement { // And it's not needed anymore after infusing, so we don't put it in JS config at all. $this->setAttributes( [ 'data-mw-modules' => implode( ',', $this->modules ) ] ); } - $this->registerConfigCallback( function( &$config ) { + $this->registerConfigCallback( function ( &$config ) { if ( $this->hideIf !== null ) { $config['hideIf'] = $this->hideIf; } diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php index 83a80233f9..77ddc1a1b5 100644 --- a/includes/htmlform/HTMLFormField.php +++ b/includes/htmlform/HTMLFormField.php @@ -416,8 +416,8 @@ abstract class HTMLFormField { $this->mDir = $params['dir']; } - $validName = Sanitizer::escapeId( $this->mName ); - $validName = str_replace( [ '.5B', '.5D' ], [ '[', ']' ], $validName ); + $validName = urlencode( $this->mName ); + $validName = str_replace( [ '%5B', '%5D' ], [ '[', ']' ], $validName ); if ( $this->mName != $validName && !isset( $params['nodata'] ) ) { throw new MWException( "Invalid name '{$this->mName}' passed to " . __METHOD__ ); } @@ -430,7 +430,7 @@ abstract class HTMLFormField { if ( isset( $params['id'] ) ) { $id = $params['id']; - $validId = Sanitizer::escapeId( $id ); + $validId = urlencode( $id ); if ( $id != $validId ) { throw new MWException( "Invalid id '$id' passed to " . __METHOD__ ); @@ -976,7 +976,7 @@ abstract class HTMLFormField { } /** - * Returns the attributes required for the tooltip and accesskey. + * Returns the attributes required for the tooltip and accesskey, for Html::element() etc. * * @return array Attributes */ @@ -988,6 +988,22 @@ abstract class HTMLFormField { return Linker::tooltipAndAccesskeyAttribs( $this->mParams['tooltip'] ); } + /** + * Returns the attributes required for the tooltip and accesskey, for OOUI widgets' config. + * + * @return array Attributes + */ + public function getTooltipAndAccessKeyOOUI() { + if ( empty( $this->mParams['tooltip'] ) ) { + return []; + } + + return [ + 'title' => Linker::titleAttrib( $this->mParams['tooltip'] ), + 'accessKey' => Linker::accesskey( $this->mParams['tooltip'] ), + ]; + } + /** * Returns the given attributes from the parameters * diff --git a/includes/htmlform/OOUIHTMLForm.php b/includes/htmlform/OOUIHTMLForm.php index 54bdf04272..e47de61a4c 100644 --- a/includes/htmlform/OOUIHTMLForm.php +++ b/includes/htmlform/OOUIHTMLForm.php @@ -66,7 +66,10 @@ class OOUIHTMLForm extends HTMLForm { } if ( isset( $this->mSubmitTooltip ) ) { - $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip ); + $attribs += [ + 'title' => Linker::titleAttrib( $this->mSubmitTooltip ), + 'accessKey' => Linker::accesskey( $this->mSubmitTooltip ), + ]; } $attribs['classes'] = [ 'mw-htmlform-submit' ]; @@ -177,7 +180,7 @@ class OOUIHTMLForm extends HTMLForm { 'items' => $fieldsHtml, ]; if ( $sectionName ) { - $config['id'] = Sanitizer::escapeId( $sectionName ); + $config['id'] = Sanitizer::escapeIdForAttribute( $sectionName ); } if ( is_string( $this->mWrapperLegend ) ) { $config['label'] = $this->mWrapperLegend; @@ -191,15 +194,16 @@ class OOUIHTMLForm extends HTMLForm { * @return string */ public function getErrorsOrWarnings( $elements, $elementsType ) { - if ( !in_array( $elementsType, [ 'error', 'warning' ] ) ) { + if ( $elements === '' ) { + return ''; + } + + if ( !in_array( $elementsType, [ 'error', 'warning' ], true ) ) { throw new DomainException( $elementsType . ' is not a valid type.' ); } - if ( !$elements ) { - $errors = []; - } elseif ( $elements instanceof Status ) { - if ( $elements->isGood() ) { - $errors = []; - } else { + $errors = []; + if ( $elements instanceof Status ) { + if ( !$elements->isGood() ) { $errors = $elements->getErrorsByType( $elementsType ); foreach ( $errors as &$error ) { // Input: [ 'message' => 'foo', 'errors' => [ 'a', 'b', 'c' ] ] @@ -207,13 +211,12 @@ class OOUIHTMLForm extends HTMLForm { $error = array_merge( [ $error['message'] ], $error['params'] ); } } - } elseif ( $elementsType === 'errors' ) { - $errors = $elements; - if ( !is_array( $errors ) ) { - $errors = [ $errors ]; + } elseif ( $elementsType === 'error' ) { + if ( is_array( $elements ) ) { + $errors = $elements; + } elseif ( is_string( $elements ) ) { + $errors = [ $elements ]; } - } else { - $errors = []; } foreach ( $errors as &$error ) { diff --git a/includes/htmlform/fields/HTMLCheckField.php b/includes/htmlform/fields/HTMLCheckField.php index b080e183ff..9a956fbf1e 100644 --- a/includes/htmlform/fields/HTMLCheckField.php +++ b/includes/htmlform/fields/HTMLCheckField.php @@ -52,7 +52,7 @@ class HTMLCheckField extends HTMLFormField { $value = !$value; } - $attr = $this->getTooltipAndAccessKey(); + $attr = $this->getTooltipAndAccessKeyOOUI(); $attr['id'] = $this->mID; $attr['name'] = $this->mName; diff --git a/includes/htmlform/fields/HTMLFormFieldCloner.php b/includes/htmlform/fields/HTMLFormFieldCloner.php index dd9184bf33..53c6835949 100644 --- a/includes/htmlform/fields/HTMLFormFieldCloner.php +++ b/includes/htmlform/fields/HTMLFormFieldCloner.php @@ -93,9 +93,9 @@ class HTMLFormFieldCloner extends HTMLFormField { $info['name'] = $name; } if ( isset( $info['id'] ) ) { - $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--{$info['id']}" ); + $info['id'] = Sanitizer::escapeIdForAttribute( "{$this->mID}--$key--{$info['id']}" ); } else { - $info['id'] = Sanitizer::escapeId( "{$this->mID}--$key--$fieldname" ); + $info['id'] = Sanitizer::escapeIdForAttribute( "{$this->mID}--$key--$fieldname" ); } // Copy the hide-if rules to "child" fields, so that the JavaScript code handling them // (resources/src/mediawiki/htmlform/hide-if.js) doesn't have to handle nested fields. @@ -313,7 +313,7 @@ class HTMLFormFieldCloner extends HTMLFormField { 'type' => 'submit', 'formnovalidate' => true, 'name' => $name, - 'id' => Sanitizer::escapeId( "{$this->mID}--$key--delete" ), + 'id' => Sanitizer::escapeIdForAttribute( "{$this->mID}--$key--delete" ), 'cssclass' => 'mw-htmlform-cloner-delete-button', 'default' => $this->getMessage( $label )->text(), ], $this->mParent ); @@ -386,7 +386,7 @@ class HTMLFormFieldCloner extends HTMLFormField { 'type' => 'submit', 'formnovalidate' => true, 'name' => $name, - 'id' => Sanitizer::escapeId( "{$this->mID}--create" ), + 'id' => Sanitizer::escapeIdForAttribute( "{$this->mID}--create" ), 'cssclass' => 'mw-htmlform-cloner-create-button', 'default' => $this->getMessage( $label )->text(), ], $this->mParent ); diff --git a/includes/htmlform/fields/HTMLMultiSelectField.php b/includes/htmlform/fields/HTMLMultiSelectField.php index 2b6e0665d5..0d5eeba92c 100644 --- a/includes/htmlform/fields/HTMLMultiSelectField.php +++ b/includes/htmlform/fields/HTMLMultiSelectField.php @@ -142,7 +142,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable public function getInputOOUI( $value ) { $this->mParent->getOutput()->addModules( 'oojs-ui-widgets' ); - $attr = $this->getTooltipAndAccessKey(); + $attr = []; $attr['id'] = $this->mID; $attr['name'] = "{$this->mName}[]"; diff --git a/includes/htmlform/fields/HTMLRadioField.php b/includes/htmlform/fields/HTMLRadioField.php index 06ec3722ed..77ea7cd211 100644 --- a/includes/htmlform/fields/HTMLRadioField.php +++ b/includes/htmlform/fields/HTMLRadioField.php @@ -90,7 +90,7 @@ class HTMLRadioField extends HTMLFormField { $html .= Html::rawElement( 'h1', [], $label ) . "\n"; $html .= $this->formatOptions( $info, $value ); } else { - $id = Sanitizer::escapeId( $this->mID . "-$info" ); + $id = Sanitizer::escapeIdForAttribute( $this->mID . "-$info" ); $classes = [ 'mw-htmlform-flatlist-item' ]; if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) { $classes[] = 'mw-ui-radio'; diff --git a/includes/htmlform/fields/HTMLSelectAndOtherField.php b/includes/htmlform/fields/HTMLSelectAndOtherField.php index 9af60e5c22..38b487af10 100644 --- a/includes/htmlform/fields/HTMLSelectAndOtherField.php +++ b/includes/htmlform/fields/HTMLSelectAndOtherField.php @@ -63,8 +63,70 @@ class HTMLSelectAndOtherField extends HTMLSelectField { return "$select
    \n$textbox"; } + protected function getOOUIModules() { + return [ 'mediawiki.widgets.SelectWithInputWidget' ]; + } + public function getInputOOUI( $value ) { - return false; + $this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SelectWithInputWidget.styles' ); + + # TextInput + $textAttribs = [ + 'id' => $this->mID . '-other', + 'name' => $this->mName . '-other', + 'size' => $this->getSize(), + 'class' => [ 'mw-htmlform-select-and-other-field' ], + 'data-id-select' => $this->mID, + 'value' => $value[2], + ]; + + $allowedParams = [ + 'required', + 'autofocus', + 'multiple', + 'disabled', + 'tabindex', + 'maxlength', + ]; + + $textAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $textAttribs['classes'] = [ $this->mClass ]; + } + + # DropdownInput + $dropdownInputAttribs = [ + 'name' => $this->mName, + 'id' => $this->mID, + 'options' => $this->getOptionsOOUI(), + 'value' => $value[1], + ]; + + $allowedParams = [ + 'tabindex', + 'disabled', + ]; + + $dropdownInputAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $dropdownInputAttribs['classes'] = [ $this->mClass ]; + } + + return $this->getInputWidget( [ + 'textinput' => $textAttribs, + 'dropdowninput' => $dropdownInputAttribs, + 'or' => false, + ] ); + } + + public function getInputWidget( $params ) { + return new Mediawiki\Widget\SelectWithInputWidget( $params ); } /** diff --git a/includes/htmlform/fields/HTMLSelectOrOtherField.php b/includes/htmlform/fields/HTMLSelectOrOtherField.php index bb410799ef..a009b287c2 100644 --- a/includes/htmlform/fields/HTMLSelectOrOtherField.php +++ b/includes/htmlform/fields/HTMLSelectOrOtherField.php @@ -64,8 +64,80 @@ class HTMLSelectOrOtherField extends HTMLTextField { return "$select
    \n$textbox"; } + protected function shouldInfuseOOUI() { + return true; + } + + protected function getOOUIModules() { + return [ 'mediawiki.widgets.SelectWithInputWidget' ]; + } + public function getInputOOUI( $value ) { - return false; + $this->mParent->getOutput()->addModuleStyles( 'mediawiki.widgets.SelectWithInputWidget.styles' ); + + $valInSelect = false; + if ( $value !== false ) { + $value = strval( $value ); + $valInSelect = in_array( + $value, HTMLFormField::flattenOptions( $this->getOptions() ), true + ); + } + + # DropdownInput + $dropdownAttribs = [ + 'id' => $this->mID, + 'name' => $this->mName, + 'options' => $this->getOptionsOOUI(), + 'value' => $valInSelect ? $value : 'other', + 'class' => [ 'mw-htmlform-select-or-other' ], + ]; + + $allowedParams = [ + 'disabled', + 'tabindex', + ]; + + $dropdownAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + # TextInput + $textAttribs = [ + 'id' => $this->mID . '-other', + 'name' => $this->mName . '-other', + 'size' => $this->getSize(), + 'value' => $valInSelect ? '' : $value, + ]; + + $allowedParams = [ + 'required', + 'autofocus', + 'multiple', + 'disabled', + 'tabindex', + 'maxlength', + ]; + + $textAttribs += OOUI\Element::configFromHtmlAttributes( + $this->getAttributes( $allowedParams ) + ); + + if ( $this->mClass !== '' ) { + $textAttribs['classes'] = [ $this->mClass ]; + } + if ( $this->mPlaceholder !== '' ) { + $textAttribs['placeholder'] = $this->mPlaceholder; + } + + return $this->getInputWidget( [ + 'textinput' => $textAttribs, + 'dropdowninput' => $dropdownAttribs, + 'or' => true, + ] ); + } + + public function getInputWidget( $params ) { + return new Mediawiki\Widget\SelectWithInputWidget( $params ); } /** diff --git a/includes/htmlform/fields/HTMLTextAreaField.php b/includes/htmlform/fields/HTMLTextAreaField.php index 82ec3bf201..480c5bb926 100644 --- a/includes/htmlform/fields/HTMLTextAreaField.php +++ b/includes/htmlform/fields/HTMLTextAreaField.php @@ -71,7 +71,7 @@ class HTMLTextAreaField extends HTMLFormField { throw new Exception( "OOUIHTMLForm does not support the 'cols' parameter for textareas" ); } - $attribs = $this->getTooltipAndAccessKey(); + $attribs = $this->getTooltipAndAccessKeyOOUI(); if ( $this->mClass !== '' ) { $attribs['classes'] = [ $this->mClass ]; diff --git a/includes/htmlform/fields/HTMLTextField.php b/includes/htmlform/fields/HTMLTextField.php index b0b66cab9f..1c5a43ddad 100644 --- a/includes/htmlform/fields/HTMLTextField.php +++ b/includes/htmlform/fields/HTMLTextField.php @@ -140,7 +140,7 @@ class HTMLTextField extends HTMLFormField { $value = ''; } - $attribs = $this->getTooltipAndAccessKey(); + $attribs = $this->getTooltipAndAccessKeyOOUI(); if ( $this->mClass !== '' ) { $attribs['classes'] = [ $this->mClass ]; diff --git a/includes/htmlform/fields/HTMLUsersMultiselectField.php b/includes/htmlform/fields/HTMLUsersMultiselectField.php index 8c1241d015..f094745f5d 100644 --- a/includes/htmlform/fields/HTMLUsersMultiselectField.php +++ b/includes/htmlform/fields/HTMLUsersMultiselectField.php @@ -15,18 +15,16 @@ use MediaWiki\Widget\UsersMultiselectWidget; * @note This widget is not likely to remain functional in non-OOUI forms. */ class HTMLUsersMultiselectField extends HTMLUserTextField { - public function loadDataFromRequest( $request ) { - if ( !$request->getCheck( $this->mName ) ) { - return $this->getDefault(); - } + $value = $request->getText( $this->mName, $this->getDefault() ); - $usersArray = explode( "\n", $request->getText( $this->mName ) ); + $usersArray = explode( "\n", $value ); // Remove empty lines - $usersArray = array_values( array_filter( $usersArray, function( $username ) { + $usersArray = array_values( array_filter( $usersArray, function ( $username ) { return trim( $username ) !== ''; } ) ); - return $usersArray; + // This function is expected to return a string + return implode( "\n", $usersArray ); } public function validate( $value, $alldata ) { @@ -38,7 +36,9 @@ class HTMLUsersMultiselectField extends HTMLUserTextField { return false; } - foreach ( $value as $username ) { + // $value is a string, because HTMLForm fields store their values as strings + $usersArray = explode( "\n", $value ); + foreach ( $usersArray as $username ) { $result = parent::validate( $username, $alldata ); if ( $result !== true ) { return $result; @@ -48,12 +48,12 @@ class HTMLUsersMultiselectField extends HTMLUserTextField { return true; } - public function getInputHTML( $values ) { + public function getInputHTML( $value ) { $this->mParent->getOutput()->enableOOUI(); - return $this->getInputOOUI( $values ); + return $this->getInputOOUI( $value ); } - public function getInputOOUI( $values ) { + public function getInputOOUI( $value ) { $params = [ 'name' => $this->mName ]; if ( isset( $this->mParams['default'] ) ) { @@ -63,16 +63,21 @@ class HTMLUsersMultiselectField extends HTMLUserTextField { if ( isset( $this->mParams['placeholder'] ) ) { $params['placeholder'] = $this->mParams['placeholder']; } else { - $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' ) - ->inContentLanguage() - ->plain(); + $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' )->plain(); } - if ( !is_null( $values ) ) { - $params['default'] = $values; + if ( !is_null( $value ) ) { + // $value is a string, but the widget expects an array + $params['default'] = $value === '' ? [] : explode( "\n", $value ); } - return new UsersMultiselectWidget( $params ); + // Make the field auto-infusable when it's used inside a legacy HTMLForm rather than OOUIHTMLForm + $params['infusable'] = true; + $params['classes'] = [ 'mw-htmlform-field-autoinfuse' ]; + $widget = new UsersMultiselectWidget( $params ); + $widget->setAttributes( [ 'data-mw-modules' => implode( ',', $this->getOOUIModules() ) ] ); + + return $widget; } protected function shouldInfuseOOUI() { diff --git a/includes/http/CurlHttpRequest.php b/includes/http/CurlHttpRequest.php index f958ff657d..3da3eb325c 100644 --- a/includes/http/CurlHttpRequest.php +++ b/includes/http/CurlHttpRequest.php @@ -145,7 +145,7 @@ class CurlHttpRequest extends MWHttpRequest { $this->parseHeader(); $this->setStatus(); - return Status::wrap( $this->status ); // TODO B/C; move this to callers + return Status::wrap( $this->status ); // TODO B/C; move this to callers } /** diff --git a/includes/http/Http.php b/includes/http/Http.php index fa2d5a385f..c10b312f31 100644 --- a/includes/http/Http.php +++ b/includes/http/Http.php @@ -53,11 +53,14 @@ class Http { * - logger A \Psr\Logger\LoggerInterface instance for debug logging * - username Username for HTTP Basic Authentication * - password Password for HTTP Basic Authentication + * - originalRequest Information about the original request (as a WebRequest object or + * an associative array with 'ip' and 'userAgent'). * @param string $caller The method making this request, for profiling * @return string|bool (bool)false on failure or a string on success */ public static function request( $method, $url, $options = [], $caller = __METHOD__ ) { - wfDebug( "HTTP: $method: $url\n" ); + $logger = LoggerFactory::getInstance( 'http' ); + $logger->debug( "$method: $url" ); $options['method'] = strtoupper( $method ); @@ -75,7 +78,6 @@ class Http { return $req->getContent(); } else { $errors = $status->getErrorsByType( 'error' ); - $logger = LoggerFactory::getInstance( 'http' ); $logger->warning( Status::wrap( $status )->getWikiText( false, false, 'en' ), [ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] ); return false; @@ -104,7 +106,7 @@ class Http { $options['timeout'] = $args[1]; $caller = __METHOD__; } - return Http::request( 'GET', $url, $options, $caller ); + return self::request( 'GET', $url, $options, $caller ); } /** @@ -117,7 +119,7 @@ class Http { * @return string|bool false on error */ public static function post( $url, $options = [], $caller = __METHOD__ ) { - return Http::request( 'POST', $url, $options, $caller ); + return self::request( 'POST', $url, $options, $caller ); } /** @@ -162,4 +164,20 @@ class Http { return ""; } + + /** + * Get a configured MultiHttpClient + * @param array $options + */ + public static function createMultiClient( $options = [] ) { + global $wgHTTPConnectTimeout, $wgHTTPTimeout, $wgHTTPProxy; + + return new MultiHttpClient( $options + [ + 'connTimeout' => $wgHTTPConnectTimeout, + 'reqTimeout' => $wgHTTPTimeout, + 'userAgent' => self::userAgent(), + 'proxy' => $wgHTTPProxy, + 'logger' => LoggerFactory::getInstance( 'http' ) + ] ); + } } diff --git a/includes/http/MWHttpRequest.php b/includes/http/MWHttpRequest.php index e04402fa81..88cc510219 100644 --- a/includes/http/MWHttpRequest.php +++ b/includes/http/MWHttpRequest.php @@ -125,6 +125,9 @@ class MWHttpRequest implements LoggerAwareInterface { 'Basic ' . base64_encode( $options['username'] . ':' . $options['password'] ) ); } + if ( isset( $options['originalRequest'] ) ) { + $this->setOriginalRequest( $options['originalRequest'] ); + } $members = [ "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo", "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" ]; @@ -606,19 +609,17 @@ class MWHttpRequest implements LoggerAwareInterface { } } - if ( $foundRelativeURI ) { - if ( $domain ) { - return $domain . $locations[$countLocations - 1]; - } else { - $url = parse_url( $this->url ); - if ( isset( $url['host'] ) ) { - return $url['scheme'] . '://' . $url['host'] . - $locations[$countLocations - 1]; - } - } - } else { + if ( !$foundRelativeURI ) { return $locations[$countLocations - 1]; } + if ( $domain ) { + return $domain . $locations[$countLocations - 1]; + } + $url = parse_url( $this->url ); + if ( isset( $url['host'] ) ) { + return $url['scheme'] . '://' . $url['host'] . + $locations[$countLocations - 1]; + } } return $this->url; @@ -632,4 +633,34 @@ class MWHttpRequest implements LoggerAwareInterface { public function canFollowRedirects() { return true; } + + /** + * Set information about the original request. This can be useful for + * endpoints/API modules which act as a proxy for some service, and + * throttling etc. needs to happen in that service. + * Calling this will result in the X-Forwarded-For and X-Original-User-Agent + * headers being set. + * @param WebRequest|array $originalRequest When in array form, it's + * expected to have the keys 'ip' and 'userAgent'. + * @note IP/user agent is personally identifiable information, and should + * only be set when the privacy policy of the request target is + * compatible with that of the MediaWiki installation. + */ + public function setOriginalRequest( $originalRequest ) { + if ( $originalRequest instanceof WebRequest ) { + $originalRequest = [ + 'ip' => $originalRequest->getIP(), + 'userAgent' => $originalRequest->getHeader( 'User-Agent' ), + ]; + } elseif ( + !is_array( $originalRequest ) + || array_diff( [ 'ip', 'userAgent' ], array_keys( $originalRequest ) ) + ) { + throw new InvalidArgumentException( __METHOD__ . ': $originalRequest must be a ' + . "WebRequest or an array with 'ip' and 'userAgent' keys" ); + } + + $this->reqHeaders['X-Forwarded-For'] = $originalRequest['ip']; + $this->reqHeaders['X-Original-User-Agent'] = $originalRequest['userAgent']; + } } diff --git a/includes/import/ImportStreamSource.php b/includes/import/ImportStreamSource.php index 8034400bad..94a2b937e0 100644 --- a/includes/import/ImportStreamSource.php +++ b/includes/import/ImportStreamSource.php @@ -93,7 +93,7 @@ class ImportStreamSource implements ImportSource { } $fname = $upload['tmp_name']; if ( is_uploaded_file( $fname ) ) { - return ImportStreamSource::newFromFile( $fname ); + return self::newFromFile( $fname ); } else { return Status::newFatal( 'importnofile' ); } @@ -178,6 +178,6 @@ class ImportStreamSource implements ImportSource { $url = wfAppendQuery( $link, $params ); # For interwikis, use POST to avoid redirects. - return ImportStreamSource::newFromURL( $url, "POST" ); + return self::newFromURL( $url, "POST" ); } } diff --git a/includes/import/UploadSourceAdapter.php b/includes/import/UploadSourceAdapter.php index 1f49c8aaf5..ccacbe4a7c 100644 --- a/includes/import/UploadSourceAdapter.php +++ b/includes/import/UploadSourceAdapter.php @@ -57,7 +57,7 @@ class UploadSourceAdapter { * @param string $path * @param string $mode * @param array $options - * @param string $opened_path + * @param string &$opened_path * @return bool */ function stream_open( $path, $mode, $options, &$opened_path ) { diff --git a/includes/import/WikiImporter.php b/includes/import/WikiImporter.php index 06b579a7d9..209970971e 100644 --- a/includes/import/WikiImporter.php +++ b/includes/import/WikiImporter.php @@ -39,6 +39,7 @@ class WikiImporter { private $mNoticeCallback, $mDebug; private $mImportUploads, $mImageBasePath; private $mNoUpdates = false; + private $pageOffset = 0; /** @var Config */ private $config; /** @var ImportTitleFactory */ @@ -54,16 +55,12 @@ class WikiImporter { * @param Config $config * @throws Exception */ - function __construct( ImportSource $source, Config $config = null ) { + function __construct( ImportSource $source, Config $config ) { if ( !class_exists( 'XMLReader' ) ) { throw new Exception( 'Import requires PHP to have been compiled with libxml support' ); } $this->reader = new XMLReader(); - if ( !$config ) { - wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' ); - $config = MediaWikiServices::getInstance()->getMainConfig(); - } $this->config = $config; if ( !in_array( 'uploadsource', stream_get_wrappers() ) ) { @@ -146,6 +143,16 @@ class WikiImporter { $this->mNoUpdates = $noupdates; } + /** + * Sets 'pageOffset' value. So it will skip the first n-1 pages + * and start from the nth page. It's 1-based indexing. + * @param int $nthPage + * @since 1.29 + */ + function setPageOffset( $nthPage ) { + $this->pageOffset = $nthPage; + } + /** * Set a callback that displays notice messages * @@ -383,8 +390,8 @@ class WikiImporter { * @return bool */ public function finishImportPage( $title, $foreignTitle, $revCount, - $sRevCount, $pageInfo ) { - + $sRevCount, $pageInfo + ) { // Update article count statistics (T42009) // The normal counting logic in WikiPage->doEditUpdates() is designed for // one-revision-at-a-time editing, not bulk imports. In this situation it @@ -417,7 +424,7 @@ class WikiImporter { /** * Alternate per-revision callback, for debugging. - * @param WikiRevision $revision + * @param WikiRevision &$revision */ public function debugRevisionHandler( &$revision ) { $this->debug( "Got revision:" ); @@ -562,9 +569,19 @@ class WikiImporter { $keepReading = $this->reader->read(); $skip = false; $rethrow = null; + $pageCount = 0; try { while ( $keepReading ) { $tag = $this->reader->localName; + if ( $this->pageOffset ) { + if ( $tag === 'page' ) { + $pageCount++; + } + if ( $pageCount < $this->pageOffset ) { + $keepReading = $this->reader->next(); + continue; + } + } $type = $this->reader->nodeType; if ( !Hooks::run( 'ImportHandleToplevelXMLTag', [ $this ] ) ) { @@ -670,7 +687,6 @@ class WikiImporter { * @return bool|mixed */ private function processLogItem( $logInfo ) { - $revision = new WikiRevision( $this->config ); if ( isset( $logInfo['id'] ) ) { diff --git a/includes/import/WikiRevision.php b/includes/import/WikiRevision.php index edc3548abd..f6becb9c92 100644 --- a/includes/import/WikiRevision.php +++ b/includes/import/WikiRevision.php @@ -28,86 +28,165 @@ * Represents a revision, log entry or upload during the import process. * This class sticks closely to the structure of the XML dump. * + * @since 1.2 + * * @ingroup SpecialPage */ class WikiRevision { - /** @todo Unused? */ + + /** + * @since 1.17 + * @deprecated in 1.29. Unused. + * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now. + */ public $importer = null; - /** @var Title */ + /** + * @since 1.2 + * @var Title + */ public $title = null; - /** @var int */ + /** + * @since 1.6.4 + * @var int + */ public $id = 0; - /** @var string */ + /** + * @since 1.2 + * @var string + */ public $timestamp = "20010115000000"; /** + * @since 1.2 * @var int - * @todo Can't find any uses. Public, because that's suspicious. Get clarity. */ + * @deprecated in 1.29. Unused. + * @note Introduced in 436a028086fb3f01c4605c5ad2964d56f9306aca, unused there, unused now. + */ public $user = 0; - /** @var string */ + /** + * @since 1.2 + * @var string + */ public $user_text = ""; - /** @var User */ + /** + * @since 1.27 + * @var User + */ public $userObj = null; - /** @var string */ + /** + * @since 1.21 + * @var string + */ public $model = null; - /** @var string */ + /** + * @since 1.21 + * @var string + */ public $format = null; - /** @var string */ + /** + * @since 1.2 + * @var string + */ public $text = ""; - /** @var int */ + /** + * @since 1.12.2 + * @var int + */ protected $size; - /** @var Content */ + /** + * @since 1.21 + * @var Content + */ public $content = null; - /** @var ContentHandler */ + /** + * @since 1.24 + * @var ContentHandler + */ protected $contentHandler = null; - /** @var string */ + /** + * @since 1.2.6 + * @var string + */ public $comment = ""; - /** @var bool */ + /** + * @since 1.5.7 + * @var bool + */ public $minor = false; - /** @var string */ + /** + * @since 1.12.2 + * @var string + */ public $type = ""; - /** @var string */ + /** + * @since 1.12.2 + * @var string + */ public $action = ""; - /** @var string */ + /** + * @since 1.12.2 + * @var string + */ public $params = ""; - /** @var string */ + /** + * @since 1.17 + * @var string + */ public $fileSrc = ''; - /** @var bool|string */ + /** + * @since 1.17 + * @var bool|string + */ public $sha1base36 = false; /** - * @var bool - * @todo Unused? + * @since 1.17 + * @var string */ - public $isTemp = false; - - /** @var string */ public $archiveName = ''; + /** + * @since 1.12.2 + */ protected $filename; - /** @var mixed */ + /** + * @since 1.12.2 + * @var mixed + */ protected $src; - /** @todo Unused? */ + /** + * @since 1.18 + * @var bool + * @todo Unused? + */ + public $isTemp = false; + + /** + * @since 1.18 + * @deprecated 1.29 use Wikirevision::isTempSrc() + * First written to in 43d5d3b682cc1733ad01a837d11af4a402d57e6a + * Actually introduced in 52cd34acf590e5be946b7885ffdc13a157c1c6cf + */ public $fileIsTemp; /** @var bool */ @@ -121,6 +200,7 @@ class WikiRevision { } /** + * @since 1.7 taking a Title object (string before) * @param Title $title * @throws MWException */ @@ -136,6 +216,7 @@ class WikiRevision { } /** + * @since 1.6.4 * @param int $id */ public function setID( $id ) { @@ -143,6 +224,7 @@ class WikiRevision { } /** + * @since 1.2 * @param string $ts */ public function setTimestamp( $ts ) { @@ -151,6 +233,7 @@ class WikiRevision { } /** + * @since 1.2 * @param string $user */ public function setUsername( $user ) { @@ -158,6 +241,7 @@ class WikiRevision { } /** + * @since 1.27 * @param User $user */ public function setUserObj( $user ) { @@ -165,6 +249,7 @@ class WikiRevision { } /** + * @since 1.2 * @param string $ip */ public function setUserIP( $ip ) { @@ -172,6 +257,7 @@ class WikiRevision { } /** + * @since 1.21 * @param string $model */ public function setModel( $model ) { @@ -179,6 +265,7 @@ class WikiRevision { } /** + * @since 1.21 * @param string $format */ public function setFormat( $format ) { @@ -186,6 +273,7 @@ class WikiRevision { } /** + * @since 1.2 * @param string $text */ public function setText( $text ) { @@ -193,6 +281,7 @@ class WikiRevision { } /** + * @since 1.2.6 * @param string $text */ public function setComment( $text ) { @@ -200,6 +289,7 @@ class WikiRevision { } /** + * @since 1.5.7 * @param bool $minor */ public function setMinor( $minor ) { @@ -207,6 +297,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param mixed $src */ public function setSrc( $src ) { @@ -214,15 +305,18 @@ class WikiRevision { } /** + * @since 1.17 * @param string $src * @param bool $isTemp */ public function setFileSrc( $src, $isTemp ) { $this->fileSrc = $src; $this->fileIsTemp = $isTemp; + $this->isTemp = $isTemp; } /** + * @since 1.17 * @param string $sha1base36 */ public function setSha1Base36( $sha1base36 ) { @@ -230,6 +324,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param string $filename */ public function setFilename( $filename ) { @@ -237,6 +332,7 @@ class WikiRevision { } /** + * @since 1.17 * @param string $archiveName */ public function setArchiveName( $archiveName ) { @@ -244,6 +340,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param int $size */ public function setSize( $size ) { @@ -251,6 +348,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param string $type */ public function setType( $type ) { @@ -258,6 +356,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param string $action */ public function setAction( $action ) { @@ -265,6 +364,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @param array $params */ public function setParams( $params ) { @@ -272,6 +372,7 @@ class WikiRevision { } /** + * @since 1.18 * @param bool $noupdates */ public function setNoUpdates( $noupdates ) { @@ -279,6 +380,7 @@ class WikiRevision { } /** + * @since 1.2 * @return Title */ public function getTitle() { @@ -286,6 +388,7 @@ class WikiRevision { } /** + * @since 1.6.4 * @return int */ public function getID() { @@ -293,6 +396,7 @@ class WikiRevision { } /** + * @since 1.2 * @return string */ public function getTimestamp() { @@ -300,6 +404,7 @@ class WikiRevision { } /** + * @since 1.2 * @return string */ public function getUser() { @@ -307,6 +412,7 @@ class WikiRevision { } /** + * @since 1.27 * @return User */ public function getUserObj() { @@ -314,6 +420,7 @@ class WikiRevision { } /** + * @since 1.2 * @return string */ public function getText() { @@ -321,6 +428,7 @@ class WikiRevision { } /** + * @since 1.24 * @return ContentHandler */ public function getContentHandler() { @@ -332,6 +440,7 @@ class WikiRevision { } /** + * @since 1.21 * @return Content */ public function getContent() { @@ -344,6 +453,7 @@ class WikiRevision { } /** + * @since 1.21 * @return string */ public function getModel() { @@ -355,6 +465,7 @@ class WikiRevision { } /** + * @since 1.21 * @return string */ public function getFormat() { @@ -366,6 +477,7 @@ class WikiRevision { } /** + * @since 1.2.6 * @return string */ public function getComment() { @@ -373,6 +485,7 @@ class WikiRevision { } /** + * @since 1.5.7 * @return bool */ public function getMinor() { @@ -380,6 +493,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return mixed */ public function getSrc() { @@ -387,6 +501,7 @@ class WikiRevision { } /** + * @since 1.17 * @return bool|string */ public function getSha1() { @@ -397,6 +512,7 @@ class WikiRevision { } /** + * @since 1.17 * @return string */ public function getFileSrc() { @@ -404,6 +520,7 @@ class WikiRevision { } /** + * @since 1.17 * @return bool */ public function isTempSrc() { @@ -411,6 +528,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return mixed */ public function getFilename() { @@ -418,6 +536,7 @@ class WikiRevision { } /** + * @since 1.17 * @return string */ public function getArchiveName() { @@ -425,6 +544,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return mixed */ public function getSize() { @@ -432,6 +552,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return string */ public function getType() { @@ -439,6 +560,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return string */ public function getAction() { @@ -446,6 +568,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return string */ public function getParams() { @@ -453,6 +576,7 @@ class WikiRevision { } /** + * @since 1.4.1 * @return bool */ public function importOldRevision() { @@ -554,6 +678,10 @@ class WikiRevision { return true; } + /** + * @since 1.12.2 + * @return bool + */ public function importLogItem() { $dbw = wfGetDB( DB_MASTER ); @@ -611,6 +739,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return bool */ public function importUpload() { @@ -682,6 +811,7 @@ class WikiRevision { } /** + * @since 1.12.2 * @return bool|string */ public function downloadSource() { diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php index 661c3ec0b5..32d2634959 100644 --- a/includes/installer/CliInstaller.php +++ b/includes/installer/CliInstaller.php @@ -47,8 +47,6 @@ class CliInstaller extends Installer { ]; /** - * Constructor. - * * @param string $siteName * @param string $admin * @param array $option @@ -110,7 +108,7 @@ class CliInstaller extends Installer { } // Set up the default skins - $skins = $this->findExtensions( 'skins' ); + $skins = array_keys( $this->findExtensions( 'skins' ) ); $this->setVar( '_Skins', $skins ); if ( $skins ) { @@ -180,7 +178,7 @@ class CliInstaller extends Installer { $text = preg_replace( '/(.*?)<\/a>/', '$2 <$1>', $text ); - return html_entity_decode( strip_tags( $text ), ENT_QUOTES ); + return Sanitizer::stripAllTags( $text ); } /** diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php index 030553599f..6c56b3d430 100644 --- a/includes/installer/DatabaseInstaller.php +++ b/includes/installer/DatabaseInstaller.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ use Wikimedia\Rdbms\LBFactorySingle; +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; /** * Base class for DBMS-specific installation helper classes. @@ -334,7 +336,7 @@ abstract class DatabaseInstaller { $services = \MediaWiki\MediaWikiServices::getInstance(); $connection = $status->value; - $services->redefineService( 'DBLoadBalancerFactory', function() use ( $connection ) { + $services->redefineService( 'DBLoadBalancerFactory', function () use ( $connection ) { return LBFactorySingle::newFromConnection( $connection ); } ); } diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php index f8ab1f283e..b832d450ee 100644 --- a/includes/installer/DatabaseUpdater.php +++ b/includes/installer/DatabaseUpdater.php @@ -20,6 +20,8 @@ * @file * @ingroup Deployment */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; use MediaWiki\MediaWikiServices; require_once __DIR__ . '/../../maintenance/Maintenance.php'; @@ -81,6 +83,7 @@ abstract class DatabaseUpdater { FixDefaultJsonContentPages::class, CleanupEmptyCategories::class, AddRFCAndPMIDInterwiki::class, + PopulatePPSortKey::class ]; /** @@ -103,9 +106,7 @@ abstract class DatabaseUpdater { protected $holdContentHandlerUseDB = true; /** - * Constructor - * - * @param Database $db To perform updates on + * @param Database &$db To perform updates on * @param bool $shared Whether to perform updates on shared tables * @param Maintenance $maintenance Maintenance object which created us */ @@ -392,7 +393,7 @@ abstract class DatabaseUpdater { * Writes the schema updates desired to a file for the DB Admin to run. * @param array $schemaUpdate */ - private function writeSchemaUpdateFile( $schemaUpdate = [] ) { + private function writeSchemaUpdateFile( array $schemaUpdate = [] ) { $updates = $this->updatesSkipped; $this->updatesSkipped = []; @@ -425,7 +426,7 @@ abstract class DatabaseUpdater { * * @param array $what What updates to perform */ - public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) { + public function doUpdates( array $what = [ 'core', 'extensions', 'stats' ] ) { $this->db->setSchemaVars( $this->getSchemaVars() ); $what = array_flip( $what ); @@ -924,11 +925,41 @@ abstract class DatabaseUpdater { } elseif ( $this->updateRowExists( $updateKey ) ) { $this->output( "...$field in table $table already modified by patch $patch.\n" ); } else { - $this->insertUpdateRow( $updateKey ); + $apply = $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updateKey ); + } + return $apply; + } + return true; + } - return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" ); + /** + * Modify an existing table, similar to modifyField. Intended for changes that + * touch more than one column on a table. + * + * @param string $table Name of the table to modify + * @param string $patch Name of the patch file to apply + * @param string|bool $fullpath Whether to treat $patch path as relative or not, defaults to false + * @return bool False if this was skipped because of schema changes being skipped + */ + public function modifyTable( $table, $patch, $fullpath = false ) { + if ( !$this->doTable( $table ) ) { + return true; } + $updateKey = "$table-$patch"; + if ( !$this->db->tableExists( $table, __METHOD__ ) ) { + $this->output( "...$table table does not exist, skipping modify table patch.\n" ); + } elseif ( $this->updateRowExists( $updateKey ) ) { + $this->output( "...table $table already modified by patch $patch.\n" ); + } else { + $apply = $this->applyPatch( $patch, $fullpath, "Modifying table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updateKey ); + } + return $apply; + } return true; } diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index f03fe6a3f4..ae80c8bb17 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -134,6 +134,7 @@ abstract class Installer { 'envCheckUploadsDirectory', 'envCheckLibicu', 'envCheckSuhosinMaxValueLength', + 'envCheck64Bit', ]; /** @@ -384,7 +385,7 @@ abstract class Installer { // make sure we use the installer config as the main config $configRegistry = $baseConfig->get( 'ConfigRegistry' ); - $configRegistry['main'] = function() use ( $installerConfig ) { + $configRegistry['main'] = function () use ( $installerConfig ) { return $installerConfig; }; @@ -446,6 +447,9 @@ abstract class Installer { $this->parserTitle = Title::newFromText( 'Installer' ); $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :( $this->parserOptions->setEditSection( false ); + $this->parserOptions->setWrapOutputClass( false ); + // Don't try to access DB before user language is initialised + $this->setParserLanguage( Language::factory( 'en' ) ); } /** @@ -674,7 +678,7 @@ abstract class Installer { try { $out = $wgParser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart ); $html = $out->getText(); - } catch ( DBAccessError $e ) { + } catch ( MediaWiki\Services\ServiceDisabledException $e ) { $html = ' ' . htmlspecialchars( $text ); if ( !empty( $this->debug ) ) { @@ -722,6 +726,7 @@ abstract class Installer { 'ss_good_articles' => 0, 'ss_total_pages' => 0, 'ss_users' => 0, + 'ss_active_users' => 0, 'ss_images' => 0 ], __METHOD__, 'IGNORE' @@ -1013,7 +1018,7 @@ abstract class Installer { } # Try the most common ones. - $commonLocales = [ 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' ]; + $commonLocales = [ 'C.UTF-8', 'en_US.UTF-8', 'en_US.utf8', 'de_DE.UTF-8', 'de_DE.utf8' ]; foreach ( $commonLocales as $commonLocale ) { if ( isset( $candidatesByLocale[$commonLocale] ) ) { $this->setVar( 'wgShellLocale', $commonLocale ); @@ -1077,6 +1082,20 @@ abstract class Installer { return true; } + /** + * Checks if we're running on 64 bit or not. 32 bit is becoming increasingly + * hard to support, so let's at least warn people. + * + * @return bool + */ + protected function envCheck64Bit() { + if ( PHP_INT_SIZE == 4 ) { + $this->showMessage( 'config-using-32bit' ); + } + + return true; + } + /** * Convert a hex string representing a Unicode code point to that code point. * @param string $c @@ -1336,7 +1355,7 @@ abstract class Installer { * Reasonable values for $directory include 'extensions' (the default) and 'skins'. * * @param string $directory Directory to search in - * @return array + * @return array [ $extName => [ 'screenshots' => [ '...' ] ] */ public function findExtensions( $directory = 'extensions' ) { if ( $this->getVar( 'IP' ) === null ) { @@ -1349,7 +1368,7 @@ abstract class Installer { } // extensions -> extension.json, skins -> skin.json - $jsonFile = substr( $directory, 0, strlen( $directory ) -1 ) . '.json'; + $jsonFile = substr( $directory, 0, strlen( $directory ) - 1 ) . '.json'; $dh = opendir( $extDir ); $exts = []; @@ -1358,7 +1377,15 @@ abstract class Installer { continue; } if ( file_exists( "$extDir/$file/$jsonFile" ) || file_exists( "$extDir/$file/$file.php" ) ) { - $exts[] = $file; + // Extension exists. Now see if there are screenshots + $exts[$file] = []; + if ( is_dir( "$extDir/$file/screenshots" ) ) { + $paths = glob( "$extDir/$file/screenshots/*.png" ); + foreach ( $paths as $path ) { + $exts[$file]['screenshots'][] = str_replace( $extDir, "../$directory", $path ); + } + + } } } closedir( $dh ); diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php index 697188ef08..bdaeaca86c 100644 --- a/includes/installer/LocalSettingsGenerator.php +++ b/includes/installer/LocalSettingsGenerator.php @@ -41,8 +41,6 @@ class LocalSettingsGenerator { protected $installer; /** - * Constructor. - * * @param Installer $installer */ public function __construct( Installer $installer ) { @@ -69,7 +67,7 @@ class LocalSettingsGenerator { $db->getGlobalNames() ); - $unescaped = [ 'wgRightsIcon', 'wgLogo' ]; + $unescaped = [ 'wgRightsIcon', 'wgLogo', '_Caches' ]; $boolItems = [ 'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons', @@ -241,7 +239,7 @@ class LocalSettingsGenerator { } if ( !$this->values['wgShellLocale'] ) { - $this->values['wgShellLocale'] = 'en_US.UTF-8'; + $this->values['wgShellLocale'] = 'C.UTF-8'; $locale = '#'; } else { $locale = ''; diff --git a/includes/installer/MssqlInstaller.php b/includes/installer/MssqlInstaller.php index d6efeb2deb..43d3574152 100644 --- a/includes/installer/MssqlInstaller.php +++ b/includes/installer/MssqlInstaller.php @@ -21,6 +21,10 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\DBQueryError; +use Wikimedia\Rdbms\DBConnectionError; + /** * Class for setting up the MediaWiki database using Microsoft SQL Server. * @@ -573,7 +577,7 @@ class MssqlInstaller extends DatabaseInstaller { $grantableNames[] = $dbUser; } catch ( DBQueryError $dqe ) { $this->db->rollback(); - $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() ); + $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() ); } } elseif ( !$this->userExists( $dbUser ) ) { try { @@ -584,7 +588,7 @@ class MssqlInstaller extends DatabaseInstaller { $grantableNames[] = $dbUser; } catch ( DBQueryError $dqe ) { $this->db->rollback(); - $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() ); + $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() ); } } else { $status->warning( 'config-install-user-alreadyexists', $dbUser ); @@ -616,7 +620,7 @@ class MssqlInstaller extends DatabaseInstaller { $this->db->commit(); } catch ( DBQueryError $dqe ) { $this->db->rollback(); - $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() ); + $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getMessage() ); } // Also try to grant SHOWPLAN on the db, but don't fail if we can't // (just makes a couple things in mediawiki run slower since @@ -642,7 +646,7 @@ class MssqlInstaller extends DatabaseInstaller { $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) " . "KEY INDEX si_page ON $schema" ); } catch ( DBQueryError $dqe ) { - $status->fatal( 'config-install-tables-failed', $dqe->getText() ); + $status->fatal( 'config-install-tables-failed', $dqe->getMessage() ); } } diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php index 988ec41ace..b4de44dcfb 100644 --- a/includes/installer/MssqlUpdater.php +++ b/includes/installer/MssqlUpdater.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\DatabaseMssql; + /** * Class for setting up the MediaWiki database using Microsoft SQL Server. * @@ -99,6 +101,9 @@ class MssqlUpdater extends DatabaseUpdater { [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ], [ 'dropIndex', 'oldimage', 'oi_name_archive_name', 'patch-alter-table-oldimage.sql' ], + + // 1.30 + [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], ]; } @@ -112,7 +117,9 @@ class MssqlUpdater extends DatabaseUpdater { /** * General schema update for a table that touches more than one field or requires - * destructive actions (such as dropping and recreating the table). + * destructive actions (such as dropping and recreating the table). NOTE: Usage of + * this function is highly discouraged, use it's successor DatabaseUpdater::modifyTable + * instead. * * @param string $table * @param string $updatekey @@ -125,9 +132,11 @@ class MssqlUpdater extends DatabaseUpdater { } elseif ( $this->updateRowExists( $updatekey ) ) { $this->output( "...$table already had schema updated by $patch.\n" ); } else { - $this->insertUpdateRow( $updatekey ); - - return $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" ); + $apply = $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updatekey ); + } + return $apply; } return true; diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php index 72697739c8..0250b6f9c3 100644 --- a/includes/installer/MysqlInstaller.php +++ b/includes/installer/MysqlInstaller.php @@ -21,6 +21,10 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\DBQueryError; +use Wikimedia\Rdbms\DBConnectionError; + /** * Class for setting up the MediaWiki database using MySQL. * @@ -47,7 +51,7 @@ class MysqlInstaller extends DatabaseInstaller { public $supportedEngines = [ 'InnoDB', 'MyISAM' ]; - public $minimumVersion = '5.0.3'; + public $minimumVersion = '5.5.8'; public $webUserPrivs = [ 'DELETE', @@ -175,8 +179,8 @@ class MysqlInstaller extends DatabaseInstaller { # Determine existing default character set if ( $conn->tableExists( "revision", __METHOD__ ) ) { - $revision = $conn->buildLike( $this->getVar( 'wgDBprefix' ) . 'revision' ); - $res = $conn->query( "SHOW TABLE STATUS $revision", __METHOD__ ); + $revision = $this->escapeLikeInternal( $this->getVar( 'wgDBprefix' ) . 'revision', '\\' ); + $res = $conn->query( "SHOW TABLE STATUS LIKE '$revision'", __METHOD__ ); $row = $conn->fetchObject( $res ); if ( !$row ) { $this->parent->showMessage( 'config-show-table-status' ); @@ -217,6 +221,16 @@ class MysqlInstaller extends DatabaseInstaller { $wgDBpassword = $this->getVar( '_InstallPassword' ); } + /** + * @param string $s + * @return string + */ + protected function escapeLikeInternal( $s, $escapeChar = '`' ) { + return str_replace( [ $escapeChar, '%', '_' ], + [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_" ], + $s ); + } + /** * Get a list of storage engines that are available and supported * @@ -570,7 +584,7 @@ class MysqlInstaller extends DatabaseInstaller { // If we couldn't create for some bizzare reason and the // user probably doesn't exist, skip the grant $this->db->rollback( __METHOD__ ); - $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getText() ); + $status->warning( 'config-install-user-create-failed', $dbUser, $dqe->getMessage() ); } } } else { @@ -590,7 +604,7 @@ class MysqlInstaller extends DatabaseInstaller { $this->db->commit( __METHOD__ ); } catch ( DBQueryError $dqe ) { $this->db->rollback( __METHOD__ ); - $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() ); + $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getMessage() ); } } diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index ff13196b6b..58728a3755 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -294,12 +294,17 @@ class MysqlUpdater extends DatabaseUpdater { [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ], [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ], [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ], + [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ], // 1.29 [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ], [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ], [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ], [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ], + + // 1.30 + [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], + [ 'addTable', 'ip_changes', 'patch-ip_changes.sql' ], ]; } diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php index b8fc4e75d5..14683d6c46 100644 --- a/includes/installer/OracleInstaller.php +++ b/includes/installer/OracleInstaller.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\DBConnectionError; + /** * Class for setting up the MediaWiki database using Oracle. * diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php index 79ae175d53..e262eda635 100644 --- a/includes/installer/OracleUpdater.php +++ b/includes/installer/OracleUpdater.php @@ -285,7 +285,7 @@ class OracleUpdater extends DatabaseUpdater { * * @param array $what */ - public function doUpdates( $what = [ 'core', 'extensions', 'purge', 'stats' ] ) { + public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) { parent::doUpdates( $what ); $this->db->query( 'BEGIN fill_wiki_info; END;' ); diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php index 906768f489..b501cb37fa 100644 --- a/includes/installer/PostgresInstaller.php +++ b/includes/installer/PostgresInstaller.php @@ -21,6 +21,10 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\DBQueryError; +use Wikimedia\Rdbms\DBConnectionError; + /** * Class for setting up the MediaWiki database using Postgres. * diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 1a7b208af0..d8db6a2d9d 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\DatabasePostgres; + /** * Class for handling updates to Postgres databases. * @@ -450,6 +452,9 @@ class PostgresUpdater extends DatabaseUpdater { [ 'addPgIndex', 'externallinks', 'el_from_index_60', '( el_from, el_index_60, el_id )' ], [ 'addPgField', 'user_groups', 'ug_expiry', "TIMESTAMPTZ NULL" ], [ 'addPgIndex', 'user_groups', 'user_groups_expiry', '( ug_expiry )' ], + + // 1.30 + [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], ]; } @@ -749,7 +754,6 @@ END; } protected function setDefault( $table, $field, $default ) { - $info = $this->db->fieldInfo( $table, $field ); if ( $info->defaultValue() !== $default ) { $this->output( "Changing '$table.$field' default value\n" ); diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php index 0fe7068ba0..d60d801bed 100644 --- a/includes/installer/SqliteInstaller.php +++ b/includes/installer/SqliteInstaller.php @@ -21,6 +21,10 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\DatabaseSqlite; +use Wikimedia\Rdbms\DBConnectionError; + /** * Class for setting up the MediaWiki database using SQLLite. * @@ -28,7 +32,8 @@ * @since 1.17 */ class SqliteInstaller extends DatabaseInstaller { - const MINIMUM_VERSION = '3.3.7'; + + public $minimumVersion = '3.3.7'; /** * @var DatabaseSqlite @@ -56,8 +61,8 @@ class SqliteInstaller extends DatabaseInstaller { $result = Status::newGood(); // Bail out if SQLite is too old $db = DatabaseSqlite::newStandaloneInstance( ':memory:' ); - if ( version_compare( $db->getServerVersion(), self::MINIMUM_VERSION, '<' ) ) { - $result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), self::MINIMUM_VERSION ); + if ( version_compare( $db->getServerVersion(), $this->minimumVersion, '<' ) ) { + $result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), $this->minimumVersion ); } // Check for FTS3 full-text search module if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) { @@ -262,8 +267,8 @@ EOT; } /** - * @param $dir - * @param $db + * @param string $dir + * @param string $db * @return Status */ protected function makeStubDBFile( $dir, $db ) { @@ -291,7 +296,7 @@ EOT; } /** - * @param Status $status + * @param Status &$status * @return Status */ public function setupSearchIndex( &$status ) { diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php index dcd66ddeee..1e43d3e7a1 100644 --- a/includes/installer/SqliteUpdater.php +++ b/includes/installer/SqliteUpdater.php @@ -21,6 +21,8 @@ * @ingroup Deployment */ +use Wikimedia\Rdbms\DatabaseSqlite; + /** * Class for handling updates to Sqlite databases. * @@ -163,6 +165,10 @@ class SqliteUpdater extends DatabaseUpdater { [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ], [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ], [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ], + + // 1.30 + [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ], + [ 'addTable', 'ip_changes', 'patch-ip_changes.sql' ], ]; } diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php index c94f0bfaa4..27300f3530 100644 --- a/includes/installer/WebInstaller.php +++ b/includes/installer/WebInstaller.php @@ -130,8 +130,6 @@ class WebInstaller extends Installer { protected $currentPageName; /** - * Constructor. - * * @param WebRequest $request */ public function __construct( WebRequest $request ) { @@ -705,7 +703,7 @@ class WebInstaller extends Installer { "escaped() . "\">" . wfMessage( 'config-help' )->escaped() . "\n" . - "" . $html . "\n" . + "
    " . $html . "
    \n" . "
    \n"; } diff --git a/includes/installer/WebInstallerLanguage.php b/includes/installer/WebInstallerLanguage.php index cfd4a862c2..bce07d3118 100644 --- a/includes/installer/WebInstallerLanguage.php +++ b/includes/installer/WebInstallerLanguage.php @@ -98,17 +98,19 @@ class WebInstallerLanguage extends WebInstallerPage { * @return string */ public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) { - global $wgDummyLanguageCodes; + global $wgExtraLanguageCodes; $output = $helpHtml; $select = new XmlSelect( $name, $name, $selectedCode ); $select->setAttribute( 'tabindex', $this->parent->nextTabIndex() ); + $unwantedLanguageCodes = $wgExtraLanguageCodes + + LanguageCode::getDeprecatedCodeMapping(); $languages = Language::fetchLanguageNames(); ksort( $languages ); foreach ( $languages as $code => $lang ) { - if ( isset( $wgDummyLanguageCodes[$code] ) ) { + if ( isset( $unwantedLanguageCodes[$code] ) ) { continue; } $select->addOption( "$code - $lang", $code ); diff --git a/includes/installer/WebInstallerOptions.php b/includes/installer/WebInstallerOptions.php index 0c01b6457b..07378ab32e 100644 --- a/includes/installer/WebInstallerOptions.php +++ b/includes/installer/WebInstallerOptions.php @@ -107,7 +107,7 @@ class WebInstallerOptions extends WebInstallerPage { $skins = $this->parent->findExtensions( 'skins' ); $skinHtml = $this->getFieldsetStart( 'config-skins' ); - $skinNames = array_map( 'strtolower', $skins ); + $skinNames = array_map( 'strtolower', array_keys( $skins ) ); $chosenSkinName = $this->getVar( 'wgDefaultSkin', $this->parent->getDefaultSkin( $skinNames ) ); if ( $skins ) { @@ -118,12 +118,17 @@ class WebInstallerOptions extends WebInstallerPage { 'value' => $chosenSkinName, ] ); - foreach ( $skins as $skin ) { + foreach ( $skins as $skin => $info ) { + if ( isset( $info['screenshots'] ) ) { + $screenshotText = $this->makeScreenshotsLink( $skin, $info['screenshots'] ); + } else { + $screenshotText = htmlspecialchars( $skin ); + } $skinHtml .= '
    ' . $this->parent->getCheckBox( [ 'var' => "skin-$skin", - 'rawtext' => $skin, + 'rawtext' => $screenshotText, 'value' => $this->getVar( "skin-$skin", true ), // all found skins enabled by default ] ) . '
    ' . $radioButtons[strtolower( $skin )] . '
    ' . @@ -144,7 +149,7 @@ class WebInstallerOptions extends WebInstallerPage { if ( $extensions ) { $extHtml = $this->getFieldsetStart( 'config-extensions' ); - foreach ( $extensions as $ext ) { + foreach ( $extensions as $ext => $info ) { $extHtml .= $this->parent->getCheckBox( [ 'var' => "ext-$ext", 'rawtext' => $ext, @@ -246,6 +251,31 @@ class WebInstallerOptions extends WebInstallerPage { return null; } + private function makeScreenshotsLink( $name, $screenshots ) { + global $wgLang; + if ( count( $screenshots ) > 1 ) { + $links = []; + $counter = 1; + foreach ( $screenshots as $shot ) { + $links[] = Html::element( + 'a', + [ 'href' => $shot ], + $wgLang->formatNum( $counter++ ) + ); + } + return wfMessage( 'config-skins-screenshots' ) + ->rawParams( $name, $wgLang->commaList( $links ) ) + ->escaped(); + } else { + $link = Html::element( + 'a', + [ 'href' => $screenshots[0] ], + wfMessage( 'config-screenshot' )->text() + ); + return wfMessage( 'config-skins-screenshot', $name )->rawParams( $link )->escaped(); + } + } + /** * @return string */ @@ -345,7 +375,7 @@ class WebInstallerOptions extends WebInstallerPage { * @return bool */ public function submitSkins() { - $skins = $this->parent->findExtensions( 'skins' ); + $skins = array_keys( $this->parent->findExtensions( 'skins' ) ); $this->parent->setVar( '_Skins', $skins ); if ( $skins ) { @@ -398,7 +428,7 @@ class WebInstallerOptions extends WebInstallerPage { $this->setVar( 'wgRightsIcon', '' ); } - $skinsAvailable = $this->parent->findExtensions( 'skins' ); + $skinsAvailable = array_keys( $this->parent->findExtensions( 'skins' ) ); $skinsToInstall = []; foreach ( $skinsAvailable as $skin ) { $this->parent->setVarsFromRequest( [ "skin-$skin" ] ); @@ -419,7 +449,7 @@ class WebInstallerOptions extends WebInstallerPage { $retVal = false; } - $extsAvailable = $this->parent->findExtensions(); + $extsAvailable = array_keys( $this->parent->findExtensions() ); $extsToInstall = []; foreach ( $extsAvailable as $ext ) { $this->parent->setVarsFromRequest( [ "ext-$ext" ] ); diff --git a/includes/installer/i18n/ar.json b/includes/installer/i18n/ar.json index 84c580f796..69d1fcf8a7 100644 --- a/includes/installer/i18n/ar.json +++ b/includes/installer/i18n/ar.json @@ -52,6 +52,7 @@ "config-restart": "نعم، إعادة التشغيل", "config-welcome": "=== التحقق من البيئة ===\nسوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.", "config-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من إختيارك)\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن دون أية ضمانات؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nأنظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك إستملت نسخة عن رخصة جنو العامة مع هذا البرنامج؛ اذا لم تقعل إكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن MA 02110-1301 الولايات المتخدة أو [http://www.gnu.org/copyleft/gpl.html read it online].", + "config-sidebar": "* [https://www.mediawiki.org موقع ميدياويكي]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents دليل المستخدم]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents دليل الإداري]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ الأسئلة المتكررة]\n----\n* إقراءني\n* ملاحظات الإصدار\n* النسخ\n* الترقية", "config-env-good": "جرى التحقق من البيئة. يمكنك تنصيب ميدياويكي.", "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.", "config-env-php": "بي إتش بي $1 مثبت.", @@ -113,7 +114,7 @@ "config-postgres-old": "PostgreSQL $1 أو لاحق مطلوب. لديك $2.", "config-mssql-old": "خادم Microsoft SQL $1 أو لاحق مطلوب. لديك $2.", "config-sqlite-mkdir-error": "خطأ في إنشاء دليل البيانات \"$1\". تحقق من الموقع وحاول مرة أخرى.", - "config-sqlite-connection-error": "1$.\nتحقق من اسم دليل البيانات وقواعد البيانات أدناه وحاول مرة أخرى.", + "config-sqlite-connection-error": "$1.\nتحقق من اسم دليل البيانات وقواعد البيانات أدناه وحاول مرة أخرى.", "config-sqlite-readonly": "الملف $1 غير قابل للكتابة.", "config-sqlite-cant-create-db": "لا يمكن إنشاء ملف قاعدة البيانات $1.", "config-can-upgrade": "هناك جداول ميدياويكي في قاعدة البيانات هذه. للارتقاء بها إلى ميدياويكي $1; انقر على متابعة.", @@ -164,7 +165,7 @@ "config-optional-continue": "اسألني المزيد من الأسئلة", "config-optional-skip": "إنني أشعر بالملل بالفعل، فقط قم بتثبيت الويكي", "config-profile": "ملف صلاحيات المستخدم:", - "config-profile-wiki": "افتح ويكي", + "config-profile-wiki": "ويكي مفتوحة", "config-profile-no-anon": "إنشاء الحساب مطلوب", "config-profile-fishbowl": "المحررون المخولون فقط", "config-profile-private": "ويكي خاص", @@ -187,7 +188,7 @@ "config-email-watchlist": "تمكين إشعارات قائمة المراقبة", "config-email-watchlist-help": "السماح للمستخدمين بالحصول على إشعارات حول صفحاتهم المراقبة إذا كانوا قد مكنوها في تفضيلاتهم.", "config-email-auth": "تمكين مصادقة البريد الإلكتروني", - "config-email-sender": "يرجع عنوان البريد الإلكتروني:", + "config-email-sender": "عنوان البريد الإلكتروني المُرسِل:", "config-upload-settings": "الصور وتحميل الملفات", "config-upload-enable": "تمكين تحميل الملفات", "config-upload-deleted": "المجلد للملفات المحذوفة:", @@ -198,15 +199,17 @@ "config-cc-not-chosen": "اختر أي ترخيص تريده ثم اضغط على \"متابعة\".", "config-advanced-settings": "ضبط متقدم", "config-cache-options": "إعدادات التخزين المؤقت الكائن:", - "config-cache-none": "لا يوجد تخزين مؤقت (لم تتم إزالة أية وظيفة، لكن قد تتأثر السرعة على مواقع ويكي أكبر)", + "config-cache-none": "لا يوجد تخزين مؤقت (هذا لا يزيل أية وظيفة، لكن قد تتأثر السرعة على مواقع الويكي الكبيرة)", "config-cache-accel": "كائن التخزين المؤقت PHP (APC أو APCu أو XCache أو WinCache)", + "config-cache-memcached": "استخدم Memcached (يتطلب إعدادت إضافية)", + "config-memcached-servers": "خوادم Memcached:", "config-extensions": "امتدادات", "config-extensions-help": "تم الكشف عن الملحقات المذكورة أعلاه في دليل ./ملحقاتك، ويمكن أن يتطلب تكوينا إضافيا، ولكن يمكنك تمكينها الآن.", "config-skins": "الواجهات", "config-skins-use-as-default": "استخدم هذه الواجهة كافتراضية", "config-install-alreadydone": "تحذير: يبدو أنك قد قمت بالفعل بتثبيت ميدياويكي وتحاول تثبيته مرة أخرى. الرجاء التوجه إلى الصفحة التالية.", "config-install-begin": "عن طريق الضغط على \"{{int:config-continue}}\"، سوف تبدأ تثبيت ميدياويكي. إذا كنت لا تزال ترغب في إجراء تغييرات، اضغط على \"{{int:config-back}}\".", - "config-install-step-done": "نفذ", + "config-install-step-done": "تم بنجاح", "config-install-step-failed": "فشل", "config-install-extensions": "متضمنا الامتدادات", "config-install-database": "إنشاء قاعدة البيانات", @@ -237,12 +240,16 @@ "config-install-subscribe-fail": "غير قادر على الاشتراك في ميدياويكي-إعلان: $1", "config-install-subscribe-notpossible": "لم يتم تثبيت cURL و allow_url_fopen غير متوفر.", "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي", + "config-install-mainpage-exists": "الصفحة الرئيسية موجودة بالفعل، تم تجاهل هذا الأمر", "config-install-extension-tables": "إنشاء جداول للامتدادات المفعلة", "config-install-mainpage-failed": "لم يتمكن من إدراج الصفحة الرئيسية: $1", + "config-install-done": "مبروك!\nلقد قمت بتثبيت ميدياوكي.\n\nقام المثبت بتوليد ملف LocalSettings.php.\nيحتوي هذا الملف على كل تضبيطاتك.\n\nسيتطلب تشغيل الويكي منك تنزيل هذا الملف ووضعه في مجلد التثبيت الخاص بالويكي (نفس المجلد المحتوي على index.php). سيبدأ التنزيل تلقائيا.\n\nلو لم يُعرض عليك التنزيل أو قمت أنت بالغائه، يمكنك تنزيله بالضغط على الوصلة أدناه:\n\n$3\n\nتنبيه: لو لم تقم بهذا الآن، لن يكن ملف الضبط متاحا لك لاحقا إذا غادرت التثبيت بدون تنزيله.\n\nعندما تنتهي من وضع الملف بمكانه، يمكنك [$2 دخول الويكي].", + "config-install-done-path": "مبروك!\nلقد قمت بتثبيت ميدياوكي.\n\nقام المثبت بتوليد ملف LocalSettings.php.\nيحتوي هذا الملف على كل تضبيطاتك.\n\nسيتطلب تشغيل الويكي منك تنزيل هذا الملف ووضعه في $4 (نفس المجلد المحتوي على index.php). سيبدأ التنزيل تلقائيا.\n\nلو لم يُعرض عليك التنزيل أو قمت أنت بالغائه، يمكنك تنزيله بالضغط على الوصلة أدناه:\n\n$3\n\nتنبيه: لو لم تقم بهذا الآن، لن يكن ملف الضبط متاحا لك لاحقا إذا غادرت التثبيت بدون تنزيله.\n\nعندما تنتهي من وضع الملف بمكانه، يمكنك [$2 دخول الويكي]
    .", "config-download-localsettings": "تنزيل LocalSettings.php", "config-help": "مساعدة", "config-help-tooltip": "اضغط للتوسيع", "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": "تم تثبيت ميدياويكي بنجاح.", "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 القائمة البريدية الخاصة بإصدار ميدياويكي]" } diff --git a/includes/installer/i18n/ast.json b/includes/installer/i18n/ast.json index d47334cca9..1b2831fa0b 100644 --- a/includes/installer/i18n/ast.json +++ b/includes/installer/i18n/ast.json @@ -107,10 +107,30 @@ "config-db-schema-help": "Esti esquema de vezu va tar bien.\nCamúdalos solo si sabes que lo precises.", "config-pg-test-error": "Nun puede coneutase cola base de datos $1: $2", "config-sqlite-dir": "Direutoriu de datos SQLite:", + "config-oracle-def-ts": "Espaciu de tables predetermináu:", + "config-oracle-temp-ts": "Espaciu de tables temporal:", "config-type-mysql": "MySQL (o compatible)", "config-type-mssql": "Microsoft SQL Server", + "config-support-info": "MediaWiki ye compatible colos siguientes sistemes de bases de datos:\n\n$1\n\nSi nun atopes na llista el sistema de base de datos que tas intentando utilizar, sigue les instrucciones enllazaes enriba p'activar la compatibilidá.", + "config-header-mysql": "Configuración de MySQL", + "config-header-postgres": "Configuración de PostgreSQL", + "config-header-sqlite": "Configuración de SQLite", + "config-header-oracle": "Configuración d'Oracle", + "config-header-mssql": "Configuración de Microsoft SQL Server", "config-invalid-db-type": "Triba non válida de base de datos.", "config-missing-db-name": "Tienes d'introducir un valor pa «{{int:config-db-name}}».", + "config-missing-db-host": "Tienes d'escribir un valor pa «{{int:config-db-host}}».", + "config-missing-db-server-oracle": "Tienes d'escribir un valor pa «{{int:config-db-host-oracle}}».", + "config-invalid-db-server-oracle": "TNS inválidu pa la base de datos «$1».\nUsa una cadena «TNS Name» o «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomenclatura d'Oracle]).", + "config-invalid-db-name": "Nome inválidu de la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).", + "config-invalid-db-prefix": "Prefixu inválidu pa la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).", + "config-connection-error": "$1.\n\nComprueba'l sirvidor, el nome d'usuariu y la contraseña, y tenta nuevamente.", + "config-invalid-schema": "Esquema inválidu «$1» pa MediaWiki.\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9) y guiones baxos (_).", + "config-db-sys-create-oracle": "L'instalador sólo almite l'emplegu d'una cuenta SYSDBA pa crear una cuenta nueva.", + "config-db-sys-user-exists-oracle": "La cuenta d'usuariu «$1» yá esiste. ¡SYSDBA sólo puede utilizase pa crear una nueva cuenta!", + "config-postgres-old": "Ríquese PostgreSQL $1 o posterior. Tienes la versión $2.", + "config-mssql-old": "Ríquese Microsoft SQL Server $1 o posterior. Tienes la versión $2.", + "config-sqlite-name-help": "Escueye'l nome qu'identifica la to wiki.\nNun uses espacios o guiones.\nEsti va usase como nome del ficheru de datos pa SQLite.", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", "config-mysql-utf8": "UTF-8", diff --git a/includes/installer/i18n/ba.json b/includes/installer/i18n/ba.json index 606b97bc02..909a1a2ea9 100644 --- a/includes/installer/i18n/ba.json +++ b/includes/installer/i18n/ba.json @@ -226,7 +226,7 @@ "config-license-help": "Күпселек дөйөм ҡулланыуҙағы викиҙар үҙ материалдарын [http://freedomdefined.org/Definition/Ru ирекле лицензия] шарттарында файҙаланыуға рөхсәт бирә.\nБыл берҙәмлек тойғоһон булдыррыға ярҙам итә, ҡатнашыу ваҡытын оҙайтыуға дәртләндерә. Әммә шәхси йәки корпоратив викиҙар өсөн бындай ихтыяж юҡ. \n\nӘгәр һеҙ Википедия текстарын файҙаланырға йәки Википедияға үҙ викиғыҙҙан текстар күсереү мөмкинлеге булыуын теләһәгеҙ, \n{{int:config-license-cc-by-sa}} һайлағыҙ.\nВикипедия элек GNU Free Documentation License лицензияһын файҙалана ине.\nGFDL файҙаланыла ала, әммә ул аңлау өсөн ҡатмарлы һәм материалдарҙы ҡабатлап ҡулланыуҙы ауырлаштыра.", "config-email-settings": "Электрон почта көйләүҙәре", "config-enable-email": "e-mail сығыусы почтаны рәхсәт итергә", - "config-enable-email-help": "Электрон почта эшләһен өсөн [http://www.php.net/manual/ru/mail.configuration.php PHP көйләүҙәрен] башҡарырға кәрәк.\nӘгәр электорон поста мөмкинлектәре кәрәкмәһә, һүндерергә була.", + "config-enable-email-help": "Электрон почта эшләһен өсөн, [http://www.php.net/manual/ru/mail.configuration.php PHP көйләүҙәрен] башҡарырға кәрәк.\nӘгәр электрон почта мөмкинлектәре кәрәкмәһә, һүндерергә була.", "config-email-user": "Ҡатнашыусынан ҡатнашыусыға почтаны рөхсәт итергә", "config-email-user-help": "Әгәр профилдә тейешле көйләү булһа, бөтә ҡатнашыусыларға электрон хат ебәрергә рөхсәт итергә.", "config-email-usertalk": "Ҡулланыусыларҙы уларҙың фекерләшеү битендәге хәбәрҙәр хаҡында белдереүҙәрҙе файҙаланыу", @@ -234,7 +234,7 @@ "config-email-watchlist": "Күҙәтеү исемлеген үҙгәртеү хаҡында электрон почтаға белдереү ебәрергә", "config-email-watchlist-help": "Ҡулланыусылар үҙ көйләүҙәрендә рөхсәт бирһә, уларға фекерләү биттәрендәге үҙгәрештәр хаҡында белдереүҙәр алырға рөхсәт итеү.", "config-email-auth": "Электрон почта аша аутентификация (ҡулланыусы тәҡдим иткән идентификаторҙы тикшереү) үткәреү", - "config-email-auth-help": "Был опция ҡабыҙырған булһа, ҡатнашыусылар үҙ адресын раҫлап e-mail адресындағы һылтанма буйынса күсергә тейеш. Электорон йәшникте алыштырған осраҡта раҫлау талап ителә.Тик почта йәшниге раҫланған ҡатнашыусылар ғына хат ала.\nБыл опцияны почтаны урынһыҙ ҡулланыуҙарҙы булдырмаҫ өсөн ҡулланырға \"тәҡдим\" ителә.", + "config-email-auth-help": "Был опция ҡабыҙылған булһа, ҡатнашыусылар үҙ адресын раҫлап, e-mail адресындағы һылтанма буйынса күсергә тейеш. Электрон йәшникте алыштырған осраҡта раҫлау талап ителә.Тик почта йәшнигенә раҫланған ҡатнашыусылар ғына хат ала.\nБыл опцияны почтаны урынһыҙ ҡулланыуҙарҙы булдырмаҫ өсөн ҡулланырға \"тәҡдим\" ителә.", "config-email-sender": "Электрон почта адресығыҙ", "config-email-sender-help": "Баһалама алыу өсөн электрон почта адресын яҙығыҙ. Унда кире ҡағылған баһаламалар ебәреләсәк.Почта серверы домен исемен дөрөҫ яҙыуҙы талап ите.", "config-upload-settings": "Рәсем-һүрәттәрҙе һәм файлдарҙы тултырыу", diff --git a/includes/installer/i18n/be-tarask.json b/includes/installer/i18n/be-tarask.json index 1335b9c528..0485951802 100644 --- a/includes/installer/i18n/be-tarask.json +++ b/includes/installer/i18n/be-tarask.json @@ -316,6 +316,7 @@ "config-help-tooltip": "націсьніце, каб разгарнуць", "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 матрыцу пашырэньняў], каб пабачыць поўны сьпіс.", + "config-skins-screenshots": "$1 (здымкі экрану: $2)", "mainpagetext": "MediaWiki была ўсталяваная.", "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/Special:MyLanguage/Manual:FAQ Частыя пытаньні 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 Даведайцеся, як змагацца з спамам у вашай вікі]" } diff --git a/includes/installer/i18n/bg.json b/includes/installer/i18n/bg.json index b950420c32..6ecb874b29 100644 --- a/includes/installer/i18n/bg.json +++ b/includes/installer/i18n/bg.json @@ -45,22 +45,22 @@ "config-help-restart": "Необходимо е потвърждение за изтриване на всички въведени и съхранени данни и започване отначало на процеса по инсталация.", "config-restart": "Да, започване отначало", "config-welcome": "=== Проверка на условията ===\nЩе бъдат извършени основни проверки, които да установят дали условията са подходящи за инсталиране на МедияУики.\nАко е необходима помощ по време на инсталацията, резултатите от направените проверки трябва също да бъдат предоставени.", - "config-copyright": "=== Авторски права и условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 2 или по-късна версия.\n\nТази програма се разпространява с надеждата, че ще е полезна, но без каквито и да е гаранции; без дори косвена гаранция за продаваемост или прогодност за конкретна употреба .\nЗа повече подробности се препоръчва преглеждането на Общия публичен лиценз на GNU.\n\nКъм програмата трябва да е приложено копие на Общия публичен лиценз на GNU; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, или да [http://www.gnu.org/copyleft/gpl.html го прочетете онлайн].", + "config-copyright": "=== Авторски права и условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 2 или по-късна версия.\n\nТази програма се разпространява с надеждата, че ще е полезна, но без каквито и да е гаранции; без дори косвена гаранция за продаваемост или пригодност за конкретна употреба .\nЗа повече подробности се препоръчва преглеждането на Общия публичен лиценз на GNU.\n\nКъм програмата трябва да е приложено копие на Общия публичен лиценз на GNU; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, или да [http://www.gnu.org/copyleft/gpl.html го прочетете онлайн].", "config-sidebar": "* [https://www.mediawiki.org Сайт на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Наръчник на потребителя]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Наръчник на администратора]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ]\n----\n* Документация\n* Бележки за версията\n* Авторски права\n* Обновяване", "config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.", "config-env-bad": "Средата беше проверена.\nНе е възможна инсталация на МедияУики.", "config-env-php": "Инсталирана е версия на PHP $1.", "config-env-hhvm": "HHVM $1 е инсталиран.", "config-unicode-using-intl": "Използване на разширението [http://pecl.php.net/intl intl PECL] за нормализация на Уникод.", - "config-unicode-pure-php-warning": "'''Предупреждение''': [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].", - "config-unicode-update-warning": "'''Предупреждение''': Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова верия], в случай че сте загрижени за използването на Unicode.", + "config-unicode-pure-php-warning": "Внимание: [http://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е запознаването с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].", + "config-unicode-update-warning": "Предупреждение: Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова версия], в случай че сте загрижени за използването на Unicode.", "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на ./configure --with-mysqli.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула php5-mysql.", - "config-outdated-sqlite": "Предупреждение: имате инсталиран SQLite $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.", + "config-outdated-sqlite": "Внимание: имате инсталиран SQLite $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.", "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.", "config-pcre-old": "Фатална грешка: Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].", "config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.", "config-memory-raised": "memory_limit на PHP е $1, увеличаване до $2.", - "config-memory-bad": "Предупреждение: memory_limit на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!", + "config-memory-bad": "Внимание: memory_limit на PHP е $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] е инсталиран", @@ -77,7 +77,7 @@ "config-no-cli-uri": "Внимание: Не е зададен параметър --scriptpath, стойност по подразбиране: $1.", "config-using-server": "Използване на сървърното име \"$1\".", "config-using-uri": "Използване на сървърния адрес (URL) \"$1$2\".", - "config-uploads-not-safe": "'''Предупреждение:''' Папката по подразбиране за качване $1 е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.", + "config-uploads-not-safe": "Внимание: Папката по подразбиране за качване $1 е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.", "config-no-cli-uploads-check": "Предупреждение: Директорията по подразбиране за качване на файлове ($1) не е проверена за уязвимости при изпълнение на произволен скрипт по време на инсталацията от командния ред.", "config-brokenlibxml": "Вашата система използва комбинация от версии на PHP и libxml2, които са с много грешки и могат да причинят скрити повреди на данните в МедияУики или други уеб приложения.\nНеобходимо е обновяване до libxml2 2.7.3 или по-нова версия ([https://bugs.php.net/bug.php?id=45996 докладвана грешка при PHP]).\nИнсталацията беше прекратена.", "config-suhosin-max-value-length": "Suhosin е инсталиран и ограничава дължината GET параметъра length на $1 байта. Компонентът на МедияУики ResourceLoader ще може да пренебрегне частично това ограничение, но това ще намали производителността. По възможност е препоръчително да се настрои suhosin.get.max_value_length на 1024 или по-голяма стойност в php.ini и в LocalSettings.php да се настрои $wgResourceLoaderMaxQueryLength със същата стойност.", @@ -90,6 +90,7 @@ "config-db-name": "Име на базата от данни:", "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.", "config-db-name-oracle": "Схема на базата от данни:", + "config-db-account-oracle-warn": "Има три поддържани сценария за инсталиране на Oracle като бекенд база данни:\n\nАко искате да създадете профил в базата данни като част от процеса на инсталиране, моля, посочете профил със SYSDBA като профил в базата данни за инсталиране и посочете желаните данни за влизане (име и парола) за профил с уеб достъп; в противен случай можете да създадете профил с уеб достъп ръчно и предоставите само него (ако той има необходимите права за създаване на схематични обекти), или да предоставите два различни профила - един с привилегии за създаване на обекти, и друг - с ограничения за уеб достъп.\n\nСкрипт за създаването на профил с необходимите привилегии може да се намери в папката „maintenance/oracle/“ на тази инсталация. Имайте в предвид, че използването на ограничен профил ще деактивира всички възможности за обслужване на профила по подразбиране.", "config-db-install-account": "Потребителска сметка за инсталацията", "config-db-username": "Потребителско име за базата от данни:", "config-db-password": "Парола за базата от данни:", @@ -107,7 +108,7 @@ "config-db-schema-help": "Схемата по-горе обикновено е коректна.\nПромени се извършват ако наистина е необходимо.", "config-pg-test-error": "Невъзможно свързване с базата данни '''$1''': $2", "config-sqlite-dir": "Директория за данни на SQLite:", - "config-sqlite-dir-help": "SQLite съхранява всички данни в един файл.\n\nПо време на инсталацията уеб сървърът трябва да има права за писане в посочената директория.\n\nТя '''не трябва''' да е достъпна през уеб, затова не е там, където са PHP файловете.\n\nИнсталаторът ще съхрани заедно с нея файл .htaccess, но ако този метод пропадне, някой може да придобие даостъп до суровите данни от базата от данни.\nТова включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.\n\nБазата от данни е препоръчително да се разположи на друго място, например в /var/lib/mediawiki/yourwiki.", + "config-sqlite-dir-help": "SQLite съхранява всички данни в един файл.\n\nПо време на инсталацията уеб сървърът трябва да има права за писане в посочената директория.\n\nТя не трябва да е достъпна през уеб, затова не е там, където са PHP файловете.\n\nИнсталаторът ще съхрани заедно с нея файл .htaccess, но ако този метод пропадне, някой може да придобие достъп до суровите данни от базата от данни.\nТова включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.\n\nБазата от данни е препоръчително да се разположи на друго място, например в /var/lib/mediawiki/yourwiki.", "config-oracle-def-ts": "Таблично пространство по подразбиране:", "config-oracle-temp-ts": "Временно таблично пространство:", "config-type-mysql": "MySQL (или съвместима)", @@ -128,25 +129,25 @@ "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“.\nИзползвайте „TNS Name“ или „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи за именуване на Oracle])", - "config-invalid-db-name": "Невалидно име на базата от данни \"$1\".\nИзползват се само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", - "config-invalid-db-prefix": "Невалидна представка за базата от данни \"$1\".\nПозволени са само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", + "config-invalid-db-name": "Невалидно име на базата от данни „$1“.\nИзползват се само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", + "config-invalid-db-prefix": "Невалидна представка за базата от данни „$1“.\nПозволени са само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", "config-connection-error": "$1.\n\nНеобходимо е да се проверят хостът, потребителското име и паролата, след което да се опита отново.", - "config-invalid-schema": "Невалидна схема за МедияУики \"$1\".\nДопустими са само ASCII букви (a-z, A-Z), цифри (0-9) и долни черти (_).", + "config-invalid-schema": "Невалидна схема за МедияУики „$1“.\nДопустими са само ASCII букви (a-z, A-Z), цифри (0-9) и долни черти (_).", "config-db-sys-create-oracle": "Инсталаторът поддържа само сметка SYSDBA за създаване на нова сметка.", - "config-db-sys-user-exists-oracle": "Потребителската сметка \"$1\" вече съществува. SYSDBA може да се използва само за създаване на нова сметка!", + "config-db-sys-user-exists-oracle": "Потребителската сметка „$1“ вече съществува. SYSDBA може да се използва само за създаване на нова сметка!", "config-postgres-old": "Изисква се PostgreSQL $1 или по-нова версия, наличната версия е $2.", "config-mssql-old": "Изисква се Microsoft SQL Server версия $1 или по-нова. Вашата версия е $2.", "config-sqlite-name-help": "Избира се име, което да идентифицира уикито.\nНе се използват интервали или тирета.\nТова име ще се използва за име на файла за данни на SQLite.", - "config-sqlite-parent-unwritable-group": "Дикректорията за данни $1 не може да бъде създадена, тъй като уеб сървърът няма права за писане в родителската директория $2.\n\nИнсталаторът разпознава потребителското име, с което работи уеб сървърът.\nУверете се, че той притежава права за писане в директорията $3 преди да продължите.\nВ Unix/Линукс системи можете да използвате:\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", - "config-sqlite-parent-unwritable-nogroup": "Дикректорията за данни $1 не може да бъде създадена, тъй като уеб сървърът няма права за писане в родителската директория $2.\n\nИнсталаторът не може да определи потребителското име, с което работи уеб сървърът.\nУверете се, че в директория $3 може да бъде писано от уебсървъра (или от други потребители!) преди да продължите.\nНа Unix/Линукс системи можете да използвате:\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", - "config-sqlite-mkdir-error": "Грешка при създаване на директорията за данни \"$1\".\nПроверете местоположението ѝ и опитайте отново.", - "config-sqlite-dir-unwritable": "Уебсървърът няма права за писане в директория \"$1\".\nПроменете правата му така, че да може да пише в нея, и опитайте отново.", + "config-sqlite-parent-unwritable-group": "Директорията за данни $1 не може да бъде създадена, тъй като уеб сървърът няма права за писане в родителската директория $2.\n\nИнсталаторът разпознава потребителското име, с което работи уеб сървърът.\nУверете се, че той притежава права за писане в директорията $3 преди да продължите.\nВ Unix/Линукс системи можете да използвате:\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", + "config-sqlite-parent-unwritable-nogroup": "Директорията за данни $1 не може да бъде създадена, тъй като уеб сървърът няма права за писане в родителската директория $2.\n\nИнсталаторът не може да определи потребителското име, с което работи уеб сървърът.\nУверете се, че в директория $3 може да бъде писано от уеб сървъра (или от други потребители!) преди да продължите.\nНа Unix/Линукс системи можете да използвате:\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", + "config-sqlite-mkdir-error": "Грешка при създаване на директорията за данни „$1“.\nПроверете местоположението ѝ и опитайте отново.", + "config-sqlite-dir-unwritable": "Уеб сървърът няма права за писане в директория „$1“.\nПроменете правата му така, че да може да пише в нея, и опитайте отново.", "config-sqlite-connection-error": "$1.\n\nПроверете директорията за данни и името на базата от данни по-долу и опитайте отново.", "config-sqlite-readonly": "Файлът $1 няма права за писане.", "config-sqlite-cant-create-db": "Файлът за базата от данни $1 не може да бъде създаден.", - "config-sqlite-fts3-downgrade": "Липсва поддръжката на FTS3 за PHP, извършен беше downgradе на таблиците", - "config-can-upgrade": "В базата от данни има таблици за МедияУики.\nЗа надграждането им за MediaWiki $1, натиска се '''Продължаване'''.", - "config-upgrade-done": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].\n\nАко е необходимо, възможно е файлът LocalSettings.php да бъде създаден отново чрез натискане на бутона по-долу.\nТова '''не е препоръчително действие''', освен ако не срещате затруднения с уикито.", + "config-sqlite-fts3-downgrade": "Липсва поддръжката на FTS3 за PHP, извършен беше downgradе на таблиците.", + "config-can-upgrade": "В базата от данни има таблици за МедияУики.\nЗа надграждането им за MediaWiki $1, натиска се Продължаване.", + "config-upgrade-done": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].\n\nАко е необходимо, възможно е файлът LocalSettings.php да бъде създаден отново чрез натискане на бутона по-долу.\nТова не е препоръчително действие, освен ако не срещате затруднения с уикито.", "config-upgrade-done-no-regenerate": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].", "config-regenerate": "Създаване на LocalSettings.php →", "config-show-table-status": "Заявката SHOW TABLE STATUS не сполучи!", @@ -154,18 +155,18 @@ "config-db-web-account": "Сметка за уеб достъп до базата от данни", "config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.", "config-db-web-account-same": "Използване на същата сметка като при инсталацията.", - "config-db-web-create": "Създаване на сметката ако все още не съществува", + "config-db-web-create": "Създаване на сметката, ако все още не съществува", "config-db-web-no-create-privs": "Посочената сметка за инсталацията не разполага с достатъчно права за създаване на нова сметка.\nНеобходимо е посочената сметка вече да съществува.", "config-mysql-engine": "Хранилище на данни:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", - "config-mysql-myisam-dep": "'''Предупреждение''': Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.", + "config-mysql-myisam-dep": "Внимание: Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.", "config-mysql-only-myisam-dep": "Внимание: MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.", - "config-mysql-engine-help": "'''InnoDB''' почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n'''MyISAM''' може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.", - "config-mysql-charset": "Набор от символи в базата от данни:", - "config-mysql-binary": "Бинарен", + "config-mysql-engine-help": "InnoDB почти винаги е най-добрата възможност заради навременната си поддръжка.\n\nMyISAM може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.", + "config-mysql-charset": "Набор от знаци на базата от данни:", + "config-mysql-binary": "Двоичен", "config-mysql-utf8": "UTF-8", - "config-mysql-charset-help": "В '''бинарен режим''' МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от символи в Уникод.\n\nВ '''UTF-8 режим''' MySQL ще знае в кой набор от символи са данните от уикито и ще може да ги показва и променя по подходящ начин, но няма да позволява складиране на символи извън [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основния многоезичен набор].", + "config-mysql-charset-help": "В двоичен режим МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от символи в Уникод.\n\nВ UTF-8 режим MySQL ще знае в кой набор от символи са данните от уикито и ще може да ги показва и променя по подходящ начин, но няма да позволява складиране на символи извън [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основния многоезичен набор].", "config-mssql-auth": "Тип на удостоверяването:", "config-mssql-install-auth": "Изберете начин за удостоверяване, който ще бъде използван за връзка с базата от данни по време на инсталацията.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.", "config-mssql-web-auth": "Изберете начина за удостоверяване, който ще се използва от уеб сървъра за връзка със сървъра за бази от данни по време на нормалните операции на уикито.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.", @@ -180,22 +181,22 @@ "config-ns-other": "Друго (уточняване)", "config-ns-other-default": "МоетоУики", "config-project-namespace-help": "Следвайки примера на Уикипедия, много уикита съхраняват страниците си с правила в '''именно пространство на проекта''', отделно от основното съдържание.\nВсички заглавия на страниците в това именно пространство започват с определена представка, която може да бъде зададена тук.\nОбикновено представката произлиза от името на уикито, но не може да съдържа символи като \"#\" или \":\".", - "config-ns-invalid": "Посоченото именно пространство \"$1\" е невалидно.\nНеобходимо е да бъде посочено друго.", - "config-ns-conflict": "Посоченото именно пространство \"$1\" е в конфликт с използваното по подразбиране именно пространство MediaWiki.\nНеобходимо е да се посочи друго именно пространство.", + "config-ns-invalid": "Посоченото именно пространство „$1“ е невалидно.\nНеобходимо е да бъде посочено друго.", + "config-ns-conflict": "Посоченото именно пространство „$1“ е в конфликт с използваното по подразбиране именно пространство MediaWiki.\nНеобходимо е да се посочи друго именно пространство.", "config-admin-box": "Администраторска сметка", "config-admin-name": "Вашето потребителско име:", "config-admin-password": "Парола:", "config-admin-password-confirm": "Парола (повторно):", - "config-admin-help": "Въвежда се предпочитаното потребителско име, например \"Иванчо Иванчев\".\nТова ще е потребителското име, което администраторът ще използва за влизане в уикито.", + "config-admin-help": "Въвежда се предпочитаното потребителско име, например „Иванчо Иванчев“.\nТова ще е потребителското име, което администраторът ще използва за влизане в уикито.", "config-admin-name-blank": "Необходимо е да бъде въведено потребителско име на администратора.", "config-admin-name-invalid": "Посоченото потребителско име \"$1\" е невалидно.\nНеобходимо е да се посочи друго.", "config-admin-password-blank": "Въведете парола за администраторската сметка.", "config-admin-password-mismatch": "Двете въведени пароли не съвпадат.", "config-admin-email": "Адрес за електронна поща:", "config-admin-email-help": "Въвеждането на адрес за е-поща позволява получаване на е-писма от другите потребители на уикито, възстановяване на изгубена или забравена парола, оповестяване при промени в страниците от списъка за наблюдение. Това поле може да бъде оставено празно.", - "config-admin-error-user": "Възникна вътрешна грешка при създаване на администратор с името \"$1\".", - "config-admin-error-password": "Възникна вътрешна грешка при задаване на парола за администратора \"$1\":
    $2
    ", - "config-admin-error-bademail": "Въведен е невалиден адрес за електронна поща", + "config-admin-error-user": "Възникна вътрешна грешка при създаване на администратор с името „$1“.", + "config-admin-error-password": "Възникна вътрешна грешка при задаване на парола за администратора „$1“:
    $2
    ", + "config-admin-error-bademail": "Въведен е невалиден адрес за електронна поща.", "config-subscribe": "Абониране за [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce пощенския списък за нови версии].", "config-subscribe-help": "Това е пощенски списък с малко трафик, който се използва за съобщения при излизане на нови версии, както и за важни проблеми със сигурността.\nАбонирането е препоръчително, както и надграждането на инсталацията на МедияУики при излизането на нова версия.", "config-subscribe-noemail": "Опитахте да се абонирате за пощенския списък за нови версии без да посочите адрес за електронна поща.\nНеобходимо е да се предостави адрес за електронна поща, в случай че желаете да се абонирате за пощенския списък.", @@ -209,7 +210,7 @@ "config-profile-no-anon": "Необходимо е създаване на сметка", "config-profile-fishbowl": "Само одобрени редактори", "config-profile-private": "Затворено уики", - "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват поражения от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа '''{{int:config-profile-wiki}}''' позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа '''{{int:config-profile-no-anon}}''' позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е '''{{int:config-profile-fishbowl}}''' позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ '''{{int:config-profile-private}}''' само предварително одобрени потребители могат да четат и редактират съдържанието.\n\nДетайлно обяснение на конфигурациите на потребителските права е достъпно след инсталацията в [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights Наръчника за потребителски права].", + "config-profile-help": "Уикитата функционират най-добре, когато позволяват на възможно най-много хора да ги редактират.\nВ МедияУики лесно се преглеждат последните промени и се възстановяват поражения от недобронамерени потребители.\n\nВъпреки това мнозина смятат МедияУики за полезен софтуер по различни начини и често е трудно да се убедят всички от предимствата на уики модела.\nЗатова се предоставя възможност за избор.\n\nУикитата от типа {{int:config-profile-wiki}} позволяват на всички потребители да редактират, дори и без регистрация.\nУикитата от типа {{int:config-profile-no-anon}} позволяват достъп до страниците и редактирането им само след създаване на потребителска сметка.\n\nУики, което е {{int:config-profile-fishbowl}} позволява на всички да преглеждат страниците, но само предварително одобрени редактори могат да редактират съдържанието.\nВ {{int:config-profile-private}} само предварително одобрени потребители могат да четат и редактират съдържанието.\n\nДетайлно обяснение на конфигурациите на потребителските права е достъпно след инсталацията в [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights Наръчника за потребителски права].", "config-license": "Авторски права и лиценз:", "config-license-none": "Без лиценз", "config-license-cc-by-sa": "Криейтив Комънс Признание-Споделяне на споделеното", @@ -230,26 +231,26 @@ "config-email-watchlist": "Оповестяване за списъка за наблюдение", "config-email-watchlist-help": "Позволява на потребителите да получават оповестяване за техните наблюдавани страници, ако това е разрешено в настройките им.", "config-email-auth": "Потвърждаване на адреса за електронна поща", - "config-email-auth-help": "Ако тази настройка е включена, потребителите трябва да потвърдят адреса си за е-поща чрез препратка, която им се изпраща при настройване или промяна.\nСамо валидните адреси могат да получават е-писма от други потребители или да променят писмата за оповестяване.\nНастройването на това е '''препоръчително''' за публични уикита заради потенциални злоупотреби с възможностите за електронна поща.", + "config-email-auth-help": "Ако тази настройка е включена, потребителите трябва да потвърдят адреса си за е-поща чрез препратка, която им се изпраща при настройване или промяна.\nСамо валидните адреси могат да получават е-писма от други потребители или да променят писмата за оповестяване.\nНастройването на това е препоръчително за публични уикита заради потенциални злоупотреби с възможностите за електронна поща.", "config-email-sender": "Адрес за обратна връзка:", "config-email-sender-help": "Въвежда се адрес за електронна поща, който ще се използва за обратен адрес при изходящи е-писма.\nТова е адресът, на който ще се получават върнатите и неполучени писма.\nМного е-пощенски сървъри изискват поне домейн името да е валидно.", "config-upload-settings": "Картинки и качване на файлове", "config-upload-enable": "Позволяне качването на файлове", "config-upload-help": "Качването на файлове е възможно да доведе до пробели със сигурността на сървъра.\nПовече информация по темата има в [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security раздела за сигурност] в Наръчника.\n\nЗа позволяване качването на файлове, необходимо е уебсървърът да може да записва в поддиректорията на МедияУики images.\nСлед като това условие е изпълнено, функционалността може да бъде активирана.", "config-upload-deleted": "Директория за изтритите файлове:", - "config-upload-deleted-help": "Избиране на директория, в която ще се складират изтритите файлове.\nВ най-добрия случай тя не трябва да е достъпна през уеб.", + "config-upload-deleted-help": "Избиране на директория, в която да се складират изтритите файлове.\nВ най-добрия случай тя не трябва да е достъпна през уеб.", "config-logo": "URL адрес на логото:", - "config-logo-help": "Обликът по подразбиране на МедияУики вклчва място с размери 135х160 пиксела за лого над страничното меню.\nАко има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.\n\nМоже да се използва $wgStylePath или $wgScriptPath ако логото е относително към тези пътища.\n\nАко не е необходимо лого, полето може да се остави празно.", + "config-logo-help": "Обликът по подразбиране на МедияУики включва място с размери 135х160 пиксела за лого над страничното меню.\nАко има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.\n\nМоже да се използва $wgStylePath или $wgScriptPath ако логото е относително към тези пътища.\n\nАко не е необходимо лого, полето може да се остави празно.", "config-instantcommons": "Включване на Instant Commons", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [https://commons.wikimedia.org/ Общомедия].\nЗа да е възможно това, МедияУики изисква достъп до Интернет.\n\nПовече информация за тази функционалност, както и инструкции за настройване за други уикита, различни от Общомедия, е налична в [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos наръчника].", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медия от сайта на Уикимедия [https://commons.wikimedia.org/ Общомедия].\nЗа да е възможно това, МедияУики изисква достъп до Интернет.\n\nПовече информация за тази функционалност, както и инструкции за настройване за други уикита, различни от Общомедия, е налична в [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos наръчника].", "config-cc-error": "Избирането на лиценз на Криейтив Комънс не даде резултат.\nНеобходимо е името на лиценза да бъде въведено ръчно.", "config-cc-again": "Повторно избиране...", - "config-cc-not-chosen": "Изберете кой лиценз на Криейтив Комънс желаете и щракнете \"proceed\".", + "config-cc-not-chosen": "Изберете кой лиценз на Криейтив Комънс желаете и щракнете „proceed“.", "config-advanced-settings": "Разширена конфигурация", "config-cache-options": "Настройки за обектното кеширане:", "config-cache-help": "Обектното кеширане се използва за подобряване на скоростта на МедияУики чрез кеширане на често използваните данни.\nСилно препоръчително е на средните и големите сайтове да включат тази настройка, но малките също могат да се възползват от нея.", "config-cache-none": "Без кеширане (не се премахва от функционалността, но това влияе на скоростта на по-големи уикита)", - "config-cache-accel": "PHP обектно кеширане (APCu, XCache или WinCache)", + "config-cache-accel": "PHP обектно кеширане (APC, APCu, XCache или WinCache)", "config-cache-memcached": "Използване на Memcached (изисква допълнителни настройки и конфигуриране)", "config-memcached-servers": "Memcached сървъри:", "config-memcached-help": "Списък с IP адреси за използване за Memcached.\nНеобходимо е да бъдат разделени по един на ред, както и да е посочен порта. Пример:\n127.0.0.1:11211\n192.168.1.25:1234", @@ -265,7 +266,7 @@ "config-skins-missing": "Не са открити облици; МедияУики ще използва авариен облик, докато инсталирате подходящ.", "config-skins-must-enable-some": "Трябва да изберете поне един облик.", "config-skins-must-enable-default": "Обликът по-подразбиране трябва да бъде включен.", - "config-install-alreadydone": "'''Предупреждение:''' Изглежда вече сте инсталирали МедияУики и се опитвате да го инсталирате отново.\nПродължете към следващата страница.", + "config-install-alreadydone": "Внимание: Изглежда вече сте инсталирали МедияУики и се опитвате да го инсталирате отново.\nПродължете към следващата страница.", "config-install-begin": "Инсталацията на МедияУики ще започне след натискане на бутона „{{int:config-continue}}“.\nВ случай, че е необходимо да се направят промени, използва се бутона „{{int:config-back}}“.", "config-install-step-done": "готово", "config-install-step-failed": "неуспешно", @@ -273,32 +274,32 @@ "config-install-database": "Създаване на базата от данни", "config-install-schema": "Създаване на схема", "config-install-pg-schema-not-exist": "PostgreSQL схемата не съществува", - "config-install-pg-schema-failed": "Създаването на таблиците пропадна.\nНеобходимо е потребител \"$1\" да има права за писане в схемата \"$2\".", + "config-install-pg-schema-failed": "Създаването на таблиците пропадна.\nНеобходимо е потребител „$1“ да има права за писане в схемата „$2“.", "config-install-pg-commit": "Извършване на промени", "config-install-pg-plpgsql": "Проверяване за езика PL/pgSQL", "config-pg-no-plpgsql": "Необходимо е да се инсталира езикът PL/pgSQL в базата от данни $1", "config-pg-no-create-privs": "Посочената сметка за инсталацията не притежава достатъчно права за създаване на сметка.", - "config-pg-not-in-role": "Посочената сметка за уеб потребител вече съществува.\nПосочената сметка за инсталация не с права на суперпотребител и не е член на ролите на уеб потребителя и не може да създава обекти, собственост на уеб потребителя.\n\nТекущо МедияУики изисква таблиците да са собственост на уеб потребителя. Необходимо е да се посочи друго потребителско име за уеб или да се натисне \"връщане\" и да се избере друг потребител за инсталацията с подходящите права.", + "config-pg-not-in-role": "Посочената сметка за уеб потребител вече съществува.\nПосочената сметка за инсталация не с права на суперпотребител и не е член на ролите на уеб потребителя и не може да създава обекти, собственост на уеб потребителя.\n\nТекущо МедияУики изисква таблиците да са собственост на уеб потребителя. Необходимо е да се посочи друго потребителско име за уеб или да се натисне „връщане“ и да се избере друг потребител за инсталацията с подходящите права.", "config-install-user": "Създаване на потребител за базата от данни", "config-install-user-alreadyexists": "Потребител „$1“ вече съществува", "config-install-user-create-failed": "Създаването на потребител „$1“ беше неуспешно: $2", - "config-install-user-grant-failed": "Предоставянето на права на потребител \"$1\" беше неуспешно: $2", - "config-install-user-missing": "Посоченият потребител \" $1 \"не съществува.", - "config-install-user-missing-create": "Посоченият потребител \"$1\" не съществува.\nАко желаете да го създадете, поставете отметка на \"създаване на сметка\".", + "config-install-user-grant-failed": "Предоставянето на права на потребител „$1“ беше неуспешно: $2", + "config-install-user-missing": "Посоченият потребител „$1“ не съществува.", + "config-install-user-missing-create": "Посоченият потребител „$1“ не съществува.\nАко желаете да го създадете, поставете отметка на „създаване на сметка“.", "config-install-tables": "Създаване на таблиците", - "config-install-tables-exist": "'''Предупреждение''': Таблиците за МедияУики изглежда вече съществуват.\nПропускане на създаването им.", - "config-install-tables-failed": "'''Грешка''': Създаването на таблиците пропадна и върна следната грешка: $1", + "config-install-tables-exist": "Внимание: Таблиците за МедияУики изглежда вече съществуват.\nПропускане на създаването им.", + "config-install-tables-failed": "Грешка: Създаването на таблиците пропадна и върна следната грешка: $1", "config-install-interwiki": "Попълване на таблицата с междууикитата по подразбиране", - "config-install-interwiki-list": "Файлът interwiki.list не можа да бъде открит.", - "config-install-interwiki-exists": "'''Предупреждение''': Таблицата с междууикита изглежда вече съдържа данни.\nПропускане на списъка по подразбиране.", + "config-install-interwiki-list": "Файлът interwiki.list не можа да бъде прочетен.", + "config-install-interwiki-exists": "Внимание: Таблицата с междууикита изглежда вече съдържа данни.\nПропускане на списъка по подразбиране.", "config-install-stats": "Инициализиране на статистиките", "config-install-keys": "Генериране на тайни ключове", - "config-insecure-keys": "'''Предупреждение:''' {{PLURAL:$2|Сигурният ключ, създаден по време на инсталацията, не е напълно надежден|Сигурните ключове, създадени по време на инсталацията, не са напълно надеждни}} $1 . Обмислете да {{PLURAL:$2|го|ги}} смените ръчно.", + "config-insecure-keys": "Внимание: {{PLURAL:$2|Сигурният ключ, създаден по време на инсталацията, не е напълно надежден|Сигурните ключове, създадени по време на инсталацията, не са напълно надеждни}} $1 . Обмислете да {{PLURAL:$2|го|ги}} смените ръчно.", "config-install-updates": "Предотвратяване стартирането на ненужни актуализации", "config-install-updates-failed": "Грешка: Вмъкването на обновяващи ключове в таблиците се провали по следната причина: $1", "config-install-sysop": "Създаване на администраторска сметка", - "config-install-subscribe-fail": "Невъзможно беше абонирането за mediawiki-announce: $1", - "config-install-subscribe-notpossible": "не е инсталиран cURL и allow_url_fopen не е налична.", + "config-install-subscribe-fail": "Невъзможно е абонирането за mediawiki-announce: $1", + "config-install-subscribe-notpossible": "Не е инсталиран cURL и allow_url_fopen не е налична.", "config-install-mainpage": "Създаване на Началната страница със съдържание по подразбиране", "config-install-mainpage-exists": "Главната страница вече съществува, преминаване напред", "config-install-extension-tables": "Създаване на таблици за включените разширения", @@ -307,7 +308,7 @@ "config-install-done-path": "Поздравления!\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл LocalSettings.php.\nТой съдържа всички ваши настройки.\n\nНеобходимо е той да бъде изтеглен и поставен в $4. Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\nЗабележка: Ако това не бъде направено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, [$2 уикито ще е достъпно на този адрес].", "config-download-localsettings": "Изтегляне на LocalSettings.php", "config-help": "помощ", - "config-help-tooltip": "Щракнете за разширяване", + "config-help-tooltip": "щракнете за разгръщане", "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": "МедияУики беше успешно инсталирано.", diff --git a/includes/installer/i18n/bn.json b/includes/installer/i18n/bn.json index 34efde4bc5..dc423a647e 100644 --- a/includes/installer/i18n/bn.json +++ b/includes/installer/i18n/bn.json @@ -141,6 +141,8 @@ "config-install-mainpage-exists": "প্রধান পাতা ইতিমধ্যেই বিদ্যমান, এডিয়ে যাওয়া হচ্ছে", "config-help": "সাহায্য", "config-help-tooltip": "প্রসারিত করতে ক্লিক করুন", + "config-skins-screenshots": "$1 (স্ক্রিনশট: $2)", + "config-screenshot": "স্ক্রিনশট", "mainpagetext": "মিডিয়াউইকি ইনস্টল করা হয়েছে।", "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 আপনার উইকিতে স্প্যামের সাথে লড়াই করার উপায় সম্পর্কে জানুন]" } diff --git a/includes/installer/i18n/br.json b/includes/installer/i18n/br.json index 7a26214fc8..f38c7695a3 100644 --- a/includes/installer/i18n/br.json +++ b/includes/installer/i18n/br.json @@ -15,7 +15,7 @@ "config-localsettings-upgrade": "Kavet ez eus bet ur restr LocalSettings.php.\nEvit hizivaat ar staliadur-se, merkit an talvoud $wgUpgradeKey er voest dindan.\nE gavout a rit e LocalSettings.php.", "config-localsettings-cli-upgrade": "Dinoet ez eus bet ur restr LocalSettings.php.\nEvit lakaat ar staliadur-mañ a-live, implijit update.php e plas", "config-localsettings-key": "Alc'hwez hizivaat :", - "config-localsettings-badkey": "Direizh eo an alc'hwez merket ganeoc'h", + "config-localsettings-badkey": "Direizh eo an alc'hwez hizivaat lakaet ganeoc'h.", "config-upgrade-key-missing": "Kavet ez eus bet ur staliadur kent eus MediaWiki.\nEvit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "Diglok e seblant bezañ ar restr LocalSettings.php zo anezhi dija.\nAn argemmenn $1 n'eo ket termenet.\nKemmit LocalSettings.php evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».", "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e LocalSettings.php. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1", @@ -53,10 +53,12 @@ "config-env-php": "Staliet eo PHP $1.", "config-env-hhvm": "HHVM $1 zo staliet.", "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.", - "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)", + "config-unicode-pure-php-warning": "Diwallit : N'haller ket ober gant an [http://pecl.php.net/intl intl astenn PECL] evit merañ reoladur Unicode; distreiñ d'ar stumm gorrek emplementet e PHP-rik.\nMa rit war-dro ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations reolennadur Unicode].", "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.", - "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant ./configure --mysql.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.", + "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo {{PLURAL:$2|ar seurt|ar seurtoù}} diazoù roadennoù da-heul : $1.\n\nMard eo bet kempunet PHP ganeoc'h-c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant /configure --with-mysqli.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ, da skouer, ar pakad php5-mysql ivez.", + "config-outdated-sqlite": "Taolit pled : ober a rit gant SQLite $1, hag a zo izeloc'h eget ar stumm $2 ret bihanañ. Ne vo ket posupl ober gant SQLite.", "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ", + "config-pcre-old": "Fazo groñs : rekis eo ober gant PCRE $1 pe nevesoc'h.\nLiammet eo ho PHP binarel gant PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Gouzout hiroc'h].", "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.", "config-memory-raised": "memory_limit ar PHP zo $1, kemmet e $2.", "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn memory_limit PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !", @@ -64,23 +66,32 @@ "config-apc": "Staliet eo [http://www.php.net/apc APC]", "config-apcu": "Staliet eo [http://www.php.net/apcu APCu]", "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]", + "config-no-cache-apcu": "Taolit pled : N'eus ket bet gallet kavout [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].\nN'eo ket gweredekaet ar c'hrubuilhañ traezoù.", + "config-mod-security": "Taolit pled : Gweredekaet eo [http://modsecurity.org/ mod_security]/mod_security2 gant ho servijer web. Ma n'eo ket kfluniet mat e c'hall tegas trubuilhoù da MediaWiki ha meziantoù all a aotre implijerien da ouzhpennañ danvez evel ma karont.\nE kement ha m'eo posupl e tlefe bezañ diweredekaet. A-hend-all, sellit ouzh [http://modsecurity.org/documentation/ mod_security an teuliadur] pe kit e darempred gant skoazell ho herberc'hier m'en em gavit gant fazioù dargouezhek.", "config-diff3-bad": "N'eo ket bet kavet GNU diff3.", + "config-git": "Kavet eo bet ar meziant kontrolliñ adstummoù Git : $1.", + "config-git-bad": "N'eo ket bet kavet ar meziant kontrolliñ stummoù Git.", "config-imagemagick": "ImageMagick kavet : $1.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet ganeoc'h ar pellgargañ restroù.", "config-gd": "Kavet eo bet al levraoueg c'hrafek GD enframmet.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet an enporzhiañ restroù.", "config-no-scaling": "N'eus ket bet gallet kavout al levraoueg GD pe ImageMagick.\nDiweredekaet e vo ar bihanaat skeudennoù.", "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.", + "config-no-cli-uri": "Diwallit : N'eus bet spisaet --scriptpath ebet, graet e vo, dre ziouer, gant : $1.", "config-using-server": "Oc'h implijout an anv servijer \"$1\".", "config-using-uri": "Oc'h implijout ar servijour URL \"$1$2\".", "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer $1 rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.", + "config-no-cli-uploads-check": "Diwallit : N'eo ket bet gwiriet ho kavlec'h enporzhiañ dre ziouer ($1) e-keñver breskted erounezadur skriptoù tidek e-pad staliadur CLI.", "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([https://bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.", + "config-suhosin-max-value-length": "Staliet eo Suhosin ha bevennin a ra hirder an arventenn GET da $1 okted.\nParzh ResourceLoader Mediawiki a zoujo d'ar vevenn-se met se a zisteray ar varregezh. \nMa c'hallit e tlefec'h spisaat suhosin.get.max_value_length da 1024 pe uheloc'h e php.ini, ha merkañ $wgResourceLoaderMaxQueryLength gant an hevelep talvoud e LocalSettings.php.", "config-db-type": "Doare an diaz roadennoù :", "config-db-host": "Anv implijer an diaz roadennoù :", "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ anv an ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h an anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.", "config-db-host-oracle": "TNS an diaz roadennoù :", + "config-db-host-oracle-help": "Merkit un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm anv kevreañ lec'hel] reizh; dleout a ra ur restr tnsnames.ora bezañ hewel e-pad ar staliadur.
    Ma rit gant al levraouegoù arval 10g pe nevesoc'h e c'hallit ivez ober gant an hentenn envel [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", "config-db-wiki-settings": "Anavezout ar wiki-mañ", "config-db-name": "Anv an diaz roadennoù :", "config-db-name-help": "Dibabit un anv evit ho wiki.\nNa lakait ket a esaouennoù ennañ.\n\nMa ri gant un herberc'hiañ kenrannet e vo pourchaset deoc'h un anv diaz roadennoù dibar da vezañ graet gantañ gant ho herberc'hier pe e lezo ac'hanoc'h da grouiñ diazoù roadennoù dre ur banell gontrolliñ.", "config-db-name-oracle": "Brastres diaz roadennoù :", + "config-db-account-oracle-warn": "Skoret ez eus tri doare evit staliañ Oracle da v/backend diaz roadennoù :\n\nMar fell deoc'h krouiñ ur gont diaz roadennoù e-ser an argerzh staliañ eo rekis pourchas ur gont gant ur roll SYSDBA evel kont diaz roadennoù evit ar staliañ, ha spisaat an titouroù anaout a fell deoc'h evit ar gont moned ouzh ar web. A-hend-all, e c'hallit krouiñ ar gont moned ouzh ar web gant an dorn ha pourchas hepken ar gont-se (ma'z eus bet ranket diskouez aotreoù ret evit krouiñ traezoù ar brastres) pe pourveziñ div gont disheñvel, unan gant dreistwirioù krouiñ hag eben, gant gwirioù strishaet, evit moned ouzh ar web.\n\nGallout a reer kaout ar skript evit kouiñ ur gont a zo rekis dreistwirioù eviti e kavlec'h \"trezalc'h/oracle/\" ar staliadur-mañ. Na zisoñjit ket e vo diweredekaet holl varregezhioù trezalc'h ar gont dre ziouer ma rit gant ur gont strishaet he gwirioù.", "config-db-install-account": "Kont implijer evit ar staliadur", "config-db-username": "Anv implijer an diaz roadennoù :", "config-db-password": "Ger-tremen an diaz roadennoù :", @@ -89,13 +100,16 @@ "config-db-install-help": "Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.", "config-db-account-lock": "Implijout ar memes anv implijer ha ger-tremen e-kerzh oberiadurioù boutin", "config-db-wiki-account": "Kont implijer evit oberiadurioù boutin", + "config-db-wiki-help": "Merkañ an anv-implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad oberiadurioù normal ar wiki.\nMa n'eus ket eus ar gont ha ma'z eus gwirioù a-walc'h gant ar gont staliañ, e vo krouet ar gont implijer-mañ gant al live gwirioù rekis izelañ evit gallout lakaat ar wiki da vont en-dro.", "config-db-prefix": "Rakrann taolennoù an diaz roadennoù :", + "config-db-prefix-help": "Mard eo ret deoc'h rannañ un diaz roadennoù gant meur a wiki, pe etre MediaWiki hag un arload benak all e c'hallit dibab ouzhpennañ ur rakger da holl anvioù an taolennoù kuit na vije tabutoù.\nArabat ober gant esaouennoù.\n\nPeurliesañ e vez laosket goullo ar vaezienn-mañ.", "config-mysql-old": "Rekis eo MySQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.", "config-db-port": "Porzh an diaz roadennoù :", "config-db-schema": "Brastres evit MediaWiki", "config-db-schema-help": "Peurliesañ e vo digudenn ar chema-mañ.\nArabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.", "config-pg-test-error": "N'haller ket kevreañ ouzh an diaz-titouroù '''$1''' : $2", "config-sqlite-dir": "Kavlec'h roadennoù SQLite :", + "config-sqlite-dir-help": "Stokañ a ra SQLite an holl roadennoù en ur restr nemetken.\n\nE-pad ar staliañ, rankout a ra ar servijer web gallout skrivañ er c'havlec'h pourchaset ganeoc'h.\n\nNe zlefe ket bezañ tizhadus dre ar web; setu perak ne lakaomp ket anezhañ el lec'h m'emañ ho restroù PHP.\n\nSkivañ a raio ar stalier ur restr .htaccess war un dro gantañ met ma c'hoarvez ur fazi e c'hallfe unan bennak tapout krog en ho roadennoù.\nKement-se a sell ouzh ar roadennoù implijer (chomlec'hioù postel, gerioù-tremen hachet) hag ouzh an adweladennoù diverket ha takadoù gwarzeet all eus ar wiki.\n\nEn em soñjit ha ne vefe ket gwelloc'h lakaat an diaz roadennoù en un tu bennak all, da skouer e /var/lib/mediawiki/yourwiki.", "config-oracle-def-ts": "Esaouenn stokañ (\"tablespace\") dre ziouer :", "config-oracle-temp-ts": "Esaouenn stokañ (''tablespace'') da c'hortoz :", "config-type-mysql": "MySQL (pe kenglotus)", @@ -104,10 +118,11 @@ "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :\n\n$1\n\nMa ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.", - "config-dbsupport-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])", - "config-dbsupport-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.", - "config-dbsupport-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)", - "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])", + "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ. Mont a ra MediaWiki en-dro gant [{{int:version-db-mariadb-url}} MariaDB] ha [{{int:version-db-percona-url}} Percona Server] ivez, kenglotus o-daou gant MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Penaos kempunañ PHP gant skor MySQL])", + "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] zo anezhi ur reizhiad diaz roadennoù frank a wirioù brudet-mat a c'haller ober gantañ e plas MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL])", + "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] zo anezhi ur reizhiad diaz roadennoù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)", + "config-dbsupport-oracle": "* Un embregerezh kenwerzhel diaz roadennoù eo [{{int:version-db-oracle-url}} Oracle]. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])", + "config-dbsupport-mssql": "* Un embregerezh kenwerzhel diaz roadennoù evit Windows eo [{{int:version-db-mssql-url}} Microsoft SQL Server]. ([http://www.php.net/manual/en/sqlsrv.installation.php Penaos kempunañ PHP gant skor SQLSRV])", "config-header-mysql": "Arventennoù MySQL", "config-header-postgres": "Arventennoù PostgreSQL", "config-header-sqlite": "Arventennoù SQLite", @@ -117,7 +132,7 @@ "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-name}}\".", "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host}}\"", "config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host-oracle}}\".", - "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).", + "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz roadennoù \"$1\".\nOber gant an neudennad \"TNS Name\" pe c'hoazh gant \"Easy Connect ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Hentennoù envel Oracle]).", "config-invalid-db-name": "Direizh eo anv an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).", "config-invalid-db-prefix": "Direizh eo rakger an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).", "config-connection-error": "$1.\n\nGwiriit anv an ostiz, an anv implijer, ar ger-tremen ha klaskit en-dro.", @@ -127,6 +142,8 @@ "config-postgres-old": "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.", "config-mssql-old": "Stumm $1 Microsoft SQL Server, pe unan nevesoc'h, zo rekis. Ganeoc'h emañ ar stumm $2.", "config-sqlite-name-help": "Dibabit un anv dibar d'ho wiki.\nArabat ober gant esaouennoù pe barrennigoù-stagañ.\nImplijet e vo evit ar restr roadennoù SQLite.", + "config-sqlite-parent-unwritable-group": "N'haller ket krouiñ ar c'havlec'h roadennoù $1 peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar $2.\n\nKavet eo bet gant ar stalier an anv implijer m'eo oberiant ar servijer drezañ. Evit gallout kenderc'hel, lakait ar c'havlec'h $3 da vezañ tizhus evit ar skrivañ.\nWar ur reizhiad Unix/Linux system ober :\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", + "config-sqlite-parent-unwritable-nogroup": "N'haller ket krouiñ ar c'havlec'h roadennoù $1 peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar $2.\n\nN'eo ket bet ar servijer evit kavout anv an implijer ma tro ar servijer. Evit kenderc'hel, lakaat ar c'havlec'h $3 da vezañ tizhus evit ar skrivañ dre vras.\nWar ur reizhiad Unix/Linux merkañ :\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", "config-sqlite-mkdir-error": "Ur fazi zo bet e-ser krouiñ ar c'havlec'h roadennoù \"$1\".\nGwiriañ al lec'hiadur ha klask en-dro.", "config-sqlite-dir-unwritable": "Dibosupl skrivañ er c'havlec'h \"$1\".\nCheñchit ar aotreoù evit ma c'hallfe ar servijer web skrivañ ennañ ha klaskit en-dro.", "config-sqlite-connection-error": "$1.\n\nGwiriañ ar c'havlec'h roadennoù hag anv an diaz roadennoù a-is ha klaskit en-dro.", @@ -134,6 +151,7 @@ "config-sqlite-cant-create-db": "N'haller ket krouiñ restr an diaz roadennoù $1.", "config-sqlite-fts3-downgrade": "N'eo ket kenglotus ar PHP gant FTS3, o lakaat an taolennoù da glotañ gant ur stumm koshoc'h", "config-can-upgrade": "Taolennoù MediaWiki zo en diaz titouroù.\nDa hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.", + "config-upgrade-done": "Hizivadenn bet kaset da benn vat.\n\nGallout a rit [$1 kregiñ da implijout ho wiki].\n\nMar fell deoc'h adc'henel ho restr LocalSettings.php, klikit war ar bouton dindan.\nN'eo ket un dra erbedet nemet ho pefe kudennoù gant ho wiki.", "config-upgrade-done-no-regenerate": "Hizivadenn kaset da benn.\n\nGallout a rit [$1 kregiñ da implijout ho wiki].", "config-regenerate": "Adgenel LocalSettings.php →", "config-show-table-status": "C'hwitet ar reked SHOW TABLE STATUS !", @@ -146,10 +164,16 @@ "config-mysql-engine": "Lusker stokañ :", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", + "config-mysql-myisam-dep": "Diwallit : Diuzet eo bet ganeoc'h MyISAM evel keflusker stokañ evit MySQL, ar pezh n'eo ket erbedet evit implijout gant MediaWiki, rak :\n* a-boan m'eo skoret gantañ ober meur a dra war un dro peogwir eo prennet an taolennoù\n* techetoc'h eo d'ar gwastoù eget kefluskerioù all\n* kod diazez MediaWiki n'eo ket atav embreget MyISAM gantañ evel m'eo dleet\n\nM'eo skoret InnoDB gant ho staliadur MySQL, ez eo kuzuliet c'hwek deoc'h dibab hennezh kentoc'h.\nMa n'eo ket skoret InnoDB gant ho staliadur MySQL, e c'hallfe bezañ poent deoc'h ober un hizivadenn.", + "config-mysql-only-myisam-dep": "Taolit evezh : MyISAM eo ar c'heflusker stokañ nemetañ a c'haller ober gantañ war ar mekanik-mañ evit MySQL, padal n'eo ket erbedet e implij gant MediaWiki, rak :\n* a-boan ma skor ar c'hevezerezh abalamour m'eo prennet an taolennoù\n* aesoc'h eo e wastañ eget kefluskerioù all\n* n'eo ket atav embreget MyIsam evel ma tlefe bezañ gant kod diazez MediaWiki\n\nN'eo ket skoret InnoDB gant ho staliadur MySQL. Poent eo hizivaat anezhañ marteze.", + "config-mysql-engine-help": "InnoDB eo an dibab gwellañ koulz lavaret atav, kemer a ra e kont ar monedoù kevezus.\n\nMyISAM a c'hall bezañ fonnusoc'h evit ar staliadurioù unpost pe ar re lenn hepken.\nDiazoù roadennoù MyISAM zo techet da vezañ gwastet aliesoc'h eget re InnoDB.", "config-mysql-charset": "Strobad arouezennoù an diaz roadennoù :", "config-mysql-binary": "Binarel", "config-mysql-utf8": "UTF-8", + "config-mysql-charset-help": "Er mod binarel eo stoket an destenn UTF-8 gant MediaWiki en diaz roadennoù e maeziennoù binarel.\nEfedusoc'h eo an dra-se eget mod UTF-8 MySQL; leuskel a ra ac'hanoc'h da implijout skalfad klok arouezennoù Unicode.\n\nEr mod UTF-8, MySQL a ouio anavezout ar rikoù arouezennoù emañ ho roadennoù ennañ hag e c'hallo o c'hinnig hag o amdreiñ en doare a zere met ne aotreo ket ac'hanoc'h da stokañ arouezennoù a-us d'ar [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Steuñv liesyezhek diazez] (e saozneg).", "config-mssql-auth": "Seut anaoudadur :", + "config-mssql-install-auth": "Diuzañ ar seurt dilesa a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad ar staliañ.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.", + "config-mssql-web-auth": "Diuzañ ar seurt dilesa a vo implijet gant ar servijer web evit kevreañ ouzh diaz roadennoù ar servijer e-pad oberiadennoù boas ar wiki.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.", "config-mssql-sqlauth": "Anaoudadur SQL Server", "config-mssql-windowsauth": "Anaoudadur Windows", "config-site-name": "Anv ar wiki :", @@ -177,6 +201,7 @@ "config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « $1 » :
    $2
    ", "config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.", "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].", + "config-pingback": "Rannañ roadennoù diwar-benn ar staliadur-mañ gant diorroerien Mediawiki.", "config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.", "config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.", "config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.", @@ -191,6 +216,7 @@ "config-license-cc-by": "Creative Commons Deroadenn", "config-license-cc-by-nc-sa": "Creative Commons Deroadenn Angenwerzhel Kenrannañ heñvel", "config-license-cc-0": "Creative Commons Zero (Domani foran)", + "config-license-gfdl": "Aotre implijout teuliadur frank GNU 1.3 pe nevesoc'h", "config-license-pd": "Domani foran", "config-license-cc-choose": "Dibabit un aotre-implijout Creative Commons personelaet", "config-email-settings": "Arventennoù ar postel", @@ -216,17 +242,20 @@ "config-cc-not-chosen": "Dibabit an aotre-implijout Creative Commons a fell deoc'h ober gantañ ha klikit war \"proceed\".", "config-advanced-settings": "Kefluniadur araokaet", "config-cache-options": "Arventennoù evit krubuilhañ traezoù :", - "config-cache-accel": "Krubuilhañ traezoù PHP (APC, XCache pe WinCache)", + "config-cache-accel": "Krubuilhañ traezoù PHP (APC, APCu, XCache pe WinCache)", "config-cache-memcached": "Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)", "config-memcached-servers": "Servijerioù Memcached :", "config-memcached-help": "Roll ar chomlec'hioù IP da implijout evit Memcached.\nRet eo spisaat unan dre linenn ha spisaat ar porzh da vezañ implijet. Da skouer :\n127.0.0.1:11211\n192.168.1.25:1234", "config-memcache-needservers": "Diuzet hoc'h eus Memcached evel seurt krubuilh met n'hoc'h eus spisaet servijer ebet.", "config-memcache-badip": "Ur chomlec'h IP direizh hoc'h eus lakaet evit Memcached : $1.", + "config-memcache-noport": "N'eus ket bet spisaet porzh ebet ganeoc'h evit servijer Memcached : $1.\nMa n'anavezit ket ar porzh, setu an hini dre ziouer : 11211.", "config-memcache-badport": "Niverennoù porzh Memcached a zlefe bezañ etre $1 ha $2.", "config-extensions": "Astennoù", "config-extensions-help": "N'eo ket bet detektet an astennoù rollet a-us en ho kavlec'h ./astennoù.\n\nMarteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.", "config-skins": "Gwiskadurioù", + "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h ./skins. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.", "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer", + "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.", "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.", "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.", "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.", @@ -267,6 +296,6 @@ "config-help": "skoazell", "config-help-tooltip": "klikañ evit astenn", "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?", - "mainpagetext": "'''Meziant MediaWiki staliet.'''", + "mainpagetext": "Staliet eo bet MediaWiki.", "mainpagedocfooter": "Sellit ouzh [https://meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh" } diff --git a/includes/installer/i18n/bs.json b/includes/installer/i18n/bs.json index c122b2a85b..66139728c0 100644 --- a/includes/installer/i18n/bs.json +++ b/includes/installer/i18n/bs.json @@ -9,85 +9,177 @@ ] }, "config-desc": "Instalacija za MediaWiki", - "config-title": "MediaWiki $1 instalacija", + "config-title": "Instalacija MediaWikija $1", "config-information": "Informacija", - "config-localsettings-upgrade": "Otkrivena je datoteka LocalSettings.php.\nDa biste unaprijedili vaš softver, molimo vas upišite vrijednost od $wgUpgradeKey u okvir ispod.\nNaći ćete ga u LocalSettings.php.", - "config-localsettings-cli-upgrade": "Datoteka LocalSettings.php file je otkrivena.\nZa nadogradnju ove instalacije, molimo da pokrenete update.php umjesto toga", - "config-localsettings-key": "Ključ za nadgradnju:", - "config-localsettings-badkey": "Ključ koji ste dali je pogrešan.", - "config-upgrade-key-missing": "Postojeća instalacije MediaWiki je pronađena.\nZa nadogradnju ove instalacije, molimo da stavite sljedeće liniju na dno vašeg LocalSettings.php:\n\n$1", - "config-localsettings-incomplete": "Postojeći LocalSettings.php se čini da je nepotpun.\nVarijabla $1 nije podešena.\nMolimo da zamjenite LocalSettings.php tako da je varijabla podešena, i kliknite \"{{int:Config-continue}}\".", + "config-localsettings-upgrade": "Otkrivena je datoteka LocalSettings.php.\nDa biste nadogradili instalaciju, upišite vrijednost od $wgUpgradeKey u okvir ispod.\nNaći ćete ga u LocalSettings.php.", + "config-localsettings-cli-upgrade": "Otkrivena je datoteka LocalSettings.php.\nDa biste nadogradili instalaciju, pokrenite update.php umjesto toga", + "config-localsettings-key": "Ključ za nadogradnju:", + "config-localsettings-badkey": "Ključ za nadogradnju koji ste naveli je pogrešan.", + "config-upgrade-key-missing": "Pronađena je postojeća instalacija MediaWikija.\nDa biste je nadogradili, umetnite sljedeći red na dno datoteke LocalSettings.php:\n\n$1", + "config-localsettings-incomplete": "Postojeća datoteka LocalSettings.php djeluje nepotpuna.\nNije postavljena varijabla $1.\nIzmijenite datoteku LocalSettings.php tako što ćete varijabli zadati vrijednost, pa kliknite na \"{{int:Config-continue}}\".", "config-session-error": "Greška pri pokretanju sesije: $1", - "config-no-session": "Vaši podaci sesije su izgubljeni!\nProvjerite vaš php.ini i provjerite da li je session.save_path postavljen na pravilni direktorijum.", + "config-no-session": "Vaši podaci o sesiji su izgubljeni!\nProvjerite je li session.save_path postavljen na pravilni direktorijum u php.ini.", "config-your-language": "Vaš jezik:", - "config-your-language-help": "Odaberite jezik koji ćete koristiti tokom procesa instalacije.", - "config-wiki-language": "Wiki jezik:", - "config-wiki-language-help": "Odaberite jezik na kojem će wiki biti najvećim dijelim pisana.", + "config-your-language-help": "Izaberite jezik koji želite koristiti tokom instalacije.", + "config-wiki-language": "Jezik wikija:", + "config-wiki-language-help": "Izaberite jezik na kojem će biti sadržaj wikija.", "config-back": "← Nazad", "config-continue": "Nastavi →", "config-page-language": "Jezik", - "config-page-welcome": "Dobrodošli u MediaWiki!", - "config-page-dbconnect": "Poveži sa bazom podataka", - "config-page-upgrade": "Unaprijedi postojeću instalaciju", + "config-page-welcome": "Dobro došli na MediaWiki!", + "config-page-dbconnect": "Povezivanje s bazom podataka", + "config-page-upgrade": "Nadogradnja postojeće instalacije", "config-page-dbsettings": "Postavke baze podataka", "config-page-name": "Naziv", "config-page-options": "Opcije", "config-page-install": "Instaliraj", "config-page-complete": "Završeno!", - "config-page-restart": "Ponovi instalaciju ispočetka", + "config-page-restart": "Ponovno pokretanje instalacije", "config-page-readme": "Pročitaj me", - "config-page-releasenotes": "Napomene izdanja", - "config-page-copying": "Kopiram", - "config-page-upgradedoc": "Nadograđujem", + "config-page-releasenotes": "Napomene o izdanju", + "config-page-copying": "Kopiranje", + "config-page-upgradedoc": "Nadogradnja", "config-page-existingwiki": "Postojeća wiki", - "config-help-restart": "Da li želite očistiti sve spremljene podatke koje ste unijeli i da započnete ponovo proces instalacije?", + "config-help-restart": "Želite li obrisati sve sačuvane podatke koje ste unijeli i ponovo pokrenuti instalaciju?", "config-restart": "Da, pokreni ponovo", - "config-sidebar": "* [https://www.mediawiki.org MediaWiki Početna strana]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ NPP]\n----\n* Pročitaj me\n* Napomene izdanja\n* Kopiranje\n* Poboljšavanje", + "config-sidebar": "* [https://www.mediawiki.org Početna strana MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ČPP]\n----\n* Pročitaj me\n* Napomene o izdanju\n* Kopiranje\n* Nadogradnja", "config-env-good": "Okruženje je provjereno.\nMožete instalirati MediaWiki.", + "config-env-bad": "Okruženje je provjereno.\nNe možete instalirati MediaWiki.", "config-env-php": "PHP $1 je instaliran.", "config-env-hhvm": "HHVM $1 je instaliran.", - "config-no-db": "Nije mogao biti pronađen pogodan driver za bazu podataka! Morate instalirati driver baze podataka za PHP.\nSljedeće vrste baza podataka {{PLURAL:$2|type is|types are}}su podržane: $1.\n\nAko se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka, koristeći naprimjer, ./configure --with-mysqli.\nAko ste instalirali PHP iz Debian ili Ubuntu paketa, tada morate instalirati, naprimjer, i paket php5-mysql.", + "config-no-db": "Ne mogu pronaći pogodan upravljački program za bazu podataka! Morate ga instalirati za PHP-bazu.\n{{PLURAL:$2|Podržana je sljedeća vrsta|Podržane su sljedeće vrste}} baze podataka: $1.\n\nAko se sami kompajlirali PHP, omogućite klijent baze podataka u postavkama koristeći, naprimjer, ./configure --with-mysqli.\nAko ste instalirali PHP iz paketa za Debian ili Ubuntu, onda također morate instalirati, naprimjer, paket php5-mysql.", + "config-memory-raised": "memory_limit za PHP iznosi $1, povišen na $2.", + "config-memory-bad": "Upozorenje: memory_limit za PHP iznosi $1.\nOvo je vjerovatno premalo.\nInstalacija možda neće uspjeti!", "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instaliran", "config-apc": "[http://www.php.net/apc APC] je instaliran", + "config-apcu": "[http://www.php.net/apcu APCu] je instaliran", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran", "config-diff3-bad": "GNU diff3 nije pronađen.", + "config-git": "Pronađen je Git program za kontrolu verzija: $1.", + "config-git-bad": "Nije pronađen Git program za kontrolu verzija.", + "config-imagemagick": "Pronađen je ImageMagick: $1.\nAko omogućite postavljanje, bit će omogućena minijaturizacija slika.", + "config-gd": "Utvrđeno je da je ugrađena grafička biblioteka GD.\nAko omogućite postavljanje, bit će omogućena minijaturizacija slika.", + "config-no-scaling": "Ne mogu pronaći biblioteku GD niti ImageMagick.\nMinijaturizacija slika bit će onemogućena.", + "config-no-uri": "Greška: Ne mogu utvrditi trenutni URI.\nInstalacija je prekinuta.", "config-db-type": "Vrsta baze podataka:", "config-db-host": "Domaćin baze podataka:", "config-db-wiki-settings": "Identificiraj ovu wiki", "config-db-name": "Naziv baze podataka:", "config-db-name-oracle": "Šema baze podataka:", + "config-db-install-account": "Korisnički račun za instalaciju", "config-db-username": "Korisničko ime baze podataka:", "config-db-password": "Lozinka baze podataka:", + "config-db-wiki-account": "Korisnički račun za redovan rad", + "config-db-prefix": "Prefiks tabele u bazi podataka:", + "config-mysql-old": "Zahtijeva se MySQL $1 ili noviji. Vi imate $2.", "config-db-port": "Port baze podataka:", - "config-header-mysql": "Postavke MySQL", - "config-header-postgres": "Postavke PostgreSQL", - "config-header-sqlite": "Postavke SQLite", - "config-header-oracle": "Postavke Oracle", - "config-header-mssql": "Postavke za Microsoft SQL Server", - "config-invalid-db-type": "Invalidna vrsta baze podataka.", + "config-db-schema": "Šema za MediaWiki:", + "config-pg-test-error": "Ne mogu se povezati na bazu podataka $1: $2", + "config-sqlite-dir": "Folder za SQLite-podatke:", + "config-oracle-def-ts": "Predodređeni tabelarni prostor:", + "config-oracle-temp-ts": "Privremeni tabelarni prostor:", + "config-type-mysql": "MySQL (ili kompaktibilan)", + "config-type-mssql": "Microsoft SQL Server", + "config-header-mysql": "Postavke MySQL-a", + "config-header-postgres": "Postavke PostgreSQL-a", + "config-header-sqlite": "Postavke SQLite-a", + "config-header-oracle": "Postavke Oraclea", + "config-header-mssql": "Postavke Microsoft SQL Servera", + "config-invalid-db-type": "Nevažeća vrsta baze podataka.", "config-missing-db-name": "Morate unijeti vrijednost za \"{{int:config-db-name}}\".", - "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti vašu wiki].\n\nAko želite regenerisati vašu datoteku LocalSettings.php, kliknite na dugme ispod.\nOvo '''nije preporučeno''' osim ako nemate problema s vašom wiki.", + "config-missing-db-host": "Morate unijeti vrijednost za \"{{int:config-db-host}}\".", + "config-missing-db-server-oracle": "Morate unijeti vrijednost za \"{{int:config-db-host-oracle}}\".", + "config-db-sys-create-oracle": "Program za instalaciju podržava samo upotrebu SYSDBA-računa za pravljenje novih računa.", + "config-postgres-old": "Zahtijeva se PostgreSQL $1 ili noviji. Vi imate $2.", + "config-mssql-old": "Zahtijeva se Microsoft SQL Server $1 ili noviji. Vi imate $2.", + "config-sqlite-name-help": "Izaberite ime koje će predstavljati Vaš wiki.\nNemojte koristiti razmake i crte.\nOvo će se koristiti za ime datoteke SQLite-podataka.", + "config-sqlite-readonly": "Datoteka $1 nije zapisiva.", + "config-sqlite-cant-create-db": "Ne mogu napraviti datoteku $1 za bazu podataka.", + "config-sqlite-fts3-downgrade": "PHP ne podržava FTS3, poništavam nadogradnju tabela.", + "config-upgrade-done": "Nadogradnja završena.\n\nSada možete [$1 početi koristiti Vaš wiki].\n\nAko želite regenerirati Vašu datoteku LocalSettings.php, kliknite na dugme ispod.\nOvo nije preporučeno osim ako nemate problema s Vašim wikijem.", + "config-upgrade-done-no-regenerate": "Nadogradnja završena.\n\nSad možete [$1 početi da koristite svoj wiki].", + "config-regenerate": "Regeneriraj LocalSettings.php →", + "config-unknown-collation": "Upozorenje: Baza podataka koristi nepoznatu kolaciju.", + "config-db-web-account": "Račun baze podataka za mrežni pristup", + "config-db-web-account-same": "Koristi isti račun kao i za instalaciju", + "config-db-web-create": "Napravi račun ako već ne postoji", + "config-mysql-engine": "Skladišni pogon:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", "config-mysql-binary": "Binarni", - "config-site-name": "Ime wiki:", + "config-mysql-utf8": "UTF-8", + "config-mssql-auth": "Vrsta autentifikacije:", + "config-site-name": "Ime wikija:", + "config-site-name-blank": "Upišite ime sajta.", + "config-project-namespace": "Imenski prostor projekta:", + "config-ns-generic": "Projekt", + "config-ns-site-name": "Isti kao ime wikija: $1", + "config-ns-other": "Drugo (navedite)", "config-ns-other-default": "MyWiki", + "config-admin-box": "Administratorski račun", "config-admin-name": "Vaše korisničko ime:", "config-admin-password": "Lozinka:", - "config-admin-password-confirm": "Ponovno unesite lozinku:", + "config-admin-password-confirm": "Ponovo unesite lozinku:", + "config-admin-help": "Ovdje upišite željeno korisničko ime; naprimjer, \"Petar Petrović\".\nOvo ćete ime koristiti za prijavu na wiki.", + "config-admin-name-blank": "Upišite administratorsko korisničko ime.", + "config-admin-name-invalid": "Navedeno korisničko ime \"$1\" nije ispravno.\nNavedite drugo.", + "config-admin-password-blank": "Upišite lozinku za administratorski račun.", + "config-admin-password-mismatch": "Lozinke koje ste upisali se ne poklapaju.", "config-admin-email": "Adresa e-pošte:", - "config-profile-wiki": "Otvori wiki", - "config-profile-private": "Privatna wiki", + "config-admin-error-bademail": "Upisali ste neispravnu adresu e-pošte.", + "config-pingback": "Podijeli podatke o instalaciji s programerima MediaWikija.", + "config-optional-continue": "Postavi mi još pitanja.", + "config-optional-skip": "Već mi je dosadilo, daj samo instaliraj wiki.", + "config-profile": "Profil korisničkih prava:", + "config-profile-wiki": "Otvoren wiki", + "config-profile-no-anon": "Potrebno je napraviti račun", + "config-profile-fishbowl": "Samo ovlašteni korisnici", + "config-profile-private": "Privatni wiki", + "config-license": "Autorska prava i licenca:", + "config-license-none": "Bez podnožja za licencu", "config-license-pd": "Javno vlasništvo", - "config-logo": "Logo URL:", - "config-cc-again": "Odaberi ponovno...", + "config-email-settings": "Postavke e-pošte", + "config-enable-email": "Omogući odlaznu e-poštu", + "config-upload-enable": "Omogući postavljanje datoteka", + "config-upload-deleted": "Folder za obrisane datoteke:", + "config-logo": "URL logotipa:", + "config-instantcommons": "Omogući Instant Commons", + "config-cc-again": "Izaberite ponovo...", + "config-advanced-settings": "Napredna konfiguracija", + "config-extensions": "Proširenja", "config-skins": "Teme", + "config-skins-use-as-default": "Koristi temu kao predodređenu", + "config-skins-missing": "Nije pronađena nijedna tema. MediaWiki će koristiti rezervnu temu dok ne instalirate druge.", + "config-skins-must-enable-some": "Morate izabrati barem jednu temu.", + "config-skins-must-enable-default": "Tema koju ste izabrali za predodređenu mora se omogućiti.", + "config-install-alreadydone": "Upozorenje: Izgleda da već imate instaliran MediaWiki i da ga ponovo pokušavate instalirati.\nIdite na sljedeću stranicu.", "config-install-step-done": "završeno", "config-install-step-failed": "neuspješno", - "config-install-extensions": "Uključujući ekstenzije", - "config-install-tables": "Kreiranje tabela", + "config-install-extensions": "Uključujem proširenja", + "config-install-database": "Postavljam bazu podataka", + "config-install-schema": "Pravim šemu", + "config-install-pg-plpgsql": "Provjeravam jezik PL/pgSQL", + "config-pg-no-plpgsql": "Morate instalirati jezik PL/pgSQL u bazu podataka $1", + "config-install-user": "Pravim korisnika baze podataka", + "config-install-user-alreadyexists": "Korisnik \"$1\" već postoji", + "config-install-user-create-failed": "Pravljenje korisnika \"$1\" nije uspjelo: $2", + "config-install-user-grant-failed": "Dodjeljivanje dozvola korisniku \"$1\" nije uspjelo: $2", + "config-install-user-missing": "Navedeni korisnik \"$1\" ne postoji.", + "config-install-tables": "Pravim tabele", + "config-install-interwiki": "Popunjavam predodređenu međuprojektnu tabelu", + "config-install-stats": "Pokrećem statistiku", + "config-install-keys": "Stvaram tajne ključeve", + "config-install-updates": "Spriječi pokretanje nepotrebnih ažuriranja", + "config-install-sysop": "Pravim administratorski korisnički račun", + "config-install-subscribe-fail": "Ne mogu Vas pretplatiti na mediawiki-announce: $1", + "config-install-subscribe-notpossible": "cURL nije instaliran, a allow_url_fopen nije dostupno.", + "config-install-mainpage": "Pravim početnu stranicu sa standardnim sadržajem", + "config-install-mainpage-exists": "Početna strana već postoji. Prelazim na sljedeće.", + "config-install-mainpage-failed": "Ne mogu umetnuti početnu stranu: $1", + "config-download-localsettings": "Preuzmi LocalSettings.php", "config-help": "pomoć", - "config-help-tooltip": "klikni za proširenje", - "mainpagetext": "'''MediaWiki softver je uspješno instaliran.'''", - "mainpagedocfooter": "Kontaktirajte [https://meta.wikimedia.org/wiki/Help:Sadržaj uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]" + "config-help-tooltip": "kliknite da proširite", + "config-nofile": "Datoteka \"$1\" nije pronađena. Da nije obrisana?", + "mainpagetext": "MediaWiki je instaliran.", + "mainpagedocfooter": "Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents korisnički vodič] za uputstva o upotrebi wiki softvera.\n\n== Prvi koraci ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Spisak postavki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Često postavljana pitanja o MediaWikiju]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Dopisna lista o izdanjima MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalizirajte MediaWiki za svoj jezik]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučite kako se boriti protiv neželjenog sadržaja na svom wikiju]" } diff --git a/includes/installer/i18n/ca.json b/includes/installer/i18n/ca.json index 559e7dd9d9..c86b824447 100644 --- a/includes/installer/i18n/ca.json +++ b/includes/installer/i18n/ca.json @@ -62,6 +62,7 @@ "config-memory-bad": "Avís: El memory_limit del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!", "config-xcache": "[http://xcache.lighttpd.net/ XCache] està instal·lat", "config-apc": "L’[http://www.php.net/apc APC] està instal·lat", + "config-apcu": "[http://www.php.net/apcu APCu] està instal·lat", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] està instal·lat", "config-diff3-bad": "No s'ha trobat el GNU diff3.", "config-git": "S'ha trobat el programari de control de versions Git: $1.", @@ -203,6 +204,7 @@ "config-cache-options": "Configuració per a la memòria cau dels objectes:", "config-cache-help": "L'encauament d'objectes s'utilitza per a millorar la rapidesa del MediaWiki afegint a la memòria cau les dades que s'utilitzen de forma freqüent. És recomanable que els llocs web mitjans o grans ho habilitin. També els llocs web petits en veuran els beneficis.", "config-cache-none": "Sense encauament (no se suprimeix cap funcionalitat, però la velocitat pot veure's afectada en els llocs wiki més grans)", + "config-cache-accel": "Emmagatzemament en memòria cau d'objectes de PHP (APC, APCu, XCache o WinCache)", "config-cache-memcached": "Utilitza Memcached (requereix una instal·lació i configuració addicionals)", "config-memcached-servers": "Servidors de Memcache:", "config-memcache-badip": "Heu introduït una adreça IP no vàlida per al Memcached: $1.", @@ -210,10 +212,12 @@ "config-memcache-badport": "Els números de port de Memcached han de ser entre $1 i $2.", "config-extensions": "Extensions", "config-skins": "Aparences", + "config-skins-help": "S'han detectat els temes llistats a dalt en el directori ./skins. Heu d'habilitar-ne com a mínim un i trieu-ne el predeterminat.", "config-skins-use-as-default": "Utilitza aquest tema per defecte", "config-skins-missing": "No s'ha trobat cap tema; MediaWiki utilitzarà el tema per defecte fins que hi instal·leu alguns adequats.", "config-skins-must-enable-some": "Heu de triar com a mínim un tema per habilitar.", "config-skins-must-enable-default": "Cal habilitar el tema triat per defecte.", + "config-install-alreadydone": "Avís: Sembla que ja havíeu instal·lat MediaWiki i esteu provant d'instal·lar-lo de nou.\nProcediu a la pàgina següent.", "config-install-begin": "En fer clic a «{{int:config-continue}}» s’iniciarà la instal·lació del MediaWiki. Si encara voleu fer canvis, feu clic a «{{int:config-back}}».", "config-install-step-done": "fet", "config-install-step-failed": "ha fallat", @@ -252,6 +256,7 @@ "config-help": "ajuda", "config-help-tooltip": "feu clic per ampliar", "config-nofile": "No s'ha pogut trobar el fitxer «$1». S'ha suprimit?", + "config-extension-link": "Sabíeu que el vostre wiki permet l'ús d'[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nPodeu navegar les [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions per categoria] o la [https://www.mediawiki.org/wiki/Extension_Matrix matriu d'extensions] per a veure'n una llista sencera.", "mainpagetext": "MediaWiki s'ha instal·lat.", - "mainpagedocfooter": "Consulteu la [https://meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.\n\n== Per a començar ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de característiques configurables]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduïu MediaWiki en la vostra llengua]" + "mainpagedocfooter": "Consulteu la [https://meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar aquest programari wiki.\n\n== Primers passos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de paràmetres configurables]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF del MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu per a anuncis del MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducció de MediaWiki en la vostra llengua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprengueu com combatre la brossa que pot atacar el vostre wiki]" } diff --git a/includes/installer/i18n/ce.json b/includes/installer/i18n/ce.json index cb7e392d03..e11fae2374 100644 --- a/includes/installer/i18n/ce.json +++ b/includes/installer/i18n/ce.json @@ -29,7 +29,7 @@ "config-page-existingwiki": "Йолуш йолу вики", "config-copyright": "=== Авторан бакъонаш а хьал а ===\n\n$1\nMediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.\n\nMediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма цхьа юкъарахилар доцуш. Хь. кхин. лицензи мадарра GNU General Public License .\n\nШоьга кхача езаш яра [{{SERVER}}{{SCRIPTPATH}}/COPYING копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [//www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].", "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.", - "config-no-cli-uri": "'''ДӀахьедар''': --scriptpath параметр язйина яц, иза Ӏад йитарца лелош ю: $1 .", + "config-no-cli-uri": "'''ДӀахьедар''': --scriptpath параметр язйина яц, иза Ӏадйитаран кепаца лелош ю: $1 .", "config-db-name": "Хаамийн базан цӀе:", "config-type-mssql": "Microsoft SQL Server", "config-header-mssql": "Microsoft SQL Server параметраш", @@ -66,9 +66,9 @@ "config-logo": "Логотипан URL:", "config-cc-again": "Хьаржа кхин цӀа…", "config-skins": "Кечяран тема", - "config-skins-use-as-default": "ХӀара тема Ӏад йитарца лелае", + "config-skins-use-as-default": "ХӀара тема Ӏадйитаран кепара лелае", "config-skins-must-enable-some": "Ахьа цхьаъ мукъа тема латина йита езаш ю.", - "config-skins-must-enable-default": "Ӏад йитарца йолу тема латина хила еза.", + "config-skins-must-enable-default": "Ӏадйитаран кепаца йолу тема латина хила еза.", "config-install-step-done": "кхочушдина", "config-install-step-failed": "тар цаделира", "config-install-user": "Декъашхочун хаамийн база кхоллар", diff --git a/includes/installer/i18n/csb.json b/includes/installer/i18n/csb.json index 2ba47f158b..defaf1bb06 100644 --- a/includes/installer/i18n/csb.json +++ b/includes/installer/i18n/csb.json @@ -1,4 +1,64 @@ { - "@metadata": [], - "mainpagetext": "'''MediaWiki òsta zainstalowónô.'''" + "@metadata": { + "authors": [ + "Kaszeba" + ] + }, + "config-desc": "Jinstalownik MediaWiki", + "config-title": "Jinstalowanié MediaWiki $1", + "config-information": "Wëdowiédzô", + "config-localsettings-key": "Klucz aktualizacëji:", + "config-localsettings-badkey": "Lëchi klucz aktualizacëji.", + "config-session-error": "Fela zrëszeniô sesëji – $1", + "config-your-language": "Twój jãzëk:", + "config-your-language-help": "Wybierzë jãzëk procesu jinstalacëji.", + "config-wiki-language": "Jãzëk wiki:", + "config-back": "← Nazôd", + "config-continue": "Dali →", + "config-page-language": "Jãzëk", + "config-page-welcome": "Witómë w MediaWiki!", + "config-page-dbconnect": "Sparłãczë z bazą pòdôwków", + "config-page-upgrade": "Zaktualnienié jinstalacëji", + "config-page-dbsettings": "Nastôw bazë pòdôwków", + "config-page-name": "Miono", + "config-page-options": "Òptacëje", + "config-page-install": "Wjinstalëjë", + "config-page-complete": "Fardich!", + "config-page-restart": "Zrëszë jinstalacëjã znowa", + "config-page-readme": "Spòdlowô wëdowiédzô", + "config-page-releasenotes": "Wëdowiédzô ò wersëji", + "config-page-copying": "Kòpérowanié", + "config-page-upgradedoc": "Zaktualnienié", + "config-page-existingwiki": "Egyzstëjącô wiki", + "config-restart": "Jo, zrëszë znowa", + "config-env-php": "PHP $1 je wjinastalowóné", + "config-env-hhvm": "HHVM $1 je wjinastalowóné", + "config-memory-raised": "Paraméter PHP memory_limit $1 òstôł zwikszony do $2.", + "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] je wjinstalowóny", + "config-apc": "[Http://www.php.net/apc APC] je wjinstalowóny", + "config-apcu": "[http://www.php.net/apcu APCu] je wjinstalowóny", + "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je wjinstalowóny", + "config-diff3-bad": "Felënk GNU diff3.", + "config-mysql-innodb": "InnoDB", + "config-mysql-myisam": "MyISAM", + "config-mysql-binary": "binarny", + "config-mysql-utf8": "UTF‐8", + "config-site-name": "Miono wiki:", + "config-site-name-blank": "Wpiszë miono starnów.", + "config-ns-other-default": "MòjôWiki", + "config-admin-box": "Kònto sprôwnika", + "config-admin-name": "Twòjé miono brëkòwnika:", + "config-admin-password": "Parola:", + "config-admin-password-confirm": "Pòwtórzë parolã:", + "config-admin-name-blank": "Wpiszë miono brëkòwnika, chtëren bãdze sprôwnikã.", + "config-admin-email": "E-mailowô adresa:", + "config-license-none": "Felënk stopczi z licencëją", + "config-email-settings": "Nastôwë e-mail", + "config-logo": "Adresa URL logo:", + "config-skins": "Wëzdrzatk", + "config-skins-use-as-default": "Ùżëjë tegò wëzdrzatkù za domëslny", + "config-install-step-done": "fardich", + "config-install-step-failed": "nie dzrzëło sã", + "config-help": "pòmòc", + "mainpagetext": "MediaWiki òsta wjinstalowónô." } diff --git a/includes/installer/i18n/de.json b/includes/installer/i18n/de.json index 3babc3f851..ca649dcab5 100644 --- a/includes/installer/i18n/de.json +++ b/includes/installer/i18n/de.json @@ -92,6 +92,7 @@ "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien ($1) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.", "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nAktualisiere auf libxml2 2.7.3 oder später, um das Problem zu lösen. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).", "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich, sollte der Parameter suhosin.get.max_value_length in der Datei php.ini auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter $wgResourceLoaderMaxQueryLength in der Datei LocalSettings.php auf den selben Wert eingestellt werden.", + "config-using-32bit": "Warnung: Es scheint, als ob dein System mit 32-Bit-Ganzzahlen läuft. Dies wird [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit nicht empfohlen].", "config-db-type": "Datenbanksystem:", "config-db-host": "Datenbankserver:", "config-db-host-help": "Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.\n\nSofern ein gemeinschaftlich genutzter Server verwendet wird, sollte der Hoster den zutreffenden Servernamen in seiner Dokumentation angegeben haben.\n\nSofern auf einem Windows-Server installiert und MySQL genutzt wird, funktioniert der Servername „localhost“ voraussichtlich nicht. Wenn nicht, sollte „127.0.0.1“ oder die lokale IP-Adresse angegeben werden.\n\nSofern PostgresQL genutzt wird, muss dieses Feld leer gelassen werden, um über ein Unix-Socket zu verbinden.", @@ -325,6 +326,8 @@ "config-help-tooltip": "Zum Expandieren klicken", "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.", + "config-skins-screenshots": "$1 (Bildschirmfotos: $2)", + "config-screenshot": "Bildschirmfoto", "mainpagetext": "MediaWiki wurde installiert.", "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]" } diff --git a/includes/installer/i18n/en.json b/includes/installer/i18n/en.json index db92652d93..6319b76da7 100644 --- a/includes/installer/i18n/en.json +++ b/includes/installer/i18n/en.json @@ -75,6 +75,7 @@ "config-no-cli-uploads-check": "Warning: Your default directory for uploads ($1) is not checked for vulnerability\nto arbitrary script execution during the CLI install.", "config-brokenlibxml": "Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.\nUpgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallation aborted.", "config-suhosin-max-value-length": "Suhosin is installed and limits the GET parameter length to $1 bytes.\nMediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.\nIf at all possible, you should set suhosin.get.max_value_length to 1024 or higher in php.ini, and set $wgResourceLoaderMaxQueryLength to the same value in LocalSettings.php.", + "config-using-32bit": "Warning: your system appears to be running with 32-bit integers. This is [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit not advised].", "config-db-type": "Database type:", "config-db-host": "Database host:", "config-db-host-help": "If your database server is on different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.", @@ -308,6 +309,9 @@ "config-help-tooltip": "click to expand", "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.", + "config-skins-screenshots": "$1 (screenshots: $2)", + "config-skins-screenshot": "$1 ($2)", + "config-screenshot": "screenshot", "mainpagetext": "MediaWiki has been installed.", "mainpagedocfooter": "Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/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]" } diff --git a/includes/installer/i18n/es.json b/includes/installer/i18n/es.json index 8c4914c056..279e26a8e5 100644 --- a/includes/installer/i18n/es.json +++ b/includes/installer/i18n/es.json @@ -45,7 +45,7 @@ "config-localsettings-badkey": "La clave de actualización proporcionada es incorrecta.", "config-upgrade-key-missing": "Se ha detectado una instalación existente de MediaWiki.\nPara actualizar la instalación, añade la siguiente línea al final de tu LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "El archivo LocalSettings.php existente parece estar incompleto.\nLa variable $1 no está definida.\nCambia LocalSettings.php para que esta variable quede establecida y haz clic en \"{{int:Config-continue}}\".", - "config-localsettings-connection-error": "Se ha producido un error al conectar a la base de datos utilizando la configuración especificada en LocalSettings.php. Corrige estos ajustes e inténtalo de nuevo.\n\n$1", + "config-localsettings-connection-error": "Se ha producido un error al conectar con la base de datos a través de la configuración especificada en LocalSettings.php. Corrige estos ajustes e inténtalo de nuevo.\n\n$1", "config-session-error": "Error al iniciar la sesión: $1", "config-session-expired": "Tus datos de sesión parecen haber expirado.\nLas sesiones están configuradas por una duración de $1.\nPuedes incrementar esto configurando session.gc_maxlifetime en php.ini.\nReiniciar el proceso de instalación.", "config-no-session": "Se han perdido los datos de sesión.\nVerifica tu php.ini y comprueba que session.save_path está establecido en un directorio apropiado.", @@ -57,7 +57,7 @@ "config-continue": "Continuar →", "config-page-language": "Idioma", "config-page-welcome": "Te damos la bienvenida a MediaWiki.", - "config-page-dbconnect": "Conectar a la base de datos", + "config-page-dbconnect": "Conectar con la base de datos", "config-page-upgrade": "Actualizar instalación existente", "config-page-dbsettings": "Configuración de la base de datos", "config-page-name": "Nombre", @@ -98,7 +98,7 @@ "config-diff3-bad": "GNU diff3 no se encuentra.", "config-git": "Se encontró el software de control de versiones Git: $1.", "config-git-bad": "No se encontró el software de control de versiones Git.", - "config-imagemagick": "ImageMagick encontrado: $1.\nLa miniaturización de imágenes se habilitará si habilitas las cargas.", + "config-imagemagick": "ImageMagick encontrado: $1.\nLa miniaturización de imágenes se habilitará si habilitas la subida de archivos.", "config-gd": "Se ha encontrado una biblioteca de gráficos GD integrada.\nLa miniaturización de imágenes se habilitará si habilitas las subidas.", "config-no-scaling": "No se ha encontrado la biblioteca GD o ImageMagik.\nSe desactivará la miniaturización de imágenes.", "config-no-uri": "Error: no se pudo determinar el URI actual.\nSe interrumpió la instalación.", @@ -134,7 +134,7 @@ "config-db-port": "Puerto de la base de datos:", "config-db-schema": "Esquema para MediaWiki", "config-db-schema-help": "Este esquema usualmente estará bien.\nCámbialos solo si lo necesitas.", - "config-pg-test-error": "No se puede conectar a la base de datos $1: $2", + "config-pg-test-error": "No se puede conectar con la base de datos $1: $2", "config-sqlite-dir": "Directorio de datos SQLite:", "config-sqlite-dir-help": "SQLite almacena todos los datos en un único archivo.\n\nEl directorio que proporciones debe poder escribirse por el servidor web durante la instalación.\n\n'''No''' debería ser accesible a través de Internet. Por eso no vamos a ponerlo en el sitio donde están los archivos PHP.\n\nEl instalador escribirá un archivo .htaccess junto con él, pero si falla alguien podría tener acceso a la base de datos en bloque.\nEso incluye los datos de usuario en bloque (direcciones de correo electrónico, las contraseñas con hash) así como revisiones eliminadas y otros datos restringidos del wiki.\n\nConsidera poner la base de datos en algún otro sitio, por ejemplo en /var/lib/mediawiki/tuwiki .", "config-oracle-def-ts": "Espacio de tablas predeterminado:", @@ -149,7 +149,7 @@ "config-dbsupport-postgres": "[{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)", "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([http://www.php.net/manual/es/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])", - "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es una base de datos comercial a nivel empresarial para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con soporte para SQLSRV])", + "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un sistema comercial de base de datos empresariales para Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con compatibilidad con SQLSRV])", "config-header-mysql": "Configuración de MySQL", "config-header-postgres": "Configuración de PostgreSQL", "config-header-sqlite": "Configuración de SQLite", diff --git a/includes/installer/i18n/eu.json b/includes/installer/i18n/eu.json index 7690b01e4f..430345efd3 100644 --- a/includes/installer/i18n/eu.json +++ b/includes/installer/i18n/eu.json @@ -40,8 +40,11 @@ "config-env-hhvm": "HHVM $1 instalatuta dago.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalatuta dago", "config-apc": "[http://www.php.net/apc APC] instalatuta dago", + "config-apcu": "[http://www.php.net/apcu APCu] instalatuta dago", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago", "config-diff3-bad": "GNU diff3 ez da aurkitu.", + "config-using-server": "\"$1\" zerbitzari-izena erabiltzen.", + "config-using-uri": "\"$1$2\" zerbitzariaren URLa erabiltzen.", "config-db-type": "Datu-base mota:", "config-db-host": "Datu-basearen zerbitzaria:", "config-db-host-oracle": "Datu-baseko TNS:", @@ -64,6 +67,8 @@ "config-header-mssql": "Microsoft SQL Server-en ezarpenak", "config-invalid-db-type": "Datu-base mota baliogabea.", "config-db-sys-user-exists-oracle": "$1 erabiltzaile kontua dagoeneko existitzen da. SYSDBA kontu berri bat sortzeko erabili daiteke soilik!", + "config-sqlite-readonly": "Ezin da idatzi $1 fitxategian.", + "config-regenerate": "Birsortu LocalSettings.php →", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", "config-mysql-binary": "Bitarra", @@ -113,6 +118,7 @@ "config-download-localsettings": "Jaitsi LocalSettings.php", "config-help": "Laguntza", "config-help-tooltip": "sakatu zabaltzeko", + "config-nofile": "Ezin da \"$1\" fitxategia aurkitu. Ezabatua izan da?", "mainpagetext": "MediaWiki instalatu da.", "mainpagedocfooter": "Ikus [https://meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]" } diff --git a/includes/installer/i18n/fa.json b/includes/installer/i18n/fa.json index 411b2d0f72..6282ca1bd2 100644 --- a/includes/installer/i18n/fa.json +++ b/includes/installer/i18n/fa.json @@ -68,7 +68,7 @@ "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.", "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.", "config-pcre-old": "''' خطای اساسی:'' ' PCRE $1 یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].", - "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.", + "config-pcre-no-utf8": "مخرب: به‌ نظر می‌رسد پودمان پی‌سی‌آراییِ پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.", "config-memory-raised": "PHP's memory_limit, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.", "config-memory-bad": "'''هشدار:''' PHP's memory_limit نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.", diff --git a/includes/installer/i18n/fr.json b/includes/installer/i18n/fr.json index 953d427feb..9122967fcf 100644 --- a/includes/installer/i18n/fr.json +++ b/includes/installer/i18n/fr.json @@ -81,7 +81,7 @@ "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.", "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.", "config-pcre-old": "'''Fatal :''' PCRE $1 ou ultérieur est nécessaire.\nVotre binaire PHP est lié avec PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Plus d’information sur PCRE].", - "config-pcre-no-utf8": "'''Erreur fatale''': Le module PCRE de PHP semble être compilé sans le support PCRE_UTF8.\nMédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.", + "config-pcre-no-utf8": "Erreur fatale: le module PCRE de PHP semble être compilé sans la prise en charge de PCRE_UTF8.\nMédiaWiki a besoin de la gestion d’UTF-8 pour fonctionner correctement.", "config-memory-raised": "Le paramètre memory_limit de PHP était à $1, porté à $2.", "config-memory-bad": "'''Attention :''' Le paramètre memory_limit de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !", "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé", @@ -89,7 +89,7 @@ "config-apcu": "[http://www.php.net/apcu APCu] est installé", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé", "config-no-cache-apcu": "Attention : Impossible de trouver [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa mise en cache d'objets n'est pas activée.", - "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S'il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.", + "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S’il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d’autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le soutien de votre hébergeur si vous rencontrez des erreurs aléatoires.", "config-diff3-bad": "GNU diff3 introuvable.", "config-git": "Logiciel de contrôle de version Git trouvé : $1.", "config-git-bad": "Logiciel de contrôle de version Git non trouvé.", @@ -140,11 +140,11 @@ "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "MediaWiki prend en charge ces systèmes de bases de données :\n\n$1\n\nSi vous ne voyez pas le système de base de données que vous essayez d’utiliser ci-dessous, alors suivez les instructions ci-dessus (voir liens) pour activer la prise en charge.", - "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] est le premier choix pour MediaWiki et est le mieux pris en charge. MediaWiki fonctionne aussi avec [{{int:version-db-mariadb-url}} MariaDB] et [{{int:version-db-percona-url}} Percona Server], qui sont compatibles avec MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Comment compiler PHP avec le support MySQL])", - "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php Comment compiler PHP avec le support de PostgreSQL]).", + "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] est le premier choix pour MediaWiki et est le mieux pris en charge. MediaWiki fonctionne aussi avec [{{int:version-db-mariadb-url}} MariaDB] et [{{int:version-db-percona-url}} Percona Server], qui sont compatibles avec MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Comment compiler PHP avec la prise en charge de MySQL])", + "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] est un système de base de données populaire en ''source ouverte'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php Comment compiler PHP avec la prise en charge de PostgreSQL]).", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] est un système de base de données léger bien pris en charge. ([http://www.php.net/manual/fr/pdo.installation.php Comment compiler PHP avec la prise en charge de SQLite], en utilisant PDO)", - "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])", - "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] est une base de données commerciale d’entreprise pour Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Comment compiler PHP avec le support de SQLSRV])", + "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec la prise en charge d’OCI8])", + "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] est une base de données commerciale d’entreprise pour Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Comment compiler PHP avec la prise en charge de SQLSRV])", "config-header-mysql": "Paramètres de MySQL", "config-header-postgres": "Paramètres de PostgreSQL", "config-header-sqlite": "Paramètres de SQLite", @@ -171,7 +171,7 @@ "config-sqlite-connection-error": "$1.\n\nVérifier le répertoire des données et le nom de la base de données ci-dessous et réessayer.", "config-sqlite-readonly": "Le fichier $1 n'est pas accessible en écriture.", "config-sqlite-cant-create-db": "Impossible de créer le fichier de base de données $1.", - "config-sqlite-fts3-downgrade": "PHP n'a pas trouvé le support FTS3, les tables sont restreintes.", + "config-sqlite-fts3-downgrade": "PHP n’a pas trouvé la prise en charge FTS3, les tables sont restreintes.", "config-can-upgrade": "Il y a des tables MediaWiki dans cette base de données.\nPour les mettre au niveau de MediaWiki $1, cliquez sur '''Continuer'''.", "config-upgrade-done": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier LocalSettings.php, cliquez sur le bouton ci-dessous.\nCeci '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.", "config-upgrade-done-no-regenerate": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].", @@ -236,7 +236,7 @@ "config-profile-no-anon": "Création de compte requise", "config-profile-fishbowl": "Éditeurs autorisés seulement", "config-profile-private": "Wiki privé", - "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d'autres cas et il n’est pas toujours facile de convaincre chacun des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle {{int:config-profile-wiki}} autorise toute personne à modifier, y compris sans s’identifier.\n{{int:config-profile-no-anon}} fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n{{int:config-profile-fishbowl}} autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n{{int:config-profile-private}} n’autorise que les utilisateurs approuvés à voir et éditer les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].", + "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d’autres cas et il n’est pas toujours facile de convaincre chacun des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle {{int:config-profile-wiki}} autorise toute personne à modifier, y compris sans s’identifier.\n{{int:config-profile-no-anon}} fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n{{int:config-profile-fishbowl}} autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n{{int:config-profile-private}} n’autorise que les utilisateurs approuvés à voir et modifier les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l’installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].", "config-license": "Droits d'auteur et licence :", "config-license-none": "Aucune licence en bas de page", "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique", @@ -260,13 +260,13 @@ "config-email-auth-help": "Si cette option est activée, les utilisateurs doivent confirmer leur adresse de courriel en utilisant l'hyperlien envoyé à chaque fois qu'ils la définissent ou la modifient.\nSeules les adresses authentifiées peuvent recevoir des courriels des autres utilisateurs ou lorsqu'il y a des notifications de modification.\nL'activation de cette option est '''recommandée''' pour les wikis publics en raison d'abus potentiels des fonctionnalités de courriels.", "config-email-sender": "Adresse de courriel de retour :", "config-email-sender-help": "Entrez l'adresse de courriel à utiliser comme adresse de retour des courriels sortant.\nLes courriels rejetés y seront envoyés.\nDe nombreux serveurs de courriels exigent au moins un [http://fr.wikipedia.org/wiki/Nom_de_domaine nom de domaine] valide.", - "config-upload-settings": "Téléchargement des images et des fichiers", - "config-upload-enable": "Activer le téléchargement des fichiers", + "config-upload-settings": "Téléversement des images et des fichiers", + "config-upload-enable": "Activer le téléversement des fichiers", "config-upload-help": "Le téléversement de fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléversement de fichiers, modifier les permissions du sous-répertoire images qui se situe sous le répertoire racine de MediaWiki de sorte à ce que le serveur web puisse écrire dedans.\nEnsuite, activez cette option.", "config-upload-deleted": "Répertoire pour les fichiers supprimés :", "config-upload-deleted-help": "Choisissez un répertoire qui servira à archiver les fichiers supprimés.\nIdéalement, il ne devrait pas être accessible depuis le web.", "config-logo": "URL du logo :", - "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléchargez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser $wgStylePath ou $wgScriptPath si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.", + "config-logo-help": "L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.\nTéléversez une image de la taille appropriée, et entrez son URL ici.\n\nVous pouvez utiliser $wgStylePath ou $wgScriptPath si votre logo est relatif à ces chemins.\n\nSi vous ne voulez pas de logo, laissez cette case vide.", "config-instantcommons": "Activer ''InstantCommons''", "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons/fr InstantCommons] est un service qui permet d’utiliser les images, les sons et les autres médias disponibles sur le site [https://meta.wikimedia.org/wiki/Wikimedia_Commons/fr Wikimédia Commons].\nPour ce faire, il faut que MediaWiki accède à Internet.\n\nPour plus d’informations sur ce service, y compris les instructions sur la façon de le configurer pour d’autres wikis que Wikimedia Commons, consultez le [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos manuel].", "config-cc-error": "Le sélection d'une licence ''Creative Commons'' n'a donné aucun résultat.\nEntrez le nom de la licence manuellement.", diff --git a/includes/installer/i18n/he.json b/includes/installer/i18n/he.json index 161c5db59e..78ea0a7f3b 100644 --- a/includes/installer/i18n/he.json +++ b/includes/installer/i18n/he.json @@ -316,6 +316,8 @@ "config-help-tooltip": "להרחיב", "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 הרחבות לפי קטגוריה].", + "config-skins-screenshots": "$1 (צילומי מסך: $2)", + "config-screenshot": "צילום מסך", "mainpagetext": "תוכנת מדיה־ויקי הותקנה בהצלחה.", "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/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 איך להיאבק נגד ספאם באתר הוויקי שלך]" } diff --git a/includes/installer/i18n/hi.json b/includes/installer/i18n/hi.json index 98af267443..9863beb1a0 100644 --- a/includes/installer/i18n/hi.json +++ b/includes/installer/i18n/hi.json @@ -6,7 +6,9 @@ "Phoenix303", "संजीव कुमार", "Sahilrathod", - "Shyamal" + "Shyamal", + "Sfic", + "Sachinkatiyar" ] }, "config-desc": "साँचा लिए इंस्टॉलर", @@ -16,17 +18,20 @@ "config-localsettings-cli-upgrade": "LocalSettings.php फ़ाइल पाया गया है ।\nइस स्थापना को अपग्रेड करने के लिए, बदले में कृपया करके ये चलाए update.php", "config-localsettings-key": "नवीनीकरण कुंजी", "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।", + "config-session-error": "सत्र शुरू करने में त्रुटि: $1", + "config-session-expired": "लग रहा है कि आपका सत्र डाटा समाप्त हो चुका है।\n$1 हेतु आप इस डाटा को हमेशा के लिए भी कर सकते हैं।\nइसे बढ़ाने हेतु आपको php.ini में session.gc_maxlifetime को बढ़ाना होगा।\nउसके बाद आपको स्थापित करने का कार्य फिर से करना होगा।", + "config-no-session": "आपका सत्र डाटा गुम हो गया।\nअपने php.ini को देखें कि session.save_path ठीक तरीके से सही पते पर तो है ना?", "config-your-language": "आपकी भाषा:", "config-your-language-help": "स्थापन के लिए भाषा चुनें", - "config-wiki-language": "विकी भाषा:", + "config-wiki-language": "विकि भाषा:", "config-wiki-language-help": "भाषा चुनें जिस में अधिकतर लेख लिखा जाएगा", "config-back": "← वापस", "config-continue": "आगे बढ़ें →", "config-page-language": "भाषा", - "config-page-welcome": "मीडियाविकी पर आपका स्वागत है!", - "config-page-dbconnect": "डेटाबेस से जुड़ें", + "config-page-welcome": "मीडियाविकि में आपका स्वागत है!", + "config-page-dbconnect": "डेटाबेस से जोड़ें", "config-page-upgrade": "मौजूदा स्थापना का नवीनीकरण", - "config-page-dbsettings": "डेटाबेस वरियतायें", + "config-page-dbsettings": "डेटाबेस सेटिंग (पसंद)", "config-page-name": "नाम", "config-page-options": "विकल्प", "config-page-install": "स्थापित करें", @@ -37,10 +42,32 @@ "config-page-copying": "अनुकरण", "config-page-upgradedoc": "उन्नयन", "config-page-existingwiki": "मौजूदा विकि", + "config-help-restart": "क्या आप अपने द्वारा दिये सभी डाटा को मिटाना चाहते हैं और फिर से स्थापित करना चाहते हैं?", "config-restart": "हाँ, इसे पुनः आरंभ करें", "config-env-php": "PHP $1 स्थापित किया गया है।", + "config-env-hhvm": "एचएचवीएम $1 स्थापित किया गया है।", + "config-memory-raised": "पीएचपी की memory_limit सीमा $1 है, जो $2 तक बढ़ गई है।", + "config-xcache": "[http://xcache.lighttpd.net/ एक्सकैश] स्थापित है।", + "config-apc": "[http://www.php.net/apc एपीसी] स्थापित है।", + "config-apcu": "[http://www.php.net/apcu एपीसीयू] स्थापित है।", + "config-wincache": "[http://www.iis.net/download/WinCacheForPhp विनकैश] स्थापित है।", + "config-using-32bit": "<विशेष>चेतावनी: आपका सिस्टम 32-बिट पूर्णांक के साथ चल रहा है यह [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit विवेचित नहीं है]।", + "config-db-type": "डेटाबेस प्रकार:", + "config-db-host": "डेटाबेस होस्ट:", + "config-db-host-oracle": "डेटाबेस टीएनएस:", "config-db-wiki-settings": "इस विकि को पहचानें", - "config-db-install-account": "इंस्टालेशन के लिए उपयोगकर्ता खाता", + "config-db-name": "डेटाबेस का नाम:", + "config-db-install-account": "इसे स्थापित करने हेतु सदस्य खाता", + "config-db-username": "डेटाबेस सदस्यनाम:", + "config-db-password": "डेटाबेस पासवर्ड:", + "config-db-port": "डेटाबेस पोर्ट:", + "config-type-mssql": "माइक्रोसॉफ़्ट एसक्यूएल सर्वर", + "config-invalid-db-type": "अमान्य डेटाबेस प्रकार", + "config-regenerate": "LocalSettings.php फिर से निर्मित करें →", + "config-db-web-account": "वेब पहुँच हेतु डेटाबेस खाता", + "config-mysql-innodb": "इनोडीबी", + "config-mysql-binary": "बाइनरी", + "config-mysql-utf8": "UTF-8", "config-mssql-auth": "प्रमाणन प्रकार:", "config-mssql-sqlauth": "SQL सर्वर प्रमाणन", "config-site-name": "विकि का नाम:", @@ -50,9 +77,10 @@ "config-ns-other": "अन्य (निर्दिष्ट करें)", "config-ns-other-default": "मेरा विकि", "config-admin-box": "व्यवस्थापक खाता", - "config-admin-name": "आपका उपयोगकर्ता नाम:", + "config-admin-name": "आपका सदस्य नाम:", "config-admin-password": "कूटशब्द:", "config-admin-password-confirm": "फिर से कूटशब्द:", + "config-admin-name-blank": "प्रबन्धक का सदस्य नाम लिखें।", "config-admin-email": "ईमेल पता:", "config-optional-continue": "मुझसे और सवाल पूछें।", "config-optional-skip": "मैं पहले से ही ऊब चुका हूँ, बस विकि स्थापित करें।", @@ -61,10 +89,25 @@ "config-profile-fishbowl": "केवल प्रमाषित संपादक ही", "config-profile-private": "निजी विकि", "config-license-cc-by": "क्रिएटिव कॉमन्स ऍट्रीब्यूशन", + "config-license-pd": "सार्वजनिक डोमैन", "config-email-watchlist": "ध्यानसूची अधिसूचना को सक्षम करें", + "config-upload-enable": "फ़ाइल अपलोड सक्रिय करें", + "config-upload-help": "यदि आप अपने सर्वर में फ़ाइल अपलोड की सेवा दे रहे हैं तो आपको सुरक्षा से समझौता करना पड़ सकता है।\n\nअधिक जानकारी के लिए मार्गदर्शक में [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security सुरक्षा अनुभाग] देखें।\n\nयदि आप फ़ाइल अपलोड को सक्रिय करना चाहते हैं तो आपको मीडियाविकि के फोंल्डर के images फोंल्डर में जाने के बाद उसे सर्वर द्वारा लिखने लायक बनाना होगा।\nउसके बाद ही आप इस विकल्प को सक्रिय कर सकते हैं।", + "config-logo": "''लोगो'' का पता:", + "config-instantcommons": "''कॉमन्स'' सक्रिय करें", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons कॉमन्स] एक प्रकार की विशेषता प्रदान करता है, जिससे आप विकि में [https://commons.wikimedia.org/ विकिमीडिया कॉमन्स] साइट के किसी भी तस्वीर, आवाज या अन्य फ़ाइल का उपयोग अपने मीडियाविकि में कर सकते हैं। इसके लिए मीडियाविकि को इंटरनेट से जुड़ा होना चाहिए।\n\nइस विशेषता की अधिक जानकारी के लिए और इसे किस प्रकार आप अपने विकि में सक्रिय कर सकते हैं आदि जानने के लिए [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos मार्गदर्शक] देखें।", "config-extensions": "एक्सटेंशन", + "config-skins": "त्वचा", + "config-install-step-done": "पूरा हुआ", + "config-install-step-failed": "विफल हुआ", + "config-install-user-alreadyexists": "सदस्य \"$1\" पहले से उपस्थित है।", + "config-install-user-create-failed": "सदस्य \"$1\" का निर्माण विफल हुआ: $2", + "config-install-keys": "गुप्त कुंजी बना रहा", + "config-install-sysop": "प्रबन्धक सदस्य खाता बना रहा", + "config-download-localsettings": "LocalSettings.php को डाउनलोड करें।", "config-help": "सहायता", + "config-help-tooltip": "विस्तार हेतु क्लिक करें", "config-nofile": "फ़ाइल \"$1\" नहीं पाई जा सकी। क्या इसे हटा दिया गया है?", - "mainpagetext": "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''", - "mainpagedocfooter": "विकि सॉफ्टवेयरके इस्तेमाल के लिये [https://meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।\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 मीडियाविकि मेलिंग लिस्ट]" + "mainpagetext": "मीडियाविकि का अब स्थापित हो चुका है।", + "mainpagedocfooter": "इस विकि सॉफ्टवेयर का किस प्रकार आप इस्तेमाल कर सकते हैं, इसकी जानकारी के लिए [https://meta.wikimedia.org/wiki/Help:Contents उपयोग मार्गदर्शक] देखें।\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 अपने विकि को किस प्रकार से विज्ञापन डालने वाले और बर्बरता करने वालों से बचा सकते हैं]" } diff --git a/includes/installer/i18n/hu.json b/includes/installer/i18n/hu.json index 5aece05f9a..759b82dbad 100644 --- a/includes/installer/i18n/hu.json +++ b/includes/installer/i18n/hu.json @@ -10,7 +10,8 @@ "Dorgan", "Macofe", "Máté", - "Seb35" + "Seb35", + "Urbalazs" ] }, "config-desc": "A MediaWiki telepítője", @@ -57,30 +58,31 @@ "config-env-php": "A PHP verziója: $1", "config-env-hhvm": "HHVM verziója: $1", "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.", - "config-unicode-pure-php-warning": "Figyelmeztetés: Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP-alapú implementáció lesz használatban.\nHa nagy látogatottságú oldalt üzemeltetsz, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations itt] találhatsz további információkat a témáról.", - "config-unicode-update-warning": "Figyelmeztetés: Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].", - "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a ./configure --with-mysqli parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.", + "config-unicode-pure-php-warning": "Figyelmeztetés: A Unicode-normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP-alapú implementáció lesz használatban.\nHa nagy látogatottságú oldalt üzemeltetsz, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations itt] találhatsz további információkat a témáról.", + "config-unicode-update-warning": "Figyelmeztetés: A Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ az ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].", + "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a ./configure --with-mysqli parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.", "config-outdated-sqlite": "Figyelmeztetés: SQLite $1 verziód van, ami alacsonyabb a legalább szükséges $2 verziónál. Az SQLite nem lesz elérhető.", - "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.", + "config-no-fts3": "Figyelmeztetés: Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.", "config-pcre-old": "Kritikus hiba: PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].", - "config-pcre-no-utf8": "'''Kritikus hiba''': Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.", + "config-pcre-no-utf8": "Kritikus hiba: Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.", "config-memory-raised": "A PHP memory_limit beállításának értéke: $1. Meg lett növelve a következő értékre: $2.", - "config-memory-bad": "'''Figyelmeztetés:''' A PHP memory_limit beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.", + "config-memory-bad": "Figyelmeztetés: A PHP memory_limit beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.", "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van", "config-apc": "Az [http://www.php.net/apc APC] telepítve van", "config-apcu": "Az [http://www.php.net/apcu APCu] telepítve van", "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van", + "config-no-cache-apcu": "Figyelmeztetés: nem találhatók a következők: [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] vagy [http://www.iis.net/download/WinCacheForPhp WinCache].\nAz objektum gyorsítótárazása nincs engedélyezve.", "config-diff3-bad": "GNU diff3 nem található.", "config-git": "Megtaláltam a Git verziókezelő szoftvert: $1.", "config-git-bad": "A Git verziókezelő rendszer nem található.", "config-imagemagick": "Az ImageMagick megtalálható a rendszeren: $1.\nA bélyegképek készítése engedélyezve lesz a feltöltések engedélyezése esetén.", "config-gd": "A GD grafikai könyvtár elérhető.\nBélyegképek készítése működni fog, miután engedélyezted a fájlfeltöltést.", "config-no-scaling": "Nem található a GD könyvtár és az ImageMagick.\nA bélyegképek készítése le lesz tiltva.", - "config-no-uri": "'''Hiba:''' Nem sikerült megállapítani a jelenlegi URI-t.\nTelepítés megszakítva.", + "config-no-uri": "Hiba: Nem sikerült megállapítani a jelenlegi URI-t.\nA telepítés megszakítva.", "config-no-cli-uri": "Figyelmeztetés: Nincs --scriptpath megadva, használom az alapértelmezettet: $1.", "config-using-server": "A következő szervernév használata: „$1”.", - "config-using-uri": "A következő szerver URL-cím használata: „$1$2”.", - "config-uploads-not-safe": "'''Figyelmeztetés:''' a feltöltésekhez használt alapértelmezett könyvtárban ($1) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security a sérülékenység megszüntetése].", + "config-using-uri": "A következő szerver-URL használata: „$1$2”.", + "config-uploads-not-safe": "Figyelmeztetés: a feltöltésekhez használt alapértelmezett könyvtárban ($1) tetszőleges külső szkript futtatható.\nHabár a MediaWiki ellenőrzi a feltöltött fájlokat az efféle biztonsági veszélyek megtalálása érdekében, a feltöltés engedélyezése előtt erősen ajánlott [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security a sérülékenység megszüntetése].", "config-brokenlibxml": "A rendszereden a PHP és libxml2 verziók olyan kombinációja található meg, ami hibásan működik, és észrevehetetlen adatkárosodást okoz a MediaWikiben és más webalkalmazásokban.\nFrissíts a libxml2 2.7.3 vgy újabb verziójára ([https://bugs.php.net/bug.php?id=45996 A hiba bejelentése a PHP-nél]).\nTelepítés megszakítva.", "config-suhosin-max-value-length": "A Suhosin telepítve van, és a GET length paraméterét $1 bájtra korlátozza.\nA MediaWiki ResourceLoader (erőforrásbetöltő) összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény.\nHa lehetséges, állítsd be a suhosin.get.max_value_length értékét legalább 1024-re a php.ini-ben, és állítsd be a $wgResourceLoaderMaxQueryLength változót ugyanerre az értékre a LocalSettings.php-ban.", "config-db-type": "Adatbázis típusa:", diff --git a/includes/installer/i18n/ja.json b/includes/installer/i18n/ja.json index cf4eb6dee7..ef286e36e8 100644 --- a/includes/installer/i18n/ja.json +++ b/includes/installer/i18n/ja.json @@ -21,7 +21,8 @@ "Rxy", "Foresttttttt", "ネイ", - "Suchichi02" + "Suchichi02", + "Omotecho" ] }, "config-desc": "MediaWiki のインストーラー", @@ -220,7 +221,7 @@ "config-subscribe-help": "これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。\nこのメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。", "config-subscribe-noemail": "メールアドレスなしでリリースアナウンスのメーリングリストを購読しようとしています。\nメーリングリストを購読する場合にはメールアドレスを入力してください。", "config-pingback": "このインストールに関するデータをMediaWikiの開発者と共有する。", - "config-pingback-help": "もし君がこのオプションを選択したら、メデイアウィキは定期的にhttps://www.mediawiki.orgとメデイアウィキのインスタンスに関する基本的のデータをピンします。このデータはシステムのタイプ、PHPのバージョンと選択されたデータベースのバックエンドなどを含んでいます。メデイアウィキファンデーションは将来の", + "config-pingback-help": "もしこのオプションを選択すると、メディアウィキは定期的にhttps://www.mediawiki.orgとメディアウィキのインスタンスに関する基本データを呼び出します。このデータは例えばシステムのタイプ、PHPのバージョンと選択したデータベースのバックエンドなどを含んでいます。メディアウィキ財団はメディアウィキ開発者とこの情報を共有し、将来の開発の方向付けに役立たせます。ご使用のシステムに送るデータは次のとおりです。\n
    $1
    ", "config-almost-done": "これでほぼ終わりました!\n残りの設定を飛ばして、ウィキを今すぐインストールできます。", "config-optional-continue": "私にもっと質問してください。", "config-optional-skip": "もう飽きてしまったので、とにかくウィキをインストールしてください。", diff --git a/includes/installer/i18n/ko.json b/includes/installer/i18n/ko.json index f292ab353c..ee01751253 100644 --- a/includes/installer/i18n/ko.json +++ b/includes/installer/i18n/ko.json @@ -319,6 +319,7 @@ "config-help-tooltip": "확장하려면 클릭", "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 분류별 확장 기능]을 찾아보실 수 있습니다.", + "config-screenshot": "스크린샷", "mainpagetext": "미디어위키가 설치되었습니다.", "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 미디어위키 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 당신의 위키에서 스팸에 대처하는 법을 배우세요]" } diff --git a/includes/installer/i18n/lij.json b/includes/installer/i18n/lij.json index 36707449ae..0ecc09781a 100644 --- a/includes/installer/i18n/lij.json +++ b/includes/installer/i18n/lij.json @@ -50,5 +50,263 @@ "config-unicode-using-intl": "Adoeuvia [http://pecl.php.net/intl l'estenscion PECL intl] pe-a normalizzaçion Unicode.", "config-unicode-pure-php-warning": "'''Attençion:''' [http://pecl.php.net/intl l'estenscion PECL intl] a no l'è disponibile pe gestî a normalizzaçion Unicode, quindi se torna a-a lenta implementaçion in PHP puo.\nSe ti esegui un scito a ato traffego, ti doviesci leze arcun-e conscidiaçioin in sciâ [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzaçion Unicode].", "config-unicode-update-warning": "'''Attençion:''' a verscion installaa do gestô pe-a normalizzaçion Unicode a l'adoeuvia una vegia verscion da libraia [http://site.icu-project.org/ do progetto ICU].\nTi doviesci [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornâ] se ti voeu doeuviâ l'Unicode.", - "config-no-db": "Imposcibile trovâ un driver adatto pe-o database! L'è necessaio installâ un driver pe PHP.\n{{PLURAL:$2|O seguente formato de database o l'è supportou|I seguenti formati de database son supportæ}}: $1.\n\nSe ti compilli PHP aotonomamente, riconfiguilo attivando un client database, presempio utilizzando ./configure --with-mysqli.\nQualoa t'avesci installou PHP pe mezo de 'n pacchetto Debian ò Ubuntu, alloa ti devi installâ o pacchetto php5-mysql ascì." + "config-no-db": "Imposcibile trovâ un driver adatto pe-o database! L'è necessaio installâ un driver pe PHP.\n{{PLURAL:$2|O seguente formato de database o l'è supportou|I seguenti formati de database son supportæ}}: $1.\n\nSe ti compilli PHP aotonomamente, riconfiguilo attivando un client database, presempio utilizzando ./configure --with-mysqli.\nQualoa t'avesci installou PHP pe mezo de 'n pacchetto Debian ò Ubuntu, alloa ti devi installâ o pacchetto php5-mysql ascì.", + "config-outdated-sqlite": "'''Atençion''': ti g'hæ SQLite $1, ma te ghe voeu comme minnimo a verscion $2. SQLite o no saiâ disponibile.", + "config-no-fts3": "'''Atençion''': SQLite o l'è compilou sença o [//sqlite.org/fts3.html modulo FTS3], e fonçioin de çerchia no saian disponibile insce sto motô.", + "config-pcre-old": "Fatale: se richiede PCRE $1 o succescivo.\nO to PHP binaio o l'è conligou con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Ciu informaçioin insce PCRE].", + "config-pcre-no-utf8": "'''Fatale''': o modulo PCRE de PHP pâ ch'o segge stæto compilou sença o supporto PCRE_UTF8. A MediaWiki a-o richiede pe fonçionâ corettamente.", + "config-memory-raised": "O valô memory_limit de PHP o l'è $1, aomentou a $2.", + "config-memory-bad": "''Atençion:''' O valô de memory_limit do PHP o l'è $1.\nFoscia o l'è troppo basso.\nL'installaçion a porriæ fallî!", + "config-xcache": "[http://xcache.lighttpd.net/ XCache] o l'è installou", + "config-apc": "[http://www.php.net/apc APC] o l'è installou", + "config-apcu": "[http://www.php.net/apc APC] o l'è installou", + "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] o l'è installou", + "config-no-cache-apcu": "'''Atençion:''' [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ò [http://www.iis.net/download/WinCacheForPhp WinCache] no son stæti trovæ.\nA caching di ogetti a no l'è attivâ.", + "config-mod-security": "Atençion: O to serviou web o g'ha o [http://modsecurity.org/ mod_security] abilitou. Gh'è tante configuaçioin che crean di problemi a-a MediaWiki ò a atro software ch'o permette a-i utenti de pubbricâ quâ-se-segge contegnuo. Se poscibbile o doviæ ese disabilitou.\nFanni rifeimento a-a [http://modsecurity.org/documentation/ documentaçion insce-o mod_security] ò contatta o supporto tecnico do to provider de hosting se se veifica di erroî.", + "config-diff3-bad": "GNU diff3 non trovou.", + "config-git": "Trovou software de controllo da verscion Git: $1.", + "config-git-bad": "Software de controllo da verscion Git non trovou.", + "config-imagemagick": "Trovou ImageMagick: $1.\nE miniatue de inmaggine saian presente se i upload vegnan abilitæ.", + "config-gd": "Trovou a libraja graffica GD integrâ.\nE miniatue de inmaggine saian presente se i upload vegnan abilitæ.", + "config-no-scaling": "Imposcibbile trovâ a libraja GD ò ImageMagick.\nE miniatue de inmaggine saian disabilitæ.", + "config-no-uri": "'''Errô:''' Imposcibbile determinâ l'URI attoale.\nInstallaçion interotta.", + "config-no-cli-uri": "'''Atençion''': --scriptpath non specificou, s'adoeuvia o valô predefinio: $1.", + "config-using-server": "Nomme do serviou in uso \"$1\".", + "config-using-uri": "URL do serviou in uso \"$1$2\".", + "config-uploads-not-safe": "Atençion: a directory predefinia pe-i caregamenti $1 a l'è vulnerabile a l'execuçion arbitraia de script.\nSciben che, a difeisa da segueçça, a MediaWiki a controlla tutti i file caregæ, l'è fortemente racomandou de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serâ questa menaçça] primma d'abilitâ i caregamenti.", + "config-no-cli-uploads-check": "Atençion: a directory predefinia pe-i caregamenti ($1) a no l'è stæta veificâ pe-a vulnerabilitæ insce l'esecuçion arbitraia de script durante l'installaçion da linnia de comando.", + "config-brokenlibxml": "O to scistema o g'ha 'na combinaçion de verscioin de PHP e libxml2 ch'a l'è difettosa e ch'a poeu provocâ un danno ascozo a-i dæti da MediaWiki e d'atre apricaçioin web.\nAgiorna a libxml2 2.7.3 ò succescivo ([https://bugs.php.net/bug.php?id=45996 o babollo o l'è studiou da-o lao PHP]).\nInstallaçion interotta.", + "config-suhosin-max-value-length": "Suhosin o l'è installou e o limmita o parammetro GET length a $1 byte.\nO componente MediaWiki ResourceLoader o fonçioniâ inte sto limmite, ma questo o reduiâ e prestaçioin.\nSe poscibbile, ti doviesci impostâ suhosin.get.max_value_length a 1024 ò ciu in php.ini, e impostâ $wgResourceLoaderMaxQueryLength a-o mæximo valô in LocalSettings.php.", + "config-db-type": "Tipo de database:", + "config-db-host": "Host do database:", + "config-db-host-help": "Se o serviou do to database o l'è insce 'n serviou despægio, inmetti chì o nomme de l'host ò o so adresso IP.\n\nSe ti doeuvi un web hosting condiviso, o to hosting provider o doviæ fornite o nomme host corretto inta so documentaçion.\n\nSe t'ê aproeuvo a instalâ insce 'n serviou Windows con uso de MySQL, l'uso de \"localhost\" o porriæ no fonçionâ correttamente comme nomme do serviou. In caxo de problemi, proeuva a impostâ \"127.0.0.1\" comme adresso IP locale.\n\nSe ti t'adoeuvi PostgreSQL, lascia questo campo voeuo pe consentî de connettise trammite un socket Unix.", + "config-db-host-oracle": "TNS do database:", + "config-db-host-oracle-help": "Inseisci un vallido [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; un file tnsnames.ora o dev'ese vixibbile a questa installaçion.
    Se ti t'adoeuvi a libraia cliente 10g o ciù reçente ti poeu ascì doeuviâ o mettodo de denominaçion [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", + "config-db-wiki-settings": "Identiffica questo wiki", + "config-db-name": "Nomme do database:", + "config-db-name-help": "Çerni un nomme ch'o l'identiffiche o to wiki.\nO no deve contegnî de spaççi.\n\nSe ti doeuvi un web hosting condiviso, o to hosting provider o te fornisce un speciffico nomme de database da doeuviâ, opû o ti consentiâ de creâ o database trammite un panello de controllo.", + "config-db-name-oracle": "Schema do database:", + "config-db-account-oracle-warn": "Gh'è trei scenarri supportæ pe instalâ l'Oracle comme database de backend:\n\nSe t'oeu creâ 'n'utença de database comme parte do processo d'instalaçion, fornisci un account con rollo SYSDBA comme utença de database pe l'instalaçion e speciffica e credençiæ vosciue pe l'utença d'accesso web, sedonque l'è poscibbile creâ manoalmente l'utença d'accesso web e fornî solo quell'account (s'o g'ha e aotorizaçioin necessaie pe creâ i ogetti do schema) ò fornî doe utençe despæge, un-a co-i permissi de creaçion e un-a pe l'accesso web.\n\nO Script pe creâ un'utença co-e aotorizaçioin necessaie o se troeuva inta directory \"maintenance/oracle/\" de questa instalaçion. Tegnit'amente che l'uzo de 'n'utença con restriçioin o dizabilitiâ tutte e fonçionalitæ de manutençion con l'account predefinio.", + "config-db-install-account": "Account utente pe l'instalaçion", + "config-db-username": "Nomme utente do database:", + "config-db-password": "Password do database:", + "config-db-install-username": "Inseisci o nomme utente ch'o saiâ doeuviou pe conettise a-o database durante o processo d'installaçion.\nQuesto o no l'è o nomme utente de l'account MediaWiki; ma quello pe-o to database.", + "config-db-install-password": "Inseisci a password ch'a saiâ doeuviâ pe connettise a-o database into processo d'installaçion.\nQuesta a no l'è a password de l'account MediaWiki; ma quella pe-o to database.", + "config-db-install-help": "Insei o nomme utente e a password che saian doeuviæ pe-a conescion a-o database durante o processo d'instalaçion.", + "config-db-account-lock": "Doeuvia o mæximo nomme utente e password durante o normale fonçionamento", + "config-db-wiki-account": "Account utente pe-o normale fonçionamento", + "config-db-wiki-help": "Insei o nomme utente e a password che saiâ doeuviou pe connettise a-o database durante o normale fonçionamento da wiki.\nSe l'account o no l'existe, e l'account d'instalaçion o g'ha assæ privileggi, st'account utente o saiâ creou con privileggi minnimi necessai pe operâ in sciâ wiki.", + "config-db-prefix": "Prefisso da tabella do database:", + "config-db-prefix-help": "Se ti g'hæ de bezoeugno de condividde un database tra ciu wiki, ò tra MediaWiki e un'atra apricaçion web, ti poeu çerne d'azonze un prefisso a tutti i nommi de tabella, pe evitâ confliti.\nNo doeuviâ spaççi.\n\nA l'uzo sto campo o l'è lasciou voeuo.", + "config-mysql-old": "L'è necessaio MySQL $1 ò 'na verscion succesciva. Ti ti g'hæ a $2.", + "config-db-port": "Porta do database:", + "config-db-schema": "Schema pe MediaWiki:", + "config-db-schema-help": "Questo schema in genere o l'aniâ ben.\nCangilo solo se t'ê seguo de doveilo fâ.", + "config-pg-test-error": "Imposcibbile conettise a-o database '''$1''': $2", + "config-sqlite-dir": "Cartella dæti de SQLite:", + "config-sqlite-dir-help": "SQLite o memorizza tutti i dæti inte 'n unnico file.\n\nA directory che t'indichiæ a dev'ese scrivibile da-o serviou web durante l'instalaçion.\n\nA dev'ese non acescibbile via web, l'è pe questo che no a mettemmo donde gh'è i file PHP.\n\nL'instalou o ghe scriviâ insemme un file .htaccess, ma se o tentativo o falisse quarcun poriæ avei accesso a-o database sgroeuzzo.\nQuesto o l'includde di dæti utente sgroeuzzi (adressi, password çiffræ) coscì comme de vercsioin eliminæ e atri dæti a accesso limitou da wiki.\n\nConsciddera a-a dreitua l'oportunitæ d'alugâ o database da quarch'atra parte, prezempio in /var/lib/mediawiki/tuowiki.", + "config-oracle-def-ts": "Tablespace pe difetto:", + "config-oracle-temp-ts": "Tablespace tempoannio:", + "config-type-mysql": "MySQL (ò compatibbile)", + "config-type-mssql": "Microsoft SQL Server", + "config-support-info": "MediaWiki o supporta i seguenti scistemi de database:\n\n$1\n\nSe fra quelli elencæ chì de sotta no ti veddi o scistema de database che ti voriesci doeuviâ, segui e instruçioin inganciæ de d'ato pe abilitâ o supporto.", + "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] a l'è a primma scelta pe MediaWiki e a l'è quella megio suportâ. MediaWiki a fonçion-a ascì con [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], che son compatibbili con MySQL.([http://www.php.net/manual/en/mysqli.installation.php Comme compilâ PHP con suporto MySQL])", + "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] o l'è un popolare scistema de database open source comme alternativa a MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Comme compilâ PHP con suporto PostgreSQL])", + "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] o l'è un scistema de database leggio, ch'o l'è suportou molto ben. ([http://www.php.net/manual/en/pdo.installation.php Comme compilâ PHP con suporto SQLite], o l'utilizza PDO)", + "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] o l'è un database de un'impreiza comerciâ. ([http://www.php.net/manual/en/oci8.installation.php Comme compilâ PHP con suporto OCI8])", + "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] o l'è un database de un'impreiza commerciâ per Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Comme compilâ PHP con supporto SQLSRV])", + "config-header-mysql": "Impostaçioin MySQL", + "config-header-postgres": "Impostaçioin PostgreSQL", + "config-header-sqlite": "Impostaçioin SQLite", + "config-header-oracle": "Impostaçioin Oracle", + "config-header-mssql": "Impostaçioin do Microsoft SQL Server", + "config-invalid-db-type": "Tipo de database non vallido", + "config-missing-db-name": "Ti g'hæ da mettighe un valô pe \"{{int:config-db-name}}\".", + "config-missing-db-host": "Ti g'hæ da mettighe un valô pe \"{{int:config-db-host}}\".", + "config-missing-db-server-oracle": "L'è necessaio inmettere un valô pe \"{{int:config-db-host-oracle}}\".", + "config-invalid-db-server-oracle": "TNS database \"$1\" non vallido.\nAdoeuvia \"TNS Name\" ò 'na stringa \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).", + "config-invalid-db-name": "Nomme de database \"$1\" non vallido.\nAdoeuvia solo che di caratteri ASCII comme lettie (a-z, A-Z), nummeri (0-9), sottoliniatua (_) e trattin (-).", + "config-invalid-db-prefix": "Prefisso database \"$1\" non vallido.\nChe ti doeuvi solo di caratteri ASCII comme lettie (a-z, A-Z), nummeri (0-9), sottoliniatua (_) e trattin (-).", + "config-connection-error": "$1.\n\nControlla l'host, o nomme utente e a password, e proeuva torna.", + "config-invalid-schema": "Schema MediaWiki \"$1\" non vallido.\nChe ti doeuvi solo lettie ASCII (a-z, A-Z), nummeri (0-9) ò caratteri de sottoliniatua (_).", + "config-db-sys-create-oracle": "O programma d'instalaçion o suporta solo l'utilizzo de 'n account SYSDBA pe-a creaçion de 'n noeuvo account.", + "config-db-sys-user-exists-oracle": "L'utença \"$1\" a l'existe za. SYSDBA o poeu vese doeuviou solo che pe-a creaçion de 'na noeuva utença!", + "config-postgres-old": "Ghe voeu MySQL $1 ò 'na verscion succesciva. Ti ti g'hæ a $2.", + "config-mssql-old": "Ghe voeu Microsoft SQL Server $1 ò succescivo. Ti ti g'hæ a verscion $2.", + "config-sqlite-name-help": "Çerni un nomme ch'o l'identiffiche a to wiki.\nNo doeuviâ spaÇçi ò trattin.\nQuesto o serviâ pe-o nomme do file di dæti SQLite.", + "config-sqlite-parent-unwritable-group": "No se poeu creâ a directory dæti $1, percose a directory supeiô $2 a no l'è scrivibbile da-o webserver.\n\nO programma d'instalaÇion o l'ha determinou l'utente con chi o serviou web o l'è in esecuçion.\nDagghe a poscibilitæ de scrive inta directory $3 pe continoâ.\nInsce un scistema Unix/Linux fanni:\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", + "config-sqlite-parent-unwritable-nogroup": "No se poeu creâ a directory dæti $1, percose a directory supeiô $2 a no l'è scrivibbile da-o webserver.\n\nO programma d'instalaçion o no l'ha posciuo determinâ l'utente con chi o serviou web o l'è in esecuçion.\nRendi a directory $3 scrivibbile globalmente, da esso (e da atri) pe continoâ.\nInsce un scistema Unix/Linux fanni:\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", + "config-sqlite-mkdir-error": "Errô durante a creaçion da directory dæti \"$1\".\nControlla a poxiçion e proeuva torna.", + "config-sqlite-dir-unwritable": "Imposcibile scrive inta directory \"$1\".\nCangia i aotoizaçioin de mainea che o webserver o ghe posse scrive e proeuva torna.", + "config-sqlite-connection-error": "$1.\n\nControlla a directory dæti e o nomme do database chì de sotta, e proeuva torna.", + "config-sqlite-readonly": "O file $1 o no l'è scrivibbile.", + "config-sqlite-cant-create-db": "Imposcibile creâ o file do database $1 .", + "config-sqlite-fts3-downgrade": "A-o PHP gh'amanca o suporto FTS3, declassamento tabelle in corso", + "config-can-upgrade": "Gh'è de tabelle da MediaWiki in questo database.\nPe agiornâle a MediaWiki $1, clicca insce '''continnoa'''.", + "config-upgrade-done": "Agiornamento completo.\n\nAoa ti poeu [$1 començâ a doeuviâ a to wiki].\n\nSe t'oeu rigenerâ o to file LocalSettings.php, clicca in sciô pomello de sotta. Questa opiaçion '''a no l'è racomandâ''', a meno che no ti gh'aggi di problemi co-a to wiki.", + "config-upgrade-done-no-regenerate": "Agiornamento completo.\n\nAoa ti poeu [$1 començâ a doeuviâ a to wiki].", + "config-regenerate": "Rigennera LocalSettings.php →", + "config-show-table-status": "A query SHOW TABLE STATUS a l'è fallia!", + "config-unknown-collation": "'''Atençion:''' o database o doeuvia de reggole de confronto non riconosciue.", + "config-db-web-account": "Account do database pe l'acesso web", + "config-db-web-help": "Seleçion-a o nomme utente e a password che o serviou web o l'adoeuviâ pe conettise a-o serviou de database, durante o normale fonçionamento da wiki.", + "config-db-web-account-same": "Doeuvia o mæximo account de l'instalaçion", + "config-db-web-create": "Crea l'account s'o no l'existe ancon", + "config-db-web-no-create-privs": "L'account doeuviou pe l'installaçion o no dispon-e di privileggi necessai pe creâ un atro account.\nL'account indicou chì o deve za existe.", + "config-mysql-engine": "Motô d'archiviaçion:", + "config-mysql-innodb": "InnoDB", + "config-mysql-myisam": "MyISAM", + "config-mysql-myisam-dep": "Atençion: t'hæ seleçionou MyISAM comme motô d'archiviaçion pe MySQL, ch'o no l'è racomandou pe l'uso con MediaWiki, percose:\n* o supporta debolmente a concorença pe-o blocco da tabella\n* o l'è ciu inclinou a-a corruçion di atri motoî\n* o codiçe de base MediaWiki o no gestisce sempre MyISAM comm'o doviæ\n\nSe a to instalaçion MySQL a supporta InnoDB, l'è atamente racomandou che ti o çerni a-o so posto.\nSe a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.", + "config-mysql-only-myisam-dep": "Atençion: MyISAM o l'è l'unnico motô d'archiviaçion disponibbile pe MySQL insce sta macchina, e questo no l'è consegiou pe doeuviâlo con MediaWiki, percose:\n* o supporta debolmente a concorenza pe-o blocco da tabella\n* o l''è ciu inclinou a-a corruçion di atri motoî\n* o coddiçe de base MediaWiki MyISAM o no-o gestisce sempre comm'o doviæ\n\nS'a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.", + "config-mysql-engine-help": "InnoDB o l'è quæxi sempre a megio opçion, in quante o g'ha 'n bon supporto da concorença.\n\nMyISAM o poriæ vese ciu veloçe inte installaçioin mono-utente ò in sola-lettua.\nI database MyISAM tendan a dannezâse ciu soventi di database InnoDB.", + "config-mysql-charset": "Set di caratteri do database:", + "config-mysql-binary": "Binaio", + "config-mysql-utf8": "UTF-8", + "config-mysql-charset-help": "In modalitæ binaia, MediaWiki a l'archivvia o testo UTF-8 into database in campi binai.\nQuest'o l'è ciu efficaçe che a modalitæ UTF-8 do MySQL, e o consente de doeuviâ a gamma completa de caratteri Unicode.\n\nIn modalitæ UTF-8, MySQL o saviâ inte quæ set de caratteri l'è che son i to dæti, e o poriâ presentâli e convertîli in moddo apropiou, ma o no te permetiâ de memorizâ i caratteri de d'ato a-o [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Cian de base murtilenguistego].", + "config-mssql-auth": "Tipo d'aotenticaçion:", + "config-mssql-install-auth": "Seleçion-a o tipo d'aotenticaçion ch'o saiâ doeuviou pe conettise a-o database durante o processo de instalaçion.\nSe ti seleçion-i \"{{int:config-mssql-windowsauth}}\", saiâ doeuviou e credençiæ de quæ se segge utente segge aproeuv'a fâ giâ o serviou web.", + "config-mssql-web-auth": "Seleçion-a o tipo d'aotenticaçion che o serviou web o doeuviâ pe conettise a-o database. \nSe ti seleçion-i \"{{int:config-mssql-windowsauth}}\", saiâ doeuviou e credençiæ de quæ se segge utente segge aproeuv'a fâ giâ o serviou web.", + "config-mssql-sqlauth": "Aotenticaçion de SQL Server", + "config-mssql-windowsauth": "Aotenticaçion de Windows", + "config-site-name": "Nomme da wiki:", + "config-site-name-help": "Questo saiâ vixualizou inta bara do tittolo do navegatô e in atri varri recanti.", + "config-site-name-blank": "Inseisci o nomme de 'n scito.", + "config-project-namespace": "Namespace do progetto:", + "config-ns-generic": "Progetto", + "config-ns-site-name": "Pægio che o nomme do wiki: $1", + "config-ns-other": "Atro (specificâ)", + "config-ns-other-default": "MyWiki", + "config-project-namespace-help": "Aproeuvo a l'exempio da Wikipedia, molte wiki tegnan e so paggine co-e reggole separæ da-e paggine de contegnuo, inte 'n '''namespace de progetto'''.\nTutti i tittoli de paggine inte sto namespace començan co-in çerto prefisso, che ti poeu indicâ chie.\nA l'uzo, sto prefisso o deriva da-o nomme da wiki, ma o no poeu contegnî di caratteri de pontezatua comme \"#\" ò \":\".", + "config-ns-invalid": "O namespace indicou \"$1\" o no l'è vallido.\nSpecificâ un despægio namespace de progetto.", + "config-ns-conflict": "O namespace indicou \"$1\" o l'è in conflito co-in namespace predefinio MediaWiki.\nSpecificâ un despægio namespace de progetto.", + "config-admin-box": "Account amministratô", + "config-admin-name": "O to nomme utente:", + "config-admin-password": "Poula segretta:", + "config-admin-password-confirm": "Ripeti a poula segretta:", + "config-admin-help": "Inseisci chì o to nomme utente prefeio, presempio \"Giobatta Parodi\".\nSto chì o l'è o nomme che ti doeuviæ pe acede a-a wiki.", + "config-admin-name-blank": "Inseisci un nomme pe l'aministratô.", + "config-admin-name-invalid": "O nomme utente indicou \"$1\" o no l'è vallido.\nSpecificâ un nomme utente despægio.", + "config-admin-password-blank": "Inseisci 'na password pe l'account d'aministratô.", + "config-admin-password-mismatch": "E doe password inseie no corispondan.", + "config-admin-email": "Adresso e-mail:", + "config-admin-email-help": "Inseisci chì 'n adresso e-mail pe poei riçeive di e-mail da-i atri utenti da wiki, rimpostâ a to password, e vese informou de modiffiche aportæ a-e to paggine sotta oservaçion. Se no te interessa, ti poeu lasciâ voeuo questo campo.", + "config-admin-error-user": "Erô interno durante a creaçion de 'n aministratô co-o nomme \"$1\".", + "config-admin-error-password": "Erô interno durante l'impostaçion de 'na password pe aministratô \"$1\":
    $2
    ", + "config-admin-error-bademail": "T'hæ inseio un adresso e-mail non vallido.", + "config-subscribe": "Sottoscrivi a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list di anonçi de release].", + "config-subscribe-help": "Se tratta de 'na mailing list a basso traffego dedicâ a-i anonçi de sciortie de noeuve verscioin, compreize de importante segnalaçioin pe-a segueçça.\nSe conseggia de inscrivise e agiornâ a proppia instalaçion de MediaWiki quande sciorte 'na noeuva verscion.", + "config-subscribe-noemail": "T'hæ provou a inscrivite a-a mailing list dedicâ a-i anonçi de noeuve verscioin sença fornî un adresso e-mail.\nInseisci un adresso e-mail se ti dexidei efetoâ l'inscriçion a-a mailing list.", + "config-pingback": "Condividdi i dæti insce questa installaçion co-i svilupatoî da MediaWiki.", + "config-pingback-help": "Se ti seleçion-i questa opçion, MediaWiki a contattiâ periodicamente https://www.mediawiki.org co-i dæti base insce questa instançia MediaWiki. Queta categoria de dæti a l'includde, prexempio, o tipo de scistema, a verscion de PHP e o database de backend çernuo. A Wikimedia Foundation a condividde questi dæti co-i sviluppatoî Mediawiki pe agiutâla a guidâ i futuri sforsci de sviluppo. Pe-o to scistema saiâ inviou i seguenti dæti:\n
    $1
    ", + "config-almost-done": "T'hæ quæxi a tio!\nAoa ti poeu sâtâ a restante parte da configuaçion e instalâ a wiki subbito.", + "config-optional-continue": "Famme di atre domande.", + "config-optional-skip": "Son za stuffo, installa a wiki e basta.", + "config-profile": "Profî di driti utente:", + "config-profile-wiki": "Wiki averta", + "config-profile-no-anon": "Creaçion utença obrigatoia", + "config-profile-fishbowl": "Solo utenti aotorizæ", + "config-profile-private": "Wiki privâ", + "config-profile-help": "E wiki fonçion-an megio se ti permetti a tante person-e de poeili modificâ.\nIn MediaWiki, l'è sempliçe controlâ i urtime modiffiche, e ripristinâ i danni caosæ da di utenti inesperti ò malintençionæ.\n\nTuttavia, tanti han trovou a MediaWiki uttile inte 'n'ampia varietæ de rolli, e de volte no l'è faççile convinçe tutti di vantaggi da modalitæ wiki.\nPerciò, fanni a to scelta.\n\nO modello {{int:config-profile-wiki}} o consente a chi se segge de modificâ, anche sença efetoâ l'acesso.\nUna wiki con {{int:config-profile-no-anon}} a l'ofre 'na magiô responsabilitæ, ma a poriæ scoragî i contributoî ocaxonæ.\n\nO scenario {{int:config-profile-fishbowl}} o consente a-i utenti aotorizæ de modificâ, ma o pubbrico o poeu vixualizâ e paggine, compreiso a cronologia.\nUn {{int:config-profile-private}} o consente solo ch'a-i utenti aotorizæ de vixualizâ e paggine, o mæximo groppo o poeu modificâle.\n\nDe configuaçioin di driti utente ciu complesse son disponibbile doppo l'instalaçion, amia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa do manoâ].", + "config-license": "Driti d'aotô e liçençia:", + "config-license-none": "Nisciun pê de paggina pe-a liçençia", + "config-license-cc-by-sa": "Creative Commons Attribuçion-Condividdi pægio", + "config-license-cc-by": "Creative Commons Attribuçion", + "config-license-cc-by-nc-sa": "Creative Commons Attribuçion-Non comerciale-Condividdi Pægio", + "config-license-cc-0": "Creative Commons Zero (pubbrico dominnio)", + "config-license-gfdl": "GNU Free Documentation License 1.3 o verscioin sucescive", + "config-license-pd": "Pubbrico dominnio", + "config-license-cc-choose": "Seleçion-a un-a de liçençie Creative Commons", + "config-license-help": "Tante wiki pubbriche rilascian i so contributi co-ina [http://freedomdefined.org/Definition liçençia libbera]. Sto fæto o l'agiutta a creâ un senso de propietæ condivisa inta comunitæ e o l'incoragisce a contriboî a longo termine. O no l'è generalmente necessaio pe 'na wiki privâ ò aziendale.\n\nSe ti voeu doeuviâ di scriti da Wikipedia, ò ti dexiddei che a Wikipedia a posse vese in graddo de acetâ di scriti copiæ da-a to wiki, ti doviesci scellie {{int:config-license-cc-by-sa}}.\n\nIn precedença a Wikipedia a l'ha doeuviou a GNU Free Documentation License. A GFDL a l'è 'na liçençia vallida, ma a l'è difiççile da capî e a complica o riutilizzo di contegnui.", + "config-email-settings": "Impostaçioin e-mail", + "config-enable-email": "Abillita a sciortia da posta elettronica", + "config-enable-email-help": "Se ti voeu che fonçion-e l'e-mail, e [http://www.php.net/manual/en/mail.configuration.php PHP's impostaçioin della posta] dev'esan configuæ corettamente.\nSe non ti dexiddei arcun-a fonçionalitæ de posta eletronnica, ti a poeu disabilitâ chie.", + "config-email-user": "Abillita e-mail fra utenti", + "config-email-user-help": "Consente a tutti i utenti de inviâse l'un l'atro l'e-mail, se l'han abilitou inte so preferençe.", + "config-email-usertalk": "Abillita e notiffiche pe-e paggine de discuscion utente", + "config-email-usertalk-help": "Consente a-i utenti de riçeive de notiffiche pe-e modiffiche de so paggine de discuscion, se l'han abilitou inte so preferençe.", + "config-email-watchlist": "Abillita e notiffiche pe-a lista sott'oservaçion", + "config-email-watchlist-help": "Consente a-i utenti de riçeive de notiffiche pe-e pagine da lista sott'oservaçion, se l'han abilitou inte so preferençe.", + "config-email-auth": "Abillita aotenticaçion via e-mail", + "config-email-auth-help": "Se questa opçion a l'è attivâ, i utenti dovian confermâ o so adresso e-mail doeouviando un ingancio ch'o ven inviou ogni votta che l'impostan ò o cangian.\nSolo i adressi de posta elettronica aotenticæ poeuan riçeive de e-mail da di atri utenti ò cangiâ e e-mail de notiffica.\nImpostâ st'opçion l'è raccomandou pe-e wiki pubbriche pe via do potençiale abuso dee fonçioin de posta elettronica.", + "config-email-sender": "Adresso e-mail de ritorno:", + "config-email-sender-help": "Inseisci l'adresso e-mail da doeuviâ comme adresso de ritorno pe-a posta ch'a sciorte.\nChì l'è donde ghe saiâ inviou i eventoali eroî.\nMolti server de posta richiedan che armeno a parte do nomme de dominnio a segge vallida.", + "config-upload-settings": "Caregamenti de inmaggine e file", + "config-upload-enable": "Consentî o caregamento di file", + "config-upload-help": "O caregamento di file o poriæ espon-e o to serviou a di reizeghi de segueçça.\nPe magioî informaçioin, lezi a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seçion in sciâ segueçça] into manoâ.\n\nPe consentî o caregamento di file, modiffica a modalitæ inta sottodirectory images da directory prinçipâ da MediaWiki coscì che o serviou web o posse scrive lì.\nPoi attiva questa opçion.", + "config-upload-deleted": "Directory pe-i file scassæ:", + "config-upload-deleted-help": "Çerni 'na directory onde archiviâ i file scassæ.\nIdealmente, questa a no doviæ ese accescibbile da-o web.", + "config-logo": "URL do logo:", + "config-logo-help": "O tema predefinio da MediaWiki o l'includde o spaççio pe 'n logo de 135 x 160 pixel sorve o menù laterâ.\nCarrega 'n'inmaggine de dimenscioin apropiæ e inseisci l'URL chie.\n\nL'è poscibbile doeuviâ $wgStylePath o $wgScriptPath se o logo o l'è relativo a sti percorsci.\n\nSe un logo no ti o voeu, lascia sta casella voeua.", + "config-instantcommons": "Abillita Instant Commons", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'è 'na fonçionalitæ ch'a consente a-i wiki de doeuviâ inmaggine, soin e atri file murtimediæ ch'atroæ 'n sciô scito [https://commons.wikimedia.org/ Wikimedia Commons].\nPe fâ questo, a MediaWiki a richiede l'accesso a l'Internet.\n\nPe ciu informaçioin insce sta fonçionalitæ, con tanto de instruçioin sciu comme configuâlo pe de wiki despæge da-a Wikimedia Commons, consurtæ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos o manoâ].", + "config-cc-error": "O selettô de liçençie Creative Commons o no l'ha reizo arcun resultato.\nInseisci manoalmente o nomme da liçençia.", + "config-cc-again": "Çerni torna...", + "config-cc-not-chosen": "Çerni quæ liçençia Creative Commons ti voeu e sciacca \"proceed\".", + "config-advanced-settings": "Configuaçion avançâ", + "config-cache-options": "Impostaçioin pe-a cache di ogetti:", + "config-cache-help": "A memorizaçion di ogetti inta cache a serve pe fâ anâ ciu fito a MediaWiki sarvando inta cache i dæti che ti doeuvi soventi.\nPe di sciti de dimenscioin mezan-e e grende l'è cadamente consegiou attivâ a cache, ma pe-i piccin ascì se ne vediâ i benefiççi.", + "config-cache-none": "Nisciun-a memorizaçion inta cache (nisciun-a fonçionalitæ a l'è impedia, ma in scî sciti wiki ciu grendi a veloçitæ a poriæ risentîne)", + "config-cache-accel": "Mette in cache ogetti PHP (APC, APCu, XCache ò WinCache)", + "config-cache-memcached": "Doeuvia Memcached (a richiede urteioî attivitæ de instalaçion e configuaçion)", + "config-memcached-servers": "Serviou de Memcached:", + "config-memcached-help": "Lista de adressi IP da doeuviâ pe Memcached.\nTi doviesci specificâne un pe riga e indicâ a porta da doeuviâ. Presempio:\n 127.0.0.1:11211\n 192.168.1.25:1234", + "config-memcache-needservers": "L'è stæto seleçionou o tipo de caching Memcached, ma no l'è stæto impostou arcun serviou.", + "config-memcache-badip": "L'è stæto inseio un adresso IP non vallido pe Memcached: $1.", + "config-memcache-noport": "Non l'è stæto specificou 'na porta da doeuviâ pe-o serviou Memcached: $1.\nSe no ti sæ quæ a l'è a porta, o valô pe difetto o l'è 11211.", + "config-memcache-badport": "I nummeri de porta pe Memcached dovieivan ese tra $1 e $2.", + "config-extensions": "Estenscioin", + "config-extensions-help": "I estenscioin elencæ de d'ato son stæte rilevæ inta to directory ./extensions.\n\nQueste poririvan richiede 'n urteiô configuaçion, ma l'è poscibbile attivâle aoa", + "config-skins": "Pelle", + "config-skins-help": "E pelle elencæ de d'ato son stæte rilevæ inta to directory ./skins. Ti devi attivâne aomanco un-a e scellie quella predefinia.", + "config-skins-use-as-default": "Doeuvia sta pelle comme predefinia", + "config-skins-missing": "No l'è stæto trovou arcun-a pelle; a MediaWiki a l'adoeuviâ 'na soluçion de ripiego pe scin che no ti ne instaliæ un-a apropiâ.", + "config-skins-must-enable-some": "Ti devi çerne armeno 'na pelle da attivâ.", + "config-skins-must-enable-default": "A pelle çernua comme predefinia a dev'ese attivâ.", + "config-install-alreadydone": "'''Attençion:''' pâ che t'aggi za instalou a MediaWiki e ti çerchi de instalâla torna.\nProcedi a-a paggina succesciva.", + "config-install-begin": "Sciacando \"{{int:config-continue}}\", t'inçiæ l'instalaçion da MediaWiki.\nSe primma ti voesci fâ di atri cangiamenti, premmi \"{{int:config-back}}\".", + "config-install-step-done": "fæto", + "config-install-step-failed": "no ariescio", + "config-install-extensions": "Estenscioin compreize", + "config-install-database": "Configuaçion do database", + "config-install-schema": "Creaçion do schema", + "config-install-pg-schema-not-exist": "O schema PostgreSQL o no l'existe.", + "config-install-pg-schema-failed": "Creaçion tabelle non riuscia.\nAsseguite che l'utente \"$1\" o posse scrive into schema \"$2\".", + "config-install-pg-commit": "Commetti i cangiamenti", + "config-install-pg-plpgsql": "Controllo do lenguaggio PL/pgSQL", + "config-pg-no-plpgsql": "Bezoeugna che t'installi o lenguaggio PL/pgSQL into database $1", + "config-pg-no-create-privs": "L'utença indicâ pe l'instalaçion a no dispon-e di privileggi necessai pe creâ 'n'utença.", + "config-pg-not-in-role": "L'utença indicâ pe l'utente web a l'existe za.\nL'utença indicâ pe l'instalaçion a no l'è un super-utente e a no l'è un membro do rollo di utenti web, quindi a no l'è in graddo de creâ di ogetti de propietæ de l'utente web.\n\nMediaWiki atoalmente a richiede che e tabelle seggian de propietæ de l'utente web. Indica 'n atro account web, ò clicca \"inderê\" e speciffica un utente pe l'instalaçion oportunamente privilegiou.", + "config-install-user": "Creaçion de utente do database", + "config-install-user-alreadyexists": "L'utente $1 o l'existe za.", + "config-install-user-create-failed": "Creaçion de l'utente \"$1\" no ariescia: $2", + "config-install-user-grant-failed": "Erô durante a concescion de l'aotorizaçion a l'utente \"$1\": $2", + "config-install-user-missing": "L'utente indicou \"$1\" o no l'existe.", + "config-install-user-missing-create": "L'utente indicou \"$1\" o no l'existe.\nSeleçion-a a casella \"crea utença\" chì de sotta, se ti a voeu creâ.", + "config-install-tables": "Creaçion tabelle", + "config-install-tables-exist": "'''Atençion:''' pâ che e tabelle da MediaWiki ghe seggian za.\nSato a creaçion.", + "config-install-tables-failed": "'''Erô''': a creaçion da tabella a no l'è ariescia: $1", + "config-install-interwiki": "Impimento da tabella interwiki predefinia", + "config-install-interwiki-list": "Imposcibbile leze o file interwiki.list.", + "config-install-interwiki-exists": "'''Atençion:''' pâ che inta tabella interwiki ghe segge za di elementi.\nA lista predefinia a se sata.", + "config-install-stats": "Iniçializaçion de statisteghe", + "config-install-keys": "Generaçion de ciave segrette", + "config-insecure-keys": "'''Atençion:''' {{PLURAL:$2|Una ciave segûa|De ciave segûe}} ($1) {{PLURAL:$2|generâ|generæ}} durante l'instalaçion {{PLURAL:$2|a|}} no {{PLURAL:$2|l'è|son}} completamente {{PLURAL:$2|segûa|segûe}}. Consciddera de cangiâ{{PLURAL:$2|la|le}} manoalmente.", + "config-install-updates": "Impedî l'esecuçion di agiornamenti non necessai", + "config-install-updates-failed": "Erô: l'inseimento de ciave de agiornamento inte tabelle o no l'è ariescio pe-o seguente erô: $1", + "config-install-sysop": "Creaçion de l'utença pe l'aministratô", + "config-install-subscribe-fail": "Imposcibbile sottoscrive mediawiki-announce: $1", + "config-install-subscribe-notpossible": "cURL o no l'è instalou e allow_url_fopen o no l'è disponibbile.", + "config-install-mainpage": "Creaçion da paggina prinçipâ con contegnuo predefinio", + "config-install-mainpage-exists": "A paggina prinçipâ a l'existe za, ignorou", + "config-install-extension-tables": "Creaçion de tabelle pe i estenscioin attivæ", + "config-install-mainpage-failed": "Imposcibbile insei a paggina prinçipâ: $1", + "config-install-done": "Complimenti!\nT'hæ instalou MediaWiki.\n\nO programma d'instalaçion o l'ha generou un file LocalSettings.php ch'o conten tutte e impostaçioin.\n\nTi devi scaregâlo e inseilo inta directory base da to wiki (a mæxima dovve gh'è index.php). O download o doviæ partî aotomaticamente.\n\nSe o download o no s'inandia, ò s'o l'è stæto annulou, ti poeu ricomençâ clicando in sce l'ingancio chì aproeuvo:\n\n$3\n\nNotta: se ti sciorti aoa da l'installaçion sença scaregâ o file de configuaçion ch'o l'è stæto generou, questo doppo o no saiâ ciu disponibbile.\n\nQuande t'hæ fæto, ti poeu [$2 intrâ inta to wiki].", + "config-install-done-path": "Complimenti!\nT'hæ instalou MediaWiki.\n\nO programma d'instalaçion o l'ha generou un file LocalSettings.php ch'o conten tutte e impostaçioin.\n\nTi devi scaregâlo e inseilo in $4. O download o doviæ partî aotomaticamente.\n\nSe o download o no s'inandia, ò s'o l'è stæto annulou, ti poeu inandiâlo torna clicando in sce l'ingancio chì de sotta:\n\n$3\n\nNotta: se ti sciorti aoa da l'installaçion sença scaregâ o file de configuaçion ch'o l'è stæto generou, questo doppo o no saiâ ciu disponibbile.\n\nQuande t'hæ fæto, ti poeu [$2 intrâ inta to wiki].", + "config-download-localsettings": "Scarega LocalSettings.php", + "config-help": "agiutto", + "config-help-tooltip": "clicca pe espande", + "config-nofile": "O file \"$1\" o no poeu vese atrovou. O l'è stæto eliminou?", + "config-extension-link": "Ti o saveivi che o to wiki o suporta i [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estenscioin]?\n\nTi poeu navegâ tra i [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estenscioin pe categoria].", + "mainpagetext": "MediaWiki o l'è stæto instalou.", + "mainpagedocfooter": "Consurta a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guidda utente] pe ciu informaçioin in sce l'uso de questo software wiki.\n\n== Pe començâ ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostaçioin de configuaçion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequente sciu MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anonçi MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Troeuva MediaWiki inta to lengoa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imprendi a combatte o spam in sciâ to wiki]" } diff --git a/includes/installer/i18n/lv.json b/includes/installer/i18n/lv.json index 23f3de1397..671d073575 100644 --- a/includes/installer/i18n/lv.json +++ b/includes/installer/i18n/lv.json @@ -29,6 +29,7 @@ "config-env-hhvm": "HHVM $1 ir uzstādīts.", "config-apcu": "[http://www.php.net/apcu APCu] ir uzstādīts", "config-diff3-bad": "GNU diff3 nav atrasts.", + "config-db-host-oracle": "Datubāzes TNS:", "config-db-name": "Datubāzes nosaukums:", "config-db-username": "Datubāzes lietotājvārds:", "config-db-password": "Datubāzes parole:", diff --git a/includes/installer/i18n/mk.json b/includes/installer/i18n/mk.json index 89f8e55bf2..d028a8c4d8 100644 --- a/includes/installer/i18n/mk.json +++ b/includes/installer/i18n/mk.json @@ -3,7 +3,8 @@ "authors": [ "Bjankuloski06", "아라", - "Macofe" + "Macofe", + "Srdjan m" ] }, "config-desc": "Воспоставувачот на МедијаВики", @@ -58,7 +59,7 @@ "config-pcre-old": "'''Кобно:''' Се бара PCRE $1 или понова верзија.\nВашиот PHP-бинарен е сврзан со PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Повеќе информации].", "config-pcre-no-utf8": "Кобно: PCRE-модулот на PHP е срочен без поддршка за PCRE_UTF8.\nМедијаВики бара поддршка за UTF-8 за да може да работи правилно.", "config-memory-raised": "memory_limit за PHP изнесува $1, зголемен на $2.", - "config-memory-bad": "'''Предупредување:''' memory_limit за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!", + "config-memory-bad": "Предупредување: memory_limit за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!", "config-xcache": "[http://xcache.lighttpd.net/ XCache] е воспоставен", "config-apc": "[http://www.php.net/apc APC] е воспоставен", "config-apcu": "[http://www.php.net/apcu APCu] е воспоставен", @@ -71,7 +72,7 @@ "config-imagemagick": "Пронајден е ImageMagick: $1.\nАко овозможите подигање, тогаш ќе биде овозможена минијатуризација на сликите.", "config-gd": "Утврдив дека има вградена GD графичка библиотека.\nАко овозможите подигање, тогаш ќе биде овозможена минијатураизација на сликите.", "config-no-scaling": "Не можев да пронајдам GD-библиотека или ImageMagick.\nМинијатуризацијата на сликите ќе биде оневозможена.", - "config-no-uri": "'''Грешка:''' Не можев да го утврдам тековниот URI.\nВоспоставката е откажана.", + "config-no-uri": "Грешка: Не можев да го утврдам тековниот URI.\nВоспоставката е откажана.", "config-no-cli-uri": "'''Предупредување''': Нема наведено --scriptpath. Ќе се користи основниот: $1.", "config-using-server": "Користите опслужувач под името „$1“.", "config-using-uri": "Користите опслужувач со URL-адреса „$1$2“.", @@ -79,6 +80,7 @@ "config-no-cli-uploads-check": "'''Предупредување:''' Вашата основна папка за подигања ($1) не е проверена дали е подложна\nпроизволно извршување на скрипти во текот на воспоставката на посредникот на повикувачко ниво (CLI).", "config-brokenlibxml": "Вашиот систем има комбинација од PHP и libxml2 верзии и затоа има грешки и може да предизвика скриено расипување на податоците кај МедијаВики и други мрежни програми.\nНадградете го на libxml2 2.7.3 или нивни понови верзии! ([https://bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]). Воспоставката е откажана.", "config-suhosin-max-value-length": "Suhosin е воспоставен и ја ограничува должината на параметарот GET на $1 бајти. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но со тоа ќе се влоши делотворноста. Ако е воопшто можно, на suhosin.get.max_value_length треба да го наместите на 1024 или повеќе во php.ini, и да му ја зададете истата вредност на $wgResourceLoaderMaxQueryLength во LocalSettings.php.", + "config-using-32bit": "Предупредување: вашиот систем работи на 32-битни цели броеви. Ова [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-не се препорачува].", "config-db-type": "Тип на база:", "config-db-host": "Домаќин на базата:", "config-db-host-help": "Ако вашата база е на друг опслужувач, тогаш тука внесете го името на домаќинот или IP-адресата.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител треба да го наведе точното име на домаќинот во неговата документација.\n\nАко воспоставувате на опслужувач на Windows и користите MySQL, можноста „localhost“ може да не функционира за опслужувачкото име. Во тој случај, обидете се со внесување на „127.0.0.1“ како месна IP-адреса.\n\nАко користите PostgreSQL, оставете го полево празно за да се поврзете преку Unix-приклучок.", @@ -86,7 +88,7 @@ "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm месно име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.
    Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", "config-db-wiki-settings": "Идентификувај го викиво", "config-db-name": "Име на базата:", - "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.", + "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку управувачницата.", "config-db-name-oracle": "Шема на базата:", "config-db-account-oracle-warn": "Постојат три поддржани сценарија за воспоставка на Oracle како базен услужник:\n\nАко сакате да создадете сметка на базата како дел од постапката за воспоставка, наведете сметка со SYSDBA-улога како сметка за базата што ќе се воспостави и наведете ги саканите податоци за сметката за мрежен пристап. Во друг случај, можете да создадете сметка за мрежен пристап рачно и да ја наведете само таа сметка (ако има дозволи за создавање на шематски објекти) или пак да наведете две различни сметки, една со привилегии за создавање, а друга (ограничена) за мрежен пристап.\n\nСкриптата за создавање сметка со задолжителни привилегии ќе ја најдете во папката „maintenance/oracle/“ од оваа воспоставка. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.", "config-db-install-account": "Корисничка смета за воспоставка", @@ -104,7 +106,7 @@ "config-db-port": "Порта на базата:", "config-db-schema": "Шема за МедијаВики", "config-db-schema-help": "Оваа шема обично по правило ќе работи нормално.\nСменете ја само ако знаете дека треба да се смени.", - "config-pg-test-error": "Не можам да се поврзам со базата '''$1''': $2", + "config-pg-test-error": "Не можам да се поврзам со базата $1: $2", "config-sqlite-dir": "Папка на SQLite-податоци:", "config-sqlite-dir-help": "SQLite ги складира сите податоци во една податотека.\n\nПапката што ќе ја наведете мора да е запислива од мрежниот опслужувач во текот на воспоставката.\n\nТаа '''не''' смее да биде достапна преку семрежјето, и затоа не ја ставаме кајшто ви се наоѓаат PHP-податотеките.\n\nВоспоставувачот воедно ќе создаде податотека .htaccess, но ако таа не функционира како што треба, тогаш некој ќе може да ви влезе во вашата необработена (сирова) база на податоци.\nТука спаѓаат необработени кориснички податоци (е-поштенски адреси, хеширани лозинки) како и избришани преработки и други податоци за викито до кои се има ограничен пристап.\n\nСе препорачува целата база да ја сместите некаде, како на пр. /var/lib/mediawiki/вашетовики.", "config-oracle-def-ts": "Стандарден таблеарен простор:", @@ -312,6 +314,8 @@ "config-help-tooltip": "стиснете да расклопите", "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 по категории]", + "config-skins-screenshots": "$1 (екр. снимки: $2)", + "config-screenshot": "екранска снимка", "mainpagetext": "МедијаВики е успешно воспоставен.", "mainpagedocfooter": "Погледнете го [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Упатството за корисници] за подетални информации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [https://meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [https://meta.wikimedia.org/wiki/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 Дознајте како да се борите против спам на вашето вики]" } diff --git a/includes/installer/i18n/ms.json b/includes/installer/i18n/ms.json index 71b50de519..61acd3ecf6 100644 --- a/includes/installer/i18n/ms.json +++ b/includes/installer/i18n/ms.json @@ -6,7 +6,8 @@ "SNN95", "MaxSem", "Aviator", - "Macofe" + "Macofe", + "Jeluang Terluang" ] }, "config-desc": "Pemasang MediaWiki", @@ -56,7 +57,7 @@ "config-outdated-sqlite": "Amaran: anda mempunyai SQLite $1 yang lebih rendah daripada versi keperluan minimum $1. SQLite tidak akan disediakan.", "config-no-fts3": "Amaran: SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.", "config-pcre-old": "Amaran keras: PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].", - "config-memory-bad": "Amaran: memory_limit (Had memori) PHP adalah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!", + "config-memory-bad": "Amaran: memory_limit (Had memori) PHP ialah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!", "config-xcache": "[http://xcache.lighttpd.net/ XCache] dipasang", "config-apc": "[http://www.php.net/apc APC] dipasang", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] dipasang", @@ -97,7 +98,7 @@ "config-mysql-engine": "Enjin storan:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", - "config-mysql-only-myisam-dep": "Amaran: MyISAM adalah satu-satunya enjin storan yang terdapat untuk MySQL di mesin ini, dan penggunaannya dengan MediaWiki tidak digalakkan kerana:\n* ia tidak menyokong keserempakan (''concurrency'') disebabkan penguncian jadual\n* ia lebih terdedah kepada korupsi daripada enjin-enjin lain\n* pangkalan kod MediaWiki tidak sentiasa mengendalikan MyISAM seperti yang diharapkan\n\nPemasangan MySQL anda tidak menyokong InnoDB. Mungkin tiba masanya untuk naik taraf.", + "config-mysql-only-myisam-dep": "Amaran: MyISAM ialah satu-satunya enjin storan yang terdapat untuk MySQL di mesin ini, dan penggunaannya dengan MediaWiki tidak digalakkan kerana:\n* ia tidak menyokong keserempakan (''concurrency'') disebabkan penguncian jadual\n* ia lebih terdedah kepada korupsi daripada enjin-enjin lain\n* pangkalan kod MediaWiki tidak sentiasa mengendalikan MyISAM seperti yang diharapkan\n\nPemasangan MySQL anda tidak menyokong InnoDB. Mungkin tiba masanya untuk naik taraf.", "config-mysql-charset": "Peranggu aksara pangkalan data:", "config-mysql-binary": "Perduaan", "config-mysql-utf8": "UTF-8", diff --git a/includes/installer/i18n/mzn.json b/includes/installer/i18n/mzn.json index c2574818a6..b8218463d5 100644 --- a/includes/installer/i18n/mzn.json +++ b/includes/installer/i18n/mzn.json @@ -4,5 +4,56 @@ "محک" ] }, + "config-information": "اطلاعات", + "config-localsettings-key": "آپگریت کلید:", + "config-your-language": "شمه زوون:", + "config-wiki-language": "ویکی زوون:", + "config-back": "→ دِگِرِستِن", + "config-continue": "دمباله ←", + "config-page-language": "زوون", + "config-page-welcome": "مدیاویکی ره خِش بمونی!", + "config-page-dbconnect": "اتصال به دیتابیس", + "config-page-name": "نوم", + "config-page-options": "تنظیمات", + "config-page-install": "نصب", + "config-page-complete": "کامل!", + "config-page-restart": "دِباره نصب هاکردن", + "config-page-readme": "مه ره ونگ هاکن", + "config-page-releasenotes": "انتشار یادداشتون", + "config-page-copying": "کپی هاکردن", + "config-page-upgradedoc": "آپگریت هاکردن", + "config-page-existingwiki": "دیی ویکی", + "config-help-restart": "خانی تموم اطلاعاتی که ذخیره بینه ره حذف هاکنین و اَی این صوه سَری دِباره نصب هاکردن ره شروع هاکنین؟", + "config-restart": "اره. دِباره", + "config-env-good": "محیط بررسی بیّه.\nشما توندی مدیاویکی ره نصب هاکنی.", + "config-env-bad": "محیط بررسی بیه.\nشما نتوندی مدیاویکی ره نصب هاکنی.", + "config-env-php": "پی‌اچ‌پی $1 نصب بیه.", + "config-env-hhvm": "اچ‌اچ‌وی‌ام $1 نصب بیه.", + "config-unicode-using-intl": "عادی یونیکد وسه [http://pecl.php.net/intl افزونهٔ intl برای PECL] جه استفاده هاکن.", + "config-memory-raised": "PHP's memory_limit, نسخهٔ $1 هسته، ونه نسخهٔ $2 ره بَیری آپگریت هاکنی.", + "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب بیه.", + "config-apc": "[http://www.php.net/apc APC] نصب بیه.", + "config-apcu": "[http://www.php.net/apcu APCu] نصب بیه.", + "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب بیه.", + "config-diff3-bad": "GNU diff3 پیدا نیه.", + "config-mysql-binary": "باینری", + "config-mysql-utf8": "UTF-8", + "config-mssql-auth": "نوع تأیید:", + "config-ns-generic": "پروژه", + "config-ns-other": "دیگه ( تعیین هاکنین)", + "config-ns-other-default": "مه‌ویکی", + "config-admin-box": "مدیر ِکاروری حیساب", + "config-admin-name": "شمه کاروری نوم:", + "config-admin-password": "پسوُرد:", + "config-admin-password-confirm": "دِباره پسورد:", + "config-admin-password-mismatch": "دِتا پسوردی که بنویشتی اتجور نینه", + "config-admin-email": "ایمیل آدرس:", + "config-admin-error-bademail": "شمه ایمیل آدرس مشکل دارنه.", + "config-optional-continue": "مه جه ویشته سوال هاپرس.", + "config-optional-skip": "اسا خستومه، زودته ویکی ره نصب هاکن.", + "config-profile-wiki": "ویکی ره دیار هاکن", + "config-profile-private": "خصوصی ویکی", + "config-license-pd": "عمومی دامنه", + "config-email-settings": "ایمیل تنظیمات", "config-help": "راهنما" } diff --git a/includes/installer/i18n/nb.json b/includes/installer/i18n/nb.json index b7a7289a8a..b43f92fa97 100644 --- a/includes/installer/i18n/nb.json +++ b/includes/installer/i18n/nb.json @@ -318,6 +318,8 @@ "config-help-tooltip": "klikk for å utvide", "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?", "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [https://www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.", + "config-skins-screenshots": "$1 (skjermbilder: $2)", + "config-screenshot": "skjermbilde", "mainpagetext": "MediaWiki har blitt installert.", "mainpagedocfooter": "Sjekk [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]" } diff --git a/includes/installer/i18n/nl.json b/includes/installer/i18n/nl.json index a4995538af..2154e7e134 100644 --- a/includes/installer/i18n/nl.json +++ b/includes/installer/i18n/nl.json @@ -63,7 +63,7 @@ "config-sidebar": "* [https://www.mediawiki.org MediaWiki-thuispagina]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen] (Engelstalig)\n----\n* Leesmij (Engelstalig)\n* Release notes (Engelstalig)\n* Kopiëren (Engelstalig)\n* Versie bijwerken (Engelstalig)", "config-env-good": "De omgeving is gecontroleerd.\nU kunt MediaWiki installeren.", "config-env-bad": "De omgeving is gecontroleerd.\nU kunt MediaWiki niet installeren.", - "config-env-php": "PHP $1 is op dit moment geïnstalleerd.", + "config-env-php": "PHP $1 is geïnstalleerd.", "config-env-hhvm": "HHVM $1 is geïnstalleerd.", "config-unicode-using-intl": "Voor Unicode-normalisatie wordt de [http://pecl.php.net/intl PECL-extensie intl] gebruikt.", "config-unicode-pure-php-warning": "Waarschuwing: de [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzamere PHP-implementatie gebruikt.\nAls u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodenormalisatie].", @@ -171,7 +171,7 @@ "config-unknown-collation": "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.", "config-db-web-account": "Databaseaccount voor webtoegang", "config-db-web-help": "Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.", - "config-db-web-account-same": "Dezelfde account gebruiken als voor de installatie", + "config-db-web-account-same": "Hetzelfde account gebruiken als voor de installatie", "config-db-web-create": "Maak de gebruiker aan als deze nog niet bestaat", "config-db-web-no-create-privs": "De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.\nDe gebruiker die u hier opgeeft moet al bestaan.", "config-mysql-engine": "Opslagmethode:", @@ -278,9 +278,9 @@ "config-extensions": "Uitbreidingen", "config-extensions-help": "De bovenstaande uitbreidingen zijn aangetroffen in de map ./extensions.\n\nMogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.", "config-skins": "Vormgevingen", - "config-skins-help": "De hierboven weergegeven uiterlijken zijn aangetroffen in de map ./skins. U moet ten minste één uiterlijk inschakelen en het standaard uiterlijk kiezen.", + "config-skins-help": "De hierboven weergegeven vormgevingen zijn aangetroffen in de map ./skins. U moet ten minste één vormgeving inschakelen en de standaard vormgeving selecteren.", "config-skins-use-as-default": "Als standaard vormgeving instellen", - "config-skins-missing": "Er zijn geen uiterlijken aangetroffen. MediaWiki gebruikt een basisuiterlijk totdat u een uiterlijk installeert.", + "config-skins-missing": "Er zijn geen vormgevingen aangetroffen. MediaWiki gebruikt een basisvormgeving totdat u een vormgeving installeert.", "config-skins-must-enable-some": "U moet minstens één vormgeving kiezen om in te schakelen.", "config-skins-must-enable-default": "De vormgeving gekozen als standaard moet ingeschakeld zijn.", "config-install-alreadydone": "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.\nGa door naar de volgende pagina.", diff --git a/includes/installer/i18n/pt-br.json b/includes/installer/i18n/pt-br.json index 13944ee674..5ae3a0c37e 100644 --- a/includes/installer/i18n/pt-br.json +++ b/includes/installer/i18n/pt-br.json @@ -21,14 +21,15 @@ "Almondega", "Luk3", "Eduardo Addad de Oliveira", - "Warley Felipe C." + "Warley Felipe C.", + "Felipe L. Ewald" ] }, "config-desc": "O instalador do MediaWiki", "config-title": "Instalação do MediaWiki $1", "config-information": "Informações", - "config-localsettings-upgrade": "Foi detectada a existência do arquivo LocalSettings.php.\nPara atualizar esta instalação, insira na caixa abaixo o valor de $wgUpgradeKey.\nEssa informação pode ser encontrada no arquivo LocalSettings.php", - "config-localsettings-cli-upgrade": "Foi detectada a existência do arquivo LocalSettings.php.\nAtualize esta instalação executando o arquivo update.php", + "config-localsettings-upgrade": "Foi detectada a existência do arquivo LocalSettings.php.\nPara atualizar esta instalação, insira na caixa abaixo o valor de $wgUpgradeKey.\nEssa informação pode ser encontrada no arquivo LocalSettings.php.", + "config-localsettings-cli-upgrade": "Foi detectada a existência do arquivo LocalSettings.php.\nPara atualizar esta instalação, por favor, executando o arquivo update.php em vez", "config-localsettings-key": "Chave de atualização:", "config-localsettings-badkey": "A chave de atualização que você forneceu está incorreta.", "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, insira a seguinte linha ao final do seu LocalSettings.php:\n\n$1", @@ -36,7 +37,7 @@ "config-localsettings-connection-error": "Ocorreu um erro ao conectar ao banco de dados através das configurações presentes no arquivo LocalSettings.php. Por favor, corrija essas configurações e tente novamente.\n\n$1", "config-session-error": "Erro ao iniciar a sessão: $1", "config-session-expired": "Os dados da sua sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nVocê pode aumentar esta duração configurando session.gc_maxlifetime no php.ini.\nReinicie o processo de instalação.", - "config-no-session": "Os dados da sua sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em session.save_path está definido um diretório apropriado.", + "config-no-session": "Os dados da sua sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que session.save_path está definido com um diretório apropriado.", "config-your-language": "Seu idioma:", "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.", "config-wiki-language": "Idioma da wiki:", @@ -66,11 +67,11 @@ "config-env-good": "O ambiente foi verificado.\nVocê pode instalar o MediaWiki.", "config-env-bad": "O ambiente foi verificado.\nVocê não pode instalar o MediaWiki.", "config-env-php": "O PHP $1 está instalado.", - "config-env-hhvm": "HHVM $1 está instalado.", + "config-env-hhvm": "O HHVM $1 está instalado.", "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.", "config-unicode-pure-php-warning": "Aviso: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].", - "config-unicode-update-warning": "Aviso: A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.", - "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando ./configure --with-mysqli.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote php5-mysql.", + "config-unicode-update-warning": "Aviso: A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.", + "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceito o seguinte tipo|São aceitos os seguintes tipos}} de banco de dados: $1.\n\nSe você compilou o PHP, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando ./configure --with-mysqli.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote php5-mysql.", "config-outdated-sqlite": "Aviso: você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.", "config-no-fts3": "Aviso O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.", "config-pcre-old": "Erro fatal: É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].", @@ -82,45 +83,49 @@ "config-apcu": "[http://www.php.net/apcu APCu] está instalado", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado", "config-no-cache-apcu": "Aviso: Não se pode encontrar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nO caching de objetos não foi ativado.", - "config-mod-security": "Aviso: Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.", + "config-mod-security": "Aviso: Seu servidor web tem [http://modsecurity.org/ mod_security2] habilitado. Muitas configurações comuns de módulo podem causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nSe possível, ele dever ser desativad. Consulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.", "config-diff3-bad": "O GNU diff3 não foi encontrado.", "config-git": "Foi encontrado o software de controle de versão Git: $1.", "config-git-bad": "O software de controle de versão Git não foi encontrado.", - "config-imagemagick": "ImageMagick encontrado: $1 .\nRedimensionamento de imagem será ativado se você permitir uploads.", + "config-imagemagick": "Encontrado ImageMagick: $1.\nRedimensionamento de imagem será ativado se você permitir uploads.", "config-gd": "Encontrada biblioteca gráfica GD embutida\nO redimensionamento de imagens será habilitado se você permitir uploads.", - "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick. \nO redimensionamento de imagens será desabilitado.", - "config-no-uri": "Erro: Não foi possível determinar a URI atual. A instalação foi abortada.", + "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick.\nO redimensionamento de imagens será desabilitado.", + "config-no-uri": "Erro: Não foi possível determinar o URI atual.\nA instalação foi abortada.", "config-no-cli-uri": "Aviso: Nenhum --scriptpath foi especificado, usando o padrão: $1.", "config-using-server": "Utilizando o nome do servidor \"$1\".", "config-using-uri": "Usando URL do servidor \"$1$2\".", + "config-uploads-not-safe": "Aviso: O seu diretório atual de envios $1 está vulnerável a execuções de script arbitrárias.\nEmbora o MediaWiki verifique todos os arquivos enviados por ameaças de segurança, é altamente recomendável [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security evitar essa vulnerabilidade de segurança] antes de permitir envios.", "config-no-cli-uploads-check": "Atenção: O seu diretório padrão para envios ($1) não está marcado para vulnerabilidade\npara execução de script arbitrário durante a instalação do CLI.", "config-brokenlibxml": "O sistema tem uma combinação de PHP e libxml2 que é conflitante e pode causar corrupção de dados ocultos no MediaWiki e outros aplicativos da web.\nAtualize para o libxml2 2.7.3 ou mais recente ([https://bugs.php.net/bug.php?id=45996 bugs com o PHP]).\nInstalação abortada.", - "config-db-type": "Tipo de base de dados:", - "config-db-host": "Servidor da base de dados:", - "config-db-host-help": "Se a base de dados do seu servidor está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.", - "config-db-host-oracle": "TNS da base de dados:", + "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET length para $1 bytes. O componente ResourceLoader trabalhará em torno deste limite, mas degradará a performance.\nSe possível, defina suhosin.get.max_value_length em php.ini para 1024 ou mais e defina $wgResourceLoaderMaxQueryLength em LocalSettings.php para o mesmo valor.", + "config-db-type": "Tipo do banco de dados:", + "config-db-host": "Servidor do banco de dados:", + "config-db-host-help": "Se a banco de dados do seu servidor está em um servidor diferente, digite o nome do host ou o endereço IP aqui.\n\nSe você está utilizando uma hospedagem web compartilhada, o seu provedor de hospedagem deverá fornecer o nome do host correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.0.1\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.", + "config-db-host-oracle": "TNS do banco de dados:", + "config-db-host-oracle-help": "Digite um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome de Conexão local] válido; o arquivo tnsnames.ora precisa estar visível para esta instalação.
    Se você estiver usando bibliotecas cliente 10g ou mais recente, você também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", "config-db-wiki-settings": "Identifique esta wiki", - "config-db-name": "Nome da base de dados:", - "config-db-name-help": "Escolha um nome que identifique a sua wiki.\nEle não deve conter espaços.\n\nSe você está utilizando um hospedeiro web compartilhado, o provedor de hospedagem lhe dará um nome especifico de base de dados para usar ou o deixará criar a partir do painel de controle.", - "config-db-name-oracle": "Esquema de base de dados:", + "config-db-name": "Nome do banco de dados:", + "config-db-name-help": "Escolha um nome que identifique a sua wiki.\nEle não deve conter espaços.\n\nSe você está utilizando uma hospedagem web compartilhada, o provedor de hospedagem lhe dará um nome especifico de banco de dados para usar ou o deixará criar a partir do painel de controle.", + "config-db-name-oracle": "Esquema do banco de dados:", + "config-db-account-oracle-warn": "Há três cenários suportados para instalar o Oracle como backend do banco de dados:\n\nSe você deseja criar a conta do banco de dados como parte do processo de instalação, forneça uma conta com função SYSDBA como conta do banco de dados para instalação e especifique as credenciais desejadas para a conta de acesso pela web, caso contrário, você poderá criar a conta de acesso via web manualmente e fornecer apenas aquela conta (se tiver permissões necessárias para criar os objetos schema) ou fornecer duas contas diferentes, uma com privilégios de criação e uma restrita para acesso à web.\n\nO script para criar uma conta com os privilégios necessários pode ser encontrado no diretório \"maintenance/oracle/\" desta instalação. Lembre-se de que usar uma conta restrita desativará todos os recursos de manutenção com a conta padrão.", "config-db-install-account": "Conta de usuário para instalação", "config-db-username": "Nome de usuário do banco de dados:", "config-db-password": "Senha do banco de dados:", - "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.", + "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua banco de dados.", "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.", "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.", "config-db-account-lock": "Use o mesmo nome de usuário e senha durante a operação normal", "config-db-wiki-account": "Conta de usuário para operação normal", - "config-db-wiki-help": "Digite o nome de usuário e senha que será usada para se conectar ao banco de dados durante a operação normal wiki.\nSe a conta não existir, e a conta de instalação tiver privilégios suficientes, a conta do usuário será criada com os privilégios mínimos necessários para o funcionamento do wiki.", - "config-db-prefix": "Prefixo da tabela de banco de dados:", - "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode deve escolher adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.", + "config-db-wiki-help": "Digite o nome de usuário e senha que será usada para se conectar ao banco de dados durante a operação normal wiki.\nSe a conta não existir e a conta de instalação tiver privilégios suficientes, a conta do usuário será criada com os privilégios mínimos necessários para o funcionamento da wiki.", + "config-db-prefix": "Prefixo da tabela do banco de dados:", + "config-db-prefix-help": "Se você precisar compartilhar a banco de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.", "config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.", - "config-db-port": "Porta da base de dados:", - "config-db-schema": "Esquema para MediaWiki", + "config-db-port": "Porta do banco de dados:", + "config-db-schema": "Esquema para MediaWiki:", "config-db-schema-help": "Este esquema geralmente estará correto.\nSó o modifique se você tiver certeza que precisa.", - "config-pg-test-error": "Não foi possível se conectar com a base de dados $1: $2", + "config-pg-test-error": "Não foi possível se conectar com o banco de dados $1: $2", "config-sqlite-dir": "Diretório de dados do SQLite:", - "config-sqlite-dir-help": "O SQLite armazena todos os dados em um único arquivo.\n\nO diretório que você fornecer deve permitir a sua escrita pelo servidor web durante a instalação.\n\nO diretório não deve ser acessível pela web, por isso não estamos colocando onde estão os seus arquivos PHP.\n\nO instalador escreverá um arquivo .htaccess, mas se isso falhar alguém poderá ganhar acesso a toda sua base de dados.\nIsso inclui dados brutos dos usuários (endereços de email, senhas criptografadas) assim como todas revisões deletadas e outros dados restritos na wiki.\n\nConsidere colocar a base de dados em algum outro lugar, por exemplo /var/lib/mediawiki/yourwiki.", + "config-sqlite-dir-help": "O SQLite armazena todos os dados em um único arquivo.\n\nO diretório que você fornecer deve permitir a sua escrita pelo servidor web durante a instalação.\n\nO diretório não deve ser acessível pela web, por isso não estamos colocando onde estão os seus arquivos PHP.\n\nO instalador escreverá um arquivo .htaccess, mas se isso falhar alguém poderá ganhar acesso a toda sua base de dados.\nIsso inclui dados brutos dos usuários (endereços de e-mail, senhas criptografadas) assim como todas revisões deletadas e outros dados restritos na wiki.\n\nConsidere colocar a banco de dados em algum outro lugar, por exemplo /var/lib/mediawiki/yourwiki.", "config-oracle-def-ts": "Espaço de tabela padrão:", "config-oracle-temp-ts": "Tablespace temporário:", "config-type-mysql": "MySQL (ou compatível)", @@ -129,44 +134,62 @@ "config-type-oracle": "Oracle", "config-type-mssql": "Microsoft SQL Server", "config-support-info": "O MediaWiki suporta os sistemas de banco de dados a seguir:\n\n$1\n\nSe você não vê o sistema de banco de dados que você está tentando usar listados abaixo, siga as instruções relacionadas acima, para ativar o suporte.", + "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] é o principal alvo para o MediaWiki e é melhor suportado. O MediaWiki também funciona com [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MySQL. ([Http://www.php.net/manual/en/mysqli.installation.php Como compilar PHP com suporte a MySQL])", + "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] é um popular sistema de banco de dados de código aberto como uma alternativa para o MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar o PHP com suporte PostgreSQL])", "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)", + "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é um banco de dados comercial de empresas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP com suporte OCI8])", + "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] é uma banco de dados comercial do Windows para empresas. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP com suporte SQLSRV])", "config-header-mysql": "Configurações MySQL", "config-header-postgres": "Configurações PostgreSQL", "config-header-sqlite": "Configurações SQLite", "config-header-oracle": "Configurações Oracle", "config-header-mssql": "Configurações Microsoft SQL Server", - "config-invalid-db-type": "Tipo de base de dados inválido.", + "config-invalid-db-type": "Tipo do banco de dados inválido.", "config-missing-db-name": "Você deve inserir um valor para \"{{int:config-db-name}}\".", "config-missing-db-host": "Você deve inserir um valor para \"{{int:config-db-host}}\".", "config-missing-db-server-oracle": "Você deve inserir um valor para \"{{int:config-db-host-oracle}}\".", + "config-invalid-db-server-oracle": "Banco de dados TNS inválido \"$1\".\nUse \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomeação da Oracle]).", + "config-invalid-db-name": "O nome do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).", + "config-invalid-db-prefix": "O prefixo do banco de dados é inválido \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9), underscores (_) e hifens (-).", "config-connection-error": "$1\n\nVerifique o servidor, nome de usuário e senha e tente novamente.", + "config-invalid-schema": "Schema inválido para o MediaWiki \"$1\".\nUse apenas letras ASCII (a-z, A-Z), números (0-9) e underscores (_).", "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 de usuário $1 já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!", + "config-db-sys-user-exists-oracle": "A conta de usuário \"$1\" já existe. SYSDBA somente pode ser utilizado na criação de uma nova conta!", "config-postgres-old": "PostgreSQL $1 ou posterior é necessário. Você tem $2.", - "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário.Você tem $2.", + "config-mssql-old": "Microsoft SQL Server $1 ou posterior é necessário. Você tem $2.", "config-sqlite-name-help": "Escolha um nome que identifique a sua wiki.\nNão utilize espaços ou hifens.\nIsto será utilizado como nome do arquivo de dados do SQLite.", + "config-sqlite-parent-unwritable-group": "Não é possível criar o diretório de dados $1, porque o diretório pai $2 não pode ser gravado pelo servidor web.\n\nO instalador conseguiu determinar o usuário em que seu servidor web está sendo executado.\nDe permissão de gravação global ao diretório $3 para o instalador para continuar.\nEm um sistema Unix/Linux faça:\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", + "config-sqlite-parent-unwritable-nogroup": "Não é possível criar o diretório de dados $1, porque o diretório pai $2 não pode ser gravado pelo servidor web.\n\nO instalador não conseguiu determinar o usuário em que seu servidor web está sendo executado.\nDe permissão de gravação global ao diretório $3 para o instalador (e outros!) para continuar.\nEm um sistema Unix/Linux faça:\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", "config-sqlite-mkdir-error": "Ocorreu um erro na criação do diretório de dados \"$1\".\nVerifique a localização e tente de novo.", "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nModifique as permissões de modo que o servidor web possa escrever no diretório e tente novamente.", - "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.", + "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome do banco de dados abaixo e tente novamente.", "config-sqlite-readonly": "Não é possível escrever no arquivo $1.", - "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados $1.", - "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; revertendo o esquema das tabelas para versão anterior", + "config-sqlite-cant-create-db": "Não foi possível criar o arquivo do banco de dados $1.", + "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; revertendo tabelas.", + "config-can-upgrade": "Este banco de dados contém tabelas do MediaWiki.\nPara atualizá-las para o MediaWiki $1, clique em Continuar.", + "config-upgrade-done": "Atualização completa.\n\nAgora você pode [$1 começar a usar sua wiki].\n\nSe você quiser regenerar seu arquivo LocalSettings.php, clique no botão abaixo.\nNão recomendado a menos que você esteja tendo problemas com sua wiki.", "config-upgrade-done-no-regenerate": "Atualização completa.\n\nAgora pode [$1 começar a usar a sua wiki].", "config-regenerate": "Regenerar arquivo LocalSettings.php →", "config-show-table-status": "Consulta SHOW TABLE STATUS falhou!", "config-unknown-collation": "Aviso: O banco de dados está usando agrupamento não reconhecido.", - "config-db-web-account": "Conta da base de dados para acesso web", - "config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor da base de dados durante o funcionamento normal da wiki.", + "config-db-web-account": "Conta do banco de dados para acesso web", + "config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor do banco de dados durante o funcionamento normal da wiki.", "config-db-web-account-same": "Use a mesma conta usada na instalação", - "config-db-web-create": "Crie a conta se esta ainda não existir.", - "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios suficientes para criar uma conta.\nA conta que especificar aqui deve já existir.", + "config-db-web-create": "Crie a conta se esta ainda não existir", + "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios suficientes para criar uma conta.\nA conta que for especificada aqui já deve existir.", "config-mysql-engine": "Mecanismo de armazenamento:", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", - "config-mysql-charset": "Conjunto de caracteres da base de dados:", - "config-mysql-binary": "Binary", + "config-mysql-myisam-dep": "Aviso: Você selecionou MyISAM como mecanismo de armazenamento para o MySQL, o que não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nSe sua instalação MySQL suportar o InnoDB, é altamente recomendável que você escolha ele.\nSe sua instalação MySQL não suportar o InnoDB, talvez seja hora de uma atualização.", + "config-mysql-only-myisam-dep": "Aviso: O MyISAM é o único mecanismo de armazenamento disponível para o MySQL nesta máquina e isso não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nA sua instalação no MySQL não suporta InnoDB, talvez seja hora de uma atualização.", + "config-mysql-engine-help": "InnoDB é quase sempre a melhor opção, uma vez que possui um bom suporte de concorrência.\n\nMyISAM pode ser mais rápido em instalações de usuário único ou somente leitura.\\O banco de dados MyISAM tendem a ficar corrompidos mais frequentemente do que os bancos de dados InnoDB.", + "config-mysql-charset": "Conjunto de caracteres do banco de dados:", + "config-mysql-binary": "Binário", "config-mysql-utf8": "UTF-8", + "config-mysql-charset-help": "Em modo binário, o MediaWiki armazena texto UTF-8 no banco de dados em campos binários.\nEsto é mais eficiente que o modo UTF-8 do MySQL e permite que você use a gama completa de caracteres Unicode.\n\nNo modo UTF-8, o MySQL saberá o caracterer em que seus dados estão inseridos e pode apresentá-lo e convertê-lo adequadamente, mas não permitirá que você armazene caracteres acima do [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Multilingue Básico].", "config-mssql-auth": "Tipo de autenticação:", + "config-mssql-install-auth": "Selecione o tipo de autenticação que será usado para se conectar ao banco de dados durante o processo de instalação.\nSe você selecionar \"{{int:config-mssql-windowsauth}}\", as credenciais de qualquer usuário que o servidor web esteja executando serão usadas.", + "config-mssql-web-auth": "Selecione o tipo de autenticação que o servidor web usará para se conectar ao servidor do banco de dados, durante a operação normal da wiki.\nSe você selecionar \"{{int:config-mssql-windowsauth}}\", as credenciais de qualquer usuário no qual o servidor web está rodando serão usadas.", "config-mssql-sqlauth": "Autenticação do SQL Server", "config-mssql-windowsauth": "Autenticação do Windows", "config-site-name": "Nome da wiki:", @@ -176,8 +199,9 @@ "config-ns-generic": "Projeto", "config-ns-site-name": "O mesmo que o nome da wiki: $1", "config-ns-other": "Outro (especifique)", - "config-ns-other-default": "AMinhaWiki", - "config-ns-invalid": "O domínio especificado \"$1\" é inválido. Especifique um domínio do projeto diferente.", + "config-ns-other-default": "MinhaWiki", + "config-project-namespace-help": "Seguindo o exemplo da Wikipédia, muitas wikis mantêm suas páginas de políticas separadas de suas páginas de conteúdo, em um ''espaço espaço nominal de projeto''.\nTodos os títulos de páginas neste espaço espaço nominal começam com um determinado prefixo, que você pode especificar aqui.\nUsualmente, este prefixo é derivado do nome da wiki, mas não pode conter caracteres de pontuação como \"#\" ou \":\".", + "config-ns-invalid": "O domínio especificado \"$1\" é inválido.\nEspecifique um domínio do projeto diferente.", "config-ns-conflict": "O domínio especificado \"$1\" conflita com um domínio padrão do MediaWiki.\nEspecifique um domínio do projeto diferente.", "config-admin-box": "Conta de administrador", "config-admin-name": "Seu nome de usuário:", @@ -188,12 +212,16 @@ "config-admin-name-invalid": "O nome de usuário especificado \"$1\" é inválido.\nEspecifique um nome de usuário diferente.", "config-admin-password-blank": "Digite uma senha para a conta de administrador.", "config-admin-password-mismatch": "As duas senhas que você digitou não são iguais.", - "config-admin-email": "Endereço de email:", - "config-admin-email-help": "Digite aqui um endereço de email para permitir que você receba email de outros usuários na wiki, refaça a sua senha, e seja notificado das mudanças das páginas que você vigia. Você pode deixar esse campo vazio.", + "config-admin-email": "Endereço de e-mail:", + "config-admin-email-help": "Digite aqui um endereço de e-mail para permitir que você receba e-mail de outros usuários na wiki, refaça a sua senha, e seja notificado das mudanças das páginas que você vigia. Você pode deixar esse campo vazio.", "config-admin-error-user": "Erro interno ao criar um administrador com o nome \"$1\".", "config-admin-error-password": "Erro interno ao configurar uma senha para o administrador \"$1\":
    $2
    ", - "config-admin-error-bademail": "Você digitou um endereço de email inválido.", + "config-admin-error-bademail": "Você digitou um endereço de e-mail inválido.", + "config-subscribe": "Inscrever-se na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de anúncios de laçamentos].", + "config-subscribe-help": "Esta é uma lista de discussão de baixo volume usada para anúncios de lançamento, incluindo importantes anúncios de segurança.\nVocê deve se inscrever e atualizar sua instalação do MediaWiki quando novas versões forem lançadas.", + "config-subscribe-noemail": "Você tentou se inscrever na lista de discussão de anúncios de lançamento sem fornecer um endereço de e-mail.\n\nPor favor, forneça um endereço de e-mail se desejar se inscrever na lista de discussão.", "config-pingback": "Compartilhe dados sobre esta instalação com desenvolvedores do MediaWiki.", + "config-pingback-help": "Se você selecionar esta opção, o MediaWiki periodicamente enviará para https://www.mediawiki.org dados básicos sobre esta instância do MediaWiki. Esses dados incluem, por exemplo, o tipo de sistema, a versão PHP e o backend do banco de dados escolhido. A Fundação Wikimedia compartilha esses dados com os desenvolvedores do MediaWiki para ajudar a orientar os esforços de desenvolvimento futuros. Os seguintes dados serão enviados para o seu sistema:\n
    $1
    ", "config-almost-done": "Você está quase terminando!\nVocê agora pode pular as configurações restantes e instalar a wiki agora mesmo.", "config-optional-continue": "Faça-me mais perguntas.", "config-optional-skip": "Já estou aborrecido, apenas instale a wiki.", @@ -202,35 +230,46 @@ "config-profile-no-anon": "Criação de conta exigida", "config-profile-fishbowl": "Somente editores autorizados", "config-profile-private": "Wiki privada", + "config-profile-help": "As Wikis funcionam melhor quando você deixa que muitas pessoas as editem o quanto for possível.\nNo MediaWiki é fácil revisar as mudanças recentes e reverter qualquer dano que seja feito por usuários ingênuos ou mal-intencionados.\n\nNo entanto, muitos encontraram no MediaWiki em uma grande variedade de funções e às vezes não é fácil convencer todos dos benefícios do modo wiki.\nEntão você tem a escolha.\n\nO modelo {{int:config-profile-wiki}} permite que qualquer pessoa edite, sem sequer fazer login.\nUma wiki com {{int:config-profile-no-anon}} fornece uma responsabilidade adicional, mas pode impedir contribuintes ocasionais.\n\nO cenário {{int:config-profile-fishbowl}} permite que usuários aprovados possam editar, mas o público pode visualizar as páginas, incluindo o histórico.\nUma {{int:config-profile-private}} só permite que usuários aprovados vejam páginas, com o mesmo grupo permitido a editar.\n\nMais configurações de direitos de usuário complexas estão disponíveis após a instalação, veja as[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights entradas relevantes no manual].", "config-license": "Direitos autorais e licenças:", "config-license-none": "Sem rodapé com a licença", - "config-license-cc-by-sa": "Creative Commons - Atribuição - Compartilha nos Mesmos Termos", + "config-license-cc-by-sa": "Creative Commons - Atribuição - Compartilhamento pela mesma Licença", "config-license-cc-by": "Atribuição Creative Commons", + "config-license-cc-by-nc-sa": "Creative Commons - Atribuição – Uso Não Comercial – Compartilhamento pela mesma Licença", + "config-license-cc-0": "Creative Commons Zero (Domínio público)", "config-license-gfdl": "GNU Free Documentation License 1.3 ou posterior", "config-license-pd": "Domínio público", "config-license-cc-choose": "Selecionar uma licença personalizada da organização Creative Commons", - "config-email-settings": "Configurações de email", - "config-enable-email": "Ativar mensagens eletrónicas de saída", - "config-enable-email-help": "Se você quer que o email funcione, estas [http://www.php.net/manual/en/mail.configuration.php configurações de email PHP] precisam ser configuradas corretamente. \nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.", - "config-email-user": "Ativar emails entre usuários", - "config-email-user-help": "Permitir que todos os usuários enviem email entre si se eles tiverem habilitado este recurso em suas preferências.", - "config-email-usertalk": "Ativar notificações de alterações à página de discussão de usuário", + "config-license-help": "Muitas wikis públicas colocam todas as contribuições sob uma [http://freedomdefined.org/Definition licença livre].\nIsso ajuda a criar um senso de propriedade da comunidade e incentiva a contribuição de longo prazo.\nGeralmente não é necessário para uma empresa privada ou wiki corporativa.\nSe você quiser poder usar o texto da Wikipédia e quiser que a Wikipédia possa aceitar o texto copiado da sua wiki, você deve escolher {{int:config-license-cc-by-sa}}.\n\nA Wikipédia usou anteriormente a Licença de Documentação Livre GNU.\n A GFDL é uma licença válida, mas é difícil de entender.\nTambém é difícil reutilizar conteúdo licenciado sob o GFDL.", + "config-email-settings": "Configurações de e-mail", + "config-enable-email": "Ativar envio de e-mail", + "config-enable-email-help": "Se você quer que o e-mail funcione, estas [http://www.php.net/manual/en/mail.configuration.php configurações de e-mail PHP] precisam ser configuradas corretamente.\nSe você não quiser usar nenhuma das funcionalidades, você pode desabilitá-las aqui.", + "config-email-user": "Ativar e-mails entre usuários", + "config-email-user-help": "Permitir que todos os usuários enviem e-mail entre si se eles tiverem habilitado este recurso em suas preferências.", + "config-email-usertalk": "Ativar notificação de alterações em páginas de discussão de usuário", "config-email-usertalk-help": "Permitir que os usuários recebam notificações quando suas páginas de discussão forem modificadas se eles tiverem habilitado as notificações em suas preferências.", - "config-email-watchlist": "Ativar notificação de alterações às páginas vigiadas", + "config-email-watchlist": "Ativar notificação de alterações em páginas vigiadas", "config-email-watchlist-help": "Permitir que os usuários recebam notificações sobre suas páginas vigiadas se eles tiverem habilitado as notificações em suas preferências.", - "config-email-auth": "Ativar autenticação de email", - "config-email-sender": "Endereço de email para resposta:", + "config-email-auth": "Ativar autenticação de e-mail", + "config-email-auth-help": "Se esta opção estiver habilitada, os usuários devem confirmar seu endereço de e-mail usando um link enviado para eles sempre que eles o definirem ou mudá-lo.\nApenas endereços de e-mail autenticados podem receber e-mails de outros usuários ou alterar e-mails de notificação. \nConfigurar esta opção é recomendado para wikis públicas devido ao potencial abuso dos recursos de e-mail.", + "config-email-sender": "Endereço de e-mail para resposta:", + "config-email-sender-help": "Digite o endereço de e-mail para usar como o endereço de retorno para os e-mails enviados.\nIsto é onde os saltos serão enviados.\nMuitos servidores de correio exigem que pelo menos o nome de domínio seja válida.", "config-upload-settings": "Carregamento de imagens e arquivos", "config-upload-enable": "Permitir o carregamento de arquivos", + "config-upload-help": "Os carregamentos de arquivos potencialmente expõem seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção de segurança] no manual.\nPara ativar o envio de arquivos, mude o modo no subdiretório images no diretório raiz do MediaWiki para que o servidor web possa escrever nele.\nEntão, habilite esta opção.", "config-upload-deleted": "Diretório para arquivos excluídos:", "config-upload-deleted-help": "Escolha um diretório no qual serão armazenados os arquivos excluídos. \nIdealmente, este não deveria ser acessível pela web.", "config-logo": "URL do logotipo:", "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 acima do menu lateral. Carregue uma imagem do tamanho apropriado e insira o URL aqui.\n\nVocê pode utilizar $wgStylePath ou $wgScriptPath se seu logotipo esta relacionado a estes caminhos.\n\nSe não pretende usar um logótipo, deixe esta caixa em branco.", "config-instantcommons": "Ativar o Instant Commons", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é um recurso que permite que as wikis usem imagens, sons e outras mídias encontradas no site [https://commons.wikimedia.org/ Wikimedia Commons].\nPara fazer isso, o MediaWiki requer acesso à Internet.\n\nPara obter mais informações sobre esse recurso, incluindo instruções sobre como configurá-lo para wikis diferentes da Wikimedia Commons, consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos o manual].", + "config-cc-error": "O escolhedor de licenças Creative Commons não retornou nenhum resultado.\nDigite o nome da licença manualmente.", "config-cc-again": "Escolha novamente...", + "config-cc-not-chosen": "Escolha qual licença Creative Commons deseja e clique em \"continuar\".", "config-advanced-settings": "Configuração avançada", "config-cache-options": "Configuração da cache de objetos:", - "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.", + "config-cache-help": "O cache de objetos é usado para melhorar o desempenho do MediaWiki, armazenando dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.", + "config-cache-none": "Sem cache (nenhuma funcionalidade é removida, mas a velocidade pode ser afetada em wikis maiores)", "config-cache-accel": "Cache de objetos PHP (APC, APCu, XCache ou WinCache)", "config-cache-memcached": "Usar Memcached (requer instalação e configurações adicionais)", "config-memcached-servers": "Servidores Memcached:", @@ -240,44 +279,58 @@ "config-memcache-noport": "Você não especificou uma porta para usar no servidor Memcached: $1.\nSe você não souber a porta, o padrão é 11211.", "config-memcache-badport": "Os números de porta Memcached devem estar entre $1 e $2.", "config-extensions": "Extensões", - "config-skins": "Peles", - "config-skins-use-as-default": "Utilize esta skin como predefinição", - "config-skins-missing": "Não foram encontradas peles; MediaWiki usará uma pele de fallback até que você instale algumas adequadas.", - "config-skins-must-enable-some": "Você deve escolher pelo menos um skin para habilitar.", - "config-skins-must-enable-default": "A pele escolhida como padrão deve ser ativada.", + "config-extensions-help": "As extensões listadas acima foram detectadas em seu diretório ./extensions.\n\nElas podem exigir configuração adicional, mas você pode habilitá-las agora.", + "config-skins": "Temas", + "config-skins-help": "As skins mencionadas acima foram detectadas no seu diretório ./skins. Você deve habilitar pelo menos uma e escolher uma como padrão.", + "config-skins-use-as-default": "Utilize esta skin como padrão", + "config-skins-missing": "Não foram encontradas skins; MediaWiki usará uma skin de fallback até que você instale algumas adequadas.", + "config-skins-must-enable-some": "Você deve escolher pelo menos uma skin para habilitar.", + "config-skins-must-enable-default": "A skin escolhida como padrão deve ser ativada.", + "config-install-alreadydone": "Aviso: Parece que já instalou o MediaWiki e está tentando instalá-lo novamente.\nPor favor, vá para a próxima página.", + "config-install-begin": "Ao pressionar \"{{int:config-continue}}\", você iniciará a instalação do MediaWiki.\nSe ainda quiser fazer alterações, pressione \"{{int:config-back}}\".", "config-install-step-done": "feito", "config-install-step-failed": "falhou", "config-install-extensions": "Incluindo extensões", - "config-install-database": "Criando base de dados", + "config-install-database": "Criando banco de dados", "config-install-schema": "Criando esquema", "config-install-pg-schema-not-exist": "O esquema ''(schema)'' PostgreSQL não existe.", + "config-install-pg-schema-failed": "A criação de tabelas falhou.\nCertifique-se de que o usuário \"$1\" possa escrever no esquema \"$2\".", "config-install-pg-commit": "Enviando alterações", - "config-install-user": "Criando usuário de banco de dados", - "config-install-user-alreadyexists": "O usuário \"$1\" já existe!", - "config-install-user-create-failed": "Criando usuário \"$1\" falhou: $2", + "config-install-pg-plpgsql": "Verificando por linguagem PL/pgSQL", + "config-pg-no-plpgsql": "Você precisa instalar a linguagem PL/pgSQL no banco de dados $1", + "config-pg-no-create-privs": "A conta que você especificou para a instalação não tem privilégios suficientes para criar uma conta.", + "config-pg-not-in-role": "A conta que você especificou para o usuário da web já existe.\nA conta que você especificou para instalação não é um super usuário e não é um membro da função do usuário da web, portanto, não é possível criar objetos pertencentes ao usuário da web.\n\nO MediaWiki atualmente exige que as tabelas sejam de propriedade do usuário da web. Por favor, especifique outro nome da conta da Web ou clique em \"voltar\" e especifique um usuário de instalação com o privilégio adequado.", + "config-install-user": "Criando usuário do banco de dados", + "config-install-user-alreadyexists": "O usuário \"$1\" já existe", + "config-install-user-create-failed": "Criação usuário \"$1\" falhou: $2", + "config-install-user-grant-failed": "A concessão de permissão para o usuário \"$1\" falhou: $2", "config-install-user-missing": "O usuário especificado, \"$1\", não existe.", - "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.", + "config-install-user-missing-create": "O usuário especificado \"$1\" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.", "config-install-tables": "Criando tabelas", - "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.", - "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1", + "config-install-tables-exist": "Aviso: As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.", + "config-install-tables-failed": "Error: A criação das tabelas falhou com o seguinte erro: $1", "config-install-interwiki": "Preenchendo a tabela padrão de interwiki", "config-install-interwiki-list": "Não foi possível ler o arquivo interwiki.list.", + "config-install-interwiki-exists": "Aviso: A tabela de interwiki parece já ter entradas.\\NPulando lista padrão.", "config-install-stats": "Inicializando estatísticas", "config-install-keys": "Gerando senhas secretas", + "config-insecure-keys": "Aviso: {{PLURAL:$2|Uma chave segura gerada|Algumas chaves seguras geradas}} ($1) durante a instalação {{PLURAL:$2|não é completamente segura|não são completamente seguras}}. Considere mudar {{PLURAL:$2|ela|elas}} manualmente.", "config-install-updates": "Impedir a execução de atualizações desnecessárias", + "config-install-updates-failed": "Error: A inserção de chaves de atualização em tabelas falhou com o seguinte erro: $1", "config-install-sysop": "Criando conta de usuário administrador", - "config-install-subscribe-fail": "Não foi possível subscrever o mediawiki-announce: $1", + "config-install-subscribe-fail": "Não foi possível subscrever ao mediawiki-announce: $1", "config-install-subscribe-notpossible": "cURL não está instalada e allow_url_fopen não está disponível.", "config-install-mainpage": "Criando página principal com o conteúdo padrão", "config-install-mainpage-exists": "A página principal já existe, pulando", "config-install-extension-tables": "Criando tabelas para extensões habilitadas", "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1", - "config-install-done": "Parabéns!\nVocê instalou do MediaWiki.\n\nO instalador gerou um arquivo LocalSettings.php.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo index.php). Este download deve ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se ele foi cancelado, pode recomeçá-lo clicando no link abaixo:\n\n$3\n\nNota: Se não fizer isto agora, o arquivo que foi gerado não estará disponível depois que você sair do processo de instalação sem baixá-lo.\n\nQuando isso tiver sido feito, pode [$2 entrar na sua wiki].", + "config-install-done": "Parabéns!\nVocê instalou o MediaWiki.\n\nO instalador gerou um arquivo LocalSettings.php.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo index.php). O download deve iniciar automaticamente.\n\nSe o download não foi iniciado ou se ele foi cancelado, você pode recomeçá-lo clicando no link abaixo:\n\n$3\n\nNota: Se você não fizer isso agora, o arquivo de configuração que foi gerado não estará mais disponível se você sair da instalação sem fazer o download.\n\nQuando isso tiver sido feito, você pode [$2 entrar na sua wiki].", + "config-install-done-path": "Parabéns!\nVocê instalou o MediaWiki.\n\nO instalador gerou um arquivo LocalSettings.php.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo em $4. O download deve iniciar automaticamente.\n\nSe o download não foi iniciado ou se ele foi cancelado, você pode recomeçá-lo clicando no link abaixo:\n\n$3\n\nNota: Se você não fizer isso agora, o arquivo de configuração que foi gerado não estará mais disponível se você sair da instalação sem fazer o download.\n\nQuando isso tiver sido feito, você pode [$2 entrar na sua wiki].", "config-download-localsettings": "Baixar LocalSettings.php", "config-help": "ajuda", "config-help-tooltip": "clique para expandir", "config-nofile": "O arquivo \"$1\" não foi encontrado. Ele foi apagado?", - "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.", + "config-extension-link": "Você sabia que sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nVocê pode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou visitar a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.", "mainpagetext": "O MediaWiki foi instalado.", - "mainpagedocfooter": "Consulte o [https://meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\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 FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]" + "mainpagedocfooter": "Consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Manual de Usuário] para informações de como usar o software wiki.\n\n== Começando ==\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 FAQ do MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]" } diff --git a/includes/installer/i18n/pt.json b/includes/installer/i18n/pt.json index 779a32fe8f..884f956259 100644 --- a/includes/installer/i18n/pt.json +++ b/includes/installer/i18n/pt.json @@ -22,13 +22,13 @@ ] }, "config-desc": "O instalador do MediaWiki", - "config-title": "Instalação da MediaWiki $1", + "config-title": "Instalação do MediaWiki $1", "config-information": "Informação", - "config-localsettings-upgrade": "Foi detectado um ficheiro LocalSettings.php.\nPara atualizar esta instalação, por favor introduza o valor de $wgUpgradeKey na caixa abaixo.\nEncontra este valor em LocalSettings.php.", - "config-localsettings-cli-upgrade": "Foi detectado um ficheiro LocalSettings.php.\nPara atualizar esta instalação, execute o update.php, por favor", + "config-localsettings-upgrade": "Foi detetado um ficheiro LocalSettings.php.\nPara atualizar esta instalação, por favor introduza o valor de $wgUpgradeKey na caixa abaixo.\nEncontra este valor em LocalSettings.php.", + "config-localsettings-cli-upgrade": "Foi detetado um ficheiro LocalSettings.php.\nPara atualizar esta instalação, execute o update.php, por favor", "config-localsettings-key": "Chave de atualização:", "config-localsettings-badkey": "A chave de atualização que forneceu está incorreta.", - "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu LocalSettings.php:\n\n$1", + "config-upgrade-key-missing": "Foi detetada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "O ficheiro LocalSettings.php existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor, defina esta variável no LocalSettings.php e clique \"{{int:Config-continue}}\".", "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no LocalSettings.php. Por favor corrija essas configurações e tente novamente.\n\n$1", "config-session-error": "Erro ao iniciar a sessão: $1", @@ -37,7 +37,7 @@ "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": "Língua da wiki:", - "config-wiki-language-help": "Selecione o idioma que será predominante na wiki.", + "config-wiki-language-help": "Selecione a língua que será predominante na wiki.", "config-back": "← Voltar", "config-continue": "Continuar →", "config-page-language": "Língua", @@ -159,7 +159,7 @@ "config-sqlite-mkdir-error": "Ocorreu um erro ao criar o diretório de dados \"$1\".\nVerifique a localização e tente novamente.", "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nAltere as permissões para que ele possa ser escrito pelo servidor de internet e tente novamente.", "config-sqlite-connection-error": "$1.\n\nVerifique o diretório de dados e o nome da base de dados abaixo e tente novamente.", - "config-sqlite-readonly": "Não é possivel escrever no ficheiro $1.", + "config-sqlite-readonly": "Não é possível escrever no ficheiro $1.", "config-sqlite-cant-create-db": "Não foi possível criar o ficheiro da base de dados $1.", "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; a reverter o esquema das tabelas para o anterior", "config-can-upgrade": "Esta base de dados contém tabelas do MediaWiki.\nPara atualizá-las para o MediaWiki $1, clique '''Continuar'''.", @@ -190,7 +190,7 @@ "config-mssql-windowsauth": "Autenticação do Windows", "config-site-name": "Nome da wiki:", "config-site-name-help": "Este nome aparecerá no título da janela do seu navegador e em vários outros sítios.", - "config-site-name-blank": "Introduza o nome do sítio.", + "config-site-name-blank": "Introduza o nome do site.", "config-project-namespace": "Espaço nominal do projeto:", "config-ns-generic": "Projeto", "config-ns-site-name": "O mesmo que o nome da wiki: $1", @@ -208,14 +208,14 @@ "config-admin-name-invalid": "O nome de utilizador especificado \"$1\" é inválido.\nIntroduza um nome de utilizador diferente.", "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": "Correio eletrónico:", "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 \"$1\".", "config-admin-error-password": "Ocorreu um erro interno ao definir uma palavra-passe para o administrador \"$1\":
    $2
    ", - "config-admin-error-bademail": "Introduziu um correio electrónico inválido", + "config-admin-error-bademail": "Introduziu um correio eletrónico inválido", "config-subscribe": "Subscrever 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-subscribe-noemail": "Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio electrónico.\nPara subscrever esta lista de divulgação tem de fornecer um endereço de correio electrónico.", + "config-subscribe-noemail": "Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio eletrónico.\nPara subscrever esta lista de divulgação tem de fornecer um endereço de correio eletrónico.", "config-pingback": "Partilhar dados sobre esta instalação com os programadores do MediaWiki.", "config-pingback-help": "Se selecionar esta opção, o MediaWiki fará periodicamente um ping a https://www.mediawiki.org com dados básicos acerca desta instância do MediaWiki. Estes dados incluem, por exemplo, o tipo de sistema, a versão do PHP e a base de dados que escolheu. A Wikimedia Foundation partilha estes dados com os programadores do MediaWiki, para ajudar a guiar o esforço de desenvolvimento futuro. Para o seu sistema, serão enviados os seguintes dados:\n
    $1
    ", "config-almost-done": "Está quase a terminar!\nAgora pode ignorar as restantes configurações e instalar já a wiki.", @@ -237,7 +237,7 @@ "config-license-pd": "Domínio Público", "config-license-cc-choose": "Selecionar uma licença personalizada Creative Commons", "config-license-help": "Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].\nIsto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.\nTal não é geralmente necessário nas wikis privadas ou corporativas.\n\nSe pretende que seja possível usar textos da Wikipédia na sua wiki e que seja possível a Wikipédia aceitar textos copiados da sua wiki, deve escolher a licença {{int:config-license-cc-by-sa}}..\n\nA licença anterior da Wikipédia era a licença GNU Free Documentation License.\nA GFDL é uma licença válida, mas de difícil compreensão.\nTambém é difícil reutilizar conteúdos licenciados com a GFDL.", - "config-email-settings": "Definições do correio electrónico", + "config-email-settings": "Definições do correio eletrónico", "config-enable-email": "Ativar mensagens eletrónicas de saída", "config-enable-email-help": "Se quer que o correio eletrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio eletrónico do PHP] têm de estar configuradas corretamente.\nSe não pretende viabilizar qualquer funcionalidade de correio eletrónico, pode desativá-lo aqui.", "config-email-user": "Ativar mensagens eletrónicas entre utilizadores", @@ -248,8 +248,8 @@ "config-email-watchlist-help": "Permitir que os utilizadores recebam notificações de alterações às suas páginas vigiadas, se tiverem ativado esta funcionalidade nas suas preferências.", "config-email-auth": "Ativar autenticação do correio eletrónico", "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.", - "config-email-sender": "Endereço de correio electrónico de retorno:", - "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\", + "config-email-sender": "Endereço de correio eletrónico de retorno:", + "config-email-sender-help": "Introduza o endereço de correio eletrónico que será usado como endereço de retorno nas mensagens eletrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio eletrónico exigem que pelo menos a parte do nome do domínio seja válida. \\", "config-upload-settings": "Carregamento de imagens e ficheiros", "config-upload-enable": "Possibilitar o carregamento de ficheiros", "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security secção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório images no diretório de raiz do MediaWiki para que o servidor de Internet possa escrever nele.\nDepois ative esta opção.", @@ -258,7 +258,7 @@ "config-logo": "URL do logótipo:", "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 píxeis acima do menu da barra lateral.\nColoque na wiki uma imagem com estas dimensões e introduza aqui o URL dessa imagem.\n\nSe não pretende usar um logótipo, deixe este campo em branco.", "config-instantcommons": "Ativar Instant Commons", - "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no sítio [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à Internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].", + "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à Internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].", "config-cc-error": "O auxiliar de escolha de licenças da Creative Commons não produziu resultados.\nIntroduza o nome da licença manualmente.", "config-cc-again": "Escolha outra vez...", "config-cc-not-chosen": "Escolha a licença da Creative Commons que pretende e clique \"proceed\".", @@ -275,7 +275,7 @@ "config-memcache-noport": "Não especificou a porta a usar para o servidor Memcached: $1.\nSe não sabe qual é a porta, a predefinida é a 11211.", "config-memcache-badport": "Os números das portas do Memcached devem estar entre $1 e $2.", "config-extensions": "Extensões", - "config-extensions-help": "Foi detectada a existência das extensões listadas acima, no seu diretório ./extensions.\n\nEstas talvez necessitem de configurações adicionais, mas pode ativá-las agora", + "config-extensions-help": "Foi detetada a existência das extensões listadas acima, no seu diretório ./extensions.\n\nEstas talvez necessitem de configurações adicionais, mas pode ativá-las agora.", "config-skins": "Temas", "config-skins-help": "Os temas listados abaixo foram detetados no seu diretório ./skins. Deverá ativar pelo menos um e escolher qual o escolhido por padrão.", "config-skins-use-as-default": "Usar este tema como padrão", @@ -326,7 +326,9 @@ "config-help": "ajuda", "config-help-tooltip": "clique para expandir", "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": "MediaWiki instalado.", + "config-extension-link": "Sabia que a sua wiki suporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode consultar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria] ou a [https://www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa de extensões.", + "config-skins-screenshots": "$1 (capturas de ecrã: $2)", + "config-screenshot": "captura de ecrã", + "mainpagetext": "O MediaWiki foi instalado.", "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 spam na sua wiki]" } diff --git a/includes/installer/i18n/qqq.json b/includes/installer/i18n/qqq.json index 8d10b51f46..a5c679036f 100644 --- a/includes/installer/i18n/qqq.json +++ b/includes/installer/i18n/qqq.json @@ -18,7 +18,8 @@ "Umherirrender", "Waldir", "Jdforrester", - "Liuxinyu970226" + "Liuxinyu970226", + "Metalhead64" ] }, "config-desc": "Short description of the installer.", @@ -94,6 +95,7 @@ "config-no-cli-uploads-check": "CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)", "config-brokenlibxml": "Status message in the MediaWiki installer environment checks.", "config-suhosin-max-value-length": "{{doc-important|Do not translate \"length\", \"suhosin.get.max_value_length\", \"php.ini\", \"$wgResourceLoaderMaxQueryLength\" and \"LocalSettings.php\".}}\nMessage shown when PHP parameter suhosin.get.max_value_length is between 0 and 1023 (that max value is hard set in MediaWiki software).", + "config-using-32bit": "Warning message shown when installing on a 32-bit system.", "config-db-type": "Field label in the MediaWiki installer followed by possible database types.", "config-db-host": "Used as label.\n\nAlso used in {{msg-mw|Config-missing-db-host}}.", "config-db-host-help": "{{doc-singularthey}}", @@ -327,6 +329,9 @@ "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page", "config-nofile": "Used as failure message. Parameters:\n* $1 - filename", "config-extension-link": "Shown on last page of installation to inform about possible extensions.\n{{Identical|Did you know}}", + "config-skins-screenshots": "Radio button text, $1 is the skin name, and $2 is a list of links to screenshots of that skin", + "config-skins-screenshot": "Radio button text, $1 is the skin name, and $2 is a link to a screenshot of that skin, where the link text is {{msg-mw|config-screenshot}}.", + "config-screenshot": "Link text for the link in {{msg-mw|config-skins-screenshot}}\n{{Identical|Screenshot}}", "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.", "mainpagedocfooter": "Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.\nThis might be a good place to put information about {{GRAMMAR:}}. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate {{GRAMMAR:}} software available, a suggestion to check and possibly amend the messages having {{SITENAME}} may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example." } diff --git a/includes/installer/i18n/roa-tara.json b/includes/installer/i18n/roa-tara.json index 198422adf1..11c13d7f8b 100644 --- a/includes/installer/i18n/roa-tara.json +++ b/includes/installer/i18n/roa-tara.json @@ -8,7 +8,7 @@ "config-title": "Installazzione de MediaUicchi $1", "config-information": "'Mbormaziune", "config-localsettings-key": "Chiave de aggiornamende:", - "config-localsettings-badkey": "'A chiave ca è date non g'è corrette.", + "config-localsettings-badkey": "'A chiave de aggiornamende ca è date non g'è corrette.", "config-session-error": "Errore facenne accumenzà 'a sessione: $1", "config-your-language": "'A lènga toje:", "config-your-language-help": "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:", @@ -36,6 +36,8 @@ "config-db-type": "Tipe de database:", "config-db-host-oracle": "Database TNS:", "config-db-name-oracle": "Scheme d'u database:", + "config-db-username": "Nome utende d'u database:", + "config-db-password": "Password d'u database:", "config-db-port": "Porte d'u database:", "config-db-schema": "Scheme pe MediaUicchi:", "config-type-mysql": "MySQL (o combatibbile)", @@ -51,6 +53,9 @@ "config-invalid-db-type": "Tipe de database invalide.", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", + "config-mysql-binary": "Binarie", + "config-mysql-utf8": "UTF-8", + "config-ns-generic": "Proggette", "config-admin-email": "Indirizze e-mail:", "config-install-step-done": "fatte", "config-install-step-failed": "fallite", @@ -60,6 +65,6 @@ "config-install-pg-schema-not-exist": "'U scheme PostgreSQL non g'esiste.", "config-help": "ajute", "config-help-tooltip": "cazze pe spannere", - "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''", - "mainpagedocfooter": "Vè 'ndruche [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer uicchi.\n\n== Pe accumenzà ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenghe de le 'mbostaziune pa configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaUicchi]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 'Mbare accume combattere condre a 'u rummate sus 'a uicchi toje]" + "mainpagetext": "MediaUicchi ha state 'nstallate.", + "mainpagedocfooter": "Vè 'ndruche [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer uicchi.\n\n== Pe accumenzà ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenghe de le 'mbostaziune pa configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaUicchi]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 'Mbare accume combattere condre a 'u rummate sus 'a uicchi toje]" } diff --git a/includes/installer/i18n/ru.json b/includes/installer/i18n/ru.json index fc9984efa9..515ea28eb6 100644 --- a/includes/installer/i18n/ru.json +++ b/includes/installer/i18n/ru.json @@ -23,7 +23,8 @@ "Macofe", "StasR", "Irus", - "Mailman" + "Mailman", + "Facenapalm" ] }, "config-desc": "Инсталлятор MediaWiki", @@ -98,7 +99,7 @@ "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок ($1) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.", "config-no-cli-uploads-check": "'''Предупреждение:''' каталог для загрузки по умолчанию ( $1 ) не проверялся на уязвимости\n на выполнение произвольного сценария во время установки CLI.", "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, которое может привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите libxml2 до версии 2.7.3 или старше ([https://bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.", - "config-suhosin-max-value-length": "Suhosin установлен и ограничивает параметр GET length до $1 байт. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить suhosin.get.max_value_length в значение 1024 или выше в php.ini, а также установить для $wgResourceLoaderMaxQueryLength такое же значение в LocalSettings.php.", + "config-suhosin-max-value-length": "Suhosin установлен и ограничивает параметр GET length до $1 {{PLURAL:$1|байт|байта|байт}}. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить suhosin.get.max_value_length в значение 1024 или выше в php.ini, а также установить для $wgResourceLoaderMaxQueryLength такое же значение в LocalSettings.php.", "config-db-type": "Тип базы данных:", "config-db-host": "Хост базы данных:", "config-db-host-help": "Если сервер базы данных находится на другом сервере, введите здесь его имя хоста или IP-адрес.\n\nЕсли вы используете виртуальный хостинг, ваш провайдер должен указать правильное имя хоста в своей документации.\n\nЕсли вы устанавливаете систему на сервере под Windows и используете MySQL, имя сервера «localhost» может не работать. В этом случае попробуйте указать 127.0.0.1 локальный IP-адрес.\n\nЕсли вы используете PostgreSQL, оставьте это поле пустым для подключения через сокет Unix.", @@ -332,6 +333,8 @@ "config-help-tooltip": "нажмите, чтобы развернуть", "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 матрицу расширений], чтобы увидеть их полный список.", + "config-skins-screenshots": "$1 (скриншоты: $2)", + "config-screenshot": "скриншот", "mainpagetext": "MediaWiki успешно установлена.", "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 Узнайте, как бороться со спамом в вашей вики]" } diff --git a/includes/installer/i18n/sv.json b/includes/installer/i18n/sv.json index 4f52403f37..a338387a64 100644 --- a/includes/installer/i18n/sv.json +++ b/includes/installer/i18n/sv.json @@ -85,6 +85,7 @@ "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar ($1) har inte kontrollerats för sårbarhet från körning av godtyckliga skript under CLI-installationen.", "config-brokenlibxml": "Ditt system har en kombination av PHP och libxml2 som är buggigt och kan orsaka datakorruption i MediaWiki och andra webbprogram.\nUppgradera till libxml2 2.7.3 eller senare ([https//bugs.php.net/bug.php?id=45996 buggfil med PHP]).\nInstallationen avbröts.", "config-suhosin-max-value-length": "Suhosin är installerat och begränsar GET-parametern length till $1 bytes.\nMediaWikis ResourceLoader-komponent kommer att arbeta runt denna begränsning, men det kommer att försämra prestandan.\nOm möjligt bör du sätta suhosin.get.max_value_length till 1024 eller högre i php.ini, och sätta $wgResourceLoaderMaxQueryLength till samma värde som i LocalSettings.php.", + "config-using-32bit": "Varning: ditt system verkar vara en 32-bitarsversion. Detta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit rekommenderas inte].", "config-db-type": "Databastyp:", "config-db-host": "Databasvärd:", "config-db-host-help": "Om din databasserver är på en annan server, ange då värdnamnet eller IP-adressen här.\n\nOm du använder ett delat webbhotell, bör din leverantör ge dig rätt värdnamn i deras dokumentation.\n\nOm du installerar på en Windowsserver och använder MySQL, kanske \"localhost\" inte fungerar för servernamnet. Om det inte gör det försök med \"127.0.0.1\" som den lokala IP-adressen.\n\nOm du använder PostgreSQL, lämna detta fält blankt för att ansluta via en Unix-socket.", @@ -315,6 +316,8 @@ "config-help-tooltip": "klicka för att expandera", "config-nofile": "Filen \"$1\" kunde inte hittas. Har den raderats?", "config-extension-link": "Visste du att din wiki stödjer [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions tillägg]?\n\nDu kan bläddra [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category tillägg efter kategori].", + "config-skins-screenshots": "$1 (skärmbilder: $2)", + "config-screenshot": "skärmbild", "mainpagetext": "MediaWiki har installerats utan problem.", "mainpagedocfooter": "Information om hur wiki-programvaran används finns i [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents användarguiden].\n\n== Att komma igång ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista över konfigurationsinställningar]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postlista för nya versioner av MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Läs om hur du bekämpar spam på din wiki]" } diff --git a/includes/installer/i18n/th.json b/includes/installer/i18n/th.json index ecb8e87e96..b60f2a6b23 100644 --- a/includes/installer/i18n/th.json +++ b/includes/installer/i18n/th.json @@ -4,79 +4,220 @@ "Korrawit", "Horus", "Octahedron80", - "Aefgh39622" + "Aefgh39622", + "Ans" ] }, - "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ", - "config-title": "การติดตั้งมีเดียวิกิ $1", - "config-information": "สารสนเทศ", - "config-localsettings-upgrade": "ตรวจพบไฟล์ LocalSettings.php\nเพื่ออัปเกรดการติดตั้งนี้ กรุณากรอกค่าของ $wgUpgradeKey ในกล่องด้านล่าง\nคุณจะพบมันได้ใน LocalSettings.php", - "config-localsettings-cli-upgrade": "ตรวจพบไฟล์ LocalSettings.php\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาดำเนินงาน update.php แทน", - "config-localsettings-key": "กุญแจอัปเกรด:", - "config-localsettings-badkey": "กุญแจที่คุณกรอกไม่ถูกต้อง", - "config-upgrade-key-missing": "ตรวจพบการติดตั้งมีเดียวิกิที่มีอยู่แล้ว\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์ LocalSettings.php ของคุณ:\n\n$1", - "config-localsettings-incomplete": "LocalSettings.php ที่มีอยู่ดูเหมือนว่าไม่สมบูรณ์\nตัวแปร $1 ไม่ถูกกำหนด\nกรุณาเปลี่ยนแปลง LocalSettings.php เพื่อกำหนดตัวแปรนี้ และคลิก \"{{int:Config-continue}}\"", - "config-localsettings-connection-error": "ความผิดพลาดเกิดขึ้นเมื่อเชื่อมต่อฐานข้อมูลโดยใช้การตั้งค่าที่ระบุใน LocalSettings.php กรุณาแก้ไขการตั้งค่าเหล่านี้และลองอีกครั้ง\n\n$1", - "config-session-error": "ความผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1", - "config-session-expired": "ช่วงเวลาสื่อสารของคุณดูเหมือนว่าหมดอายุแล้ว\nช่วงเวลาสื่อสารถูกตั้งไว้ให้มีช่วงอายุเป็น $1\nคุณสามารถเพิ่มค่าสิ่งนี้โดยกำหนด session.gc_maxlifetime ใน php.ini\nให้เริ่มกระบวนการติดตั้งอีกครั้ง", - "config-no-session": "ข้อมูลช่วงเวลาสื่อสารของคุณสูญหาย!\nให้ตรวจสอบ php.ini ของคุณและแน่ใจว่า session.save_path ถูกกำหนดไปยังไดเรกทอรีที่เหมาะสม", + "config-desc": "ตัวติดตั้ง MediaWiki", + "config-title": "การติดตั้ง MediaWiki $1", + "config-information": "ข้อมูล", + "config-localsettings-upgrade": "ตรวจพบไฟล์ LocalSettings.php\nเมื่อต้องการอัปเกรดการติดตั้งนี้ โปรดป้อนค่าของ $wgUpgradeKey ในกล่องด้านล่าง\nคุณสามารถพบค่านี้ได้ใน LocalSettings.php", + "config-localsettings-cli-upgrade": "ตรวจพบไฟล์ LocalSettings.php\nเมื่อต้องการอัปเกรดการติดตั้งนี้ โปรดเรียกใช้ update.php แทน", + "config-localsettings-key": "คีย์อัปเกรด:", + "config-localsettings-badkey": "คีย์อัปเกรดที่คุณระบุไม่ถูกต้อง", + "config-upgrade-key-missing": "ตรวจพบการติดตั้ง MediaWiki ที่มีอยู่แล้ว\nเมื่อต้องการอัปเกรดการติดตั้งนี้ โปรดใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์\nLocalSettings.php ของคุณ:\n\n$1", + "config-localsettings-incomplete": "ไฟล์ LocalSettings.php ที่มีอยู่ดูเหมือนว่าไม่สมบูรณ์\nไม่ได้ตั้งค่าตัวแปร $1\nโปรดเปลี่ยนแปลง LocalSettings.php เพื่อตั้งค่าตัวแปรนี้ และคลิก \"{{int:Config-continue}}\"", + "config-localsettings-connection-error": "เกิดข้อผิดพลาดขึ้นเมื่อเชื่อมต่อฐานข้อมูลโดยใช้การตั้งค่าที่ระบุใน LocalSettings.php\nโปรดแก้ไขการตั้งค่าเหล่านี้แล้วลองใหม่อีกครั้ง\n\n$1", + "config-session-error": "ข้อผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1", + "config-session-expired": "ช่วงเวลาสื่อสารของคุณดูเหมือนว่าหมดอายุแล้ว\nช่วงเวลาสื่อสารถูกตั้งไว้ให้มีช่วงอายุเป็น $1\nคุณสามารถแก้ไขปัญหานี้ได้โดยตั้งค่า session.gc_maxlifetime ใน php.ini\nให้เริ่มกระบวนการติดตั้งใหม่อีกครั้ง", + "config-no-session": "ข้อมูลช่วงเวลาสื่อสารของคุณสูญหาย!\nให้ตรวจสอบ php.ini ของคุณและแน่ใจว่า session.save_path ถูกตั้งค่าไปยังไดเรกทอรีที่เหมาะสม", "config-your-language": "ภาษาของคุณ:", - "config-your-language-help": "เลือกภาษาที่จะใช้ระหว่างกระบวนการติดตั้ง", - "config-wiki-language": "ภาษาวิกิ:", - "config-wiki-language-help": "เลือกภาษาที่จะใช้เขียนเป็นหลักในวิกิ", + "config-your-language-help": "โปรดเลือกภาษาที่จะใช้ระหว่างกระบวนการติดตั้ง", + "config-wiki-language": "ภาษาของวิกิ:", + "config-wiki-language-help": "โปรดเลือกภาษาที่จะใช้เขียนเป็นหลักในวิกิ", "config-back": "← ย้อนกลับ", "config-continue": "ดำเนินการต่อ →", "config-page-language": "ภาษา", - "config-page-welcome": "ยินดีต้อนรับสู่มีเดียวิกิ!", + "config-page-welcome": "ยินดีต้อนรับสู่ MediaWiki!", "config-page-dbconnect": "เชื่อมต่อไปยังฐานข้อมูล", "config-page-upgrade": "อัปเกรดการติดตั้งที่มีอยู่", "config-page-dbsettings": "การตั้งค่าฐานข้อมูล", "config-page-name": "ชื่อ", "config-page-options": "ตัวเลือก", "config-page-install": "ติดตั้ง", - "config-page-complete": "สมบูรณ์!", - "config-page-restart": "เริ่มการติดตั้งอีกครั้ง", + "config-page-complete": "เสร็จสมบูรณ์!", + "config-page-restart": "เริ่มการติดตั้งใหม่อีกครั้ง", "config-page-readme": "อ่านเอกสารกำกับ", "config-page-releasenotes": "บันทึกการเผยแพร่", "config-page-copying": "การคัดลอก", "config-page-upgradedoc": "การอัปเกรด", "config-page-existingwiki": "วิกิที่มีอยู่", - "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งอีกครั้งหรือไม่?", + "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งใหม่อีกครั้งหรือไม่?", "config-restart": "ใช่ เริ่มใหม่อีกครั้ง", - "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้นเพื่อดูว่าสภาพแวดล้อมนี้เหมาะสมสำหรับการติดตั้งมีเดียวิกิหรือไม่\nจำไว้ว่าให้รวบรวมสารสนเทศนี้ ถ้าคุณแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์", - "config-sidebar": "* [https://www.mediawiki.org โฮมเพจมีเดียวิกิ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents แนวปฏิบัติของผู้ใช้]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents แนวปฏิบัติของผู้ดูแลระบบ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อย]\n----\n* อ่านเอกสารกำกับ\n* บันทึกการเผยแพร่\n* การคัดลอก\n* การอัปเกรด", - "config-env-good": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณสามารถติดตั้งมีเดียวิกิ", - "config-env-bad": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณไม่สามารถติดตั้งมีเดียวิกิ", - "config-env-php": "PHP $1 ติดตั้งแล้ว", - "config-env-hhvm": "HHVM $1 ติดตั้งแล้ว", + "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้น เพื่อยืนยันว่าสภาพแวดล้อมปัจจุบันเหมาะสมสำหรับการติดตั้ง MediaWiki หรือไม่\nโปรดจำไว้ว่าให้รวบรวมผลลัพธ์การตรวจสอบนี้ ถ้าคุณต้องการแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์", + "config-copyright": "=== ลิขสิทธิ์และเงื่อนไข ===\n\n$1\n\nโปรแกรมนี้เป็นซอฟต์แวร์เสรี คุณสามารถนำโปรแกรมนี้มาเผยแพร่ซ้ำและ/หรือดัดแปลงได้ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของ GNU (GNU General Public License) ซึ่งเผยแพร่โดย Free Software Foundation (สัญญาอนุญาตรุ่น 2 ขึ้นไป)\n\nโปรแกรมนี้ถูกเผยแพร่โดยหวังว่าจะเป็นประโยชน์แก่ผู้ใช้ แต่จะไม่มีการรับประกันใด ๆ แม้แต่การรับประกันเกี่ยวกับการนำไปใช้ในการซื้อขาย หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ\nสำหรับรายละเอียดเพิ่มเติม โปรดดูที่สัญญาอนุญาตสาธารณะทั่วไปของ GNU\n\nคุณควรได้รับสำเนาของสัญญาอนุญาตสาธารณะทั่วไปของ GNU มาพร้อมกับโปรแกรมนี้ ถ้าไม่ได้รับ ให้ขอได้ที่ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, \nหรือ[http://www.gnu.org/copyleft/gpl.html อ่านออนไลน์ที่นี่]", + "config-sidebar": "* [https://www.mediawiki.org โฮมเพจของ MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents แนวปฏิบัติของผู้ใช้]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents แนวปฏิบัติของผู้ดูแลระบบ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อย]\n----\n* อ่านเอกสารกำกับ\n* บันทึกการเผยแพร่\n* การคัดลอก\n* การอัปเกรด", + "config-env-good": "ตรวจสอบสภาพแวดล้อมแล้ว\nคุณสามารถติดตั้ง MediaWiki", + "config-env-bad": "ตรวจสอบสภาพแวดล้อมแล้ว\nคุณไม่สามารถติดตั้ง MediaWiki", + "config-env-php": "มี PHP $1 ติดตั้งอยู่", + "config-env-hhvm": "มี HHVM $1 ติดตั้งอยู่", + "config-unicode-using-intl": "ใช้[http://pecl.php.net/intl ส่วนขยาย intl PECL] สำหรับการปรับ Unicode เข้าสู่รูปปกติ (Unicode normalization)", + "config-unicode-pure-php-warning": "คำเตือน: [http://pecl.php.net/intl intl ส่วนขยาย PECL] ไม่พร้อมใช้งานสำหรับการจัดมาตรฐาน Unicode กำลังกลับไปใช้ PHP ที่แท้จริงแบบช้า\nถ้าคุณเปิดดำเนินการไซต์ที่มีปริมาณการใช้งานสูง คุณควรอ่านดูเกี่ยวกับ[https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations การจัดมาตรฐาน Unicode] สักเล็กน้อย", + "config-no-db": "ไม่พบไดรเวอร์ฐานข้อมูลที่เหมาะสม! คุณจำเป็นต้องติดตั้งไดรเวอร์ฐานข้อมูลสำหรับ PHP\nชนิดฐานข้อมูลต่อไปนี้ได้รับการสนับสนุน: $1\n\nถ้าคุณคอมไพล์ PHP ด้วยตนเอง ให้กำหนดค่าใหม่อีกครั้งโดยเปิดใช้งานไคลเอนต์ฐานข้อมูล ตัวอย่างเช่น ใช้ ./configure --with-mysqli\nถ้าคุณติดตั้ง PHP จากแพกเกจ Debian หรือ Ubuntu คุณก็จำเป็นต้องติดตั้งแพกเกจต่อไปนี้ ตัวอย่างเช่น แพกเกจ php5-mysql", + "config-outdated-sqlite": "คำเตือน: คุณมี SQLite $1 ซึ่งต่ำกว่ารุ่นขั้นต่ำที่ต้องการ $2 ดังนั้น SQLite จะไม่พร้อมให้ใช้งาน", + "config-no-fts3": "คำเตือน: SQLite ถูกคอมไพล์โดยไม่มี[//sqlite.org/fts3.html โมดูล FTS3] คุณลักษณะการค้นหาจะไม่พร้อมใช้งานบนแบ็กเอนด์นี้", + "config-pcre-old": "ข้อผิดพลาดร้ายแรง: ต้องใช้ PCRE $1 หรือสูงกว่า\nไบนารี PHP ของคุณถูกเชื่อมโยงกับ PCRE $2\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE ข้อมูลเพิ่มเติม]", + "config-pcre-no-utf8": "ข้อผิดพลาดร้ายแรง: โมดูล PCRE ของ PHP ดูเหมือนจะถูกคอมไพล์โดยไม่มีการรองรับ PCRE_UTF8\nMediaWiki ต้องการการรองรับ UTF-8 เพื่อให้ทำงานได้อย่างถูกต้อง", "config-memory-raised": "memory_limit ของ PHP คือ $1 ได้เพิ่มเป็น $2", "config-memory-bad": "คำเตือน: memory_limit ของ PHP คือ $1.\nเป็นไปได้ว่ามันอาจต่ำเกินไป\nการติดตั้งอาจล้มเหลวได้!", - "config-xcache": "[http://xcache.lighttpd.net/ XCache] ติดตั้งแล้ว", - "config-apc": "[http://www.php.net/apc APC] ติดตั้งแล้ว", - "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ติดตั้งแล้ว", - "config-mod-security": "คำเตือน: เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับมีเดียวิกิ และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามใจ\nหากเป็นไปได้ สิ่งนี้ควรปิดใช้งาน หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบความผิดพลาดโดยสุ่ม", + "config-xcache": "มี [http://xcache.lighttpd.net/ XCache] ติดตั้งอยู่", + "config-apc": "มี [http://www.php.net/apc APC] ติดตั้งอยู่", + "config-apcu": "มี [http://www.php.net/apcu APCu] ติดตั้งอยู่", + "config-wincache": "มี [http://www.iis.net/download/WinCacheForPhp WinCache] ติดตั้งอยู่", + "config-no-cache-apcu": "คำเตือน: ไม่พบ [http://www.php.net/apcu APCu] [http://xcache.lighttpd.net/ XCache] หรือ [http://www.iis.net/download/WinCacheForPhp WinCache]\nการแคชวัตถุไม่ได้ถูกเปิดใช้งาน", + "config-mod-security": "คำเตือน: เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับ MediaWiki และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามที่ผู้ใช้\nหากเป็นไปได้ ควรปิดใช้งานคุณลักษณะนี้ หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบข้อผิดพลาดโดยสุ่ม", "config-diff3-bad": "ไม่พบ GNU diff3", "config-git": "พบซอฟต์แวร์ควบคุมรุ่น Git: $1", "config-git-bad": "ไม่พบซอฟต์แวร์ควบคุมรุ่น Git", "config-imagemagick": "พบ ImageMagick: $1\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด", - "config-gd": "พบไลบรารีกราฟิก GD ภายใน\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด", + "config-gd": "พบไลบรารีกราฟิก GD ในตัว\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด", "config-no-scaling": "ไม่พบไลบรารี GD หรือ ImageMagick\nการย่อรูปภาพจะถูกปิดใช้งาน", + "config-no-uri": "ข้อผิดพลาด: ไม่สามารถทำการตรวจสอบ URI ปัจจุบันได้\nการติดตั้งถูกยกเลิกแล้ว", + "config-no-cli-uri": "คำเตือน: ไม่ได้ระบุ --scriptpath กำลังใช้ค่าเริ่มต้น: $1", "config-using-server": "ใช้ชื่อเซิร์ฟเวอร์ \"$1\"", "config-using-uri": "ใช้ยูอาร์แอลของเซิร์ฟเวอร์ \"$1$2\"", - "config-mysql-innodb": "อินโนดีบี", - "config-mysql-myisam": "มายไอแซม", + "config-uploads-not-safe": "คำเตือน: ไดเรกทอรีเริ่มต้นของคุณสำหรับการอัปโหลด $1 มีช่องโหว่ที่มีต่อการดำเนินการสคริปต์ด้วยตัวเอง\nถึงแม้ว่า MediaWiki จะมีการตรวจสอบช่องโหว่ด้านความปลอดภัยในไฟล์ที่อัปโหลดทั้งหมด แต่ขอแนะนำอย่างยิ่งว่าให้[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security ปิดช่องโหว่ด้านความปลอดภัยนี้]ก่อนเปิดใช้งานการอัปโหลด", + "config-no-cli-uploads-check": "คำเตือน: ไดเรกทอรีสำหรับอัปโหลดเริ่มต้นของคุณ ($1) ยังไม่ได้ถูกตรวจสอบช่องโหว่ด้านความปลอดภัย\nที่มีต่อการดำเนินการสคริปต์เองระหว่างการติดตั้ง CLI", + "config-brokenlibxml": "การใช้รุ่น PHP และ libxml2 ร่วมกันในระบบของคุณเป็นคู่รุ่นที่มีบักมากและอาจทำให้เกิดการเสียหายของข้อมูลแอบแฝงอยู่ใน MediaWiki และเว็บแอปพลิเคชั่นอื่นๆ ได้\nอัปเกรดเป็น libxml2 2.7.3 หรือสูงกว่า ([https://bugs.php.net/bug.php?id=45996 บักที่รายงานด้วย PHP])\nการติดตั้งถูกยกเลิกแล้ว", + "config-suhosin-max-value-length": "Suhosin ถูกติดตั้งแล้วและจำกัดความยาวพารามิเตอร์ GET เป็น $1 ไบต์\nองค์ประกอบ ResourceLoader ของ MediaWiki จะยังคงทำงานภายใต้การจำกัดนี้ แต่อาจลดระดับประสิทธิภาพลงได้\nถ้าเป็นไปได้ คุณควรตั้ง suhosin.get.max_value_length เป็น 1024 หรือสูงกว่าใน php.ini และตั้งค่า $wgResourceLoaderMaxQueryLength ให้เป็นค่าเดียวกับใน LocalSettings.php", + "config-db-type": "ชนิดฐานข้อมูล:", + "config-db-host": "โฮสต์ฐานข้อมูล:", + "config-db-host-help": "ถ้าเซิร์ฟเวอร์ฐานข้อมูลของคุณอยู่บนเซิร์ฟเวอร์อื่น ให้ป้อนชื่อโฮสต์หรือที่อยู่ IP ที่นี่\n\nถ้าคุณกำลังใช้งานโฮสต์เว็บที่ใช้ร่วมกัน ผู้ให้บริการโฮสต์ควรให้ชื่อโฮสต์ที่ถูกต้องแก่คุณในเอกสารคู่มือ\n\nถ้าคุณกำลังติดตั้งบนเซิร์ฟเวอร์ Windows และกำลังใช้ MySQL การใช้ \"localhost\" อาจไม่สามารถใช้ได้สำหรับชื่อเซิร์ฟเวอร์ ถ้าไม่สามารถใช้ได้ ให้ลองใช้ \"127.0.0.1\" สำหรับที่อยู่ IP เฉพาะที่", + "config-db-host-oracle": "TNS ฐานข้อมูล:", + "config-db-host-oracle-help": "ป้อน [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] ที่ถูกต้อง; ไฟล์ tnsnames.ora ต้องสามารถมองเห็นได้โดยการติดตัั้งนี้
    ถ้าคุณกำลังใช้ไลบรารีไคลเอนต์ 10g หรือใหม่กว่า คุณก็สามารถใช้วิธีการตั้งชื่อแบบ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] ได้เช่นกัน", + "config-db-wiki-settings": "ระบุวิกินี้", + "config-db-name": "ชื่อฐานข้อมูล:", + "config-db-name-help": "เลือกชื่อที่ระบุวิกิของคุณ\nชื่อไม่ควรมีช่องว่าง\n\nถ้าคุณกำลังใช้โฮสต์เว็บที่ใช้ร่วมกัน ผู้ให้บริการโฮสต์ของคุณจะระบุชื่อฐานข้อมูลให้คุณ หรือให้คุณสร้างฐานข้อมูลโดยใช้แผงควบคุม", + "config-db-name-oracle": "แบบแผนฐานข้อมูล:", + "config-db-account-oracle-warn": "มีสถานการณ์สมมติสามสถานการณ์ที่สนับสนุนสำหรับการติดตั้ง Oracle เป็นแบ็กเอนด์ฐานข้อมูล:\n\nถ้าคุณต้องการสร้างบัญชีฐานข้อมูลเป็นส่วนหนึ่งของกระบวนการติดตั้ง โปรดจัดหาบัญชีที่มีบทบาท SYSDBA เป็นบัญชีฐานข้อมูลสำหรับการติดตั้งและระบุข้อมูลประจำตัวที่ต้องการสำหรับบัญชีการเข้าถึงเว็บ หรือคุณสามารถสร้างบัญชีการเข้าถึงเว็บด้วยตนเองและจัดหาเฉพาะบัญชีนั้น (ถ้ามีสิทธิ์ที่ต้องการในการสร้างวัตถุแบบแผน) หรือจัดหาบัญชีสองบัญชี โดยบัญชีหนึ่งใช้สร้างสิทธิ์ และบัญชีที่จำกัดอีกบัญชีหนึ่งสำหรับการเข้าถึงเว็บ\n\nสคริปต์ที่ใช้สำหรับการสร้างบัญชีพร้อมสิทธิ์ที่ต้องการสามารถพบได้ในไดเรกทอรี \"maintenance/oracle/\" ของการติดตั้งนี้\nอย่าลืมว่าการใช้บัญชีที่จำกัดจะเป็นการปิดใช้งานความสามารถในการบำรุงรักษาทั้งหมดด้วยบัญชีเริ่มต้น", + "config-db-install-account": "บัญชีผู้ใช้สำหรับการติดตั้ง", + "config-db-username": "ชื่อผู้ใช้ฐานข้อมูล:", + "config-db-password": "รหัสผ่านฐานข้อมูล:", + "config-db-install-username": "ป้อนชื่อผู้ใช้ที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nชื่อผู้ใช้นี้ไม่ใช่ชื่อผู้ใช้สำหรับบัญชี MediaWiki แต่เป็นชื่อผู้ใช้สำหรับฐานข้อมูลของคุณ", + "config-db-install-password": "ป้อนรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nรหัสผ่านนี้ไม่ใช่รหัสผ่านสำหรับบัญชี MediaWiki แต่เป็นรหัสผ่านสำหรับฐานข้อมูลของคุณ", + "config-db-install-help": "ป้อนชื่อผู้ใช้และรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง", + "config-db-account-lock": "ใช้ชื่อผู้ใช้และรหัสผ่านเดียวกันในระหว่างการใช้งานปกติ", + "config-db-wiki-account": "บัญชีผู้ใช้สำหรับการใช้งานปกติ", + "config-db-wiki-help": "ป้อนชื่อผู้ใช้และรหัสผ่านที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างการใช้งานวิกิตามปกติ\nถ้าไม่มีบัญชีอยู่ และบัญชีการติดตั้งมีสิทธิ์เพียงพอ บัญชีผู้ใช้นี้จะถูกสร้างพร้อมสิทธิ์ขั้นต่ำที่จำเป็นต้องใช้ดำเนินการกับวิกิ", + "config-db-prefix": "คำนำหน้าตารางฐานข้อมูล:", + "config-db-prefix-help": "ถ้าคุณต้องการใช้ฐานข้อมูลเดียวร่วมกันระหว่างหลายวิกิ หรือระหว่าง MediaWiki กับเว็บแอปพลิเคชันอื่นๆ คุณอาจต้องเลือกเพิ่มคำนำหน้าให้กับชื่อตารางทั้งหมดเพื่อป้องกันความขัดแย้ง\nอย่าใช้ช่องว่าง\n\nโดยปกติ เขตข้อมูลนี้มักจะถูกปล่อยให้ว่างเปล่า", + "config-mysql-old": "จำเป็นต้องใช้ MySQL $1 หรือสูงกว่า คุณมี $2", + "config-db-port": "พอร์ตฐานข้อมูล:", + "config-db-schema": "แบบแผนสำหรับ MediaWiki:", + "config-db-schema-help": "โดยปกติ แบบแผนนี้จะไม่มีปัญหาใดๆ อยู่แล้ว\nเปลี่ยนเฉพาะก็ต่อเมื่อคุณรู้ว่าคุณจำเป็นต้องดำเนินการนี้", + "config-pg-test-error": "ไม่สามารถเชื่อมต่อไปยังฐานข้อมูล $1: $2", + "config-sqlite-dir": "ไดเรกทอรีข้อมูล SQLite:", + "config-sqlite-dir-help": "SQLite จัดเก็บข้อมูลทั้งหมดในไฟล์เดียว\n\nไดเรกทอรีที่คุณระบุจะต้องสามารถเขียนได้โดยเว็บเซิร์ฟเวอร์ระหว่างการติดตั้ง\n\nไดเรกทอรีดังกล่าวไม่ควรสามารถเข้าถึงได้ผ่านเว็บ นี่คือเหตุผลที่เราไม่นำไฟล์ข้อมูลดังกล่าวไปไว้ในตำแหน่งที่มีไฟล์ PHP ของคุณอยู่\n\nโปรแกรมติดตั้งจะเขียนไฟล์ .htaccess ไปพร้อมกับไฟล์ข้อมูลดังกล่าว แต่ถ้าเกิดความล้มเหลว ทุกคนจะสามารถเข้าถึงฐานข้อมูลดิบของคุณได้\nซึ่งรวมถึงข้อมูลผู้ใช้ดิบ (ที่อยู่อีเมล ข้อมูลแฮช) รวมถึงรุ่นปรับปรุงที่ถูกลบไปแล้ว และข้อมูลที่ถูกจำกัดอื่นๆ บนวิกิ\n\nให้พิจารณานำฐานข้อมูลไปไว้ในตำแหน่งอื่น ตัวอย่างเช่น ใน /var/lib/mediawiki/yourwiki", + "config-oracle-def-ts": "พื้นที่ตารางเริ่มต้น:", + "config-oracle-temp-ts": "พื้นที่ตารางชั่วคราว:", + "config-type-mysql": "MySQL (หรือที่เข้ากันได้)", + "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-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])", + "config-header-mysql": "การตั้งค่า MySQL", + "config-header-postgres": "การตั้งค่า PostgreSQL", + "config-header-sqlite": "การตั้งค่า SQLite", + "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-invalid-db-server-oracle": "TNS ฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้สตริง \"ชื่อ TNS\" หรือ \"Easy Connect\"\n ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm วิธีการตั้งชื่อของ Oracle])", + "config-invalid-db-name": "ชื่อฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) ขีดล่าง (_) และยัติภังค์ (-)", + "config-invalid-db-prefix": "คำนำหน้าฐานข้อมูล \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) ขีดล่าง (_) และยัติภังค์ (-)", + "config-connection-error": "$1\n\nตรวจสอบโฮสต์ ชื่อผู้ใช้และรหัสผ่าน และลองอีกครั้ง", + "config-invalid-schema": "แบบแผนสำหรับ MediaWiki \"$1\" ไม่ถูกต้อง\nให้ใช้เฉพาะอักษร ASCII (a-z, A-Z) ตัวเลข (0-9) และขีดล่าง (_)", + "config-db-sys-create-oracle": "โปรแกรมติดตั้งสนับสนุนเฉพาะการใช้บัญชี SYSDBA สำหรับการสร้างบัญชีใหม่เท่านั้น", + "config-db-sys-user-exists-oracle": "มีบัญชีผู้ใช้ \"$1\" อยู่แล้ว คุณสามารถใช้เฉพาะ SYSDBA สำหรับการสร้างบัญชีใหม่ได้เท่านั้น!", + "config-postgres-old": "จำเป็นต้องใช้ PostgreSQL $1 หรือสูงกว่า คุณมี $2", + "config-mssql-old": "จำเป็นต้องใช้ Microsoft SQL Server $1 หรือสูงกว่า คุณมี $2.", + "config-sqlite-name-help": "เลือกชื่อที่จะระบุวิกิของคุณ\nอย่าใช้ช่องว่างหรือยัติภังค์\nชื่อนี้จะถูกใช้สำหรับชื่อไฟล์ข้อมูล SQLite", + "config-sqlite-parent-unwritable-group": "ไม่สามารถสร้างไดเรกทอรีข้อมูล $1 ได้ เนื่องจากไดเรกทอรีหลัก $2 ไม่สามารถเขียนได้โดยเว็บเซิร์ฟเวอร์\n\nโปรแกรมติดตั้งได้ทำการตรวจสอบแล้วว่าเว็บเซิร์ฟเวอร์ของคุณกำลังทำงานในฐานะผู้ใช้ใด\nทำให้ไดเรกทอรี $3 สามารถเขียนโดยผู้ใช้ดังกล่าวได้เพื่อดำเนินการต่อ\nถ้าคุณใช้ระบบ Unix/Linux ให้่ทำเช่นนี้:\n\n
    cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
    ", + "config-sqlite-parent-unwritable-nogroup": "ไม่สามารถสร้างไดเรกทอรีข้อมูล $1 ได้ เนื่องจากไดเรกทอรีหลัก $2 ไม่สามารถเขียนได้โดยเว็บเซิร์ฟเวอร์\n\nโปรแกรมติดตั้งไม่สามารถทำการตรวจสอบได้ว่าเว็บเซิร์ฟเวอร์ของคุณกำลังทำงานในฐานะผู้ใช้ใด\nทำให้ไดเรกทอรี $3 สามารถเขียนโดยส่วนกลาง (ุผู้ใช้ดังกล่าว รวมถึงคนอื่นๆ ด้วย!) ได้เพื่อดำเนินการต่อ\nถ้าคุณใช้ระบบ Unix/Linux ให้่ทำเช่นนี้:\n\n
    cd $2\nmkdir $3\nchmod a+w $3
    ", + "config-sqlite-mkdir-error": "ไม่สามารถสร้างไดเรกทอรีข้อมูล \"$1\" ได้\nให้ตรวจสอบตำแหน่งที่ตั้ง และลองอีกครั้ง", + "config-sqlite-dir-unwritable": "ไม่สามารถเขียนข้อมูลลงในไดเรกทอรี \"$1\" ได้\nให้เปลี่ยนสิทธิ์ เพื่อให้เว็บเซิร์ฟเวอร์สามารถเขียนข้อมูลลงในไดเรกทอรีดังกล่าวได้ และลองอีกครั้ง", + "config-sqlite-connection-error": "$1\n\nตรวจสอบไดเรกทอรีข้อมูลและชื่อฐานข้อมูลด้านล่าง และลองอีกครั้ง", + "config-sqlite-readonly": "ไม่สามารถเขียนไฟล์ $1 ได้", + "config-sqlite-cant-create-db": "ไม่สามารถสร้างไฟล์ฐานข้อมูล $1 ได้", + "config-sqlite-fts3-downgrade": "PHP กำลังขาดการสนับสนุน FTS3 กำลังดาวน์เกรดตารางข้อมูล", + "config-can-upgrade": "มีตารางข้อมูล MediaWiki tables ในฐานข้อมูลนี้\nเมื่อต้องการอัปเกรดตารางข้อมูลเหล่านั้นไปเป็น MediaWiki $1 ให้คลิก ดำเนินการต่อ", + "config-upgrade-done": "การอัปเกรดเสร็จสมบูรณ์\n\nคุณสามารถ[$1 เริ่มใช้วิกิของคุณ]ได้ในขณะนี้\n\nถ้าคุณต้องการสร้างไฟล์ LocalSettings.php ของคุณใหม่ ให้คลิกปุ่มด้านล่างนี้\nไม่แนะนำให้ดำเนินการนี้นอกจากว่าคุณกำลังมีปัญหากับวิกิของคุณ", + "config-upgrade-done-no-regenerate": "การอัปเกรดเสร็จสมบูรณ์\n\nคุณสามารถ[$1 เริ่มใช้วิกิของคุณ]ได้ในขณะนี้", + "config-regenerate": "สร้าง LocalSettings.php ใหม่ →", + "config-show-table-status": "คิวรี SHOW TABLE STATUS ล้มเหลว!", + "config-unknown-collation": "คำเตือน: ฐานข้อมูลกำลังใช้การจัดเรียงที่ไม่รู้จัก", + "config-db-web-account": "บัญชีฐานข้อมูลสำหรับการเข้าถึงเว็บ", + "config-db-web-help": "เลือกชื่อผู้ใช้และรหัสผ่านที่เว็บเซิร์ฟเวอร์จะใช้เชื่อมต่อไปยังเซิร์ฟเวอร์ฐานข้อมูล ในระหว่างการใช้งานวิกิตามปกติ", + "config-db-web-account-same": "ใช้บัญชีเดียวกับที่ใช้ในการติดตั้ง", + "config-db-web-create": "สร้างบัญชี ถ้าบัญชีดังกล่าวไม่มีอยู่", + "config-db-web-no-create-privs": "บัญชีที่คุณระบุไว้สำหรับการติดตั้งมีสิทธิ์ไม่เพียงพอที่จะสร้างบัญชี\nบัญชีที่คุณระบุไว้ที่นี่จะต้องมีอยู่แล้ว", + "config-mysql-engine": "กลไกที่จัดเก็บข้อมูล:", + "config-mysql-innodb": "InnoDB", + "config-mysql-myisam": "MyISAM", + "config-mysql-myisam-dep": "คำเตือน: คุณได้เลือก MyISAM เป็นกลไกที่จัดเก็บข้อมูลสำหรับ MySQL ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nถ้าการติดตั้ง MySQL ของคุณสนับสนุน InnoDB แนะนำอย่างยิ่งว่าให้คุณเลือก InnoDB แทน\nถ้าการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว", + "config-mysql-only-myisam-dep": "คำเตือน: กลไกที่จัดเก็บข้อมูลสำหรับ MySQL ที่พร้อมใช้งานบนเครื่องนี้มีเพียง MyISAM ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว", + "config-mysql-engine-help": "InnoDB เป็นตัวเลือกที่เกือบดีที่สุดเสมอ เนื่องจากมีการสนับสนุนกระบวนการทำงานพร้อมกัน\n\nMyISAM อาจทำงานได้เร็วกว่าในการติดตั้งแบบผู้ใช้คนเดียวหรือแบบอ่านอย่างเดียว\nฐานข้อมูล MyISAM มักจะได้รับความเสียหายบ่อยมากกว่าฐานข้อมูล InnoDB", + "config-mysql-charset": "ชุดอักขระของฐานข้อมูล:", "config-mysql-binary": "ไบนารี", - "config-mysql-utf8": "ยูทีเอฟ-8", + "config-mysql-utf8": "UTF-8", + "config-mysql-charset-help": "ในโหมดไบนารี MediaWiki จะจัดเก็บข้อความ UTF-8 ไว้ในฐานข้อมูลในเขตข้อมูลไบนารี\nการใช้โหมดไบนารีจะมีประสิทธิภาพมากกว่าการใช้โหมด UTF-8 ของ MySQL และจะอนุญาตให้คุณสามารถใช้อักขระที่มีใน Unicode ได้หมดทุกช่วง\n\nในโหมด UTF-8 MySQL จะทราบว่าข้อมูลของคุณอยู่ในชุดอักขระได้ และจะสามารถเสนอและแปลงข้อมูลดังกล่าวได้อย่างเหมาะสม แต่จะไม่อนุญาตให้คุณจัดเก็บข้อมูลที่มีอักขระนอกเหนือจากในช่วง[https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes เพลนหลายภาษาพื้นฐาน]", + "config-mssql-auth": "ชนิดการยืนยันตัวตน:", + "config-mssql-install-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้", + "config-mssql-web-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างการใช้งานวิกิตามปกติ\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้", + "config-mssql-sqlauth": "การยืนยันตัวตนโดย SQL Server", + "config-mssql-windowsauth": "การยืนยันตัวตนโดย Windows", "config-site-name": "ชื่อของวิกิ:", + "config-site-name-help": "ชื่อนี้จะปรากฏในแถบชื่อเรื่องของเบราว์เซอร์และในที่อื่นๆ อีกหลายแห่ง", + "config-site-name-blank": "ป้อนชื่อไซต์", + "config-project-namespace": "เนมสเปซโครงการ:", "config-ns-generic": "โครงการ", + "config-ns-site-name": "เหมือนกับชื่อวิกิ: $1", + "config-ns-other": "อื่นๆ (ระบุ)", "config-ns-other-default": "วิกิของฉัน", - "config-admin-box": "บัญชีผู้ดูแลระบบ", + "config-project-namespace-help": "ตามตัวอย่างในวิกิพีเดีย วิกิหลายแห่งจะแยกหน้านโยบายออกจากหน้าเนื้อหาต่างๆ ใน '''เนมสเปซโครงการ'''\nชื่อเรื่องหน้าทั้งหมดในเนมสเปซนี้จะขึ้นต้นด้วยคำนำหน้าบางคำ ซึ่งคุณสามารถระบุได้ที่นี่\nโดยปกติ คำนำหน้านี้จะถูกสืบทอดมาจากชื่อของวิกิ แต่ไม่สามารถมีอักขระเครื่องหมายวรรคตอนได้ เช่น \"#\" หรือ \":\"", + "config-ns-invalid": "เนมสเปซ \"$1\" ที่ระบุไม่ถูกต้อง\nระบุเนมสเปซโครงการอื่น", + "config-ns-conflict": "เนมสเปซ \"$1\" ที่ระบุขัดแย้งกับเนมสเปซเริ่มต้นของ MediaWiki\nระบุเนมสเปซโครงการอื่น", + "config-admin-box": "บัญชีผู้ดูแล", "config-admin-name": "ชื่อผู้ใช้ของคุณ:", "config-admin-password": "รหัสผ่าน:", "config-admin-password-confirm": "รหัสผ่านอีกครั้ง:", + "config-admin-help": "ป้อนชื่อผู้ใช้ที่ต้องการของคุณที่นี่ ตัวอย่างเช่น \"Joe Bloggs\"\nชื่อนี้จะเป็นชื่อที่คุณจะใช้สำหรับเข้าสู่ระบบวิกิ", + "config-admin-name-blank": "ป้อนชื่อผู้ใช้ของผู้ดูแล", + "config-admin-name-invalid": "ชื่อผู้ใช้ \"$1\" ที่ระบุไม่ถูกต้อง\nระบุชื่อผู้ใช้อื่น", + "config-admin-password-blank": "ป้อนรหัสผ่านสำหรับบัญชีผู้ดูแล", + "config-admin-password-mismatch": "รหัสผ่านสองรหัสที่คุณป้อนไม่ตรงกัน", "config-admin-email": "ที่อยู่อีเมล:", + "config-admin-email-help": "ป้อนที่อยู่อีเมลที่นี่เพื่อให้คุณสามารถรับอีเมลจากผู้ใช้อื่นๆ บนวิกิ ตั้งค่ารหัสผ่านใหม่ และรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงในหน้าที่อยู่บนรายการเฝ้าดูของคุณ คุณสามารถปล่อยเขตข้อมูลนี้ให้ว่างไว้ได้", + "config-admin-error-user": "เกิดข้อผิดพลาดภายในขณะสร้างผู้ดูแลด้วยชื่อ \"$1\"", + "config-admin-error-password": "เกิดข้อผิดพลาดภายในขณะตั้งค่ารหัสผ่านสำหรับผู้ดูแล \"$1\":
    $2
    ", + "config-admin-error-bademail": "คุณป้อนที่อยู่อีเมลที่ไม่ถูกต้อง", + "config-subscribe": "สมัครรับข้อมูลกับ[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce รายชื่อผู้รับจดหมายเกี่ยวกับการประกาศการออกรุ่น]", + "config-subscribe-help": "รายชื่อนี้เป็นรายชื่อผู้รับจดหมายที่มีปริมาณต่ำสำหรับแจ้งข่าวเกี่ยวกับการประกาศการออกรุ่น รวมถึงการประกาศความปลอดภัยที่สำคัญ\nคุณควรสมัครรับข้อมูล และทำการอัปเดตการติดตั้ง MediaWiki ของคุณเมื่อมีรุ่นใหม่ออกมา", + "config-subscribe-noemail": "คุณได้พยายามสมัครรับข้อมูลกับรายชื่อผู้รับจดหมายการประกาศการออกรุ่นโดยไม่ได้ระบุที่อยู่อีเมล\nโปรดระบุที่อยู่อีเมล ถ้าคุณต้องการสมัครรับข้อมูลกับรายชื่อผู้รับจดหมาย", + "config-pingback": "แบ่งปันข้อมูลเกี่ยวกับการติดตั้งนี้ให้กับผู้พัฒนา MediaWiki", + "config-almost-done": "คุณใกล้จะเสร็จสมบูรณ์แล้ว!\nคุณสามารถข้ามการกำหนดค่าที่เหลืออยู่และติดตั้งวิกิได้ในขณะนี้", "config-optional-continue": "ถามคำถามฉันอีก", + "config-optional-skip": "ฉันเบื่อแล้ว ติดตั้งวิกิให้ฉันเถอะ", + "config-profile": "โปรไฟล์สิทธิ์ผู้ใช้:", + "config-profile-wiki": "วิกิเปิด", + "config-profile-no-anon": "จำเป็นต้องสร้างบัญชี", + "config-profile-fishbowl": "เฉพาะผู้แก้ไขที่ได้รับอนุญาตเท่านั้น", + "config-profile-private": "วิกิส่วนตัว", + "config-profile-help": "วิกิต่างๆ จะใช้งานได้ดีที่สุดถ้าคุณเปิดให้หลายๆ คนร่วมแก้ไขวิกิของคุณได้มากเท่าที่จะได้\nใน MediaWiki มันง่ายที่จะตรวจทานการแก้ไขล่าสุด และแปลงกลับความเสียหายใดๆ ที่ถูกกระทำโดยผู้ใช้ที่ไม่มีมารยาทหรือที่เป็นอันตราย\n\nอย่างไรก็ตาม หลายคนได้พบว่า MediaWiki to be useful มีประโยชน์ในหลากหลายบทบาท และในบางครั้งมันไม่ง่ายที่จะทำให้ทุกๆ คนเชื่อว่า MediaWiki นั้นมีประโยชน์ในทางวิกิ\nดังนั้น คุณมีตัวเลือก\n\nแบบจำลอง {{int:config-profile-wiki}} อนุญาตให้ทุกๆ คนร่วมแก้ไขได้ โดยไม่จำเป็นต้องเข้าสู่ระบบ\nวิกิที่มี {{int:config-profile-no-anon}} จะจัดเตรียมการดำเนินงานพิเศษ แต่อาจห้ามไม่ให้ผู้คนเข้ามามีส่วนร่วม\n\nสถานการณ์จำลอง {{int:config-profile-fishbowl}} อนุญาตให้ผู้แก้ไขที่ได้รับการอนุมัติสามารถทำการแก้ไขได้ แต่ทุกคนสามารถมองเห็นหน้า รวมถึงประวัติได้\n{{int:config-profile-private}} อนุญาตให้เฉพาะผู้แก้ไขที่ได้รับการอนุมัติดูหน้า และแก้ไขได้\n\nการกำหนดค่าสิทธิ์ผู้ใช้ที่ซับซ้อนขึ้นจะพร้อมใช้งานหลังจากการติดตั้ง ดูที่ [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights รายการคู่มือที่เกี่ยวข้อง]", + "config-license": "ลิขสิทธิ์และสัญญาอนุญาต:", + "config-license-none": "ไม่มีส่วนท้ายของใบอนุญาต", + "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike", + "config-license-cc-by": "Creative Commons Attribution", + "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike", + "config-license-cc-0": "Creative Commons Zero (สาธารณสมบัติ)", + "config-license-gfdl": "GNU Free Documentation License 1.3 หรือสูงกว่า", "config-license-pd": "สาธารณสมบัติ", + "config-license-cc-choose": "เลือกสัญญาอนุญาต Creative Commons เอง", "config-extensions": "ส่วนขยาย", "config-install-step-done": "เสร็จสิ้น", "config-install-step-failed": "ล้มเหลว", diff --git a/includes/installer/i18n/tr.json b/includes/installer/i18n/tr.json index 823b1ba64f..c3a75398e2 100644 --- a/includes/installer/i18n/tr.json +++ b/includes/installer/i18n/tr.json @@ -16,7 +16,8 @@ "Meelo", "HakanIST", "McAang", - "Elftrkn" + "Elftrkn", + "Vito Genovese" ] }, "config-desc": "MediaWiki yükleyicisi", @@ -57,7 +58,7 @@ "config-restart": "Evet, yeniden başlat", "config-welcome": "===Ortam Kontrolleri===\nOrtamın Mediawiki kurulumuna uygun olup olmadığını anlamak için basit kontroller yapılacak.\nKurulumu nasıl tamamlayacağınız konusunda destek isterken bu bilgileri eklemeyi unutmayın.", "config-copyright": "=== Telif Hakları ve Koşulları ===\n\n$1\n\nBu program ücretsiz bir yazılımdır; yeniden dağıtabilir veya Özgür Yazılım Kuruluşu tarafından yayınlanan (GNU) Genel Kamu Lisansı koşulları altında değiştirebilirsiniz; isterseniz ikinci lisans sürümünü veya (sizin seçeneğiniz) herhangi bir sonraki lisans sürümünü kullanabilirsiniz.\n\nBu program, faydalı olacağı umuduyla dağıtılmaktadır, ancak ''' herhangi bir garantisi yoktur '''; ''' uygunluk ''' veya ''' belirli bir amaca uygunluk ''' gibi dolaylı garantileri bile yoktur.\nDaha fazla ayrıntı için (GNU) Genel Kamu Lisansına bakınız.\n\nBu program ile birlikte bir (GNU) Genel Kamu Lisansının bir kopyasını almış olmanız gerekir; bu program (GNU) Genel Kamu Lisansı ile dağıtılmadıysa, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ABD adresine yazın veya [http://www.gnu.org/copyleft/gpl.html online olarak okuyun].", - "config-sidebar": "* [https://www.mediawiki.org MediaWiki ana sayfa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Kullanıcı Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Yetkili Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ SSS]\n----\n* Beni oku\n* Sürüm notları\n* Kopyalama\n* Yükseltme", + "config-sidebar": "* [https://www.mediawiki.org MediaWiki anasayfa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Kullanıcı Kılavuzu]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hizmetli Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ SSS]\n----\n* Beni oku\n* Sürüm notları\n* Kopyalama\n* Yükseltme", "config-env-good": "Ortam kontrol edildi.\nMediaWiki'yi kurabilirsiniz.", "config-env-bad": "Ortam kontrol edildi.\nMediaWiki'yi kuramazsınız.", "config-env-php": "PHP $1 kurulu.", @@ -164,13 +165,13 @@ "config-ns-conflict": "Belirtilen ad \" $1 \" varsayılan MediaWiki ad alanı ile çakışıyor.\nFarklı proje isim alanı belirtin.", "config-admin-box": "Yönetici hesabı", "config-admin-name": "Kullanıcı adınız:", - "config-admin-password": "Şifre:", - "config-admin-password-confirm": "Şifre tekrar:", + "config-admin-password": "Parola:", + "config-admin-password-confirm": "Yeniden parola:", "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.", "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.", "config-admin-name-invalid": "Belirtilen ad \" $1 \" geçersiz.\nFarklı bir kullanıcı adı belirtin.", "config-admin-password-blank": "Yönetici hesabı için bir parola girin.", - "config-admin-password-mismatch": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.", + "config-admin-password-mismatch": "Girdiğiniz iki parola eşleşmiyor.", "config-admin-email": "E-posta adresi:", "config-admin-email-help": "Wiki'de diğer kullanıcılardan e-posta almak, parolanızı sıfırlamak ve sizin izlediğiniz sayfalarda yapılan değişikliklerin bildirilmesini sağlamak için e-posta adresinizi girin. Bu alanı boş bırakabilirsiniz.", "config-admin-error-user": "Bir yönetici adı ile oluşturma sırasında iç hata \" $1 \".", @@ -228,9 +229,9 @@ "config-install-stats": "Ä°statistik başlatılıyor", "config-install-keys": "Gizli anahtar oluşturma", "config-install-subscribe-notpossible": "cURL yüklü değil ve allow_url_fopen kullanılamaz.", - "config-install-mainpage": "Varsayılan içerik ile ana sayfa oluşturma", + "config-install-mainpage": "Varsayılan içerik ile anasayfa oluşturma", "config-install-extension-tables": "Uzantılar için etkinleştirilmiş tablolar oluşturma", - "config-install-mainpage-failed": "Ana sayfa eklenemedi:$1", + "config-install-mainpage-failed": "Anasayfa eklenemedi: $1", "config-download-localsettings": "Ä°ndir LocalSettings.php", "config-help": "Yardım", "config-help-tooltip": "genişletmek için tıklayın", diff --git a/includes/installer/i18n/yi.json b/includes/installer/i18n/yi.json index 4a24408afd..e89113cbc9 100644 --- a/includes/installer/i18n/yi.json +++ b/includes/installer/i18n/yi.json @@ -50,6 +50,7 @@ "config-db-host-oracle": "דאטנבאזע־TNS:", "config-db-wiki-settings": "אידענטיפיצירן די דאזיקע וויקי", "config-db-name": "דאטנבאזע נאָמען:", + "config-db-name-oracle": "דאטנבאזע סכעמע:", "config-db-install-account": "באניצער־קאנטע פאר אינסטאלאציע", "config-db-username": "דאטנבאזע באניצער־נאָמען:", "config-db-password": "דאטנבאזע־פאסווארט:", diff --git a/includes/installer/i18n/zh-hans.json b/includes/installer/i18n/zh-hans.json index d0c0026a7c..5c89017a0b 100644 --- a/includes/installer/i18n/zh-hans.json +++ b/includes/installer/i18n/zh-hans.json @@ -328,6 +328,8 @@ "config-help-tooltip": "单击展开", "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 扩展矩阵]以查看完整的扩展列表。", + "config-skins-screenshots": "$1(截图:$2)", + "config-screenshot": "截图", "mainpagetext": "已安装MediaWiki。", "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/installer/i18n/zh-hant.json b/includes/installer/i18n/zh-hant.json index faf519487c..ab365ec2f1 100644 --- a/includes/installer/i18n/zh-hant.json +++ b/includes/installer/i18n/zh-hant.json @@ -18,7 +18,8 @@ "Reke", "Suchichi02", "Winstonyin", - "Wehwei" + "Wehwei", + "Wwycheuk" ] }, "config-desc": "MediaWiki 安裝程式", @@ -41,7 +42,7 @@ "config-back": "← 返回", "config-continue": "繼續 →", "config-page-language": "語言", - "config-page-welcome": "歡迎您來到 MediaWiki!", + "config-page-welcome": "歡迎使用 MediaWiki!", "config-page-dbconnect": "連線到資料庫", "config-page-upgrade": "升級目前安裝的版本", "config-page-dbsettings": "資料庫設定", @@ -258,7 +259,7 @@ "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [https://commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 操作手冊]。", "config-cc-error": "查無該創作共用授權條款,\n請手動輸入您的授權條款名稱。", "config-cc-again": "請重新選取...", - "config-cc-not-chosen": "請選擇您要使用的創作共享授權條款,然後點選 \"proceed\"。", + "config-cc-not-chosen": "請選擇您要使用的創用CC授權條款,然後點選 \"proceed\"。", "config-advanced-settings": "進階設定", "config-cache-options": "物件快取設定:", "config-cache-help": "物件快取是用來增進 MediaWiki 速度的一項功能,透過快取經常使用的資料。\n中型到大型的網站我們會建議開啟這個選項,對小型的網站也有一定程度的效果。", diff --git a/includes/interwiki/ClassicInterwikiLookup.php b/includes/interwiki/ClassicInterwikiLookup.php index 4ccca9785e..d9c04240c8 100644 --- a/includes/interwiki/ClassicInterwikiLookup.php +++ b/includes/interwiki/ClassicInterwikiLookup.php @@ -23,7 +23,7 @@ namespace MediaWiki\Interwiki; */ use \Cdb\Exception as CdbException; use \Cdb\Reader as CdbReader; -use Database; +use Wikimedia\Rdbms\Database; use Hooks; use Interwiki; use Language; @@ -221,7 +221,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { } } - $value = $this->getCacheValue( wfMemcKey( $prefix ) ); + $value = $this->getCacheValue( wfWikiID() . ':' . $prefix ); // Site level if ( $value == '' && $this->interwikiScopes >= 3 ) { $value = $this->getCacheValue( "_{$this->thisSite}:{$prefix}" ); @@ -288,7 +288,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { $row = $dbr->selectRow( 'interwiki', - ClassicInterwikiLookup::selectFields(), + self::selectFields(), [ 'iw_prefix' => $prefix ], __METHOD__ ); @@ -383,8 +383,6 @@ class ClassicInterwikiLookup implements InterwikiLookup { . $e->getMessage() ); } - ksort( $data ); - return array_values( $data ); } @@ -408,7 +406,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { } $res = $db->select( 'interwiki', - $this->selectFields(), + self::selectFields(), $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ] ); diff --git a/includes/interwiki/Interwiki.php b/includes/interwiki/Interwiki.php index 558e32c11e..8dd6193a9d 100644 --- a/includes/interwiki/Interwiki.php +++ b/includes/interwiki/Interwiki.php @@ -92,12 +92,12 @@ class Interwiki { } /** - * Returns all interwiki prefixes + * Returns all interwiki prefix definitions. * * @deprecated since 1.28, unused. Use InterwikiLookup instead. * * @param string|null $local If set, limits output to local/non-local interwikis - * @return array List of prefixes + * @return array[] List of interwiki rows * @since 1.19 */ public static function getAllPrefixes( $local = null ) { diff --git a/includes/interwiki/InterwikiLookup.php b/includes/interwiki/InterwikiLookup.php index d0a7719bbe..697e39d540 100644 --- a/includes/interwiki/InterwikiLookup.php +++ b/includes/interwiki/InterwikiLookup.php @@ -47,10 +47,21 @@ interface InterwikiLookup { public function fetch( $prefix ); /** - * Returns all interwiki prefixes + * Returns information about all interwiki prefixes, in the form of rows + * of the interwiki table. Each row may have the following keys: + * + * - iw_prefix: the prefix. Always present. + * - iw_url: the URL to use for linking, with $1 as a placeholder for the target page. + * Always present. + * - iw_api: the URL of the API. Optional. + * - iw_wikiid: the wiki ID (usually the database name for local wikis). Optional. + * - iw_local: whether the wiki is local, and the "magic redirect" mechanism should apply. + * Defaults to false. + * - iw_trans: whether "scary transclusion" is allowed for this site. + * Defaults to false. * * @param string|null $local If set, limits output to local/non-local interwikis - * @return string[] List of prefixes + * @return array[] interwiki rows. */ public function getAllPrefixes( $local = null ); diff --git a/includes/interwiki/InterwikiLookupAdapter.php b/includes/interwiki/InterwikiLookupAdapter.php index 60d6f43ddd..076c37fe1f 100644 --- a/includes/interwiki/InterwikiLookupAdapter.php +++ b/includes/interwiki/InterwikiLookupAdapter.php @@ -60,7 +60,6 @@ class InterwikiLookupAdapter implements InterwikiLookup { * @return bool Whether it exists */ public function isValidInterwiki( $prefix ) { - return array_key_exists( $prefix, $this->getInterwikiMap() ); } @@ -87,16 +86,20 @@ class InterwikiLookupAdapter implements InterwikiLookup { * See InterwikiLookup::getAllPrefixes * * @param string|null $local If set, limits output to local/non-local interwikis - * @return string[] List of prefixes + * @return array[] interwiki rows */ 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; + if ( $local === null || $interwiki->isLocal() === $local ) { + $res[] = [ + 'iw_prefix' => $interwikiId, + 'iw_url' => $interwiki->getURL(), + 'iw_api' => $interwiki->getAPI(), + 'iw_wikiid' => $interwiki->getWikiID(), + 'iw_local' => $interwiki->isLocal(), + 'iw_trans' => $interwiki->isTranscludable(), + ]; } } return $res; diff --git a/includes/jobqueue/Job.php b/includes/jobqueue/Job.php index f814ceeb1b..703e48564b 100644 --- a/includes/jobqueue/Job.php +++ b/includes/jobqueue/Job.php @@ -69,12 +69,22 @@ abstract class Job implements IJobSpecification { global $wgJobClasses; if ( isset( $wgJobClasses[$command] ) ) { - $class = $wgJobClasses[$command]; - - $job = new $class( $title, $params ); - $job->command = $command; + $handler = $wgJobClasses[$command]; + + if ( is_callable( $handler ) ) { + $job = call_user_func( $handler, $title, $params ); + } elseif ( class_exists( $handler ) ) { + $job = new $handler( $title, $params ); + } else { + $job = null; + } - return $job; + if ( $job instanceof Job ) { + $job->command = $command; + return $job; + } else { + throw new InvalidArgumentException( "Cannot instantiate job '$command': bad spec!" ); + } } throw new InvalidArgumentException( "Invalid job command '{$command}'" ); diff --git a/includes/jobqueue/JobQueue.php b/includes/jobqueue/JobQueue.php index 020a684728..1f4f179a67 100644 --- a/includes/jobqueue/JobQueue.php +++ b/includes/jobqueue/JobQueue.php @@ -19,8 +19,8 @@ * * @file * @defgroup JobQueue JobQueue - * @author Aaron Schulz */ +use MediaWiki\MediaWikiServices; /** * Class to handle enqueueing and running of background jobs @@ -378,7 +378,7 @@ abstract class JobQueue { // Flag this job as an old duplicate based on its "root" job... try { if ( $job && $this->isRootJobOldDuplicate( $job ) ) { - JobQueue::incrStats( 'dupe_pops', $this->type ); + self::incrStats( 'dupe_pops', $this->type ); $job = DuplicateJob::newFromJob( $job ); // convert to a no-op } } catch ( Exception $e ) { @@ -709,7 +709,7 @@ abstract class JobQueue { public static function incrStats( $key, $type, $delta = 1 ) { static $stats; if ( !$stats ) { - $stats = RequestContext::getMain()->getStats(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); } $stats->updateCount( "jobqueue.{$key}.all", $delta ); $stats->updateCount( "jobqueue.{$key}.{$type}", $delta ); diff --git a/includes/jobqueue/JobQueueDB.php b/includes/jobqueue/JobQueueDB.php index 2f5894765f..b7cc133a75 100644 --- a/includes/jobqueue/JobQueueDB.php +++ b/includes/jobqueue/JobQueueDB.php @@ -18,8 +18,11 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBConnRef; +use Wikimedia\Rdbms\DBConnectionError; +use Wikimedia\Rdbms\DBError; use MediaWiki\MediaWikiServices; use Wikimedia\ScopedCallback; @@ -181,14 +184,15 @@ class JobQueueDB extends JobQueue { * @return void */ protected function doBatchPush( array $jobs, $flags ) { - $dbw = $this->getMasterDB(); - - $method = __METHOD__; - $dbw->onTransactionIdle( - function () use ( $dbw, $jobs, $flags, $method ) { - $this->doBatchPushInternal( $dbw, $jobs, $flags, $method ); - }, - __METHOD__ + DeferredUpdates::addUpdate( + new AutoCommitUpdate( + $this->getMasterDB(), + __METHOD__, + function ( IDatabase $dbw, $fname ) use ( $jobs, $flags ) { + $this->doBatchPushInternal( $dbw, $jobs, $flags, $fname ); + } + ), + DeferredUpdates::PRESEND ); } @@ -764,7 +768,7 @@ class JobQueueDB extends JobQueue { protected function getDB( $index ) { $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); $lb = ( $this->cluster !== false ) - ? $lbFactory->getExternalLB( $this->cluster, $this->wiki ) + ? $lbFactory->getExternalLB( $this->cluster ) : $lbFactory->getMainLB( $this->wiki ); return $lb->getConnectionRef( $index, [], $this->wiki ); diff --git a/includes/jobqueue/JobQueueFederated.php b/includes/jobqueue/JobQueueFederated.php index bd832dbcd6..e74331113d 100644 --- a/includes/jobqueue/JobQueueFederated.php +++ b/includes/jobqueue/JobQueueFederated.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** @@ -29,7 +28,7 @@ * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a * JobQueueFederated instance, which itself would consist of three JobQueueRedis * instances, each using their own redis server. This would allow for the jobs - * to be split (evenly or based on weights) accross multiple servers if a single + * to be split (evenly or based on weights) across multiple servers if a single * server becomes impractical or expensive. Different JobQueue classes can be mixed. * * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue @@ -203,7 +202,7 @@ class JobQueueFederated extends JobQueue { /** * @param array $jobs - * @param HashRing $partitionRing + * @param HashRing &$partitionRing * @param int $flags * @throws JobQueueError * @return array List of Job object that could not be inserted diff --git a/includes/jobqueue/JobQueueGroup.php b/includes/jobqueue/JobQueueGroup.php index 71d68d9f93..addc7fc2e1 100644 --- a/includes/jobqueue/JobQueueGroup.php +++ b/includes/jobqueue/JobQueueGroup.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** @@ -38,6 +37,8 @@ class JobQueueGroup { protected $wiki; /** @var string|bool Read only rationale (or false if r/w) */ protected $readOnlyReason; + /** @var bool Whether the wiki is not recognized in configuration */ + protected $invalidWiki = false; /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */ protected $coalescedQueues; @@ -69,9 +70,17 @@ class JobQueueGroup { * @return JobQueueGroup */ public static function singleton( $wiki = false ) { + global $wgLocalDatabases; + $wiki = ( $wiki === false ) ? wfWikiID() : $wiki; + if ( !isset( self::$instances[$wiki] ) ) { self::$instances[$wiki] = new self( $wiki, wfConfiguredReadOnlyReason() ); + // Make sure jobs are not getting pushed to bogus wikis. This can confuse + // the job runner system into spawning endless RPC requests that fail (T171371). + if ( $wiki !== wfWikiID() && !in_array( $wiki, $wgLocalDatabases ) ) { + self::$instances[$wiki]->invalidWiki = true; + } } return self::$instances[$wiki]; @@ -122,6 +131,13 @@ class JobQueueGroup { public function push( $jobs ) { global $wgJobTypesExcludedFromDefaultQueue; + if ( $this->invalidWiki ) { + // Do not enqueue job that cannot be run (T171371) + $e = new LogicException( "Domain '{$this->wiki}' is not recognized." ); + MWExceptionHandler::logException( $e ); + return; + } + $jobs = is_array( $jobs ) ? $jobs : [ $jobs ]; if ( !count( $jobs ) ) { return; @@ -163,14 +179,21 @@ class JobQueueGroup { /** * Buffer jobs for insertion via push() or call it now if in CLI mode * - * Note that MediaWiki::restInPeace() calls pushLazyJobs() + * Note that pushLazyJobs() is registered as a deferred update just before + * DeferredUpdates::doUpdates() in MediaWiki and JobRunner classes in order + * to be executed as the very last deferred update (T100085, T154425). * * @param IJobSpecification|IJobSpecification[] $jobs A single Job or a list of Jobs * @return void * @since 1.26 */ public function lazyPush( $jobs ) { - if ( PHP_SAPI === 'cli' ) { + if ( $this->invalidWiki ) { + // Do not enqueue job that cannot be run (T171371) + throw new LogicException( "Domain '{$this->wiki}' is not recognized." ); + } + + if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) { $this->push( $jobs ); return; } diff --git a/includes/jobqueue/JobQueueMemory.php b/includes/jobqueue/JobQueueMemory.php index 2866c7f2fa..649e2af989 100644 --- a/includes/jobqueue/JobQueueMemory.php +++ b/includes/jobqueue/JobQueueMemory.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** diff --git a/includes/jobqueue/JobQueueRedis.php b/includes/jobqueue/JobQueueRedis.php index c2c9d66119..7dad014e45 100644 --- a/includes/jobqueue/JobQueueRedis.php +++ b/includes/jobqueue/JobQueueRedis.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; @@ -75,6 +74,8 @@ class JobQueueRedis extends JobQueue { /** @var string Compression method to use */ protected $compression; + const MAX_PUSH_SIZE = 25; // avoid tying up the server + /** * @param array $params Possible keys: * - redisConfig : An array of parameters to RedisConnectionPool::__construct(). @@ -212,7 +213,7 @@ class JobQueueRedis extends JobQueue { if ( $flags & self::QOS_ATOMIC ) { $batches = [ $items ]; // all or nothing } else { - $batches = array_chunk( $items, 100 ); // avoid tying up the server + $batches = array_chunk( $items, self::MAX_PUSH_SIZE ); } $failed = 0; $pushed = 0; diff --git a/includes/jobqueue/JobQueueSecondTestQueue.php b/includes/jobqueue/JobQueueSecondTestQueue.php new file mode 100644 index 0000000000..a1935dfa0d --- /dev/null +++ b/includes/jobqueue/JobQueueSecondTestQueue.php @@ -0,0 +1,280 @@ + $params['wiki'], 'type' => $params['type'] ]; + $this->mainQueue = JobQueue::factory( $params['mainqueue'] + $conf ); + $this->debugQueue = JobQueue::factory( $params['debugqueue'] + $conf ); + + // We need to construct parent after creating the main and debug queue + // because super constructor calls some methods we delegate to the main queue. + parent::__construct( $params ); + } + + /** + * Get the allowed queue orders for configuration validation + * + * @return array Subset of (random, timestamp, fifo, undefined) + */ + protected function supportedOrders() { + return $this->mainQueue->supportedOrders(); + } + + /** + * Get the default queue order to use if configuration does not specify one + * + * @return string One of (random, timestamp, fifo, undefined) + */ + protected function optimalOrder() { + return $this->mainQueue->optimalOrder(); + } + + /** + * Find out if delayed jobs are supported for configuration validation + * + * @return bool Whether delayed jobs are supported + */ + protected function supportsDelayedJobs() { + return $this->mainQueue->supportsDelayedJobs(); + } + + /** + * @see JobQueue::isEmpty() + * @return bool + */ + protected function doIsEmpty() { + return $this->mainQueue->doIsEmpty(); + } + + /** + * @see JobQueue::getSize() + * @return int + */ + protected function doGetSize() { + return $this->mainQueue->doGetSize(); + } + + /** + * @see JobQueue::getAcquiredCount() + * @return int + */ + protected function doGetAcquiredCount() { + return $this->mainQueue->doGetAcquiredCount(); + } + + /** + * @see JobQueue::getDelayedCount() + * @return int + */ + protected function doGetDelayedCount() { + return $this->mainQueue->doGetDelayedCount(); + } + + /** + * @see JobQueue::getAbandonedCount() + * @return int + */ + protected function doGetAbandonedCount() { + return $this->mainQueue->doGetAbandonedCount(); + } + + /** + * @see JobQueue::batchPush() + * @param IJobSpecification[] $jobs + * @param int $flags + */ + protected function doBatchPush( array $jobs, $flags ) { + $this->mainQueue->doBatchPush( $jobs, $flags ); + + try { + $this->debugQueue->doBatchPush( $jobs, $flags ); + } catch ( Exception $exception ) { + MWExceptionHandler::logException( $exception ); + } + } + + /** + * @see JobQueue::pop() + * @return Job|bool + */ + protected function doPop() { + return $this->mainQueue->doPop(); + } + + /** + * @see JobQueue::ack() + * @param Job $job + */ + protected function doAck( Job $job ) { + return $this->mainQueue->doAck( $job ); + } + + /** + * @see JobQueue::deduplicateRootJob() + * @param IJobSpecification $job + * @throws MWException + * @return bool + */ + protected function doDeduplicateRootJob( IJobSpecification $job ) { + return $this->mainQueue->doDeduplicateRootJob( $job ); + } + + /** + * @see JobQueue::isRootJobOldDuplicate() + * @param Job $job + * @return bool + */ + protected function doIsRootJobOldDuplicate( Job $job ) { + return $this->mainQueue->doIsRootJobOldDuplicate( $job ); + } + + /** + * @param string $signature Hash identifier of the root job + * @return string + */ + protected function getRootJobCacheKey( $signature ) { + return $this->mainQueue->getRootJobCacheKey( $signature ); + } + + /** + * @see JobQueue::delete() + * @throws MWException + */ + protected function doDelete() { + return $this->mainQueue->doDelete(); + } + + /** + * @see JobQueue::waitForBackups() + * @return void + */ + protected function doWaitForBackups() { + $this->mainQueue->doWaitForBackups(); + } + + /** + * @see JobQueue::flushCaches() + * @return void + */ + protected function doFlushCaches() { + $this->mainQueue->doFlushCaches(); + } + + /** + * Get an iterator to traverse over all available jobs in this queue. + * This does not include jobs that are currently acquired or delayed. + * Note: results may be stale if the queue is concurrently modified. + * + * @return Iterator + * @throws JobQueueError + */ + public function getAllQueuedJobs() { + return $this->mainQueue->getAllQueuedJobs(); + } + + /** + * Get an iterator to traverse over all delayed jobs in this queue. + * Note: results may be stale if the queue is concurrently modified. + * + * @return Iterator + * @throws JobQueueError + * @since 1.22 + */ + public function getAllDelayedJobs() { + return $this->mainQueue->getAllDelayedJobs(); + } + + /** + * Get an iterator to traverse over all claimed jobs in this queue + * + * Callers should be quick to iterator over it or few results + * will be returned due to jobs being acknowledged and deleted + * + * @return Iterator + * @throws JobQueueError + * @since 1.26 + */ + public function getAllAcquiredJobs() { + return $this->mainQueue->getAllAcquiredJobs(); + } + + /** + * Get an iterator to traverse over all abandoned jobs in this queue + * + * @return Iterator + * @throws JobQueueError + * @since 1.25 + */ + public function getAllAbandonedJobs() { + return $this->mainQueue->getAllAbandonedJobs(); + } + + /** + * Do not use this function outside of JobQueue/JobQueueGroup + * + * @return string + * @since 1.22 + */ + public function getCoalesceLocationInternal() { + return $this->mainQueue->getCoalesceLocationInternal(); + } + + /** + * @see JobQueue::getSiblingQueuesWithJobs() + * @param array $types List of queues types + * @return array|null (list of queue types) or null if unsupported + */ + protected function doGetSiblingQueuesWithJobs( array $types ) { + return $this->mainQueue->doGetSiblingQueuesWithJobs( $types ); + } + + /** + * @see JobQueue::getSiblingQueuesSize() + * @param array $types List of queues types + * @return array|null (list of queue types) or null if unsupported + */ + protected function doGetSiblingQueueSizes( array $types ) { + return $this->mainQueue->doGetSiblingQueueSizes( $types ); + } + + /** + * @throws JobQueueReadOnlyError + */ + protected function assertNotReadOnly() { + $this->mainQueue->assertNotReadOnly(); + } +} diff --git a/includes/jobqueue/JobRunner.php b/includes/jobqueue/JobRunner.php index baff288e85..db881d5eb9 100644 --- a/includes/jobqueue/JobRunner.php +++ b/includes/jobqueue/JobRunner.php @@ -28,6 +28,8 @@ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Wikimedia\ScopedCallback; use Wikimedia\Rdbms\LBFactory; +use Wikimedia\Rdbms\DBError; +use Wikimedia\Rdbms\DBReplicationWaitError; /** * Job queue runner utility methods @@ -36,6 +38,8 @@ use Wikimedia\Rdbms\LBFactory; * @since 1.24 */ class JobRunner implements LoggerAwareInterface { + /** @var Config */ + protected $config; /** @var callable|null Debug output handler */ protected $debug; @@ -72,6 +76,7 @@ class JobRunner implements LoggerAwareInterface { $logger = LoggerFactory::getInstance( 'runJobs' ); } $this->setLogger( $logger ); + $this->config = MediaWikiServices::getInstance()->getMainConfig(); } /** @@ -99,7 +104,8 @@ class JobRunner implements LoggerAwareInterface { * @return array Summary response that can easily be JSON serialized */ public function run( array $options ) { - global $wgJobClasses, $wgTrxProfilerLimits; + $jobClasses = $this->config->get( 'JobClasses' ); + $profilerLimits = $this->config->get( 'TrxProfilerLimits' ); $response = [ 'jobs' => [], 'reached' => 'none-ready' ]; @@ -109,7 +115,7 @@ class JobRunner implements LoggerAwareInterface { $noThrottle = isset( $options['throttle'] ) && !$options['throttle']; // Bail if job type is invalid - if ( $type !== false && !isset( $wgJobClasses[$type] ) ) { + if ( $type !== false && !isset( $jobClasses[$type] ) ) { $response['reached'] = 'none-possible'; return $response; } @@ -134,7 +140,7 @@ class JobRunner implements LoggerAwareInterface { // Catch huge single updates that lead to replica DB lag $trxProfiler = Profiler::instance()->getTransactionProfiler(); $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) ); - $trxProfiler->setExpectations( $wgTrxProfilerLimits['JobRunner'], __METHOD__ ); + $trxProfiler->setExpectations( $profilerLimits['JobRunner'], __METHOD__ ); // Some jobs types should not run until a certain timestamp $backoffs = []; // map of (type => UNIX expiry) @@ -275,7 +281,9 @@ class JobRunner implements LoggerAwareInterface { private function executeJob( Job $job, LBFactory $lbFactory, $stats, $popTime ) { $jType = $job->getType(); $msg = $job->toString() . " STARTING"; - $this->logger->debug( $msg ); + $this->logger->debug( $msg, [ + 'job_type' => $job->getType(), + ] ); $this->debugCallback( $msg ); // Run the job... @@ -287,6 +295,8 @@ class JobRunner implements LoggerAwareInterface { $status = $job->run(); $error = $job->getLastError(); $this->commitMasterChanges( $lbFactory, $job, $fnameTrxOwner ); + // Important: this must be the last deferred update added (T100085, T154425) + DeferredUpdates::addCallableUpdate( [ JobQueueGroup::class, 'pushLazyJobs' ] ); // Run any deferred update tasks; doUpdates() manages transactions itself DeferredUpdates::doUpdates(); } catch ( Exception $e ) { @@ -331,12 +341,23 @@ class JobRunner implements LoggerAwareInterface { } if ( $status === false ) { + $msg = $job->toString() . " t={job_duration} error={job_error}"; + $this->logger->error( $msg, [ + 'job_type' => $job->getType(), + 'job_duration' => $timeMs, + 'job_error' => $error, + ] ); + $msg = $job->toString() . " t=$timeMs error={$error}"; - $this->logger->error( $msg ); $this->debugCallback( $msg ); } else { + $msg = $job->toString() . " t={job_duration} good"; + $this->logger->info( $msg, [ + 'job_type' => $job->getType(), + 'job_duration' => $timeMs, + ] ); + $msg = $job->toString() . " t=$timeMs good"; - $this->logger->info( $msg ); $this->debugCallback( $msg ); } @@ -358,15 +379,13 @@ class JobRunner implements LoggerAwareInterface { * @see $wgJobBackoffThrottling */ private function getBackoffTimeToWait( Job $job ) { - global $wgJobBackoffThrottling; + $throttling = $this->config->get( 'JobBackoffThrottling' ); - if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) || - $job instanceof DuplicateJob // no work was done - ) { + if ( !isset( $throttling[$job->getType()] ) || $job instanceof DuplicateJob ) { return 0; // not throttled } - $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()]; + $itemsPerSecond = $throttling[$job->getType()]; if ( $itemsPerSecond <= 0 ) { return 0; // not throttled } @@ -482,9 +501,14 @@ class JobRunner implements LoggerAwareInterface { } $usedBytes = memory_get_usage(); if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) { + $msg = "Detected excessive memory usage ({used_bytes}/{max_bytes})."; + $this->logger->error( $msg, [ + 'used_bytes' => $usedBytes, + 'max_bytes' => $maxBytes, + ] ); + $msg = "Detected excessive memory usage ($usedBytes/$maxBytes)."; $this->debugCallback( $msg ); - $this->logger->error( $msg ); return false; } @@ -514,17 +538,17 @@ class JobRunner implements LoggerAwareInterface { * @throws DBError */ private function commitMasterChanges( LBFactory $lbFactory, Job $job, $fnameTrxOwner ) { - global $wgJobSerialCommitThreshold; + $syncThreshold = $this->config->get( 'JobSerialCommitThreshold' ); $time = false; $lb = $lbFactory->getMainLB( wfWikiID() ); - if ( $wgJobSerialCommitThreshold !== false && $lb->getServerCount() > 1 ) { + if ( $syncThreshold !== false && $lb->getServerCount() > 1 ) { // Generally, there is one master connection to the local DB $dbwSerial = $lb->getAnyOpenConnection( $lb->getWriterIndex() ); // We need natively blocking fast locks if ( $dbwSerial && $dbwSerial->namedLocksEnqueue() ) { $time = $dbwSerial->pendingWriteQueryDuration( $dbwSerial::ESTIMATE_DB_APPLY ); - if ( $time < $wgJobSerialCommitThreshold ) { + if ( $time < $syncThreshold ) { $dbwSerial = false; } } else { @@ -536,13 +560,24 @@ class JobRunner implements LoggerAwareInterface { } if ( !$dbwSerial ) { - $lbFactory->commitMasterChanges( $fnameTrxOwner ); + $lbFactory->commitMasterChanges( + $fnameTrxOwner, + // Abort if any transaction was too big + [ 'maxWriteDuration' => $this->config->get( 'MaxJobDBWriteDuration' ) ] + ); + return; } $ms = intval( 1000 * $time ); + + $msg = $job->toString() . " COMMIT ENQUEUED [{job_commit_write_ms}ms of writes]"; + $this->logger->info( $msg, [ + 'job_type' => $job->getType(), + 'job_commit_write_ms' => $ms, + ] ); + $msg = $job->toString() . " COMMIT ENQUEUED [{$ms}ms of writes]"; - $this->logger->info( $msg ); $this->debugCallback( $msg ); // Wait for an exclusive lock to commit @@ -561,7 +596,11 @@ class JobRunner implements LoggerAwareInterface { } // Actually commit the DB master changes - $lbFactory->commitMasterChanges( $fnameTrxOwner ); + $lbFactory->commitMasterChanges( + $fnameTrxOwner, + // Abort if any transaction was too big + [ 'maxWriteDuration' => $this->config->get( 'MaxJobDBWriteDuration' ) ] + ); ScopedCallback::consume( $unlocker ); } } diff --git a/includes/jobqueue/aggregator/JobQueueAggregator.php b/includes/jobqueue/aggregator/JobQueueAggregator.php index 41699748ee..7ce2c74fc2 100644 --- a/includes/jobqueue/aggregator/JobQueueAggregator.php +++ b/includes/jobqueue/aggregator/JobQueueAggregator.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** diff --git a/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php b/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php index d9457c603f..db07086f21 100644 --- a/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php +++ b/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; diff --git a/includes/jobqueue/jobs/ActivityUpdateJob.php b/includes/jobqueue/jobs/ActivityUpdateJob.php index 6357967638..da4ec2336d 100644 --- a/includes/jobqueue/jobs/ActivityUpdateJob.php +++ b/includes/jobqueue/jobs/ActivityUpdateJob.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz * @ingroup JobQueue */ diff --git a/includes/jobqueue/jobs/RecentChangesUpdateJob.php b/includes/jobqueue/jobs/RecentChangesUpdateJob.php index 5c733088ee..6f349d4447 100644 --- a/includes/jobqueue/jobs/RecentChangesUpdateJob.php +++ b/includes/jobqueue/jobs/RecentChangesUpdateJob.php @@ -16,10 +16,10 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz * @ingroup JobQueue */ use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\DBReplicationWaitError; /** * Job for pruning recent changes @@ -86,14 +86,21 @@ class RecentChangesUpdateJob extends Job { $ticket = $factory->getEmptyTransactionTicket( __METHOD__ ); $cutoff = $dbw->timestamp( time() - $wgRCMaxAge ); do { - $rcIds = $dbw->selectFieldValues( 'recentchanges', - 'rc_id', + $rcIds = []; + $rows = []; + $res = $dbw->select( 'recentchanges', + RecentChange::selectFields(), [ 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ], __METHOD__, [ 'LIMIT' => $wgUpdateRowsPerQuery ] ); + foreach ( $res as $row ) { + $rcIds[] = $row->rc_id; + $rows[] = $row; + } if ( $rcIds ) { $dbw->delete( 'recentchanges', [ 'rc_id' => $rcIds ], __METHOD__ ); + Hooks::run( 'RecentChangesPurgeRows', [ $rows ] ); // There might be more, so try waiting for replica DBs try { $factory->commitAndWaitForReplication( @@ -230,7 +237,6 @@ class RecentChangesUpdateJob extends Job { ], __METHOD__ ); - }, __METHOD__ ); diff --git a/includes/jobqueue/jobs/RefreshLinksJob.php b/includes/jobqueue/jobs/RefreshLinksJob.php index f9284a57ce..02bb829e1a 100644 --- a/includes/jobqueue/jobs/RefreshLinksJob.php +++ b/includes/jobqueue/jobs/RefreshLinksJob.php @@ -21,6 +21,7 @@ * @ingroup JobQueue */ use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\DBReplicationWaitError; /** * Job to update link tables for pages @@ -86,7 +87,7 @@ class RefreshLinksJob extends Job { // When the base job branches, wait for the replica DBs to catch up to the master. // From then on, we know that any template changes at the time the base job was // enqueued will be reflected in backlink page parses when the leaf jobs run. - if ( !isset( $params['range'] ) ) { + if ( !isset( $this->params['range'] ) ) { try { $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); $lbFactory->waitForReplication( [ @@ -112,7 +113,7 @@ class RefreshLinksJob extends Job { JobQueueGroup::singleton()->push( $jobs ); // Job to update link tables for a set of titles } elseif ( isset( $this->params['pages'] ) ) { - foreach ( $this->params['pages'] as $pageId => $nsAndKey ) { + foreach ( $this->params['pages'] as $nsAndKey ) { list( $ns, $dbKey ) = $nsAndKey; $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) ); } @@ -252,7 +253,7 @@ class RefreshLinksJob extends Job { // This avoids snapshot-clearing errors in LinksUpdate::acquirePageLock(). $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket ); - foreach ( $updates as $key => $update ) { + foreach ( $updates as $update ) { // FIXME: This code probably shouldn't be here? // Needed by things like Echo notifications which need // to know which user caused the links update diff --git a/includes/jobqueue/jobs/ThumbnailRenderJob.php b/includes/jobqueue/jobs/ThumbnailRenderJob.php index 081e1141b1..cf3155d7a8 100644 --- a/includes/jobqueue/jobs/ThumbnailRenderJob.php +++ b/includes/jobqueue/jobs/ThumbnailRenderJob.php @@ -77,7 +77,7 @@ class ThumbnailRenderJob extends Job { } } - protected function hitThumbUrl( $file, $transformParams, &$thumbUrl ) { + protected function hitThumbUrl( LocalFile $file, $transformParams, &$thumbUrl ) { global $wgUploadThumbnailRenderHttpCustomHost, $wgUploadThumbnailRenderHttpCustomDomain; $thumbName = $file->thumbName( $transformParams ); diff --git a/includes/jobqueue/utils/BacklinkJobUtils.php b/includes/jobqueue/utils/BacklinkJobUtils.php index 1c12a1c9b4..76f8d6d2ac 100644 --- a/includes/jobqueue/utils/BacklinkJobUtils.php +++ b/includes/jobqueue/utils/BacklinkJobUtils.php @@ -19,7 +19,6 @@ * * @file * @ingroup JobQueue - * @author Aaron Schulz */ /** diff --git a/includes/jobqueue/utils/PurgeJobUtils.php b/includes/jobqueue/utils/PurgeJobUtils.php index d76d8661b4..ba80c8e450 100644 --- a/includes/jobqueue/utils/PurgeJobUtils.php +++ b/includes/jobqueue/utils/PurgeJobUtils.php @@ -20,6 +20,7 @@ * * @file */ +use Wikimedia\Rdbms\IDatabase; use MediaWiki\MediaWikiServices; class PurgeJobUtils { diff --git a/includes/libs/ArrayUtils.php b/includes/libs/ArrayUtils.php index 2156bd7f1d..0413ea0d5a 100644 --- a/includes/libs/ArrayUtils.php +++ b/includes/libs/ArrayUtils.php @@ -39,7 +39,7 @@ class ArrayUtils { * justification for breaking compatibility with installations * compiled with ./configure --disable-hash. * - * @param array $array Array to sort + * @param array &$array Array to sort * @param string $key * @param string $separator A separator used to delimit the array elements and the * key. This can be chosen to provide backwards compatibility with diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php index b1cece8488..cd80066558 100644 --- a/includes/libs/CSSMin.php +++ b/includes/libs/CSSMin.php @@ -38,7 +38,7 @@ class CSSMin { * Internet Explorer data URI length limit. See encodeImageAsDataURI(). */ const DATA_URI_SIZE_LIMIT = 32768; - const URL_REGEX = 'url\(\s*[\'"]?(?P[^\?\)\'"]*?)(?P\?[^\)\'"]*?|)[\'"]?\s*\)'; + const EMBED_REGEX = '\/\*\s*\@embed\s*\*\/'; const COMMENT_REGEX = '\/\*.*?\*\/'; @@ -72,12 +72,18 @@ class CSSMin { $files = []; $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER; - if ( preg_match_all( '/' . self::URL_REGEX . '/', $stripped, $matches, $rFlags ) ) { + if ( preg_match_all( '/' . self::getUrlRegex() . '/', $stripped, $matches, $rFlags ) ) { foreach ( $matches as $match ) { + self::processUrlMatch( $match, $rFlags ); $url = $match['file'][0]; // Skip fully-qualified and protocol-relative URLs and data URIs - if ( substr( $url, 0, 2 ) === '//' || parse_url( $url, PHP_URL_SCHEME ) ) { + // Also skips the rare `behavior` property specifying application's default behavior + if ( + substr( $url, 0, 2 ) === '//' || + parse_url( $url, PHP_URL_SCHEME ) || + substr( $url, 0, 9 ) === '#default#' + ) { break; } @@ -176,23 +182,13 @@ class CSSMin { * @return bool|string */ public static function getMimeType( $file ) { - $realpath = realpath( $file ); - if ( - $realpath - && function_exists( 'finfo_file' ) - && function_exists( 'finfo_open' ) - && defined( 'FILEINFO_MIME_TYPE' ) - ) { - return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath ); - } - // Infer the MIME-type from the file extension $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) ); if ( isset( self::$mimeTypes[$ext] ) ) { return self::$mimeTypes[$ext]; } - return false; + return mime_content_type( realpath( $file ) ); } /** @@ -251,7 +247,7 @@ class CSSMin { // quotation marks (e.g. "foo /* bar"). $comments = []; - $pattern = '/(?!' . CSSMin::EMBED_REGEX . ')(' . CSSMin::COMMENT_REGEX . ')/s'; + $pattern = '/(?!' . self::EMBED_REGEX . ')(' . self::COMMENT_REGEX . ')/s'; $source = preg_replace_callback( $pattern, @@ -266,7 +262,7 @@ class CSSMin { // appears in the rule itself, e.g. in a quoted string. You are advised // not to use such characters in file names. We also match start/end of // the string to be consistent in edge-cases ('@import url(…)'). - $pattern = '/(?:^|[;{])\K[^;{}]*' . CSSMin::URL_REGEX . '[^;}]*(?=[;}]|$)/'; + $pattern = '/(?:^|[;{])\K[^;{}]*' . self::getUrlRegex() . '[^;}]*(?=[;}]|$)/'; $source = preg_replace_callback( $pattern, @@ -290,13 +286,14 @@ class CSSMin { // Build two versions of current rule: with remapped URLs // and with embedded data: URIs (where possible). - $pattern = '/(?P' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/'; + $pattern = '/(?P' . CSSMin::EMBED_REGEX . '\s*|)' . self::getUrlRegex() . '/'; $ruleWithRemapped = preg_replace_callback( $pattern, function ( $match ) use ( $local, $remote ) { - $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false ); + self::processUrlMatch( $match ); + $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false ); return CSSMin::buildUrlValue( $remapped ); }, $rule @@ -309,6 +306,8 @@ class CSSMin { $ruleWithEmbedded = preg_replace_callback( $pattern, function ( $match ) use ( $embedAll, $local, $remote, &$mimeTypes ) { + self::processUrlMatch( $match ); + $embed = $embedAll || $match['embed']; $embedded = CSSMin::remapOne( $match['file'], @@ -351,8 +350,8 @@ class CSSMin { }, $source ); // Re-insert comments - $pattern = '/' . CSSMin::PLACEHOLDER . '(\d+)x/'; - $source = preg_replace_callback( $pattern, function( $match ) use ( &$comments ) { + $pattern = '/' . self::PLACEHOLDER . '(\d+)x/'; + $source = preg_replace_callback( $pattern, function ( $match ) use ( &$comments ) { return $comments[ $match[1] ]; }, $source ); @@ -385,6 +384,72 @@ class CSSMin { return false; } + /** + * @codeCoverageIgnore + */ + private static function getUrlRegex() { + static $urlRegex; + if ( $urlRegex === null ) { + // Match these three variants separately to avoid broken urls when + // e.g. a double quoted url contains a parenthesis, or when a + // single quoted url contains a double quote, etc. + // Note: PCRE doesn't support multiple capture groups with the same name by default. + // - PCRE 6.7 introduced the "J" modifier (PCRE_INFO_JCHANGED for PCRE_DUPNAMES). + // https://secure.php.net/manual/en/reference.pcre.pattern.modifiers.php + // However this isn't useful since it just ignores all but the first one. + // Also, while the modifier was introduced in PCRE 6.7 (PHP 5.2+) it was + // not exposed to public preg_* functions until PHP 5.6.0. + // - PCRE 8.36 fixed this to work as expected (e.g. merge conceptually to + // only return the one matched in the part that actually matched). + // However MediaWiki supports 5.5.9, which has PCRE 8.32 + // Per https://secure.php.net/manual/en/pcre.installation.php: + // - PCRE 8.32 (PHP 5.5.0) + // - PCRE 8.34 (PHP 5.5.10, PHP 5.6.0) + // - PCRE 8.37 (PHP 5.5.26, PHP 5.6.9, PHP 7.0.0) + // Workaround by using different groups and merge via processUrlMatch(). + // - Using string concatenation for class constant or member assignments + // is only supported in PHP 5.6. Use a getter method for now. + $urlRegex = '(' . + // Unquoted url + 'url\(\s*(?P[^\'"][^\?\)]*?)(?P\?[^\)]*?|)\s*\)' . + // Single quoted url + '|url\(\s*\'(?P[^\?\']*?)(?P\?[^\']*?|)\'\s*\)' . + // Double quoted url + '|url\(\s*"(?P[^\?"]*?)(?P\?[^"]*?|)"\s*\)' . + ')'; + } + return $urlRegex; + } + + private static function processUrlMatch( array &$match, $flags = 0 ) { + if ( $flags & PREG_SET_ORDER ) { + // preg_match_all with PREG_SET_ORDER will return each group in each + // match array, and if it didn't match, instead of the sub array + // being an empty array it is `[ '', -1 ]`... + if ( isset( $match['file0'] ) && $match['file0'][1] !== -1 ) { + $match['file'] = $match['file0']; + $match['query'] = $match['query0']; + } elseif ( isset( $match['file1'] ) && $match['file1'][1] !== -1 ) { + $match['file'] = $match['file1']; + $match['query'] = $match['query1']; + } else { + $match['file'] = $match['file2']; + $match['query'] = $match['query2']; + } + } else { + if ( isset( $match['file0'] ) && $match['file0'] !== '' ) { + $match['file'] = $match['file0']; + $match['query'] = $match['query0']; + } elseif ( isset( $match['file1'] ) && $match['file1'] !== '' ) { + $match['file'] = $match['file1']; + $match['query'] = $match['query1']; + } else { + $match['file'] = $match['file2']; + $match['query'] = $match['query2']; + } + } + } + /** * Remap or embed a CSS URL path. * @@ -407,7 +472,12 @@ class CSSMin { // Pass thru fully-qualified and protocol-relative URLs and data URIs, as well as local URLs if // we can't expand them. - if ( self::isRemoteUrl( $url ) || self::isLocalUrl( $url ) ) { + // Also skips the rare `behavior` property specifying application's default behavior + if ( + self::isRemoteUrl( $url ) || + self::isLocalUrl( $url ) || + substr( $url, 0, 9 ) === '#default#' + ) { return $url; } diff --git a/includes/libs/CryptRand.php b/includes/libs/CryptRand.php index 0d3613ae23..859d58b5dd 100644 --- a/includes/libs/CryptRand.php +++ b/includes/libs/CryptRand.php @@ -234,7 +234,6 @@ class CryptRand { * @return string Raw binary random data */ public function generate( $bytes, $forceStrong = false ) { - $bytes = floor( $bytes ); static $buffer = ''; if ( is_null( $this->strong ) ) { @@ -247,8 +246,11 @@ class CryptRand { // On Linux, getrandom syscall will be used if available. // On Windows CryptGenRandom will always be used // On other platforms, /dev/urandom will be used. + // Avoids polyfills from before php 7.0 // All error situations will throw Exceptions and or Errors - if ( function_exists( 'random_bytes' ) ) { + if ( PHP_VERSION_ID >= 70000 + || ( defined( 'HHVM_VERSION_ID' ) && HHVM_VERSION_ID >= 31101 ) + ) { $rem = $bytes - strlen( $buffer ); $buffer .= random_bytes( $rem ); } diff --git a/includes/libs/DnsSrvDiscoverer.php b/includes/libs/DnsSrvDiscoverer.php new file mode 100644 index 0000000000..ce8a2044f5 --- /dev/null +++ b/includes/libs/DnsSrvDiscoverer.php @@ -0,0 +1,108 @@ +domain = $domain; + } + + /** + * Fetch the servers with a DNS SRV request + * + * @return array + */ + public function getServers() { + $result = []; + foreach ( $this->getDnsRecords() as $record ) { + $result[] = [ + 'target' => $record['target'], + 'port' => $record['port'], + 'pri' => $record['pri'], + 'weight' => $record['weight'], + ]; + } + + return $result; + } + + /** + * Pick a server according to the priority fields. + * Note that weight is currently ignored. + * + * @param array $servers from getServers + * @return array|bool + */ + public function pickServer( array $servers ) { + if ( !$servers ) { + return false; + } + + $srvsByPrio = []; + foreach ( $servers as $server ) { + $srvsByPrio[$server['pri']][] = $server; + } + + $min = min( array_keys( $srvsByPrio ) ); + if ( count( $srvsByPrio[$min] ) == 1 ) { + return $srvsByPrio[$min][0]; + } else { + // Choose randomly + $rand = mt_rand( 0, count( $srvsByPrio[$min] ) - 1 ); + + return $srvsByPrio[$min][$rand]; + } + } + + /** + * @param array $server + * @param array $servers + * @return array[] + */ + public function removeServer( $server, array $servers ) { + foreach ( $servers as $i => $srv ) { + if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) { + unset( $servers[$i] ); + break; + } + } + + return array_values( $servers ); + } + + /** + * @return array[] + */ + protected function getDnsRecords() { + return dns_get_record( $this->domain, DNS_SRV ); + } +} diff --git a/includes/libs/GenericArrayObject.php b/includes/libs/GenericArrayObject.php index 76e23cfd50..f76d9a2e8d 100644 --- a/includes/libs/GenericArrayObject.php +++ b/includes/libs/GenericArrayObject.php @@ -67,7 +67,6 @@ abstract class GenericArrayObject extends ArrayObject { } /** - * Constructor. * @see ArrayObject::__construct * * @since 1.20 diff --git a/includes/libs/HashRing.php b/includes/libs/HashRing.php index 4ddb8131d5..a4aabcd3fe 100644 --- a/includes/libs/HashRing.php +++ b/includes/libs/HashRing.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** @@ -179,7 +178,7 @@ class HashRing { if ( $this->liveRing === null || $this->ejectionNextExpiry <= $now ) { $this->ejectionExpiries = array_filter( $this->ejectionExpiries, - function( $expiry ) use ( $now ) { + function ( $expiry ) use ( $now ) { return ( $expiry > $now ); } ); diff --git a/includes/libs/IEUrlExtension.php b/includes/libs/IEUrlExtension.php index 4a6e3fb168..2d1c58b66a 100644 --- a/includes/libs/IEUrlExtension.php +++ b/includes/libs/IEUrlExtension.php @@ -63,8 +63,8 @@ class IEUrlExtension { // Check QUERY_STRING or REQUEST_URI if ( isset( $vars['SERVER_SOFTWARE'] ) && isset( $vars['REQUEST_URI'] ) - && self::haveUndecodedRequestUri( $vars['SERVER_SOFTWARE'] ) ) - { + && self::haveUndecodedRequestUri( $vars['SERVER_SOFTWARE'] ) + ) { $urlPart = $vars['REQUEST_URI']; } elseif ( isset( $vars['QUERY_STRING'] ) ) { $urlPart = $vars['QUERY_STRING']; @@ -79,8 +79,8 @@ class IEUrlExtension { // Some servers have PATH_INFO but not REQUEST_URI, so we check both // to be on the safe side. if ( isset( $vars['PATH_INFO'] ) - && self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist ) ) - { + && self::isUrlExtensionBad( $vars['PATH_INFO'], $extWhitelist ) + ) { return true; } @@ -133,8 +133,8 @@ class IEUrlExtension { /** * Returns a variant of $url which will pass isUrlExtensionBad() but has the * same GET parameters, or false if it can't figure one out. - * @param $url - * @param $extWhitelist array + * @param string $url + * @param array $extWhitelist * @return bool|string */ public static function fixUrlForIE6( $url, $extWhitelist = [] ) { @@ -223,8 +223,8 @@ class IEUrlExtension { // If the extension is NOT exe, dll or cgi, return it $extension = substr( $url, $pos, $nextPos - $pos ); if ( strcasecmp( $extension, 'exe' ) && strcasecmp( $extension, 'dll' ) && - strcasecmp( $extension, 'cgi' ) ) - { + strcasecmp( $extension, 'cgi' ) + ) { return $extension; } // Else continue looking @@ -251,7 +251,7 @@ class IEUrlExtension { * or a specification in the style of a User-Agent header, such as * "Apache/1.3.34 (Unix) mod_ssl/2.8.25 OpenSSL/0.9.8a PHP/4.4.2" * - * @param $serverSoftware + * @param string $serverSoftware * @return bool */ public static function haveUndecodedRequestUri( $serverSoftware ) { diff --git a/includes/libs/IP.php b/includes/libs/IP.php index a6aa0a3f88..b22f06d387 100644 --- a/includes/libs/IP.php +++ b/includes/libs/IP.php @@ -18,7 +18,7 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Antoine Musso "", Aaron Schulz + * @author Antoine Musso "" */ use IPSet\IPSet; @@ -549,7 +549,7 @@ class IP { */ private static function parseCIDR6( $range ) { # Explode into - $parts = explode( '/', IP::sanitizeIP( $range ), 2 ); + $parts = explode( '/', self::sanitizeIP( $range ), 2 ); if ( count( $parts ) != 2 ) { return [ false, false ]; } @@ -590,7 +590,7 @@ class IP { */ private static function parseRange6( $range ) { # Expand any IPv6 IP - $range = IP::sanitizeIP( $range ); + $range = self::sanitizeIP( $range ); // CIDR notation... if ( strpos( $range, '/' ) !== false ) { list( $network, $bits ) = self::parseCIDR6( $range ); @@ -732,8 +732,8 @@ class IP { public static function getSubnet( $ip ) { $matches = []; $subnet = false; - if ( IP::isIPv6( $ip ) ) { - $parts = IP::parseRange( "$ip/64" ); + if ( self::isIPv6( $ip ) ) { + $parts = self::parseRange( "$ip/64" ); $subnet = $parts[0]; } elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) { // IPv4 diff --git a/includes/libs/MappedIterator.php b/includes/libs/MappedIterator.php index 73ffb14747..d60af343c0 100644 --- a/includes/libs/MappedIterator.php +++ b/includes/libs/MappedIterator.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** diff --git a/includes/libs/MemoizedCallable.php b/includes/libs/MemoizedCallable.php index 12a5cadb99..90c7a644c5 100644 --- a/includes/libs/MemoizedCallable.php +++ b/includes/libs/MemoizedCallable.php @@ -1,4 +1,24 @@ $key = $options[$key]; } } + if ( $this->logger === null ) { + $this->logger = new NullLogger; + } } /** @@ -162,6 +171,7 @@ class MultiHttpClient { } elseif ( !isset( $req['url'] ) ) { throw new Exception( "Request has no 'url' field set." ); } + $this->logger->debug( "{$req['method']}: {$req['url']}" ); $req['query'] = isset( $req['query'] ) ? $req['query'] : []; $headers = []; // normalized headers if ( isset( $req['headers'] ) ) { @@ -235,6 +245,8 @@ class MultiHttpClient { if ( function_exists( 'curl_strerror' ) ) { $req['response']['error'] .= " " . curl_strerror( $errno ); } + $this->logger->warning( "Error fetching URL \"{$req['url']}\": " . + $req['response']['error'] ); } } else { $req['response']['error'] = "(curl error: no status set)"; @@ -263,7 +275,7 @@ class MultiHttpClient { } /** - * @param array $req HTTP request map + * @param array &$req HTTP request map * @param array $opts * - connTimeout : default connection timeout * - reqTimeout : default request timeout @@ -420,6 +432,15 @@ class MultiHttpClient { return $this->multiHandle; } + /** + * Register a logger + * + * @param LoggerInterface $logger + */ + public function setLogger( LoggerInterface $logger ) { + $this->logger = $logger; + } + function __destruct() { if ( $this->multiHandle ) { curl_multi_close( $this->multiHandle ); diff --git a/includes/libs/ObjectFactory.php b/includes/libs/ObjectFactory.php index c96a8a1643..6c47c3cafa 100644 --- a/includes/libs/ObjectFactory.php +++ b/includes/libs/ObjectFactory.php @@ -21,8 +21,7 @@ /** * Construct objects from configuration instructions. * - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors */ class ObjectFactory { diff --git a/includes/libs/StatusValue.php b/includes/libs/StatusValue.php index e860ec491f..f9dcc1b52e 100644 --- a/includes/libs/StatusValue.php +++ b/includes/libs/StatusValue.php @@ -40,17 +40,22 @@ * @since 1.25 */ class StatusValue { + /** @var bool */ protected $ok = true; - /** @var array */ + + /** @var array[] */ protected $errors = []; /** @var mixed */ public $value; - /** @var array Map of (key => bool) to indicate success of each part of batch operations */ + + /** @var bool[] Map of (key => bool) to indicate success of each part of batch operations */ public $success = []; + /** @var int Counter for batch operations */ public $successCount = 0; + /** @var int Counter for batch operations */ public $failCount = 0; @@ -138,7 +143,7 @@ class StatusValue { * * Each error is a (message:string or MessageSpecifier,params:array) map * - * @return array + * @return array[] */ public function getErrors() { return $this->errors; @@ -230,7 +235,7 @@ class StatusValue { * - params: array list of parameters * * @param string $type - * @return array + * @return array[] */ public function getErrorsByType( $type ) { $result = []; diff --git a/includes/libs/StringUtils.php b/includes/libs/StringUtils.php index cffb5a3945..9638706dc2 100644 --- a/includes/libs/StringUtils.php +++ b/includes/libs/StringUtils.php @@ -276,7 +276,7 @@ class StringUtils { // Replace instances of the separator inside HTML-like tags with the placeholder $replacer = new DoubleReplacer( $separator, $placeholder ); - $cleaned = StringUtils::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text ); + $cleaned = self::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text ); // Explode, then put the replaced separators back in $items = explode( $separator, $cleaned ); @@ -303,7 +303,7 @@ class StringUtils { // Replace instances of the separator inside HTML-like tags with the placeholder $replacer = new DoubleReplacer( $search, $placeholder ); - $cleaned = StringUtils::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text ); + $cleaned = self::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text ); // Explode, then put the replaced separators back in $cleaned = str_replace( $search, $replace, $cleaned ); diff --git a/includes/libs/XhprofData.php b/includes/libs/XhprofData.php index c6da432eff..2383d2adc4 100644 --- a/includes/libs/XhprofData.php +++ b/includes/libs/XhprofData.php @@ -25,8 +25,7 @@ use RunningStat\RunningStat; * . XHProf can be installed as a PECL * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0. * - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors * @since 1.28 */ class XhprofData { diff --git a/includes/libs/composer/ComposerInstalled.php b/includes/libs/composer/ComposerInstalled.php index 9f15078c64..ef2b768d0b 100644 --- a/includes/libs/composer/ComposerInstalled.php +++ b/includes/libs/composer/ComposerInstalled.php @@ -28,7 +28,7 @@ class ComposerInstalled { 'type' => $installed['type'], 'licenses' => isset( $installed['license'] ) ? $installed['license'] : [], 'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [], - 'description' => isset( $installed['description'] ) ? $installed['description']: '', + 'description' => isset( $installed['description'] ) ? $installed['description'] : '', ]; } diff --git a/includes/libs/composer/ComposerLock.php b/includes/libs/composer/ComposerLock.php index 818ccdf3a2..dc8bc035b2 100644 --- a/includes/libs/composer/ComposerLock.php +++ b/includes/libs/composer/ComposerLock.php @@ -28,7 +28,7 @@ class ComposerLock { 'type' => $installed['type'], 'licenses' => isset( $installed['license'] ) ? $installed['license'] : [], 'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [], - 'description' => isset( $installed['description'] ) ? $installed['description']: '', + 'description' => isset( $installed['description'] ) ? $installed['description'] : '', ]; } diff --git a/includes/libs/eventrelayer/EventRelayer.php b/includes/libs/eventrelayer/EventRelayer.php index 304f6c12b8..0cc9b3d2e1 100644 --- a/includes/libs/eventrelayer/EventRelayer.php +++ b/includes/libs/eventrelayer/EventRelayer.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; use Psr\Log\LoggerAwareInterface; diff --git a/includes/libs/eventrelayer/EventRelayerNull.php b/includes/libs/eventrelayer/EventRelayerNull.php index b8ec55fc5d..d933dd4204 100644 --- a/includes/libs/eventrelayer/EventRelayerNull.php +++ b/includes/libs/eventrelayer/EventRelayerNull.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/FSFileBackend.php b/includes/libs/filebackend/FSFileBackend.php index 4f0805bd2a..30548ef0c0 100644 --- a/includes/libs/filebackend/FSFileBackend.php +++ b/includes/libs/filebackend/FSFileBackend.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ use Wikimedia\Timestamp\ConvertibleTimestamp; diff --git a/includes/libs/filebackend/FileBackend.php b/includes/libs/filebackend/FileBackend.php index 15f13b9b89..51308c1371 100644 --- a/includes/libs/filebackend/FileBackend.php +++ b/includes/libs/filebackend/FileBackend.php @@ -26,7 +26,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; @@ -1592,7 +1591,7 @@ abstract class FileBackend implements LoggerAwareInterface { * - StatusValue::newGood() if this method is called without parameters * - StatusValue::newFatal() with all parameters to this method if passed in * - * @param ... string + * @param string $args,... * @return StatusValue */ final protected function newStatus() { diff --git a/includes/libs/filebackend/FileBackendMultiWrite.php b/includes/libs/filebackend/FileBackendMultiWrite.php index 53bce33dad..f8ca7e5aef 100644 --- a/includes/libs/filebackend/FileBackendMultiWrite.php +++ b/includes/libs/filebackend/FileBackendMultiWrite.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** @@ -196,7 +195,7 @@ class FileBackendMultiWrite extends FileBackend { if ( $this->asyncWrites && !$this->hasVolatileSources( $ops ) ) { // Bind $scopeLock to the callback to preserve locks DeferredUpdates::addCallableUpdate( - function() use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) { + function () use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) { wfDebugLog( 'FileOperationReplication', "'{$backend->getName()}' async replication; paths: " . FormatJson::encode( $relevantPaths ) ); @@ -508,7 +507,7 @@ class FileBackendMultiWrite extends FileBackend { $realOps = $this->substOpBatchPaths( $ops, $backend ); if ( $this->asyncWrites && !$this->hasVolatileSources( $ops ) ) { DeferredUpdates::addCallableUpdate( - function() use ( $backend, $realOps ) { + function () use ( $backend, $realOps ) { $backend->doQuickOperations( $realOps ); } ); @@ -562,7 +561,7 @@ class FileBackendMultiWrite extends FileBackend { $realParams = $this->substOpPaths( $params, $backend ); if ( $this->asyncWrites ) { DeferredUpdates::addCallableUpdate( - function() use ( $backend, $method, $realParams ) { + function () use ( $backend, $method, $realParams ) { $backend->$method( $realParams ); } ); diff --git a/includes/libs/filebackend/FileBackendStore.php b/includes/libs/filebackend/FileBackendStore.php index 7cb26c6c65..77473d139c 100644 --- a/includes/libs/filebackend/FileBackendStore.php +++ b/includes/libs/filebackend/FileBackendStore.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ use Wikimedia\Timestamp\ConvertibleTimestamp; @@ -1200,21 +1199,20 @@ abstract class FileBackendStore extends FileBackend { * to the order in which the handles where given. * * @param FileBackendStoreOpHandle[] $fileOpHandles - * - * @throws FileBackendError * @return StatusValue[] Map of StatusValue objects + * @throws FileBackendError */ final public function executeOpHandlesInternal( array $fileOpHandles ) { $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" ); foreach ( $fileOpHandles as $fileOpHandle ) { if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) { - throw new InvalidArgumentException( "Got a non-FileBackendStoreOpHandle object." ); + throw new InvalidArgumentException( "Expected FileBackendStoreOpHandle object." ); } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) { - throw new InvalidArgumentException( - "Got a FileBackendStoreOpHandle for the wrong backend." ); + throw new InvalidArgumentException( "Expected handle for this file backend." ); } } + $res = $this->doExecuteOpHandlesInternal( $fileOpHandles ); foreach ( $fileOpHandles as $fileOpHandle ) { $fileOpHandle->closeResources(); @@ -1842,14 +1840,8 @@ abstract class FileBackendStore extends FileBackend { return call_user_func_array( $this->mimeCallback, func_get_args() ); } - $mime = null; - if ( $fsPath !== null && function_exists( 'finfo_file' ) ) { - $finfo = finfo_open( FILEINFO_MIME_TYPE ); - $mime = finfo_file( $finfo, $fsPath ); - finfo_close( $finfo ); - } - - return is_string( $mime ) ? $mime : 'unknown/unknown'; + $mime = ( $fsPath !== null ) ? mime_content_type( $fsPath ) : false; + return $mime ?: 'unknown/unknown'; } } diff --git a/includes/libs/filebackend/FileOpBatch.php b/includes/libs/filebackend/FileOpBatch.php index 71b5c7d575..2324098dc2 100644 --- a/includes/libs/filebackend/FileOpBatch.php +++ b/includes/libs/filebackend/FileOpBatch.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/MemoryFileBackend.php b/includes/libs/filebackend/MemoryFileBackend.php index 44fe2cbac6..0341a2af1d 100644 --- a/includes/libs/filebackend/MemoryFileBackend.php +++ b/includes/libs/filebackend/MemoryFileBackend.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/SwiftFileBackend.php b/includes/libs/filebackend/SwiftFileBackend.php index 631f6fd6fa..eb72edc2ed 100644 --- a/includes/libs/filebackend/SwiftFileBackend.php +++ b/includes/libs/filebackend/SwiftFileBackend.php @@ -20,7 +20,6 @@ * @file * @ingroup FileBackend * @author Russ Nelson - * @author Aaron Schulz */ /** @@ -35,25 +34,20 @@ class SwiftFileBackend extends FileBackendStore { /** @var MultiHttpClient */ protected $http; - /** @var int TTL in seconds */ protected $authTTL; - /** @var string Authentication base URL (without version) */ protected $swiftAuthUrl; - + /** @var string Override of storage base URL */ + protected $swiftStorageUrl; /** @var string Swift user (account:user) to authenticate as */ protected $swiftUser; - /** @var string Secret key for user */ protected $swiftKey; - /** @var string Shared secret value for making temp URLs */ protected $swiftTempUrlKey; - /** @var string S3 access key (RADOS Gateway) */ protected $rgwS3AccessKey; - /** @var string S3 authentication key (RADOS Gateway) */ protected $rgwS3SecretKey; @@ -65,10 +59,8 @@ class SwiftFileBackend extends FileBackendStore { /** @var array */ protected $authCreds; - /** @var int UNIX timestamp */ protected $authSessionTimestamp = 0; - /** @var int UNIX timestamp */ protected $authErrorTimestamp = null; @@ -77,13 +69,15 @@ class SwiftFileBackend extends FileBackendStore { /** * @see FileBackendStore::__construct() - * Additional $config params include: + * @param array $config Params include: * - swiftAuthUrl : Swift authentication server URL * - swiftUser : Swift user used by MediaWiki (account:username) * - swiftKey : Swift authentication key for the above user * - swiftAuthTTL : Swift authentication TTL (seconds) * - swiftTempUrlKey : Swift "X-Account-Meta-Temp-URL-Key" value on the account. * Do not set this until it has been set in the backend. + * - swiftStorageUrl : Swift storage URL (overrides that of the authentication response). + * This is useful to set if a TLS proxy is in use. * - shardViaHashLevels : Map of container names to sharding config with: * - base : base of hash characters, 16 or 36 * - levels : the number of hash levels (and digits) @@ -116,6 +110,9 @@ class SwiftFileBackend extends FileBackendStore { $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] ) ? $config['swiftTempUrlKey'] : ''; + $this->swiftStorageUrl = isset( $config['swiftStorageUrl'] ) + ? $config['swiftStorageUrl'] + : null; $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] ) ? $config['shardViaHashLevels'] : ''; @@ -287,7 +284,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually write the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -353,7 +350,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually write the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -401,7 +398,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually write the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -460,7 +457,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually move the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -500,7 +497,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually delete the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -556,7 +553,7 @@ class SwiftFileBackend extends FileBackendStore { if ( !empty( $params['async'] ) ) { // deferred $status->value = $opHandle; } else { // actually change the object in Swift - $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) ); + $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) ); } return $status; @@ -831,7 +828,7 @@ class SwiftFileBackend extends FileBackendStore { * * @param string $fullCont Resolved container name * @param string $dir Resolved storage directory with no trailing slash - * @param string|null $after Resolved container relative path to list items after + * @param string|null &$after Resolved container relative path to list items after * @param int $limit Max number of items to list * @param array $params Parameters for getDirectoryList() * @return array List of container relative resolved paths of directories directly under $dir @@ -911,7 +908,7 @@ class SwiftFileBackend extends FileBackendStore { * * @param string $fullCont Resolved container name * @param string $dir Resolved storage directory with no trailing slash - * @param string|null $after Resolved container relative path of file to list items after + * @param string|null &$after Resolved container relative path of file to list items after * @param int $limit Max number of items to list * @param array $params Parameters for getDirectoryList() * @return array List of resolved container relative paths of files under $dir @@ -1674,8 +1671,11 @@ class SwiftFileBackend extends FileBackendStore { if ( $rcode >= 200 && $rcode <= 299 ) { // OK $this->authCreds = [ 'auth_token' => $rhdrs['x-auth-token'], - 'storage_url' => $rhdrs['x-storage-url'] + 'storage_url' => ( $this->swiftStorageUrl !== null ) + ? $this->swiftStorageUrl + : $rhdrs['x-storage-url'] ]; + $this->srvCache->set( $cacheKey, $this->authCreds, ceil( $this->authTTL / 2 ) ); $this->authSessionTimestamp = time(); } elseif ( $rcode === 401 ) { @@ -1888,7 +1888,7 @@ abstract class SwiftFileBackendList implements Iterator { * * @param string $container Resolved container name * @param string $dir Resolved path relative to container - * @param string $after + * @param string &$after * @param int $limit * @param array $params * @return Traversable|array diff --git a/includes/libs/filebackend/filejournal/FileJournal.php b/includes/libs/filebackend/filejournal/FileJournal.php index 116c303d61..5ba59c5c97 100644 --- a/includes/libs/filebackend/filejournal/FileJournal.php +++ b/includes/libs/filebackend/filejournal/FileJournal.php @@ -24,7 +24,6 @@ * * @file * @ingroup FileJournal - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/CopyFileOp.php b/includes/libs/filebackend/fileop/CopyFileOp.php index e3b8c51719..527de6a5e4 100644 --- a/includes/libs/filebackend/fileop/CopyFileOp.php +++ b/includes/libs/filebackend/fileop/CopyFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/CreateFileOp.php b/includes/libs/filebackend/fileop/CreateFileOp.php index 120ca2b7de..f45b055cae 100644 --- a/includes/libs/filebackend/fileop/CreateFileOp.php +++ b/includes/libs/filebackend/fileop/CreateFileOp.php @@ -17,7 +17,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/DeleteFileOp.php b/includes/libs/filebackend/fileop/DeleteFileOp.php index 0ccb1e3d7f..01f7df46a8 100644 --- a/includes/libs/filebackend/fileop/DeleteFileOp.php +++ b/includes/libs/filebackend/fileop/DeleteFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend -* @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/DescribeFileOp.php b/includes/libs/filebackend/fileop/DescribeFileOp.php index 9b53222433..0d1e553265 100644 --- a/includes/libs/filebackend/fileop/DescribeFileOp.php +++ b/includes/libs/filebackend/fileop/DescribeFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/FileOp.php b/includes/libs/filebackend/fileop/FileOp.php index 79af194483..40af7aca78 100644 --- a/includes/libs/filebackend/fileop/FileOp.php +++ b/includes/libs/filebackend/fileop/FileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; @@ -248,7 +247,7 @@ abstract class FileOp { * This must update $predicates for each path that the op can change * except when a failing StatusValue object is returned. * - * @param array $predicates + * @param array &$predicates * @return StatusValue */ final public function precheck( array &$predicates ) { @@ -265,7 +264,7 @@ abstract class FileOp { } /** - * @param array $predicates + * @param array &$predicates * @return StatusValue */ protected function doPrecheck( array &$predicates ) { diff --git a/includes/libs/filebackend/fileop/MoveFileOp.php b/includes/libs/filebackend/fileop/MoveFileOp.php index fee3f4a0f0..55dca516cd 100644 --- a/includes/libs/filebackend/fileop/MoveFileOp.php +++ b/includes/libs/filebackend/fileop/MoveFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/NullFileOp.php b/includes/libs/filebackend/fileop/NullFileOp.php index ed23e810d3..9121759613 100644 --- a/includes/libs/filebackend/fileop/NullFileOp.php +++ b/includes/libs/filebackend/fileop/NullFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/filebackend/fileop/StoreFileOp.php b/includes/libs/filebackend/fileop/StoreFileOp.php index b97b41076e..bba762f0dd 100644 --- a/includes/libs/filebackend/fileop/StoreFileOp.php +++ b/includes/libs/filebackend/fileop/StoreFileOp.php @@ -19,7 +19,6 @@ * * @file * @ingroup FileBackend - * @author Aaron Schulz */ /** diff --git a/includes/libs/http/HttpAcceptNegotiator.php b/includes/libs/http/HttpAcceptNegotiator.php new file mode 100644 index 0000000000..5f8d9a69e1 --- /dev/null +++ b/includes/libs/http/HttpAcceptNegotiator.php @@ -0,0 +1,139 @@ +supportedValues = $supported; + $this->defaultValue = reset( $supported ); + } + + /** + * Returns the best supported key from the given weight map. Of the keys from the + * $weights parameter that are also in the list of supported values supplied to + * the constructor, this returns the key that has the highest weight associated + * with it. If two keys have the same weight, the more specific key is preferred, + * as required by RFC2616 section 14. Keys that map to 0 or false are ignored. + * If no matching key is found, $default is returned. + * + * @param float[] $weights An associative array mapping accepted values to their + * respective weights. + * + * @param null|string $default The value to return if non of the keys in $weights + * is supported (null per default). + * + * @return null|string The best supported key from the $weights parameter. + */ + public function getBestSupportedKey( array $weights, $default = null ) { + // Make sure we correctly bias against wildcards and ranges, see RFC2616, section 14. + foreach ( $weights as $name => &$weight ) { + if ( $name === '*' || $name === '*/*' ) { + $weight -= 0.000002; + } elseif ( substr( $name, -2 ) === '/*' ) { + $weight -= 0.000001; + } + } + + // Sort $weights by value and... + asort( $weights ); + + // remove any keys with values equal to 0 or false (HTTP/1.1 section 3.9) + $weights = array_filter( $weights ); + + // ...use the ordered list of keys + $preferences = array_reverse( array_keys( $weights ) ); + + $value = $this->getFirstSupportedValue( $preferences, $default ); + return $value; + } + + /** + * Returns the first supported value from the given preference list. Of the values from + * the $preferences parameter that are also in the list of supported values supplied + * to the constructor, this returns the value that has the lowest index in the list. + * If no such value is found, $default is returned. + * + * @param string[] $preferences A list of acceptable values, in order of preference. + * + * @param null|string $default The value to return if non of the keys in $weights + * is supported (null per default). + * + * @return null|string The best supported key from the $weights parameter. + */ + public function getFirstSupportedValue( array $preferences, $default = null ) { + foreach ( $preferences as $value ) { + foreach ( $this->supportedValues as $supported ) { + if ( $this->valueMatches( $value, $supported ) ) { + return $supported; + } + } + } + + return $default; + } + + /** + * Returns true if the given acceptable value matches the given supported value, + * according to the HTTP specification. The following rules are used: + * + * - comparison is case-insensitive + * - if $accepted and $supported are equal, they match + * - if $accepted is `*` or `*` followed by `/*`, it matches any $supported value. + * - if both $accepted and $supported contain a `/`, and $accepted ends with `/*`, + * they match if the part before the first `/` is equal. + * + * @param string $accepted An accepted value (may contain wildcards) + * @param string $supported A supported value. + * + * @return bool Whether the given supported value matches the given accepted value. + */ + private function valueMatches( $accepted, $supported ) { + // RDF 2045: MIME types are case insensitive. + // full match + if ( strcasecmp( $accepted, $supported ) === 0 ) { + return true; + } + + // wildcard match (HTTP/1.1 section 14.1, 14.2, 14.3) + if ( $accepted === '*' || $accepted === '*/*' ) { + return true; + } + + // wildcard match (HTTP/1.1 section 14.1) + if ( substr( $accepted, -2 ) === '/*' + && strncasecmp( $accepted, $supported, strlen( $accepted ) - 2 ) === 0 + ) { + return true; + } + + return false; + } + +} diff --git a/includes/libs/http/HttpAcceptParser.php b/includes/libs/http/HttpAcceptParser.php new file mode 100644 index 0000000000..bce071e726 --- /dev/null +++ b/includes/libs/http/HttpAcceptParser.php @@ -0,0 +1,78 @@ + 0.8 + $weights = array_combine( $values, $qvalues ); + + return $weights; + } + +} diff --git a/includes/libs/jsminplus.php b/includes/libs/jsminplus.php index 40f22c5efb..7feac7d11a 100644 --- a/includes/libs/jsminplus.php +++ b/includes/libs/jsminplus.php @@ -973,8 +973,6 @@ class JSParser } while (!$ss[$i]->isLoop && ($tt != KEYWORD_BREAK || $ss[$i]->type != KEYWORD_SWITCH)); } - - $n->target = $ss[$i]; break; case KEYWORD_TRY: diff --git a/includes/libs/lockmanager/DBLockManager.php b/includes/libs/lockmanager/DBLockManager.php index b17b1a0b0d..26e25f9305 100644 --- a/includes/libs/lockmanager/DBLockManager.php +++ b/includes/libs/lockmanager/DBLockManager.php @@ -21,6 +21,10 @@ * @ingroup LockManager */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBError; + /** * Version of LockManager based on using named/row DB locks. * diff --git a/includes/libs/lockmanager/LockManager.php b/includes/libs/lockmanager/LockManager.php index c629e7d9a9..a6257bfda9 100644 --- a/includes/libs/lockmanager/LockManager.php +++ b/includes/libs/lockmanager/LockManager.php @@ -26,7 +26,6 @@ use Wikimedia\WaitConditionLoop; * * @file * @ingroup LockManager - * @author Aaron Schulz */ /** diff --git a/includes/libs/lockmanager/NullLockManager.php b/includes/libs/lockmanager/NullLockManager.php index 5ad558fa74..b83462c798 100644 --- a/includes/libs/lockmanager/NullLockManager.php +++ b/includes/libs/lockmanager/NullLockManager.php @@ -19,7 +19,6 @@ * * @file * @ingroup LockManager - * @author Aaron Schulz */ /** diff --git a/includes/libs/lockmanager/PostgreSqlLockManager.php b/includes/libs/lockmanager/PostgreSqlLockManager.php index d6b1ce822d..65c69938a4 100644 --- a/includes/libs/lockmanager/PostgreSqlLockManager.php +++ b/includes/libs/lockmanager/PostgreSqlLockManager.php @@ -1,4 +1,7 @@ collectPledgeQuorum( + $bucket, + function ( $lockSrv ) use ( $pathsByType ) { + return $this->getLocksOnServer( $lockSrv, $pathsByType ); + } + ); + } + + /** + * Attempt to release locks with the peers for a bucket + * + * @param int $bucket + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths + * @return StatusValue + */ + final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) { + return $this->releasePledges( + $bucket, + function ( $lockSrv ) use ( $pathsByType ) { + return $this->freeLocksOnServer( $lockSrv, $pathsByType ); + } + ); + } + + /** + * Attempt to acquire pledges with the peers for a bucket. + * This is all or nothing; if any key is already pledged then this totally fails. + * + * @param int $bucket + * @param callable $callback Pledge method taking a server name and yeilding a StatusValue + * @return StatusValue + */ + final protected function collectPledgeQuorum( $bucket, callable $callback ) { $status = StatusValue::newGood(); $yesVotes = 0; // locks made on trustable servers @@ -141,7 +174,7 @@ abstract class QuorumLockManager extends LockManager { continue; // server down? } // Attempt to acquire the lock on this peer - $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) ); + $status->merge( $callback( $lockSrv ) ); if ( !$status->isOK() ) { return $status; // vetoed; resource locked } @@ -162,13 +195,13 @@ abstract class QuorumLockManager extends LockManager { } /** - * Attempt to release locks with the peers for a bucket + * Attempt to release pledges with the peers for a bucket * * @param int $bucket - * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths + * @param callable $callback Pledge method taking a server name and yeilding a StatusValue * @return StatusValue */ - final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) { + final protected function releasePledges( $bucket, callable $callback ) { $status = StatusValue::newGood(); $yesVotes = 0; // locks freed on trustable servers @@ -180,7 +213,7 @@ abstract class QuorumLockManager extends LockManager { $status->warning( 'lockmanager-fail-svr-release', $lockSrv ); } else { // Attempt to release the lock on this peer - $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) ); + $status->merge( $callback( $lockSrv ) ); ++$yesVotes; // success for this peer // Normally the first peers form the quorum, and the others are ignored. // Ignore them in this case, but not when an alternative quorum was used. diff --git a/includes/libs/lockmanager/ScopedLock.php b/includes/libs/lockmanager/ScopedLock.php index ac8bee8f70..2ad8ac87b5 100644 --- a/includes/libs/lockmanager/ScopedLock.php +++ b/includes/libs/lockmanager/ScopedLock.php @@ -19,7 +19,6 @@ * * @file * @ingroup LockManager - * @author Aaron Schulz */ /** @@ -86,7 +85,7 @@ class ScopedLock { * This is useful for early release of locks before function scope is destroyed. * This is the same as setting the lock object to null. * - * @param ScopedLock $lock + * @param ScopedLock &$lock * @since 1.21 */ public static function release( ScopedLock &$lock = null ) { diff --git a/includes/libs/mime/IEContentAnalyzer.php b/includes/libs/mime/IEContentAnalyzer.php index 0d1e527ba6..dfc7c4b431 100644 --- a/includes/libs/mime/IEContentAnalyzer.php +++ b/includes/libs/mime/IEContentAnalyzer.php @@ -344,7 +344,7 @@ class IEContentAnalyzer { /** * Translate a MIME type from IE's idiosyncratic private types into * more commonly understood type strings - * @param $type + * @param string $type * @return string */ public function translateMimeType( $type ) { @@ -383,10 +383,10 @@ class IEContentAnalyzer { /** * Get the MIME type for a given named version - * @param $version - * @param $fileName - * @param $chunk - * @param $proposed + * @param string $version + * @param string $fileName + * @param string $chunk + * @param string $proposed * @return bool|string */ protected function getMimeTypeForVersion( $version, $fileName, $chunk, $proposed ) { @@ -399,8 +399,8 @@ class IEContentAnalyzer { $proposedFormat = $this->getDataFormat( $version, $proposed ); if ( $proposedFormat == 'unknown' && $proposed != 'multipart/mixed' - && $proposed != 'multipart/x-mixed-replace' ) - { + && $proposed != 'multipart/x-mixed-replace' + ) { return $proposed; } if ( strval( $chunk ) === '' ) { @@ -426,15 +426,15 @@ class IEContentAnalyzer { return 'image/gif'; } if ( ( $proposed == 'image/pjpeg' || $proposed == 'image/jpeg' ) - && $binaryType == 'image/pjpeg' ) - { + && $binaryType == 'image/pjpeg' + ) { return $proposed; } // PNG check added in IE 7 if ( $version >= 'ie07' && ( $proposed == 'image/x-png' || $proposed == 'image/png' ) - && $binaryType == 'image/x-png' ) - { + && $binaryType == 'image/x-png' + ) { return $proposed; } @@ -450,8 +450,8 @@ class IEContentAnalyzer { } if ( isset( $sampleFound['rdf-tag'] ) && isset( $sampleFound['rdf-url'] ) - && isset( $sampleFound['rdf-purl'] ) ) - { + && isset( $sampleFound['rdf-purl'] ) + ) { return 'application/rss+xml'; } if ( isset( $sampleFound['atom'] ) ) { @@ -497,8 +497,8 @@ class IEContentAnalyzer { // Freaky heuristics to determine if the data is text or binary // The heuristic is of course broken for non-ASCII text if ( $counters['ctrl'] != 0 && ( $counters['ff'] + $counters['low'] ) - < ( $counters['ctrl'] + $counters['high'] ) * 16 ) - { + < ( $counters['ctrl'] + $counters['high'] ) * 16 + ) { $kindOfBinary = true; $type = $binaryType ? $binaryType : $textType; if ( $type === false ) { @@ -553,8 +553,8 @@ class IEContentAnalyzer { /** * Check for text headers at the start of the chunk * Confirmed same in 5 and 7. - * @param $version - * @param $chunk + * @param string $version + * @param string $chunk * @return bool|string */ private function checkTextHeaders( $version, $chunk ) { @@ -579,8 +579,8 @@ class IEContentAnalyzer { /** * Check for binary headers at the start of the chunk * Confirmed same in 5 and 7. - * @param $version - * @param $chunk + * @param string $version + * @param string $chunk * @return bool|string */ private function checkBinaryHeaders( $version, $chunk ) { @@ -599,13 +599,13 @@ class IEContentAnalyzer { if ( $chunk2 == 'BM' && substr( $chunk, 6, 2 ) == "\000\000" - && substr( $chunk, 8, 2 ) == "\000\000" ) - { + && substr( $chunk, 8, 2 ) == "\000\000" + ) { return 'image/bmp'; // another non-standard MIME } if ( $chunk4 == 'RIFF' - && substr( $chunk, 8, 4 ) == 'WAVE' ) - { + && substr( $chunk, 8, 4 ) == 'WAVE' + ) { return 'audio/wav'; } // These were integer literals in IE @@ -613,8 +613,8 @@ class IEContentAnalyzer { if ( $chunk4 == ".sd\000" || $chunk4 == ".snd" || $chunk4 == "\000ds." - || $chunk4 == "dns." ) - { + || $chunk4 == "dns." + ) { return 'audio/basic'; } if ( $chunk3 == "MM\000" ) { @@ -648,8 +648,8 @@ class IEContentAnalyzer { return 'video/mpeg'; } if ( $chunk4 == "\001\000\000\000" - && substr( $chunk, 40, 4 ) == ' EMF' ) - { + && substr( $chunk, 40, 4 ) == ' EMF' + ) { return 'image/x-emf'; } if ( $chunk4 == "\xd7\xcd\xc6\x9a" ) { @@ -680,8 +680,8 @@ class IEContentAnalyzer { /** * Do heuristic checks on the bulk of the data sample. * Search for HTML tags. - * @param $version - * @param $chunk + * @param string $version + * @param string $chunk * @return array */ protected function sampleData( $version, $chunk ) { @@ -789,8 +789,8 @@ class IEContentAnalyzer { if ( !strncasecmp( $remainder, $rdfUrl, strlen( $rdfUrl ) ) ) { $found['rdf-url'] = true; if ( isset( $found['rdf-tag'] ) - && isset( $found['rdf-purl'] ) ) // [sic] - { + && isset( $found['rdf-purl'] ) // [sic] + ) { break; } continue; @@ -798,8 +798,8 @@ class IEContentAnalyzer { if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) { if ( isset( $found['rdf-tag'] ) - && isset( $found['rdf-url'] ) ) // [sic] - { + && isset( $found['rdf-url'] ) // [sic] + ) { break; } continue; @@ -832,8 +832,8 @@ class IEContentAnalyzer { } /** - * @param $version - * @param $type + * @param string $version + * @param string|null $type * @return int|string */ protected function getDataFormat( $version, $type ) { diff --git a/includes/libs/mime/MimeAnalyzer.php b/includes/libs/mime/MimeAnalyzer.php index 6ea3c215bc..4d860bb593 100644 --- a/includes/libs/mime/MimeAnalyzer.php +++ b/includes/libs/mime/MimeAnalyzer.php @@ -529,10 +529,13 @@ EOT; // Formats we recognize magic numbers for 'djvu', 'ogx', 'ogg', 'ogv', 'oga', 'spx', 'opus', 'mid', 'pdf', 'wmf', 'xcf', 'webm', 'mkv', 'mka', - 'webp', + 'webp', 'mp3', // XML formats we sure hope we recognize reliably 'svg', + + // 3D formats + 'stl', ]; return in_array( strtolower( $extension ), $types ); } @@ -670,6 +673,10 @@ EOT; // Multimedia... 'MThd' => 'audio/midi', 'OggS' => 'application/ogg', + 'ID3' => 'audio/mpeg', + "\xff\xfb" => 'audio/mpeg', // MPEG-1 layer 3 + "\xff\xf3" => 'audio/mpeg', // MPEG-2 layer 3 (lower sample rates) + "\xff\xe3" => 'audio/mpeg', // MPEG-2.5 layer 3 (very low sample rates) // Image formats... // Note that WMF may have a bare header, no magic number. @@ -702,8 +709,17 @@ EOT; $this->logger->info( __METHOD__ . ": recognized file as video/x-matroska\n" ); return "video/x-matroska"; } elseif ( strncmp( $data, "webm", 4 ) == 0 ) { - $this->logger->info( __METHOD__ . ": recognized file as video/webm\n" ); - return "video/webm"; + // XXX HACK look for a video track, if we don't find it, this is an audio file + $videotrack = strpos( $head, "\x86\x85V_VP" ); + + if ( $videotrack ) { + // There is a video track, so this is a video file. + $this->logger->info( __METHOD__ . ": recognized file as video/webm\n" ); + return "video/webm"; + } + + $this->logger->info( __METHOD__ . ": recognized file as audio/webm\n" ); + return "audio/webm"; } } $this->logger->info( __METHOD__ . ": unknown EBML file\n" ); @@ -735,8 +751,8 @@ EOT; ( strpos( $head, "<\x00?\x00 " ) !== false ) || ( strpos( $head, "<\x00?\x00\n" ) !== false ) || ( strpos( $head, "<\x00?\x00\t" ) !== false ) || - ( strpos( $head, "<\x00?\x00=" ) !== false ) ) { - + ( strpos( $head, "<\x00?\x00=" ) !== false ) + ) { $this->logger->info( __METHOD__ . ": recognized $file as application/x-php\n" ); return 'application/x-php'; } @@ -800,6 +816,23 @@ EOT; return $this->detectZipType( $head, $tail, $ext ); } + // Check for STL (3D) files + // @see https://en.wikipedia.org/wiki/STL_(file_format) + if ( $fsize >= 15 && + stripos( $head, 'SOLID ' ) === 0 && + preg_match( '/\RENDSOLID .*$/i', $tail ) ) { + // ASCII STL file + return 'application/sla'; + } elseif ( $fsize > 84 ) { + // binary STL file + $triangles = substr( $head, 80, 4 ); + $triangles = unpack( 'V', $triangles ); + $triangles = reset( $triangles ); + if ( $triangles !== false && $fsize === 84 + ( $triangles * 50 ) ) { + return 'application/sla'; + } + } + MediaWiki\suppressWarnings(); $gis = getimagesize( $file ); MediaWiki\restoreWarnings(); @@ -955,18 +988,8 @@ EOT; $m = null; if ( $callback ) { $m = $callback( $file ); - } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) { - $mime_magic_resource = finfo_open( FILEINFO_MIME ); - - if ( $mime_magic_resource ) { - $m = finfo_file( $mime_magic_resource, $file ); - finfo_close( $mime_magic_resource ); - } else { - $this->logger->info( __METHOD__ . - ": finfo_open failed on " . FILEINFO_MIME . "!\n" ); - } } else { - $this->logger->info( __METHOD__ . ": no magic mime detector found!\n" ); + $m = mime_content_type( $file ); } if ( $m ) { @@ -1035,7 +1058,6 @@ EOT; // Special code for ogg - detect if it's video (theora), // else label it as sound. if ( $mime == 'application/ogg' && file_exists( $path ) ) { - // Read a chunk of the file $f = fopen( $path, "rt" ); if ( !$f ) { @@ -1141,6 +1163,15 @@ EOT; return MEDIATYPE_UNKNOWN; } + /** + * Returns an array of media types (MEDIATYPE_xxx constants) + * + * @return array + */ + public function getMediaTypes() { + return array_keys( $this->mediaTypes ); + } + /** * Get the MIME types that various versions of Internet Explorer would * detect from a chunk of the content. diff --git a/includes/libs/mime/XmlTypeCheck.php b/includes/libs/mime/XmlTypeCheck.php index 7f2bf5e81b..ea7f9a6ca7 100644 --- a/includes/libs/mime/XmlTypeCheck.php +++ b/includes/libs/mime/XmlTypeCheck.php @@ -73,19 +73,36 @@ class XmlTypeCheck { */ private $parserOptions = [ 'processing_instruction_handler' => '', + 'external_dtd_handler' => '', + 'dtd_handler' => '', + 'require_safe_dtd' => true ]; /** + * Allow filtering an XML file. + * + * Filters should return either true or a string to indicate something + * is wrong with the file. $this->filterMatch will store if the + * file failed validation (true = failed validation). + * $this->filterMatchType will contain the validation error. + * $this->wellFormed will contain whether the xml file is well-formed. + * + * @note If multiple filters are hit, only one of them will have the + * result stored in $this->filterMatchType. + * * @param string $input a filename or string containing the XML element * @param callable $filterCallback (optional) * Function to call to do additional custom validity checks from the * SAX element handler event. This gives you access to the element * namespace, name, attributes, and text contents. - * Filter should return 'true' to toggle on $this->filterMatch + * Filter should return a truthy value describing the error. * @param bool $isFile (optional) indicates if the first parameter is a * filename (default, true) or if it is a string (false) * @param array $options list of additional parsing options: * processing_instruction_handler: Callback for xml_set_processing_instruction_handler + * external_dtd_handler: Callback for the url of external dtd subset + * dtd_handler: Callback given the full text of the filterCallback = $filterCallback; @@ -186,6 +203,9 @@ class XmlTypeCheck { if ( $reader->nodeType === XMLReader::PI ) { $this->processingInstructionHandler( $reader->name, $reader->value ); } + if ( $reader->nodeType === XMLReader::DOC_TYPE ) { + $this->DTDHandler( $reader ); + } } while ( $reader->nodeType != XMLReader::ELEMENT ); // Process the rest of the document @@ -234,8 +254,13 @@ class XmlTypeCheck { $reader->value ); break; + case XMLReader::DOC_TYPE: + // We should never see a doctype after first + // element. + $this->wellFormed = false; + break; default: - // One of DOC, DOC_TYPE, ENTITY, END_ENTITY, + // One of DOC, ENTITY, END_ENTITY, // NOTATION, or XML_DECLARATION // xml_parse didn't send these to the filter, so we won't. } @@ -250,7 +275,7 @@ class XmlTypeCheck { /** * Get all of the attributes for an XMLReader's current node - * @param $r XMLReader + * @param XMLReader $r * @return array of attributes */ private function getAttributesArray( XMLReader $r ) { @@ -268,8 +293,8 @@ class XmlTypeCheck { } /** - * @param $name element or attribute name, maybe with a full or short prefix - * @param $namespaceURI the namespaceURI + * @param string $name element or attribute name, maybe with a full or short prefix + * @param string $namespaceURI the namespaceURI * @return string the name prefixed with namespaceURI */ private function expandNS( $name, $namespaceURI ) { @@ -282,8 +307,8 @@ class XmlTypeCheck { } /** - * @param $name - * @param $attribs + * @param string $name + * @param string $attribs */ private function elementOpen( $name, $attribs ) { $this->elementDataContext[] = [ $name, $attribs ]; @@ -313,7 +338,7 @@ class XmlTypeCheck { } /** - * @param $data + * @param string $data */ private function elementData( $data ) { // Collect any data here, and we'll run the callback in elementClose @@ -321,8 +346,8 @@ class XmlTypeCheck { } /** - * @param $target - * @param $data + * @param string $target + * @param string $data */ private function processingInstructionHandler( $target, $data ) { $callbackReturn = false; @@ -339,4 +364,140 @@ class XmlTypeCheck { $this->filterMatchType = $callbackReturn; } } + /** + * Handle coming across a parserOptions['external_dtd_handler']; + $generalCallback = $this->parserOptions['dtd_handler']; + $checkIfSafe = $this->parserOptions['require_safe_dtd']; + if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) { + return; + } + $dtd = $reader->readOuterXML(); + $callbackReturn = false; + + if ( $generalCallback ) { + $callbackReturn = call_user_func( $generalCallback, $dtd ); + } + if ( $callbackReturn ) { + // Filter hit! + $this->filterMatch = true; + $this->filterMatchType = $callbackReturn; + $callbackReturn = false; + } + + $parsedDTD = $this->parseDTD( $dtd ); + if ( $externalCallback && isset( $parsedDTD['type'] ) ) { + $callbackReturn = call_user_func( + $externalCallback, + $parsedDTD['type'], + isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null, + isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null + ); + } + if ( $callbackReturn ) { + // Filter hit! + $this->filterMatch = true; + $this->filterMatchType = $callbackReturn; + $callbackReturn = false; + } + + if ( $checkIfSafe && isset( $parsedDTD['internal'] ) ) { + if ( !$this->checkDTDIsSafe( $parsedDTD['internal'] ) ) { + $this->wellFormed = false; + } + } + } + + /** + * Check if the internal subset of the DTD is safe. + * + * We whitelist an extremely restricted subset of DTD features. + * + * Safe is defined as: + * * Only contains entity defintions (e.g. No 255 bytes). + * * + * allowed if matched exactly for compatibility with graphviz + * * Comments. + * + * @param string $internalSubset The internal subset of the DTD + * @return bool true if safe. + */ + private function checkDTDIsSafe( $internalSubset ) { + $offset = 0; + $res = preg_match( + '/^(?:\s*' . + '|\s*' . + '|\s*)*\s*$/', + $internalSubset + ); + + return (bool)$res; + } + + /** + * Parse DTD into parts. + * + * If there is an error parsing the dtd, sets wellFormed to false. + * + * @param string $dtd + * @return array Possibly containing keys publicid, systemid, type and internal. + */ + private function parseDTD( $dtd ) { + $m = []; + $res = preg_match( + '/^PUBLIC)\s*' . + '(?:"(?P[^"]*)"|\'(?P[^\']*)\')' . // public identifer + '\s*"(?P[^"]*)"|\'(?P[^\']*)\'' . // system identifier + '|(?PSYSTEM)\s*' . + '(?:"(?P[^"]*)"|\'(?P[^\']*)\')' . + ')?\s*' . + '(?:\[\s*(?P.*)\])?\s*>$/s', + $dtd, + $m + ); + if ( !$res ) { + $this->wellFormed = false; + return []; + } + $parsed = []; + foreach ( $m as $field => $value ) { + if ( $value === '' || is_numeric( $field ) ) { + continue; + } + switch ( $field ) { + case 'typepublic': + case 'typesystem': + $parsed['type'] = $value; + break; + case 'pubquote': + case 'pubapos': + $parsed['publicid'] = $value; + break; + case 'pubsysquote': + case 'pubsysapos': + case 'sysquote': + case 'sysapos': + $parsed['systemid'] = $value; + break; + case 'internal': + $parsed['internal'] = $value; + break; + } + } + return $parsed; + } } diff --git a/includes/libs/mime/defines.php b/includes/libs/mime/defines.php index ae0b5f8b61..9f753feee9 100644 --- a/includes/libs/mime/defines.php +++ b/includes/libs/mime/defines.php @@ -43,4 +43,6 @@ define( 'MEDIATYPE_TEXT', 'TEXT' ); define( 'MEDIATYPE_EXECUTABLE', 'EXECUTABLE' ); // archive file (zip, tar, etc) define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' ); +// 3D file types (stl) +define( 'MEDIATYPE_3D', '3D' ); /**@}*/ diff --git a/includes/libs/mime/mime.info b/includes/libs/mime/mime.info index 2468f3841d..d8b8be7701 100644 --- a/includes/libs/mime/mime.info +++ b/includes/libs/mime/mime.info @@ -118,3 +118,5 @@ chemical/x-mdl-sdfile [DRAWING] chemical/x-mdl-rxnfile [DRAWING] chemical/x-mdl-rdfile [DRAWING] chemical/x-mdl-rgfile [DRAWING] + +application/sla [3D] diff --git a/includes/libs/objectcache/APCBagOStuff.php b/includes/libs/objectcache/APCBagOStuff.php index 9bfcee798a..e41c3a2592 100644 --- a/includes/libs/objectcache/APCBagOStuff.php +++ b/includes/libs/objectcache/APCBagOStuff.php @@ -42,8 +42,6 @@ class APCBagOStuff extends BagOStuff { const KEY_SUFFIX = ':2'; /** - * Constructor - * * Available parameters are: * - nativeSerialize: If true, pass objects to apc_store(), and trust it * to serialize them correctly. If false, serialize diff --git a/includes/libs/objectcache/APCUBagOStuff.php b/includes/libs/objectcache/APCUBagOStuff.php index 6e6a3adebb..a26e56020f 100644 --- a/includes/libs/objectcache/APCUBagOStuff.php +++ b/includes/libs/objectcache/APCUBagOStuff.php @@ -28,8 +28,6 @@ */ class APCUBagOStuff extends APCBagOStuff { /** - * Constructor - * * Available parameters are: * - nativeSerialize: If true, pass objects to apcu_store(), and trust it * to serialize them correctly. If false, serialize diff --git a/includes/libs/objectcache/BagOStuff.php b/includes/libs/objectcache/BagOStuff.php index 77c4259a0d..a262e0e18e 100644 --- a/includes/libs/objectcache/BagOStuff.php +++ b/includes/libs/objectcache/BagOStuff.php @@ -229,7 +229,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * @note: This method is only needed if merge() uses mergeViaCas() * * @param string $key - * @param mixed $casToken + * @param mixed &$casToken * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional] * @return mixed Returns false on failure and if the item does not exist * @throws Exception @@ -475,7 +475,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { $lSince = microtime( true ); // lock timestamp - return new ScopedCallback( function() use ( $key, $lSince, $expiry ) { + return new ScopedCallback( function () use ( $key, $lSince, $expiry ) { $latency = .050; // latency skew (err towards keeping lock present) $age = ( microtime( true ) - $lSince + $latency ); if ( ( $age + $latency ) >= $expiry ) { @@ -747,7 +747,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * Make a global cache key. * * @since 1.27 - * @param string ... Key component (variadic) + * @param string $keys,... Key component * @return string */ public function makeGlobalKey() { @@ -758,7 +758,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * Make a cache key, scoped to this instance's keyspace. * * @since 1.27 - * @param string ... Key component (variadic) + * @param string $keys,... Key component * @return string */ public function makeKey() { diff --git a/includes/libs/objectcache/CachedBagOStuff.php b/includes/libs/objectcache/CachedBagOStuff.php index 74bf4b515f..c85a82ea01 100644 --- a/includes/libs/objectcache/CachedBagOStuff.php +++ b/includes/libs/objectcache/CachedBagOStuff.php @@ -81,6 +81,22 @@ class CachedBagOStuff extends HashBagOStuff { $this->backend->setDebug( $bool ); } + public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) { + parent::deleteObjectsExpiringBefore( $date, $progressCallback ); + return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback ); + } + + public function makeKey() { + return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() ); + } + + public function makeGlobalKey() { + return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() ); + } + + // These just call the backend (tested elsewhere) + // @codeCoverageIgnoreStart + public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) { return $this->backend->lock( $key, $timeout, $expiry, $rclass ); } @@ -89,21 +105,17 @@ class CachedBagOStuff extends HashBagOStuff { return $this->backend->unlock( $key ); } - public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) { - parent::deleteObjectsExpiringBefore( $date, $progressCallback ); - return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback ); - } - public function getLastError() { return $this->backend->getLastError(); } public function clearLastError() { - $this->backend->clearLastError(); + return $this->backend->clearLastError(); } public function modifySimpleRelayEvent( array $event ) { return $this->backend->modifySimpleRelayEvent( $event ); } + // @codeCoverageIgnoreEnd } diff --git a/includes/libs/objectcache/MemcachedClient.php b/includes/libs/objectcache/MemcachedClient.php index c3fcab94bd..5cb49a9972 100644 --- a/includes/libs/objectcache/MemcachedClient.php +++ b/includes/libs/objectcache/MemcachedClient.php @@ -469,7 +469,6 @@ class MemcachedClient { * @return mixed */ public function get( $key, &$casToken = null ) { - if ( $this->_debug ) { $this->_debugprint( "get($key)" ); } @@ -1114,9 +1113,13 @@ class MemcachedClient { if ( $this->_debug ) { $this->_debugprint( sprintf( "%s %s (%s)", $cmd, $key, $line ) ); } - if ( $line == "STORED" ) { + if ( $line === "STORED" ) { + return true; + } elseif ( $line === "NOT_STORED" && $cmd === "set" ) { + // "Not stored" is always used as the mcrouter response with AllAsyncRoute return true; } + return false; } diff --git a/includes/libs/objectcache/MemcachedPeclBagOStuff.php b/includes/libs/objectcache/MemcachedPeclBagOStuff.php index 5983c1b825..e3e66d5826 100644 --- a/includes/libs/objectcache/MemcachedPeclBagOStuff.php +++ b/includes/libs/objectcache/MemcachedPeclBagOStuff.php @@ -29,8 +29,6 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff { /** - * Constructor - * * Available parameters are: * - servers: The list of IP:port combinations holding the memcached servers. * - persistent: Whether to use a persistent connection @@ -149,7 +147,12 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff { public function set( $key, $value, $exptime = 0, $flags = 0 ) { $this->debugLog( "set($key)" ); - return $this->checkResult( $key, parent::set( $key, $value, $exptime ) ); + $result = parent::set( $key, $value, $exptime ); + if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTSTORED ) { + // "Not stored" is always used as the mcrouter response with AllAsyncRoute + return true; + } + return $this->checkResult( $key, $result ); } protected function cas( $casToken, $key, $value, $exptime = 0 ) { @@ -163,9 +166,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff { if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) { // "Not found" is counted as success in our interface return true; - } else { - return $this->checkResult( $key, $result ); } + return $this->checkResult( $key, $result ); } public function add( $key, $value, $exptime = 0 ) { diff --git a/includes/libs/objectcache/MultiWriteBagOStuff.php b/includes/libs/objectcache/MultiWriteBagOStuff.php index 9dcfa7c55e..65f3a8afe5 100644 --- a/includes/libs/objectcache/MultiWriteBagOStuff.php +++ b/includes/libs/objectcache/MultiWriteBagOStuff.php @@ -174,13 +174,19 @@ class MultiWriteBagOStuff extends BagOStuff { * @param integer $count * @param bool $asyncWrites * @param string $method - * @param mixed ... + * @param mixed $args,... * @return bool */ protected function doWrite( $count, $asyncWrites, $method /*, ... */ ) { $ret = true; $args = array_slice( func_get_args(), 3 ); + if ( $count > 1 && $asyncWrites ) { + // Deep-clone $args to prevent misbehavior when something writes an + // object to the BagOStuff then modifies it afterwards, e.g. T168040. + $args = unserialize( serialize( $args ) ); + } + foreach ( $this->caches as $i => $cache ) { if ( $i >= $count ) { break; // ignore the lower tiers @@ -226,4 +232,12 @@ class MultiWriteBagOStuff extends BagOStuff { return $ret; } + + public function makeKey() { + return call_user_func_array( [ $this->caches[0], __FUNCTION__ ], func_get_args() ); + } + + public function makeGlobalKey() { + return call_user_func_array( [ $this->caches[0], __FUNCTION__ ], func_get_args() ); + } } diff --git a/includes/libs/objectcache/ReplicatedBagOStuff.php b/includes/libs/objectcache/ReplicatedBagOStuff.php index 3bc7ae2a8c..8239491f72 100644 --- a/includes/libs/objectcache/ReplicatedBagOStuff.php +++ b/includes/libs/objectcache/ReplicatedBagOStuff.php @@ -17,7 +17,6 @@ * * @file * @ingroup Cache - * @author Aaron Schulz */ /** diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php index f0a439a21a..a80ed8d663 100644 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@ -17,7 +17,6 @@ * * @file * @ingroup Cache - * @author Aaron Schulz */ use Psr\Log\LoggerAwareInterface; @@ -97,6 +96,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { private $callbackDepth = 0; /** @var mixed[] Temporary warm-up cache */ private $warmupCache = []; + /** @var integer Key fetched */ + private $warmupKeyMisses = 0; /** Max time expected to pass between delete() and DB commit finishing */ const MAX_COMMIT_DELAY = 3; @@ -200,8 +201,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { public static function newEmpty() { return new self( [ 'cache' => new EmptyBagOStuff(), - 'pool' => 'empty', - 'relayer' => new EventRelayerNull( [] ) + 'pool' => 'empty' ] ); } @@ -240,7 +240,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * That method has cache slam avoiding features for hot/expensive keys. * * @param string $key Cache key - * @param mixed $curTTL Approximate TTL left on the key if present/tombstoned [returned] + * @param mixed &$curTTL Approximate TTL left on the key if present/tombstoned [returned] * @param array $checkKeys List of "check" keys * @param float &$asOf UNIX timestamp of cached value; null on failure [returned] * @return mixed Value of cache key or false on failure @@ -261,11 +261,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * @see WANObjectCache::get() * * @param array $keys List of cache keys - * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned] + * @param array &$curTTLs Map of (key => approximate TTL left) for existing keys [returned] * @param array $checkKeys List of check keys to apply to all $keys. May also apply "check" * keys to specific cache keys only by using cache keys as keys in the $checkKeys array. * @param float[] &$asOfs Map of (key => UNIX timestamp of cached value; null on failure) - * @return array Map of (key => value) for keys that exist + * @return array Map of (key => value) for keys that exist and are not tombstoned */ final public function getMulti( array $keys, &$curTTLs = [], array $checkKeys = [], array &$asOfs = [] @@ -298,10 +298,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { if ( $this->warmupCache ) { $wrappedValues = array_intersect_key( $this->warmupCache, array_flip( $keysGet ) ); $keysGet = array_diff( $keysGet, array_keys( $wrappedValues ) ); // keys left to fetch + $this->warmupKeyMisses += count( $keysGet ); } else { $wrappedValues = []; } - $wrappedValues += $this->cache->getMulti( $keysGet ); + if ( $keysGet ) { + $wrappedValues += $this->cache->getMulti( $keysGet ); + } // Time used to compare/init "check" keys (derived after getMulti() to be pessimistic) $now = microtime( true ); @@ -1044,7 +1047,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { } /** - * Method to fetch/regenerate multiple cache keys at once + * Method to fetch multiple cache keys at once with regeneration * * This works the same as getWithSetCallback() except: * - a) The $keys argument expects the result of WANObjectCache::makeMultiKeys() @@ -1059,6 +1062,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * - c) The return value is a map of (cache key => value) in the order of $keyedIds * * @see WANObjectCache::getWithSetCallback() + * @see WANObjectCache::getMultiWithUnionSetCallback() * * Example usage: * @code @@ -1073,7 +1077,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * // Time-to-live (in seconds) * $cache::TTL_DAY, * // Function that derives the new key value - * return function ( $id, $oldValue, &$ttl, array &$setOpts ) { + * function ( $id, $oldValue, &$ttl, array &$setOpts ) { * $dbr = wfGetDB( DB_REPLICA ); * // Account for any snapshot/replica DB lag * $setOpts += Database::getCacheSetOptions( $dbr ); @@ -1103,27 +1107,145 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { final public function getMultiWithSetCallback( ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = [] ) { - $keysWarmUp = iterator_to_array( $keyedIds, true ); + $valueKeys = array_keys( $keyedIds->getArrayCopy() ); $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : []; - foreach ( $checkKeys as $i => $checkKeyOrKeys ) { - if ( is_int( $i ) ) { - $keysWarmUp[] = $checkKeyOrKeys; - } else { - $keysWarmUp = array_merge( $keysWarmUp, $checkKeyOrKeys ); + + // Load required keys into process cache in one go + $this->warmupCache = $this->getRawKeysForWarmup( + $this->getNonProcessCachedKeys( $valueKeys, $opts ), + $checkKeys + ); + $this->warmupKeyMisses = 0; + + // Wrap $callback to match the getWithSetCallback() format while passing $id to $callback + $id = null; // current entity ID + $func = function ( $oldValue, &$ttl, &$setOpts, $oldAsOf ) use ( $callback, &$id ) { + return $callback( $id, $oldValue, $ttl, $setOpts, $oldAsOf ); + }; + + $values = []; + foreach ( $keyedIds as $key => $id ) { // preserve order + $values[$key] = $this->getWithSetCallback( $key, $ttl, $func, $opts ); + } + + $this->warmupCache = []; + + return $values; + } + + /** + * Method to fetch/regenerate multiple cache keys at once + * + * This works the same as getWithSetCallback() except: + * - a) The $keys argument expects the result of WANObjectCache::makeMultiKeys() + * - b) The $callback argument expects a callback returning a map of (ID => new value) + * for all entity IDs in $regenById and it takes the following arguments: + * - $ids: a list of entity IDs to regenerate + * - &$ttls: a reference to the (entity ID => new TTL) map + * - &$setOpts: a reference to options for set() which can be altered + * - c) The return value is a map of (cache key => value) in the order of $keyedIds + * - d) The "lockTSE" and "busyValue" options are ignored + * + * @see WANObjectCache::getWithSetCallback() + * @see WANObjectCache::getMultiWithSetCallback() + * + * Example usage: + * @code + * $rows = $cache->getMultiWithUnionSetCallback( + * // Map of cache keys to entity IDs + * $cache->makeMultiKeys( + * $this->fileVersionIds(), + * function ( $id, WANObjectCache $cache ) { + * return $cache->makeKey( 'file-version', $id ); + * } + * ), + * // Time-to-live (in seconds) + * $cache::TTL_DAY, + * // Function that derives the new key value + * function ( array $ids, array &$ttls, array &$setOpts ) { + * $dbr = wfGetDB( DB_REPLICA ); + * // Account for any snapshot/replica DB lag + * $setOpts += Database::getCacheSetOptions( $dbr ); + * + * // Load the rows for these files + * $rows = []; + * $res = $dbr->select( 'file', '*', [ 'id' => $ids ], __METHOD__ ); + * foreach ( $res as $row ) { + * $rows[$row->id] = $row; + * $mtime = wfTimestamp( TS_UNIX, $row->timestamp ); + * $ttls[$row->id] = $this->adaptiveTTL( $mtime, $ttls[$row->id] ); + * } + * + * return $rows; + * }, + * ] + * ); + * $files = array_map( [ __CLASS__, 'newFromRow' ], $rows ); + * @endcode + * + * @param ArrayIterator $keyedIds Result of WANObjectCache::makeMultiKeys() + * @param integer $ttl Seconds to live for key updates + * @param callable $callback Callback the yields entity regeneration callbacks + * @param array $opts Options map + * @return array Map of (cache key => value) in the same order as $keyedIds + * @since 1.30 + */ + final public function getMultiWithUnionSetCallback( + ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = [] + ) { + $idsByValueKey = $keyedIds->getArrayCopy(); + $valueKeys = array_keys( $idsByValueKey ); + $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : []; + unset( $opts['lockTSE'] ); // incompatible + unset( $opts['busyValue'] ); // incompatible + + // Load required keys into process cache in one go + $keysGet = $this->getNonProcessCachedKeys( $valueKeys, $opts ); + $this->warmupCache = $this->getRawKeysForWarmup( $keysGet, $checkKeys ); + $this->warmupKeyMisses = 0; + + // IDs of entities known to be in need of regeneration + $idsRegen = []; + + // Find out which keys are missing/deleted/stale + $curTTLs = []; + $asOfs = []; + $curByKey = $this->getMulti( $keysGet, $curTTLs, $checkKeys, $asOfs ); + foreach ( $keysGet as $key ) { + if ( !array_key_exists( $key, $curByKey ) || $curTTLs[$key] < 0 ) { + $idsRegen[] = $idsByValueKey[$key]; } } - $this->warmupCache = $this->cache->getMulti( $keysWarmUp ); - $this->warmupCache += array_fill_keys( $keysWarmUp, false ); + // Run the callback to populate the regeneration value map for all required IDs + $newSetOpts = []; + $newTTLsById = array_fill_keys( $idsRegen, $ttl ); + $newValsById = $idsRegen ? $callback( $idsRegen, $newTTLsById, $newSetOpts ) : []; // Wrap $callback to match the getWithSetCallback() format while passing $id to $callback - $id = null; - $func = function ( $oldValue, &$ttl, array $setOpts, $oldAsOf ) use ( $callback, &$id ) { - return $callback( $id, $oldValue, $ttl, $setOpts, $oldAsOf ); + $id = null; // current entity ID + $func = function ( $oldValue, &$ttl, &$setOpts, $oldAsOf ) + use ( $callback, &$id, $newValsById, $newTTLsById, $newSetOpts ) + { + if ( array_key_exists( $id, $newValsById ) ) { + // Value was already regerated as expected, so use the value in $newValsById + $newValue = $newValsById[$id]; + $ttl = $newTTLsById[$id]; + $setOpts = $newSetOpts; + } else { + // Pre-emptive/popularity refresh and version mismatch cases are not detected + // above and thus $newValsById has no entry. Run $callback on this single entity. + $ttls = [ $id => $ttl ]; + $newValue = $callback( [ $id ], $ttls, $setOpts )[$id]; + $ttl = $ttls[$id]; + } + + return $newValue; }; + // Run the cache-aside logic using warmupCache instead of persistent cache queries $values = []; - foreach ( $keyedIds as $key => $id ) { + foreach ( $idsByValueKey as $key => $id ) { // preserve order $values[$key] = $this->getWithSetCallback( $key, $ttl, $func, $opts ); } @@ -1193,7 +1315,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { /** * @see BagOStuff::makeKey() - * @param string ... Key component + * @param string $keys,... Key component * @return string * @since 1.27 */ @@ -1203,7 +1325,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { /** * @see BagOStuff::makeGlobalKey() - * @param string ... Key component + * @param string $keys,... Key component * @return string * @since 1.27 */ @@ -1316,6 +1438,14 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { return (int)min( $maxTTL, max( $minTTL, $factor * $age ) ); } + /** + * @return integer Number of warmup key cache misses last round + * @since 1.30 + */ + public function getWarmupKeyMisses() { + return $this->warmupKeyMisses; + } + /** * Do the actual async bus purge of a key * @@ -1478,7 +1608,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { * * @param array|string|bool $wrapped * @param float $now Unix Current timestamp (preferrably pre-query) - * @return array (mixed; false if absent/invalid, current time left) + * @return array (mixed; false if absent/tombstoned/invalid, current time left) */ protected function unwrap( $wrapped, $now ) { // Check if the value is a tombstone @@ -1573,4 +1703,59 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { return $this->processCaches[$group]; } + + /** + * @param array $keys + * @param array $opts + * @return array List of keys + */ + private function getNonProcessCachedKeys( array $keys, array $opts ) { + $keysFound = []; + if ( isset( $opts['pcTTL'] ) && $opts['pcTTL'] > 0 && $this->callbackDepth == 0 ) { + $pcGroup = isset( $opts['pcGroup'] ) ? $opts['pcGroup'] : self::PC_PRIMARY; + $procCache = $this->getProcessCache( $pcGroup ); + foreach ( $keys as $key ) { + if ( $procCache->get( $key ) !== false ) { + $keysFound[] = $key; + } + } + } + + return array_diff( $keys, $keysFound ); + } + + /** + * @param array $keys + * @param array $checkKeys + * @return array Map of (cache key => mixed) + */ + private function getRawKeysForWarmup( array $keys, array $checkKeys ) { + if ( !$keys ) { + return []; + } + + $keysWarmUp = []; + // Get all the value keys to fetch... + foreach ( $keys as $key ) { + $keysWarmUp[] = self::VALUE_KEY_PREFIX . $key; + } + // Get all the check keys to fetch... + foreach ( $checkKeys as $i => $checkKeyOrKeys ) { + if ( is_int( $i ) ) { + // Single check key that applies to all value keys + $keysWarmUp[] = self::TIME_KEY_PREFIX . $checkKeyOrKeys; + } else { + // List of check keys that apply to value key $i + $keysWarmUp = array_merge( + $keysWarmUp, + self::prefixCacheKeys( $checkKeyOrKeys, self::TIME_KEY_PREFIX ) + ); + } + } + + $warmupCache = $this->cache->getMulti( $keysWarmUp ); + $warmupCache += array_fill_keys( $keysWarmUp, false ); + + return $warmupCache; + } } diff --git a/includes/libs/objectcache/WANObjectCacheReaper.php b/includes/libs/objectcache/WANObjectCacheReaper.php index 956a3a9c3a..1696c59414 100644 --- a/includes/libs/objectcache/WANObjectCacheReaper.php +++ b/includes/libs/objectcache/WANObjectCacheReaper.php @@ -17,7 +17,6 @@ * * @file * @ingroup Cache - * @author Aaron Schulz */ use Psr\Log\LoggerAwareInterface; diff --git a/includes/libs/rdbms/TransactionProfiler.php b/includes/libs/rdbms/TransactionProfiler.php index 5d3534ffaa..8ac41611a3 100644 --- a/includes/libs/rdbms/TransactionProfiler.php +++ b/includes/libs/rdbms/TransactionProfiler.php @@ -19,7 +19,6 @@ * * @file * @ingroup Profiler - * @author Aaron Schulz */ namespace Wikimedia\Rdbms; @@ -119,7 +118,7 @@ class TransactionProfiler implements LoggerAwareInterface { * With conflicting expectations, the most narrow ones will be used * * @param array $expects Map of (event => limit) - * @param $fname + * @param string $fname * @since 1.26 */ public function setExpectations( array $expects, $fname ) { @@ -156,11 +155,13 @@ class TransactionProfiler implements LoggerAwareInterface { */ public function recordConnection( $server, $db, $isMaster ) { // Report when too many connections happen... - if ( $this->hits['conns']++ == $this->expect['conns'] ) { - $this->reportExpectationViolated( 'conns', "[connect to $server ($db)]" ); + if ( $this->hits['conns']++ >= $this->expect['conns'] ) { + $this->reportExpectationViolated( + 'conns', "[connect to $server ($db)]", $this->hits['conns'] ); } - if ( $isMaster && $this->hits['masterConns']++ == $this->expect['masterConns'] ) { - $this->reportExpectationViolated( 'masterConns', "[connect to $server ($db)]" ); + if ( $isMaster && $this->hits['masterConns']++ >= $this->expect['masterConns'] ) { + $this->reportExpectationViolated( + 'masterConns', "[connect to $server ($db)]", $this->hits['masterConns'] ); } } @@ -211,11 +212,11 @@ class TransactionProfiler implements LoggerAwareInterface { } // Report when too many writes/queries happen... - if ( $this->hits['queries']++ == $this->expect['queries'] ) { - $this->reportExpectationViolated( 'queries', $query ); + if ( $this->hits['queries']++ >= $this->expect['queries'] ) { + $this->reportExpectationViolated( 'queries', $query, $this->hits['queries'] ); } - if ( $isWrite && $this->hits['writes']++ == $this->expect['writes'] ) { - $this->reportExpectationViolated( 'writes', $query ); + if ( $isWrite && $this->hits['writes']++ >= $this->expect['writes'] ) { + $this->reportExpectationViolated( 'writes', $query, $this->hits['writes'] ); } // Report slow queries... if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) { @@ -265,8 +266,9 @@ class TransactionProfiler implements LoggerAwareInterface { * @param string $db DB name * @param string $id ID string of transaction * @param float $writeTime Time spent in write queries + * @param integer $affected Number of rows affected by writes */ - public function transactionWritingOut( $server, $db, $id, $writeTime = 0.0 ) { + public function transactionWritingOut( $server, $db, $id, $writeTime = 0.0, $affected = 0 ) { $name = "{$server} ({$db}) (TRX#$id)"; if ( !isset( $this->dbTrxMethodTimes[$name] ) ) { $this->logger->info( "Detected no transaction for '$name' - out of sync." ); @@ -284,6 +286,14 @@ class TransactionProfiler implements LoggerAwareInterface { ); $slow = true; } + // Warn if too many rows were changed... + if ( $affected > $this->expect['maxAffected'] ) { + $this->reportExpectationViolated( + 'maxAffected', + "[transaction $id writes to {$server} ({$db})]", + $affected + ); + } // Fill in the last non-query period... $lastQuery = end( $this->dbTrxMethodTimes[$name] ); if ( $lastQuery ) { @@ -319,20 +329,23 @@ class TransactionProfiler implements LoggerAwareInterface { /** * @param string $expect * @param string $query - * @param string|float|int $actual [optional] + * @param string|float|int $actual */ - protected function reportExpectationViolated( $expect, $query, $actual = null ) { + protected function reportExpectationViolated( $expect, $query, $actual ) { if ( $this->silenced ) { return; } - $n = $this->expect[$expect]; - $by = $this->expectBy[$expect]; - $actual = ( $actual !== null ) ? " (actual: $actual)" : ""; - $this->logger->info( - "Expectation ($expect <= $n) by $by not met$actual:\n$query\n" . - ( new RuntimeException() )->getTraceAsString() + "Expectation ({measure} <= {max}) by {by} not met (actual: {actual}):\n{query}\n" . + ( new RuntimeException() )->getTraceAsString(), + [ + 'measure' => $expect, + 'max' => $this->expect[$expect], + 'by' => $this->expectBy[$expect], + 'actual' => $actual, + 'query' => $query + ] ); } } diff --git a/includes/libs/rdbms/connectionmanager/ConnectionManager.php b/includes/libs/rdbms/connectionmanager/ConnectionManager.php index fc00965ae4..212ff315a8 100644 --- a/includes/libs/rdbms/connectionmanager/ConnectionManager.php +++ b/includes/libs/rdbms/connectionmanager/ConnectionManager.php @@ -2,9 +2,6 @@ namespace Wikimedia\Rdbms; -use Database; -use DBConnRef; -use IDatabase; use InvalidArgumentException; /** diff --git a/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php b/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php index fb031822e7..30b1fb4c60 100644 --- a/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php +++ b/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php @@ -2,9 +2,6 @@ namespace Wikimedia\Rdbms; -use Database; -use DBConnRef; - /** * Database connection manager. * diff --git a/includes/libs/rdbms/database/DBConnRef.php b/includes/libs/rdbms/database/DBConnRef.php index fc3ebe024a..eb0e954e16 100644 --- a/includes/libs/rdbms/database/DBConnRef.php +++ b/includes/libs/rdbms/database/DBConnRef.php @@ -1,14 +1,14 @@ __call( __FUNCTION__, func_get_args() ); } + public function pendingWriteRowsAffected() { + return $this->__call( __FUNCTION__, func_get_args() ); + } + public function isOpen() { return $this->__call( __FUNCTION__, func_get_args() ); } @@ -243,13 +247,13 @@ class DBConnRef implements IDatabase { } public function selectField( - $table, $var, $cond = '', $fname = __METHOD__, $options = [] + $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ) { return $this->__call( __FUNCTION__, func_get_args() ); } public function selectFieldValues( - $table, $var, $cond = '', $fname = __METHOD__, $options = [] + $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ) { return $this->__call( __FUNCTION__, func_get_args() ); } @@ -349,6 +353,10 @@ class DBConnRef implements IDatabase { return $this->__call( __FUNCTION__, func_get_args() ); } + public function databasesAreIndependent() { + return $this->__call( __FUNCTION__, func_get_args() ); + } + public function selectDB( $db ) { return $this->__call( __FUNCTION__, func_get_args() ); } @@ -403,7 +411,7 @@ class DBConnRef implements IDatabase { public function insertSelect( $destTable, $srcTable, $varMap, $conds, - $fname = __METHOD__, $insertOptions = [], $selectOptions = [] + $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { return $this->__call( __FUNCTION__, func_get_args() ); } @@ -416,6 +424,13 @@ class DBConnRef implements IDatabase { return $this->__call( __FUNCTION__, func_get_args() ); } + public function unionConditionPermutations( + $table, $vars, array $permute_conds, $extra_conds = '', $fname = __METHOD__, + $options = [], $join_conds = [] + ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } + public function conditional( $cond, $trueVal, $falseVal ) { return $this->__call( __FUNCTION__, func_get_args() ); } @@ -603,3 +618,5 @@ class DBConnRef implements IDatabase { } } } + +class_alias( DBConnRef::class, 'DBConnRef' ); diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 90e60a322e..7349b63a59 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -23,16 +23,18 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; + use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Wikimedia\ScopedCallback; -use Wikimedia\Rdbms\TransactionProfiler; -use Wikimedia\Rdbms\LikeMatch; -use Wikimedia\Rdbms\DatabaseDomain; -use Wikimedia\Rdbms\ResultWrapper; -use Wikimedia\Rdbms\DBMasterPos; -use Wikimedia\Rdbms\Blob; use Wikimedia\Timestamp\ConvertibleTimestamp; +use MediaWiki; +use BagOStuff; +use HashBagOStuff; +use InvalidArgumentException; +use Exception; +use RuntimeException; /** * Relational database abstraction object @@ -198,6 +200,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @var integer Number of write queries for the current transaction */ private $mTrxWriteQueryCount = 0; + /** + * @var integer Number of rows affected by write queries for the current transaction + */ + private $mTrxWriteAffectedRows = 0; /** * @var float Like mTrxWriteQueryCount but excludes lock-bound, easy to replicate, queries */ @@ -337,6 +343,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware 'oracle' => [], 'mssql' => [], ]; + static $classAliases = [ + 'DatabaseMssql' => DatabaseMssql::class, + 'DatabaseMysql' => DatabaseMysql::class, + 'DatabaseMysqli' => DatabaseMysqli::class, + 'DatabaseSqlite' => DatabaseSqlite::class, + 'DatabasePostgres' => DatabasePostgres::class + ]; $driver = false; $dbType = strtolower( $dbType ); @@ -360,13 +373,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } else { $driver = $dbType; } + if ( $driver === false || $driver === '' ) { throw new InvalidArgumentException( __METHOD__ . " no viable database extension found for type '$dbType'" ); } $class = 'Database' . ucfirst( $driver ); - if ( class_exists( $class ) && is_subclass_of( $class, 'IDatabase' ) ) { + if ( isset( $classAliases[$class] ) ) { + $class = $classAliases[$class]; + } + + if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) { // Resolve some defaults for b/c $p['host'] = isset( $p['host'] ) ? $p['host'] : false; $p['user'] = isset( $p['user'] ) ? $p['user'] : false; @@ -402,6 +420,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $conn; } + /** + * Set the PSR-3 logger interface to use for query logging. (The logger + * interfaces for connection logging and error logging can be set with the + * constructor.) + * + * @param LoggerInterface $logger + */ public function setLogger( LoggerInterface $logger ) { $this->queryLogger = $logger; } @@ -562,6 +587,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $this->mTrxLevel ? $this->mTrxWriteCallers : []; } + public function pendingWriteRowsAffected() { + return $this->mTrxWriteAffectedRows; + } + + /** + * Get the list of method names that have pending write queries or callbacks + * for this transaction + * + * @return array + */ protected function pendingWriteAndCallbackCallers() { if ( !$this->mTrxLevel ) { return []; @@ -650,6 +685,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware */ abstract function strencode( $s ); + /** + * Set a custom error handler for logging errors during database connection + */ protected function installErrorHandler() { $this->mPHPError = false; $this->htmlErrors = ini_set( 'html_errors', '0' ); @@ -657,6 +695,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** + * Restore the previous error handler and return the last PHP error for this DB + * * @return bool|string */ protected function restoreErrorHandler() { @@ -683,6 +723,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** + * Error handler for logging errors during database connection * This method should not be used outside of Database classes * * @param int $errno @@ -777,7 +818,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** - * @param $sql + * @param string $sql * @return string|null */ protected function getQueryVerb( $sql ) { @@ -803,7 +844,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware /** * @param string $sql A SQL query - * @return bool Whether $sql is SQL for creating/dropping a new TEMPORARY table + * @return bool Whether $sql is SQL for TEMPORARY table operation */ protected function registerTempTableOperation( $sql ) { if ( preg_match( @@ -819,9 +860,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $sql, $matches ) ) { + $isTemp = isset( $this->mSessionTempTables[$matches[1]] ); unset( $this->mSessionTempTables[$matches[1]] ); - return true; + return $isTemp; + } elseif ( preg_match( + '/^TRUNCATE\s+(?:TEMPORARY\s+)?TABLE\s+(?:IF\s+EXISTS\s+)?[`"\']?(\w+)[`"\']?/i', + $sql, + $matches + ) ) { + return isset( $this->mSessionTempTables[$matches[1]] ); } elseif ( preg_match( '/^(?:INSERT\s+(?:\w+\s+)?INTO|UPDATE|DELETE\s+FROM)\s+[`"\']?(\w+)[`"\']?/i', $sql, @@ -837,8 +885,16 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $priorWritesPending = $this->writesOrCallbacksPending(); $this->mLastQuery = $sql; - $isWrite = $this->isWriteQuery( $sql ) && !$this->registerTempTableOperation( $sql ); + $isWrite = $this->isWriteQuery( $sql ); if ( $isWrite ) { + $isNonTempWrite = !$this->registerTempTableOperation( $sql ); + } else { + $isNonTempWrite = false; + } + + if ( $isWrite ) { + # In theory, non-persistent writes are allowed in read-only mode, but due to things + # like https://bugs.mysql.com/bug.php?id=33669 that might not work anyway... $reason = $this->getReadOnlyReason(); if ( $reason !== false ) { throw new DBReadOnlyError( $this, "Database is read-only: $reason" ); @@ -847,8 +903,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->mLastWriteTime = microtime( true ); } - // Add trace comment to the begin of the sql string, right after the operator. - // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598) + # Add trace comment to the begin of the sql string, right after the operator. + # Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598) $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 ); # Start implicit transactions that wrap the request if DBO_TRX is enabled @@ -874,7 +930,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->assertOpen(); # Send the query to the server - $ret = $this->doProfiledQuery( $sql, $commentedSql, $isWrite, $fname ); + $ret = $this->doProfiledQuery( $sql, $commentedSql, $isNonTempWrite, $fname ); # Try reconnecting if the connection was lost if ( false === $ret && $this->wasErrorReissuable() ) { @@ -895,7 +951,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->reportQueryError( $lastError, $lastErrno, $sql, $fname ); } else { # Should be safe to silently retry the query - $ret = $this->doProfiledQuery( $sql, $commentedSql, $isWrite, $fname ); + $ret = $this->doProfiledQuery( $sql, $commentedSql, $isNonTempWrite, $fname ); } } else { $msg = __METHOD__ . ": lost connection to {$this->getServer()} permanently"; @@ -924,6 +980,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $res; } + /** + * Helper method for query() that handles profiling and logging and sends + * the query to doQuery() + * + * @param string $sql Original SQL query + * @param string $commentedSql SQL query with debugging/trace comment + * @param bool $isWrite Whether the query is a (non-temporary) write operation + * @param string $fname Name of the calling function + * @return bool|ResultWrapper True for a successful write query, ResultWrapper + * object for a successful read query, or false on failure + */ private function doProfiledQuery( $sql, $commentedSql, $isWrite, $fname ) { $isMaster = !is_null( $this->getLBInfo( 'master' ) ); # generalizeSQL() will probably cut down the query to reasonable @@ -952,7 +1019,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $ret !== false ) { $this->lastPing = $startTime; if ( $isWrite && $this->mTrxLevel ) { - $this->updateTrxWriteQueryTime( $sql, $queryRuntime ); + $this->updateTrxWriteQueryTime( $sql, $queryRuntime, $this->affectedRows() ); $this->mTrxWriteCallers[] = $fname; } } @@ -983,8 +1050,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * * @param string $sql A SQL write query * @param float $runtime Total runtime, including RTT + * @param integer $affected Affected row count */ - private function updateTrxWriteQueryTime( $sql, $runtime ) { + private function updateTrxWriteQueryTime( $sql, $runtime, $affected ) { // Whether this is indicative of replica DB runtime (except for RBR or ws_repl) $indicativeOfReplicaRuntime = true; if ( $runtime > self::SLOW_WRITE_SEC ) { @@ -999,12 +1067,23 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->mTrxWriteDuration += $runtime; $this->mTrxWriteQueryCount += 1; + $this->mTrxWriteAffectedRows += $affected; if ( $indicativeOfReplicaRuntime ) { $this->mTrxWriteAdjDuration += $runtime; $this->mTrxWriteAdjQueryCount += 1; } } + /** + * Determine whether or not it is safe to retry queries after a database + * connection is lost + * + * @param string $sql SQL query + * @param bool $priorWritesPending Whether there is a transaction open with + * possible write queries or transaction pre-commit/idle callbacks + * waiting on it to finish. + * @return bool True if it is safe to retry the query, false otherwise + */ private function canRecoverFromDisconnect( $sql, $priorWritesPending ) { # Transaction dropped; this can mean lost writes, or REPEATABLE-READ snapshots. # Dropped connections also mean that named locks are automatically released. @@ -1025,6 +1104,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return true; } + /** + * Clean things up after transaction loss due to disconnection + * + * @return null|Exception + */ private function handleSessionLoss() { $this->mTrxLevel = 0; $this->mTrxIdleCallbacks = []; // T67263 @@ -1066,7 +1150,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function selectField( - $table, $var, $cond = '', $fname = __METHOD__, $options = [] + $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ) { if ( $var === '*' ) { // sanity throw new DBUnexpectedError( $this, "Cannot use a * field: got '$var'" ); @@ -1078,7 +1162,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $options['LIMIT'] = 1; - $res = $this->select( $table, $var, $cond, $fname, $options ); + $res = $this->select( $table, $var, $cond, $fname, $options, $join_conds ); if ( $res === false || !$this->numRows( $res ) ) { return false; } @@ -1542,7 +1626,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $sql .= " WHERE " . $this->makeList( $conds, self::LIST_AND ); } - return $this->query( $sql, $fname ); + return (bool)$this->query( $sql, $fname ); } public function makeList( $a, $mode = self::LIST_COMMA ) { @@ -1676,6 +1760,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $field; } + public function databasesAreIndependent() { + return false; + } + public function selectDB( $db ) { # Stub. Shouldn't cause serious problems if it's not overridden, but # if your database engine supports a concept similar to MySQL's @@ -1714,8 +1802,33 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } # Split database and table into proper variables. - # We reverse the explode so that database.table and table both output - # the correct table. + list( $database, $schema, $prefix, $table ) = $this->qualifiedTableComponents( $name ); + + # 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 !== '' + ) { + $tableName = $this->addIdentifierQuotes( $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; + } + + /** + * Get the table components needed for a query given the currently selected database + * + * @param string $name Table name in the form of db.schema.table, db.table, or table + * @return array (DB name or "" for default, schema name, table prefix, table name) + */ + protected function qualifiedTableComponents( $name ) { + # We reverse the explode so that database.table and table both output the correct table. $dbDetails = explode( '.', $name, 3 ); if ( count( $dbDetails ) == 3 ) { list( $database, $schema, $table ) = $dbDetails; @@ -1745,21 +1858,7 @@ 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 !== '' - ) { - $tableName = $this->addIdentifierQuotes( $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; + return [ $database, $schema, $prefix, $table ]; } /** @@ -1949,7 +2048,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** - * Get the name of an index in a given table. + * Allows for index remapping in queries where this is not consistent across DBMS * * @param string $index * @return string @@ -2005,8 +2104,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @param string $s * @return string */ - protected function escapeLikeInternal( $s ) { - return addcslashes( $s, '\%_' ); + protected function escapeLikeInternal( $s, $escapeChar = '`' ) { + return str_replace( [ $escapeChar, '%', '_' ], + [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_" ], + $s ); } public function buildLike() { @@ -2018,15 +2119,21 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $s = ''; + // We use ` instead of \ as the default LIKE escape character, since addQuotes() + // may escape backslashes, creating problems of double escaping. The ` + // character has good cross-DBMS compatibility, avoiding special operators + // in MS SQL like ^ and % + $escapeChar = '`'; + foreach ( $params as $value ) { if ( $value instanceof LikeMatch ) { $s .= $value->toString(); } else { - $s .= $this->escapeLikeInternal( $value ); + $s .= $this->escapeLikeInternal( $value, $escapeChar ); } } - return " LIKE {$this->addQuotes( $s )} "; + return ' LIKE ' . $this->addQuotes( $s ) . ' ESCAPE ' . $this->addQuotes( $escapeChar ) . ' '; } public function anyChar() { @@ -2260,7 +2367,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function insertSelect( $destTable, $srcTable, $varMap, $conds, - $fname = __METHOD__, $insertOptions = [], $selectOptions = [] + $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { if ( $this->cliMode ) { // For massive migrations with downtime, we don't want to select everything @@ -2272,7 +2379,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $conds, $fname, $insertOptions, - $selectOptions + $selectOptions, + $selectJoinConds ); } @@ -2284,7 +2392,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $fields[] = $this->fieldNameWithAlias( $sourceColumnOrSql, $dstColumn ); } $selectOptions[] = 'FOR UPDATE'; - $res = $this->select( $srcTable, implode( ',', $fields ), $conds, $fname, $selectOptions ); + $res = $this->select( + $srcTable, implode( ',', $fields ), $conds, $fname, $selectOptions, $selectJoinConds + ); if ( !$res ) { return false; } @@ -2297,9 +2407,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return $this->insert( $destTable, $rows, $fname, $insertOptions ); } + /** + * Native server-side implementation of insertSelect() for situations where + * we don't want to select everything into memory + * + * @see IDatabase::insertSelect() + */ protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, - $insertOptions = [], $selectOptions = [] + $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { $destTable = $this->tableName( $destTable ); @@ -2309,32 +2425,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $insertOptions = $this->makeInsertOptions( $insertOptions ); - if ( !is_array( $selectOptions ) ) { - $selectOptions = [ $selectOptions ]; - } - - list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) = $this->makeSelectOptions( - $selectOptions ); - - if ( is_array( $srcTable ) ) { - $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) ); - } else { - $srcTable = $this->tableName( $srcTable ); - } + $selectSql = $this->selectSQLText( + $srcTable, + array_values( $varMap ), + $conds, + $fname, + $selectOptions, + $selectJoinConds + ); $sql = "INSERT $insertOptions" . - " INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' . - " SELECT $startOpts " . implode( ',', $varMap ) . - " FROM $srcTable $useIndex $ignoreIndex "; - - if ( $conds != '*' ) { - if ( is_array( $conds ) ) { - $conds = $this->makeList( $conds, self::LIST_AND ); - } - $sql .= " WHERE $conds"; - } - - $sql .= " $tailOpts"; + " INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ') ' . + $selectSql; return $this->query( $sql, $fname ); } @@ -2379,6 +2481,77 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return '(' . implode( $glue, $sqls ) . ')'; } + public function unionConditionPermutations( + $table, $vars, array $permute_conds, $extra_conds = '', $fname = __METHOD__, + $options = [], $join_conds = [] + ) { + // First, build the Cartesian product of $permute_conds + $conds = [ [] ]; + foreach ( $permute_conds as $field => $values ) { + if ( !$values ) { + // Skip empty $values + continue; + } + $values = array_unique( $values ); // For sanity + $newConds = []; + foreach ( $conds as $cond ) { + foreach ( $values as $value ) { + $cond[$field] = $value; + $newConds[] = $cond; // Arrays are by-value, not by-reference, so this works + } + } + $conds = $newConds; + } + + $extra_conds = $extra_conds === '' ? [] : (array)$extra_conds; + + // If there's just one condition and no subordering, hand off to + // selectSQLText directly. + if ( count( $conds ) === 1 && + ( !isset( $options['INNER ORDER BY'] ) || !$this->unionSupportsOrderAndLimit() ) + ) { + return $this->selectSQLText( + $table, $vars, $conds[0] + $extra_conds, $fname, $options, $join_conds + ); + } + + // Otherwise, we need to pull out the order and limit to apply after + // the union. Then build the SQL queries for each set of conditions in + // $conds. Then union them together (using UNION ALL, because the + // product *should* already be distinct). + $orderBy = $this->makeOrderBy( $options ); + $limit = isset( $options['LIMIT'] ) ? $options['LIMIT'] : null; + $offset = isset( $options['OFFSET'] ) ? $options['OFFSET'] : false; + $all = empty( $options['NOTALL'] ) && !in_array( 'NOTALL', $options ); + if ( !$this->unionSupportsOrderAndLimit() ) { + unset( $options['ORDER BY'], $options['LIMIT'], $options['OFFSET'] ); + } else { + if ( array_key_exists( 'INNER ORDER BY', $options ) ) { + $options['ORDER BY'] = $options['INNER ORDER BY']; + } + if ( $limit !== null && is_numeric( $offset ) && $offset != 0 ) { + // We need to increase the limit by the offset rather than + // using the offset directly, otherwise it'll skip incorrectly + // in the subqueries. + $options['LIMIT'] = $limit + $offset; + unset( $options['OFFSET'] ); + } + } + + $sqls = []; + foreach ( $conds as $cond ) { + $sqls[] = $this->selectSQLText( + $table, $vars, $cond + $extra_conds, $fname, $options, $join_conds + ); + } + $sql = $this->unionQueries( $sqls, $all ) . $orderBy; + if ( $limit !== null ) { + $sql = $this->limitResult( $sql, $limit, $offset ); + } + + return $sql; + } + public function conditional( $cond, $trueVal, $falseVal ) { if ( is_array( $cond ) ) { $cond = $this->makeList( $cond, self::LIST_AND ); @@ -2491,10 +2664,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } final public function onTransactionPreCommitOrIdle( callable $callback, $fname = __METHOD__ ) { - if ( $this->mTrxLevel ) { + if ( $this->mTrxLevel || $this->getFlag( self::DBO_TRX ) ) { + // As long as DBO_TRX is set, writes will accumulate until the load balancer issues + // an implicit commit of all peer databases. This is true even if a transaction has + // not yet been triggered by writes; make sure $callback runs *after* any such writes. $this->mTrxPreCommitCallbacks[] = [ $callback, $fname ]; } else { - // If no transaction is active, then make one for this callback + // No transaction is active nor will start implicitly, so make one for this callback $this->startAtomic( __METHOD__ ); try { call_user_func( $callback ); @@ -2713,6 +2889,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->mTrxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) ); $this->mTrxWriteDuration = 0.0; $this->mTrxWriteQueryCount = 0; + $this->mTrxWriteAffectedRows = 0; $this->mTrxWriteAdjDuration = 0.0; $this->mTrxWriteAdjQueryCount = 0; $this->mTrxWriteCallers = []; @@ -2779,7 +2956,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $this->mTrxDoneWrites ) { $this->mLastWriteTime = microtime( true ); $this->trxProfiler->transactionWritingOut( - $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime ); + $this->mServer, + $this->mDBname, + $this->mTrxShortId, + $writeTime, + $this->mTrxWriteAffectedRows + ); } $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT ); @@ -2824,7 +3006,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->mTrxAtomicLevels = []; if ( $this->mTrxDoneWrites ) { $this->trxProfiler->transactionWritingOut( - $this->mServer, $this->mDBname, $this->mTrxShortId ); + $this->mServer, + $this->mDBname, + $this->mTrxShortId + ); } $this->mTrxIdleCallbacks = []; // clear @@ -2941,7 +3126,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** - * @return bool + * Close existing database connection and open a new connection + * + * @return bool True if new connection is opened successfully, false if error */ protected function reconnect() { $this->closeConnection(); @@ -3003,7 +3190,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @see WANObjectCache::getWithSetCallback() * * @param IDatabase $db1 - * @param IDatabase ... + * @param IDatabase $dbs,... * @return array Map of values: * - lag: highest lag of any of the DBs or false on error (e.g. replication stopped) * - since: oldest UNIX timestamp of any of the DB lag estimates @@ -3293,26 +3480,51 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return false; } + public function tableLocksHaveTransactionScope() { + return true; + } + + final public function lockTables( array $read, array $write, $method ) { + if ( $this->writesOrCallbacksPending() ) { + throw new DBUnexpectedError( $this, "Transaction writes or callbacks still pending." ); + } + + if ( $this->tableLocksHaveTransactionScope() ) { + $this->startAtomic( $method ); + } + + return $this->doLockTables( $read, $write, $method ); + } + /** - * Lock specific tables + * Helper function for lockTables() that handles the actual table locking * * @param array $read Array of tables to lock for read access * @param array $write Array of tables to lock for write access * @param string $method Name of caller - * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY - * @return bool + * @return true */ - public function lockTables( $read, $write, $method, $lowPriority = true ) { + protected function doLockTables( array $read, array $write, $method ) { return true; } + final public function unlockTables( $method ) { + if ( $this->tableLocksHaveTransactionScope() ) { + $this->endAtomic( $method ); + + return true; // locks released on COMMIT/ROLLBACK + } + + return $this->doUnlockTables( $method ); + } + /** - * Unlock specific tables + * Helper function for unlockTables() that handles the actual table unlocking * - * @param string $method The caller - * @return bool + * @param string $method Name of caller + * @return true */ - public function unlockTables( $method ) { + protected function doUnlockTables( $method ) { return true; } @@ -3466,4 +3678,5 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } } -class_alias( Database::class, 'DatabaseBase' ); +class_alias( Database::class, 'DatabaseBase' ); // b/c for old name +class_alias( Database::class, 'Database' ); // b/c global alias diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php index 75ddc9d514..8f3cab8314 100644 --- a/includes/libs/rdbms/database/DatabaseMssql.php +++ b/includes/libs/rdbms/database/DatabaseMssql.php @@ -24,11 +24,12 @@ * @author Ryan Biesemeyer * @author Ryan Schmidt */ -use Wikimedia\Rdbms\Blob; -use Wikimedia\Rdbms\MssqlBlob; -use Wikimedia\Rdbms\MssqlField; -use Wikimedia\Rdbms\ResultWrapper; -use Wikimedia\Rdbms\MssqlResultWrapper; + +namespace Wikimedia\Rdbms; + +use MediaWiki; +use Exception; +use stdClass; /** * @ingroup Database @@ -716,11 +717,12 @@ class DatabaseMssql extends Database { * @param string $fname * @param array $insertOptions * @param array $selectOptions + * @param array $selectJoinConds * @return null|ResultWrapper * @throws Exception */ public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, - $insertOptions = [], $selectOptions = [] + $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { $this->mScrollableCursor = false; try { @@ -731,7 +733,8 @@ class DatabaseMssql extends Database { $conds, $fname, $insertOptions, - $selectOptions + $selectOptions, + $selectJoinConds ); } catch ( Exception $e ) { $this->mScrollableCursor = true; @@ -1109,27 +1112,11 @@ class DatabaseMssql extends Database { * @param string $s * @return string */ - protected function escapeLikeInternal( $s ) { - return addcslashes( $s, '\%_[]^' ); - } - - /** - * MS SQL requires specifying the escape character used in a LIKE query - * or using Square brackets to surround characters that are to be escaped - * 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 - * - * @return string Fully built LIKE statement - */ - public function buildLike() { - $params = func_get_args(); - if ( count( $params ) > 0 && is_array( $params[0] ) ) { - $params = $params[0]; - } - - return parent::buildLike( $params ) . " ESCAPE '\' "; + protected function escapeLikeInternal( $s, $escapeChar = '`' ) { + return str_replace( [ $escapeChar, '%', '_', '[', ']', '^' ], + [ "{$escapeChar}{$escapeChar}", "{$escapeChar}%", "{$escapeChar}_", + "{$escapeChar}[", "{$escapeChar}]", "{$escapeChar}^" ], + $s ); } /** @@ -1360,3 +1347,5 @@ class DatabaseMssql extends Database { return $old; } } + +class_alias( DatabaseMssql::class, 'DatabaseMssql' ); diff --git a/includes/libs/rdbms/database/DatabaseMysql.php b/includes/libs/rdbms/database/DatabaseMysql.php index 9ab7c64c1e..77e797d49c 100644 --- a/includes/libs/rdbms/database/DatabaseMysql.php +++ b/includes/libs/rdbms/database/DatabaseMysql.php @@ -20,6 +20,7 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; /** * Database abstraction object for PHP extension mysql. @@ -202,3 +203,5 @@ class DatabaseMysql extends DatabaseMysqlBase { return mysql_real_escape_string( $s, $conn ); } } + +class_alias( DatabaseMysql::class, 'DatabaseMysql' ); diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index e90002797c..991e0c6660 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -20,10 +20,14 @@ * @file * @ingroup Database */ -use Wikimedia\Rdbms\DBMasterPos; -use Wikimedia\Rdbms\MySQLMasterPos; -use Wikimedia\Rdbms\MySQLField; -use Wikimedia\Rdbms\ResultWrapper; +namespace Wikimedia\Rdbms; + +use DateTime; +use DateTimeZone; +use MediaWiki; +use InvalidArgumentException; +use Exception; +use stdClass; /** * Database abstraction object for MySQL. @@ -523,14 +527,28 @@ abstract class DatabaseMysqlBase extends Database { } public function tableExists( $table, $fname = __METHOD__ ) { - $table = $this->tableName( $table, 'raw' ); - if ( isset( $this->mSessionTempTables[$table] ) ) { + // Split database and table into proper variables as Database::tableName() returns + // shared tables prefixed with their database, which do not work in SHOW TABLES statements + list( $database, , $prefix, $table ) = $this->qualifiedTableComponents( $table ); + $tableName = "{$prefix}{$table}"; + + if ( isset( $this->mSessionTempTables[$tableName] ) ) { return true; // already known to exist and won't show in SHOW TABLES anyway } - $encLike = $this->buildLike( $table ); + // We can't use buildLike() here, because it specifies an escape character + // other than the backslash, which is the only one supported by SHOW TABLES + $encLike = $this->escapeLikeInternal( $tableName, '\\' ); - return $this->query( "SHOW TABLES $encLike", $fname )->numRows() > 0; + // If the database has been specified (such as for shared tables), use "FROM" + if ( $database !== '' ) { + $encDatabase = $this->addIdentifierQuotes( $database ); + $query = "SHOW TABLES FROM $encDatabase LIKE '$encLike'"; + } else { + $query = "SHOW TABLES LIKE '$encLike'"; + } + + return $this->query( $query, $fname )->numRows() > 0; } /** @@ -971,8 +989,8 @@ abstract class DatabaseMysqlBase extends Database { } /** - * @param string $sql - * @param string $newLine + * @param string &$sql + * @param string &$newLine * @return bool */ public function streamStatementEnd( &$sql, &$newLine ) { @@ -1054,36 +1072,26 @@ abstract class DatabaseMysqlBase extends Database { return true; } - /** - * @param array $read - * @param array $write - * @param string $method - * @param bool $lowPriority - * @return bool - */ - public function lockTables( $read, $write, $method, $lowPriority = true ) { - $items = []; + public function tableLocksHaveTransactionScope() { + return false; // tied to TCP connection + } + protected function doLockTables( array $read, array $write, $method ) { + $items = []; foreach ( $write as $table ) { - $tbl = $this->tableName( $table ) . - ( $lowPriority ? ' LOW_PRIORITY' : '' ) . - ' WRITE'; - $items[] = $tbl; + $items[] = $this->tableName( $table ) . ' WRITE'; } foreach ( $read as $table ) { $items[] = $this->tableName( $table ) . ' READ'; } + $sql = "LOCK TABLES " . implode( ',', $items ); $this->query( $sql, $method ); return true; } - /** - * @param string $method - * @return bool - */ - public function unlockTables( $method ) { + protected function doUnlockTables( $method ) { $this->query( "UNLOCK TABLES", $method ); return true; @@ -1335,4 +1343,40 @@ abstract class DatabaseMysqlBase extends Database { public function isView( $name, $prefix = null ) { return in_array( $name, $this->listViews( $prefix ) ); } + + /** + * Allows for index remapping in queries where this is not consistent across DBMS + * + * @param string $index + * @return string + */ + protected function indexName( $index ) { + /** + * When SQLite indexes were introduced in r45764, it was noted that + * SQLite requires index names to be unique within the whole database, + * not just within a schema. As discussed in CR r45819, to avoid the + * need for a schema change on existing installations, the indexes + * were implicitly mapped from the new names to the old names. + * + * This mapping can be removed if DB patches are introduced to alter + * the relevant tables in existing installations. Note that because + * this index mapping applies to table creation, even new installations + * of MySQL have the old names (except for installations created during + * a period where this mapping was inappropriately removed, see + * T154872). + */ + $renamed = [ + 'ar_usertext_timestamp' => 'usertext_timestamp', + 'un_user_id' => 'user_id', + 'un_user_ip' => 'user_ip', + ]; + + if ( isset( $renamed[$index] ) ) { + return $renamed[$index]; + } else { + return $index; + } + } } + +class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' ); diff --git a/includes/libs/rdbms/database/DatabaseMysqli.php b/includes/libs/rdbms/database/DatabaseMysqli.php index 7a2200a4da..4d1b87b1f9 100644 --- a/includes/libs/rdbms/database/DatabaseMysqli.php +++ b/includes/libs/rdbms/database/DatabaseMysqli.php @@ -20,8 +20,11 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; -use Wikimedia\Rdbms\ResultWrapper; +use mysqli; +use mysqli_result; +use IP; /** * Database abstraction object for PHP extension mysqli. @@ -188,7 +191,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param mysqli $res + * @param mysqli_result $res * @return bool */ protected function mysqlFreeResult( $res ) { @@ -198,7 +201,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param mysqli $res + * @param mysqli_result $res * @return bool */ protected function mysqlFetchObject( $res ) { @@ -211,7 +214,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param mysqli $res + * @param mysqli_result $res * @return bool */ protected function mysqlFetchArray( $res ) { @@ -224,7 +227,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param mysqli $res + * @param mysqli_result $res * @return mixed */ protected function mysqlNumRows( $res ) { @@ -263,7 +266,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param resource|ResultWrapper $res + * @param mysqli $res * @param int $n * @return mixed */ @@ -274,7 +277,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param resource|ResultWrapper $res + * @param mysqli $res * @param int $n * @return mixed */ @@ -285,7 +288,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { } /** - * @param resource|ResultWrapper $res + * @param mysqli_result $res * @param int $row * @return mixed */ @@ -331,3 +334,5 @@ class DatabaseMysqli extends DatabaseMysqlBase { } } } + +class_alias( DatabaseMysqli::class, 'DatabaseMysqli' ); diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index af9716d451..bdac06c121 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -20,12 +20,12 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; + use Wikimedia\Timestamp\ConvertibleTimestamp; use Wikimedia\WaitConditionLoop; -use Wikimedia\Rdbms\Blob; -use Wikimedia\Rdbms\PostgresBlob; -use Wikimedia\Rdbms\PostgresField; -use Wikimedia\Rdbms\ResultWrapper; +use MediaWiki; +use Exception; /** * @ingroup Database @@ -105,7 +105,10 @@ class DatabasePostgres extends Database { $this->mDBname = $dbName; $connectVars = [ - 'dbname' => $dbName, + // pg_connect() user $user as the default database. Since a database is *required*, + // at least pick a "don't care" database that is more likely to exist. This case + // arrises when LoadBalancer::getConnection( $i, [], '' ) is used. + 'dbname' => strlen( $dbName ) ? $dbName : 'postgres', 'user' => $user, 'password' => $password ]; @@ -165,11 +168,16 @@ class DatabasePostgres extends Database { return $this->mConn; } + public function databasesAreIndependent() { + return true; + } + /** * Postgres doesn't support selectDB in the same way MySQL does. So if the * DB name doesn't match the open connection, open a new one * @param string $db * @return bool + * @throws DBUnexpectedError */ public function selectDB( $db ) { if ( $this->mDBname !== $db ) { @@ -248,7 +256,10 @@ class DatabasePostgres extends Database { } /* Transaction stays in the ERROR state until rolled back */ if ( $this->mTrxLevel ) { - $this->rollback( __METHOD__ ); + // Throw away the transaction state, then raise the error as normal. + // Note that if this connection is managed by LBFactory, it's already expected + // that the other transactions LBFactory manages will be rolled back. + $this->rollback( __METHOD__, self::FLUSHING_INTERNAL ); } parent::reportQueryError( $error, $errno, $sql, $fname, false ); } @@ -673,14 +684,13 @@ __INDEXATTR__; * @param string $fname * @param array $insertOptions * @param array $selectOptions + * @param array $selectJoinConds * @return bool */ public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, - $insertOptions = [], $selectOptions = [] + $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { - $destTable = $this->tableName( $destTable ); - if ( !is_array( $insertOptions ) ) { $insertOptions = [ $insertOptions ]; } @@ -697,28 +707,9 @@ __INDEXATTR__; $savepoint->savepoint(); } - if ( !is_array( $selectOptions ) ) { - $selectOptions = [ $selectOptions ]; - } - list( $startOpts, $useIndex, $tailOpts, $ignoreIndex ) = - $this->makeSelectOptions( $selectOptions ); - if ( is_array( $srcTable ) ) { - $srcTable = implode( ',', array_map( [ $this, 'tableName' ], $srcTable ) ); - } else { - $srcTable = $this->tableName( $srcTable ); - } - - $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' . - " SELECT $startOpts " . implode( ',', $varMap ) . - " FROM $srcTable $useIndex $ignoreIndex "; - - if ( $conds != '*' ) { - $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND ); - } - - $sql .= " $tailOpts"; + $res = parent::nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname, + $insertOptions, $selectOptions, $selectJoinConds ); - $res = (bool)$this->query( $sql, $fname, $savepoint ); if ( $savepoint ) { $bar = pg_result_error( $this->mLastResult ); if ( $bar != false ) { @@ -768,7 +759,7 @@ __INDEXATTR__; $safeseq = str_replace( "'", "''", $seqName ); $res = $this->query( "SELECT nextval('$safeseq')" ); $row = $this->fetchRow( $res ); - $this->mInsertId = $row[0]; + $this->mInsertId = is_null( $row[0] ) ? null : (int)$row[0]; return $this->mInsertId; } @@ -820,7 +811,7 @@ __INDEXATTR__; $oldName = $this->addIdentifierQuotes( $oldName ); return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName " . - "(LIKE $oldName INCLUDING DEFAULTS)", $fname ); + "(LIKE $oldName INCLUDING DEFAULTS INCLUDING INDEXES)", $fname ); } public function listTables( $prefix = null, $fname = __METHOD__ ) { @@ -859,10 +850,10 @@ __INDEXATTR__; * * @since 1.19 * @param string $text Postgreql array returned in a text form like {a,b} - * @param string $output + * @param string[] $output * @param int|bool $limit * @param int $offset - * @return string + * @return string[] */ private function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) { if ( false === $limit ) { @@ -1051,6 +1042,7 @@ __INDEXATTR__; 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 " @@ -1305,6 +1297,33 @@ SQL; return parent::streamStatementEnd( $sql, $newLine ); } + public function doLockTables( array $read, array $write, $method ) { + $tablesWrite = []; + foreach ( $write as $table ) { + $tablesWrite[] = $this->tableName( $table ); + } + $tablesRead = []; + foreach ( $read as $table ) { + $tablesRead[] = $this->tableName( $table ); + } + + // Acquire locks for the duration of the current transaction... + if ( $tablesWrite ) { + $this->query( + 'LOCK TABLE ONLY ' . implode( ',', $tablesWrite ) . ' IN EXCLUSIVE MODE', + $method + ); + } + if ( $tablesRead ) { + $this->query( + 'LOCK TABLE ONLY ' . implode( ',', $tablesRead ) . ' IN SHARE MODE', + $method + ); + } + + return true; + } + 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 ) ); @@ -1351,11 +1370,20 @@ SQL; return false; } + public function serverIsReadOnly() { + $res = $this->query( "SHOW default_transaction_read_only", __METHOD__ ); + $row = $this->fetchObject( $res ); + + return $row ? ( strtolower( $row->default_transaction_read_only ) === 'on' ) : false; + } + /** * @param string $lockName * @return string Integer */ private function bigintFromLockName( $lockName ) { - return Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 ); + return \Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 ); } } + +class_alias( DatabasePostgres::class, 'DatabasePostgres' ); diff --git a/includes/libs/rdbms/database/DatabaseSqlite.php b/includes/libs/rdbms/database/DatabaseSqlite.php index 090ce8eeae..870fc3eeca 100644 --- a/includes/libs/rdbms/database/DatabaseSqlite.php +++ b/includes/libs/rdbms/database/DatabaseSqlite.php @@ -21,9 +21,15 @@ * @file * @ingroup Database */ -use Wikimedia\Rdbms\Blob; -use Wikimedia\Rdbms\SQLiteField; -use Wikimedia\Rdbms\ResultWrapper; +namespace Wikimedia\Rdbms; + +use PDO; +use PDOException; +use LockManager; +use FSLockManager; +use InvalidArgumentException; +use RuntimeException; +use stdClass; /** * @ingroup Database @@ -116,8 +122,10 @@ class DatabaseSqlite extends Database { $p['dbFilePath'] = $filename; $p['schema'] = false; $p['tablePrefix'] = ''; + /** @var DatabaseSqlite $db */ + $db = Database::factory( 'sqlite', $p ); - return Database::factory( 'sqlite', $p ); + return $db; } /** @@ -559,7 +567,7 @@ class DatabaseSqlite extends Database { /** * @param array $options - * @return string + * @return array */ protected function makeUpdateOptionsArray( $options ) { $options = parent::makeUpdateOptionsArray( $options ); @@ -804,18 +812,6 @@ class DatabaseSqlite extends Database { } } - /** - * @return string - */ - function buildLike() { - $params = func_get_args(); - if ( count( $params ) > 0 && is_array( $params[0] ) ) { - $params = $params[0]; - } - - return parent::buildLike( $params ) . "ESCAPE '\' "; - } - /** * @param string $field Field or column to cast * @return string @@ -1048,3 +1044,5 @@ class DatabaseSqlite extends Database { return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION ); } } + +class_alias( DatabaseSqlite::class, 'DatabaseSqlite' ); diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 6bc870b425..b82603e737 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -23,12 +23,13 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; + use Wikimedia\ScopedCallback; -use Wikimedia\Rdbms\Blob; -use Wikimedia\Rdbms\LikeMatch; -use Wikimedia\Rdbms\DBMasterPos; -use Wikimedia\Rdbms\Field; -use Wikimedia\Rdbms\IResultWrapper; +use Exception; +use RuntimeException; +use UnexpectedValueException; +use stdClass; /** * Basic database interface for live and lazy-loaded relation database handles @@ -273,6 +274,14 @@ interface IDatabase { */ public function pendingWriteCallers(); + /** + * Get the number of affected rows from pending write queries + * + * @return integer + * @since 1.30 + */ + public function pendingWriteRowsAffected(); + /** * Is a connection to the database open? * @return bool @@ -559,11 +568,12 @@ interface IDatabase { * @param string|array $cond The condition array. See IDatabase::select() for details. * @param string $fname The function name of the caller. * @param string|array $options The query options. See IDatabase::select() for details. + * @param string|array $join_conds The query join conditions. See IDatabase::select() for details. * * @return bool|mixed The value from the field, or false on failure. */ public function selectField( - $table, $var, $cond = '', $fname = __METHOD__, $options = [] + $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ); /** @@ -580,12 +590,13 @@ interface IDatabase { * @param string|array $cond The condition array. See IDatabase::select() for details. * @param string $fname The function name of the caller. * @param string|array $options The query options. See IDatabase::select() for details. + * @param string|array $join_conds The query join conditions. See IDatabase::select() for details. * * @return bool|array The values from the field, or false on failure * @since 1.25 */ public function selectFieldValues( - $table, $var, $cond = '', $fname = __METHOD__, $options = [] + $table, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ); /** @@ -1028,11 +1039,25 @@ interface IDatabase { */ public function buildStringCast( $field ); + /** + * Returns true if DBs are assumed to be on potentially different servers + * + * In systems like mysql/mariadb, different databases can easily be referenced on a single + * connection merely by name, even in a single query via JOIN. On the other hand, Postgres + * treats databases as fully separate, only allowing mechanisms like postgres_fdw to + * effectively "mount" foreign DBs. This is true even among DBs on the same server. + * + * @return bool + * @since 1.29 + */ + public function databasesAreIndependent(); + /** * Change the current database * * @param string $db * @return bool Success or failure + * @throws DBConnectionError If databasesAreIndependent() is true and an error occurs */ public function selectDB( $db ); @@ -1224,12 +1249,14 @@ interface IDatabase { * IDatabase::insert() for details. * @param array $selectOptions Options for the SELECT part of the query, see * IDatabase::select() for details. + * @param array $selectJoinConds Join conditions for the SELECT part of the query, see + * IDatabase::select() for details. * - * @return IResultWrapper + * @return bool */ public function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, - $insertOptions = [], $selectOptions = [] + $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ); /** @@ -1249,6 +1276,37 @@ interface IDatabase { */ public function unionQueries( $sqls, $all ); + /** + * Construct a UNION query for permutations of conditions + * + * Databases sometimes have trouble with queries that have multiple values + * for multiple condition parameters combined with limits and ordering. + * This method constructs queries for the Cartesian product of the + * conditions and unions them all together. + * + * @see IDatabase::select() + * @since 1.30 + * @param string|array $table Table name + * @param string|array $vars Field names + * @param array $permute_conds Conditions for the Cartesian product. Keys + * are field names, values are arrays of the possible values for that + * field. + * @param string|array $extra_conds Additional conditions to include in the + * query. + * @param string $fname Caller function name + * @param string|array $options Query options. In addition to the options + * recognized by IDatabase::select(), the following may be used: + * - NOTALL: Set to use UNION instead of UNION ALL. + * - INNER ORDER BY: If specified and supported, subqueries will use this + * instead of ORDER BY. + * @param string|array $join_conds Join conditions + * @return string SQL query string. + */ + public function unionConditionPermutations( + $table, $vars, array $permute_conds, $extra_conds = '', $fname = __METHOD__, + $options = [], $join_conds = [] + ); + /** * Returns an SQL expression for a simple conditional. This doesn't need * to be overridden unless CASE isn't supported in your DBMS. @@ -1261,7 +1319,7 @@ interface IDatabase { public function conditional( $cond, $trueVal, $falseVal ); /** - * Returns a comand for str_replace function in SQL query. + * Returns a command for str_replace function in SQL query. * Uses REPLACE() in MySQL * * @param string $orig Column to modify @@ -1802,3 +1860,5 @@ interface IDatabase { */ public function setTableAliases( array $aliases ); } + +class_alias( IDatabase::class, 'IDatabase' ); diff --git a/includes/libs/rdbms/database/IMaintainableDatabase.php b/includes/libs/rdbms/database/IMaintainableDatabase.php index 43cec28a62..fbc2774b05 100644 --- a/includes/libs/rdbms/database/IMaintainableDatabase.php +++ b/includes/libs/rdbms/database/IMaintainableDatabase.php @@ -22,6 +22,10 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; + +use Exception; +use RuntimeException; /** * Advanced database interface for IDatabase handles that include maintenance methods @@ -205,4 +209,73 @@ interface IMaintainableDatabase extends IDatabase { public function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ); + + /** + * Checks if table locks acquired by lockTables() are transaction-bound in their scope + * + * Transaction-bound table locks will be released when the current transaction terminates. + * Table locks that are not bound to a transaction are not effected by BEGIN/COMMIT/ROLLBACK + * and will last until either lockTables()/unlockTables() is called or the TCP connection to + * the database is closed. + * + * @return bool + * @since 1.29 + */ + public function tableLocksHaveTransactionScope(); + + /** + * Lock specific tables + * + * Any pending transaction should be resolved before calling this method, since: + * a) Doing so resets any REPEATABLE-READ snapshot of the data to a fresh one. + * b) Previous row and table locks from the transaction or session may be released + * by LOCK TABLES, which may be unsafe for the changes in such a transaction. + * c) The main use case of lockTables() is to avoid deadlocks and timeouts by locking + * entire tables in order to do long-running, batched, and lag-aware, updates. Batching + * and replication lag checks do not work when all the updates happen in a transaction. + * + * Always get all relevant table locks up-front in one call, since LOCK TABLES might release + * any prior table locks on some RDBMes (e.g MySQL). + * + * For compatibility, callers should check tableLocksHaveTransactionScope() before using + * this method. If locks are scoped specifically to transactions then caller must either: + * - a) Start a new transaction and acquire table locks for the scope of that transaction, + * doing all row updates within that transaction. It will not be possible to update + * rows in batches; this might result in high replication lag. + * - b) Forgo table locks entirely and avoid calling this method. Careful use of hints like + * LOCK IN SHARE MODE and FOR UPDATE and the use of query batching may be preferrable + * to using table locks with a potentially large transaction. Use of MySQL and Postges + * style REPEATABLE-READ (Snapshot Isolation with or without First-Committer-Rule) can + * also be considered for certain tasks that require a consistent view of entire tables. + * + * If session scoped locks are not supported, then calling lockTables() will trigger + * startAtomic(), with unlockTables() triggering endAtomic(). This will automatically + * start a transaction if one is not already present and cause the locks to be released + * when the transaction finishes (normally during the unlockTables() call). + * + * In any case, avoid using begin()/commit() in code that runs while such table locks are + * acquired, as that breaks in case when a transaction is needed. The startAtomic() and + * endAtomic() methods are safe, however, since they will join any existing transaction. + * + * @param array $read Array of tables to lock for read access + * @param array $write Array of tables to lock for write access + * @param string $method Name of caller + * @return bool + * @since 1.29 + */ + public function lockTables( array $read, array $write, $method ); + + /** + * Unlock all tables locked via lockTables() + * + * If table locks are scoped to transactions, then locks might not be released until the + * transaction ends, which could happen after this method is called. + * + * @param string $method The caller + * @return bool + * @since 1.29 + */ + public function unlockTables( $method ); } + +class_alias( IMaintainableDatabase::class, 'IMaintainableDatabase' ); diff --git a/includes/libs/rdbms/database/MaintainableDBConnRef.php b/includes/libs/rdbms/database/MaintainableDBConnRef.php index fa3ddf9eb9..6c94eb9a34 100644 --- a/includes/libs/rdbms/database/MaintainableDBConnRef.php +++ b/includes/libs/rdbms/database/MaintainableDBConnRef.php @@ -1,4 +1,7 @@ __call( __FUNCTION__, func_get_args() ); } + + public function tableLocksHaveTransactionScope() { + return $this->__call( __FUNCTION__, func_get_args() ); + } + + public function lockTables( array $read, array $write, $method ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } + + public function unlockTables( $method ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } } + +class_alias( MaintainableDBConnRef::class, 'MaintainableDBConnRef' ); diff --git a/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php index fd7af110e5..493cde8d9c 100644 --- a/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php +++ b/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php @@ -63,4 +63,3 @@ class FakeResultWrapper extends ResultWrapper { } class_alias( FakeResultWrapper::class, 'FakeResultWrapper' ); - diff --git a/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php index dc89a2dc04..debf8a27c3 100644 --- a/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php +++ b/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php @@ -3,7 +3,6 @@ namespace Wikimedia\Rdbms; use Iterator; -use DBUnexpectedError; use stdClass; /** diff --git a/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php index d658c96b3a..df354af8ec 100644 --- a/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php +++ b/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php @@ -2,7 +2,6 @@ namespace Wikimedia\Rdbms; -use IDatabase; use stdClass; use RuntimeException; diff --git a/includes/libs/rdbms/database/utils/SavepointPostgres.php b/includes/libs/rdbms/database/utils/SavepointPostgres.php index 8ae78e9371..cf5060e446 100644 --- a/includes/libs/rdbms/database/utils/SavepointPostgres.php +++ b/includes/libs/rdbms/database/utils/SavepointPostgres.php @@ -18,6 +18,9 @@ * @file * @ingroup Database */ + +namespace Wikimedia\Rdbms; + use Psr\Log\LoggerInterface; /** diff --git a/includes/libs/rdbms/defines.php b/includes/libs/rdbms/defines.php index c3367e7849..cbc8ca3169 100644 --- a/includes/libs/rdbms/defines.php +++ b/includes/libs/rdbms/defines.php @@ -1,6 +1,7 @@ mData = $data; diff --git a/includes/libs/rdbms/exception/DBAccessError.php b/includes/libs/rdbms/exception/DBAccessError.php index 864dea0ee0..97e03b26fe 100644 --- a/includes/libs/rdbms/exception/DBAccessError.php +++ b/includes/libs/rdbms/exception/DBAccessError.php @@ -19,6 +19,8 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * Exception class for attempted DB access * @ingroup Database @@ -28,3 +30,5 @@ class DBAccessError extends DBUnexpectedError { parent::__construct( null, "Database access has been disabled." ); } } + +class_alias( DBAccessError::class, 'DBAccessError' ); diff --git a/includes/libs/rdbms/exception/DBConnectionError.php b/includes/libs/rdbms/exception/DBConnectionError.php index 47f8c9620b..0091524c91 100644 --- a/includes/libs/rdbms/exception/DBConnectionError.php +++ b/includes/libs/rdbms/exception/DBConnectionError.php @@ -18,6 +18,7 @@ * @file * @ingroup Database */ +namespace Wikimedia\Rdbms; /** * @ingroup Database @@ -36,3 +37,5 @@ class DBConnectionError extends DBExpectedError { parent::__construct( $db, $msg ); } } + +class_alias( DBConnectionError::class, 'DBConnectionError' ); diff --git a/includes/libs/rdbms/exception/DBError.php b/includes/libs/rdbms/exception/DBError.php index 526596d0b1..d65e2d36bd 100644 --- a/includes/libs/rdbms/exception/DBError.php +++ b/includes/libs/rdbms/exception/DBError.php @@ -19,6 +19,10 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + +use Exception; + /** * Database error base class * @ingroup Database @@ -37,3 +41,5 @@ class DBError extends Exception { parent::__construct( $error ); } } + +class_alias( DBError::class, 'DBError' ); diff --git a/includes/libs/rdbms/exception/DBExpectedError.php b/includes/libs/rdbms/exception/DBExpectedError.php index 7d303b1d8f..4f65efae02 100644 --- a/includes/libs/rdbms/exception/DBExpectedError.php +++ b/includes/libs/rdbms/exception/DBExpectedError.php @@ -19,6 +19,12 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + +use MessageSpecifier; +use ILocalizedException; +use Message; + /** * Base class for the more common types of database errors. These are known to occur * frequently, so we try to give friendly error messages for them. @@ -44,10 +50,12 @@ class DBExpectedError extends DBError implements MessageSpecifier, ILocalizedExc } /** - * @inheritdoc + * @inheritDoc * @since 1.29 */ public function getMessageObject() { return Message::newFromSpecifier( $this ); } } + +class_alias( DBExpectedError::class, 'DBExpectedError' ); diff --git a/includes/libs/rdbms/exception/DBQueryError.php b/includes/libs/rdbms/exception/DBQueryError.php index 002d253924..bc2a865bb1 100644 --- a/includes/libs/rdbms/exception/DBQueryError.php +++ b/includes/libs/rdbms/exception/DBQueryError.php @@ -19,6 +19,8 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * @ingroup Database */ @@ -61,3 +63,5 @@ class DBQueryError extends DBExpectedError { $this->fname = $fname; } } + +class_alias( DBQueryError::class, 'DBQueryError' ); diff --git a/includes/libs/rdbms/exception/DBReadOnlyError.php b/includes/libs/rdbms/exception/DBReadOnlyError.php index d4dce1e13f..439334391c 100644 --- a/includes/libs/rdbms/exception/DBReadOnlyError.php +++ b/includes/libs/rdbms/exception/DBReadOnlyError.php @@ -19,8 +19,12 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * @ingroup Database */ class DBReadOnlyError extends DBExpectedError { } + +class_alias( DBReadOnlyError::class, 'DBReadOnlyError' ); diff --git a/includes/libs/rdbms/exception/DBReplicationWaitError.php b/includes/libs/rdbms/exception/DBReplicationWaitError.php index c5e1ed7033..457431e93b 100644 --- a/includes/libs/rdbms/exception/DBReplicationWaitError.php +++ b/includes/libs/rdbms/exception/DBReplicationWaitError.php @@ -19,9 +19,13 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * Exception class for replica DB wait timeouts * @ingroup Database */ class DBReplicationWaitError extends DBExpectedError { } + +class_alias( DBReplicationWaitError::class, 'DBReplicationWaitError' ); diff --git a/includes/libs/rdbms/exception/DBTransactionError.php b/includes/libs/rdbms/exception/DBTransactionError.php index a4886671c8..62a078cdba 100644 --- a/includes/libs/rdbms/exception/DBTransactionError.php +++ b/includes/libs/rdbms/exception/DBTransactionError.php @@ -19,8 +19,12 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * @ingroup Database */ class DBTransactionError extends DBExpectedError { } + +class_alias( DBTransactionError::class, 'DBTransactionError' ); diff --git a/includes/libs/rdbms/exception/DBTransactionSizeError.php b/includes/libs/rdbms/exception/DBTransactionSizeError.php index 4e467b2c0b..e45b9f3191 100644 --- a/includes/libs/rdbms/exception/DBTransactionSizeError.php +++ b/includes/libs/rdbms/exception/DBTransactionSizeError.php @@ -19,6 +19,8 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * @ingroup Database */ @@ -27,3 +29,5 @@ class DBTransactionSizeError extends DBTransactionError { return 'transaction-duration-limit-exceeded'; } } + +class_alias( DBTransactionSizeError::class, 'DBTransactionSizeError' ); diff --git a/includes/libs/rdbms/exception/DBUnexpectedError.php b/includes/libs/rdbms/exception/DBUnexpectedError.php index 5a1267159a..9c67eb5ffa 100644 --- a/includes/libs/rdbms/exception/DBUnexpectedError.php +++ b/includes/libs/rdbms/exception/DBUnexpectedError.php @@ -19,8 +19,12 @@ * @ingroup Database */ +namespace Wikimedia\Rdbms; + /** * @ingroup Database */ class DBUnexpectedError extends DBError { } + +class_alias( DBUnexpectedError::class, 'DBUnexpectedError' ); diff --git a/includes/libs/rdbms/field/PostgresField.php b/includes/libs/rdbms/field/PostgresField.php index c5819a32ca..600f34a456 100644 --- a/includes/libs/rdbms/field/PostgresField.php +++ b/includes/libs/rdbms/field/PostgresField.php @@ -2,8 +2,6 @@ namespace Wikimedia\Rdbms; -use DatabasePostgres; - class PostgresField implements Field { private $name, $tablename, $type, $nullable, $max_length, $deferred, $deferrable, $conname, $has_default, $default; diff --git a/includes/libs/rdbms/lbfactory/ILBFactory.php b/includes/libs/rdbms/lbfactory/ILBFactory.php index faf7fb179c..117df684c4 100644 --- a/includes/libs/rdbms/lbfactory/ILBFactory.php +++ b/includes/libs/rdbms/lbfactory/ILBFactory.php @@ -24,8 +24,6 @@ namespace Wikimedia\Rdbms; use InvalidArgumentException; -use DBTransactionError; -use DBReplicationWaitError; /** * An interface for generating database load balancers @@ -42,7 +40,7 @@ interface ILBFactory { * * Sub-classes will extend the required keys in $conf with additional parameters * - * @param $conf $params Array with keys: + * @param array $conf Array with keys: * - localDomain: A DatabaseDomain or domain ID string. * - readOnlyReason : Reason the master DB is read-only if so [optional] * - srvCache : BagOStuff object for server cache [optional] @@ -194,6 +192,13 @@ interface ILBFactory { */ public function rollbackMasterChanges( $fname = __METHOD__ ); + /** + * Check if a transaction round is active + * @return bool + * @since 1.29 + */ + public function hasTransactionRound(); + /** * Determine if any master connection has pending changes * @return bool diff --git a/includes/libs/rdbms/lbfactory/LBFactory.php b/includes/libs/rdbms/lbfactory/LBFactory.php index f05dabc80f..919f103be1 100644 --- a/includes/libs/rdbms/lbfactory/LBFactory.php +++ b/includes/libs/rdbms/lbfactory/LBFactory.php @@ -30,9 +30,6 @@ use EmptyBagOStuff; use WANObjectCache; use Exception; use RuntimeException; -use IDatabase; -use DBTransactionError; -use DBReplicationWaitError; /** * An interface for generating database load balancers @@ -253,6 +250,10 @@ abstract class LBFactory implements ILBFactory { } ); } + public function hasTransactionRound() { + return ( $this->trxRoundId !== false ); + } + /** * Log query info if multi DB transactions are going to be committed now */ @@ -508,7 +509,8 @@ abstract class LBFactory implements ILBFactory { 'errorLogger' => $this->errorLogger, 'hostname' => $this->hostname, 'cliMode' => $this->cliMode, - 'agent' => $this->agent + 'agent' => $this->agent, + 'chronologyProtector' => $this->getChronologyProtector() ]; } @@ -528,7 +530,7 @@ abstract class LBFactory implements ILBFactory { $prefix ); - $this->forEachLB( function( ILoadBalancer $lb ) use ( $prefix ) { + $this->forEachLB( function ( ILoadBalancer $lb ) use ( $prefix ) { $lb->setDomainPrefix( $prefix ); } ); } @@ -579,3 +581,5 @@ abstract class LBFactory implements ILBFactory { $this->destroy(); } } + +class_alias( LBFactory::class, 'LBFactory' ); diff --git a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php index 447b96f951..0384588ddc 100644 --- a/includes/libs/rdbms/lbfactory/LBFactoryMulti.php +++ b/includes/libs/rdbms/lbfactory/LBFactoryMulti.php @@ -23,7 +23,6 @@ namespace Wikimedia\Rdbms; -use IDatabase; use InvalidArgumentException; /** @@ -252,9 +251,7 @@ class LBFactoryMulti extends LBFactory { public function getMainLB( $domain = false ) { $section = $this->getSectionForDomain( $domain ); if ( !isset( $this->mainLBs[$section] ) ) { - $lb = $this->newMainLB( $domain ); - $this->getChronologyProtector()->initLB( $lb ); - $this->mainLBs[$section] = $lb; + $this->mainLBs[$section] = $this->newMainLB( $domain ); } return $this->mainLBs[$section]; @@ -283,7 +280,6 @@ class LBFactoryMulti extends LBFactory { public function getExternalLB( $cluster ) { if ( !isset( $this->extLBs[$cluster] ) ) { $this->extLBs[$cluster] = $this->newExternalLB( $cluster ); - $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] ); } return $this->extLBs[$cluster]; diff --git a/includes/libs/rdbms/lbfactory/LBFactorySimple.php b/includes/libs/rdbms/lbfactory/LBFactorySimple.php index 15cd50849d..df0a806b41 100644 --- a/includes/libs/rdbms/lbfactory/LBFactorySimple.php +++ b/includes/libs/rdbms/lbfactory/LBFactorySimple.php @@ -89,7 +89,6 @@ class LBFactorySimple extends LBFactory { public function getMainLB( $domain = false ) { if ( !isset( $this->mainLB ) ) { $this->mainLB = $this->newMainLB( $domain ); - $this->getChronologyProtector()->initLB( $this->mainLB ); } return $this->mainLB; @@ -106,7 +105,6 @@ class LBFactorySimple extends LBFactory { public function getExternalLB( $cluster ) { if ( !isset( $this->extLBs[$cluster] ) ) { $this->extLBs[$cluster] = $this->newExternalLB( $cluster ); - $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] ); } return $this->extLBs[$cluster]; diff --git a/includes/libs/rdbms/lbfactory/LBFactorySingle.php b/includes/libs/rdbms/lbfactory/LBFactorySingle.php index 5931d80205..cd998c3e7b 100644 --- a/includes/libs/rdbms/lbfactory/LBFactorySingle.php +++ b/includes/libs/rdbms/lbfactory/LBFactorySingle.php @@ -23,7 +23,6 @@ namespace Wikimedia\Rdbms; -use IDatabase; use InvalidArgumentException; use BadMethodCallException; diff --git a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php index 4c277ff690..fc50961f46 100644 --- a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php @@ -19,18 +19,9 @@ * * @file * @ingroup Database - * @author Aaron Schulz */ namespace Wikimedia\Rdbms; -use IDatabase; -use Database; -use DBConnRef; -use MaintainableDBConnRef; -use DBError; -use DBAccessError; -use DBTransactionError; -use DBExpectedError; use Exception; use InvalidArgumentException; @@ -105,6 +96,7 @@ interface ILoadBalancer { * - srvCache : BagOStuff object for server cache [optional] * - memCache : BagOStuff object for cluster memory cache [optional] * - wanCache : WANObjectCache object [optional] + * - chronologyProtector: ChronologyProtector object [optional] * - hostname : The name of the current server [optional] * - cliMode: Whether the execution context is a CLI script. [optional] * - profiler : Class name or instance with profileIn()/profileOut() methods. [optional] @@ -138,7 +130,11 @@ interface ILoadBalancer { * If a DB_REPLICA connection has been opened already, then wait immediately. * Otherwise sets a variable telling it to wait if such a connection is opened. * - * @param DBMasterPos $pos + * This only applies to connections to the generic replica DB for this request. + * If a timeout happens when waiting, then getLaggedReplicaMode()/laggedReplicaUsed() + * will return true. + * + * @param DBMasterPos|bool $pos Master position or false */ public function waitFor( $pos ); @@ -147,7 +143,7 @@ interface ILoadBalancer { * * This can be used a faster proxy for waitForAll() * - * @param DBMasterPos $pos + * @param DBMasterPos|bool $pos Master position or false * @param int $timeout Max seconds to wait; default is mWaitTimeout * @return bool Success (able to connect and no timeouts reached) */ @@ -156,7 +152,7 @@ interface ILoadBalancer { /** * Set the master wait position and wait for ALL replica DBs to catch up to it * - * @param DBMasterPos $pos + * @param DBMasterPos|bool $pos Master position or false * @param int $timeout Max seconds to wait; default is mWaitTimeout * @return bool Success (able to connect and no timeouts reached) */ @@ -237,12 +233,13 @@ interface ILoadBalancer { /** * Open a connection to the server given by the specified index - * Index must be an actual index into the array. - * If the server is already open, returns it. + * + * The index must be an actual index into the array. If a connection to the server is + * already open and not considered an "in use" foreign connection, this simply returns it. * * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError. * - * @param int $i Server index or DB_MASTER/DB_REPLICA + * @param int $i Server index (does not support DB_MASTER/DB_REPLICA) * @param string|bool $domain Domain ID, or false for the current domain * @return Database|bool Returns false on errors * @throws DBAccessError @@ -289,6 +286,8 @@ interface ILoadBalancer { * Return the server info structure for a given index, or false if the index is invalid. * @param int $i * @return array|bool + * + * @deprecated Since 1.30, no alternative */ public function getServerInfo( $i ); @@ -297,6 +296,8 @@ interface ILoadBalancer { * is created if it doesn't exist * @param int $i * @param array $serverInfo + * + * @deprecated Since 1.30, construct new object */ public function setServerInfo( $i, array $serverInfo ); @@ -443,13 +444,17 @@ interface ILoadBalancer { /** * @note This method will trigger a DB connection if not yet done * @param string|bool $domain Domain ID, or false for the current domain - * @return bool Whether the generic connection for reads is highly "lagged" + * @return bool Whether the database for generic connections this request is highly "lagged" */ public function getLaggedReplicaMode( $domain = false ); /** + * Checks whether the database for generic connections this request was both: + * - a) Already choosen due to a prior connection attempt + * - b) Considered highly "lagged" + * * @note This method will never cause a new DB connection - * @return bool Whether any generic connection used for reads was highly "lagged" + * @return bool */ public function laggedReplicaUsed(); diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancer.php b/includes/libs/rdbms/loadbalancer/LoadBalancer.php index 6878712d55..72217da7d9 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancer.php @@ -25,21 +25,10 @@ namespace Wikimedia\Rdbms; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Wikimedia\ScopedCallback; -use IDatabase; -use Database; -use DBConnRef; -use MaintainableDBConnRef; use BagOStuff; use EmptyBagOStuff; use WANObjectCache; use ArrayUtils; -use DBError; -use DBAccessError; -use DBExpectedError; -use DBUnexpectedError; -use DBTransactionError; -use DBTransactionSizeError; -use DBConnectionError; use InvalidArgumentException; use RuntimeException; use Exception; @@ -52,7 +41,7 @@ use Exception; class LoadBalancer implements ILoadBalancer { /** @var array[] Map of (server index => server config array) */ private $mServers; - /** @var \Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase array */ + /** @var Database[][][] Map of local/foreignUsed/foreignFree => server index => IDatabase[] */ private $mConns; /** @var float[] Map of (server index => weight) */ private $mLoads; @@ -69,6 +58,8 @@ class LoadBalancer implements ILoadBalancer { /** @var ILoadMonitor */ private $loadMonitor; + /** @var ChronologyProtector|null */ + private $chronProt; /** @var BagOStuff */ private $srvCache; /** @var BagOStuff */ @@ -88,7 +79,7 @@ class LoadBalancer implements ILoadBalancer { /** @var LoggerInterface */ protected $perfLogger; - /** @var \Database Database connection that caused a problem */ + /** @var Database DB connection object that caused a problem */ private $errorConnection; /** @var integer The generic (not query grouped) replica DB index (of $mServers) */ private $mReadIndex; @@ -124,6 +115,8 @@ class LoadBalancer implements ILoadBalancer { /** @var boolean */ private $disabled = false; + /** @var boolean */ + private $chronProtInitialized = false; /** @var integer Warn when this many connection are held */ const CONN_HELD_WARN_THRESHOLD = 10; @@ -133,6 +126,10 @@ class LoadBalancer implements ILoadBalancer { /** @var integer Seconds to cache master server read-only status */ const TTL_CACHE_READONLY = 5; + const KEY_LOCAL = 'local'; + const KEY_FOREIGN_FREE = 'foreignFree'; + const KEY_FOREIGN_INUSE = 'foreignInUse'; + public function __construct( array $params ) { if ( !isset( $params['servers'] ) ) { throw new InvalidArgumentException( __CLASS__ . ': missing servers parameter' ); @@ -155,9 +152,9 @@ class LoadBalancer implements ILoadBalancer { $this->mReadIndex = -1; $this->mConns = [ - 'local' => [], - 'foreignUsed' => [], - 'foreignFree' => [] + self::KEY_LOCAL => [], + self::KEY_FOREIGN_INUSE => [], + self::KEY_FOREIGN_FREE => [] ]; $this->mLoads = []; $this->mWaitForPos = false; @@ -222,6 +219,10 @@ class LoadBalancer implements ILoadBalancer { : ( gethostname() ?: 'unknown' ); $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli'; $this->agent = isset( $params['agent'] ) ? $params['agent'] : ''; + + if ( isset( $params['chronologyProtector'] ) ) { + $this->chronProt = $params['chronologyProtector']; + } } /** @@ -272,11 +273,11 @@ class LoadBalancer implements ILoadBalancer { $host = $this->getServerName( $i ); if ( $lag === false && !is_infinite( $maxServerLag ) ) { $this->replLogger->error( - "Server {host} (#$i) is not replicating?", [ 'host' => $host ] ); + "Server {host} is not replicating?", [ 'host' => $host ] ); unset( $loads[$i] ); } elseif ( $lag > $maxServerLag ) { $this->replLogger->warning( - "Server {host} (#$i) has {lag} seconds of lag (>= {maxlag})", + "Server {host} has {lag} seconds of lag (>= {maxlag})", [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ] ); unset( $loads[$i] ); @@ -307,60 +308,99 @@ class LoadBalancer implements ILoadBalancer { public function getReaderIndex( $group = false, $domain = false ) { if ( count( $this->mServers ) == 1 ) { - # Skip the load balancing if there's only one server + // Skip the load balancing if there's only one server return $this->getWriterIndex(); } elseif ( $group === false && $this->mReadIndex >= 0 ) { - # Shortcut if generic reader exists already + // Shortcut if the generic reader index was already cached return $this->mReadIndex; } - # Find the relevant load array if ( $group !== false ) { + // Use the server weight array for this load group if ( isset( $this->mGroupLoads[$group] ) ) { - $nonErrorLoads = $this->mGroupLoads[$group]; + $loads = $this->mGroupLoads[$group]; } else { - # No loads for this group, return false and the caller can use some other group + // No loads for this group, return false and the caller can use some other group $this->connLogger->info( __METHOD__ . ": no loads for group $group" ); return false; } } else { - $nonErrorLoads = $this->mLoads; + // Use the generic load group + $loads = $this->mLoads; } - if ( !count( $nonErrorLoads ) ) { - throw new InvalidArgumentException( "Empty server array given to LoadBalancer" ); + // Scale the configured load ratios according to each server's load and state + $this->getLoadMonitor()->scaleLoads( $loads, $domain ); + + // Pick a server to use, accounting for weights, load, lag, and mWaitForPos + list( $i, $laggedReplicaMode ) = $this->pickReaderIndex( $loads, $domain ); + if ( $i === false ) { + // Replica DB connection unsuccessful + return false; + } + + if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) { + // Before any data queries are run, wait for the server to catch up to the + // specified position. This is used to improve session consistency. Note that + // when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here, + // so update laggedReplicaMode as needed for consistency. + if ( !$this->doWait( $i ) ) { + $laggedReplicaMode = true; + } } - # Scale the configured load ratios according to the dynamic load if supported - $this->getLoadMonitor()->scaleLoads( $nonErrorLoads, $domain ); + if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) { + // Cache the generic reader index for future ungrouped DB_REPLICA handles + $this->mReadIndex = $i; + // Record if the generic reader index is in "lagged replica DB" mode + if ( $laggedReplicaMode ) { + $this->laggedReplicaMode = true; + } + } - $laggedReplicaMode = false; + $serverName = $this->getServerName( $i ); + $this->connLogger->debug( __METHOD__ . ": using server $serverName for group '$group'" ); + + return $i; + } - # No server found yet + /** + * @param array $loads List of server weights + * @param string|bool $domain + * @return array (reader index, lagged replica mode) or false on failure + */ + private function pickReaderIndex( array $loads, $domain = false ) { + if ( !count( $loads ) ) { + throw new InvalidArgumentException( "Empty server array given to LoadBalancer" ); + } + + /** @var $i int|bool Index of selected server */ $i = false; - # First try quickly looking through the available servers for a server that - # meets our criteria - $currentLoads = $nonErrorLoads; + /** @var $laggedReplicaMode bool Whether server is considered lagged */ + $laggedReplicaMode = false; + + // Quickly look through the available servers for a server that meets criteria... + $currentLoads = $loads; while ( count( $currentLoads ) ) { if ( $this->mAllowLagged || $laggedReplicaMode ) { $i = ArrayUtils::pickRandom( $currentLoads ); } else { $i = false; if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) { - # ChronologyProtecter causes mWaitForPos to be set via sessions. - # This triggers doWait() after connect, so it's especially good to - # avoid lagged servers so as to avoid just blocking in that method. + // ChronologyProtecter sets mWaitForPos for session consistency. + // This triggers doWait() after connect, so it's especially good to + // avoid lagged servers so as to avoid excessive delay in that method. $ago = microtime( true ) - $this->mWaitForPos->asOfTime(); - # Aim for <= 1 second of waiting (being too picky can backfire) + // Aim for <= 1 second of waiting (being too picky can backfire) $i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 ); } if ( $i === false ) { - # Any server with less lag than it's 'max lag' param is preferable + // Any server with less lag than it's 'max lag' param is preferable $i = $this->getRandomNonLagged( $currentLoads, $domain ); } if ( $i === false && count( $currentLoads ) != 0 ) { - # All replica DBs lagged. Switch to read-only mode + // All replica DBs lagged. Switch to read-only mode $this->replLogger->error( "All replica DBs lagged. Switch to read-only mode" ); $i = ArrayUtils::pickRandom( $currentLoads ); $laggedReplicaMode = true; @@ -368,12 +408,12 @@ class LoadBalancer implements ILoadBalancer { } if ( $i === false ) { - # pickRandom() returned false - # This is permanent and means the configuration or the load monitor - # wants us to return false. + // pickRandom() returned false. + // This is permanent and means the configuration or the load monitor + // wants us to return false. $this->connLogger->debug( __METHOD__ . ": pickRandom() returned false" ); - return false; + return [ false, false ]; } $serverName = $this->getServerName( $i ); @@ -382,8 +422,7 @@ class LoadBalancer implements ILoadBalancer { $conn = $this->openConnection( $i, $domain ); if ( !$conn ) { $this->connLogger->warning( __METHOD__ . ": Failed connecting to $i/$domain" ); - unset( $nonErrorLoads[$i] ); - unset( $currentLoads[$i] ); + unset( $currentLoads[$i] ); // avoid this server next iteration $i = false; continue; } @@ -394,85 +433,95 @@ class LoadBalancer implements ILoadBalancer { $this->reuseConnection( $conn ); } - # Return this server + // Return this server break; } - # If all servers were down, quit now - if ( !count( $nonErrorLoads ) ) { + // If all servers were down, quit now + if ( !count( $currentLoads ) ) { $this->connLogger->error( "All servers down" ); } - if ( $i !== false ) { - # Replica DB connection successful. - # Wait for the session master pos for a short time. - if ( $this->mWaitForPos && $i > 0 ) { - $this->doWait( $i ); - } - if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) { - $this->mReadIndex = $i; - # Record if the generic reader index is in "lagged replica DB" mode - if ( $laggedReplicaMode ) { - $this->laggedReplicaMode = true; - } - } - $serverName = $this->getServerName( $i ); - $this->connLogger->debug( - __METHOD__ . ": using server $serverName for group '$group'" ); - } - - return $i; + return [ $i, $laggedReplicaMode ]; } - /** - * @param DBMasterPos|false $pos - */ public function waitFor( $pos ) { - $this->mWaitForPos = $pos; - $i = $this->mReadIndex; - - if ( $i > 0 ) { - if ( !$this->doWait( $i ) ) { - $this->laggedReplicaMode = true; + $oldPos = $this->mWaitForPos; + try { + $this->mWaitForPos = $pos; + // If a generic reader connection was already established, then wait now + $i = $this->mReadIndex; + if ( $i > 0 ) { + if ( !$this->doWait( $i ) ) { + $this->laggedReplicaMode = true; + } } + } finally { + // Restore the older position if it was higher since this is used for lag-protection + $this->setWaitForPositionIfHigher( $oldPos ); } } public function waitForOne( $pos, $timeout = null ) { - $this->mWaitForPos = $pos; - - $i = $this->mReadIndex; - if ( $i <= 0 ) { - // Pick a generic replica DB if there isn't one yet - $readLoads = $this->mLoads; - unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only - $readLoads = array_filter( $readLoads ); // with non-zero load - $i = ArrayUtils::pickRandom( $readLoads ); - } + $oldPos = $this->mWaitForPos; + try { + $this->mWaitForPos = $pos; + + $i = $this->mReadIndex; + if ( $i <= 0 ) { + // Pick a generic replica DB if there isn't one yet + $readLoads = $this->mLoads; + unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only + $readLoads = array_filter( $readLoads ); // with non-zero load + $i = ArrayUtils::pickRandom( $readLoads ); + } - if ( $i > 0 ) { - $ok = $this->doWait( $i, true, $timeout ); - } else { - $ok = true; // no applicable loads + if ( $i > 0 ) { + $ok = $this->doWait( $i, true, $timeout ); + } else { + $ok = true; // no applicable loads + } + } finally { + # Restore the old position, as this is not used for lag-protection but for throttling + $this->mWaitForPos = $oldPos; } return $ok; } public function waitForAll( $pos, $timeout = null ) { - $this->mWaitForPos = $pos; - $serverCount = count( $this->mServers ); + $oldPos = $this->mWaitForPos; + try { + $this->mWaitForPos = $pos; + $serverCount = count( $this->mServers ); - $ok = true; - for ( $i = 1; $i < $serverCount; $i++ ) { - if ( $this->mLoads[$i] > 0 ) { - $ok = $this->doWait( $i, true, $timeout ) && $ok; + $ok = true; + for ( $i = 1; $i < $serverCount; $i++ ) { + if ( $this->mLoads[$i] > 0 ) { + $ok = $this->doWait( $i, true, $timeout ) && $ok; + } } + } finally { + # Restore the old position, as this is not used for lag-protection but for throttling + $this->mWaitForPos = $oldPos; } return $ok; } + /** + * @param DBMasterPos|bool $pos + */ + private function setWaitForPositionIfHigher( $pos ) { + if ( !$pos ) { + return; + } + + if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) { + $this->mWaitForPos = $pos; + } + } + /** * @param int $i * @return IDatabase|bool @@ -666,19 +715,19 @@ class LoadBalancer implements ILoadBalancer { } $domain = $conn->getDomainID(); - if ( !isset( $this->mConns['foreignUsed'][$serverIndex][$domain] ) ) { + if ( !isset( $this->mConns[self::KEY_FOREIGN_INUSE][$serverIndex][$domain] ) ) { throw new InvalidArgumentException( __METHOD__ . ": connection $serverIndex/$domain not found; it may have already been freed." ); - } elseif ( $this->mConns['foreignUsed'][$serverIndex][$domain] !== $conn ) { + } elseif ( $this->mConns[self::KEY_FOREIGN_INUSE][$serverIndex][$domain] !== $conn ) { throw new InvalidArgumentException( __METHOD__ . ": connection $serverIndex/$domain mismatched; it may have already been freed." ); } $conn->setLBInfo( 'foreignPoolRefCount', --$refCount ); if ( $refCount <= 0 ) { - $this->mConns['foreignFree'][$serverIndex][$domain] = $conn; - unset( $this->mConns['foreignUsed'][$serverIndex][$domain] ); - if ( !$this->mConns['foreignUsed'][$serverIndex] ) { - unset( $this->mConns[ 'foreignUsed' ][$serverIndex] ); // clean up + $this->mConns[self::KEY_FOREIGN_FREE][$serverIndex][$domain] = $conn; + unset( $this->mConns[self::KEY_FOREIGN_INUSE][$serverIndex][$domain] ); + if ( !$this->mConns[self::KEY_FOREIGN_INUSE][$serverIndex] ) { + unset( $this->mConns[ self::KEY_FOREIGN_INUSE ][$serverIndex] ); // clean up } $this->connLogger->debug( __METHOD__ . ": freed connection $serverIndex/$domain" ); } else { @@ -718,10 +767,17 @@ class LoadBalancer implements ILoadBalancer { $domain = false; // local connection requested } + if ( !$this->chronProtInitialized && $this->chronProt ) { + $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' ); + // Load CP positions before connecting so that doWait() triggers later if needed + $this->chronProtInitialized = true; + $this->chronProt->initLB( $this ); + } + if ( $domain !== false ) { $conn = $this->openForeignConnection( $i, $domain ); - } elseif ( isset( $this->mConns['local'][$i][0] ) ) { - $conn = $this->mConns['local'][$i][0]; + } elseif ( isset( $this->mConns[self::KEY_LOCAL][$i][0] ) ) { + $conn = $this->mConns[self::KEY_LOCAL][$i][0]; } else { if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) { throw new InvalidArgumentException( "No server with index '$i'." ); @@ -733,7 +789,7 @@ class LoadBalancer implements ILoadBalancer { $serverName = $this->getServerName( $i ); if ( $conn->isOpen() ) { $this->connLogger->debug( "Connected to database $i at '$serverName'." ); - $this->mConns['local'][$i][0] = $conn; + $this->mConns[self::KEY_LOCAL][$i][0] = $conn; } else { $this->connLogger->warning( "Failed to connect to database $i at '$serverName'." ); $this->errorConnection = $conn; @@ -778,20 +834,20 @@ class LoadBalancer implements ILoadBalancer { $dbName = $domainInstance->getDatabase(); $prefix = $domainInstance->getTablePrefix(); - if ( isset( $this->mConns['foreignUsed'][$i][$domain] ) ) { - // Reuse an already-used connection - $conn = $this->mConns['foreignUsed'][$i][$domain]; + if ( isset( $this->mConns[self::KEY_FOREIGN_INUSE][$i][$domain] ) ) { + // Reuse an in-use connection for the same domain that is not in-use + $conn = $this->mConns[self::KEY_FOREIGN_INUSE][$i][$domain]; $this->connLogger->debug( __METHOD__ . ": reusing connection $i/$domain" ); - } elseif ( isset( $this->mConns['foreignFree'][$i][$domain] ) ) { - // Reuse a free connection for the same domain - $conn = $this->mConns['foreignFree'][$i][$domain]; - unset( $this->mConns['foreignFree'][$i][$domain] ); - $this->mConns['foreignUsed'][$i][$domain] = $conn; + } elseif ( isset( $this->mConns[self::KEY_FOREIGN_FREE][$i][$domain] ) ) { + // Reuse a free connection for the same domain that is not in-use + $conn = $this->mConns[self::KEY_FOREIGN_FREE][$i][$domain]; + unset( $this->mConns[self::KEY_FOREIGN_FREE][$i][$domain] ); + $this->mConns[self::KEY_FOREIGN_INUSE][$i][$domain] = $conn; $this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" ); - } elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) { + } elseif ( !empty( $this->mConns[self::KEY_FOREIGN_FREE][$i] ) ) { // Reuse a connection from another domain - $conn = reset( $this->mConns['foreignFree'][$i] ); - $oldDomain = key( $this->mConns['foreignFree'][$i] ); + $conn = reset( $this->mConns[self::KEY_FOREIGN_FREE][$i] ); + $oldDomain = key( $this->mConns[self::KEY_FOREIGN_FREE][$i] ); // The empty string as a DB name means "don't care". // DatabaseMysqlBase::open() already handle this on connection. if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) { @@ -801,8 +857,8 @@ class LoadBalancer implements ILoadBalancer { $conn = false; } else { $conn->tablePrefix( $prefix ); - unset( $this->mConns['foreignFree'][$i][$oldDomain] ); - $this->mConns['foreignUsed'][$i][$domain] = $conn; + unset( $this->mConns[self::KEY_FOREIGN_FREE][$i][$oldDomain] ); + $this->mConns[self::KEY_FOREIGN_INUSE][$i][$domain] = $conn; $this->connLogger->debug( __METHOD__ . ": reusing free connection from $oldDomain for $domain" ); } @@ -822,7 +878,7 @@ class LoadBalancer implements ILoadBalancer { $conn = false; } else { $conn->tablePrefix( $prefix ); - $this->mConns['foreignUsed'][$i][$domain] = $conn; + $this->mConns[self::KEY_FOREIGN_INUSE][$i][$domain] = $conn; $this->connLogger->debug( __METHOD__ . ": opened new connection for $i/$domain" ); } } @@ -981,7 +1037,11 @@ class LoadBalancer implements ILoadBalancer { return ( $name != '' ) ? $name : 'localhost'; } + /** + * @deprecated Since 1.30, no alternative + */ public function getServerInfo( $i ) { + wfDeprecated( __METHOD__, '1.30' ); if ( isset( $this->mServers[$i] ) ) { return $this->mServers[$i]; } else { @@ -989,7 +1049,11 @@ class LoadBalancer implements ILoadBalancer { } } + /** + * @deprecated Since 1.30, construct new object + */ public function setServerInfo( $i, array $serverInfo ) { + wfDeprecated( __METHOD__, '1.30' ); $this->mServers[$i] = $serverInfo; } @@ -1025,9 +1089,9 @@ class LoadBalancer implements ILoadBalancer { } ); $this->mConns = [ - 'local' => [], - 'foreignFree' => [], - 'foreignUsed' => [], + self::KEY_LOCAL => [], + self::KEY_FOREIGN_FREE => [], + self::KEY_FOREIGN_INUSE => [], ]; $this->connsOpened = 0; } @@ -1197,7 +1261,7 @@ class LoadBalancer implements ILoadBalancer { // This happens if onTransactionIdle() callbacks leave callbacks on *another* DB // (which finished its callbacks already). Warn and recover in this case. Let the // callbacks run in the final commitMasterChanges() in LBFactory::shutdown(). - $this->queryLogger->error( __METHOD__ . ": found writes/callbacks pending." ); + $this->queryLogger->info( __METHOD__ . ": found writes/callbacks pending." ); return; } elseif ( $conn->trxLevel() ) { // This happens for single-DB setups where DB_REPLICA uses the master DB, @@ -1561,13 +1625,19 @@ class LoadBalancer implements ILoadBalancer { } public function setDomainPrefix( $prefix ) { - if ( $this->mConns['foreignUsed'] ) { - // Do not switch connections to explicit foreign domains unless marked as free - $domains = []; - foreach ( $this->mConns['foreignUsed'] as $i => $connsByDomain ) { - $domains = array_merge( $domains, array_keys( $connsByDomain ) ); + // Find connections to explicit foreign domains still marked as in-use... + $domainsInUse = []; + $this->forEachOpenConnection( function ( IDatabase $conn ) use ( &$domainsInUse ) { + // Once reuseConnection() is called on a handle, its reference count goes from 1 to 0. + // Until then, it is still in use by the caller (explicitly or via DBConnRef scope). + if ( $conn->getLBInfo( 'foreignPoolRefCount' ) > 0 ) { + $domainsInUse[] = $conn->getDomainID(); } - $domains = implode( ', ', $domains ); + } ); + + // Do not switch connections to explicit foreign domains unless marked as safe + if ( $domainsInUse ) { + $domains = implode( ', ', $domainsInUse ); throw new DBUnexpectedError( null, "Foreign domain connections are still in use ($domains)." ); } diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php b/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php index b9fefda979..79d250f6a0 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php @@ -23,7 +23,6 @@ namespace Wikimedia\Rdbms; -use IDatabase; use InvalidArgumentException; /** diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitor.php b/includes/libs/rdbms/loadmonitor/LoadMonitor.php index 5e92c33ab3..4300e9f1cd 100644 --- a/includes/libs/rdbms/loadmonitor/LoadMonitor.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitor.php @@ -24,7 +24,6 @@ namespace Wikimedia\Rdbms; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Wikimedia\ScopedCallback; -use IDatabase; use BagOStuff; /** @@ -162,7 +161,10 @@ class LoadMonitor implements ILoadMonitor { if ( !$conn ) { $lagTimes[$i] = false; $host = $this->parent->getServerName( $i ); - $this->replLogger->error( __METHOD__ . ": host $host is unreachable" ); + $this->replLogger->error( + __METHOD__ . ": host {db_server} is unreachable", + [ 'db_server' => $host ] + ); continue; } @@ -172,7 +174,10 @@ class LoadMonitor implements ILoadMonitor { $lagTimes[$i] = $conn->getLag(); if ( $lagTimes[$i] === false ) { $host = $this->parent->getServerName( $i ); - $this->replLogger->error( __METHOD__ . ": host $host is not replicating?" ); + $this->replLogger->error( + __METHOD__ . ": host {db_server} is not replicating?", + [ 'db_server' => $host ] + ); } } diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php b/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php index c0db68c3a4..ff72dbc96f 100644 --- a/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php @@ -21,7 +21,6 @@ namespace Wikimedia\Rdbms; -use IDatabase; use BagOStuff; /** diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php b/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php index 613dac5278..8bbf9e5de3 100644 --- a/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php @@ -28,14 +28,12 @@ class LoadMonitorNull implements ILoadMonitor { public function __construct( ILoadBalancer $lb, BagOStuff $sCache, BagOStuff $cCache, array $options = [] ) { - } public function setLogger( LoggerInterface $logger ) { } public function scaleLoads( array &$loads, $domain ) { - } public function getLagTimes( array $serverIndexes, $domain ) { @@ -43,6 +41,5 @@ class LoadMonitorNull implements ILoadMonitor { } public function clearCaches() { - } } diff --git a/includes/libs/redis/RedisConnRef.php b/includes/libs/redis/RedisConnRef.php index f2bb8554c6..d330d3c4f9 100644 --- a/includes/libs/redis/RedisConnRef.php +++ b/includes/libs/redis/RedisConnRef.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; use Psr\Log\LoggerAwareInterface; diff --git a/includes/libs/redis/RedisConnectionPool.php b/includes/libs/redis/RedisConnectionPool.php index 7f43436c78..509240f71c 100644 --- a/includes/libs/redis/RedisConnectionPool.php +++ b/includes/libs/redis/RedisConnectionPool.php @@ -19,7 +19,6 @@ * * @file * @defgroup Redis Redis - * @author Aaron Schulz */ use Psr\Log\LoggerAwareInterface; @@ -49,6 +48,8 @@ class RedisConnectionPool implements LoggerAwareInterface { protected $persistent; /** @var int Serializer to use (Redis::SERIALIZER_*) */ protected $serializer; + /** @var string ID for persistent connections */ + protected $id; /** @var int Current idle pool size */ protected $idlePoolSize = 0; @@ -71,9 +72,10 @@ class RedisConnectionPool implements LoggerAwareInterface { /** * @param array $options + * @param string $id * @throws Exception */ - protected function __construct( array $options ) { + protected function __construct( array $options, $id ) { if ( !class_exists( 'Redis' ) ) { throw new RuntimeException( __CLASS__ . ' requires a Redis client library. ' . @@ -95,6 +97,7 @@ class RedisConnectionPool implements LoggerAwareInterface { } else { throw new InvalidArgumentException( "Invalid serializer specified." ); } + $this->id = $id; } /** @@ -148,7 +151,7 @@ class RedisConnectionPool implements LoggerAwareInterface { $id = sha1( serialize( $options ) ); // Initialize the object at the hash as needed... if ( !isset( self::$instances[$id] ) ) { - self::$instances[$id] = new self( $options ); + self::$instances[$id] = new self( $options, $id ); } return self::$instances[$id]; @@ -230,7 +233,7 @@ class RedisConnectionPool implements LoggerAwareInterface { $conn = new Redis(); try { if ( $this->persistent ) { - $result = $conn->pconnect( $host, $port, $this->connectTimeout ); + $result = $conn->pconnect( $host, $port, $this->connectTimeout, $this->id ); } else { $result = $conn->connect( $host, $port, $this->connectTimeout ); } @@ -393,9 +396,14 @@ class RedisConnectionPool implements LoggerAwareInterface { function __destruct() { foreach ( $this->connections as $server => &$serverConnections ) { foreach ( $serverConnections as $key => &$connection ) { - /** @var Redis $conn */ - $conn = $connection['conn']; - $conn->close(); + try { + /** @var Redis $conn */ + $conn = $connection['conn']; + $conn->close(); + } catch ( RedisException $e ) { + // The destructor can be called on shutdown when random parts of the system + // have been destructed already, causing weird errors. Ignore them. + } } } } diff --git a/includes/libs/stats/BufferingStatsdDataFactory.php b/includes/libs/stats/BufferingStatsdDataFactory.php index 9c18b10f10..73c6a8f55c 100644 --- a/includes/libs/stats/BufferingStatsdDataFactory.php +++ b/includes/libs/stats/BufferingStatsdDataFactory.php @@ -32,8 +32,17 @@ use Liuggio\StatsdClient\Factory\StatsdDataFactory; * * @since 1.25 */ -class BufferingStatsdDataFactory extends StatsdDataFactory { +class BufferingStatsdDataFactory extends StatsdDataFactory implements IBufferingStatsdDataFactory { protected $buffer = []; + /** + * Collection enabled? + * @var bool + */ + protected $enabled = true; + /** + * @var string + */ + private $prefix; public function __construct( $prefix ) { parent::__construct(); @@ -49,6 +58,7 @@ class BufferingStatsdDataFactory extends StatsdDataFactory { * * @param string $key * @since 1.26 + * @return string */ private static function normalizeMetricKey( $key ) { $key = preg_replace( '/[:.]+/', '.', $key ); @@ -61,6 +71,9 @@ class BufferingStatsdDataFactory extends StatsdDataFactory { $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) { $entity = $this->produceStatsdDataEntity(); + if ( !$this->enabled ) { + return $entity; + } if ( $key !== null ) { $key = self::normalizeMetricKey( "{$this->prefix}.{$key}" ); $entity->setKey( $key ); @@ -79,9 +92,35 @@ class BufferingStatsdDataFactory extends StatsdDataFactory { } /** + * @deprecated Use getData() * @return StatsdData[] */ public function getBuffer() { return $this->buffer; } + + /** + * Check whether this data factory has any data. + * @return boolean + */ + public function hasData() { + return !empty( $this->buffer ); + } + + /** + * Return data from the factory. + * @return StatsdData[] + */ + public function getData() { + return $this->buffer; + } + + /** + * Set collection enable status. + * @param bool $enabled Will collection be enabled? + * @return void + */ + public function setEnabled( $enabled ) { + $this->enabled = $enabled; + } } diff --git a/includes/libs/stats/IBufferingStatsdDataFactory.php b/includes/libs/stats/IBufferingStatsdDataFactory.php new file mode 100644 index 0000000000..64ee2676f6 --- /dev/null +++ b/includes/libs/stats/IBufferingStatsdDataFactory.php @@ -0,0 +1,30 @@ +samplingRates; @@ -55,7 +55,7 @@ class SamplingStatsdClient extends StatsdClient { $samplingRates = [ '*' => $sampleRate ]; } if ( $samplingRates ) { - array_walk( $data, function( $item ) use ( $samplingRates ) { + array_walk( $data, function ( $item ) use ( $samplingRates ) { /** @var $item StatsdData */ foreach ( $samplingRates as $pattern => $rate ) { if ( fnmatch( $pattern, $item->getKey(), FNM_NOESCAPE ) ) { @@ -69,7 +69,7 @@ class SamplingStatsdClient extends StatsdClient { return $data; } - /* + /** * Send the metrics over UDP * Sample the metrics according to their sample rate and send the remaining ones. * @@ -147,7 +147,7 @@ class SamplingStatsdClient extends StatsdClient { } /** - * {@inheritDoc} + * @inheritDoc */ protected function throwException( Exception $exception ) { if ( !$this->getFailSilently() ) { diff --git a/includes/libs/virtualrest/VirtualRESTServiceClient.php b/includes/libs/virtualrest/VirtualRESTServiceClient.php index 1b7545a892..e3b9376f21 100644 --- a/includes/libs/virtualrest/VirtualRESTServiceClient.php +++ b/includes/libs/virtualrest/VirtualRESTServiceClient.php @@ -40,7 +40,6 @@ * - stream : resource to stream the HTTP response body to * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'. * - * @author Aaron Schulz * @since 1.23 */ class VirtualRESTServiceClient { @@ -103,7 +102,7 @@ class VirtualRESTServiceClient { * @return array (prefix,VirtualRESTService) or (null,null) if none found */ public function getMountAndService( $path ) { - $cmpFunc = function( $a, $b ) { + $cmpFunc = function ( $a, $b ) { $al = substr_count( $a, '/' ); $bl = substr_count( $b, '/' ); if ( $al === $bl ) { @@ -207,7 +206,7 @@ class VirtualRESTServiceClient { } // Function to get IDs that won't collide with keys in $armoredIndexMap - $idFunc = function() use ( &$curUniqueId ) { + $idFunc = function () use ( &$curUniqueId ) { return $curUniqueId++; }; diff --git a/includes/libs/xmp/XMP.php b/includes/libs/xmp/XMP.php index f1df7f19dd..e12766a2ad 100644 --- a/includes/libs/xmp/XMP.php +++ b/includes/libs/xmp/XMP.php @@ -130,12 +130,9 @@ class XMPReader implements LoggerAwareInterface { private $logger; /** - * Constructor. - * * Primary job is to initialize the XMLParser */ function __construct( LoggerInterface $logger = null ) { - if ( !function_exists( 'xml_parser_create_ns' ) ) { // this should already be checked by this point throw new RuntimeException( 'XMP support requires XML Parser' ); @@ -174,7 +171,6 @@ class XMPReader implements LoggerAwareInterface { * For example in jpeg's with extendedXMP */ private function resetXMLParser() { - $this->destroyXMLParser(); $this->xmlParser = xml_parser_create_ns( 'UTF-8', ' ' ); @@ -272,7 +268,6 @@ class XMPReader implements LoggerAwareInterface { if ( isset( $data['xmp-exif']['GPSAltitudeRef'] ) && isset( $data['xmp-exif']['GPSAltitude'] ) ) { - // Must convert to a real before multiplying by -1 // XMPValidate guarantees there will always be a '/' in this value. list( $nom, $denom ) = explode( '/', $data['xmp-exif']['GPSAltitude'] ); @@ -496,7 +491,6 @@ class XMPReader implements LoggerAwareInterface { * @throws RuntimeException On invalid data */ function char( $parser, $data ) { - $data = trim( $data ); if ( trim( $data ) === "" ) { return; @@ -645,7 +639,6 @@ class XMPReader implements LoggerAwareInterface { * @throws RuntimeException */ private function endElementNested( $elm ) { - /* cur item must be the same as $elm, unless if in MODE_STRUCT * in which case it could also be rdf:Description */ if ( $this->curItem[0] !== $elm @@ -755,7 +748,6 @@ class XMPReader implements LoggerAwareInterface { * @param string $elm Namespace and element */ private function endElementModeQDesc( $elm ) { - if ( $elm === self::NS_RDF . ' value' ) { list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 ); $this->saveValue( $ns, $tag, $this->charContent ); @@ -1004,7 +996,6 @@ class XMPReader implements LoggerAwareInterface { */ private function startElementModeInitial( $ns, $tag, $attribs ) { if ( $ns !== self::NS_RDF ) { - if ( isset( $this->items[$ns][$tag] ) ) { if ( isset( $this->items[$ns][$tag]['structPart'] ) ) { // If this element is supposed to appear only as @@ -1066,7 +1057,6 @@ class XMPReader implements LoggerAwareInterface { */ private function startElementModeStruct( $ns, $tag, $attribs ) { if ( $ns !== self::NS_RDF ) { - if ( isset( $this->items[$ns][$tag] ) ) { if ( isset( $this->items[$ns][$this->ancestorStruct]['children'] ) && !isset( $this->items[$ns][$this->ancestorStruct]['children'][$tag] ) @@ -1194,7 +1184,6 @@ class XMPReader implements LoggerAwareInterface { * @throws RuntimeException */ function startElement( $parser, $elm, $attribs ) { - if ( $elm === self::NS_RDF . ' RDF' || $elm === 'adobe:ns:meta/ xmpmeta' || $elm === 'adobe:ns:meta/ xapmeta' @@ -1335,7 +1324,6 @@ class XMPReader implements LoggerAwareInterface { * @param string $val Value to save */ private function saveValue( $ns, $tag, $val ) { - $info =& $this->items[$ns][$tag]; $finalName = isset( $info['map_name'] ) ? $info['map_name'] : $tag; diff --git a/includes/linkeddata/PageDataRequestHandler.php b/includes/linkeddata/PageDataRequestHandler.php new file mode 100644 index 0000000000..43cb44c854 --- /dev/null +++ b/includes/linkeddata/PageDataRequestHandler.php @@ -0,0 +1,172 @@ +getText( 'target', '' ) === '' ) { + return false; + } else { + return true; + } + } + + $parts = explode( '/', $subPage, 2 ); + if ( $parts !== 2 ) { + $slot = $parts[0]; + if ( $slot === 'main' || $slot === '' ) { + return true; + } + } + + return false; + } + + /** + * Main method for handling requests. + * + * @param string $subPage + * @param WebRequest $request The request parameters. Known parameters are: + * - title: the page title + * - format: the format + * - oldid|revision: the revision ID + * @param OutputPage $output + * + * @note: Instead of an output page, a WebResponse could be sufficient, but + * redirect logic is currently implemented in OutputPage. + * + * @throws HttpError + */ + public function handleRequest( $subPage, WebRequest $request, OutputPage $output ) { + // No matter what: The response is always public + $output->getRequest()->response()->header( 'Access-Control-Allow-Origin: *' ); + + if ( !$this->canHandleRequest( $subPage, $request ) ) { + throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $subPage ) ); + } + + $revision = 0; + + $parts = explode( '/', $subPage, 2 ); + if ( $subPage !== '' ) { + $title = $parts[1]; + } else { + $title = $request->getText( 'target', '' ); + } + + $revision = $request->getInt( 'oldid', $revision ); + $revision = $request->getInt( 'revision', $revision ); + + if ( $title === null || $title === '' ) { + //TODO: different error message? + throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $title ) ); + } + + try { + $title = Title::newFromTextThrow( $title ); + } catch ( MalformedTitleException $ex ) { + throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $title ) ); + } + + $this->httpContentNegotiation( $request, $output, $title, $revision ); + } + + /** + * Applies HTTP content negotiation. + * If the negotiation is successful, this method will set the appropriate redirect + * in the OutputPage object and return. Otherwise, an HttpError is thrown. + * + * @param WebRequest $request + * @param OutputPage $output + * @param Title $title + * @param int $revision The desired revision + * + * @throws HttpError + */ + public function httpContentNegotiation( + WebRequest $request, + OutputPage $output, + Title $title, + $revision = 0 + ) { + $contentHandler = ContentHandler::getForTitle( $title ); + $mimeTypes = $contentHandler->getSupportedFormats(); + + $headers = $request->getAllHeaders(); + if ( isset( $headers['ACCEPT'] ) ) { + $parser = new HttpAcceptParser(); + $accept = $parser->parseWeights( $headers['ACCEPT'] ); + } else { + // anything goes + $accept = [ + '*' => 0.1 // just to make extra sure + ]; + // prefer the default + $accept[$mimeTypes[0]] = 1; + } + + $negotiator = new HttpAcceptNegotiator( $mimeTypes ); + $format = $negotiator->getBestSupportedKey( $accept, null ); + + if ( $format === null ) { + $format = isset( $accept['text/html'] ) ? 'text/html' : null; + } + + if ( $format === null ) { + $msg = wfMessage( 'pagedata-not-acceptable', implode( ', ', $mimeTypes ) ); + throw new HttpError( 406, $msg ); + } + + $url = $this->getDocUrl( $title, $format, $revision ); + $output->redirect( $url, 303 ); + } + + /** + * Returns a url representing the given title. + * + * @param Title $title + * @param string|null $format The (normalized) format name, or '' + * @param int $revision + * @return string + */ + private function getDocUrl( Title $title, $format = '', $revision = 0 ) { + $params = []; + + if ( $revision > 0 ) { + $params['oldid'] = $revision; + } + + if ( $format === 'text/html' ) { + return $title->getFullURL( $params ); + } + + $params[ 'action' ] = 'raw'; + + return $title->getFullURL( $params ); + } + +} diff --git a/includes/logging/BlockLogFormatter.php b/includes/logging/BlockLogFormatter.php index a0bfb59345..1ed18cd0bb 100644 --- a/includes/logging/BlockLogFormatter.php +++ b/includes/logging/BlockLogFormatter.php @@ -60,7 +60,7 @@ class BlockLogFormatter extends LogFormatter { // is shown on the correct side of the tooltip text. $durationTooltip = '‎' . htmlspecialchars( $params[4] ); $params[4] = Message::rawParam( - "" . + "" . $this->context->getLanguage()->translateBlockExpiry( $params[4], $this->context->getUser(), diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php index 05973df325..ceb00520bf 100644 --- a/includes/logging/DeleteLogFormatter.php +++ b/includes/logging/DeleteLogFormatter.php @@ -39,6 +39,12 @@ class DeleteLogFormatter extends LogFormatter { // logentry-suppress-event-legacy, logentry-suppress-revision-legacy return "$key-legacy"; } + } elseif ( $this->entry->getSubtype() === 'restore' ) { + $rawParams = $this->entry->getParameters(); + if ( !isset( $rawParams[':assoc:count'] ) ) { + // Message: logentry-delete-restore-nocount + return $key . '-nocount'; + } } return $key; @@ -97,6 +103,19 @@ class DeleteLogFormatter extends LogFormatter { $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 ); return $this->parsedParametersDeleteLog; } + } elseif ( $subtype === 'restore' ) { + $rawParams = $this->entry->getParameters(); + if ( isset( $rawParams[':assoc:count'] ) ) { + $countList = []; + foreach ( $rawParams[':assoc:count'] as $type => $count ) { + if ( $count ) { + // Messages: restore-count-revisions, restore-count-files + $countList[] = $this->context->msg( 'restore-count-' . $type ) + ->numParams( $count )->plain(); + } + } + $params[3] = $this->context->getLanguage()->listToText( $countList ); + } } $this->parsedParametersDeleteLog = $params; @@ -276,6 +295,11 @@ class DeleteLogFormatter extends LogFormatter { $params[':assoc:old'][$key] = (bool)( $old & $bit ); $params[':assoc:new'][$key] = (bool)( $new & $bit ); } + } elseif ( $subtype === 'restore' ) { + $rawParams = $entry->getParameters(); + if ( isset( $rawParams[':assoc:count'] ) ) { + $params[':assoc:count'] = $rawParams[':assoc:count']; + } } return $params; diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php index c9f13457de..fa94fe5b23 100644 --- a/includes/logging/LogEntry.php +++ b/includes/logging/LogEntry.php @@ -28,6 +28,8 @@ * @since 1.19 */ +use Wikimedia\Rdbms\IDatabase; + /** * Interface for log entries. Every log entry has these methods. * @@ -435,8 +437,6 @@ class ManualLogEntry extends LogEntryBase { protected $legacy = false; /** - * Constructor. - * * @since 1.19 * @param string $type * @param string $subtype @@ -632,7 +632,7 @@ class ManualLogEntry extends LogEntryBase { } $dbw->insert( 'logging', $data, __METHOD__ ); - $this->id = !is_null( $id ) ? $id : $dbw->insertId(); + $this->id = $dbw->insertId(); $rows = []; foreach ( $relations as $tag => $values ) { diff --git a/includes/logging/LogEventsList.php b/includes/logging/LogEventsList.php index 43829109cb..00d3bd3315 100644 --- a/includes/logging/LogEventsList.php +++ b/includes/logging/LogEventsList.php @@ -2,7 +2,7 @@ /** * Contain classes to list log entries * - * Copyright © 2004 Brion Vibber , 2008 Aaron Schulz + * Copyright © 2004 Brion Vibber * https://www.mediawiki.org/ * * This program is free software; you can redistribute it and/or modify @@ -23,7 +23,9 @@ * @file */ +use MediaWiki\Linker\LinkRenderer; use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\IDatabase; class LogEventsList extends ContextSource { const NO_ACTION_LINK = 1; @@ -48,17 +50,21 @@ class LogEventsList extends ContextSource { protected $allowedActions = null; /** - * Constructor. + * @var LinkRenderer|null + */ + private $linkRenderer; + + /** * The first two parameters used to be $skin and $out, but now only a context * is needed, that's why there's a second unused parameter. * * @param IContextSource|Skin $context Context to use; formerly it was * a Skin object. Use of Skin is deprecated. - * @param null $unused Unused; used to be an OutputPage object. + * @param LinkRenderer|null $linkRenderer previously unused * @param int $flags Can be a combination of self::NO_ACTION_LINK, * self::NO_EXTRA_USER_LINKS or self::USE_CHECKBOXES. */ - public function __construct( $context, $unused = null, $flags = 0 ) { + public function __construct( $context, $linkRenderer = null, $flags = 0 ) { if ( $context instanceof IContextSource ) { $this->setContext( $context ); } else { @@ -68,6 +74,21 @@ class LogEventsList extends ContextSource { $this->flags = $flags; $this->showTagEditUI = ChangeTags::showTagEditingUI( $this->getUser() ); + if ( $linkRenderer instanceof LinkRenderer ) { + $this->linkRenderer = $linkRenderer; + } + } + + /** + * @since 1.30 + * @return LinkRenderer + */ + protected function getLinkRenderer() { + if ( $this->linkRenderer !== null ) { + return $this->linkRenderer; + } else { + return MediaWikiServices::getInstance()->getLinkRenderer(); + } } /** @@ -148,7 +169,7 @@ class LogEventsList extends ContextSource { // Option value -> message mapping $links = []; $hiddens = ''; // keep track for "go" button - $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); + $linkRenderer = $this->getLinkRenderer(); foreach ( $filter as $type => $val ) { // Should the below assignment be outside the foreach? // Then it would have to be copied. Not certain what is more expensive. @@ -358,6 +379,7 @@ class LogEventsList extends ContextSource { $entry = DatabaseLogEntry::newFromRow( $row ); $formatter = LogFormatter::newFromEntry( $entry ); $formatter->setContext( $this->getContext() ); + $formatter->setLinkRenderer( $this->getLinkRenderer() ); $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) ); $time = htmlspecialchars( $this->getLanguage()->userTimeAndDate( @@ -389,9 +411,18 @@ class LogEventsList extends ContextSource { [ 'mw-logline-' . $entry->getType() ], $newClasses ); + $attribs = [ + 'data-mw-logid' => $entry->getId(), + 'data-mw-logaction' => $entry->getFullType(), + ]; + $ret = "$del $time $action $comment $revert $tagDisplay"; - return Html::rawElement( 'li', [ 'class' => $classes ], - "$del $time $action $comment $revert $tagDisplay" ) . "\n"; + // Let extensions add data + Hooks::run( 'LogEventsListLineEnding', [ $this, &$ret, $entry, &$classes, &$attribs ] ); + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); + $attribs['class'] = implode( ' ', $classes ); + + return Html::rawElement( 'li', $attribs, $ret ) . "\n"; } /** @@ -538,7 +569,7 @@ class LogEventsList extends ContextSource { /** * Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey) * - * @param OutputPage|string $out By-reference + * @param OutputPage|string &$out * @param string|array $types Log types to show * @param string|Title $page The page title to show log entries for * @param string $user The user who made the log entries @@ -597,8 +628,11 @@ class LogEventsList extends ContextSource { $context = RequestContext::getMain(); } + // FIXME: Figure out how to inject this + $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); + # Insert list of top 50 (or top $lim) items - $loglist = new LogEventsList( $context, null, $flags ); + $loglist = new LogEventsList( $context, $linkRenderer, $flags ); $pager = new LogPager( $loglist, $types, $user, $page, '', $conds ); if ( !$useRequestParams ) { # Reset vars that may have been taken from the request @@ -676,7 +710,7 @@ class LogEventsList extends ContextSource { $urlParam = array_merge( $urlParam, $extraUrlParams ); } - $s .= MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink( + $s .= $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Log' ), $context->msg( 'log-fulllog' )->text(), [], diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php index 68404bfcea..2a47943a03 100644 --- a/includes/logging/LogFormatter.php +++ b/includes/logging/LogFormatter.php @@ -22,6 +22,8 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later * @since 1.19 */ +use MediaWiki\Linker\LinkRenderer; +use MediaWiki\MediaWikiServices; /** * Implements the default log formatting. @@ -101,6 +103,11 @@ class LogFormatter { /** @var string */ protected $irctext = false; + /** + * @var LinkRenderer|null + */ + private $linkRenderer; + protected function __construct( LogEntry $entry ) { $this->entry = $entry; $this->context = RequestContext::getMain(); @@ -114,6 +121,26 @@ class LogFormatter { $this->context = $context; } + /** + * @since 1.30 + * @param LinkRenderer $linkRenderer + */ + public function setLinkRenderer( LinkRenderer $linkRenderer ) { + $this->linkRenderer = $linkRenderer; + } + + /** + * @since 1.30 + * @return LinkRenderer + */ + public function getLinkRenderer() { + if ( $this->linkRenderer !== null ) { + return $this->linkRenderer; + } else { + return MediaWikiServices::getInstance()->getLinkRenderer(); + } + } + /** * Set the visibility restrictions for displaying content. * If set to public, and an item is deleted, then it will be replaced diff --git a/includes/logging/LogPage.php b/includes/logging/LogPage.php index 64102b7ec9..a085e3e114 100644 --- a/includes/logging/LogPage.php +++ b/includes/logging/LogPage.php @@ -72,8 +72,6 @@ class LogPage { private $target; /** - * Constructor - * * @param string $type One of '', 'block', 'protect', 'rights', 'delete', * 'upload', 'move' * @param bool $rc Whether to update recent changes as well as the logging table @@ -110,7 +108,7 @@ class LogPage { 'log_params' => $this->params ]; $dbw->insert( 'logging', $data, __METHOD__ ); - $newId = !is_null( $log_id ) ? $log_id : $dbw->insertId(); + $newId = $dbw->insertId(); # And update recentchanges if ( $this->updateRecentChanges ) { @@ -207,7 +205,7 @@ class LogPage { * @return bool */ public static function isLogType( $type ) { - return in_array( $type, LogPage::validTypes() ); + return in_array( $type, self::validTypes() ); } /** @@ -289,7 +287,7 @@ class LogPage { * @param string $type * @param Language|null $lang * @param Title $title - * @param array $params + * @param array &$params * @return string */ protected static function getTitleLink( $type, $lang, $title, &$params ) { @@ -350,7 +348,7 @@ class LogPage { $this->action = $action; $this->target = $target; $this->comment = $comment; - $this->params = LogPage::makeParamBlob( $params ); + $this->params = self::makeParamBlob( $params ); if ( $doer === null ) { global $wgUser; diff --git a/includes/logging/LogPager.php b/includes/logging/LogPager.php index ea28ff202e..f79fcfa61c 100644 --- a/includes/logging/LogPager.php +++ b/includes/logging/LogPager.php @@ -2,7 +2,7 @@ /** * Contain classes to list log entries * - * Copyright © 2004 Brion Vibber , 2008 Aaron Schulz + * Copyright © 2004 Brion Vibber * https://www.mediawiki.org/ * * This program is free software; you can redistribute it and/or modify @@ -49,8 +49,6 @@ class LogPager extends ReverseChronologicalPager { public $mLogEventsList; /** - * Constructor - * * @param LogEventsList $list * @param string|array $types Log types to show * @param string $performer The user who made the log entries @@ -305,14 +303,13 @@ class LogPager extends ReverseChronologicalPager { $options = $basic['options']; $joins = $basic['join_conds']; - $index = []; # Add log_search table if there are conditions on it. # This filters the results to only include log rows that have # log_search records with the specified ls_field and ls_value values. if ( array_key_exists( 'ls_field', $this->mConds ) ) { $tables[] = 'log_search'; - $index['log_search'] = 'ls_field_val'; - $index['logging'] = 'PRIMARY'; + $options['IGNORE INDEX'] = [ 'log_search' => 'ls_log_id' ]; + $options['USE INDEX'] = [ 'logging' => 'PRIMARY' ]; if ( !$this->hasEqualsClause( 'ls_field' ) || !$this->hasEqualsClause( 'ls_value' ) ) { @@ -322,9 +319,6 @@ class LogPager extends ReverseChronologicalPager { $options[] = 'DISTINCT'; } } - if ( count( $index ) ) { - $options['USE INDEX'] = $index; - } # Don't show duplicate rows when using log_search $joins['log_search'] = [ 'INNER JOIN', 'ls_log_id=log_id' ]; diff --git a/includes/logging/PatrolLogFormatter.php b/includes/logging/PatrolLogFormatter.php index 5b933ce269..bbd8badc8a 100644 --- a/includes/logging/PatrolLogFormatter.php +++ b/includes/logging/PatrolLogFormatter.php @@ -22,6 +22,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later * @since 1.22 */ +use MediaWiki\MediaWikiServices; /** * This class formats patrol log entries. @@ -54,7 +55,8 @@ class PatrolLogFormatter extends LogFormatter { 'oldid' => $oldid, 'diff' => 'prev' ]; - $revlink = Linker::link( $target, htmlspecialchars( $revision ), [], $query ); + $revlink = MediaWikiServices::getInstance()->getLinkRenderer()->makeLink( + $target, $revision, [], $query ); } else { $revlink = htmlspecialchars( $revision ); } diff --git a/includes/logging/ProtectLogFormatter.php b/includes/logging/ProtectLogFormatter.php index 0458297190..9e5eea54ca 100644 --- a/includes/logging/ProtectLogFormatter.php +++ b/includes/logging/ProtectLogFormatter.php @@ -21,6 +21,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later * @since 1.26 */ +use MediaWiki\MediaWikiServices; /** * This class formats protect log entries. @@ -77,6 +78,7 @@ class ProtectLogFormatter extends LogFormatter { } public function getActionLinks() { + $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); $subtype = $this->entry->getSubtype(); if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden || $subtype === 'move_prot' // the move log entry has the right action link @@ -87,8 +89,8 @@ class ProtectLogFormatter extends LogFormatter { // Show history link for all changes after the protection $title = $this->entry->getTarget(); $links = [ - Linker::link( $title, - $this->msg( 'hist' )->escaped(), + $linkRenderer->makeLink( $title, + $this->msg( 'hist' )->text(), [], [ 'action' => 'history', @@ -99,9 +101,9 @@ class ProtectLogFormatter extends LogFormatter { // Show change protection link if ( $this->context->getUser()->isAllowed( 'protect' ) ) { - $links[] = Linker::linkKnown( + $links[] = $linkRenderer->makeKnownLink( $title, - $this->msg( 'protect_change' )->escaped(), + $this->msg( 'protect_change' )->text(), [], [ 'action' => 'protect' ] ); diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php index 791330c160..4b4d19f4fb 100644 --- a/includes/logging/RightsLogFormatter.php +++ b/includes/logging/RightsLogFormatter.php @@ -176,7 +176,7 @@ class RightsLogFormatter extends LogFormatter { $oldmetadata =& $params['oldmetadata']; // unset old metadata entry to ensure metadata goes at the end of the params array unset( $params['oldmetadata'] ); - $params['oldmetadata'] = array_map( function( $index ) use ( $params, $oldmetadata ) { + $params['oldmetadata'] = array_map( function ( $index ) use ( $params, $oldmetadata ) { $result = [ 'group' => $params['4:array:oldgroups'][$index] ]; if ( isset( $oldmetadata[$index] ) ) { $result += $oldmetadata[$index]; @@ -194,7 +194,7 @@ class RightsLogFormatter extends LogFormatter { $newmetadata =& $params['newmetadata']; // unset old metadata entry to ensure metadata goes at the end of the params array unset( $params['newmetadata'] ); - $params['newmetadata'] = array_map( function( $index ) use ( $params, $newmetadata ) { + $params['newmetadata'] = array_map( function ( $index ) use ( $params, $newmetadata ) { $result = [ 'group' => $params['5:array:newgroups'][$index] ]; if ( isset( $newmetadata[$index] ) ) { $result += $newmetadata[$index]; diff --git a/includes/mail/EmailNotification.php b/includes/mail/EmailNotification.php index d66e7e37b6..2931d9dd3c 100644 --- a/includes/mail/EmailNotification.php +++ b/includes/mail/EmailNotification.php @@ -43,7 +43,8 @@ use MediaWiki\MediaWikiServices; * of sending out bulk mails (bcc:user1,user2...) for all these users having the * same timeoffset in their preferences. * - * Visit the documentation pages under http://meta.wikipedia.com/Enotif + * Visit the documentation pages under + * https://www.mediawiki.org/wiki/Help:Watching_pages */ class EmailNotification { @@ -342,7 +343,7 @@ class EmailNotification { $keys['$PAGETITLE'] = $this->title->getPrefixedText(); $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL(); $keys['$PAGEMINOREDIT'] = $this->minorEdit ? - wfMessage( 'minoredit' )->inContentLanguage()->text() : ''; + wfMessage( 'enotif_minoredit' )->inContentLanguage()->text() : ''; $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' ); if ( $this->editor->isAnon() ) { diff --git a/includes/mail/UserMailer.php b/includes/mail/UserMailer.php index 3858f27566..cb07fd5c58 100644 --- a/includes/mail/UserMailer.php +++ b/includes/mail/UserMailer.php @@ -102,7 +102,7 @@ class UserMailer { * @param MailAddress $from Sender's email * @param string $subject Email's subject. * @param string $body Email's text or Array of two strings to be the text and html bodies - * @param array $options: + * @param array $options Keys: * 'replyTo' MailAddress * 'contentType' string default 'text/plain; charset=UTF-8' * 'headers' array Extra headers to set @@ -175,18 +175,18 @@ class UserMailer { // first send to non-split address list, then to split addresses one by one $status = Status::newGood(); if ( $to ) { - $status->merge( UserMailer::sendInternal( + $status->merge( self::sendInternal( $to, $from, $subject, $body, $options ) ); } foreach ( $splitTo as $newTo ) { - $status->merge( UserMailer::sendInternal( + $status->merge( self::sendInternal( [ $newTo ], $from, $subject, $body, $options ) ); } return $status; } } - return UserMailer::sendInternal( $to, $from, $subject, $body, $options ); + return self::sendInternal( $to, $from, $subject, $body, $options ); } /** @@ -196,7 +196,7 @@ class UserMailer { * @param MailAddress $from Sender's email * @param string $subject Email's subject. * @param string $body Email's text or Array of two strings to be the text and html bodies - * @param array $options: + * @param array $options Keys: * 'replyTo' MailAddress * 'contentType' string default 'text/plain; charset=UTF-8' * 'headers' array Extra headers to set diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php index 0f0b074a67..ac39e6f3d4 100644 --- a/includes/media/Bitmap.php +++ b/includes/media/Bitmap.php @@ -88,7 +88,7 @@ class BitmapHandler extends TransformationalImageHandler { /** * @param File $image - * @param array $params + * @param array &$params * @return bool */ function normaliseParams( $image, &$params ) { @@ -129,7 +129,7 @@ class BitmapHandler extends TransformationalImageHandler { * @param File $image File associated with this thumbnail * @param array $params Array with scaler params * - * @return MediaTransformError Error object if error occurred, false (=no error) otherwise + * @return MediaTransformError|bool Error object if error occurred, false (=no error) otherwise */ protected function transformImageMagick( $image, $params ) { # use ImageMagick @@ -272,7 +272,7 @@ class BitmapHandler extends TransformationalImageHandler { * @param File $image File associated with this thumbnail * @param array $params Array with scaler params * - * @return MediaTransformError Error object if error occurred, false (=no error) otherwise + * @return MediaTransformError Error|bool object if error occurred, false (=no error) otherwise */ protected function transformImageMagickExt( $image, $params ) { global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea, @@ -367,7 +367,7 @@ class BitmapHandler extends TransformationalImageHandler { * @param File $image File associated with this thumbnail * @param array $params Array with scaler params * - * @return MediaTransformError Error object if error occurred, false (=no error) otherwise + * @return MediaTransformError Error|bool object if error occurred, false (=no error) otherwise */ protected function transformCustom( $image, $params ) { # Use a custom convert command @@ -399,7 +399,7 @@ class BitmapHandler extends TransformationalImageHandler { * @param File $image File associated with this thumbnail * @param array $params Array with scaler params * - * @return MediaTransformError Error object if error occurred, false (=no error) otherwise + * @return MediaTransformError|bool Error object if error occurred, false (=no error) otherwise */ protected function transformGd( $image, $params ) { # Use PHP's builtin GD library functions. diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php index 7999bbbf86..35c97518ea 100644 --- a/includes/media/BitmapMetadataHandler.php +++ b/includes/media/BitmapMetadataHandler.php @@ -160,6 +160,7 @@ class BitmapMetadataHandler { $meta = new self(); $seg = JpegMetadataExtractor::segmentSplitter( $filename ); + if ( isset( $seg['COM'] ) && isset( $seg['COM'][0] ) ) { $meta->addMetadata( [ 'JPEGFileComment' => $seg['COM'] ], 'native' ); } @@ -182,9 +183,8 @@ class BitmapMetadataHandler { $meta->addMetadata( $array, $type ); } } - if ( isset( $seg['byteOrder'] ) ) { - $meta->getExif( $filename, $seg['byteOrder'] ); - } + + $meta->getExif( $filename, isset( $seg['byteOrder'] ) ? $seg['byteOrder'] : 'BE' ); return $meta->getMetadataArray(); } @@ -230,7 +230,6 @@ class BitmapMetadataHandler { * @return array Metadata array */ public static function GIF( $filename ) { - $meta = new self(); $baseArray = GIFMetadataExtractor::getMetadata( $filename ); diff --git a/includes/media/Bitmap_ClientOnly.php b/includes/media/Bitmap_ClientOnly.php index 56b20acba5..3ec87723e9 100644 --- a/includes/media/Bitmap_ClientOnly.php +++ b/includes/media/Bitmap_ClientOnly.php @@ -35,7 +35,7 @@ class BitmapHandler_ClientOnly extends BitmapHandler { /** * @param File $image - * @param array $params + * @param array &$params * @return bool */ function normaliseParams( $image, &$params ) { diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php index a852215ca8..aae66d37e0 100644 --- a/includes/media/DjVu.php +++ b/includes/media/DjVu.php @@ -304,11 +304,28 @@ class DjVuHandler extends ImageHandler { return false; } + $trees = $this->extractTreesFromMetadata( $metadata ); + $image->djvuTextTree = $trees['TextTree']; + $image->dejaMetaTree = $trees['MetaTree']; + + if ( $gettext ) { + return $image->djvuTextTree; + } else { + return $image->dejaMetaTree; + } + } + + /** + * Extracts metadata and text trees from metadata XML in string form + * @param string $metadata XML metadata as a string + * @return array + */ + protected function extractTreesFromMetadata( $metadata ) { MediaWiki\suppressWarnings(); try { // Set to false rather than null to avoid further attempts - $image->dejaMetaTree = false; - $image->djvuTextTree = false; + $metaTree = false; + $textTree = false; $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE ); if ( $tree->getName() == 'mw-djvu' ) { /** @var SimpleXMLElement $b */ @@ -316,23 +333,20 @@ class DjVuHandler extends ImageHandler { if ( $b->getName() == 'DjVuTxt' ) { // @todo File::djvuTextTree and File::dejaMetaTree are declared // dynamically. Add a public File::$data to facilitate this? - $image->djvuTextTree = $b; + $textTree = $b; } elseif ( $b->getName() == 'DjVuXML' ) { - $image->dejaMetaTree = $b; + $metaTree = $b; } } } else { - $image->dejaMetaTree = $tree; + $metaTree = $tree; } } catch ( Exception $e ) { - wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" ); + wfDebug( "Bogus multipage XML metadata\n" ); } MediaWiki\restoreWarnings(); - if ( $gettext ) { - return $image->djvuTextTree; - } else { - return $image->dejaMetaTree; - } + + return [ 'MetaTree' => $metaTree, 'TextTree' => $textTree ]; } function getImageSize( $image, $path ) { @@ -394,30 +408,39 @@ class DjVuHandler extends ImageHandler { $cache::TTL_INDEFINITE, function () use ( $file ) { $tree = $this->getMetaTree( $file ); - if ( !$tree ) { - return false; - } - - $dimsByPage = []; - $count = count( $tree->xpath( '//OBJECT' ) ); - for ( $i = 0; $i < $count; $i++ ) { - $o = $tree->BODY[0]->OBJECT[$i]; - if ( $o ) { - $dimsByPage[$i] = [ - 'width' => (int)$o['width'], - 'height' => (int)$o['height'], - ]; - } else { - $dimsByPage[$i] = false; - } - } - - return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ]; + return $this->getDimensionInfoFromMetaTree( $tree ); }, [ 'pcTTL' => $cache::TTL_INDEFINITE ] ); } + /** + * Given an XML metadata tree, returns dimension information about the document + * @param bool|SimpleXMLElement $metatree The file's XML metadata tree + * @return bool|array + */ + protected function getDimensionInfoFromMetaTree( $metatree ) { + if ( !$metatree ) { + return false; + } + + $dimsByPage = []; + $count = count( $metatree->xpath( '//OBJECT' ) ); + for ( $i = 0; $i < $count; $i++ ) { + $o = $metatree->BODY[0]->OBJECT[$i]; + if ( $o ) { + $dimsByPage[$i] = [ + 'width' => (int)$o['width'], + 'height' => (int)$o['height'], + ]; + } else { + $dimsByPage[$i] = false; + } + } + + return [ 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage ]; + } + /** * @param File $image * @param int $page Page number to get information for diff --git a/includes/media/DjVuImage.php b/includes/media/DjVuImage.php index 57b5b36c14..d25111c445 100644 --- a/includes/media/DjVuImage.php +++ b/includes/media/DjVuImage.php @@ -40,8 +40,6 @@ class DjVuImage { const DJVUTXT_MEMORY_LIMIT = 300000; /** - * Constructor - * * @param string $filename The DjVu file name. */ function __construct( $filename ) { diff --git a/includes/media/Exif.php b/includes/media/Exif.php index 95fa8594fc..cd457f0bec 100644 --- a/includes/media/Exif.php +++ b/includes/media/Exif.php @@ -96,8 +96,6 @@ class Exif { private $byteOrder; /** - * Constructor - * * @param string $file Filename. * @param string $byteOrder Type of byte ordering either 'BE' (Big Endian) * or 'LE' (Little Endian). Default ''. @@ -120,162 +118,162 @@ class Exif { # TIFF Rev. 6.0 Attribute Information (p22) 'IFD0' => [ # Tags relating to image structure - 'ImageWidth' => Exif::SHORT_OR_LONG, # Image width - 'ImageLength' => Exif::SHORT_OR_LONG, # Image height - 'BitsPerSample' => [ Exif::SHORT, 3 ], # Number of bits per component + 'ImageWidth' => self::SHORT_OR_LONG, # Image width + 'ImageLength' => self::SHORT_OR_LONG, # Image height + 'BitsPerSample' => [ self::SHORT, 3 ], # Number of bits per component # "When a primary image is JPEG compressed, this designation is not" # "necessary and is omitted." (p23) - 'Compression' => Exif::SHORT, # Compression scheme #p23 - 'PhotometricInterpretation' => Exif::SHORT, # Pixel composition #p23 - 'Orientation' => Exif::SHORT, # Orientation of image #p24 - 'SamplesPerPixel' => Exif::SHORT, # Number of components - 'PlanarConfiguration' => Exif::SHORT, # Image data arrangement #p24 - 'YCbCrSubSampling' => [ Exif::SHORT, 2 ], # Subsampling ratio of Y to C #p24 - 'YCbCrPositioning' => Exif::SHORT, # Y and C positioning #p24-25 - 'XResolution' => Exif::RATIONAL, # Image resolution in width direction - 'YResolution' => Exif::RATIONAL, # Image resolution in height direction - 'ResolutionUnit' => Exif::SHORT, # Unit of X and Y resolution #(p26) + 'Compression' => self::SHORT, # Compression scheme #p23 + 'PhotometricInterpretation' => self::SHORT, # Pixel composition #p23 + 'Orientation' => self::SHORT, # Orientation of image #p24 + 'SamplesPerPixel' => self::SHORT, # Number of components + 'PlanarConfiguration' => self::SHORT, # Image data arrangement #p24 + 'YCbCrSubSampling' => [ self::SHORT, 2 ], # Subsampling ratio of Y to C #p24 + 'YCbCrPositioning' => self::SHORT, # Y and C positioning #p24-25 + 'XResolution' => self::RATIONAL, # Image resolution in width direction + 'YResolution' => self::RATIONAL, # Image resolution in height direction + 'ResolutionUnit' => self::SHORT, # Unit of X and Y resolution #(p26) # Tags relating to recording offset - 'StripOffsets' => Exif::SHORT_OR_LONG, # Image data location - 'RowsPerStrip' => Exif::SHORT_OR_LONG, # Number of rows per strip - 'StripByteCounts' => Exif::SHORT_OR_LONG, # Bytes per compressed strip - 'JPEGInterchangeFormat' => Exif::SHORT_OR_LONG, # Offset to JPEG SOI - 'JPEGInterchangeFormatLength' => Exif::SHORT_OR_LONG, # Bytes of JPEG data + 'StripOffsets' => self::SHORT_OR_LONG, # Image data location + 'RowsPerStrip' => self::SHORT_OR_LONG, # Number of rows per strip + 'StripByteCounts' => self::SHORT_OR_LONG, # Bytes per compressed strip + 'JPEGInterchangeFormat' => self::SHORT_OR_LONG, # Offset to JPEG SOI + 'JPEGInterchangeFormatLength' => self::SHORT_OR_LONG, # Bytes of JPEG data # Tags relating to image data characteristics - 'TransferFunction' => Exif::IGNORE, # Transfer function - 'WhitePoint' => [ Exif::RATIONAL, 2 ], # White point chromaticity - 'PrimaryChromaticities' => [ Exif::RATIONAL, 6 ], # Chromaticities of primarities + 'TransferFunction' => self::IGNORE, # Transfer function + 'WhitePoint' => [ self::RATIONAL, 2 ], # White point chromaticity + 'PrimaryChromaticities' => [ self::RATIONAL, 6 ], # Chromaticities of primarities # Color space transformation matrix coefficients #p27 - 'YCbCrCoefficients' => [ Exif::RATIONAL, 3 ], - 'ReferenceBlackWhite' => [ Exif::RATIONAL, 6 ], # Pair of black and white reference values + 'YCbCrCoefficients' => [ self::RATIONAL, 3 ], + 'ReferenceBlackWhite' => [ self::RATIONAL, 6 ], # Pair of black and white reference values # Other tags - 'DateTime' => Exif::ASCII, # File change date and time - 'ImageDescription' => Exif::ASCII, # Image title - 'Make' => Exif::ASCII, # Image input equipment manufacturer - 'Model' => Exif::ASCII, # Image input equipment model - 'Software' => Exif::ASCII, # Software used - 'Artist' => Exif::ASCII, # Person who created the image - 'Copyright' => Exif::ASCII, # Copyright holder + 'DateTime' => self::ASCII, # File change date and time + 'ImageDescription' => self::ASCII, # Image title + 'Make' => self::ASCII, # Image input equipment manufacturer + 'Model' => self::ASCII, # Image input equipment model + 'Software' => self::ASCII, # Software used + 'Artist' => self::ASCII, # Person who created the image + 'Copyright' => self::ASCII, # Copyright holder ], # Exif IFD Attribute Information (p30-31) 'EXIF' => [ # @todo NOTE: Nonexistence of this field is taken to mean nonconformance # to the Exif 2.1 AND 2.2 standards - 'ExifVersion' => Exif::UNDEFINED, # Exif version - 'FlashPixVersion' => Exif::UNDEFINED, # Supported Flashpix version #p32 + 'ExifVersion' => self::UNDEFINED, # Exif version + 'FlashPixVersion' => self::UNDEFINED, # Supported Flashpix version #p32 # Tags relating to Image Data Characteristics - 'ColorSpace' => Exif::SHORT, # Color space information #p32 + 'ColorSpace' => self::SHORT, # Color space information #p32 # Tags relating to image configuration - 'ComponentsConfiguration' => Exif::UNDEFINED, # Meaning of each component #p33 - 'CompressedBitsPerPixel' => Exif::RATIONAL, # Image compression mode - 'PixelYDimension' => Exif::SHORT_OR_LONG, # Valid image height - 'PixelXDimension' => Exif::SHORT_OR_LONG, # Valid image width + 'ComponentsConfiguration' => self::UNDEFINED, # Meaning of each component #p33 + 'CompressedBitsPerPixel' => self::RATIONAL, # Image compression mode + 'PixelYDimension' => self::SHORT_OR_LONG, # Valid image height + 'PixelXDimension' => self::SHORT_OR_LONG, # Valid image width # Tags relating to related user information - 'MakerNote' => Exif::IGNORE, # Manufacturer notes - 'UserComment' => Exif::UNDEFINED, # User comments #p34 + 'MakerNote' => self::IGNORE, # Manufacturer notes + 'UserComment' => self::UNDEFINED, # User comments #p34 # Tags relating to related file information - 'RelatedSoundFile' => Exif::ASCII, # Related audio file + 'RelatedSoundFile' => self::ASCII, # Related audio file # Tags relating to date and time - 'DateTimeOriginal' => Exif::ASCII, # Date and time of original data generation #p36 - 'DateTimeDigitized' => Exif::ASCII, # Date and time of original data generation - 'SubSecTime' => Exif::ASCII, # DateTime subseconds - 'SubSecTimeOriginal' => Exif::ASCII, # DateTimeOriginal subseconds - 'SubSecTimeDigitized' => Exif::ASCII, # DateTimeDigitized subseconds + 'DateTimeOriginal' => self::ASCII, # Date and time of original data generation #p36 + 'DateTimeDigitized' => self::ASCII, # Date and time of original data generation + 'SubSecTime' => self::ASCII, # DateTime subseconds + 'SubSecTimeOriginal' => self::ASCII, # DateTimeOriginal subseconds + 'SubSecTimeDigitized' => self::ASCII, # DateTimeDigitized subseconds # Tags relating to picture-taking conditions (p31) - 'ExposureTime' => Exif::RATIONAL, # Exposure time - 'FNumber' => Exif::RATIONAL, # F Number - 'ExposureProgram' => Exif::SHORT, # Exposure Program #p38 - 'SpectralSensitivity' => Exif::ASCII, # Spectral sensitivity - 'ISOSpeedRatings' => Exif::SHORT, # ISO speed rating - 'OECF' => Exif::IGNORE, + 'ExposureTime' => self::RATIONAL, # Exposure time + 'FNumber' => self::RATIONAL, # F Number + 'ExposureProgram' => self::SHORT, # Exposure Program #p38 + 'SpectralSensitivity' => self::ASCII, # Spectral sensitivity + 'ISOSpeedRatings' => self::SHORT, # ISO speed rating + 'OECF' => self::IGNORE, # Optoelectronic conversion factor. Note: We don't have support for this atm. - 'ShutterSpeedValue' => Exif::SRATIONAL, # Shutter speed - 'ApertureValue' => Exif::RATIONAL, # Aperture - 'BrightnessValue' => Exif::SRATIONAL, # Brightness - 'ExposureBiasValue' => Exif::SRATIONAL, # Exposure bias - 'MaxApertureValue' => Exif::RATIONAL, # Maximum land aperture - 'SubjectDistance' => Exif::RATIONAL, # Subject distance - 'MeteringMode' => Exif::SHORT, # Metering mode #p40 - 'LightSource' => Exif::SHORT, # Light source #p40-41 - 'Flash' => Exif::SHORT, # Flash #p41-42 - 'FocalLength' => Exif::RATIONAL, # Lens focal length - 'SubjectArea' => [ Exif::SHORT, 4 ], # Subject area - 'FlashEnergy' => Exif::RATIONAL, # Flash energy - 'SpatialFrequencyResponse' => Exif::IGNORE, # Spatial frequency response. Not supported atm. - 'FocalPlaneXResolution' => Exif::RATIONAL, # Focal plane X resolution - 'FocalPlaneYResolution' => Exif::RATIONAL, # Focal plane Y resolution - 'FocalPlaneResolutionUnit' => Exif::SHORT, # Focal plane resolution unit #p46 - 'SubjectLocation' => [ Exif::SHORT, 2 ], # Subject location - 'ExposureIndex' => Exif::RATIONAL, # Exposure index - 'SensingMethod' => Exif::SHORT, # Sensing method #p46 - 'FileSource' => Exif::UNDEFINED, # File source #p47 - 'SceneType' => Exif::UNDEFINED, # Scene type #p47 - 'CFAPattern' => Exif::IGNORE, # CFA pattern. not supported atm. - 'CustomRendered' => Exif::SHORT, # Custom image processing #p48 - 'ExposureMode' => Exif::SHORT, # Exposure mode #p48 - 'WhiteBalance' => Exif::SHORT, # White Balance #p49 - 'DigitalZoomRatio' => Exif::RATIONAL, # Digital zoom ration - 'FocalLengthIn35mmFilm' => Exif::SHORT, # Focal length in 35 mm film - 'SceneCaptureType' => Exif::SHORT, # Scene capture type #p49 - 'GainControl' => Exif::SHORT, # Scene control #p49-50 - 'Contrast' => Exif::SHORT, # Contrast #p50 - 'Saturation' => Exif::SHORT, # Saturation #p50 - 'Sharpness' => Exif::SHORT, # Sharpness #p50 - 'DeviceSettingDescription' => Exif::IGNORE, + 'ShutterSpeedValue' => self::SRATIONAL, # Shutter speed + 'ApertureValue' => self::RATIONAL, # Aperture + 'BrightnessValue' => self::SRATIONAL, # Brightness + 'ExposureBiasValue' => self::SRATIONAL, # Exposure bias + 'MaxApertureValue' => self::RATIONAL, # Maximum land aperture + 'SubjectDistance' => self::RATIONAL, # Subject distance + 'MeteringMode' => self::SHORT, # Metering mode #p40 + 'LightSource' => self::SHORT, # Light source #p40-41 + 'Flash' => self::SHORT, # Flash #p41-42 + 'FocalLength' => self::RATIONAL, # Lens focal length + 'SubjectArea' => [ self::SHORT, 4 ], # Subject area + 'FlashEnergy' => self::RATIONAL, # Flash energy + 'SpatialFrequencyResponse' => self::IGNORE, # Spatial frequency response. Not supported atm. + 'FocalPlaneXResolution' => self::RATIONAL, # Focal plane X resolution + 'FocalPlaneYResolution' => self::RATIONAL, # Focal plane Y resolution + 'FocalPlaneResolutionUnit' => self::SHORT, # Focal plane resolution unit #p46 + 'SubjectLocation' => [ self::SHORT, 2 ], # Subject location + 'ExposureIndex' => self::RATIONAL, # Exposure index + 'SensingMethod' => self::SHORT, # Sensing method #p46 + 'FileSource' => self::UNDEFINED, # File source #p47 + 'SceneType' => self::UNDEFINED, # Scene type #p47 + 'CFAPattern' => self::IGNORE, # CFA pattern. not supported atm. + 'CustomRendered' => self::SHORT, # Custom image processing #p48 + 'ExposureMode' => self::SHORT, # Exposure mode #p48 + 'WhiteBalance' => self::SHORT, # White Balance #p49 + 'DigitalZoomRatio' => self::RATIONAL, # Digital zoom ration + 'FocalLengthIn35mmFilm' => self::SHORT, # Focal length in 35 mm film + 'SceneCaptureType' => self::SHORT, # Scene capture type #p49 + 'GainControl' => self::SHORT, # Scene control #p49-50 + 'Contrast' => self::SHORT, # Contrast #p50 + 'Saturation' => self::SHORT, # Saturation #p50 + 'Sharpness' => self::SHORT, # Sharpness #p50 + 'DeviceSettingDescription' => self::IGNORE, # Device settings description. This could maybe be supported. Need to find an # example file that uses this to see if it has stuff of interest in it. - 'SubjectDistanceRange' => Exif::SHORT, # Subject distance range #p51 + 'SubjectDistanceRange' => self::SHORT, # Subject distance range #p51 - 'ImageUniqueID' => Exif::ASCII, # Unique image ID + 'ImageUniqueID' => self::ASCII, # Unique image ID ], # GPS Attribute Information (p52) 'GPS' => [ - 'GPSVersion' => Exif::UNDEFINED, + 'GPSVersion' => self::UNDEFINED, # Should be an array of 4 Exif::BYTE's. However php treats it as an undefined # Note exif standard calls this GPSVersionID, but php doesn't like the id suffix - 'GPSLatitudeRef' => Exif::ASCII, # North or South Latitude #p52-53 - 'GPSLatitude' => [ Exif::RATIONAL, 3 ], # Latitude - 'GPSLongitudeRef' => Exif::ASCII, # East or West Longitude #p53 - 'GPSLongitude' => [ Exif::RATIONAL, 3 ], # Longitude - 'GPSAltitudeRef' => Exif::UNDEFINED, + 'GPSLatitudeRef' => self::ASCII, # North or South Latitude #p52-53 + 'GPSLatitude' => [ self::RATIONAL, 3 ], # Latitude + 'GPSLongitudeRef' => self::ASCII, # East or West Longitude #p53 + 'GPSLongitude' => [ self::RATIONAL, 3 ], # Longitude + 'GPSAltitudeRef' => self::UNDEFINED, # Altitude reference. Note, the exif standard says this should be an EXIF::Byte, # but php seems to disagree. - 'GPSAltitude' => Exif::RATIONAL, # Altitude - 'GPSTimeStamp' => [ Exif::RATIONAL, 3 ], # GPS time (atomic clock) - 'GPSSatellites' => Exif::ASCII, # Satellites used for measurement - 'GPSStatus' => Exif::ASCII, # Receiver status #p54 - 'GPSMeasureMode' => Exif::ASCII, # Measurement mode #p54-55 - 'GPSDOP' => Exif::RATIONAL, # Measurement precision - 'GPSSpeedRef' => Exif::ASCII, # Speed unit #p55 - 'GPSSpeed' => Exif::RATIONAL, # Speed of GPS receiver - 'GPSTrackRef' => Exif::ASCII, # Reference for direction of movement #p55 - 'GPSTrack' => Exif::RATIONAL, # Direction of movement - 'GPSImgDirectionRef' => Exif::ASCII, # Reference for direction of image #p56 - 'GPSImgDirection' => Exif::RATIONAL, # Direction of image - 'GPSMapDatum' => Exif::ASCII, # Geodetic survey data used - 'GPSDestLatitudeRef' => Exif::ASCII, # Reference for latitude of destination #p56 - 'GPSDestLatitude' => [ Exif::RATIONAL, 3 ], # Latitude destination - 'GPSDestLongitudeRef' => Exif::ASCII, # Reference for longitude of destination #p57 - 'GPSDestLongitude' => [ Exif::RATIONAL, 3 ], # Longitude of destination - 'GPSDestBearingRef' => Exif::ASCII, # Reference for bearing of destination #p57 - 'GPSDestBearing' => Exif::RATIONAL, # Bearing of destination - 'GPSDestDistanceRef' => Exif::ASCII, # Reference for distance to destination #p57-58 - 'GPSDestDistance' => Exif::RATIONAL, # Distance to destination - 'GPSProcessingMethod' => Exif::UNDEFINED, # Name of GPS processing method - 'GPSAreaInformation' => Exif::UNDEFINED, # Name of GPS area - 'GPSDateStamp' => Exif::ASCII, # GPS date - 'GPSDifferential' => Exif::SHORT, # GPS differential correction + 'GPSAltitude' => self::RATIONAL, # Altitude + 'GPSTimeStamp' => [ self::RATIONAL, 3 ], # GPS time (atomic clock) + 'GPSSatellites' => self::ASCII, # Satellites used for measurement + 'GPSStatus' => self::ASCII, # Receiver status #p54 + 'GPSMeasureMode' => self::ASCII, # Measurement mode #p54-55 + 'GPSDOP' => self::RATIONAL, # Measurement precision + 'GPSSpeedRef' => self::ASCII, # Speed unit #p55 + 'GPSSpeed' => self::RATIONAL, # Speed of GPS receiver + 'GPSTrackRef' => self::ASCII, # Reference for direction of movement #p55 + 'GPSTrack' => self::RATIONAL, # Direction of movement + 'GPSImgDirectionRef' => self::ASCII, # Reference for direction of image #p56 + 'GPSImgDirection' => self::RATIONAL, # Direction of image + 'GPSMapDatum' => self::ASCII, # Geodetic survey data used + 'GPSDestLatitudeRef' => self::ASCII, # Reference for latitude of destination #p56 + 'GPSDestLatitude' => [ self::RATIONAL, 3 ], # Latitude destination + 'GPSDestLongitudeRef' => self::ASCII, # Reference for longitude of destination #p57 + 'GPSDestLongitude' => [ self::RATIONAL, 3 ], # Longitude of destination + 'GPSDestBearingRef' => self::ASCII, # Reference for bearing of destination #p57 + 'GPSDestBearing' => self::RATIONAL, # Bearing of destination + 'GPSDestDistanceRef' => self::ASCII, # Reference for distance to destination #p57-58 + 'GPSDestDistance' => self::RATIONAL, # Distance to destination + 'GPSProcessingMethod' => self::UNDEFINED, # Name of GPS processing method + 'GPSAreaInformation' => self::UNDEFINED, # Name of GPS area + 'GPSDateStamp' => self::ASCII, # GPS date + 'GPSDifferential' => self::SHORT, # GPS differential correction ], ]; @@ -362,7 +360,6 @@ class Exif { * if we make up our own types like Exif::DATE. */ function collapseData() { - $this->exifGPStoNumber( 'GPSLatitude' ); $this->exifGPStoNumber( 'GPSDestLatitude' ); $this->exifGPStoNumber( 'GPSLongitude' ); @@ -446,7 +443,6 @@ class Exif { */ private function charCodeString( $prop ) { if ( isset( $this->mFilteredExifData[$prop] ) ) { - if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) { // invalid. Must be at least 9 bytes long. @@ -763,43 +759,43 @@ class Exif { } // Does not work if not typecast switch ( (string)$etype ) { - case (string)Exif::BYTE: + case (string)self::BYTE: $this->debug( $val, __FUNCTION__, $debug ); return $this->isByte( $val ); - case (string)Exif::ASCII: + case (string)self::ASCII: $this->debug( $val, __FUNCTION__, $debug ); return $this->isASCII( $val ); - case (string)Exif::SHORT: + case (string)self::SHORT: $this->debug( $val, __FUNCTION__, $debug ); return $this->isShort( $val ); - case (string)Exif::LONG: + case (string)self::LONG: $this->debug( $val, __FUNCTION__, $debug ); return $this->isLong( $val ); - case (string)Exif::RATIONAL: + case (string)self::RATIONAL: $this->debug( $val, __FUNCTION__, $debug ); return $this->isRational( $val ); - case (string)Exif::SHORT_OR_LONG: + case (string)self::SHORT_OR_LONG: $this->debug( $val, __FUNCTION__, $debug ); return $this->isShort( $val ) || $this->isLong( $val ); - case (string)Exif::UNDEFINED: + case (string)self::UNDEFINED: $this->debug( $val, __FUNCTION__, $debug ); return $this->isUndefined( $val ); - case (string)Exif::SLONG: + case (string)self::SLONG: $this->debug( $val, __FUNCTION__, $debug ); return $this->isSlong( $val ); - case (string)Exif::SRATIONAL: + case (string)self::SRATIONAL: $this->debug( $val, __FUNCTION__, $debug ); return $this->isSrational( $val ); - case (string)Exif::IGNORE: + case (string)self::IGNORE: $this->debug( $val, __FUNCTION__, $debug ); return false; diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php index 7aeefa02e4..0e10abb9f9 100644 --- a/includes/media/ExifBitmap.php +++ b/includes/media/ExifBitmap.php @@ -30,7 +30,6 @@ class ExifBitmapHandler extends BitmapHandler { const BROKEN_FILE = '-1'; // error extracting metadata const OLD_BROKEN_FILE = '0'; // outdated error extracting metadata. - const SRGB_ICC_PROFILE_NAME = 'IEC 61966-2.1 Default RGB colour space - sRGB'; function convertMetadataVersion( $metadata, $version = 1 ) { // basically flattens arrays. @@ -243,75 +242,4 @@ class ExifBitmapHandler extends BitmapHandler { return 0; } - - protected function transformImageMagick( $image, $params ) { - global $wgUseTinyRGBForJPGThumbnails; - - $ret = parent::transformImageMagick( $image, $params ); - - if ( $ret ) { - return $ret; - } - - if ( $params['mimeType'] === 'image/jpeg' && $wgUseTinyRGBForJPGThumbnails ) { - // T100976 If the profile embedded in the JPG is sRGB, swap it for the smaller - // (and free) TinyRGB - - $this->swapICCProfile( - $params['dstPath'], - self::SRGB_ICC_PROFILE_NAME, - realpath( __DIR__ ) . '/tinyrgb.icc' - ); - } - - return false; - } - - /** - * Swaps an embedded ICC profile for another, if found. - * Depends on exiftool, no-op if not installed. - * @param string $filepath File to be manipulated (will be overwritten) - * @param string $oldProfileString Exact name of color profile to look for - * (the one that will be replaced) - * @param string $profileFilepath ICC profile file to apply to the file - * @since 1.26 - * @return bool - */ - public function swapICCProfile( $filepath, $oldProfileString, $profileFilepath ) { - global $wgExiftool; - - if ( !$wgExiftool || !is_executable( $wgExiftool ) ) { - return false; - } - - $cmd = wfEscapeShellArg( $wgExiftool, - '-DeviceModelDesc', - '-S', - '-T', - $filepath - ); - - $output = wfShellExecWithStderr( $cmd, $retval ); - - if ( $retval !== 0 || strcasecmp( trim( $output ), $oldProfileString ) !== 0 ) { - // We can't establish that this file has the expected ICC profile, don't process it - return false; - } - - $cmd = wfEscapeShellArg( $wgExiftool, - '-overwrite_original', - '-icc_profile<=' . $profileFilepath, - $filepath - ); - - $output = wfShellExecWithStderr( $cmd, $retval ); - - if ( $retval !== 0 ) { - $this->logErrorForExternalProcess( $retval, $output, $cmd ); - - return false; - } - - return true; - } } diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php index f2372874ba..6cac1261c7 100644 --- a/includes/media/FormatMetadata.php +++ b/includes/media/FormatMetadata.php @@ -24,6 +24,7 @@ * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification * @file */ +use MediaWiki\MediaWikiServices; use Wikimedia\Timestamp\TimestampException; /** @@ -1581,14 +1582,14 @@ class FormatMetadata extends ContextSource { * @since 1.23 */ public function fetchExtendedMetadata( File $file ) { - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); // If revision deleted, exit immediately if ( $file->isDeleted( File::DELETED_FILE ) ) { return []; } - $cacheKey = wfMemcKey( + $cacheKey = $cache->makeKey( 'getExtendedMetadata', $this->getLanguage()->getCode(), (int)$this->singleLang, @@ -1674,7 +1675,7 @@ class FormatMetadata extends ContextSource { * * @param File $file File to use * @param array $extendedMetadata - * @param int $maxCacheTime Hook handlers might use this parameter to override cache time + * @param int &$maxCacheTime Hook handlers might use this parameter to override cache time * * @return array [ => ['value' => ]], or [] on error * @since 1.23 @@ -1771,7 +1772,7 @@ class FormatMetadata extends ContextSource { /** * Takes an array returned by the getExtendedMetadata* functions, * and resolves multi-language values in it. - * @param array $metadata + * @param array &$metadata * @since 1.23 */ protected function resolveMultilangMetadata( &$metadata ) { @@ -1788,7 +1789,7 @@ class FormatMetadata extends ContextSource { /** * Takes an array returned by the getExtendedMetadata* functions, * and turns all fields into single-valued ones by dropping extra values. - * @param array $metadata + * @param array &$metadata * @since 1.25 */ protected function discardMultipleValues( &$metadata ) { @@ -1809,7 +1810,7 @@ class FormatMetadata extends ContextSource { /** * Makes sure the given array is a valid API response fragment - * @param array $arr + * @param array &$arr */ protected function sanitizeArrayForAPI( &$arr ) { if ( !is_array( $arr ) ) { diff --git a/includes/media/GIFMetadataExtractor.php b/includes/media/GIFMetadataExtractor.php index de409e78e7..ac5fc81c9a 100644 --- a/includes/media/GIFMetadataExtractor.php +++ b/includes/media/GIFMetadataExtractor.php @@ -54,9 +54,9 @@ class GIFMetadataExtractor { * @return array */ static function getMetadata( $filename ) { - self::$gifFrameSep = pack( "C", ord( "," ) ); - self::$gifExtensionSep = pack( "C", ord( "!" ) ); - self::$gifTerm = pack( "C", ord( ";" ) ); + self::$gifFrameSep = pack( "C", ord( "," ) ); // 2C + self::$gifExtensionSep = pack( "C", ord( "!" ) ); // 21 + self::$gifTerm = pack( "C", ord( ";" ) ); // 3B $frameCount = 0; $duration = 0.0; @@ -82,8 +82,11 @@ class GIFMetadataExtractor { throw new Exception( "Not a valid GIF file; header: $buf" ); } - // Skip over width and height. - fread( $fh, 4 ); + // Read width and height. + $buf = fread( $fh, 2 ); + $width = unpack( 'v', $buf )[1]; + $buf = fread( $fh, 2 ); + $height = unpack( 'v', $buf )[1]; // Read BPP $buf = fread( $fh, 1 ); diff --git a/includes/media/IPTC.php b/includes/media/IPTC.php index f93b1b59a5..343adc2088 100644 --- a/includes/media/IPTC.php +++ b/includes/media/IPTC.php @@ -97,7 +97,7 @@ class IPTC { case '2#025': /* keywords */ $data['Keywords'] = self::convIPTC( $val, $c ); break; - case '2#101': /* Country (shown)*/ + case '2#101': /* Country (shown) */ $data['CountryDest'] = self::convIPTC( $val, $c ); break; case '2#095': /* state/province (shown) */ @@ -115,7 +115,7 @@ class IPTC { case '2#040': /* special instructions */ $data['SpecialInstructions'] = self::convIPTC( $val, $c ); break; - case '2#105': /* headline*/ + case '2#105': /* headline */ $data['Headline'] = self::convIPTC( $val, $c ); break; case '2#110': /* credit */ @@ -476,7 +476,6 @@ class IPTC { * only code that seems to have wide use. It does detect that code. */ static function getCharset( $tag ) { - // According to iim standard, charset is defined by the tag 1:90. // in which there are iso 2022 escape sequences to specify the character set. // the iim standard seems to encourage that all necessary escape sequences are diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php index 158c0dc6ea..1eefddbd4f 100644 --- a/includes/media/ImageHandler.php +++ b/includes/media/ImageHandler.php @@ -80,7 +80,7 @@ abstract class ImageHandler extends MediaHandler { /** * @param File $image - * @param array $params + * @param array &$params * @return bool */ function normaliseParams( $image, &$params ) { @@ -152,8 +152,8 @@ abstract class ImageHandler extends MediaHandler { /** * Validate thumbnail parameters and fill in the correct height * - * @param int $width Specified width (input/output) - * @param int $height Height (output only) + * @param int &$width Specified width (input/output) + * @param int &$height Height (output only) * @param int $srcWidth Width of the source image * @param int $srcHeight Height of the source image * @param string $mimeType Unused diff --git a/includes/media/Jpeg.php b/includes/media/Jpeg.php index c9f0dfab10..287c198c57 100644 --- a/includes/media/Jpeg.php +++ b/includes/media/Jpeg.php @@ -31,6 +31,8 @@ * @ingroup Media */ class JpegHandler extends ExifBitmapHandler { + const SRGB_EXIF_COLOR_SPACE = 'sRGB'; + const SRGB_ICC_PROFILE_DESCRIPTION = 'sRGB IEC61966-2.1'; function normaliseParams( $image, &$params ) { if ( !parent::normaliseParams( $image, $params ) ) { @@ -171,4 +173,118 @@ class JpegHandler extends ExifBitmapHandler { return $params; } + + /** + * @inheritDoc + */ + protected function transformImageMagick( $image, $params ) { + global $wgUseTinyRGBForJPGThumbnails; + + $ret = parent::transformImageMagick( $image, $params ); + + if ( $ret ) { + return $ret; + } + + if ( $wgUseTinyRGBForJPGThumbnails ) { + // T100976 If the profile embedded in the JPG is sRGB, swap it for the smaller + // (and free) TinyRGB + + /** + * We'll want to replace the color profile for JPGs: + * * in the sRGB color space, or with the sRGB profile + * (other profiles will be left untouched) + * * without color space or profile, in which case browsers + * should assume sRGB, but don't always do (e.g. on wide-gamut + * monitors (unless it's meant for low bandwith) + * @see https://phabricator.wikimedia.org/T134498 + */ + $colorSpaces = [ self::SRGB_EXIF_COLOR_SPACE, '-' ]; + $profiles = [ self::SRGB_ICC_PROFILE_DESCRIPTION ]; + + // we'll also add TinyRGB profile to images lacking a profile, but + // only if they're not low quality (which are meant to save bandwith + // and we don't want to increase the filesize by adding a profile) + if ( isset( $params['quality'] ) && $params['quality'] > 30 ) { + $profiles[] = '-'; + } + + $this->swapICCProfile( + $params['dstPath'], + $colorSpaces, + $profiles, + realpath( __DIR__ ) . '/tinyrgb.icc' + ); + } + + return false; + } + + /** + * Swaps an embedded ICC profile for another, if found. + * Depends on exiftool, no-op if not installed. + * @param string $filepath File to be manipulated (will be overwritten) + * @param array $colorSpaces Only process files with this/these Color Space(s) + * @param array $oldProfileStrings Exact name(s) of color profile to look for + * (the one that will be replaced) + * @param string $profileFilepath ICC profile file to apply to the file + * @since 1.26 + * @return bool + */ + public function swapICCProfile( $filepath, array $colorSpaces, + array $oldProfileStrings, $profileFilepath + ) { + global $wgExiftool; + + if ( !$wgExiftool || !is_executable( $wgExiftool ) ) { + return false; + } + + $cmd = wfEscapeShellArg( $wgExiftool, + '-EXIF:ColorSpace', + '-ICC_Profile:ProfileDescription', + '-S', + '-T', + $filepath + ); + + $output = wfShellExecWithStderr( $cmd, $retval ); + + // Explode EXIF data into an array with [0 => Color Space, 1 => Device Model Desc] + $data = explode( "\t", trim( $output ) ); + + if ( $retval !== 0 ) { + return false; + } + + // Make a regex out of the source data to match it to an array of color + // spaces in a case-insensitive way + $colorSpaceRegex = '/'.preg_quote( $data[0], '/' ).'/i'; + if ( empty( preg_grep( $colorSpaceRegex, $colorSpaces ) ) ) { + // We can't establish that this file matches the color space, don't process it + return false; + } + + $profileRegex = '/'.preg_quote( $data[1], '/' ).'/i'; + if ( empty( preg_grep( $profileRegex, $oldProfileStrings ) ) ) { + // We can't establish that this file has the expected ICC profile, don't process it + return false; + } + + $cmd = wfEscapeShellArg( $wgExiftool, + '-overwrite_original', + '-icc_profile<=' . $profileFilepath, + $filepath + ); + + $output = wfShellExecWithStderr( $cmd, $retval ); + + if ( $retval !== 0 ) { + $this->logErrorForExternalProcess( $retval, $output, $cmd ); + + return false; + } + + return true; + } } diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php index 67c957adac..211845cc8f 100644 --- a/includes/media/JpegMetadataExtractor.php +++ b/includes/media/JpegMetadataExtractor.php @@ -94,7 +94,6 @@ class JpegMetadataExtractor { $buffer = fread( $fh, 1 ); } if ( $buffer === "\xFE" ) { - // COM section -- file comment // First see if valid utf-8, // if not try to convert it to windows-1252. diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php index 6a23bd6022..2f721813e8 100644 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -85,7 +85,7 @@ abstract class MediaHandler { * Should be idempotent. * Returns false if the parameters are unacceptable and the transform should fail * @param File $image - * @param array $params + * @param array &$params */ abstract function normaliseParams( $image, &$params ); @@ -157,7 +157,6 @@ abstract class MediaHandler { */ function convertMetadataVersion( $metadata, $version = 1 ) { if ( !is_array( $metadata ) ) { - // unserialize to keep return parameter consistent. MediaWiki\suppressWarnings(); $ret = unserialize( $metadata ); @@ -305,13 +304,13 @@ abstract class MediaHandler { } /** - * Get useful response headers for GET/HEAD requests for a file with the given metadata - * - * @param mixed $metadata Result of the getMetadata() function of this handler for a file + * @deprecated since 1.30, use MediaHandler::getContentHeaders instead + * @param array $metadata * @return array */ public function getStreamHeaders( $metadata ) { - return []; + wfDeprecated( __METHOD__, '1.30' ); + return $this->getContentHeaders( $metadata ); } /** @@ -715,7 +714,7 @@ abstract class MediaHandler { * * @see LocalFile::purgeThumbnails * - * @param array $files + * @param array &$files * @param array $options Purge options. Currently will always be * an array with a single key 'forThumbRefresh' set to true. */ @@ -868,4 +867,60 @@ abstract class MediaHandler { public function getWarningConfig( $file ) { return null; } + + /** + * Converts a dimensions array about a potentially multipage document from an + * exhaustive list of ordered page numbers to a list of page ranges + * @param Array $pagesByDimensions + * @return String + * @since 1.30 + */ + public static function getPageRangesByDimensions( $pagesByDimensions ) { + $pageRangesByDimensions = []; + + foreach ( $pagesByDimensions as $dimensions => $pageList ) { + $ranges = []; + $firstPage = $pageList[0]; + $lastPage = $firstPage - 1; + + foreach ( $pageList as $page ) { + if ( $page > $lastPage + 1 ) { + if ( $firstPage != $lastPage ) { + $ranges[] = "$firstPage-$lastPage"; + } else { + $ranges[] = "$firstPage"; + } + + $firstPage = $page; + } + + $lastPage = $page; + } + + if ( $firstPage != $lastPage ) { + $ranges[] = "$firstPage-$lastPage"; + } else { + $ranges[] = "$firstPage"; + } + + $pageRangesByDimensions[ $dimensions ] = $ranges; + } + + $dimensionsString = []; + foreach ( $pageRangesByDimensions as $dimensions => $pageRanges ) { + $dimensionsString[] = "$dimensions:" . implode( ',', $pageRanges ); + } + + return implode( '/', $dimensionsString ); + } + + /** + * Get useful response headers for GET/HEAD requests for a file with the given metadata + * @param array $metadata Contains this handler's unserialized getMetadata() for a file + * @return array + * @since 1.30 + */ + public function getContentHeaders( $metadata ) { + return []; + } } diff --git a/includes/media/PNG.php b/includes/media/PNG.php index 294abb350d..b6288bc3f4 100644 --- a/includes/media/PNG.php +++ b/includes/media/PNG.php @@ -112,7 +112,6 @@ class PNGHandler extends BitmapHandler { } function isMetadataValid( $image, $metadata ) { - if ( $metadata === self::BROKEN_FILE ) { // Do not repetitivly regenerate metadata on broken file. return self::METADATA_GOOD; diff --git a/includes/media/PNGMetadataExtractor.php b/includes/media/PNGMetadataExtractor.php index d0517d7a56..c12ca0bf10 100644 --- a/includes/media/PNGMetadataExtractor.php +++ b/includes/media/PNGMetadataExtractor.php @@ -121,6 +121,8 @@ class PNGMetadataExtractor { if ( !$buf || strlen( $buf ) < $chunk_size ) { throw new Exception( __METHOD__ . ": Read error" ); } + $width = unpack( 'N', substr( $buf, 0, 4 ) )[1]; + $height = unpack( 'N', substr( $buf, 4, 4 ) )[1]; $bitDepth = ord( substr( $buf, 8, 1 ) ); // Detect the color type in British English as per the spec // https://www.w3.org/TR/PNG/#11IHDR diff --git a/includes/media/SVG.php b/includes/media/SVG.php index 0cea6d899f..bd78b49e5d 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -126,7 +126,7 @@ class SvgHandler extends ImageHandler { /** * @param File $image - * @param array $params + * @param array &$params * @return bool */ function normaliseParams( $image, &$params ) { @@ -205,7 +205,17 @@ class SvgHandler extends ImageHandler { // https://git.gnome.org/browse/librsvg/commit/?id=f01aded72c38f0e18bc7ff67dee800e380251c8e $tmpDir = wfTempDir() . '/svg_' . wfRandomString( 24 ); $lnPath = "$tmpDir/" . basename( $srcPath ); - $ok = mkdir( $tmpDir, 0771 ) && symlink( $srcPath, $lnPath ); + $ok = mkdir( $tmpDir, 0771 ); + if ( !$ok ) { + wfDebugLog( 'thumbnail', + sprintf( 'Thumbnail failed on %s: could not create temporary directory %s', + wfHostname(), $tmpDir ) ); + return new MediaTransformError( 'thumbnail_error', + $params['width'], $params['height'], + wfMessage( 'thumbnail-temp-create' )->text() + ); + } + $ok = symlink( $srcPath, $lnPath ); /** @noinspection PhpUnusedLocalVariableInspection */ $cleaner = new ScopedCallback( function () use ( $tmpDir, $lnPath ) { MediaWiki\suppressWarnings(); diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php index 4087fb3d5b..9b22cbee1a 100644 --- a/includes/media/SVGMetadataExtractor.php +++ b/includes/media/SVGMetadataExtractor.php @@ -58,8 +58,6 @@ class SVGReader { private $languagePrefixes = []; /** - * Constructor - * * Creates an SVGReader drawing from the source provided * @param string $source URI from which to read * @throws MWException|Exception @@ -307,12 +305,6 @@ class SVGReader { } } - // @todo FIXME: Unused, remove? - private function throwXmlError( $err ) { - $this->debug( "FAILURE: $err" ); - wfDebug( "SVGReader XML error: $err\n" ); - } - private function debug( $data ) { if ( $this->mDebug ) { wfDebug( "SVGReader: $data\n" ); diff --git a/includes/media/TransformationalImageHandler.php b/includes/media/TransformationalImageHandler.php index 1ab0f369db..32208cca70 100644 --- a/includes/media/TransformationalImageHandler.php +++ b/includes/media/TransformationalImageHandler.php @@ -36,7 +36,7 @@ use MediaWiki\MediaWikiServices; abstract class TransformationalImageHandler extends ImageHandler { /** * @param File $image - * @param array $params Transform parameters. Entries with the keys 'width' + * @param array &$params Transform parameters. Entries with the keys 'width' * and 'height' are the respective screen width and height, while the keys * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions. * @return bool @@ -156,7 +156,6 @@ abstract class TransformationalImageHandler extends ImageHandler { && $scalerParams['physicalHeight'] == $scalerParams['srcHeight'] && !isset( $scalerParams['quality'] ) ) { - # normaliseParams (or the user) wants us to return the unscaled image wfDebug( __METHOD__ . ": returning unscaled image\n" ); @@ -521,7 +520,7 @@ abstract class TransformationalImageHandler extends ImageHandler { $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version'; wfDebug( $method . ": Running convert -version\n" ); $retval = ''; - $return = wfShellExec( $cmd, $retval ); + $return = wfShellExecWithStderr( $cmd, $retval ); $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches ); @@ -589,7 +588,7 @@ abstract class TransformationalImageHandler extends ImageHandler { * Runs the 'BitmapHandlerCheckImageArea' hook. * * @param File $file - * @param array $params + * @param array &$params * @return bool * @since 1.25 */ diff --git a/includes/media/WebP.php b/includes/media/WebP.php index e2c2d2d192..3e4731ae08 100644 --- a/includes/media/WebP.php +++ b/includes/media/WebP.php @@ -86,7 +86,7 @@ class WebPHandler extends BitmapHandler { /** * Extracts the image size and WebP type from a file * - * @param string $chunks Chunks as extracted by RiffExtractor + * @param string $filename * @return array|bool Header data array with entries 'compression', 'width' and 'height', * where 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown'. False if * file is not a valid WebP file. @@ -118,6 +118,7 @@ class WebPHandler extends BitmapHandler { /** * Extracts the image size and WebP type from a file based on the chunk list * @param array $chunks Chunks as extracted by RiffExtractor + * @param string $filename * @return array Header data array with entries 'compression', 'width' and 'height', where * 'compression' can be 'lossy', 'lossless', 'animated' or 'unknown' */ @@ -245,7 +246,7 @@ class WebPHandler extends BitmapHandler { } /** - * @param $file + * @param File $file * @return bool True, not all browsers support WebP */ public function mustRender( $file ) { @@ -253,7 +254,7 @@ class WebPHandler extends BitmapHandler { } /** - * @param $file + * @param File $file * @return bool False if we are unable to render this image */ public function canRender( $file ) { @@ -286,9 +287,9 @@ class WebPHandler extends BitmapHandler { /** * Render files as PNG * - * @param $ext - * @param $mime - * @param $params + * @param string $ext + * @param string $mime + * @param array|null $params * @return array */ public function getThumbType( $ext, $mime, $params = null ) { diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php index cf9033b88f..3370e5b9d1 100644 --- a/includes/objectcache/ObjectCache.php +++ b/includes/objectcache/ObjectCache.php @@ -246,8 +246,14 @@ class ObjectCache { global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType; $candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ]; foreach ( $candidates as $candidate ) { + $cache = false; if ( $candidate !== CACHE_NONE && $candidate !== CACHE_ANYTHING ) { - return self::getInstance( $candidate ); + $cache = self::getInstance( $candidate ); + // CACHE_ACCEL might default to nothing if no APCu + // See includes/ServiceWiring.php + if ( !( $cache instanceof EmptyBagOStuff ) ) { + return $cache; + } } } diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php index 07581d7f44..3cce530c3c 100644 --- a/includes/objectcache/SqlBagOStuff.php +++ b/includes/objectcache/SqlBagOStuff.php @@ -21,6 +21,11 @@ * @ingroup Cache */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBError; +use Wikimedia\Rdbms\DBQueryError; +use Wikimedia\Rdbms\DBConnectionError; use \MediaWiki\MediaWikiServices; use \Wikimedia\WaitConditionLoop; use \Wikimedia\Rdbms\TransactionProfiler; @@ -143,7 +148,7 @@ class SqlBagOStuff extends BagOStuff { protected function getSeparateMainLB() { global $wgDBtype; - if ( $wgDBtype === 'mysql' && $this->usesMainDB() ) { + if ( $this->usesMainDB() && $wgDBtype !== 'sqlite' ) { if ( !$this->separateMainLB ) { // We must keep a separate connection to MySQL in order to avoid deadlocks $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); @@ -151,8 +156,7 @@ class SqlBagOStuff extends BagOStuff { } return $this->separateMainLB; } else { - // However, SQLite has an opposite behavior. And PostgreSQL needs to know - // if we are in transaction or not (@TODO: find some PostgreSQL work-around). + // However, SQLite has an opposite behavior due to DB-level locking return null; } } @@ -583,7 +587,7 @@ class SqlBagOStuff extends BagOStuff { while ( true ) { $conds = $baseConds; if ( $maxExpTime !== false ) { - $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime ); + $conds[] = 'exptime >= ' . $db->addQuotes( $maxExpTime ); } $rows = $db->select( $this->getTableNameByShard( $i ), @@ -668,7 +672,7 @@ class SqlBagOStuff extends BagOStuff { * On typical message and page data, this can provide a 3X decrease * in storage requirements. * - * @param mixed $data + * @param mixed &$data * @return string */ protected function serialize( &$data ) { diff --git a/includes/page/Article.php b/includes/page/Article.php index e7a906d4bf..7311f71dec 100644 --- a/includes/page/Article.php +++ b/includes/page/Article.php @@ -19,6 +19,7 @@ * * @file */ +use MediaWiki\MediaWikiServices; /** * Class for viewing MediaWiki article and history. @@ -213,7 +214,6 @@ class Article implements Page { * @since 1.21 */ protected function getContentObject() { - if ( $this->mPage->getId() === 0 ) { # If this is a MediaWiki:x message, then load the messages # and return the message value for x. @@ -494,7 +494,7 @@ class Article implements Page { $useParserCache = $this->mPage->shouldCheckParserCache( $parserOptions, $oldid ); wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" ); if ( $user->getStubThreshold() ) { - $this->getContext()->getStats()->increment( 'pcache_miss_stub' ); + MediaWikiServices::getInstance()->getStatsdDataFactory()->increment( 'pcache_miss_stub' ); } $this->showRedirectedFromHeader(); @@ -568,8 +568,8 @@ class Article implements Page { $outputPage->setRevisionTimestamp( $this->mPage->getTimestamp() ); if ( !Hooks::run( 'ArticleContentViewCustom', - [ $this->fetchContentObject(), $this->getTitle(), $outputPage ] ) ) { - + [ $this->fetchContentObject(), $this->getTitle(), $outputPage ] ) + ) { # Allow extensions do their own custom view for certain pages $outputDone = true; } @@ -652,7 +652,17 @@ class Article implements Page { $this->showViewFooter(); $this->mPage->doViewUpdates( $user, $oldid ); - $outputPage->addModules( 'mediawiki.action.view.postEdit' ); + # Load the postEdit module if the user just saved this revision + # See also EditPage::setPostEditCookie + $request = $this->getContext()->getRequest(); + $cookieKey = EditPage::POST_EDIT_COOKIE_KEY_PREFIX . $this->getRevIdFetched(); + $postEdit = $request->getCookie( $cookieKey ); + if ( $postEdit ) { + # Clear the cookie. This also prevents caching of the response. + $request->response()->clearCookie( $cookieKey ); + $outputPage->addJsConfigVars( 'wgPostEdit', $postEdit ); + $outputPage->addModules( 'mediawiki.action.view.postEdit' ); + } } /** @@ -969,8 +979,8 @@ class Article implements Page { } // Check for cached results - $key = wfMemcKey( 'unpatrollable-page', $title->getArticleID() ); - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $key = $cache->makeKey( 'unpatrollable-page', $title->getArticleID() ); if ( $cache->get( $key ) ) { return false; } @@ -1110,8 +1120,8 @@ class Article implements Page { * @since 1.27 */ public static function purgePatrolFooterCache( $articleID ) { - $cache = ObjectCache::getMainWANInstance(); - $cache->delete( wfMemcKey( 'unpatrollable-page', $articleID ) ); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $cache->delete( $cache->makeKey( 'unpatrollable-page', $articleID ) ); } /** @@ -1132,7 +1142,7 @@ class Article implements Page { || $title->getNamespace() == NS_USER_TALK ) { $rootPart = explode( '/', $title->getText() )[0]; - $user = User::newFromName( $rootPart, false /* allow IP users*/ ); + $user = User::newFromName( $rootPart, false /* allow IP users */ ); $ip = User::isIP( $rootPart ); $block = Block::newFromTarget( $user, $user ); @@ -1166,11 +1176,11 @@ class Article implements Page { # Show delete and move logs if there were any such events. # The logging query can DOS the site when bots/crawlers cause 404 floods, # so be careful showing this. 404 pages must be cheap as they are hard to cache. - $cache = ObjectCache::getMainStashInstance(); - $key = wfMemcKey( 'page-recent-delete', md5( $title->getPrefixedText() ) ); + $cache = MediaWikiServices::getInstance()->getMainObjectStash(); + $key = $cache->makeKey( 'page-recent-delete', md5( $title->getPrefixedText() ) ); $loggedIn = $this->getContext()->getUser()->isLoggedIn(); if ( $loggedIn || $cache->get( $key ) ) { - $logTypes = [ 'delete', 'move' ]; + $logTypes = [ 'delete', 'move', 'protect' ]; $dbr = wfGetDB( DB_REPLICA ); @@ -1423,6 +1433,8 @@ class Article implements Page { * @param bool $appendSubtitle [optional] * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence? * @return string Containing HTML with redirect link + * + * @deprecated since 1.30 */ public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) { $lang = $this->getTitle()->getPageLanguage(); @@ -1582,7 +1594,7 @@ class Article implements Page { [ 'delete', $this->getTitle()->getPrefixedText() ] ) ) { # Flag to hide all contents of the archived revisions - $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' ); + $suppress = $request->getCheck( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' ); $this->doDelete( $reason, $suppress ); @@ -1657,97 +1669,165 @@ class Article implements Page { $title = $this->getTitle(); $ctx = $this->getContext(); $outputPage = $ctx->getOutput(); - $useMediaWikiUIEverywhere = $ctx->getConfig()->get( 'UseMediaWikiUIEverywhere' ); $outputPage->setPageTitle( wfMessage( 'delete-confirm', $title->getPrefixedText() ) ); $outputPage->addBacklinkSubtitle( $title ); $outputPage->setRobotPolicy( 'noindex,nofollow' ); + $backlinkCache = $title->getBacklinkCache(); if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) { $outputPage->wrapWikiMsg( "\n", 'deleting-backlinks-warning' ); } + + $subpageQueryLimit = 51; + $subpages = $title->getSubpages( $subpageQueryLimit ); + $subpageCount = count( $subpages ); + if ( $subpageCount > 0 ) { + $outputPage->wrapWikiMsg( "\n", + [ 'deleting-subpages-warning', Message::numParam( $subpageCount ) ] ); + } $outputPage->addWikiMsg( 'confirmdeletetext' ); Hooks::run( 'ArticleConfirmDelete', [ $this, $outputPage, &$reason ] ); $user = $this->getContext()->getUser(); - if ( $user->isAllowed( 'suppressrevision' ) ) { - $suppress = Html::openElement( 'div', [ 'id' => 'wpDeleteSuppressRow' ] ) . - Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(), - 'wpSuppress', 'wpSuppress', false, [ 'tabindex' => '4' ] ) . - Html::closeElement( 'div' ); - } else { - $suppress = ''; - } $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $title ); - $form = Html::openElement( 'form', [ 'method' => 'post', - 'action' => $title->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ] ) . - Html::openElement( 'fieldset', [ 'id' => 'mw-delete-table' ] ) . - Html::element( 'legend', null, wfMessage( 'delete-legend' )->text() ) . - Html::openElement( 'div', [ 'id' => 'mw-deleteconfirm-table' ] ) . - Html::openElement( 'div', [ 'id' => 'wpDeleteReasonListRow' ] ) . - Html::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) . - ' ' . - Xml::listDropDown( - 'wpDeleteReasonList', - wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(), - wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(), - '', - 'wpReasonDropDown', - 1 - ) . - Html::closeElement( 'div' ) . - Html::openElement( 'div', [ 'id' => 'wpDeleteReasonRow' ] ) . - Html::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) . - ' ' . - Html::input( 'wpReason', $reason, 'text', [ - 'size' => '60', - 'maxlength' => '255', - 'tabindex' => '2', - 'id' => 'wpReason', - 'class' => 'mw-ui-input-inline', - 'autofocus' - ] ) . - Html::closeElement( 'div' ); - - # Disallow watching if user is not logged in - if ( $user->isLoggedIn() ) { - $form .= - Xml::checkLabel( wfMessage( 'watchthis' )->text(), - 'wpWatch', 'wpWatch', $checkWatch, [ 'tabindex' => '3' ] ); - } - - $form .= - Html::openElement( 'div' ) . - $suppress . - Xml::submitButton( wfMessage( 'deletepage' )->text(), - [ - 'name' => 'wpConfirmB', - 'id' => 'wpConfirmB', - 'tabindex' => '5', - 'class' => $useMediaWikiUIEverywhere ? 'mw-ui-button mw-ui-destructive' : '', - ] - ) . - Html::closeElement( 'div' ) . - Html::closeElement( 'div' ) . - Xml::closeElement( 'fieldset' ) . - Html::hidden( - 'wpEditToken', - $user->getEditToken( [ 'delete', $title->getPrefixedText() ] ) - ) . - Xml::closeElement( 'form' ); - - if ( $user->isAllowed( 'editinterface' ) ) { - $link = Linker::linkKnown( - $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->getTitle(), - wfMessage( 'delete-edit-reasonlist' )->escaped(), - [], - [ 'action' => 'edit' ] - ); - $form .= '

    ' . $link . '

    '; + + $outputPage->enableOOUI(); + + $options = []; + $options[] = [ + 'data' => 'other', + 'label' => $ctx->msg( 'deletereasonotherlist' )->inContentLanguage()->text(), + ]; + $list = $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->text(); + foreach ( explode( "\n", $list ) as $option ) { + $value = trim( $option ); + if ( $value == '' ) { + continue; + } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) { + $options[] = [ 'optgroup' => trim( substr( $value, 1 ) ) ]; + } elseif ( substr( $value, 0, 2 ) == '**' ) { + $options[] = [ 'data' => trim( substr( $value, 2 ) ) ]; + } else { + $options[] = [ 'data' => trim( $value ) ]; } + } + + $fields[] = new OOUI\FieldLayout( + new OOUI\DropdownInputWidget( [ + 'name' => 'wpDeleteReasonList', + 'inputId' => 'wpDeleteReasonList', + 'tabIndex' => 1, + 'infusable' => true, + 'value' => '', + 'options' => $options + ] ), + [ + 'label' => $ctx->msg( 'deletecomment' )->text(), + 'align' => 'top', + ] + ); + + $fields[] = new OOUI\FieldLayout( + new OOUI\TextInputWidget( [ + 'name' => 'wpReason', + 'inputId' => 'wpReason', + 'tabIndex' => 2, + 'maxLength' => 255, + 'infusable' => true, + 'value' => $reason, + 'autofocus' => true, + ] ), + [ + 'label' => $ctx->msg( 'deleteotherreason' )->text(), + 'align' => 'top', + ] + ); + + if ( $user->isLoggedIn() ) { + $fields[] = new OOUI\FieldLayout( + new OOUI\CheckboxInputWidget( [ + 'name' => 'wpWatch', + 'inputId' => 'wpWatch', + 'tabIndex' => 3, + 'selected' => $checkWatch, + ] ), + [ + 'label' => $ctx->msg( 'watchthis' )->text(), + 'align' => 'inline', + 'infusable' => true, + ] + ); + } - $outputPage->addHTML( $form ); + if ( $user->isAllowed( 'suppressrevision' ) ) { + $fields[] = new OOUI\FieldLayout( + new OOUI\CheckboxInputWidget( [ + 'name' => 'wpSuppress', + 'inputId' => 'wpSuppress', + 'tabIndex' => 4, + ] ), + [ + 'label' => $ctx->msg( 'revdelete-suppress' )->text(), + 'align' => 'inline', + 'infusable' => true, + ] + ); + } + + $fields[] = new OOUI\FieldLayout( + new OOUI\ButtonInputWidget( [ + 'name' => 'wpConfirmB', + 'inputId' => 'wpConfirmB', + 'tabIndex' => 5, + 'value' => $ctx->msg( 'deletepage' )->text(), + 'label' => $ctx->msg( 'deletepage' )->text(), + 'flags' => [ 'primary', 'destructive' ], + 'type' => 'submit', + ] ), + [ + 'align' => 'top', + ] + ); + + $fieldset = new OOUI\FieldsetLayout( [ + 'label' => $ctx->msg( 'delete-legend' )->text(), + 'id' => 'mw-delete-table', + 'items' => $fields, + ] ); + + $form = new OOUI\FormLayout( [ + 'method' => 'post', + 'action' => $title->getLocalURL( 'action=delete' ), + 'id' => 'deleteconfirm', + ] ); + $form->appendContent( + $fieldset, + new OOUI\HtmlSnippet( + Html::hidden( 'wpEditToken', $user->getEditToken( [ 'delete', $title->getPrefixedText() ] ) ) + ) + ); + + $outputPage->addHTML( + new OOUI\PanelLayout( [ + 'classes' => [ 'deletepage-wrapper' ], + 'expanded' => false, + 'padded' => true, + 'framed' => true, + 'content' => $form, + ] ) + ); + + if ( $user->isAllowed( 'editinterface' ) ) { + $link = Linker::linkKnown( + $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->getTitle(), + wfMessage( 'delete-edit-reasonlist' )->escaped(), + [], + [ 'action' => 'edit' ] + ); + $outputPage->addHTML( '

    ' . $link . '

    ' ); + } $deleteLogPage = new LogPage( 'delete' ); $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) ); @@ -2042,16 +2122,20 @@ class Article implements Page { /** * Call to WikiPage function for backwards compatibility. * @see WikiPage::doPurge + * @note In 1.28 (and only 1.28), this took a $flags parameter that + * controlled how much purging was done. */ - public function doPurge( $flags = WikiPage::PURGE_ALL ) { - return $this->mPage->doPurge( $flags ); + public function doPurge() { + return $this->mPage->doPurge(); } /** * Call to WikiPage function for backwards compatibility. * @see WikiPage::getLastPurgeTimestamp + * @deprecated since 1.29 */ public function getLastPurgeTimestamp() { + wfDeprecated( __METHOD__, '1.29' ); return $this->mPage->getLastPurgeTimestamp(); } @@ -2496,7 +2580,7 @@ class Article implements Page { /** * @param array $limit * @param array $expiry - * @param bool $cascade + * @param bool &$cascade * @param string $reason * @param User $user * @return Status @@ -2510,7 +2594,7 @@ class Article implements Page { /** * @param array $limit * @param string $reason - * @param int $cascade + * @param int &$cascade * @param array $expiry * @return bool */ @@ -2531,7 +2615,7 @@ class Article implements Page { * @param bool $suppress * @param int $u1 Unused * @param bool $u2 Unused - * @param string $error + * @param string &$error * @return bool */ public function doDeleteArticle( @@ -2545,7 +2629,7 @@ class Article implements Page { * @param string $summary * @param string $token * @param bool $bot - * @param array $resultDetails + * @param array &$resultDetails * @param User|null $user * @return array */ @@ -2558,7 +2642,7 @@ class Article implements Page { * @param string $fromP * @param string $summary * @param bool $bot - * @param array $resultDetails + * @param array &$resultDetails * @param User|null $guser * @return array */ @@ -2568,7 +2652,7 @@ class Article implements Page { } /** - * @param bool $hasHistory + * @param bool &$hasHistory * @return mixed */ public function generateReason( &$hasHistory ) { diff --git a/includes/page/CategoryPage.php b/includes/page/CategoryPage.php index ccc50f78dd..2d7e8f24fd 100644 --- a/includes/page/CategoryPage.php +++ b/includes/page/CategoryPage.php @@ -117,4 +117,12 @@ class CategoryPage extends Article { $out->addHTML( $viewer->getHTML() ); $this->addHelpLink( 'Help:Categories' ); } + + function getCategoryViewerClass() { + return $this->mCategoryViewerClass; + } + + function setCategoryViewerClass( $class ) { + $this->mCategoryViewerClass = $class; + } } diff --git a/includes/page/ImageHistoryPseudoPager.php b/includes/page/ImageHistoryPseudoPager.php index 58f1666842..4785ef1ad4 100644 --- a/includes/page/ImageHistoryPseudoPager.php +++ b/includes/page/ImageHistoryPseudoPager.php @@ -31,10 +31,28 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager { */ protected $mTitle; + /** + * @since 1.14 + * @var ImagePage + */ + public $mImagePage; + + /** + * @since 1.14 + * @var File[] + */ + public $mHist; + + /** + * @since 1.14 + * @var int[] + */ + public $mRange; + /** * @param ImagePage $imagePage */ - function __construct( $imagePage ) { + public function __construct( $imagePage ) { parent::__construct( $imagePage->getContext() ); $this->mImagePage = $imagePage; $this->mTitle = clone $imagePage->getTitle(); @@ -53,18 +71,18 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager { /** * @return Title */ - function getTitle() { + public function getTitle() { return $this->mTitle; } - function getQueryInfo() { + public function getQueryInfo() { return false; } /** * @return string */ - function getIndexField() { + public function getIndexField() { return ''; } @@ -72,14 +90,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager { * @param object $row * @return string */ - function formatRow( $row ) { + public function formatRow( $row ) { return ''; } /** * @return string */ - function getBody() { + public function getBody() { $s = ''; $this->doQuery(); if ( count( $this->mHist ) ) { @@ -113,7 +131,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager { return $s; } - function doQuery() { + public function doQuery() { if ( $this->mQueryDone ) { return; } diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php index f8202a6cb2..0e3eaa5bcc 100644 --- a/includes/page/ImagePage.php +++ b/includes/page/ImagePage.php @@ -115,23 +115,11 @@ class ImagePage extends Article { if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) { if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) { - // mTitle is the same as the redirect target so ask Article - // to perform the redirect for us. $request->setVal( 'diffonly', 'true' ); - parent::view(); - return; - } else { - // mTitle is not the same as the redirect target so it is - // probably the redirect page itself. Fake the redirect symbol - $out->setPageTitle( $this->getTitle()->getPrefixedText() ); - $out->addHTML( $this->viewRedirect( - Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ), - /* $appendSubtitle */ true, - /* $forceKnown */ true ) - ); - $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() ); - return; } + + parent::view(); + return; } if ( $wgShowEXIF && $this->displayImg->exists() ) { @@ -266,15 +254,16 @@ class ImagePage extends Article { $r .= "\n"; foreach ( $metadata as $type => $stuff ) { foreach ( $stuff as $v ) { - # @todo FIXME: Why is this using escapeId for a class?! - $class = Sanitizer::escapeId( $v['id'] ); + $class = str_replace( ' ', '_', $v['id'] ); if ( $type == 'collapsed' ) { // Handled by mediawiki.action.view.metadata module. $class .= ' collapsable'; } - $r .= "\n"; - $r .= "\n"; - $r .= "\n"; + $r .= Html::rawElement( 'tr', + [ 'class' => $class ], + Html::rawElement( 'th', [], $v['name'] ) + . Html::rawElement( 'td', [], $v['value'] ) + ); } } $r .= "
    {$v['name']}{$v['value']}
    \n
    \n"; @@ -434,7 +423,7 @@ class ImagePage extends Article { $count = $this->displayImg->pageCount(); if ( $page > 1 ) { - $label = $out->parse( $this->getContext()->msg( 'imgmultipageprev' )->text(), false ); + $label = $this->getContext()->msg( 'imgmultipageprev' )->text(); // on the client side, this link is generated in ajaxifyPageNavigation() // in the mediawiki.page.image.pagination module $link = Linker::linkKnown( @@ -494,6 +483,7 @@ class ImagePage extends Article { Xml::openElement( 'form', $formParams ) . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . $this->getContext()->msg( 'imgmultigoto' )->rawParams( $select )->parse() . + $this->getContext()->msg( 'word-separator' )->escaped() . Xml::submitButton( $this->getContext()->msg( 'imgmultigo' )->text() ) . Xml::closeElement( 'form' ) . "
    $thumb1\n$thumb2
    " @@ -631,8 +621,8 @@ EOT /** * Make the text under the image to say what size preview * - * @param $params array parameters for thumbnail - * @param $sizeLinkBigImagePreview HTML for the current size + * @param array $params parameters for thumbnail + * @param string $sizeLinkBigImagePreview HTML for the current size * @return string HTML output */ private function getThumbPrevText( $params, $sizeLinkBigImagePreview ) { diff --git a/includes/page/PageArchive.php b/includes/page/PageArchive.php index 388e69371b..11e1a30db8 100644 --- a/includes/page/PageArchive.php +++ b/includes/page/PageArchive.php @@ -20,6 +20,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Used to show archived pages and eventually restore them. @@ -66,6 +67,56 @@ class PageArchive { return self::listPages( $dbr, '' ); } + /** + * List deleted pages recorded in the archive matching the + * given term, using search engine archive. + * Returns result wrapper with (ar_namespace, ar_title, count) fields. + * + * @param string $term Search term + * @return ResultWrapper + */ + public static function listPagesBySearch( $term ) { + $title = Title::newFromText( $term ); + if ( $title ) { + $ns = $title->getNamespace(); + $termMain = $title->getText(); + $termDb = $title->getDBkey(); + } else { + // Prolly won't work too good + // @todo handle bare namespace names cleanly? + $ns = 0; + $termMain = $termDb = $term; + } + + // Try search engine first + $engine = MediaWikiServices::getInstance()->newSearchEngine(); + $engine->setLimitOffset( 100 ); + $engine->setNamespaces( [ $ns ] ); + $results = $engine->searchArchiveTitle( $termMain ); + if ( !$results->isOK() ) { + $results = []; + } else { + $results = $results->getValue(); + } + + if ( !$results ) { + // Fall back to regular prefix search + return self::listPagesByPrefix( $term ); + } + + $dbr = wfGetDB( DB_REPLICA ); + $condTitles = array_unique( array_map( function ( Title $t ) { + return $t->getDBkey(); + }, $results ) ); + $conds = [ + 'ar_namespace' => $ns, + $dbr->makeList( [ 'ar_title' => $condTitles ], LIST_OR ) . " OR ar_title " . + $dbr->buildLike( $termDb, $dbr->anyString() ) + ]; + + return self::listPages( $dbr, $conds ); + } + /** * List deleted pages recorded in the archive table matching the * given title prefix. @@ -132,6 +183,7 @@ class PageArchive { $fields = [ 'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text', 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1', + 'ar_page_id' ]; if ( $this->config->get( 'ContentHandlerUseDB' ) ) { @@ -401,25 +453,12 @@ class PageArchive { // Touch the log! - if ( $textRestored && $filesRestored ) { - $reason = wfMessage( 'undeletedrevisions-files' ) - ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text(); - } elseif ( $textRestored ) { - $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored ) - ->inContentLanguage()->text(); - } elseif ( $filesRestored ) { - $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored ) - ->inContentLanguage()->text(); - } else { + if ( !$textRestored && !$filesRestored ) { wfDebug( "Undelete: nothing undeleted...\n" ); return false; } - if ( trim( $comment ) != '' ) { - $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment; - } - if ( $user === null ) { global $wgUser; $user = $wgUser; @@ -428,15 +467,21 @@ class PageArchive { $logEntry = new ManualLogEntry( 'delete', 'restore' ); $logEntry->setPerformer( $user ); $logEntry->setTarget( $this->title ); - $logEntry->setComment( $reason ); + $logEntry->setComment( $comment ); $logEntry->setTags( $tags ); + $logEntry->setParameters( [ + ':assoc:count' => [ + 'revisions' => $textRestored, + 'files' => $filesRestored, + ], + ] ); Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] ); $logid = $logEntry->insert(); $logEntry->publish( $logid ); - return [ $textRestored, $filesRestored, $reason ]; + return [ $textRestored, $filesRestored, $comment ]; } /** @@ -619,7 +664,7 @@ class PageArchive { $restored = 0; // number of revisions restored /** @var Revision $revision */ $revision = null; - + $restoredPages = []; // If there are no restorable revisions, we can skip most of the steps. if ( $latestRestorableRow === null ) { $failedRevisionCount = $rev_count; @@ -676,6 +721,7 @@ class PageArchive { Hooks::run( 'ArticleRevisionUndeleted', [ &$this->title, $revision, $row->ar_page_id ] ); + $restoredPages[$row->ar_page_id] = true; } // Now that it's safely stored, take it out of the archive @@ -716,7 +762,8 @@ class PageArchive { ); } - Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] ); + Hooks::run( 'ArticleUndelete', + [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] ); if ( $this->title->getNamespace() == NS_FILE ) { DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) ); } diff --git a/includes/page/WikiFilePage.php b/includes/page/WikiFilePage.php index e4b524b811..972a397c5e 100644 --- a/includes/page/WikiFilePage.php +++ b/includes/page/WikiFilePage.php @@ -164,26 +164,38 @@ class WikiFilePage extends WikiPage { return $this->mDupes; } - public function doPurge( $flags = self::PURGE_ALL ) { + /** + * Override handling of action=purge + * @return bool + */ + public function doPurge() { $this->loadFile(); if ( $this->mFile->exists() ) { wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" ); DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) ); - $this->mFile->purgeCache( [ 'forThumbRefresh' => true ] ); } else { wfDebug( 'ImagePage::doPurge no image for ' . $this->mFile->getName() . "; limiting purge to cache only\n" ); - // even if the file supposedly doesn't exist, force any cached information - // to be updated (in case the cached information is wrong) - $this->mFile->purgeCache( [ 'forThumbRefresh' => true ] ); } + + // even if the file supposedly doesn't exist, force any cached information + // to be updated (in case the cached information is wrong) + + // Purge current version and its thumbnails + $this->mFile->purgeCache( [ 'forThumbRefresh' => true ] ); + + // Purge the old versions and their thumbnails + foreach ( $this->mFile->getHistory() as $oldFile ) { + $oldFile->purgeCache( [ 'forThumbRefresh' => true ] ); + } + if ( $this->mRepo ) { // Purge redirect cache $this->mRepo->invalidateImageRedirect( $this->mTitle ); } - return parent::doPurge( $flags ); + return parent::doPurge(); } /** diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index 4bc8ad6125..4f4decfbdd 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -20,9 +20,13 @@ * @file */ +use MediaWiki\Edit\PreparedEdit; use \MediaWiki\Logger\LoggerFactory; use \MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBError; +use Wikimedia\Rdbms\DBUnexpectedError; /** * Class representing a MediaWiki article and history. @@ -46,7 +50,7 @@ class WikiPage implements Page, IDBAccessObject { public $mLatest = false; // !< Integer (false means "not loaded") /**@}}*/ - /** @var stdClass Map of cache fields (text, parser output, ect) for a proposed/new edit */ + /** @var PreparedEdit Map of cache fields (text, parser output, ect) for a proposed/new edit */ public $mPreparedEdit = false; /** @@ -84,9 +88,10 @@ class WikiPage implements Page, IDBAccessObject { */ protected $mLinksUpdated = '19700101000000'; - const PURGE_CDN_CACHE = 1; // purge CDN cache for page variant URLs - const PURGE_CLUSTER_PCACHE = 2; // purge parser cache in the local datacenter - const PURGE_GLOBAL_PCACHE = 4; // set page_touched to clear parser cache in all datacenters + /** @deprecated since 1.29. Added in 1.28 for partial purging, no longer used. */ + const PURGE_CDN_CACHE = 1; + const PURGE_CLUSTER_PCACHE = 2; + const PURGE_GLOBAL_PCACHE = 4; const PURGE_ALL = 7; /** @@ -378,11 +383,12 @@ class WikiPage implements Page, IDBAccessObject { if ( is_int( $from ) ) { list( $index, $opts ) = DBAccessObjectUtils::getDBOptions( $from ); $data = $this->pageDataFromTitle( wfGetDB( $index ), $this->mTitle, $opts ); + $loadBalancer = MediaWikiServices::getInstance()->getDBLoadBalancer(); if ( !$data && $index == DB_REPLICA - && wfGetLB()->getServerCount() > 1 - && wfGetLB()->hasOrMadeRecentMasterChanges() + && $loadBalancer->getServerCount() > 1 + && $loadBalancer->hasOrMadeRecentMasterChanges() ) { $from = self::READ_LATEST; list( $index, $opts ) = DBAccessObjectUtils::getDBOptions( $from ); @@ -574,35 +580,12 @@ class WikiPage implements Page, IDBAccessObject { * @return Revision|null */ public function getOldestRevision() { - // Try using the replica DB first, then try the master - $continue = 2; - $db = wfGetDB( DB_REPLICA ); - $revSelectFields = Revision::selectFields(); - - $row = null; - while ( $continue ) { - $row = $db->selectRow( - [ 'revision' ], - $revSelectFields, - [ - 'rev_page' => $this->getId() - ], - __METHOD__, - [ - 'ORDER BY' => 'rev_timestamp ASC' - ] - ); - - if ( $row ) { - $continue = 0; - } else { - $db = wfGetDB( DB_MASTER ); - $continue--; - } + $rev = $this->mTitle->getFirstRevision(); + if ( !$rev ) { + $rev = $this->mTitle->getFirstRevision( Title::GAID_FOR_UPDATE ); } - - return $row ? Revision::newFromRow( $row ) : null; + return $rev; } /** @@ -800,7 +783,7 @@ class WikiPage implements Page, IDBAccessObject { * Determine whether a page would be suitable for being counted as an * article in the site_stats table based on the title & its content * - * @param object|bool $editInfo (false): object returned by prepareTextForEdit(), + * @param PreparedEdit|bool $editInfo (false): object returned by prepareTextForEdit(), * if false, the current database state will be used * @return bool */ @@ -1074,6 +1057,13 @@ class WikiPage implements Page, IDBAccessObject { ) { $useParserCache = ( !$forceParse ) && $this->shouldCheckParserCache( $parserOptions, $oldid ); + + if ( $useParserCache && !$parserOptions->isSafeToCache() ) { + throw new InvalidArgumentException( + 'The supplied ParserOptions are not safe to cache. Fix the options or set $forceParse = true.' + ); + } + wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" ); if ( $parserOptions->getStubThreshold() ) { @@ -1119,10 +1109,11 @@ class WikiPage implements Page, IDBAccessObject { /** * Perform the actions of a page purging - * @param integer $flags Bitfield of WikiPage::PURGE_* constants * @return bool + * @note In 1.28 (and only 1.28), this took a $flags parameter that + * controlled how much purging was done. */ - public function doPurge( $flags = self::PURGE_ALL ) { + public function doPurge() { // Avoid PHP 7.1 warning of passing $this by reference $wikiPage = $this; @@ -1130,30 +1121,15 @@ class WikiPage implements Page, IDBAccessObject { return false; } - if ( ( $flags & self::PURGE_GLOBAL_PCACHE ) == self::PURGE_GLOBAL_PCACHE ) { - // Set page_touched in the database to invalidate all DC caches - $this->mTitle->invalidateCache(); - } elseif ( ( $flags & self::PURGE_CLUSTER_PCACHE ) == self::PURGE_CLUSTER_PCACHE ) { - // Delete the parser options key in the local cluster to invalidate the DC cache - ParserCache::singleton()->deleteOptionsKey( $this ); - // Avoid sending HTTP 304s in ViewAction to the client who just issued the purge - $cache = ObjectCache::getLocalClusterInstance(); - $cache->set( - $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ), - wfTimestamp( TS_MW ), - $cache::TTL_HOUR - ); - } + $this->mTitle->invalidateCache(); - if ( ( $flags & self::PURGE_CDN_CACHE ) == self::PURGE_CDN_CACHE ) { - // Clear any HTML file cache - HTMLFileCache::clearFileCache( $this->getTitle() ); - // Send purge after any page_touched above update was committed - DeferredUpdates::addUpdate( - new CdnCacheUpdate( $this->mTitle->getCdnUrls() ), - DeferredUpdates::PRESEND - ); - } + // Clear file cache + HTMLFileCache::clearFileCache( $this->getTitle() ); + // Send purge after above page_touched update was committed + DeferredUpdates::addUpdate( + new CdnCacheUpdate( $this->mTitle->getCdnUrls() ), + DeferredUpdates::PRESEND + ); if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) { $messageCache = MessageCache::singleton(); @@ -1168,11 +1144,11 @@ class WikiPage implements Page, IDBAccessObject { * * @return string|bool TS_MW timestamp or false * @since 1.28 + * @deprecated since 1.29. It will always return false. */ public function getLastPurgeTimestamp() { - $cache = ObjectCache::getLocalClusterInstance(); - - return $cache->get( $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ) ); + wfDeprecated( __METHOD__, '1.29' ); + return false; } /** @@ -1210,7 +1186,7 @@ class WikiPage implements Page, IDBAccessObject { ); if ( $dbw->affectedRows() > 0 ) { - $newid = $pageId ?: $dbw->insertId(); + $newid = $pageId ? (int)$pageId : $dbw->insertId(); $this->mId = $newid; $this->mTitle->resetArticleID( $newid ); @@ -1340,7 +1316,6 @@ class WikiPage implements Page, IDBAccessObject { * @return bool */ public function updateIfNewerOn( $dbw, $revision ) { - $row = $dbw->selectRow( [ 'revision', 'page' ], [ 'rev_id', 'rev_timestamp', 'page_is_redirect' ], @@ -1412,7 +1387,6 @@ class WikiPage implements Page, IDBAccessObject { public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '', $edittime = null ) { - $baseRevId = null; if ( $edittime && $sectionId !== 'new' ) { $dbr = wfGetDB( DB_REPLICA ); @@ -1451,7 +1425,6 @@ class WikiPage implements Page, IDBAccessObject { public function replaceSectionAtRev( $sectionId, Content $sectionContent, $sectionTitle = '', $baseRevId = null ) { - if ( strval( $sectionId ) === '' ) { // Whole-page edit; let the whole text through $newContent = $sectionContent; @@ -1635,7 +1608,7 @@ class WikiPage implements Page, IDBAccessObject { $meta = [ 'bot' => ( $flags & EDIT_FORCE_BOT ), 'minor' => ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' ), - 'serialized' => $editInfo->pst, + 'serialized' => $pstContent->serialize( $serialFormat ), 'serialFormat' => $serialFormat, 'baseRevId' => $baseRevId, 'oldRevision' => $old_revision, @@ -1989,7 +1962,9 @@ class WikiPage implements Page, IDBAccessObject { /** * Prepare content which is about to be saved. - * Returns a stdClass with source, pst and output members + * + * Prior to 1.30, this returned a stdClass object with the same class + * members. * * @param Content $content * @param Revision|int|null $revision Revision object. For backwards compatibility, a @@ -1998,7 +1973,7 @@ class WikiPage implements Page, IDBAccessObject { * @param string|null $serialFormat * @param bool $useCache Check shared prepared edit cache * - * @return object + * @return PreparedEdit * * @since 1.21 */ @@ -2048,7 +2023,7 @@ class WikiPage implements Page, IDBAccessObject { $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang ); Hooks::run( 'ArticlePrepareTextForEdit', [ $this, $popts ] ); - $edit = (object)[]; + $edit = new PreparedEdit(); if ( $cachedEdit ) { $edit->timestamp = $cachedEdit->timestamp; } else { @@ -2934,8 +2909,8 @@ class WikiPage implements Page, IDBAccessObject { $status->value = $logid; // Show log excerpt on 404 pages rather than just a link - $cache = ObjectCache::getMainStashInstance(); - $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) ); + $cache = MediaWikiServices::getInstance()->getMainObjectStash(); + $key = $cache->makeKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) ); $cache->set( $key, 1, $cache::TTL_DAY ); return $status; @@ -2999,7 +2974,7 @@ class WikiPage implements Page, IDBAccessObject { } // Clear caches - WikiPage::onArticleDelete( $this->mTitle ); + self::onArticleDelete( $this->mTitle ); ResourceLoaderWikiModule::invalidateModuleCache( $this->mTitle, $revision, null, wfWikiID() ); @@ -3026,7 +3001,7 @@ class WikiPage implements Page, IDBAccessObject { * @param string $token Rollback token. * @param bool $bot If true, mark all reverted edits as bot. * - * @param array $resultDetails Array contains result-specific array of additional values + * @param array &$resultDetails Array contains result-specific array of additional values * 'alreadyrolled' : 'current' (rev) * success : 'summary' (str), 'current' (rev), 'target' (rev) * @@ -3078,7 +3053,7 @@ class WikiPage implements Page, IDBAccessObject { * @param string $summary Custom summary. Set to default summary if empty. * @param bool $bot If true, mark all reverted edits as bot. * - * @param array $resultDetails Contains result-specific array of additional values + * @param array &$resultDetails Contains result-specific array of additional values * @param User $guser The user performing the rollback * @param array|null $tags Change tags to apply to the rollback * Callers are responsible for permission checks @@ -3285,6 +3260,9 @@ class WikiPage implements Page, IDBAccessObject { MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title ); + // Invalidate caches of articles which include this page + DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'templatelinks' ) ); + if ( $title->getNamespace() == NS_CATEGORY ) { // Load the Category object, which will schedule a job to create // the category table row if necessary. Checking a replica DB is ok @@ -3357,7 +3335,7 @@ class WikiPage implements Page, IDBAccessObject { HTMLFileCache::clearFileCache( $title ); $revid = $revision ? $revision->getId() : null; - DeferredUpdates::addCallableUpdate( function() use ( $title, $revid ) { + DeferredUpdates::addCallableUpdate( function () use ( $title, $revid ) { InfoAction::invalidateCache( $title, $revid ); } ); } @@ -3526,7 +3504,10 @@ class WikiPage implements Page, IDBAccessObject { ); foreach ( $rows as $row ) { $cat = Category::newFromRow( $row ); - $cat->refreshCounts(); + // T166757: do the update after this DB commit + DeferredUpdates::addCallableUpdate( function () use ( $cat ) { + $cat->refreshCounts(); + } ); } } } diff --git a/includes/pager/IndexPager.php b/includes/pager/IndexPager.php index 46948909c6..6620c4751b 100644 --- a/includes/pager/IndexPager.php +++ b/includes/pager/IndexPager.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * IndexPager is an efficient pager which uses a (roughly unique) index in the @@ -736,6 +737,6 @@ abstract class IndexPager extends ContextSource implements Pager { * @return bool */ protected function getDefaultDirections() { - return IndexPager::DIR_ASCENDING; + return self::DIR_ASCENDING; } } diff --git a/includes/pager/RangeChronologicalPager.php b/includes/pager/RangeChronologicalPager.php new file mode 100644 index 0000000000..d3cb566823 --- /dev/null +++ b/includes/pager/RangeChronologicalPager.php @@ -0,0 +1,114 @@ +rangeConds = []; + + try { + if ( $startStamp !== '' ) { + $startTimestamp = MWTimestamp::getInstance( $startStamp ); + $startTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); + $startOffset = $this->mDb->timestamp( $startTimestamp->getTimestamp() ); + $this->rangeConds[] = $this->mIndexField . '>=' . $this->mDb->addQuotes( $startOffset ); + } + + if ( $endStamp !== '' ) { + $endTimestamp = MWTimestamp::getInstance( $endStamp ); + $endTimestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); + $endOffset = $this->mDb->timestamp( $endTimestamp->getTimestamp() ); + $this->rangeConds[] = $this->mIndexField . '<=' . $this->mDb->addQuotes( $endOffset ); + + // populate existing variables for compatibility with parent + $this->mYear = (int)$endTimestamp->format( 'Y' ); + $this->mMonth = (int)$endTimestamp->format( 'm' ); + $this->mDay = (int)$endTimestamp->format( 'd' ); + $this->mOffset = $endOffset; + } + } catch ( TimestampException $ex ) { + return null; + } + + return $this->rangeConds; + } + + /** + * Takes ReverseChronologicalPager::getDateCond parameters and repurposes + * them to work with timestamp-based getDateRangeCond. + * + * @param int $year Year up to which we want revisions + * @param int $month Month up to which we want revisions + * @param int $day [optional] Day up to which we want revisions. Default is end of month. + * @return string|null Timestamp or null if year and month are false/invalid + */ + public function getDateCond( $year, $month, $day = -1 ) { + // run through getDateRangeCond so rangeConds, mOffset, ... are set + $legacyTimestamp = self::getOffsetDate( $year, $month, $day ); + // ReverseChronologicalPager uses strict inequality for the end date ('<'), + // but this class uses '<=' and expects extending classes to handle modifying the end date. + // Therefore, we need to subtract one second from the output of getOffsetDate to make it + // work with the '<=' inequality used in this class. + $legacyTimestamp->timestamp = $legacyTimestamp->timestamp->modify( '-1 second' ); + $this->getDateRangeCond( '', $legacyTimestamp->getTimestamp( TS_MW ) ); + return $this->mOffset; + } + + /** + * Build variables to use by the database wrapper. + * + * @param string $offset Index offset, inclusive + * @param int $limit Exact query limit + * @param bool $descending Query direction, false for ascending, true for descending + * @return array + */ + protected function buildQueryInfo( $offset, $limit, $descending ) { + list( $tables, $fields, $conds, $fname, $options, $join_conds ) = parent::buildQueryInfo( + $offset, + $limit, + $descending + ); + + if ( $this->rangeConds ) { + $conds = array_merge( $conds, $this->rangeConds ); + } + + return [ $tables, $fields, $conds, $fname, $options, $join_conds ]; + } +} diff --git a/includes/pager/ReverseChronologicalPager.php b/includes/pager/ReverseChronologicalPager.php index 76f347023e..9eef728a93 100644 --- a/includes/pager/ReverseChronologicalPager.php +++ b/includes/pager/ReverseChronologicalPager.php @@ -1,7 +1,5 @@ isNavigationBarShown() ) { return ''; } @@ -65,52 +64,79 @@ abstract class ReverseChronologicalPager extends IndexPager { /** * Set and return the mOffset timestamp such that we can get all revisions with * a timestamp up to the specified parameters. + * * @param int $year Year up to which we want revisions * @param int $month Month up to which we want revisions * @param int $day [optional] Day up to which we want revisions. Default is end of month. * @return string|null Timestamp or null if year and month are false/invalid */ - function getDateCond( $year, $month, $day = -1 ) { - $year = intval( $year ); - $month = intval( $month ); - $day = intval( $day ); + public function getDateCond( $year, $month, $day = -1 ) { + $year = (int)$year; + $month = (int)$month; + $day = (int)$day; // Basic validity checks for year and month - $this->mYear = $year > 0 ? $year : false; - $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false; + // If year and month are invalid, don't update the mOffset + if ( $year <= 0 && ( $month <= 0 || $month >= 13 ) ) { + return null; + } - // If year and month are false, don't update the mOffset - if ( !$this->mYear && !$this->mMonth ) { + // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup + $timestamp = self::getOffsetDate( $year, $month, $day ); + $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); + + try { + $this->mYear = (int)$timestamp->format( 'Y' ); + $this->mMonth = (int)$timestamp->format( 'm' ); + $this->mDay = (int)$timestamp->format( 'd' ); + $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() ); + } catch ( TimestampException $e ) { + // Invalid user provided timestamp (T149257) return null; } + return $this->mOffset; + } + + /** + * Core logic of determining the mOffset timestamp such that we can get all items with + * a timestamp up to the specified parameters. Given parameters for a day up to which to get + * items, this function finds the timestamp of the day just after the end of the range for use + * in an database strict inequality filter. + * + * This is separate from getDateCond so we can use this logic in other places, such as in + * RangeChronologicalPager, where this function is used to convert year/month/day filter options + * into a timestamp. + * + * @param int $year Year up to which we want revisions + * @param int $month Month up to which we want revisions + * @param int $day [optional] Day up to which we want revisions. Default is end of month. + * @return MWTimestamp Timestamp or null if year and month are false/invalid + */ + public static function getOffsetDate( $year, $month, $day = -1 ) { // Given an optional year, month, and day, we need to generate a timestamp // to use as "WHERE rev_timestamp <= result" // Examples: year = 2006 equals < 20070101 (+000000) // year=2005, month=1 equals < 20050201 // year=2005, month=12 equals < 20060101 // year=2005, month=12, day=5 equals < 20051206 - if ( $this->mYear ) { - $year = $this->mYear; - } else { + if ( $year <= 0 ) { // If no year given, assume the current one $timestamp = MWTimestamp::getInstance(); $year = $timestamp->format( 'Y' ); // If this month hasn't happened yet this year, go back to last year's month - if ( $this->mMonth > $timestamp->format( 'n' ) ) { + if ( $month > $timestamp->format( 'n' ) ) { $year--; } } - if ( $this->mMonth ) { - $month = $this->mMonth; - + if ( $month && $month > 0 && $month < 13 ) { // Day validity check after we have month and year checked - $this->mDay = checkdate( $month, $day, $year ) ? $day : false; + $day = checkdate( $month, $day, $year ) ? $day : false; - if ( $this->mDay ) { + if ( $day && $day > 0 ) { // If we have a day, we want up to the day immediately afterward - $day = $this->mDay + 1; + $day++; // Did we overflow the current month? if ( !checkdate( $month, $day, $year ) ) { @@ -147,17 +173,6 @@ abstract class ReverseChronologicalPager extends IndexPager { $ymd = 20320101; } - // Treat the given time in the wiki timezone and get a UTC timestamp for the database lookup - $timestamp = MWTimestamp::getInstance( "${ymd}000000" ); - $timestamp->setTimezone( $this->getConfig()->get( 'Localtimezone' ) ); - - try { - $this->mOffset = $this->mDb->timestamp( $timestamp->getTimestamp() ); - } catch ( TimestampException $e ) { - // Invalid user provided timestamp (T149257) - return null; - } - - return $this->mOffset; + return MWTimestamp::getInstance( "${ymd}000000" ); } } diff --git a/includes/pager/TablePager.php b/includes/pager/TablePager.php index 770c1c6ad6..70055da39f 100644 --- a/includes/pager/TablePager.php +++ b/includes/pager/TablePager.php @@ -293,35 +293,36 @@ abstract class TablePager extends IndexPager { return ''; } - $labels = [ - 'first' => 'table_pager_first', - 'prev' => 'table_pager_prev', - 'next' => 'table_pager_next', - 'last' => 'table_pager_last', - ]; - - $linkTexts = []; - $disabledTexts = []; - foreach ( $labels as $type => $label ) { - $msgLabel = $this->msg( $label )->escaped(); - $linkTexts[$type] = "
    $msgLabel
    "; - $disabledTexts[$type] = "
    $msgLabel
    "; + $this->getOutput()->enableOOUI(); + + $types = [ 'first', 'prev', 'next', 'last' ]; + + $queries = $this->getPagingQueries(); + $links = []; + + $buttons = []; + + $title = $this->getTitle(); + + foreach ( $types as $type ) { + $buttons[] = new \OOUI\ButtonWidget( [ + // Messages used here: + // * table_pager_first + // * table_pager_prev + // * table_pager_next + // * table_pager_last + 'label' => $this->msg( 'table_pager_' . $type )->text(), + 'href' => $queries[ $type ] ? + $title->getLinkURL( $queries[ $type ] + $this->getDefaultQuery() ) : + null, + 'icon' => $type === 'prev' ? 'previous' : $type, + 'disabled' => $queries[ $type ] === false + ] ); } - $links = $this->getPagingLinks( $linkTexts, $disabledTexts ); - - $s = Html::openElement( 'table', [ 'class' => $this->getNavClass() ] ); - $s .= Html::openElement( 'tr' ) . "\n"; - $width = 100 / count( $links ) . '%'; - 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. - $s .= Html::rawElement( 'td', - [ 'style' => "width: $width;", 'class' => "TablePager_nav-$type" ], - $links[$type] ) . "\n"; - } - $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n"; - return $s; + return new \OOUI\ButtonGroupWidget( [ + 'classes' => [ $this->getNavClass() ], + 'items' => $buttons, + ] ); } /** @@ -330,7 +331,7 @@ abstract class TablePager extends IndexPager { * @return string[] */ public function getModuleStyles() { - return [ 'mediawiki.pager.tablePager' ]; + return [ 'mediawiki.pager.tablePager', 'oojs-ui.styles.icons-movement' ]; } /** diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php index 2023d13445..599fbf61de 100644 --- a/includes/parser/BlockLevelPass.php +++ b/includes/parser/BlockLevelPass.php @@ -286,14 +286,14 @@ class BlockLevelPass { # @todo consider using a stack for nestable elements like span, table and div $openMatch = preg_match( '/(?:matchStartToEnd( $arg ) ) { - // Encode as though it's a wiki page, '_' for ' '. case 'url_wiki': $func = 'wfUrlencode'; diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php index c943b7c986..438603a841 100644 --- a/includes/parser/CoreTagHooks.php +++ b/includes/parser/CoreTagHooks.php @@ -79,12 +79,25 @@ class CoreTagHooks { * @param array $attributes * @param Parser $parser * @throws MWException - * @return array + * @return array|string Output of tag hook */ public static function html( $content, $attributes, $parser ) { global $wgRawHtml; if ( $wgRawHtml ) { - return [ $content, 'markerType' => 'nowiki' ]; + if ( $parser->getOptions()->getAllowUnsafeRawHtml() ) { + return [ $content, 'markerType' => 'nowiki' ]; + } else { + // In a system message where raw html is + // not allowed (but it is allowed in other + // contexts). + return Html::rawElement( + 'span', + [ 'class' => 'error' ], + // Using ->text() not ->parse() as + // a paranoia measure against a loop. + wfMessage( 'rawhtml-notallowed' )->escaped() + ); + } } else { throw new MWException( ' extension tag encountered unexpectedly' ); } diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php index d2a0a1a6d4..bc5182c1dd 100644 --- a/includes/parser/LinkHolderArray.php +++ b/includes/parser/LinkHolderArray.php @@ -264,7 +264,7 @@ class LinkHolderArray { /** * Replace link placeholders with actual links, in the buffer * - * @param string $text + * @param string &$text */ public function replace( &$text ) { $this->replaceInternal( $text ); @@ -273,7 +273,7 @@ class LinkHolderArray { /** * Replace internal links - * @param string $text + * @param string &$text */ protected function replaceInternal( &$text ) { if ( !$this->internals ) { @@ -416,7 +416,7 @@ class LinkHolderArray { /** * Replace interwiki links - * @param string $text + * @param string &$text */ protected function replaceInterwiki( &$text ) { if ( empty( $this->interwikis ) ) { @@ -444,7 +444,7 @@ class LinkHolderArray { /** * Modify $this->internals and $colours according to language variant linking rules - * @param array $colours + * @param array &$colours */ protected function doVariants( &$colours ) { global $wgContLang; diff --git a/includes/parser/MWTidy.php b/includes/parser/MWTidy.php index 01bf2d0d65..ffc884eb2d 100644 --- a/includes/parser/MWTidy.php +++ b/includes/parser/MWTidy.php @@ -83,7 +83,7 @@ class MWTidy { /** * @return bool|\MediaWiki\Tidy\TidyDriverBase */ - protected static function singleton() { + public static function singleton() { global $wgUseTidy, $wgTidyInternal, $wgTidyConf, $wgDebugTidy, $wgTidyConfig, $wgTidyBin, $wgTidyOpts; diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 8db1fe3794..326100280d 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -227,7 +227,7 @@ class Parser { * @var string Deprecated accessor for the strip marker prefix. * @deprecated since 1.26; use Parser::MARKER_PREFIX instead. */ - public $mUniqPrefix = Parser::MARKER_PREFIX; + public $mUniqPrefix = self::MARKER_PREFIX; /** * @var array Array with the language name of each language link (i.e. the @@ -245,7 +245,7 @@ class Parser { public $currentRevisionCache; /** - * @var bool Recursive call protection. + * @var bool|string Recursive call protection. * This variable should be treated as if it were private. */ public $mInParse = false; @@ -550,7 +550,8 @@ class Parser { // 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 ] ); + // Run deprecated hook + Hooks::run( 'ParserLimitReport', [ $this, &$limitReport ], '1.22' ); // Sanitize for comment. Note '‐' in the replacement is U+2010, // which looks much like the problematic '-'. @@ -589,6 +590,14 @@ class Parser { $this->mTitle->getPrefixedDBkey() ); } } + + # Wrap non-interface parser output in a
    so it can be targeted + # with CSS (T37247) + $class = $this->mOptions->getWrapOutputClass(); + if ( $class !== false && !$this->mOptions->getInterfaceMessage() ) { + $text = Html::rawElement( 'div', [ 'class' => $class ], $text ); + } + $this->mOutput->setText( $text ); $this->mRevisionId = $oldRevisionId; @@ -963,7 +972,7 @@ class Parser { * * @param array $elements List of element names. Comments are always extracted. * @param string $text Source text string. - * @param array $matches Out parameter, Array: extracted tags + * @param array &$matches Out parameter, Array: extracted tags * @param string|null $uniq_prefix * @return string Stripped text * @since 1.26 The uniq_prefix argument is deprecated. @@ -1066,7 +1075,6 @@ class Parser { * @return string */ public function doTableStuff( $text ) { - $lines = StringUtils::explode( "\n", $text ); $out = ''; $td_history = []; # Is currently a td tag open? @@ -1270,7 +1278,6 @@ class Parser { * @return string */ public function internalParse( $text, $isMain = true, $frame = false ) { - $origText = $text; // Avoid PHP 7.1 warning from passing $this by reference @@ -1288,7 +1295,7 @@ class Parser { if ( !$frame->depth ) { $flag = 0; } else { - $flag = Parser::PTD_FOR_INCLUSION; + $flag = self::PTD_FOR_INCLUSION; } $dom = $this->preprocessToDom( $text, $flag ); $text = $frame->expand( $dom ); @@ -1610,9 +1617,7 @@ class Parser { true, 'free', $this->getExternalLinkAttribs( $url ), $this->mTitle ); # Register it in the output object... - # Replace unnecessary URL escape codes with their equivalent characters - $pasteurized = self::normalizeLinkUrl( $url ); - $this->mOutput->addExternalLink( $pasteurized ); + $this->mOutput->addExternalLink( $url ); } return $text . $trail; } @@ -1848,7 +1853,6 @@ class Parser { * @return string */ public function replaceExternalLinks( $text ) { - $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE ); if ( $bits === false ) { throw new MWException( "PCRE needs to be compiled with " @@ -1908,10 +1912,7 @@ class Parser { $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail; # Register link in the output object. - # Replace unnecessary URL escape codes with the referenced character - # This prevents spammers from hiding links from the filters - $pasteurized = self::normalizeLinkUrl( $url ); - $this->mOutput->addExternalLink( $pasteurized ); + $this->mOutput->addExternalLink( $url ); } return $s; @@ -2102,7 +2103,7 @@ class Parser { /** * Process [[ ]] wikilinks (RIL) - * @param string $s + * @param string &$s * @throws MWException * @return LinkHolderArray * @@ -2239,12 +2240,6 @@ class Parser { $link = $origLink; } - $noforce = ( substr( $origLink, 0, 1 ) !== ':' ); - if ( !$noforce ) { - # Strip off leading ':' - $link = substr( $link, 1 ); - } - $unstrip = $this->mStripState->unstripNoWiki( $link ); $nt = is_string( $unstrip ) ? Title::newFromText( $unstrip ) : null; if ( $nt === null ) { @@ -2255,6 +2250,8 @@ class Parser { $ns = $nt->getNamespace(); $iw = $nt->getInterwiki(); + $noforce = ( substr( $origLink, 0, 1 ) !== ':' ); + if ( $might_be_img ) { # if this is actually an invalid link if ( $ns == NS_FILE && $noforce ) { # but might be an image $found = false; @@ -2299,6 +2296,10 @@ class Parser { $wasblank = ( $text == '' ); if ( $wasblank ) { $text = $link; + if ( !$noforce ) { + # Strip off leading ':' + $text = substr( $text, 1 ); + } } else { # T6598 madness. Handle the quotes only if they come from the alternate part # [[Lista d''e paise d''o munno]] -> Lista d''e paise d''o munno @@ -2323,7 +2324,7 @@ class Parser { } $s = rtrim( $s . $prefix ); - $s .= trim( $trail, "\n" ) == '' ? '': $prefix . $trail; + $s .= trim( $trail, "\n" ) == '' ? '' : $prefix . $trail; continue; } @@ -3027,7 +3028,6 @@ class Parser { * @return string The text of the template */ public function braceSubstitution( $piece, $frame ) { - // Flags // $text has been filled @@ -3257,6 +3257,7 @@ class Parser { $text = '' . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text() . ''; + $this->addTrackingCategory( 'template-loop-category' ); wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" ); } } @@ -3373,11 +3374,6 @@ class Parser { list( $callback, $flags ) = $this->mFunctionHooks[$function]; - # Workaround for PHP bug 35229 and similar - if ( !is_callable( $callback ) ) { - throw new MWException( "Tag hook for $function is not callable\n" ); - } - // Avoid PHP 7.1 warning from passing $this by reference $parser = $this; @@ -3415,7 +3411,7 @@ class Parser { # string or an array containing the string and any flags. This mungs # things around to match what this method should return. if ( !is_array( $result ) ) { - $result =[ + $result = [ 'found' => true, 'text' => $result, ]; @@ -3480,7 +3476,7 @@ class Parser { if ( !$title->equals( $cacheTitle ) ) { $this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] = - [ $title->getNamespace(), $cdb = $title->getDBkey() ]; + [ $title->getNamespace(), $title->getDBkey() ]; } return [ $dom, $title ]; @@ -3786,7 +3782,6 @@ class Parser { * @return array */ public function argSubstitution( $piece, $frame ) { - $error = false; $parts = $piece['parts']; $nameWithSpaces = $frame->expand( $piece['title'] ); @@ -3878,17 +3873,10 @@ class Parser { } if ( isset( $this->mTagHooks[$name] ) ) { - # Workaround for PHP bug 35229 and similar - if ( !is_callable( $this->mTagHooks[$name] ) ) { - throw new MWException( "Tag hook for $name is not callable\n" ); - } $output = call_user_func_array( $this->mTagHooks[$name], [ $content, $attributes, $this, $frame ] ); } elseif ( isset( $this->mFunctionTagHooks[$name] ) ) { list( $callback, ) = $this->mFunctionTagHooks[$name]; - if ( !is_callable( $callback ) ) { - throw new MWException( "Tag hook for $name is not callable\n" ); - } // Avoid PHP 7.1 warning from passing $this by reference $parser = $this; @@ -3974,7 +3962,6 @@ class Parser { * @return string */ public function doDoubleUnderscore( $text ) { - # The position of __TOC__ needs to be recorded $mw = MagicWord::get( 'toc' ); if ( $mw->match( $text ) ) { @@ -4048,7 +4035,7 @@ class Parser { * @private */ public function formatHeadings( $text, $origText, $isMain = true ) { - global $wgMaxTocLevel, $wgExperimentalHtmlIds; + global $wgMaxTocLevel; # Inhibit editsection links if requested in the page if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) { @@ -4242,61 +4229,44 @@ class Parser { # Save headline for section edit hint before it's escaped $headlineHint = $safeHeadline; - if ( $wgExperimentalHtmlIds ) { - # For reverse compatibility, provide an id that's - # HTML4-compatible, like we used to. - # It may be worth noting, academically, that it's possible for - # the legacy anchor to conflict with a non-legacy headline - # anchor on the page. In this case likely the "correct" thing - # would be to either drop the legacy anchors or make sure - # they're numbered first. However, this would require people - # to type in section names like "abc_.D7.93.D7.90.D7.A4" - # manually, so let's not bother worrying about it. - $legacyHeadline = Sanitizer::escapeId( $safeHeadline, - [ 'noninitial', 'legacy' ] ); - $safeHeadline = Sanitizer::escapeId( $safeHeadline ); - - if ( $legacyHeadline == $safeHeadline ) { - # No reason to have both (in fact, we can't) - $legacyHeadline = false; - } - } else { - $legacyHeadline = false; - $safeHeadline = Sanitizer::escapeId( $safeHeadline, - 'noninitial' ); + $fallbackHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_FALLBACK ); + $linkAnchor = Sanitizer::escapeIdForLink( $safeHeadline ); + $safeHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_PRIMARY ); + if ( $fallbackHeadline === $safeHeadline ) { + # No reason to have both (in fact, we can't) + $fallbackHeadline = false; } - # HTML names must be case-insensitively unique (T12721). - # This does not apply to Unicode characters per - # https://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison + # HTML IDs must be case-insensitively unique for IE compatibility (T12721). # @todo FIXME: We may be changing them depending on the current locale. $arrayKey = strtolower( $safeHeadline ); - if ( $legacyHeadline === false ) { - $legacyArrayKey = false; + if ( $fallbackHeadline === false ) { + $fallbackArrayKey = false; } else { - $legacyArrayKey = strtolower( $legacyHeadline ); + $fallbackArrayKey = strtolower( $fallbackHeadline ); } # Create the anchor for linking from the TOC to the section $anchor = $safeHeadline; - $legacyAnchor = $legacyHeadline; + $fallbackAnchor = $fallbackHeadline; if ( isset( $refers[$arrayKey] ) ) { // @codingStandardsIgnoreStart for ( $i = 2; isset( $refers["${arrayKey}_$i"] ); ++$i ); // @codingStandardsIgnoreEnd $anchor .= "_$i"; + $linkAnchor .= "_$i"; $refers["${arrayKey}_$i"] = true; } else { $refers[$arrayKey] = true; } - if ( $legacyHeadline !== false && isset( $refers[$legacyArrayKey] ) ) { + if ( $fallbackHeadline !== false && isset( $refers[$fallbackArrayKey] ) ) { // @codingStandardsIgnoreStart - for ( $i = 2; isset( $refers["${legacyArrayKey}_$i"] ); ++$i ); + for ( $i = 2; isset( $refers["${fallbackArrayKey}_$i"] ); ++$i ); // @codingStandardsIgnoreEnd - $legacyAnchor .= "_$i"; - $refers["${legacyArrayKey}_$i"] = true; + $fallbackAnchor .= "_$i"; + $refers["${fallbackArrayKey}_$i"] = true; } else { - $refers[$legacyArrayKey] = true; + $refers[$fallbackArrayKey] = true; } # Don't number the heading if it is the only one (looks silly) @@ -4310,7 +4280,7 @@ class Parser { } if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) { - $toc .= Linker::tocLine( $anchor, $tocline, + $toc .= Linker::tocLine( $linkAnchor, $tocline, $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) ); } @@ -4377,7 +4347,7 @@ class Parser { } $head[$headlineCount] = Linker::makeHeadline( $level, $matches['attrib'][$headlineCount], $anchor, $headline, - $editlink, $legacyAnchor ); + $editlink, $fallbackAnchor ); $headlineCount++; } @@ -4396,7 +4366,6 @@ class Parser { $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() ); $this->mOutput->setTOCHTML( $toc ); $toc = self::TOC_START . $toc . self::TOC_END; - $this->mOutput->addModules( 'mediawiki.toc' ); } if ( $isMain ) { @@ -4516,12 +4485,16 @@ class Parser { # which may corrupt this parser instance via its wfMessage()->text() call- # Signatures - $sigText = $this->getUserSig( $user ); - $text = strtr( $text, [ - '~~~~~' => $d, - '~~~~' => "$sigText $d", - '~~~' => $sigText - ] ); + if ( strpos( $text, '~~~' ) !== false ) { + $sigText = $this->getUserSig( $user ); + $text = strtr( $text, [ + '~~~~~' => $d, + '~~~~' => "$sigText $d", + '~~~' => $sigText + ] ); + # The main two signature forms used above are time-sensitive + $this->mOutput->setFlag( 'user-signature' ); + } # Context links ("pipe tricks"): [[|name]] and [[name (context)|]] $tc = '[' . Title::legalChars() . ']'; @@ -4563,7 +4536,7 @@ class Parser { * Do not reuse this parser instance after calling getUserSig(), * as it may have changed if it's the $wgParser. * - * @param User $user + * @param User &$user * @param string|bool $nickname Nickname to use or false to use user's default nickname * @param bool|null $fancySig whether the nicknname is the complete signature * or null to use default value @@ -4758,7 +4731,7 @@ class Parser { * @throws MWException * @return callable|null The old value of the mTagHooks array associated with the hook */ - public function setHook( $tag, $callback ) { + public function setHook( $tag, callable $callback ) { $tag = strtolower( $tag ); if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) { throw new MWException( "Invalid character {$m[0]} in setHook('$tag', ...) call" ); @@ -4789,7 +4762,7 @@ class Parser { * @throws MWException * @return callable|null The old value of the mTagHooks array associated with the hook */ - public function setTransparentTagHook( $tag, $callback ) { + public function setTransparentTagHook( $tag, callable $callback ) { $tag = strtolower( $tag ); if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) { throw new MWException( "Invalid character {$m[0]} in setTransparentHook('$tag', ...) call" ); @@ -4852,7 +4825,7 @@ class Parser { * @throws MWException * @return string|callable The old callback function for this name, if any */ - public function setFunctionHook( $id, $callback, $flags = 0 ) { + public function setFunctionHook( $id, callable $callback, $flags = 0 ) { global $wgContLang; $oldVal = isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id][0] : null; @@ -4904,7 +4877,7 @@ class Parser { * @throws MWException * @return null */ - public function setFunctionTagHook( $tag, $callback, $flags ) { + public function setFunctionTagHook( $tag, callable $callback, $flags ) { $tag = strtolower( $tag ); if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) { throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" ); @@ -4924,7 +4897,7 @@ class Parser { * Replace "" link placeholders with actual links, in the buffer * Placeholders created in Linker::link() * - * @param string $text + * @param string &$text * @param int $options */ public function replaceLinkHolders( &$text, $options = 0 ) { @@ -4956,7 +4929,6 @@ class Parser { * @return string HTML */ public function renderImageGallery( $text, $params ) { - $mode = false; if ( isset( $params['mode'] ) ) { $mode = $params['mode']; @@ -4971,10 +4943,11 @@ class Parser { $ig->setContextTitle( $this->mTitle ); $ig->setShowBytes( false ); + $ig->setShowDimensions( false ); $ig->setShowFilename( false ); $ig->setParser( $this ); $ig->setHideBadImages(); - $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) ); + $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'ul' ) ); if ( isset( $params['showfilename'] ) ) { $ig->setShowFilename( true ); @@ -5085,9 +5058,11 @@ class Parser { } if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) { $link = $linkValue; + $this->mOutput->addExternalLink( $link ); } else { $localLinkTitle = Title::newFromText( $linkValue ); if ( $localLinkTitle !== null ) { + $this->mOutput->addLink( $localLinkTitle ); $link = $localLinkTitle->getLinkURL(); } } @@ -5143,6 +5118,11 @@ class Parser { $internalParamMap = []; foreach ( $internalParamNames as $type => $names ) { foreach ( $names as $name ) { + // For grep: img_left, img_right, img_center, img_none, + // img_baseline, img_sub, img_super, img_top, img_text_top, img_middle, + // img_bottom, img_text_bottom, + // img_thumbnail, img_manualthumb, img_framed, img_frameless, img_upright, + // img_border, img_link, img_alt, img_class $magicName = str_replace( '-', '_', "img_$name" ); $internalParamMap[$magicName] = [ $type, $name ]; } @@ -5426,7 +5406,7 @@ class Parser { * Callback from the Sanitizer for expanding items found in HTML attribute * values, so they can be safely tested and escaped. * - * @param string $text + * @param string &$text * @param bool|PPFrame $frame * @return string */ @@ -5809,22 +5789,33 @@ class Parser { # Strip out wikitext links(they break the anchor) $text = $this->stripSectionName( $text ); $text = Sanitizer::normalizeSectionNameWhitespace( $text ); - return '#' . Sanitizer::escapeId( $text, 'noninitial' ); + return '#' . Sanitizer::escapeIdForLink( $text ); } /** * Same as guessSectionNameFromWikiText(), but produces legacy anchors - * instead. For use in redirects, since IE6 interprets Redirect: headers - * as something other than UTF-8 (apparently?), resulting in breakage. + * instead, if possible. For use in redirects, since various versions + * of Microsoft browsers interpret Location: headers as something other + * than UTF-8, resulting in breakage. * * @param string $text The section name * @return string An anchor */ public function guessLegacySectionNameFromWikiText( $text ) { + global $wgFragmentMode; + # Strip out wikitext links(they break the anchor) $text = $this->stripSectionName( $text ); $text = Sanitizer::normalizeSectionNameWhitespace( $text ); - return '#' . Sanitizer::escapeId( $text, [ 'noninitial', 'legacy' ] ); + + if ( isset( $wgFragmentMode[1] ) && $wgFragmentMode[1] === 'legacy' ) { + // ForAttribute() and ForLink() are the same for legacy encoding + $id = Sanitizer::escapeIdForAttribute( $text, Sanitizer::ID_FALLBACK ); + } else { + $id = Sanitizer::escapeIdForLink( $text ); + } + + return "#$id"; } /** @@ -6062,11 +6053,15 @@ class Parser { protected function lock() { if ( $this->mInParse ) { throw new MWException( "Parser state cleared while parsing. " - . "Did you call Parser::parse recursively?" ); + . "Did you call Parser::parse recursively? Lock is held by: " . $this->mInParse ); } - $this->mInParse = true; - $recursiveCheck = new ScopedCallback( function() { + // Save the backtrace when locking, so that if some code tries locking again, + // we can print the lock owner's backtrace for easier debugging + $e = new Exception; + $this->mInParse = $e->getTraceAsString(); + + $recursiveCheck = new ScopedCallback( function () { $this->mInParse = false; } ); diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php index f76c0b5dec..c680129934 100644 --- a/includes/parser/ParserCache.php +++ b/includes/parser/ParserCache.php @@ -21,25 +21,50 @@ * @ingroup Cache Parser */ +use MediaWiki\MediaWikiServices; + /** * @ingroup Cache Parser * @todo document */ class ParserCache { + /** + * Constants for self::getKey() + * @since 1.30 + */ + + /** Use only current data */ + const USE_CURRENT_ONLY = 0; + + /** Use expired data if current data is unavailable */ + const USE_EXPIRED = 1; + + /** Use expired data or data from different revisions if current data is unavailable */ + const USE_OUTDATED = 2; + + /** + * Use expired data and data from different revisions, and if all else + * fails vary on all variable options + */ + const USE_ANYTHING = 3; + /** @var BagOStuff */ private $mMemc; + + /** + * Anything cached prior to this is invalidated + * + * @var string + */ + private $cacheEpoch; /** * Get an instance of this object * + * @deprecated since 1.30, use MediaWikiServices instead * @return ParserCache */ public static function singleton() { - static $instance; - if ( !isset( $instance ) ) { - global $parserMemc; - $instance = new ParserCache( $parserMemc ); - } - return $instance; + return MediaWikiServices::getInstance()->getParserCache(); } /** @@ -48,11 +73,13 @@ class ParserCache { * This class use an invalidation strategy that is compatible with * MultiWriteBagOStuff in async replication mode. * - * @param BagOStuff $memCached + * @param BagOStuff $cache + * @param string $cacheEpoch Anything before this timestamp is invalidated * @throws MWException */ - protected function __construct( BagOStuff $memCached ) { - $this->mMemc = $memCached; + public function __construct( BagOStuff $cache, $cacheEpoch = '20030516000000' ) { + $this->mMemc = $cache; + $this->cacheEpoch = $cacheEpoch; } /** @@ -67,7 +94,7 @@ class ParserCache { $pageid = $article->getId(); $renderkey = (int)( $wgRequest->getVal( 'action' ) == 'render' ); - $key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" ); + $key = $this->mMemc->makeKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" ); return $key; } @@ -76,7 +103,7 @@ class ParserCache { * @return mixed|string */ protected function getOptionsKey( $page ) { - return wfMemcKey( 'pcache', 'idoptions', $page->getId() ); + return $this->mMemc->makeKey( 'pcache', 'idoptions', $page->getId() ); } /** @@ -103,7 +130,7 @@ class ParserCache { */ public function getETag( $article, $popts ) { return 'W/"' . $this->getParserOutputKey( $article, - $popts->optionsHash( ParserOptions::legacyOptions(), $article->getTitle() ) ) . + $popts->optionsHash( ParserOptions::allCacheVaryingOptions(), $article->getTitle() ) ) . "--" . $article->getTouched() . '"'; } @@ -130,15 +157,18 @@ class ParserCache { * It would be preferable to have this code in get() * instead of having Article looking in our internals. * - * @todo Document parameter $useOutdated - * * @param WikiPage $article * @param ParserOptions $popts - * @param bool $useOutdated (default true) + * @param int|bool $useOutdated One of the USE constants. For backwards + * compatibility, boolean false is treated as USE_CURRENT_ONLY and + * boolean true is treated as USE_ANYTHING. * @return bool|mixed|string + * @since 1.30 Changed $useOutdated to an int and added the non-boolean values */ - public function getKey( $article, $popts, $useOutdated = true ) { - global $wgCacheEpoch; + public function getKey( $article, $popts, $useOutdated = self::USE_ANYTHING ) { + if ( is_bool( $useOutdated ) ) { + $useOutdated = $useOutdated ? self::USE_ANYTHING : self::USE_CURRENT_ONLY; + } if ( $popts instanceof User ) { wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" ); @@ -150,14 +180,16 @@ class ParserCache { $optionsKey = $this->mMemc->get( $this->getOptionsKey( $article ), $casToken, BagOStuff::READ_VERIFIED ); if ( $optionsKey instanceof CacheTime ) { - if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) { + if ( $useOutdated < self::USE_EXPIRED && $optionsKey->expired( $article->getTouched() ) ) { wfIncrStats( "pcache.miss.expired" ); $cacheTime = $optionsKey->getCacheTime(); wfDebugLog( "ParserCache", "Parser options key expired, touched " . $article->getTouched() - . ", epoch $wgCacheEpoch, cached $cacheTime\n" ); + . ", epoch {$this->cacheEpoch}, cached $cacheTime\n" ); return false; - } elseif ( !$useOutdated && $optionsKey->isDifferentRevision( $article->getLatest() ) ) { + } elseif ( $useOutdated < self::USE_OUTDATED && + $optionsKey->isDifferentRevision( $article->getLatest() ) + ) { wfIncrStats( "pcache.miss.revid" ); $revId = $article->getLatest(); $cachedRevId = $optionsKey->getCacheRevisionId(); @@ -171,10 +203,10 @@ class ParserCache { $usedOptions = $optionsKey->mUsedOptions; wfDebug( "Parser cache options found.\n" ); } else { - if ( !$useOutdated ) { + if ( $useOutdated < self::USE_ANYTHING ) { return false; } - $usedOptions = ParserOptions::legacyOptions(); + $usedOptions = ParserOptions::allCacheVaryingOptions(); } return $this->getParserOutputKey( @@ -194,8 +226,6 @@ class ParserCache { * @return ParserOutput|bool False on failure */ public function get( $article, $popts, $useOutdated = false ) { - global $wgCacheEpoch; - $canCache = $article->checkTouched(); if ( !$canCache ) { // It's a redirect now @@ -204,7 +234,9 @@ class ParserCache { $touched = $article->getTouched(); - $parserOutputKey = $this->getKey( $article, $popts, $useOutdated ); + $parserOutputKey = $this->getKey( $article, $popts, + $useOutdated ? self::USE_OUTDATED : self::USE_CURRENT_ONLY + ); if ( $parserOutputKey === false ) { wfIncrStats( 'pcache.miss.absent' ); return false; @@ -235,7 +267,7 @@ class ParserCache { $cacheTime = $value->getCacheTime(); wfDebugLog( "ParserCache", "ParserOutput key expired, touched $touched, " - . "epoch $wgCacheEpoch, cached $cacheTime\n" ); + . "epoch {$this->cacheEpoch}, cached $cacheTime\n" ); $value = false; } elseif ( !$useOutdated && $value->isDifferentRevision( $article->getLatest() ) ) { wfIncrStats( "pcache.miss.revid" ); @@ -313,4 +345,15 @@ class ParserCache { wfDebug( "Parser output was marked as uncacheable and has not been saved.\n" ); } } + + /** + * Get the backend BagOStuff instance that + * powers the parser cache + * + * @since 1.30 + * @return BagOStuff + */ + public function getCacheStorage() { + return $this->mMemc; + } } diff --git a/includes/parser/ParserDiffTest.php b/includes/parser/ParserDiffTest.php index d0b66f8061..353825a8fb 100644 --- a/includes/parser/ParserDiffTest.php +++ b/includes/parser/ParserDiffTest.php @@ -24,8 +24,7 @@ /** * @ingroup Parser */ -class ParserDiffTest -{ +class ParserDiffTest { public $parsers; public $conf; public $shortOutput = false; diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 7be82818e7..c7146a1306 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -25,376 +25,641 @@ use Wikimedia\ScopedCallback; /** * @brief Set options of the Parser * - * All member variables are supposed to be private in theory, although in - * practice this is not the case. + * How to add an option in core: + * 1. Add it to one of the arrays in ParserOptions::setDefaults() + * 2. If necessary, add an entry to ParserOptions::$inCacheKey + * 3. Add a getter and setter in the section for that. + * + * How to add an option in an extension: + * 1. Use the 'ParserOptionsRegister' hook to register it. + * 2. Where necessary, use $popt->getOption() and $popt->setOption() + * to access it. * * @ingroup Parser */ class ParserOptions { /** - * Interlanguage links are removed and returned in an array + * Default values for all options that are relevant for caching. + * @see self::getDefaults() + * @var array|null */ - private $mInterwikiMagic; + private static $defaults = null; /** - * Allow external images inline? + * Lazy-loaded options + * @var callback[] */ - private $mAllowExternalImages; + private static $lazyOptions = [ + 'dateformat' => [ __CLASS__, 'initDateFormat' ], + ]; /** - * If not, any exception? + * Specify options that are included in the cache key + * @var array */ - private $mAllowExternalImagesFrom; + private static $inCacheKey = [ + 'dateformat' => true, + 'numberheadings' => true, + 'thumbsize' => true, + 'stubthreshold' => true, + 'printable' => true, + 'userlang' => true, + 'wrapclass' => true, + ]; /** - * If not or it doesn't match, should we check an on-wiki whitelist? + * Current values for all options that are relevant for caching. + * @var array */ - private $mEnableImageWhitelist; + private $options; /** - * Date format index + * Timestamp used for {{CURRENTDAY}} etc. + * @var string|null + * @note Caching based on parse time is handled externally */ - private $mDateFormat = null; + private $mTimestamp; /** - * Create "edit section" links? + * The edit section flag is in ParserOptions for historical reasons, but + * doesn't actually affect the parser output since Feb 2015. + * @var bool */ private $mEditSection = true; /** - * Allow inclusion of special pages? + * Stored user object + * @var User + * @todo Track this for caching somehow without fragmenting the cache insanely */ - private $mAllowSpecialInclusion; + private $mUser; /** - * Use tidy to cleanup output HTML? + * Function to be called when an option is accessed. + * @var callable|null + * @note Used for collecting used options, does not affect caching */ - private $mTidy = false; + private $onAccessCallback = null; /** - * Which lang to call for PLURAL and GRAMMAR + * If the page being parsed is a redirect, this should hold the redirect + * target. + * @var Title|null + * @todo Track this for caching somehow */ - private $mInterfaceMessage = false; + private $redirectTarget = null; /** - * Overrides $mInterfaceMessage with arbitrary language + * Appended to the options hash */ - private $mTargetLanguage = null; + private $mExtraKey = ''; /** - * Maximum size of template expansions, in bytes + * @name Option accessors + * @{ */ - private $mMaxIncludeSize; /** - * Maximum number of nodes touched by PPFrame::expand() + * Fetch an option, generically + * @since 1.30 + * @param string $name Option name + * @return mixed */ - private $mMaxPPNodeCount; + public function getOption( $name ) { + if ( !array_key_exists( $name, $this->options ) ) { + throw new InvalidArgumentException( "Unknown parser option $name" ); + } - /** - * Maximum number of nodes generated by Preprocessor::preprocessToObj() - */ - private $mMaxGeneratedPPNodeCount; + if ( isset( self::$lazyOptions[$name] ) && $this->options[$name] === null ) { + $this->options[$name] = call_user_func( self::$lazyOptions[$name], $this, $name ); + } + if ( !empty( self::$inCacheKey[$name] ) ) { + $this->optionUsed( $name ); + } + return $this->options[$name]; + } /** - * Maximum recursion depth in PPFrame::expand() + * Set an option, generically + * @since 1.30 + * @param string $name Option name + * @param mixed $value New value. Passing null will set null, unlike many + * of the existing accessors which ignore null for historical reasons. + * @return mixed Old value */ - private $mMaxPPExpandDepth; + public function setOption( $name, $value ) { + if ( !array_key_exists( $name, $this->options ) ) { + throw new InvalidArgumentException( "Unknown parser option $name" ); + } + $old = $this->options[$name]; + $this->options[$name] = $value; + return $old; + } /** - * Maximum recursion depth for templates within templates + * Legacy implementation + * @since 1.30 For implementing legacy setters only. Don't use this in new code. + * @deprecated since 1.30 + * @param string $name Option name + * @param mixed $value New value. Passing null does not set the value. + * @return mixed Old value */ - private $mMaxTemplateDepth; + protected function setOptionLegacy( $name, $value ) { + if ( !array_key_exists( $name, $this->options ) ) { + throw new InvalidArgumentException( "Unknown parser option $name" ); + } + return wfSetVar( $this->options[$name], $value ); + } /** - * Maximum number of calls per parse to expensive parser functions + * Whether to extract interlanguage links + * + * When true, interlanguage links will be returned by + * ParserOutput::getLanguageLinks() instead of generating link HTML. + * + * @return bool */ - private $mExpensiveParserFunctionLimit; + public function getInterwikiMagic() { + return $this->getOption( 'interwikiMagic' ); + } /** - * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS + * Specify whether to extract interlanguage links + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mRemoveComments = true; + public function setInterwikiMagic( $x ) { + return $this->setOptionLegacy( 'interwikiMagic', $x ); + } /** - * @var callable Callback for current revision fetching; first argument to call_user_func(). + * Allow all external images inline? + * @return bool */ - private $mCurrentRevisionCallback = - [ 'Parser', 'statelessFetchRevision' ]; + public function getAllowExternalImages() { + return $this->getOption( 'allowExternalImages' ); + } /** - * @var callable Callback for template fetching; first argument to call_user_func(). + * Allow all external images inline? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mTemplateCallback = - [ 'Parser', 'statelessFetchTemplate' ]; + public function setAllowExternalImages( $x ) { + return $this->setOptionLegacy( 'allowExternalImages', $x ); + } /** - * @var callable|null Callback to generate a guess for {{REVISIONID}} + * External images to allow + * + * When self::getAllowExternalImages() is false + * + * @return string|string[] URLs to allow */ - private $mSpeculativeRevIdCallback; + public function getAllowExternalImagesFrom() { + return $this->getOption( 'allowExternalImagesFrom' ); + } /** - * Enable limit report in an HTML comment on output + * External images to allow + * + * When self::getAllowExternalImages() is false + * + * @param string|string[]|null $x New value (null is no change) + * @return string|string[] Old value */ - private $mEnableLimitReport = false; + public function setAllowExternalImagesFrom( $x ) { + return $this->setOptionLegacy( 'allowExternalImagesFrom', $x ); + } /** - * Timestamp used for {{CURRENTDAY}} etc. + * Use the on-wiki external image whitelist? + * @return bool */ - private $mTimestamp; + public function getEnableImageWhitelist() { + return $this->getOption( 'enableImageWhitelist' ); + } /** - * Target attribute for external links + * Use the on-wiki external image whitelist? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mExternalLinkTarget; + public function setEnableImageWhitelist( $x ) { + return $this->setOptionLegacy( 'enableImageWhitelist', $x ); + } /** - * Clean up signature texts? - * @see Parser::cleanSig + * Automatically number headings? + * @return bool */ - private $mCleanSignatures; + public function getNumberHeadings() { + return $this->getOption( 'numberheadings' ); + } /** - * Transform wiki markup when saving the page? + * Automatically number headings? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mPreSaveTransform = true; + public function setNumberHeadings( $x ) { + return $this->setOptionLegacy( 'numberheadings', $x ); + } /** - * Whether content conversion should be disabled + * Allow inclusion of special pages? + * @return bool */ - private $mDisableContentConversion; + public function getAllowSpecialInclusion() { + return $this->getOption( 'allowSpecialInclusion' ); + } /** - * Whether title conversion should be disabled + * Allow inclusion of special pages? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mDisableTitleConversion; + public function setAllowSpecialInclusion( $x ) { + return $this->setOptionLegacy( 'allowSpecialInclusion', $x ); + } /** - * Automatically number headings? + * Use tidy to cleanup output HTML? + * @return bool */ - private $mNumberHeadings; + public function getTidy() { + return $this->getOption( 'tidy' ); + } /** - * Thumb size preferred by the user. + * Use tidy to cleanup output HTML? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mThumbSize; + public function setTidy( $x ) { + return $this->setOptionLegacy( 'tidy', $x ); + } /** - * Maximum article size of an article to be marked as "stub" + * Parsing an interface message? + * @return bool */ - private $mStubThreshold; + public function getInterfaceMessage() { + return $this->getOption( 'interfaceMessage' ); + } /** - * Language object of the User language. + * Parsing an interface message? + * @param bool|null $x New value (null is no change) + * @return bool Old value */ - private $mUserLang; + public function setInterfaceMessage( $x ) { + return $this->setOptionLegacy( 'interfaceMessage', $x ); + } /** - * @var User - * Stored user object + * Target language for the parse + * @return Language|null */ - private $mUser; + public function getTargetLanguage() { + return $this->getOption( 'targetLanguage' ); + } /** - * Parsing the page for a "preview" operation? + * Target language for the parse + * @param Language|null $x New value + * @return Language|null Old value */ - private $mIsPreview = false; + public function setTargetLanguage( $x ) { + return $this->setOption( 'targetLanguage', $x ); + } /** - * Parsing the page for a "preview" operation on a single section? + * Maximum size of template expansions, in bytes + * @return int */ - private $mIsSectionPreview = false; + public function getMaxIncludeSize() { + return $this->getOption( 'maxIncludeSize' ); + } /** - * Parsing the printable version of the page? + * Maximum size of template expansions, in bytes + * @param int|null $x New value (null is no change) + * @return int Old value */ - private $mIsPrintable = false; + public function setMaxIncludeSize( $x ) { + return $this->setOptionLegacy( 'maxIncludeSize', $x ); + } /** - * Extra key that should be present in the caching key. + * Maximum number of nodes touched by PPFrame::expand() + * @return int */ - private $mExtraKey = ''; + public function getMaxPPNodeCount() { + return $this->getOption( 'maxPPNodeCount' ); + } /** - * Are magic ISBN links enabled? + * Maximum number of nodes touched by PPFrame::expand() + * @param int|null $x New value (null is no change) + * @return int Old value */ - private $mMagicISBNLinks = true; + public function setMaxPPNodeCount( $x ) { + return $this->setOptionLegacy( 'maxPPNodeCount', $x ); + } /** - * Are magic PMID links enabled? + * Maximum number of nodes generated by Preprocessor::preprocessToObj() + * @return int */ - private $mMagicPMIDLinks = true; + public function getMaxGeneratedPPNodeCount() { + return $this->getOption( 'maxGeneratedPPNodeCount' ); + } /** - * Are magic RFC links enabled? + * Maximum number of nodes generated by Preprocessor::preprocessToObj() + * @param int|null $x New value (null is no change) + * @return int */ - private $mMagicRFCLinks = true; + public function setMaxGeneratedPPNodeCount( $x ) { + return $this->setOptionLegacy( 'maxGeneratedPPNodeCount', $x ); + } /** - * Function to be called when an option is accessed. + * Maximum recursion depth in PPFrame::expand() + * @return int */ - private $onAccessCallback = null; + public function getMaxPPExpandDepth() { + return $this->getOption( 'maxPPExpandDepth' ); + } /** - * If the page being parsed is a redirect, this should hold the redirect - * target. - * @var Title|null + * Maximum recursion depth for templates within templates + * @return int */ - private $redirectTarget = null; - - public function getInterwikiMagic() { - return $this->mInterwikiMagic; - } - - public function getAllowExternalImages() { - return $this->mAllowExternalImages; - } - - public function getAllowExternalImagesFrom() { - return $this->mAllowExternalImagesFrom; - } - - public function getEnableImageWhitelist() { - return $this->mEnableImageWhitelist; - } - - public function getEditSection() { - return $this->mEditSection; - } - - public function getNumberHeadings() { - $this->optionUsed( 'numberheadings' ); - - return $this->mNumberHeadings; + public function getMaxTemplateDepth() { + return $this->getOption( 'maxTemplateDepth' ); } - public function getAllowSpecialInclusion() { - return $this->mAllowSpecialInclusion; + /** + * Maximum recursion depth for templates within templates + * @param int|null $x New value (null is no change) + * @return int Old value + */ + public function setMaxTemplateDepth( $x ) { + return $this->setOptionLegacy( 'maxTemplateDepth', $x ); } - public function getTidy() { - return $this->mTidy; + /** + * Maximum number of calls per parse to expensive parser functions + * @since 1.20 + * @return int + */ + public function getExpensiveParserFunctionLimit() { + return $this->getOption( 'expensiveParserFunctionLimit' ); } - public function getInterfaceMessage() { - return $this->mInterfaceMessage; + /** + * Maximum number of calls per parse to expensive parser functions + * @since 1.20 + * @param int|null $x New value (null is no change) + * @return int Old value + */ + public function setExpensiveParserFunctionLimit( $x ) { + return $this->setOptionLegacy( 'expensiveParserFunctionLimit', $x ); } - public function getTargetLanguage() { - return $this->mTargetLanguage; + /** + * Remove HTML comments + * @warning Only applies to preprocess operations + * @return bool + */ + public function getRemoveComments() { + return $this->getOption( 'removeComments' ); } - public function getMaxIncludeSize() { - return $this->mMaxIncludeSize; + /** + * Remove HTML comments + * @warning Only applies to preprocess operations + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setRemoveComments( $x ) { + return $this->setOptionLegacy( 'removeComments', $x ); } - public function getMaxPPNodeCount() { - return $this->mMaxPPNodeCount; + /** + * Enable limit report in an HTML comment on output + * @return bool + */ + public function getEnableLimitReport() { + return $this->getOption( 'enableLimitReport' ); } - public function getMaxGeneratedPPNodeCount() { - return $this->mMaxGeneratedPPNodeCount; + /** + * Enable limit report in an HTML comment on output + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function enableLimitReport( $x = true ) { + return $this->setOptionLegacy( 'enableLimitReport', $x ); } - public function getMaxPPExpandDepth() { - return $this->mMaxPPExpandDepth; + /** + * Clean up signature texts? + * @see Parser::cleanSig + * @return bool + */ + public function getCleanSignatures() { + return $this->getOption( 'cleanSignatures' ); } - public function getMaxTemplateDepth() { - return $this->mMaxTemplateDepth; + /** + * Clean up signature texts? + * @see Parser::cleanSig + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setCleanSignatures( $x ) { + return $this->setOptionLegacy( 'cleanSignatures', $x ); } - /* @since 1.20 */ - public function getExpensiveParserFunctionLimit() { - return $this->mExpensiveParserFunctionLimit; + /** + * Target attribute for external links + * @return string + */ + public function getExternalLinkTarget() { + return $this->getOption( 'externalLinkTarget' ); } - public function getRemoveComments() { - return $this->mRemoveComments; + /** + * Target attribute for external links + * @param string|null $x New value (null is no change) + * @return string Old value + */ + public function setExternalLinkTarget( $x ) { + return $this->setOptionLegacy( 'externalLinkTarget', $x ); } - /* @since 1.24 */ - public function getCurrentRevisionCallback() { - return $this->mCurrentRevisionCallback; + /** + * Whether content conversion should be disabled + * @return bool + */ + public function getDisableContentConversion() { + return $this->getOption( 'disableContentConversion' ); } - public function getTemplateCallback() { - return $this->mTemplateCallback; + /** + * Whether content conversion should be disabled + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function disableContentConversion( $x = true ) { + return $this->setOptionLegacy( 'disableContentConversion', $x ); } - /** @since 1.28 */ - public function getSpeculativeRevIdCallback() { - return $this->mSpeculativeRevIdCallback; + /** + * Whether title conversion should be disabled + * @return bool + */ + public function getDisableTitleConversion() { + return $this->getOption( 'disableTitleConversion' ); } - public function getEnableLimitReport() { - return $this->mEnableLimitReport; + /** + * Whether title conversion should be disabled + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function disableTitleConversion( $x = true ) { + return $this->setOptionLegacy( 'disableTitleConversion', $x ); } - public function getCleanSignatures() { - return $this->mCleanSignatures; + /** + * Thumb size preferred by the user. + * @return int + */ + public function getThumbSize() { + return $this->getOption( 'thumbsize' ); } - public function getExternalLinkTarget() { - return $this->mExternalLinkTarget; + /** + * Thumb size preferred by the user. + * @param int|null $x New value (null is no change) + * @return int Old value + */ + public function setThumbSize( $x ) { + return $this->setOptionLegacy( 'thumbsize', $x ); } - public function getDisableContentConversion() { - return $this->mDisableContentConversion; + /** + * Thumb size preferred by the user. + * @return int + */ + public function getStubThreshold() { + return $this->getOption( 'stubthreshold' ); } - public function getDisableTitleConversion() { - return $this->mDisableTitleConversion; + /** + * Thumb size preferred by the user. + * @param int|null $x New value (null is no change) + * @return int Old value + */ + public function setStubThreshold( $x ) { + return $this->setOptionLegacy( 'stubthreshold', $x ); } - public function getThumbSize() { - $this->optionUsed( 'thumbsize' ); - - return $this->mThumbSize; + /** + * Parsing the page for a "preview" operation? + * @return bool + */ + public function getIsPreview() { + return $this->getOption( 'isPreview' ); } - public function getStubThreshold() { - $this->optionUsed( 'stubthreshold' ); - - return $this->mStubThreshold; + /** + * Parsing the page for a "preview" operation? + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setIsPreview( $x ) { + return $this->setOptionLegacy( 'isPreview', $x ); } - public function getIsPreview() { - return $this->mIsPreview; + /** + * Parsing the page for a "preview" operation on a single section? + * @return bool + */ + public function getIsSectionPreview() { + return $this->getOption( 'isSectionPreview' ); } - public function getIsSectionPreview() { - return $this->mIsSectionPreview; + /** + * Parsing the page for a "preview" operation on a single section? + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setIsSectionPreview( $x ) { + return $this->setOptionLegacy( 'isSectionPreview', $x ); } + /** + * Parsing the printable version of the page? + * @return bool + */ public function getIsPrintable() { - $this->optionUsed( 'printable' ); + return $this->getOption( 'printable' ); + } - return $this->mIsPrintable; + /** + * Parsing the printable version of the page? + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setIsPrintable( $x ) { + return $this->setOptionLegacy( 'printable', $x ); } - public function getUser() { - return $this->mUser; + /** + * Transform wiki markup when saving the page? + * @return bool + */ + public function getPreSaveTransform() { + return $this->getOption( 'preSaveTransform' ); } - public function getPreSaveTransform() { - return $this->mPreSaveTransform; + /** + * Transform wiki markup when saving the page? + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setPreSaveTransform( $x ) { + return $this->setOptionLegacy( 'preSaveTransform', $x ); } + /** + * Date format index + * @return string + */ public function getDateFormat() { - $this->optionUsed( 'dateformat' ); - if ( !isset( $this->mDateFormat ) ) { - $this->mDateFormat = $this->mUser->getDatePreference(); - } - return $this->mDateFormat; + return $this->getOption( 'dateformat' ); } - public function getTimestamp() { - if ( !isset( $this->mTimestamp ) ) { - $this->mTimestamp = wfTimestampNow(); - } - return $this->mTimestamp; + /** + * Lazy initializer for dateFormat + */ + private static function initDateFormat( $popt ) { + return $popt->mUser->getDatePreference(); + } + + /** + * Date format index + * @param string|null $x New value (null is no change) + * @return string Old value + */ + public function setDateFormat( $x ) { + return $this->setOptionLegacy( 'dateformat', $x ); } /** @@ -415,8 +680,7 @@ class ParserOptions { * @since 1.19 */ public function getUserLangObj() { - $this->optionUsed( 'userlang' ); - return $this->mUserLang; + return $this->getOption( 'userlang' ); } /** @@ -436,164 +700,188 @@ class ParserOptions { } /** + * Set the user language used by the parser for this page and split the parser cache. + * @param string|Language $x New value + * @return Language Old value + */ + public function setUserLang( $x ) { + if ( is_string( $x ) ) { + $x = Language::factory( $x ); + } + + return $this->setOptionLegacy( 'userlang', $x ); + } + + /** + * Are magic ISBN links enabled? * @since 1.28 * @return bool */ public function getMagicISBNLinks() { - return $this->mMagicISBNLinks; + return $this->getOption( 'magicISBNLinks' ); } /** + * Are magic PMID links enabled? * @since 1.28 * @return bool */ public function getMagicPMIDLinks() { - return $this->mMagicPMIDLinks; + return $this->getOption( 'magicPMIDLinks' ); } /** + * Are magic RFC links enabled? * @since 1.28 * @return bool */ public function getMagicRFCLinks() { - return $this->mMagicRFCLinks; - } - public function setInterwikiMagic( $x ) { - return wfSetVar( $this->mInterwikiMagic, $x ); - } - - public function setAllowExternalImages( $x ) { - return wfSetVar( $this->mAllowExternalImages, $x ); - } - - public function setAllowExternalImagesFrom( $x ) { - return wfSetVar( $this->mAllowExternalImagesFrom, $x ); - } - - public function setEnableImageWhitelist( $x ) { - return wfSetVar( $this->mEnableImageWhitelist, $x ); - } - - public function setDateFormat( $x ) { - return wfSetVar( $this->mDateFormat, $x ); - } - - public function setEditSection( $x ) { - return wfSetVar( $this->mEditSection, $x ); - } - - public function setNumberHeadings( $x ) { - return wfSetVar( $this->mNumberHeadings, $x ); - } - - public function setAllowSpecialInclusion( $x ) { - return wfSetVar( $this->mAllowSpecialInclusion, $x ); - } - - public function setTidy( $x ) { - return wfSetVar( $this->mTidy, $x ); - } - - public function setInterfaceMessage( $x ) { - return wfSetVar( $this->mInterfaceMessage, $x ); - } - - public function setTargetLanguage( $x ) { - return wfSetVar( $this->mTargetLanguage, $x, true ); - } - - public function setMaxIncludeSize( $x ) { - return wfSetVar( $this->mMaxIncludeSize, $x ); + return $this->getOption( 'magicRFCLinks' ); } - public function setMaxPPNodeCount( $x ) { - return wfSetVar( $this->mMaxPPNodeCount, $x ); + /** + * If the wiki is configured to allow raw html ($wgRawHtml = true) + * is it allowed in the specific case of parsing this page. + * + * This is meant to disable unsafe parser tags in cases where + * a malicious user may control the input to the parser. + * + * @note This is expected to be true for normal pages even if the + * wiki has $wgRawHtml disabled in general. The setting only + * signifies that raw html would be unsafe in the current context + * provided that raw html is allowed at all. + * @since 1.29 + * @return bool + */ + public function getAllowUnsafeRawHtml() { + return $this->getOption( 'allowUnsafeRawHtml' ); } - public function setMaxGeneratedPPNodeCount( $x ) { - return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); + /** + * If the wiki is configured to allow raw html ($wgRawHtml = true) + * is it allowed in the specific case of parsing this page. + * @see self::getAllowUnsafeRawHtml() + * @since 1.29 + * @param bool|null $x Value to set or null to get current value + * @return bool Current value for allowUnsafeRawHtml + */ + public function setAllowUnsafeRawHtml( $x ) { + return $this->setOptionLegacy( 'allowUnsafeRawHtml', $x ); } - public function setMaxTemplateDepth( $x ) { - return wfSetVar( $this->mMaxTemplateDepth, $x ); + /** + * Class to use to wrap output from Parser::parse() + * @since 1.30 + * @return string|bool + */ + public function getWrapOutputClass() { + return $this->getOption( 'wrapclass' ); } - /* @since 1.20 */ - public function setExpensiveParserFunctionLimit( $x ) { - return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); + /** + * CSS class to use to wrap output from Parser::parse() + * @since 1.30 + * @param string|bool $className Set false to disable wrapping. + * @return string|bool Current value + */ + public function setWrapOutputClass( $className ) { + if ( $className === true ) { // DWIM, they probably want the default class name + $className = 'mw-parser-output'; + } + return $this->setOption( 'wrapclass', $className ); } - public function setRemoveComments( $x ) { - return wfSetVar( $this->mRemoveComments, $x ); + /** + * Callback for current revision fetching; first argument to call_user_func(). + * @since 1.24 + * @return callable + */ + public function getCurrentRevisionCallback() { + return $this->getOption( 'currentRevisionCallback' ); } - /* @since 1.24 */ + /** + * Callback for current revision fetching; first argument to call_user_func(). + * @since 1.24 + * @param callable|null $x New value (null is no change) + * @return callable Old value + */ public function setCurrentRevisionCallback( $x ) { - return wfSetVar( $this->mCurrentRevisionCallback, $x ); + return $this->setOptionLegacy( 'currentRevisionCallback', $x ); } - /** @since 1.28 */ - public function setSpeculativeRevIdCallback( $x ) { - return wfSetVar( $this->mSpeculativeRevIdCallback, $x ); + /** + * Callback for template fetching; first argument to call_user_func(). + * @return callable + */ + public function getTemplateCallback() { + return $this->getOption( 'templateCallback' ); } + /** + * Callback for template fetching; first argument to call_user_func(). + * @param callable|null $x New value (null is no change) + * @return callable Old value + */ public function setTemplateCallback( $x ) { - return wfSetVar( $this->mTemplateCallback, $x ); - } - - public function enableLimitReport( $x = true ) { - return wfSetVar( $this->mEnableLimitReport, $x ); - } - - public function setTimestamp( $x ) { - return wfSetVar( $this->mTimestamp, $x ); - } - - public function setCleanSignatures( $x ) { - return wfSetVar( $this->mCleanSignatures, $x ); + return $this->setOptionLegacy( 'templateCallback', $x ); } - public function setExternalLinkTarget( $x ) { - return wfSetVar( $this->mExternalLinkTarget, $x ); + /** + * Callback to generate a guess for {{REVISIONID}} + * @since 1.28 + * @return callable|null + */ + public function getSpeculativeRevIdCallback() { + return $this->getOption( 'speculativeRevIdCallback' ); } - public function disableContentConversion( $x = true ) { - return wfSetVar( $this->mDisableContentConversion, $x ); + /** + * Callback to generate a guess for {{REVISIONID}} + * @since 1.28 + * @param callable|null $x New value (null is no change) + * @return callable|null Old value + */ + public function setSpeculativeRevIdCallback( $x ) { + return $this->setOptionLegacy( 'speculativeRevIdCallback', $x ); } - public function disableTitleConversion( $x = true ) { - return wfSetVar( $this->mDisableTitleConversion, $x ); - } + /**@}*/ - public function setUserLang( $x ) { - if ( is_string( $x ) ) { - $x = Language::factory( $x ); + /** + * Timestamp used for {{CURRENTDAY}} etc. + * @return string + */ + public function getTimestamp() { + if ( !isset( $this->mTimestamp ) ) { + $this->mTimestamp = wfTimestampNow(); } - - return wfSetVar( $this->mUserLang, $x ); - } - - public function setThumbSize( $x ) { - return wfSetVar( $this->mThumbSize, $x ); - } - - public function setStubThreshold( $x ) { - return wfSetVar( $this->mStubThreshold, $x ); - } - - public function setPreSaveTransform( $x ) { - return wfSetVar( $this->mPreSaveTransform, $x ); + return $this->mTimestamp; } - public function setIsPreview( $x ) { - return wfSetVar( $this->mIsPreview, $x ); + /** + * Timestamp used for {{CURRENTDAY}} etc. + * @param string|null $x New value (null is no change) + * @return string Old value + */ + public function setTimestamp( $x ) { + return wfSetVar( $this->mTimestamp, $x ); } - public function setIsSectionPreview( $x ) { - return wfSetVar( $this->mIsSectionPreview, $x ); + /** + * Create "edit section" links? + * @return bool + */ + public function getEditSection() { + return $this->mEditSection; } - public function setIsPrintable( $x ) { - return wfSetVar( $this->mIsPrintable, $x ); + /** + * Create "edit section" links? + * @param bool|null $x New value (null is no change) + * @return bool Old value + */ + public function setEditSection( $x ) { + return wfSetVar( $this->mEditSection, $x ); } /** @@ -622,6 +910,8 @@ class ParserOptions { /** * Extra key that should be present in the parser cache key. + * @warning Consider registering your additional options with the + * ParserOptionsRegister hook instead of using this method. * @param string $key */ public function addExtraKey( $key ) { @@ -629,7 +919,17 @@ class ParserOptions { } /** - * Constructor + * Current user + * @return User + */ + public function getUser() { + return $this->mUser; + } + + /** + * @warning For interaction with the parser cache, use + * WikiPage::makeParserOptions(), ContentHandler::makeParserOptions(), or + * ParserOptions::newCanonical() instead. * @param User $user * @param Language $lang */ @@ -654,6 +954,9 @@ class ParserOptions { /** * Get a ParserOptions object for an anonymous user + * @warning For interaction with the parser cache, use + * WikiPage::makeParserOptions(), ContentHandler::makeParserOptions(), or + * ParserOptions::newCanonical() instead. * @since 1.27 * @return ParserOptions */ @@ -666,6 +969,9 @@ class ParserOptions { * Get a ParserOptions object from a given user. * Language will be taken from $wgLang. * + * @warning For interaction with the parser cache, use + * WikiPage::makeParserOptions(), ContentHandler::makeParserOptions(), or + * ParserOptions::newCanonical() instead. * @param User $user * @return ParserOptions */ @@ -676,6 +982,9 @@ class ParserOptions { /** * Get a ParserOptions object from a given user and language * + * @warning For interaction with the parser cache, use + * WikiPage::makeParserOptions(), ContentHandler::makeParserOptions(), or + * ParserOptions::newCanonical() instead. * @param User $user * @param Language $lang * @return ParserOptions @@ -687,6 +996,9 @@ class ParserOptions { /** * Get a ParserOptions object from a IContextSource object * + * @warning For interaction with the parser cache, use + * WikiPage::makeParserOptions(), ContentHandler::makeParserOptions(), or + * ParserOptions::newCanonical() instead. * @param IContextSource $context * @return ParserOptions */ @@ -695,44 +1007,131 @@ class ParserOptions { } /** - * Get user options + * Creates a "canonical" ParserOptions object * - * @param User $user - * @param Language $lang + * For historical reasons, certain options have default values that are + * different from the canonical values used for caching. + * + * @since 1.30 + * @param User|null $user + * @param Language|StubObject|null $lang + * @return ParserOptions */ - private function initialiseFromUser( $user, $lang ) { + public static function newCanonical( User $user = null, $lang = null ) { + $ret = new ParserOptions( $user, $lang ); + foreach ( self::getCanonicalOverrides() as $k => $v ) { + $ret->setOption( $k, $v ); + } + return $ret; + } + + /** + * Get default option values + * @warning If you change the default for an existing option (unless it's + * being overridden by self::getCanonicalOverrides()), all existing parser + * cache entries will be invalid. To avoid bugs, you'll need to handle + * that somehow (e.g. with the RejectParserCacheValue hook) because + * MediaWiki won't do it for you. + * @return array + */ + private static function getDefaults() { global $wgInterwikiMagic, $wgAllowExternalImages, $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion, $wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit, $wgMaxGeneratedPPNodeCount, $wgDisableLangConversion, $wgDisableTitleConversion, - $wgEnableMagicLinks; - - // *UPDATE* ParserOptions::matches() if any of this changes as needed - $this->mInterwikiMagic = $wgInterwikiMagic; - $this->mAllowExternalImages = $wgAllowExternalImages; - $this->mAllowExternalImagesFrom = $wgAllowExternalImagesFrom; - $this->mEnableImageWhitelist = $wgEnableImageWhitelist; - $this->mAllowSpecialInclusion = $wgAllowSpecialInclusion; - $this->mMaxIncludeSize = $wgMaxArticleSize * 1024; - $this->mMaxPPNodeCount = $wgMaxPPNodeCount; - $this->mMaxGeneratedPPNodeCount = $wgMaxGeneratedPPNodeCount; - $this->mMaxPPExpandDepth = $wgMaxPPExpandDepth; - $this->mMaxTemplateDepth = $wgMaxTemplateDepth; - $this->mExpensiveParserFunctionLimit = $wgExpensiveParserFunctionLimit; - $this->mCleanSignatures = $wgCleanSignatures; - $this->mExternalLinkTarget = $wgExternalLinkTarget; - $this->mDisableContentConversion = $wgDisableLangConversion; - $this->mDisableTitleConversion = $wgDisableLangConversion || $wgDisableTitleConversion; - $this->mMagicISBNLinks = $wgEnableMagicLinks['ISBN']; - $this->mMagicPMIDLinks = $wgEnableMagicLinks['PMID']; - $this->mMagicRFCLinks = $wgEnableMagicLinks['RFC']; + $wgEnableMagicLinks, $wgContLang; + + if ( self::$defaults === null ) { + // *UPDATE* ParserOptions::matches() if any of this changes as needed + self::$defaults = [ + 'dateformat' => null, + 'tidy' => false, + 'interfaceMessage' => false, + 'targetLanguage' => null, + 'removeComments' => true, + 'enableLimitReport' => false, + 'preSaveTransform' => true, + 'isPreview' => false, + 'isSectionPreview' => false, + 'printable' => false, + 'allowUnsafeRawHtml' => true, + 'wrapclass' => 'mw-parser-output', + 'currentRevisionCallback' => [ 'Parser', 'statelessFetchRevision' ], + 'templateCallback' => [ 'Parser', 'statelessFetchTemplate' ], + 'speculativeRevIdCallback' => null, + ]; + + // @codingStandardsIgnoreStart Squiz.WhiteSpace.OperatorSpacing.NoSpaceAfterAmp + Hooks::run( 'ParserOptionsRegister', [ + &self::$defaults, + &self::$inCacheKey, + &self::$lazyOptions, + ] ); + // @codingStandardsIgnoreEnd + + ksort( self::$inCacheKey ); + } + + // Unit tests depend on being able to modify the globals at will + return self::$defaults + [ + 'interwikiMagic' => $wgInterwikiMagic, + 'allowExternalImages' => $wgAllowExternalImages, + 'allowExternalImagesFrom' => $wgAllowExternalImagesFrom, + 'enableImageWhitelist' => $wgEnableImageWhitelist, + 'allowSpecialInclusion' => $wgAllowSpecialInclusion, + 'maxIncludeSize' => $wgMaxArticleSize * 1024, + 'maxPPNodeCount' => $wgMaxPPNodeCount, + 'maxGeneratedPPNodeCount' => $wgMaxGeneratedPPNodeCount, + 'maxPPExpandDepth' => $wgMaxPPExpandDepth, + 'maxTemplateDepth' => $wgMaxTemplateDepth, + 'expensiveParserFunctionLimit' => $wgExpensiveParserFunctionLimit, + 'externalLinkTarget' => $wgExternalLinkTarget, + 'cleanSignatures' => $wgCleanSignatures, + 'disableContentConversion' => $wgDisableLangConversion, + 'disableTitleConversion' => $wgDisableLangConversion || $wgDisableTitleConversion, + 'magicISBNLinks' => $wgEnableMagicLinks['ISBN'], + 'magicPMIDLinks' => $wgEnableMagicLinks['PMID'], + 'magicRFCLinks' => $wgEnableMagicLinks['RFC'], + 'numberheadings' => User::getDefaultOption( 'numberheadings' ), + 'thumbsize' => User::getDefaultOption( 'thumbsize' ), + 'stubthreshold' => 0, + 'userlang' => $wgContLang, + ]; + } + + /** + * Get "canonical" non-default option values + * @see self::newCanonical + * @warning If you change the override for an existing option, all existing + * parser cache entries will be invalid. To avoid bugs, you'll need to + * handle that somehow (e.g. with the RejectParserCacheValue hook) because + * MediaWiki won't do it for you. + * @return array + */ + private static function getCanonicalOverrides() { + global $wgEnableParserLimitReporting; + + return [ + 'tidy' => true, + 'enableLimitReport' => $wgEnableParserLimitReporting, + ]; + } + + /** + * Get user options + * + * @param User $user + * @param Language $lang + */ + private function initialiseFromUser( $user, $lang ) { + $this->options = self::getDefaults(); $this->mUser = $user; - $this->mNumberHeadings = $user->getOption( 'numberheadings' ); - $this->mThumbSize = $user->getOption( 'thumbsize' ); - $this->mStubThreshold = $user->getStubThreshold(); - $this->mUserLang = $lang; + $this->options['numberheadings'] = $user->getOption( 'numberheadings' ); + $this->options['thumbsize'] = $user->getOption( 'thumbsize' ); + $this->options['stubthreshold'] = $user->getStubThreshold(); + $this->options['userlang'] = $lang; } /** @@ -745,9 +1144,36 @@ class ParserOptions { * @since 1.25 */ public function matches( ParserOptions $other ) { + // Populate lazy options + foreach ( self::$lazyOptions as $name => $callback ) { + if ( $this->options[$name] === null ) { + $this->options[$name] = call_user_func( $callback, $this, $name ); + } + if ( $other->options[$name] === null ) { + $other->options[$name] = call_user_func( $callback, $other, $name ); + } + } + + // Compare most options + $options = array_keys( $this->options ); + $options = array_diff( $options, [ + 'enableLimitReport', // only affects HTML comments + ] ); + foreach ( $options as $option ) { + $o1 = $this->optionToString( $this->options[$option] ); + $o2 = $this->optionToString( $other->options[$option] ); + if ( $o1 !== $o2 ) { + return false; + } + } + + // Compare most other fields $fields = array_keys( get_class_vars( __CLASS__ ) ); $fields = array_diff( $fields, [ - 'mEnableLimitReport', // only effects HTML comments + 'defaults', // static + 'lazyOptions', // static + 'inCacheKey', // static + 'options', // Already checked above 'onAccessCallback', // only used for ParserOutput option tracking ] ); foreach ( $fields as $field ) { @@ -755,11 +1181,8 @@ class ParserOptions { return false; } } - // Check the object and lazy-loaded options - return ( - $this->mUserLang->equals( $other->mUserLang ) && - $this->getDateFormat() === $other->getDateFormat() - ); + + return true; } /** @@ -789,9 +1212,11 @@ class ParserOptions { * Returns the full array of options that would have been used by * in 1.16. * Used to get the old parser cache entries when available. + * @deprecated since 1.30. You probably want self::allCacheVaryingOptions() instead. * @return array */ public static function legacyOptions() { + wfDeprecated( __METHOD__, '1.30' ); return [ 'stubthreshold', 'numberheadings', @@ -802,6 +1227,41 @@ class ParserOptions { ]; } + /** + * Return all option keys that vary the options hash + * @since 1.30 + * @return string[] + */ + public static function allCacheVaryingOptions() { + // Trigger a call to the 'ParserOptionsRegister' hook if it hasn't + // already been called. + if ( self::$defaults === null ) { + self::getDefaults(); + } + return array_keys( array_filter( self::$inCacheKey ) ); + } + + /** + * Convert an option to a string value + * @param mixed $value + * @return string + */ + private function optionToString( $value ) { + if ( $value === true ) { + return '1'; + } elseif ( $value === false ) { + return '0'; + } elseif ( $value === null ) { + return ''; + } elseif ( $value instanceof Language ) { + return $value->getCode(); + } elseif ( is_array( $value ) ) { + return '[' . join( ',', array_map( [ $this, 'optionToString' ], $value ) ) . ']'; + } else { + return (string)$value; + } + } + /** * Generate a hash string with the values set on these ParserOptions * for the keys given in the array. @@ -809,10 +1269,6 @@ class ParserOptions { * so users sharing the options with vary for the same page share * the same cached data safely. * - * Extensions which require it should install 'PageRenderingHash' hook, - * which will give them a chance to modify this key based on their own - * settings. - * * @since 1.17 * @param array $forOptions * @param Title $title Used to get the content language of the page (since r97636) @@ -821,41 +1277,39 @@ class ParserOptions { public function optionsHash( $forOptions, $title = null ) { global $wgRenderHashAppend; - // FIXME: Once the cache key is reorganized this argument - // can be dropped. It was used when the math extension was - // part of core. - $confstr = '*'; - - // Space assigned for the stubthreshold but unused - // since it disables the parser cache, its value will always - // be 0 when this function is called by parsercache. - if ( in_array( 'stubthreshold', $forOptions ) ) { - $confstr .= '!' . $this->mStubThreshold; - } else { - $confstr .= '!*'; - } - - if ( in_array( 'dateformat', $forOptions ) ) { - $confstr .= '!' . $this->getDateFormat(); - } - - if ( in_array( 'numberheadings', $forOptions ) ) { - $confstr .= '!' . ( $this->mNumberHeadings ? '1' : '' ); - } else { - $confstr .= '!*'; + $options = $this->options; + $defaults = self::getCanonicalOverrides() + self::getDefaults(); + $inCacheKey = self::$inCacheKey; + + // Historical hack: 'editsection' hasn't been a true parser option since + // Feb 2015 (instead the parser outputs a constant placeholder and post-parse + // processing handles the option). But Wikibase forces it in $forOptions + // and expects the cache key to still vary on it for T85252. + // @deprecated since 1.30, Wikibase should use addExtraKey() or something instead. + if ( in_array( 'editsection', $forOptions, true ) ) { + $options['editsection'] = $this->mEditSection; + $defaults['editsection'] = true; + $inCacheKey['editsection'] = true; + ksort( $inCacheKey ); } - if ( in_array( 'userlang', $forOptions ) ) { - $confstr .= '!' . $this->mUserLang->getCode(); - } else { - $confstr .= '!*'; + // We only include used options with non-canonical values in the key + // so adding a new option doesn't invalidate the entire parser cache. + // The drawback to this is that changing the default value of an option + // requires manual invalidation of existing cache entries, as mentioned + // in the docs on the relevant methods and hooks. + $values = []; + foreach ( $inCacheKey as $option => $include ) { + if ( $include && in_array( $option, $forOptions, true ) ) { + $v = $this->optionToString( $options[$option] ); + $d = $this->optionToString( $defaults[$option] ); + if ( $v !== $d ) { + $values[] = "$option=$v"; + } + } } - if ( in_array( 'thumbsize', $forOptions ) ) { - $confstr .= '!' . $this->mThumbSize; - } else { - $confstr .= '!*'; - } + $confstr = $values ? join( '!', $values ) : 'canonical'; // add in language specific options, if any // @todo FIXME: This is just a way of retrieving the url/user preferred variant @@ -868,20 +1322,6 @@ class ParserOptions { $confstr .= $wgRenderHashAppend; - // @note: as of Feb 2015, core never sets the editsection flag, since it uses - // tags to inject editsections on the fly. However, extensions - // may be using it by calling ParserOption::optionUsed resp. ParserOutput::registerOption - // directly. At least Wikibase does at this point in time. - if ( !in_array( 'editsection', $forOptions ) ) { - $confstr .= '!*'; - } elseif ( !$this->mEditSection ) { - $confstr .= '!edit=0'; - } - - if ( $this->mIsPrintable && in_array( 'printable', $forOptions ) ) { - $confstr .= '!printable=1'; - } - if ( $this->mExtraKey != '' ) { $confstr .= $this->mExtraKey; } @@ -896,6 +1336,25 @@ class ParserOptions { return $confstr; } + /** + * Test whether these options are safe to cache + * @since 1.30 + * @return bool + */ + public function isSafeToCache() { + $defaults = self::getCanonicalOverrides() + self::getDefaults(); + foreach ( $this->options as $option => $value ) { + if ( empty( self::$inCacheKey[$option] ) ) { + $v = $this->optionToString( $value ); + $d = $this->optionToString( $defaults[$option] ); + if ( $v !== $d ) { + return false; + } + } + } + return true; + } + /** * Sets a hook to force that a page exists, and sets a current revision callback to return * a revision with custom content when the current revision of the page is requested. @@ -943,3 +1402,8 @@ class ParserOptions { } ); } } + +/** + * For really cool vim folding this needs to be at the end: + * vim: foldmarker=@{,@} foldmethod=marker + */ diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index b2f99b3d3f..cfb0c3ec59 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -253,7 +253,7 @@ class ParserOutput extends CacheTime { $text = $this->mText; if ( $this->mEditSectionTokens ) { $text = preg_replace_callback( - ParserOutput::EDITSECTION_REGEX, + self::EDITSECTION_REGEX, function ( $m ) { global $wgOut, $wgLang; $editsectionPage = Title::newFromText( htmlspecialchars_decode( $m[1] ) ); @@ -274,7 +274,7 @@ class ParserOutput extends CacheTime { $text ); } else { - $text = preg_replace( ParserOutput::EDITSECTION_REGEX, '', $text ); + $text = preg_replace( self::EDITSECTION_REGEX, '', $text ); } // If you have an old cached version of this class - sorry, you can't disable the TOC @@ -535,6 +535,10 @@ class ParserOutput extends CacheTime { # We don't register links pointing to our own server, unless... :-) global $wgServer, $wgRegisterInternalExternals; + # Replace unnecessary URL escape codes with the referenced character + # This prevents spammers from hiding links from the filters + $url = parser::normalizeLinkUrl( $url ); + $registerExternalLink = true; if ( !$wgRegisterInternalExternals ) { $registerExternalLink = !self::isLinkInternal( $wgServer, $url ); @@ -704,7 +708,7 @@ class ParserOutput extends CacheTime { * @since 1.25 */ public function addTrackingCategory( $msg, $title ) { - if ( $title->getNamespace() === NS_SPECIAL ) { + if ( $title->isSpecialPage() ) { wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" ); return false; } diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php index 426b5507a4..24474d5795 100644 --- a/includes/parser/Preprocessor.php +++ b/includes/parser/Preprocessor.php @@ -51,9 +51,9 @@ abstract class Preprocessor { ], '-{' => [ 'end' => '}-', - 'names' => [ 1 => null ], - 'min' => 1, - 'max' => 1, + 'names' => [ 2 => null ], + 'min' => 2, + 'max' => 2, ], ]; @@ -72,12 +72,12 @@ abstract class Preprocessor { return false; } - $key = wfMemcKey( + $cache = ObjectCache::getLocalClusterInstance(); + $key = $cache->makeKey( defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class, md5( $text ), $flags ); $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree; - $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) ); $cache->set( $key, $value, 86400 ); LoggerFactory::getInstance( 'Preprocessor' ) @@ -101,9 +101,9 @@ abstract class Preprocessor { return false; } - $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) ); + $cache = ObjectCache::getLocalClusterInstance(); - $key = wfMemcKey( + $key = $cache->makeKey( defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : static::class, md5( $text ), $flags ); diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php index b93c6173ea..2588962604 100644 --- a/includes/parser/Preprocessor_DOM.php +++ b/includes/parser/Preprocessor_DOM.php @@ -148,7 +148,6 @@ class Preprocessor_DOM extends Preprocessor { * @return PPNode_DOM */ public function preprocessToObj( $text, $flags = 0 ) { - $xml = $this->cacheGetTree( $text, $flags ); if ( $xml === false ) { $xml = $this->preprocessToXml( $text, $flags ); @@ -223,8 +222,7 @@ class Preprocessor_DOM extends Preprocessor { $searchBase = "[{<\n"; # } if ( !$wgDisableLangConversion ) { - // FIXME: disabled due to T153761 - // $searchBase .= '-'; + $searchBase .= '-'; } // For fast reverse searches @@ -277,6 +275,13 @@ class Preprocessor_DOM extends Preprocessor { $search = $searchBase; if ( $stack->top === false ) { $currentClosing = ''; + } elseif ( + $stack->top->close === '}-' && + $stack->top->count > 2 + ) { + # adjust closing for -{{{...{{ + $currentClosing = '}'; + $search .= $currentClosing; } else { $currentClosing = $stack->top->close; $search .= $currentClosing; @@ -333,11 +338,15 @@ class Preprocessor_DOM extends Preprocessor { } elseif ( isset( $this->rules[$curChar] ) ) { $found = 'open'; $rule = $this->rules[$curChar]; - } elseif ( $curChar == '-' ) { - $found = 'dash'; } else { - # Some versions of PHP have a strcspn which stops on null characters - # Ignore and continue + # Some versions of PHP have a strcspn which stops on + # null characters; ignore these and continue. + # We also may get '-' and '}' characters here which + # don't match -{ or $currentClosing. Add these to + # output and continue. + if ( $curChar == '-' || $curChar == '}' ) { + $accum .= $curChar; + } ++$i; continue; } @@ -363,7 +372,6 @@ class Preprocessor_DOM extends Preprocessor { } // Handle comments if ( isset( $matches[2] ) && $matches[2] == '!--' ) { - // To avoid leaving blank lines, when a sequence of // space-separated comments is both preceded and followed by // a newline (ignoring spaces), then @@ -615,7 +623,10 @@ class Preprocessor_DOM extends Preprocessor { } elseif ( $found == 'open' ) { # count opening brace characters $curLen = strlen( $curChar ); - $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i ); + $count = ( $curLen > 1 ) ? + # allow the final character to repeat + strspn( $text, $curChar[$curLen - 1], $i + 1 ) + 1 : + strspn( $text, $curChar, $i ); # we need to add to stack only if opening brace count is enough for one of the rules if ( $count >= $rule['min'] ) { @@ -635,17 +646,25 @@ class Preprocessor_DOM extends Preprocessor { # Add literal brace(s) $accum .= htmlspecialchars( str_repeat( $curChar, $count ) ); } - $i += $curLen * $count; + $i += $count; } elseif ( $found == 'close' ) { $piece = $stack->top; # lets check if there are enough characters for closing brace $maxCount = $piece->count; + if ( $piece->close === '}-' && $curChar === '}' ) { + $maxCount--; # don't try to match closing '-' as a '}' + } $curLen = strlen( $curChar ); - $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount ); + $count = ( $curLen > 1 ) ? $curLen : + strspn( $text, $curChar, $i, $maxCount ); # check for maximum matching characters (if there are 5 closing # characters, we will probably need only 3 - depending on the rules) $rule = $this->rules[$piece->open]; + if ( $piece->close === '}-' && $piece->count > 2 ) { + # tweak for -{..{{ }}..}- + $rule = $this->rules['{']; + } if ( $count > $rule['max'] ) { # The specified maximum exists in the callback array, unless the caller # has made an error @@ -663,14 +682,16 @@ class Preprocessor_DOM extends Preprocessor { if ( $matchingCount <= 0 ) { # No matching element found in callback array # Output a literal closing brace and continue - $accum .= htmlspecialchars( str_repeat( $curChar, $count ) ); - $i += $curLen * $count; + $endText = substr( $text, $i, $count ); + $accum .= htmlspecialchars( $endText ); + $i += $count; continue; } $name = $rule['names'][$matchingCount]; if ( $name === null ) { // No element, just literal text - $element = $piece->breakSyntax( $matchingCount ) . str_repeat( $rule['end'], $matchingCount ); + $endText = substr( $text, $i, $matchingCount ); + $element = $piece->breakSyntax( $matchingCount ) . $endText; } else { # Create XML element # Note: $parts is already XML, does not need to be encoded further @@ -703,7 +724,7 @@ class Preprocessor_DOM extends Preprocessor { } # Advance input pointer - $i += $curLen * $matchingCount; + $i += $matchingCount; # Unwind the stack $stack->pop(); @@ -719,7 +740,12 @@ class Preprocessor_DOM extends Preprocessor { $stack->push( $piece ); $accum =& $stack->getAccum(); } else { - $accum .= str_repeat( $piece->open, $piece->count ); + $s = substr( $piece->open, 0, -1 ); + $s .= str_repeat( + substr( $piece->open, -1 ), + $piece->count - strlen( $s ) + ); + $accum .= $s; } } $flags = $stack->getFlags(); @@ -924,7 +950,11 @@ class PPDStackElement { if ( $openingCount === false ) { $openingCount = $this->count; } - $s = str_repeat( $this->open, $openingCount ); + $s = substr( $this->open, 0, -1 ); + $s .= str_repeat( + substr( $this->open, -1 ), + $openingCount - strlen( $s ) + ); $first = true; foreach ( $this->parts as $part ) { if ( $first ) { diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php index b2e9531ddd..9ea8fa3a50 100644 --- a/includes/parser/Preprocessor_Hash.php +++ b/includes/parser/Preprocessor_Hash.php @@ -155,8 +155,7 @@ class Preprocessor_Hash extends Preprocessor { $searchBase = "[{<\n"; if ( !$wgDisableLangConversion ) { - // FIXME: disabled due to T153761 - // $searchBase .= '-'; + $searchBase .= '-'; } // For fast reverse searches @@ -208,6 +207,13 @@ class Preprocessor_Hash extends Preprocessor { $search = $searchBase; if ( $stack->top === false ) { $currentClosing = ''; + } elseif ( + $stack->top->close === '}-' && + $stack->top->count > 2 + ) { + # adjust closing for -{{{...{{ + $currentClosing = '}'; + $search .= $currentClosing; } else { $currentClosing = $stack->top->close; $search .= $currentClosing; @@ -264,11 +270,15 @@ class Preprocessor_Hash extends Preprocessor { } elseif ( isset( $this->rules[$curChar] ) ) { $found = 'open'; $rule = $this->rules[$curChar]; - } elseif ( $curChar == '-' ) { - $found = 'dash'; } else { - # Some versions of PHP have a strcspn which stops on null characters - # Ignore and continue + # Some versions of PHP have a strcspn which stops on + # null characters; ignore these and continue. + # We also may get '-' and '}' characters here which + # don't match -{ or $currentClosing. Add these to + # output and continue. + if ( $curChar == '-' || $curChar == '}' ) { + self::addLiteral( $accum, $curChar ); + } ++$i; continue; } @@ -294,7 +304,6 @@ class Preprocessor_Hash extends Preprocessor { } // Handle comments if ( isset( $matches[2] ) && $matches[2] == '!--' ) { - // To avoid leaving blank lines, when a sequence of // space-separated comments is both preceded and followed by // a newline (ignoring spaces), then @@ -558,7 +567,10 @@ class Preprocessor_Hash extends Preprocessor { } elseif ( $found == 'open' ) { # count opening brace characters $curLen = strlen( $curChar ); - $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i ); + $count = ( $curLen > 1 ) ? + # allow the final character to repeat + strspn( $text, $curChar[$curLen - 1], $i + 1 ) + 1 : + strspn( $text, $curChar, $i ); # we need to add to stack only if opening brace count is enough for one of the rules if ( $count >= $rule['min'] ) { @@ -577,17 +589,25 @@ class Preprocessor_Hash extends Preprocessor { # Add literal brace(s) self::addLiteral( $accum, str_repeat( $curChar, $count ) ); } - $i += $curLen * $count; + $i += $count; } elseif ( $found == 'close' ) { $piece = $stack->top; # lets check if there are enough characters for closing brace $maxCount = $piece->count; + if ( $piece->close === '}-' && $curChar === '}' ) { + $maxCount--; # don't try to match closing '-' as a '}' + } $curLen = strlen( $curChar ); - $count = ( $curLen > 1 ) ? 1 : strspn( $text, $curChar, $i, $maxCount ); + $count = ( $curLen > 1 ) ? $curLen : + strspn( $text, $curChar, $i, $maxCount ); # check for maximum matching characters (if there are 5 closing # characters, we will probably need only 3 - depending on the rules) $rule = $this->rules[$piece->open]; + if ( $piece->close === '}-' && $piece->count > 2 ) { + # tweak for -{..{{ }}..}- + $rule = $this->rules['{']; + } if ( $count > $rule['max'] ) { # The specified maximum exists in the callback array, unless the caller # has made an error @@ -605,15 +625,17 @@ class Preprocessor_Hash extends Preprocessor { if ( $matchingCount <= 0 ) { # No matching element found in callback array # Output a literal closing brace and continue - self::addLiteral( $accum, str_repeat( $curChar, $count ) ); - $i += $curLen * $count; + $endText = substr( $text, $i, $count ); + self::addLiteral( $accum, $endText ); + $i += $count; continue; } $name = $rule['names'][$matchingCount]; if ( $name === null ) { // No element, just literal text + $endText = substr( $text, $i, $matchingCount ); $element = $piece->breakSyntax( $matchingCount ); - self::addLiteral( $element, str_repeat( $rule['end'], $matchingCount ) ); + self::addLiteral( $element, $endText ); } else { # Create XML element $parts = $piece->parts; @@ -648,7 +670,7 @@ class Preprocessor_Hash extends Preprocessor { } # Advance input pointer - $i += $curLen * $matchingCount; + $i += $matchingCount; # Unwind the stack $stack->pop(); @@ -664,7 +686,12 @@ class Preprocessor_Hash extends Preprocessor { $stack->push( $piece ); $accum =& $stack->getAccum(); } else { - self::addLiteral( $accum, str_repeat( $piece->open, $piece->count ) ); + $s = substr( $piece->open, 0, -1 ); + $s .= str_repeat( + substr( $piece->open, -1 ), + $piece->count - strlen( $s ) + ); + self::addLiteral( $accum, $s ); } } @@ -762,7 +789,12 @@ class PPDStackElement_Hash extends PPDStackElement { if ( $openingCount === false ) { $openingCount = $this->count; } - $accum = [ str_repeat( $this->open, $openingCount ) ]; + $s = substr( $this->open, 0, -1 ); + $s .= str_repeat( + substr( $this->open, -1 ), + $openingCount - strlen( $s ) + ); + $accum = [ $s ]; $lastIndex = 0; $first = true; foreach ( $this->parts as $part ) { diff --git a/includes/password/Pbkdf2Password.php b/includes/password/Pbkdf2Password.php index 6ffada36b4..4a8831e32f 100644 --- a/includes/password/Pbkdf2Password.php +++ b/includes/password/Pbkdf2Password.php @@ -41,12 +41,17 @@ class Pbkdf2Password extends ParameterizedPassword { return ':'; } + protected function shouldUseHashExtension() { + return isset( $this->config['use-hash-extension'] ) ? + $this->config['use-hash-extension'] : function_exists( 'hash_pbkdf2' ); + } + public function crypt( $password ) { if ( count( $this->args ) == 0 ) { $this->args[] = base64_encode( MWCryptRand::generate( 16, true ) ); } - if ( function_exists( 'hash_pbkdf2' ) ) { + if ( $this->shouldUseHashExtension() ) { $hash = hash_pbkdf2( $this->params['algo'], $password, diff --git a/includes/poolcounter/PoolCounterRedis.php b/includes/poolcounter/PoolCounterRedis.php index 5a15ddf6bb..65ea8333e3 100644 --- a/includes/poolcounter/PoolCounterRedis.php +++ b/includes/poolcounter/PoolCounterRedis.php @@ -16,7 +16,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz */ use Psr\Log\LoggerInterface; diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php index 252a227a1d..4da7976d82 100644 --- a/includes/profiler/Profiler.php +++ b/includes/profiler/Profiler.php @@ -164,7 +164,7 @@ abstract class Profiler { abstract public function scopedProfileIn( $section ); /** - * @param SectionProfileCallback $section + * @param SectionProfileCallback &$section */ public function scopedProfileOut( SectionProfileCallback &$section = null ) { $section = null; diff --git a/includes/profiler/ProfilerSectionOnly.php b/includes/profiler/ProfilerSectionOnly.php index 0ce8087675..41260a8388 100644 --- a/includes/profiler/ProfilerSectionOnly.php +++ b/includes/profiler/ProfilerSectionOnly.php @@ -27,7 +27,6 @@ * $wgProfiler['visible'] = true; * @endcode * - * @author Aaron Schulz * @ingroup Profiler * @since 1.25 */ @@ -73,7 +72,7 @@ class ProfilerSectionOnly extends Profiler { */ protected function getFunctionReport() { $data = $this->getFunctionStats(); - usort( $data, function( $a, $b ) { + usort( $data, function ( $a, $b ) { if ( $a['real'] === $b['real'] ) { return 0; } diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php index 1bf4f54583..09191ee51d 100644 --- a/includes/profiler/ProfilerXhprof.php +++ b/includes/profiler/ProfilerXhprof.php @@ -47,8 +47,7 @@ * a drop-in replacement for Xhprof. Just change the XHPROF_FLAGS_* constants * to TIDEWAYS_FLAGS_*. * - * @author Bryan Davis - * @copyright © 2014 Bryan Davis and Wikimedia Foundation. + * @copyright © 2014 Wikimedia Foundation and contributors * @ingroup Profiler * @see Xhprof * @see https://php.net/xhprof @@ -201,7 +200,7 @@ class ProfilerXhprof extends Profiler { */ protected function getFunctionReport() { $data = $this->getFunctionStats(); - usort( $data, function( $a, $b ) { + usort( $data, function ( $a, $b ) { if ( $a['real'] === $b['real'] ) { return 0; } diff --git a/includes/profiler/SectionProfiler.php b/includes/profiler/SectionProfiler.php index 7e3c398bb0..57bd01f8de 100644 --- a/includes/profiler/SectionProfiler.php +++ b/includes/profiler/SectionProfiler.php @@ -19,7 +19,6 @@ * * @file * @ingroup Profiler - * @author Aaron Schulz */ use Wikimedia\ScopedCallback; @@ -67,7 +66,7 @@ class SectionProfiler { } /** - * @param ScopedCallback $section + * @param ScopedCallback &$section */ public function scopedProfileOut( ScopedCallback &$section ) { $section = null; @@ -299,7 +298,7 @@ class SectionProfiler { /* Find all items under this entry */ $level = $stack[$max][1]; $working = []; - for ( $i = $max -1; $i >= 0; $i-- ) { + for ( $i = $max - 1; $i >= 0; $i-- ) { if ( $stack[$i][1] > $level ) { $working[] = $stack[$i]; } else { @@ -440,7 +439,7 @@ class SectionProfiler { protected function calltreeCount( $stack, $start ) { $level = $stack[$start][1]; $count = 0; - for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) { + for ( $i = $start - 1; $i >= 0 && $stack[$i][1] > $level; $i-- ) { $count ++; } return $count; diff --git a/includes/profiler/output/ProfilerOutput.php b/includes/profiler/output/ProfilerOutput.php index ddf084e81c..20b07801b4 100644 --- a/includes/profiler/output/ProfilerOutput.php +++ b/includes/profiler/output/ProfilerOutput.php @@ -31,7 +31,6 @@ abstract class ProfilerOutput { protected $params = []; /** - * Constructor * @param Profiler $collector The actual profiler * @param array $params Configuration array, passed down from $wgProfiler */ diff --git a/includes/profiler/output/ProfilerOutputDb.php b/includes/profiler/output/ProfilerOutputDb.php index 264ec0c637..2225e3f630 100644 --- a/includes/profiler/output/ProfilerOutputDb.php +++ b/includes/profiler/output/ProfilerOutputDb.php @@ -21,6 +21,8 @@ * @ingroup Profiler */ +use Wikimedia\Rdbms\DBError; + /** * Logs profiling data into the local DB * diff --git a/includes/profiler/output/ProfilerOutputStats.php b/includes/profiler/output/ProfilerOutputStats.php index 52aa54acca..bb8655183c 100644 --- a/includes/profiler/output/ProfilerOutputStats.php +++ b/includes/profiler/output/ProfilerOutputStats.php @@ -21,6 +21,7 @@ * @file * @ingroup Profiler */ +use MediaWiki\MediaWikiServices; /** * ProfilerOutput class that flushes profiling data to the profiling @@ -38,7 +39,7 @@ class ProfilerOutputStats extends ProfilerOutput { */ public function log( array $stats ) { $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : ''; - $contextStats = $this->collector->getContext()->getStats(); + $contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory(); foreach ( $stats as $stat ) { $key = "{$prefix}.{$stat['name']}"; diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php index 4c011be2cd..f0fcd7da74 100644 --- a/includes/rcfeed/RedisPubSubFeedEngine.php +++ b/includes/rcfeed/RedisPubSubFeedEngine.php @@ -27,11 +27,13 @@ * 'rc'. If the URI contains a query string, its parameters will be parsed * as RedisConnectionPool options. * - * @example + * @par Example: + * @code * $wgRCFeeds['redis'] = array( * 'formatter' => 'JSONRCFeedFormatter', * 'uri' => "redis://127.0.0.1:6379/rc.$wgDBname", * ); + * @encode * * @since 1.22 */ diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php index 1212f9972c..ce262bd23e 100644 --- a/includes/registration/ExtensionProcessor.php +++ b/includes/registration/ExtensionProcessor.php @@ -56,6 +56,16 @@ class ExtensionProcessor implements Processor { 'ValidSkinNames', ]; + /** + * Top-level attributes that come from MW core + * + * @var string[] + */ + protected static $coreAttributes = [ + 'SkinOOUIThemes', + 'TrackingCategories', + ]; + /** * Mapping of global settings to their specific merge strategies. * @@ -160,6 +170,14 @@ class ExtensionProcessor implements Processor { */ protected $attributes = []; + /** + * Extension attributes, keyed by name => + * settings. + * + * @var array + */ + protected $extAttributes = []; + /** * @param string $path * @param array $info @@ -186,14 +204,47 @@ class ExtensionProcessor implements Processor { $this->callbacks[$name] = $info['callback']; } + if ( $version === 2 ) { + $this->extractAttributes( $path, $info ); + } + foreach ( $info as $key => $val ) { + // If it's a global setting, if ( in_array( $key, self::$globalSettings ) ) { $this->storeToArray( $path, "wg$key", $val, $this->globals ); + continue; + } // Ignore anything that starts with a @ - } elseif ( $key[0] !== '@' && !in_array( $key, self::$notAttributes ) - && !in_array( $key, self::$creditsAttributes ) - ) { - $this->storeToArray( $path, $key, $val, $this->attributes ); + if ( $key[0] === '@' ) { + continue; + } + + if ( $version === 2 ) { + // Only whitelisted attributes are set + if ( in_array( $key, self::$coreAttributes ) ) { + $this->storeToArray( $path, $key, $val, $this->attributes ); + } + } else { + // version === 1 + if ( !in_array( $key, self::$notAttributes ) + && !in_array( $key, self::$creditsAttributes ) + ) { + // If it's not blacklisted, it's an attribute + $this->storeToArray( $path, $key, $val, $this->attributes ); + } + } + + } + } + + /** + * @param string $path + * @param array $info + */ + protected function extractAttributes( $path, array $info ) { + if ( isset( $info['attributes'] ) ) { + foreach ( $info['attributes'] as $extName => $value ) { + $this->storeToArray( $path, $extName, $value, $this->extAttributes ); } } } @@ -206,6 +257,22 @@ class ExtensionProcessor implements Processor { } } + // Merge $this->extAttributes into $this->attributes depending on what is loaded + foreach ( $this->extAttributes as $extName => $value ) { + // Only set the attribute if $extName is loaded (and hence present in credits) + if ( isset( $this->credits[$extName] ) ) { + foreach ( $value as $attrName => $attrValue ) { + $this->storeToArray( + '', // Don't provide a path since it's impossible to generate an error here + $extName . $attrName, + $attrValue, + $this->attributes + ); + } + unset( $this->extAttributes[$extName] ); + } + } + return [ 'globals' => $this->globals, 'defines' => $this->defines, @@ -241,8 +308,15 @@ class ExtensionProcessor implements Processor { protected function extractNamespaces( array $info ) { if ( isset( $info['namespaces'] ) ) { foreach ( $info['namespaces'] as $ns ) { - $id = $ns['id']; - $this->defines[$ns['constant']] = $id; + if ( defined( $ns['constant'] ) ) { + // If the namespace constant is already defined, use it. + // This allows namespace IDs to be overwritten locally. + $id = constant( $ns['constant'] ); + } else { + $id = $ns['id']; + $this->defines[ $ns['constant'] ] = $id; + } + if ( !( isset( $ns['conditional'] ) && $ns['conditional'] ) ) { // If it is not conditional, register it $this->attributes['ExtensionNamespaces'][$id] = $ns['name']; @@ -304,7 +378,7 @@ class ExtensionProcessor implements Processor { protected function extractExtensionMessagesFiles( $dir, array $info ) { if ( isset( $info['ExtensionMessagesFiles'] ) ) { - $this->globals["wgExtensionMessagesFiles"] += array_map( function( $file ) use ( $dir ) { + $this->globals["wgExtensionMessagesFiles"] += array_map( function ( $file ) use ( $dir ) { return "$dir/$file"; }, $info['ExtensionMessagesFiles'] ); } diff --git a/includes/registration/ExtensionRegistry.php b/includes/registration/ExtensionRegistry.php index 344dd8f5c0..eac04a9b89 100644 --- a/includes/registration/ExtensionRegistry.php +++ b/includes/registration/ExtensionRegistry.php @@ -31,7 +31,7 @@ class ExtensionRegistry { /** * Bump whenever the registration cache needs resetting */ - const CACHE_VERSION = 5; + const CACHE_VERSION = 6; /** * Special key that defines the merge strategy @@ -111,7 +111,7 @@ class ExtensionRegistry { * be loaded then). */ public function loadFromQueue() { - global $wgVersion; + global $wgVersion, $wgDevelopmentWarnings; if ( !$this->queued ) { return; } @@ -137,7 +137,7 @@ class ExtensionRegistry { $cache = new EmptyBagOStuff(); } // See if this queue is in APC - $key = wfMemcKey( + $key = $cache->makeKey( 'registration', md5( json_encode( $this->queued + $versions ) ) ); @@ -151,7 +151,10 @@ class ExtensionRegistry { // did that, but it should be cached $data['globals']['wgAutoloadClasses'] += $data['autoload']; unset( $data['autoload'] ); - $cache->set( $key, $data, 60 * 60 * 24 ); + if ( !( $data['warnings'] && $wgDevelopmentWarnings ) ) { + // If there were no warnings that were shown, cache it + $cache->set( $key, $data, 60 * 60 * 24 ); + } } $this->queued = []; } @@ -198,6 +201,7 @@ class ExtensionRegistry { $versionChecker = new VersionChecker( $wgVersion ); $extDependencies = []; $incompatible = []; + $warnings = false; foreach ( $queue as $path => $mtime ) { $json = file_get_contents( $path ); if ( $json === false ) { @@ -209,6 +213,11 @@ class ExtensionRegistry { } if ( !isset( $info['manifest_version'] ) ) { + wfDeprecated( + "{$info['name']}'s extension.json or skin.json does not have manifest_version", + '1.29' + ); + $warnings = true; // For backwards-compatability, assume a version of 1 $info['manifest_version'] = 1; } @@ -237,6 +246,7 @@ class ExtensionRegistry { $processor->extractInfo( $path, $info, $version ); } $data = $processor->getExtractedInfo(); + $data['warnings'] = $warnings; // check for incompatible extensions $incompatible = array_merge( @@ -390,7 +400,7 @@ class ExtensionRegistry { protected function processAutoLoader( $dir, array $info ) { if ( isset( $info['AutoloadClasses'] ) ) { // Make paths absolute, relative to the JSON file - return array_map( function( $file ) use ( $dir ) { + return array_map( function ( $file ) use ( $dir ) { return "$dir/$file"; }, $info['AutoloadClasses'] ); } else { diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 717fb45804..c58bb00b94 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -27,6 +27,7 @@ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use WrappedString\WrappedString; +use Wikimedia\Rdbms\DBConnectionError; /** * Dynamic JavaScript and CSS resource loading system. @@ -78,6 +79,15 @@ class ResourceLoader implements LoggerAwareInterface { */ protected $errors = []; + /** + * List of extra HTTP response headers provided by loaded modules. + * + * Populated by makeModuleResponse(). + * + * @var array + */ + protected $extraHeaders = []; + /** * @var MessageBlobStore */ @@ -177,7 +187,7 @@ class ResourceLoader implements LoggerAwareInterface { * @return string Filtered data, or a comment containing an error message */ public static function filter( $filter, $data, array $options = [] ) { - if ( strpos( $data, ResourceLoader::FILTER_NOMIN ) !== false ) { + if ( strpos( $data, self::FILTER_NOMIN ) !== false ) { return $data; } @@ -185,7 +195,7 @@ class ResourceLoader implements LoggerAwareInterface { return self::applyFilter( $filter, $data ); } - $stats = RequestContext::getMain()->getStats(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING ); $key = $cache->makeGlobalKey( @@ -252,7 +262,6 @@ class ResourceLoader implements LoggerAwareInterface { // Register core modules $this->register( include "$IP/resources/Resources.php" ); - $this->register( include "$IP/resources/ResourcesOOUI.php" ); // Register extension modules $this->register( $config->get( 'ResourceModules' ) ); @@ -540,6 +549,10 @@ class ResourceLoader implements LoggerAwareInterface { if ( isset( $info['object'] ) ) { // Object given in info array $object = $info['object']; + } elseif ( isset( $info['factory'] ) ) { + $object = call_user_func( $info['factory'], $info ); + $object->setConfig( $this->getConfig() ); + $object->setLogger( $this->logger ); } else { if ( !isset( $info['class'] ) ) { $class = 'ResourceLoaderFileModule'; @@ -559,7 +572,8 @@ class ResourceLoader implements LoggerAwareInterface { } /** - * Return whether the definition of a module corresponds to a simple ResourceLoaderFileModule. + * Return whether the definition of a module corresponds to a simple ResourceLoaderFileModule + * or one of its subclasses. * * @param string $name Module name * @return bool @@ -569,7 +583,14 @@ class ResourceLoader implements LoggerAwareInterface { return false; } $info = $this->moduleInfos[$name]; - if ( isset( $info['object'] ) || isset( $info['class'] ) ) { + if ( isset( $info['object'] ) ) { + return false; + } + if ( + isset( $info['class'] ) && + $info['class'] !== 'ResourceLoaderFileModule' && + !is_subclass_of( $info['class'], 'ResourceLoaderFileModule' ) + ) { return false; } return true; @@ -634,7 +655,7 @@ class ResourceLoader implements LoggerAwareInterface { * * @since 1.26 * @param ResourceLoaderContext $context - * @param string[] $modules List of known module names + * @param string[] $moduleNames List of known module names * @return string Hash */ public function getCombinedVersion( ResourceLoaderContext $context, array $moduleNames ) { @@ -782,7 +803,7 @@ class ResourceLoader implements LoggerAwareInterface { } } - $this->sendResponseHeaders( $context, $etag, (bool)$this->errors ); + $this->sendResponseHeaders( $context, $etag, (bool)$this->errors, $this->extraHeaders ); // Remove the output buffer and output the response ob_end_clean(); @@ -815,9 +836,12 @@ class ResourceLoader implements LoggerAwareInterface { * @param ResourceLoaderContext $context * @param string $etag ETag header value * @param bool $errors Whether there are errors in the response + * @param string[] $extra Array of extra HTTP response headers * @return void */ - protected function sendResponseHeaders( ResourceLoaderContext $context, $etag, $errors ) { + protected function sendResponseHeaders( + ResourceLoaderContext $context, $etag, $errors, array $extra = [] + ) { \MediaWiki\HeaderCallback::warnIfHeadersSent(); $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' ); // Use a short cache expiry so that updates propagate to clients quickly, if: @@ -861,6 +885,9 @@ class ResourceLoader implements LoggerAwareInterface { $exp = min( $maxage, $smaxage ); header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) ); } + foreach ( $extra as $header ) { + header( $header ); + } } /** @@ -996,6 +1023,9 @@ class ResourceLoader implements LoggerAwareInterface { /** * Generate code for a response. * + * Calling this method also populates the `errors` and `headers` members, + * later used by respond(). + * * @param ResourceLoaderContext $context Context in which to generate a response * @param ResourceLoaderModule[] $modules List of module objects keyed by module name * @param string[] $missing List of requested module names that are unregistered (optional) @@ -1040,6 +1070,10 @@ MESSAGE; $implementKey = $name . '@' . $module->getVersionHash( $context ); $strContent = ''; + if ( isset( $content['headers'] ) ) { + $this->extraHeaders = array_merge( $this->extraHeaders, $content['headers'] ); + } + // Append output switch ( $context->getOnly() ) { case 'scripts': @@ -1067,7 +1101,7 @@ MESSAGE; // mw.loader.implement will use globalEval if scripts is a string. // Minify manually here, because general response minification is // not effective due it being a string literal, not a function. - if ( !ResourceLoader::inDebugMode() ) { + if ( !self::inDebugMode() ) { $scripts = self::filter( 'minify-js', $scripts ); // T107377 } } else { @@ -1088,7 +1122,12 @@ MESSAGE; $strContent = self::filter( $filter, $strContent ); } - $out .= $strContent; + if ( $context->getOnly() === 'scripts' ) { + // Use a linebreak between module scripts (T162719) + $out .= $this->ensureNewline( $strContent ); + } else { + $out .= $strContent; + } } catch ( Exception $e ) { $this->outputErrorAndLog( $e, 'Generating module package failed: {exception}' ); @@ -1116,18 +1155,32 @@ MESSAGE; if ( !$context->getDebug() ) { $stateScript = self::filter( 'minify-js', $stateScript ); } - $out .= $stateScript; + // Use a linebreak between module script and state script (T162719) + $out = $this->ensureNewline( $out ) . $stateScript; } } else { if ( count( $states ) ) { $this->errors[] = 'Problematic modules: ' . - FormatJson::encode( $states, ResourceLoader::inDebugMode() ); + FormatJson::encode( $states, self::inDebugMode() ); } } return $out; } + /** + * Ensure the string is either empty or ends in a line break + * @param string $str + * @return string + */ + private function ensureNewline( $str ) { + $end = substr( $str, -1 ); + if ( $end === false || $end === "\n" ) { + return $str; + } + return $str . "\n"; + } + /** * Get names of modules that use a certain message. * @@ -1161,7 +1214,7 @@ MESSAGE; * @param array $templates Keys are name of templates and values are the source of * the template. * @throws MWException - * @return string + * @return string JavaScript code */ protected static function makeLoaderImplementScript( $name, $scripts, $styles, $messages, $templates @@ -1183,7 +1236,7 @@ MESSAGE; ]; self::trimArray( $module ); - return Xml::encodeJsCall( 'mw.loader.implement', $module, ResourceLoader::inDebugMode() ); + return Xml::encodeJsCall( 'mw.loader.implement', $module, self::inDebugMode() ); } /** @@ -1191,13 +1244,13 @@ MESSAGE; * * @param mixed $messages Either an associative array mapping message key to value, or a * JSON-encoded message blob containing the same data, wrapped in an XmlJsCode object. - * @return string + * @return string JavaScript code */ public static function makeMessageSetScript( $messages ) { return Xml::encodeJsCall( 'mw.messages.set', [ (object)$messages ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } @@ -1247,20 +1300,20 @@ MESSAGE; * * @param string $name * @param string $state - * @return string + * @return string JavaScript code */ public static function makeLoaderStateScript( $name, $state = null ) { if ( is_array( $name ) ) { return Xml::encodeJsCall( 'mw.loader.state', [ $name ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { return Xml::encodeJsCall( 'mw.loader.state', [ $name, $state ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1277,7 +1330,7 @@ MESSAGE; * @param string $group Group which the module is in. * @param string $source Source of the module, or 'local' if not foreign. * @param string $script JavaScript code - * @return string + * @return string JavaScript code */ public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script @@ -1286,7 +1339,7 @@ MESSAGE; return Xml::encodeJsCall( "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )", [ $name, $version, $dependencies, $group, $source ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } @@ -1349,7 +1402,7 @@ MESSAGE; * @param string $group Group which the module is in * @param string $source Source of the module, or 'local' if not foreign * @param string $skip Script body of the skip function - * @return string + * @return string JavaScript code */ public static function makeLoaderRegisterScript( $name, $version = null, $dependencies = null, $group = null, $source = null, $skip = null @@ -1378,7 +1431,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.register', [ $name ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { $registration = [ $name, $version, $dependencies, $group, $source, $skip ]; @@ -1386,7 +1439,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.register', $registration, - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1403,20 +1456,20 @@ MESSAGE; * * @param string $id Source ID * @param string $loadUrl load.php url - * @return string + * @return string JavaScript code */ public static function makeLoaderSourcesScript( $id, $loadUrl = null ) { if ( is_array( $id ) ) { return Xml::encodeJsCall( 'mw.loader.addSource', [ $id ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { return Xml::encodeJsCall( 'mw.loader.addSource', [ $id, $loadUrl ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1427,7 +1480,7 @@ MESSAGE; * * @deprecated since 1.25; use makeInlineScript instead * @param string $script JavaScript code - * @return string + * @return string JavaScript code */ public static function makeLoaderConditionalScript( $script ) { return '(window.RLQ=window.RLQ||[]).push(function(){' . @@ -1457,13 +1510,13 @@ MESSAGE; * the given value. * * @param array $configuration List of configuration values keyed by variable name - * @return string + * @return string JavaScript code */ public static function makeConfigSetScript( array $configuration ) { return Xml::encodeJsCall( 'mw.config.set', [ $configuration ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } diff --git a/includes/resourceloader/ResourceLoaderClientHtml.php b/includes/resourceloader/ResourceLoaderClientHtml.php index 8c792ad3c1..06f9841d44 100644 --- a/includes/resourceloader/ResourceLoaderClientHtml.php +++ b/includes/resourceloader/ResourceLoaderClientHtml.php @@ -109,7 +109,7 @@ class ResourceLoaderClientHtml { * * See OutputPage::buildExemptModules() for use cases. * - * @param array $modules Module state keyed by module name + * @param array $states Module state keyed by module name */ public function setExemptStates( array $states ) { $this->exemptStates = $states; @@ -149,9 +149,7 @@ class ResourceLoaderClientHtml { continue; } - $group = $module->getGroup(); - - if ( $group === 'private' ) { + if ( $module->shouldEmbedModule( $this->context ) ) { // Embed via mw.loader.implement per T36907. $data['embed']['general'][] = $name; // Avoid duplicate request from mw.loader @@ -170,22 +168,23 @@ class ResourceLoaderClientHtml { if ( $module->getType() !== ResourceLoaderModule::LOAD_STYLES ) { $logger = $rl->getLogger(); - $logger->debug( 'Unexpected general module "{module}" in styles queue.', [ + $logger->error( 'Unexpected general module "{module}" in styles queue.', [ 'module' => $name, ] ); - } else { - // Stylesheet doesn't trigger mw.loader callback. - // Set "ready" state to allow dependencies and avoid duplicate requests. (T87871) - $data['states'][$name] = 'ready'; + continue; } + // Stylesheet doesn't trigger mw.loader callback. + // Set "ready" state to allow dependencies and avoid duplicate requests. (T87871) + $data['states'][$name] = 'ready'; + $group = $module->getGroup(); $context = $this->getContext( $group, ResourceLoaderModule::TYPE_STYLES ); if ( $module->isKnownEmpty( $context ) ) { // Avoid needless request for empty module $data['states'][$name] = 'ready'; } else { - if ( $group === 'private' ) { + if ( $module->shouldEmbedModule( $this->context ) ) { // Embed via style element $data['embed']['styles'][] = $name; // Avoid duplicate request from mw.loader @@ -369,7 +368,6 @@ class ResourceLoaderClientHtml { sort( $modules ); if ( $mainContext->getDebug() && count( $modules ) > 1 ) { - $chunks = []; // Recursively call us for every item foreach ( $modules as $name ) { @@ -392,62 +390,75 @@ class ResourceLoaderClientHtml { foreach ( $sortedModules as $source => $groups ) { foreach ( $groups as $group => $grpModules ) { $context = self::makeContext( $mainContext, $group, $only, $extraQuery ); - $context->setModules( array_keys( $grpModules ) ); - - if ( $group === 'private' ) { - // Decide whether to use style or script element - if ( $only == ResourceLoaderModule::TYPE_STYLES ) { - $chunks[] = Html::inlineStyle( - $rl->makeModuleResponse( $context, $grpModules ) - ); - } else { - $chunks[] = ResourceLoader::makeInlineScript( - $rl->makeModuleResponse( $context, $grpModules ) - ); - } - continue; - } - - // See if we have one or more raw modules - $isRaw = false; - foreach ( $grpModules as $key => $module ) { - $isRaw |= $module->isRaw(); - } - // Special handling for the user group; because users might change their stuff - // on-wiki like user pages, or user preferences; we need to find the highest - // timestamp of these user-changeable modules so we can ensure cache misses on change - // This should NOT be done for the site group (T29564) because anons get that too - // and we shouldn't be putting timestamps in CDN-cached HTML - if ( $group === 'user' ) { - // Must setModules() before makeVersionQuery() - $context->setVersion( $rl->makeVersionQuery( $context ) ); + // Separate sets of linked and embedded modules while preserving order + $moduleSets = []; + $idx = -1; + foreach ( $grpModules as $name => $module ) { + $shouldEmbed = $module->shouldEmbedModule( $context ); + if ( !$moduleSets || $moduleSets[$idx][0] !== $shouldEmbed ) { + $moduleSets[++$idx] = [ $shouldEmbed, [] ]; + } + $moduleSets[$idx][1][$name] = $module; } - $url = $rl->createLoaderURL( $source, $context, $extraQuery ); - - // Decide whether to use 'style' or 'script' element - if ( $only === ResourceLoaderModule::TYPE_STYLES ) { - $chunk = Html::linkedStyle( $url ); - } else { - if ( $context->getRaw() || $isRaw ) { - $chunk = Html::element( 'script', [ - // In SpecialJavaScriptTest, QUnit must load synchronous - 'async' => !isset( $extraQuery['sync'] ), - 'src' => $url - ] ); + // Link/embed each set + foreach ( $moduleSets as list( $embed, $moduleSet ) ) { + $context->setModules( array_keys( $moduleSet ) ); + if ( $embed ) { + // Decide whether to use style or script element + if ( $only == ResourceLoaderModule::TYPE_STYLES ) { + $chunks[] = Html::inlineStyle( + $rl->makeModuleResponse( $context, $moduleSet ) + ); + } else { + $chunks[] = ResourceLoader::makeInlineScript( + $rl->makeModuleResponse( $context, $moduleSet ) + ); + } } else { - $chunk = ResourceLoader::makeInlineScript( - Xml::encodeJsCall( 'mw.loader.load', [ $url ] ) - ); + // See if we have one or more raw modules + $isRaw = false; + foreach ( $moduleSet as $key => $module ) { + $isRaw |= $module->isRaw(); + } + + // Special handling for the user group; because users might change their stuff + // on-wiki like user pages, or user preferences; we need to find the highest + // timestamp of these user-changeable modules so we can ensure cache misses on change + // This should NOT be done for the site group (T29564) because anons get that too + // and we shouldn't be putting timestamps in CDN-cached HTML + if ( $group === 'user' ) { + // Must setModules() before makeVersionQuery() + $context->setVersion( $rl->makeVersionQuery( $context ) ); + } + + $url = $rl->createLoaderURL( $source, $context, $extraQuery ); + + // Decide whether to use 'style' or 'script' element + if ( $only === ResourceLoaderModule::TYPE_STYLES ) { + $chunk = Html::linkedStyle( $url ); + } else { + if ( $context->getRaw() || $isRaw ) { + $chunk = Html::element( 'script', [ + // In SpecialJavaScriptTest, QUnit must load synchronous + 'async' => !isset( $extraQuery['sync'] ), + 'src' => $url + ] ); + } else { + $chunk = ResourceLoader::makeInlineScript( + Xml::encodeJsCall( 'mw.loader.load', [ $url ] ) + ); + } + } + + if ( $group == 'noscript' ) { + $chunks[] = Html::rawElement( 'noscript', [], $chunk ); + } else { + $chunks[] = $chunk; + } } } - - if ( $group == 'noscript' ) { - $chunks[] = Html::rawElement( 'noscript', [], $chunk ); - } else { - $chunks[] = $chunk; - } } } diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php index 8955b8c2a0..cbb0beca8d 100644 --- a/includes/resourceloader/ResourceLoaderContext.php +++ b/includes/resourceloader/ResourceLoaderContext.php @@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices; * Object passed around to modules which contains information about the state * of a specific loader request. */ -class ResourceLoaderContext { +class ResourceLoaderContext implements MessageLocalizer { protected $resourceLoader; protected $request; protected $logger; @@ -222,10 +222,12 @@ class ResourceLoaderContext { * Get a Message object with context set. See wfMessage for parameters. * * @since 1.27 - * @param mixed ... + * @param string|string[]|MessageSpecifier $key Message key, or array of keys, + * or a MessageSpecifier. + * @param mixed $args,... * @return Message */ - public function msg() { + public function msg( $key ) { return call_user_func_array( 'wfMessage', func_get_args() ) ->inLanguage( $this->getLanguage() ) // Use a dummy title because there is no real title diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php index 725bc6a05e..4675191884 100644 --- a/includes/resourceloader/ResourceLoaderFileModule.php +++ b/includes/resourceloader/ResourceLoaderFileModule.php @@ -580,6 +580,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { 'fileHashes' => $this->getFileHashes( $context ), 'messageBlob' => $this->getMessageBlob( $context ), ]; + + $lessVars = $this->getLessVars( $context ); + if ( $lessVars ) { + $summary[] = [ 'lessVars' => $lessVars ]; + } + return $summary; } @@ -980,18 +986,19 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { $files = $compiler->AllParsedFiles(); $this->localFileRefs = array_merge( $this->localFileRefs, $files ); + // Cache for 24 hours (86400 seconds). $cache->set( $cacheKey, [ 'css' => $css, 'files' => $files, 'hash' => FileContentsHasher::getFileContentsHash( $files ), - ], 60 * 60 * 24 ); // 86400 seconds, or 24 hours. + ], 3600 * 24 ); return $css; } /** * Takes named templates by the module and returns an array mapping. - * @return array of templates mapping template alias to content + * @return array Templates mapping template alias to content * @throws MWException */ public function getTemplates() { @@ -1022,7 +1029,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule { * the BOM character is not valid in the middle of a string. * We already assume UTF-8 everywhere, so this should be safe. * - * @return string input minus the intial BOM char + * @param string $input + * @return string Input minus the intial BOM char */ protected function stripBom( $input ) { if ( substr_compare( "\xef\xbb\xbf", $input, 0, 3 ) === 0 ) { diff --git a/includes/resourceloader/ResourceLoaderImage.php b/includes/resourceloader/ResourceLoaderImage.php index 2503b22e59..072ae7944b 100644 --- a/includes/resourceloader/ResourceLoaderImage.php +++ b/includes/resourceloader/ResourceLoaderImage.php @@ -67,23 +67,27 @@ class ResourceLoaderImage { } } } + // Remove 'deprecated' key + if ( is_array( $this->descriptor ) ) { + unset( $this->descriptor[ 'deprecated' ] ); + } // Ensure that all files have common extension. $extensions = []; - $descriptor = (array)$descriptor; + $descriptor = (array)$this->descriptor; array_walk_recursive( $descriptor, function ( $path ) use ( &$extensions ) { $extensions[] = pathinfo( $path, PATHINFO_EXTENSION ); } ); $extensions = array_unique( $extensions ); if ( count( $extensions ) !== 1 ) { throw new InvalidArgumentException( - "File type for different image files of '$name' not the same" + "File type for different image files of '$name' not the same in module '$module'" ); } $ext = $extensions[0]; if ( !isset( self::$fileTypes[$ext] ) ) { throw new InvalidArgumentException( - "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg)" + "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg) in module '$module'" ); } $this->extension = $ext; @@ -144,9 +148,8 @@ class ResourceLoaderImage { public function getExtension( $format = 'original' ) { if ( $format === 'rasterized' && $this->extension === 'svg' ) { return 'png'; - } else { - return $this->extension; } + return $this->extension; } /** @@ -176,6 +179,7 @@ class ResourceLoaderImage { 'variant' => $variant, 'format' => $format, 'lang' => $context->getLanguage(), + 'skin' => $context->getSkin(), 'version' => $context->getVersion(), ]; diff --git a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php index a3b059b7bf..01476ed17c 100644 --- a/includes/resourceloader/ResourceLoaderJqueryMsgModule.php +++ b/includes/resourceloader/ResourceLoaderJqueryMsgModule.php @@ -18,7 +18,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Brad Jorsch */ /** @@ -43,9 +42,26 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule { ) ); - $dataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] ); + $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] ); - return $fileScript . $dataScript; + // Associative array mapping magic words (e.g. SITENAME) + // to their values. + $magicWords = [ + 'SITENAME' => $this->getConfig()->get( 'Sitename' ), + ]; + + Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] ); + + $magicWordExtendData = [ + 'magic' => $magicWords, + ]; + + $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ + $magicWordExtendData, + /* deep= */ true + ] ); + + return $fileScript . $mainDataScript . $magicWordDataScript; } /** diff --git a/includes/resourceloader/ResourceLoaderMediaWikiUtilModule.php b/includes/resourceloader/ResourceLoaderMediaWikiUtilModule.php new file mode 100644 index 0000000000..d16a4ff763 --- /dev/null +++ b/includes/resourceloader/ResourceLoaderMediaWikiUtilModule.php @@ -0,0 +1,53 @@ + $this->getConfig()->get( 'FragmentMode' ) ] + ) + . "\n" + . parent::getScript( $context ); + } + + /** + * @inheritDoc + */ + public function supportsURLLoading() { + return false; + } + + /** + * @inheritDoc + */ + public function enableModuleContentVersion() { + return true; + } +} diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php index a2b4b1d67f..b3c1cd14b7 100644 --- a/includes/resourceloader/ResourceLoaderModule.php +++ b/includes/resourceloader/ResourceLoaderModule.php @@ -147,8 +147,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { if ( $deprecationInfo ) { $name = $this->getName(); $warning = 'This page is using the deprecated ResourceLoader module "' . $name . '".'; - if ( !is_bool( $deprecationInfo ) && isset( $deprecationInfo['message'] ) ) { - $warning .= "\n" . $deprecationInfo['message']; + if ( is_string( $deprecationInfo ) ) { + $warning .= "\n" . $deprecationInfo; } return Xml::encodeJsCall( 'mw.log.warn', @@ -461,7 +461,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { * @param array $localFileRefs List of files */ protected function saveFileDependencies( ResourceLoaderContext $context, $localFileRefs ) { - try { // Related bugs and performance considerations: // 1. Don't needlessly change the database value with the same list in a @@ -587,6 +586,81 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { $this->msgBlobs[$lang] = $blob; } + /** + * Get headers to send as part of a module web response. + * + * It is not supported to send headers through this method that are + * required to be unique or otherwise sent once in an HTTP response + * because clients may make batch requests for multiple modules (as + * is the default behaviour for ResourceLoader clients). + * + * For exclusive or aggregated headers, see ResourceLoader::sendResponseHeaders(). + * + * @since 1.30 + * @param ResourceLoaderContext $context + * @return string[] Array of HTTP response headers + */ + final public function getHeaders( ResourceLoaderContext $context ) { + $headers = []; + + $formattedLinks = []; + foreach ( $this->getPreloadLinks( $context ) as $url => $attribs ) { + $link = "<{$url}>;rel=preload"; + foreach ( $attribs as $key => $val ) { + $link .= ";{$key}={$val}"; + } + $formattedLinks[] = $link; + } + if ( $formattedLinks ) { + $headers[] = 'Link: ' . implode( ',', $formattedLinks ); + } + + return $headers; + } + + /** + * Get a list of resources that web browsers may preload. + * + * Behaviour of rel=preload link is specified at . + * + * Use case for ResourceLoader originally part of T164299. + * + * @par Example + * @code + * protected function getPreloadLinks() { + * return [ + * 'https://example.org/script.js' => [ 'as' => 'script' ], + * 'https://example.org/image.png' => [ 'as' => 'image' ], + * ]; + * } + * @encode + * + * @par Example using HiDPI image variants + * @code + * protected function getPreloadLinks() { + * return [ + * 'https://example.org/logo.png' => [ + * 'as' => 'image', + * 'media' => 'not all and (min-resolution: 2dppx)', + * ], + * 'https://example.org/logo@2x.png' => [ + * 'as' => 'image', + * 'media' => '(min-resolution: 2dppx)', + * ], + * ]; + * } + * @encode + * + * @see ResourceLoaderModule::getHeaders + * @since 1.30 + * @param ResourceLoaderContext $context + * @return array Keyed by url, values must be an array containing + * at least an 'as' key. Optionally a 'media' key as well. + */ + protected function getPreloadLinks( ResourceLoaderContext $context ) { + return []; + } + /** * Get module-specific LESS variables, if any. * @@ -624,7 +698,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { */ final protected function buildContent( ResourceLoaderContext $context ) { $rl = $context->getResourceLoader(); - $stats = RequestContext::getMain()->getStats(); + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); $statStart = microtime( true ); // Only include properties that are relevant to this context (e.g. only=scripts) @@ -643,16 +717,18 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { $scripts = $this->getScriptURLsForDebug( $context ); } else { $scripts = $this->getScript( $context ); - // rtrim() because there are usually a few line breaks - // after the last ';'. A new line at EOF, a new line - // added by ResourceLoaderFileModule::readScriptFiles, etc. + // Make the script safe to concatenate by making sure there is at least one + // trailing new line at the end of the content. Previously, this looked for + // a semi-colon instead, but that breaks concatenation if the semicolon + // is inside a comment like "// foo();". Instead, simply use a + // line break as separator which matches JavaScript native logic for implicitly + // ending statements even if a semi-colon is missing. + // Bugs: T29054, T162719. if ( is_string( $scripts ) && strlen( $scripts ) - && substr( rtrim( $scripts ), -1 ) !== ';' + && substr( $scripts, -1 ) !== "\n" ) { - // Append semicolon to prevent weird bugs caused by files not - // terminating their statements right (T29054) - $scripts .= ";\n"; + $scripts .= "\n"; } } $content['scripts'] = $scripts; @@ -710,6 +786,11 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { $content['templates'] = $templates; } + $headers = $this->getHeaders( $context ); + if ( $headers ) { + $content['headers'] = $headers; + } + $statTiming = microtime( true ) - $statStart; $statName = strtr( $this->getName(), '.', '_' ); $stats->timing( "resourceloader_build.all", 1000 * $statTiming ); @@ -755,7 +836,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { // (e.g. startup module) iterate more than once over all modules to get versions. $contextHash = $context->getHash(); if ( !array_key_exists( $contextHash, $this->versionHash ) ) { - if ( $this->enableModuleContentVersion() ) { // Detect changes directly $str = json_encode( $this->getModuleContent( $context ) ); @@ -918,6 +998,20 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { return false; } + /** + * Check whether this module should be embeded rather than linked + * + * Modules returning true here will be embedded rather than loaded by + * ResourceLoaderClientHtml. + * + * @since 1.30 + * @param ResourceLoaderContext $context + * @return bool + */ + public function shouldEmbedModule( ResourceLoaderContext $context ) { + return $this->getGroup() === 'private'; + } + /** @var JSParser Lazy-initialized; use self::javaScriptParser() */ private static $jsParser; private static $parseCacheVersion = 1; @@ -931,36 +1025,33 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface { * @return string JS with the original, or a replacement error */ protected function validateScriptFile( $fileName, $contents ) { - if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) { - // Try for cache hit - $cache = ObjectCache::getMainWANInstance(); - $key = $cache->makeKey( + if ( !$this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) { + return $contents; + } + $cache = ObjectCache::getMainWANInstance(); + return $cache->getWithSetCallback( + $cache->makeGlobalKey( 'resourceloader', 'jsparse', self::$parseCacheVersion, - md5( $contents ) - ); - $cacheEntry = $cache->get( $key ); - if ( is_string( $cacheEntry ) ) { - return $cacheEntry; - } - - $parser = self::javaScriptParser(); - try { - $parser->parse( $contents, $fileName, 1 ); - $result = $contents; - } catch ( Exception $e ) { - // We'll save this to cache to avoid having to validate broken JS over and over... - $err = $e->getMessage(); - $result = "mw.log.error(" . - Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");"; + md5( $contents ), + $fileName + ), + $cache::TTL_WEEK, + function () use ( $contents, $fileName ) { + $parser = self::javaScriptParser(); + try { + $parser->parse( $contents, $fileName, 1 ); + $result = $contents; + } catch ( Exception $e ) { + // We'll save this to cache to avoid having to re-validate broken JS + $err = $e->getMessage(); + $result = "mw.log.error(" . + Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");"; + } + return $result; } - - $cache->set( $key, $result ); - return $result; - } else { - return $contents; - } + ); } /** diff --git a/includes/resourceloader/ResourceLoaderOOUIFileModule.php b/includes/resourceloader/ResourceLoaderOOUIFileModule.php new file mode 100644 index 0000000000..e97e074201 --- /dev/null +++ b/includes/resourceloader/ResourceLoaderOOUIFileModule.php @@ -0,0 +1,98 @@ +getSkinSpecific( $options[ 'themeScripts' ], 'scripts' ); + if ( !isset( $options['skinScripts'] ) ) { + $options['skinScripts'] = []; + } + $this->extendSkinSpecific( $options['skinScripts'], $skinScripts ); + } + if ( isset( $options[ 'themeStyles' ] ) ) { + $skinStyles = $this->getSkinSpecific( $options[ 'themeStyles' ], 'styles' ); + if ( !isset( $options['skinStyles'] ) ) { + $options['skinStyles'] = []; + } + $this->extendSkinSpecific( $options['skinStyles'], $skinStyles ); + } + + parent::__construct( $options ); + } + + /** + * Helper function to generate values for 'skinStyles' and 'skinScripts'. + * + * @param string $module Module to generate skinStyles/skinScripts for: + * 'core', 'widgets', 'toolbars', 'windows' + * @param string $which 'scripts' or 'styles' + * @return array + */ + private function getSkinSpecific( $module, $which ) { + $themes = self::getSkinThemeMap(); + + return array_combine( + array_keys( $themes ), + array_map( function ( $theme ) use ( $module, $which ) { + if ( $which === 'scripts' ) { + return $this->getThemeScriptsPath( $theme, $module ); + } else { + return $this->getThemeStylesPath( $theme, $module ); + } + }, array_values( $themes ) ) + ); + } + + /** + * Prepend the $extraSkinSpecific assoc. array to the $skinSpecific assoc. array. + * Both of them represent a 'skinScripts' or 'skinStyles' definition. + * + * @param array &$skinSpecific + * @param array $extraSkinSpecific + */ + private function extendSkinSpecific( &$skinSpecific, $extraSkinSpecific ) { + // For each skin where skinStyles/skinScripts are defined, add our ones at the beginning + foreach ( $skinSpecific as $skin => $files ) { + if ( !is_array( $files ) ) { + $files = [ $files ]; + } + if ( isset( $extraSkinSpecific[$skin] ) ) { + $skinSpecific[$skin] = array_merge( [ $extraSkinSpecific[$skin] ], $files ); + } elseif ( isset( $extraSkinSpecific['default'] ) ) { + $skinSpecific[$skin] = array_merge( [ $extraSkinSpecific['default'] ], $files ); + } + } + // Add our remaining skinStyles/skinScripts for skins that did not have them defined + foreach ( $extraSkinSpecific as $skin => $file ) { + if ( !isset( $skinSpecific[$skin] ) ) { + $skinSpecific[$skin] = $file; + } + } + } +} diff --git a/includes/resourceloader/ResourceLoaderOOUIImageModule.php b/includes/resourceloader/ResourceLoaderOOUIImageModule.php index 29f5ccedb5..ee87d8d8e8 100644 --- a/includes/resourceloader/ResourceLoaderOOUIImageModule.php +++ b/includes/resourceloader/ResourceLoaderOOUIImageModule.php @@ -24,24 +24,31 @@ * @since 1.26 */ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { + use ResourceLoaderOOUIModule; + protected function loadFromDefinition() { if ( $this->definition === null ) { // Do nothing if definition was already processed return; } - // Core default themes - $themes = [ 'default' => 'mediawiki' ]; - $themes += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' ); + $themes = self::getSkinThemeMap(); - $name = $this->definition['name']; - $rootPath = $this->definition['rootPath']; + // For backwards-compatibility, allow missing 'themeImages' + $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : ''; $definition = []; foreach ( $themes as $skin => $theme ) { // Find the path to the JSON file which contains the actual image definitions for this theme - // TODO Allow extensions to specify this path somehow - $dataPath = $rootPath . '/' . $theme . '/' . $name . '.json'; + if ( $module ) { + $dataPath = $this->getThemeImagesPath( $theme, $module ); + } else { + // Backwards-compatibility for things that probably shouldn't have used this class... + $dataPath = + $this->definition['rootPath'] . '/' . + strtolower( $theme ) . '/' . + $this->definition['name'] . '.json'; + } $localDataPath = $this->localBasePath . '/' . $dataPath; // If there's no file for this module of this theme, that's okay, it will just use the defaults @@ -79,7 +86,7 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { } elseif ( $definition[$key] !== $data[$key] ) { throw new Exception( "Mismatched OOUI theme images definition: " . - "key '$key' of theme '$theme' " . + "key '$key' of theme '$theme' for module '$module' " . "does not match other themes" ); } @@ -88,6 +95,16 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule { } } + // Extra selectors to allow using the same icons for old-style MediaWiki UI code + if ( substr( $module, 0, 5 ) === 'icons' ) { + $definition['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before'; + $definition['selectorWithVariant'] = ' + .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before, + /* Hack for Flow, see T110051 */ + .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, + .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before'; + } + // Fields from module definition silently override keys from JSON files $this->definition += $definition; diff --git a/includes/resourceloader/ResourceLoaderOOUIModule.php b/includes/resourceloader/ResourceLoaderOOUIModule.php new file mode 100644 index 0000000000..4228a45f28 --- /dev/null +++ b/includes/resourceloader/ResourceLoaderOOUIModule.php @@ -0,0 +1,146 @@ + 'WikimediaUI', + ]; + + // Note that keys must be TitleCase. + protected static $builtinThemePaths = [ + 'WikimediaUI' => [ + 'scripts' => 'resources/lib/oojs-ui/oojs-ui-wikimediaui.js', + 'styles' => 'resources/lib/oojs-ui/oojs-ui-{module}-wikimediaui.css', + 'images' => 'resources/lib/oojs-ui/themes/wikimediaui/{module}.json', + ], + 'Apex' => [ + 'scripts' => 'resources/lib/oojs-ui/oojs-ui-apex.js', + 'styles' => 'resources/lib/oojs-ui/oojs-ui-{module}-apex.css', + 'images' => 'resources/lib/oojs-ui/themes/apex/{module}.json', + ], + ]; + + /** + * Return a map of skin names (in lowercase) to OOUI theme names, defining which theme a given + * skin should use. + * + * @return array + */ + public static function getSkinThemeMap() { + $themeMap = self::$builtinSkinThemeMap; + $themeMap += ExtensionRegistry::getInstance()->getAttribute( 'SkinOOUIThemes' ); + return $themeMap; + } + + /** + * Return a map of theme names to lists of paths from which a given theme should be loaded. + * + * Keys are theme names, values are associative arrays. Keys of the inner array are 'scripts', + * 'styles', or 'images', and values are string paths. + * + * Additionally, the string '{module}' in paths represents the name of the module to load. + * + * @return array + */ + protected static function getThemePaths() { + $themePaths = self::$builtinThemePaths; + return $themePaths; + } + + /** + * Return a path to load given module of given theme from. + * + * @param string $theme OOUI theme name, for example 'WikimediaUI' or 'Apex' + * @param string $kind Kind of the module: 'scripts', 'styles', or 'images' + * @param string $module Module name, for valid values see $knownScriptsModules, + * $knownStylesModules, $knownImagesModules + * @return string + */ + protected function getThemePath( $theme, $kind, $module ) { + $paths = self::getThemePaths(); + $path = $paths[ $theme ][ $kind ]; + $path = str_replace( '{module}', $module, $path ); + return $path; + } + + /** + * @param string $theme See getThemePath() + * @param string $module See getThemePath() + * @return string + */ + protected function getThemeScriptsPath( $theme, $module ) { + if ( !in_array( $module, self::$knownScriptsModules ) ) { + throw new InvalidArgumentException( "Invalid OOUI scripts module '$module'" ); + } + return $this->getThemePath( $theme, 'scripts', $module ); + } + + /** + * @param string $theme See getThemePath() + * @param string $module See getThemePath() + * @return string + */ + protected function getThemeStylesPath( $theme, $module ) { + if ( !in_array( $module, self::$knownStylesModules ) ) { + throw new InvalidArgumentException( "Invalid OOUI styles module '$module'" ); + } + return $this->getThemePath( $theme, 'styles', $module ); + } + + /** + * @param string $theme See getThemePath() + * @param string $module See getThemePath() + * @return string + */ + protected function getThemeImagesPath( $theme, $module ) { + if ( !in_array( $module, self::$knownImagesModules ) ) { + throw new InvalidArgumentException( "Invalid OOUI images module '$module'" ); + } + return $this->getThemePath( $theme, 'images', $module ); + } +} diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php index 7401d58e70..08641b0c30 100644 --- a/includes/resourceloader/ResourceLoaderSiteModule.php +++ b/includes/resourceloader/ResourceLoaderSiteModule.php @@ -42,7 +42,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule { return $pages; } - /* + /** * @return array */ public function getDependencies( ResourceLoaderContext $context = null ) { diff --git a/includes/resourceloader/ResourceLoaderSkinModule.php b/includes/resourceloader/ResourceLoaderSkinModule.php index 91e63e70aa..ca6e59f2bf 100644 --- a/includes/resourceloader/ResourceLoaderSkinModule.php +++ b/includes/resourceloader/ResourceLoaderSkinModule.php @@ -22,51 +22,104 @@ */ class ResourceLoaderSkinModule extends ResourceLoaderFileModule { - - /* Methods */ + /** + * All skins are assumed to be compatible with mobile + */ + public $targets = [ 'desktop', 'mobile' ]; /** * @param ResourceLoaderContext $context * @return array */ public function getStyles( ResourceLoaderContext $context ) { - $conf = $this->getConfig(); - $logo = $conf->get( 'Logo' ); - $logoHD = $conf->get( 'LogoHD' ); - - $logo1 = OutputPage::transformResourcePath( $conf, $logo ); - $logo15 = OutputPage::transformResourcePath( $conf, $logoHD['1.5x'] ); - $logo2 = OutputPage::transformResourcePath( $conf, $logoHD['2x'] ); - + $logo = $this->getLogo( $this->getConfig() ); $styles = parent::getStyles( $context ); + $this->normalizeStyles( $styles ); + + $default = !is_array( $logo ) ? $logo : $logo['1x']; $styles['all'][] = '.mw-wiki-logo { background-image: ' . - CSSMin::buildUrlValue( $logo1 ) . - '; }'; - if ( $logoHD ) { - if ( isset( $logoHD['1.5x'] ) ) { + CSSMin::buildUrlValue( $default ) . + '; }'; + + if ( is_array( $logo ) ) { + if ( isset( $logo['1.5x'] ) ) { $styles[ '(-webkit-min-device-pixel-ratio: 1.5), ' . '(min--moz-device-pixel-ratio: 1.5), ' . '(min-resolution: 1.5dppx), ' . '(min-resolution: 144dpi)' ][] = '.mw-wiki-logo { background-image: ' . - CSSMin::buildUrlValue( $logo15 ) . ';' . + CSSMin::buildUrlValue( $logo['1.5x'] ) . ';' . 'background-size: 135px auto; }'; } - if ( isset( $logoHD['2x'] ) ) { + if ( isset( $logo['2x'] ) ) { $styles[ '(-webkit-min-device-pixel-ratio: 2), ' . '(min--moz-device-pixel-ratio: 2),' . '(min-resolution: 2dppx), ' . '(min-resolution: 192dpi)' ][] = '.mw-wiki-logo { background-image: ' . - CSSMin::buildUrlValue( $logo2 ) . ';' . + CSSMin::buildUrlValue( $logo['2x'] ) . ';' . 'background-size: 135px auto; }'; } } + return $styles; } + /** + * Ensure all media keys use array values. + * + * Normalises arrays returned by the ResourceLoaderFileModule::getStyles() method. + * + * @param array &$styles Associative array, keys are strings (media queries), + * values are strings or arrays + */ + private function normalizeStyles( &$styles ) { + foreach ( $styles as $key => $val ) { + if ( !is_array( $val ) ) { + $styles[$key] = [ $val ]; + } + } + } + + /** + * @param Config $conf + * @return string|array Single url if no variants are defined + * or array of logo urls keyed by dppx in form "x". + * Key "1x" is always defined. + */ + public static function getLogo( Config $conf ) { + $logo = $conf->get( 'Logo' ); + $logoHD = $conf->get( 'LogoHD' ); + + $logo1Url = OutputPage::transformResourcePath( $conf, $logo ); + + if ( !$logoHD ) { + return $logo1Url; + } + + $logoUrls = [ + '1x' => $logo1Url, + ]; + + // Only 1.5x and 2x are supported + if ( isset( $logoHD['1.5x'] ) ) { + $logoUrls['1.5x'] = OutputPage::transformResourcePath( + $conf, + $logoHD['1.5x'] + ); + } + if ( isset( $logoHD['2x'] ) ) { + $logoUrls['2x'] = OutputPage::transformResourcePath( + $conf, + $logoHD['2x'] + ); + } + + return $logoUrls; + } + /** * @param ResourceLoaderContext $context * @return bool @@ -77,13 +130,12 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule { return false; } - /** - * @param ResourceLoaderContext $context - * @return string: Hash - */ - public function getModifiedHash( ResourceLoaderContext $context ) { - $logo = $this->getConfig()->get( 'Logo' ); - $logoHD = $this->getConfig()->get( 'LogoHD' ); - return md5( parent::getModifiedHash( $context ) . $logo . json_encode( $logoHD ) ); + public function getDefinitionSummary( ResourceLoaderContext $context ) { + $summary = parent::getDefinitionSummary( $context ); + $summary[] = [ + 'logo' => $this->getConfig()->get( 'Logo' ), + 'logoHD' => $this->getConfig()->get( 'LogoHD' ), + ]; + return $summary; } } diff --git a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php index 44371bbee2..a0061e3531 100644 --- a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php +++ b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php @@ -93,6 +93,7 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule { 'special-characters-group-thai', 'special-characters-group-lao', 'special-characters-group-khmer', + 'special-characters-group-canadianaboriginal', 'special-characters-title-endash', 'special-characters-title-emdash', 'special-characters-title-minus' diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 48e4a0ded7..8973fe31c3 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -33,7 +33,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { * @return array */ protected function getConfigSettings( $context ) { - $hash = $context->getHash(); if ( isset( $this->configVars[$hash] ) ) { return $this->configVars[$hash]; @@ -112,7 +111,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 'wgIllegalFileChars' => Title::convertByteClassToUnicodeClass( $illegalFileChars ), 'wgResourceLoaderStorageVersion' => $conf->get( 'ResourceLoaderStorageVersion' ), 'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ), - 'wgResourceLoaderLegacyModules' => self::getLegacyModules(), 'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ), 'wgEnableUploads' => $conf->get( 'EnableUploads' ), ]; @@ -136,7 +134,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { // The list of implicit dependencies won't be altered, so we can // cache them without having to worry. if ( !isset( $dependencyCache[$moduleName] ) ) { - if ( !isset( $registryData[$moduleName] ) ) { // Dependencies may not exist $dependencyCache[$moduleName] = []; @@ -330,9 +327,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { */ public static function getStartupModulesUrl( ResourceLoaderContext $context ) { $rl = $context->getResourceLoader(); - $derivative = new DerivativeResourceLoaderContext( $context ); - $derivative->setModules( self::getStartupModules() ); + $derivative->setModules( array_merge( + self::getStartupModules(), + self::getLegacyModules() + ) ); $derivative->setOnly( 'scripts' ); // Must setModules() before makeVersionQuery() $derivative->setVersion( $rl->makeVersionQuery( $derivative ) ); @@ -342,7 +341,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { /** * @param ResourceLoaderContext $context - * @return string + * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { global $IP; diff --git a/includes/resourceloader/ResourceLoaderUploadDialogModule.php b/includes/resourceloader/ResourceLoaderUploadDialogModule.php index 52e221089f..9377ed6e26 100644 --- a/includes/resourceloader/ResourceLoaderUploadDialogModule.php +++ b/includes/resourceloader/ResourceLoaderUploadDialogModule.php @@ -29,6 +29,9 @@ class ResourceLoaderUploadDialogModule extends ResourceLoaderModule { protected $targets = [ 'desktop', 'mobile' ]; + /** + * @return string JavaScript code + */ public function getScript( ResourceLoaderContext $context ) { $config = $context->getResourceLoader()->getConfig(); return ResourceLoader::makeConfigSetScript( [ @@ -36,6 +39,9 @@ class ResourceLoaderUploadDialogModule extends ResourceLoaderModule { ] ); } + /** + * @return bool + */ public function enableModuleContentVersion() { return true; } diff --git a/includes/resourceloader/ResourceLoaderUserDefaultsModule.php b/includes/resourceloader/ResourceLoaderUserDefaultsModule.php index 66320457a5..b9dc098268 100644 --- a/includes/resourceloader/ResourceLoaderUserDefaultsModule.php +++ b/includes/resourceloader/ResourceLoaderUserDefaultsModule.php @@ -37,7 +37,7 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule { /** * @param ResourceLoaderContext $context - * @return string + * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { return Xml::encodeJsCall( diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php index b3b3f16832..0c332cff8d 100644 --- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php +++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php @@ -48,7 +48,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule { /** * @param ResourceLoaderContext $context - * @return string + * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { return Xml::encodeJsCall( 'mw.user.options.set', diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php index cea1f3940b..bfa7326d9c 100644 --- a/includes/resourceloader/ResourceLoaderUserTokensModule.php +++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php @@ -57,7 +57,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule { * Add FILTER_NOMIN annotation to prevent needless minification and caching (T84960). * * @param ResourceLoaderContext $context - * @return string + * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { return Xml::encodeJsCall( diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php index b0d060b788..fd31eac778 100644 --- a/includes/resourceloader/ResourceLoaderWikiModule.php +++ b/includes/resourceloader/ResourceLoaderWikiModule.php @@ -22,6 +22,9 @@ * @author Roan Kattouw */ +use Wikimedia\Rdbms\Database; +use Wikimedia\Rdbms\IDatabase; + /** * Abstraction for ResourceLoader modules which pull from wiki pages * @@ -146,7 +149,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { protected function getContent( $titleText ) { $title = Title::newFromText( $titleText ); if ( !$title ) { - return null; + return null; // Bad title + } + + // If the page is a redirect, follow the redirect. + if ( $title->isRedirect() ) { + $content = $this->getContentObj( $title ); + $title = $content ? $content->getUltimateRedirectTarget() : null; + if ( !$title ) { + return null; // Dead redirect + } } $handler = ContentHandler::getForTitle( $title ); @@ -155,9 +167,22 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { } elseif ( $handler->isSupportedFormat( CONTENT_FORMAT_JAVASCRIPT ) ) { $format = CONTENT_FORMAT_JAVASCRIPT; } else { - return null; + return null; // Bad content model } + $content = $this->getContentObj( $title ); + if ( !$content ) { + return null; // No content found + } + + return $content->serialize( $format ); + } + + /** + * @param Title $title + * @return Content|null + */ + protected function getContentObj( Title $title ) { $revision = Revision::newKnownCurrent( wfGetDB( DB_REPLICA ), $title->getArticleID(), $title->getLatestRevID() ); if ( !$revision ) { @@ -165,18 +190,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule { } $revision->setTitle( $title ); $content = $revision->getContent( Revision::RAW ); - if ( !$content ) { wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' ); return null; } - - return $content->serialize( $format ); + return $content; } /** * @param ResourceLoaderContext $context - * @return string + * @return string JavaScript code */ public function getScript( ResourceLoaderContext $context ) { $scripts = ''; diff --git a/includes/revisiondelete/RevDelArchiveList.php b/includes/revisiondelete/RevDelArchiveList.php index ad9259b307..9afaf404c8 100644 --- a/includes/revisiondelete/RevDelArchiveList.php +++ b/includes/revisiondelete/RevDelArchiveList.php @@ -19,6 +19,8 @@ * @ingroup RevisionDelete */ +use Wikimedia\Rdbms\IDatabase; + /** * List for archive table items, i.e. revisions deleted via action=delete */ diff --git a/includes/revisiondelete/RevDelArchivedFileList.php b/includes/revisiondelete/RevDelArchivedFileList.php index afee6374c9..1d80d8696c 100644 --- a/includes/revisiondelete/RevDelArchivedFileList.php +++ b/includes/revisiondelete/RevDelArchivedFileList.php @@ -19,6 +19,8 @@ * @ingroup RevisionDelete */ +use Wikimedia\Rdbms\IDatabase; + /** * List for filearchive table items */ diff --git a/includes/revisiondelete/RevDelFileList.php b/includes/revisiondelete/RevDelFileList.php index 00cb2e147c..77cf976762 100644 --- a/includes/revisiondelete/RevDelFileList.php +++ b/includes/revisiondelete/RevDelFileList.php @@ -19,6 +19,8 @@ * @ingroup RevisionDelete */ +use Wikimedia\Rdbms\IDatabase; + /** * List for oldimage table items */ diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php index 64a6aec806..a2c58e6741 100644 --- a/includes/revisiondelete/RevDelList.php +++ b/includes/revisiondelete/RevDelList.php @@ -402,7 +402,7 @@ abstract class RevDelList extends RevisionListBase { /** * A hook for setVisibility(): do any necessary updates post-commit. * STUB - * @param array [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ] + * @param array $visibilityChangeMap [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ] * @return Status */ public function doPostCommitUpdates( array $visibilityChangeMap ) { diff --git a/includes/revisiondelete/RevDelLogList.php b/includes/revisiondelete/RevDelLogList.php index ff1d2eda1e..1932778115 100644 --- a/includes/revisiondelete/RevDelLogList.php +++ b/includes/revisiondelete/RevDelLogList.php @@ -19,6 +19,8 @@ * @ingroup RevisionDelete */ +use Wikimedia\Rdbms\IDatabase; + /** * List for logging table items */ diff --git a/includes/revisiondelete/RevDelRevisionList.php b/includes/revisiondelete/RevDelRevisionList.php index 453c6cca70..1ea6a381b5 100644 --- a/includes/revisiondelete/RevDelRevisionList.php +++ b/includes/revisiondelete/RevDelRevisionList.php @@ -20,6 +20,7 @@ */ use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * List for revision table items diff --git a/includes/revisiondelete/RevisionDeleteUser.php b/includes/revisiondelete/RevisionDeleteUser.php index 7f41eb2a1a..7812fb9819 100644 --- a/includes/revisiondelete/RevisionDeleteUser.php +++ b/includes/revisiondelete/RevisionDeleteUser.php @@ -21,6 +21,8 @@ * @ingroup RevisionDelete */ +use Wikimedia\Rdbms\IDatabase; + /** * Backend functions for suppressing and unsuppressing all references to a given user, * used when blocking with HideUser enabled. This was spun out of SpecialBlockip.php diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php index b834c15367..4a807fbc7e 100644 --- a/includes/revisiondelete/RevisionDeleter.php +++ b/includes/revisiondelete/RevisionDeleter.php @@ -98,7 +98,7 @@ class RevisionDeleter { * @param int $field The bitmask describing the single option. * @param int $diff The xor of the old and new bitfields. * @param int $new The new bitfield - * @param array $arr The array to update. + * @param array &$arr The array to update. */ protected static function checkItem( $desc, $field, $diff, $new, &$arr ) { if ( $diff & $field ) { diff --git a/includes/search/NullIndexField.php b/includes/search/NullIndexField.php index 933e0ad332..5ecf5c8929 100644 --- a/includes/search/NullIndexField.php +++ b/includes/search/NullIndexField.php @@ -26,7 +26,7 @@ class NullIndexField implements SearchIndexField { /** * Check if flag is set. - * @param $flag + * @param int $flag * @return int 0 if unset, !=0 if set */ public function checkFlag( $flag ) { @@ -42,4 +42,11 @@ class NullIndexField implements SearchIndexField { public function merge( SearchIndexField $that ) { return $that; } + + /** + * @inheritDoc + */ + public function getEngineHints( SearchEngine $engine ) { + return []; + } } diff --git a/includes/search/PerRowAugmentor.php b/includes/search/PerRowAugmentor.php index 8eb8b17c11..a3979f7b71 100644 --- a/includes/search/PerRowAugmentor.php +++ b/includes/search/PerRowAugmentor.php @@ -12,7 +12,6 @@ class PerRowAugmentor implements ResultSetAugmentor { private $rowAugmentor; /** - * PerRowAugmentor constructor. * @param ResultAugmentor $augmentor Per-result augmentor to use. */ public function __construct( ResultAugmentor $augmentor ) { diff --git a/includes/search/SearchDatabase.php b/includes/search/SearchDatabase.php index 38c60d0bec..643c2c1364 100644 --- a/includes/search/SearchDatabase.php +++ b/includes/search/SearchDatabase.php @@ -21,6 +21,8 @@ * @ingroup Search */ +use Wikimedia\Rdbms\IDatabase; + /** * Base search engine base class for database-backed searches * @ingroup Search @@ -33,7 +35,6 @@ class SearchDatabase extends SearchEngine { protected $db; /** - * Constructor * @param IDatabase $db The database to search from */ public function __construct( IDatabase $db = null ) { @@ -51,7 +52,10 @@ class SearchDatabase extends SearchEngine { * @return string */ protected function filter( $text ) { - $lc = $this->legalSearchChars(); + // List of chars allowed in the search query. + // This must include chars used in the search syntax. + // Usually " (phrase) or * (wildcards) if supported by the engine + $lc = $this->legalSearchChars( self::CHARS_ALL ); return trim( preg_replace( "/[^{$lc}]/", " ", $text ) ); } } diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php index 9817b6cc99..1b9ee6c5db 100644 --- a/includes/search/SearchEngine.php +++ b/includes/search/SearchEngine.php @@ -60,6 +60,12 @@ abstract class SearchEngine { /** @const string profile type for query independent ranking features */ const FT_QUERY_INDEP_PROFILE_TYPE = 'fulltextQueryIndepProfile'; + /** @const int flag for legalSearchChars: includes all chars allowed in a search query */ + const CHARS_ALL = 1; + + /** @const int flag for legalSearchChars: includes all chars allowed in a search term */ + const CHARS_NO_SYNTAX = 2; + /** * Perform a full text search query and return a result set. * If full text searches are not supported or disabled, return null. @@ -72,6 +78,21 @@ abstract class SearchEngine { return null; } + /** + * Perform a title search in the article archive. + * NOTE: these results still should be filtered by + * matching against PageArchive, permissions checks etc + * The results returned by this methods are only sugegstions and + * may not end up being shown to the user. + * + * @param string $term Raw search term + * @return Status + * @since 1.29 + */ + function searchArchiveTitle( $term ) { + return Status::newGood( [] ); + } + /** * Perform a title-only search query and return a result set. * If title searches are not supported or disabled, return null. @@ -117,7 +138,7 @@ abstract class SearchEngine { * @return mixed the feature value or null if unset */ public function getFeatureData( $feature ) { - if ( isset ( $this->features[$feature] ) ) { + if ( isset( $this->features[$feature] ) ) { return $this->features[$feature]; } return null; @@ -191,11 +212,13 @@ abstract class SearchEngine { } /** - * Get chars legal for search. + * Get chars legal for search * NOTE: usage as static is deprecated and preserved only as BC measure + * @param int $type type of search chars (see self::CHARS_ALL + * and self::CHARS_NO_SYNTAX). Defaults to CHARS_ALL * @return string */ - public static function legalSearchChars() { + public static function legalSearchChars( $type = self::CHARS_ALL ) { return "A-Za-z_'.0-9\\x80-\\xFF\\-"; } @@ -221,7 +244,7 @@ abstract class SearchEngine { if ( $namespaces ) { // Filter namespaces to only keep valid ones $validNs = $this->searchableNamespaces(); - $namespaces = array_filter( $namespaces, function( $ns ) use( $validNs ) { + $namespaces = array_filter( $namespaces, function ( $ns ) use( $validNs ) { return $ns < 0 || isset( $validNs[$ns] ); } ); } else { @@ -440,8 +463,8 @@ abstract class SearchEngine { $title = Title::newFromText( $search . 'Dummy' ); if ( $title && $title->getText() == 'Dummy' && $title->getNamespace() != NS_MAIN - && !$title->isExternal() ) - { + && !$title->isExternal() + ) { $ns = [ $title->getNamespace() ]; $search = ''; } else { @@ -449,7 +472,7 @@ abstract class SearchEngine { } } - $ns = array_map( function( $space ) { + $ns = array_map( function ( $space ) { return $space == NS_MEDIA ? NS_FILE : $space; }, $ns ); @@ -535,7 +558,7 @@ abstract class SearchEngine { * @return Title[] */ public function extractTitles( SearchSuggestionSet $completionResults ) { - return $completionResults->map( function( SearchSuggestion $sugg ) { + return $completionResults->map( function ( SearchSuggestion $sugg ) { return $sugg->getSuggestedTitle(); } ); } @@ -543,20 +566,21 @@ abstract class SearchEngine { /** * Process completion search results. * Resolves the titles and rescores. + * @param string $search * @param SearchSuggestionSet $suggestions * @return SearchSuggestionSet */ protected function processCompletionResults( $search, SearchSuggestionSet $suggestions ) { $search = trim( $search ); // preload the titles with LinkBatch - $titles = $suggestions->map( function( SearchSuggestion $sugg ) { + $titles = $suggestions->map( function ( SearchSuggestion $sugg ) { return $sugg->getSuggestedTitle(); } ); $lb = new LinkBatch( $titles ); $lb->setCaller( __METHOD__ ); $lb->execute(); - $results = $suggestions->map( function( SearchSuggestion $sugg ) { + $results = $suggestions->map( function ( SearchSuggestion $sugg ) { return $sugg->getSuggestedTitle()->getPrefixedText(); } ); diff --git a/includes/search/SearchEngineFactory.php b/includes/search/SearchEngineFactory.php index a767bc3130..613d33ca09 100644 --- a/includes/search/SearchEngineFactory.php +++ b/includes/search/SearchEngineFactory.php @@ -1,5 +1,7 @@ mCleanWikitext = $cleanupWikitext; } @@ -287,8 +292,8 @@ class SearchHighlighter { /** * Split text into lines and add it to extracts array * - * @param array $extracts Index -> $line - * @param int $count + * @param array &$extracts Index -> $line + * @param int &$count * @param string $text */ function splitAndAdd( &$extracts, &$count, $text ) { @@ -322,8 +327,8 @@ class SearchHighlighter { * @param string $text * @param int $start * @param int $end - * @param int $posStart (out) actual start position - * @param int $posEnd (out) actual end position + * @param int &$posStart (out) actual start position + * @param int &$posEnd (out) actual end position * @return string */ function extract( $text, $start, $end, &$posStart = null, &$posEnd = null ) { @@ -393,10 +398,10 @@ class SearchHighlighter { * * @param string $pattern Regexp for matching lines * @param array $extracts Extracts to search - * @param int $linesleft Number of extracts to make - * @param int $contextchars Length of snippet - * @param array $out Map for highlighted snippets - * @param array $offsets Map of starting points of snippets + * @param int &$linesleft Number of extracts to make + * @param int &$contextchars Length of snippet + * @param array &$out Map for highlighted snippets + * @param array &$offsets Map of starting points of snippets * @protected */ function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) { @@ -456,6 +461,10 @@ class SearchHighlighter { $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text ); $text = preg_replace( "/''/", "", $text ); + // Note, the previous /<\/?[^>]+>/ is insufficient + // for XSS safety as the HTML tag can span multiple + // search results (T144845). + $text = Sanitizer::escapeHtmlAllowEntities( $text ); return $text; } diff --git a/includes/search/SearchIndexField.php b/includes/search/SearchIndexField.php index 6b5316f009..eb72662508 100644 --- a/includes/search/SearchIndexField.php +++ b/includes/search/SearchIndexField.php @@ -61,7 +61,7 @@ interface SearchIndexField { public function setFlag( $flag, $unset = false ); /** * Check if flag is set. - * @param $flag + * @param int $flag * @return int 0 if unset, !=0 if set */ public function checkFlag( $flag ); @@ -72,4 +72,21 @@ interface SearchIndexField { * @return SearchIndexField|false New definition or false if not mergeable. */ public function merge( SearchIndexField $that ); + + /** + * A list of search engine hints for this field. + * Hints are usually specific to a search engine implementation + * and allow to fine control how the search engine will handle this + * particular field. + * + * For example some search engine permits some optimizations + * at index time by ignoring an update if the updated value + * does not change by more than X% on a numeric value. + * + * @param SearchEngine $engine + * @return array an array of hints generally indexed by hint name. The type of + * values is search engine specific + * @since 1.30 + */ + public function getEngineHints( SearchEngine $engine ); } diff --git a/includes/search/SearchIndexFieldDefinition.php b/includes/search/SearchIndexFieldDefinition.php index 04344fdadd..3e008ae66a 100644 --- a/includes/search/SearchIndexFieldDefinition.php +++ b/includes/search/SearchIndexFieldDefinition.php @@ -39,7 +39,6 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField { private $mergeCallback; /** - * SearchIndexFieldDefinition constructor. * @param string $name Field name * @param int $type Index type */ @@ -82,7 +81,7 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField { /** * Check if flag is set. - * @param $flag + * @param int $flag * @return int 0 if unset, !=0 if set */ public function checkFlag( $flag ) { @@ -140,4 +139,11 @@ abstract class SearchIndexFieldDefinition implements SearchIndexField { public function setMergeCallback( $callback ) { $this->mergeCallback = $callback; } + + /** + * @inheritDoc + */ + public function getEngineHints( SearchEngine $engine ) { + return []; + } } diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php index 5e8fb044b6..57ca06e39f 100644 --- a/includes/search/SearchMssql.php +++ b/includes/search/SearchMssql.php @@ -136,7 +136,7 @@ class SearchMssql extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = $this->legalSearchChars(); + $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); $this->searchTerms = []; # @todo FIXME: This doesn't handle parenthetical expressions. diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php index 36cbbaa856..77dcfe9ce2 100644 --- a/includes/search/SearchMySQL.php +++ b/includes/search/SearchMySQL.php @@ -45,7 +45,7 @@ class SearchMySQL extends SearchDatabase { function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = $this->legalSearchChars(); // Minus format chars + $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *) $searchon = ''; $this->searchTerms = []; @@ -149,8 +149,13 @@ class SearchMySQL extends SearchDatabase { return $regex; } - public static function legalSearchChars() { - return "\"*" . parent::legalSearchChars(); + public static function legalSearchChars( $type = self::CHARS_ALL ) { + $searchChars = parent::legalSearchChars( $type ); + if ( $type === self::CHARS_ALL ) { + // " for phrase, * for wildcard + $searchChars = "\"*" . $searchChars; + } + return $searchChars; } /** @@ -213,7 +218,7 @@ class SearchMySQL extends SearchDatabase { /** * Add special conditions - * @param array $query + * @param array &$query * @since 1.18 */ protected function queryFeatures( &$query ) { @@ -226,7 +231,7 @@ class SearchMySQL extends SearchDatabase { /** * Add namespace conditions - * @param array $query + * @param array &$query * @since 1.18 (changed) */ function queryNamespaces( &$query ) { @@ -240,7 +245,7 @@ class SearchMySQL extends SearchDatabase { /** * Add limit options - * @param array $query + * @param array &$query * @since 1.18 */ protected function limitResult( &$query ) { diff --git a/includes/search/SearchNearMatcher.php b/includes/search/SearchNearMatcher.php index 0400021a1a..8e8686542c 100644 --- a/includes/search/SearchNearMatcher.php +++ b/includes/search/SearchNearMatcher.php @@ -70,7 +70,6 @@ class SearchNearMatcher { } foreach ( $allSearchTerms as $term ) { - # Exact match? No need to look further. $title = Title::newFromText( $term ); if ( is_null( $title ) ) { diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php index c5a5ef11a7..8bcd78fa66 100644 --- a/includes/search/SearchOracle.php +++ b/includes/search/SearchOracle.php @@ -174,7 +174,7 @@ class SearchOracle extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = $this->legalSearchChars(); + $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); $this->searchTerms = []; # @todo FIXME: This doesn't handle parenthetical expressions. @@ -266,7 +266,11 @@ class SearchOracle extends SearchDatabase { [] ); } - public static function legalSearchChars() { - return "\"" . parent::legalSearchChars(); + public static function legalSearchChars( $type = self::CHARS_ALL ) { + $searchChars = parent::legalSearchChars( $type ); + if ( $type === self::CHARS_ALL ) { + $searchChars = "\"" . $searchChars; + } + return $searchChars; } } diff --git a/includes/search/SearchResultSet.php b/includes/search/SearchResultSet.php index 978db2707f..89d2299b1b 100644 --- a/includes/search/SearchResultSet.php +++ b/includes/search/SearchResultSet.php @@ -264,4 +264,14 @@ class SearchResultSet { $result->setExtensionData( $this->extraData[$id] ); return $this->extraData[$id]; } + + /** + * @return int|null The offset the current page starts at. Typically + * this should be null to allow the UI to decide on its own, but in + * special cases like interleaved AB tests specifying explicitly is + * necessary. + */ + public function getOffset() { + return null; + } } diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php index b40e1aaf38..3d4da42ce8 100644 --- a/includes/search/SearchSqlite.php +++ b/includes/search/SearchSqlite.php @@ -44,7 +44,7 @@ class SearchSqlite extends SearchDatabase { */ function parseQuery( $filteredText, $fulltext ) { global $wgContLang; - $lc = $this->legalSearchChars(); // Minus format chars + $lc = $this->legalSearchChars( self::CHARS_NO_SYNTAX ); // Minus syntax chars (" and *) $searchon = ''; $this->searchTerms = []; @@ -141,8 +141,13 @@ class SearchSqlite extends SearchDatabase { return $regex; } - public static function legalSearchChars() { - return "\"*" . parent::legalSearchChars(); + public static function legalSearchChars( $type = self::CHARS_ALL ) { + $searchChars = parent::legalSearchChars( $type ); + if ( $type === self::CHARS_ALL ) { + // " for phrase, * for wildcard + $searchChars = "\"*" . $searchChars; + } + return $searchChars; } /** diff --git a/includes/search/SearchSuggestion.php b/includes/search/SearchSuggestion.php index 4e7c782e84..7f433db4ae 100644 --- a/includes/search/SearchSuggestion.php +++ b/includes/search/SearchSuggestion.php @@ -53,7 +53,7 @@ class SearchSuggestion { /** * Construct a new suggestion * @param float $score the suggestion score - * @param string $text|null the suggestion text + * @param string|null $text the suggestion text * @param Title|null $suggestedTitle the suggested title * @param int|null $suggestedTitleID the suggested title ID */ diff --git a/includes/search/SearchSuggestionSet.php b/includes/search/SearchSuggestionSet.php index caad38852e..6d54dada4e 100644 --- a/includes/search/SearchSuggestionSet.php +++ b/includes/search/SearchSuggestionSet.php @@ -180,7 +180,7 @@ class SearchSuggestionSet { */ public static function fromTitles( array $titles ) { $score = count( $titles ); - $suggestions = array_map( function( $title ) use ( &$score ) { + $suggestions = array_map( function ( $title ) use ( &$score ) { return SearchSuggestion::fromTitle( $score--, $title ); }, $titles ); return new SearchSuggestionSet( $suggestions ); @@ -196,7 +196,7 @@ class SearchSuggestionSet { */ public static function fromStrings( array $titles ) { $score = count( $titles ); - $suggestions = array_map( function( $title ) use ( &$score ) { + $suggestions = array_map( function ( $title ) use ( &$score ) { return SearchSuggestion::fromText( $score--, $title ); }, $titles ); return new SearchSuggestionSet( $suggestions ); diff --git a/includes/services/ServiceContainer.php b/includes/services/ServiceContainer.php index bad0ef9ce6..633cfc92db 100644 --- a/includes/services/ServiceContainer.php +++ b/includes/services/ServiceContainer.php @@ -303,7 +303,7 @@ class ServiceContainer implements DestructibleService { $instance = $this->peekService( $name ); - if ( $destroy && $instance instanceof DestructibleService ) { + if ( $destroy && $instance instanceof DestructibleService ) { $instance->destroy(); } diff --git a/includes/session/MetadataMergeException.php b/includes/session/MetadataMergeException.php index 882084d04e..074afe36e3 100644 --- a/includes/session/MetadataMergeException.php +++ b/includes/session/MetadataMergeException.php @@ -29,8 +29,7 @@ use UnexpectedValueException; * Subclass of UnexpectedValueException that can be annotated with additional * data for debug logging. * - * @author Bryan Davis - * @copyright © 2016 Bryan Davis and Wikimedia Foundation. + * @copyright © 2016 Wikimedia Foundation and contributors * @since 1.27 */ class MetadataMergeException extends UnexpectedValueException { diff --git a/includes/session/PHPSessionHandler.php b/includes/session/PHPSessionHandler.php index 084ac05c96..b76f0ff6b7 100644 --- a/includes/session/PHPSessionHandler.php +++ b/includes/session/PHPSessionHandler.php @@ -145,7 +145,7 @@ class PHPSessionHandler implements \SessionHandlerInterface { * @private Use self::install(). * @param SessionManager $manager * @param BagOStuff $store - * @param LoggerInterface $store + * @param LoggerInterface $logger */ public function setManager( SessionManager $manager, BagOStuff $store, LoggerInterface $logger diff --git a/includes/session/SessionBackend.php b/includes/session/SessionBackend.php index 8633715d60..d37b73b550 100644 --- a/includes/session/SessionBackend.php +++ b/includes/session/SessionBackend.php @@ -132,7 +132,7 @@ final class SessionBackend { $this->forceHTTPS = $info->forceHTTPS(); $this->providerMetadata = $info->getProviderMetadata(); - $blob = $store->get( wfMemcKey( 'MWSession', (string)$this->id ) ); + $blob = $store->get( $store->makeKey( 'MWSession', (string)$this->id ) ); if ( !is_array( $blob ) || !isset( $blob['metadata'] ) || !is_array( $blob['metadata'] ) || !isset( $blob['data'] ) || !is_array( $blob['data'] ) @@ -249,7 +249,7 @@ final class SessionBackend { $this->autosave(); // Delete the data for the old session ID now - $this->store->delete( wfMemcKey( 'MWSession', $oldId ) ); + $this->store->delete( $this->store->makeKey( 'MWSession', $oldId ) ); } } @@ -317,7 +317,7 @@ final class SessionBackend { // Delete the session data, so the local cache-only write in // self::save() doesn't get things out of sync with the backend. - $this->store->delete( wfMemcKey( 'MWSession', (string)$this->id ) ); + $this->store->delete( $this->store->makeKey( 'MWSession', (string)$this->id ) ); $this->autosave(); } @@ -729,7 +729,7 @@ final class SessionBackend { $flags = $this->persist ? 0 : CachedBagOStuff::WRITE_CACHE_ONLY; $flags |= CachedBagOStuff::WRITE_SYNC; // write to all datacenters $this->store->set( - wfMemcKey( 'MWSession', (string)$this->id ), + $this->store->makeKey( 'MWSession', (string)$this->id ), [ 'data' => $this->data, 'metadata' => $metadata, diff --git a/includes/session/SessionManager.php b/includes/session/SessionManager.php index 7cc8509486..40a568ffa7 100644 --- a/includes/session/SessionManager.php +++ b/includes/session/SessionManager.php @@ -214,7 +214,7 @@ final class SessionManager implements SessionManagerInterface { } // Test if the session is in storage, and if so try to load it. - $key = wfMemcKey( 'MWSession', $id ); + $key = $this->store->makeKey( 'MWSession', $id ); if ( is_array( $this->store->get( $key ) ) ) { $create = false; // If loading fails, don't bother creating because it probably will fail too. if ( $this->loadSessionInfoFromStore( $info, $request ) ) { @@ -255,7 +255,7 @@ final class SessionManager implements SessionManagerInterface { throw new \InvalidArgumentException( 'Invalid session ID' ); } - $key = wfMemcKey( 'MWSession', $id ); + $key = $this->store->makeKey( 'MWSession', $id ); if ( is_array( $this->store->get( $key ) ) ) { throw new \InvalidArgumentException( 'Session ID already exists' ); } @@ -545,7 +545,7 @@ final class SessionManager implements SessionManagerInterface { * @return bool Whether the session info matches the stored data (if any) */ private function loadSessionInfoFromStore( SessionInfo &$info, WebRequest $request ) { - $key = wfMemcKey( 'MWSession', $info->getId() ); + $key = $this->store->makeKey( 'MWSession', $info->getId() ); $blob = $this->store->get( $key ); // If we got data from the store and the SessionInfo says to force use, @@ -934,7 +934,7 @@ final class SessionManager implements SessionManagerInterface { public function generateSessionId() { do { $id = \Wikimedia\base_convert( \MWCryptRand::generateHex( 40 ), 16, 32, 32 ); - $key = wfMemcKey( 'MWSession', $id ); + $key = $this->store->makeKey( 'MWSession', $id ); } while ( isset( $this->allSessionIds[$id] ) || is_array( $this->store->get( $key ) ) ); return $id; } diff --git a/includes/session/SessionProvider.php b/includes/session/SessionProvider.php index 3cf69b7b33..ba075e0ca8 100644 --- a/includes/session/SessionProvider.php +++ b/includes/session/SessionProvider.php @@ -387,7 +387,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI * reset whatever token it does use here. * * @protected For use by \MediaWiki\Session\SessionManager only - * @param User $user; + * @param User $user */ public function invalidateSessionsForUser( User $user ) { } diff --git a/includes/session/Token.php b/includes/session/Token.php index 523e0cc1c0..14d239d5a9 100644 --- a/includes/session/Token.php +++ b/includes/session/Token.php @@ -56,7 +56,7 @@ class Token { * be able to extract the timestamp. * * @param string $token - * @param int|null + * @return int|null */ public static function getTimestamp( $token ) { $suffixLen = strlen( self::SUFFIX ); diff --git a/includes/site/CachingSiteStore.php b/includes/site/CachingSiteStore.php index a2f43f307b..f3cd1e81a2 100644 --- a/includes/site/CachingSiteStore.php +++ b/includes/site/CachingSiteStore.php @@ -90,7 +90,7 @@ class CachingSiteStore implements SiteStore { private function getCacheKey() { if ( $this->cacheKey === null ) { $type = 'SiteList#' . SiteList::getSerialVersionId(); - $this->cacheKey = wfMemcKey( "sites/$type" ); + $this->cacheKey = $this->cache->makeKey( "sites/$type" ); } return $this->cacheKey; diff --git a/includes/site/MediaWikiPageNameNormalizer.php b/includes/site/MediaWikiPageNameNormalizer.php index 1a079b4295..c4e490a4c7 100644 --- a/includes/site/MediaWikiPageNameNormalizer.php +++ b/includes/site/MediaWikiPageNameNormalizer.php @@ -69,7 +69,6 @@ class MediaWikiPageNameNormalizer { * @throws \MWException */ public function normalizePageName( $pageName, $apiUrl ) { - // Check if we have strings as arguments. if ( !is_string( $pageName ) ) { throw new \MWException( '$pageName must be a string' ); diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php index 6734d5f70c..f31a77d3a4 100644 --- a/includes/site/MediaWikiSite.php +++ b/includes/site/MediaWikiSite.php @@ -40,8 +40,6 @@ class MediaWikiSite extends Site { const PATH_PAGE = 'page_path'; /** - * Constructor. - * * @since 1.21 * * @param string $type diff --git a/includes/site/Site.php b/includes/site/Site.php index 28f19f9abf..a6e63391da 100644 --- a/includes/site/Site.php +++ b/includes/site/Site.php @@ -122,8 +122,6 @@ class Site implements Serializable { protected $internalId = null; /** - * Constructor. - * * @since 1.21 * * @param string $type @@ -335,7 +333,7 @@ class Site implements Serializable { */ public function getLinkPath() { $type = $this->getLinkPathType(); - return $type === null ? null: $this->getPath( $type ); + return $type === null ? null : $this->getPath( $type ); } /** diff --git a/includes/site/SiteImporter.php b/includes/site/SiteImporter.php index 42812e14fb..5e13d06152 100644 --- a/includes/site/SiteImporter.php +++ b/includes/site/SiteImporter.php @@ -191,7 +191,7 @@ class SiteImporter { /** * @param DOMElement $element - * @param $name + * @param string $name * @param string|null|bool $default * * @return null|string diff --git a/includes/skins/BaseTemplate.php b/includes/skins/BaseTemplate.php index e571c58c32..8d5ce10dd1 100644 --- a/includes/skins/BaseTemplate.php +++ b/includes/skins/BaseTemplate.php @@ -29,7 +29,7 @@ abstract class BaseTemplate extends QuickTemplate { * Get a Message object with its context set * * @param string $name Message name - * @param ... $params Message params + * @param mixed $params,... Message params * @return Message */ public function getMsg( $name /* ... */ ) { @@ -201,13 +201,13 @@ abstract class BaseTemplate extends QuickTemplate { ]; break; case 'LANGUAGES': - if ( $this->data['language_urls'] ) { + if ( $this->data['language_urls'] !== false ) { $msgObj = $this->getMsg( 'otherlanguages' ); $boxes[$boxName] = [ 'id' => 'p-lang', 'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages', 'generated' => false, - 'content' => $this->data['language_urls'], + 'content' => $this->data['language_urls'] ?: [], ]; } break; @@ -287,12 +287,31 @@ abstract class BaseTemplate extends QuickTemplate { * @param string $name */ protected function renderAfterPortlet( $name ) { + echo $this->getAfterPortlet( $name ); + } + + /** + * Allows extensions to hook into known portlets and add stuff to them + * + * @param string $name + * + * @return string html + * @since 1.29 + */ + protected function getAfterPortlet( $name ) { + $html = ''; $content = ''; Hooks::run( 'BaseTemplateAfterPortlet', [ $this, $name, &$content ] ); if ( $content !== '' ) { - echo "
    $content
    "; + $html = Html::rawElement( + 'div', + [ 'class' => [ 'after-portlet', 'after-portlet-' . $name ] ], + $content + ); } + + return $html; } /** @@ -504,7 +523,6 @@ abstract class BaseTemplate extends QuickTemplate { 'type' => 'search', 'name' => 'search', 'placeholder' => wfMessage( 'searchsuggest-search' )->text(), - 'value' => $this->get( 'search', '' ), ]; $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs ); return Html::element( 'input', $realAttrs ); @@ -632,6 +650,69 @@ abstract class BaseTemplate extends QuickTemplate { return $footericons; } + /** + * Renderer for getFooterIcons and getFooterLinks + * + * @param string $iconStyle $option for getFooterIcons: "icononly", "nocopyright" + * @param string $linkStyle $option for getFooterLinks: "flat" + * + * @return string html + * @since 1.29 + */ + protected function getFooter( $iconStyle = 'icononly', $linkStyle = 'flat' ) { + $validFooterIcons = $this->getFooterIcons( $iconStyle ); + $validFooterLinks = $this->getFooterLinks( $linkStyle ); + + $html = ''; + + if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { + $html .= Html::openElement( 'div', [ + 'id' => 'footer-bottom', + 'role' => 'contentinfo', + 'lang' => $this->get( 'userlang' ), + 'dir' => $this->get( 'dir' ) + ] ); + $footerEnd = Html::closeElement( 'div' ); + } else { + $footerEnd = ''; + } + foreach ( $validFooterIcons as $blockName => $footerIcons ) { + $html .= Html::openElement( 'div', [ + 'id' => Sanitizer::escapeIdForAttribute( "f-{$blockName}ico" ), + 'class' => 'footer-icons' + ] ); + foreach ( $footerIcons as $icon ) { + $html .= $this->getSkin()->makeFooterIcon( $icon ); + } + $html .= Html::closeElement( 'div' ); + } + if ( count( $validFooterLinks ) > 0 ) { + $html .= Html::openElement( 'ul', [ 'id' => 'f-list', 'class' => 'footer-places' ] ); + foreach ( $validFooterLinks as $aLink ) { + $html .= Html::rawElement( + 'li', + [ 'id' => Sanitizer::escapeIdForAttribute( $aLink ) ], + $this->get( $aLink ) + ); + } + $html .= Html::closeElement( 'ul' ); + } + + $html .= $this->getClear() . $footerEnd; + + return $html; + } + + /** + * Get a div with the core visualClear class, for clearing floats + * + * @return string html + * @since 1.29 + */ + protected function getClear() { + return Html::element( 'div', [ 'class' => 'visualClear' ] ); + } + /** * Get the suggested HTML for page status indicators: icons (or short text snippets) usually * displayed in the top-right corner of the page, outside of the main content. @@ -653,7 +734,7 @@ abstract class BaseTemplate extends QuickTemplate { $out .= Html::rawElement( 'div', [ - 'id' => Sanitizer::escapeId( "mw-indicator-$id" ), + 'id' => Sanitizer::escapeIdForAttribute( "mw-indicator-$id" ), 'class' => 'mw-indicator', ], $content @@ -664,15 +745,25 @@ abstract class BaseTemplate extends QuickTemplate { } /** - * Output the basic end-page trail including bottomscripts, reporttime, and + * Output getTrail + */ + function printTrail() { + echo $this->getTrail(); + } + + /** + * Get the basic end-page trail including bottomscripts, reporttime, and * debug stuff. This should be called right before outputting the closing * body and html tags. + * + * @return string + * @since 1.29 */ - function printTrail() { -?> -getSkin()->getContext() ); ?> -html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?> -html( 'reporttime' ) ?> -getSkin()->getContext() ); + $html .= $this->get( 'bottomscripts' ); + $html .= $this->get( 'reporttime' ); + + return $html; } } diff --git a/includes/skins/MediaWikiI18N.php b/includes/skins/MediaWikiI18N.php index 02e8391ccd..7fcdb3c96b 100644 --- a/includes/skins/MediaWikiI18N.php +++ b/includes/skins/MediaWikiI18N.php @@ -33,7 +33,6 @@ class MediaWikiI18N { } function translate( $value ) { - // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23 $value = preg_replace( '/^string:/', '', $value ); diff --git a/includes/skins/QuickTemplate.php b/includes/skins/QuickTemplate.php index 6686ae69c5..e7120e9703 100644 --- a/includes/skins/QuickTemplate.php +++ b/includes/skins/QuickTemplate.php @@ -26,6 +26,16 @@ use MediaWiki\MediaWikiServices; */ abstract class QuickTemplate { + /** + * @var array + */ + public $data; + + /** + * @var MediaWikiI18N + */ + public $translator; + /** @var Config $config */ protected $config; @@ -82,14 +92,14 @@ abstract class QuickTemplate { /** * @param string $name - * @param mixed $value + * @param mixed &$value */ public function setRef( $name, &$value ) { $this->data[$name] =& $value; } /** - * @param MediaWikiI18N $t + * @param MediaWikiI18N &$t */ public function setTranslator( &$t ) { $this->translator = &$t; diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php index 52678d4ea3..e1d0034675 100644 --- a/includes/skins/Skin.php +++ b/includes/skins/Skin.php @@ -20,6 +20,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * @defgroup Skins Skins */ @@ -93,7 +95,7 @@ abstract class Skin extends ContextSource { static function normalizeKey( $key ) { global $wgDefaultSkin, $wgFallbackSkin; - $skinNames = Skin::getSkinNames(); + $skinNames = self::getSkinNames(); // Make keys lowercase for case-insensitive matching. $skinNames = array_change_key_case( $skinNames, CASE_LOWER ); @@ -158,14 +160,21 @@ abstract class Skin extends ContextSource { global $wgUseAjax, $wgEnableAPI, $wgEnableWriteAPI; $out = $this->getOutput(); + $config = $this->getConfig(); $user = $out->getUser(); $modules = [ + // modules not specific to any specific skin or page + 'core' => [ + // Enforce various default modules for all pages and all skins + // Keep this list as small as possible + 'site', + 'mediawiki.page.startup', + 'mediawiki.user', + ], // modules that enhance the page content in some way 'content' => [ 'mediawiki.page.ready', ], - // modules that exist for legacy reasons - 'legacy' => ResourceLoaderStartUpModule::getLegacyModules(), // modules relating to search functionality 'search' => [], // modules relating to functionality relating to watching an article @@ -174,6 +183,11 @@ abstract class Skin extends ContextSource { 'user' => [], ]; + // Support for high-density display images if enabled + if ( $config->get( 'ResponsiveImages' ) ) { + $modules['core'][] = 'mediawiki.hidpi'; + } + // Preload jquery.tablesorter for mediawiki.page.ready if ( strpos( $out->getHTML(), 'sortable' ) !== false ) { $modules['content'][] = 'jquery.tablesorter'; @@ -184,6 +198,10 @@ abstract class Skin extends ContextSource { $modules['content'][] = 'jquery.makeCollapsible'; } + if ( $out->isTOCEnabled() ) { + $modules['content'][] = 'mediawiki.toc'; + } + // Add various resources if required if ( $wgUseAjax && $wgEnableAPI ) { if ( $wgEnableWriteAPI && $user->isLoggedIn() @@ -431,7 +449,7 @@ abstract class Skin extends ContextSource { * "" tag, skins can override it if they have a need to add in any * body attributes or classes of their own. * @param OutputPage $out - * @param array $bodyAttrs + * @param array &$bodyAttrs */ function addToBodyAttributes( $out, &$bodyAttrs ) { // does nothing by default @@ -446,6 +464,15 @@ abstract class Skin extends ContextSource { return $wgLogo; } + /** + * Whether the logo should be preloaded with an HTTP link header or not + * @since 1.29 + * @return bool + */ + public function shouldPreloadLogo() { + return false; + } + /** * @return string HTML */ @@ -1188,7 +1215,7 @@ abstract class Skin extends ContextSource { /** * make sure we have some title to operate on * - * @param Title $title + * @param Title &$title * @param string $name */ static function checkTitle( &$title, $name ) { @@ -1234,7 +1261,7 @@ abstract class Skin extends ContextSource { }; if ( $wgEnableSidebarCache ) { - $cache = ObjectCache::getMainWANInstance(); + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); $sidebar = $cache->getWithSetCallback( $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ), MessageCache::singleton()->isDisabled() @@ -1259,7 +1286,7 @@ abstract class Skin extends ContextSource { * * This is just a wrapper around addToSidebarPlain() for backwards compatibility * - * @param array $bar + * @param array &$bar * @param string $message */ public function addToSidebar( &$bar, $message ) { @@ -1269,7 +1296,7 @@ abstract class Skin extends ContextSource { /** * Add content from plain text * @since 1.17 - * @param array $bar + * @param array &$bar * @param string $text * @return array */ @@ -1348,8 +1375,8 @@ abstract class Skin extends ContextSource { $bar[$heading][] = array_merge( [ 'text' => $text, 'href' => $href, - 'id' => 'n-' . Sanitizer::escapeId( strtr( $line[1], ' ', '-' ), 'noninitial' ), - 'active' => false + 'id' => Sanitizer::escapeIdForAttribute( 'n-' . strtr( $line[1], ' ', '-' ) ), + 'active' => false, ], $extraAttribs ); } else { continue; @@ -1366,7 +1393,6 @@ abstract class Skin extends ContextSource { * @return string */ function getNewtalks() { - $newMessagesAlert = ''; $user = $this->getUser(); $newtalks = $user->getNewMessageLinks(); @@ -1460,7 +1486,7 @@ abstract class Skin extends ContextSource { * should fall back to the next notice in its sequence */ private function getCachedNotice( $name ) { - global $wgRenderHashAppend, $parserMemc, $wgContLang; + global $wgRenderHashAppend, $wgContLang; $needParse = false; @@ -1481,28 +1507,27 @@ abstract class Skin extends ContextSource { $notice = $msg->plain(); } - // Use the extra hash appender to let eg SSL variants separately cache. - $key = wfMemcKey( $name . $wgRenderHashAppend ); - $cachedNotice = $parserMemc->get( $key ); - if ( is_array( $cachedNotice ) ) { - if ( md5( $notice ) == $cachedNotice['hash'] ) { - $notice = $cachedNotice['html']; - } else { - $needParse = true; + $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $parsed = $cache->getWithSetCallback( + // Use the extra hash appender to let eg SSL variants separately cache + // Key is verified with md5 hash of unparsed wikitext + $cache->makeKey( $name, $wgRenderHashAppend, md5( $notice ) ), + // TTL in seconds + 600, + function () use ( $notice ) { + return $this->getOutput()->parse( $notice ); } - } else { - $needParse = true; - } - - if ( $needParse ) { - $parsed = $this->getOutput()->parse( $notice ); - $parserMemc->set( $key, [ 'html' => $parsed, 'hash' => md5( $notice ) ], 600 ); - $notice = $parsed; - } + ); - $notice = Html::rawElement( 'div', [ 'id' => 'localNotice', - 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ], $notice ); - return $notice; + return Html::rawElement( + 'div', + [ + 'id' => 'localNotice', + 'lang' => $wgContLang->getHtmlCode(), + 'dir' => $wgContLang->getDir() + ], + $parsed + ); } /** diff --git a/includes/skins/SkinApi.php b/includes/skins/SkinApi.php index 1145efdd06..6679098fe6 100644 --- a/includes/skins/SkinApi.php +++ b/includes/skins/SkinApi.php @@ -6,7 +6,7 @@ * * Created on Sep 08, 2014 * - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 diff --git a/includes/skins/SkinApiTemplate.php b/includes/skins/SkinApiTemplate.php index f7d7cb2f74..d3e453a61a 100644 --- a/includes/skins/SkinApiTemplate.php +++ b/includes/skins/SkinApiTemplate.php @@ -6,7 +6,7 @@ * * Created on Sep 08, 2014 * - * Copyright © 2014 Brad Jorsch + * Copyright © 2014 Wikimedia Foundation and contributors * * 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 diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php index 61dbf2b1c1..f49d46c2fd 100644 --- a/includes/skins/SkinTemplate.php +++ b/includes/skins/SkinTemplate.php @@ -269,11 +269,13 @@ class SkinTemplate extends Skin { # An ID that includes the actual body text; without categories, contentSub, ... $realBodyAttribs = [ 'id' => 'mw-content-text' ]; - # Add a mw-content-ltr/rtl class to be able to style based on text direction - # when the content is different from the UI language, i.e.: - # not for special pages or file pages AND only when viewing - if ( !in_array( $title->getNamespace(), [ NS_SPECIAL, NS_FILE ] ) && - Action::getActionName( $this ) === 'view' ) { + # Add a mw-content-ltr/rtl class to be able to style based on text + # direction when the content is different from the UI language (only + # when viewing) + # Most information on special pages and file pages is in user language, + # rather than content language, so those will not get this + if ( Action::getActionName( $this ) === 'view' && + ( !$title->inNamespaces( NS_SPECIAL, NS_FILE ) || $title->isRedirect() ) ) { $pageLang = $title->getPageViewLanguage(); $realBodyAttribs['lang'] = $pageLang->getHtmlCode(); $realBodyAttribs['dir'] = $pageLang->getDir(); @@ -720,7 +722,10 @@ class SkinTemplate extends Skin { } if ( $authManager->canAuthenticateNow() ) { - $personal_urls['login'] = $login_url; + $key = User::groupHasPermission( '*', 'read' ) + ? 'login' + : 'login-private'; + $personal_urls[$key] = $login_url; } } diff --git a/includes/specialpage/AuthManagerSpecialPage.php b/includes/specialpage/AuthManagerSpecialPage.php index fbc3022a43..500c2e93f5 100644 --- a/includes/specialpage/AuthManagerSpecialPage.php +++ b/includes/specialpage/AuthManagerSpecialPage.php @@ -45,7 +45,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage { * @param AuthenticationRequest[] $requests * @param array $fieldInfo Field information array (union of all * AuthenticationRequest::getFieldInfo() responses). - * @param array $formDescriptor HTMLForm descriptor. The special key 'weight' can be set to + * @param array &$formDescriptor HTMLForm descriptor. The special key 'weight' can be set to * change the order of the fields. * @param string $action Authentication type (one of the AuthManager::ACTION_* constants) * @return bool @@ -474,7 +474,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage { /** * Submit handler callback for HTMLForm * @private - * @param $data array Submitted data + * @param array $data Submitted data * @return Status */ public function handleFormSubmit( $data ) { @@ -598,7 +598,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage { /** * Adds a sequential tabindex starting from 1 to all form elements. This way the user can * use the tab key to traverse the form without having to step through all links and such. - * @param $formDescriptor + * @param array &$formDescriptor */ protected function addTabIndex( &$formDescriptor ) { $i = 1; @@ -709,7 +709,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage { * Sort the fields of a form descriptor by their 'weight' property. (Fields with higher weight * are shown closer to the bottom; weight defaults to 0. Negative weight is allowed.) * Keep order if weights are equal. - * @param array $formDescriptor + * @param array &$formDescriptor * @return array */ protected static function sortFormDescriptorFields( array &$formDescriptor ) { diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 8f702bab2d..645fbb288f 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -22,6 +22,8 @@ */ use MediaWiki\Logger\LoggerFactory; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Special page which uses a ChangesList to show query results. @@ -58,6 +60,13 @@ abstract class ChangesListSpecialPage extends SpecialPage { */ private $filterGroupDefinitions; + // Same format as filterGroupDefinitions, but for a single group (reviewStatus) + // that is registered conditionally. + private $reviewStatusFilterGroupDefinition; + + // Single filter registered conditionally + private $hideCategorizationFilterDefinition; + /** * Filter groups, and their contained filters * This is an associative array (with group name as key) of ChangesListFilterGroup objects. @@ -77,40 +86,30 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'filters' => [ [ 'name' => 'hideliu', - 'label' => 'rcfilters-filter-registered-label', - 'description' => 'rcfilters-filter-registered-description', // rcshowhideliu-show, rcshowhideliu-hide, // wlshowhideliu 'showHideSuffix' => 'showhideliu', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_user = 0'; }, - 'cssClassSuffix' => 'liu', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return $rc->getAttribute( 'rc_user' ); - }, + 'isReplacedInStructuredUi' => true, ], [ 'name' => 'hideanons', - 'label' => 'rcfilters-filter-unregistered-label', - 'description' => 'rcfilters-filter-unregistered-description', // rcshowhideanons-show, rcshowhideanons-hide, // wlshowhideanons 'showHideSuffix' => 'showhideanons', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_user != 0'; }, - 'cssClassSuffix' => 'anon', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return !$rc->getAttribute( 'rc_user' ); - }, + 'isReplacedInStructuredUi' => true, ] ], ], @@ -119,9 +118,26 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'name' => 'userExpLevel', 'title' => 'rcfilters-filtergroup-userExpLevel', 'class' => ChangesListStringOptionsFilterGroup::class, - // Excludes unregistered users - 'isFullCoverage' => false, + 'isFullCoverage' => true, 'filters' => [ + [ + 'name' => 'unregistered', + 'label' => 'rcfilters-filter-user-experience-level-unregistered-label', + 'description' => 'rcfilters-filter-user-experience-level-unregistered-description', + 'cssClassSuffix' => 'user-unregistered', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return !$rc->getAttribute( 'rc_user' ); + } + ], + [ + 'name' => 'registered', + 'label' => 'rcfilters-filter-user-experience-level-registered-label', + 'description' => 'rcfilters-filter-user-experience-level-registered-description', + 'cssClassSuffix' => 'user-registered', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_user' ); + } + ], [ 'name' => 'newcomer', 'label' => 'rcfilters-filter-user-experience-level-newcomer-label', @@ -174,14 +190,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'showHideSuffix' => 'showhidemine', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $user = $ctx->getUser(); - if ( $user->getId() ) { - $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() ); - } else { - $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() ); - } + $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() ); }, 'cssClassSuffix' => 'self', 'isRowApplicableCallable' => function ( $ctx, $rc ) { @@ -194,14 +206,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'description' => 'rcfilters-filter-editsbyother-description', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $user = $ctx->getUser(); - if ( $user->getId() ) { - $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() ); - } else { - $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() ); - } + $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() ); }, 'cssClassSuffix' => 'others', 'isRowApplicableCallable' => function ( $ctx, $rc ) { @@ -225,8 +233,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'showHideSuffix' => 'showhidebots', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_bot = 0'; }, 'cssClassSuffix' => 'bot', @@ -240,8 +248,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'description' => 'rcfilters-filter-humans-description', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_bot = 1'; }, 'cssClassSuffix' => 'human', @@ -252,57 +260,13 @@ abstract class ChangesListSpecialPage extends SpecialPage { ] ], - [ - 'name' => 'reviewStatus', - 'title' => 'rcfilters-filtergroup-reviewstatus', - 'class' => ChangesListBooleanFilterGroup::class, - 'filters' => [ - [ - 'name' => 'hidepatrolled', - 'label' => 'rcfilters-filter-patrolled-label', - 'description' => 'rcfilters-filter-patrolled-description', - // rcshowhidepatr-show, rcshowhidepatr-hide - // wlshowhidepatr - 'showHideSuffix' => 'showhidepatr', - 'default' => false, - 'isAllowedCallable' => function ( $pageClassName, $context ) { - return $context->getUser()->useRCPatrol(); - }, - 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - - $conds[] = 'rc_patrolled = 0'; - }, - 'cssClassSuffix' => 'patrolled', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return $rc->getAttribute( 'rc_patrolled' ); - }, - ], - [ - 'name' => 'hideunpatrolled', - 'label' => 'rcfilters-filter-unpatrolled-label', - 'description' => 'rcfilters-filter-unpatrolled-description', - 'default' => false, - 'isAllowedCallable' => function ( $pageClassName, $context ) { - return $context->getUser()->useRCPatrol(); - }, - 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - - $conds[] = 'rc_patrolled = 1'; - }, - 'cssClassSuffix' => 'unpatrolled', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return !$rc->getAttribute( 'rc_patrolled' ); - }, - ], - ], - ], + // reviewStatus (conditional) [ 'name' => 'significance', 'title' => 'rcfilters-filtergroup-significance', 'class' => ChangesListBooleanFilterGroup::class, + 'priority' => -6, 'filters' => [ [ 'name' => 'hideminor', @@ -313,8 +277,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'showHideSuffix' => 'showhideminor', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_minor = 0'; }, 'cssClassSuffix' => 'minor', @@ -328,8 +292,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'description' => 'rcfilters-filter-major-description', 'default' => false, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_minor = 1'; }, 'cssClassSuffix' => 'major', @@ -340,20 +304,59 @@ abstract class ChangesListSpecialPage extends SpecialPage { ] ], + [ + 'name' => 'lastRevision', + 'title' => 'rcfilters-filtergroup-lastRevision', + 'class' => ChangesListBooleanFilterGroup::class, + 'priority' => -7, + 'filters' => [ + [ + 'name' => 'hidelastrevision', + 'label' => 'rcfilters-filter-lastrevision-label', + 'description' => 'rcfilters-filter-lastrevision-description', + 'default' => false, + 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, + &$query_options, &$join_conds ) { + $conds[] = 'rc_this_oldid <> page_latest'; + }, + 'cssClassSuffix' => 'last', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_this_oldid' ) === $rc->getAttribute( 'page_latest' ); + } + ], + [ + 'name' => 'hidepreviousrevisions', + 'label' => 'rcfilters-filter-previousrevision-label', + 'description' => 'rcfilters-filter-previousrevision-description', + 'default' => false, + 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, + &$query_options, &$join_conds ) { + $conds[] = 'rc_this_oldid = page_latest'; + }, + 'cssClassSuffix' => 'previous', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_this_oldid' ) !== $rc->getAttribute( 'page_latest' ); + } + ] + ] + ], + // With extensions, there can be change types that will not be hidden by any of these. [ 'name' => 'changeType', 'title' => 'rcfilters-filtergroup-changetype', 'class' => ChangesListBooleanFilterGroup::class, + 'priority' => -8, 'filters' => [ [ 'name' => 'hidepageedits', 'label' => 'rcfilters-filter-pageedits-label', 'description' => 'rcfilters-filter-pageedits-description', 'default' => false, + 'priority' => -2, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_EDIT ); }, 'cssClassSuffix' => 'src-mw-edit', @@ -366,9 +369,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { 'label' => 'rcfilters-filter-newpages-label', 'description' => 'rcfilters-filter-newpages-description', 'default' => false, + 'priority' => -3, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_NEW ); }, 'cssClassSuffix' => 'src-mw-new', @@ -376,35 +380,18 @@ abstract class ChangesListSpecialPage extends SpecialPage { return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_NEW; }, ], - [ - 'name' => 'hidecategorization', - 'label' => 'rcfilters-filter-categorization-label', - 'description' => 'rcfilters-filter-categorization-description', - // rcshowhidecategorization-show, rcshowhidecategorization-hide. - // wlshowhidecategorization - 'showHideSuffix' => 'showhidecategorization', - 'isAllowedCallable' => function ( $pageClassName, $context ) { - return $context->getConfig()->get( 'RCWatchCategoryMembership' ); - }, - 'default' => false, - 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE ); - }, - 'cssClassSuffix' => 'src-mw-categorize', - 'isRowApplicableCallable' => function ( $ctx, $rc ) { - return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE; - }, - ], + // hidecategorization + [ 'name' => 'hidelog', 'label' => 'rcfilters-filter-logactions-label', 'description' => 'rcfilters-filter-logactions-description', 'default' => false, + 'priority' => -5, 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, - &$query_options, &$join_conds ) { - + &$query_options, &$join_conds + ) { $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG ); }, 'cssClassSuffix' => 'src-mw-log', @@ -414,9 +401,116 @@ abstract class ChangesListSpecialPage extends SpecialPage { ], ], ], + + ]; + + $this->reviewStatusFilterGroupDefinition = [ + [ + 'name' => 'reviewStatus', + 'title' => 'rcfilters-filtergroup-reviewstatus', + 'class' => ChangesListBooleanFilterGroup::class, + 'priority' => -5, + 'filters' => [ + [ + 'name' => 'hidepatrolled', + 'label' => 'rcfilters-filter-patrolled-label', + 'description' => 'rcfilters-filter-patrolled-description', + // rcshowhidepatr-show, rcshowhidepatr-hide + // wlshowhidepatr + 'showHideSuffix' => 'showhidepatr', + 'default' => false, + 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, + &$query_options, &$join_conds + ) { + $conds[] = 'rc_patrolled = 0'; + }, + 'cssClassSuffix' => 'patrolled', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_patrolled' ); + }, + ], + [ + 'name' => 'hideunpatrolled', + 'label' => 'rcfilters-filter-unpatrolled-label', + 'description' => 'rcfilters-filter-unpatrolled-description', + 'default' => false, + 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, + &$query_options, &$join_conds + ) { + $conds[] = 'rc_patrolled = 1'; + }, + 'cssClassSuffix' => 'unpatrolled', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return !$rc->getAttribute( 'rc_patrolled' ); + }, + ], + ], + ] + ]; + + $this->hideCategorizationFilterDefinition = [ + 'name' => 'hidecategorization', + 'label' => 'rcfilters-filter-categorization-label', + 'description' => 'rcfilters-filter-categorization-description', + // rcshowhidecategorization-show, rcshowhidecategorization-hide. + // wlshowhidecategorization + 'showHideSuffix' => 'showhidecategorization', + 'default' => false, + 'priority' => -4, + 'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds, + &$query_options, &$join_conds + ) { + $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE ); + }, + 'cssClassSuffix' => 'src-mw-categorize', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE; + }, ]; } + /** + * Check if filters are in conflict and guaranteed to return no results. + * + * @return bool + */ + protected function areFiltersInConflict() { + $opts = $this->getOptions(); + /** @var ChangesListFilterGroup $group */ + foreach ( $this->getFilterGroups() as $group ) { + if ( $group->getConflictingGroups() ) { + wfLogWarning( + $group->getName() . + " specifies conflicts with other groups but these are not supported yet." + ); + } + + /** @var ChangesListFilter $conflictingFilter */ + foreach ( $group->getConflictingFilters() as $conflictingFilter ) { + if ( $conflictingFilter->activelyInConflictWithGroup( $group, $opts ) ) { + return true; + } + } + + /** @var ChangesListFilter $filter */ + foreach ( $group->getFilters() as $filter ) { + /** @var ChangesListFilter $conflictingFilter */ + foreach ( $filter->getConflictingFilters() as $conflictingFilter ) { + if ( + $conflictingFilter->activelyInConflictWithFilter( $filter, $opts ) && + $filter->activelyInConflictWithFilter( $conflictingFilter, $opts ) + ) { + return true; + } + } + + } + + } + + return false; + } + /** * Main execution point * @@ -432,12 +526,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { $rows = $this->getRows(); $opts = $this->getOptions(); if ( $rows === false ) { - if ( !$this->including() ) { - $this->doHeader( $opts, 0 ); - $this->getOutput()->setStatusCode( 404 ); - } - - return; + $rows = new FakeResultWrapper( [] ); } $batch = new LinkBatch; @@ -453,7 +542,6 @@ abstract class ChangesListSpecialPage extends SpecialPage { } } $batch->execute(); - $this->webOutput( $rows, $opts ); $rows->free(); @@ -467,6 +555,17 @@ abstract class ChangesListSpecialPage extends SpecialPage { } } + /** + * Add the "no results" message to the output + */ + protected function outputNoResults() { + $this->getOutput()->addHTML( + '
    ' . + $this->msg( 'recentchanges-noresult' )->parse() . + '
    ' + ); + } + /** * Get the database result for this special page instance. Used by ApiFeedRecentChanges. * @@ -499,7 +598,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { } /** - * Register all filters and their groups, plus conflicts + * Register all filters and their groups (including those from hooks), plus handle + * conflicts and defaults. * * You might want to customize these in the same method, in subclasses. You can * call getFilterGroup to access a group, and (on the group) getFilter to access a @@ -509,6 +609,27 @@ abstract class ChangesListSpecialPage extends SpecialPage { protected function registerFilters() { $this->registerFiltersFromDefinitions( $this->filterGroupDefinitions ); + // Make sure this is not being transcluded (we don't want to show this + // information to all users just because the user that saves the edit can + // patrol or is logged in) + if ( !$this->including() && $this->getUser()->useRCPatrol() ) { + $this->registerFiltersFromDefinitions( $this->reviewStatusFilterGroupDefinition ); + } + + $changeTypeGroup = $this->getFilterGroup( 'changeType' ); + + if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) { + $transformedHideCategorizationDef = $this->transformFilterDefinition( + $this->hideCategorizationFilterDefinition + ); + + $transformedHideCategorizationDef['group'] = $changeTypeGroup; + + $hideCategorization = new ChangesListBooleanFilter( + $transformedHideCategorizationDef + ); + } + Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] ); $unstructuredGroupDefinition = @@ -518,38 +639,81 @@ abstract class ChangesListSpecialPage extends SpecialPage { $this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] ); $userExperienceLevel = $this->getFilterGroup( 'userExpLevel' ); - - $registration = $this->getFilterGroup( 'registration' ); - $anons = $registration->getFilter( 'hideanons' ); - - // This means there is a conflict between any item in user experience level - // being checked and only anons being *shown* (hideliu=1&hideanons=0 in the - // URL, or equivalent). - $userExperienceLevel->conflictsWith( - $anons, - 'rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global', - 'rcfilters-filtergroup-user-experience-level-conflicts-unregistered', - 'rcfilters-filter-unregistered-conflicts-user-experience-level' + $registered = $userExperienceLevel->getFilter( 'registered' ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'newcomer' ) ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'learner' ) ); + $registered->setAsSupersetOf( $userExperienceLevel->getFilter( 'experienced' ) ); + + $categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' ); + $logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' ); + $pagecreationFilter = $changeTypeGroup->getFilter( 'hidenewpages' ); + + $significanceTypeGroup = $this->getFilterGroup( 'significance' ); + $hideMinorFilter = $significanceTypeGroup->getFilter( 'hideminor' ); + + // categoryFilter is conditional; see registerFilters + if ( $categoryFilter !== null ) { + $hideMinorFilter->conflictsWith( + $categoryFilter, + 'rcfilters-hideminor-conflicts-typeofchange-global', + 'rcfilters-hideminor-conflicts-typeofchange', + 'rcfilters-typeofchange-conflicts-hideminor' + ); + } + $hideMinorFilter->conflictsWith( + $logactionsFilter, + 'rcfilters-hideminor-conflicts-typeofchange-global', + 'rcfilters-hideminor-conflicts-typeofchange', + 'rcfilters-typeofchange-conflicts-hideminor' + ); + $hideMinorFilter->conflictsWith( + $pagecreationFilter, + 'rcfilters-hideminor-conflicts-typeofchange-global', + 'rcfilters-hideminor-conflicts-typeofchange', + 'rcfilters-typeofchange-conflicts-hideminor' ); } + /** + * Transforms filter definition to prepare it for constructor. + * + * See overrides of this method as well. + * + * @param array $filterDefinition Original filter definition + * + * @return array Transformed definition + */ + protected function transformFilterDefinition( array $filterDefinition ) { + return $filterDefinition; + } + /** * Register filters from a definition object * * Array specifying groups and their filters; see Filter and * ChangesListFilterGroup constructors. * - * There is light processing to simplify core maintenance. See overrides - * of this method as well. + * There is light processing to simplify core maintenance. */ protected function registerFiltersFromDefinitions( array $definition ) { - $priority = -1; + $autoFillPriority = -1; foreach ( $definition as $groupDefinition ) { - $groupDefinition['priority'] = $priority; - $priority--; + if ( !isset( $groupDefinition['priority'] ) ) { + $groupDefinition['priority'] = $autoFillPriority; + } else { + // If it's explicitly specified, start over the auto-fill + $autoFillPriority = $groupDefinition['priority']; + } + + $autoFillPriority--; $className = $groupDefinition['class']; unset( $groupDefinition['class'] ); + + foreach ( $groupDefinition['filters'] as &$filterDefinition ) { + $filterDefinition = $this->transformFilterDefinition( $filterDefinition ); + } + $this->registerFilterGroup( new $className( $groupDefinition ) ); } } @@ -557,10 +721,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { /** * Get filter group definition from legacy custom filters * - * @param array Custom filters from legacy hooks + * @param array $customFilters Custom filters from legacy hooks * @return array Group definition */ - protected function getFilterGroupDefinitionFromLegacyCustomFilters( $customFilters ) { + protected function getFilterGroupDefinitionFromLegacyCustomFilters( array $customFilters ) { // Special internal unstructured group $unstructuredGroupDefinition = [ 'name' => 'unstructured', @@ -617,23 +781,27 @@ abstract class ChangesListSpecialPage extends SpecialPage { public function getDefaultOptions() { $config = $this->getConfig(); $opts = new FormOptions(); + $structuredUI = $this->getUser()->getOption( 'rcenhancedfilters' ); + // If urlversion=2 is set, ignore the filter defaults and set them all to false/empty + $useDefaults = $this->getRequest()->getInt( 'urlversion' ) !== 2; // Add all filters foreach ( $this->filterGroups as $filterGroup ) { // URL parameters can be per-group, like 'userExpLevel', // or per-filter, like 'hideminor'. if ( $filterGroup->isPerGroupRequestParameter() ) { - $opts->add( $filterGroup->getName(), $filterGroup->getDefault() ); + $opts->add( $filterGroup->getName(), $useDefaults ? $filterGroup->getDefault() : '' ); } else { foreach ( $filterGroup->getFilters() as $filter ) { - $opts->add( $filter->getName(), $filter->getDefault() ); + $opts->add( $filter->getName(), $useDefaults ? $filter->getDefault( $structuredUI ) : false ); } } } - $opts->add( 'namespace', '', FormOptions::INTNULL ); + $opts->add( 'namespace', '', FormOptions::STRING ); $opts->add( 'invert', false ); $opts->add( 'associated', false ); + $opts->add( 'urlversion', 1 ); return $opts; } @@ -786,7 +954,90 @@ abstract class ChangesListSpecialPage extends SpecialPage { * @param FormOptions $opts */ public function validateOptions( FormOptions $opts ) { - // nothing by default + if ( $this->fixContradictoryOptions( $opts ) ) { + $query = wfArrayToCgi( $this->convertParamsForLink( $opts->getChangedValues() ) ); + $this->getOutput()->redirect( $this->getPageTitle()->getCanonicalURL( $query ) ); + } + } + + /** + * Fix invalid options by resetting pairs that should never appear together. + * + * @param FormOptions $opts + * @return bool True if any option was reset + */ + private function fixContradictoryOptions( FormOptions $opts ) { + $fixed = $this->fixBackwardsCompatibilityOptions( $opts ); + + foreach ( $this->filterGroups as $filterGroup ) { + if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) { + $filters = $filterGroup->getFilters(); + + if ( count( $filters ) === 1 ) { + // legacy boolean filters should not be considered + continue; + } + + $allInGroupEnabled = array_reduce( + $filters, + function ( $carry, $filter ) use ( $opts ) { + return $carry && $opts[ $filter->getName() ]; + }, + /* initialValue */ count( $filters ) > 0 + ); + + if ( $allInGroupEnabled ) { + foreach ( $filters as $filter ) { + $opts[ $filter->getName() ] = false; + } + + $fixed = true; + } + } + } + + return $fixed; + } + + /** + * Fix a special case (hideanons=1 and hideliu=1) in a special way, for backwards + * compatibility. + * + * This is deprecated and may be removed. + * + * @param FormOptions $opts + * @return bool True if this change was mode + */ + private function fixBackwardsCompatibilityOptions( FormOptions $opts ) { + if ( $opts['hideanons'] && $opts['hideliu'] ) { + $opts->reset( 'hideanons' ); + if ( !$opts['hidebots'] ) { + $opts->reset( 'hideliu' ); + $opts['hidehumans'] = 1; + } + + return true; + } + + return false; + } + + /** + * Convert parameters values from true/false to 1/0 + * so they are not omitted by wfArrayToCgi() + * Bug 36524 + * + * @param array $params + * @return array + */ + protected function convertParamsForLink( $params ) { + foreach ( $params as &$value ) { + if ( $value === false ) { + $value = '0'; + } + } + unset( $value ); + return $params; } /** @@ -801,8 +1052,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { * @param FormOptions $opts */ protected function buildQuery( &$tables, &$fields, &$conds, &$query_options, - &$join_conds, FormOptions $opts ) { - + &$join_conds, FormOptions $opts + ) { $dbr = $this->getDB(); $user = $this->getUser(); @@ -815,7 +1066,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { $query_options, $join_conds, $opts[$filterGroup->getName()] ); } else { foreach ( $filterGroup->getFilters() as $filter ) { - if ( $opts[$filter->getName()] && $filter->isAllowed( $this ) ) { + if ( $opts[$filter->getName()] ) { $filter->modifyQuery( $dbr, $this, $tables, $fields, $conds, $query_options, $join_conds ); } @@ -824,25 +1075,28 @@ abstract class ChangesListSpecialPage extends SpecialPage { } // Namespace filtering - if ( $opts['namespace'] !== '' ) { - $selectedNS = $dbr->addQuotes( $opts['namespace'] ); - $operator = $opts['invert'] ? '!=' : '='; - $boolean = $opts['invert'] ? 'AND' : 'OR'; - - // Namespace association (T4429) - if ( !$opts['associated'] ) { - $condition = "rc_namespace $operator $selectedNS"; - } else { - // Also add the associated namespace - $associatedNS = $dbr->addQuotes( - MWNamespace::getAssociated( $opts['namespace'] ) + if ( $opts[ 'namespace' ] !== '' ) { + $namespaces = explode( ';', $opts[ 'namespace' ] ); + + if ( $opts[ 'associated' ] ) { + $associatedNamespaces = array_map( + function ( $ns ) { + return MWNamespace::getAssociated( $ns ); + }, + $namespaces ); - $condition = "(rc_namespace $operator $selectedNS " - . $boolean - . " rc_namespace $operator $associatedNS)"; + $namespaces = array_unique( array_merge( $namespaces, $associatedNamespaces ) ); } - $conds[] = $condition; + if ( count( $namespaces ) === 1 ) { + $operator = $opts[ 'invert' ] ? '!=' : '='; + $value = $dbr->addQuotes( reset( $namespaces ) ); + } else { + $operator = $opts[ 'invert' ] ? 'NOT IN' : 'IN'; + sort( $namespaces ); + $value = '(' . $dbr->makeList( $namespaces ) . ')'; + } + $conds[] = "rc_namespace $operator $value"; } } @@ -858,8 +1112,8 @@ abstract class ChangesListSpecialPage extends SpecialPage { * @return bool|ResultWrapper Result or false */ protected function doMainQuery( $tables, $fields, $conds, - $query_options, $join_conds, FormOptions $opts ) { - + $query_options, $join_conds, FormOptions $opts + ) { $tables[] = 'recentchanges'; $fields = array_merge( RecentChange::selectFields(), $fields ); @@ -872,15 +1126,6 @@ abstract class ChangesListSpecialPage extends SpecialPage { '' ); - // It makes no sense to hide both anons and logged-in users. When this occurs, try a guess on - // what the user meant and either show only bots or force anons to be shown. - - // ------- - - // XXX: We're no longer doing this handling. To preserve back-compat, we need to complete - // T151873 (particularly the hideanons/hideliu/hidebots/hidehumans part) in conjunction - // with merging this. - if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, $opts ) ) { @@ -1035,9 +1280,14 @@ abstract class ChangesListSpecialPage extends SpecialPage { $legend .= Html::closeElement( 'dl' ) . "\n"; # Collapsibility + $legendHeading = $this->getUser()->getOption( + 'rcenhancedfilters' + ) ? + $context->msg( 'rcfilters-legend-heading' )->parse() : + $context->msg( 'recentchanges-legend-heading' )->parse(); $legend = '
    ' . - $context->msg( 'recentchanges-legend-heading' )->parse() . + $legendHeading . '
    ' . $legend . '
    ' . '
    '; @@ -1074,28 +1324,52 @@ abstract class ChangesListSpecialPage extends SpecialPage { * @param array &$query_options Array of query options; see IDatabase::select $options * @param array &$join_conds Array of join conditions; see IDatabase::select $join_conds * @param array $selectedExpLevels The allowed active values, sorted + * @param int $now Number of seconds since the UNIX epoch, or 0 if not given + * (optional) */ public function filterOnUserExperienceLevel( $specialPageClassName, $context, $dbr, - &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels ) { - + &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedExpLevels, $now = 0 + ) { global $wgLearnerEdits, - $wgExperiencedUserEdits, - $wgLearnerMemberSince, - $wgExperiencedUserMemberSince; + $wgExperiencedUserEdits, + $wgLearnerMemberSince, + $wgExperiencedUserMemberSince; - $LEVEL_COUNT = 3; + $LEVEL_COUNT = 5; - // If all levels are selected, all logged-in users are included (but no - // anons), so we can short-circuit. + // If all levels are selected, don't filter if ( count( $selectedExpLevels ) === $LEVEL_COUNT ) { + return; + } + + // both 'registered' and 'unregistered', experience levels, if any, are included in 'registered' + if ( + in_array( 'registered', $selectedExpLevels ) && + in_array( 'unregistered', $selectedExpLevels ) + ) { + return; + } + + // 'registered' but not 'unregistered', experience levels, if any, are included in 'registered' + if ( + in_array( 'registered', $selectedExpLevels ) && + !in_array( 'unregistered', $selectedExpLevels ) + ) { $conds[] = 'rc_user != 0'; return; } + if ( $selectedExpLevels === [ 'unregistered' ] ) { + $conds[] = 'rc_user = 0'; + return; + } + $tables[] = 'user'; $join_conds['user'] = [ 'LEFT JOIN', 'rc_user = user_id' ]; - $now = time(); + if ( $now === 0 ) { + $now = time(); + } $secondsPerDay = 86400; $learnerCutoff = $now - $wgLearnerMemberSince * $secondsPerDay; $experiencedUserCutoff = $now - $wgExperiencedUserMemberSince * $secondsPerDay; @@ -1103,7 +1377,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { $aboveNewcomer = $dbr->makeList( [ 'user_editcount >= ' . intval( $wgLearnerEdits ), - 'user_registration <= ' . $dbr->timestamp( $learnerCutoff ), + 'user_registration <= ' . $dbr->addQuotes( $dbr->timestamp( $learnerCutoff ) ), ], IDatabase::LIST_AND ); @@ -1111,29 +1385,45 @@ abstract class ChangesListSpecialPage extends SpecialPage { $aboveLearner = $dbr->makeList( [ 'user_editcount >= ' . intval( $wgExperiencedUserEdits ), - 'user_registration <= ' . $dbr->timestamp( $experiencedUserCutoff ), + 'user_registration <= ' . + $dbr->addQuotes( $dbr->timestamp( $experiencedUserCutoff ) ), ], IDatabase::LIST_AND ); + $conditions = []; + + if ( in_array( 'unregistered', $selectedExpLevels ) ) { + $selectedExpLevels = array_diff( $selectedExpLevels, [ 'unregistered' ] ); + $conditions[] = 'rc_user = 0'; + } + if ( $selectedExpLevels === [ 'newcomer' ] ) { - $conds[] = "NOT ( $aboveNewcomer )"; + $conditions[] = "NOT ( $aboveNewcomer )"; } elseif ( $selectedExpLevels === [ 'learner' ] ) { - $conds[] = $dbr->makeList( + $conditions[] = $dbr->makeList( [ $aboveNewcomer, "NOT ( $aboveLearner )" ], IDatabase::LIST_AND ); } elseif ( $selectedExpLevels === [ 'experienced' ] ) { - $conds[] = $aboveLearner; + $conditions[] = $aboveLearner; } elseif ( $selectedExpLevels === [ 'learner', 'newcomer' ] ) { - $conds[] = "NOT ( $aboveLearner )"; + $conditions[] = "NOT ( $aboveLearner )"; } elseif ( $selectedExpLevels === [ 'experienced', 'newcomer' ] ) { - $conds[] = $dbr->makeList( + $conditions[] = $dbr->makeList( [ "NOT ( $aboveNewcomer )", $aboveLearner ], IDatabase::LIST_OR ); } elseif ( $selectedExpLevels === [ 'experienced', 'learner' ] ) { - $conds[] = $aboveNewcomer; + $conditions[] = $aboveNewcomer; + } elseif ( $selectedExpLevels === [ 'experienced', 'learner', 'newcomer' ] ) { + $conditions[] = 'rc_user != 0'; + } + + if ( count( $conditions ) > 1 ) { + $conds[] = $dbr->makeList( $conditions, IDatabase::LIST_OR ); + } elseif ( count( $conditions ) === 1 ) { + $conds[] = reset( $conditions ); } } } diff --git a/includes/specialpage/ImageQueryPage.php b/includes/specialpage/ImageQueryPage.php index bafee65660..59abefd83e 100644 --- a/includes/specialpage/ImageQueryPage.php +++ b/includes/specialpage/ImageQueryPage.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Variant of QueryPage which uses a gallery to output results, thus diff --git a/includes/specialpage/LoginSignupSpecialPage.php b/includes/specialpage/LoginSignupSpecialPage.php index 5c048a2078..04d391b3db 100644 --- a/includes/specialpage/LoginSignupSpecialPage.php +++ b/includes/specialpage/LoginSignupSpecialPage.php @@ -26,7 +26,9 @@ use MediaWiki\Auth\AuthenticationResponse; use MediaWiki\Auth\AuthManager; use MediaWiki\Auth\Throttler; use MediaWiki\Logger\LoggerFactory; +use MediaWiki\MediaWikiServices; use MediaWiki\Session\SessionManager; +use Wikimedia\ScopedCallback; /** * Holds shared logic for login and account creation pages. @@ -96,7 +98,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { /** * Load basic request parameters for this Special page. - * @param $subPage + * @param string $subPage */ private function loadRequestParameters( $subPage ) { if ( $this->mLoadedRequest ) { @@ -212,6 +214,15 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { * @param string|null $subPage */ public function execute( $subPage ) { + if ( $this->mPosted ) { + $time = microtime( true ); + $profilingScope = new ScopedCallback( function () use ( $time ) { + $time = microtime( true ) - $time; + $statsd = MediaWikiServices::getInstance()->getStatsdDataFactory(); + $statsd->timing( "timing.login.ui.{$this->authAction}", $time * 1000 ); + } ); + } + $authManager = AuthManager::singleton(); $session = SessionManager::getGlobalSession(); @@ -761,7 +772,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { if ( $this->showCreateAccountLink() ) { # Pass any language selection on to the mode switch link if ( $this->mLanguage ) { - $linkq .= '&uselang=' . $this->mLanguage; + $linkq .= '&uselang=' . urlencode( $this->mLanguage ); } // Supply URL, login template creates the button. $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) ); @@ -1145,11 +1156,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { // Don't show a "create account" link if the user can't. if ( $this->showCreateAccountLink() ) { // link to the other action - $linkTitle = $this->getTitleFor( $this->isSignup() ? 'Userlogin' :'CreateAccount' ); + $linkTitle = $this->getTitleFor( $this->isSignup() ? 'Userlogin' : 'CreateAccount' ); $linkq = $this->getReturnToQueryStringFragment(); // Pass any language selection on to the mode switch link if ( $this->mLanguage ) { - $linkq .= '&uselang=' . $this->mLanguage; + $linkq .= '&uselang=' . urlencode( $this->mLanguage ); } $loggedIn = $this->getUser()->isLoggedIn(); @@ -1188,7 +1199,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { /** * Adds fields provided via the deprecated UserLoginForm / UserCreateForm hooks - * @param $fieldDefinitions array + * @param array $fieldDefinitions * @param FakeAuthTemplate $template * @return array */ @@ -1236,6 +1247,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { /** * Returns a string that can be appended to the URL (without encoding) to preserve the * return target. Does not include leading '?'/'&'. + * @return string */ protected function getReturnToQueryStringFragment() { $returnto = ''; @@ -1328,7 +1340,8 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { } /** - * @param array $formDescriptor + * @param array &$formDescriptor + * @param array $requests */ protected function postProcessFormDescriptor( &$formDescriptor, $requests ) { // Pre-fill username (if not creating an account, T46775). @@ -1384,6 +1397,11 @@ class FakeAuthTemplate extends BaseTemplate { /** * Extensions (AntiSpoof and TitleBlacklist) call this in response to * UserCreateForm hook to add checkboxes to the create account form. + * @param string $name + * @param string $value + * @param string $type + * @param string $msg + * @param string|bool $helptext */ public function addInputItem( $name, $value, $type, $msg, $helptext = false ) { // use the same indexes as UserCreateForm just in case someone adds an item manually @@ -1485,6 +1503,7 @@ class LoginForm extends SpecialPage { /** * @deprecated since 1.27 - call LoginHelper::getValidErrorMessages instead. + * @return array */ public static function getValidErrorMessages() { return LoginHelper::getValidErrorMessages(); @@ -1492,6 +1511,8 @@ class LoginForm extends SpecialPage { /** * @deprecated since 1.27 - don't use LoginForm, use AuthManager instead + * @param string $username + * @return array|false */ public static function incrementLoginThrottle( $username ) { wfDeprecated( __METHOD__, "1.27" ); @@ -1503,6 +1524,8 @@ class LoginForm extends SpecialPage { /** * @deprecated since 1.27 - don't use LoginForm, use AuthManager instead + * @param string $username + * @return bool|int */ public static function incLoginThrottle( $username ) { wfDeprecated( __METHOD__, "1.27" ); @@ -1512,6 +1535,8 @@ class LoginForm extends SpecialPage { /** * @deprecated since 1.27 - don't use LoginForm, use AuthManager instead + * @param string $username + * @return void */ public static function clearLoginThrottle( $username ) { wfDeprecated( __METHOD__, "1.27" ); @@ -1548,6 +1573,7 @@ class LoginForm extends SpecialPage { /** * @deprecated since 1.27 - don't use LoginForm, use AuthManager instead + * @return string */ public static function getCreateaccountToken() { wfDeprecated( __METHOD__, '1.27' ); diff --git a/includes/specialpage/PageQueryPage.php b/includes/specialpage/PageQueryPage.php index 45cef2b450..f7f0499350 100644 --- a/includes/specialpage/PageQueryPage.php +++ b/includes/specialpage/PageQueryPage.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Variant of QueryPage which formats the result as a simple link to the page @@ -55,7 +56,7 @@ abstract class PageQueryPage extends QueryPage { if ( $title instanceof Title ) { $text = $wgContLang->convert( $title->getPrefixedText() ); - return Linker::link( $title, htmlspecialchars( $text ) ); + return $this->getLinkRenderer()->makeLink( $title, $text ); } else { return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], Linker::getInvalidTitleDescription( $this->getContext(), $row->namespace, $row->title ) ); diff --git a/includes/specialpage/QueryPage.php b/includes/specialpage/QueryPage.php index 65e82e86f7..73b812899a 100644 --- a/includes/specialpage/QueryPage.php +++ b/includes/specialpage/QueryPage.php @@ -22,6 +22,8 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBError; /** * This is a class for doing query pages; since they're almost all the same, @@ -407,7 +409,7 @@ abstract class QueryPage extends SpecialPage { $options = isset( $query['options'] ) ? (array)$query['options'] : []; $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : []; - if ( count( $order ) ) { + if ( $order ) { $options['ORDER BY'] = $order; } @@ -457,26 +459,46 @@ abstract class QueryPage extends SpecialPage { public function fetchFromCache( $limit, $offset = false ) { $dbr = wfGetDB( DB_REPLICA ); $options = []; + if ( $limit !== false ) { $options['LIMIT'] = intval( $limit ); } + if ( $offset !== false ) { $options['OFFSET'] = intval( $offset ); } + + $order = $this->getCacheOrderFields(); if ( $this->sortDescending() ) { - $options['ORDER BY'] = 'qc_value DESC'; - } else { - $options['ORDER BY'] = 'qc_value ASC'; + foreach ( $order as &$field ) { + $field .= " DESC"; + } } - return $dbr->select( 'querycache', [ 'qc_type', + if ( $order ) { + $options['ORDER BY'] = $order; + } + + return $dbr->select( 'querycache', + [ 'qc_type', 'namespace' => 'qc_namespace', 'title' => 'qc_title', 'value' => 'qc_value' ], [ 'qc_type' => $this->getName() ], - __METHOD__, $options + __METHOD__, + $options ); } + /** + * Return the order fields for fetchFromCache. Default is to always use + * "ORDER BY value" which was the default prior to this function. + * @return array + * @since 1.29 + */ + function getCacheOrderFields() { + return [ 'value' ]; + } + public function getCachedTimestamp() { if ( is_null( $this->cachedTimestamp ) ) { $dbr = wfGetDB( DB_REPLICA ); @@ -579,7 +601,6 @@ abstract class QueryPage extends SpecialPage { # Get the cached result, select one extra row for navigation $res = $this->fetchFromCache( $dbLimit, $this->offset ); if ( !$this->listoutput ) { - # Fetch the timestamp of this update $ts = $this->getCachedTimestamp(); $lang = $this->getLanguage(); diff --git a/includes/specialpage/RedirectSpecialPage.php b/includes/specialpage/RedirectSpecialPage.php index b1ddacfb2f..d3e22a0f62 100644 --- a/includes/specialpage/RedirectSpecialPage.php +++ b/includes/specialpage/RedirectSpecialPage.php @@ -41,7 +41,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage { $query = $this->getRedirectQuery(); // Redirect to a page title with possible query parameters if ( $redirect instanceof Title ) { - $url = $redirect->getFullURL( $query ); + $url = $redirect->getFullUrlForRedirect( $query ); $this->getOutput()->redirect( $url ); return $redirect; @@ -52,8 +52,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage { return $redirect; } else { - $class = static::class; - throw new MWException( "RedirectSpecialPage $class doesn't redirect!" ); + $this->showNoRedirectPage(); } } @@ -106,6 +105,11 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage { public function personallyIdentifiableTarget() { return false; } + + protected function showNoRedirectPage() { + $class = static::class; + throw new MWException( "RedirectSpecialPage $class doesn't redirect!" ); + } } /** diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php index ba58e924ac..4c3ca54b32 100644 --- a/includes/specialpage/SpecialPage.php +++ b/includes/specialpage/SpecialPage.php @@ -33,7 +33,7 @@ use MediaWiki\MediaWikiServices; * * @ingroup SpecialPage */ -class SpecialPage { +class SpecialPage implements MessageLocalizer { // The canonical name of this special page // Also used for the default

    heading, @see getDescription() protected $mName; @@ -383,7 +383,7 @@ class SpecialPage { return true; } elseif ( $securityStatus === AuthManager::SEC_REAUTH ) { $request = $this->getRequest(); - $title = SpecialPage::getTitleFor( 'Userlogin' ); + $title = self::getTitleFor( 'Userlogin' ); $query = [ 'returnto' => $this->getFullTitle()->getPrefixedDBkey(), 'returntoquery' => wfArrayToCgi( array_diff_key( $request->getQueryValues(), @@ -456,7 +456,7 @@ class SpecialPage { $searchEngine->setLimitOffset( $limit, $offset ); $searchEngine->setNamespaces( [] ); $result = $searchEngine->defaultPrefixSearch( $search ); - return array_map( function( Title $t ) { + return array_map( function ( Title $t ) { return $t->getPrefixedText(); }, $result ); } @@ -743,7 +743,7 @@ class SpecialPage { * @return Message * @see wfMessage */ - public function msg( /* $args */ ) { + public function msg( $key /* $args */ ) { $message = call_user_func_array( [ $this->getContext(), 'msg' ], func_get_args() @@ -783,6 +783,10 @@ class SpecialPage { * @since 1.25 */ public function addHelpLink( $to, $overrideBaseUrl = false ) { + if ( $this->including() ) { + return; + } + global $wgContLang; $msg = $this->msg( $wgContLang->lc( $this->getName() ) . '-helppage' ); diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 33e1cc30c8..4433ddb7d6 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -96,6 +96,7 @@ class SpecialPageFactory { 'Block' => 'SpecialBlock', 'Unblock' => 'SpecialUnblock', 'BlockList' => 'SpecialBlockList', + 'AutoblockList' => 'SpecialAutoblockList', 'ChangePassword' => 'SpecialChangePassword', 'BotPasswords' => 'SpecialBotPasswords', 'PasswordReset' => 'SpecialPasswordReset', @@ -144,6 +145,7 @@ class SpecialPageFactory { 'RandomInCategory' => 'SpecialRandomInCategory', 'Randomredirect' => 'SpecialRandomredirect', 'Randomrootpage' => 'SpecialRandomrootpage', + 'GoToInterwiki' => 'SpecialGoToInterwiki', // High use pages 'Mostlinkedcategories' => 'MostlinkedCategoriesPage', @@ -184,6 +186,7 @@ class SpecialPageFactory { 'Revisiondelete' => 'SpecialRevisionDelete', 'RunJobs' => 'SpecialRunJobs', 'Specialpages' => 'SpecialSpecialpages', + 'PageData' => 'SpecialPageData' ]; private static $list; @@ -231,7 +234,6 @@ class SpecialPageFactory { global $wgPageLanguageUseDB, $wgContentHandlerUseDB; if ( !is_array( self::$list ) ) { - self::$list = self::$coreList; if ( !$wgDisableInternalSearch ) { @@ -456,7 +458,7 @@ class SpecialPageFactory { $pages = []; foreach ( self::getPageList() as $name => $rec ) { $page = self::getPage( $name ); - if ( $page->isListed() && !$page->isRestricted() ) { + if ( $page && $page->isListed() && !$page->isRestricted() ) { $pages[$name] = $page; } } @@ -479,8 +481,8 @@ class SpecialPageFactory { } foreach ( self::getPageList() as $name => $rec ) { $page = self::getPage( $name ); - if ( - $page->isListed() + if ( $page + && $page->isListed() && $page->isRestricted() && $page->userCanExecute( $user ) ) { @@ -499,12 +501,12 @@ class SpecialPageFactory { * Returns a title object if the page is redirected, false if there was no such special * page, and true if it was successful. * - * @param Title $title - * @param IContextSource $context + * @param Title &$title + * @param IContextSource &$context * @param bool $including Bool output is being captured for use in {{special:whatever}} * @param LinkRenderer|null $linkRenderer (since 1.28) * - * @return bool + * @return bool|Title */ public static function executePath( Title &$title, IContextSource &$context, $including = false, LinkRenderer $linkRenderer = null diff --git a/includes/specialpage/WantedQueryPage.php b/includes/specialpage/WantedQueryPage.php index 9d92cbda5b..5318895f04 100644 --- a/includes/specialpage/WantedQueryPage.php +++ b/includes/specialpage/WantedQueryPage.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Class definition for a wanted query page like @@ -116,7 +117,40 @@ abstract class WantedQueryPage extends QueryPage { */ private function makeWlhLink( $title, $result ) { $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() ); - $label = $this->msg( 'nlinks' )->numParams( $result->value )->escaped(); - return Linker::link( $wlh, $label ); + $label = $this->msg( 'nlinks' )->numParams( $result->value )->text(); + return $this->getLinkRenderer()->makeLink( $wlh, $label ); } + + /** + * Order by title for pages with the same number of links to them + * + * @return array + * @since 1.29 + */ + function getOrderFields() { + return [ 'value DESC', 'namespace', 'title' ]; + } + + /** + * Do not order descending for all order fields. We will use DESC only on one field, see + * getOrderFields above. This overwrites sortDescending from QueryPage::getOrderFields(). + * Do NOT change this to true unless you remove the phrase DESC in getOrderFiels above. + * If you do a database error will be thrown due to double adding DESC to query! + * + * @return bool + * @since 1.29 + */ + function sortDescending() { + return false; + } + + /** + * Also use the order fields returned by getOrderFields when fetching from the cache. + * @return array + * @since 1.29 + */ + function getCacheOrderFields() { + return $this->getOrderFields(); + } + } diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php index e7030c56e5..902878781c 100644 --- a/includes/specials/SpecialActiveusers.php +++ b/includes/specials/SpecialActiveusers.php @@ -2,8 +2,6 @@ /** * Implements Special:Activeusers * - * Copyright © 2008 Aaron Schulz - * * 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 @@ -30,9 +28,6 @@ */ class SpecialActiveUsers extends SpecialPage { - /** - * Constructor - */ public function __construct() { parent::__construct( 'Activeusers' ); } diff --git a/includes/specials/SpecialAllMessages.php b/includes/specials/SpecialAllMessages.php index 49ca9f45de..9e66447fe3 100644 --- a/includes/specials/SpecialAllMessages.php +++ b/includes/specials/SpecialAllMessages.php @@ -33,9 +33,6 @@ class SpecialAllMessages extends SpecialPage { */ protected $table; - /** - * Constructor - */ public function __construct() { parent::__construct( 'Allmessages' ); } @@ -67,8 +64,6 @@ class SpecialAllMessages extends SpecialPage { wfGetLangObj( $request->getVal( 'lang', $par ) ) ); - $this->langcode = $this->table->lang->getCode(); - $out->addHTML( $this->table->buildForm() ); $out->addParserOutputContent( $this->table->getFullOutput() ); } diff --git a/includes/specials/SpecialAllPages.php b/includes/specials/SpecialAllPages.php index 4b8446a795..4d84e316ce 100644 --- a/includes/specials/SpecialAllPages.php +++ b/includes/specials/SpecialAllPages.php @@ -44,8 +44,6 @@ class SpecialAllPages extends IncludableSpecialPage { protected $nsfromMsg = 'allpagesfrom'; /** - * Constructor - * * @param string $name Name of the special page, as seen in links and URLs (default: 'Allpages') */ function __construct( $name = 'Allpages' ) { @@ -69,7 +67,11 @@ class SpecialAllPages extends IncludableSpecialPage { $from = $request->getVal( 'from', null ); $to = $request->getVal( 'to', null ); $namespace = $request->getInt( 'namespace' ); - $hideredirects = $request->getBool( 'hideredirects', false ); + + $miserMode = (bool)$this->getConfig()->get( 'MiserMode' ); + + // Redirects filter is disabled in MiserMode + $hideredirects = $request->getBool( 'hideredirects', false ) && !$miserMode; $namespaces = $this->getLanguage()->getNamespaces(); @@ -100,6 +102,7 @@ class SpecialAllPages extends IncludableSpecialPage { protected function outputHTMLForm( $namespace = NS_MAIN, $from = '', $to = '', $hideRedirects = false ) { + $miserMode = (bool)$this->getConfig()->get( 'MiserMode' ); $fields = [ 'from' => [ 'type' => 'text', @@ -133,6 +136,11 @@ class SpecialAllPages extends IncludableSpecialPage { 'value' => $hideRedirects, ], ]; + + if ( $miserMode ) { + unset( $fields['hideredirects'] ); + } + $form = HTMLForm::factory( 'table', $fields, $this->getContext() ); $form->setMethod( 'get' ) ->setWrapperLegendMsg( 'allpages' ) diff --git a/includes/specials/SpecialAutoblockList.php b/includes/specials/SpecialAutoblockList.php new file mode 100644 index 0000000000..bf138656bd --- /dev/null +++ b/includes/specials/SpecialAutoblockList.php @@ -0,0 +1,167 @@ +setHeaders(); + $this->outputHeader(); + $out = $this->getOutput(); + $lang = $this->getLanguage(); + $out->setPageTitle( $this->msg( 'autoblocklist' ) ); + $this->addHelpLink( 'Autoblock' ); + $out->addModuleStyles( [ 'mediawiki.special' ] ); + + # setup BlockListPager here to get the actual default Limit + $pager = $this->getBlockListPager(); + + # Just show the block list + $fields = [ + 'Limit' => [ + 'type' => 'limitselect', + 'label-message' => 'table_pager_limit_label', + 'options' => [ + $lang->formatNum( 20 ) => 20, + $lang->formatNum( 50 ) => 50, + $lang->formatNum( 100 ) => 100, + $lang->formatNum( 250 ) => 250, + $lang->formatNum( 500 ) => 500, + ], + 'name' => 'limit', + 'default' => $pager->getLimit(), + ] + ]; + + $context = new DerivativeContext( $this->getContext() ); + $context->setTitle( $this->getPageTitle() ); // Remove subpage + $form = HTMLForm::factory( 'ooui', $fields, $context ); + $form->setMethod( 'get' ) + ->setFormIdentifier( 'blocklist' ) + ->setWrapperLegendMsg( 'autoblocklist-legend' ) + ->setSubmitTextMsg( 'autoblocklist-submit' ) + ->setSubmitProgressive() + ->prepareForm() + ->displayForm( false ); + + $this->showTotal( $pager ); + $this->showList( $pager ); + } + + /** + * Setup a new BlockListPager instance. + * @return BlockListPager + */ + protected function getBlockListPager() { + $conds = [ + 'ipb_parent_block_id IS NOT NULL' + ]; + # Is the user allowed to see hidden blocks? + if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { + $conds['ipb_deleted'] = 0; + } + + return new BlockListPager( $this, $conds ); + } + + /** + * Show total number of autoblocks on top of the table + * + * @param BlockListPager $pager The BlockListPager instance for this page + */ + protected function showTotal( BlockListPager $pager ) { + $out = $this->getOutput(); + $out->addHTML( + Html::element( 'div', [ 'style' => 'font-weight: bold;' ], + $this->msg( 'autoblocklist-total-autoblocks', $pager->getTotalAutoblocks() )->parse() ) + . "\n" + ); + } + + /** + * Show the list of blocked accounts matching the actual filter. + * @param BlockListPager $pager The BlockListPager instance for this page + */ + protected function showList( BlockListPager $pager ) { + $out = $this->getOutput(); + + # Check for other blocks, i.e. global/tor blocks + $otherAutoblockLink = []; + Hooks::run( 'OtherAutoblockLogLink', [ &$otherAutoblockLink ] ); + + # Show additional header for the local block only when other blocks exists. + # Not necessary in a standard installation without such extensions enabled + if ( count( $otherAutoblockLink ) ) { + $out->addHTML( + Html::element( 'h2', [], $this->msg( 'autoblocklist-localblocks', + $pager->getNumRows() )->parse() ) + . "\n" + ); + } + + if ( $pager->getNumRows() ) { + $out->addParserOutputContent( $pager->getFullOutput() ); + } else { + $out->addWikiMsg( 'autoblocklist-empty' ); + } + + if ( count( $otherAutoblockLink ) ) { + $out->addHTML( + Html::rawElement( + 'h2', + [], + $this->msg( 'autoblocklist-otherblocks', count( $otherAutoblockLink ) )->parse() + ) . "\n" + ); + $list = ''; + foreach ( $otherAutoblockLink as $link ) { + $list .= Html::rawElement( 'li', [], $link ) . "\n"; + } + $out->addHTML( + Html::rawElement( + 'ul', + [ 'class' => 'mw-autoblocklist-otherblocks' ], + $list + ) . "\n" + ); + } + } + + protected function getGroupName() { + return 'users'; + } +} diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index 04c04b239c..66e4fbeda2 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -233,7 +233,7 @@ class SpecialBlock extends FormSpecialPage { /** * If the user has already been blocked with similar settings, load that block * and change the defaults for the form fields to match the existing settings. - * @param array $fields HTMLForm descriptor array + * @param array &$fields HTMLForm descriptor array * @return bool Whether fields were altered (that is, whether the target is * already blocked) */ diff --git a/includes/specials/SpecialBotPasswords.php b/includes/specials/SpecialBotPasswords.php index 1dd78d7cfc..dfdbb067c0 100644 --- a/includes/specials/SpecialBotPasswords.php +++ b/includes/specials/SpecialBotPasswords.php @@ -123,7 +123,7 @@ class SpecialBotPasswords extends FormSpecialPage { $showGrants ), 'default' => array_map( - function( $g ) { + function ( $g ) { return "grant-$g"; }, $this->botPassword->getGrants() @@ -131,14 +131,14 @@ class SpecialBotPasswords extends FormSpecialPage { 'tooltips' => array_combine( array_map( 'MWGrants::getGrantsLink', $showGrants ), array_map( - function( $rights ) use ( $lang ) { + function ( $rights ) use ( $lang ) { return $lang->semicolonList( array_map( 'User::getRightDescription', $rights ) ); }, array_intersect_key( MWGrants::getRightsByGrant(), array_flip( $showGrants ) ) ) ), 'force-options-on' => array_map( - function( $g ) { + function ( $g ) { return "grant-$g"; }, MWGrants::getHiddenGrants() diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php index 9aba41e25c..cf9ae07187 100644 --- a/includes/specials/SpecialBrokenRedirects.php +++ b/includes/specials/SpecialBrokenRedirects.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page listing redirects to non existent page. Those should be @@ -65,6 +66,7 @@ class BrokenRedirectsPage extends QueryPage { 'value' => 'p1.page_title', 'rd_namespace', 'rd_title', + 'rd_fragment', ], 'conds' => [ // Exclude pages that don't exist locally as wiki pages, @@ -101,7 +103,7 @@ class BrokenRedirectsPage extends QueryPage { function formatResult( $skin, $result ) { $fromObj = Title::makeTitle( $result->namespace, $result->title ); if ( isset( $result->rd_title ) ) { - $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title ); + $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title, $result->rd_fragment ); } else { $blinks = $fromObj->getBrokenLinksFrom(); # TODO: check for redirect, not for links if ( $blinks ) { @@ -138,7 +140,7 @@ class BrokenRedirectsPage extends QueryPage { [ 'action' => 'edit' ] ); } - $to = $linkRenderer->makeBrokenLink( $toObj ); + $to = $linkRenderer->makeBrokenLink( $toObj, $toObj->getFullText() ); $arr = $this->getLanguage()->getArrow(); $out = $from . $this->msg( 'word-separator' )->escaped(); diff --git a/includes/specials/SpecialChangeContentModel.php b/includes/specials/SpecialChangeContentModel.php index a36b4148bc..bee6a39832 100644 --- a/includes/specials/SpecialChangeContentModel.php +++ b/includes/specials/SpecialChangeContentModel.php @@ -115,7 +115,7 @@ class SpecialChangeContentModel extends FormSpecialPage { 'reason' => [ 'type' => 'text', 'name' => 'reason', - 'validation-callback' => function( $reason ) { + 'validation-callback' => function ( $reason ) { $match = EditPage::matchSummarySpamRegex( $reason ); if ( $match ) { return $this->msg( 'spamprotectionmatch', $match )->parse(); @@ -198,7 +198,7 @@ class SpecialChangeContentModel extends FormSpecialPage { $oldContent = $this->oldRevision->getContent(); try { $newContent = ContentHandler::makeContent( - $oldContent->getNativeData(), $this->title, $data['model'] + $oldContent->serialize(), $this->title, $data['model'] ); } catch ( MWException $e ) { return Status::newFatal( diff --git a/includes/specials/SpecialChangeCredentials.php b/includes/specials/SpecialChangeCredentials.php index 47f8d2f436..970a2e29f2 100644 --- a/includes/specials/SpecialChangeCredentials.php +++ b/includes/specials/SpecialChangeCredentials.php @@ -258,7 +258,7 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage { } $title = Title::newFromText( $returnTo ); - return $title->getFullURL( $returnToQuery ); + return $title->getFullUrlForRedirect( $returnToQuery ); } protected function getRequestBlacklist() { diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php index 785447f7f9..c5143002c3 100644 --- a/includes/specials/SpecialChangeEmail.php +++ b/includes/specials/SpecialChangeEmail.php @@ -63,7 +63,6 @@ class SpecialChangeEmail extends FormSpecialPage { } protected function checkExecutePermissions( User $user ) { - if ( !AuthManager::singleton()->allowsPropertyChange( 'emailaddress' ) ) { throw new ErrorPageError( 'changeemail', 'cannotchangeemail' ); } @@ -136,7 +135,7 @@ class SpecialChangeEmail extends FormSpecialPage { $query = $request->getVal( 'returntoquery' ); if ( $this->status->value === true ) { - $this->getOutput()->redirect( $titleObj->getFullURL( $query ) ); + $this->getOutput()->redirect( $titleObj->getFullUrlForRedirect( $query ) ); } elseif ( $this->status->value === 'eauth' ) { # Notify user that a confirmation email has been sent... $this->getOutput()->wrapWikiMsg( "
    \n$1\n
    ", diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 1028002a23..1b14fcbe10 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -21,6 +21,8 @@ * @ingroup SpecialPage */ +use MediaWiki\Widget\DateInputWidget; + /** * Special:Contributions, show user contributions in a paged list * @@ -40,8 +42,11 @@ class SpecialContributions extends IncludableSpecialPage { $out->addModuleStyles( [ 'mediawiki.special', 'mediawiki.special.changeslist', + 'mediawiki.widgets.DateInputWidget.styles', ] ); + $out->addModules( 'mediawiki.special.contributions' ); $this->addHelpLink( 'Help:User contributions' ); + $out->enableOOUI(); $this->opts = []; $request = $this->getRequest(); @@ -126,13 +131,14 @@ class SpecialContributions extends IncludableSpecialPage { $skip = $request->getText( 'offset' ) || $request->getText( 'dir' ) == 'prev'; # Offset overrides year/month selection - if ( $skip ) { - $this->opts['year'] = ''; - $this->opts['month'] = ''; - } else { - $this->opts['year'] = $request->getIntOrNull( 'year' ); - $this->opts['month'] = $request->getIntOrNull( 'month' ); + if ( !$skip ) { + $this->opts['year'] = $request->getVal( 'year' ); + $this->opts['month'] = $request->getVal( 'month' ); + + $this->opts['start'] = $request->getVal( 'start' ); + $this->opts['end'] = $request->getVal( 'end' ); } + $this->opts = ContribsPager::processDateFilter( $this->opts ); $feedType = $request->getVal( 'feed' ); @@ -190,8 +196,8 @@ class SpecialContributions extends IncludableSpecialPage { 'contribs' => $this->opts['contribs'], 'namespace' => $this->opts['namespace'], 'tagfilter' => $this->opts['tagfilter'], - 'year' => $this->opts['year'], - 'month' => $this->opts['month'], + 'start' => $this->opts['start'], + 'end' => $this->opts['end'], 'deletedOnly' => $this->opts['deletedOnly'], 'topOnly' => $this->opts['topOnly'], 'newOnly' => $this->opts['newOnly'], @@ -320,7 +326,6 @@ class SpecialContributions extends IncludableSpecialPage { * @return array */ public static function getUserLinks( SpecialPage $sp, User $target ) { - $id = $target->getId(); $username = $target->getName(); $userpage = $target->getUserPage(); @@ -395,7 +400,7 @@ class SpecialContributions extends IncludableSpecialPage { if ( $userrightsPage->userCanChangeRights( $target ) ) { $tools['userrights'] = $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Userrights', $username ), - $sp->msg( 'sp-contributions-userrights' )->text() + $sp->msg( 'sp-contributions-userrights', $username )->text() ); } @@ -432,12 +437,12 @@ class SpecialContributions extends IncludableSpecialPage { $this->opts['contribs'] = 'user'; } - if ( !isset( $this->opts['year'] ) ) { - $this->opts['year'] = ''; + if ( !isset( $this->opts['start'] ) ) { + $this->opts['start'] = ''; } - if ( !isset( $this->opts['month'] ) ) { - $this->opts['month'] = ''; + if ( !isset( $this->opts['end'] ) ) { + $this->opts['end'] = ''; } if ( $this->opts['contribs'] == 'newbie' ) { @@ -478,6 +483,8 @@ class SpecialContributions extends IncludableSpecialPage { 'contribs', 'year', 'month', + 'start', + 'end', 'topOnly', 'newOnly', 'hideMinor', @@ -652,15 +659,32 @@ class SpecialContributions extends IncludableSpecialPage { implode( '', $filters ) ); - $dateSelectionAndSubmit = Xml::tags( 'div', [], - Xml::dateMenu( - $this->opts['year'] === '' ? MWTimestamp::getInstance()->format( 'Y' ) : $this->opts['year'], - $this->opts['month'] - ) . ' ' . - Html::submitButton( - $this->msg( 'sp-contributions-submit' )->text(), - [ 'class' => 'mw-submit' ], [ 'mw-ui-progressive' ] - ) + $dateRangeSelection = Html::rawElement( + 'div', + [], + Xml::label( wfMessage( 'date-range-from' )->text(), 'mw-date-start' ) . ' ' . + new DateInputWidget( [ + 'infusable' => true, + 'id' => 'mw-date-start', + 'name' => 'start', + 'value' => $this->opts['start'], + 'longDisplayFormat' => true, + ] ) . '
    ' . + Xml::label( wfMessage( 'date-range-to' )->text(), 'mw-date-end' ) . ' ' . + new DateInputWidget( [ + 'infusable' => true, + 'id' => 'mw-date-end', + 'name' => 'end', + 'value' => $this->opts['end'], + 'longDisplayFormat' => true, + ] ) + ); + + $submit = Xml::tags( 'div', [], + Html::submitButton( + $this->msg( 'sp-contributions-submit' )->text(), + [ 'class' => 'mw-submit' ], [ 'mw-ui-progressive' ] + ) ); $form .= Xml::fieldset( @@ -669,7 +693,8 @@ class SpecialContributions extends IncludableSpecialPage { $namespaceSelection . $filterSelection . $extraOptions . - $dateSelectionAndSubmit, + $dateRangeSelection . + $submit, [ 'class' => 'mw-contributions-table' ] ); diff --git a/includes/specials/SpecialDiff.php b/includes/specials/SpecialDiff.php index 9804e777b1..28cd0d195a 100644 --- a/includes/specials/SpecialDiff.php +++ b/includes/specials/SpecialDiff.php @@ -56,11 +56,64 @@ class SpecialDiff extends RedirectSpecialPage { $this->mAddedRedirectParams['oldid'] = $parts[0]; $this->mAddedRedirectParams['diff'] = $parts[1]; } else { - // Wrong number of parameters, bail out - $this->addHelpLink( 'Help:Diff' ); - throw new ErrorPageError( 'nopagetitle', 'nopagetext' ); + return false; } return true; } + + protected function showNoRedirectPage() { + $this->addHelpLink( 'Help:Diff' ); + $this->setHeaders(); + $this->outputHeader(); + $this->showForm(); + } + + private function showForm() { + $form = HTMLForm::factory( 'ooui', [ + 'oldid' => [ + 'name' => 'oldid', + 'type' => 'int', + 'label-message' => 'diff-form-oldid', + ], + 'diff' => [ + 'name' => 'diff', + 'class' => 'HTMLTextField', + 'label-message' => 'diff-form-revid', + ], + ], $this->getContext(), 'diff-form' ); + $form->setSubmitTextMsg( 'diff-form-submit' ); + $form->setSubmitCallback( [ $this, 'onFormSubmit' ] ); + $form->show(); + } + + public function onFormSubmit( $formData ) { + $params = []; + if ( $formData['oldid'] ) { + $params[] = $formData['oldid']; + } + if ( $formData['diff'] ) { + $params[] = $formData['diff']; + } + $title = $this->getPageTitle( $params ? implode( '/', $params ) : null ); + $url = $title->getFullUrlForRedirect(); + $this->getOutput()->redirect( $url ); + } + + public function getDescription() { + // 'diff' message is in lowercase, using own message + return $this->msg( 'diff-form' )->text(); + } + + public function getName() { + return 'diff-form'; + } + + public function isListed() { + return true; + } + + protected function getGroupName() { + return 'redirects'; + } } diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php index 59351dcba5..d73ac19875 100644 --- a/includes/specials/SpecialDoubleRedirects.php +++ b/includes/specials/SpecialDoubleRedirects.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page listing redirects to redirecting page. @@ -65,14 +66,15 @@ class DoubleRedirectsPage extends QueryPage { 'title' => 'pa.page_title', 'value' => 'pa.page_title', - 'nsb' => 'pb.page_namespace', - 'tb' => 'pb.page_title', + 'b_namespace' => 'pb.page_namespace', + 'b_title' => 'pb.page_title', // Select fields from redirect instead of page. Because there may // not actually be a page table row for this target (e.g. for interwiki redirects) - 'nsc' => 'rb.rd_namespace', - 'tc' => 'rb.rd_title', - 'iwc' => 'rb.rd_interwiki', + 'c_namespace' => 'rb.rd_namespace', + 'c_title' => 'rb.rd_title', + 'c_fragment' => 'rb.rd_fragment', + 'c_interwiki' => 'rb.rd_interwiki', ], 'conds' => [ 'ra.rd_from = pa.page_id', @@ -115,45 +117,41 @@ class DoubleRedirectsPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { - $titleA = Title::makeTitle( $result->namespace, $result->title ); - - // If only titleA is in the query, it means this came from - // querycache (which only saves 3 columns). + // If no Title B or C is in the query, it means this came from + // querycache (which only saves the 3 columns for title A). // That does save the bulk of the query cost, but now we need to // get a little more detail about each individual entry quickly // using the filter of reallyGetQueryInfo. - if ( $result && !isset( $result->nsb ) ) { - $dbr = wfGetDB( DB_REPLICA ); - $qi = $this->reallyGetQueryInfo( - $result->namespace, - $result->title - ); - $res = $dbr->select( - $qi['tables'], - $qi['fields'], - $qi['conds'], - __METHOD__ - ); - - if ( $res ) { - $result = $dbr->fetchObject( $res ); + $deep = false; + if ( $result ) { + if ( isset( $result->b_namespace ) ) { + $deep = $result; + } else { + $dbr = wfGetDB( DB_REPLICA ); + $qi = $this->reallyGetQueryInfo( + $result->namespace, + $result->title + ); + $res = $dbr->select( + $qi['tables'], + $qi['fields'], + $qi['conds'], + __METHOD__ + ); + + if ( $res ) { + $deep = $dbr->fetchObject( $res ) ?: false; + } } } + + $titleA = Title::makeTitle( $result->namespace, $result->title ); + $linkRenderer = $this->getLinkRenderer(); - if ( !$result ) { + if ( !$deep ) { return '' . $linkRenderer->makeLink( $titleA, null, [], [ 'redirect' => 'no' ] ) . ''; } - $titleB = Title::makeTitle( $result->nsb, $result->tb ); - $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc ); - - $linkA = $linkRenderer->makeKnownLink( - $titleA, - null, - [], - [ 'redirect' => 'no' ] - ); - // if the page is editable, add an edit link if ( // check user permissions @@ -171,6 +169,14 @@ class DoubleRedirectsPage extends QueryPage { $edit = ''; } + $linkA = $linkRenderer->makeKnownLink( + $titleA, + null, + [], + [ 'redirect' => 'no' ] + ); + + $titleB = Title::makeTitle( $deep->b_namespace, $deep->b_title ); $linkB = $linkRenderer->makeKnownLink( $titleB, null, @@ -178,7 +184,13 @@ class DoubleRedirectsPage extends QueryPage { [ 'redirect' => 'no' ] ); - $linkC = $linkRenderer->makeKnownLink( $titleC ); + $titleC = Title::makeTitle( + $deep->c_namespace, + $deep->c_title, + $deep->c_fragment, + $deep->c_interwiki + ); + $linkC = $linkRenderer->makeKnownLink( $titleC, $titleC->getFullText() ); $lang = $this->getLanguage(); $arr = $lang->getArrow() . $lang->getDirMark(); @@ -200,13 +212,13 @@ class DoubleRedirectsPage extends QueryPage { $batch = new LinkBatch; foreach ( $res as $row ) { $batch->add( $row->namespace, $row->title ); - if ( isset( $row->nsb ) ) { + if ( isset( $row->b_namespace ) ) { // lazy loaded when using cached results - $batch->add( $row->nsb, $row->tb ); + $batch->add( $row->b_namespace, $row->b_title ); } - if ( isset( $row->iwc ) && !$row->iwc ) { + if ( isset( $row->c_interwiki ) && !$row->c_interwiki ) { // lazy loaded when using cached result, not added when interwiki link - $batch->add( $row->nsc, $row->tc ); + $batch->add( $row->c_namespace, $row->c_title ); } } $batch->execute(); diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php index a69406cb8d..830b43817f 100644 --- a/includes/specials/SpecialEmailuser.php +++ b/includes/specials/SpecialEmailuser.php @@ -289,7 +289,7 @@ class SpecialEmailUser extends UnlistedSpecialPage { 'text', [ 'id' => 'emailusertarget', - 'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest + 'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest 'autofocus' => true, 'size' => 30, ] diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php index f5e9e49b69..8e6c446238 100644 --- a/includes/specials/SpecialExport.php +++ b/includes/specials/SpecialExport.php @@ -288,7 +288,7 @@ class SpecialExport extends SpecialPage { $formDescriptor += [ 'wpDownload' => [ 'type' => 'check', - 'name' =>'wpDownload', + 'name' => 'wpDownload', 'id' => 'wpDownload', 'default' => $request->wasPosted() ? $request->getCheck( 'wpDownload' ) : true, 'label-message' => 'export-download', @@ -330,7 +330,6 @@ class SpecialExport extends SpecialPage { * @param bool $exportall Whether to export everything */ private function doExport( $page, $history, $list_authors, $exportall ) { - // If we are grabbing everything, enable full history and ignore the rest if ( $exportall ) { $history = WikiExporter::FULL; diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php index 49caaa3a1d..c18faa12d3 100644 --- a/includes/specials/SpecialFilepath.php +++ b/includes/specials/SpecialFilepath.php @@ -35,7 +35,7 @@ class SpecialFilepath extends RedirectSpecialPage { /** * Implement by redirecting through Special:Redirect/file. * - * @param string|null $subpage + * @param string|null $par * @return Title */ public function getRedirect( $par ) { diff --git a/includes/specials/SpecialGoToInterwiki.php b/includes/specials/SpecialGoToInterwiki.php new file mode 100644 index 0000000000..809a14aac3 --- /dev/null +++ b/includes/specials/SpecialGoToInterwiki.php @@ -0,0 +1,79 @@ +setHeaders(); + $target = Title::newFromText( $par ); + // Disallow special pages as a precaution against + // possible redirect loops. + if ( !$target || $target->isSpecialPage() ) { + $this->getOutput()->setStatusCode( 404 ); + $this->getOutput()->addWikiMsg( 'gotointerwiki-invalid' ); + return; + } + + $url = $target->getFullURL(); + if ( !$target->isExternal() || $target->isLocal() ) { + // Either a normal page, or a local interwiki. + // just redirect. + $this->getOutput()->redirect( $url, '301' ); + } else { + $this->getOutput()->addWikiMsg( + 'gotointerwiki-external', + $url, + $target->getFullText() + ); + } + } + + /** + * @return bool + */ + public function requiresWrite() { + return false; + } + + /** + * @return String + */ + protected function getGroupName() { + return 'redirects'; + } +} diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php index a2930fcebe..beb454d669 100644 --- a/includes/specials/SpecialImport.php +++ b/includes/specials/SpecialImport.php @@ -46,9 +46,6 @@ class SpecialImport extends SpecialPage { private $pageLinkDepth; private $importSources; - /** - * Constructor - */ public function __construct() { parent::__construct( 'Import', 'import' ); } @@ -176,10 +173,8 @@ class SpecialImport extends SpecialPage { $out = $this->getOutput(); if ( !$source->isGood() ) { - $out->wrapWikiMsg( - "

    \n$1\n

    ", - [ 'importfailed', $source->getWikiText() ] - ); + $out->addWikiText( "

    \n" . + $this->msg( 'importfailed', $source->getWikiText() )->parse() . "\n

    " ); } else { $importer = new WikiImporter( $source->value, $this->getConfig() ); if ( !is_null( $this->namespace ) ) { diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php index dc6a619750..17c64c8ede 100644 --- a/includes/specials/SpecialJavaScriptTest.php +++ b/includes/specials/SpecialJavaScriptTest.php @@ -134,14 +134,26 @@ class SpecialJavaScriptTest extends SpecialPage { // Catch exceptions (such as "dependency missing" or "unknown module") so that we // always start QUnit. Re-throw so that they are caught and reported as global exceptions // by QUnit and Karma. - $code .= '(function () {' - . 'var start = window.__karma__ ? window.__karma__.start : QUnit.start;' - . 'try {' - . 'mw.loader.using( ' . Xml::encodeJsVar( $modules ) . ' )' - . '.always( start )' - . '.fail( function ( e ) { throw e; } );' - . '} catch ( e ) { start(); throw e; }' - . '}());'; + $modules = Xml::encodeJsVar( $modules ); + $code .= <<\n
  • ", $descs ) . '
  • '; } - $id = \Sanitizer::escapeId( $grant ); + $id = Sanitizer::escapeIdForAttribute( $grant ); $out->addHTML( \Html::rawElement( 'tr', [ 'id' => $id ], "" . $this->msg( diff --git a/includes/specials/SpecialListgrouprights.php b/includes/specials/SpecialListgrouprights.php index 7a25e55d58..2315887aa5 100644 --- a/includes/specials/SpecialListgrouprights.php +++ b/includes/specials/SpecialListgrouprights.php @@ -126,7 +126,7 @@ class SpecialListGroupRights extends SpecialPage { ? $groupsRemoveFromSelf[$group] : []; - $id = $group == '*' ? false : Sanitizer::escapeId( $group ); + $id = $group == '*' ? false : Sanitizer::escapeIdForAttribute( $group ); $out->addHTML( Html::rawElement( 'tr', [ 'id' => $id ], " $grouppage$grouplink " . diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php index b2d6a33291..f81c03c77a 100644 --- a/includes/specials/SpecialListredirects.php +++ b/includes/specials/SpecialListredirects.php @@ -25,6 +25,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Special:Listredirects - Lists all the redirects on the wiki. @@ -136,7 +137,7 @@ class ListredirectsPage extends QueryPage { # Make a link to the destination page $lang = $this->getLanguage(); $arr = $lang->getArrow() . $lang->getDirMark(); - $targetLink = $linkRenderer->makeLink( $target ); + $targetLink = $linkRenderer->makeLink( $target, $target->getFullText() ); return "$rd_link $arr $targetLink"; } else { diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php index 1a8dccf4de..dee2968d05 100644 --- a/includes/specials/SpecialListusers.php +++ b/includes/specials/SpecialListusers.php @@ -29,9 +29,7 @@ * @ingroup SpecialPage */ class SpecialListUsers extends IncludableSpecialPage { - /** - * Constructor - */ + public function __construct() { parent::__construct( 'Listusers' ); } diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php index 195d08b1c5..511cfbf5d0 100644 --- a/includes/specials/SpecialLog.php +++ b/includes/specials/SpecialLog.php @@ -2,8 +2,6 @@ /** * Implements Special:Log * - * Copyright © 2008 Aaron Schulz - * * 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 @@ -167,7 +165,7 @@ class SpecialLog extends SpecialPage { # Create a LogPager item to get the results and a LogEventsList item to format them... $loglist = new LogEventsList( $this->getContext(), - null, + $this->getLinkRenderer(), LogEventsList::USE_CHECKBOXES ); diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php index 52cb30a1bc..3290abd5a3 100644 --- a/includes/specials/SpecialMIMEsearch.php +++ b/includes/specials/SpecialMIMEsearch.php @@ -74,6 +74,7 @@ class MIMEsearchPage extends QueryPage { 'img_major_mime' => $this->major, // This is in order to trigger using // the img_media_mime index in "range" mode. + // @todo how is order defined? use MimeAnalyzer::getMediaTypes? 'img_media_type' => [ MEDIATYPE_BITMAP, MEDIATYPE_DRAWING, @@ -85,6 +86,7 @@ class MIMEsearchPage extends QueryPage { MEDIATYPE_TEXT, MEDIATYPE_EXECUTABLE, MEDIATYPE_ARCHIVE, + MEDIATYPE_3D, ], ] + $minorType, ]; diff --git a/includes/specials/SpecialMediaStatistics.php b/includes/specials/SpecialMediaStatistics.php index a88767ae4d..1789bb2bda 100644 --- a/includes/specials/SpecialMediaStatistics.php +++ b/includes/specials/SpecialMediaStatistics.php @@ -23,6 +23,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * @ingroup SpecialPage @@ -62,6 +63,7 @@ class MediaStatisticsPage extends QueryPage { * come out of querycache table is the order they went in. Which is hacky. * However, other special pages like Special:Deadendpages and * Special:BrokenRedirects also rely on this. + * @return array */ public function getQueryInfo() { $dbr = wfGetDB( DB_REPLICA ); @@ -83,10 +85,6 @@ class MediaStatisticsPage extends QueryPage { 'namespace' => NS_MEDIA, /* needs to be something */ 'value' => '1' ], - 'conds' => [ - // WMF has a random null row in the db - 'img_media_type IS NOT NULL' - ], 'options' => [ 'GROUP BY' => [ 'img_media_type', @@ -172,7 +170,7 @@ class MediaStatisticsPage extends QueryPage { * * @param string $mime mime type (e.g. image/jpeg) * @param int $count Number of images of this type - * @param int $totalBytes Total space for images of this type + * @param int $bytes Total space for images of this type */ protected function outputTableRow( $mime, $count, $bytes ) { $mimeSearch = SpecialPage::getTitleFor( 'MIMEsearch', $mime ); @@ -200,7 +198,7 @@ class MediaStatisticsPage extends QueryPage { $row .= Html::rawElement( 'td', // Make sure js sorts it in numeric order - [ 'data-sort-value' => $bytes ], + [ 'data-sort-value' => $bytes ], $this->msg( 'mediastatistics-nbytes' ) ->numParams( $bytes ) ->sizeParams( $bytes ) @@ -254,6 +252,7 @@ class MediaStatisticsPage extends QueryPage { * Output the start of the table * * Including opening , and first with column headers. + * @param string $mediaType */ protected function outputTableStart( $mediaType ) { $this->getOutput()->addHTML( @@ -310,6 +309,7 @@ class MediaStatisticsPage extends QueryPage { // mediastatistics-header-video, mediastatistics-header-multimedia, // mediastatistics-header-office, mediastatistics-header-text, // mediastatistics-header-executable, mediastatistics-header-archive, + // mediastatistics-header-3d, $this->msg( 'mediastatistics-header-' . strtolower( $mediaType ) )->text() ) ); diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php index 0776eec7b9..bebed12e38 100644 --- a/includes/specials/SpecialMostcategories.php +++ b/includes/specials/SpecialMostcategories.php @@ -25,6 +25,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page that list pages that have highest category count diff --git a/includes/specials/SpecialMostinterwikis.php b/includes/specials/SpecialMostinterwikis.php index 8560dca357..5e56694f6f 100644 --- a/includes/specials/SpecialMostinterwikis.php +++ b/includes/specials/SpecialMostinterwikis.php @@ -2,8 +2,6 @@ /** * Implements Special:Mostinterwikis * - * Copyright © 2012 Umherirrender - * * 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 @@ -21,10 +19,10 @@ * * @file * @ingroup SpecialPage - * @author Umherirrender */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page that listed pages that have highest interwiki count diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php index ff8550d10a..fbfaa73831 100644 --- a/includes/specials/SpecialMostlinked.php +++ b/includes/specials/SpecialMostlinked.php @@ -26,6 +26,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page to show pages ordered by the number of pages linking to them. diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php index 699940b2e9..956207f883 100644 --- a/includes/specials/SpecialMostlinkedcategories.php +++ b/includes/specials/SpecialMostlinkedcategories.php @@ -25,6 +25,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A querypage to show categories ordered in descending order by the pages in them diff --git a/includes/specials/SpecialMostlinkedtemplates.php b/includes/specials/SpecialMostlinkedtemplates.php index f5c2c5fb50..dee1c8ec5b 100644 --- a/includes/specials/SpecialMostlinkedtemplates.php +++ b/includes/specials/SpecialMostlinkedtemplates.php @@ -23,6 +23,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Special page lists templates with a large number of diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index 7d8a493a8d..46d7cf7a87 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -105,7 +105,7 @@ class MovePageForm extends UnlistedSpecialPage { $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $user ); if ( count( $permErrors ) ) { // Auto-block user's IP if the account was "hard" blocked - DeferredUpdates::addCallableUpdate( function() use ( $user ) { + DeferredUpdates::addCallableUpdate( function () use ( $user ) { $user->spreadAnyEditBlock(); } ); throw new PermissionsError( 'move', $permErrors ); @@ -776,6 +776,12 @@ class MovePageForm extends UnlistedSpecialPage { # Deal with watches (we don't watch subpages) WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user ); WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user ); + + /** + * T163966 + * Increment user_editcount during page moves + */ + $user->incEditCount(); } function showLogFragment( $title ) { diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php index 9e3a7509bc..0a653e7370 100644 --- a/includes/specials/SpecialNewimages.php +++ b/includes/specials/SpecialNewimages.php @@ -25,13 +25,20 @@ class SpecialNewFiles extends IncludableSpecialPage { /** @var FormOptions */ protected $opts; + /** @var string[] */ + protected $mediaTypes; + public function __construct() { parent::__construct( 'Newimages' ); } public function execute( $par ) { + $context = new DerivativeContext( $this->getContext() ); + $this->setHeaders(); $this->outputHeader(); + $mimeAnalyzer = MediaWiki\MediaWikiServices::getInstance()->getMimeAnalyzer(); + $this->mediaTypes = $mimeAnalyzer->getMediaTypes(); $out = $this->getOutput(); $this->addHelpLink( 'Help:New images' ); @@ -39,10 +46,15 @@ class SpecialNewFiles extends IncludableSpecialPage { $opts = new FormOptions(); $opts->add( 'like', '' ); + $opts->add( 'user', '' ); $opts->add( 'showbots', false ); + $opts->add( 'newbies', false ); $opts->add( 'hidepatrolled', false ); + $opts->add( 'mediatype', $this->mediaTypes ); $opts->add( 'limit', 50 ); $opts->add( 'offset', '' ); + $opts->add( 'start', '' ); + $opts->add( 'end', '' ); $opts->fetchValuesFromRequest( $this->getRequest() ); @@ -50,16 +62,46 @@ class SpecialNewFiles extends IncludableSpecialPage { $opts->setValue( is_numeric( $par ) ? 'limit' : 'like', $par ); } + // If start date comes after end date chronologically, swap them. + // They are swapped in the interface by JS. + $start = $opts->getValue( 'start' ); + $end = $opts->getValue( 'end' ); + if ( $start !== '' && $end !== '' && $start > $end ) { + $temp = $end; + $end = $start; + $start = $temp; + + $opts->setValue( 'start', $start, true ); + $opts->setValue( 'end', $end, true ); + + // also swap values in request object, which is used by HTMLForm + // to pre-populate the fields with the previous input + $request = $context->getRequest(); + $context->setRequest( new DerivativeRequest( + $request, + [ 'start' => $start, 'end' => $end ] + $request->getValues(), + $request->wasPosted() + ) ); + } + + // if all media types have been selected, wipe out the array to prevent + // the pointless IN(...) query condition (which would have no effect + // because every possible type has been selected) + $missingMediaTypes = array_diff( $this->mediaTypes, $opts->getValue( 'mediatype' ) ); + if ( empty( $missingMediaTypes ) ) { + $opts->setValue( 'mediatype', [] ); + } + $opts->validateIntBounds( 'limit', 0, 500 ); $this->opts = $opts; if ( !$this->including() ) { $this->setTopText(); - $this->buildForm(); + $this->buildForm( $context ); } - $pager = new NewFilesPager( $this->getContext(), $opts ); + $pager = new NewFilesPager( $context, $opts ); $out->addHTML( $pager->getBody() ); if ( !$this->including() ) { @@ -67,7 +109,19 @@ class SpecialNewFiles extends IncludableSpecialPage { } } - protected function buildForm() { + protected function buildForm( IContextSource $context ) { + $mediaTypesText = array_map( function ( $type ) { + // mediastatistics-header-unknown, mediastatistics-header-bitmap, + // mediastatistics-header-drawing, mediastatistics-header-audio, + // mediastatistics-header-video, mediastatistics-header-multimedia, + // mediastatistics-header-office, mediastatistics-header-text, + // mediastatistics-header-executable, mediastatistics-header-archive, + // mediastatistics-header-3d, + return $this->msg( 'mediastatistics-header-' . strtolower( $type ) )->text(); + }, $this->mediaTypes ); + $mediaTypesOptions = array_combine( $mediaTypesText, $this->mediaTypes ); + ksort( $mediaTypesOptions ); + $formDescriptor = [ 'like' => [ 'type' => 'text', @@ -75,6 +129,18 @@ class SpecialNewFiles extends IncludableSpecialPage { 'name' => 'like', ], + 'user' => [ + 'type' => 'text', + 'label-message' => 'newimages-user', + 'name' => 'user', + ], + + 'newbies' => [ + 'type' => 'check', + 'label-message' => 'newimages-newbies', + 'name' => 'newbies', + ], + 'showbots' => [ 'type' => 'check', 'label-message' => 'newimages-showbots', @@ -87,6 +153,16 @@ class SpecialNewFiles extends IncludableSpecialPage { 'name' => 'hidepatrolled', ], + 'mediatype' => [ + 'type' => 'multiselect', + 'dropdown' => true, + 'flatlist' => true, + 'name' => 'mediatype', + 'label-message' => 'newimages-mediatype', + 'options' => $mediaTypesOptions, + 'default' => $this->mediaTypes, + ], + 'limit' => [ 'type' => 'hidden', 'default' => $this->opts->getValue( 'limit' ), @@ -98,6 +174,18 @@ class SpecialNewFiles extends IncludableSpecialPage { 'default' => $this->opts->getValue( 'offset' ), 'name' => 'offset', ], + + 'start' => [ + 'type' => 'date', + 'label-message' => 'date-range-from', + 'name' => 'start', + ], + + 'end' => [ + 'type' => 'date', + 'label-message' => 'date-range-to', + 'name' => 'end', + ], ]; if ( $this->getConfig()->get( 'MiserMode' ) ) { @@ -108,7 +196,9 @@ class SpecialNewFiles extends IncludableSpecialPage { unset( $formDescriptor['hidepatrolled'] ); } - HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ) + HTMLForm::factory( 'ooui', $formDescriptor, $context ) + // For the 'multiselect' field values to be preserved on submit + ->setFormIdentifier( 'specialnewimages' ) ->setWrapperLegendMsg( 'newimages-legend' ) ->setSubmitTextMsg( 'ilsubmit' ) ->setMethod( 'get' ) diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php old mode 100755 new mode 100644 index be8ad8fb40..e2c9eab1ce --- a/includes/specials/SpecialNewpages.php +++ b/includes/specials/SpecialNewpages.php @@ -293,6 +293,19 @@ class SpecialNewpages extends IncludableSpecialPage { ); } + /** + * @param stdClass $row Result row from recent changes + * @return Revision|bool + */ + protected function revisionFromRcResult( stdClass $result ) { + return new Revision( [ + 'comment' => $result->rc_comment, + 'deleted' => $result->rc_deleted, + 'user_text' => $result->rc_user_text, + 'user' => $result->rc_user, + ] ); + } + /** * Format a row, providing the timestamp, links to the page/history, * size, user links, and a comment @@ -303,17 +316,13 @@ class SpecialNewpages extends IncludableSpecialPage { public function formatRow( $result ) { $title = Title::newFromRow( $result ); - # Revision deletion works on revisions, so we should cast one - $row = [ - 'comment' => $result->rc_comment, - 'deleted' => $result->rc_deleted, - 'user_text' => $result->rc_user_text, - 'user' => $result->rc_user, - ]; - $rev = new Revision( $row ); + // Revision deletion works on revisions, + // so cast our recent change row to a revision row. + $rev = $this->revisionFromRcResult( $result ); $rev->setTitle( $title ); $classes = []; + $attribs = [ 'data-mw-revid' => $result->rev_id ]; $lang = $this->getLanguage(); $dm = $lang->getDirMark(); @@ -378,11 +387,19 @@ class SpecialNewpages extends IncludableSpecialPage { $tagDisplay = ''; } - $css = count( $classes ) ? ' class="' . implode( ' ', $classes ) . '"' : ''; - # Display the old title if the namespace/title has been changed $oldTitleText = ''; $oldTitle = Title::makeTitle( $result->rc_namespace, $result->rc_title ); + $ret = "{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} " + . "{$tagDisplay} {$oldTitleText}"; + + // Let extensions add data + Hooks::run( 'NewPagesLineEnding', [ $this, &$ret, $result, &$classes, &$attribs ] ); + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); + + if ( count( $classes ) ) { + $attribs['class'] = implode( ' ', $classes ); + } if ( !$title->equals( $oldTitle ) ) { $oldTitleText = $oldTitle->getPrefixedText(); @@ -393,8 +410,7 @@ class SpecialNewpages extends IncludableSpecialPage { ); } - return "{$time} {$dm}{$plink} {$hist} {$dm}{$length} " - . "{$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}\n"; + return Html::rawElement( 'li', $attribs, $ret ) . "\n"; } /** @@ -477,7 +493,7 @@ class SpecialNewpages extends IncludableSpecialPage { } protected function feedItemDesc( $row ) { - $revision = Revision::newFromId( $row->rev_id ); + $revision = $this->revisionFromRcResult( $row ); if ( $revision ) { // XXX: include content model/type in feed item? return '

    ' . htmlspecialchars( $revision->getUserText() ) . diff --git a/includes/specials/SpecialPageData.php b/includes/specials/SpecialPageData.php new file mode 100644 index 0000000000..c52c426e88 --- /dev/null +++ b/includes/specials/SpecialPageData.php @@ -0,0 +1,86 @@ +. + * + * @license GPL-2.0+ + */ +class SpecialPageData extends SpecialPage { + + /** + * @var PageDataRequestHandler|null + */ + private $requestHandler = null; + + public function __construct() { + parent::__construct( 'PageData' ); + } + + /** + * Sets the request handler to be used by the special page. + * May be used when a particular instance of PageDataRequestHandler is already + * known, e.g. during testing. + * + * If no request handler is set using this method, a default handler is created + * on demand by initDependencies(). + * + * @param PageDataRequestHandler $requestHandler + */ + public function setRequestHandler( PageDataRequestHandler $requestHandler ) { + $this->requestHandler = $requestHandler; + } + + /** + * Initialize any un-initialized members from global context. + * In particular, this initializes $this->requestHandler + */ + protected function initDependencies() { + if ( $this->requestHandler === null ) { + $this->requestHandler = $this->newDefaultRequestHandler(); + } + } + + /** + * Creates a PageDataRequestHandler based on global defaults. + * + * @return PageDataRequestHandler + */ + private function newDefaultRequestHandler() { + return new PageDataRequestHandler(); + } + + /** + * @see SpecialWikibasePage::execute + * + * @param string|null $subPage + * + * @throws HttpError + */ + public function execute( $subPage ) { + $this->initDependencies(); + + // If there is no title, show an HTML form + // TODO: Don't do this if HTML is not acceptable according to HTTP headers. + if ( !$this->requestHandler->canHandleRequest( $subPage, $this->getRequest() ) ) { + $this->showForm(); + return; + } + + $this->requestHandler->handleRequest( $subPage, $this->getRequest(), $this->getOutput() ); + } + + /** + * Shows an informative page to the user; Called when there is no page to output. + */ + public function showForm() { + $this->getOutput()->showErrorPage( 'pagedata-title', 'pagedata-text' ); + } + + public function isListed() { + // Do not list this page in Special:SpecialPages + return false; + } + +} diff --git a/includes/specials/SpecialPageLanguage.php b/includes/specials/SpecialPageLanguage.php index ef034fb4d4..78a453e7b1 100644 --- a/includes/specials/SpecialPageLanguage.php +++ b/includes/specials/SpecialPageLanguage.php @@ -146,7 +146,7 @@ class SpecialPageLanguage extends FormSpecialPage { } // Url to redirect to after the operation - $this->goToUrl = $title->getFullURL( + $this->goToUrl = $title->getFullUrlForRedirect( $title->isRedirect() ? [ 'redirect' => 'no' ] : [] ); diff --git a/includes/specials/SpecialPagesWithProp.php b/includes/specials/SpecialPagesWithProp.php index 37006d8f7a..34fcc78c7e 100644 --- a/includes/specials/SpecialPagesWithProp.php +++ b/includes/specials/SpecialPagesWithProp.php @@ -20,7 +20,6 @@ * @since 1.21 * @file * @ingroup SpecialPage - * @author Brad Jorsch */ /** @@ -29,9 +28,27 @@ * @since 1.21 */ class SpecialPagesWithProp extends QueryPage { + + /** + * @var string|null + */ private $propName = null; + + /** + * @var string[]|null + */ private $existingPropNames = null; + /** + * @var bool + */ + private $reverse = false; + + /** + * @var bool + */ + private $sortByValue = false; + function __construct( $name = 'PagesWithProp' ) { parent::__construct( $name ); } @@ -47,6 +64,8 @@ class SpecialPagesWithProp extends QueryPage { $request = $this->getRequest(); $propname = $request->getVal( 'propname', $par ); + $this->reverse = $request->getBool( 'reverse' ); + $this->sortByValue = $request->getBool( 'sortbyvalue' ); $propnames = $this->getExistingPropNames(); @@ -59,6 +78,20 @@ class SpecialPagesWithProp extends QueryPage { 'label-message' => 'pageswithprop-prop', 'required' => true, ], + 'reverse' => [ + 'type' => 'check', + 'name' => 'reverse', + 'default' => $this->reverse, + 'label-message' => 'pageswithprop-reverse', + 'required' => false, + ], + 'sortbyvalue' => [ + 'type' => 'check', + 'name' => 'sortbyvalue', + 'default' => $this->sortByValue, + 'label-message' => 'pageswithprop-sortbyvalue', + 'required' => false, + ] ], $this->getContext() ); $form->setMethod( 'get' ); $form->setSubmitCallback( [ $this, 'onSubmit' ] ); @@ -123,7 +156,18 @@ class SpecialPagesWithProp extends QueryPage { } function getOrderFields() { - return [ 'page_id' ]; + $sort = [ 'page_id' ]; + if ( $this->sortByValue ) { + array_unshift( $sort, 'pp_sortkey' ); + } + return $sort; + } + + /** + * @return bool + */ + public function sortDescending() { + return !$this->reverse; } /** diff --git a/includes/specials/SpecialPermanentLink.php b/includes/specials/SpecialPermanentLink.php index 2bd3ab7d76..b1772b78e3 100644 --- a/includes/specials/SpecialPermanentLink.php +++ b/includes/specials/SpecialPermanentLink.php @@ -39,11 +39,44 @@ class SpecialPermanentLink extends RedirectSpecialPage { public function getRedirect( $subpage ) { $subpage = intval( $subpage ); if ( $subpage === 0 ) { - # throw an error page when no subpage was given - throw new ErrorPageError( 'nopagetitle', 'nopagetext' ); + return false; } $this->mAddedRedirectParams['oldid'] = $subpage; return true; } + + protected function showNoRedirectPage() { + $this->setHeaders(); + $this->outputHeader(); + $this->showForm(); + } + + private function showForm() { + $form = HTMLForm::factory( 'ooui', [ + 'revid' => [ + 'type' => 'int', + 'name' => 'revid', + 'label-message' => 'permanentlink-revid', + ], + ], $this->getContext(), 'permanentlink' ); + $form->setSubmitTextMsg( 'permanentlink-submit' ); + $form->setSubmitCallback( [ $this, 'onFormSubmit' ] ); + $form->show(); + } + + public function onFormSubmit( $formData ) { + $revid = $formData['revid']; + $title = $this->getPageTitle( $revid ?: null ); + $url = $title->getFullUrlForRedirect(); + $this->getOutput()->redirect( $url ); + } + + public function isListed() { + return true; + } + + protected function getGroupName() { + return 'redirects'; + } } diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php index eee5b641a3..ba5a57ea5a 100644 --- a/includes/specials/SpecialPreferences.php +++ b/includes/specials/SpecialPreferences.php @@ -81,7 +81,7 @@ class SpecialPreferences extends SpecialPage { $user = $this->getUser(); } - $htmlForm = Preferences::getFormObject( $user, $this->getContext() ); + $htmlForm = $this->getFormObject( $user, $this->getContext() ); $htmlForm->setSubmitCallback( [ 'Preferences', 'tryUISubmit' ] ); $sectionTitles = $htmlForm->getPreferenceSections(); @@ -117,6 +117,16 @@ class SpecialPreferences extends SpecialPage { $htmlForm->show(); } + /** + * Get the preferences form to use. + * @param User $user The user. + * @param IContextSource $context The context. + * @return PreferencesForm|HtmlForm + */ + protected function getFormObject( $user, IContextSource $context ) { + return Preferences::getFormObject( $user, $context ); + } + private function showResetForm() { if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) { throw new PermissionsError( 'editmyoptions' ); @@ -148,7 +158,7 @@ class SpecialPreferences extends SpecialPage { // Set session data for the success message $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 ); - $url = $this->getPageTitle()->getFullURL(); + $url = $this->getPageTitle()->getFullUrlForRedirect(); $this->getOutput()->redirect( $url ); return true; diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 29e8900860..0b48d4081c 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\FakeResultWrapper; /** * A special page that lists last changes made to the wiki @@ -30,9 +31,104 @@ use Wikimedia\Rdbms\ResultWrapper; * @ingroup SpecialPage */ class SpecialRecentChanges extends ChangesListSpecialPage { + + private $watchlistFilterGroupDefinition; + // @codingStandardsIgnoreStart Needed "useless" override to change parameters. public function __construct( $name = 'Recentchanges', $restriction = '' ) { parent::__construct( $name, $restriction ); + + $this->watchlistFilterGroupDefinition = [ + 'name' => 'watchlist', + 'title' => 'rcfilters-filtergroup-watchlist', + 'class' => ChangesListStringOptionsFilterGroup::class, + 'priority' => -9, + 'isFullCoverage' => true, + 'filters' => [ + [ + 'name' => 'watched', + 'label' => 'rcfilters-filter-watchlist-watched-label', + 'description' => 'rcfilters-filter-watchlist-watched-description', + 'cssClassSuffix' => 'watched', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'wl_user' ); + } + ], + [ + 'name' => 'watchednew', + 'label' => 'rcfilters-filter-watchlist-watchednew-label', + 'description' => 'rcfilters-filter-watchlist-watchednew-description', + 'cssClassSuffix' => 'watchednew', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'wl_user' ) && + $rc->getAttribute( 'rc_timestamp' ) && + $rc->getAttribute( 'wl_notificationtimestamp' ) && + $rc->getAttribute( 'rc_timestamp' ) >= $rc->getAttribute( 'wl_notificationtimestamp' ); + }, + ], + [ + 'name' => 'notwatched', + 'label' => 'rcfilters-filter-watchlist-notwatched-label', + 'description' => 'rcfilters-filter-watchlist-notwatched-description', + 'cssClassSuffix' => 'notwatched', + 'isRowApplicableCallable' => function ( $ctx, $rc ) { + return $rc->getAttribute( 'wl_user' ) === null; + }, + ] + ], + 'default' => ChangesListStringOptionsFilterGroup::NONE, + 'queryCallable' => function ( $specialPageClassName, $context, $dbr, + &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selectedValues ) { + sort( $selectedValues ); + $notwatchedCond = 'wl_user IS NULL'; + $watchedCond = 'wl_user IS NOT NULL'; + $newCond = 'rc_timestamp >= wl_notificationtimestamp'; + + if ( $selectedValues === [ 'notwatched' ] ) { + $conds[] = $notwatchedCond; + return; + } + + if ( $selectedValues === [ 'watched' ] ) { + $conds[] = $watchedCond; + return; + } + + if ( $selectedValues === [ 'watchednew' ] ) { + $conds[] = $dbr->makeList( [ + $watchedCond, + $newCond + ], LIST_AND ); + return; + } + + if ( $selectedValues === [ 'notwatched', 'watched' ] ) { + // no filters + return; + } + + if ( $selectedValues === [ 'notwatched', 'watchednew' ] ) { + $conds[] = $dbr->makeList( [ + $notwatchedCond, + $dbr->makeList( [ + $watchedCond, + $newCond + ], LIST_AND ) + ], LIST_OR ); + return; + } + + if ( $selectedValues === [ 'watched', 'watchednew' ] ) { + $conds[] = $watchedCond; + return; + } + + if ( $selectedValues === [ 'notwatched', 'watched', 'watchednew' ] ) { + // no filters + return; + } + } + ]; } // @codingStandardsIgnoreEnd @@ -71,43 +167,122 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $jsData = $this->getStructuredFilterJsData(); $messages = []; - foreach ( $jsData['messageKeys'] as $key ){ + foreach ( $jsData['messageKeys'] as $key ) { $messages[$key] = $this->msg( $key )->plain(); } $out->addHTML( ResourceLoader::makeInlineScript( - Xml::encodeJsCall( 'mw.messages.set', [ - $messages - ] ) + ResourceLoader::makeMessageSetScript( $messages ) ) ); + $experimentalStructuredChangeFilters = + $this->getConfig()->get( 'StructuredChangeFiltersEnableExperimentalViews' ); + $out->addJsConfigVars( 'wgStructuredChangeFilters', $jsData['groups'] ); + $out->addJsConfigVars( + 'wgStructuredChangeFiltersEnableExperimentalViews', + $experimentalStructuredChangeFilters + ); + $out->addJsConfigVars( + 'wgStructuredChangeFiltersEnableLiveUpdate', + $this->getConfig()->get( 'StructuredChangeFiltersEnableLiveUpdate' ) + ); + $out->addJsConfigVars( + 'wgRCFiltersChangeTags', + $this->buildChangeTagList() + ); + $out->addJsConfigVars( + 'StructuredChangeFiltersDisplayConfig', + [ + 'maxDays' => (int)$this->getConfig()->get( 'RCMaxAge' ) / ( 24 * 3600 ), // Translate to days + 'limitArray' => $this->getConfig()->get( 'RCLinkLimits' ), + 'daysArray' => $this->getConfig()->get( 'RCLinkDays' ), + ] + ); } } /** - * @inheritdoc + * Fetch the change tags list for the front end + * + * @return Array Tag data */ - protected function registerFiltersFromDefinitions( array $definition ) { - foreach ( $definition as $groupName => &$groupDefinition ) { - foreach ( $groupDefinition['filters'] as &$filterDefinition ) { - if ( isset( $filterDefinition['showHideSuffix'] ) ) { - $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix']; - } + protected function buildChangeTagList() { + $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 ); + $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 ); + + // Hit counts disabled for perf reasons, see T169997 + /* + $tagStats = ChangeTags::tagUsageStatistics(); + $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats ); + + // Sort by hits + arsort( $tagHitCounts ); + */ + $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags ); + + // Build the list and data + $result = []; + foreach ( $tagHitCounts as $tagName => $hits ) { + if ( + // Only get active tags + isset( $explicitlyDefinedTags[ $tagName ] ) || + isset( $softwareActivatedTags[ $tagName ] ) + ) { + // Parse description + $desc = ChangeTags::tagLongDescriptionMessage( $tagName, $this->getContext() ); + + $result[] = [ + 'name' => $tagName, + 'label' => Sanitizer::stripAllTags( + ChangeTags::tagDescription( $tagName, $this->getContext() ) + ), + 'description' => $desc ? Sanitizer::stripAllTags( $desc->parse() ) : '', + 'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ), + 'hits' => $hits, + ]; } } - parent::registerFiltersFromDefinitions( $definition ); + // Instead of sorting by hit count (disabled, see above), sort by display name + usort( $result, function ( $a, $b ) { + return strcasecmp( $a['label'], $b['label'] ); + } ); + + return $result; + } + + /** + * @inheritDoc + */ + protected function transformFilterDefinition( array $filterDefinition ) { + if ( isset( $filterDefinition['showHideSuffix'] ) ) { + $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix']; + } + + return $filterDefinition; } /** - * @inheritdoc + * @inheritDoc */ protected function registerFilters() { parent::registerFilters(); + if ( + !$this->including() && + $this->getUser()->isLoggedIn() && + $this->getUser()->isAllowed( 'viewmywatchlist' ) + ) { + $this->registerFiltersFromDefinitions( [ $this->watchlistFilterGroupDefinition ] ); + $watchlistGroup = $this->getFilterGroup( 'watchlist' ); + $watchlistGroup->getFilter( 'watched' )->setAsSupersetOf( + $watchlistGroup->getFilter( 'watchednew' ) + ); + } + $user = $this->getUser(); $significance = $this->getFilterGroup( 'significance' ); @@ -119,12 +294,18 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $hideBots->setDefault( true ); $reviewStatus = $this->getFilterGroup( 'reviewStatus' ); - $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' ); - $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) ); + if ( $reviewStatus !== null ) { + // Conditional on feature being available and rights + $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' ); + $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) ); + } $changeType = $this->getFilterGroup( 'changeType' ); $hideCategorization = $changeType->getFilter( 'hidecategorization' ); - $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) ); + if ( $hideCategorization !== null ) { + // Conditional on feature being available + $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) ); + } } /** @@ -136,7 +317,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $opts = parent::getDefaultOptions(); $user = $this->getUser(); - $opts->add( 'days', $user->getIntOption( 'rcdays' ) ); + $opts->add( 'days', $user->getIntOption( 'rcdays' ), FormOptions::FLOAT ); $opts->add( 'limit', $user->getIntOption( 'rclimit' ) ); $opts->add( 'from', '' ); @@ -180,10 +361,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage { if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) { $opts['limit'] = $m[1]; } - if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) { + if ( preg_match( '/^days=(\d+(?:\.\d+)?)$/', $bit, $m ) ) { $opts['days'] = $m[1]; } - if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) { + if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) { $opts['namespace'] = $m[1]; } if ( preg_match( '/^tagfilter=(.*)$/', $bit, $m ) ) { @@ -194,22 +375,22 @@ class SpecialRecentChanges extends ChangesListSpecialPage { public function validateOptions( FormOptions $opts ) { $opts->validateIntBounds( 'limit', 0, 5000 ); + $opts->validateBounds( 'days', 0, $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ) ); parent::validateOptions( $opts ); } /** - * @inheritdoc + * @inheritDoc */ protected function buildQuery( &$tables, &$fields, &$conds, - &$query_options, &$join_conds, FormOptions $opts ) { - + &$query_options, &$join_conds, FormOptions $opts + ) { $dbr = $this->getDB(); parent::buildQuery( $tables, $fields, $conds, $query_options, $join_conds, $opts ); // Calculate cutoff - $cutoff_unixtime = time() - ( $opts['days'] * 86400 ); - $cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 ); + $cutoff_unixtime = time() - $opts['days'] * 3600 * 24; $cutoff = $dbr->timestamp( $cutoff_unixtime ); $fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] ); @@ -223,11 +404,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage { } /** - * @inheritdoc + * @inheritDoc */ protected function doMainQuery( $tables, $fields, $conds, $query_options, - $join_conds, FormOptions $opts ) { - + $join_conds, FormOptions $opts + ) { $dbr = $this->getDB(); $user = $this->getUser(); @@ -235,7 +416,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $fields = array_merge( RecentChange::selectFields(), $fields ); // JOIN on watchlist for users - if ( $user->getId() && $user->isAllowed( 'viewmywatchlist' ) ) { + if ( $user->isLoggedIn() && $user->isAllowed( 'viewmywatchlist' ) ) { $tables[] = 'watchlist'; $fields[] = 'wl_user'; $fields[] = 'wl_notificationtimestamp'; @@ -246,19 +427,19 @@ class SpecialRecentChanges extends ChangesListSpecialPage { ] ]; } - if ( $user->isAllowed( 'rollback' ) ) { - $tables[] = 'page'; - $fields[] = 'page_latest'; - $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ]; - } + // JOIN on page, used for 'last revision' filter highlight + $tables[] = 'page'; + $fields[] = 'page_latest'; + $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ]; + $tagFilter = $opts['tagfilter'] ? explode( '|', $opts['tagfilter'] ) : []; ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $query_options, - $opts['tagfilter'] + $tagFilter ); if ( !$this->runMainQueryHook( $tables, $fields, $conds, $query_options, $join_conds, @@ -267,13 +448,28 @@ class SpecialRecentChanges extends ChangesListSpecialPage { return false; } + if ( $this->areFiltersInConflict() ) { + return false; + } + + $orderByAndLimit = [ + 'ORDER BY' => 'rc_timestamp DESC', + 'LIMIT' => $opts['limit'] + ]; + if ( in_array( 'DISTINCT', $query_options ) ) { + // ChangeTags::modifyDisplayQuery() adds DISTINCT when filtering on multiple tags. + // In order to prevent DISTINCT from causing query performance problems, + // we have to GROUP BY the primary key. This in turn requires us to add + // the primary key to the end of the ORDER BY, and the old ORDER BY to the + // start of the GROUP BY + $orderByAndLimit['ORDER BY'] = 'rc_timestamp DESC, rc_id DESC'; + $orderByAndLimit['GROUP BY'] = 'rc_timestamp, rc_id'; + } // array_merge() is used intentionally here so that hooks can, should // they so desire, override the ORDER BY / LIMIT condition(s); prior to // MediaWiki 1.26 this used to use the plus operator instead, which meant // that extensions weren't able to change these conditions - $query_options = array_merge( [ - 'ORDER BY' => 'rc_timestamp DESC', - 'LIMIT' => $opts['limit'] ], $query_options ); + $query_options = array_merge( $orderByAndLimit, $query_options ); $rows = $dbr->select( $tables, $fields, @@ -352,6 +548,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $userShowHiddenCats = $this->getUser()->getBoolOption( 'showhiddencats' ); $rclistOutput = $list->beginRecentChangesList(); + if ( $this->isStructuredFilterUiEnabled() ) { + $rclistOutput .= $this->makeLegend(); + } + foreach ( $rows as $obj ) { if ( $limit == 0 ) { break; @@ -397,11 +597,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $rclistOutput .= $list->endRecentChangesList(); if ( $rows->numRows() === 0 ) { - $this->getOutput()->addHTML( - '

    ' . - $this->msg( 'recentchanges-noresult' )->parse() . - '
    ' - ); + $this->outputNoResults(); if ( !$this->including() ) { $this->getOutput()->setStatusCode( 404 ); } @@ -423,7 +619,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $nondefaults = $opts->getChangedValues(); $panel = []; - $panel[] = $this->makeLegend(); + if ( !$this->isStructuredFilterUiEnabled() ) { + $panel[] = $this->makeLegend(); + } $panel[] = $this->optionsPanel( $defaults, $nondefaults, $numRows ); $panel[] = '
    '; @@ -485,6 +683,15 @@ class SpecialRecentChanges extends ChangesListSpecialPage { [ 'class' => 'rcfilters-container' ] ); + $loadingContainer = Html::rawElement( + 'div', + [ 'class' => 'rcfilters-spinner' ], + Html::element( + 'div', + [ 'class' => 'rcfilters-spinner-bounce' ] + ) + ); + // Wrap both with rcfilters-head $this->getOutput()->addHTML( Html::rawElement( @@ -493,6 +700,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $rcfilterContainer . $rcoptions ) ); + + // Add spinner + $this->getOutput()->addHTML( $loadingContainer ); } else { $this->getOutput()->addHTML( $rcoptions ); } @@ -510,13 +720,35 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $message = $this->msg( 'recentchangestext' )->inContentLanguage(); if ( !$message->isDisabled() ) { - $this->getOutput()->addWikiText( - Html::rawElement( 'div', - [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ], - "\n" . $message->plain() . "\n" - ), - /* $lineStart */ true, - /* $interface */ false + $content = $message->parse(); + + $langAttributes = [ + 'lang' => $wgContLang->getHtmlCode(), + 'dir' => $wgContLang->getDir(), + ]; + + $topLinksAttributes = [ 'class' => 'mw-recentchanges-toplinks' ]; + + if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) { + $contentTitle = Html::rawElement( 'div', + [ 'class' => 'mw-recentchanges-toplinks-title' ], + $this->msg( 'rcfilters-other-review-tools' )->parse() + ); + $contentWrapper = Html::rawElement( 'div', + array_merge( [ 'class' => 'mw-collapsible-content' ], $langAttributes ), + $content + ); + $content = $contentTitle . $contentWrapper; + } else { + // Language direction should be on the top div only + // if the title is not there. If it is there, it's + // interface direction, and the language/dir attributes + // should be on the content itself + $topLinksAttributes = array_merge( $topLinksAttributes, $langAttributes ); + } + + $this->getOutput()->addHTML( + Html::rawElement( 'div', $topLinksAttributes, $content ) ); } } @@ -636,7 +868,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { /** * Filter $rows by categories set in $opts * - * @param ResultWrapper $rows Database rows + * @param ResultWrapper &$rows Database rows * @param FormOptions $opts */ function filterByCategories( &$rows, FormOptions $opts ) { @@ -694,7 +926,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $newrows[$k] = $rowsarr[$k]; } } - $rows = $newrows; + $rows = new FakeResultWrapper( array_values( $newrows ) ); } /** @@ -707,16 +939,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { * @return string */ function makeOptionsLink( $title, $override, $options, $active = false ) { - $params = $override + $options; - - // T38524: false values have be converted to "0" otherwise - // wfArrayToCgi() will omit it them. - foreach ( $params as &$value ) { - if ( $value === false ) { - $value = '0'; - } - } - unset( $value ); + $params = $this->convertParamsForLink( $override + $options ); if ( $active ) { $title = new HtmlArmor( '' . htmlspecialchars( $title ) . '' ); @@ -749,15 +972,29 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $user = $this->getUser(); $config = $this->getConfig(); if ( $options['from'] ) { - $note .= $this->msg( 'rcnotefrom' ) + $resetLink = $this->makeOptionsLink( $this->msg( 'rclistfromreset' ), + [ 'from' => '' ], $nondefaults ); + + $noteFromMsg = $this->msg( 'rcnotefrom' ) ->numParams( $options['limit'] ) ->params( $lang->userTimeAndDate( $options['from'], $user ), $lang->userDate( $options['from'], $user ), $lang->userTime( $options['from'], $user ) ) - ->numParams( $numRows ) - ->parse() . '
    '; + ->numParams( $numRows ); + $note .= Html::rawElement( + 'span', + [ 'class' => 'rcnotefrom' ], + $noteFromMsg->parse() + ) . + ' ' . + Html::rawElement( + 'span', + [ 'class' => 'rcoptions-listfromreset' ], + $this->msg( 'parentheses' )->rawParams( $resetLink )->parse() + ) . + '
    '; } # Sort data for display and make sure it's unique after we've added user data. @@ -835,7 +1072,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $datenow = $lang->userDate( $timestamp, $user ); $pipedLinks = '' . $lang->pipeList( $links ) . ''; - $rclinks = '' . $this->msg( 'rclinks' )->rawParams( $cl, $dl, $pipedLinks ) + $rclinks = '' . $this->msg( 'rclinks' )->rawParams( $cl, $dl, '' ) ->parse() . ''; $rclistfrom = '' . $this->makeOptionsLink( @@ -844,7 +1081,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $nondefaults ) . ''; - return "{$note}$rclinks
    $rclistfrom"; + return "{$note}$rclinks
    $pipedLinks
    $rclistfrom"; } public function isIncludable() { diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php index 873285b8c7..e353f0cbdd 100644 --- a/includes/specials/SpecialRecentchangeslinked.php +++ b/includes/specials/SpecialRecentchangeslinked.php @@ -47,11 +47,11 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges { } /** - * @inheritdoc + * @inheritDoc */ protected function doMainQuery( $tables, $select, $conds, $query_options, - $join_conds, FormOptions $opts ) { - + $join_conds, FormOptions $opts + ) { $target = $opts['target']; $showlinkedto = $opts['showlinkedto']; $limit = $opts['limit']; @@ -103,15 +103,33 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges { $join_conds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ]; $select[] = 'page_latest'; } + + $tagFilter = $opts['tagfilter'] ? explode( '|', $opts['tagfilter'] ) : []; ChangeTags::modifyDisplayQuery( $tables, $select, $conds, $join_conds, $query_options, - $opts['tagfilter'] + $tagFilter ); + if ( $dbr->unionSupportsOrderAndLimit() ) { + if ( count( $tagFilter ) > 1 ) { + // ChangeTags::modifyDisplayQuery() will have added DISTINCT. + // To prevent this from causing query performance problems, we need to add + // a GROUP BY, and add rc_id to the ORDER BY. + $order = [ + 'GROUP BY' => 'rc_timestamp, rc_id', + 'ORDER BY' => 'rc_timestamp DESC, rc_id DESC' + ]; + } else { + $order = [ 'ORDER BY' => 'rc_timestamp DESC' ]; + } + } else { + $order = []; + } + if ( !$this->runMainQueryHook( $tables, $select, $conds, $query_options, $join_conds, $opts ) ) { @@ -181,12 +199,6 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges { } } - if ( $dbr->unionSupportsOrderAndLimit() ) { - $order = [ 'ORDER BY' => 'rc_timestamp DESC' ]; - } else { - $order = []; - } - $query = $dbr->selectSQLText( array_merge( $tables, [ $link_table ] ), $select, diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php index 1d1df6a043..3273046f57 100644 --- a/includes/specials/SpecialRedirect.php +++ b/includes/specials/SpecialRedirect.php @@ -33,16 +33,18 @@ class SpecialRedirect extends FormSpecialPage { /** * The type of the redirect (user/file/revision) * + * Example value: `'user'` + * * @var string $mType - * @example 'user' */ protected $mType; /** * The identifier/value for the redirect (which id, which file) * + * Example value: `'42'` + * * @var string $mValue - * @example '42' */ protected $mValue; diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php index 4b0fa008b6..e1d4dd1b5d 100644 --- a/includes/specials/SpecialRevisiondelete.php +++ b/includes/specials/SpecialRevisiondelete.php @@ -73,28 +73,28 @@ class SpecialRevisionDelete extends UnlistedSpecialPage { 'success' => 'revdelete-success', 'failure' => 'revdelete-failure', 'text' => 'revdelete-text-text', - 'selected'=> 'revdelete-selected-text', + 'selected' => 'revdelete-selected-text', ], 'archive' => [ 'check-label' => 'revdelete-hide-text', 'success' => 'revdelete-success', 'failure' => 'revdelete-failure', 'text' => 'revdelete-text-text', - 'selected'=> 'revdelete-selected-text', + 'selected' => 'revdelete-selected-text', ], 'oldimage' => [ 'check-label' => 'revdelete-hide-image', 'success' => 'revdelete-success', 'failure' => 'revdelete-failure', 'text' => 'revdelete-text-file', - 'selected'=> 'revdelete-selected-file', + 'selected' => 'revdelete-selected-file', ], 'filearchive' => [ 'check-label' => 'revdelete-hide-image', 'success' => 'revdelete-success', 'failure' => 'revdelete-failure', 'text' => 'revdelete-text-file', - 'selected'=> 'revdelete-selected-file', + 'selected' => 'revdelete-selected-file', ], 'logging' => [ 'check-label' => 'revdelete-hide-name', diff --git a/includes/specials/SpecialRunJobs.php b/includes/specials/SpecialRunJobs.php index 761610e08f..cb1e892e2f 100644 --- a/includes/specials/SpecialRunJobs.php +++ b/includes/specials/SpecialRunJobs.php @@ -19,7 +19,6 @@ * * @file * @ingroup SpecialPage - * @author Aaron Schulz */ use MediaWiki\Logger\LoggerFactory; diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 9cc0048aab..85b4572bd5 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -259,7 +259,7 @@ class SpecialSearch extends SpecialPage { return null; } - return $url === null ? $title->getFullURL() : $url; + return $url === null ? $title->getFullUrlForRedirect() : $url; } /** @@ -352,12 +352,16 @@ class SpecialSearch extends SpecialPage { $out->addHTML( $dymWidget->render( $term, $textMatches ) ); } - $out->addHTML( "
    " ); - - $hasErrors = $textStatus && $textStatus->getErrors(); + $hasErrors = $textStatus && $textStatus->getErrors() !== []; $hasOtherResults = $textMatches && $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS ); + if ( $textMatches && $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) { + $out->addHTML( '
    ' ); + } else { + $out->addHTML( '
    ' ); + } + if ( $hasErrors ) { list( $error, $warning ) = $textStatus->splitByErrorType(); if ( $error->getErrors() ) { @@ -395,13 +399,13 @@ class SpecialSearch extends SpecialPage { $mainResultWidget = new FullSearchResultWidget( $this, $linkRenderer ); if ( $search->getFeatureData( 'enable-new-crossproject-page' ) ) { - $sidebarResultWidget = new InterwikiSearchResultWidget( $this, $linkRenderer ); $sidebarResultsWidget = new InterwikiSearchResultSetWidget( $this, $sidebarResultWidget, $linkRenderer, - MediaWikiServices::getInstance()->getInterwikiLookup() + MediaWikiServices::getInstance()->getInterwikiLookup(), + $search->getFeatureData( 'show-multimedia-search-results' ) ); } else { $sidebarResultWidget = new SimpleSearchResultWidget( $this, $linkRenderer ); @@ -431,9 +435,17 @@ class SpecialSearch extends SpecialPage { // prev/next links if ( $totalRes > $this->limit || $this->offset ) { + // Allow matches to define the correct offset, as interleaved + // AB testing may require a different next page offset. + if ( $textMatches && $textMatches->getOffset() !== null ) { + $offset = $textMatches->getOffset(); + } else { + $offset = $this->offset; + } + $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), - $this->offset, + $offset, $this->limit, $this->powerSearchOptions() + [ 'search' => $term ], $this->limit + $this->offset >= $totalRes @@ -475,7 +487,9 @@ class SpecialSearch extends SpecialPage { if ( $title->isKnown() ) { $messageName = 'searchmenu-exists'; $linkClass = 'mw-search-exists'; - } elseif ( $title->quickUserCan( 'create', $this->getUser() ) ) { + } elseif ( ContentHandler::getForTitle( $title )->supportsDirectEditing() + && $title->quickUserCan( 'create', $this->getUser() ) + ) { $messageName = 'searchmenu-new'; } } @@ -541,7 +555,7 @@ class SpecialSearch extends SpecialPage { * Extract "power search" namespace settings from the request object, * returning a list of index numbers to search. * - * @param WebRequest $request + * @param WebRequest &$request * @return array */ protected function powerSearch( &$request ) { diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php index a5e51134b9..e9c15e7bed 100644 --- a/includes/specials/SpecialShortpages.php +++ b/includes/specials/SpecialShortpages.php @@ -22,6 +22,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * SpecialShortpages extends QueryPage. It is used to return the shortest @@ -40,9 +41,11 @@ class ShortPagesPage extends QueryPage { } public function getQueryInfo() { + $config = $this->getConfig(); + $blacklist = $config->get( 'ShortPagesNamespaceBlacklist' ); $tables = [ 'page' ]; $conds = [ - 'page_namespace' => MWNamespace::getContentNamespaces(), + 'page_namespace' => array_diff( MWNamespace::getContentNamespaces(), $blacklist ), 'page_is_redirect' => 0 ]; $joinConds = []; @@ -64,6 +67,57 @@ class ShortPagesPage extends QueryPage { ]; } + public function reallyDoQuery( $limit, $offset = false ) { + $fname = static::class . '::reallyDoQuery'; + $dbr = $this->getRecacheDB(); + $query = $this->getQueryInfo(); + $order = $this->getOrderFields(); + + if ( $this->sortDescending() ) { + foreach ( $order as &$field ) { + $field .= ' DESC'; + } + } + + $tables = isset( $query['tables'] ) ? (array)$query['tables'] : []; + $fields = isset( $query['fields'] ) ? (array)$query['fields'] : []; + $conds = isset( $query['conds'] ) ? (array)$query['conds'] : []; + $options = isset( $query['options'] ) ? (array)$query['options'] : []; + $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : []; + + if ( $limit !== false ) { + $options['LIMIT'] = intval( $limit ); + } + + if ( $offset !== false ) { + $options['OFFSET'] = intval( $offset ); + } + + $namespaces = $conds['page_namespace']; + if ( count( $namespaces ) === 1 ) { + $options['ORDER BY'] = $order; + $res = $dbr->select( $tables, $fields, $conds, $fname, + $options, $join_conds + ); + } else { + unset( $conds['page_namespace'] ); + $options['INNER ORDER BY'] = $order; + $options['ORDER BY'] = [ 'value' . ( $this->sortDescending() ? ' DESC' : '' ) ]; + $sql = $dbr->unionConditionPermutations( + $tables, + $fields, + [ 'page_namespace' => $namespaces ], + $conds, + $fname, + $options, + $join_conds + ); + $res = $dbr->query( $sql, $fname ); + } + + return $res; + } + function getOrderFields() { return [ 'page_len' ]; } diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php index b18b370c6b..4f29082227 100644 --- a/includes/specials/SpecialSpecialpages.php +++ b/includes/specials/SpecialSpecialpages.php @@ -96,7 +96,6 @@ class SpecialSpecialpages extends UnlistedSpecialPage { $includesCachedPages = false; foreach ( $groups as $group => $sortedPages ) { - $out->wrapWikiMsg( "

    $1

    \n", "specialpages-group-$group" @@ -131,9 +130,29 @@ class SpecialSpecialpages extends UnlistedSpecialPage { ); } - if ( $includesRestrictedPages || $includesCachedPages ) { - $out->wrapWikiMsg( "

    $1

    ", 'specialpages-note-top' ); - $out->wrapWikiMsg( "
    \n$1\n
    ", 'specialpages-note' ); + // add legend + $notes = []; + if ( $includesRestrictedPages ) { + $restricedMsg = $this->msg( 'specialpages-note-restricted' ); + if ( !$restricedMsg->isDisabled() ) { + $notes[] = $restricedMsg->plain(); + } + } + if ( $includesCachedPages ) { + $cachedMsg = $this->msg( 'specialpages-note-cached' ); + if ( !$cachedMsg->isDisabled() ) { + $notes[] = $cachedMsg->plain(); + } + } + if ( $notes !== [] ) { + $out->wrapWikiMsg( + "

    $1

    ", 'specialpages-note-top' + ); + $out->addWikiText( + "
    \n" . + implode( "\n", $notes ) . + "\n
    " + ); } } } diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php index 19850e6a2d..a60549bf73 100644 --- a/includes/specials/SpecialStatistics.php +++ b/includes/specials/SpecialStatistics.php @@ -253,7 +253,6 @@ class SpecialStatistics extends SpecialPage { foreach ( $stats as $header => $items ) { // Identify the structure used if ( is_array( $items ) ) { - // Ignore headers that are recursively set as legacy header if ( $header !== 'statistics-header-hooks' ) { $return .= $this->formatRowHeader( $header ); diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php index e67356f616..605ee008d8 100644 --- a/includes/specials/SpecialTags.php +++ b/includes/specials/SpecialTags.php @@ -246,7 +246,6 @@ class SpecialTags extends SpecialPage { } if ( $showManageActions ) { // we've already checked that the user had the requisite userright - // activate if ( ChangeTags::canActivateTag( $tag )->isOK() ) { $actionLinks[] = $linkRenderer->makeKnownLink( @@ -264,7 +263,6 @@ class SpecialTags extends SpecialPage { [], [ 'tag' => $tag ] ); } - } if ( $showDeleteActions || $showManageActions ) { diff --git a/includes/specials/SpecialUncategorizedcategories.php b/includes/specials/SpecialUncategorizedcategories.php index 77b6926457..5ff9e04ef7 100644 --- a/includes/specials/SpecialUncategorizedcategories.php +++ b/includes/specials/SpecialUncategorizedcategories.php @@ -68,7 +68,7 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage { } public function getQueryInfo() { - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $query = parent::getQueryInfo(); $exceptionList = $this->getExceptionList(); if ( $exceptionList ) { diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index dc5f877a4f..740207d6b9 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -45,6 +45,10 @@ class SpecialUndelete extends SpecialPage { /** @var Title */ private $mTargetObj; + /** + * @var string Search prefix + */ + private $mSearchPrefix; function __construct() { parent::__construct( 'Undelete', 'deletedhistory' ); @@ -231,29 +235,70 @@ class SpecialUndelete extends SpecialPage { function showSearchForm() { $out = $this->getOutput(); $out->setPageTitle( $this->msg( 'undelete-search-title' ) ); - $out->addHTML( - Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) . - Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) . + $fuzzySearch = $this->getRequest()->getVal( 'fuzzy', true ); + + $out->enableOOUI(); + + $fields[] = new OOUI\ActionFieldLayout( + new OOUI\TextInputWidget( [ + 'name' => 'prefix', + 'inputId' => 'prefix', + 'infusable' => true, + 'value' => $this->mSearchPrefix, + 'autofocus' => true, + ] ), + new OOUI\ButtonInputWidget( [ + 'label' => $this->msg( 'undelete-search-submit' )->text(), + 'flags' => [ 'primary', 'progressive' ], + 'inputId' => 'searchUndelete', + 'type' => 'submit', + ] ), + [ + 'label' => new OOUI\HtmlSnippet( + $this->msg( + $fuzzySearch ? 'undelete-search-full' : 'undelete-search-prefix' + )->parse() + ), + 'align' => 'left', + ] + ); + + $fieldset = new OOUI\FieldsetLayout( [ + 'label' => $this->msg( 'undelete-search-box' )->text(), + 'items' => $fields, + ] ); + + $form = new OOUI\FormLayout( [ + 'method' => 'get', + 'action' => wfScript(), + ] ); + + $form->appendContent( + $fieldset, + new OOUI\HtmlSnippet( Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) . - Html::rawElement( - 'label', - [ 'for' => 'prefix' ], - $this->msg( 'undelete-search-prefix' )->parse() - ) . - Xml::input( - 'prefix', - 20, - $this->mSearchPrefix, - [ 'id' => 'prefix', 'autofocus' => '' ] - ) . ' ' . - Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) . - Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ) + Html::hidden( 'fuzzy', $fuzzySearch ) + ) + ); + + $out->addHTML( + new OOUI\PanelLayout( [ + 'expanded' => false, + 'padded' => true, + 'framed' => true, + 'content' => $form, + ] ) ); # List undeletable articles if ( $this->mSearchPrefix ) { - $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix ); + // For now, we enable search engine match only when specifically asked to + // by using fuzzy=1 parameter. + if ( $fuzzySearch ) { + $result = PageArchive::listPagesBySearch( $this->mSearchPrefix ); + } else { + $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix ); + } $this->showList( $result ); } } @@ -277,7 +322,7 @@ class SpecialUndelete extends SpecialPage { $linkRenderer = $this->getLinkRenderer(); $undelete = $this->getPageTitle(); - $out->addHTML( "
      \n" ); + $out->addHTML( "
        \n" ); foreach ( $result as $row ) { $title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title ); if ( $title !== null ) { @@ -300,7 +345,7 @@ class SpecialUndelete extends SpecialPage { ); } $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse(); - $out->addHTML( "
      • {$item} ({$revs})
      • \n" ); + $out->addHTML( "
      • {$item} ({$revs})
      • \n" ); } $result->free(); $out->addHTML( "
      \n" ); @@ -624,13 +669,7 @@ class SpecialUndelete extends SpecialPage { $archive = new PageArchive( $this->mTargetObj, $this->getConfig() ); Hooks::run( 'UndeleteForm::showHistory', [ &$archive, $this->mTargetObj ] ); - /* - $text = $archive->getLastRevisionText(); - if( is_null( $text ) ) { - $out->addWikiMsg( 'nohistory' ); - return; - } - */ + $out->addHTML( '
      ' ); if ( $this->mAllowed ) { $out->addWikiMsg( 'undeletehistory' ); @@ -668,13 +707,15 @@ class SpecialUndelete extends SpecialPage { } if ( $this->mAllowed ) { + $out->enableOOUI(); + $action = $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] ); # Start the form here - $top = Xml::openElement( - 'form', - [ 'method' => 'post', 'action' => $action, 'id' => 'undelete' ] - ); - $out->addHTML( $top ); + $form = new OOUI\FormLayout( [ + 'method' => 'post', + 'action' => $action, + 'id' => 'undelete', + ] ); } # Show relevant lines from the deletion log: @@ -689,68 +730,89 @@ class SpecialUndelete extends SpecialPage { } if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) { - # Format the user-visible controls (comment field, submission button) - # in a nice little table + $fields[] = new OOUI\Layout( [ + 'content' => new OOUI\HtmlSnippet( $this->msg( 'undeleteextrahelp' )->parseAsBlock() ) + ] ); + + $fields[] = new OOUI\FieldLayout( + new OOUI\TextInputWidget( [ + 'name' => 'wpComment', + 'inputId' => 'wpComment', + 'infusable' => true, + 'value' => $this->mComment, + 'autofocus' => true, + ] ), + [ + 'label' => $this->msg( 'undeletecomment' )->text(), + 'align' => 'top', + ] + ); + + $fields[] = new OOUI\FieldLayout( + new OOUI\Widget( [ + 'content' => new OOUI\HorizontalLayout( [ + 'items' => [ + new OOUI\ButtonInputWidget( [ + 'name' => 'restore', + 'inputId' => 'mw-undelete-submit', + 'value' => '1', + 'label' => $this->msg( 'undeletebtn' )->text(), + 'flags' => [ 'primary', 'progressive' ], + 'type' => 'submit', + ] ), + new OOUI\ButtonInputWidget( [ + 'name' => 'invert', + 'inputId' => 'mw-undelete-invert', + 'value' => '1', + 'label' => $this->msg( 'undeleteinvert' )->text() + ] ), + ] + ] ) + ] ) + ); + if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) { - $unsuppressBox = - "
    - - - "; - } else { - $unsuppressBox = ''; + $fields[] = new OOUI\FieldLayout( + new OOUI\CheckboxInputWidget( [ + 'name' => 'wpUnsuppress', + 'inputId' => 'mw-undelete-unsuppress', + 'value' => '1', + ] ), + [ + 'label' => $this->msg( 'revdelete-unsuppress' )->text(), + 'align' => 'inline', + ] + ); } - $table = Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) . - Xml::openElement( 'table', [ 'id' => 'mw-undelete-table' ] ) . - " - - - - - - - - - - " . - $unsuppressBox . - Xml::closeElement( 'table' ) . - Xml::closeElement( 'fieldset' ); - - $out->addHTML( $table ); + $fieldset = new OOUI\FieldsetLayout( [ + 'label' => $this->msg( 'undelete-fieldset-title' )->text(), + 'id' => 'mw-undelete-table', + 'items' => $fields, + ] ); + + $form->appendContent( + new OOUI\PanelLayout( [ + 'expanded' => false, + 'padded' => true, + 'framed' => true, + 'content' => $fieldset, + ] ), + new OOUI\HtmlSnippet( + Html::hidden( 'target', $this->mTarget ) . + Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ) + ) + ); } - $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" ); + $history = ''; + $history .= Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n"; if ( $haveRevisions ) { # Show the page's stored (deleted) history if ( $this->getUser()->isAllowed( 'deleterevision' ) ) { - $out->addHTML( Html::element( + $history .= Html::element( 'button', [ 'name' => 'revdel', @@ -758,39 +820,43 @@ class SpecialUndelete extends SpecialPage { 'class' => 'deleterevision-log-submit mw-log-deleterevision-button' ], $this->msg( 'showhideselectedversions' )->text() - ) . "\n" ); + ) . "\n"; } - $out->addHTML( '
      ' ); + $history .= '
        '; $remaining = $revisions->numRows(); $earliestLiveTime = $this->mTargetObj->getEarliestRevTime(); foreach ( $revisions as $row ) { $remaining--; - $out->addHTML( $this->formatRevisionRow( $row, $earliestLiveTime, $remaining ) ); + $history .= $this->formatRevisionRow( $row, $earliestLiveTime, $remaining ); } $revisions->free(); - $out->addHTML( '
      ' ); + $history .= '
    '; } else { $out->addWikiMsg( 'nohistory' ); } if ( $haveFiles ) { - $out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" ); - $out->addHTML( '
      ' ); + $history .= Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n"; + $history .= '
        '; foreach ( $files as $row ) { - $out->addHTML( $this->formatFileRow( $row ) ); + $history .= $this->formatFileRow( $row ); } $files->free(); - $out->addHTML( '
      ' ); + $history .= '
    '; } if ( $this->mAllowed ) { # Slip in the hidden controls here $misc = Html::hidden( 'target', $this->mTarget ); $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ); - $misc .= Xml::closeElement( 'form' ); - $out->addHTML( $misc ); + $history .= $misc; + + $form->appendContent( new OOUI\HtmlSnippet( $history ) ); + $out->addHTML( $form ); + } else { + $out->addHTML( $history ); } return true; @@ -1084,9 +1150,11 @@ class SpecialUndelete extends SpecialPage { // Show revision undeletion warnings and errors $status = $archive->getRevisionStatus(); if ( $status && !$status->isGood() ) { - $out->wrapWikiMsg( - "
    \n$1\n
    ", - 'cannotundelete' + $out->addWikiText( '
    ' . + $status->getWikiText( + 'cannotundelete', + 'cannotundelete' + ) . '
    ' ); } diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php index e82279e224..fea7e2160d 100644 --- a/includes/specials/SpecialUnwatchedpages.php +++ b/includes/specials/SpecialUnwatchedpages.php @@ -25,6 +25,7 @@ */ use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page that displays a list of pages that are not on anyones watchlist. diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php index f4a4818b32..4cdc78f341 100644 --- a/includes/specials/SpecialUpload.php +++ b/includes/specials/SpecialUpload.php @@ -33,7 +33,6 @@ use MediaWiki\MediaWikiServices; */ class SpecialUpload extends SpecialPage { /** - * Constructor : initialise object * Get data POSTed through the form and assign them to the object * @param WebRequest $request Data posted. */ @@ -678,7 +677,6 @@ class SpecialUpload extends SpecialPage { */ protected function processVerificationError( $details ) { switch ( $details['status'] ) { - /** Statuses that only require name changing **/ case UploadBase::MIN_LENGTH_PARTNAME: $this->showRecoverableUploadError( $this->msg( 'minlength1' )->escaped() ); @@ -821,6 +819,7 @@ class SpecialUpload extends SpecialPage { $gallery = ImageGalleryBase::factory( false, $this->getContext() ); $gallery->setShowBytes( false ); + $gallery->setShowDimensions( false ); foreach ( $dupes as $file ) { $gallery->add( $file->getTitle() ); } diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index b33aa7db32..0a712eff21 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -215,7 +215,7 @@ class UserrightsPage extends SpecialPage { * @return bool */ public function canProcessExpiries() { - return !$this->getConfig()->get( 'DisableUserGroupExpiry' ); + return true; } /** @@ -326,8 +326,8 @@ class UserrightsPage extends SpecialPage { * @return array Tuple of added, then removed groups */ function doSaveUserGroups( $user, $add, $remove, $reason = '', $tags = [], - $groupExpiries = [] ) { - + $groupExpiries = [] + ) { // Validate input set... $isself = $user->getName() == $this->getUser()->getName(); $groups = $user->getGroups(); @@ -344,7 +344,7 @@ class UserrightsPage extends SpecialPage { // UNLESS the user can only add this group (not remove it) and the expiry time // is being brought forward (T156784) $add = array_filter( $add, - function( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) { + function ( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) { if ( isset( $groupExpiries[$group] ) && !in_array( $group, $removable ) && isset( $ugms[$group] ) && @@ -387,7 +387,8 @@ class UserrightsPage extends SpecialPage { $user->invalidateCache(); // update groups in external authentication database - Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), $reason ] ); + Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), + $reason, $oldUGMs, $newUGMs ] ); MediaWiki\Auth\AuthManager::callLegacyAuthPlugin( 'updateExternalDBGroups', [ $user, $add, $remove ] ); @@ -432,16 +433,16 @@ class UserrightsPage extends SpecialPage { * @param array $newUGMs Associative array of (group name => UserGroupMembership) */ protected function addLogEntry( $user, $oldGroups, $newGroups, $reason, $tags, - $oldUGMs, $newUGMs ) { - + $oldUGMs, $newUGMs + ) { // make sure $oldUGMs and $newUGMs are in the same order, and serialise // each UGM object to a simplified array - $oldUGMs = array_map( function( $group ) use ( $oldUGMs ) { + $oldUGMs = array_map( function ( $group ) use ( $oldUGMs ) { return isset( $oldUGMs[$group] ) ? self::serialiseUgmForLog( $oldUGMs[$group] ) : null; }, $oldGroups ); - $newUGMs = array_map( function( $group ) use ( $newUGMs ) { + $newUGMs = array_map( function ( $group ) use ( $newUGMs ) { return isset( $newUGMs[$group] ) ? self::serialiseUgmForLog( $newUGMs[$group] ) : null; diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 708eced849..3ea1d03aeb 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -511,7 +511,7 @@ class SpecialVersion extends SpecialPage { // in their proper section continue; } - $authors = array_map( function( $arr ) { + $authors = array_map( function ( $arr ) { // If a homepage is set, link to it if ( isset( $arr['homepage'] ) ) { return "[{$arr['homepage']} {$arr['name']}]"; @@ -732,7 +732,9 @@ class SpecialVersion extends SpecialPage { } } $cache = wfGetCache( CACHE_ANYTHING ); - $memcKey = wfMemcKey( 'specialversion-ext-version-text', $extension['path'], $this->coreId ); + $memcKey = $cache->makeKey( + 'specialversion-ext-version-text', $extension['path'], $this->coreId + ); list( $vcsVersion, $vcsLink, $vcsDate ) = $cache->get( $memcKey ); if ( !$vcsVersion ) { @@ -838,7 +840,7 @@ class SpecialVersion extends SpecialPage { // Finally! Create the table $html = Html::openElement( 'tr', [ 'class' => 'mw-version-ext', - 'id' => Sanitizer::escapeId( 'mw-version-ext-' . $type . '-' . $extension['name'] ) + 'id' => Sanitizer::escapeIdForAttribute( 'mw-version-ext-' . $type . '-' . $extension['name'] ) ] ); diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 5d7fa5dbcd..1d76e36106 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * A special page that lists last changes made to the wiki, @@ -33,6 +34,8 @@ use Wikimedia\Rdbms\ResultWrapper; class SpecialWatchlist extends ChangesListSpecialPage { public function __construct( $page = 'Watchlist', $restriction = 'viewmywatchlist' ) { parent::__construct( $page, $restriction ); + + $this->maxDays = $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ); } public function doesWrites() { @@ -55,6 +58,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { 'mediawiki.special.changeslist.visitedstatus', 'mediawiki.special.watchlist', ] ); + $output->addModuleStyles( [ 'mediawiki.special.watchlist.styles' ] ); $mode = SpecialEditWatchlist::getMode( $request, $subpage ); if ( $mode !== false ) { @@ -80,6 +84,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) ) && $request->getVal( 'reset' ) && $request->wasPosted() + && $user->matchEditToken( $request->getVal( 'token' ) ) ) { $user->clearAllNotifications(); $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) ); @@ -105,22 +110,18 @@ class SpecialWatchlist extends ChangesListSpecialPage { } /** - * @inheritdoc + * @inheritDoc */ - protected function registerFiltersFromDefinitions( array $definition ) { - foreach ( $definition as $groupName => &$groupDefinition ) { - foreach ( $groupDefinition['filters'] as &$filterDefinition ) { - if ( isset( $filterDefinition['showHideSuffix'] ) ) { - $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix']; - } - } + protected function transformFilterDefinition( array $filterDefinition ) { + if ( isset( $filterDefinition['showHideSuffix'] ) ) { + $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix']; } - parent::registerFiltersFromDefinitions( $definition ); + return $filterDefinition; } /** - * @inheritdoc + * @inheritDoc */ protected function registerFilters() { parent::registerFilters(); @@ -142,8 +143,11 @@ class SpecialWatchlist extends ChangesListSpecialPage { $hideLiu->setDefault( $user->getBoolOption( 'watchlisthideliu' ) ); $reviewStatus = $this->getFilterGroup( 'reviewStatus' ); - $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' ); - $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) ); + if ( $reviewStatus !== null ) { + // Conditional on feature being available and rights + $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' ); + $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) ); + } $authorship = $this->getFilterGroup( 'authorship' ); $hideMyself = $authorship->getFilter( 'hidemyself' ); @@ -151,7 +155,10 @@ class SpecialWatchlist extends ChangesListSpecialPage { $changeType = $this->getFilterGroup( 'changeType' ); $hideCategorization = $changeType->getFilter( 'hidecategorization' ); - $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) ); + if ( $hideCategorization !== null ) { + // Conditional on feature being available + $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) ); + } } /** @@ -165,14 +172,15 @@ class SpecialWatchlist extends ChangesListSpecialPage { $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT ); $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) ); - if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) { - // The user has submitted the form, so we dont need the default values - return $opts; - } return $opts; } + public function validateOptions( FormOptions $opts ) { + $opts->validateBounds( 'days', 0, $this->maxDays ); + parent::validateOptions( $opts ); + } + /** * Get all custom filters * @@ -214,6 +222,26 @@ class SpecialWatchlist extends ChangesListSpecialPage { } } + if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) { + $allBooleansFalse = []; + + // If the user submitted the form, start with a baseline of "all + // booleans are false", then change the ones they checked. This + // means we ignore the defaults. + + // This is how we handle the fact that HTML forms don't submit + // unchecked boxes. + foreach ( $this->filterGroups as $filterGroup ) { + if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) { + foreach ( $filterGroup->getFilters() as $filter ) { + $allBooleansFalse[$filter->getName()] = false; + } + } + } + + $params = $params + $allBooleansFalse; + } + // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization // methods defined on WebRequest and removing this dependency would cause some code duplication. $request = new DerivativeRequest( $this->getRequest(), $params ); @@ -223,11 +251,11 @@ class SpecialWatchlist extends ChangesListSpecialPage { } /** - * @inheritdoc + * @inheritDoc */ protected function buildQuery( &$tables, &$fields, &$conds, &$query_options, - &$join_conds, FormOptions $opts ) { - + &$join_conds, FormOptions $opts + ) { $dbr = $this->getDB(); parent::buildQuery( $tables, $fields, $conds, $query_options, $join_conds, $opts ); @@ -235,22 +263,21 @@ class SpecialWatchlist extends ChangesListSpecialPage { // Calculate cutoff if ( $opts['days'] > 0 ) { $conds[] = 'rc_timestamp > ' . - $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) ); + $dbr->addQuotes( $dbr->timestamp( time() - $opts['days'] * 3600 * 24 ) ); } } /** - * @inheritdoc + * @inheritDoc */ protected function doMainQuery( $tables, $fields, $conds, $query_options, - $join_conds, FormOptions $opts ) { - + $join_conds, FormOptions $opts + ) { $dbr = $this->getDB(); $user = $this->getUser(); # Toggle watchlist content (all recent edits or just the latest) if ( $opts['extended'] ) { - $limitWatchlist = $user->getIntOption( 'wllimit' ); $usePage = false; } else { # Top log Ids for a page are not stored @@ -265,14 +292,16 @@ class SpecialWatchlist extends ChangesListSpecialPage { LIST_OR ); } - $limitWatchlist = 0; $usePage = true; } $tables = array_merge( [ 'recentchanges', 'watchlist' ], $tables ); $fields = array_merge( RecentChange::selectFields(), $fields ); - $query_options = array_merge( [ 'ORDER BY' => 'rc_timestamp DESC' ], $query_options ); + $query_options = array_merge( [ + 'ORDER BY' => 'rc_timestamp DESC', + 'LIMIT' => $user->getIntOption( 'wllimit' ) + ], $query_options ); $join_conds = array_merge( [ 'watchlist' => [ @@ -290,9 +319,6 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( $this->getConfig()->get( 'ShowUpdatedMarker' ) ) { $fields[] = 'wl_notificationtimestamp'; } - if ( $limitWatchlist ) { - $query_options['LIMIT'] = $limitWatchlist; - } $rollbacker = $user->isAllowed( 'rollback' ); if ( $usePage || $rollbacker ) { @@ -406,6 +432,23 @@ class SpecialWatchlist extends ChangesListSpecialPage { $list = ChangesList::newFromContext( $this->getContext(), $this->filterGroups ); $list->setWatchlistDivs(); $list->initChangesListRows( $rows ); + if ( $user->getOption( 'watchlistunwatchlinks' ) ) { + $list->setChangeLinePrefixer( function ( RecentChange $rc, ChangesList $cl, $grouped ) { + // Don't show unwatch link if the line is a grouped log entry using EnhancedChangesList, + // since EnhancedChangesList groups log entries by performer rather than by target article + if ( $rc->mAttribs['rc_type'] == RC_LOG && $cl instanceof EnhancedChangesList && + $grouped ) { + return ''; + } else { + return $this->getLinkRenderer() + ->makeKnownLink( $rc->getTitle(), + $this->msg( 'watchlist-unwatch' )->text(), [ + 'class' => 'mw-unwatch-link', + 'title' => $this->msg( 'tooltip-ca-unwatch' )->text() + ], [ 'action' => 'unwatch' ] ) . ' '; + } + } ); + } $dbr->dataSeek( $rows, 0 ); if ( $this->getConfig()->get( 'RCShowWatchingUsers' ) @@ -479,7 +522,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( $opts['days'] > 0 ) { $days = $opts['days']; } else { - $days = $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ); + $days = $this->maxDays; } $timestamp = wfTimestampNow(); $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $days * 24 ) )->params( @@ -571,7 +614,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { // default string representation, for example, and would confuse comparisons. // Misleadingly, the 'days' option supports hours too. - $days = array_map( 'strval', [ 1/24, 2/24, 6/24, 12/24, 1, 3, 7 ] ); + $days = array_map( 'strval', [ 1 / 24, 2 / 24, 6 / 24, 12 / 24, 1, 3, 7 ] ); $userWatchlistOption = (string)$this->getUser()->getOption( 'watchlistdays' ); // add the user preference, if it isn't available already @@ -579,7 +622,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { $days[] = $userWatchlistOption; } - $maxDays = (string)( $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ) ); + $maxDays = (string)$this->maxDays; // add the maximum possible value, if it isn't available already if ( !in_array( $maxDays, $days ) ) { $days[] = $maxDays; @@ -641,6 +684,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { 'id' => 'mw-watchlist-resetbutton' ] ) . "\n" . Xml::submitButton( $this->msg( 'enotif_reset' )->text(), [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" . + Html::hidden( 'token', $user->getEditToken() ) . "\n" . Html::hidden( 'reset', 'all' ) . "\n"; foreach ( $nondefaults as $key => $value ) { $form .= Html::hidden( $key, $value ) . "\n"; diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php index 439b6ab3cb..6f91c46f86 100644 --- a/includes/specials/SpecialWhatlinkshere.php +++ b/includes/specials/SpecialWhatlinkshere.php @@ -21,6 +21,8 @@ * @todo Use some variant of Pager or something; the pagination here is lousy. */ +use Wikimedia\Rdbms\IDatabase; + /** * Implements Special:Whatlinkshere * diff --git a/includes/specials/helpers/LoginHelper.php b/includes/specials/helpers/LoginHelper.php index f853f4173b..a35a420ee6 100644 --- a/includes/specials/helpers/LoginHelper.php +++ b/includes/specials/helpers/LoginHelper.php @@ -75,7 +75,7 @@ class LoginHelper extends ContextSource { // Allow modification of redirect behavior Hooks::run( 'PostLoginRedirect', [ &$returnTo, &$returnToQuery, &$type ] ); - $returnToTitle = Title::newFromText( $returnTo ) ?: Title::newMainPage(); + $returnToTitle = Title::newFromText( $returnTo ) ?: Title::newMainPage(); if ( $wgSecureLogin && !$stickHTTPS ) { $options = [ 'http' ]; @@ -89,7 +89,7 @@ class LoginHelper extends ContextSource { } if ( $type === 'successredirect' ) { - $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto ); + $redirectUrl = $returnToTitle->getFullUrlForRedirect( $returnToQuery, $proto ); $this->getOutput()->redirect( $redirectUrl ); } else { $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options ); diff --git a/includes/specials/pagers/ActiveUsersPager.php b/includes/specials/pagers/ActiveUsersPager.php index 0d6f493d59..0665e112ee 100644 --- a/includes/specials/pagers/ActiveUsersPager.php +++ b/includes/specials/pagers/ActiveUsersPager.php @@ -1,7 +1,5 @@ groups; - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); - } + $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); } if ( $this->excludegroups !== [] ) { foreach ( $this->excludegroups as $group ) { @@ -111,9 +107,7 @@ class ActiveUsersPager extends UsersPager { 'user_groups', '1', [ 'ug_user = user_id', 'ug_group' => $group, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ] ) . ')'; } diff --git a/includes/specials/pagers/AllMessagesTablePager.php b/includes/specials/pagers/AllMessagesTablePager.php index ca1b7dca9d..e6a0f0be51 100644 --- a/includes/specials/pagers/AllMessagesTablePager.php +++ b/includes/specials/pagers/AllMessagesTablePager.php @@ -375,7 +375,9 @@ class AllMessagesTablePager extends TablePager { } if ( !$isSecond ) { - $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) ); + $arr['id'] = Sanitizer::escapeIdForAttribute( + 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) + ); } return $arr; diff --git a/includes/specials/pagers/BlockListPager.php b/includes/specials/pagers/BlockListPager.php index 9a447ef8f3..51e446d593 100644 --- a/includes/specials/pagers/BlockListPager.php +++ b/includes/specials/pagers/BlockListPager.php @@ -246,6 +246,26 @@ class BlockListPager extends TablePager { return $info; } + /** + * Get total number of autoblocks at any given time + * + * @return int Total number of unexpired active autoblocks + */ + function getTotalAutoblocks() { + $dbr = $this->getDatabase(); + $res = $dbr->selectField( 'ipblocks', + [ 'COUNT(*) AS totalautoblocks' ], + [ + 'ipb_auto' => '1', + 'ipb_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ), + ] + ); + if ( $res ) { + return $res; + } + return 0; // We found nothing + } + protected function getTableClass() { return parent::getTableClass() . ' mw-blocklist'; } diff --git a/includes/specials/pagers/ContribsPager.php b/includes/specials/pagers/ContribsPager.php index 5126bad1a8..d7819c42b3 100644 --- a/includes/specials/pagers/ContribsPager.php +++ b/includes/specials/pagers/ContribsPager.php @@ -26,8 +26,9 @@ use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IDatabase; -class ContribsPager extends ReverseChronologicalPager { +class ContribsPager extends RangeChronologicalPager { public $mDefaultDirection = IndexPager::DIR_DESCENDING; public $messages; @@ -44,6 +45,11 @@ class ContribsPager extends ReverseChronologicalPager { */ protected $mParentLens; + /** + * @var TemplateParser + */ + protected $templateParser; + function __construct( IContextSource $context, array $options ) { parent::__construct( $context ); @@ -70,15 +76,23 @@ class ContribsPager extends ReverseChronologicalPager { $this->newOnly = !empty( $options['newOnly'] ); $this->hideMinor = !empty( $options['hideMinor'] ); - $year = isset( $options['year'] ) ? $options['year'] : false; - $month = isset( $options['month'] ) ? $options['month'] : false; - $this->getDateCond( $year, $month ); + // Date filtering: use timestamp if available + $startTimestamp = ''; + $endTimestamp = ''; + if ( $options['start'] ) { + $startTimestamp = $options['start'] . ' 00:00:00'; + } + if ( $options['end'] ) { + $endTimestamp = $options['end'] . ' 23:59:59'; + } + $this->getDateRangeCond( $startTimestamp, $endTimestamp ); // Most of this code will use the 'contributions' group DB, which can map to replica DBs // with extra user based indexes or partioning by user. The additional metadata // queries should use a regular replica DB since the lookup pattern is not all by user. $this->mDbSecondary = wfGetDB( DB_REPLICA ); // any random replica DB $this->mDb = wfGetDB( DB_REPLICA, 'contributions' ); + $this->templateParser = new TemplateParser(); } function getDefaultQuery() { @@ -227,10 +241,8 @@ class ContribsPager extends ReverseChronologicalPager { 'LEFT JOIN', [ 'ug_user = rev_user', 'ug_group' => $groupsWithBotPermission, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . - $this->mDb->addQuotes( $this->mDb->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . + $this->mDb->addQuotes( $this->mDb->timestamp() ) ] ]; } @@ -353,9 +365,9 @@ class ContribsPager extends ReverseChronologicalPager { * @return string */ function formatRow( $row ) { - $ret = ''; $classes = []; + $attribs = []; $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer(); @@ -376,7 +388,7 @@ class ContribsPager extends ReverseChronologicalPager { MediaWiki\restoreWarnings(); if ( $validRevision ) { - $classes = []; + $attribs['data-mw-revid'] = $rev->getId(); $page = Title::newFromRow( $row ); $link = $linkRenderer->makeLink( @@ -460,14 +472,13 @@ class ContribsPager extends ReverseChronologicalPager { } # Show user names for /newbies as there may be different users. - # Note that we already excluded rows with hidden user names. - if ( $this->contribs == 'newbie' ) { + # Note that only unprivileged users have rows with hidden user names excluded. + $userlink = ''; + if ( $this->contribs == 'newbie' && !$rev->isDeleted( Revision::DELETED_USER ) ) { $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() ); $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams( - Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; - } else { - $userlink = ''; + Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; } $flags = []; @@ -517,27 +528,28 @@ class ContribsPager extends ReverseChronologicalPager { $this->msg( 'rev-deleted-user-contribs' )->escaped(); } - $templateParser = new TemplateParser(); - $ret = $templateParser->processTemplate( + $ret = $this->templateParser->processTemplate( 'SpecialContributionsLine', $templateParams ); } // Let extensions add data - Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); + Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] ); + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); // TODO: Handle exceptions in the catch block above. Do any extensions rely on // receiving empty rows? - if ( $classes === [] && $ret === '' ) { + if ( $classes === [] && $attribs === [] && $ret === '' ) { wfDebug( "Dropping Special:Contribution row that could not be formatted\n" ); return "\n"; } + $attribs['class'] = $classes; // FIXME: The signature of the ContributionsLineEnding hook makes it // very awkward to move this LI wrapper into the template. - return Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; + return Html::rawElement( 'li', $attribs, $ret ) . "\n"; } /** @@ -563,4 +575,43 @@ class ContribsPager extends ReverseChronologicalPager { public function getPreventClickjacking() { return $this->preventClickjacking; } + + /** + * Set up date filter options, given request data. + * + * @param array $opts Options array + * @return array Options array with processed start and end date filter options + */ + public static function processDateFilter( $opts ) { + $start = isset( $opts['start'] ) ? $opts['start'] : ''; + $end = isset( $opts['end'] ) ? $opts['end'] : ''; + $year = isset( $opts['year'] ) ? $opts['year'] : ''; + $month = isset( $opts['month'] ) ? $opts['month'] : ''; + + if ( $start !== '' && $end !== '' && $start > $end ) { + $temp = $start; + $start = $end; + $end = $temp; + } + + // If year/month legacy filtering options are set, convert them to display the new stamp + if ( $year !== '' || $month !== '' ) { + // Reuse getDateCond logic, but subtract a day because + // the endpoints of our date range appear inclusive + // but the internal end offsets are always exclusive + $legacyTimestamp = ReverseChronologicalPager::getOffsetDate( $year, $month ); + $legacyDateTime = new DateTime( $legacyTimestamp->getTimestamp( TS_ISO_8601 ) ); + $legacyDateTime = $legacyDateTime->modify( '-1 day' ); + + // Clear the new timestamp range options if used and + // replace with the converted legacy timestamp + $start = ''; + $end = $legacyDateTime->format( 'Y-m-d' ); + } + + $opts['start'] = $start; + $opts['end'] = $end; + + return $opts; + } } diff --git a/includes/specials/pagers/DeletedContribsPager.php b/includes/specials/pagers/DeletedContribsPager.php index a1f6b84506..43d7ad40c7 100644 --- a/includes/specials/pagers/DeletedContribsPager.php +++ b/includes/specials/pagers/DeletedContribsPager.php @@ -129,7 +129,7 @@ class DeletedContribsPager extends IndexPager { $condition = []; $condition['ar_user_text'] = $this->target; - $index = 'usertext_timestamp'; + $index = 'ar_usertext_timestamp'; return [ $index, $condition ]; } @@ -195,6 +195,7 @@ class DeletedContribsPager extends IndexPager { function formatRow( $row ) { $ret = ''; $classes = []; + $attribs = []; /* * There may be more than just revision rows. To make sure that we'll only be processing @@ -213,17 +214,20 @@ class DeletedContribsPager extends IndexPager { MediaWiki\restoreWarnings(); if ( $validRevision ) { + $attribs['data-mw-revid'] = $rev->getId(); $ret = $this->formatRevisionRow( $row ); } // Let extensions add data - Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); + Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] ); + $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] ); - if ( $classes === [] && $ret === '' ) { + if ( $classes === [] && $attribs === [] && $ret === '' ) { wfDebug( "Dropping Special:DeletedContribution row that could not be formatted\n" ); $ret = "\n"; } else { - $ret = Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; + $attribs['class'] = $classes; + $ret = Html::rawElement( 'li', $attribs, $ret ) . "\n"; } return $ret; diff --git a/includes/specials/pagers/ImageListPager.php b/includes/specials/pagers/ImageListPager.php index 3789dfa6e8..47b059b765 100644 --- a/includes/specials/pagers/ImageListPager.php +++ b/includes/specials/pagers/ImageListPager.php @@ -193,7 +193,8 @@ class ImageListPager extends TablePager { } $sortable = [ 'img_timestamp', 'img_name', 'img_size' ]; /* For reference, the indicies we can use for sorting are: - * On the image table: img_usertext_timestamp, img_size, img_timestamp + * On the image table: img_user_timestamp, img_usertext_timestamp, + * img_size, img_timestamp * On oldimage: oi_usertext_timestamp, oi_name_timestamp * * In particular that means we cannot sort by timestamp when not filtering diff --git a/includes/specials/pagers/NewFilesPager.php b/includes/specials/pagers/NewFilesPager.php index 4bf5dff667..001c296d43 100644 --- a/includes/specials/pagers/NewFilesPager.php +++ b/includes/specials/pagers/NewFilesPager.php @@ -24,7 +24,7 @@ */ use MediaWiki\MediaWikiServices; -class NewFilesPager extends ReverseChronologicalPager { +class NewFilesPager extends RangeChronologicalPager { /** * @var ImageGalleryBase @@ -41,11 +41,20 @@ class NewFilesPager extends ReverseChronologicalPager { * @param FormOptions $opts */ function __construct( IContextSource $context, FormOptions $opts ) { - $this->opts = $opts; + parent::__construct( $context ); + $this->opts = $opts; $this->setLimit( $opts->getValue( 'limit' ) ); - parent::__construct( $context ); + $startTimestamp = ''; + $endTimestamp = ''; + if ( $opts->getValue( 'start' ) ) { + $startTimestamp = $opts->getValue( 'start' ) . ' 00:00:00'; + } + if ( $opts->getValue( 'end' ) ) { + $endTimestamp = $opts->getValue( 'end' ) . ' 23:59:59'; + } + $this->getDateRangeCond( $startTimestamp, $endTimestamp ); } function getQueryInfo() { @@ -55,6 +64,30 @@ class NewFilesPager extends ReverseChronologicalPager { $fields = [ 'img_name', 'img_user', 'img_timestamp' ]; $options = []; + $user = $opts->getValue( 'user' ); + if ( $user !== '' ) { + $userId = User::idFromName( $user ); + if ( $userId ) { + $conds['img_user'] = $userId; + } else { + $conds['img_user_text'] = $user; + } + } + + if ( $opts->getValue( 'newbies' ) ) { + // newbie = most recent 1% of users + $dbr = wfGetDB( DB_REPLICA ); + $max = $dbr->selectField( 'user', 'max(user_id)', false, __METHOD__ ); + $conds[] = 'img_user >' . (int)( $max - $max / 100 ); + + // there's no point in looking for new user activity in a far past; + // beyond a certain point, we'd just end up scanning the rest of the + // table even though the users we're looking for didn't yet exist... + // see T140537, (for ContribsPages, but similar to this) + $conds[] = 'img_timestamp > ' . + $dbr->addQuotes( $dbr->timestamp( wfTimestamp() - 30 * 24 * 60 * 60 ) ); + } + if ( !$opts->getValue( 'showbots' ) ) { $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' ); @@ -67,9 +100,7 @@ class NewFilesPager extends ReverseChronologicalPager { [ 'ug_group' => $groupsWithBotPermission, 'ug_user = img_user', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ] ]; } @@ -95,6 +126,10 @@ class NewFilesPager extends ReverseChronologicalPager { $options[] = 'STRAIGHT_JOIN'; } + if ( $opts->getValue( 'mediatype' ) ) { + $conds['img_media_type'] = $opts->getValue( 'mediatype' ); + } + $likeVal = $opts->getValue( 'like' ); if ( !$this->getConfig()->get( 'MiserMode' ) && $likeVal !== '' ) { $dbr = wfGetDB( DB_REPLICA ); diff --git a/includes/specials/pagers/ProtectedPagesPager.php b/includes/specials/pagers/ProtectedPagesPager.php index 45dced8829..823b5da403 100644 --- a/includes/specials/pagers/ProtectedPagesPager.php +++ b/includes/specials/pagers/ProtectedPagesPager.php @@ -36,9 +36,9 @@ class ProtectedPagesPager extends TablePager { /** * @param SpecialProtectedpages $form * @param array $conds - * @param $type - * @param $level - * @param $namespace + * @param string $type + * @param string $level + * @param int $namespace * @param string $sizetype * @param int $size * @param bool $indefonly diff --git a/includes/specials/pagers/UsersPager.php b/includes/specials/pagers/UsersPager.php index d599599031..a68fe66881 100644 --- a/includes/specials/pagers/UsersPager.php +++ b/includes/specials/pagers/UsersPager.php @@ -112,9 +112,7 @@ class UsersPager extends AlphabeticPager { if ( $this->requestedGroup != '' ) { $conds['ug_group'] = $this->requestedGroup; - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); - } + $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); } if ( $this->requestedUser != '' ) { @@ -272,71 +270,89 @@ class UsersPager extends AlphabeticPager { function getPageHeader() { list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() ); - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - - # Form tag - $out = Xml::openElement( - 'form', - [ 'method' => 'get', 'action' => wfScript(), 'id' => 'mw-listusers-form' ] - ) . - Xml::fieldset( $this->msg( 'listusers' )->text() ) . - Html::hidden( 'title', $self ); - - # Username field (with autocompletion support) - $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' . - Html::input( - 'username', - $this->requestedUser, - 'text', - [ - 'class' => 'mw-autocomplete-user', - 'id' => 'offset', - 'size' => 20, - 'autofocus' => $this->requestedUser === '' - ] - ) . ' '; - - # Group drop-down list - $sel = new XmlSelect( 'group', 'group', $this->requestedGroup ); - $sel->addOption( $this->msg( 'group-all' )->text(), '' ); + $groupOptions = [ $this->msg( 'group-all' )->text() => '' ]; foreach ( $this->getAllGroups() as $group => $groupText ) { - $sel->addOption( $groupText, $group ); + $groupOptions[ $groupText ] = $group; } - $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' '; - $out .= $sel->getHTML() . '
    '; - $out .= Xml::checkLabel( - $this->msg( 'listusers-editsonly' )->text(), - 'editsOnly', - 'editsOnly', - $this->editsOnly - ); - $out .= ' '; - $out .= Xml::checkLabel( - $this->msg( 'listusers-creationsort' )->text(), - 'creationSort', - 'creationSort', - $this->creationSort - ); - $out .= ' '; - $out .= Xml::checkLabel( - $this->msg( 'listusers-desc' )->text(), - 'desc', - 'desc', - $this->mDefaultDirection - ); - $out .= '
    '; + $formDescriptor = [ + 'user' => [ + 'class' => 'HTMLUserTextField', + 'label' => $this->msg( 'listusersfrom' )->text(), + 'name' => 'username', + 'default' => $this->requestedUser, + ], + 'dropdown' => [ + 'label' => $this->msg( 'group' )->text(), + 'name' => 'group', + 'default' => $this->requestedGroup, + 'class' => 'HTMLSelectField', + 'options' => $groupOptions, + ], + 'editsOnly' => [ + 'type' => 'check', + 'label' => $this->msg( 'listusers-editsonly' )->text(), + 'name' => 'editsOnly', + 'id' => 'editsOnly', + 'default' => $this->editsOnly + ], + 'creationSort' => [ + 'type' => 'check', + 'label' => $this->msg( 'listusers-creationsort' )->text(), + 'name' => 'creationSort', + 'id' => 'creationSort', + 'default' => $this->creationSort + ], + 'desc' => [ + 'type' => 'check', + 'label' => $this->msg( 'listusers-desc' )->text(), + 'name' => 'desc', + 'id' => 'desc', + 'default' => $this->mDefaultDirection + ], + 'limithiddenfield' => [ + 'class' => 'HTMLHiddenField', + 'name' => 'limit', + 'default' => $this->mLimit + ] + ]; + + $beforeSubmitButtonHookOut = ''; + Hooks::run( 'SpecialListusersHeaderForm', [ $this, &$beforeSubmitButtonHookOut ] ); + + if ( $beforeSubmitButtonHookOut !== '' ) { + $formDescriptior[ 'beforeSubmitButtonHookOut' ] = [ + 'class' => 'HTMLInfoField', + 'raw' => true, + 'default' => $beforeSubmitButtonHookOut + ]; + } + + $formDescriptor[ 'submit' ] = [ + 'class' => 'HTMLSubmitField', + 'buttonlabel-message' => 'listusers-submit', + ]; - Hooks::run( 'SpecialListusersHeaderForm', [ $this, &$out ] ); + $beforeClosingFieldsetHookOut = ''; + Hooks::run( 'SpecialListusersHeader', [ $this, &$beforeClosingFieldsetHookOut ] ); - # Submit button and form bottom - $out .= Html::hidden( 'limit', $this->mLimit ); - $out .= Xml::submitButton( $this->msg( 'listusers-submit' )->text() ); - Hooks::run( 'SpecialListusersHeader', [ $this, &$out ] ); - $out .= Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ); + if ( $beforeClosingFieldsetHookOut !== '' ) { + $formDescriptior[ 'beforeClosingFieldsetHookOut' ] = [ + 'class' => 'HTMLInfoField', + 'raw' => true, + 'default' => $beforeClosingFieldsetHookOut + ]; + } - return $out; + $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ); + $htmlForm + ->setMethod( 'get' ) + ->setAction( Title::newFromText( $self )->getLocalURL() ) + ->setId( 'mw-listusers-form' ) + ->setFormIdentifier( 'mw-listusers-form' ) + ->suppressDefaultSubmit() + ->setWrapperLegendMsg( 'listusers' ); + return $htmlForm->prepareForm()->getHTML( true ); } /** diff --git a/includes/templates/EnhancedChangesListGroup.mustache b/includes/templates/EnhancedChangesListGroup.mustache index 352eb17d21..cd59d6d3df 100644 --- a/includes/templates/EnhancedChangesListGroup.mustache +++ b/includes/templates/EnhancedChangesListGroup.mustache @@ -3,8 +3,9 @@ + - {{# lines }} - + + - or other required elements. + thead: [ 1, "
     " . - Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(), - 'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ) . - "
    " . - $this->msg( 'undeleteextrahelp' )->parseAsBlock() . - "
    " . - Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) . - "" . - Xml::input( - 'wpComment', - 50, - $this->mComment, - [ 'id' => 'wpComment', 'autofocus' => '' ] - ) . - "
     " . - Xml::submitButton( - $this->msg( 'undeletebtn' )->text(), - [ 'name' => 'restore', 'id' => 'mw-undelete-submit' ] - ) . ' ' . - Xml::submitButton( - $this->msg( 'undeleteinvert' )->text(), - [ 'name' => 'invert', 'id' => 'mw-undelete-invert' ] - ) . - "
    {{{ prefix }}} {{{ collectedRcFlags }}} {{ timestamp }}  + {{# rev-deleted-event }}{{{ . }}}{{/ rev-deleted-event }} {{{ articleLink }}}{{{ languageDirMark }}}{{{ logText }}} . . @@ -14,10 +15,11 @@
    {{{ recentChangesFlags }}}  + {{# timestampLink }} {{{ . }}} {{/ timestampLink }} diff --git a/includes/tidy/Balancer.php b/includes/tidy/Balancer.php index 3467b49cae..b29a3afbd4 100644 --- a/includes/tidy/Balancer.php +++ b/includes/tidy/Balancer.php @@ -1203,7 +1203,7 @@ class BalanceStack implements IteratorAggregate { $furthestBlock = null; $furthestBlockIndex = -1; $stackLength = $this->length(); - for ( $i = $index+1; $i < $stackLength; $i++ ) { + for ( $i = $index + 1; $i < $stackLength; $i++ ) { if ( $this->node( $i )->isA( BalanceSets::$specialSet ) ) { $furthestBlock = $this->node( $i ); $furthestBlockIndex = $i; @@ -1225,7 +1225,7 @@ class BalanceStack implements IteratorAggregate { // Let the common ancestor be the element immediately above // the formatting element in the stack of open elements. - $ancestor = $this->node( $index-1 ); + $ancestor = $this->node( $index - 1 ); // Let a bookmark note the position of the formatting // element in the list of active formatting elements @@ -1891,7 +1891,7 @@ class Balancer { $bad = array_uintersect_assoc( $this->allowedHtmlElements, BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE], - function( $a, $b ) { + function ( $a, $b ) { // Ignore the values (just intersect the keys) by saying // all values are equal to each other. return 0; @@ -2116,7 +2116,7 @@ class Balancer { return $this->insertToken( $token, $value, $attribs, $selfClose ); } // "Any other start tag" - $adjusted = ( $this->fragmentContext && $this->stack->length()===1 ) ? + $adjusted = ( $this->fragmentContext && $this->stack->length() === 1 ) ? $this->fragmentContext : $this->stack->currentNode; $this->stack->insertForeignElement( $adjusted->namespaceURI, $value, $attribs @@ -2156,7 +2156,7 @@ class Balancer { if ( $this->allowComments && !( $this->inRCDATA || $this->inRAWTEXT ) && - preg_match( Balancer::VALID_COMMENT_REGEX, $x, $regs, PREG_OFFSET_CAPTURE ) && + preg_match( self::VALID_COMMENT_REGEX, $x, $regs, PREG_OFFSET_CAPTURE ) && // verify EOF condition where necessary ( $regs[4][1] < 0 || !$this->bitsIterator->valid() ) ) { @@ -2242,7 +2242,7 @@ class Balancer { private function switchMode( $mode ) { Assert::parameter( - substr( $mode, -4 )==='Mode', '$mode', 'should end in Mode' + substr( $mode, -4 ) === 'Mode', '$mode', 'should end in Mode' ); $oldMode = $this->parseMode; $this->parseMode = $mode; @@ -2267,8 +2267,8 @@ class Balancer { switch ( $node->localName ) { case 'select': $stackLength = $this->stack->length(); - for ( $j = $i + 1; $j < $stackLength-1; $j++ ) { - $ancestor = $this->stack->node( $stackLength-$j-1 ); + for ( $j = $i + 1; $j < $stackLength - 1; $j++ ) { + $ancestor = $this->stack->node( $stackLength - $j - 1 ); if ( $ancestor->isHtmlNamed( 'template' ) ) { break; } diff --git a/includes/tidy/RaggettWrapper.php b/includes/tidy/RaggettWrapper.php index 9f6feb8e55..b793a58af7 100644 --- a/includes/tidy/RaggettWrapper.php +++ b/includes/tidy/RaggettWrapper.php @@ -48,6 +48,12 @@ class RaggettWrapper { // Modify inline Microdata and elements so they say and so // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', ' tags, but those aren't empty. + $wrappedtext = preg_replace_callback( '!]*)>(.*?)!s', function ( $m ) { + return '' + . $this->replaceCallback( [ $m[2] ] ) + . ''; + }, $wrappedtext ); // Preserve empty li elements (T49673) by abusing Tidy's datafld hack // The whitespace class is as in TY_(InitMap) @@ -78,8 +84,9 @@ class RaggettWrapper { * @return string */ public function postprocess( $text ) { - // Revert back to <{link,meta}> + // Revert back to <{link,meta,style}> $text = preg_replace( '!]*?)(/{0,1}>)!', '<$1$2$3', $text ); + $text = preg_replace( '!<(/?)html-(style)([^>]*)>!', '<$1$2$3>', $text ); // Remove datafld $text = str_replace( '
  • serializer->getParentNode( $parent ); $parent = $newParent; $parentData = $parent->snData; + $pElement = $parentData->childPElement; $parentData->childPElement = null; $newRef = $refElement->userData; - // FIXME cannot call endTag() since we don't have an Element + $this->endTag( $pElement, $sourceStart, 0 ); } elseif ( $under && $parentData->isSplittable && (bool)$parentData->ancestorPNode !== $inline ) { @@ -425,7 +423,13 @@ class RemexCompatMunger implements TreeHandler { } public function endTag( Element $element, $sourceStart, $sourceLength ) { + $data = $element->userData->snData; + if ( $data->childPElement ) { + $this->endTag( $data->childPElement, $sourceStart, 0 ); + } $this->serializer->endTag( $element, $sourceStart, $sourceLength ); + $element->userData->snData = null; + $element->userData = null; } public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) { diff --git a/includes/tidy/TidyDriverBase.php b/includes/tidy/TidyDriverBase.php index d3f9d48591..6e01894008 100644 --- a/includes/tidy/TidyDriverBase.php +++ b/includes/tidy/TidyDriverBase.php @@ -24,6 +24,7 @@ abstract class TidyDriverBase { * * @param string $text * @param string &$errorStr Return the error string + * @throws \MWException * @return bool Whether the HTML is valid */ public function validate( $text, &$errorStr ) { diff --git a/includes/tidy/tidy.conf b/includes/tidy/tidy.conf index d93ce2251b..d4a3199367 100644 --- a/includes/tidy/tidy.conf +++ b/includes/tidy/tidy.conf @@ -20,3 +20,5 @@ fix-uri: no # html-{meta,link} is a hack we use to prevent Tidy from stripping and used in the body for Microdata new-empty-tags: html-meta, html-link, wbr, source, track new-inline-tags: video, audio, bdi, data, time, mark +# html-style is a hack we use to prevent pre-HTML5 versions of Tidy from stripping - + diff --git a/maintenance/jsparse.php b/maintenance/jsparse.php index 770251cf0d..49b945cbad 100644 --- a/maintenance/jsparse.php +++ b/maintenance/jsparse.php @@ -24,7 +24,7 @@ require_once __DIR__ . '/Maintenance.php'; /** - * Maintenance script to do test JavaScript validity parses using jsmin+'s parser + * Maintenance script to test JavaScript validity using JsMinPlus' parser * * @ingroup Maintenance */ diff --git a/maintenance/language/checkDupeMessages.php b/maintenance/language/checkDupeMessages.php index baf917c90a..92ddc449d5 100644 --- a/maintenance/language/checkDupeMessages.php +++ b/maintenance/language/checkDupeMessages.php @@ -93,7 +93,6 @@ if ( $run ) { $count = 0; if ( ( $messageExist ) && ( $messageCExist ) ) { - if ( !strcmp( $runMode, 'php' ) ) { print "getOption( 'u', false ); $reason = $this->getOption( 'r', '' ); $interval = $this->getOption( 'i', 0 ); - $noredirects = $this->getOption( 'noredirects', false ); + $noredirects = $this->hasOption( 'noredirects' ); if ( $this->hasArg() ) { $file = fopen( $this->getArg(), 'r' ); } else { diff --git a/maintenance/mssql/archives/patch-add-3d.sql b/maintenance/mssql/archives/patch-add-3d.sql new file mode 100644 index 0000000000..51d2775f28 --- /dev/null +++ b/maintenance/mssql/archives/patch-add-3d.sql @@ -0,0 +1,27 @@ +ALTER TABLE /*$wgDBprefix*/image + DROP CONSTRAINT img_media_type_ckc; + +ALTER TABLE /*$wgDBprefix*/image + ADD CONSTRAINT img_media_type_ckc + CHECK (img_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D")); + +ALTER TABLE /*$wgDBprefix*/oldimage + DROP CONSTRAINT oi_media_type_ckc; + +ALTER TABLE /*$wgDBprefix*/oldimage + ADD CONSTRAINT oi_media_type_ckc + CHECK (oi_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D")); + +ALTER TABLE /*$wgDBprefix*/filearchive + DROP CONSTRAINT fa_media_type_ckc; + +ALTER TABLE /*$wgDBprefix*/filearchive + ADD CONSTRAINT fa_media_type_ckc + CHECK (fa_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D")); + +ALTER TABLE /*$wgDBprefix*/uploadstash + DROP CONSTRAINT us_media_type_ckc; + +ALTER TABLE /*$wgDBprefix*/uploadstash + ADD CONSTRAINT us_media_type_ckc + CHECK (us_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D")); diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql index 3babb393fb..2a672945ea 100644 --- a/maintenance/mssql/tables.sql +++ b/maintenance/mssql/tables.sql @@ -610,7 +610,7 @@ CREATE TABLE /*_*/image ( img_sha1 nvarchar(32) NOT NULL default '', CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')), - CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')) + CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D')) ); CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp); @@ -656,7 +656,7 @@ CREATE TABLE /*_*/oldimage ( oi_sha1 nvarchar(32) NOT NULL default '', CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')), - CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')) + CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D')) ); CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp); @@ -715,7 +715,7 @@ CREATE TABLE /*_*/filearchive ( fa_sha1 nvarchar(32) NOT NULL default '', CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')), - CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')) + CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D')) ); -- pick out by image name @@ -776,7 +776,7 @@ CREATE TABLE /*_*/uploadstash ( us_image_height int, us_image_bits smallint, - CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE')) + CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE', '3D')) ); -- sometimes there's a delete for all of a user's stuff. diff --git a/maintenance/mwdoc-filter.php b/maintenance/mwdoc-filter.php index 07aa2824aa..feaad12a60 100644 --- a/maintenance/mwdoc-filter.php +++ b/maintenance/mwdoc-filter.php @@ -38,6 +38,7 @@ * DEALINGS IN THE SOFTWARE. */ +// Warning: Converting this to a Maintenance script may reduce performance. if ( PHP_SAPI != 'cli' ) { die( "This filter can only be run from the command line.\n" ); } diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php index dc2eccd080..43041a43df 100644 --- a/maintenance/mwdocgen.php +++ b/maintenance/mwdocgen.php @@ -72,7 +72,7 @@ class MWDocGen extends Maintenance { } protected function init() { - global $IP; + global $wgPhpCli, $IP; $this->doxygen = $this->getOption( 'doxygen', 'doxygen' ); $this->mwVersion = $this->getOption( 'version', 'master' ); @@ -86,7 +86,13 @@ class MWDocGen extends Maintenance { $this->output = $this->getOption( 'output', "$IP/docs" ); - $this->inputFilter = wfShellWikiCmd( $IP . '/maintenance/mwdoc-filter.php' ); + // Do not use wfShellWikiCmd, because mwdoc-filter.php is not + // a Maintenance script. + $this->inputFilter = wfEscapeShellArg( [ + $wgPhpCli, + $IP . '/maintenance/mwdoc-filter.php' + ] ); + $this->template = $IP . '/maintenance/Doxyfile'; $this->excludes = [ 'vendor', @@ -99,7 +105,7 @@ class MWDocGen extends Maintenance { $this->excludePatterns[] = 'extensions'; } - $this->doDot = `which dot`; + $this->doDot = shell_exec( 'which dot' ); $this->doMan = $this->hasOption( 'generate-man' ); } diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php index 80e8011f40..4a2b49ae93 100644 --- a/maintenance/namespaceDupes.php +++ b/maintenance/namespaceDupes.php @@ -24,11 +24,12 @@ * @ingroup Maintenance */ +require_once __DIR__ . '/Maintenance.php'; + use MediaWiki\Linker\LinkTarget; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; - -require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; /** * Maintenance script that checks for articles to fix after @@ -39,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php'; class NamespaceConflictChecker extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $db; @@ -255,7 +256,6 @@ class NamespaceConflictChecker extends Maintenance { $ok = true; foreach ( $targets as $row ) { - // Find the new title and determine the action to take $newTitle = $this->getDestinationTitle( $ns, $name, diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php index 0326e02308..e735aed00f 100644 --- a/maintenance/nukeNS.php +++ b/maintenance/nukeNS.php @@ -52,8 +52,8 @@ class NukeNS extends Maintenance { public function execute() { $ns = $this->getOption( 'ns', NS_MEDIAWIKI ); - $delete = $this->getOption( 'delete', false ); - $all = $this->getOption( 'all', false ); + $delete = $this->hasOption( 'delete' ); + $all = $this->hasOption( 'all' ); $dbw = $this->getDB( DB_MASTER ); $this->beginTransaction( $dbw, __METHOD__ ); diff --git a/maintenance/nukePage.php b/maintenance/nukePage.php index de037dc1c9..e27324a758 100644 --- a/maintenance/nukePage.php +++ b/maintenance/nukePage.php @@ -39,9 +39,8 @@ class NukePage extends Maintenance { } public function execute() { - $name = $this->getArg(); - $delete = $this->getOption( 'delete', false ); + $delete = $this->hasOption( 'delete' ); $dbw = $this->getDB( DB_MASTER ); $this->beginTransaction( $dbw, __METHOD__ ); diff --git a/maintenance/oracle/alterSharedConstraints.php b/maintenance/oracle/alterSharedConstraints.php index ba1e8799ae..ed412dae21 100644 --- a/maintenance/oracle/alterSharedConstraints.php +++ b/maintenance/oracle/alterSharedConstraints.php @@ -19,6 +19,8 @@ * @ingroup Maintenance */ +use Wikimedia\Rdbms\DBQueryError; + /** * When using shared tables that are referenced by foreign keys on local * tables you have to change the constraints on local tables. @@ -65,8 +67,8 @@ class AlterSharedConstraints extends Maintenance { AND ucc.constraint_name = uc.constraint_name AND uccpk.constraint_name = uc.r_constraint_name AND uccpk.table_name = '$ltable'" ); - while ( ( $row = $result->fetchRow() ) !== false ) { + while ( ( $row = $result->fetchRow() ) !== false ) { $this->output( "Altering {$row['constraint_name']} ..." ); try { diff --git a/maintenance/orphans.php b/maintenance/orphans.php index 2da8830643..e36c5b67dd 100644 --- a/maintenance/orphans.php +++ b/maintenance/orphans.php @@ -30,6 +30,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script that looks for 'orphan' revisions hooked to pages which * don't exist and 'childless' pages with no revisions. @@ -56,7 +58,7 @@ class Orphans extends Maintenance { /** * Lock the appropriate tables for the script - * @param Database $db + * @param IMaintainableDatabase $db * @param string[] $extraTable The name of any extra tables to lock (eg: text) */ private function lockTables( $db, $extraTable = [] ) { diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php index 87a46998e2..5dccdd65ec 100644 --- a/maintenance/populateCategory.php +++ b/maintenance/populateCategory.php @@ -71,7 +71,7 @@ TEXT public function execute() { $begin = $this->getOption( 'begin', '' ); $throttle = $this->getOption( 'throttle', 0 ); - $force = $this->getOption( 'force', false ); + $force = $this->hasOption( 'force' ); $dbw = $this->getDB( DB_MASTER ); diff --git a/maintenance/populateContentModel.php b/maintenance/populateContentModel.php index b41e0e0d6e..7d83180eed 100644 --- a/maintenance/populateContentModel.php +++ b/maintenance/populateContentModel.php @@ -23,13 +23,15 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Usage: * populateContentModel.php --ns=1 --table=page */ class PopulateContentModel extends Maintenance { protected $wikiId; - + /** @var WANObjectCache */ protected $wanCache; public function __construct() { @@ -78,7 +80,7 @@ class PopulateContentModel extends Maintenance { $this->wanCache->delete( $revisionKey ); } - private function updatePageRows( Database $dbw, $pageIds, $model ) { + private function updatePageRows( IDatabase $dbw, $pageIds, $model ) { $count = count( $pageIds ); $this->output( "Setting $count rows to $model..." ); $dbw->update( @@ -91,7 +93,7 @@ class PopulateContentModel extends Maintenance { $this->output( "done.\n" ); } - protected function populatePage( Database $dbw, $ns ) { + protected function populatePage( IDatabase $dbw, $ns ) { $toSave = []; $lastId = 0; $nsCondition = $ns === 'all' ? [] : [ 'page_namespace' => $ns ]; @@ -123,7 +125,7 @@ class PopulateContentModel extends Maintenance { } } - private function updateRevisionOrArchiveRows( Database $dbw, $ids, $model, $table ) { + private function updateRevisionOrArchiveRows( IDatabase $dbw, $ids, $model, $table ) { $prefix = $table === 'archive' ? 'ar' : 'rev'; $model_column = "{$prefix}_content_model"; $format_column = "{$prefix}_content_format"; @@ -142,7 +144,7 @@ class PopulateContentModel extends Maintenance { $this->output( "done.\n" ); } - protected function populateRevisionOrArchive( Database $dbw, $table, $ns ) { + protected function populateRevisionOrArchive( IDatabase $dbw, $table, $ns ) { $prefix = $table === 'archive' ? 'ar' : 'rev'; $model_column = "{$prefix}_content_model"; $format_column = "{$prefix}_content_format"; diff --git a/maintenance/populateInterwiki.php b/maintenance/populateInterwiki.php index 8f7a918ae9..1b05e1ed03 100644 --- a/maintenance/populateInterwiki.php +++ b/maintenance/populateInterwiki.php @@ -56,7 +56,7 @@ TEXT } public function execute() { - $force = $this->getOption( 'force', false ); + $force = $this->hasOption( 'force' ); $this->source = $this->getOption( 'source', 'https://en.wikipedia.org/w/api.php' ); $data = $this->fetchLinks(); diff --git a/maintenance/populatePPSortKey.php b/maintenance/populatePPSortKey.php new file mode 100644 index 0000000000..7e3c2c3d25 --- /dev/null +++ b/maintenance/populatePPSortKey.php @@ -0,0 +1,106 @@ +addDescription( 'Populate the pp_sortkey field' ); + $this->setBatchSize( 100 ); + } + + protected function doDBUpdates() { + $dbw = $this->getDB( DB_MASTER ); + + $lastProp = null; + $lastPageValue = 0; + $editedRowCount = 0; + + $this->output( "Populating page_props.pp_sortkey...\n" ); + while ( true ) { + $conditions = [ 'pp_sortkey IS NULL' ]; + if ( $lastPageValue !== 0 ) { + $conditions[] = 'pp_page > ' . $dbw->addQuotes( $lastPageValue ) . ' OR ' . + '( pp_page = ' . $dbw->addQuotes( $lastPageValue ) . + ' AND pp_propname > ' . $dbw->addQuotes( $lastProp ) . ' )'; + } + + $res = $dbw->select( + 'page_props', + [ 'pp_propname', 'pp_page', 'pp_sortkey', 'pp_value' ], + $conditions, + __METHOD__, + [ + 'ORDER BY' => 'pp_page, pp_propname', + 'LIMIT' => $this->mBatchSize + ] + ); + + if ( $res->numRows() === 0 ) { + break; + } + + $this->beginTransaction( $dbw, __METHOD__ ); + + foreach ( $res as $row ) { + if ( !is_numeric( $row->pp_value ) ) { + continue; + } + $dbw->update( + 'page_props', + [ 'pp_sortkey' => $row->pp_value ], + [ + 'pp_page' => $row->pp_page, + 'pp_propname' => $row->pp_propname + ], + __METHOD__ + ); + $editedRowCount++; + } + + $this->output( "Updated " . $editedRowCount . " rows\n" ); + $this->commitTransaction( $dbw, __METHOD__ ); + + // We need to get the last element's page ID + $lastPageValue = $row->pp_page; + // And the propname... + $lastProp = $row->pp_propname; + } + + $this->output( "Populating page_props.pp_sortkey complete.\n" ); + } + + protected function getUpdateKey() { + return 'populate pp_sortkey'; + } +} + +$maintClass = 'PopulatePPSortKey'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/populateRecentChangesSource.php b/maintenance/populateRecentChangesSource.php index ac87cf3ecb..5d5da89a8c 100644 --- a/maintenance/populateRecentChangesSource.php +++ b/maintenance/populateRecentChangesSource.php @@ -23,6 +23,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script to populate the rc_source field. * @@ -83,7 +85,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance { return __CLASS__; } - protected function buildUpdateCondition( Database $dbw ) { + protected function buildUpdateCondition( IDatabase $dbw ) { $rcNew = $dbw->addQuotes( RC_NEW ); $rcSrcNew = $dbw->addQuotes( RecentChange::SRC_NEW ); $rcEdit = $dbw->addQuotes( RC_EDIT ); diff --git a/maintenance/postgres/archives/patch-add-3d.sql b/maintenance/postgres/archives/patch-add-3d.sql new file mode 100644 index 0000000000..f8927557c3 --- /dev/null +++ b/maintenance/postgres/archives/patch-add-3d.sql @@ -0,0 +1 @@ +ALTER TYPE media_type ADD VALUE '3D'; diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index e19c447a65..03fd03a2ff 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -393,7 +393,7 @@ CREATE INDEX fa_nouser ON filearchive (fa_deleted_user); CREATE INDEX fa_sha1 ON filearchive (fa_sha1); CREATE SEQUENCE uploadstash_us_id_seq; -CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE'); +CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE','3D'); CREATE TABLE uploadstash ( us_id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('uploadstash_us_id_seq'), diff --git a/maintenance/purgeModuleDeps.php b/maintenance/purgeModuleDeps.php index 3088baad09..feeeb65b65 100644 --- a/maintenance/purgeModuleDeps.php +++ b/maintenance/purgeModuleDeps.php @@ -22,7 +22,7 @@ * @author Timo Tijhof */ -use MediaWiki\MediaWikiServices; +use Wikimedia\Rdbms\IDatabase; require_once __DIR__ . '/Maintenance.php'; diff --git a/maintenance/purgePage.php b/maintenance/purgePage.php new file mode 100644 index 0000000000..44d390ead4 --- /dev/null +++ b/maintenance/purgePage.php @@ -0,0 +1,78 @@ +addDescription( 'Purge page.' ); + $this->addOption( 'skip-exists-check', 'Skip page existence check', false, false ); + } + + public function execute() { + $stdin = $this->getStdin(); + + while ( !feof( $stdin ) ) { + $title = trim( fgets( $stdin ) ); + if ( $title != '' ) { + $this->purge( $title ); + } + } + } + + private function purge( $title ) { + $title = Title::newFromText( $title ); + + if ( is_null( $title ) ) { + $this->error( 'Invalid page title' ); + return; + } + + $page = WikiPage::factory( $title ); + + if ( is_null( $page ) ) { + $this->error( "Could not instantiate page object" ); + return; + } + + if ( !$this->getOption( 'skip-exists-check' ) && !$page->exists() ) { + $this->error( "Page doesn't exist" ); + return; + } + + if ( $page->doPurge() ) { + $this->output( "Purged\n" ); + } else { + $this->error( "Purge failed" ); + } + } +} + +$maintClass = "PurgePage"; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/purgeParserCache.php b/maintenance/purgeParserCache.php index e00a55d29e..da2d850e15 100644 --- a/maintenance/purgeParserCache.php +++ b/maintenance/purgeParserCache.php @@ -24,6 +24,8 @@ require __DIR__ . '/Maintenance.php'; +use MediaWiki\MediaWikiServices; + /** * Maintenance script to remove old objects from the parser cache. * @@ -67,7 +69,7 @@ class PurgeParserCache extends Maintenance { $this->output( "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n" ); - $pc = wfGetParserCacheStorage(); + $pc = MediaWikiServices::getInstance()->getParserCache()->getCacheStorage(); $success = $pc->deleteObjectsExpiringBefore( $date, [ $this, 'showProgressAndWait' ] ); if ( !$success ) { $this->error( "\nCannot purge this kind of parser cache.", 1 ); diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php index 3520279fc3..fe3944c876 100644 --- a/maintenance/rebuildFileCache.php +++ b/maintenance/rebuildFileCache.php @@ -41,7 +41,7 @@ class RebuildFileCache extends Maintenance { } public function finalSetup() { - global $wgDebugToolbar, $wgUseFileCache, $wgReadOnly; + global $wgDebugToolbar, $wgUseFileCache; $this->enabled = $wgUseFileCache; // Script will handle capturing output and saving it itself @@ -50,7 +50,8 @@ class RebuildFileCache extends Maintenance { // Has to be done before Setup.php initialize MWDebug $wgDebugToolbar = false; // Avoid DB writes (like enotif/counters) - $wgReadOnly = 'Building cache'; // avoid DB writes (like enotif/counters) + MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode() + ->setReason( 'Building cache' ); parent::finalSetup(); } @@ -77,7 +78,7 @@ class RebuildFileCache extends Maintenance { $this->output( "Building content page file cache from page {$start}!\n" ); $dbr = $this->getDB( DB_REPLICA ); - $overwrite = $this->getOption( 'overwrite', false ); + $overwrite = $this->hasOption( 'overwrite' ); $start = ( $start > 0 ) ? $start : $dbr->selectField( 'page', 'MIN(page_id)', false, __METHOD__ ); diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php index 6aa1f37a8c..109350cd74 100644 --- a/maintenance/rebuildImages.php +++ b/maintenance/rebuildImages.php @@ -32,6 +32,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to update image metadata records. * @@ -40,7 +42,7 @@ require_once __DIR__ . '/Maintenance.php'; class ImageBuilder extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $dbw; @@ -61,7 +63,8 @@ class ImageBuilder extends Maintenance { $this->dbw = $this->getDB( DB_MASTER ); $this->dryrun = $this->hasOption( 'dry-run' ); if ( $this->dryrun ) { - $GLOBALS['wgReadOnly'] = 'Dry run mode, image upgrades are suppressed'; + MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode() + ->setReason( 'Dry run mode, image upgrades are suppressed' ); } if ( $this->hasOption( 'missing' ) ) { diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php index 458dacf56d..5df432eb7a 100644 --- a/maintenance/rebuildrecentchanges.php +++ b/maintenance/rebuildrecentchanges.php @@ -24,6 +24,7 @@ */ require_once __DIR__ . '/Maintenance.php'; +use MediaWiki\MediaWikiServices; /** * Maintenance script that rebuilds recent changes from scratch. @@ -155,9 +156,7 @@ class RebuildRecentchanges extends Maintenance { 'rc_this_oldid' => $row->rev_id, 'rc_last_oldid' => 0, // is this ok? 'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT, - 'rc_source' => $row->page_is_new - ? $dbw->addQuotes( RecentChange::SRC_NEW ) - : $dbw->addQuotes( RecentChange::SRC_EDIT ) + 'rc_source' => $row->page_is_new ? RecentChange::SRC_NEW : RecentChange::SRC_EDIT , 'rc_deleted' => $row->rev_deleted ], @@ -238,9 +237,7 @@ class RebuildRecentchanges extends Maintenance { 'rc_last_oldid' => $lastOldId, 'rc_new' => $new, 'rc_type' => $new ? RC_NEW : RC_EDIT, - 'rc_source' => $new === 1 - ? $dbw->addQuotes( RecentChange::SRC_NEW ) - : $dbw->addQuotes( RecentChange::SRC_EDIT ), + 'rc_source' => $new === 1 ? RecentChange::SRC_NEW : RecentChange::SRC_EDIT, 'rc_old_len' => $lastSize, 'rc_new_len' => $size, ], @@ -324,7 +321,7 @@ class RebuildRecentchanges extends Maintenance { 'rc_this_oldid' => 0, 'rc_last_oldid' => 0, 'rc_type' => RC_LOG, - 'rc_source' => $dbw->addQuotes( RecentChange::SRC_LOG ), + 'rc_source' => RecentChange::SRC_LOG, 'rc_cur_id' => $field->isNullable() ? $row->page_id : (int)$row->page_id, // NULL => 0, @@ -478,15 +475,16 @@ class RebuildRecentchanges extends Maintenance { } /** - * Purge cached feeds in $messageMemc + * Purge cached feeds in $wanCache */ private function purgeFeeds() { - global $wgFeedClasses, $messageMemc; + global $wgFeedClasses; $this->output( "Deleting feed timestamps.\n" ); + $wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache(); foreach ( $wgFeedClasses as $feed => $className ) { - $messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now. + $wanCache->delete( $wanCache->makeKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now. } } } diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php index b7f07629ec..faa4d96293 100644 --- a/maintenance/rebuildtextindex.php +++ b/maintenance/rebuildtextindex.php @@ -27,6 +27,9 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; +use Wikimedia\Rdbms\DatabaseSqlite; + /** * Maintenance script that rebuilds search index table from scratch. * @@ -36,7 +39,7 @@ class RebuildTextIndex extends Maintenance { const RTI_CHUNK_SIZE = 500; /** - * @var Database + * @var IMaintainableDatabase */ private $db; diff --git a/maintenance/recountCategories.php b/maintenance/recountCategories.php new file mode 100644 index 0000000000..a4bfa98992 --- /dev/null +++ b/maintenance/recountCategories.php @@ -0,0 +1,172 @@ +addDescription( <<<'TEXT' +This script refreshes the category membership counts stored in the category +table. As time passes, these counts often drift from the actual number of +category members. The script identifies rows where the value in the category +table does not match the number of categorylinks rows for that category, and +updates the category table accordingly. + +To fully refresh the data in the category table, you need to run this script +three times: once in each mode. Alternatively, just one mode can be run if +required. +TEXT + ); + $this->addOption( + 'mode', + '(REQUIRED) Which category count column to recompute: "pages", "subcats" or "files".', + true, + true + ); + $this->addOption( + 'begin', + 'Only recount categories with cat_id greater than the given value', + false, + true + ); + $this->addOption( + 'throttle', + 'Wait this many milliseconds after each batch. Default: 0', + false, + true + ); + + $this->setBatchSize( 500 ); + } + + public function execute() { + $this->mode = $this->getOption( 'mode' ); + if ( !in_array( $this->mode, [ 'pages', 'subcats', 'files' ] ) ) { + $this->error( 'Please specify a valid mode: one of "pages", "subcats" or "files".', 1 ); + } + + $this->minimumId = intval( $this->getOption( 'begin', 0 ) ); + + // do the work, batch by batch + $affectedRows = 0; + while ( ( $result = $this->doWork() ) !== false ) { + $affectedRows += $result; + usleep( $this->getOption( 'throttle', 0 ) * 1000 ); + } + + $this->output( "Done! Updated the {$this->mode} counts of $affectedRows categories.\n" . + "Now run the script using the other --mode options if you haven't already.\n" ); + if ( $this->mode === 'pages' ) { + $this->output( + "Also run 'php cleanupEmptyCategories.php --mode remove' to remove empty,\n" . + "nonexistent categories from the category table.\n\n" ); + } + } + + protected function doWork() { + $this->output( "Finding up to {$this->mBatchSize} drifted rows " . + "starting at cat_id {$this->minimumId}...\n" ); + + $countingConds = [ 'cl_to = cat_title' ]; + if ( $this->mode === 'subcats' ) { + $countingConds['cl_type'] = 'subcat'; + } elseif ( $this->mode === 'files' ) { + $countingConds['cl_type'] = 'file'; + } + + $dbr = $this->getDB( DB_REPLICA, 'vslow' ); + $countingSubquery = $dbr->selectSQLText( 'categorylinks', + 'COUNT(*)', + $countingConds, + __METHOD__ ); + + // First, let's find out which categories have drifted and need to be updated. + // The query counts the categorylinks for each category on the replica DB, + // but this data can't be used for updating the master, so we don't include it + // in the results. + $idsToUpdate = $dbr->selectFieldValues( 'category', + 'cat_id', + [ + 'cat_id > ' . $this->minimumId, + "cat_{$this->mode} != ($countingSubquery)" + ], + __METHOD__, + [ 'LIMIT' => $this->mBatchSize ] + ); + if ( !$idsToUpdate ) { + return false; + } + $this->output( "Updating cat_{$this->mode} field on " . + count( $idsToUpdate ) . " rows...\n" ); + + // In the next batch, start where this query left off. The rows selected + // in this iteration shouldn't be selected again after being updated, but + // we still keep track of where we are up to, as extra protection against + // infinite loops. + $this->minimumId = end( $idsToUpdate ); + + // Now, on master, find the correct counts for these categories. + $dbw = $this->getDB( DB_MASTER ); + $res = $dbw->select( 'category', + [ 'cat_id', 'count' => "($countingSubquery)" ], + [ 'cat_id' => $idsToUpdate ], + __METHOD__ ); + + // Update the category counts on the rows we just identified. + // This logic is equivalent to Category::refreshCounts, except here, we + // don't remove rows when cat_pages is zero and the category description page + // doesn't exist - instead we print a suggestion to run + // cleanupEmptyCategories.php. + $affectedRows = 0; + foreach ( $res as $row ) { + $dbw->update( 'category', + [ "cat_{$this->mode}" => $row->count ], + [ + 'cat_id' => $row->cat_id, + "cat_{$this->mode} != {$row->count}", + ], + __METHOD__ ); + $affectedRows += $dbw->affectedRows(); + } + + MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->waitForReplication(); + + return $affectedRows; + } +} + +$maintClass = 'RecountCategories'; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/refreshFileHeaders.php b/maintenance/refreshFileHeaders.php index e075501518..bca1c96435 100644 --- a/maintenance/refreshFileHeaders.php +++ b/maintenance/refreshFileHeaders.php @@ -20,7 +20,6 @@ * http://www.gnu.org/copyleft/gpl.html * * @file - * @author Aaron Schulz * @ingroup Maintenance */ @@ -48,41 +47,65 @@ class RefreshFileHeaders extends Maintenance { $count = 0; $dbr = $this->getDB( DB_REPLICA ); + do { $conds = [ "img_name > {$dbr->addQuotes( $start )}" ]; + if ( strlen( $end ) ) { $conds[] = "img_name <= {$dbr->addQuotes( $end )}"; } + $res = $dbr->select( 'image', '*', $conds, __METHOD__, [ 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name ASC' ] ); + + if ( $res->numRows() > 0 ) { + $row1 = $res->current(); + $this->output( "Processing next {$res->numRows()} row(s) starting with {$row1->img_name}.\n" ); + $res->rewind(); + } + + $backendOperations = []; + foreach ( $res as $row ) { $file = $repo->newFileFromRow( $row ); - $headers = $file->getStreamHeaders(); + $headers = $file->getContentHeaders(); + if ( count( $headers ) ) { - $this->updateFileHeaders( $file, $headers ); + $backendOperations[] = [ + 'op' => 'describe', 'src' => $file->getPath(), 'headers' => $headers + ]; } + // Do all of the older file versions... foreach ( $file->getHistory() as $oldFile ) { - $headers = $oldFile->getStreamHeaders(); + $headers = $oldFile->getContentHeaders(); if ( count( $headers ) ) { - $this->updateFileHeaders( $oldFile, $headers ); + $backendOperations[] = [ + 'op' => 'describe', 'src' => $oldFile->getPath(), 'headers' => $headers + ]; } } + if ( $this->hasOption( 'verbose' ) ) { - $this->output( "Updated headers for file '{$row->img_name}'.\n" ); + $this->output( "Queued headers update for file '{$row->img_name}'.\n" ); } - ++$count; + $start = $row->img_name; // advance } - } while ( $res->numRows() > 0 ); + + $backendOperationsCount = count( $backendOperations ); + $count += $backendOperationsCount; + + $this->output( "Updating headers for {$backendOperationsCount} file(s).\n" ); + $this->updateFileHeaders( $repo, $backendOperations ); + } while ( $res->numRows() === $this->mBatchSize ); $this->output( "Done. Updated headers for $count file(s).\n" ); } - protected function updateFileHeaders( File $file, array $headers ) { - $status = $file->getRepo()->getBackend()->describe( [ - 'src' => $file->getPath(), 'headers' => $headers - ] ); + protected function updateFileHeaders( $repo, $backendOperations ) { + $status = $repo->getBackend()->doQuickOperations( $backendOperations ); + if ( !$status->isGood() ) { $this->error( "Encountered error: " . print_r( $status, true ) ); } diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php index 372c352846..f6e9e9c35f 100644 --- a/maintenance/refreshImageMetadata.php +++ b/maintenance/refreshImageMetadata.php @@ -29,6 +29,9 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to refresh image metadata fields. * @@ -37,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php'; class RefreshImageMetadata extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $dbw; @@ -132,10 +135,8 @@ class RefreshImageMetadata extends Maintenance { if ( $res->numRows() > 0 ) { $row1 = $res->current(); - $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n" ); + $this->output( "Processing next {$res->numRows()} row(s) starting with {$row1->img_name}.\n" ); $res->rewind(); - } else { - $this->error( "No images to process.", 4 ); } foreach ( $res as $row ) { @@ -205,7 +206,7 @@ class RefreshImageMetadata extends Maintenance { } /** - * @param Database $dbw + * @param IDatabase $dbw * @return array */ function getConditions( $dbw ) { diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php index 06fcbaf06b..b099aff44f 100644 --- a/maintenance/refreshLinks.php +++ b/maintenance/refreshLinks.php @@ -21,6 +21,8 @@ * @ingroup Maintenance */ +use Wikimedia\Rdbms\IDatabase; + require_once __DIR__ . '/Maintenance.php'; /** @@ -70,13 +72,13 @@ class RefreshLinks extends Maintenance { if ( !$title ) { $this->error( "'$category' is an invalid category name!\n", true ); } - $this->refreshCategory( $category ); + $this->refreshCategory( $title ); } elseif ( ( $category = $this->getOption( 'tracking-category', false ) ) !== false ) { $this->refreshTrackingCategory( $category ); } elseif ( !$this->hasOption( 'dfn-only' ) ) { - $new = $this->getOption( 'new-only', false ); - $redir = $this->getOption( 'redirects-only', false ); - $oldRedir = $this->getOption( 'old-redirects-only', false ); + $new = $this->hasOption( 'new-only' ); + $redir = $this->hasOption( 'redirects-only' ); + $oldRedir = $this->hasOption( 'old-redirects-only' ); $this->doRefreshLinks( $start, $new, $end, $redir, $oldRedir ); $this->deleteLinksFromNonexistent( null, null, $this->mBatchSize, $dfnChunkSize ); } else { @@ -176,7 +178,6 @@ class RefreshLinks extends Maintenance { $this->output( "Starting from page_id $start of $end.\n" ); for ( $id = $start; $id <= $end; $id++ ) { - if ( !( $id % self::REPORTING_INTERVAL ) ) { $this->output( "$id\n" ); wfWaitForSlaves(); @@ -189,7 +190,6 @@ class RefreshLinks extends Maintenance { $this->output( "Starting from page_id $start of $end.\n" ); for ( $id = $start; $id <= $end; $id++ ) { - if ( !( $id % self::REPORTING_INTERVAL ) ) { $this->output( "$id\n" ); wfWaitForSlaves(); @@ -276,6 +276,7 @@ class RefreshLinks extends Maintenance { $page->getTitle(), /* $old = */ null, /* $recursive = */ false ); foreach ( $updates as $update ) { DeferredUpdates::addUpdate( $update ); + DeferredUpdates::doUpdates(); } } @@ -388,7 +389,7 @@ class RefreshLinks extends Maintenance { * By specifying a null $start or $end, it is also possible to create * half-bounded or unbounded intervals using this function. * - * @param IDatabase $db Database connection + * @param IDatabase $db * @param string $var Field name * @param mixed $start First value to include or null * @param mixed $end Last value to include or null @@ -447,7 +448,7 @@ class RefreshLinks extends Maintenance { do { $finalConds = $conds; $timestamp = $dbr->addQuotes( $timestamp ); - $finalConds []= + $finalConds [] = "(cl_timestamp > $timestamp OR (cl_timestamp = $timestamp AND cl_from > $lastId))"; $res = $dbr->select( [ 'page', 'categorylinks' ], [ 'page_id', 'cl_timestamp' ], diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php index ec8fcfe1ae..c750784e2a 100644 --- a/maintenance/removeUnusedAccounts.php +++ b/maintenance/removeUnusedAccounts.php @@ -39,7 +39,6 @@ class RemoveUnusedAccounts extends Maintenance { } public function execute() { - $this->output( "Remove unused accounts\n\n" ); # Do an initial scan for inactive accounts and report the result diff --git a/maintenance/resources/update-oojs-ui.sh b/maintenance/resources/update-oojs-ui.sh index dbce7a7a34..bfa359fad0 100755 --- a/maintenance/resources/update-oojs-ui.sh +++ b/maintenance/resources/update-oojs-ui.sh @@ -42,21 +42,21 @@ fi rm -r "$REPO_DIR/$TARGET_DIR" mkdir -p "$REPO_DIR/$TARGET_DIR/i18n" mkdir -p "$REPO_DIR/$TARGET_DIR/images" -mkdir -p "$REPO_DIR/$TARGET_DIR/themes/mediawiki/images" +mkdir -p "$REPO_DIR/$TARGET_DIR/themes/wikimediaui/images" mkdir -p "$REPO_DIR/$TARGET_DIR/themes/apex/images" -cp ./node_modules/oojs-ui/dist/oojs-ui-core.js "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-core-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-widgets-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-windows-{mediawiki,apex}.css "$REPO_DIR/$TARGET_DIR" -cp ./node_modules/oojs-ui/dist/oojs-ui-{mediawiki,apex}.js "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-core.js{,.map} "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-core-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js{,.map} "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-widgets-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js{,.map} "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js{,.map} "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-windows-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR" +cp ./node_modules/oojs-ui/dist/oojs-ui-{wikimediaui,apex}.js{,.map} "$REPO_DIR/$TARGET_DIR" cp -R ./node_modules/oojs-ui/dist/i18n "$REPO_DIR/$TARGET_DIR" cp -R ./node_modules/oojs-ui/dist/images "$REPO_DIR/$TARGET_DIR" -cp -R ./node_modules/oojs-ui/dist/themes/mediawiki/images "$REPO_DIR/$TARGET_DIR/themes/mediawiki" -cp ./node_modules/oojs-ui/src/themes/mediawiki/*.json "$REPO_DIR/$TARGET_DIR/themes/mediawiki" +cp -R ./node_modules/oojs-ui/dist/themes/wikimediaui/images "$REPO_DIR/$TARGET_DIR/themes/wikimediaui" +cp ./node_modules/oojs-ui/src/themes/wikimediaui/*.json "$REPO_DIR/$TARGET_DIR/themes/wikimediaui" cp -R ./node_modules/oojs-ui/dist/themes/apex/images "$REPO_DIR/$TARGET_DIR/themes/apex" cp ./node_modules/oojs-ui/src/themes/apex/*.json "$REPO_DIR/$TARGET_DIR/themes/apex" diff --git a/maintenance/resources/update-oojs.sh b/maintenance/resources/update-oojs.sh index d3e778c643..267bd96170 100755 --- a/maintenance/resources/update-oojs.sh +++ b/maintenance/resources/update-oojs.sh @@ -38,6 +38,9 @@ fi # Copy file(s) rsync --force ./node_modules/oojs/dist/oojs.jquery.js "$REPO_DIR/$TARGET_DIR" +rsync --force ./node_modules/oojs/dist/AUTHORS.txt "$REPO_DIR/$TARGET_DIR" +rsync --force ./node_modules/oojs/dist/LICENSE-MIT "$REPO_DIR/$TARGET_DIR" +rsync --force ./node_modules/oojs/dist/README.md "$REPO_DIR/$TARGET_DIR" # Clean up temporary area rm -rf "$NPM_DIR" diff --git a/maintenance/runBatchedQuery.php b/maintenance/runBatchedQuery.php index f8eedb33a0..b0a2b92428 100644 --- a/maintenance/runBatchedQuery.php +++ b/maintenance/runBatchedQuery.php @@ -25,6 +25,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script to run a database query in batches and wait for replica DBs. * diff --git a/maintenance/shell.php b/maintenance/shell.php index 47ef8045b1..65c353a29e 100644 --- a/maintenance/shell.php +++ b/maintenance/shell.php @@ -34,6 +34,10 @@ * @author Gergő Tisza */ +use MediaWiki\Logger\LoggerFactory; +use MediaWiki\Logger\ConsoleSpi; +use MediaWiki\MediaWikiServices; + require_once __DIR__ . '/Maintenance.php'; /** @@ -46,8 +50,8 @@ class MediaWikiShell extends Maintenance { parent::__construct(); $this->addOption( 'd', 'For back compatibility with eval.php. ' . - '0 send debug to stdout. ' . - 'With 1 additionally initialize database with debugging ', + '1 send debug to stderr. ' . + 'With 2 additionally initialize database with debugging ', false, true ); } @@ -77,22 +81,16 @@ class MediaWikiShell extends Maintenance { * For back compatibility with eval.php */ protected function setupLegacy() { - global $wgDebugLogFile; - $d = intval( $this->getOption( 'd' ) ); if ( $d > 0 ) { - $wgDebugLogFile = 'php://stdout'; + LoggerFactory::registerProvider( new ConsoleSpi ); + // Some services hold Logger instances in object properties + MediaWikiServices::resetGlobalInstance(); } if ( $d > 1 ) { # Set DBO_DEBUG (equivalent of $wgDebugDumpSql) - # XXX copy pasted from eval.php :( - $lb = wfGetLB(); - $serverCount = $lb->getServerCount(); - for ( $i = 0; $i < $serverCount; $i++ ) { - $server = $lb->getServerInfo( $i ); - $server['flags'] |= DBO_DEBUG; - $lb->setServerInfo( $i, $server ); - } + wfGetDB( DB_MASTER )->setFlag( DBO_DEBUG ); + wfGetDB( DB_REPLICA )->setFlag( DBO_DEBUG ); } } diff --git a/maintenance/sql.php b/maintenance/sql.php index 58472e9bdf..36e55f3eed 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -25,6 +25,8 @@ require_once __DIR__ . '/Maintenance.php'; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBQueryError; /** * Maintenance script that sends SQL queries from the specified file to the database. @@ -76,7 +78,7 @@ class MwSql extends Maintenance { $index = DB_MASTER; } - /** @var Database $db DB handle for the appropriate cluster/wiki */ + /** @var IDatabase $db DB handle for the appropriate cluster/wiki */ $db = $lb->getConnection( $index, [], $wiki ); if ( $replicaDB != '' && $db->getLBInfo( 'master' ) !== null ) { $this->error( "The server selected ({$db->getServer()}) is not a replica DB.", 1 ); diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc index 33ca0ffc71..f14856a5b2 100644 --- a/maintenance/sqlite.inc +++ b/maintenance/sqlite.inc @@ -21,6 +21,9 @@ * @ingroup Maintenance */ +use Wikimedia\Rdbms\DatabaseSqlite; +use Wikimedia\Rdbms\DBError; + /** * This class contains code common to different SQLite-related maintenance scripts * @@ -45,7 +48,7 @@ class Sqlite { * @return bool True if no error or error string in case of errors */ public static function checkSqlSyntax( $files ) { - if ( !Sqlite::isPresent() ) { + if ( !self::isPresent() ) { throw new MWException( "Can't check SQL syntax: SQLite not found" ); } if ( !is_array( $files ) ) { diff --git a/maintenance/sqlite/archives/patch-add-3d.sql b/maintenance/sqlite/archives/patch-add-3d.sql new file mode 100644 index 0000000000..10d74fb99e --- /dev/null +++ b/maintenance/sqlite/archives/patch-add-3d.sql @@ -0,0 +1,249 @@ +-- image + +CREATE TABLE /*_*/image_tmp ( + -- Filename. + -- This is also the title of the associated description page, + -- which will be in namespace 6 (NS_FILE). + img_name varchar(255) binary NOT NULL default '' PRIMARY KEY, + + -- File size in bytes. + img_size int unsigned NOT NULL default 0, + + -- For images, size in pixels. + img_width int NOT NULL default 0, + img_height int NOT NULL default 0, + + -- Extracted Exif metadata stored as a serialized PHP array. + img_metadata mediumblob NOT NULL, + + -- For images, bits per pixel if known. + img_bits int NOT NULL default 0, + + -- Media type as defined by the MEDIATYPE_xxx constants + img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, + + -- major part of a MIME media type as defined by IANA + -- 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 https://www.iana.org/assignments/media-types/ + img_minor_mime varbinary(100) NOT NULL default "unknown", + + -- Description field as entered by the uploader. + -- This is displayed in image upload history and logs. + img_description varbinary(767) NOT NULL, + + -- user_id and user_name of uploader. + img_user int unsigned NOT NULL default 0, + img_user_text varchar(255) binary NOT NULL, + + -- Time of the upload. + img_timestamp varbinary(14) NOT NULL default '', + + -- SHA-1 content hash in base-36 + img_sha1 varbinary(32) NOT NULL default '' +) /*$wgDBTableOptions*/; + +INSERT INTO /*_*/image_tmp + SELECT img_name, img_size, img_width, img_height, img_metadata, img_bits, + img_media_type, img_major_mime, img_minor_mime, img_description, + img_user, img_user_text, img_timestamp, img_sha1 + FROM /*_*/image; + +DROP TABLE /*_*/image; + +ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image; + +-- Used by Special:Newimages and ApiQueryAllImages +CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp); +CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp); +-- Used by Special:ListFiles for sort-by-size +CREATE INDEX /*i*/img_size ON /*_*/image (img_size); +-- Used by Special:Newimages and Special:ListFiles +CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp); +-- Used in API and duplicate search +CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10)); +-- Used to get media of one type +CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime); + +-- oldimage + +CREATE TABLE /*_*/oldimage_tmp ( + -- Base filename: key to image.img_name + oi_name varchar(255) binary NOT NULL default '', + + -- Filename of the archived file. + -- This is generally a timestamp and '!' prepended to the base name. + oi_archive_name varchar(255) binary NOT NULL default '', + + -- Other fields as in image... + oi_size int unsigned NOT NULL default 0, + oi_width int NOT NULL default 0, + oi_height int NOT NULL default 0, + oi_bits int NOT NULL default 0, + oi_description varbinary(767) NOT NULL, + oi_user int unsigned NOT NULL default 0, + oi_user_text varchar(255) binary NOT NULL, + oi_timestamp binary(14) NOT NULL default '', + + oi_metadata mediumblob NOT NULL, + oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, + oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown", + oi_minor_mime varbinary(100) NOT NULL default "unknown", + oi_deleted tinyint unsigned NOT NULL default 0, + oi_sha1 varbinary(32) NOT NULL default '' +) /*$wgDBTableOptions*/; + +INSERT INTO /*_*/oldimage_tmp + SELECT oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits, + oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata, + oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1 + FROM /*_*/oldimage; + +DROP TABLE /*_*/oldimage; + +ALTER TABLE oldimage_tmp RENAME TO /*_*/oldimage; + +CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp); +CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp); +-- oi_archive_name truncated to 14 to avoid key length overflow +CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14)); +CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10)); + +-- filearchive + +CREATE TABLE /*_*/filearchive_tmp ( + -- Unique row id + fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT, + + -- Original base filename; key to image.img_name, page.page_title, etc + fa_name varchar(255) binary NOT NULL default '', + + -- Filename of archived file, if an old revision + fa_archive_name varchar(255) binary default '', + + -- Which storage bin (directory tree or object store) the file data + -- is stored in. Should be 'deleted' for files that have been deleted; + -- any other bin is not yet in use. + fa_storage_group varbinary(16), + + -- SHA-1 of the file contents plus extension, used as a key for storage. + -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg + -- + -- If NULL, the file was missing at deletion time or has been purged + -- from the archival storage. + fa_storage_key varbinary(64) default '', + + -- Deletion information, if this file is deleted. + fa_deleted_user int, + fa_deleted_timestamp binary(14) default '', + fa_deleted_reason varbinary(767) default '', + + -- Duped fields from image + fa_size int unsigned default 0, + fa_width int default 0, + fa_height int default 0, + fa_metadata mediumblob, + fa_bits int default 0, + fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, + fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown", + fa_minor_mime varbinary(100) default "unknown", + fa_description varbinary(767), + fa_user int unsigned default 0, + fa_user_text varchar(255) binary, + fa_timestamp binary(14) default '', + + -- Visibility of deleted revisions, bitfield + fa_deleted tinyint unsigned NOT NULL default 0, + + -- sha1 hash of file content + fa_sha1 varbinary(32) NOT NULL default '' +) /*$wgDBTableOptions*/; + +INSERT INTO /*_*/filearchive_tmp + SELECT fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key, fa_deleted_user, fa_deleted_timestamp, + fa_deleted_reason, fa_size, fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime, + fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp, fa_deleted, fa_sha1 + FROM /*_*/filearchive; + +DROP TABLE /*_*/filearchive; + +ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive; + +-- pick out by image name +CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp); +-- pick out dupe files +CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key); +-- sort by deletion time +CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp); +-- sort by uploader +CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp); +-- find file by sha1, 10 bytes will be enough for hashes to be indexed +CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10)); + +-- uploadstash + +CREATE TABLE /*_*/uploadstash_tmp ( + us_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + + -- the user who uploaded the file. + us_user int unsigned NOT NULL, + + -- file key. this is how applications actually search for the file. + -- this might go away, or become the primary key. + us_key varchar(255) NOT NULL, + + -- the original path + us_orig_path varchar(255) NOT NULL, + + -- the temporary path at which the file is actually stored + us_path varchar(255) NOT NULL, + + -- which type of upload the file came from (sometimes) + us_source_type varchar(50), + + -- the date/time on which the file was added + us_timestamp varbinary(14) NOT NULL, + + us_status varchar(50) NOT NULL, + + -- chunk counter starts at 0, current offset is stored in us_size + us_chunk_inx int unsigned NULL, + + -- Serialized file properties from FSFile::getProps() + us_props blob, + + -- file size in bytes + us_size int unsigned NOT NULL, + -- this hash comes from FSFile::getSha1Base36(), and is 31 characters + us_sha1 varchar(31) NOT NULL, + us_mime varchar(255), + -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table + us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, + -- image-specific properties + us_image_width int unsigned, + us_image_height int unsigned, + us_image_bits smallint unsigned + +) /*$wgDBTableOptions*/; + +INSERT INTO /*_*/uploadstash_tmp + SELECT us_id, us_user, us_key, us_orig_path, us_path, us_source_type, + us_timestamp, us_status, us_chunk_inx, us_props, us_size, us_sha1, us_mime, + us_media_type, us_image_width, us_image_height, us_image_bits + FROM /*_*/uploadstash; + +DROP TABLE uploadstash; + +ALTER TABLE /*_*/uploadstash_tmp RENAME TO /*_*/uploadstash; + +-- sometimes there's a delete for all of a user's stuff. +CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user); +-- pick out files by key, enforce key uniqueness +CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key); +-- the abandoned upload cleanup script needs this +CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp); diff --git a/maintenance/sqlite/archives/patch-ip_changes.sql b/maintenance/sqlite/archives/patch-ip_changes.sql new file mode 100644 index 0000000000..5f05672e84 --- /dev/null +++ b/maintenance/sqlite/archives/patch-ip_changes.sql @@ -0,0 +1,23 @@ +-- +-- Every time an edit by a logged out user is saved, +-- a row is created in ip_changes. This stores +-- the IP as a hex representation so that we can more +-- easily find edits within an IP range. +-- +CREATE TABLE /*_*/ip_changes ( + -- Foreign key to the revision table, also serves as the unique primary key + ipc_rev_id int unsigned NOT NULL PRIMARY KEY DEFAULT '0', + + -- The timestamp of the revision + ipc_rev_timestamp binary(14) NOT NULL DEFAULT '', + + -- Hex representation of the IP address, as returned by IP::toHex() + -- For IPv4 it will resemble: ABCD1234 + -- For IPv6: v6-ABCD1234000000000000000000000000 + -- BETWEEN is then used to identify revisions within a given range + ipc_hex varbinary(35) NOT NULL DEFAULT '' + +) /*$wgDBTableOptions*/; + +CREATE INDEX /*i*/ipc_rev_timestamp ON /*_*/ip_changes (ipc_rev_timestamp); +CREATE INDEX /*i*/ipc_hex_time ON /*_*/ip_changes (ipc_hex,ipc_rev_timestamp); diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php index 4f22843056..b4514ecbdf 100644 --- a/maintenance/storage/trackBlobs.php +++ b/maintenance/storage/trackBlobs.php @@ -22,6 +22,8 @@ * @see wfWaitForSlaves() */ +use Wikimedia\Rdbms\DBConnectionError; + require __DIR__ . '/../commandLine.inc'; if ( count( $args ) < 1 ) { diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 8f596904ad..1497d6fc23 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -311,9 +311,21 @@ CREATE TABLE /*_*/page ( page_lang varbinary(35) DEFAULT NULL ) /*$wgDBTableOptions*/; +-- The title index. Care must be taken to always specify a namespace when +-- by title, so that the index is used. Even listing all known namespaces +-- with IN() is better than omitting page_namespace from the WHERE clause. CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title); + +-- The index for Special:Random CREATE INDEX /*i*/page_random ON /*_*/page (page_random); + +-- Questionable utility, used by ProofreadPage, possibly DynamicPageList. +-- ApiQueryAllPages unconditionally filters on namespace and so hopefully does +-- not use it. CREATE INDEX /*i*/page_len ON /*_*/page (page_len); + +-- The index for Special:Shortpages and Special:Longpages. Also SiteStats::articles() +-- in 'comma' counting mode, MessageCache::loadFromDB(). CREATE INDEX /*i*/page_redirect_namespace_len ON /*_*/page (page_is_redirect, page_namespace, page_len); -- @@ -375,13 +387,53 @@ CREATE TABLE /*_*/revision ( ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024; -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit +-- The index is proposed for removal, do not use it in new code: T163532. +-- Used for ordering revisions within a page by rev_id, which is usually +-- incorrect, since rev_timestamp is normally the correct order. It can also +-- be used by dumpBackup.php, if a page and rev_id range is specified. CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id); + +-- Used by ApiQueryAllRevisions CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp); + +-- History index CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp); + +-- Logged-in user contributions index CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp); + +-- Anonymous user countributions index CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp); + +-- Credits index. This is scanned in order to compile credits lists for pages, +-- in ApiQueryContributors. Also for ApiQueryRevisions if rvuser is specified +-- and is a logged-in user. CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp); +-- +-- Every time an edit by a logged out user is saved, +-- a row is created in ip_changes. This stores +-- the IP as a hex representation so that we can more +-- easily find edits within an IP range. +-- +CREATE TABLE /*_*/ip_changes ( + -- Foreign key to the revision table, also serves as the unique primary key + ipc_rev_id int unsigned NOT NULL PRIMARY KEY DEFAULT '0', + + -- The timestamp of the revision + ipc_rev_timestamp binary(14) NOT NULL DEFAULT '', + + -- Hex representation of the IP address, as returned by IP::toHex() + -- For IPv4 it will resemble: ABCD1234 + -- For IPv6: v6-ABCD1234000000000000000000000000 + -- BETWEEN is then used to identify revisions within a given range + ipc_hex varbinary(35) NOT NULL DEFAULT '' + +) /*$wgDBTableOptions*/; + +CREATE INDEX /*i*/ipc_rev_timestamp ON /*_*/ip_changes (ipc_rev_timestamp); +CREATE INDEX /*i*/ipc_hex_time ON /*_*/ip_changes (ipc_hex,ipc_rev_timestamp); + -- -- Holds text of individual page revisions. -- @@ -499,8 +551,14 @@ CREATE TABLE /*_*/archive ( ar_content_format varbinary(64) DEFAULT NULL ) /*$wgDBTableOptions*/; +-- Index for Special:Undelete to page through deleted revisions CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp); + +-- Index for Special:DeletedContributions CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp); + +-- Index for linking archive rows with tables that normally link with revision +-- rows, such as change_tag. CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id); @@ -521,8 +579,13 @@ CREATE TABLE /*_*/pagelinks ( pl_title varchar(255) binary NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for page edit, save CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title); + +-- Reverse index, for Special:Whatlinkshere CREATE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from); + +-- Index for Special:Whatlinkshere with namespace filter CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from); @@ -543,8 +606,13 @@ CREATE TABLE /*_*/templatelinks ( tl_title varchar(255) binary NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for page edit, save CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title); + +-- Reverse index, for Special:Whatlinkshere CREATE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from); + +-- Index for Special:Whatlinkshere with namespace filter CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from); @@ -565,8 +633,13 @@ CREATE TABLE /*_*/imagelinks ( il_to varchar(255) binary NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for cache invalidation on file update, etc. CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to); + +-- Reverse index, for Special:Whatlinkshere and file description page local usage CREATE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from); + +-- Index for Special:Whatlinkshere with namespace filter CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from); @@ -690,9 +763,16 @@ CREATE TABLE /*_*/externallinks ( el_index_60 varbinary(60) NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for page edit, save CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40)); + +-- Index for Special:LinkSearch exact search CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from); + +-- For Special:LinkSearch wildcard search CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60)); + +-- For Special:LinkSearch wildcard search with efficient paging by el_id CREATE INDEX /*i*/el_index_60 ON /*_*/externallinks (el_index_60, el_id); CREATE INDEX /*i*/el_from_index_60 ON /*_*/externallinks (el_from, el_index_60, el_id); @@ -710,7 +790,10 @@ CREATE TABLE /*_*/langlinks ( ll_title varchar(255) binary NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for page edit, save, ApiQueryLanglinks CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang); + +-- Index for ApiQueryLangbacklinks CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title); @@ -728,8 +811,13 @@ CREATE TABLE /*_*/iwlinks ( iwl_title varchar(255) binary NOT NULL default '' ) /*$wgDBTableOptions*/; +-- Forward index, for page edit, save, ApiQueryIWLinks CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title); + +-- Index for ApiQueryIWBacklinks CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from); + +-- Index for ApiQueryIWLinks CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title); @@ -841,10 +929,19 @@ CREATE TABLE /*_*/ipblocks ( -- Any new options which prevent collisions should be included CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only); +-- For querying whether a logged-in user is blocked CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user); + +-- For querying whether an IP address is in any range CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8)); + +-- Index for Special:BlockList CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp); + +-- Index for table pruning CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry); + +-- Index for removing autoblocks when a parent block is removed CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id); @@ -871,7 +968,7 @@ CREATE TABLE /*_*/image ( img_bits int NOT NULL default 0, -- Media type as defined by the MEDIATYPE_xxx constants - img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, -- major part of a MIME media type as defined by IANA -- see https://www.iana.org/assignments/media-types/ @@ -936,7 +1033,7 @@ CREATE TABLE /*_*/oldimage ( oi_timestamp binary(14) NOT NULL default '', oi_metadata mediumblob NOT NULL, - oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown", oi_minor_mime varbinary(100) NOT NULL default "unknown", oi_deleted tinyint unsigned NOT NULL default 0, @@ -986,7 +1083,7 @@ CREATE TABLE /*_*/filearchive ( fa_height int default 0, fa_metadata mediumblob, fa_bits int default 0, - fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown", fa_minor_mime varbinary(100) default "unknown", fa_description varbinary(767), @@ -1053,7 +1150,7 @@ CREATE TABLE /*_*/uploadstash ( us_sha1 varchar(31) NOT NULL, us_mime varchar(255), -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table - us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL, + us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL, -- image-specific properties us_image_width int unsigned, us_image_height int unsigned, @@ -1144,13 +1241,29 @@ CREATE TABLE /*_*/recentchanges ( rc_params blob NULL ) /*$wgDBTableOptions*/; +-- Special:Recentchanges CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp); + +-- Special:Watchlist CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title); + +-- Special:Recentchangeslinked when finding changes in pages linked from a page CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id); + +-- Special:Newpages CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp); + +-- Blank unless $wgPutIPinRC=true (false at WMF), possibly used by extensions, +-- but mostly replaced by CheckUser. CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip); + +-- Probably intended for Special:NewPages namespace filter CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text); + +-- SiteStats active user count, Special:ActiveUsers, Special:NewPages user filter CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp); + +-- ApiQueryRecentChanges (T140108) CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp); @@ -1172,8 +1285,13 @@ CREATE TABLE /*_*/watchlist ( ) /*$wgDBTableOptions*/; +-- Special:Watchlist CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title); + +-- Special:Movepage (WatchedItemStore::duplicateEntry) CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title); + +-- ApiQueryWatchlistRaw changed filter CREATE INDEX /*i*/wl_user_notificationtimestamp ON /*_*/watchlist (wl_user, wl_notificationtimestamp); @@ -1307,14 +1425,32 @@ CREATE TABLE /*_*/logging ( log_deleted tinyint unsigned NOT NULL default 0 ) /*$wgDBTableOptions*/; +-- Special:Log type filter CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp); + +-- Special:Log performer filter CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp); + +-- Special:Log title filter, log extract CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp); + +-- Special:Log unfiltered CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp); + +-- Special:Log filter by performer and type CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp); + +-- Apparently just used for a few maintenance pages (findMissingFiles.php, Flow). +-- Could be removed? CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp); + +-- Special:Log action filter CREATE INDEX /*i*/type_action ON /*_*/logging (log_type, log_action, log_timestamp); + +-- Special:Log filter by type and anonymous performer CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp); + +-- Special:Log filter by anonymous performer CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp); diff --git a/maintenance/update.php b/maintenance/update.php index d96cecd6be..5f705ba371 100755 --- a/maintenance/update.php +++ b/maintenance/update.php @@ -27,6 +27,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to run database schema updates. * @@ -145,7 +147,7 @@ class UpdateMediaWiki extends Maintenance { $this->output( "Going to run database updates for " . wfWikiID() . "\n" ); if ( $db->getType() === 'sqlite' ) { - /** @var Database|DatabaseSqlite $db */ + /** @var IMaintainableDatabase|DatabaseSqlite $db */ $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" ); } $this->output( "Depending on the size of your database this may take a while!\n" ); diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index e70a176909..84fc2d208e 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -26,6 +26,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script that will find all rows in the categorylinks table * whose collation is out-of-date. @@ -242,7 +244,7 @@ TEXT * Return an SQL expression selecting rows which sort above the given row, * assuming an ordering of cl_collation, cl_to, cl_type, cl_from * @param stdClass $row - * @param Database $dbw + * @param IDatabase $dbw * @return string */ function getBatchCondition( $row, $dbw ) { diff --git a/maintenance/updateCredits.php b/maintenance/updateCredits.php index eb717e8c66..b7e8c1ccd3 100644 --- a/maintenance/updateCredits.php +++ b/maintenance/updateCredits.php @@ -59,7 +59,7 @@ unset( $lines ); $lines = explode( "\n", shell_exec( 'git log --format="%aN"' ) ); foreach ( $lines as $line ) { - if ( empty( $line ) ) { + if ( empty( $line ) ) { continue; } if ( substr( $line, 0, 5 ) === '[BOT]' ) { @@ -69,7 +69,8 @@ foreach ( $lines as $line ) { } $contributors = array_keys( $contributors ); -$collator = Collator::create( 'uca-default-u-kn' ); +$collator = Collator::create( 'root' ); +$collator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON ); $collator->sort( $contributors ); array_walk( $contributors, function ( &$v, $k ) { $v = "* {$v}"; diff --git a/maintenance/updateRestrictions.php b/maintenance/updateRestrictions.php index 96eaf822d6..2f3fc36534 100644 --- a/maintenance/updateRestrictions.php +++ b/maintenance/updateRestrictions.php @@ -36,7 +36,7 @@ class UpdateRestrictions extends Maintenance { public function __construct() { parent::__construct(); $this->addDescription( 'Updates page_restrictions table from old page_restriction column' ); - $this->setBatchSize( 100 ); + $this->setBatchSize( 1000 ); } public function execute() { @@ -57,7 +57,7 @@ class UpdateRestrictions extends Maintenance { $blockEnd = $start + $this->mBatchSize - 1; $encodedExpiry = 'infinity'; while ( $blockEnd <= $end ) { - $this->output( "...doing page_id from $blockStart to $blockEnd\n" ); + $this->output( "...doing page_id from $blockStart to $blockEnd out of $end\n" ); $cond = "page_id BETWEEN $blockStart AND $blockEnd AND page_restrictions !=''"; $res = $db->select( 'page', diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc index c657c03f7b..01cf3c3eb1 100644 --- a/maintenance/userOptions.inc +++ b/maintenance/userOptions.inc @@ -47,7 +47,7 @@ class UserOptions { */ function __construct( $opts, $args ) { if ( !$this->checkOpts( $opts, $args ) ) { - UserOptions::showUsageAndExit(); + self::showUsageAndExit(); } else { $this->mReady = $this->initializeOpts( $opts, $args ); } @@ -82,7 +82,6 @@ class UserOptions { * @return bool */ private function initializeOpts( $opts, $args ) { - $this->mQuick = isset( $opts['nowarn'] ); $this->mQuiet = isset( $opts['quiet'] ); $this->mDry = isset( $opts['dry'] ); @@ -149,12 +148,10 @@ class UserOptions { ); foreach ( $result as $id ) { - $user = User::newFromId( $id->user_id ); // Get the options and update stats if ( $this->mAnOption ) { - if ( !array_key_exists( $this->mAnOption, $defaultOptions ) ) { print "Invalid user option. Use --list to see valid choices\n"; exit; @@ -203,14 +200,12 @@ class UserOptions { ); foreach ( $result as $id ) { - $user = User::newFromId( $id->user_id ); $curValue = $user->getOption( $this->mAnOption ); $username = $user->getName(); if ( $curValue == $this->mOldValue ) { - if ( !$this->mQuiet ) { print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' " . "to '{$this->mNewValue}'): "; @@ -279,7 +274,6 @@ USAGE; * @return bool */ public function warn() { - if ( $this->mQuick ) { return true; } diff --git a/maintenance/validateRegistrationFile.php b/maintenance/validateRegistrationFile.php index 9906990bb5..aa1f668d3b 100644 --- a/maintenance/validateRegistrationFile.php +++ b/maintenance/validateRegistrationFile.php @@ -8,7 +8,7 @@ class ValidateRegistrationFile extends Maintenance { $this->addArg( 'path', 'Path to extension.json/skin.json file.', true ); } public function execute() { - $validator = new ExtensionJsonValidator( function( $msg ) { + $validator = new ExtensionJsonValidator( function ( $msg ) { $this->error( $msg, 1 ); } ); $validator->checkDependencies(); diff --git a/mw-config/config.js b/mw-config/config.js index 8b2d6e5ab4..c745ce44a7 100644 --- a/mw-config/config.js +++ b/mw-config/config.js @@ -4,7 +4,7 @@ function syncText() { var value = $( this ).val() - .replace( /[\[\]\{\}|#<>%+? ]/g, '_' ) + .replace( /[\[\]{}|#<>%+? ]/g, '_' ) // eslint-disable-line no-useless-escape .replace( /&/, '&' ) .replace( /__+/g, '_' ) .replace( /^_+/, '' ) @@ -14,17 +14,13 @@ } // Set up the help system - $( '.config-help-field-data' ) - .hide() - .closest( '.config-help-field-container' ) - .find( '.config-help-field-hint' ) - .show() - .click( function () { - $( this ) - .closest( '.config-help-field-container' ) - .find( '.config-help-field-data' ) - .slideToggle( 'fast' ); - } ); + $( '.config-help-field-data' ).hide() + .closest( '.config-help-field-container' ).find( '.config-help-field-hint' ) + .show() + .click( function () { + $( this ).closest( '.config-help-field-container' ).find( '.config-help-field-data' ) + .slideToggle( 'fast' ); + } ); // Show/hide code for DB-specific options // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here? diff --git a/mw-config/index.php b/mw-config/index.php index be9debcb8d..10b8d973cd 100644 --- a/mw-config/index.php +++ b/mw-config/index.php @@ -44,7 +44,6 @@ function wfInstallerMain() { $installer = InstallerOverrides::getWebInstaller( $wgRequest ); if ( !$installer->startSession() ) { - if ( $installer->request->getVal( "css" ) ) { // Do not display errors on css pages $installer->outputCss(); diff --git a/package.json b/package.json index b868295afd..850723829c 100644 --- a/package.json +++ b/package.json @@ -3,24 +3,35 @@ "scripts": { "test": "grunt test", "doc": "jsduck", - "postdoc": "grunt copy:jsduck" + "postdoc": "grunt copy:jsduck", + "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver" }, "devDependencies": { + "deepmerge": "1.3.2", "eslint": "3.12.2", - "eslint-config-wikimedia": "0.3.0", + "eslint-config-wikimedia": "0.4.0", "grunt": "1.0.1", - "grunt-banana-checker": "0.5.0", + "grunt-banana-checker": "0.6.0", "grunt-contrib-copy": "1.0.0", "grunt-contrib-watch": "1.0.0", - "grunt-eslint": "19.0.0", + "grunt-eslint": "20.0.0", "grunt-jsonlint": "1.1.0", "grunt-karma": "2.0.0", - "grunt-stylelint": "0.7.0", - "karma": "1.1.0", + "grunt-stylelint": "0.8.0", + "grunt-webdriver": "2.0.3", + "karma": "1.5.0", "karma-chrome-launcher": "2.0.0", - "karma-firefox-launcher": "1.0.0", + "karma-firefox-launcher": "1.0.1", + "karma-mocha-reporter": "2.2.3", "karma-qunit": "1.0.0", - "qunitjs": "1.22.0", - "stylelint-config-wikimedia": "0.4.1" + "nodemw": "0.10.1", + "qunitjs": "1.23.1", + "stylelint": "7.8.0", + "stylelint-config-wikimedia": "0.4.1", + "wdio-junit-reporter": "0.2.0", + "wdio-mocha-framework": "0.5.8", + "wdio-sauce-service": "^0.3.1", + "wdio-spec-reporter": "0.0.5", + "webdriverio": "4.6.2" } } diff --git a/phpcs.xml b/phpcs.xml index 4693b42eb5..238fc98f1d 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -1,6 +1,24 @@ - + + + + + + + + + + + + + + + + + + + @@ -11,27 +29,18 @@ - . - - */languages/messages/Messages*.php */includes/StubObject.php - - 0 - - - 0 - - node_modules/ - vendor/ + . + + ^extensions/ ^skins/ - .git - AdminSettings.php - LocalSettings.php - StartProfiler.php + AdminSettings\.php + LocalSettings\.php + StartProfiler\.php diff --git a/profileinfo.php b/profileinfo.php index 466f26aaec..83ae1935df 100644 --- a/profileinfo.php +++ b/profileinfo.php @@ -150,7 +150,7 @@ if ( !$wgEnableProfileInfo ) { exit( 1 ); } -$dbr = wfGetDB( DB_SLAVE ); +$dbr = wfGetDB( DB_REPLICA ); if ( !$dbr->tableExists( 'profiling' ) ) { echo '

    No profiling table exists, so we can\'t show you anything.

    ' diff --git a/resources/Resources.php b/resources/Resources.php index 7ba1edc933..144747b476 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -132,9 +132,14 @@ return [ /* jQuery */ 'jquery' => [ - 'scripts' => [ - 'resources/lib/jquery/jquery.js', - ], + 'scripts' => ( $GLOBALS['wgUsejQueryThree'] ? + [ + 'resources/lib/jquery/jquery3.js', + 'resources/lib/jquery/jquery.migrate.js', + ] : [ + 'resources/lib/jquery/jquery.js', + ] + ), 'raw' => true, 'targets' => [ 'desktop', 'mobile' ], ], @@ -151,21 +156,14 @@ return [ 'targets' => [ 'mobile', 'desktop' ], ], 'jquery.appear' => [ - 'deprecated' => [ - 'message' => 'Please use "mediawiki.viewport" instead.', - ], + 'deprecated' => 'Please use "mediawiki.viewport" instead.', 'scripts' => 'resources/lib/jquery/jquery.appear.js', ], - 'jquery.arrowSteps' => [ - 'deprecated' => true, - 'scripts' => 'resources/src/jquery/jquery.arrowSteps.js', - 'styles' => 'resources/src/jquery/jquery.arrowSteps.css', - 'targets' => [ 'desktop', 'mobile' ], - ], 'jquery.async' => [ 'scripts' => 'resources/lib/jquery/jquery.async.js', ], 'jquery.autoEllipsis' => [ + 'deprecated' => 'Use CSS text-overflow instead.', 'scripts' => 'resources/src/jquery/jquery.autoEllipsis.js', 'dependencies' => 'jquery.highlightText', 'targets' => [ 'desktop', 'mobile' ], @@ -240,6 +238,7 @@ return [ 'scripts' => 'resources/lib/jquery/jquery.fullscreen.js', ], 'jquery.getAttrs' => [ + 'targets' => [ 'desktop', 'mobile' ], 'scripts' => 'resources/src/jquery/jquery.getAttrs.js', 'targets' => [ 'desktop', 'mobile' ], ], @@ -307,6 +306,8 @@ return [ 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.placeholder' => [ + 'deprecated' => 'Use of "jquery.placeholder" is deprecated since MediaWiki 1.29.0', + 'scripts' => 'resources/src/jquery/jquery.placeholder.js', 'targets' => [ 'desktop', 'mobile' ], ], @@ -315,23 +316,17 @@ return [ 'styles' => 'resources/lib/qunitjs/qunit.css', 'targets' => [ 'desktop', 'mobile' ], ], - 'jquery.qunit.completenessTest' => [ - 'scripts' => 'resources/src/jquery/jquery.qunit.completenessTest.js', - 'dependencies' => 'jquery.qunit', - 'targets' => [ 'desktop', 'mobile' ], - ], 'jquery.spinner' => [ 'scripts' => 'resources/src/jquery/jquery.spinner.js', 'styles' => 'resources/src/jquery/jquery.spinner.css', 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.jStorage' => [ - 'deprecated' => [ - 'message' => 'Please use "mediawiki.storage" instead.', - ], + 'deprecated' => 'Please use "mediawiki.storage" instead.', 'scripts' => 'resources/lib/jquery/jquery.jStorage.js', ], 'jquery.suggestions' => [ + 'targets' => [ 'desktop', 'mobile' ], 'scripts' => 'resources/src/jquery/jquery.suggestions.js', 'styles' => 'resources/src/jquery/jquery.suggestions.css', 'dependencies' => 'jquery.highlightText', @@ -372,9 +367,7 @@ return [ /* jQuery UI */ 'jquery.ui.core' => [ - 'deprecated' => [ - 'message' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.', - ], + 'deprecated' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.', 'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js', 'dependencies' => [ 'jquery.ui.core.styles', @@ -731,8 +724,6 @@ return [ ], /* json2 */ - - // Deprecated since MediaWiki 1.29.0 'json' => [ 'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0', 'targets' => [ 'desktop', 'mobile' ], @@ -915,6 +906,7 @@ return [ 'dependencies' => [ 'mediawiki.api', 'mediawiki.Title', + 'mediawiki.user', ], 'targets' => [ 'desktop', 'mobile' ], ], @@ -1038,6 +1030,7 @@ return [ 'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less', 'dependencies' => [ 'oojs-ui-core', + 'oojs-ui.styles.icons-alerts', ], ], 'mediawiki.ForeignApi' => [ @@ -1067,7 +1060,12 @@ return [ 'targets' => [ 'desktop', 'mobile' ], ], 'mediawiki.hlist' => [ - 'styles' => 'resources/src/mediawiki/mediawiki.hlist.css', + 'styles' => [ + 'resources/src/mediawiki/mediawiki.hlist-allskins.less', + ], + 'skinStyles' => [ + 'default' => 'resources/src/mediawiki/mediawiki.hlist.css', + ], ], 'mediawiki.htmlform' => [ 'scripts' => [ @@ -1159,7 +1157,9 @@ return [ 'default' => 'resources/src/mediawiki/mediawiki.notification.css', ], 'scripts' => 'resources/src/mediawiki/mediawiki.notification.js', - 'dependencies' => 'mediawiki.page.startup', + 'dependencies' => [ + 'mediawiki.util', + ], 'targets' => [ 'desktop', 'mobile' ], ], 'mediawiki.notify' => [ @@ -1187,6 +1187,7 @@ return [ 'styles' => 'resources/src/mediawiki/mediawiki.pager.tablePager.less', ], 'mediawiki.searchSuggest' => [ + 'targets' => [ 'desktop', 'mobile' ], 'scripts' => 'resources/src/mediawiki/mediawiki.searchSuggest.js', 'styles' => 'resources/src/mediawiki/mediawiki.searchSuggest.css', 'messages' => [ @@ -1194,7 +1195,6 @@ return [ 'searchsuggest-containing', ], 'dependencies' => [ - 'jquery.placeholder', 'jquery.suggestions', 'jquery.getAttrs', 'mediawiki.api', @@ -1299,6 +1299,8 @@ return [ 'action-upload', 'apierror-mustbeloggedin', 'badaccess-groups', + 'apierror-timeout', + 'apierror-offline', 'apierror-unknownerror', 'api-error-unknown-warning', 'fileexists', @@ -1318,7 +1320,7 @@ return [ 'dependencies' => [ 'mediawiki.ForeignStructuredUpload', 'mediawiki.Upload.BookletLayout', - 'mediawiki.widgets.CategorySelector', + 'mediawiki.widgets.CategoryMultiselectWidget', 'mediawiki.widgets.DateInputWidget', 'mediawiki.jqueryMsg', 'mediawiki.api.messages', @@ -1358,17 +1360,11 @@ return [ 'dependencies' => 'mediawiki.util', 'targets' => [ 'desktop', 'mobile' ], ], - 'mediawiki.user.blockcookie' => [ - 'scripts' => 'resources/src/mediawiki/mediawiki.user.blockcookie.js', - 'dependencies' => [ 'mediawiki.cookie', 'mediawiki.storage' ], - 'targets' => [ 'desktop', 'mobile' ], - ], 'mediawiki.user' => [ 'scripts' => 'resources/src/mediawiki/mediawiki.user.js', 'dependencies' => [ 'mediawiki.api', 'mediawiki.api.user', - 'mediawiki.cookie', 'mediawiki.storage', 'user.options', 'user.tokens', @@ -1383,6 +1379,7 @@ return [ ] ], 'mediawiki.util' => [ + 'class' => 'ResourceLoaderMediaWikiUtilModule', 'scripts' => 'resources/src/mediawiki/mediawiki.util.js', 'dependencies' => [ 'jquery.accessKeyLabel', @@ -1429,10 +1426,12 @@ return [ 'mediawiki.action.edit.styles', 'jquery.textSelection', 'jquery.byteLimit', + 'mediawiki.widgets.visibleByteLimit', 'mediawiki.api', ], ], 'mediawiki.action.edit.styles' => [ + 'targets' => [ 'desktop', 'mobile' ], 'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.styles.css', ], 'mediawiki.action.edit.collapsibleFooter' => [ @@ -1454,6 +1453,7 @@ return [ 'mediawiki.diff.styles', 'mediawiki.util', 'mediawiki.jqueryMsg', + 'oojs-ui-core', ], 'messages' => [ // Keep the uses message keys in sync with EditPage#setHeaders @@ -1491,7 +1491,6 @@ return [ 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js', 'dependencies' => [ 'mediawiki.util', - 'mediawiki.page.startup', 'user.options', ], ], @@ -1508,14 +1507,11 @@ return [ 'targets' => [ 'desktop', 'mobile' ] ], 'mediawiki.action.view.postEdit' => [ - 'templates' => [ - 'postEdit.html' => 'resources/src/mediawiki.action/templates/postEdit.html', - ], 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js', - 'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.css', + 'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.less', 'dependencies' => [ - 'mediawiki.cookie', - 'mediawiki.jqueryMsg' + 'mediawiki.jqueryMsg', + 'mediawiki.notification' ], 'messages' => [ 'postedit-confirmation-created', @@ -1666,7 +1662,8 @@ return [ 'oojs', 'oojs-ui-core', 'oojs-ui-widgets', - 'oojs-ui.styles.icons-media' + 'oojs-ui.styles.icons-media', + 'oojs-ui.styles.icons-movement' ], 'messages' => [ 'gallery-slideshow-toggle' @@ -1677,20 +1674,17 @@ return [ 'dependencies' => [ 'jquery.accessKeyLabel', 'jquery.checkboxShiftClick', - 'jquery.placeholder', 'jquery.mw-jump', ], 'targets' => [ 'desktop', 'mobile' ], ], 'mediawiki.page.startup' => [ 'scripts' => 'resources/src/mediawiki/page/startup.js', - 'dependencies' => 'mediawiki.util', 'targets' => [ 'desktop', 'mobile' ], ], 'mediawiki.page.patrol.ajax' => [ 'scripts' => 'resources/src/mediawiki/page/patrol.ajax.js', 'dependencies' => [ - 'mediawiki.page.startup', 'mediawiki.api', 'mediawiki.util', 'mediawiki.Title', @@ -1735,6 +1729,7 @@ return [ 'dependencies' => [ 'mediawiki.api.rollback', 'mediawiki.notify', + 'mediawiki.util', 'jquery.spinner', ], 'messages' => [ @@ -1760,30 +1755,50 @@ return [ 'mediawiki.rcfilters.filters.dm' => [ 'scripts' => [ 'resources/src/mediawiki.rcfilters/mw.rcfilters.js', + 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js', + 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js', + 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js', 'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js', + 'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js', ], 'dependencies' => [ 'oojs', + 'mediawiki.api', + 'mediawiki.api.options', 'mediawiki.Uri', + 'mediawiki.user', ], ], 'mediawiki.rcfilters.filters.ui' => [ 'scripts' => [ 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FiltersListWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js', - 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitButtonWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DateButtonWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js', 'resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js', 'resources/src/mediawiki.rcfilters/mw.rcfilters.init.js', ], @@ -1792,20 +1807,62 @@ return [ 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FiltersListWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuSectionOptionWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuHeaderWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.MenuSelectWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ViewSwitchWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ValuePickerWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesLimitPopupWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.DatePopupWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less', - 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less', + ], + 'skinStyles' => [ + 'monobook' => [ + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterMenuOptionWidget.monobook.less', + ], ], 'messages' => [ 'rcfilters-activefilters', + 'rcfilters-advancedfilters', + 'rcfilters-group-results-by-page', + 'rcfilters-grouping-title', + 'rcfilters-limit-title', + 'rcfilters-limit-shownum', + 'rcfilters-days-title', + 'rcfilters-hours-title', + 'rcfilters-days-show-days', + 'rcfilters-days-show-hours', + 'rcfilters-quickfilters', + 'rcfilters-quickfilters-placeholder-title', + 'rcfilters-quickfilters-placeholder-description', + 'rcfilters-savedqueries-defaultlabel', + 'rcfilters-savedqueries-rename', + 'rcfilters-savedqueries-setdefault', + 'rcfilters-savedqueries-unsetdefault', + 'rcfilters-savedqueries-remove', + 'rcfilters-savedqueries-new-name-label', + 'rcfilters-savedqueries-new-name-placeholder', + 'rcfilters-savedqueries-add-new-title', + 'rcfilters-savedqueries-apply-label', + 'rcfilters-savedqueries-apply-and-setdefault-label', + 'rcfilters-savedqueries-cancel-label', 'rcfilters-restore-default-filters', 'rcfilters-clear-all-filters', + 'rcfilters-show-new-changes', + 'rcfilters-previous-changes-label', 'rcfilters-search-placeholder', 'rcfilters-invalid-filter', 'rcfilters-empty-filter', @@ -1816,15 +1873,44 @@ return [ 'rcfilters-highlightbutton-title', 'rcfilters-highlightmenu-title', 'rcfilters-highlightmenu-help', + 'rcfilters-noresults-conflict', + 'rcfilters-state-message-subset', + 'rcfilters-state-message-fullcoverage', + 'rcfilters-filter-excluded', + 'rcfilters-tag-prefix-namespace', + 'rcfilters-tag-prefix-namespace-inverted', + 'rcfilters-tag-prefix-tags', + 'rcfilters-exclude-button-off', + 'rcfilters-exclude-button-on', + 'rcfilters-view-advanced-filters-label', + 'rcfilters-view-tags', + 'rcfilters-view-namespaces-tooltip', + 'rcfilters-view-tags-tooltip', + 'rcfilters-view-return-to-default-tooltip', + 'rcfilters-liveupdates-button', + 'rcfilters-liveupdates-button-title-on', + 'rcfilters-liveupdates-button-title-off', + 'rcfilters-other-review-tools', + 'blanknamespace', + 'namespaces', + 'invert', 'recentchanges-noresult', + 'quotation-marks', ], 'dependencies' => [ 'oojs-ui', + 'jquery.makeCollapsible', + 'mediawiki.language', + 'mediawiki.user', 'mediawiki.rcfilters.filters.dm', + 'oojs-ui.styles.icons-content', 'oojs-ui.styles.icons-moderation', 'oojs-ui.styles.icons-editing-core', 'oojs-ui.styles.icons-editing-styling', 'oojs-ui.styles.icons-interactions', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-layout', + 'oojs-ui.styles.icons-media', ], ], 'mediawiki.special' => [ @@ -1842,8 +1928,14 @@ return [ 'dependencies' => [ 'mediawiki.api', 'mediawiki.jqueryMsg', + 'mediawiki.util', 'oojs-ui', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-editing-advanced', + 'oojs-ui.styles.icons-interactions', + 'oojs-ui.styles.icons-moderation', 'mediawiki.widgets.datetime', + 'jquery.makeCollapsible', ], 'messages' => [ 'apisandbox-intro', @@ -1878,6 +1970,7 @@ return [ 'apisandbox-sending-request', 'apisandbox-loading-results', 'apisandbox-results-error', + 'apisandbox-results-login-suppressed', 'apisandbox-request-selectformat-label', 'apisandbox-request-format-url-label', 'apisandbox-request-url-label', @@ -1900,7 +1993,6 @@ return [ ], 'mediawiki.special.block' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.block.js', - 'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css', 'dependencies' => [ 'mediawiki.util', 'mediawiki.htmlform', @@ -1918,6 +2010,9 @@ return [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css', 'targets' => [ 'desktop', 'mobile' ], ], + 'mediawiki.special.changeslist.enhanced' => [ + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css', + ], 'mediawiki.special.changeslist.legend' => [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css', 'targets' => [ 'desktop', 'mobile' ], @@ -1930,15 +2025,19 @@ return [ ], 'targets' => [ 'desktop', 'mobile' ], ], - 'mediawiki.special.changeslist.enhanced' => [ - 'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css', - ], 'mediawiki.special.changeslist.visitedstatus' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js', ], 'mediawiki.special.comparepages.styles' => [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less', ], + 'mediawiki.special.contributions' => [ + 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.contributions.js', + 'dependencies' => [ + 'mediawiki.widgets.DateInputWidget', + 'mediawiki.jqueryMsg', + ] + ], 'mediawiki.special.edittags' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.edittags.js', 'dependencies' => [ @@ -1958,7 +2057,7 @@ return [ 'mediawiki.special.movePage' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.movePage.js', 'dependencies' => [ - 'jquery.byteLimit', + 'mediawiki.widgets.visibleByteLimit', 'mediawiki.widgets', ], ], @@ -1988,13 +2087,6 @@ return [ 'mediawiki.notification.convertmessagebox', ], ], - 'mediawiki.special.userrights' => [ - 'styles' => 'resources/src/mediawiki.special/mediawiki.special.userrights.css', - 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userrights.js', - 'dependencies' => [ - 'mediawiki.notification.convertmessagebox', - ], - ], 'mediawiki.special.preferences.styles' => [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.styles.css', ], @@ -2012,18 +2104,10 @@ return [ 'powersearch-togglenone', ], ], - 'mediawiki.special.search.styles' => [ - 'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css', - 'targets' => [ 'desktop', 'mobile' ], - ], - 'mediawiki.special.search.interwikiwidget.styles' => [ - 'styles' => 'resources/src/mediawiki.special/' - . 'mediawiki.special.search.interwikiwidget.styles.less', - 'targets' => [ 'desktop', 'mobile' ] - ], 'mediawiki.special.search.commonsInterwikiWidget' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.commonsInterwikiWidget.js', 'dependencies' => [ + 'mediawiki.api', 'mediawiki.Uri', 'mediawiki.jqueryMsg' ], @@ -2033,9 +2117,38 @@ return [ 'searchprofile-images' ], ], + 'mediawiki.special.search.interwikiwidget.styles' => [ + 'styles' => 'resources/src/mediawiki.special/' + . 'mediawiki.special.search.interwikiwidget.styles.less', + 'targets' => [ 'desktop', 'mobile' ] + ], + 'mediawiki.special.search.styles' => [ + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css', + 'targets' => [ 'desktop', 'mobile' ], + ], 'mediawiki.special.undelete' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js', ], + 'mediawiki.special.unwatchedPages' => [ + 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js', + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css', + 'messages' => [ + 'addedwatchtext-short', + 'removedwatchtext-short', + 'unwatch', + 'unwatching', + 'watch', + 'watcherrortext', + 'watching', + ], + 'dependencies' => [ + 'mediawiki.api', + 'mediawiki.api.watch', + 'mediawiki.notify', + 'mediawiki.Title', + 'mediawiki.util', + ], + ], 'mediawiki.special.upload' => [ 'templates' => [ 'thumbnail.html' => 'resources/src/mediawiki.special/templates/thumbnail.html', @@ -2072,11 +2185,6 @@ return [ 'resources/src/mediawiki.special/mediawiki.special.userlogin.common.css', ], ], - 'mediawiki.special.userlogin.signup.styles' => [ - 'styles' => [ - 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css', - ], - ], 'mediawiki.special.userlogin.login.styles' => [ 'styles' => [ 'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css', @@ -2096,33 +2204,41 @@ return [ 'mediawiki.htmlform.checker', ], ], - 'mediawiki.special.unwatchedPages' => [ - 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js', - 'styles' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.css', - 'messages' => [ - 'addedwatchtext-short', - 'removedwatchtext-short', - 'unwatch', - 'unwatching', - 'watch', - 'watcherrortext', - 'watching', + 'mediawiki.special.userlogin.signup.styles' => [ + 'styles' => [ + 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css', ], + ], + 'mediawiki.special.userrights' => [ + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.userrights.css', + 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userrights.js', 'dependencies' => [ - 'mediawiki.api', - 'mediawiki.api.watch', - 'mediawiki.notify', - 'mediawiki.Title', - 'mediawiki.util', + 'mediawiki.notification.convertmessagebox', ], ], 'mediawiki.special.watchlist' => [ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.js', + 'messages' => [ + 'addedwatchtext', + 'addedwatchtext-talk', + 'removedwatchtext', + 'removedwatchtext-talk', + 'tooltip-ca-watch', + 'tooltip-ca-unwatch', + 'watchlist-unwatch', + 'watchlist-unwatch-undo', + ], 'dependencies' => [ - 'mediawiki.api', + 'mediawiki.api.watch', + 'mediawiki.jqueryMsg', + 'mediawiki.Title', + 'mediawiki.util', 'oojs-ui-core', 'user.options', - ] + ], + ], + 'mediawiki.special.watchlist.styles' => [ + 'styles' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.css', ], 'mediawiki.special.version' => [ 'styles' => 'resources/src/mediawiki.special/mediawiki.special.version.css', @@ -2151,6 +2267,7 @@ return [ ], // Used in the web installer. Test it after modifying this definition! 'mediawiki.legacy.shared' => [ + 'targets' => [ 'desktop', 'mobile' ], 'styles' => [ 'resources/src/mediawiki.legacy/shared.css' => [ 'media' => 'screen' ] ], @@ -2162,7 +2279,6 @@ return [ ], 'mediawiki.legacy.wikibits' => [ 'scripts' => 'resources/src/mediawiki.legacy/wikibits.js', - 'dependencies' => 'mediawiki.util', 'targets' => [ 'desktop', 'mobile' ], ], @@ -2259,7 +2375,7 @@ return [ 'mediawiki.api', 'jquery.byteLimit', // TitleOptionWidget - 'jquery.autoEllipsis', + 'jquery.highlightText', ], 'messages' => [ // NamespaceInputWidget @@ -2298,10 +2414,30 @@ return [ ], 'dependencies' => [ 'oojs-ui-widgets', + 'oojs-ui.styles.icons-movement', 'moment', + 'mediawiki.widgets.DateInputWidget.styles', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.DateInputWidget.styles' => [ + 'skinStyles' => [ + 'default' => [ + 'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.styles.less', + ], ], 'targets' => [ 'desktop', 'mobile' ], ], + 'mediawiki.widgets.visibleByteLimit' => [ + 'scripts' => [ + 'resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js' + ], + 'dependencies' => [ + 'oojs-ui-core', + 'jquery.byteLimit' + ], + 'targets' => [ 'desktop', 'mobile' ] + ], 'mediawiki.widgets.datetime' => [ 'scripts' => [ 'resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.js', @@ -2362,13 +2498,21 @@ return [ ], 'dependencies' => [ 'oojs-ui-core', + 'oojs-ui.styles.icons-moderation', + 'oojs-ui.styles.icons-movement', ], 'targets' => [ 'desktop', 'mobile' ], ], 'mediawiki.widgets.CategorySelector' => [ + 'deprecated' => 'Use "mw.widgets.CategoryMultiselectWidget" instead. See T161285.', + 'dependencies' => [ + 'mediawiki.widgets.CategoryMultiselectWidget', + ], + ], + 'mediawiki.widgets.CategoryMultiselectWidget' => [ 'scripts' => [ 'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js', - 'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js', + 'resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js', ], 'dependencies' => [ 'oojs-ui-widgets', @@ -2378,10 +2522,22 @@ return [ ], 'messages' => [ 'red-link-title', - 'mw-widgets-categoryselector-add-category-placeholder' + 'mw-widgets-categoryselector-add-category-placeholder', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + 'mediawiki.widgets.SelectWithInputWidget' => [ + 'scripts' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js', + 'dependencies' => [ + 'mediawiki.widgets.SelectWithInputWidget.styles', + 'oojs-ui-widgets', ], 'targets' => [ 'desktop', 'mobile' ], ], + 'mediawiki.widgets.SelectWithInputWidget.styles' => [ + 'styles' => 'resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.base.css', + 'targets' => [ 'desktop', 'mobile' ], + ], 'mediawiki.widgets.MediaSearch' => [ 'scripts' => [ 'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js', @@ -2401,6 +2557,7 @@ return [ 'oojs-ui-widgets', 'mediawiki.ForeignApi', 'mediawiki.Title', + 'mediawiki.util', ], 'messages' => [ 'mw-widgets-mediasearch-noresults', @@ -2413,6 +2570,7 @@ return [ 'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js', ], 'dependencies' => [ + 'mediawiki.api', 'oojs-ui-widgets', ], 'targets' => [ 'desktop', 'mobile' ], @@ -2422,6 +2580,7 @@ return [ 'resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js', ], 'dependencies' => [ + 'mediawiki.api', 'oojs-ui-widgets', ], 'targets' => [ 'desktop', 'mobile' ], @@ -2432,6 +2591,7 @@ return [ ], 'dependencies' => [ 'mediawiki.searchSuggest', + 'oojs-ui.styles.icons-interactions', // FIXME: Needs TitleInputWidget only 'mediawiki.widgets', ], @@ -2454,21 +2614,18 @@ return [ ], ], 'dependencies' => [ + 'mediawiki.api', 'oojs-ui-core', ], ], + /* es5-shim */ 'es5-shim' => [ - 'scripts' => [ - 'resources/lib/es5-shim/es5-shim.js', - 'resources/src/polyfill-object-create.js', - ], + 'deprecated' => 'Use of the "es5-shim" module is deprecated since MediaWiki 1.29.0', 'targets' => [ 'desktop', 'mobile' ], - 'skipFunction' => 'resources/src/es5-skip.js', ], /* dom-level2-shim */ - // Deprecated since MediaWiki 1.29.0 'dom-level2-shim' => [ 'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0', 'targets' => [ 'desktop', 'mobile' ], @@ -2481,9 +2638,6 @@ return [ 'resources/src/oojs-global.js', ], 'targets' => [ 'desktop', 'mobile' ], - 'dependencies' => [ - 'es5-shim', - ], ], 'mediawiki.router' => [ @@ -2507,5 +2661,171 @@ return [ ], /* OOjs UI */ - // @see ResourcesOOUI.php + + // Omnibus module. + 'oojs-ui' => [ + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui-widgets', + 'oojs-ui-toolbars', + 'oojs-ui-windows', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + // The core JavaScript library. + 'oojs-ui-core' => [ + 'class' => 'ResourceLoaderOOUIFileModule', + 'scripts' => [ + 'resources/lib/oojs-ui/oojs-ui-core.js', + 'resources/src/oojs-ui-local.js', + ], + 'themeScripts' => 'core', + 'dependencies' => [ + 'oojs', + 'oojs-ui-core.styles', + 'oojs-ui.styles.indicators', + 'oojs-ui.styles.textures', + 'mediawiki.language', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-alerts', + 'oojs-ui.styles.icons-interactions', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // This contains only the styles required by core widgets. + 'oojs-ui-core.styles' => [ + 'class' => 'ResourceLoaderOOUIFileModule', + 'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file + 'themeStyles' => 'core', + 'targets' => [ 'desktop', 'mobile' ], + ], + // Additional widgets and layouts module. + 'oojs-ui-widgets' => [ + 'class' => 'ResourceLoaderOOUIFileModule', + 'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js', + 'themeStyles' => 'widgets', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui.styles.icons-interactions', + 'oojs-ui.styles.icons-content', + 'oojs-ui.styles.icons-editing-advanced', + 'oojs-ui.styles.icons-movement', + 'oojs-ui.styles.icons-moderation', + ], + 'messages' => [ + 'ooui-outline-control-move-down', + 'ooui-outline-control-move-up', + 'ooui-outline-control-remove', + 'ooui-selectfile-button-select', + 'ooui-selectfile-dragdrop-placeholder', + 'ooui-selectfile-not-supported', + 'ooui-selectfile-placeholder', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Toolbar and tools module. + 'oojs-ui-toolbars' => [ + 'class' => 'ResourceLoaderOOUIFileModule', + 'scripts' => 'resources/lib/oojs-ui/oojs-ui-toolbars.js', + 'themeStyles' => 'toolbars', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui.styles.icons-movement', + ], + 'messages' => [ + 'ooui-toolbar-more', + 'ooui-toolgroup-collapse', + 'ooui-toolgroup-expand', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + // Windows and dialogs module. + 'oojs-ui-windows' => [ + 'class' => 'ResourceLoaderOOUIFileModule', + 'scripts' => 'resources/lib/oojs-ui/oojs-ui-windows.js', + 'themeStyles' => 'windows', + 'dependencies' => [ + 'oojs-ui-core', + 'oojs-ui.styles.icons-movement', + ], + 'messages' => [ + 'ooui-dialog-message-accept', + 'ooui-dialog-message-reject', + 'ooui-dialog-process-continue', + 'ooui-dialog-process-dismiss', + 'ooui-dialog-process-error', + 'ooui-dialog-process-retry', + ], + 'targets' => [ 'desktop', 'mobile' ], + ], + + 'oojs-ui.styles.indicators' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'indicators', + ], + 'oojs-ui.styles.textures' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'textures', + ], + 'oojs-ui.styles.icons-accessibility' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-accessibility', + ], + 'oojs-ui.styles.icons-alerts' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-alerts', + ], + 'oojs-ui.styles.icons-content' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-content', + ], + 'oojs-ui.styles.icons-editing-advanced' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-editing-advanced', + ], + 'oojs-ui.styles.icons-editing-core' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-editing-core', + ], + 'oojs-ui.styles.icons-editing-list' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-editing-list', + ], + 'oojs-ui.styles.icons-editing-styling' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-editing-styling', + ], + 'oojs-ui.styles.icons-interactions' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-interactions', + ], + 'oojs-ui.styles.icons-layout' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-layout', + ], + 'oojs-ui.styles.icons-location' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-location', + ], + 'oojs-ui.styles.icons-media' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-media', + ], + 'oojs-ui.styles.icons-moderation' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-moderation', + ], + 'oojs-ui.styles.icons-movement' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-movement', + ], + 'oojs-ui.styles.icons-user' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-user', + ], + 'oojs-ui.styles.icons-wikimedia' => [ + 'class' => 'ResourceLoaderOOUIImageModule', + 'themeImages' => 'icons-wikimedia', + ], ]; diff --git a/resources/ResourcesOOUI.php b/resources/ResourcesOOUI.php deleted file mode 100644 index c3a287dc8d..0000000000 --- a/resources/ResourcesOOUI.php +++ /dev/null @@ -1,174 +0,0 @@ -getAttribute( 'SkinOOUIThemes' ); - // We only use the theme names for file names, and they are lowercase - $themes = array_map( 'strtolower', $themes ); - $themes['default'] = 'mediawiki'; - - // Helper function to generate paths to files used in 'skinStyles' and 'skinScripts'. - $getSkinSpecific = function ( $module, $ext = 'css' ) use ( $themes ) { - return array_combine( - array_keys( $themes ), - array_map( function ( $theme ) use ( $module, $ext ) { - $module = $module ? "$module-" : ''; - // TODO Allow extensions to specify this path somehow - return "resources/lib/oojs-ui/oojs-ui-$module$theme.$ext"; - }, array_values( $themes ) ) - ); - }; - - $modules = []; - - // Omnibus module. - $modules['oojs-ui'] = [ - 'dependencies' => [ - 'oojs-ui-core', - 'oojs-ui-widgets', - 'oojs-ui-toolbars', - 'oojs-ui-windows', - ], - 'targets' => [ 'desktop', 'mobile' ], - ]; - - // The core JavaScript library. - $modules['oojs-ui-core'] = [ - 'scripts' => [ - 'resources/lib/oojs-ui/oojs-ui-core.js', - 'resources/src/oojs-ui-local.js', - ], - 'skinScripts' => $getSkinSpecific( null, 'js' ), - 'dependencies' => [ - 'es5-shim', - 'oojs', - 'oojs-ui-core.styles', - 'oojs-ui.styles.icons', - 'oojs-ui.styles.indicators', - 'oojs-ui.styles.textures', - 'mediawiki.language', - ], - 'targets' => [ 'desktop', 'mobile' ], - ]; - // This contains only the styles required by core widgets. - $modules['oojs-ui-core.styles'] = [ - 'position' => 'top', - 'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file - 'skinStyles' => $getSkinSpecific( 'core' ), - 'targets' => [ 'desktop', 'mobile' ], - ]; - - // Additional widgets and layouts module. - $modules['oojs-ui-widgets'] = [ - 'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js', - 'skinStyles' => $getSkinSpecific( 'widgets' ), - 'dependencies' => 'oojs-ui-core', - 'messages' => [ - 'ooui-outline-control-move-down', - 'ooui-outline-control-move-up', - 'ooui-outline-control-remove', - 'ooui-selectfile-button-select', - 'ooui-selectfile-dragdrop-placeholder', - 'ooui-selectfile-not-supported', - 'ooui-selectfile-placeholder', - ], - 'targets' => [ 'desktop', 'mobile' ], - ]; - // Toolbar and tools module. - $modules['oojs-ui-toolbars'] = [ - 'scripts' => 'resources/lib/oojs-ui/oojs-ui-toolbars.js', - 'skinStyles' => $getSkinSpecific( 'toolbars' ), - 'dependencies' => 'oojs-ui-core', - 'messages' => [ - 'ooui-toolbar-more', - 'ooui-toolgroup-collapse', - 'ooui-toolgroup-expand', - ], - 'targets' => [ 'desktop', 'mobile' ], - ]; - // Windows and dialogs module. - $modules['oojs-ui-windows'] = [ - 'scripts' => 'resources/lib/oojs-ui/oojs-ui-windows.js', - 'skinStyles' => $getSkinSpecific( 'windows' ), - 'dependencies' => 'oojs-ui-core', - 'messages' => [ - 'ooui-dialog-message-accept', - 'ooui-dialog-message-reject', - 'ooui-dialog-process-continue', - 'ooui-dialog-process-dismiss', - 'ooui-dialog-process-error', - 'ooui-dialog-process-retry', - ], - 'targets' => [ 'desktop', 'mobile' ], - ]; - - $imageSets = [ - // Comments for greppability - 'icons', // oojs-ui.styles.icons - 'indicators', // oojs-ui.styles.indicators - 'textures', // oojs-ui.styles.textures - 'icons-accessibility', // oojs-ui.styles.icons-accessibility - 'icons-alerts', // oojs-ui.styles.icons-alerts - 'icons-content', // oojs-ui.styles.icons-content - 'icons-editing-advanced', // oojs-ui.styles.icons-editing-advanced - 'icons-editing-core', // oojs-ui.styles.icons-editing-core - 'icons-editing-list', // oojs-ui.styles.icons-editing-list - 'icons-editing-styling', // oojs-ui.styles.icons-editing-styling - 'icons-interactions', // oojs-ui.styles.icons-interactions - 'icons-layout', // oojs-ui.styles.icons-layout - 'icons-location', // oojs-ui.styles.icons-location - 'icons-media', // oojs-ui.styles.icons-media - 'icons-moderation', // oojs-ui.styles.icons-moderation - 'icons-movement', // oojs-ui.styles.icons-movement - 'icons-user', // oojs-ui.styles.icons-user - 'icons-wikimedia', // oojs-ui.styles.icons-wikimedia - ]; - $rootPath = 'resources/lib/oojs-ui/themes'; - - foreach ( $imageSets as $name ) { - $module = [ - 'position' => 'top', - 'class' => 'ResourceLoaderOOUIImageModule', - 'name' => $name, - 'rootPath' => $rootPath, - ]; - - if ( substr( $name, 0, 5 ) === 'icons' ) { - $module['selectorWithoutVariant'] = '.oo-ui-icon-{name}, .mw-ui-icon-{name}:before'; - $module['selectorWithVariant'] = ' - .oo-ui-image-{variant}.oo-ui-icon-{name}, .mw-ui-icon-{name}-{variant}:before, - /* Hack for Flow, see T110051 */ - .mw-ui-hovericon:hover .mw-ui-icon-{name}-{variant}-hover:before, - .mw-ui-hovericon.mw-ui-icon-{name}-{variant}-hover:hover:before'; - } - - $modules["oojs-ui.styles.$name"] = $module; - } - - return $modules; -} ); diff --git a/resources/lib/es5-shim/es5-shim.js b/resources/lib/es5-shim/es5-shim.js deleted file mode 100644 index 91a7a39762..0000000000 --- a/resources/lib/es5-shim/es5-shim.js +++ /dev/null @@ -1,2051 +0,0 @@ -/*! - * https://github.com/es-shims/es5-shim - * @license es5-shim Copyright 2009-2015 by contributors, MIT License - * see https://github.com/es-shims/es5-shim/blob/master/LICENSE - */ - -// vim: ts=4 sts=4 sw=4 expandtab - -// Add semicolon to prevent IIFE from being passed as argument to concatenated code. -; - -// UMD (Universal Module Definition) -// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js -(function (root, factory) { - 'use strict'; - - /* global define, exports, module */ - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(factory); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like enviroments that support module.exports, - // like Node. - module.exports = factory(); - } else { - // Browser globals (root is window) - root.returnExports = factory(); - } -}(this, function () { - -/** - * Brings an environment as close to ECMAScript 5 compliance - * as is possible with the facilities of erstwhile engines. - * - * Annotated ES5: http://es5.github.com/ (specific links below) - * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/ - */ - -// Shortcut to an often accessed properties, in order to avoid multiple -// dereference that costs universally. This also holds a reference to known-good -// functions. -var $Array = Array; -var ArrayPrototype = $Array.prototype; -var $Object = Object; -var ObjectPrototype = $Object.prototype; -var $Function = Function; -var FunctionPrototype = $Function.prototype; -var $String = String; -var StringPrototype = $String.prototype; -var $Number = Number; -var NumberPrototype = $Number.prototype; -var array_slice = ArrayPrototype.slice; -var array_splice = ArrayPrototype.splice; -var array_push = ArrayPrototype.push; -var array_unshift = ArrayPrototype.unshift; -var array_concat = ArrayPrototype.concat; -var array_join = ArrayPrototype.join; -var call = FunctionPrototype.call; -var apply = FunctionPrototype.apply; -var max = Math.max; -var min = Math.min; - -// Having a toString local variable name breaks in Opera so use to_string. -var to_string = ObjectPrototype.toString; - -/* global Symbol */ -/* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */ -var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; -var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; }; - -var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; }; -var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; }; -/* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */ - -/* inlined from http://npmjs.com/define-properties */ -var supportsDescriptors = $Object.defineProperty && (function () { - try { - var obj = {}; - $Object.defineProperty(obj, 'x', { enumerable: false, value: obj }); - for (var _ in obj) { return false; } - return obj.x === obj; - } catch (e) { /* this is ES3 */ - return false; - } -}()); -var defineProperties = (function (has) { - // Define configurable, writable, and non-enumerable props - // if they don't exist. - var defineProperty; - if (supportsDescriptors) { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - $Object.defineProperty(object, name, { - configurable: true, - enumerable: false, - writable: true, - value: method - }); - }; - } else { - defineProperty = function (object, name, method, forceAssign) { - if (!forceAssign && (name in object)) { return; } - object[name] = method; - }; - } - return function defineProperties(object, map, forceAssign) { - for (var name in map) { - if (has.call(map, name)) { - defineProperty(object, name, map[name], forceAssign); - } - } - }; -}(ObjectPrototype.hasOwnProperty)); - -// -// Util -// ====== -// - -/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */ -var isPrimitive = function isPrimitive(input) { - var type = typeof input; - return input === null || (type !== 'object' && type !== 'function'); -}; - -var isActualNaN = $Number.isNaN || function (x) { return x !== x; }; - -var ES = { - // ES5 9.4 - // http://es5.github.com/#x9.4 - // http://jsperf.com/to-integer - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */ - ToInteger: function ToInteger(num) { - var n = +num; - if (isActualNaN(n)) { - n = 0; - } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; - }, - - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */ - ToPrimitive: function ToPrimitive(input) { - var val, valueOf, toStr; - if (isPrimitive(input)) { - return input; - } - valueOf = input.valueOf; - if (isCallable(valueOf)) { - val = valueOf.call(input); - if (isPrimitive(val)) { - return val; - } - } - toStr = input.toString; - if (isCallable(toStr)) { - val = toStr.call(input); - if (isPrimitive(val)) { - return val; - } - } - throw new TypeError(); - }, - - // ES5 9.9 - // http://es5.github.com/#x9.9 - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */ - ToObject: function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert " + o + ' to object'); - } - return $Object(o); - }, - - /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */ - ToUint32: function ToUint32(x) { - return x >>> 0; - } -}; - -// -// Function -// ======== -// - -// ES-5 15.3.4.5 -// http://es5.github.com/#x15.3.4.5 - -var Empty = function Empty() {}; - -defineProperties(FunctionPrototype, { - bind: function bind(that) { // .length is 1 - // 1. Let Target be the this value. - var target = this; - // 2. If IsCallable(Target) is false, throw a TypeError exception. - if (!isCallable(target)) { - throw new TypeError('Function.prototype.bind called on incompatible ' + target); - } - // 3. Let A be a new (possibly empty) internal list of all of the - // argument values provided after thisArg (arg1, arg2 etc), in order. - // XXX slicedArgs will stand in for "A" if used - var args = array_slice.call(arguments, 1); // for normal call - // 4. Let F be a new native ECMAScript object. - // 11. Set the [[Prototype]] internal property of F to the standard - // built-in Function prototype object as specified in 15.3.3.1. - // 12. Set the [[Call]] internal property of F as described in - // 15.3.4.5.1. - // 13. Set the [[Construct]] internal property of F as described in - // 15.3.4.5.2. - // 14. Set the [[HasInstance]] internal property of F as described in - // 15.3.4.5.3. - var bound; - var binder = function () { - - if (this instanceof bound) { - // 15.3.4.5.2 [[Construct]] - // When the [[Construct]] internal method of a function object, - // F that was created using the bind function is called with a - // list of arguments ExtraArgs, the following steps are taken: - // 1. Let target be the value of F's [[TargetFunction]] - // internal property. - // 2. If target has no [[Construct]] internal method, a - // TypeError exception is thrown. - // 3. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Construct]] internal - // method of target providing args as the arguments. - - var result = apply.call( - target, - this, - array_concat.call(args, array_slice.call(arguments)) - ); - if ($Object(result) === result) { - return result; - } - return this; - - } else { - // 15.3.4.5.1 [[Call]] - // When the [[Call]] internal method of a function object, F, - // which was created using the bind function is called with a - // this value and a list of arguments ExtraArgs, the following - // steps are taken: - // 1. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 2. Let boundThis be the value of F's [[BoundThis]] internal - // property. - // 3. Let target be the value of F's [[TargetFunction]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Call]] internal method - // of target providing boundThis as the this value and - // providing args as the arguments. - - // equiv: target.call(this, ...boundArgs, ...args) - return apply.call( - target, - that, - array_concat.call(args, array_slice.call(arguments)) - ); - - } - - }; - - // 15. If the [[Class]] internal property of Target is "Function", then - // a. Let L be the length property of Target minus the length of A. - // b. Set the length own property of F to either 0 or L, whichever is - // larger. - // 16. Else set the length own property of F to 0. - - var boundLength = max(0, target.length - args.length); - - // 17. Set the attributes of the length own property of F to the values - // specified in 15.3.5.1. - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - array_push.call(boundArgs, '$' + i); - } - - // XXX Build a dynamic function with desired amount of arguments is the only - // way to set the length property of a function. - // In environments where Content Security Policies enabled (Chrome extensions, - // for ex.) all use of eval or Function costructor throws an exception. - // However in all of these environments Function.prototype.bind exists - // and so this code will never be executed. - bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder); - - if (target.prototype) { - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - // Clean up dangling references. - Empty.prototype = null; - } - - // TODO - // 18. Set the [[Extensible]] internal property of F to true. - - // TODO - // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). - // 20. Call the [[DefineOwnProperty]] internal method of F with - // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: - // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and - // false. - // 21. Call the [[DefineOwnProperty]] internal method of F with - // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, - // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, - // and false. - - // TODO - // NOTE Function objects created using Function.prototype.bind do not - // have a prototype property or the [[Code]], [[FormalParameters]], and - // [[Scope]] internal properties. - // XXX can't delete prototype in pure-js. - - // 22. Return F. - return bound; - } -}); - -// _Please note: Shortcuts are defined after `Function.prototype.bind` as we -// use it in defining shortcuts. -var owns = call.bind(ObjectPrototype.hasOwnProperty); -var toStr = call.bind(ObjectPrototype.toString); -var arraySlice = call.bind(array_slice); -var arraySliceApply = apply.bind(array_slice); -var strSlice = call.bind(StringPrototype.slice); -var strSplit = call.bind(StringPrototype.split); -var strIndexOf = call.bind(StringPrototype.indexOf); -var pushCall = call.bind(array_push); -var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable); -var arraySort = call.bind(ArrayPrototype.sort); - -// -// Array -// ===== -// - -var isArray = $Array.isArray || function isArray(obj) { - return toStr(obj) === '[object Array]'; -}; - -// ES5 15.4.4.12 -// http://es5.github.com/#x15.4.4.13 -// Return len+argCount. -// [bugfix, ielt8] -// IE < 8 bug: [].unshift(0) === undefined but should be "1" -var hasUnshiftReturnValueBug = [].unshift(0) !== 1; -defineProperties(ArrayPrototype, { - unshift: function () { - array_unshift.apply(this, arguments); - return this.length; - } -}, hasUnshiftReturnValueBug); - -// ES5 15.4.3.2 -// http://es5.github.com/#x15.4.3.2 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray -defineProperties($Array, { isArray: isArray }); - -// The IsCallable() check in the Array functions -// has been replaced with a strict check on the -// internal class of the object to trap cases where -// the provided function was actually a regular -// expression literal, which in V8 and -// JavaScriptCore is a typeof "function". Only in -// V8 are regular expression literals permitted as -// reduce parameters, so it is desirable in the -// general case for the shim to match the more -// strict and common behavior of rejecting regular -// expressions. - -// ES5 15.4.4.18 -// http://es5.github.com/#x15.4.4.18 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach - -// Check failure of by-index access of string characters (IE < 9) -// and failure of `0 in boxedString` (Rhino) -var boxedString = $Object('a'); -var splitString = boxedString[0] !== 'a' || !(0 in boxedString); - -var properlyBoxesContext = function properlyBoxed(method) { - // Check node 0.6.21 bug where third parameter is not boxed - var properlyBoxesNonStrict = true; - var properlyBoxesStrict = true; - var threwException = false; - if (method) { - try { - method.call('foo', function (_, __, context) { - if (typeof context !== 'object') { - properlyBoxesNonStrict = false; - } - }); - - method.call([1], function () { - 'use strict'; - - properlyBoxesStrict = typeof this === 'string'; - }, 'x'); - } catch (e) { - threwException = true; - } - } - return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict; -}; - -defineProperties(ArrayPrototype, { - forEach: function forEach(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var i = -1; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.forEach callback must be a function'); - } - - while (++i < length) { - if (i in self) { - // Invoke the callback function with call, passing arguments: - // context, property value, property key, thisArg object - if (typeof T === 'undefined') { - callbackfn(self[i], i, object); - } else { - callbackfn.call(T, self[i], i, object); - } - } - } - } -}, !properlyBoxesContext(ArrayPrototype.forEach)); - -// ES5 15.4.4.19 -// http://es5.github.com/#x15.4.4.19 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map -defineProperties(ArrayPrototype, { - map: function map(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var result = $Array(length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.map callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self) { - if (typeof T === 'undefined') { - result[i] = callbackfn(self[i], i, object); - } else { - result[i] = callbackfn.call(T, self[i], i, object); - } - } - } - return result; - } -}, !properlyBoxesContext(ArrayPrototype.map)); - -// ES5 15.4.4.20 -// http://es5.github.com/#x15.4.4.20 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter -defineProperties(ArrayPrototype, { - filter: function filter(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var result = []; - var value; - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.filter callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self) { - value = self[i]; - if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) { - pushCall(result, value); - } - } - } - return result; - } -}, !properlyBoxesContext(ArrayPrototype.filter)); - -// ES5 15.4.4.16 -// http://es5.github.com/#x15.4.4.16 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every -defineProperties(ArrayPrototype, { - every: function every(callbackfn/*, thisArg*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.every callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { - return false; - } - } - return true; - } -}, !properlyBoxesContext(ArrayPrototype.every)); - -// ES5 15.4.4.17 -// http://es5.github.com/#x15.4.4.17 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some -defineProperties(ArrayPrototype, { - some: function some(callbackfn/*, thisArg */) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - var T; - if (arguments.length > 1) { - T = arguments[1]; - } - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.some callback must be a function'); - } - - for (var i = 0; i < length; i++) { - if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) { - return true; - } - } - return false; - } -}, !properlyBoxesContext(ArrayPrototype.some)); - -// ES5 15.4.4.21 -// http://es5.github.com/#x15.4.4.21 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce -var reduceCoercesToObject = false; -if (ArrayPrototype.reduce) { - reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { - return list; - }) === 'object'; -} -defineProperties(ArrayPrototype, { - reduce: function reduce(callbackfn/*, initialValue*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.reduce callback must be a function'); - } - - // no value to return if no initial value and an empty array - if (length === 0 && arguments.length === 1) { - throw new TypeError('reduce of empty array with no initial value'); - } - - var i = 0; - var result; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= length) { - throw new TypeError('reduce of empty array with no initial value'); - } - } while (true); - } - - for (; i < length; i++) { - if (i in self) { - result = callbackfn(result, self[i], i, object); - } - } - - return result; - } -}, !reduceCoercesToObject); - -// ES5 15.4.4.22 -// http://es5.github.com/#x15.4.4.22 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight -var reduceRightCoercesToObject = false; -if (ArrayPrototype.reduceRight) { - reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { - return list; - }) === 'object'; -} -defineProperties(ArrayPrototype, { - reduceRight: function reduceRight(callbackfn/*, initial*/) { - var object = ES.ToObject(this); - var self = splitString && isString(this) ? strSplit(this, '') : object; - var length = ES.ToUint32(self.length); - - // If no callback function or if callback is not a callable function - if (!isCallable(callbackfn)) { - throw new TypeError('Array.prototype.reduceRight callback must be a function'); - } - - // no value to return if no initial value, empty array - if (length === 0 && arguments.length === 1) { - throw new TypeError('reduceRight of empty array with no initial value'); - } - - var result; - var i = length - 1; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i--]; - break; - } - - // if array contains no values, no initial value to return - if (--i < 0) { - throw new TypeError('reduceRight of empty array with no initial value'); - } - } while (true); - } - - if (i < 0) { - return result; - } - - do { - if (i in self) { - result = callbackfn(result, self[i], i, object); - } - } while (i--); - - return result; - } -}, !reduceRightCoercesToObject); - -// ES5 15.4.4.14 -// http://es5.github.com/#x15.4.4.14 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf -var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1; -defineProperties(ArrayPrototype, { - indexOf: function indexOf(searchElement/*, fromIndex */) { - var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); - var length = ES.ToUint32(self.length); - - if (length === 0) { - return -1; - } - - var i = 0; - if (arguments.length > 1) { - i = ES.ToInteger(arguments[1]); - } - - // handle negative indices - i = i >= 0 ? i : max(0, length + i); - for (; i < length; i++) { - if (i in self && self[i] === searchElement) { - return i; - } - } - return -1; - } -}, hasFirefox2IndexOfBug); - -// ES5 15.4.4.15 -// http://es5.github.com/#x15.4.4.15 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf -var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; -defineProperties(ArrayPrototype, { - lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) { - var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this); - var length = ES.ToUint32(self.length); - - if (length === 0) { - return -1; - } - var i = length - 1; - if (arguments.length > 1) { - i = min(i, ES.ToInteger(arguments[1])); - } - // handle negative indices - i = i >= 0 ? i : length - Math.abs(i); - for (; i >= 0; i--) { - if (i in self && searchElement === self[i]) { - return i; - } - } - return -1; - } -}, hasFirefox2LastIndexOfBug); - -// ES5 15.4.4.12 -// http://es5.github.com/#x15.4.4.12 -var spliceNoopReturnsEmptyArray = (function () { - var a = [1, 2]; - var result = a.splice(); - return a.length === 2 && isArray(result) && result.length === 0; -}()); -defineProperties(ArrayPrototype, { - // Safari 5.0 bug where .splice() returns undefined - splice: function splice(start, deleteCount) { - if (arguments.length === 0) { - return []; - } else { - return array_splice.apply(this, arguments); - } - } -}, !spliceNoopReturnsEmptyArray); - -var spliceWorksWithEmptyObject = (function () { - var obj = {}; - ArrayPrototype.splice.call(obj, 0, 0, 1); - return obj.length === 1; -}()); -defineProperties(ArrayPrototype, { - splice: function splice(start, deleteCount) { - if (arguments.length === 0) { return []; } - var args = arguments; - this.length = max(ES.ToInteger(this.length), 0); - if (arguments.length > 0 && typeof deleteCount !== 'number') { - args = arraySlice(arguments); - if (args.length < 2) { - pushCall(args, this.length - start); - } else { - args[1] = ES.ToInteger(deleteCount); - } - } - return array_splice.apply(this, args); - } -}, !spliceWorksWithEmptyObject); -var spliceWorksWithLargeSparseArrays = (function () { - // Per https://github.com/es-shims/es5-shim/issues/295 - // Safari 7/8 breaks with sparse arrays of size 1e5 or greater - var arr = new $Array(1e5); - // note: the index MUST be 8 or larger or the test will false pass - arr[8] = 'x'; - arr.splice(1, 1); - // note: this test must be defined *after* the indexOf shim - // per https://github.com/es-shims/es5-shim/issues/313 - return arr.indexOf('x') === 7; -}()); -var spliceWorksWithSmallSparseArrays = (function () { - // Per https://github.com/es-shims/es5-shim/issues/295 - // Opera 12.15 breaks on this, no idea why. - var n = 256; - var arr = []; - arr[n] = 'a'; - arr.splice(n + 1, 0, 'b'); - return arr[n] === 'a'; -}()); -defineProperties(ArrayPrototype, { - splice: function splice(start, deleteCount) { - var O = ES.ToObject(this); - var A = []; - var len = ES.ToUint32(O.length); - var relativeStart = ES.ToInteger(start); - var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len); - var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart); - - var k = 0; - var from; - while (k < actualDeleteCount) { - from = $String(actualStart + k); - if (owns(O, from)) { - A[k] = O[from]; - } - k += 1; - } - - var items = arraySlice(arguments, 2); - var itemCount = items.length; - var to; - if (itemCount < actualDeleteCount) { - k = actualStart; - var maxK = len - actualDeleteCount; - while (k < maxK) { - from = $String(k + actualDeleteCount); - to = $String(k + itemCount); - if (owns(O, from)) { - O[to] = O[from]; - } else { - delete O[to]; - } - k += 1; - } - k = len; - var minK = len - actualDeleteCount + itemCount; - while (k > minK) { - delete O[k - 1]; - k -= 1; - } - } else if (itemCount > actualDeleteCount) { - k = len - actualDeleteCount; - while (k > actualStart) { - from = $String(k + actualDeleteCount - 1); - to = $String(k + itemCount - 1); - if (owns(O, from)) { - O[to] = O[from]; - } else { - delete O[to]; - } - k -= 1; - } - } - k = actualStart; - for (var i = 0; i < items.length; ++i) { - O[k] = items[i]; - k += 1; - } - O.length = len - actualDeleteCount + itemCount; - - return A; - } -}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays); - -var originalJoin = ArrayPrototype.join; -var hasStringJoinBug; -try { - hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3'; -} catch (e) { - hasStringJoinBug = true; -} -if (hasStringJoinBug) { - defineProperties(ArrayPrototype, { - join: function join(separator) { - var sep = typeof separator === 'undefined' ? ',' : separator; - return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep); - } - }, hasStringJoinBug); -} - -var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2'; -if (hasJoinUndefinedBug) { - defineProperties(ArrayPrototype, { - join: function join(separator) { - var sep = typeof separator === 'undefined' ? ',' : separator; - return originalJoin.call(this, sep); - } - }, hasJoinUndefinedBug); -} - -var pushShim = function push(item) { - var O = ES.ToObject(this); - var n = ES.ToUint32(O.length); - var i = 0; - while (i < arguments.length) { - O[n + i] = arguments[i]; - i += 1; - } - O.length = n + i; - return n + i; -}; - -var pushIsNotGeneric = (function () { - var obj = {}; - var result = Array.prototype.push.call(obj, undefined); - return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0); -}()); -defineProperties(ArrayPrototype, { - push: function push(item) { - if (isArray(this)) { - return array_push.apply(this, arguments); - } - return pushShim.apply(this, arguments); - } -}, pushIsNotGeneric); - -// This fixes a very weird bug in Opera 10.6 when pushing `undefined -var pushUndefinedIsWeird = (function () { - var arr = []; - var result = arr.push(undefined); - return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0); -}()); -defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird); - -// ES5 15.2.3.14 -// http://es5.github.io/#x15.4.4.10 -// Fix boxed string bug -defineProperties(ArrayPrototype, { - slice: function (start, end) { - var arr = isString(this) ? strSplit(this, '') : this; - return arraySliceApply(arr, arguments); - } -}, splitString); - -var sortIgnoresNonFunctions = (function () { - try { - [1, 2].sort(null); - [1, 2].sort({}); - return true; - } catch (e) { /**/ } - return false; -}()); -var sortThrowsOnRegex = (function () { - // this is a problem in Firefox 4, in which `typeof /a/ === 'function'` - try { - [1, 2].sort(/a/); - return false; - } catch (e) { /**/ } - return true; -}()); -var sortIgnoresUndefined = (function () { - // applies in IE 8, for one. - try { - [1, 2].sort(undefined); - return true; - } catch (e) { /**/ } - return false; -}()); -defineProperties(ArrayPrototype, { - sort: function sort(compareFn) { - if (typeof compareFn === 'undefined') { - return arraySort(this); - } - if (!isCallable(compareFn)) { - throw new TypeError('Array.prototype.sort callback must be a function'); - } - return arraySort(this, compareFn); - } -}, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex); - -// -// Object -// ====== -// - -// ES5 15.2.3.14 -// http://es5.github.com/#x15.2.3.14 - -// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation -var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString'); -var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'); -var hasStringEnumBug = !owns('x', '0'); -var equalsConstructorPrototype = function (o) { - var ctor = o.constructor; - return ctor && ctor.prototype === o; -}; -var blacklistedKeys = { - $window: true, - $console: true, - $parent: true, - $self: true, - $frame: true, - $frames: true, - $frameElement: true, - $webkitIndexedDB: true, - $webkitStorageInfo: true, - $external: true -}; -var hasAutomationEqualityBug = (function () { - /* globals window */ - if (typeof window === 'undefined') { return false; } - for (var k in window) { - try { - if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') { - equalsConstructorPrototype(window[k]); - } - } catch (e) { - return true; - } - } - return false; -}()); -var equalsConstructorPrototypeIfNotBuggy = function (object) { - if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); } - try { - return equalsConstructorPrototype(object); - } catch (e) { - return false; - } -}; -var dontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' -]; -var dontEnumsLength = dontEnums.length; - -// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js -// can be replaced with require('is-arguments') if we ever use a build process instead -var isStandardArguments = function isArguments(value) { - return toStr(value) === '[object Arguments]'; -}; -var isLegacyArguments = function isArguments(value) { - return value !== null && - typeof value === 'object' && - typeof value.length === 'number' && - value.length >= 0 && - !isArray(value) && - isCallable(value.callee); -}; -var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments; - -defineProperties($Object, { - keys: function keys(object) { - var isFn = isCallable(object); - var isArgs = isArguments(object); - var isObject = object !== null && typeof object === 'object'; - var isStr = isObject && isString(object); - - if (!isObject && !isFn && !isArgs) { - throw new TypeError('Object.keys called on a non-object'); - } - - var theKeys = []; - var skipProto = hasProtoEnumBug && isFn; - if ((isStr && hasStringEnumBug) || isArgs) { - for (var i = 0; i < object.length; ++i) { - pushCall(theKeys, $String(i)); - } - } - - if (!isArgs) { - for (var name in object) { - if (!(skipProto && name === 'prototype') && owns(object, name)) { - pushCall(theKeys, $String(name)); - } - } - } - - if (hasDontEnumBug) { - var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); - for (var j = 0; j < dontEnumsLength; j++) { - var dontEnum = dontEnums[j]; - if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) { - pushCall(theKeys, dontEnum); - } - } - } - return theKeys; - } -}); - -var keysWorksWithArguments = $Object.keys && (function () { - // Safari 5.0 bug - return $Object.keys(arguments).length === 2; -}(1, 2)); -var keysHasArgumentsLengthBug = $Object.keys && (function () { - var argKeys = $Object.keys(arguments); - return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1; -}(1)); -var originalKeys = $Object.keys; -defineProperties($Object, { - keys: function keys(object) { - if (isArguments(object)) { - return originalKeys(arraySlice(object)); - } else { - return originalKeys(object); - } - } -}, !keysWorksWithArguments || keysHasArgumentsLengthBug); - -// -// Date -// ==== -// - -var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0; -var aNegativeTestDate = new Date(-1509842289600292); -var aPositiveTestDate = new Date(1449662400000); -var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT'; -var hasToDateStringFormatBug; -var hasToStringFormatBug; -var timeZoneOffset = aNegativeTestDate.getTimezoneOffset(); -if (timeZoneOffset < -720) { - hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875'; - hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); -} else { - hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875'; - hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString()); -} - -var originalGetFullYear = call.bind(Date.prototype.getFullYear); -var originalGetMonth = call.bind(Date.prototype.getMonth); -var originalGetDate = call.bind(Date.prototype.getDate); -var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear); -var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth); -var originalGetUTCDate = call.bind(Date.prototype.getUTCDate); -var originalGetUTCDay = call.bind(Date.prototype.getUTCDay); -var originalGetUTCHours = call.bind(Date.prototype.getUTCHours); -var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes); -var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds); -var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds); -var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; -var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; -var daysInMonth = function daysInMonth(month, year) { - return originalGetDate(new Date(year, month, 0)); -}; - -defineProperties(Date.prototype, { - getFullYear: function getFullYear() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - if (year < 0 && originalGetMonth(this) > 11) { - return year + 1; - } - return year; - }, - getMonth: function getMonth() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - var month = originalGetMonth(this); - if (year < 0 && month > 11) { - return 0; - } - return month; - }, - getDate: function getDate() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetFullYear(this); - var month = originalGetMonth(this); - var date = originalGetDate(this); - if (year < 0 && month > 11) { - if (month === 12) { - return date; - } - var days = daysInMonth(0, year + 1); - return (days - date) + 1; - } - return date; - }, - getUTCFullYear: function getUTCFullYear() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - if (year < 0 && originalGetUTCMonth(this) > 11) { - return year + 1; - } - return year; - }, - getUTCMonth: function getUTCMonth() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - var month = originalGetUTCMonth(this); - if (year < 0 && month > 11) { - return 0; - } - return month; - }, - getUTCDate: function getUTCDate() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var year = originalGetUTCFullYear(this); - var month = originalGetUTCMonth(this); - var date = originalGetUTCDate(this); - if (year < 0 && month > 11) { - if (month === 12) { - return date; - } - var days = daysInMonth(0, year + 1); - return (days - date) + 1; - } - return date; - } -}, hasNegativeMonthYearBug); - -defineProperties(Date.prototype, { - toUTCString: function toUTCString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = originalGetUTCDay(this); - var date = originalGetUTCDate(this); - var month = originalGetUTCMonth(this); - var year = originalGetUTCFullYear(this); - var hour = originalGetUTCHours(this); - var minute = originalGetUTCMinutes(this); - var second = originalGetUTCSeconds(this); - return dayName[day] + ', ' + - (date < 10 ? '0' + date : date) + ' ' + - monthName[month] + ' ' + - year + ' ' + - (hour < 10 ? '0' + hour : hour) + ':' + - (minute < 10 ? '0' + minute : minute) + ':' + - (second < 10 ? '0' + second : second) + ' GMT'; - } -}, hasNegativeMonthYearBug || hasToUTCStringFormatBug); - -// Opera 12 has `,` -defineProperties(Date.prototype, { - toDateString: function toDateString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = this.getDay(); - var date = this.getDate(); - var month = this.getMonth(); - var year = this.getFullYear(); - return dayName[day] + ' ' + - monthName[month] + ' ' + - (date < 10 ? '0' + date : date) + ' ' + - year; - } -}, hasNegativeMonthYearBug || hasToDateStringFormatBug); - -// can't use defineProperties here because of toString enumeration issue in IE <= 8 -if (hasNegativeMonthYearBug || hasToStringFormatBug) { - Date.prototype.toString = function toString() { - if (!this || !(this instanceof Date)) { - throw new TypeError('this is not a Date object.'); - } - var day = this.getDay(); - var date = this.getDate(); - var month = this.getMonth(); - var year = this.getFullYear(); - var hour = this.getHours(); - var minute = this.getMinutes(); - var second = this.getSeconds(); - var timezoneOffset = this.getTimezoneOffset(); - var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60); - var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60); - return dayName[day] + ' ' + - monthName[month] + ' ' + - (date < 10 ? '0' + date : date) + ' ' + - year + ' ' + - (hour < 10 ? '0' + hour : hour) + ':' + - (minute < 10 ? '0' + minute : minute) + ':' + - (second < 10 ? '0' + second : second) + ' GMT' + - (timezoneOffset > 0 ? '-' : '+') + - (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) + - (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset); - }; - if (supportsDescriptors) { - $Object.defineProperty(Date.prototype, 'toString', { - configurable: true, - enumerable: false, - writable: true - }); - } -} - -// ES5 15.9.5.43 -// http://es5.github.com/#x15.9.5.43 -// This function returns a String value represent the instance in time -// represented by this Date object. The format of the String is the Date Time -// string format defined in 15.9.1.15. All fields are present in the String. -// The time zone is always UTC, denoted by the suffix Z. If the time value of -// this object is not a finite Number a RangeError exception is thrown. -var negativeDate = -62198755200000; -var negativeYearString = '-000001'; -var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; -var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z'; - -var getTime = call.bind(Date.prototype.getTime); - -defineProperties(Date.prototype, { - toISOString: function toISOString() { - if (!isFinite(this) || !isFinite(getTime(this))) { - // Adope Photoshop requires the second check. - throw new RangeError('Date.prototype.toISOString called on non-finite value.'); - } - - var year = originalGetUTCFullYear(this); - - var month = originalGetUTCMonth(this); - // see https://github.com/es-shims/es5-shim/issues/111 - year += Math.floor(month / 12); - month = (month % 12 + 12) % 12; - - // the date time string format is specified in 15.9.1.15. - var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)]; - year = ( - (year < 0 ? '-' : (year > 9999 ? '+' : '')) + - strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6) - ); - - for (var i = 0; i < result.length; ++i) { - // pad months, days, hours, minutes, and seconds to have two digits. - result[i] = strSlice('00' + result[i], -2); - } - // pad milliseconds to have three digits. - return ( - year + '-' + arraySlice(result, 0, 2).join('-') + - 'T' + arraySlice(result, 2).join(':') + '.' + - strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z' - ); - } -}, hasNegativeDateBug || hasSafari51DateBug); - -// ES5 15.9.5.44 -// http://es5.github.com/#x15.9.5.44 -// This function provides a String representation of a Date object for use by -// JSON.stringify (15.12.3). -var dateToJSONIsSupported = (function () { - try { - return Date.prototype.toJSON && - new Date(NaN).toJSON() === null && - new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && - Date.prototype.toJSON.call({ // generic - toISOString: function () { return true; } - }); - } catch (e) { - return false; - } -}()); -if (!dateToJSONIsSupported) { - Date.prototype.toJSON = function toJSON(key) { - // When the toJSON method is called with argument key, the following - // steps are taken: - - // 1. Let O be the result of calling ToObject, giving it the this - // value as its argument. - // 2. Let tv be ES.ToPrimitive(O, hint Number). - var O = $Object(this); - var tv = ES.ToPrimitive(O); - // 3. If tv is a Number and is not finite, return null. - if (typeof tv === 'number' && !isFinite(tv)) { - return null; - } - // 4. Let toISO be the result of calling the [[Get]] internal method of - // O with argument "toISOString". - var toISO = O.toISOString; - // 5. If IsCallable(toISO) is false, throw a TypeError exception. - if (!isCallable(toISO)) { - throw new TypeError('toISOString property is not callable'); - } - // 6. Return the result of calling the [[Call]] internal method of - // toISO with O as the this value and an empty argument list. - return toISO.call(O); - - // NOTE 1 The argument is ignored. - - // NOTE 2 The toJSON function is intentionally generic; it does not - // require that its this value be a Date object. Therefore, it can be - // transferred to other kinds of objects for use as a method. However, - // it does require that any such object have a toISOString method. An - // object is free to use the argument key to filter its - // stringification. - }; -} - -// ES5 15.9.4.2 -// http://es5.github.com/#x15.9.4.2 -// based on work shared by Daniel Friesen (dantman) -// http://gist.github.com/303249 -var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15; -var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z')); -var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z')); -if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) { - // XXX global assignment won't work in embeddings that use - // an alternate object for the context. - /* global Date: true */ - /* eslint-disable no-undef */ - var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1; - var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime()); - /* eslint-disable no-implicit-globals */ - Date = (function (NativeDate) { - /* eslint-enable no-implicit-globals */ - /* eslint-enable no-undef */ - // Date.length === 7 - var DateShim = function Date(Y, M, D, h, m, s, ms) { - var length = arguments.length; - var date; - if (this instanceof NativeDate) { - var seconds = s; - var millis = ms; - if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) { - // work around a Safari 8/9 bug where it treats the seconds as signed - var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; - var sToShift = Math.floor(msToShift / 1e3); - seconds += sToShift; - millis -= sToShift * 1e3; - } - date = length === 1 && $String(Y) === Y ? // isString(Y) - // We explicitly pass it through parse: - new NativeDate(DateShim.parse(Y)) : - // We have to manually make calls depending on argument - // length here - length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) : - length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) : - length >= 5 ? new NativeDate(Y, M, D, h, m) : - length >= 4 ? new NativeDate(Y, M, D, h) : - length >= 3 ? new NativeDate(Y, M, D) : - length >= 2 ? new NativeDate(Y, M) : - length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) : - new NativeDate(); - } else { - date = NativeDate.apply(this, arguments); - } - if (!isPrimitive(date)) { - // Prevent mixups with unfixed Date object - defineProperties(date, { constructor: DateShim }, true); - } - return date; - }; - - // 15.9.1.15 Date Time String Format. - var isoDateExpression = new RegExp('^' + - '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign + - // 6-digit extended year - '(?:-(\\d{2})' + // optional month capture - '(?:-(\\d{2})' + // optional day capture - '(?:' + // capture hours:minutes:seconds.milliseconds - 'T(\\d{2})' + // hours capture - ':(\\d{2})' + // minutes capture - '(?:' + // optional :seconds.milliseconds - ':(\\d{2})' + // seconds capture - '(?:(\\.\\d{1,}))?' + // milliseconds capture - ')?' + - '(' + // capture UTC offset component - 'Z|' + // UTC capture - '(?:' + // offset specifier +/-hours:minutes - '([-+])' + // sign capture - '(\\d{2})' + // hours offset capture - ':(\\d{2})' + // minutes offset capture - ')' + - ')?)?)?)?' + - '$'); - - var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]; - - var dayFromMonth = function dayFromMonth(year, month) { - var t = month > 1 ? 1 : 0; - return ( - months[month] + - Math.floor((year - 1969 + t) / 4) - - Math.floor((year - 1901 + t) / 100) + - Math.floor((year - 1601 + t) / 400) + - 365 * (year - 1970) - ); - }; - - var toUTC = function toUTC(t) { - var s = 0; - var ms = t; - if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) { - // work around a Safari 8/9 bug where it treats the seconds as signed - var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit; - var sToShift = Math.floor(msToShift / 1e3); - s += sToShift; - ms -= sToShift * 1e3; - } - return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms)); - }; - - // Copy any custom methods a 3rd party library may have added - for (var key in NativeDate) { - if (owns(NativeDate, key)) { - DateShim[key] = NativeDate[key]; - } - } - - // Copy "native" methods explicitly; they may be non-enumerable - defineProperties(DateShim, { - now: NativeDate.now, - UTC: NativeDate.UTC - }, true); - DateShim.prototype = NativeDate.prototype; - defineProperties(DateShim.prototype, { - constructor: DateShim - }, true); - - // Upgrade Date.parse to handle simplified ISO 8601 strings - var parseShim = function parse(string) { - var match = isoDateExpression.exec(string); - if (match) { - // parse months, days, hours, minutes, seconds, and milliseconds - // provide default values if necessary - // parse the UTC offset component - var year = $Number(match[1]), - month = $Number(match[2] || 1) - 1, - day = $Number(match[3] || 1) - 1, - hour = $Number(match[4] || 0), - minute = $Number(match[5] || 0), - second = $Number(match[6] || 0), - millisecond = Math.floor($Number(match[7] || 0) * 1000), - // When time zone is missed, local offset should be used - // (ES 5.1 bug) - // see https://bugs.ecmascript.org/show_bug.cgi?id=112 - isLocalTime = Boolean(match[4] && !match[8]), - signOffset = match[9] === '-' ? 1 : -1, - hourOffset = $Number(match[10] || 0), - minuteOffset = $Number(match[11] || 0), - result; - var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0; - if ( - hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) && - minute < 60 && second < 60 && millisecond < 1000 && - month > -1 && month < 12 && hourOffset < 24 && - minuteOffset < 60 && // detect invalid offsets - day > -1 && - day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month)) - ) { - result = ( - (dayFromMonth(year, month) + day) * 24 + - hour + - hourOffset * signOffset - ) * 60; - result = ( - (result + minute + minuteOffset * signOffset) * 60 + - second - ) * 1000 + millisecond; - if (isLocalTime) { - result = toUTC(result); - } - if (-8.64e15 <= result && result <= 8.64e15) { - return result; - } - } - return NaN; - } - return NativeDate.parse.apply(this, arguments); - }; - defineProperties(DateShim, { parse: parseShim }); - - return DateShim; - }(Date)); - /* global Date: false */ -} - -// ES5 15.9.4.4 -// http://es5.github.com/#x15.9.4.4 -if (!Date.now) { - Date.now = function now() { - return new Date().getTime(); - }; -} - -// -// Number -// ====== -// - -// ES5.1 15.7.4.5 -// http://es5.github.com/#x15.7.4.5 -var hasToFixedBugs = NumberPrototype.toFixed && ( - (0.00008).toFixed(3) !== '0.000' || - (0.9).toFixed(0) !== '1' || - (1.255).toFixed(2) !== '1.25' || - (1000000000000000128).toFixed(0) !== '1000000000000000128' -); - -var toFixedHelpers = { - base: 1e7, - size: 6, - data: [0, 0, 0, 0, 0, 0], - multiply: function multiply(n, c) { - var i = -1; - var c2 = c; - while (++i < toFixedHelpers.size) { - c2 += n * toFixedHelpers.data[i]; - toFixedHelpers.data[i] = c2 % toFixedHelpers.base; - c2 = Math.floor(c2 / toFixedHelpers.base); - } - }, - divide: function divide(n) { - var i = toFixedHelpers.size; - var c = 0; - while (--i >= 0) { - c += toFixedHelpers.data[i]; - toFixedHelpers.data[i] = Math.floor(c / n); - c = (c % n) * toFixedHelpers.base; - } - }, - numToString: function numToString() { - var i = toFixedHelpers.size; - var s = ''; - while (--i >= 0) { - if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) { - var t = $String(toFixedHelpers.data[i]); - if (s === '') { - s = t; - } else { - s += strSlice('0000000', 0, 7 - t.length) + t; - } - } - } - return s; - }, - pow: function pow(x, n, acc) { - return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); - }, - log: function log(x) { - var n = 0; - var x2 = x; - while (x2 >= 4096) { - n += 12; - x2 /= 4096; - } - while (x2 >= 2) { - n += 1; - x2 /= 2; - } - return n; - } -}; - -var toFixedShim = function toFixed(fractionDigits) { - var f, x, s, m, e, z, j, k; - - // Test for NaN and round fractionDigits down - f = $Number(fractionDigits); - f = isActualNaN(f) ? 0 : Math.floor(f); - - if (f < 0 || f > 20) { - throw new RangeError('Number.toFixed called with invalid number of decimals'); - } - - x = $Number(this); - - if (isActualNaN(x)) { - return 'NaN'; - } - - // If it is too big or small, return the string value of the number - if (x <= -1e21 || x >= 1e21) { - return $String(x); - } - - s = ''; - - if (x < 0) { - s = '-'; - x = -x; - } - - m = '0'; - - if (x > 1e-21) { - // 1e-21 < x < 1e21 - // -70 < log2(x) < 70 - e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69; - z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1)); - z *= 0x10000000000000; // Math.pow(2, 52); - e = 52 - e; - - // -18 < e < 122 - // x = z / 2 ^ e - if (e > 0) { - toFixedHelpers.multiply(0, z); - j = f; - - while (j >= 7) { - toFixedHelpers.multiply(1e7, 0); - j -= 7; - } - - toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0); - j = e - 1; - - while (j >= 23) { - toFixedHelpers.divide(1 << 23); - j -= 23; - } - - toFixedHelpers.divide(1 << j); - toFixedHelpers.multiply(1, 1); - toFixedHelpers.divide(2); - m = toFixedHelpers.numToString(); - } else { - toFixedHelpers.multiply(0, z); - toFixedHelpers.multiply(1 << (-e), 0); - m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f); - } - } - - if (f > 0) { - k = m.length; - - if (k <= f) { - m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m; - } else { - m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f); - } - } else { - m = s + m; - } - - return m; -}; -defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs); - -var hasToPrecisionUndefinedBug = (function () { - try { - return 1.0.toPrecision(undefined) === '1'; - } catch (e) { - return true; - } -}()); -var originalToPrecision = NumberPrototype.toPrecision; -defineProperties(NumberPrototype, { - toPrecision: function toPrecision(precision) { - return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision); - } -}, hasToPrecisionUndefinedBug); - -// -// String -// ====== -// - -// ES5 15.5.4.14 -// http://es5.github.com/#x15.5.4.14 - -// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] -// Many browsers do not split properly with regular expressions or they -// do not perform the split correctly under obscure conditions. -// See http://blog.stevenlevithan.com/archives/cross-browser-split -// I've tested in many browsers and this seems to cover the deviant ones: -// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] -// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] -// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not -// [undefined, "t", undefined, "e", ...] -// ''.split(/.?/) should be [], not [""] -// '.'.split(/()()/) should be ["."], not ["", "", "."] - -if ( - 'ab'.split(/(?:ab)*/).length !== 2 || - '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === 't' || - 'test'.split(/(?:)/, -1).length !== 4 || - ''.split(/.?/).length || - '.'.split(/()()/).length > 1 -) { - (function () { - var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group - var maxSafe32BitInt = Math.pow(2, 32) - 1; - - StringPrototype.split = function (separator, limit) { - var string = String(this); - if (typeof separator === 'undefined' && limit === 0) { - return []; - } - - // If `separator` is not a regex, use native split - if (!isRegex(separator)) { - return strSplit(this, separator, limit); - } - - var output = []; - var flags = (separator.ignoreCase ? 'i' : '') + - (separator.multiline ? 'm' : '') + - (separator.unicode ? 'u' : '') + // in ES6 - (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6 - lastLastIndex = 0, - // Make `global` and avoid `lastIndex` issues by working with a copy - separator2, match, lastIndex, lastLength; - var separatorCopy = new RegExp(separator.source, flags + 'g'); - if (!compliantExecNpcg) { - // Doesn't need flags gy, but they don't hurt - separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags); - } - /* Values for `limit`, per the spec: - * If undefined: 4294967295 // maxSafe32BitInt - * If 0, Infinity, or NaN: 0 - * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; - * If negative number: 4294967296 - Math.floor(Math.abs(limit)) - * If other: Type-convert, then use the above rules - */ - var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit); - match = separatorCopy.exec(string); - while (match) { - // `separatorCopy.lastIndex` is not reliable cross-browser - lastIndex = match.index + match[0].length; - if (lastIndex > lastLastIndex) { - pushCall(output, strSlice(string, lastLastIndex, match.index)); - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1) { - /* eslint-disable no-loop-func */ - match[0].replace(separator2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (typeof arguments[i] === 'undefined') { - match[i] = void 0; - } - } - }); - /* eslint-enable no-loop-func */ - } - if (match.length > 1 && match.index < string.length) { - array_push.apply(output, arraySlice(match, 1)); - } - lastLength = match[0].length; - lastLastIndex = lastIndex; - if (output.length >= splitLimit) { - break; - } - } - if (separatorCopy.lastIndex === match.index) { - separatorCopy.lastIndex++; // Avoid an infinite loop - } - match = separatorCopy.exec(string); - } - if (lastLastIndex === string.length) { - if (lastLength || !separatorCopy.test('')) { - pushCall(output, ''); - } - } else { - pushCall(output, strSlice(string, lastLastIndex)); - } - return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output; - }; - }()); - -// [bugfix, chrome] -// If separator is undefined, then the result array contains just one String, -// which is the this value (converted to a String). If limit is not undefined, -// then the output array is truncated so that it contains no more than limit -// elements. -// "0".split(undefined, 0) -> [] -} else if ('0'.split(void 0, 0).length) { - StringPrototype.split = function split(separator, limit) { - if (typeof separator === 'undefined' && limit === 0) { return []; } - return strSplit(this, separator, limit); - }; -} - -var str_replace = StringPrototype.replace; -var replaceReportsGroupsCorrectly = (function () { - var groups = []; - 'x'.replace(/x(.)?/g, function (match, group) { - pushCall(groups, group); - }); - return groups.length === 1 && typeof groups[0] === 'undefined'; -}()); - -if (!replaceReportsGroupsCorrectly) { - StringPrototype.replace = function replace(searchValue, replaceValue) { - var isFn = isCallable(replaceValue); - var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); - if (!isFn || !hasCapturingGroups) { - return str_replace.call(this, searchValue, replaceValue); - } else { - var wrappedReplaceValue = function (match) { - var length = arguments.length; - var originalLastIndex = searchValue.lastIndex; - searchValue.lastIndex = 0; - var args = searchValue.exec(match) || []; - searchValue.lastIndex = originalLastIndex; - pushCall(args, arguments[length - 2], arguments[length - 1]); - return replaceValue.apply(this, args); - }; - return str_replace.call(this, searchValue, wrappedReplaceValue); - } - }; -} - -// ECMA-262, 3rd B.2.3 -// Not an ECMAScript standard, although ECMAScript 3rd Edition has a -// non-normative section suggesting uniform semantics and it should be -// normalized across all browsers -// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE -var string_substr = StringPrototype.substr; -var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; -defineProperties(StringPrototype, { - substr: function substr(start, length) { - var normalizedStart = start; - if (start < 0) { - normalizedStart = max(this.length + start, 0); - } - return string_substr.call(this, normalizedStart, length); - } -}, hasNegativeSubstrBug); - -// ES5 15.5.4.20 -// whitespace from: http://es5.github.io/#x15.5.4.20 -var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + - '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + - '\u2029\uFEFF'; -var zeroWidth = '\u200b'; -var wsRegexChars = '[' + ws + ']'; -var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); -var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); -var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); -defineProperties(StringPrototype, { - // http://blog.stevenlevithan.com/archives/faster-trim-javascript - // http://perfectionkills.com/whitespace-deviations/ - trim: function trim() { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); - } -}, hasTrimWhitespaceBug); -var trim = call.bind(String.prototype.trim); - -var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1; -defineProperties(StringPrototype, { - lastIndexOf: function lastIndexOf(searchString) { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - var S = $String(this); - var searchStr = $String(searchString); - var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN; - var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos); - var start = min(max(pos, 0), S.length); - var searchLen = searchStr.length; - var k = start + searchLen; - while (k > 0) { - k = max(0, k - searchLen); - var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr); - if (index !== -1) { - return k + index; - } - } - return -1; - } -}, hasLastIndexBug); - -var originalLastIndexOf = StringPrototype.lastIndexOf; -defineProperties(StringPrototype, { - lastIndexOf: function lastIndexOf(searchString) { - return originalLastIndexOf.apply(this, arguments); - } -}, StringPrototype.lastIndexOf.length !== 1); - -// ES-5 15.1.2.2 -/* eslint-disable radix */ -if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { -/* eslint-enable radix */ - /* global parseInt: true */ - parseInt = (function (origParseInt) { - var hexRegex = /^[\-+]?0[xX]/; - return function parseInt(str, radix) { - var string = trim(str); - var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10); - return origParseInt(string, defaultedRadix); - }; - }(parseInt)); -} - -// https://es5.github.io/#x15.1.2.3 -if (1 / parseFloat('-0') !== -Infinity) { - /* global parseFloat: true */ - parseFloat = (function (origParseFloat) { - return function parseFloat(string) { - var inputString = trim(string); - var result = origParseFloat(inputString); - return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result; - }; - }(parseFloat)); -} - -if (String(new RangeError('test')) !== 'RangeError: test') { - var errorToStringShim = function toString() { - if (typeof this === 'undefined' || this === null) { - throw new TypeError("can't convert " + this + ' to object'); - } - var name = this.name; - if (typeof name === 'undefined') { - name = 'Error'; - } else if (typeof name !== 'string') { - name = $String(name); - } - var msg = this.message; - if (typeof msg === 'undefined') { - msg = ''; - } else if (typeof msg !== 'string') { - msg = $String(msg); - } - if (!name) { - return msg; - } - if (!msg) { - return name; - } - return name + ': ' + msg; - }; - // can't use defineProperties here because of toString enumeration issue in IE <= 8 - Error.prototype.toString = errorToStringShim; -} - -if (supportsDescriptors) { - var ensureNonEnumerable = function (obj, prop) { - if (isEnum(obj, prop)) { - var desc = Object.getOwnPropertyDescriptor(obj, prop); - if (desc.configurable) { - desc.enumerable = false; - Object.defineProperty(obj, prop, desc); - } - } - }; - ensureNonEnumerable(Error.prototype, 'message'); - if (Error.prototype.message !== '') { - Error.prototype.message = ''; - } - ensureNonEnumerable(Error.prototype, 'name'); -} - -if (String(/a/mig) !== '/a/gim') { - var regexToString = function toString() { - var str = '/' + this.source + '/'; - if (this.global) { - str += 'g'; - } - if (this.ignoreCase) { - str += 'i'; - } - if (this.multiline) { - str += 'm'; - } - return str; - }; - // can't use defineProperties here because of toString enumeration issue in IE <= 8 - RegExp.prototype.toString = regexToString; -} - -})); diff --git a/resources/lib/html5shiv/html5shiv.js b/resources/lib/html5shiv/html5shiv.js new file mode 100644 index 0000000000..45ea723dd5 --- /dev/null +++ b/resources/lib/html5shiv/html5shiv.js @@ -0,0 +1,326 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +;(function(window, document) { +/*jshint evil:true */ + /** version */ + var version = '3.7.3'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document|DocumentFragment} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/resources/lib/jquery.ui/PATCHES b/resources/lib/jquery.ui/PATCHES index a8eba943cd..bcff2ac3b1 100644 --- a/resources/lib/jquery.ui/PATCHES +++ b/resources/lib/jquery.ui/PATCHES @@ -1,3 +1,7 @@ +jquery.ui.core.js +* I7ffbfd2e5 Avoid deprecated jQuery.expr[":"]. + + jquery.ui.draggable.js * 71e11de2a3 Fix positioning error with draggable, revert and grid. https://phabricator.wikimedia.org/T140965#2944610 @@ -9,6 +13,10 @@ jquery.ui.datepicker * 19531f3c23 Add translations in de-AT and de-CH +jquery.ui.widget.js +* I7ffbfd2e5 Avoid deprecated jQuery.expr[":"]. + + themes/smoothness/jquery.ui.theme.css * 5e772e39dd Remove dark color from links inside dialogs https://phabricator.wikimedia.org/T85857 diff --git a/resources/lib/jquery.ui/jquery.ui.core.js b/resources/lib/jquery.ui/jquery.ui.core.js index 4ef4b7610b..19f0069e25 100644 --- a/resources/lib/jquery.ui/jquery.ui.core.js +++ b/resources/lib/jquery.ui/jquery.ui.core.js @@ -157,7 +157,7 @@ function visible( element ) { }).length; } -$.extend( $.expr[ ":" ], { +$.extend( $.expr.pseudos, { data: $.expr.createPseudo ? $.expr.createPseudo(function( dataName ) { return function( elem ) { diff --git a/resources/lib/jquery.ui/jquery.ui.widget.js b/resources/lib/jquery.ui/jquery.ui.widget.js index 067476d979..4d84afcf39 100644 --- a/resources/lib/jquery.ui/jquery.ui.widget.js +++ b/resources/lib/jquery.ui/jquery.ui.widget.js @@ -36,7 +36,7 @@ $.widget = function( name, base, prototype ) { } // create selector for plugin - $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) { return !!$.data( elem, fullName ); }; diff --git a/resources/lib/jquery/jquery.migrate.js b/resources/lib/jquery/jquery.migrate.js new file mode 100644 index 0000000000..879509f996 --- /dev/null +++ b/resources/lib/jquery/jquery.migrate.js @@ -0,0 +1,542 @@ +/*! + * jQuery Migrate - v3.0.0 - 2016-06-09 + * Copyright jQuery Foundation and other contributors + */ +(function( jQuery, window ) { +"use strict"; + + +jQuery.migrateVersion = "3.0.0"; + + +( function() { + + // Support: IE9 only + // IE9 only creates console object when dev tools are first opened + // Also, avoid Function#bind here to simplify PhantomJS usage + var log = window.console && window.console.log && + function() { window.console.log.apply( window.console, arguments ); }, + rbadVersions = /^[12]\./; + + if ( !log ) { + return; + } + + // Need jQuery 3.0.0+ and no older Migrate loaded + if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) { + log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" ); + } + if ( jQuery.migrateWarnings ) { + log( "JQMIGRATE: Migrate plugin loaded multiple times" ); + } + + // Show a message on the console so devs know we're active + log( "JQMIGRATE: Migrate is installed" + + ( jQuery.migrateMute ? "" : " with logging active" ) + + ", version " + jQuery.migrateVersion ); + +} )(); + +var warnedAbout = {}; + +// List of warnings already given; public read only +jQuery.migrateWarnings = []; + +// Set to false to disable traces that appear with warnings +if ( jQuery.migrateTrace === undefined ) { + jQuery.migrateTrace = true; +} + +// Forget any warnings we've already given; public +jQuery.migrateReset = function() { + warnedAbout = {}; + jQuery.migrateWarnings.length = 0; +}; + +function migrateWarn( msg ) { + var console = window.console; + if ( !warnedAbout[ msg ] ) { + warnedAbout[ msg ] = true; + jQuery.migrateWarnings.push( msg ); + if ( console && console.warn && !jQuery.migrateMute ) { + console.warn( "JQMIGRATE: " + msg ); + if ( jQuery.migrateTrace && console.trace ) { + console.trace(); + } + } + } +} + +function migrateWarnProp( obj, prop, value, msg ) { + Object.defineProperty( obj, prop, { + configurable: true, + enumerable: true, + get: function() { + migrateWarn( msg ); + return value; + } + } ); +} + +if ( document.compatMode === "BackCompat" ) { + + // JQuery has never supported or tested Quirks Mode + migrateWarn( "jQuery is not compatible with Quirks Mode" ); +} + + +var oldInit = jQuery.fn.init, + oldIsNumeric = jQuery.isNumeric, + oldFind = jQuery.find, + rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/, + rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g; + +jQuery.fn.init = function( arg1 ) { + var args = Array.prototype.slice.call( arguments ); + + if ( typeof arg1 === "string" && arg1 === "#" ) { + + // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0 + migrateWarn( "jQuery( '#' ) is not a valid selector" ); + args[ 0 ] = []; + } + + return oldInit.apply( this, args ); +}; +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.find = function( selector ) { + var args = Array.prototype.slice.call( arguments ); + + // Support: PhantomJS 1.x + // String#match fails to match when used with a //g RegExp, only on some strings + if ( typeof selector === "string" && rattrHashTest.test( selector ) ) { + + // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0 + // First see if qS thinks it's a valid selector, if so avoid a false positive + try { + document.querySelector( selector ); + } catch ( err1 ) { + + // Didn't *look* valid to qSA, warn and try quoting what we think is the value + selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) { + return "[" + attr + op + "\"" + value + "\"]"; + } ); + + // If the regexp *may* have created an invalid selector, don't update it + // Note that there may be false alarms if selector uses jQuery extensions + try { + document.querySelector( selector ); + migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] ); + args[ 0 ] = selector; + } catch ( err2 ) { + migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] ); + } + } + } + + return oldFind.apply( this, args ); +}; + +// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML) +var findProp; +for ( findProp in oldFind ) { + if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) { + jQuery.find[ findProp ] = oldFind[ findProp ]; + } +} + +// The number of elements contained in the matched element set +jQuery.fn.size = function() { + migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" ); + return this.length; +}; + +jQuery.parseJSON = function() { + migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" ); + return JSON.parse.apply( null, arguments ); +}; + +jQuery.isNumeric = function( val ) { + + // The jQuery 2.2.3 implementation of isNumeric + function isNumeric2( obj ) { + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + } + + var newValue = oldIsNumeric( val ), + oldValue = isNumeric2( val ); + + if ( newValue !== oldValue ) { + migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" ); + } + + return oldValue; +}; + +migrateWarnProp( jQuery, "unique", jQuery.uniqueSort, + "jQuery.unique is deprecated, use jQuery.uniqueSort" ); + +// Now jQuery.expr.pseudos is the standard incantation +migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, + "jQuery.expr.filters is now jQuery.expr.pseudos" ); +migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, + "jQuery.expr[\":\"] is now jQuery.expr.pseudos" ); + + +var oldAjax = jQuery.ajax; + +jQuery.ajax = function( ) { + var jQXHR = oldAjax.apply( this, arguments ); + + // Be sure we got a jQXHR (e.g., not sync) + if ( jQXHR.promise ) { + migrateWarnProp( jQXHR, "success", jQXHR.done, + "jQXHR.success is deprecated and removed" ); + migrateWarnProp( jQXHR, "error", jQXHR.fail, + "jQXHR.error is deprecated and removed" ); + migrateWarnProp( jQXHR, "complete", jQXHR.always, + "jQXHR.complete is deprecated and removed" ); + } + + return jQXHR; +}; + + +var oldRemoveAttr = jQuery.fn.removeAttr, + oldToggleClass = jQuery.fn.toggleClass, + rmatchNonSpace = /\S+/g; + +jQuery.fn.removeAttr = function( name ) { + var self = this; + + jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) { + if ( jQuery.expr.match.bool.test( attr ) ) { + migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr ); + self.prop( attr, false ); + } + } ); + + return oldRemoveAttr.apply( this, arguments ); +}; + +jQuery.fn.toggleClass = function( state ) { + + // Only deprecating no-args or single boolean arg + if ( state !== undefined && typeof state !== "boolean" ) { + return oldToggleClass.apply( this, arguments ); + } + + migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" ); + + // Toggle entire class name of each element + return this.each( function() { + var className = this.getAttribute && this.getAttribute( "class" ) || ""; + + if ( className ) { + jQuery.data( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || state === false ? + "" : + jQuery.data( this, "__className__" ) || "" + ); + } + } ); +}; + + +var internalSwapCall = false; + +// If this version of jQuery has .swap(), don't false-alarm on internal uses +if ( jQuery.swap ) { + jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) { + var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get; + + if ( oldHook ) { + jQuery.cssHooks[ name ].get = function() { + var ret; + + internalSwapCall = true; + ret = oldHook.apply( this, arguments ); + internalSwapCall = false; + return ret; + }; + } + } ); +} + +jQuery.swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + if ( !internalSwapCall ) { + migrateWarn( "jQuery.swap() is undocumented and deprecated" ); + } + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + +var oldData = jQuery.data; + +jQuery.data = function( elem, name, value ) { + var curData; + + // If the name is transformed, look for the un-transformed name in the data object + if ( name && name !== jQuery.camelCase( name ) ) { + curData = jQuery.hasData( elem ) && oldData.call( this, elem ); + if ( curData && name in curData ) { + migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name ); + if ( arguments.length > 2 ) { + curData[ name ] = value; + } + return curData[ name ]; + } + } + + return oldData.apply( this, arguments ); +}; + +var oldTweenRun = jQuery.Tween.prototype.run; + +jQuery.Tween.prototype.run = function( percent ) { + if ( jQuery.easing[ this.easing ].length > 1 ) { + migrateWarn( + "easing function " + + "\"jQuery.easing." + this.easing.toString() + + "\" should use only first argument" + ); + + jQuery.easing[ this.easing ] = jQuery.easing[ this.easing ].bind( + jQuery.easing, + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } + + oldTweenRun.apply( this, arguments ); +}; + +var oldLoad = jQuery.fn.load, + originalFix = jQuery.event.fix; + +jQuery.event.props = []; +jQuery.event.fixHooks = {}; + +jQuery.event.fix = function( originalEvent ) { + var event, + type = originalEvent.type, + fixHook = this.fixHooks[ type ], + props = jQuery.event.props; + + if ( props.length ) { + migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() ); + while ( props.length ) { + jQuery.event.addProp( props.pop() ); + } + } + + if ( fixHook && !fixHook._migrated_ ) { + fixHook._migrated_ = true; + migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type ); + if ( ( props = fixHook.props ) && props.length ) { + while ( props.length ) { + jQuery.event.addProp( props.pop() ); + } + } + } + + event = originalFix.call( this, originalEvent ); + + return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event; +}; + +jQuery.each( [ "load", "unload", "error" ], function( _, name ) { + + jQuery.fn[ name ] = function() { + var args = Array.prototype.slice.call( arguments, 0 ); + + // If this is an ajax load() the first arg should be the string URL; + // technically this could also be the "Anything" arg of the event .load() + // which just goes to show why this dumb signature has been deprecated! + // jQuery custom builds that exclude the Ajax module justifiably die here. + if ( name === "load" && typeof args[ 0 ] === "string" ) { + return oldLoad.apply( this, args ); + } + + migrateWarn( "jQuery.fn." + name + "() is deprecated" ); + + args.splice( 0, 0, name ); + if ( arguments.length ) { + return this.on.apply( this, args ); + } + + // Use .triggerHandler here because: + // - load and unload events don't need to bubble, only applied to window or image + // - error event should not bubble to window, although it does pre-1.7 + // See http://bugs.jquery.com/ticket/11820 + this.triggerHandler.apply( this, args ); + return this; + }; + +} ); + +// Trigger "ready" event only once, on document ready +jQuery( function() { + jQuery( document ).triggerHandler( "ready" ); +} ); + +jQuery.event.special.ready = { + setup: function() { + if ( this === document ) { + migrateWarn( "'ready' event is deprecated" ); + } + } +}; + +jQuery.fn.extend( { + + bind: function( types, data, fn ) { + migrateWarn( "jQuery.fn.bind() is deprecated" ); + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + migrateWarn( "jQuery.fn.unbind() is deprecated" ); + return this.off( types, null, fn ); + }, + delegate: function( selector, types, data, fn ) { + migrateWarn( "jQuery.fn.delegate() is deprecated" ); + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + migrateWarn( "jQuery.fn.undelegate() is deprecated" ); + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); + } +} ); + + +var oldOffset = jQuery.fn.offset; + +jQuery.fn.offset = function() { + var docElem, + elem = this[ 0 ], + origin = { top: 0, left: 0 }; + + if ( !elem || !elem.nodeType ) { + migrateWarn( "jQuery.fn.offset() requires a valid DOM element" ); + return origin; + } + + docElem = ( elem.ownerDocument || document ).documentElement; + if ( !jQuery.contains( docElem, elem ) ) { + migrateWarn( "jQuery.fn.offset() requires an element connected to a document" ); + return origin; + } + + return oldOffset.apply( this, arguments ); +}; + + +var oldParam = jQuery.param; + +jQuery.param = function( data, traditional ) { + var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + + if ( traditional === undefined && ajaxTraditional ) { + + migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" ); + traditional = ajaxTraditional; + } + + return oldParam.call( this, data, traditional ); +}; + +var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack; + +jQuery.fn.andSelf = function() { + migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" ); + return oldSelf.apply( this, arguments ); +}; + + +var oldDeferred = jQuery.Deferred, + tuples = [ + + // Action, add listener, callbacks, .then handlers, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ) ] + ]; + +jQuery.Deferred = function( func ) { + var deferred = oldDeferred(), + promise = deferred.promise(); + + deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + migrateWarn( "deferred.pipe() is deprecated" ); + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // Deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + + }; + + if ( func ) { + func.call( deferred, deferred ); + } + + return deferred; +}; + +// Preserve handler of uncaught exceptions in promise chains +jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook; + + +})( jQuery, window ); diff --git a/resources/lib/jquery/jquery3.js b/resources/lib/jquery/jquery3.js new file mode 100644 index 0000000000..d2d8ca4790 --- /dev/null +++ b/resources/lib/jquery/jquery3.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting
  • ", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " - * - * @return {jQuery} - * @chainable - */ - $.fn.arrowSteps = function () { - var $steps, width, arrowWidth, $stepDiv, - $el = this, - paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right'; - - $el.addClass( 'arrowSteps' ); - $steps = $el.find( 'li' ); - - width = parseInt( 100 / $steps.length, 10 ); - $steps.css( 'width', width + '%' ); - - // Every step except the last one has an arrow pointing forward: - // at the right hand side in LTR languages, and at the left hand side in RTL. - // Also add in the padding for the calculated arrow width. - $stepDiv = $steps.filter( ':not(:last-child)' ).addClass( 'arrow' ).find( 'div' ); - - // Execute when complete page is fully loaded, including all frames, objects and images - $( window ).on( 'load', function () { - arrowWidth = parseInt( $el.outerHeight(), 10 ); - $stepDiv.css( paddingSide, arrowWidth.toString() + 'px' ); - } ); - - $el.data( 'arrowSteps', $steps ); - - return this; - }; - - /** - * Highlights the element selected by the selector. - * - * $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' ); - * // 'Guard!' is highlighted. - * - * // ... user completes the 'guard' step ... - * - * $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' ); - * // 'Turn!' is highlighted. - * - * @param {string} selector - */ - $.fn.arrowStepsHighlight = function ( selector ) { - var $previous, - $steps = this.data( 'arrowSteps' ); - $.each( $steps, function ( i, step ) { - var $step = $( step ); - if ( $step.is( selector ) ) { - if ( $previous ) { - $previous.addClass( 'tail' ); - } - $step.addClass( 'head' ); - } else { - $step.removeClass( 'head tail lasthead' ); - } - $previous = $step; - } ); - }; - - /** - * @class jQuery - * @mixins jQuery.plugin.arrowSteps - */ -}( jQuery ) ); diff --git a/resources/src/jquery/jquery.badge.js b/resources/src/jquery/jquery.badge.js index 777386612f..40b3baf0e9 100644 --- a/resources/src/jquery/jquery.badge.js +++ b/resources/src/jquery/jquery.badge.js @@ -64,8 +64,7 @@ if ( $badge.length ) { $badge .toggleClass( 'mw-badge-important', isImportant ) - .find( '.mw-badge-content' ) - .text( text ); + .find( '.mw-badge-content' ).text( text ); } else { // Otherwise, create a new badge with the specified text and style $badge = $( '
    ' ) diff --git a/resources/src/jquery/jquery.color.js b/resources/src/jquery/jquery.color.js index 70dc1057a6..847afd4e86 100644 --- a/resources/src/jquery/jquery.color.js +++ b/resources/src/jquery/jquery.color.js @@ -16,7 +16,7 @@ color = $.css( elem, attr ); // Keep going until we find an element that has color, or we hit the body - if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) { + if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) { break; } diff --git a/resources/src/jquery/jquery.colorUtil.js b/resources/src/jquery/jquery.colorUtil.js index c53ec3b147..a5b136d969 100644 --- a/resources/src/jquery/jquery.colorUtil.js +++ b/resources/src/jquery/jquery.colorUtil.js @@ -26,7 +26,7 @@ var result; // Check if we're already dealing with an array of colors - if ( color && $.isArray( color ) && color.length === 3 ) { + if ( color && Array.isArray( color ) && color.length === 3 ) { return color; } @@ -42,7 +42,7 @@ // Look for rgb(num%,num%,num%) // eslint-disable-next-line no-cond-assign - if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) ) { + if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) { return [ parseFloat( result[ 1 ] ) * 2.55, parseFloat( result[ 2 ] ) * 2.55, diff --git a/resources/src/jquery/jquery.getAttrs.js b/resources/src/jquery/jquery.getAttrs.js index 3064b42341..e00298f406 100644 --- a/resources/src/jquery/jquery.getAttrs.js +++ b/resources/src/jquery/jquery.getAttrs.js @@ -1,41 +1,37 @@ /** * @class jQuery.plugin.getAttrs */ +( function ( $ ) { + function serializeControls( controls ) { + var i, + data = {}, + len = controls.length; -function serializeControls( controls ) { - var i, - data = {}, - len = controls.length; + for ( i = 0; i < len; i++ ) { + data[ controls[ i ].name ] = controls[ i ].value; + } - for ( i = 0; i < len; i++ ) { - data[ controls[ i ].name ] = controls[ i ].value; + return data; } - return data; -} + /** + * Get the attributes of an element directy as a plain object. + * + * If there is more than one element in the collection, similar to most other jQuery getter methods, + * this will use the first element in the collection. + * + * @return {Object} + */ + $.fn.getAttrs = function () { + return serializeControls( this[ 0 ].attributes ); + }; -/** - * Get the attributes of an element directy as a plain object. - * - * If there is more than one element in the collection, similar to most other jQuery getter methods, - * this will use the first element in the collection. - * - * @return {Object} - */ -jQuery.fn.getAttrs = function () { - return serializeControls( this[ 0 ].attributes ); -}; - -/** - * Get form data as a plain object mapping form control names to their values. - * - * @return {Object} - */ -jQuery.fn.serializeObject = function () { - return serializeControls( this.serializeArray() ); -}; - -/** - * @class jQuery - * @mixins jQuery.plugin.getAttrs - */ + /** + * Get form data as a plain object mapping form control names to their values. + * + * @return {Object} + */ + $.fn.serializeObject = function () { + return serializeControls( this.serializeArray() ); + }; +}( jQuery ) ); diff --git a/resources/src/jquery/jquery.makeCollapsible.js b/resources/src/jquery/jquery.makeCollapsible.js index eef3846eb2..aa76d6dfbb 100644 --- a/resources/src/jquery/jquery.makeCollapsible.js +++ b/resources/src/jquery/jquery.makeCollapsible.js @@ -35,12 +35,6 @@ if ( $defaultToggle === undefined ) { $defaultToggle = null; } - if ( $defaultToggle !== null && !$defaultToggle.jquery ) { - // is optional (may be undefined), but if defined it must be an instance of jQuery. - // If it's not, abort right away. - // After this $defaultToggle is either null or a valid jQuery instance. - return; - } // Trigger a custom event to allow callers to hook to the collapsing/expanding, // allowing the module to be testable, and making it possible to @@ -158,12 +152,10 @@ if ( e ) { if ( e.type === 'click' && - options.linksPassthru && - $.nodeName( e.target, 'a' ) && - $( e.target ).attr( 'href' ) && - $( e.target ).attr( 'href' ) !== '#' + e.target.nodeName.toLowerCase() === 'a' && + $( e.target ).attr( 'href' ) ) { - // Don't fire if a link with href !== '#' was clicked, if requested (for premade togglers by default) + // Don't fire if a link was clicked (for premade togglers) return; } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) { // Only handle keypresses on the "Enter" or "Space" keys @@ -191,16 +183,15 @@ .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed ); } - // Toggle the text ("Show"/"Hide"), if requested (for default togglers by default) + // Toggle the text ("Show"/"Hide") within elements tagged with mw-collapsible-text if ( options.toggleText ) { collapseText = options.toggleText.collapseText; expandText = options.toggleText.expandText; - $textContainer = $toggle.find( '> a' ); - if ( !$textContainer.length ) { - $textContainer = $toggle; + $textContainer = $collapsible.find( '.mw-collapsible-text' ); + if ( $textContainer.length ) { + $textContainer.text( wasCollapsed ? collapseText : expandText ); } - $textContainer.text( wasCollapsed ? collapseText : expandText ); } // And finally toggle the element state itself @@ -242,7 +233,7 @@ this.each( function () { var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler, buildDefaultToggleLink, - premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval; + $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval; // Ensure class "mw-collapsible" is present in case .makeCollapsible() // is called on element(s) that don't have it yet. @@ -268,26 +259,20 @@ opts = $.extend( defaultOpts, options, opts ); togglingHandler( $( this ), $collapsible, e, opts ); }; + // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data). buildDefaultToggleLink = function () { - return $( '' ) + return $( '' ) + .text( collapseText ) + .wrap( '' ) + .parent() .attr( { role: 'button', tabindex: 0 } ) - .text( collapseText ) - .wrap( '' ) - .parent() - .prepend( '[' ) - .append( ']' ) - .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ); - }; - - // Default handler for clicking on premade toggles - premadeToggleHandler = function ( e, opts ) { - var defaultOpts = { toggleClasses: true, linksPassthru: true }; - opts = $.extend( defaultOpts, options, opts ); - togglingHandler( $( this ), $collapsible, e, opts ); + .prepend( '[' ) + .append( ']' ) + .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ); }; // Check if this element has a custom position for the toggle link @@ -331,7 +316,6 @@ if ( !$toggle.length ) { $toggleLink = buildDefaultToggleLink().appendTo( $caption ); } else { - actionHandler = premadeToggleHandler; $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ) .prop( 'tabIndex', 0 ); } @@ -344,7 +328,6 @@ if ( !$toggle.length ) { $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) ); } else { - actionHandler = premadeToggleHandler; $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ) .prop( 'tabIndex', 0 ); } @@ -374,7 +357,6 @@ $toggleLink = buildDefaultToggleLink(); $toggleLink.wrap( '
  • ' ).parent().prependTo( $collapsible ); } else { - actionHandler = premadeToggleHandler; $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ) .prop( 'tabIndex', 0 ); } @@ -393,7 +375,6 @@ if ( !$toggle.length ) { $toggleLink = buildDefaultToggleLink().prependTo( $collapsible ); } else { - actionHandler = premadeToggleHandler; $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler ) .prop( 'tabIndex', 0 ); } diff --git a/resources/src/jquery/jquery.mwExtension.js b/resources/src/jquery/jquery.mwExtension.js index f9675fa69c..9d970ed274 100644 --- a/resources/src/jquery/jquery.mwExtension.js +++ b/resources/src/jquery/jquery.mwExtension.js @@ -11,7 +11,7 @@ }, trimRight: function ( str ) { return str === null ? - '' : str.toString().replace( /\s+$/, '' ); + '' : str.toString().replace( /\s+$/, '' ); }, ucFirst: function ( str ) { return str.charAt( 0 ).toUpperCase() + str.slice( 1 ); @@ -45,7 +45,7 @@ return false; } for ( i = 0; i < arrThis.length; i++ ) { - if ( $.isArray( arrThis[ i ] ) ) { + if ( Array.isArray( arrThis[ i ] ) ) { if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) { return false; } @@ -118,11 +118,11 @@ return true; } }, function ( key, value ) { - mw.log.deprecate( $, key, value ); + mw.log.deprecate( $, key, value, null, '$.' + key ); } ); mw.log.deprecate( $, 'escapeRE', function ( str ) { - return str.replace( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' ); - }, 'Use mediawiki.RegExp instead.' ); + return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ); // eslint-disable-line no-useless-escape + }, 'Use mediawiki.RegExp instead.', '$.escapeRE' ); }( jQuery, mediaWiki ) ); diff --git a/resources/src/jquery/jquery.placeholder.js b/resources/src/jquery/jquery.placeholder.js index 12b0404b27..afb8837ff7 100644 --- a/resources/src/jquery/jquery.placeholder.js +++ b/resources/src/jquery/jquery.placeholder.js @@ -1,229 +1,18 @@ /*! - * HTML5 placeholder emulation for jQuery plugin - * - * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not. - * - * This is a fork from Mathias Bynens' jquery.placeholder as of this commit - * https://github.com/mathiasbynens/jquery-placeholder/blob/47f05d400e2dd16b59d144141a2cf54a9a77c502/jquery.placeholder.js - * - * @author Mathias Bynens - * @author Trevor Parscal , 2012 - * @author Krinkle , 2012 - * @author Alex Ivanov , 2013 - * @version 2.1.0 - * @license MIT + * No-op for compatibility with code from before we used + * native placeholder in all supported browsers. */ ( function ( $ ) { + var placeholder; - var isInputSupported = 'placeholder' in document.createElement( 'input' ), - isTextareaSupported = 'placeholder' in document.createElement( 'textarea' ), - prototype = $.fn, - valHooks = $.valHooks, - propHooks = $.propHooks, - hooks, - placeholder; - - function safeActiveElement() { - // Avoid IE9 `document.activeElement` of death - // https://github.com/mathiasbynens/jquery-placeholder/pull/99 - try { - return document.activeElement; - } catch ( err ) {} - } - - function args( elem ) { - // Return an object of element attributes - var newAttrs = {}, - rinlinejQuery = /^jQuery\d+$/; - $.each( elem.attributes, function ( i, attr ) { - if ( attr.specified && !rinlinejQuery.test( attr.name ) ) { - newAttrs[ attr.name ] = attr.value; - } - } ); - return newAttrs; - } - - function clearPlaceholder( event, value ) { - var input = this, - $input = $( input ); - if ( input.value === $input.attr( 'placeholder' ) && $input.hasClass( 'placeholder' ) ) { - if ( $input.data( 'placeholder-password' ) ) { - $input = $input.hide().next().show().attr( 'id', $input.removeAttr( 'id' ).data( 'placeholder-id' ) ); - // If `clearPlaceholder` was called from `$.valHooks.input.set` - if ( event === true ) { - $input[ 0 ].value = value; - return value; - } - $input.focus(); - } else { - input.value = ''; - $input.removeClass( 'placeholder' ); - if ( input === safeActiveElement() ) { - input.select(); - } - } - } - } - - function setPlaceholder() { - var $replacement, - input = this, - $input = $( input ), - id = this.id; - if ( !input.value ) { - if ( input.type === 'password' ) { - if ( !$input.data( 'placeholder-textinput' ) ) { - try { - $replacement = $input.clone().attr( { type: 'text' } ); - } catch ( e ) { - $replacement = $( '' ).attr( $.extend( args( this ), { type: 'text' } ) ); - } - $replacement - .removeAttr( 'name' ) - .data( { - 'placeholder-password': $input, - 'placeholder-id': id - } ) - .on( 'focus.placeholder drop.placeholder', clearPlaceholder ); - $input - .data( { - 'placeholder-textinput': $replacement, - 'placeholder-id': id - } ) - .before( $replacement ); - } - $input = $input.removeAttr( 'id' ).hide().prev().attr( 'id', id ).show(); - // Note: `$input[0] != input` now! - } - $input.addClass( 'placeholder' ); - $input[ 0 ].value = $input.attr( 'placeholder' ); - } else { - $input.removeClass( 'placeholder' ); - } - } - - function changePlaceholder( text ) { - var hasArgs = arguments.length, - $input = this; - if ( hasArgs ) { - if ( $input.attr( 'placeholder' ) !== text ) { - $input.prop( 'placeholder', text ); - if ( $input.hasClass( 'placeholder' ) ) { - $input[ 0 ].value = text; - } - } - } - } - - if ( isInputSupported && isTextareaSupported ) { - - placeholder = prototype.placeholder = function ( text ) { - var hasArgs = arguments.length; - - if ( hasArgs ) { - changePlaceholder.call( this, text ); - } - - return this; - }; - - placeholder.input = placeholder.textarea = true; - - } else { - - placeholder = prototype.placeholder = function ( text ) { - var $this = this, - hasArgs = arguments.length; - - if ( hasArgs ) { - changePlaceholder.call( this, text ); - } - - $this - .filter( ( isInputSupported ? 'textarea' : ':input' ) + '[placeholder]' ) - .filter( function () { - return !$( this ).data( 'placeholder-enabled' ); - } ) - .on( { - 'focus.placeholder drop.placeholder': clearPlaceholder, - 'blur.placeholder': setPlaceholder - } ) - .data( 'placeholder-enabled', true ) - .trigger( 'blur.placeholder' ); - return $this; - }; - - placeholder.input = isInputSupported; - placeholder.textarea = isTextareaSupported; - - hooks = { - get: function ( element ) { - var $element = $( element ), - $passwordInput = $element.data( 'placeholder-password' ); - if ( $passwordInput ) { - return $passwordInput[ 0 ].value; - } - - return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value; - }, - set: function ( element, value ) { - var $element = $( element ), - $passwordInput = $element.data( 'placeholder-password' ); - if ( $passwordInput ) { - $passwordInput[ 0 ].value = value; - return value; - } - - if ( !$element.data( 'placeholder-enabled' ) ) { - element.value = value; - return value; - } - if ( !value ) { - element.value = value; - // Issue #56: Setting the placeholder causes problems if the element continues to have focus. - if ( element !== safeActiveElement() ) { - // We can't use `triggerHandler` here because of dummy text/password inputs :( - setPlaceholder.call( element ); - } - } else if ( $element.hasClass( 'placeholder' ) ) { - if ( !clearPlaceholder.call( element, true, value ) ) { - element.value = value; - } - } else { - element.value = value; - } - // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363 - return $element; - } - }; - - if ( !isInputSupported ) { - valHooks.input = hooks; - propHooks.value = hooks; - } - if ( !isTextareaSupported ) { - valHooks.textarea = hooks; - propHooks.value = hooks; + placeholder = $.fn.placeholder = function ( text ) { + if ( arguments.length ) { + this.prop( 'placeholder', text ); } + return this; + }; - $( function () { - // Look for forms - $( document ).delegate( 'form', 'submit.placeholder', function () { - // Clear the placeholder values so they don't get submitted - var $inputs = $( '.placeholder', this ).each( clearPlaceholder ); - setTimeout( function () { - $inputs.each( setPlaceholder ); - }, 10 ); - } ); - } ); - - // Clear placeholder values upon page reload - $( window ).on( 'beforeunload.placeholder', function () { - $( '.placeholder' ).each( function () { - this.value = ''; - } ); - } ); + placeholder.input = placeholder.textarea = true; - } }( jQuery ) ); diff --git a/resources/src/jquery/jquery.qunit.completenessTest.js b/resources/src/jquery/jquery.qunit.completenessTest.js deleted file mode 100644 index 0aaa4ff39d..0000000000 --- a/resources/src/jquery/jquery.qunit.completenessTest.js +++ /dev/null @@ -1,306 +0,0 @@ -/** - * jQuery QUnit CompletenessTest 0.4 - * - * Tests the completeness of test suites for object oriented javascript - * libraries. Written to be used in environments with jQuery and QUnit. - * Requires jQuery 1.7.2 or higher. - * - * Built for and tested with: - * - Chrome 19 - * - Firefox 4 - * - Safari 5 - * - * @author Timo Tijhof, 2011-2012 - */ -/* eslint-env qunit */ -( function ( mw, $ ) { - 'use strict'; - - var util, - hasOwn = Object.prototype.hasOwnProperty, - log = ( window.console && window.console.log ) ? - function () { return window.console.log.apply( window.console, arguments ); } : - function () {}; - - // Simplified version of a few jQuery methods, except that they don't - // call other jQuery methods. Required to be able to run the CompletenessTest - // on jQuery itself as well. - util = { - keys: Object.keys || function ( object ) { - var key, keys = []; - for ( key in object ) { - if ( hasOwn.call( object, key ) ) { - keys.push( key ); - } - } - return keys; - }, - each: function ( object, callback ) { - var name; - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - }, - // $.type and $.isEmptyObject are safe as is, they don't call - // other $.* methods. Still need to be derefenced into `util` - // since the CompletenessTest will overload them with spies. - type: $.type, - isEmptyObject: $.isEmptyObject - }; - - /** - * CompletenessTest - * - * @constructor - * @example - * var myTester = new CompletenessTest( myLib ); - * @param {Object} masterVariable The root variable that contains all object - * members. CompletenessTest will recursively traverse objects and keep track - * of all methods. - * @param {Function} [ignoreFn] Optionally pass a function to filter out certain - * methods. Example: You may want to filter out instances of jQuery or some - * other constructor. Otherwise "missingTests" will include all methods that - * were not called from that instance. - */ - function CompletenessTest( masterVariable, ignoreFn ) { - var warn, - that = this; - - // Keep track in these objects. Keyed by strings with the - // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true. - this.injectionTracker = {}; - this.methodCallTracker = {}; - this.missingTests = {}; - - this.ignoreFn = ignoreFn === undefined ? function () { return false; } : ignoreFn; - - // Lazy limit in case something weird happends (like recurse (part of) ourself). - this.lazyLimit = 2000; - this.lazyCounter = 0; - - // Bind begin and end to QUnit. - QUnit.begin( function () { - // Suppress warnings (e.g. deprecation notices for accessing the properties) - warn = mw.log.warn; - mw.log.warn = $.noop; - - that.walkTheObject( masterVariable, null, masterVariable, [] ); - log( 'CompletenessTest/walkTheObject', that ); - - // Restore warnings - mw.log.warn = warn; - warn = undefined; - } ); - - QUnit.done( function () { - var toolbar, testResults, cntTotal, cntCalled, cntMissing; - - that.populateMissingTests(); - log( 'CompletenessTest/populateMissingTests', that ); - - cntTotal = util.keys( that.injectionTracker ).length; - cntCalled = util.keys( that.methodCallTracker ).length; - cntMissing = util.keys( that.missingTests ).length; - - function makeTestResults( blob, title, style ) { - var elOutputWrapper, elTitle, elContainer, elList, elFoot; - - elTitle = document.createElement( 'strong' ); - elTitle.textContent = title || 'Values'; - - elList = document.createElement( 'ul' ); - util.each( blob, function ( key ) { - var elItem = document.createElement( 'li' ); - elItem.textContent = key; - elList.appendChild( elItem ); - } ); - - elFoot = document.createElement( 'p' ); - elFoot.innerHTML = '— CompletenessTest'; - - elContainer = document.createElement( 'div' ); - elContainer.appendChild( elTitle ); - elContainer.appendChild( elList ); - elContainer.appendChild( elFoot ); - - elOutputWrapper = document.getElementById( 'qunit-completenesstest' ); - if ( !elOutputWrapper ) { - elOutputWrapper = document.createElement( 'div' ); - elOutputWrapper.id = 'qunit-completenesstest'; - } - elOutputWrapper.appendChild( elContainer ); - - util.each( style, function ( key, value ) { - elOutputWrapper.style[ key ] = value; - } ); - return elOutputWrapper; - } - - if ( cntMissing === 0 ) { - // Good - testResults = makeTestResults( - {}, - 'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!', - { - backgroundColor: '#D2E0E6', - color: '#366097', - paddingTop: '1em', - paddingRight: '1em', - paddingBottom: '1em', - paddingLeft: '1em' - } - ); - } else { - // Bad - testResults = makeTestResults( - that.missingTests, - 'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:', - { - backgroundColor: '#EE5757', - color: 'black', - paddingTop: '1em', - paddingRight: '1em', - paddingBottom: '1em', - paddingLeft: '1em' - } - ); - } - - toolbar = document.getElementById( 'qunit-testrunner-toolbar' ); - if ( toolbar ) { - toolbar.insertBefore( testResults, toolbar.firstChild ); - } - } ); - - return this; - } - - /* Public methods */ - CompletenessTest.fn = CompletenessTest.prototype = { - - /** - * CompletenessTest.fn.walkTheObject - * - * This function recursively walks through the given object, calling itself as it goes. - * Depending on the action it either injects our listener into the methods, or - * reads from our tracker and records which methods have not been called by the test suite. - * - * @param {Mixed} currObj The variable to check (initially an object, - * further down it could be anything). - * @param {string|null} currName Name of the given object member (Initially this is null). - * @param {Object} masterVariable Throughout our interation, always keep track of the master/root. - * Initially this is the same as currVar. - * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at - * masterVariable. Not including currName. - */ - walkTheObject: function ( currObj, currName, masterVariable, parentPathArray ) { - var key, currVal, type, - ct = this, - currPathArray = parentPathArray; - - if ( currName ) { - currPathArray.push( currName ); - currVal = currObj[ currName ]; - } else { - currName = '(root)'; - currVal = currObj; - } - - type = util.type( currVal ); - - // Hard ignores - if ( this.ignoreFn( currVal, this, currPathArray ) ) { - return; - } - - // Handle the lazy limit - this.lazyCounter++; - if ( this.lazyCounter > this.lazyLimit ) { - log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray ); - return; - } - - // Functions - if ( type === 'function' ) { - // Don't put a spy in constructor functions as it messes with - // instanceof etc. - if ( !currVal.prototype || util.isEmptyObject( currVal.prototype ) ) { - this.injectionTracker[ currPathArray.join( '.' ) ] = true; - this.injectCheck( currObj, currName, function () { - ct.methodCallTracker[ currPathArray.join( '.' ) ] = true; - } ); - } - } - - // Recursively. After all, this is the *completeness* test - // This also traverses static properties and the prototype of a constructor - if ( type === 'object' || type === 'function' ) { - for ( key in currVal ) { - if ( hasOwn.call( currVal, key ) ) { - this.walkTheObject( currVal, key, masterVariable, currPathArray.slice() ); - } - } - } - }, - - populateMissingTests: function () { - var ct = this; - util.each( ct.injectionTracker, function ( key ) { - ct.hasTest( key ); - } ); - }, - - /** - * CompletenessTest.fn.hasTest - * - * Checks if the given method name (ie. 'my.foo.bar') - * was called during the test suite (as far as the tracker knows). - * If not it adds it to missingTests. - * - * @param {string} fnName - * @return {boolean} - */ - hasTest: function ( fnName ) { - if ( !( fnName in this.methodCallTracker ) ) { - this.missingTests[ fnName ] = true; - return false; - } - return true; - }, - - /** - * CompletenessTest.fn.injectCheck - * - * Injects a function (such as a spy that updates methodCallTracker when - * it's called) inside another function. - * - * @param {Object} obj The object into which `injectFn` will be inserted - * @param {Array} key The key by which `injectFn` will be known in `obj`; if this already - * exists, a wrapper will first call `injectFn` and then the original `obj[key]` function. - * @param {Function} injectFn The function to insert - */ - injectCheck: function ( obj, key, injectFn ) { - var spy, - val = obj[ key ]; - - spy = function () { - injectFn(); - return val.apply( this, arguments ); - }; - - // Make the spy inherit from the original so that its static methods are also - // visible in the spy (e.g. when we inject a check into mw.log, mw.log.warn - // must remain accessible). - spy.__proto__ = val; - - // Objects are by reference, members (unless objects) are not. - obj[ key ] = spy; - } - }; - - /* Expose */ - window.CompletenessTest = CompletenessTest; - -}( mediaWiki, jQuery ) ); diff --git a/resources/src/jquery/jquery.suggestions.js b/resources/src/jquery/jquery.suggestions.js index fdc8a266ad..4f4edc96b5 100644 --- a/resources/src/jquery/jquery.suggestions.js +++ b/resources/src/jquery/jquery.suggestions.js @@ -19,7 +19,6 @@ * @class jQuery.plugin.suggestions */ - // jscs:disable checkParamNames /** * @method suggestions * @chainable @@ -94,9 +93,8 @@ * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the * input or not. */ - // jscs:enable checkParamNames -( function ( $ ) { +( function ( $, mw ) { var hasOwn = Object.hasOwnProperty; @@ -178,7 +176,7 @@ context.data.prevText = val; // Try cache first if ( context.config.cache && hasOwn.call( cache, val ) ) { - if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) { + if ( mw.now() - cache[ val ].timestamp < context.config.cacheMaxAge ) { context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions ); if ( typeof context.config.update.after === 'function' ) { context.config.update.after.call( context.data.$textbox, cache[ val ].metadata ); @@ -203,7 +201,7 @@ cache[ val ] = { suggestions: suggestions, metadata: metadata, - timestamp: +new Date() + timestamp: mw.now() }; } }, @@ -755,7 +753,7 @@ 27, // escape 13, // enter 46, // delete - 8 // backspace + 8 // backspace ]; if ( context.data.keypressedCount === 0 && e.which === context.data.keypressed && @@ -786,4 +784,4 @@ * @mixins jQuery.plugin.suggestions */ -}( jQuery ) ); +}( jQuery, mediaWiki ) ); diff --git a/resources/src/jquery/jquery.tablesorter.js b/resources/src/jquery/jquery.tablesorter.js index f84c091dba..922da319cf 100644 --- a/resources/src/jquery/jquery.tablesorter.js +++ b/resources/src/jquery/jquery.tablesorter.js @@ -90,6 +90,7 @@ config = $( table ).data( 'tablesorter' ).config, cellIndex, nodeValue, + nextRow = false, // Start with 1 because 0 is the fallback parser i = 1, lastRowIndex = -1, @@ -113,24 +114,34 @@ if ( nodeValue !== '' ) { if ( parsers[ i ].is( nodeValue, table ) ) { concurrent++; - rowIndex++; + nextRow = true; if ( concurrent >= needed ) { // Confirmed the parser for multiple cells, let's return it return parsers[ i ]; } + } else if ( parsers[ i ].id.match( /isoDate/ ) && /^\D*(\d{1,4}) ?(\[.+\])?$/.test( nodeValue ) ) { + // For 1-4 digits and maybe reference(s) parser "isoDate" or "number" is possible, check next row + empty++; + nextRow = true; } else { // Check next parser, reset rows i++; rowIndex = 0; concurrent = 0; empty = 0; + nextRow = false; } } else { // Empty cell empty++; + nextRow = true; + } + + if ( nextRow ) { + nextRow = false; rowIndex++; if ( rowIndex >= rows.length ) { - if ( concurrent >= rows.length - empty ) { + if ( concurrent > 0 && concurrent >= rows.length - empty ) { // Confirmed the parser for all filled cells return parsers[ i ]; } @@ -509,9 +520,14 @@ // We allow a trailing percent sign, which we just strip. This works fine // if percents and regular numbers aren't being mixed. - ts.numberRegex = new RegExp( '^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific - '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised - ')$', 'i' ); + ts.numberRegex = new RegExp( + '^(' + + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific + '|' + + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised + ')$', + 'i' + ); } function buildDateTable() { @@ -537,13 +553,23 @@ // Build RegEx // Any date formated with . , ' - or / - ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i ); + ts.dateRegex[ 0 ] = new RegExp( /^\s*(\d{1,2})[,.\-/'\s]{1,2}(\d{1,2})[,.\-/'\s]{1,2}(\d{2,4})\s*?/i ); // Written Month name, dmy - ts.dateRegex[ 1 ] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' ); + ts.dateRegex[ 1 ] = new RegExp( + '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + + regex + + ')' + + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', + 'i' + ); // Written Month name, mdy - ts.dateRegex[ 2 ] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' ); + ts.dateRegex[ 2 ] = new RegExp( + '^\\s*(' + regex + ')' + + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', + 'i' + ); } @@ -669,7 +695,7 @@ } columnToCell = []; - cellsInRow = ( $row[ 0 ].cells.length ) || 0; // all cells in this row + cellsInRow = ( $row[ 0 ].cells.length ) || 0; // all cells in this row index = 0; // real cell index in this row for ( j = 0; j < columns; index++ ) { if ( index === cellsInRow ) { @@ -710,7 +736,7 @@ } ts.rgx = { IPAddress: [ - new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/ ) + new RegExp( /^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$/ ) ], currency: [ new RegExp( /(^[£$€¥]|[£$€¥]$)/ ), @@ -721,8 +747,8 @@ new RegExp( /(https?|ftp|file):\/\// ) ], isoDate: [ - new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)([T\s]((([01]\d|2[0-3])(:?[0-5]\d)?|24:?00)?(:?([0-5]\d|60))?([.,]\d+)?)([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ), - new RegExp( /^([-+]?\d{1,4})-([01]\d)-([0-3]\d)/ ) + new RegExp( /^[^-\d]*(-?\d{1,4})-(0\d|1[0-2])(-([0-3]\d))?([T\s]([01]\d|2[0-4]):?(([0-5]\d):?(([0-5]\d|60)([.,]\d{1,3})?)?)?([zZ]|([-+])([01]\d|2[0-3]):?([0-5]\d)?)?)?/ ), + new RegExp( /^[^-\d]*(-?\d{1,4})-?(\d\d)?(-?(\d\d))?([T\s](\d\d):?((\d\d)?:?((\d\d)?([.,]\d{1,3})?)?)?([zZ]|([-+])(\d\d):?(\d\d)?)?)?/ ) ], usLongDate: [ new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/ ) @@ -1044,7 +1070,7 @@ return getParserById( id ); }, - getParsers: function () { // for table diagnosis + getParsers: function () { // for table diagnosis return parsers; } }; @@ -1130,22 +1156,36 @@ return ts.rgx.isoDate[ 0 ].test( s ); }, format: function ( s ) { - var isodate, matches; - if ( !Date.prototype.toISOString ) { - // Old browsers don't understand iso, Fallback to US date parsing and ignore the time part. - matches = $.trim( s ).match( ts.rgx.isoDate[ 1 ] ); - if ( !matches ) { - return $.tablesorter.formatFloat( 0 ); + var match, i, isodate, ms, hOffset, mOffset; + match = s.match( ts.rgx.isoDate[ 0 ] ); + if ( match === null ) { + // Otherwise a signed number with 1-4 digit is parsed as isoDate + match = s.match( ts.rgx.isoDate[ 1 ] ); + } + if ( !match ) { + return 0; + } + // Month and day + for ( i = 2; i <= 4; i += 2 ) { + if ( !match[ i ] || match[ i ].length === 0 ) { + match[ i ] = 1; } - isodate = new Date( matches[ 2 ] + '/' + matches[ 3 ] + '/' + matches[ 1 ] ); - } else { - matches = s.match( ts.rgx.isoDate[ 0 ] ); - if ( !matches ) { - return $.tablesorter.formatFloat( 0 ); + } + // Time + for ( i = 6; i <= 15; i++ ) { + if ( !match[ i ] || match[ i ].length === 0 ) { + match[ i ] = '0'; } - isodate = new Date( $.trim( matches[ 0 ] ) ); } - return $.tablesorter.formatFloat( ( isodate !== undefined ) ? isodate.getTime() : 0 ); + ms = parseFloat( match[ 11 ].replace( /,/, '.' ) ) * 1000; + hOffset = $.tablesorter.formatInt( match[ 13 ] + match[ 14 ] ); + mOffset = $.tablesorter.formatInt( match[ 13 ] + match[ 15 ] ); + + isodate = new Date( 0 ); + // Because Date constructor changes year 0-99 to 1900-1999, use setUTCFullYear() + isodate.setUTCFullYear( match[ 1 ], match[ 2 ] - 1, match[ 4 ] ); + isodate.setUTCHours( match[ 6 ] - hOffset, match[ 8 ] - mOffset, match[ 10 ], ms ); + return isodate.getTime(); }, type: 'numeric' } ); diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.js b/resources/src/mediawiki.action/mediawiki.action.edit.js index c9834f0488..68d6cbb3d0 100644 --- a/resources/src/mediawiki.action/mediawiki.action.edit.js +++ b/resources/src/mediawiki.action/mediawiki.action.edit.js @@ -17,10 +17,23 @@ */ $( function () { - var editBox, scrollTop, $editForm; + var editBox, scrollTop, $editForm, + // TODO T6714: Once this can be adjusted, read this from config. + summaryByteLimit = 255; - // Make sure edit summary does not exceed byte limit - $( '#wpSummary' ).byteLimit( 255 ); + if ( $( '#editform' ).hasClass( 'mw-editform-ooui' ) ) { + mw.loader.using( 'oojs-ui-core' ).then( function () { + var wpSummary = OO.ui.infuse( $( '#wpSummaryWidget' ) ); + + // Show a byte-counter to users with how many bytes are left for their edit summary. + // TODO: This looks a bit weird, as there is no unit in the UI, just numbers; showing + // 'bytes' confused users in testing, and showing 'chars' would be a lie. See T42035. + mw.widgets.visibleByteLimit( wpSummary, summaryByteLimit ); + } ); + } else { + // Make sure edit summary does not exceed byte limit + $( '#wpSummary' ).byteLimit( summaryByteLimit ); + } // Restore the edit box scroll state following a preview operation, // and set up a form submission handler to remember this state. diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.preview.js b/resources/src/mediawiki.action/mediawiki.action.edit.preview.js index 15d0a39584..c26d9153a2 100644 --- a/resources/src/mediawiki.action/mediawiki.action.edit.preview.js +++ b/resources/src/mediawiki.action/mediawiki.action.edit.preview.js @@ -3,12 +3,14 @@ */ ( function ( mw, $ ) { + var oojsuieditform; + /** * @ignore * @param {jQuery.Event} e */ function doLivePreview( e ) { - var isDiff, api, parseRequest, diffRequest, postData, copySelectors, section, + var isDiff, api, parseRequest, diffRequest, postData, copySelectors, section, summary, $wikiPreview, $wikiDiff, $editform, $textbox, $summary, $copyElements, $spinner, $errorBox; isDiff = ( e.target.name === 'wpDiff' ); @@ -16,7 +18,13 @@ $wikiDiff = $( '#wikiDiff' ); $editform = $( '#editform' ); $textbox = $editform.find( '#wpTextbox1' ); - $summary = $editform.find( '#wpSummary' ); + + if ( oojsuieditform ) { + summary = OO.ui.infuse( $( '#wpSummaryWidget' ) ); + } else { + $summary = $editform.find( '#wpSummary' ); + } + $spinner = $( '.mw-spinner-preview' ); $errorBox = $( '.errorbox' ); section = $editform.find( '[name="wpSection"]' ).val(); @@ -78,7 +86,7 @@ formatversion: 2, action: 'parse', title: mw.config.get( 'wgPageName' ), - summary: $summary.textSelection( 'getContents' ), + summary: oojsuieditform ? summary.getValue() : $summary.val(), prop: '' }; @@ -108,9 +116,9 @@ .revisions[ 0 ].diff.body; $wikiDiff.find( 'table.diff tbody' ).html( diffHtml ); mw.hook( 'wikipage.diff' ).fire( $wikiDiff.find( 'table.diff' ) ); - } catch ( e ) { + } catch ( err ) { // "result.blah is undefined" error, ignore - mw.log.warn( e ); + mw.log.warn( err ); } $wikiDiff.show(); } ); @@ -124,6 +132,7 @@ preview: true, sectionpreview: section !== '', disableeditsection: true, + useskin: mw.config.get( 'skin' ), uselang: mw.config.get( 'wgUserLanguage' ) } ); if ( section === 'new' ) { @@ -149,7 +158,7 @@ newList.push( $( '
    ' ) .addClass( 'mw-indicator' ) - .attr( 'id', mw.util.escapeId( 'mw-indicator-' + name ) ) + .attr( 'id', mw.util.escapeIdForAttribute( 'mw-indicator-' + name ) ) .html( indicator ) .get( 0 ), // Add a whitespace between the
    s because @@ -280,6 +289,8 @@ } $( function () { + oojsuieditform = $( '#editform' ).hasClass( 'mw-editform-ooui' ); + // Do not enable on user .js/.css pages, as there's no sane way of "previewing" // the scripts or styles without reloading the page. if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) { @@ -300,13 +311,13 @@ role: 'navigation', 'aria-labelledby': 'p-lang-label' } ) - .append( $( '

    ' ).attr( 'id', 'p-lang-label' ).text( mw.msg( 'otherlanguages' ) ) ) - .append( $( '
    ' ).addClass( 'body' ).append( '