Merge "Revert "Introduce Special:RedirectExternal""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 18 Oct 2018 17:05:10 +0000 (17:05 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 18 Oct 2018 17:05:10 +0000 (17:05 +0000)
136 files changed:
CREDITS
INSTALL
RELEASE-NOTES-1.32
RELEASE-NOTES-1.33 [new file with mode: 0644]
UPGRADE
autoload.php
docs/hooks.txt
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Revision.php
includes/ServiceWiring.php
includes/Title.php
includes/api/ApiBase.php
includes/api/ApiErrorFormatter.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiMain.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiUsageException.php
includes/api/UsageException.php [deleted file]
includes/api/i18n/ar.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ko.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changetags/ChangeTags.php
includes/diff/DifferenceEngine.php
includes/import/ImportableUploadRevisionImporter.php
includes/installer/MysqlUpdater.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/he.json
includes/installer/i18n/ko.json
includes/installer/i18n/mk.json
includes/installer/i18n/nl.json
includes/installer/i18n/pl.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseDomain.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/mail/EmailNotification.php
includes/page/Article.php
includes/page/ImagePage.php
includes/parser/Parser.php
includes/parser/ParserFactory.php
includes/parser/ParserOutput.php
includes/skins/Skin.php
includes/specials/SpecialApiHelp.php
includes/user/User.php
includes/widget/ExpiryInputWidget.php
languages/i18n/ar.json
languages/i18n/az.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/ca.json
languages/i18n/ckb.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/gcr.json
languages/i18n/hr.json
languages/i18n/ia.json
languages/i18n/io.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lv.json
languages/i18n/mnw.json
languages/i18n/nn.json
languages/i18n/pag.json
languages/i18n/pl.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sd.json
languages/i18n/shn.json
languages/i18n/sk.json
languages/i18n/sr-ec.json
languages/i18n/szl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/messages/MessagesKo.php
languages/messages/MessagesShn.php [new file with mode: 0644]
maintenance/resources/foreign-resources.yaml
maintenance/storage/checkStorage.php
maintenance/updateExtensionJsonSchema.php
resources/lib/jquery.client/LICENSE-MIT [new file with mode: 0644]
resources/lib/jquery.client/LICENSE-MIT.txt [deleted file]
resources/lib/jquery.client/jquery.client.js
resources/src/mediawiki.feedback/feedback.js
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.widgets/mw.widgets.ExpiryInputWidget.js
tests/phpunit/documentation/ReleaseNotesTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionMcrDbTest.php
tests/phpunit/includes/RevisionMcrReadNewDbTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiQueryInfoTest.php [new file with mode: 0644]
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/user/UserTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/selenium/README.md
tests/selenium/wdio.conf.js

diff --git a/CREDITS b/CREDITS
index 5e1c6ae..27ded1c 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,5 +1,5 @@
 {{int:version-credits-summary}} <!--
-MediaWiki 1.31 is a collaborative project released under the
+MediaWiki 1.32 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 
@@ -26,6 +26,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Adrian Lang
 * Ævar Arnfjörð Bjarmason
 * Aftab
+* Agabi10
 * Agbad
 * Ahmad Sherif
 * Ajayrahul P
@@ -34,6 +35,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Alejandro Mery
 * Aleksey Bekh-Ivanov
 * AlephNull
+* Alex Ezell
 * Alex Ivanov
 * Alex Shih-Han Lin
 * Alex Z.
@@ -85,6 +87,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Bagariavivek
 * Bahodir Mansurov
 * balloonguy
+* Bartek Łukawski
 * Bartosz Dziewoński
 * Base
 * Beau
@@ -175,6 +178,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * David Sn
 * Dayllan Maza
 * dcausse
+* dcot
 * dennisroczek
 * Denny Vrandecic
 * Dereckson
@@ -294,6 +298,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Jakub Vrana
 * James D. Forrester
 * James Earl Douglas
+* James Montalvo
 * Jan Berkel
 * Jan Drewniak
 * Jan Gerber
@@ -476,6 +481,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Moritz Oberhauser
 * Mormegil
 * Mr. E23
+* MR70
 * MrBlueSky
 * MrPete
 * Mukunda Modell
@@ -539,7 +545,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Pavel Selitskas
 * Pcoombe
 * Perside Rosalie
-* petarpetkovic
+* Petar Petković
 * Peter Coombe
 * Peter Gehres
 * Peter Hedenskog
@@ -568,6 +574,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * ptarjan
 * pubudu538
 * Purodha Blissenbach
+* Pwirth
 * quiddity
 * quietust
 * Quim Gil
@@ -671,6 +678,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Suriyaa Kudo
 * svip
 * Szymon Świerkosz
+* T. Bayer
 * T.D. Corell
 * tacsipacsi
 * Tarquin
@@ -687,6 +695,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * Thomas Dalton
 * Thomas Gries
 * ThomasV
+* Tim Eulitz
 * Tim Hollmann
 * Tim Landscheidt
 * Tim Laqua
diff --git a/INSTALL b/INSTALL
index d68342c..b6364e1 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -17,8 +17,8 @@ Required software:
 MediaWiki is developed and tested mainly on Unix/Linux platforms, but should
 work on Windows as well.
 
-Support for rendering mathematical formulas requires installing the Math extension,
-see https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Math
+Support for specialised content requires installing the relevant extension. For
+formulæ, see https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Math
 
 Don't forget to check the RELEASE-NOTES file...
 
@@ -67,8 +67,8 @@ available to download from the installer. Download this now, there is not a
 way (yet) to get it after you exit the installer. Place it in the main wiki
 directory, and the wiki should now be working.
 
-Once the wiki is set up, you should remove the mw-config directory (though it will
-refuse to config again if the wiki is set up).
+Once the wiki is set up, you should remove the mw-config directory (though it
+will refuse to config again if the wiki is set up).
 
 ----
 
index a63a16d..89c1f3a 100644 (file)
@@ -27,6 +27,15 @@ production.
   by default.
 * $wgGrantPermissions – A new grant group, 'editsiteconfig', is added for
   granting the above rights.
+* $wgDBDefaultGroup – A default database group for use by maintenance scripts.
+* $wgResourceLoaderEnableJSProfiler – This new configuration setting lets you
+  enable client-side profiling of JavaScript modules; it is off by default.
+* (T193868) $wgChangeTagsSchemaMigrationStage — This temporary configuration
+  setting allows sysadmins to gradually migrate the database table schema for
+  how change tags are stored.
+* (T199334) $wgTagStatisticsNewTable — This temporary configuration setting
+  allows sysadmins to enable the caching of Special:Tags via the new
+  change_tag_def table.
 
 ==== Changed configuration ====
 * $wgUseAjax – This setting, deprecated in 1.31, is now ignored.
@@ -44,6 +53,13 @@ production.
   MIGRATION_WRITE_NEW. It instead uses SCHEMA_COMPAT_WRITE_BOTH |
   SCHEMA_COMPAT_READ_OLD and SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW
   for intermediate stages of migration.
+* $wgDBTableOptions – The default table options now use the binary charset. The
+  default was already overridden in the installer-generated LocalSettings.php,
+  and so is always set to binary after the installer UI option was removed. The
+  default value is only used when the installer installs an extension.
+* $wgPopularPasswordFile — The location of the default popular passwords file
+  has been moved to be in line with other non-PHP files used by libraries and
+  classes.
 
 ==== Removed configuration ====
 * $wgEnableAPI and $wgEnableWriteAPI – These settings, deprecated in 1.31,
@@ -57,6 +73,19 @@ production.
   message `emailsender`.
 * $wgTidyConfig – The experimental Html5Internal and Html5Depurate tidy drivers
   were removed. RemexHtml, which is the default, should be used instead.
+* (T181318) The $wgStyleVersion setting and its appendage to various script and
+  style URLs in OutputPage, deprecated in 1.31, was removed.
+* (T140807) The wgResourceLoaderLESSImportPaths configuration option was removed
+  from ResourceLoader. Instead, use `@import` statements in LESS to import
+  files directly from nearby directories within the same project.
+* (T140804) The wgResourceLoaderLESSVars configuration option, deprecated
+  since 1.30, was removed. Instead, to expose variables from PHP to LESS, use
+  the ResourceLoaderModule::getLessVars() method.
+* $wgResourceLoaderValidateStaticJS – This setting, unused since MediaWiki 1.18,
+  was removed.
+* Two temporary variables for deploying the feature of filters on change lists,
+  $wgStructuredChangeFiltersShowPreference introduced in MediaWiki 1.30 and
+  $wgStructuredChangeFiltersOnWatchlist in 1.31, were removed.
 
 === New features in 1.32 ===
 * (T112474) Generalized the ResourceLoader mechanism for overriding modules
@@ -180,6 +209,10 @@ production.
 * (T198214) The 'disabletidy' parameter to action=parse has been
   deprecated; untidy output will not be supported by future wikitext
   parsers.
+* Added intestactionsdetail to action=query&prop=info to allow retrieving the
+  reasons an action is not allowed.
+* Deprecated action=query&prop=info inprop=readable in favor of
+  intestactions=read.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
@@ -191,6 +224,26 @@ production.
   * ApiFeedContributions::feedItemAuthor()
   * ApiFeedContributions::feedItemDesc()
   * ApiQueryRevisionsBase::extractRevisionInfo()
+* The following deprecated methods have been removed:
+  * ApiBase::profileIn() (deprecated in 1.25)
+  * ApiBase::profileOut() (deprecated in 1.25)
+  * ApiBase::safeProfileOut() (deprecated in 1.25)
+  * ApiBase::profileDBIn() (deprecated in 1.25)
+  * ApiBase::profileDBOut() (deprecated in 1.25)
+  * ApiBase::dieUsage() (deprecated in 1.29)
+  * ApiBase::dieUsageMsg() (deprecated in 1.29)
+  * ApiBase::dieUsageMsgOrDebug() (deprecated in 1.29)
+  * ApiBase::getErrorFromStatus() (deprecated in 1.29)
+  * ApiBase::parseMsg() (deprecated in 1.29)
+  * ApiBase::setWarning() (deprecated in 1.29)
+  * ApiPageSet::getInvalidTitles() (deprecated in 1.26)
+  * ApiQueryLogEvents::addLogParams() (deprecated in 1.25)
+  * ApiUsageException::getCodeString() (deprecated in 1.29)
+  * ApiUsageException::getMessageArray() (deprecated in 1.29)
+* Class UsageException, deprecated in 1.29, has been removed.
+* ApiErrorFormatter: Added getFormat() and newWithFormat(). In particular, you
+  can now easily test $formatter->getFormat() === 'bc', and then call
+  $formatter->newWithFormat( 'plaintext' ) to get a non-BC formatter.
 
 === Languages updated in 1.32 ===
 MediaWiki supports over 350 languages. Many localisations are updated regularly.
@@ -245,8 +298,6 @@ because of Phabricator reports.
   removed. Use mediawiki.widgets.visibleLengthLimit instead.
 * The jquery.farbtastic module, unused since 1.18, was removed.
 * The 'jquery.expandableField' module, unused since 1.22, was removed.
-* (T181318) The $wgStyleVersion setting and its appendage to various script and
-  style URLs in OutputPage, deprecated in 1.31, was removed.
 * The hooks 'PreferencesFormPreSave' and 'PreferencesGetLegend' may provide
   any HTMLForm object rather than PreferencesForm.
 * The non namespaced TimestampException class, deprecated in 1.29, was removed.
@@ -256,12 +307,6 @@ because of Phabricator reports.
   The UtfNormal\Utils class from the utfnormal library should be used instead.
 * The deprecated UTF8_ and UNICODE_ constants were removed. The class constants
   from the UtfNormal\Constants class from the utfnormal library should be used
-* (T140807) The wgResourceLoaderLESSImportPaths configuration option was removed
-  from ResourceLoader. Instead, use `@import` statements in LESS to import
-  files directly from nearby directories within the same project.
-* (T140804) The wgResourceLoaderLESSVars configuration option, deprecated
-  since 1.30, was removed. Instead, to expose variables from PHP to LESS, use
-  the ResourceLoaderModule::getLessVars() method.
 * The protected methods PHPSessionHandler::returnSuccess() and returnFailure(),
   only needed for PHP5 compatibility, have been removed. It now uses the boolean
   values `true` and `false` respectively.
@@ -305,8 +350,8 @@ because of Phabricator reports.
   a no-op function since 1.30.
 * SpecialPageFactory::resetList() is a no-op.  Call overrideMwServices()
   instead.
-* MediaWiki no longer supports a StartProfiler.php file.
-  Define $wgProfiler via LocalSettings.php instead.
+* MediaWiki no longer supports a StartProfiler.php file. Instead, you can set
+  $wgProfiler and $wgEnableProfileInfo.
 * The mw.loader.addSource() is now considered a private method, and no longer
   supports the `id, url` signature. Use the `Object` parameter instead.
 * The backwards-compatibility code in HTMLForm to add a drop-down control to an
@@ -358,6 +403,23 @@ because of Phabricator reports.
 * The hook 'UnknownAction', deprecated since 1.19, has now been removed.
 * The hook 'ParserLimitReport', deprecated since 1.22, has been removed. Use
   the hooks 'ParserLimitReportPrepare' and 'ParserLimitReportFormat' instead.
+* The following deprecated API methods have been removed:
+  * ApiBase::profileIn() (deprecated in 1.25)
+  * ApiBase::profileOut() (deprecated in 1.25)
+  * ApiBase::safeProfileOut() (deprecated in 1.25)
+  * ApiBase::profileDBIn() (deprecated in 1.25)
+  * ApiBase::profileDBOut() (deprecated in 1.25)
+  * ApiBase::dieUsage() (deprecated in 1.29)
+  * ApiBase::dieUsageMsg() (deprecated in 1.29)
+  * ApiBase::dieUsageMsgOrDebug() (deprecated in 1.29)
+  * ApiBase::getErrorFromStatus() (deprecated in 1.29)
+  * ApiBase::parseMsg() (deprecated in 1.29)
+  * ApiBase::setWarning() (deprecated in 1.29)
+  * ApiPageSet::getInvalidTitles() (deprecated in 1.26)
+  * ApiQueryLogEvents::addLogParams() (deprecated in 1.25)
+  * ApiUsageException::getCodeString() (deprecated in 1.29)
+  * ApiUsageException::getMessageArray() (deprecated in 1.29)
+* Class UsageException, deprecated in 1.29, has been removed.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -534,6 +596,8 @@ because of Phabricator reports.
 * The $wgUseKeyHeader configuration option and the
   OutputPage::getKeyHeader() method have been deprecated; the relevant
   draft IETF spec expired without becoming a standard.
+* Deprecated API action=query&prop=info inprop=readable in favor of
+  intestactions=read.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
diff --git a/RELEASE-NOTES-1.33 b/RELEASE-NOTES-1.33
new file mode 100644 (file)
index 0000000..00a6938
--- /dev/null
@@ -0,0 +1,114 @@
+== MediaWiki 1.33 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.33 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.33 ===
+
+==== New configuration ====
+* …
+
+==== Changed configuration ====
+* …
+
+==== Removed configuration ====
+* …
+
+=== New features in 1.33 ===
+* …
+
+=== External library changes in 1.33 ===
+
+==== New external libraries ====
+* …
+
+==== Changed external libraries ====
+* …
+
+==== Removed external libraries ====
+* …
+
+=== Bug fixes in 1.33 ===
+* …
+
+=== Action API changes in 1.33 ===
+* (T198913) Added 'ApiOptions' hook.
+* …
+
+=== Action API internal changes in 1.33 ===
+* …
+
+=== Languages updated in 1.33 ===
+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.
+
+* …
+
+=== Breaking changes in 1.33 ===
+* The parameteter $lang in DifferenceEngine::setTextLanguage must be of type
+  Language. Other types are deprecated since 1.32.
+* Skin::doEditSectionLink requires type Language for the parameter $lang.
+  The parameters $tooltip and $lang are mandatory. Omitting the parameters is
+  deprecated since 1.32.
+* …
+
+=== Deprecations in 1.33 ===
+* …
+
+=== Other changes in 1.33 ===
+* …
+
+== Compatibility ==
+MediaWiki 1.33 requires PHP 7.0.0 or later. Although HHVM 3.18.5 or later is
+supported, it is generally advised to use PHP 7.0.0 or later for long term
+support.
+
+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 9.2 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+1.33 has several database changes since 1.32, 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).
+
+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.32.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/UPGRADE b/UPGRADE
index 6b38b09..571b909 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -1,24 +1,23 @@
 This file provides an overview of the MediaWiki upgrade process. For help with
-specific problems, check
+specific problems, you should check:
 
-* the documentation at https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents
+* the docs at https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents ;
 * the mediawiki-l mailing list archive at
-  https://lists.wikimedia.org/pipermail/mediawiki-l/
+  https://lists.wikimedia.org/pipermail/mediawiki-l/ ; and
 * the bug tracker at https://phabricator.wikimedia.org/
 
-for information and workarounds to common issues.
+… for information and workarounds to common issues.
 
 == Overview ==
 
-Comprehensive documentation on upgrading to the latest version of the software
-is available at https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Upgrading
+We provide comprehensive documentation on upgrading to the latest version of the
+software at https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Upgrading.
 
 === Consult the release notes ===
 
 Before doing anything, stop and consult the release notes supplied with the new
 version of the software. These detail bug fixes, new features and functionality,
-and any particular points that may need to be noted during the upgrade
-procedure.
+and any particular points that may need to be noted during the upgrade process.
 
 === Backup first ===
 
@@ -27,19 +26,18 @@ you take a complete backup of your wiki database and files and verify it. While
 the upgrade scripts are somewhat robust, there is no guarantee that things will
 not fail, leaving the database in an inconsistent state.
 
-https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Backing_up_a_wiki provides an overview of
-the backup process. You should also refer to the documentation for your
-database management system for information on backing up a database, and to
+https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Backing_up_a_wiki is an
+overview of the backup process. You should also refer to the documentation for
+your database management system for information on backing up a database, and to
 your operating system documentation for information on making copies of files.
 
 === Perform the file upgrade ===
 
-Download the files for the new version of the software. These are available
-as a compressed "tar" archive from the Wikimedia Download Service
+Download the files for the new version of the software. These are available as a
+compressed "tar" archive from the Wikimedia Download Service
 (https://releases.wikimedia.org/mediawiki/).
 
-You can also obtain the new files directly from our Git source code
-repository.
+You can also obtain the new files directly from our Git source code repository.
 
 Replace the existing MediaWiki files with the new. You should preserve the
 LocalSettings.php file and the "extensions" and "images" directories.
@@ -50,15 +48,15 @@ deleted file archives, and any custom skins.
 
 === Perform the database upgrade ===
 
-As of 1.21, it is possible to separate schema changes (i.e. adding,
-dropping, or changing tables, fields, or indices) from all other
-database changes (e.g. populating fields).  If you need this
-capability, see "From the command line" below.
+As of 1.21, it is possible to separate schema changes (i.e. adding, dropping, or
+changing tables, fields, or indices) from all other database changes (e.g.
+populating fields). If you need this capability, see "From the command line"
+below.
 
-==== From the web ====
+==== From the Web ====
 
-If you browse to the web-based installation script (usually at
-/mw-config/index.php) from your wiki installation you can follow the script and
+If you browse to the Web-based installation script (usually at
+./mw-config/index.php) from your wiki installation you can follow the script and
 upgrade your database in place.
 
 ==== From the command line ====
@@ -68,19 +66,19 @@ update.php script to check and update the schema. This will insert missing
 tables, update existing tables, and move data around as needed. In most cases,
 this is successful and nothing further needs to be done.
 
-If you need to separate out the schema changes so they can be run
-by someone with more privileges, then you can use the --schema option
-to produce a text file with the necessary commands.  You can use
---schema, --noschema, $wgAllowSchemaUpdates as well as proper database
-permissions to enforce this separation.
+If you need to separate out the schema changes so they can be run by someone
+with more privileges, then you can use the --schema option to produce a text
+file with the necessary commands. You can use --schema, --noschema,
+$wgAllowSchemaUpdates as well as proper database permissions to enforce this
+separation.
 
 === Check configuration settings ===
 
-The names of configuration variables, and their default values and purposes,
-can change between release branches, e.g. $wgDisableUploads in 1.4 is replaced
-with $wgEnableUploads in later versions. When upgrading, consult the release
-notes to check for configuration changes which would alter the expected
-behavior of MediaWiki.
+The names of configuration variables, and their default values and purposes, can
+change between release branches, e.g. $wgDisableUploads in 1.4 is replaced with
+$wgEnableUploads in later versions. When upgrading, consult the release notes to
+check for configuration changes which would alter the expected behavior of
+MediaWiki.
 
 === Check installed extensions ===
 
@@ -94,48 +92,48 @@ LocalSettings.php
 
 It makes sense to test your wiki immediately following any kind of maintenance
 procedure, and especially after upgrading; check that page views and edits work
-normally and that special pages continue to function, etc. and correct errors
+normally, that special pages continue to function, etc., and correct any errors
 and quirks which reveal themselves.
 
 You should also test any extensions, and upgrade these if necessary.
 
 == Upgrading from 1.16 or earlier ==
 
-If you have a Chinese or Japanese wiki ($wgLanguageCode is set to one
-of "zh", "ja", or "yue") and you are using MySQL fulltext search, you
-will probably want to update the search index.
+If you have a Chinese or Japanese wiki ($wgLanguageCode is set to one of "zh",
+"ja", or "yue") and you are using MySQL fulltext search, you will probably want
+to update the search index.
 
-In the "maintenance" directory, run the updateDoubleWidthSearch.php
-script.  This will update the searchindex table for those pages that
-contain double-byte Latin characters.
+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.
+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
-in the database; 'MediaWiki:'-namespace pages that do not exist in the
-database are simply transparently filled-in on demand.
+MediaWiki 1.9 and later no longer keep default localized message text in the
+database; 'MediaWiki:'-namespace pages that do not exist in the database are
+simply transparently filled-in on demand.
 
-The upgrade process will delete any 'MediaWiki:' pages which are left
-in the default state (last edited by 'MediaWiki default'). This may
-take a few moments, similar to the old initial setup.
+The upgrade process will delete any 'MediaWiki:' pages which are left in the
+default state (last edited by 'MediaWiki default'). This may take a few moments,
+similar to the old initial setup.
 
-Note that the large number of deletions may cause older edits to expire
-from the list on Special:Recentchanges, although the deletions themselves
-will be hidden by default. (Click "show bot edits" to list them.)
+Note that the large number of deletions may cause older edits to expire from the
+list on Special:Recentchanges, although the deletions themselves will be hidden
+by default. (Click "show bot edits" to list them.)
 
 See RELEASE-NOTES for more details about new and changed options.
 
 == Upgrading from 1.7 or earlier ==
 
-$wgDefaultUserOptions now contains all the defaults, not only overrides.
-If you're setting this as a complete array(), you may need to change it
-to set only specific items as recommended in DefaultSettings.php.
+$wgDefaultUserOptions now contains all the defaults, not only overrides. If you
+are setting this as a complete array(), you may need to change it to set only
+specific items as recommended in DefaultSettings.php.
 
 == Upgrading from 1.6 or earlier ==
 
@@ -146,58 +144,56 @@ 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
-has not been fully tested for all conditions, and might well break.
+Major changes have been made to the schema from 1.4.x. The updater has not been
+fully tested for all conditions, and might well break.
 
-On a large site, the schema update might take a long time. It might
-explode, or leave your database half-done or otherwise badly hurting.
+On a large site, the schema update might take a long time. It might explode, or
+leave your database half-done or otherwise badly hurting.
 
-Among other changes, note that Latin-1 encoding (ISO-8859-1) is
-no longer supported. Latin-1 wikis will need to be upgraded to
-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.
+Among other changes, note that Latin-1 encoding (ISO-8859-1) is no longer
+supported. Latin-1 wikis will need to be upgraded to 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 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.
+    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.
 
-If you absolutely cannot make the UTF-8 upgrade work, you can try
-doing it by hand: dump your old database, convert the dump file
-using iconv as described here:
-http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
-and then reimport it. You can also convert filenames using convmv,
-but note that the old directory hashes will no longer be valid,
-so you will also have to move them to new destinations.
+If you absolutely cannot make the UTF-8 upgrade work, you can try doing it by
+hand: dump your old database, convert the dump file using iconv as described
+here: http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
+and then re-import it. You can also convert filenames using convmv, but note
+that the old directory hashes will no longer be valid, so you will also have to
+move them to new destinations.
 
 Message changes:
-* A number of additional UI messages have been changed from HTML to
-  wikitext, and will need to be manually fixed if customized.
+* A number of additional UI messages have been changed from HTML to wikitext,
+  and will need to be manually fixed if customized.
 
 === Configuration changes from 1.4.x: ===
 
 $wgDisableUploads has been replaced with $wgEnableUploads.
 
-$wgWhitelistAccount has been replaced by the 'createaccount' permission
-key in $wgGroupPermissions. To emulate the old effect of setting:
+$wgWhitelistAccount has been replaced by the 'createaccount' permission key in
+$wgGroupPermissions. To emulate the old effect of setting:
   $wgWhitelistAccount['user'] = 0;
 set:
   $wgGroupPermissions['*']['createaccount'] = false;
 
-$wgWhitelistEdit has been replaced by the 'edit' permission key.
-To emulate the old effect of setting:
+$wgWhitelistEdit has been replaced by the 'edit' permission key. To emulate the
+old effect of setting:
   $wgWhitelistEdit = true;
 set:
   $wgGroupPermissions['*']['edit'] = false;
 
-If $wgWhitelistRead is set, you must also disable the 'read' permission
-for it to take affect on anonymous users:
+If $wgWhitelistRead is set, you must also disable the 'read' permission for it
+to take affect on anonymous users:
   $wgWhitelistRead = array( "Main Page", "Special:Userlogin" );
   $wgGroupPermissions['*']['read'] = false;
 
-Note that you can disable/enable several other permissions by modifying
-this configuration array in your LocalSettings.php; see DefaultSettings.php
-for the complete default permission set.
+Note that you can disable/enable several other permissions by modifying this
+configuration array in your LocalSettings.php; see DefaultSettings.php for the
+complete default permission set.
 
 If using Memcached, you must enabled it differently now:
   $wgUseMemCached = true;
@@ -206,35 +202,31 @@ should be replaced with:
 
 == Upgrading from 1.4.2 or earlier ==
 
-1.4.3 has added new fields to the sitestats table. These fields are
-optional and help to speed Special:Statistics on large sites. If you
-choose not to run the database upgrades, everything will continue to
-work in 1.4.3.
+1.4.3 has added new fields to the sitestats table. These fields are optional and
+help to speed Special:Statistics on large sites. If you choose not to run the
+database upgrades, everything will continue to work in 1.4.3.
 
-You can apply the update by running maintenance/update.php, or
-manually run the SQL commands from this file:
+You can apply the update by running maintenance/update.php, or manually run the
+SQL commands from this file:
   maintenance/archives/patch-ss_total_articles.sql
 
-
 == Upgrading from 1.4rc1 or earlier betas ==
 
-The logging table has been altered from 1.4beta4 to 1.4beta5
-and again in 1.4.0 final. Copy in the new files and use the web
-installer to upgrade, or the command-line maintenance/update.php.
-
-If you cannot use the automated installers/updaters, you may
-update the table by manually running the SQL commands in these
-files:
-   maintenance/archives/patch-log_params.sql
-   maintenance/archives/patch-logging-title.sql
+The logging table has been altered from 1.4beta4 to 1.4beta5 and again in 1.4.0
+final. Copy in the new files and use the Web installer to upgrade, or the
+command-line maintenance/update.php.
 
+If you cannot use the automated installers/updaters, you may update the table by
+manually running the SQL commands in these files:
+  maintenance/archives/patch-log_params.sql
+  maintenance/archives/patch-logging-title.sql
 
 == Upgrading from 1.3 or earlier ==
 
 This should generally go smoothly.
 
-If you keep your LocalSettings.php, you may need to change the style paths
-to match the newly rearranged skin modules. Change these lines:
+If you keep your LocalSettings.php, you may need to change the style paths to
+match the newly rearranged skin modules. Change these lines:
   $wgStylePath        = "$wgScriptPath/stylesheets";
   $wgStyleDirectory   = "$IP/stylesheets";
   $wgLogo             = "$wgStylePath/images/wiki.png";
@@ -244,9 +236,9 @@ to this:
   $wgStyleDirectory   = "$IP/skins";
   $wgLogo             = "$wgStylePath/common/images/wiki.png";
 
-As well as new messages, the processing of some messages has changed.
-If you have customized them, please compare the new format using
-Special:Allmessages or the relevant LanguageXX.php files:
+As well as new messages, the processing of some messages has changed. If you
+have customized them, please compare the new format using Special:Allmessages or
+the relevant LanguageXX.php files:
 
 * copyrightwarning
 * dberrortext
@@ -262,45 +254,42 @@ Special:Allmessages or the relevant LanguageXX.php files:
 * showhideminor
 * unprotectedarticle
 
-Note that the 1.3 beta releases included a potential vulnerability if PHP
-is configured with register_globals on and the includes directory is
-served to the web. For general safety, turn register_globals *off* if you
-don't _really_ need it for another package.
-
-If your hosting provider turns it on and you can't turn it off yourself,
-send them a kind note explaining that it can expose their servers and their
-customers to attacks.
+Note that the 1.3 beta releases included a potential vulnerability if PHP is
+configured with register_globals on and the includes directory is served to the
+Web. For general safety, turn register_globals *off* if you don't _really_ need
+it for another package.
 
+If your hosting provider turns it on and you can't turn it off yourself, send
+them a kind note explaining that it can expose their servers and their customers
+to attacks.
 
 == Upgrading from 1.2 or earlier ==
 
-If you've been using the MediaWiki: namespace for custom page templates,
-note that things are a little different. The Template: namespace has been
-added which is more powerful -- templates can include parameters for
-instance.
-
-If you were using custom MediaWiki: entries for text inclusions, they
-will *not* automatically be moved to Template: entries at upgrade time.
-Be sure to go through and check that everything is working properly;
-you can move them manually or you can try using moveCustomMessages.php
-in maintenance/archives to do it automatically, but this might break things.
+If you've been using the MediaWiki: namespace for custom page templates, note
+that things are a little different. The Template: namespace has been added which
+is more powerful -- templates can include parameters for instance.
 
-Also, be sure to pick the correct character encoding -- some languages were
-only available in Latin-1 on 1.2.x and are now available for Unicode as well.
-If you want to upgrade an existing wiki from Latin-1 to Unicode you'll have
-to dump the database to SQL, run it through iconv or another conversion tool,
-and restore it. Sorry.
+If you were using custom MediaWiki: entries for text inclusions, they will *not*
+automatically be moved to Template: entries at upgrade time. Be sure to go
+through and check that everything is working properly; you can move them
+manually or you can try using moveCustomMessages.php in maintenance/archives to
+do it automatically, but this might break things.
 
+Also, be sure to pick the correct character encoding -- some languages were only
+available in Latin-1 on 1.2.x and are now available for Unicode as well. If you
+want to upgrade an existing wiki from Latin-1 to Unicode you'll have to dump the
+database to SQL, run it through iconv or another conversion tool, and restore
+it. Sorry.
 
 == Upgrading from 1.1 or earlier ==
 
 This is less thoroughly tested, but should work.
 
-You need to specify the *admin* database username and password to the
-installer in order for it to successfully upgrade the database structure.
-You may wish to manually change the GRANTs later.
+You need to specify the *admin* database username and password to the installer
+in order for it to successfully upgrade the database structure. You may wish to
+manually change the GRANTs later.
 
-If you have a very old database (earlier than organized MediaWiki releases
-in late August 2003) you may need to manually run some of the update SQL
-scripts in maintenance/archives before the installer is able to pick up
-with remaining updates.
+If you have a very old database (earlier than organized MediaWiki releases in
+late August 2003) you may need to manually run some of the update SQL scripts in
+maintenance/archives before the installer is able to pick up with remaining
+updates.
index 0f92ccb..3e6b4a2 100644 (file)
@@ -1536,7 +1536,6 @@ $wgAutoloadLocalClasses = [
        'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UppercaseCollation' => __DIR__ . '/includes/collation/UppercaseCollation.php',
-       'UsageException' => __DIR__ . '/includes/api/UsageException.php',
        'User' => __DIR__ . '/includes/user/User.php',
        'UserArray' => __DIR__ . '/includes/user/UserArray.php',
        'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
index fd7b300..90b2b05 100644 (file)
@@ -473,6 +473,15 @@ can alter or append to the array.
       (url), 'width', 'height', 'alt', 'align'.
     - url: Url for the given title.
 
+'ApiOptions': Called by action=options before applying changes to user
+preferences.
+$apiModule: Calling ApiOptions object
+$user: User object whose preferences are being changed
+$changes: Associative array of preference name => value
+$resetKinds: Array of strings specifying which options kinds to reset.
+  See User::resetOptions() and User::getOptionKinds() for possible
+  values.
+
 'ApiParseMakeOutputPage': Called when preparing the OutputPage object for
 ApiParse. This is mainly intended for calling OutputPage::addContentOverride()
 or OutputPage::addContentOverrideCallback().
index 6a1ed92..15d2627 100644 (file)
@@ -71,7 +71,7 @@ $wgConfigRegistry = [
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.32.0-alpha';
+$wgVersion = '1.33.0-alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -9001,15 +9001,6 @@ $wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_
  */
 $wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_OLD;
 
-/**
- * Temporary option to disable the date picker from the Expiry Widget.
- *
- * @since 1.32
- * @deprecated 1.32
- * @var bool
- */
-$wgExpiryWidgetNoDatePicker = false;
-
 /**
  * change_tag table schema migration stage.
  *
index b536e69..4531b54 100644 (file)
@@ -2847,15 +2847,19 @@ function wfGetNull() {
 function wfWaitForSlaves(
        $ifWritesSince = null, $wiki = false, $cluster = false, $timeout = null
 ) {
+       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
        if ( $cluster === '*' ) {
                $cluster = false;
-               $wiki = false;
+               $domain = false;
        } elseif ( $wiki === false ) {
-               $wiki = wfWikiID();
+               $domain = $lbFactory->getLocalDomainID();
+       } else {
+               $domain = $wiki;
        }
 
        $opts = [
-               'wiki' => $wiki,
+               'domain' => $domain,
                'cluster' => $cluster,
                // B/C: first argument used to be "max seconds of lag"; ignore such values
                'ifWritesSince' => ( $ifWritesSince > 1e9 ) ? $ifWritesSince : null
@@ -2864,7 +2868,6 @@ function wfWaitForSlaves(
                $opts['timeout'] = $timeout;
        }
 
-       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
        return $lbFactory->waitForReplication( $opts );
 }
 
index cde92e8..a5f5fab 100644 (file)
@@ -1793,6 +1793,29 @@ class OutputPage extends ContextSource {
                $this->addWikiTextTitleInternal( $text, $title, $linestart, /*tidy*/true, /*interface*/true );
        }
 
+       /**
+        * Convert wikitext *in the user interface language* to HTML and
+        * add it to the buffer with a `<div class="$wrapperClass">`
+        * wrapper.  The result will not be language-converted, as user
+        * interface messages as already localized into a specific
+        * variant.  The $text will be parsed in start-of-line context.
+        * Output will be tidy.
+        *
+        * @param string $wrapperClass The class attribute value for the <div>
+        *   wrapper in the output HTML
+        * @param string $text Wikitext in the user interface language
+        * @since 1.32
+        */
+       public function wrapWikiTextAsInterface(
+               $wrapperClass, $text
+       ) {
+               $this->addWikiTextTitleInternal(
+                       $text, $this->getTitle(),
+                       /*linestart*/true, /*tidy*/true, /*interface*/true,
+                       $wrapperClass
+               );
+       }
+
        /**
         * Convert wikitext *in the page content language* to HTML and add
         * it to the buffer.  The result with be language-converted to the
@@ -1904,10 +1927,12 @@ class OutputPage extends ContextSource {
         *             since 1.32; all wikitext should be tidied.
         * @param bool $interface Whether it is an interface message
         *   (for example disables conversion)
+        * @param string $wrapperClass if not empty, wraps the output in
+        *   a `<div class="$wrapperClass">`
         * @private
         */
        private function addWikiTextTitleInternal(
-               $text, Title $title, $linestart, $tidy, $interface
+               $text, Title $title, $linestart, $tidy, $interface, $wrapperClass = null
        ) {
                global $wgParser;
 
@@ -1924,7 +1949,7 @@ class OutputPage extends ContextSource {
 
                $this->addParserOutput( $parserOutput, [
                        'enableSectionEditLinks' => false,
-                       'wrapperDivClass' => '',
+                       'wrapperDivClass' => $wrapperClass ?? '',
                ] );
        }
 
index c49318b..66fa9bd 100644 (file)
@@ -28,7 +28,7 @@
  */
 class PHPVersionCheck {
        /* @var string The number of the MediaWiki version used */
-       var $mwVersion = '1.32';
+       var $mwVersion = '1.33';
        var $functionsExtensionsMapping = array(
                'mb_substr'   => 'mbstring',
                'xml_parser_create' => 'xml',
index e8fe8bd..6d1812a 100644 (file)
@@ -61,8 +61,13 @@ class Revision implements IDBAccessObject {
        /**
         * @return RevisionStore
         */
-       protected static function getRevisionStore() {
-               return MediaWikiServices::getInstance()->getRevisionStore();
+       protected static function getRevisionStore( $wiki = false ) {
+               if ( $wiki ) {
+                       return MediaWikiServices::getInstance()->getRevisionStoreFactory()
+                               ->getRevisionStore( $wiki );
+               } else {
+                       return MediaWikiServices::getInstance()->getRevisionStore();
+               }
        }
 
        /**
@@ -1036,10 +1041,17 @@ class Revision implements IDBAccessObject {
        /**
         * Get revision text associated with an old or archive row
         *
-        * Both the flags and the text field must be included. Including the old_id
+        * If the text field is not included, this uses RevisionStore to load the appropriate slot
+        * and return its serialized content. This is the default backwards-compatibility behavior
+        * when reading from the MCR aware database schema is enabled. For this to work, either
+        * the revision ID or the page ID must be included in the row.
+        *
+        * When using the old text field, the flags field must also be set. Including the old_id
         * field will activate cache usage as long as the $wiki parameter is not set.
         *
-        * @param stdClass $row The text data
+        * @deprecated since 1.32, use RevisionStore::newRevisionFromRow instead.
+        *
+        * @param stdClass $row The text data. If a falsy value is passed instead, false is returned.
         * @param string $prefix Table prefix (default 'old_')
         * @param string|bool $wiki The name of the wiki to load the revision text from
         *   (same as the wiki $row was loaded from) or false to indicate the local
@@ -1048,19 +1060,51 @@ class Revision implements IDBAccessObject {
         * @return string|false Text the text requested or false on failure
         */
        public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+
+               if ( !$row ) {
+                       return false;
+               }
+
                $textField = $prefix . 'text';
                $flagsField = $prefix . 'flags';
 
-               if ( isset( $row->$flagsField ) ) {
-                       $flags = explode( ',', $row->$flagsField );
+               if ( isset( $row->$textField ) ) {
+                       if ( !( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD ) ) {
+                               // The text field was read, but it's no longer being populated!
+                               // We could gloss over this by using the text when it's there and loading
+                               // if when it's not, but it seems preferable to complain loudly about a
+                               // query that is no longer guaranteed to work reliably.
+                               throw new LogicException(
+                                       'Cannot use ' . __METHOD__ . ' with the ' . $textField . ' field when'
+                                       . ' $wgMultiContentRevisionSchemaMigrationStage does not include'
+                                       . ' SCHEMA_COMPAT_WRITE_OLD. The field may not be populated for all revisions!'
+                               );
+                       }
+
+                       $text = $row->$textField;
                } else {
-                       $flags = [];
+                       // Missing text field, we are probably looking at the MCR-enabled DB schema.
+
+                       if ( !( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD ) ) {
+                               // This method should no longer be used with the new schema. Ideally, we
+                               // would already trigger a deprecation warning when SCHEMA_COMPAT_READ_NEW is set.
+                               wfDeprecated( __METHOD__ . ' (MCR without SCHEMA_COMPAT_WRITE_OLD)', '1.32' );
+                       }
+
+                       $store = self::getRevisionStore( $wiki );
+                       $rev = $prefix === 'ar_'
+                               ? $store->newRevisionFromArchiveRow( $row )
+                               : $store->newRevisionFromRow( $row );
+
+                       $content = $rev->getContent( SlotRecord::MAIN );
+                       return $content ? $content->serialize() : false;
                }
 
-               if ( isset( $row->$textField ) ) {
-                       $text = $row->$textField;
+               if ( isset( $row->$flagsField ) ) {
+                       $flags = explode( ',', $row->$flagsField );
                } else {
-                       return false;
+                       $flags = [];
                }
 
                $cacheKey = isset( $row->old_id )
index ed203ad..a1be225 100644 (file)
@@ -361,7 +361,8 @@ return [
                        $services->getMagicWordFactory(),
                        $services->getContentLanguage(),
                        wfUrlProtocols(),
-                       $services->getSpecialPageFactory()
+                       $services->getSpecialPageFactory(),
+                       $services->getMainConfig()
                );
        },
 
index de551b4..51d8b13 100644 (file)
@@ -4846,8 +4846,9 @@ class Title implements LinkTarget {
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->onTransactionPreCommitOrIdle(
-                       function () {
-                               ResourceLoaderWikiModule::invalidateModuleCache( $this, null, null, wfWikiID() );
+                       function () use ( $dbw ) {
+                               ResourceLoaderWikiModule::invalidateModuleCache(
+                                       $this, null, null, $dbw->getDomainId() );
                        },
                        __METHOD__
                );
index c2e37e0..bb86536 100644 (file)
@@ -1872,6 +1872,16 @@ abstract class ApiBase extends ContextSource {
                return $status;
        }
 
+       /**
+        * Call wfTransactionalTimeLimit() if this request was POSTed
+        * @since 1.26
+        */
+       protected function useTransactionalTimeLimit() {
+               if ( $this->getRequest()->wasPosted() ) {
+                       wfTransactionalTimeLimit();
+               }
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -2671,352 +2681,6 @@ abstract class ApiBase extends ContextSource {
                return false;
        }
 
-       /**
-        * @deprecated since 1.25
-        */
-       public function profileIn() {
-               wfDeprecated( __METHOD__, '1.25' );
-       }
-
-       /**
-        * @deprecated since 1.25
-        */
-       public function profileOut() {
-               wfDeprecated( __METHOD__, '1.25' );
-       }
-
-       /**
-        * @deprecated since 1.25
-        */
-       public function safeProfileOut() {
-               wfDeprecated( __METHOD__, '1.25' );
-       }
-
-       /**
-        * @deprecated since 1.25
-        */
-       public function profileDBIn() {
-               wfDeprecated( __METHOD__, '1.25' );
-       }
-
-       /**
-        * @deprecated since 1.25
-        */
-       public function profileDBOut() {
-               wfDeprecated( __METHOD__, '1.25' );
-       }
-
-       /**
-        * Call wfTransactionalTimeLimit() if this request was POSTed
-        * @since 1.26
-        */
-       protected function useTransactionalTimeLimit() {
-               if ( $this->getRequest()->wasPosted() ) {
-                       wfTransactionalTimeLimit();
-               }
-       }
-
-       /**
-        * @deprecated since 1.29, use ApiBase::addWarning() instead
-        * @param string $warning Warning message
-        */
-       public function setWarning( $warning ) {
-               wfDeprecated( __METHOD__, '1.29' );
-               $msg = new ApiRawMessage( $warning, 'warning' );
-               $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg );
-       }
-
-       /**
-        * Throw an ApiUsageException, which will (if uncaught) call the main module's
-        * error handler and die with an error message.
-        *
-        * @deprecated since 1.29, use self::dieWithError() instead
-        * @param string $description One-line human-readable description of the
-        *   error condition, e.g., "The API requires a valid action parameter"
-        * @param string $errorCode Brief, arbitrary, stable string to allow easy
-        *   automated identification of the error, e.g., 'unknown_action'
-        * @param int $httpRespCode HTTP response code
-        * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
-        * @throws ApiUsageException always
-        */
-       public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
-               wfDeprecated( __METHOD__, '1.29' );
-               $this->dieWithError(
-                       new RawMessage( '$1', [ $description ] ),
-                       $errorCode,
-                       $extradata,
-                       $httpRespCode
-               );
-       }
-
-       /**
-        * Get error (as code, string) from a Status object.
-        *
-        * @since 1.23
-        * @deprecated since 1.29, use ApiErrorFormatter::arrayFromStatus instead
-        * @param Status $status
-        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
-        * @return array Array of code and error string
-        * @throws MWException
-        */
-       public function getErrorFromStatus( $status, &$extraData = null ) {
-               wfDeprecated( __METHOD__, '1.29' );
-               if ( $status->isGood() ) {
-                       throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
-               }
-
-               $errors = $status->getErrorsByType( 'error' );
-               if ( !$errors ) {
-                       // No errors? Assume the warnings should be treated as errors
-                       $errors = $status->getErrorsByType( 'warning' );
-               }
-               if ( !$errors ) {
-                       // Still no errors? Punt
-                       $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
-               }
-
-               if ( $errors[0]['message'] instanceof MessageSpecifier ) {
-                       $msg = $errors[0]['message'];
-               } else {
-                       $msg = new Message( $errors[0]['message'], $errors[0]['params'] );
-               }
-               if ( !$msg instanceof IApiMessage ) {
-                       $key = $msg->getKey();
-                       $params = $msg->getParams();
-                       array_unshift( $params, self::$messageMap[$key] ?? $key );
-                       $msg = ApiMessage::create( $params );
-               }
-
-               return [
-                       $msg->getApiCode(),
-                       ApiErrorFormatter::stripMarkup( $msg->inLanguage( 'en' )->useDatabase( false )->text() )
-               ];
-       }
-
-       /**
-        * @deprecated since 1.29. Prior to 1.29, this was a public mapping from
-        *  arbitrary strings (often message keys used elsewhere in MediaWiki) to
-        *  API codes and message texts, and a few interfaces required poking
-        *  something in here. Now we're repurposing it to map those same strings
-        *  to i18n messages, and declaring that any interface that requires poking
-        *  at this is broken and needs replacing ASAP.
-        */
-       private static $messageMap = [
-               'unknownerror' => 'apierror-unknownerror',
-               'unknownerror-nocode' => 'apierror-unknownerror-nocode',
-               'ns-specialprotected' => 'ns-specialprotected',
-               'protectedinterface' => 'protectedinterface',
-               'namespaceprotected' => 'namespaceprotected',
-               'customcssprotected' => 'customcssprotected',
-               'customjsprotected' => 'customjsprotected',
-               'cascadeprotected' => 'cascadeprotected',
-               'protectedpagetext' => 'protectedpagetext',
-               'protect-cantedit' => 'protect-cantedit',
-               'deleteprotected' => 'deleteprotected',
-               'badaccess-group0' => 'badaccess-group0',
-               'badaccess-groups' => 'badaccess-groups',
-               'titleprotected' => 'titleprotected',
-               'nocreate-loggedin' => 'nocreate-loggedin',
-               'nocreatetext' => 'nocreatetext',
-               'movenologintext' => 'movenologintext',
-               'movenotallowed' => 'movenotallowed',
-               'confirmedittext' => 'confirmedittext',
-               'blockedtext' => 'apierror-blocked',
-               'autoblockedtext' => 'apierror-autoblocked',
-               'systemblockedtext' => 'apierror-systemblocked',
-               'actionthrottledtext' => 'apierror-ratelimited',
-               'alreadyrolled' => 'alreadyrolled',
-               'cantrollback' => 'cantrollback',
-               'readonlytext' => 'readonlytext',
-               'sessionfailure' => 'sessionfailure',
-               'cannotdelete' => 'cannotdelete',
-               'notanarticle' => 'apierror-missingtitle',
-               'selfmove' => 'selfmove',
-               'immobile_namespace' => 'apierror-immobilenamespace',
-               'articleexists' => 'articleexists',
-               'hookaborted' => 'hookaborted',
-               'cantmove-titleprotected' => 'cantmove-titleprotected',
-               'imagenocrossnamespace' => 'imagenocrossnamespace',
-               'imagetypemismatch' => 'imagetypemismatch',
-               'ip_range_invalid' => 'ip_range_invalid',
-               'range_block_disabled' => 'range_block_disabled',
-               'nosuchusershort' => 'nosuchusershort',
-               'badipaddress' => 'badipaddress',
-               'ipb_expiry_invalid' => 'ipb_expiry_invalid',
-               'ipb_already_blocked' => 'ipb_already_blocked',
-               'ipb_blocked_as_range' => 'ipb_blocked_as_range',
-               'ipb_cant_unblock' => 'ipb_cant_unblock',
-               'mailnologin' => 'apierror-cantsend',
-               'ipbblocked' => 'ipbblocked',
-               'ipbnounblockself' => 'ipbnounblockself',
-               'usermaildisabled' => 'usermaildisabled',
-               'blockedemailuser' => 'apierror-blockedfrommail',
-               'notarget' => 'apierror-notarget',
-               'noemail' => 'noemail',
-               'rcpatroldisabled' => 'rcpatroldisabled',
-               'markedaspatrollederror-noautopatrol' => 'markedaspatrollederror-noautopatrol',
-               'delete-toobig' => 'delete-toobig',
-               'movenotallowedfile' => 'movenotallowedfile',
-               'userrights-no-interwiki' => 'userrights-no-interwiki',
-               'userrights-nodatabase' => 'userrights-nodatabase',
-               'nouserspecified' => 'nouserspecified',
-               'noname' => 'noname',
-               'summaryrequired' => 'apierror-summaryrequired',
-               'import-rootpage-invalid' => 'import-rootpage-invalid',
-               'import-rootpage-nosubpage' => 'import-rootpage-nosubpage',
-               'readrequired' => 'apierror-readapidenied',
-               'writedisabled' => 'apierror-noapiwrite',
-               'writerequired' => 'apierror-writeapidenied',
-               'missingparam' => 'apierror-missingparam',
-               'invalidtitle' => 'apierror-invalidtitle',
-               'nosuchpageid' => 'apierror-nosuchpageid',
-               'nosuchrevid' => 'apierror-nosuchrevid',
-               'nosuchuser' => 'nosuchusershort',
-               'invaliduser' => 'apierror-invaliduser',
-               'invalidexpiry' => 'apierror-invalidexpiry',
-               'pastexpiry' => 'apierror-pastexpiry',
-               'create-titleexists' => 'apierror-create-titleexists',
-               'missingtitle-createonly' => 'apierror-missingtitle-createonly',
-               'cantblock' => 'apierror-cantblock',
-               'canthide' => 'apierror-canthide',
-               'cantblock-email' => 'apierror-cantblock-email',
-               'cantunblock' => 'apierror-permissiondenied-generic',
-               'cannotundelete' => 'cannotundelete',
-               'permdenied-undelete' => 'apierror-permissiondenied-generic',
-               'createonly-exists' => 'apierror-articleexists',
-               'nocreate-missing' => 'apierror-missingtitle',
-               'cantchangecontentmodel' => 'apierror-cantchangecontentmodel',
-               'nosuchrcid' => 'apierror-nosuchrcid',
-               'nosuchlogid' => 'apierror-nosuchlogid',
-               'protect-invalidaction' => 'apierror-protect-invalidaction',
-               'protect-invalidlevel' => 'apierror-protect-invalidlevel',
-               'toofewexpiries' => 'apierror-toofewexpiries',
-               'cantimport' => 'apierror-cantimport',
-               'cantimport-upload' => 'apierror-cantimport-upload',
-               'importnofile' => 'importnofile',
-               'importuploaderrorsize' => 'importuploaderrorsize',
-               'importuploaderrorpartial' => 'importuploaderrorpartial',
-               'importuploaderrortemp' => 'importuploaderrortemp',
-               'importcantopen' => 'importcantopen',
-               'import-noarticle' => 'import-noarticle',
-               'importbadinterwiki' => 'importbadinterwiki',
-               'import-unknownerror' => 'apierror-import-unknownerror',
-               'cantoverwrite-sharedfile' => 'apierror-cantoverwrite-sharedfile',
-               'sharedfile-exists' => 'apierror-fileexists-sharedrepo-perm',
-               'mustbeposted' => 'apierror-mustbeposted',
-               'show' => 'apierror-show',
-               'specialpage-cantexecute' => 'apierror-specialpage-cantexecute',
-               'invalidoldimage' => 'apierror-invalidoldimage',
-               'nodeleteablefile' => 'apierror-nodeleteablefile',
-               'fileexists-forbidden' => 'fileexists-forbidden',
-               'fileexists-shared-forbidden' => 'fileexists-shared-forbidden',
-               'filerevert-badversion' => 'filerevert-badversion',
-               'noimageredirect-anon' => 'apierror-noimageredirect-anon',
-               'noimageredirect-logged' => 'apierror-noimageredirect',
-               'spamdetected' => 'apierror-spamdetected',
-               'contenttoobig' => 'apierror-contenttoobig',
-               'noedit-anon' => 'apierror-noedit-anon',
-               'noedit' => 'apierror-noedit',
-               'wasdeleted' => 'apierror-pagedeleted',
-               'blankpage' => 'apierror-emptypage',
-               'editconflict' => 'editconflict',
-               'hashcheckfailed' => 'apierror-badmd5',
-               'missingtext' => 'apierror-notext',
-               'emptynewsection' => 'apierror-emptynewsection',
-               'revwrongpage' => 'apierror-revwrongpage',
-               'undo-failure' => 'undo-failure',
-               'content-not-allowed-here' => 'content-not-allowed-here',
-               'edit-hook-aborted' => 'edit-hook-aborted',
-               'edit-gone-missing' => 'edit-gone-missing',
-               'edit-conflict' => 'edit-conflict',
-               'edit-already-exists' => 'edit-already-exists',
-               'invalid-file-key' => 'apierror-invalid-file-key',
-               'nouploadmodule' => 'apierror-nouploadmodule',
-               'uploaddisabled' => 'uploaddisabled',
-               'copyuploaddisabled' => 'copyuploaddisabled',
-               'copyuploadbaddomain' => 'apierror-copyuploadbaddomain',
-               'copyuploadbadurl' => 'apierror-copyuploadbadurl',
-               'filename-tooshort' => 'filename-tooshort',
-               'filename-toolong' => 'filename-toolong',
-               'illegal-filename' => 'illegal-filename',
-               'filetype-missing' => 'filetype-missing',
-               'mustbeloggedin' => 'apierror-mustbeloggedin',
-       ];
-
-       /**
-        * @deprecated do not use
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @return ApiMessage
-        */
-       private function parseMsgInternal( $error ) {
-               $msg = Message::newFromSpecifier( $error );
-               if ( !$msg instanceof IApiMessage ) {
-                       $key = $msg->getKey();
-                       if ( isset( self::$messageMap[$key] ) ) {
-                               $params = $msg->getParams();
-                               array_unshift( $params, self::$messageMap[$key] );
-                       } else {
-                               $params = [ 'apierror-unknownerror', wfEscapeWikiText( $key ) ];
-                       }
-                       $msg = ApiMessage::create( $params );
-               }
-               return $msg;
-       }
-
-       /**
-        * 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 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
-               // fix T30797.
-               if ( is_array( $error ) ) {
-                       $first = reset( $error );
-                       if ( is_array( $first ) ) {
-                               wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
-                               $error = $first;
-                       }
-               }
-
-               $msg = $this->parseMsgInternal( $error );
-               return [
-                       'code' => $msg->getApiCode(),
-                       'info' => ApiErrorFormatter::stripMarkup(
-                               $msg->inLanguage( 'en' )->useDatabase( false )->text()
-                       ),
-                       'data' => $msg->getApiData()
-               ];
-       }
-
-       /**
-        * Output the error message related to a certain array
-        * @deprecated since 1.29, use ApiBase::dieWithError() instead
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws ApiUsageException always
-        */
-       public function dieUsageMsg( $error ) {
-               wfDeprecated( __METHOD__, '1.29' );
-               $this->dieWithError( $this->parseMsgInternal( $error ) );
-       }
-
-       /**
-        * Will only set a warning instead of failing if the global $wgDebugAPI
-        * is set to true. Otherwise behaves exactly as dieUsageMsg().
-        * @deprecated since 1.29, use ApiBase::dieWithErrorOrDebug() instead
-        * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
-        * @throws ApiUsageException
-        * @since 1.21
-        */
-       public function dieUsageMsgOrDebug( $error ) {
-               wfDeprecated( __METHOD__, '1.29' );
-               $this->dieWithErrorOrDebug( $this->parseMsgInternal( $error ) );
-       }
-
        /**
         * Return the description message.
         *
index af23f95..847afd8 100644 (file)
@@ -58,6 +58,26 @@ class ApiErrorFormatter {
                $this->format = $format;
        }
 
+       /**
+        * Return a formatter like this one but with a different format
+        *
+        * @since 1.32
+        * @param string $format New format.
+        * @return ApiErrorFormatter
+        */
+       public function newWithFormat( $format ) {
+               return new self( $this->result, $this->lang, $format, $this->useDB );
+       }
+
+       /**
+        * Fetch the format for this formatter
+        * @since 1.32
+        * @return string
+        */
+       public function getFormat() {
+               return $this->format;
+       }
+
        /**
         * Fetch the Language for this formatter
         * @since 1.29
@@ -164,16 +184,6 @@ class ApiErrorFormatter {
                        $msg = Message::newFromSpecifier( $exception );
                        $params = [];
                } else {
-                       // Extract code and data from the exception, if applicable
-                       if ( $exception instanceof UsageException ) {
-                               $data = $exception->getMessageArray();
-                               if ( !$options['code'] ) {
-                                       $options['code'] = $data['code'];
-                               }
-                               unset( $data['code'], $data['info'] );
-                               $options['data'] = array_merge( $data, $options['data'] );
-                       }
-
                        if ( isset( $options['wrap'] ) ) {
                                $msg = $options['wrap'];
                        } else {
@@ -371,6 +381,10 @@ class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
                parent::__construct( $result, Language::factory( 'en' ), 'none', false );
        }
 
+       public function getFormat() {
+               return 'bc';
+       }
+
        public function arrayFromStatus( StatusValue $status, $type = 'error', $format = null ) {
                if ( $status->isGood() || !$status->getErrors() ) {
                        return [];
index c21ac12..37ec3cf 100644 (file)
@@ -157,12 +157,8 @@ class ApiFeedWatchlist extends ApiBase {
                                        $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
                                }
                        } else {
-                               if ( $e instanceof UsageException ) {
-                                       $errorCode = $e->getCodeString();
-                               } else {
-                                       // Something is seriously wrong
-                                       $errorCode = 'internal_api_error';
-                               }
+                               // Something is seriously wrong
+                               $errorCode = 'internal_api_error';
                                $errorTitle = $this->msg( 'api-feed-error-title', $errorCode );
                                $errorText = $e->getMessage();
                                $feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
index 3b305f9..d2a7db2 100644 (file)
@@ -566,8 +566,8 @@ class ApiMain extends ApiBase {
         */
        protected function handleException( $e ) {
                // 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
+               if ( !$e instanceof ApiUsageException ) {
+                       // ApiUsageExceptions are intentional, so don't rollback if that's the case
                        MWExceptionHandler::rollbackMasterChangesAndLog( $e );
                }
 
@@ -612,13 +612,6 @@ class ApiMain extends ApiBase {
                                        $this->addWarning( $error );
                                }
                        }
-               } catch ( UsageException $ex ) {
-                       // The error printer itself is failing. Try suppressing its request
-                       // parameters and redo.
-                       $failed = true;
-                       $this->addWarning(
-                               [ 'apiwarn-errorprinterfailed-ex', $ex->getMessage() ], 'errorprinterfailed'
-                       );
                }
                if ( $failed ) {
                        $this->mPrinter = null;
@@ -1012,9 +1005,6 @@ class ApiMain extends ApiBase {
         * If an ApiUsageException, errors/warnings will be extracted from the
         * embedded StatusValue.
         *
-        * If a base UsageException, the getMessageArray() method will be used to
-        * extract the code and English message for a single error (no warnings).
-        *
         * Any other exception will be returned with a generic code and wrapper
         * text around the exception's (presumably English) message as a single
         * error (no warnings).
@@ -1032,13 +1022,6 @@ class ApiMain extends ApiBase {
                        }
                } elseif ( $type !== 'error' ) {
                        // None of the rest have any messages for non-error types
-               } elseif ( $e instanceof UsageException ) {
-                       // User entered incorrect parameters - generate error response
-                       $data = Wikimedia\quietCall( [ $e, 'getMessageArray' ] );
-                       $code = $data['code'];
-                       $info = $data['info'];
-                       unset( $data['code'], $data['info'] );
-                       $messages[] = new ApiRawMessage( [ '$1', $info ], $code, $data );
                } else {
                        // Something is seriously wrong
                        $config = $this->getConfig();
@@ -1108,7 +1091,7 @@ class ApiMain extends ApiBase {
                } else {
                        $path = null;
                }
-               if ( $e instanceof ApiUsageException || $e instanceof UsageException ) {
+               if ( $e instanceof ApiUsageException ) {
                        $link = wfExpandUrl( wfScript( 'api' ) );
                        $result->addContentValue(
                                $path,
index 3ea827c..c4de31f 100644 (file)
@@ -52,9 +52,9 @@ class ApiOptions extends ApiBase {
                        $this->dieWithError( [ 'apierror-missingparam', 'optionname' ] );
                }
 
-               if ( $params['reset'] ) {
-                       $this->resetPreferences( $params['resetkinds'] );
-                       $changed = true;
+               $resetKinds = $params['resetkinds'];
+               if ( !$params['reset'] ) {
+                       $resetKinds = [];
                }
 
                $changes = [];
@@ -68,6 +68,14 @@ class ApiOptions extends ApiBase {
                        $newValue = $params['optionvalue'] ?? null;
                        $changes[$params['optionname']] = $newValue;
                }
+
+               Hooks::run( 'ApiOptions', [ $this, $user, $changes, $resetKinds ] );
+
+               if ( $resetKinds ) {
+                       $this->resetPreferences( $resetKinds );
+                       $changed = true;
+               }
+
                if ( !$changed && !count( $changes ) ) {
                        $this->dieWithError( 'apierror-nochanges' );
                }
index 26846f4..194a511 100644 (file)
@@ -418,19 +418,6 @@ class ApiPageSet extends ApiBase {
                return $this->mGoodTitles + $this->mMissingTitles;
        }
 
-       /**
-        * Titles that were deemed invalid by Title::newFromText()
-        * The array's index will be unique and negative for each item
-        * @deprecated since 1.26, use self::getInvalidTitlesAndReasons()
-        * @return string[] Array of strings (not Title objects)
-        */
-       public function getInvalidTitles() {
-               wfDeprecated( __METHOD__, '1.26' );
-               return array_map( function ( $t ) {
-                       return $t['title'];
-               }, $this->mInvalidTitles );
-       }
-
        /**
         * Titles that were deemed invalid by Title::newFromText()
         * The array's index will be unique and negative for each item
index b9ed9f2..8630561 100644 (file)
@@ -436,9 +436,14 @@ abstract class ApiQueryBase extends ApiBase {
         * @return void
         */
        public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
+               $db = $this->getDB();
+
                $this->addTables( 'ipblocks' );
                $this->addJoinConds( [
-                       'ipblocks' => [ 'LEFT JOIN', 'ipb_user=user_id' ],
+                       'ipblocks' => [ 'LEFT JOIN', [
+                               'ipb_user=user_id',
+                               'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ),
+                       ] ],
                ] );
 
                $this->addFields( 'ipb_deleted' );
index 18d2804..37a7ff3 100644 (file)
@@ -59,7 +59,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
                if ( isset( $params['badfilecontexttitle'] ) ) {
                        $badFileContextTitle = Title::newFromText( $params['badfilecontexttitle'] );
                        if ( !$badFileContextTitle ) {
-                               $this->dieUsage( 'Invalid title in badfilecontexttitle parameter', 'invalid-title' );
+                               $p = $this->getModulePrefix();
+                               $this->dieWithError( [ 'apierror-bad-badfilecontexttitle', $p ], 'invalid-title' );
                        }
                } else {
                        $badFileContextTitle = false;
@@ -301,7 +302,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                $paramList = $h->parseParamString( $otherParams );
                if ( !$paramList ) {
-                       // Just set a warning (instead of dieUsage), as in many cases
+                       // Just set a warning (instead of dieWithError), as in many cases
                        // we could still render the image using width and height parameters,
                        // and this type of thing could happen between different versions of
                        // handlers.
index 3b7b00d..2ab3c56 100644 (file)
@@ -527,11 +527,27 @@ class ApiQueryInfo extends ApiQueryBase {
                                return null; // force a continuation
                        }
 
+                       $detailLevel = $this->params['testactionsdetail'];
+                       $rigor = $detailLevel === 'quick' ? 'quick' : 'secure';
+                       $errorFormatter = $this->getErrorFormatter();
+                       if ( $errorFormatter->getFormat() === 'bc' ) {
+                               // Eew, no. Use a more modern format here.
+                               $errorFormatter = $errorFormatter->newWithFormat( 'plaintext' );
+                       }
+
                        $user = $this->getUser();
                        $pageInfo['actions'] = [];
                        foreach ( $this->params['testactions'] as $action ) {
                                $this->countTestedActions++;
-                               $pageInfo['actions'][$action] = $title->userCan( $action, $user );
+
+                               if ( $detailLevel === 'boolean' ) {
+                                       $pageInfo['actions'][$action] = $title->userCan( $action, $user );
+                               } else {
+                                       $pageInfo['actions'][$action] = $errorFormatter->arrayFromStatus( $this->errorArrayToStatus(
+                                               $title->getUserPermissionsErrors( $action, $user, $rigor ),
+                                               $user
+                                       ) );
+                               }
                        }
                }
 
@@ -955,11 +971,19 @@ class ApiQueryInfo extends ApiQueryBase {
                                        // need to be added to getCacheMode()
                                ],
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
+                               ApiBase::PARAM_DEPRECATED_VALUES => [
+                                       'readable' => true, // Since 1.32
+                               ],
                        ],
                        'testactions' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_ISMULTI => true,
                        ],
+                       'testactionsdetail' => [
+                               ApiBase::PARAM_TYPE => [ 'boolean', 'full', 'quick' ],
+                               ApiBase::PARAM_DFLT => 'boolean',
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
+                       ],
                        'token' => [
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_ISMULTI => true,
index 39be2c1..2d95cd3 100644 (file)
@@ -263,32 +263,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'item' );
        }
 
-       /**
-        * @deprecated since 1.25 Use LogFormatter::formatParametersForApi instead
-        * @param ApiResult $result
-        * @param array &$vals
-        * @param string $params
-        * @param string $type
-        * @param string $action
-        * @param string $ts
-        * @param bool $legacy
-        * @return array
-        */
-       public static function addLogParams( $result, &$vals, $params, $type,
-               $action, $ts, $legacy = false
-       ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               $entry = new ManualLogEntry( $type, $action );
-               $entry->setParameters( $params );
-               $entry->setTimestamp( $ts );
-               $entry->setLegacy( $legacy );
-               $formatter = LogFormatter::newFromEntry( $entry );
-               $vals['params'] = $formatter->formatParametersForApi();
-
-               return $vals;
-       }
-
        private function extractRowInfo( $row ) {
                $logEntry = DatabaseLogEntry::newFromRow( $row );
                $vals = [
index 7f8a26b..f930452 100644 (file)
  * If possible, use ApiBase::dieWithError() instead of throwing this directly.
  *
  * @ingroup API
- * @note This currently extends UsageException for backwards compatibility, so
- *  all the existing code that catches UsageException won't break when stuff
- *  starts throwing ApiUsageException. Eventually UsageException will go away
- *  and this will (probably) extend MWException directly.
  */
-class ApiUsageException extends UsageException implements ILocalizedException {
+class ApiUsageException extends MWException implements ILocalizedException {
 
        protected $modulePath;
        protected $status;
@@ -53,12 +49,7 @@ class ApiUsageException extends UsageException implements ILocalizedException {
                // customized by the local wiki.
                $enMsg = clone $this->getApiMessage();
                $enMsg->inLanguage( 'en' )->useDatabase( false );
-               parent::__construct(
-                       ApiErrorFormatter::stripMarkup( $enMsg->text() ),
-                       $enMsg->getApiCode(),
-                       $httpCode,
-                       $enMsg->getApiData()
-               );
+               parent::__construct( ApiErrorFormatter::stripMarkup( $enMsg->text() ), $httpCode );
        }
 
        /**
@@ -111,32 +102,6 @@ class ApiUsageException extends UsageException implements ILocalizedException {
                return $this->status;
        }
 
-       /**
-        * @deprecated Do not use. This only exists here because UsageException is in
-        *  the inheritance chain for backwards compatibility.
-        * @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
-        */
-       public function getMessageArray() {
-               wfDeprecated( __METHOD__, '1.29' );
-               $enMsg = clone $this->getApiMessage();
-               $enMsg->inLanguage( 'en' )->useDatabase( false );
-
-               return [
-                       'code' => $enMsg->getApiCode(),
-                       'info' => ApiErrorFormatter::stripMarkup( $enMsg->text() ),
-               ] + $enMsg->getApiData();
-       }
-
        /**
         * @inheritDoc
         */
diff --git a/includes/api/UsageException.php b/includes/api/UsageException.php
deleted file mode 100644 (file)
index 426ce91..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This exception will be thrown when dieUsage is called to stop module execution.
- *
- * @ingroup API
- * @deprecated since 1.29, use ApiUsageException instead
- */
-class UsageException extends MWException {
-
-       private $mCodestr;
-
-       /**
-        * @var null|array
-        */
-       private $mExtraData;
-
-       /**
-        * @param string $message
-        * @param string $codestr
-        * @param int $code
-        * @param array|null $extradata
-        */
-       public function __construct( $message, $codestr, $code = 0, $extradata = null ) {
-               parent::__construct( $message, $code );
-               $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 === '' ) {
-                       throw new InvalidArgumentException( 'Invalid $codestr, was ' .
-                               ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
-                       );
-               }
-       }
-
-       /**
-        * @return string
-        */
-       public function getCodeString() {
-               wfDeprecated( __METHOD__, '1.29' );
-               return $this->mCodestr;
-       }
-
-       /**
-        * @return array
-        */
-       public function getMessageArray() {
-               wfDeprecated( __METHOD__, '1.29' );
-               $result = [
-                       'code' => $this->mCodestr,
-                       'info' => $this->getMessage()
-               ];
-               if ( is_array( $this->mExtraData ) ) {
-                       $result = array_merge( $result, $this->mExtraData );
-               }
-
-               return $result;
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return "{$this->getCodeString()}: {$this->getMessage()}";
-       }
-}
index d6af2f1..a4aa5fc 100644 (file)
        "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-readable": "ما إذا كان يمكن للمستخدم قراءة هذه الصفحة، استخدم <kbd>intestactions=read</kbd> بدلا من ذلك.",
        "apihelp-query+info-paramvalue-prop-preload": "يعطي النص الذي تم إرجاعه بواسطة EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "يعطي الطريقة التي يتم بها عرض عنوان الصفحة بالفعل.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "يعطي عنوان العرض بجميع الصيغ الخاصة بلغة محتوى الموقع.",
        "apihelp-query+info-param-testactions": "اختبر ما إذا كان المستخدم الحالي يمكنه تنفيذ إجراءات معينة على الصفحة.",
+       "apihelp-query+info-param-testactionsdetail": "مستوى التفاصيل لـ<var>$1testactions</var>، استخدم وسائط [[Special:ApiHelp/main|الوحدة الرئيسية]] <var>errorformat</var> و<var>errorlang</var> للتحكم في تنسيق الرسائل التي تم إرجاعها.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "إرجاع قيمة منطقية لكل إجراء.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "إرجاع الرسائل التي تصف سبب عدم السماح بالإجراء ، أو مصفوفة فارغة إذا كان مسموحا بها.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "مثل <kbd>full</kbd> ولكن تخطي المراجعات باهظة الثمن.",
        "apihelp-query+info-param-token": "استخدم [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] بدلا من ذلك.",
        "apihelp-query+info-example-simple": "الحصول على معلومات حول الصفحة <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "احصل على معلومات عامة وحماية حول الصفحة <kbd>Main Page</kbd>.",
        "apierror-assertnameduserfailed": "تأكيد أن المستخدم \"$1\" فشل.",
        "apierror-assertuserfailed": "التأكيد على فشل تسجيل الدخول للمستخدم.",
        "apierror-autoblocked": "عنوان الآيبي الخاص بك تم منعه تلقائيا; لأنه تم استخدامه بواسطة مستخدم ممنوع.",
+       "apierror-bad-badfilecontexttitle": "عنوان غير صالح في الوسيط <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "إن قيمة <code>$wgAPIMaxResultSize</code> في هذا الويكي صغيرة جدا لا تحتوي على معلومات النتائج الأساسية.",
        "apierror-badcontinue": "متابعة غير صحيحة; يجب عليك تمرير القيمة الأصلية التي تم إرجاعها بواسطة الاستعلام السابق.",
        "apierror-baddiff": "لا يمكن استرجاع الفرقك; إحدى أو كلا المراجعتين غير موجودة أو ليست لديك صلاحية لعرضها.",
        "apiwarn-deprecation-withreplacement": "تم إيقاف <kbd>$1</kbd>; الرجاء استخدام <kbd>$2</kbd> بدلا من ذلك.",
        "apiwarn-difftohidden": "لا يمكنك إجراء مقارنة مع r$1: المحتوى مخفي.",
        "apiwarn-errorprinterfailed": "فشل خطأ الطباعة; سوف يعيد دون وسائط.",
-       "apiwarn-errorprinterfailed-ex": "فشل خطأ الطباعة (سوف يعيد دون وسائط): $1.",
        "apiwarn-ignoring-invalid-templated-value": "تجاهل القيمة <kbd>$2</kbd> في <var>$1</var> عند معالجة وسائط القوالب.",
        "apiwarn-invalidcategory": "\"$1\" ليس تصنيفا.",
        "apiwarn-invalidtitle": "\"$1\" ليس عنوانا صالحا.",
index c1fba86..0eb6749 100644 (file)
@@ -75,6 +75,7 @@
        "apihelp-compare-paramvalue-prop-diff": "Das Unterschieds-HTML.",
        "apihelp-compare-paramvalue-prop-diffsize": "Die Größe des Unterschieds-HTML in Bytes.",
        "apihelp-compare-paramvalue-prop-title": "Die Seitentitel der Versionen „Von“ und „Nach“.",
+       "apihelp-compare-paramvalue-prop-size": "Die Größe der Versionen „from“ und „to“.",
        "apihelp-compare-example-1": "Unterschied zwischen Version 1 und 2 abrufen",
        "apihelp-createaccount-summary": "Erstellt ein neues Benutzerkonto.",
        "apihelp-createaccount-param-preservestate": "Falls <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> für <samp>hasprimarypreservedstate</samp> wahr ausgegeben hat, sollten Anfragen, die als <samp>primary-required</samp> markiert wurden, ausgelassen werden. Falls ein nicht-leerer Wert für <samp>preservedusername</samp> zurückgegeben wurde, muss dieser Benutzername für den Parameter <var>username</var> verwendet werden.",
        "apihelp-query+allrevisions-param-generatetitles": "Wenn als Generator verwendet, werden eher Titel als Bearbeitungs-IDs erzeugt.",
        "apihelp-query+allrevisions-example-user": "Liste die letzten 50 Beiträge, sortiert nach Benutzer <kbd>Beispiel</kbd> auf.",
        "apihelp-query+allrevisions-example-ns-main": "Liste die ersten 50 Bearbeitungen im Hauptnamensraum auf.",
+       "apihelp-query+mystashedfiles-summary": "Ruft eine Liste der Dateien im aktuellen Benutzeruploadspeicher ab.",
        "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-paramvalue-prop-type": "Ruft den MIME- und Medientyp der Datei ab.",
        "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-summary": "Gebe Metainformationen über Bild-Repositorien zurück, die im Wiki eingerichtet sind.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "Der menschenlesbare Name des Repositoriumwikis.",
        "apihelp-query+filerepoinfo-paramvalue-prop-local": "Ob dieses Repositorium das lokale ist oder nicht.",
        "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Wurzel-URL-Pfad für Bildpfade.",
        "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Wurzel-URL-Pfad für die MediaWiki-Installation des Repositoriumwikis.",
        "apihelp-query+info-paramvalue-prop-watchers": "Die Anzahl der Beobachter, falls erlaubt.",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "Der Beobachtungslisten-Benachrichtigungs-Zeitstempel jeder Seite.",
        "apihelp-query+info-paramvalue-prop-subjectid": "Die Seitenkennung der Elternseite jeder Diskussionsseite.",
-       "apihelp-query+info-paramvalue-prop-readable": "Ob der Benutzer diese Seite betrachten darf.",
+       "apihelp-query+info-paramvalue-prop-readable": "Ob der Benutzer diese Seite lesen kann. Stattdessen <kbd>intestactions=read</kbd> verwenden.",
+       "apihelp-query+info-paramvalue-prop-preload": "Gibt den Text aus, der von EditFormPreloadText zurückgegeben wurde.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Gibt die Art und Weise an, in der der Seitentitel tatsächlich angezeigt wird.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Gibt den Anzeigetitel in allen Varianten der Sprache des Websiteinhalts aus.",
        "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Gibt einen booleschen Wert für jede Aktion zurück.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "Wie <kbd>full</kbd>, aber mit Überspringen von Aufwandsüberprüfungen.",
        "apihelp-query+info-example-simple": "Ruft Informationen über die Seite <kbd>Hauptseite</kbd> ab.",
        "apihelp-query+iwbacklinks-summary": "Findet alle Seiten, die auf einen angegebenen Interwikilink verlinken.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
        "apihelp-query+iwlinks-param-prefix": "Gibt nur Interwiki-Links mit diesem Präfix zurück.",
        "apihelp-query+iwlinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+iwlinks-example-simple": "Ruft die Interwikilinks von der Seite <kbd>Hauptseite</kbd> ab.",
+       "apihelp-query+langbacklinks-summary": "Findet alle Seiten, die auf den angegebenen Sprachlink verlinken.",
        "apihelp-query+langbacklinks-param-lang": "Sprache für den Sprachlink.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
        "apihelp-query+langbacklinks-param-prop": "Zurückzugebende Eigenschaften:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Ergänzt den Sprachcode des Sprachlinks.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Ergänzt den Titel des Sprachlinks.",
        "apihelp-query+langbacklinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+langbacklinks-example-simple": "Ruft Seiten ab, die auf [[:fr:Test]] verlinken.",
+       "apihelp-query+langlinks-summary": "Gibt alle Interlanguagelinks von den angegebenen Seiten zurück.",
        "apihelp-query+langlinks-param-limit": "Wie viele Sprachlinks zurückgegeben werden sollen.",
        "apihelp-query+langlinks-param-prop": "Zusätzlich zurückzugebende Eigenschaften jedes Interlanguage-Links:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Markieren, falls die Seite eine Weiterleitung ist.",
+       "apihelp-query+linkshere-param-namespace": "Nur Seiten in diesen Namensräumen einschließen.",
        "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-paramvalue-prop-user": "Ergänzt den verantwortlichen Benutzer für das Logbuchereignis.",
        "apihelp-query+logevents-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel des Logbucheintrags.",
        "apihelp-query+logevents-paramvalue-prop-comment": "Ergänzt den Kommentar des Logbuchereignisses.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Ergänzt den geparsten Kommentar des Logbuchereignisses.",
        "apihelp-query+logevents-paramvalue-prop-details": "Listet zusätzliche Einzelheiten über das Logbuchereignis auf.",
        "apihelp-query+logevents-paramvalue-prop-tags": "Listet Markierungen für das Logbuchereignis auf.",
        "apihelp-query+logevents-param-type": "Filtert nur Logbucheinträge mit diesem Typ heraus.",
        "apihelp-query+redirects-paramvalue-prop-title": "Titel einer jeden Weiterleitung.",
        "apihelp-query+redirects-param-namespace": "Schließt nur Seiten in diesen Namensräumen ein.",
        "apihelp-query+redirects-param-limit": "Wie viele Weiterleitungen zurückgegeben werden sollen.",
+       "apihelp-query+revisions-summary": "Ruft Informationen zur Version ab.",
+       "apihelp-query+revisions-param-excludeuser": "Schließt Versionen nach Benutzer aus.",
        "apihelp-query+revisions-param-tag": "Listet nur Versionen auf, die mit dieser Markierung markiert sind.",
        "apihelp-query+revisions+base-param-prop": "Zurückzugebende Eigenschaften jeder Version:",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "Die Kennung der Version.",
        "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": "<small>[in Spielwiese öffnen]</small>",
        "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.",
+       "apierror-bad-badfilecontexttitle": "Ungültiger Titel im Parameter <var>$1badfilecontexttitle</var>.",
        "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> unbekannt.",
        "apierror-badip": "Der IP-Parameter ist nicht gültig.",
        "apierror-badmd5": "Die angegebene MD5-Prüfsumme war falsch.",
index 253380c..25bf3f7 100644 (file)
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "The watchlist notification timestamp of each page.",
        "apihelp-query+info-paramvalue-prop-subjectid": "The page ID of the parent page for each talk page.",
        "apihelp-query+info-paramvalue-prop-url": "Gives a full URL, an edit URL, and the canonical URL for each page.",
-       "apihelp-query+info-paramvalue-prop-readable": "Whether the user can read this page.",
+       "apihelp-query+info-paramvalue-prop-readable": "Whether the user can read this page. Use <kbd>intestactions=read</kbd> instead.",
        "apihelp-query+info-paramvalue-prop-preload": "Gives the text returned by EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Gives the manner in which the page title is actually displayed.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Gives the display title in all variants of the site content language.",
        "apihelp-query+info-param-testactions": "Test whether the current user can perform certain actions on the page.",
+       "apihelp-query+info-param-testactionsdetail": "Detail level for <var>$1testactions</var>. Use the [[Special:ApiHelp/main|main module]]'s <var>errorformat</var> and <var>errorlang</var> parameters to control the format of the messages returned.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Return a boolean value for each action.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "Return messages describing why the action is disallowed, or an empty array if it is allowed.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "Like <kbd>full</kbd> but skipping expensive checks.",
        "apihelp-query+info-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.",
        "apihelp-query+info-example-simple": "Get information about the page <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Get general and protection information about the page <kbd>Main Page</kbd>.",
        "apierror-assertnameduserfailed": "Assertion that the user is \"$1\" failed.",
        "apierror-assertuserfailed": "Assertion that the user is logged in failed.",
        "apierror-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
+       "apierror-bad-badfilecontexttitle": "Invalid title in <var>$1badfilecontexttitle</var> parameter.",
        "apierror-badconfig-resulttoosmall": "The value of <code>$wgAPIMaxResultSize</code> on this wiki is too small to hold basic result information.",
        "apierror-badcontinue": "Invalid continue param. You should pass the original value returned by the previous query.",
        "apierror-baddiff": "The diff cannot be retrieved. One or both revisions do not exist or you do not have permission to view them.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> has been deprecated. Please use <kbd>$2</kbd> instead.",
        "apiwarn-difftohidden": "Couldn't diff to r$1: content is hidden.",
        "apiwarn-errorprinterfailed": "Error printer failed. Will retry without params.",
-       "apiwarn-errorprinterfailed-ex": "Error printer failed (will retry without params): $1",
        "apiwarn-ignoring-invalid-templated-value": "Ignoring value <kbd>$2</kbd> in <var>$1</var> when processing templated parameters.",
        "apiwarn-invalidcategory": "\"$1\" is not a category.",
        "apiwarn-invalidtitle": "\"$1\" is not a valid title.",
index 1c0bb0e..074432b 100644 (file)
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "L’horodatage de notification de la liste de suivi de chaque page.",
        "apihelp-query+info-paramvalue-prop-subjectid": "L’ID de page de la page parent de chaque page de discussion.",
        "apihelp-query+info-paramvalue-prop-url": "Fournit une URL complète, une URL de modification, et l’URL canonique de chaque page.",
-       "apihelp-query+info-paramvalue-prop-readable": "Si l’utilisateur peut lire cette page.",
+       "apihelp-query+info-paramvalue-prop-readable": "Si l’utilisateur peut lire cette page. Utiliser plutôt <kbd>intestactions=read</kbd>.",
        "apihelp-query+info-paramvalue-prop-preload": "Fournit le texte renvoyé par EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fournit la manière dont le titre de la page est réellement affiché.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "Donne le titre affiché dans toutes les variantes de la langue de contenu du site.",
        "apihelp-query+info-param-testactions": "Tester si l’utilisateur actuel peut effectuer certaines actions sur la page.",
+       "apihelp-query+info-param-testactionsdetail": "Niveau de détail pour <var>$1testactions</var>. Utiliser les paramètres <var>errorformat</var> et <var>errorlang</var> du [[Special:ApiHelp/main|module principal]] pour contrôler la mise en forme des messages renvoyés.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "Renvoyer une valeur booléenne pour chaque action.",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "Renvoyer des messages décrivant pourquoi l’action est interdite, ou un tableau vide si elle est autorisée.",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "Comme <kbd>full</kbd> mais en sautant les contrôles coûteux.",
        "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 <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page <kbd>Main Page</kbd>.",
        "apierror-assertnameduserfailed": "La vérification que l’utilisateur est « $1 » a échoué.",
        "apierror-assertuserfailed": "La vérification que l’utilisateur est connecté a échoué.",
        "apierror-autoblocked": "Votre adresse IP a été bloquée automatiquement, parce qu’elle a été utilisée par un utilisateur bloqué.",
+       "apierror-bad-badfilecontexttitle": "Titre invalide dans le paramètre <var>$1badfilecontexttitle</var> .",
        "apierror-badconfig-resulttoosmall": "La valeur de <code>$wgAPIMaxResultSize</code> sur ce wiki est trop petite pour contenir des informations de résultat basiques.",
        "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.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> est désuet. Veuillez utiliser <kbd>$2</kbd> à 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",
        "apiwarn-ignoring-invalid-templated-value": "Ignorer la valeur <kbd>$2</kbd> dans <var>$1</var> en traitant les paramètres de modèle.",
        "apiwarn-invalidcategory": "« $1 » n'est pas une catégorie.",
        "apiwarn-invalidtitle": "« $1 » n’est pas un titre valide.",
index 4bfb522..3370d73 100644 (file)
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
        "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
        "apiwarn-errorprinterfailed": "מדפיס השגיאות לא עבד. ינסה שוב ללא פרמטרים.",
-       "apiwarn-errorprinterfailed-ex": "מדפיס השגיאות לא עבד (ינסה שוב ללא פרמטרים): $1",
        "apiwarn-ignoring-invalid-templated-value": "לא ייעשה שימוש בערך <kbd>$2</kbd> שבפרמטר <var>$1</var> בעת עיבוד הפרמטרים בתבנית.",
        "apiwarn-invalidcategory": "\"$1\" אינה קטגוריה.",
        "apiwarn-invalidtitle": "\"$1\" אינה כותרת תקינה.",
index 5a76e4c..a810d21 100644 (file)
        "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+info-paramvalue-testactionsdetail-boolean": "Restituisce un valore booleano per ogni azione.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefisso per l'interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Quante pagine totali restituire.",
        "apihelp-query+iwbacklinks-param-prop": "Quali proprietà ottenere:",
        "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
+       "apierror-bad-badfilecontexttitle": "Titolo non valido nel parametro <var>$1badfilecontexttitle</var>.",
        "apierror-compare-notext": "Il parametro <var>$1</var> non può essere usato senza <var>$2</var>.",
        "apierror-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
        "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
index 631e681..6149609 100644 (file)
        "apihelp-query+info-paramvalue-prop-protection": "각 문서의 보호 수준을 나열합니다.",
        "apihelp-query+info-paramvalue-prop-readable": "사용자가 이 문서를 읽을 수 있는지의 여부.",
        "apihelp-query+info-paramvalue-prop-varianttitles": "모든 종류의 사이트 내용 언어의 표시 제목을 지정합니다.",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "각 동작의 불리언 값을 반환합니다.",
        "apihelp-query+iwbacklinks-summary": "제시된 인터위키 링크에 연결된 모든 문서를 찾습니다.",
        "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.",
        "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. <var>$1blprefix</var>와 함께 사용해야 합니다.",
        "apierror-assertnameduserfailed": "사용자의 \"$1\" 지정 표명이 실패했습니다.",
        "apierror-assertuserfailed": "사용자의 로그인 실패 표명이 발생했습니다.",
        "apierror-autoblocked": "사용자의 IP 주소는 차단된 사용자에 의해 사용되었으므로 자동으로 차단된 상태입니다.",
+       "apierror-bad-badfilecontexttitle": "<var>$1badfilecontexttitle</var> 변수에 유효하지 않은 제목이 있습니다.",
        "apierror-badgenerator-unknown": "알 수 없는 <kbd>generator=$1</kbd>.",
        "apierror-badip": "IP 변수가 유효하지 않습니다.",
        "apierror-badmd5": "제공된 MD5 해시가 잘못되었습니다.",
index 9c3f11b..db3e013 100644 (file)
        "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-bad-badfilecontexttitle": "Título inválido no parâmetro <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "O valor de <code>$wgAPIMaxResultSize</code> 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.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> está obsoleto. Por favor, use <kbd>$2</kbd> 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-ignoring-invalid-templated-value": "Ignorando o valor <kbd>$2</kbd> em <var>$1</var> ao processar parâmetros de predefinição.",
        "apiwarn-invalidcategory": "\"$1\" não é uma categoria.",
        "apiwarn-invalidtitle": "\"$1\" não é um título válido.",
index b5da399..38cdaf2 100644 (file)
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> foi descontinuado. Em substituição, use <kbd>$2</kbd>, 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-ignoring-invalid-templated-value": "A ignorar o valor <kbd>$2</kbd> em <var>$1</var> ao processar parâmetros modelados.",
        "apiwarn-invalidcategory": "\"$1\" não é uma categoria.",
        "apiwarn-invalidtitle": "\"$1\" não é um título válido.",
index eb3fdef..d279330 100644 (file)
        "apihelp-query+info-paramvalue-prop-displaytitle": "{{doc-apihelp-paramvalue|query+info|prop|displaytitle}}",
        "apihelp-query+info-paramvalue-prop-varianttitles": "{{doc-apihelp-paramvalue|query+info|prop|varianttitles}}",
        "apihelp-query+info-param-testactions": "{{doc-apihelp-param|query+info|testactions}}",
+       "apihelp-query+info-param-testactionsdetail": "{{doc-apihelp-param|query+info|testactionsdetail}}",
+       "apihelp-query+info-paramvalue-testactionsdetail-boolean": "{{doc-apihelp-paramvalue|query+info|testactionsdetail|boolean}}",
+       "apihelp-query+info-paramvalue-testactionsdetail-full": "{{doc-apihelp-paramvalue|query+info|testactionsdetail|full}}",
+       "apihelp-query+info-paramvalue-testactionsdetail-quick": "{{doc-apihelp-paramvalue|query+info|testactionsdetail|quick}}",
        "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}}",
        "apierror-assertnameduserfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User name passed in.",
        "apierror-assertuserfailed": "{{doc-apierror}}",
        "apierror-autoblocked": "{{doc-apierror}}",
+       "apierror-bad-badfilecontexttitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
        "apierror-badconfig-resulttoosmall": "{{doc-apierror}}",
        "apierror-badcontinue": "{{doc-apierror}}",
        "apierror-baddiff": "{{doc-apierror}}",
        "apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
        "apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n\n\"r\" is short for \"revision\". You may translate it.",
        "apiwarn-errorprinterfailed": "{{doc-apierror}}",
-       "apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
        "apiwarn-ignoring-invalid-templated-value": "{{doc-apierror}}\n\nParameters:\n* $1 - Target parameter having a bad value.\n* $2 - The bad value being ignored.",
        "apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
        "apiwarn-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied title.",
index 4450b6c..6a239f6 100644 (file)
        "apierror-assertnameduserfailed": "Проверка того, что участник — «$1», провалилась.",
        "apierror-assertuserfailed": "Проверка того, что участник авторизован, провалилась.",
        "apierror-autoblocked": "Ваш IP-адрес был автоматически заблокирован, потому что он был использован заблокированным участником.",
+       "apierror-bad-badfilecontexttitle": "Неверное название в параметре <var>$1badfilecontexttitle</var>.",
        "apierror-badconfig-resulttoosmall": "Значение <code>$wgAPIMaxResultSize</code> этой вики слишком мало, чтобы вместить базовую информацию о результате.",
        "apierror-badcontinue": "Некорректный параметр continue. Вы должны передать значение, возвращённое предыдущим запросом.",
        "apierror-baddiff": "Сравнение версий не может быть проведено. Одна или обе версии не существуют или у вас не достаточно прав чтобы просматривать их.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> не поддерживается. Пожалуйста, используйте <kbd>$2</kbd>.",
        "apiwarn-difftohidden": "Невозможно сравнить с r$1: содержимое скрыто.",
        "apiwarn-errorprinterfailed": "Сборщик ошибок упал. Будет совершена повторная попытка без параметров.",
-       "apiwarn-errorprinterfailed-ex": "Сборщик ошибок упал (будет совершена повторная попытка без параметров): $1",
        "apiwarn-ignoring-invalid-templated-value": "При обработке шаблонных параметров значение <kbd>$2</kbd> параметра <var>$1</var> проигнорировано.",
        "apiwarn-invalidcategory": "«$1» не является категорией.",
        "apiwarn-invalidtitle": "«$1» не является некорректным заголовком.",
index 4bff7ef..eb5e4fb 100644 (file)
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> є застарілим. Будь ласка, використовуйте натомість <kbd>$2</kbd>.",
        "apiwarn-difftohidden": "Не вдалося відкрити версію r$1: вміст приховано.",
        "apiwarn-errorprinterfailed": "Невдача через помилку принтера. Буде здійснено повторну спробу без параметрів.",
-       "apiwarn-errorprinterfailed-ex": "Невдача через помилку принтера (буде здійснено повторну спробу без параметрів): $1",
        "apiwarn-invalidcategory": "«$1» не є категорією.",
        "apiwarn-invalidtitle": "«$1» не є коректною назвою.",
        "apiwarn-invalidxmlstylesheetext": "Таблиця стилів повинна мати розширення <code>.xsl</code>.",
index 60cf575..cee1b7a 100644 (file)
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd>已弃用。请改用<kbd>$2</kbd>。",
        "apiwarn-difftohidden": "不能与r$1做差异比较:内容被隐藏。",
        "apiwarn-errorprinterfailed": "错误打印失败。将在没有参数的前提下重试。",
-       "apiwarn-errorprinterfailed-ex": "错误打印失败(将在没有参数的前提下重试):$1",
        "apiwarn-ignoring-invalid-templated-value": "当处理模板参数时,忽略<var>$1</var>中的值<kbd>$2</kbd>。",
        "apiwarn-invalidcategory": "“$1”不是一个分类。",
        "apiwarn-invalidtitle": "“$1”不是一个有效的标题。",
index 1b29c4d..1521095 100644 (file)
        "apihelp-edit-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
        "apihelp-edit-param-prependtext": "添加此文字至頁面開頭。覆蓋$1text。",
        "apihelp-edit-param-undo": "復原此修訂。覆寫 $1text、$1prependtext 與 $1appendtext。",
+       "apihelp-edit-param-undoafter": "撤銷從 $1undo 至此為止的所有修訂。若不設定則僅會撤銷一次修訂。",
        "apihelp-edit-param-redirect": "自動化解決重新導向。",
        "apihelp-edit-param-contentformat": "用於輸入文字的內容序列化格式。",
        "apihelp-edit-param-contentmodel": "新內容的內容模組。",
        "apihelp-edit-example-edit": "編輯頁面",
        "apihelp-edit-example-prepend": "前置頁面的 <kbd>_&#95;NOTOC_&#95;</kbd>。",
+       "apihelp-edit-example-undo": "撤銷從 13579 至 13585 之間的修訂,並帶自動生成的摘要。",
        "apihelp-emailuser-summary": "寄送電子郵件給使用者。",
        "apihelp-emailuser-param-target": "電子郵件的收件使用者。",
        "apihelp-emailuser-param-subject": "郵件主旨。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
        "apihelp-expandtemplates-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開的 wiki 文字。",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "透過在 wiki 文字裡擴充魔術字所定義的頁面屬性。",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "指定頁面的 JavaScript 設置變量。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-expandtemplates-param-includecomments": "輸出裡是否包含 HTML 註解。",
+       "apihelp-expandtemplates-example-simple": "展開 wiki 文字<kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>。",
        "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
        "apihelp-feedcontributions-param-user": "要取得哪些使用者的貢獻。",
        "apihelp-import-summary": "從其它 wiki 或 XML 檔案來匯入頁面。",
        "apihelp-import-param-summary": "匯入摘要。",
        "apihelp-import-param-xml": "上載的 XML 檔。",
+       "apihelp-import-param-assignknownusers": "分配編輯至所命名使用者已存在本地的本地使用者。",
        "apihelp-import-param-interwikisource": "用於跨 wiki 匯入:匯入的來源 wiki。",
        "apihelp-import-param-interwikipage": "用於跨 wiki 匯入:匯入的頁面。",
        "apihelp-import-param-fullhistory": "用於跨 wiki 匯入:完整匯入歷史,而不只是最新版本。",
        "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-limit": "要回傳的頁面總數。",
        "apihelp-query+allpages-param-dir": "列出時所採用的方向。",
        "apihelp-query+allpages-example-B": "顯示以字母 <kbd>B</kbd> 為開頭的所有頁面清單。",
        "apihelp-query+allpages-example-generator": "顯示 4 個以 <kbd>T</kbd> 為開頭的頁面之資訊。",
+       "apihelp-query+allpages-example-generator-revisions": "顯示前 2 個以 <kbd>Re</kbd> 為開頭的非重新導向頁面內容。",
        "apihelp-query+allredirects-summary": "列出至命名空間的所有重新導向。",
        "apihelp-query+allredirects-param-from": "要起始列舉的重新導向標題。",
        "apihelp-query+allredirects-param-to": "要終止列舉的重新導向標題。",
        "apihelp-query+mystashedfiles-param-limit": "要取得的檔案數量。",
        "apihelp-query+alltransclusions-param-from": "要起始列舉的嵌入標題。",
        "apihelp-query+alltransclusions-param-to": "要終止列舉的嵌入標題。",
+       "apihelp-query+alltransclusions-param-prefix": "搜尋以此值為開頭的所有嵌入標題。",
        "apihelp-query+alltransclusions-param-prop": "要包含到的資訊部份:",
        "apihelp-query+alltransclusions-paramvalue-prop-ids": "添加嵌入頁面的頁面 ID(不能與 $1unique 一起使用)。",
        "apihelp-query+alltransclusions-paramvalue-prop-title": "添加嵌入的標題。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
        "apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
        "apihelp-query+authmanagerinfo-example-login": "索取當開始登入時可能會用到的請求。",
+       "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "測試用於操作 <kbd>foo</kbd> 的認證是否足夠。",
        "apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。",
        "apihelp-query+backlinks-param-title": "要搜尋的標題。不能與 <var>$1pageid</var> 一起使用。",
        "apihelp-query+backlinks-param-pageid": "要搜尋的頁面 ID。不能與 <var>$1title</var> 一起使用。",
        "apihelp-query+deletedrevisions-param-tag": "僅列出以此標籤所標記的修訂。",
        "apihelp-query+deletedrevisions-param-user": "此列出由該使用者作出的修訂。",
        "apihelp-query+deletedrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。",
+       "apihelp-query+deletedrevisions-example-titles": "列出頁面 <kbd>Main Page</kbd> 與 <kbd>Talk:Main Page</kbd> 包含到內容的已刪除修訂。",
        "apihelp-query+deletedrevisions-example-revids": "列出已刪除修訂 <kbd>123456</kbd> 的資訊。",
        "apihelp-query+deletedrevs-summary": "列出已刪除的修訂。",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式|模式}}:$2",
        "apihelp-query+imageinfo-paramvalue-prop-url": "提供檔案與描述頁面的 URL。",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "替檔案添加 SHA-1 雜湊值。",
        "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-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+imageinfo-param-limit": "每個檔案要回傳的檔案修訂數量。",
        "apihelp-query+imageinfo-param-start": "列出的起始時間戳記。",
        "apihelp-query+info-paramvalue-prop-visitingwatchers": "有訪問頁面近期編輯數的各頁面監視者數目,如有允許的話。",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "各頁面的監視清單通知時間戳記。",
        "apihelp-query+info-paramvalue-prop-subjectid": "各對話頁的父頁面頁面 ID。",
-       "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。",
+       "apihelp-query+info-paramvalue-prop-url": "替各頁面給予一個完整 URL、一個編輯 URL,以及一個規範 URL。",
+       "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。請改用 <kbd>intestactions=read</kbd>。",
        "apihelp-query+info-paramvalue-prop-preload": "取得由 EditFormPreloadText 回傳的文字。",
        "apihelp-query+info-param-testactions": "測試目前使用者是否可執行頁面上的某項操作。",
        "apihelp-query+info-param-token": "請改用 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "取得有關頁面 <kbd>Main Page</kbd> 的資訊。",
+       "apihelp-query+info-example-protection": "取得有關 <kbd>Main Page</kbd> 的一般與保護資訊。",
        "apihelp-query+iwbacklinks-summary": "找出連結至指定跨 wiki 連結的所有頁面。",
        "apihelp-query+iwbacklinks-param-prefix": "跨 wiki 前綴。",
        "apihelp-query+iwbacklinks-param-title": "要搜尋的跨 wiki 連結。必須與 <var>$1blprefix</var> 一起使用。",
        "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。",
        "apihelp-query+iwlinks-param-prefix": "僅回傳帶有此前綴的跨 wiki 連結。",
+       "apihelp-query+iwlinks-param-title": "要搜尋的跨 wiki 連結。必須與 <var>$1prefix</var> 一起使用。",
        "apihelp-query+iwlinks-param-dir": "列出時所採用的方向。",
        "apihelp-query+iwlinks-example-simple": "從頁面 <kbd>Main Page</kbd> 取得跨 wiki 連結。",
        "apihelp-query+langbacklinks-summary": "找出連結至指定語言連結的所有頁面。",
        "apihelp-query+pagepropnames-summary": "列出所有在 wiki 使用的頁面屬性名稱。",
        "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。",
        "apihelp-query+pagepropnames-example-simple": "取得前 10 個屬性名稱。",
+       "apihelp-query+pageprops-summary": "取得定義在頁面內容的各樣頁面屬性。",
        "apihelp-query+pageprops-example-simple": "取得頁面 <kbd>Main Page</kbd> 與 <kbd>MediaWiki</kbd> 的屬性。",
        "apihelp-query+pageswithprop-summary": "列出使用到指定頁面屬性的所有頁面。",
        "apihelp-query+pageswithprop-param-prop": "要包含到的資訊部份:",
        "apihelp-query+pageswithprop-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+pageswithprop-param-dir": "排序的方向。",
        "apihelp-query+pageswithprop-example-simple": "列出前 10 個使用 <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> 的頁面。",
+       "apihelp-query+pageswithprop-example-generator": "取得前 10 個使用到 <code>_&#95;NOTOC_&#95;</code> 頁面的額外資訊。",
        "apihelp-query+prefixsearch-summary": "執行頁面標題的前綴搜尋。",
        "apihelp-query+prefixsearch-param-search": "搜尋字串。",
        "apihelp-query+prefixsearch-param-namespace": "搜尋的命名空間。若 <var>$1search</var> 以有效的命名空間前綴為開頭則會被忽略。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
        "apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "添加承擔編輯的使用者,並標記出是否為 IP 使用者。",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "添加承擔編輯的使用者。",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "添加編輯的註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-ids": "添加頁面 ID、最近更改 ID 以及新舊修訂 ID。",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "添加新舊頁面長度(位元組)。",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "若頁面為重新導向則標記編輯。",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "添加日誌資訊(日誌 ID、日誌類型、其它)至日誌項目。",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+recentchanges-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+recentchanges-param-limit": "要回傳變更總數。",
        "apihelp-query+recentchanges-param-toponly": "僅列出最新修訂的更改。",
        "apihelp-query+recentchanges-param-title": "篩選與這些頁面關聯的項目。",
        "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": "各重新導向的頁面 ID。",
        "apihelp-query+redirects-example-simple": "取得 [[Main Page]] 的重新導向清單",
        "apihelp-query+redirects-example-generator": "取得所有重新導向至 [[Main Page]] 的資訊。",
        "apihelp-query+revisions-summary": "取得修訂的資訊。",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "僅能在單一頁面使用(模式 #2)。",
        "apihelp-query+revisions-param-end": "列舉至此的時間戳記。",
        "apihelp-query+revisions-param-user": "僅包含由使用者做出的修訂。",
        "apihelp-query+revisions-param-excludeuser": "不包含由使用者做出的修訂。",
        "apihelp-query+search-param-sort": "設定回傳結果的排序。",
        "apihelp-query+search-example-simple": "搜尋 <kbd>meaning</kbd>。",
        "apihelp-query+search-example-text": "搜尋 <kbd>meaning</kbd> 的文字。",
+       "apihelp-query+search-example-generator": "取得有關回傳搜尋 <kbd>meaning</kbd> 相關內容頁面的頁面資訊。",
        "apihelp-query+siteinfo-summary": "回傳有關站台的一般資訊。",
        "apihelp-query+siteinfo-param-prop": "要取得的資訊:",
        "apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "已註冊命名空間別名清單。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊頁面別名清單。",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "魔術字及其別名清單。",
+       "apihelp-query+siteinfo-paramvalue-prop-usergroups": "回傳使用者群組以及所分配權限。",
+       "apihelp-query+siteinfo-paramvalue-prop-libraries": "回傳安裝在 wiki 上的函式庫。",
+       "apihelp-query+siteinfo-paramvalue-prop-extensions": "回傳安裝在 wiki 上的擴充功能。",
+       "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "回傳解析擴充標籤清單。",
+       "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "回傳用於使用者偏好設定的預設值。",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "回傳上傳對話框的設置。",
+       "apihelp-query+siteinfo-param-filteriw": "僅回傳跨 wiki 地圖的本地端或非本地端項目。",
        "apihelp-query+siteinfo-param-showalldb": "列出所有資料庫伺服器,不是只有最延遲的那台。",
        "apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。",
        "apihelp-query+siteinfo-param-inlanguagecode": "用於本地化語言的語言代碼(盡可能)與外觀名稱。",
        "apihelp-query+tags-paramvalue-prop-name": "添加標籤名稱。",
        "apihelp-query+tags-paramvalue-prop-displayname": "添加標籤的系統訊息。",
        "apihelp-query+tags-paramvalue-prop-description": "添加標籤的描述。",
+       "apihelp-query+tags-paramvalue-prop-defined": "指示標籤是否已定義。",
        "apihelp-query+tags-paramvalue-prop-active": "標籤是否仍被套用。",
        "apihelp-query+tags-example-simple": "列出可用標籤。",
        "apihelp-query+templates-summary": "回傳指定頁面中所有引用的頁面。",
        "apihelp-query+users-example-simple": "返回使用者 <kbd>Example</kbd> 的資訊。",
        "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-paramvalue-prop-patrol": "標記編輯為已巡查。",
        "apihelp-query+watchlist-paramvalue-prop-autopatrol": "標記編輯為自動巡查。",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "添加頁面舊有與新的長度。",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "在適當處添加日誌資訊。",
        "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+watchlist-param-type": "要顯示的更改類型:",
        "apihelp-query+watchlist-paramvalue-type-edit": "一般頁面編輯。",
        "apihelp-query+watchlistraw-param-show": "僅列出符合這些準則的項目。",
        "apihelp-query+watchlistraw-param-dir": "列出時所採用的方向。",
        "apihelp-query+watchlistraw-example-simple": "列出在目前使用者的監視清單裡頭頁面。",
+       "apihelp-query+watchlistraw-example-generator": "索取在目前使用者監視清單裡頁面的頁面資訊。",
        "apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。",
+       "apihelp-removeauthenticationdata-example-simple": "嘗試移除目前使用者用於 <kbd>FooAuthenticationRequest</kbd> 的資料。",
        "apihelp-resetpassword-summary": "寄送重新設定密碼的電子郵件給使用者。",
+       "apihelp-resetpassword-extended-description-noroutes": "沒有可用的重新設定密碼路由。\n\n在 <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> 啟用路由來使用此模組。",
+       "apihelp-resetpassword-param-user": "正重新設定的使用者。",
        "apihelp-resetpassword-param-email": "正被重新設定使用者的電子郵件地址。",
        "apihelp-resetpassword-example-user": "向使用者 <kbd>Example</kbd> 寄送重新設定密碼用的電子郵件。",
        "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
+       "apihelp-revisiondelete-param-type": "正執行的修訂刪除類型。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-show": "各修訂所要取消隱藏的內容。",
+       "apihelp-revisiondelete-param-suppress": "是否對管理者及其他使用者禁止資料。",
        "apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
        "apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
        "apihelp-revisiondelete-example-revision": "隱藏在頁面 <kbd>Main Page</kbd> 的修訂 <kbd>12345</kbd> 內容。",
        "apihelp-setpagelanguage-summary": "更改頁面的語言。",
        "apihelp-setpagelanguage-extended-description-disabled": "您不被允許在此 wiki 上變更頁面的語言。\n\n請啟用 <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> 來進行此操作。",
        "apihelp-setpagelanguage-param-reason": "變更的原因。",
+       "apihelp-setpagelanguage-param-tags": "更改對應自此項操作所導致出日誌項目的標籤。",
        "apihelp-setpagelanguage-example-language": "更改 <kbd>Main Page</kbd> 的語言成巴斯克語。",
+       "apihelp-setpagelanguage-example-default": "將 ID 是 123 頁面的語言更改為 wiki 的預設內容語言。",
        "apihelp-stashedit-summary": "在分享快取裡預備編輯。",
        "apihelp-stashedit-param-title": "正在編輯此頁面的標題。",
        "apihelp-stashedit-param-text": "頁面內容。",
        "apihelp-stashedit-param-contentformat": "用於輸入文字的內容序列化格式。",
        "apihelp-stashedit-param-baserevid": "基本修訂的修訂 ID。",
        "apihelp-stashedit-param-summary": "更改摘要。",
+       "apihelp-tag-param-revid": "要添加或移除標籤的一個或多個修訂 ID。",
+       "apihelp-tag-param-logid": "要添加或移除標籤的一個或多個日誌項目 ID。",
        "apihelp-tag-param-reason": "變更的原因。",
        "apihelp-tokens-summary": "取得資料修改動作的密鑰。",
        "apihelp-tokens-extended-description": "此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-upload-param-ignorewarnings": "忽略所有警告。",
        "apihelp-upload-param-file": "檔案內容。",
        "apihelp-upload-param-url": "索取檔案的來源 URL。",
+       "apihelp-upload-param-filesize": "整體上傳的檔案大小。",
        "apihelp-upload-param-chunk": "大量內容。",
        "apihelp-upload-param-async": "在可能的情況下讓潛在的大型檔案非同步處理。",
        "apihelp-upload-example-url": "從 URL 上傳。",
        "apihelp-validatepassword-param-realname": "真實姓名,用於當測試帳號建立時使用。",
        "apihelp-validatepassword-example-1": "驗證目前使用者的密碼 <kbd>foobar</kbd>。",
        "apihelp-validatepassword-example-2": "為建立的使用者 <kbd>Example</kbd> 驗證密碼 <kbd>qwerty</kbd>。",
+       "apihelp-watch-summary": "從目前使用者的監視清單添加或移除頁面。",
        "apihelp-watch-example-watch": "監視頁面 <kbd>Main Page</kbd>。",
        "apihelp-watch-example-unwatch": "取消監視頁面 <kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "監視在主命名空間最前的幾個頁面。",
        "apierror-assertnameduserfailed": "斷言使用者「$1」出錯。",
        "apierror-assertuserfailed": "斷言使用者已登入失敗。",
        "apierror-autoblocked": "您的 IP 位址已經被自動封鎖,因為它曾經被一名已封鎖的使用者使用過。",
+       "apierror-bad-badfilecontexttitle": "在 <var>$1badfilecontexttitle</var> 參數的無效標題。",
+       "apierror-baddiffto": "<var>$1diffto</var> 必須設定成非負值的數字、<kbd>prev</kbd>、<kbd>next</kbd>、或 <kbd>cur</kbd>。",
+       "apierror-badformat-generic": "內容模組 $2 不支援使用請求格式 $1。",
        "apierror-badgenerator-notgenerator": "模組 <kbd>$1</kbd> 不能作為產生器。",
        "apierror-badgenerator-unknown": "未知的 <kbd>generator=$1</kbd>。",
        "apierror-badip": "IP 參數無效。",
        "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
        "apierror-csp-report": "處理 CSP 報告時錯誤:$1。",
        "apierror-emptypage": "不允許建立空白的新頁面。",
+       "apierror-exceptioncaught": "[$1]捕獲異常:$2",
+       "apierror-exceptioncaughttype": "[$1]捕獲異常類型:$2",
        "apierror-filedoesnotexist": "檔案不存在。",
        "apierror-filenopath": "無法取得本地端檔案路徑。",
        "apierror-filetypecannotberotated": "無法旋轉的檔案類型。",
        "apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。",
        "apierror-mustbeloggedin-removeauth": "必須登入,才能移除身分核對資取。",
        "apierror-mustbeloggedin": "您必須登入才能$1。",
+       "apierror-nochanges": "沒有請求的更改。",
        "apierror-nodeleteablefile": "沒有這樣檔案的舊版本。",
        "apierror-noedit-anon": "匿名使用者不可編輯頁面。",
        "apierror-noedit": "您沒有權限來編輯頁面。",
        "apierror-nosuchsection": "沒有 ID 為 $1 的段落。",
        "apierror-nosuchsection-what": "在$2裡沒有段落$1。",
        "apierror-nosuchuserid": "沒有 ID 為 $1 的使用者。",
+       "apierror-notpatrollable": "因內容過舊,修訂 r$1 無法巡查。",
        "apierror-nouploadmodule": "未設定上傳模組。",
+       "apierror-opensearch-json-warnings": "警告不能以 OpenSearch JSON 格式表示。",
        "apierror-pagecannotexist": "命名空間不允許實際頁面。",
        "apierror-permissiondenied": "您沒有權限$1。",
        "apierror-permissiondenied-generic": "權限不足。",
        "apiwarn-deprecation-httpsexpected": "當應為 HTTPS 時,HTTP 要被使用。",
        "apiwarn-invalidcategory": "「$1」不是一個分類。",
        "apiwarn-invalidtitle": "「$1」不是一個有效標題。",
+       "apiwarn-invalidxmlstylesheet": "指定了無效或不存在的樣式表。",
+       "apiwarn-invalidxmlstylesheetns": "樣式表應在 {{ns:MediaWiki}} 命名空間。",
        "apiwarn-notfile": "「$1」不是一個檔案。",
+       "apiwarn-nothumb-noimagehandler": "無法建立縮圖,因為$1沒有相關的圖片處理器。",
+       "apiwarn-parse-nocontentmodel": "未提供 <var>title</var> 或 <var>contentmodel</var>,應是 $1。",
+       "apiwarn-tokennotallowed": "「$1」操作不允許目前的使用者。",
+       "apiwarn-unrecognizedvalues": "參數 <var>$1</var> 有無法識別的{{PLURAL:$3|值|值}}:$2。",
+       "apiwarn-unsupportedarray": "參數 <var>$1</var> 使用了不被支援的 PHP 陣列語法。",
        "apiwarn-validationfailed-badpref": "不是有效的偏好設定。",
        "apiwarn-validationfailed-cannotset": "不能透過此模組設定。",
+       "apiwarn-validationfailed": "<kbd>$1</kbd>驗證錯誤:$2",
        "api-feed-error-title": "錯誤($1)",
        "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/。"
index 4e0d0a7..869f768 100644 (file)
@@ -52,6 +52,13 @@ class MessageCache {
         */
        protected $cache;
 
+       /**
+        * Map of (lowercase message key => index) for all software defined messages
+        *
+        * @var array
+        */
+       protected $overridable;
+
        /**
         * @var bool[] Map of (language code => boolean)
         */
@@ -258,6 +265,8 @@ class MessageCache {
                        return true;
                }
 
+               $this->overridable = array_flip( Language::getMessageKeysFor( $code ) );
+
                # 8 lines of code just to say (once) that message cache is disabled
                if ( $this->mDisable ) {
                        static $shownDisabled = false;
@@ -1029,14 +1038,18 @@ class MessageCache {
                                $this->cache->getField( $code, 'HASH' )
                        );
                } else {
-                       // Message page does not exist or does not override a software message.
-                       // Load the message page, utilizing the individual message cache.
-                       $entry = $this->loadCachedMessagePageEntry(
-                               $title,
-                               $code,
-                               $this->cache->getField( $code, 'HASH' )
-                       );
-                       if ( substr( $entry, 0, 1 ) !== ' ' ) {
+                       // Message page either does not exist or does not override a software message
+                       if ( !isset( $this->overridable[$this->contLang->lcfirst( $title )] ) ) {
+                               // Message page does not override any software-defined message. A custom
+                               // message might be defined to have content or settings specific to the wiki.
+                               // Load the message page, utilizing the individual message cache as needed.
+                               $entry = $this->loadCachedMessagePageEntry(
+                                       $title,
+                                       $code,
+                                       $this->cache->getField( $code, 'HASH' )
+                               );
+                       }
+                       if ( $entry === null || substr( $entry, 0, 1 ) !== ' ' ) {
                                // Message does not have a MediaWiki page definition; try hook handlers
                                $message = false;
                                Hooks::run( 'MessagesPreLoad', [ $title, &$message, $code ] );
index d0381cf..f20637a 100644 (file)
@@ -525,15 +525,20 @@ class LocalisationCache {
                ini_set( 'apc.cache_by_default', $_apcEnabled );
                Wikimedia\restoreWarnings();
 
+               $data = [];
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
-
-                       // Lnguage files aren't required to contain all the possible variables, so suppress warnings
-                       // when variables don't exist in tests
-                       Wikimedia\suppressWarnings();
-                       $data = compact( self::$allKeys );
-                       Wikimedia\restoreWarnings();
+                       foreach ( self::$allKeys as $key ) {
+                               // Not all keys are set in language files, so
+                               // check they exist first
+                               if ( isset( $$key ) ) {
+                                       $data[$key] = $$key;
+                               }
+                       }
                } elseif ( $_fileType == 'aliases' ) {
-                       $data = compact( 'aliases' );
+                       if ( isset( $aliases ) ) {
+                               /** @suppress PhanUndeclaredVariable */
+                               $data['aliases'] = $aliases;
+                       }
                } else {
                        throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
                }
index 8dc63e5..d9ca8d7 100644 (file)
@@ -836,7 +836,10 @@ class ChangeTags {
                                                break;
                                        };
                                }
-                               $conds['ct_tag_id'] = $filterTagIds;
+
+                               if ( $filterTagIds !== [] ) {
+                                       $conds['ct_tag_id'] = $filterTagIds;
+                               }
                        } else {
                                $conds['ct_tag'] = $filter_tag;
                        }
index f8f3d1c..8d0971e 100644 (file)
@@ -1665,11 +1665,8 @@ class DifferenceEngine extends ContextSource {
         * @param Language $lang
         * @since 1.19
         */
-       public function setTextLanguage( $lang ) {
-               if ( !$lang instanceof Language ) {
-                       wfDeprecated( __METHOD__ . ' with other type than Language for $lang', '1.32' );
-               }
-               $this->mDiffLang = wfGetLangObj( $lang );
+       public function setTextLanguage( Language $lang ) {
+               $this->mDiffLang = $lang;
        }
 
        /**
index 95a171b..4fbddb5 100644 (file)
@@ -100,7 +100,8 @@ class ImportableUploadRevisionImporter implements UploadRevisionImporter {
                        return $this->newNotOkStatus();
                }
 
-               $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() );
+               $user = $importableRevision->getUserObj()
+                       ?: User::newFromName( $importableRevision->getUser(), false );
 
                # Do the actual upload
                if ( $archiveName ) {
index a9ca286..82cf7f4 100644 (file)
@@ -931,7 +931,9 @@ class MysqlUpdater extends DatabaseUpdater {
                                if ( $count == 0 ) {
                                        $lbFactory = $services->getDBLoadBalancerFactory();
                                        $lbFactory->waitForReplication( [
-                                               'wiki' => wfWikiID(), 'timeout' => self::REPLICATION_WAIT_TIMEOUT ] );
+                                               'domain' => $lbFactory->getLocalDomainID(),
+                                               'timeout' => self::REPLICATION_WAIT_TIMEOUT
+                                       ] );
                                }
                                $this->db->insert( 'templatelinks',
                                        [
index 46c55e0..4acde23 100644 (file)
        "config-extensions-requires": "$1 (патрабуе $2)",
        "config-screenshot": "здымак экрану",
        "config-extension-not-found": "Не атрымалася знайсьці файл рэгістрацыі для пашырэньня «$1»",
+       "config-extension-dependency": "Памылка залежнасьці ўзьнікла падчас усталяваньня пашырэньня «$1»: $2",
        "mainpagetext": "<strong>MediaWiki была ўсталяваная.</strong>",
        "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 Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index 6d1b894..cb6ec41 100644 (file)
        "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
        "config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
        "config-install-done-path": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקייה <code>$4</code>. ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
-       "config-install-success": "מדיה־ויקי הותקנה בהצלחה. עכשיו אפשר\nלבקר בכתובת <$1$2> כדי לצפות בוויקי שלך.\nאם יש לך שאלות, ר' את רשימת השאלות הנפוצות שלנו:\n<https://www.mediawiki.org/wiki/Manual:FAQ> ואפשר גם להשתמש\nבאתרי התמיכה שקישורים אליהם מופיעים באותו הדף.",
+       "config-install-success": "מדיה־ויקי הותקנה בהצלחה. עכשיו אפשר\nלבקר בכתובת <$1$2> כדי לצפות בוויקי שלך.\nאם יש לך שאלות, ר' את רשימת השאלות הנפוצות שלנו:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> ואפשר גם להשתמש\nבאתרי התמיכה שקישורים אליהם מופיעים באותו הדף.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
        "config-help-tooltip": "להרחיב",
        "config-skins-screenshots": "$1 (צילומי מסך: $2)",
        "config-extensions-requires": "$1 (נדרשת ההרחבה $2)",
        "config-screenshot": "צילום מסך",
+       "config-extension-not-found": "לא היה אפשר למצוא את קובץ הרישום של ההרחבה \"$1\"",
+       "config-extension-dependency": "שגיאת תלות נמצאה בזמן התקנת ההרחבה \"$1\"‏: $2",
        "mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
        "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 איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index 4ce8476..578195a 100644 (file)
        "config-skins-screenshots": "$1 (스크린샷: $2)",
        "config-extensions-requires": "$1 ($2 필요)",
        "config-screenshot": "스크린샷",
+       "config-extension-not-found": "확장 기능 \"$1\"에 대한 등록 파일을 찾을 수 없습니다",
+       "config-extension-dependency": "확장 기능 \"$1\"을 설치하는 도중 의존성 오류가 발생했습니다: $2",
        "mainpagetext": "<strong>미디어위키가 설치되었습니다.</strong>",
        "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 당신의 위키에서 스팸에 대처하는 법을 배우세요]"
 }
index 1554f40..d92256f 100644 (file)
        "config-install-mainpage-failed": "Не можев да вметнам главна страница: $1",
        "config-install-done": "<strong>Честитаме!</strong>\nУспешно го воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во основата на воспоставката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n<strong>Напомена</strong>: Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да <strong>[$2 влезете на вашето вики]</strong>.",
        "config-install-done-path": "<strong>Честитаме!</strong>\nГо воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во <code>$4</code>. Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n<strong>Напомена</strong>: Ако ова не го направите сега, создадената податотека со поставки повеќе нема да биде на достапна, освен ако не ја преземете пред да излезете.\n\nОткога ќе завршите со тоа, можете да <strong>[$2 влезете на вашето вики]</strong>.",
-       "config-install-success": "МедијаВики е успешно воспоставен. Сега можете да појдете на <$1$2> за да го погледате вашето вики.\nАко имате било какви прашања, погледајте го списокот на често поставувани прашања:\n<https://www.mediawiki.org/wiki/Manual:FAQ> или појдете на еден од форумите за поддршка наведени на таа страница.",
+       "config-install-success": "МедијаВики е успешно воспоставен. Сега можете да појдете на <$1$2> за да го погледате вашето вики.\nАко имате било какви прашања, погледајте го списокот на често поставувани прашања:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или појдете на еден од форумите за поддршка наведени на таа страница.",
        "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
        "config-help": "помош",
        "config-help-tooltip": "стиснете да расклопите",
        "config-skins-screenshots": "$1 (екр. снимки: $2)",
        "config-extensions-requires": "$1 (бара $2)",
        "config-screenshot": "екранска снимка",
+       "config-extension-not-found": "Не можев да ја најдам регистрациската податотека за додатокот „$1“",
+       "config-extension-dependency": "Наидов на грешка со зависноста при воспоставката на додатокот „$1“: $2",
        "mainpagetext": "<strong>МедијаВики е успешно воспоставен.</strong>",
        "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 Дознајте како да се борите против спам на вашето вики]"
 }
index 0459807..f87e774 100644 (file)
        "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1",
        "config-install-done": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsen, in dezelfde map als index.php.\nDe download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
        "config-install-done-path": "<strong>Gefeliciteerd!</strong>\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in <code>$4</code> plaatsen. De download zou automatisch moeten zijn gestart.\n\nAls de download niet is gestart of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\n<strong>Let op:</strong> Als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u <strong>[$2 uw wiki gebruiken]</strong>.",
-       "config-install-success": "MediaWiki is geïnstalleerd. U kunt nu\n<$1$2> bezoeken om uw wiki te bekijken.\nAls u vragen hebt, bekijk dan onze lijst met veelgestelde vragen:\n<https://www.mediawiki.org/wiki/Manual:FAQ>, of gebruik een van de hulpforums vermeld op die pagina.",
+       "config-install-success": "MediaWiki is geïnstalleerd. U kunt nu\n<$1$2> bezoeken om uw wiki te bekijken.\nAls u vragen hebt, bekijk dan onze lijst met veelgestelde vragen:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ>, of gebruik een van de hulpforums vermeld op die pagina.",
        "config-download-localsettings": "<code>LocalSettings.php</code> downloaden",
        "config-help": "hulp",
        "config-help-tooltip": "klik om uit te vouwen",
        "config-skins-screenshots": "$1 (schermafbeeldingen: $2)",
        "config-extensions-requires": "$1 (vereist $2)",
        "config-screenshot": "schermafbeelding",
+       "config-extension-not-found": "Kan het registratiebestand voor de uitbreiding \"$1\" niet vinden",
        "mainpagetext": "<strong>De installatie van MediaWiki is geslaagd.</strong>",
        "mainpagedocfooter": "Raadpleeg de [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lijst met instellingen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Leer hoe u spam kunt voorkomen op uw wiki]"
 }
index 8a2dd0f..b441bc5 100644 (file)
        "config-skins-screenshots": "$1 (zrzut ekranu: $2)",
        "config-extensions-requires": "$1 (wymaga $2)",
        "config-screenshot": "zrzut ekranu",
+       "config-extension-not-found": "Nie można znaleźć pliku rejestrującego rozszerzenie „$1”.",
+       "config-extension-dependency": "Podczas instalacji rozszerzenia „$1” wystąpił błąd związany z zależnościami: $2",
        "mainpagetext": "<strong>Instalacja MediaWiki powiodła się.</strong>",
        "mainpagedocfooter": "Zapoznaj się z [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznikiem użytkownika] zawierającym informacje o tym jak korzystać z oprogramowania wiki.\n\n== Na początek ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista ustawień konfiguracyjnych]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki (lista dyskusyjna)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 37706fa..9d9534f 100644 (file)
@@ -22,7 +22,8 @@
                        "Mywood",
                        "Impersonator 1",
                        "Fengchao",
-                       "Duolaimi"
+                       "Duolaimi",
+                       "A Chinese Wikipedian"
                ]
        },
        "config-desc": "MediaWiki安装程序",
        "config-skins-screenshots": "$1(截图:$2)",
        "config-extensions-requires": "$1(需要$2)",
        "config-screenshot": "截图",
+       "config-extension-not-found": "找不到扩展名“$1”的注册文件",
+       "config-extension-dependency": "安装扩展名“$1”时遇到了一个依赖错误:$2",
        "mainpagetext": "<strong>已安装MediaWiki。</strong>",
        "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上打击破坏]"
 }
index 1e83167..39b5b3b 100644 (file)
@@ -131,7 +131,7 @@ class JobRunner implements LoggerAwareInterface {
                }
                // Bail out if there is too much DB lag.
                // This check should not block as we want to try other wiki queues.
-               list( , $maxLag ) = $lbFactory->getMainLB( wfWikiID() )->getMaxLag();
+               list( , $maxLag ) = $lbFactory->getMainLB()->getMaxLag();
                if ( $maxLag >= self::MAX_ALLOWED_LAG ) {
                        $response['reached'] = 'replica-lag-limit';
                        return $response;
@@ -536,7 +536,7 @@ class JobRunner implements LoggerAwareInterface {
                $syncThreshold = $this->config->get( 'JobSerialCommitThreshold' );
 
                $time = false;
-               $lb = $lbFactory->getMainLB( wfWikiID() );
+               $lb = $lbFactory->getMainLB();
                if ( $syncThreshold !== false && $lb->getServerCount() > 1 ) {
                        // Generally, there is one master connection to the local DB
                        $dbwSerial = $lb->getAnyOpenConnection( $lb->getWriterIndex() );
index 3488eb6..3f922a3 100644 (file)
@@ -91,7 +91,7 @@ class RefreshLinksJob extends Job {
                        if ( !isset( $this->params['range'] ) ) {
                                $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                                if ( !$lbFactory->waitForReplication( [
-                                               'wiki'    => wfWikiID(),
+                                               'domain'  => $lbFactory->getLocalDomainID(),
                                                'timeout' => self::LAG_WAIT_TIMEOUT
                                ] ) ) { // only try so hard
                                        $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
index 68d4c9a..c436b64 100644 (file)
@@ -1052,7 +1052,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                //   that transactions by themselves don't make changes, only actual writes
                //   within the transaction matter, which we still detect.
                return !preg_match(
-                       '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
+                       '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SAVEPOINT|RELEASE|SET|SHOW|EXPLAIN|\(SELECT)\b/i',
+                       $sql
+               );
        }
 
        /**
@@ -1542,14 +1544,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $options = [ $options ];
                }
 
-               $res = $this->select( $table, $var, $cond, $fname, $options, $join_conds );
+               $res = $this->select( $table, [ 'value' => $var ], $cond, $fname, $options, $join_conds );
                if ( $res === false ) {
                        return false;
                }
 
                $values = [];
                foreach ( $res as $row ) {
-                       $values[] = $row->$var;
+                       $values[] = $row->value;
                }
 
                return $values;
index 6c9c54e..7559b06 100644 (file)
@@ -84,6 +84,10 @@ class DatabaseDomain {
                        $database = null;
                }
 
+               if ( $schema === '' ) {
+                       $schema = null;
+               }
+
                return new self( $database, $schema, $prefix );
        }
 
@@ -96,10 +100,10 @@ class DatabaseDomain {
 
        /**
         * @param DatabaseDomain|string $other
-        * @return bool
+        * @return bool Whether the domain instances are the same by value
         */
        public function equals( $other ) {
-               if ( $other instanceof DatabaseDomain ) {
+               if ( $other instanceof self ) {
                        return (
                                $this->database === $other->database &&
                                $this->schema === $other->schema &&
@@ -110,6 +114,44 @@ class DatabaseDomain {
                return ( $this->getId() === $other );
        }
 
+       /**
+        * Check whether the domain $other meets the specifications of this domain
+        *
+        * If this instance has a null database specifier, then $other can have any database
+        * specified, including the null, and likewise if the schema specifier is null. This
+        * is not transitive like equals() since a domain that explicitly wants a certain
+        * database or schema cannot be satisfied by one of another (nor null). If the prefix
+        * is empty and the DB and schema are both null, then the entire domain is considered
+        * unspecified, and any prefix of $other is considered compatible.
+        *
+        * @param DatabaseDomain|string $other
+        * @return bool
+        * @since 1.32
+        */
+       public function isCompatible( $other ) {
+               if ( $this->isUnspecified() ) {
+                       return true; // even the prefix doesn't matter
+               }
+
+               $other = ( $other instanceof self ) ? $other : self::newFromId( $other );
+
+               return (
+                       ( $this->database === $other->database || $this->database === null ) &&
+                       ( $this->schema === $other->schema || $this->schema === null ) &&
+                       $this->prefix === $other->prefix
+               );
+       }
+
+       /**
+        * @return bool
+        * @since 1.32
+        */
+       public function isUnspecified() {
+               return (
+                       $this->database === null && $this->schema === null && $this->prefix === ''
+               );
+       }
+
        /**
         * @return string|null Database name
         */
@@ -150,7 +192,12 @@ class DatabaseDomain {
                if ( $this->schema !== null ) {
                        $parts[] = $this->schema;
                }
-               if ( $this->prefix != '' ) {
+               if ( $this->prefix != '' || $this->schema !== null ) {
+                       // If there is a schema, then we need the prefix to disambiguate.
+                       // For engines like Postgres that use schemas, this awkwardness is hopefully
+                       // avoided since it is easy to have one DB per server (to avoid having many users)
+                       // and use schema/prefix to have wiki farms. For example, a domain schemes could be
+                       // wiki-<project>-<language>, e.g. "wiki-fitness-es"/"wiki-sports-fr"/"wiki-news-en".
                        $parts[] = $this->prefix;
                }
 
index d84ba65..1f3fe4c 100644 (file)
@@ -28,6 +28,7 @@ use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
 use ArrayUtils;
+use UnexpectedValueException;
 use InvalidArgumentException;
 use RuntimeException;
 use Exception;
@@ -952,6 +953,16 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
+               // Final sanity check to make sure the right domain is selected
+               if (
+                       $conn instanceof IDatabase &&
+                       !$this->localDomain->isCompatible( $conn->getDomainID() )
+               ) {
+                       throw new UnexpectedValueException(
+                               "Got connection to '{$conn->getDomainID()}', " .
+                               "but expected local domain ('{$this->localDomain}')." );
+               }
+
                return $conn;
        }
 
@@ -1038,8 +1049,13 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
-               // Increment reference count
                if ( $conn instanceof IDatabase ) {
+                       // Final sanity check to make sure the right domain is selected
+                       if ( !$domainInstance->isCompatible( $conn->getDomainID() ) ) {
+                               throw new UnexpectedValueException(
+                                       "Got connection to '{$conn->getDomainID()}', but expected '$domain'." );
+                       }
+                       // Increment reference count
                        $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                        $conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
                }
index 3144504..d32e93f 100644 (file)
@@ -342,8 +342,8 @@ class EmailNotification {
 
                $keys['$PAGETITLE'] = $this->title->getPrefixedText();
                $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
-               $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
-                       wfMessage( 'enotif_minoredit' )->inContentLanguage()->text() : '';
+               $keys['$PAGEMINOREDIT'] = "\n" . ( $this->minorEdit ?
+                       wfMessage( 'enotif_minoredit' )->inContentLanguage()->text() : '' );
                $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
 
                if ( $this->editor->isAnon() ) {
index 803bf0a..36632f0 100644 (file)
@@ -120,7 +120,7 @@ class Article implements Page {
         * here, there doesn't seem to be any other way to stop calling
         * OutputPage::enableSectionEditLinks() and still have it work as it did before.
         */
-       private $disableSectionEditForRender = false;
+       protected $viewIsRenderAction = false;
 
        /**
         * Constructor and clear the article
@@ -633,7 +633,7 @@ class Article implements Page {
                if ( $outputPage->isPrintable() ) {
                        $parserOptions->setIsPrintable( true );
                        $poOptions['enableSectionEditLinks'] = false;
-               } elseif ( $this->disableSectionEditForRender
+               } elseif ( $this->viewIsRenderAction
                        || !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user )
                ) {
                        $poOptions['enableSectionEditLinks'] = false;
@@ -1735,7 +1735,8 @@ class Article implements Page {
        public function render() {
                $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
                $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               $this->disableSectionEditForRender = true;
+               // We later set 'enableSectionEditLinks=false' based on this; also used by ImagePage
+               $this->viewIsRenderAction = true;
                $this->view();
        }
 
index bf3eaf4..1773e16 100644 (file)
@@ -86,18 +86,15 @@ class ImagePage extends Article {
                $this->repo = $img->getRepo();
        }
 
-       /**
-        * Handler for action=render
-        * Include body text only; none of the image extras
-        */
-       public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               parent::view();
-       }
-
        public function view() {
                global $wgShowEXIF;
 
+               // For action=render, include body text only; none of the image extras
+               if ( $this->viewIsRenderAction ) {
+                       parent::view();
+                       return;
+               }
+
                $out = $this->getContext()->getOutput();
                $request = $this->getContext()->getRequest();
                $diff = $request->getVal( 'diff' );
index dcb2c89..db04077 100644 (file)
@@ -273,25 +273,30 @@ class Parser {
        /** @var SpecialPageFactory */
        private $specialPageFactory;
 
+       /** @var Config */
+       private $siteConfig;
+
        /**
-        * @param array $conf See $wgParserConf documentation
+        * @param array $parserConf See $wgParserConf documentation
         * @param MagicWordFactory|null $magicWordFactory
         * @param Language|null $contLang Content language
         * @param ParserFactory|null $factory
         * @param string|null $urlProtocols As returned from wfUrlProtocols()
         * @param SpecialPageFactory|null $spFactory
+        * @param Config|null $siteConfig
         */
        public function __construct(
-               array $conf = [], MagicWordFactory $magicWordFactory = null, Language $contLang = null,
-               ParserFactory $factory = null, $urlProtocols = null, SpecialPageFactory $spFactory = null
+               array $parserConf = [], MagicWordFactory $magicWordFactory = null,
+               Language $contLang = null, ParserFactory $factory = null, $urlProtocols = null,
+               SpecialPageFactory $spFactory = null, Config $siteConfig = null
        ) {
-               $this->mConf = $conf;
+               $this->mConf = $parserConf;
                $this->mUrlProtocols = $urlProtocols ?? wfUrlProtocols();
                $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
                        self::EXT_LINK_ADDR .
                        self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
-               if ( isset( $conf['preprocessorClass'] ) ) {
-                       $this->mPreprocessorClass = $conf['preprocessorClass'];
+               if ( isset( $parserConf['preprocessorClass'] ) ) {
+                       $this->mPreprocessorClass = $parserConf['preprocessorClass'];
                } elseif ( wfIsHHVM() ) {
                        # Under HHVM Preprocessor_Hash is much faster than Preprocessor_DOM
                        $this->mPreprocessorClass = Preprocessor_Hash::class;
@@ -314,6 +319,7 @@ class Parser {
 
                $this->factory = $factory ?? $services->getParserFactory();
                $this->specialPageFactory = $spFactory ?? $services->getSpecialPageFactory();
+               $this->siteConfig = $siteConfig ?? MediaWikiServices::getInstance()->getMainConfig();
        }
 
        /**
@@ -542,8 +548,6 @@ class Parser {
         * @return string
         */
        protected function makeLimitReport() {
-               global $wgShowHostnames;
-
                $maxIncludeSize = $this->mOptions->getMaxIncludeSize();
 
                $cpuTime = $this->mOutput->getTimeSinceStart( 'cpu' );
@@ -584,7 +588,7 @@ class Parser {
                Hooks::run( 'ParserLimitReportPrepare', [ $this, $this->mOutput ] );
 
                $limitReport = "NewPP limit report\n";
-               if ( $wgShowHostnames ) {
+               if ( $this->siteConfig->get( 'ShowHostnames' ) ) {
                        $limitReport .= 'Parsed by ' . wfHostname() . "\n";
                }
                $limitReport .= 'Cached time: ' . $this->mOutput->getCacheTime() . "\n";
@@ -635,7 +639,7 @@ class Parser {
                $this->mOutput->setLimitReportData( 'limitreport-timingprofile', $profileReport );
 
                // Add other cache related metadata
-               if ( $wgShowHostnames ) {
+               if ( $this->siteConfig->get( 'ShowHostnames' ) ) {
                        $this->mOutput->setLimitReportData( 'cachereport-origin', wfHostname() );
                }
                $this->mOutput->setLimitReportData( 'cachereport-timestamp',
@@ -2153,8 +2157,6 @@ class Parser {
         * @private
         */
        public function replaceInternalLinks2( &$s ) {
-               global $wgExtraInterlanguageLinkPrefixes;
-
                static $tc = false, $e1, $e1_img;
                # the % is needed to support urlencoded titles as well
                if ( !$tc ) {
@@ -2359,7 +2361,7 @@ class Parser {
                                if (
                                        $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
                                                Language::fetchLanguageName( $iw, null, 'mw' ) ||
-                                               in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
+                                               in_array( $iw, $this->siteConfig->get( 'ExtraInterlanguageLinkPrefixes' ) )
                                        )
                                ) {
                                        # T26502: filter duplicates
@@ -2541,9 +2543,6 @@ class Parser {
         * @return string
         */
        public function getVariableValue( $index, $frame = false ) {
-               global $wgSitename, $wgServer, $wgServerName;
-               global $wgArticlePath, $wgScriptPath, $wgStylePath;
-
                if ( is_null( $this->mTitle ) ) {
                        // If no title set, bad things are going to happen
                        // later. Title should always be set since this
@@ -2845,22 +2844,21 @@ class Parser {
                                $value = SpecialVersion::getVersion();
                                break;
                        case 'articlepath':
-                               return $wgArticlePath;
+                               return $this->siteConfig->get( 'ArticlePath' );
                        case 'sitename':
-                               return $wgSitename;
+                               return $this->siteConfig->get( 'Sitename' );
                        case 'server':
-                               return $wgServer;
+                               return $this->siteConfig->get( 'Server' );
                        case 'servername':
-                               return $wgServerName;
+                               return $this->siteConfig->get( 'ServerName' );
                        case 'scriptpath':
-                               return $wgScriptPath;
+                               return $this->siteConfig->get( 'ScriptPath' );
                        case 'stylepath':
-                               return $wgStylePath;
+                               return $this->siteConfig->get( 'StylePath' );
                        case 'directionmark':
                                return $pageLang->getDirMark();
                        case 'contentlanguage':
-                               global $wgLanguageCode;
-                               return $wgLanguageCode;
+                               return $this->siteConfig->get( 'LanguageCode' );
                        case 'pagelanguage':
                                $value = $pageLang->getCode();
                                break;
@@ -3803,9 +3801,7 @@ class Parser {
         * @return string
         */
        public function interwikiTransclude( $title, $action ) {
-               global $wgEnableScaryTranscluding, $wgTranscludeCacheExpiry;
-
-               if ( !$wgEnableScaryTranscluding ) {
+               if ( !$this->siteConfig->get( 'EnableScaryTranscluding' ) ) {
                        return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
                }
 
@@ -3825,7 +3821,7 @@ class Parser {
                                ( $wikiId !== false ) ? $wikiId : 'external',
                                sha1( $url )
                        ),
-                       $wgTranscludeCacheExpiry,
+                       $this->siteConfig->get( 'TranscludeCacheExpiry' ),
                        function ( $oldValue, &$ttl ) use ( $url, $fname, $cache ) {
                                $req = MWHttpRequest::factory( $url, [], $fname );
 
@@ -4127,8 +4123,6 @@ class Parser {
         * @private
         */
        public function formatHeadings( $text, $origText, $isMain = true ) {
-               global $wgMaxTocLevel;
-
                # Inhibit editsection links if requested in the page
                if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
                        $maybeShowEditLink = false;
@@ -4199,6 +4193,7 @@ class Parser {
 
                $headlines = $numMatches !== false ? $matches[3] : [];
 
+               $maxTocLevel = $this->siteConfig->get( 'MaxTocLevel' );
                foreach ( $headlines as $headline ) {
                        $isTemplate = false;
                        $titleText = false;
@@ -4221,7 +4216,7 @@ class Parser {
                                # Increase TOC level
                                $toclevel++;
                                $sublevelCount[$toclevel] = 0;
-                               if ( $toclevel < $wgMaxTocLevel ) {
+                               if ( $toclevel < $maxTocLevel ) {
                                        $prevtoclevel = $toclevel;
                                        $toc .= Linker::tocIndent();
                                        $numVisible++;
@@ -4243,8 +4238,8 @@ class Parser {
                                if ( $i == 0 ) {
                                        $toclevel = 1;
                                }
-                               if ( $toclevel < $wgMaxTocLevel ) {
-                                       if ( $prevtoclevel < $wgMaxTocLevel ) {
+                               if ( $toclevel < $maxTocLevel ) {
+                                       if ( $prevtoclevel < $maxTocLevel ) {
                                                # Unindent only if the previous toc level was shown :p
                                                $toc .= Linker::tocUnindent( $prevtoclevel - $toclevel );
                                                $prevtoclevel = $toclevel;
@@ -4254,7 +4249,7 @@ class Parser {
                                }
                        } else {
                                # No change in level, end TOC line
-                               if ( $toclevel < $wgMaxTocLevel ) {
+                               if ( $toclevel < $maxTocLevel ) {
                                        $toc .= Linker::tocLineEnd();
                                }
                        }
@@ -4379,7 +4374,7 @@ class Parser {
                                ) . ' ' . $headline;
                        }
 
-                       if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) {
+                       if ( $enoughToc && ( !isset( $maxTocLevel ) || $toclevel < $maxTocLevel ) ) {
                                $toc .= Linker::tocLine( $linkAnchor, $tocline,
                                        $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) );
                        }
@@ -4460,7 +4455,7 @@ class Parser {
                }
 
                if ( $enoughToc ) {
-                       if ( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
+                       if ( $prevtoclevel > 0 && $prevtoclevel < $maxTocLevel ) {
                                $toc .= Linker::tocUnindent( $prevtoclevel - 1 );
                        }
                        $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
@@ -4639,8 +4634,6 @@ class Parser {
         * @return string
         */
        public function getUserSig( &$user, $nickname = false, $fancySig = null ) {
-               global $wgMaxSigChars;
-
                $username = $user->getName();
 
                # If not given, retrieve from the user object.
@@ -4654,7 +4647,7 @@ class Parser {
 
                $nickname = $nickname == null ? $username : $nickname;
 
-               if ( mb_strlen( $nickname ) > $wgMaxSigChars ) {
+               if ( mb_strlen( $nickname ) > $this->siteConfig->get( 'MaxSigChars' ) ) {
                        $nickname = $username;
                        wfDebug( __METHOD__ . ": $username has overlong signature.\n" );
                } elseif ( $fancySig !== false ) {
@@ -5931,9 +5924,9 @@ class Parser {
                return '#' . Sanitizer::escapeIdForLink( $sectionName );
        }
 
-       private static function makeLegacyAnchor( $sectionName ) {
-               global $wgFragmentMode;
-               if ( isset( $wgFragmentMode[1] ) && $wgFragmentMode[1] === 'legacy' ) {
+       private function makeLegacyAnchor( $sectionName ) {
+               $fragmentMode = $this->config->get( 'FragmentMode' );
+               if ( isset( $fragmentMode[1] ) && $fragmentMode[1] === 'legacy' ) {
                        // ForAttribute() and ForLink() are the same for legacy encoding
                        $id = Sanitizer::escapeIdForAttribute( $sectionName, Sanitizer::ID_FALLBACK );
                } else {
@@ -5971,7 +5964,7 @@ class Parser {
                # Strip out wikitext links(they break the anchor)
                $text = $this->stripSectionName( $text );
                $sectionName = self::getSectionNameFromStrippedText( $text );
-               return self::makeLegacyAnchor( $sectionName );
+               return $this->makeLegacyAnchor( $sectionName );
        }
 
        /**
index 4238b27..eb05ace 100644 (file)
@@ -26,7 +26,7 @@ use MediaWiki\Special\SpecialPageFactory;
  */
 class ParserFactory {
        /** @var array */
-       private $conf;
+       private $parserConf;
 
        /** @var MagicWordFactory */
        private $magicWordFactory;
@@ -40,23 +40,28 @@ class ParserFactory {
        /** @var SpecialPageFactory */
        private $specialPageFactory;
 
+       /** @var Config */
+       private $siteConfig;
+
        /**
-        * @param array $conf See $wgParserConf documentation
+        * @param array $parserConf See $wgParserConf documentation
         * @param MagicWordFactory $magicWordFactory
         * @param Language $contLang Content language
         * @param string $urlProtocols As returned from wfUrlProtocols()
         * @param SpecialPageFactory $spFactory
+        * @param Config $siteConfig
         * @since 1.32
         */
        public function __construct(
-               array $conf, MagicWordFactory $magicWordFactory, Language $contLang, $urlProtocols,
-               SpecialPageFactory $spFactory
+               array $parserConf, MagicWordFactory $magicWordFactory, Language $contLang, $urlProtocols,
+               SpecialPageFactory $spFactory, Config $siteConfig
        ) {
-               $this->conf = $conf;
+               $this->parserConf = $parserConf;
                $this->magicWordFactory = $magicWordFactory;
                $this->contLang = $contLang;
                $this->urlProtocols = $urlProtocols;
                $this->specialPageFactory = $spFactory;
+               $this->siteConfig = $siteConfig;
        }
 
        /**
@@ -64,7 +69,7 @@ class ParserFactory {
         * @since 1.32
         */
        public function create() : Parser {
-               return new Parser( $this->conf, $this->magicWordFactory, $this->contLang, $this,
-                       $this->urlProtocols, $this->specialPageFactory );
+               return new Parser( $this->parserConf, $this->magicWordFactory, $this->contLang, $this,
+                       $this->urlProtocols, $this->specialPageFactory, $this->siteConfig );
        }
 }
index 6d238ca..847214a 100644 (file)
@@ -325,7 +325,6 @@ class ParserOutput extends CacheTime {
                        $text = preg_replace_callback(
                                self::EDITSECTION_REGEX,
                                function ( $m ) {
-                                       global $wgOut, $wgLang;
                                        $editsectionPage = Title::newFromText( htmlspecialchars_decode( $m[1] ) );
                                        $editsectionSection = htmlspecialchars_decode( $m[2] );
                                        $editsectionContent = isset( $m[4] ) ? Sanitizer::decodeCharReferences( $m[3] ) : null;
@@ -334,11 +333,12 @@ class ParserOutput extends CacheTime {
                                                throw new MWException( "Bad parser output text." );
                                        }
 
-                                       $skin = $wgOut->getSkin();
-                                       return $skin->doEditSectionLink( $editsectionPage,
+                                       $context = RequestContext::getMain();
+                                       return $context->getSkin()->doEditSectionLink(
+                                               $editsectionPage,
                                                $editsectionSection,
                                                $editsectionContent,
-                                               $wgLang
+                                               $context->getLanguage()
                                        );
                                },
                                $text
index f545532..1889167 100644 (file)
@@ -1610,21 +1610,14 @@ abstract class Skin extends ContextSource {
         * @param string $section The designation of the section being pointed to,
         *   to be included in the link, like "&section=$section"
         * @param string|null $tooltip The tooltip to use for the link: will be escaped
-        *   and wrapped in the 'editsectionhint' message.
-        *   Not setting this parameter is deprecated.
-        * @param Language|string $lang Language object or language code string.
-        *   Type string is deprecated. Not setting this parameter is deprecated.
+        *   and wrapped in the 'editsectionhint' message
+        * @param Language $lang Language object
         * @return string HTML to use for edit link
         */
-       public function doEditSectionLink( Title $nt, $section, $tooltip = null, $lang = false ) {
+       public function doEditSectionLink( Title $nt, $section, $tooltip, Language $lang ) {
                // HTML generated here should probably have userlangattributes
                // added to it for LTR text on RTL pages
 
-               if ( !$lang instanceof Language ) {
-                       wfDeprecated( __METHOD__ . ' with other type than Language for $lang', '1.32' );
-                       $lang = wfGetLangObj( $lang );
-               }
-
                $attribs = [];
                if ( !is_null( $tooltip ) ) {
                        $attribs['title'] = $this->msg( 'editsectionhint' )->rawParams( $tooltip )
index 5448013..c725d10 100644 (file)
@@ -82,11 +82,6 @@ class SpecialApiHelp extends UnlistedSpecialPage {
                                $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
                        ) );
                        return;
-               } catch ( UsageException $ex ) {
-                       $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
-                               $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
-                       ) );
-                       return;
                }
 
                ApiHelp::getHelp( $this->getContext(), $module, $options );
index fe9a5c9..5e5ca1b 100644 (file)
@@ -492,7 +492,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @param int $userId
         */
        public static function purge( $wikiId, $userId ) {
-               $cache = ObjectCache::getMainWANInstance();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                $key = $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId );
                $cache->delete( $key );
        }
@@ -503,7 +503,10 @@ class User implements IDBAccessObject, UserIdentity {
         * @return string
         */
        protected function getCacheKey( WANObjectCache $cache ) {
-               return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
+               return $cache->makeGlobalKey( 'user', 'id', $lbFactory->getLocalDomainID(), $this->mId );
        }
 
        /**
index f9985eb..289cc85 100644 (file)
@@ -20,11 +20,6 @@ class ExpiryInputWidget extends Widget {
         */
        protected $relativeInput;
 
-       /**
-        * @var bool
-        */
-       protected $noDatePicker;
-
        /**
         * @var bool
         */
@@ -37,11 +32,8 @@ class ExpiryInputWidget extends Widget {
        public function __construct( Widget $relativeInput, array $options = [] ) {
                $config = \RequestContext::getMain()->getConfig();
 
-               $options['noDatePicker'] = $config->get( 'ExpiryWidgetNoDatePicker' );
-
                parent::__construct( $options );
 
-               $this->noDatePicker = $options['noDatePicker'];
                $this->required = $options['required'] ?? false;
 
                // Properties
@@ -49,14 +41,11 @@ class ExpiryInputWidget extends Widget {
                $this->relativeInput->addClasses( [ 'mw-widget-ExpiryWidget-relative' ] );
 
                // Initialization
-               $classes = [
-                       'mw-widget-ExpiryWidget',
-               ];
-               if ( $options['noDatePicker'] === false ) {
-                       $classes[] = 'mw-widget-ExpiryWidget-hasDatePicker';
-               }
                $this
-                       ->addClasses( $classes )
+                       ->addClasses( [
+                               'mw-widget-ExpiryWidget',
+                               'mw-widget-ExpiryWidget-hasDatePicker'
+                       ] )
                        ->appendContent( $this->relativeInput );
        }
 
@@ -68,7 +57,6 @@ class ExpiryInputWidget extends Widget {
         * {@inheritdoc}
         */
        public function getConfig( &$config ) {
-               $config['noDatePicker'] = $this->noDatePicker;
                $config['required'] = $this->required;
                $config['relativeInput'] = [];
                $this->relativeInput->getConfig( $config['relativeInput'] );
index 9191738..c7b0604 100644 (file)
        "undo-summary-username-hidden": "الرجوع عن المراجعة $1 التي أجراها مستخدمي مخفي",
        "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
        "cantcreateaccount-range-text": "إنشاء الحسابات من عناوين الآيبي في النطاق <strong>$1</strong>، التي تحتوي على الآيبي الخاص بك (<strong>$4</strong>)، قد منعها [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو <em>$2</em>",
-       "viewpagelogs": "اعرض Ø³Ø¬Ù\84ات Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة",
+       "viewpagelogs": "عرض سجلات هذه الصفحة",
        "nohistory": "لا يوجد تاريخ للتعديلات لهذه الصفحة.",
        "currentrev": "المراجعة الحالية",
        "currentrev-asof": "المراجعة الحالية بتاريخ $1",
index e76b911..65c9f89 100644 (file)
        "timezoneregion-indian": "Hind Okeanı",
        "timezoneregion-pacific": "Sakit Okean",
        "allowemail": "Digər istifadəçilərin mənə e-məktub göndərməsinə icazə ver",
+       "email-allow-new-users-label": "Tamamilə yeni istifadəçilərdən e-məktub gəlməsinə icazə ver",
+       "email-blacklist-label": "Bu istifadəçilərin mənə e-məktub göndərməsinə qadağa qoy:",
        "prefs-searchoptions": "Axtar",
        "prefs-namespaces": "Adlar fəzası",
        "default": "boş",
        "prefs-help-email-others": "Həmçinin, istifadəçi və ya müzakirə səhifənizdəki link vasitəsilə başqa istifadəçilərin sizinlə əlaqə yaratmasını seçə bilərsiniz. Bu halda sizin e-poçt ünvanınız heç kimə görünməyəcək.",
        "prefs-help-email-required": "Elektron ünvan tələb olunur.",
        "prefs-info": "Əsas məlumatlar",
-       "prefs-i18n": "Beynəlxalqlaşdırma",
+       "prefs-i18n": "Beynəlmiləlləşdirmə",
        "prefs-signature": "İmza",
        "prefs-dateformat": "Tarix formatı",
        "prefs-timeoffset": "Saat qurşağının fərqi",
        "htmlform-selectorother-other": "Digər",
        "htmlform-no": "Xeyr",
        "htmlform-yes": "Bəli",
+       "htmlform-cloner-create": "Əlavə et",
        "logentry-delete-delete": "$1 $3 səhifəsini {{GENDER:$2|sildi}}",
        "logentry-suppress-delete": "$1 $3 səhifəsini {{GENDER:$2|gizlətdi}}",
        "revdelete-content-hid": "gizli mətn",
        "special-characters-group-gujarati": "Qucarat",
        "special-characters-group-thai": "Tay",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "mw-widgets-usersmultiselect-placeholder": "Əlavə et..."
 }
index 63bb94d..e6d2ee6 100644 (file)
        "upload_directory_read_only": "Немагчыма для веб-сервера запісаць у каталог укладаў ($1).",
        "uploaderror": "Памылка пры ўкладанні",
        "upload-recreate-warning": "'''Увага''': файл з такім імем быў выдалены або перамешчаны.''' \n\nЖурнал выдалення і перамяшчэння гэтай старонкі прыводзіцца тут для зручнасці:",
-       "uploadtext": "Тут можна ўкласці файлы ў вікі.\nПрагляд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, усе ўкладанні і выдаленні адзначаюцца ў журналах [[Special:Log/upload|укладанняў]] і [[Special:Log/delete|выдаленняў]], адпаведна.\n\nКаб уставіць файл ў старонку, ужываецца спасылка, зробленая адным з наступных спосабаў:\n* '''<code><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></code>''' паказвае файл у поўным памеры\n*  '''<code><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></code>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з 'тлумачальным тэкстам' у якасці подпісу\n* '''<code><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></code>''' не паказвае самога файла, а толькі спасылку на яго",
+       "uploadtext": "Тут можна ўкласці файлы ў вікі.\nПрагляд або пошук раней укладзенага [[Special:FileList|робіцца тут]]; апроч таго, усе ўкладанні і выдаленні адзначаюцца ў журналах [[Special:Log/upload|укладанняў]] і [[Special:Log/delete|выдаленняў]], адпаведна.\n\nКаб уставіць файл ў старонку, ужываецца спасылка, зробленая адным з наступных спосабаў:\n* '''<code><nowiki>[[</nowiki>image<nowiki>:File.jpg]]</nowiki></code>''' паказвае файл у поўным памеры\n* '''<code><nowiki>[[</nowiki>image<nowiki>:File.png|200px|thumb|left|тлумачальны тэкст]]</nowiki></code>''' паказвае файл, маштабаваны да шырыні 200 кропак, у рамцы, змешчанай злева, і з ''тлумачальным тэкстам'' у якасці подпісу\n* '''<code><nowiki>[[</nowiki>media<nowiki>:File.ogg]]</nowiki></code>''' не паказвае самога файла, а толькі спасылку на яго",
        "upload-permitted": "{{PLURAL:$2|Дазволены тып|Дазволеныя тыпы}} файлаў: $1.",
        "upload-preferred": "Больш {{PLURAL:$2|прымальны тып|прымальныя тыпы}} файлаў: $1.",
        "upload-prohibited": "{{PLURAL:$2|Забаронены тып|Забароненыя тыпы}} файлаў: $1.",
index 1f87fc3..0d95656 100644 (file)
        "botpasswords-label-appid": "Име на бота:",
        "botpasswords-label-create": "Създаване",
        "botpasswords-label-update": "Обновяване",
-       "botpasswords-label-cancel": "Отказване",
+       "botpasswords-label-cancel": "Отказ",
        "botpasswords-label-delete": "Изтриване",
        "botpasswords-label-resetpassword": "Възстановяване на парола",
        "botpasswords-label-grants": "Приложими разрешения:",
        "right-editusercss": "Редактиране на CSS файловете на други потребители",
        "right-edituserjson": "Редактиране на JSON файловете на други потребители",
        "right-edituserjs": "Редактиране на JavaScript файловете на други потребители",
+       "right-editsitecss": "Редактиране на CSS за цялото уики",
+       "right-editsitejson": "Редактиране на JSON за цялото уики",
+       "right-editsitejs": "Редактиране на JavaScript за цялото уики",
        "right-editmyusercss": "Редактиране на собствените потребителски CSS файлове",
        "right-editmyuserjson": "Редактиране на собствените потребителски JSON файлове",
        "right-editmyuserjs": "Редактиране на собствените потребителски JavaScript файлове",
        "newimages-hidepatrolled": "Скриване на проверените качвания",
        "newimages-mediatype": "Файлов тип:",
        "noimages": "Няма нищо.",
+       "gallery-slideshow-toggle": "Превключване на миниатюрите",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
        "sp-newimages-showfrom": "Показване на новите файлове, като се започне от $2, $1",
        "feedback-bugcheck": "Страхотно! Само проверете дали това не сред вече [$1 докладваните грешки].",
        "feedback-bugnew": "Проверих. Докладвай за нова грешка",
        "feedback-bugornote": "Ако сте готови подробно да опишете технически проблем, моля [$1 докладвайте го тук].\nВ противен случай, можете да използвате лесния формуляр по-долу. Коментарът ви ще бъде добавен към страницата „[$3 $2]“, наред с вашето потребителско име.",
-       "feedback-cancel": "Отказване",
+       "feedback-cancel": "Отказ",
        "feedback-close": "Готово",
        "feedback-dialog-title": "Изпращане на обратна връзка",
        "feedback-error1": "Грешка: Неразпознат резултат от API",
        "cannotauth-not-allowed": "Не ви е позволено да използвате тази страница",
        "changecredentials": "Промяна на парола",
        "changecredentials-submit": "Промяна на парола",
+       "removecredentials": "Премахване на потребителските данни",
+       "removecredentials-submit": "Премахване на потребителските данни",
        "credentialsform-provider": "Тип на автентикацията:",
        "credentialsform-account": "Име на сметка:",
        "linkaccounts": "Свързване на сметки",
index 35764bc..ae2a6cb 100644 (file)
        "diff-paragraph-moved-toold": "S'ha mogut el paràgraf. Feu clic per a saltar la ubicació antiga.",
        "difference-missing-revision": "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.\n\nAixò passa generalment en seguir un enllaç obsolet de diferències a una pàgina que s'ha suprimit.\nEs pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "searchresults": "Resultats de la cerca",
+       "search-filter-title-prefix": "Només cercant en pàgines amb el títol que comença amb «$1»",
        "search-filter-title-prefix-reset": "Cerca a totes les pàgines",
        "searchresults-title": "Resultats de la cerca de «$1»",
        "titlematches": "Coincidències de títol de la pàgina",
        "right-editsitejson": "Modifica el JSON global del lloc",
        "right-editsitejs": "Modifica el JavaScript global del lloc",
        "right-editmyusercss": "Modificar els vostres fitxers d'usuari CSS",
+       "right-editmyuserjson": "Modifica els vostres propis fitxers JSON",
        "right-editmyuserjs": "Modificar els vostres fitxers d'usuari JavaScript",
        "right-viewmywatchlist": "Mostra la llista de seguiment pròpia",
        "right-editmywatchlist": "Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.",
index 75940d2..5d4e5b7 100644 (file)
@@ -24,7 +24,7 @@
                        "Fitoschido"
                ]
        },
-       "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:",
+       "tog-underline": "ھێڵھێنان بەژێر بەستەرەکان:",
        "tog-hideminor": "دەستکارییە بچووکەکان لە دوایین گۆڕانکارییەکاندا بشارەوە",
        "tog-hidepatrolled": "لە دوایین گۆڕانکارییەکاندا دەستکارییە پاس دراوەکان بشارەوە",
        "tog-newpageshidepatrolled": "لە پێرستی پەڕە نوێکاندا پەڕە پاس دراوەکان بشارەوە",
        "yourpasswordagain": "دیسان تێپەڕوشەکە بنووسەوە:",
        "createacct-yourpasswordagain": "تێپەروشە پشتڕاست بکەرەوە",
        "createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
-       "userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
+       "userlogin-remembermypassword": "لەژوورەوە بمھێڵەرەوە",
        "userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
        "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
        "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
        "wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
        "passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
        "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
-       "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
+       "passwordtoopopular": "تێپەڕەوشە باوەکان ناکرێت دابنرێن. تکایە تێپەڕەوشەیەکی دەگمەنتر ھەڵبژێرە.",
        "password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
        "resetpass-temp-password": "تێپەڕوشەی کاتی:",
        "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
-       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
+       "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1\n\nتکایە تێپەڕەوشەیەکی نوێ ھەڵبژێرە ئێستا، یان کرتە بکە لە \"{{int:authprovider-resetpass-skip-label}}\" بۆ گۆڕینی لە دواییدا.",
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
        "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
        "anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
        "missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
        "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دووبارە کرتە لەسەر «$1» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
-       "missingcommenttext": "تکاÛ\8cÛ\95 Ù\84Û\95 Ø®Ù\88ارÛ\95Ù\88Û\95 Ø´Ø±Û\86Ú¤Û\95Û\8cÛ\95ک بنووسە.",
+       "missingcommenttext": "تکاÛ\8cÛ\95 Ù\84Û\8eدÙ\88اÙ\86Û\8eک بنووسە.",
        "missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «$1» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
        "summary-preview": "پێشبینینی کورتەی دەستکاری:",
        "subject-preview": "پێشبینینی بابەت:",
        "revdelete-legend": "ڕێکخستنی سنووردارکردنی دیاریکردن",
        "revdelete-hide-text": "دەقی پێداچوونەوە",
        "revdelete-hide-image": "ناوەڕۆکی پەڕگە بشارەوە",
-       "revdelete-hide-name": "داشاردÙ\86Û\8c Ù\85Û\95بÛ\95ست Ù\88 Ú©Ø±Ø¯Û\95Ù\88Û\95",
+       "revdelete-hide-name": "شاردÙ\86Û\95Ù\88Û\95Û\8c Ø¦Ø§Ù\85اÙ\86ج Ù\88 Ú\95اگÛ\95Û\8cÛ\8eÙ\86Û\95کاÙ\86",
        "revdelete-hide-comment": "کورتەی دەستکاری",
        "revdelete-hide-user": "ناوی بەکارھێنەر/ناونیشانی ئایپی دەستکاریکەر",
        "revdelete-hide-restricted": "بەرگری دراوە لە بەڕێوبەران هەر وەک ئەوانی دیکە",
        "recentchangesdays": "ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:",
        "recentchangesdays-max": "(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})",
        "recentchangescount": "ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:",
-       "prefs-help-recentchangescount": "ئÛ\95Ù\85Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Ø\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86 Ù\88 Ù\84Û\86Ú¯Û\95کاÙ\86Û\8cØ´ Ù\84Û\95بÛ\95ردÛ\95گرÛ\8eت.",
+       "prefs-help-recentchangescount": "زÛ\86رترÛ\8cÙ\86 Ú\98Ù\85ارÛ\95: Ù¡Ù Ù Ù ",
        "prefs-help-watchlist-token2": "ئەمە کلیلێکی تایبەتیی پێڕستی چاودێرییەکەتە. ھەرکەسێک بیزانێت دەتوانێت پێڕستی چاودێرییەکەت ببینێت، بۆیە لای خۆت بیپارێزە.\nئەگەر پێویستی کرد، [[Special:ResetTokens|دەتوانیت بیگۆڕیت]].",
        "savedprefs": "ھەڵبژاردەکانت پاشەکەوت کران",
        "timezonelegend": "ناوچەی کاتی:",
        "prefs-files": "پەڕگەکان",
        "prefs-custom-css": "CSSی دڵخواز",
        "prefs-custom-js": "جاڤاسکریپتی دڵخواز",
-       "prefs-common-config": "سی‌ئێس‌ئێس/جاڤاسکریپتی ھاوبەش بۆ گشت پێستەکان:",
+       "prefs-common-config": "سی‌ئێس‌ئێس/جەیسن/جاڤاسکریپتی ھاوبەش بۆ گشت پێستەکان:",
        "prefs-reset-intro": "دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.\nگەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.",
        "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
        "youremail": "ئیمەیل:",
        "badsig": "کۆدی ئیمزای ھەڵە.\nبە تاگە HTMLکاندا بچۆرەوە.",
        "badsiglength": "واژووەکەت زۆر درێژە.\nواژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.",
        "yourgender": "پێت خۆشە چۆن وەسف بکرێیت؟",
-       "gender-unknown": "Ù¾Û\8eÙ\85 Ø®Û\86Ø´Û\95 Ø¨Ø§Ø³Û\8c Ù\86Û\95Ú©Û\95Ù\85",
+       "gender-unknown": "Ù\84Û\95کاتÛ\8c Ø¦Ø§Ù\85اÚ\98Û\95داÙ\86 Ø¨Û\95تÛ\86Ø\8c Ù\86Û\95رÙ\85اÙ\85Û\8eرÛ\95Ú©Û\95 Ù\88Ø´Û\95Û\8c Ú\95Û\95Ú¯Û\95زھاÙ\88تا Ø¨Û\95کار Ø¯Û\95بات Ø¨Û\95Ù¾Û\8eÛ\8c ØªÙ\88اÙ\86ا",
        "gender-male": "نێر",
        "gender-female": "مێ",
        "prefs-help-gender": "ئەم ھەڵبژاردەیە دڵخوازانەیە.\nبۆ بانگکردن و ئاماژەپێکردن بە شێوەیەکی دروست لەلایەن نەرمامێرەوە بەکاردێت.\nئەم زانیارییە گشتی دەبێت.",
        "group-sysop": "بەڕێوەبەران",
        "group-interface-admin": "بەڕێوەبەرانی ڕووکار",
        "group-bureaucrat": "بیوروکراتەکان",
-       "group-suppress": "چاودێرەکان",
+       "group-suppress": "سەرکووتکەرەکان",
        "group-all": "(ھەموو)",
        "group-user-member": "{{GENDER:$1|بەکارھێنەر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرانی پەسەندکراوی خۆگەڕ}}",
index ea63054..5283a5b 100644 (file)
        "prefixindex-namespace": "All pages with prefix ($1 namespace)",
        "prefixindex-summary": "",
        "prefixindex-submit": "Show",
-       "prefixindex-strip": "Strip prefix in list",
+       "prefixindex-strip": "Hide the prefix in results",
        "shortpages": "Short pages",
        "shortpages-summary": "",
        "longpages": "Long pages",
index 5852c55..3effe3e 100644 (file)
        "group-autoconfirmed": "Autoconfirmados",
        "group-bot": "Bots",
        "group-sysop": "Administradores",
-       "group-interface-admin": "Administradores de la interfaz",
+       "group-interface-admin": "Administradores de interfaz",
        "group-bureaucrat": "Burócratas",
        "group-suppress": "Supresores de Flow",
        "group-all": "(todos)",
        "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmado|autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
-       "group-interface-admin-member": "{{GENDER:$1|administrador|administradora}} de la interfaz",
+       "group-interface-admin-member": "{{GENDER:$1|administrador|administradora}} de interfaz",
        "group-bureaucrat-member": "{{GENDER:$1|burócrata}}",
        "group-suppress-member": "{{GENDER:$1|supresor|supresora}} de Flow",
        "grouppage-user": "{{ns:project}}:Usuarios",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradores",
-       "grouppage-interface-admin": "{{ns:project}}:Administradores de la interfaz",
+       "grouppage-interface-admin": "{{ns:project}}:Administradores de interfaz",
        "grouppage-bureaucrat": "{{ns:project}}:Burócratas",
        "grouppage-suppress": "{{ns:project}}:Supresores de Flow",
        "right-read": "Leer páginas",
index a6a7ea6..c2439de 100644 (file)
        "badarticleerror": "Seda toimingut ei saa sellel leheküljel sooritada.",
        "cannotdelete": "Lehekülge või faili \"$1\" ei saa kustutada.\nVõimalik, et keegi on selle juba kustutanud.",
        "cannotdelete-title": "Lehekülge \"$1\" ei saa kustutada",
+       "delete-scheduled": "Lehekülje \"$1\" kustutamine ootab järge.\nPalun ole kannatlik.",
        "delete-hook-aborted": "Haak katkestas kustutamise.\nSeletust pole toodud.",
        "no-null-revision": "Lehekülje \"$1\" nullredaktsiooni ei õnnestunud teha.",
        "badtitle": "Vigane pealkiri",
        "movepage-moved": "<strong>\"$1\" on teisaldatud pealkirja \"$2\" alla.</strong>",
        "movepage-moved-redirect": "Ümbersuunamisleht loodud.",
        "movepage-moved-noredirect": "Ümbersuunamist ei loodud.",
+       "movepage-delete-first": "Sihtlehekülge ei saa teisaldamise käigus kustutada, kuna sellel on liiga palju redaktsioone. Palun kustuta lehekülg kõigepealt käsitsi ja proovi seejärel uuesti.",
        "articleexists": "Sellise pealkirjaga lehekülg on juba olemas või pole valitud pealkiri lubatav.\nPalun vali teistsugune pealkiri.",
        "cantmove-titleprotected": "Lehte ei saa sinna teisaldada, sest uus pealkiri on artikli loomise eest kaitstud",
        "movetalk": "Teisalda seonduv arutelulehekülg",
        "pageinfo-category-files": "Faile",
        "pageinfo-user-id": "Kasutaja identifikaator",
        "pageinfo-file-hash": "Räsiväärtus",
+       "pageinfo-view-protect-log": "Vaata selle lehekülje kaitsmislogi.",
        "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markaspatrolledtext-file": "Märgi see failiversioon kontrollituks",
index 609f692..0986223 100644 (file)
@@ -67,7 +67,8 @@
                        "Fitoschido",
                        "Alireza Ivaz",
                        "Iriman",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "Amirsara"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -85,9 +86,9 @@
        "tog-watchdefault": "صفحه‌ها و پرونده‌هایی که ویرایش می‌کنم به فهرست پیگیری‌های من افزوده شود",
        "tog-watchmoves": "صفحه‌ها و پرونده‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌های من افزوده شود",
        "tog-watchdeletion": "صفحه‌ها و پرونده‌هایی که حذف می‌کنم به فهرست پی‌گیری‌های من افزوده شود",
-       "tog-watchuploads": "پرونده‌های جدیدی که بارگذاری می‌کنم به فهرست پیگیری من افزوده شود",
+       "tog-watchuploads": "پرونده‌های جدیدی که بارگذاری می‌کنم به فهرست پیگیری‌های من افزوده شود",
        "tog-watchrollback": "افزودن صفحاتی که واگردانی می‌کنم به فهرست پیگیری‌های من",
-       "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت زده شود",
+       "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت زده شوند",
        "tog-previewontop": "پیش‌نمایش بالای جعبهٔ ویرایش نمایش داده شود",
        "tog-previewonfirst": "پیش‌نمایش هنگام اولین ویرایش نمایش داده شود",
        "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من ایمیلی فرستاده شود",
        "tog-watchlisthideminor": "ویرایش‌های جزئی در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthideliu": "ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlistreloadautomatically": "زمانی که یک پالایه تغییر کرد فهرست پیگیری به صورت خودکار به روز شود (نیازمند جاوااسکریپت)",
-       "tog-watchlistunwatchlinks": "اÙ\81زÙ\88دÙ\86 Ù\85شخصâ\80\8cÚ©Ù\86Ù\86دÙ\87اÛ\8c Ø¹Ø¯Ù\85 Ù¾Û\8cÚ¯Û\8cرÛ\8c/Ù¾Û\8cÚ¯Û\8cرÛ\8c ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) Ø¨Ù\87 ØµÙ\81حات Ù¾Û\8cÚ¯Û\8cرÛ\8c Ø¯Ø§Ø±Ø§Û\8c ØªØºÛ\8cÛ\8cرات (جاÙ\88اسکرÛ\8cپت Ù\85Ù\85Ú©Ù\86 Ø§Ø³Øª Ù\86Û\8cاز Ø´Ù\88د)",
+       "tog-watchlistunwatchlinks": "اÙ\81زÙ\88دÙ\86 Ù\85شخصâ\80\8cÚ©Ù\86Ù\86دÙ\87اÛ\8c Ø¹Ø¯Ù\85 Ù¾Û\8cÚ¯Û\8cرÛ\8c/Ù¾Û\8cÚ¯Û\8cرÛ\8c ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) Ø¨Ù\87 ØµÙ\81حات Ù¾Û\8cÚ¯Û\8cرÛ\8c Ø¯Ø§Ø±Ø§Û\8c ØªØºÛ\8cÛ\8cرات (براÛ\8c Ø¹Ù\85Ù\84Û\8cات Ø®Ø§Ù\85Ù\88Ø´â\80\8c Ù\88 Ø±Ù\88Ø´Ù\86 Ú©Ø±Ø¯Ù\86Ø\8c Ø¬Ø§Ù\88اسکرÛ\8cپت   Ù\86Û\8cاز Ø§Ø³Øª)",
        "tog-watchlisthideanons": "ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthidepatrolled": "ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "previousdiff": "→ تفاوت قدیمی‌تر",
        "nextdiff": "تفاوت جدیدتر ←",
        "mediawarning": "'''هشدار''': این پرونده ممکن است حاوی کدهای مخرب باشد.\nبا اجرای آن رایانهٔ شما ممکن است آسیب ببیند.",
-       "imagemaxsize": "محدودیت ابعاد تصویر:<br />''(برای صفحه‌های توصیف پرونده)''",
+       "imagemaxsize": "محدودیت ابعاد تصویر برای صفحه‌های توصیف پرونده",
        "thumbsize": "اندازهٔ بنداگشتی:",
        "widthheight": "$1 در $2",
        "widthheightpage": "$1×$2، $3 {{PLURAL:$3|صفحه|صفحه}}",
        "confirm-unwatch-top": "این صفحه از فهرست پی‌گیری‌های شما حذف شود؟",
        "confirm-rollback-button": "باشد",
        "confirm-rollback-top": "خنثی‌سازی ویرایش‌های این صفحه؟",
+       "confirm-mcrrestore-title": "بازیابی نسخه",
+       "confirm-mcrundo-title": "خنثی کردن تغییرات",
+       "mcrundofailed": "واگردانی ناموفق بود",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "percent": "$1٪",
index 13a35de..76a9b41 100644 (file)
        "privacy": "Politik di konfidansyalité",
        "privacypage": "Project:Politik di konfidansyalité",
        "badaccess": "Lérò di pèrmisyon",
-       "badaccess-group0": "Zòt pa gen drwè sifizan pou réyalizé laksyon doumandé.",
+       "badaccess-group0": "Zòt pa ganyen drwè sifizan-yan pou réyalizé lagsyon-an ki doumandé.",
        "badaccess-groups": "Aksyon-an ki zòt ka éséyé di réyalizé sa pèrmi yenk pou itilizatò-ya {{PLURAL:$2|di group|di roun dé group}} : $1.",
        "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr",
        "versionrequiredtext": "Vèrsyon $1 di MediaWiki sa nésésèr pou itilizé sa paj.\nKonsilté [[Special:Version|paj di vèrsyon-yan]].",
index e8b78c8..d5377bd 100644 (file)
        "editpage-cannot-use-custom-model": "Model sadržaja ove stranice ne može se mijenjati.",
        "longpageerror": "'''Pogrješka: Tekst koji ste unijeli dug je {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je više od maksimalno {{PLURAL:$2|jednog kilobajta|$2 kilobajta}}.'''\nNije ga moguće snimiti.",
        "readonlywarning": "<strong>Upozorenje: Baza podataka je zaključana zbog održavanja, stoga trenutačno niste u mogućnosti spremiti svoja uređivanja.</strong>\nMožda biste željeli preslikati i zaljepite tekst u tekstualnu datoteku, te ju snimiti za kasnije upotrebe.'''\n\nAdministrator sustava koji je zaključao bazu ponudio je ovo objašnjenje: $1",
-       "protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
-       "semiprotectedpagewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo prijavljeni suradnici.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
+       "protectedpagewarning": "<strong>Upozorenje: ova je stranica zaštićena i mogu je uređivati samo suradnici s administratorskim pravima.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
+       "semiprotectedpagewarning": "<strong>Napomena:</strong> ova je stranica zaštićena te je mogu uređivati samo automatski potvrđeni suradnici. \nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana i mogu je uređivati samo suradnici s [[Special:ListGroupRights|posebnim pravima]], jer je uključena u {{PLURAL:$1|sljedeću stranicu koja je|sljedeće stranice koje su}} zaštićene \"prenosivom\" zaštitom:",
        "titleprotectedwarning": "<strong>Upozorenje: Ova je stranica zaključana i samo ju suradnici s [[Special:ListGroupRights|određenim pravima]] mogu stvoriti.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "templatesused": "{{PLURAL:$1|Predložak koji se rabi|Predlošci koji se rabe}} na ovoj stranici:",
        "imageinvalidfilename": "Ciljano ime datoteke je nevaljano",
        "fix-double-redirects": "Ažuriraj sva preusmjeravanja koja vode na originalni naslov",
        "move-leave-redirect": "Ostavi preusmjeravanje",
-       "protectedpagemovewarning": "'''Upozorenje:''' Ova je stranica zaključana tako da je mogu premjestiti samo suradnici s administratorskim pravima.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
-       "semiprotectedpagemovewarning": "'''Napomena:''' Ova je stranica zaključana tako da je samo prijavljeni suradnici mogu premjestiti.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
+       "protectedpagemovewarning": "<strong>Upozorenje:</strong> ova je stranica zaštićena i mogu je premjestiti samo suradnici s administratorskim pravima.</strong>\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
+       "semiprotectedpagemovewarning": "<strong>Napomena:</strong> ova je stranica zaštićena i mogu je premjestiti samo automatski potvrđeni suradnici.\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
        "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] postoji na zajednički korištenom repozitoriju. Premještanje datoteke na ovaj naslov će prepisati zajednički korištenu datoteku.",
        "file-exists-sharedrepo": "Naziv datoteke koje ste odabrali već se rabi na zajednički korištenom repozitoriju.\nMolimo odaberite drugo ime.",
        "export": "Izvezi stranice",
index e4d3063..04c3105 100644 (file)
        "badarticleerror": "Iste action non pote esser effectuate super iste pagina.",
        "cannotdelete": "Le pagina o file \"$1\" non poteva esser delite.\nEs possibile que un altere persona lo ha ja delite.",
        "cannotdelete-title": "Non pote deler le pagina \"$1\"",
+       "delete-scheduled": "Le deletion del pagina \"$1\" ha essite planate.\nPer favor, sia patiente.",
        "delete-hook-aborted": "Le deletion ha essite abortate per un extension.\nNulle explication es disponibile.",
        "no-null-revision": "Non ha potite crear un nove version vacue del le pagina \"$1\"",
        "badtitle": "Titulo invalide",
        "movepage-moved": "'''\"$1\" ha essite renominate a \"$2\"'''",
        "movepage-moved-redirect": "Un redirection ha essite create.",
        "movepage-moved-noredirect": "Le creation de un redirection ha essite supprimite.",
+       "movepage-delete-first": "Le pagina indicate ha troppo de versiones pro deler como parte de un renomination. Per favor elimina primo le pagina manualmente e re-essaya postea.",
        "articleexists": "Un pagina con iste nomine ja existe, o le nomine seligite non es valide.\nPer favor selige un altere nomine.",
        "cantmove-titleprotected": "Tu non pote renominar un pagina a iste titulo, proque le nove titulo ha essite protegite contra creation",
        "movetalk": "Renominar le pagina de discussion associate",
        "pageinfo-category-files": "Numero de files",
        "pageinfo-user-id": "ID de usator",
        "pageinfo-file-hash": "Valor hash",
+       "pageinfo-view-protect-log": "Vider le registro de protectiones pro iste pagina.",
        "markaspatrolleddiff": "Marcar como patruliate",
        "markaspatrolledtext": "Marcar iste pagina como patruliate",
        "markaspatrolledtext-file": "Marcar iste version del file como patruliate",
index 97d8350..5184f3c 100644 (file)
        "rcfilters-view-tags": "Redakturi etiketizata",
        "rcfilters-view-namespaces-tooltip": "Filtrar rezulti segun nomo",
        "rcfilters-liveupdates-button": "Quika aktualigi",
+       "rcfilters-watchlist-markseen-button": "Indikar \"vidita\" en omna modifikuri",
        "rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de <strong>$3, $4</strong> (montrata til <strong>$1</strong>).",
        "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "rcshowhideminor": "$1 mikra redakturi",
        "sp-contributions-hideminor": "Celar kurta redaktaji",
        "sp-contributions-submit": "Serchez",
        "whatlinkshere": "Quo ligesas adhike",
-       "whatlinkshere-title": "Pagini qui ligas ad \"$1\"",
+       "whatlinkshere-title": "Pagini qui ligesas a(d) \"$1\"",
        "whatlinkshere-page": "Pagino:",
        "linkshere": "Ca pagini esas ligilizita a(d) <strong>$2</strong>:",
        "nolinkshere": "Nula pagino ligas ad <strong>$2</strong>.",
        "tooltip-n-recentchanges": "Listo di recenta chanji en la wiki.",
        "tooltip-n-randompage": "Vizitez hazarda pagino",
        "tooltip-n-help": "La loko por trovar ulo.",
-       "tooltip-t-whatlinkshere": "Montrez omna wiki pagini qui ligas ad hike",
+       "tooltip-t-whatlinkshere": "Listo di omna Wikipagini qui ligesas adhike",
        "tooltip-t-recentchangeslinked": "Recenta chanji di pagini ligita de ca pagino",
        "tooltip-feed-rss": "RSS provizero por ica pagino",
        "tooltip-feed-atom": "Atom provizero por ica pagino",
index 91cf370..fde7ecf 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Ninjastrikers",
-                       "Rul1902"
+                       "Rul1902",
+                       "Sawmw"
                ]
        },
        "underline-always": "ကိုဲၜၠင်",
@@ -72,7 +73,7 @@
        "december-date": "လါလိင် $1",
        "period-am": "ကေၯဝ်",
        "period-pm": "ကေၯး",
-       "pagecategories": "{{PLURAL:$1|á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80º|á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80ºá\80\9eá\80\9aá\80º}}",
+       "pagecategories": "{{PLURAL:$1|á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80º|á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80ºá\80\9cá\80ºá\80¯á\80\96á\80¸}}",
        "category_header": "အ်ုဆုဂ် \"$1\" ခဝ့် လိက်မေံလ်ုဖး",
        "subcategories": "ကၞါင့်ကါင်ဖါသယ်",
        "category-media-header": "အ်ုဆုဂ် \"$1\" ခဝ့် လိက်မေံလ်ုဖး",
        "searchbutton": "အင်းၰူ့",
        "go": "လေဝ်",
        "searcharticle": "လေဝ်",
-       "history": "á\80\83á\80½á\80¾á\80¬á\80\94á\80·်မေင်ႋစိင်",
+       "history": "á\80\9cá\80­á\80\99á\80±á\80¶á\81\9cá\81 á\80¬်မေင်ႋစိင်",
        "history_short": "မေင်ႋစိင်",
        "history_small": "မေင်ႋစိင်",
        "updatedmarker": "လေဝ်ယောဝ်ႋဝေ့အ်ုလါင်ခါင့်ခါ့ အင်းတင်ထဝေ့",
        "confirmable-confirm": "{{GENDER:$1|ၮ်ု}} ထီ့ဆာႋဝး?",
        "confirmable-yes": "မွာဲ",
        "confirmable-no": "လ်ုမာၜး",
+       "viewdeleted": "မ်ုယောဝ်ႋ $1 ဝး",
        "site-rss-feed": "RSS feed $1 ဍူ",
        "site-atom-feed": "Atom feed $1ဍူ",
        "page-atom-feed": "Atom feed $1 ဍူ",
        "red-link-title": "$1 (လိက်မေံ လ်ုအ်ှ​ဍေၜး)",
        "nstab-main": "လက်မေံသး",
        "nstab-user": "ဆ်ုသုံႋက်ုဆာႋ လိက်မေံၜၠာ်",
+       "nstab-media": "မီဒီယ်ုလိက်မေံၜၠာ်",
        "nstab-special": "လိက်မေံခေါဟ်",
        "nstab-project": "ပ်ုရောဴဂျက်လိက်မေံၜၠါ်",
        "nstab-image": "ဖိုင်",
        "nstab-mediawiki": "လိက်ဖၠုံး",
        "nstab-template": "တန်ပ်ုလိတ်",
+       "nstab-help": "ဆ်ုမာၜိုဝ်မာဆိုင် လိက်မေံၜၠာ်",
        "nstab-category": "အ်ုဆုဂ်တုဂ်",
        "mainpage-nstab": "လိက်မေံယာ့",
        "nosuchspecialpage": "ဗေ့ယိုဝ်သိုဝ် လိက်မေံၜၠါ်ခေါဟ် လ်ုအှ်ၜး",
        "userlogin-helplink2": "log in ဆ်ုမာၜိုဝ်",
        "createacct-emailoptional": "အီးမေးလင်က္ဍာ",
        "createacct-email-ph": "ဆူ့လင်ဖှ်ေ လ်ုအီးမေး",
+       "createacct-reason": "ဖှ်ေအ်ုၯာင်ႋအ်ုကျင်း",
        "createacct-submit": "မ်ုအင်းတင်ႋပ္တုံဆ်ုမာ",
+       "createacct-another-submit": "မ်ုတါင်ထါင်း ၮင့်ဆာႋအ်ုၮါင်း",
        "createacct-benefit-heading": "{{SITENAME}} ခဝ့် ဗေ့ၮ်ုသိုဝ် အ်ုမၞီႋသယ် အင်းတင်ထဝေ့လှ်။",
        "createacct-benefit-body1": "{{PLURAL:$1|ဆ်ုအင်းတင်|ဆ်ုအင်းတင်လ်ုဖး}}",
        "createacct-benefit-body2": "{{PLURAL:$1|လိက်မေံၜၠါ်|လိက်မေံၜၠါ်လ်ုဖး}}",
        "createacct-benefit-body3": "လ်ုယိက်လ်ုမဝ်ႋခါ့ {{PLURAL:$1|မာဖှ်ေက်ုဆာ|မာဖှ်ေက်ုဆာသယ်လ်ုဖး}}",
+       "loginerror": "အွးလင် ဆ်ုမး",
+       "loginsuccesstitle": "အွးလင်ၯံင်ယုဂ်",
+       "loginsuccess": "'''ၮ်ုယိုဝ် {{SITENAME}} အိုဝ် \"$1\" သိုဝ် Login အွးလင်ၯံင်ယုဂ်။'''",
+       "mailmypassword": "ထုဂ်ဆိင့် ဝီးၜါ်ဖၠုံး",
        "loginlanguagelabel": "လိက်ဆ်ုခၠါင် $1",
        "pt-login": "မ်ုအွလင်",
        "pt-login-button": "အွးလင်",
        "tooltip-ca-nstab-image": "လိက်အုဂ် လိက်မေံမ်ုယောဝ်ႋ",
        "tooltip-ca-nstab-mediawiki": "စစ္စတမ်မက်ဆေ့အိုဝ် မ်ုယောဝ်ႋ",
        "tooltip-ca-nstab-template": "တမ်းပ်ုလိတ်အိုဝ် မ်ုယောဝ်ႋလင်",
-       "tooltip-ca-nstab-category": "á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80ºá\80\9eá\80\9aá\80º á\80\99á\80ºá\80¯á\80\9aá\80±á\80¬á\80\9dá\80ºá\82\8b",
+       "tooltip-ca-nstab-category": "á\80\99á\80ºá\80¯á\80\9aá\80±á\80¬á\80\9dá\80ºá\82\8b á\80¡á\80ºá\80¯á\80\86á\80¯á\80\82á\80ºá\80\90á\80¯á\80\82á\80ºá\80\9cá\80ºá\80¯á\80\96á\80¸",
        "tooltip-minoredit": "အ်ုပ်ုယဝ့်လ်ုဍောဟ် ဆ်ုအင်းတင်ဖှ်ေသိုဝ် မ်ုမာၮါင်း",
        "tooltip-save": "အင်းလယ်အ်ှကှ်ေ",
        "tooltip-preview": "ၮ်ုအင်းလယ်ထး မ်ုယောဝ်ႋၮင်ႋ။ အုဲးသာဆိုင် လ်ုအှ်ကှ်ေဍာ်ၜး သုံဖှ်ေလာ။",
index fc72dbb..826a37d 100644 (file)
        "badarticleerror": "이 명령은 이 문서에서 수행할 수 없습니다.",
        "cannotdelete": "\"$1\" 문서나 파일을 삭제할 수 없습니다.\n이미 삭제되었을 수도 있습니다.",
        "cannotdelete-title": "\"$1\" 문서를 삭제할 수 없습니다",
+       "delete-scheduled": "\"$1\" 문서는 삭제가 예정되어 있습니다.\n기다려 주십시오.",
        "delete-hook-aborted": "훅이 삭제를 중단했습니다.\n아무런 설명도 주어지지 않았습니다.",
        "no-null-revision": "\"$1\" 문서에 대한 빈 판을 새로 만들 수 없습니다.",
        "badtitle": "잘못된 제목",
        "movepage-moved": "'''\"$1\" 문서를 \"$2\" 문서로 이동했습니다.'''",
        "movepage-moved-redirect": "넘겨주기 문서를 만들었습니다.",
        "movepage-moved-noredirect": "넘겨주기 문서를 남기지 않았습니다.",
+       "movepage-delete-first": "이동될 문서가 문서 이동의 일환으로 삭제하기에는 역사가 너무 깁니다. 해당 문서를 수동으로 삭제한 다음 다시 시도해 주세요.",
        "articleexists": "문서가 이미 존재하거나 이름이 올바르지 않습니다.\n다른 이름을 선택하세요.",
        "cantmove-titleprotected": "새로운 제목으로 문서를 만드는 것이 금지되어 있어 문서를 이동할 수 없습니다.",
        "movetalk": "딸린 토론 문서도 이동하기",
index 4762819..d765524 100644 (file)
        "passwordreset-username": "Benotzernumm:",
        "passwordreset-domain": "Domaine:",
        "passwordreset-email": "E-Mail-Adress:",
-       "passwordreset-emailtitle": "Detailer vum Benotzerkont op{{SITENAME}}",
+       "passwordreset-emailtitle": "Detailer vum Benotzerkont op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailtext-user": "De Benotzer $1 vu(n) {{SITENAME}} huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont|D'Benutzerkonte}} \n\n$2\n\n{{PLURAL:$3|ass|si}} mat dëser E-Mail-Adress verbonn.\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
        "rcfilters-filter-humans-description": "Ännerungen, déi vu mënschlechen Auteure gemaach goufen.",
        "rcfilters-filtergroup-reviewstatus": "Status nokucken",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Net nogekuckt",
+       "rcfilters-filter-reviewstatus-manual-label": "Manuell nogekuckt",
+       "rcfilters-filter-reviewstatus-auto-label": "Automatesch nogekuckt",
        "rcfilters-filtergroup-significance": "Bedeitung",
        "rcfilters-filter-minor-label": "Kleng Ännerungen",
        "rcfilters-filter-minor-description": "Ännerungen déi den Auteur als kleng markéiert huet.",
index 58ec8d2..670d9c1 100644 (file)
        "botpasswords-updated-title": "Bota parole atjaunināta",
        "botpasswords-deleted-title": "Bota parole dzēsta",
        "botpasswords-restriction-failed": "Botu paroles ierobežojumi liedz šo pieslēgšanos.",
+       "botpasswords-not-exist": "Lietotājam \"$1\" nav bota paroles ar nosaukumu \"$2\".",
        "resetpass_forbidden": "Paroles nav iespējams nomainīt",
        "resetpass_forbidden-reason": "Paroles nav iespējams nomainīt: $1",
        "resetpass-no-info": "Jums ir nepieciešams ieiet, lai tūlīt piekļūtu šai lapai.",
        "diff-multi-otherusers": "({{PLURAL:$1|$1 starpversijas|Viena starpversija|$1 starpversijas}}, ko {{PLURAL:$2|saglabājuši|saglabājis|saglabājuši}} {{PLURAL:$2|$2 lietotāji|viens cits lietotājs|$2 lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 starpversijas|$1 starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotāji|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
+       "search-filter-title-prefix": "Meklē tikai lapas, kuru nosaukums sākas ar \"$1\"",
+       "search-filter-title-prefix-reset": "Meklēt visas lapas",
        "searchresults-title": "Meklēšanas rezultāti \"$1\"",
        "titlematches": "Rezultāti virsrakstos",
        "textmatches": "Rezultāti lapu tekstos",
        "http-timed-out": "HTTP pieprasījumam ir iestājies noilgums.",
        "http-curl-error": "Kļūda, nolasot URL: $1",
        "http-bad-status": "HTTP pieprasījuma laikā atgadījās problēma: $1 $2",
+       "http-internal-error": "HTTP iekšējā kļūda.",
        "upload-curl-error6": "URL nevarēja sasniegt",
        "upload-curl-error28": "Augšupielādes noildze",
        "license": "Licence:",
        "filehist-comment": "Komentārs",
        "imagelinks": "Faila lietojums",
        "linkstoimage": "Šo failu izmanto {{PLURAL:$1|šajās $1 lapās|šajā $1 lapā|šajās $1 lapās}}:",
-       "linkstoimage-more": "Uz šo failu ir saites vairāk nekā $1 {{PLURAL:$1|lapās|lapā|lapās}}.\nŠajā sarakstā ir tikai {{PLURAL:$1|pirmās $1 saistītās lapas|pirmā $1 saistītā lapa|pirmās $1 saistītās lapas}} uz šo failu.\nPieejams arī [[Special:WhatLinksHere/$2|pilns saraksts]].",
+       "linkstoimage-more": "Šo failu izmanto vairāk nekā $1 {{PLURAL:$1|lapās|lapā|lapās}}.\nŠajā sarakstā ir tikai {{PLURAL:$1|pirmās $1 lapas|pirmā lapa|pirmās $1 lapas}}, kas izmanto šo failu.\nPieejams arī [[Special:WhatLinksHere/$2|pilns saraksts]].",
        "nolinkstoimage": "Šo failu neizmanto nevienā lapā.",
        "morelinkstoimage": "Skatīt [[Special:WhatLinksHere/$1|vairāk saites]] uz šo failu.",
        "linkstoimage-redirect": "$1 (faila pāradresācija) $2",
        "protectedpages-noredirect": "Paslēpt pāradresācijas",
        "protectedpages-timestamp": "Laika zīmogs",
        "protectedpages-page": "Lapa",
+       "protectedpages-expiry": "Beidzas",
+       "protectedpages-performer": "Aizsargājušais lietotājs",
        "protectedpages-params": "Aizsardzības parametri",
        "protectedpages-reason": "Iemesls",
        "protectedpages-submit": "Parādīt lapas",
index 576291f..a48c9e1 100644 (file)
        "aboutsite": "ပရူ {{SITENAME}}",
        "aboutpage": "Project:ပရူ",
        "copyright": "လိက်ဂှ် မံက် ပ္ဍဲ $1 ယဝ်ရတင်ယောင်ယာ မွဲမွဲ ဟွံမွဲမ္ဂး၊၊",
-       "copyrightpage": "{{ns:project}}:Copyrights",
+       "copyrightpage": "{{ns:project}}:တၠမူ",
        "currentevents": "သဘင် လၟုဟ်ဂမၠိုင်",
        "currentevents-url": "Project:သဘင် လၟုဟ်ဂမၠိုင်",
        "disclaimers": "ဒဒှ်မဟွံဆက်စပ်",
        "nstab-project": "မုက်လိက် ပရဝ်ဂျေတ်",
        "nstab-image": "ဝှာင်",
        "nstab-mediawiki": "ပရိုင်မေတ်သုက်",
-       "nstab-template": "Template",
+       "nstab-template": "ထာမ်ပလိက်",
        "nstab-help": "မုက်လိက် မရီုဗင်",
        "nstab-category": "ကဏ္ဍ",
        "mainpage-nstab": "မုက်လိက်တမ်",
        "headline_tip": "က္ဍိုပ်လိက် ကဆံင် ၂",
        "nowiki_sample": "စုတ် မလိက် ဟွံ-ဖျေဟ်ဗီုပြင်ဏီ ပ္ဍဲဒၞာဲဏအ်",
        "nowiki_tip": "Ignore wiki formatting",
-       "image_tip": "Embedded file",
+       "image_tip": "ဝှာင် မစုတ်လဝ် Embedded",
        "media_tip": "လေန် ဝှာင်",
        "sig_tip": "စၟတ်တဲ မၞး နကဵု တဆိပ်အခိင်",
        "hr_tip": "လာင် ဗွဲလနေင်",
        "group": "ဂကောံ:",
        "group-user": "ညးလွပ်",
        "group-autoconfirmed": "မသ္ပဒတန် ညးလွပ်တအ် အလဵုအလဵု",
-       "group-bot": "ဗောတ်ဂမၠိုင်",
+       "group-bot": "á\80\85á\80\80á\80ºá\80\97á\80±á\80¬á\80\90á\80ºá\80\82á\80\99á\81 á\80­á\80¯á\80\84á\80º",
        "group-sysop": "မၞိဟ်မကောပ်ကာဲဂမၠိုင်",
        "group-all": "(အလုံ)",
        "group-user-member": "{{GENDER:$1|ညးလွပ်}}",
        "recentchanges-label-bot": "ပရေင်ပလေဝ်ပလေတ်ဏအ် ကၠောန်လဝ် နကဵု စက်ဗန်",
        "recentchanges-label-unpatrolled": "အရာပလေဝ်ဒါန်ဏအ်ဂှ် ဟွံဂွံ စၟဳစၟတ်ဏီ",
        "recentchanges-label-plusminus": "ဇမၞော် မုက်လိက်ဏအ် သၠာဲအာ နကဵု လၟိဟ်လျိုင်ဗာက်",
-       "recentchanges-legend-heading": "<strong>Legend:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-heading": "<strong>စၞောန်:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ကျောဝ် [[Special:NewPages|စရင် မုက်လိက် တၟိဂမၠိုင်]])",
        "recentchanges-submit": "ထ္ၜး",
        "rcfilters-tag-remove": "ပတိတ် '$1'",
        "rcfilters-other-review-tools": "ကြိယာ ကလၚ်ရံၚ်တၞဟ်ဂမၠိုၚ်",
        "hist": "တင်ဂၞင်မတုဲကၠုင်",
        "hide": "ဗဒန်",
        "show": "ထ္ၜး",
-       "minoreditletter": "m",
-       "newpageletter": "N",
-       "boteditletter": "b",
+       "minoreditletter": "ကိစ္စဟွံဇၞော်",
+       "newpageletter": "တၟိ",
+       "boteditletter": "စက် နကဵုဗတ်",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ကြဴနူ ပြံင်ထောအ်တုဲ",
        "rc-enhanced-expand": "ထ္ၜး တၚ်နၚ်သောဲသောဲဂမၠိုၚ်",
        "rc-enhanced-hide": "ဗဒန် တၚ်နၚ်သောဲသောဲဂမၠိုၚ်",
        "deletecomment": "ဟိုတ်:",
        "deleteotherreason": "တၞဟ်/မထပ် ဟိုတ်:",
        "deletereasonotherlist": "ဟိုတ် တၞဟ်",
-       "rollbacklink": "á\80\80á\80\9cá\80±á\80\84á\80º",
+       "rollbacklink": "á\80\80á\80\9cá\80±á\81\9aá\80º á\80¡á\80\90á\80­á\80¯á\81\9aá\80ºá\80\90á\80¼á\80±á\80",
        "rollbacklinkcount": "ကလေင်အာ $1 {{PLURAL:$1|ပလေဝ်ဒါန်|ပလေဝ်ဒါန်ဂမၠိုင်}}",
        "changecontentmodel-legend": "ပြံၚ် မဝ်ဒေလ် မာတိက",
        "changecontentmodel-title-label": "က္ဍိုပ်မုက်လိက်",
        "undelete-show-file-submit": "ယွံ",
        "namespace": "ဒၞာဲယၟု",
        "invert": "ဂတးထောအ် အရာမရုဲစှ်လဝ်",
-       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "tooltip-invert": "ကဵုစၟတ် ပ္ဍဲ ခံက်အင်ဏအ် သွက်ဂွံ ပၞုက်ဗဒန် အရာမပြံၚ်လှာဲ မရုဲစှ်လဝ် ယၟုစၞောန် (ကေုာံ ယၟုစၞောန် မဆက်စပ် ယဝ်ရ မကဵုလဝ်စၟတ်မ္ဂး)",
        "namespace_association": "မပံင်ဗစိုပ် ကုဒၞာဲယၟု",
-       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "tooltip-namespace_association": "ကဵုစၟတ် ပ္ဍဲ ခံက်အၚ်ဏအ် ယဝ်ရ မိက်ဂွံ ပါလုပ် အရာမဓရီုကျာ ဟွံသေၚ်မ္ဂး ပရူပရာ ယၟုစၞောန် မဆက်စပ် ကု ယၟုစၞောန် မရုဲစှ်လဝ်တအ်",
        "blanknamespace": "(တမ်)",
        "contributions": "{{GENDER:$1|User}} ပတိတ်တြး",
        "contributions-title": "အရာမကၠောန်ဗဒှ် ညးလွပ် သွက် $1",
        "tooltip-n-portal": "ပရူပရဝ်ဂျေက်၊ မု မၞး မပဂွံ၊ အလဵု မၞး ဂွံဂၠာဲ အရာတအ်",
        "tooltip-n-currentevents": "ဂၠာဲ တင်ဂၞင်ပရိုင် စပ်ကဵု သဘင်ဏအ်",
        "tooltip-n-recentchanges": "စရင် မပလေဝ်လဝ် ပြဟ်ဟ်ဏအ် ပ္ဍဲ ဝဳကဳ",
-       "tooltip-n-randompage": "á\80\95á\80¶á\80\80á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80º á\80\87á\80\9aောမ်",
+       "tooltip-n-randompage": "á\80\95á\80¶á\80\80á\80º á\80\99á\80¯á\80\80á\80ºá\80\9cá\80­á\80\80á\80º á\80\87á\80\9fောမ်",
        "tooltip-n-help": "ဒၞာဲ သွက်ဂွံ ဂၠာဲ",
        "tooltip-t-whatlinkshere": "စရင် မုက်လိက် ဝဳကဳ မဆက်စပ် ကု ပရူဏအ် သီုဖအိုတ်",
        "tooltip-t-recentchangeslinked": "မပြံင်လှာဲ လၟုဟ် ပ္ဍဲမုက်လိက်ဏအ်ဂှ် ဆက်စပ်ဒၟံင် ကုမုက်လိက်ဏအ်",
        "tooltip-ca-nstab-project": "ဗဵု မုက်လိက် ပရဝ်ဂျေတ်",
        "tooltip-ca-nstab-image": "ဗဵု မုက်လိက် ဝှာင်",
        "tooltip-ca-nstab-mediawiki": "ကျောဝ်ဗဵု သၞောတ် ပရိုင်မေတ်သုက်",
-       "tooltip-ca-nstab-template": "ကျောဝ်ဗဵု template",
+       "tooltip-ca-nstab-template": "ကျောဝ်ဗဵု ထာမ်ပလိက်",
        "tooltip-ca-nstab-help": "ဗဵု မုက်လိက် ရီုဗၚ်",
        "tooltip-ca-nstab-category": "ဗဵု မုက်လိက်ကဏ္ဍ",
        "tooltip-minoredit": "ကဵုစၟတ် အရာဏအ် ဒဒှ်ရ မဒှ် အရာမပလေဝ်ဒါန် ညိည",
        "tooltip-watchlistedit-normal-submit": "ပတိတ်ထောံ က္ဍိုပ်လိက်ဂမၠိုၚ်",
        "tooltip-watchlistedit-raw-submit": "ပလေဝ် စရင်မမင်မဲ",
        "tooltip-upload": "စ ပတိုန်",
-       "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click",
+       "tooltip-rollback": ""ကလေၚ် အတိုၚ်တြေံ"မ္ဂး အရာမပလေဝ်ဒါန်လဝ် လက္ကရဴနူဂှ်တအ်ဂှ် ကလေင်ဒှ်အာ ဗီုတြေံပၠန်ရ၊၊",
        "tooltip-undo": "\"ဟွံကၠောန်\" ဂှ် ဒှ်အရာ မဟွံကၠောန်တုဲ ကလေင်အာ ဗီုအတိုင်တြေံ ကၠာဟွံဂွံစ ပလေဝ်လဝ်ဂှ်ရ၊၊ မုဟိုတ် ကလေင်အာ အတိုင်ဗီုတြေံပၠန်ဂှ် ချူစၟတ်သမ္တီ သကေံ မာန်ရ၊၊",
        "tooltip-preferences-save": "ဂိုင်သိပ် မဒးဂၞပ်ဂမၠိုင်",
        "tooltip-summary": "စုတ် သကေမ် summary ဇမၠေအ်",
        "saturday-at": "တ္ၚဲသ္ၚိသဝ် ပ္ဍဲ$1",
        "sunday-at": "တ္ၚဲအဒိုတ် ပ္ဍဲ$1",
        "yesterday-at": "နူကနေံ ပ္ဍဲ$1",
-       "metadata": "Metadata",
+       "metadata": "မဳတာဒေတာ",
        "metadata-help": "ပ္ဍဲဝှာင်ဏအ်ဂှ် နွံဒၟံင် နကဵုအရာမဗပေင်စုတ်လဝ်ရ၊၊ မဒှ်အရာ မဗပေင်စုတ်လဝ် နူကဵု ကမ္မရာ ဒဳဂျဳတေဝ် ဟွံသေင်မ္ဂး နူသကေန်နာ မွဲမွဲ ဒှ်မာန်ရ၊၊\nယဝ်ရ ဝှာင်ဂှ် ဒးဒုင်ပလေဝ်ပလေတ် နူတမ်မူလဍေဟ်မ္ဂး၊ အရာလ္ၚဵုတအ်ဂှ် ဟွံမံက် ပ္ဍဲဝှာင်ဂှ် ဒှ်မာန်ရ၊၊",
-       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "ကာလမပံက် ပ္ဍဲ metadata table မ္ဂး ပ္ဍဲဂလာန် မေတ်သုက် Image metadata fields ဂမၠိုင် မပါလုပ်ဒၟံင်မာန်ရ၊၊ အရာတၞဟ်တအ်ဂှ် ပၞုက်လဝ် ဒှ်မာန်ရ၊၊\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "အနာံ",
        "exif-imagelength": "သၠုၚ်",
        "exif-orientation": "ဒဒှ်မဖျေဟ်ဗီုပြင်မုက်",
        "exif-model": "မဝ်ဒေလ် ကမ္မရာ",
        "exif-software": "သပ်ဝဴ မစကာလဝ်",
        "exif-artist": "ကဝိ",
-       "exif-exifversion": "Exif version",
+       "exif-exifversion": "Exif ဝါရှေန်",
        "exif-colorspace": "ဒၞာဲ အသာ်",
        "exif-pixelxdimension": "အနာံ သၞိၚ်ရုပ်",
        "exif-pixelydimension": "သၠုၚ် ဗီုရုပ်",
        "blankpage": "မုက်လိက် ပလး",
        "tag-filter": "[[Special:Tags|Tag]] ဝှာင်ဂမၠိုင်:",
        "tag-filter-submit": "ဖဍိုဟ်",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|အစင်အတောဲ|စင်အတောဲဂမၠိုင်}}]]: $2)",
        "tag-mw-replace": "ကလေၚ်ဖျေံဒၞာဲ",
        "tag-mw-undo": "ဟွံပ",
        "tags-source-header": "တမ်ရိုဟ်",
index e097d1d..6959f88 100644 (file)
        "exif-flashpixversion": "Støtta Flashpix-versjon",
        "exif-colorspace": "Fargerom",
        "exif-componentsconfiguration": "Komponentanalyse",
-       "exif-compressedbitsperpixel": "Komprimerte bits pr. pixel",
+       "exif-compressedbitsperpixel": "Biletkomprimeringsmodus",
        "exif-pixelxdimension": "Biletbreidd",
        "exif-pixelydimension": "Bilethøgd",
        "exif-usercomment": "Brukarkommentarar",
        "exif-exposuremode": "Eksponeringsmodus",
        "exif-whitebalance": "Kvitbalanse",
        "exif-digitalzoomratio": "Digital zoom-rate",
-       "exif-focallengthin35mmfilm": "(Tilsvarande) brennvidd ved 35 mm film",
+       "exif-focallengthin35mmfilm": "Tilsvarande brennvidd med 35 mm-film",
        "exif-scenecapturetype": "Motivtype",
        "exif-gaincontrol": "Scenekontroll",
        "exif-contrast": "Kontrast",
index e7e7896..679981d 100644 (file)
        "@metadata": {
                "authors": [
                        "Arikasikis",
-                       "Spacebirdy"
+                       "Spacebirdy",
+                       "Lam-ang"
                ]
        },
        "tog-enotifwatchlistpages": "Manpa-awit na e-mail ed siak no abalo may sakey ya bolong ya babantayan ko",
        "underline-always": "Naynay",
        "underline-never": "Andin-balot",
-       "category_header": "Saray artikulo ed category ya \"$1\"",
+       "sunday": "Simba",
+       "monday": "Lunes",
+       "tuesday": "Martes",
+       "wednesday": "Mierkoles",
+       "thursday": "Huebes",
+       "friday": "Biernes",
+       "saturday": "Sabado",
+       "sun": "Sim",
+       "mon": "Lun",
+       "tue": "Mar",
+       "wed": "Mie",
+       "thu": "Hue",
+       "fri": "Bie",
+       "sat": "Sab",
+       "january": "Enero",
+       "february": "Pebrero",
+       "march": "Marso",
+       "april": "Abril",
+       "may_long": "Mayo",
+       "june": "Hunyo",
+       "july": "Hulyo",
+       "august": "Agosto",
+       "september": "Setyembre",
+       "october": "Oktubre",
+       "november": "Nobyembre",
+       "december": "Disyembre",
+       "january-gen": "Enero",
+       "february-gen": "Pebrero",
+       "march-gen": "Marso",
+       "april-gen": "Abril",
+       "may-gen": "Mayo",
+       "june-gen": "Hunyo",
+       "july-gen": "Hulyo",
+       "august-gen": "Agosto",
+       "september-gen": "Setyembre",
+       "october-gen": "Oktubre",
+       "november-gen": "Nobyembre",
+       "december-gen": "Disyembre",
+       "jan": "Ene",
+       "feb": "Peb",
+       "mar": "Mar",
+       "apr": "Abr",
+       "may": "May",
+       "jun": "Hun",
+       "jul": "Hul",
+       "aug": "Ago",
+       "sep": "Set",
+       "oct": "Okt",
+       "nov": "Nob",
+       "dec": "Dis",
+       "january-date": "Enero $1",
+       "february-date": "Pebrero $1",
+       "march-date": "Marso $1",
+       "april-date": "Abril $1",
+       "may-date": "Mayo $1",
+       "june-date": "Hunyo $1",
+       "july-date": "Hulyo $1",
+       "august-date": "Agosto $1",
+       "september-date": "Setyembre $1",
+       "october-date": "Oktubre $1",
+       "november-date": "Nobyembre $1",
+       "december-date": "Disyembre $1",
+       "pagecategories": "{{PLURAL:$1|Kategorya|Saray kategorya}}",
+       "category_header": "Saray bolong ed kategorya ya \"$1\"",
+       "subcategories": "Saray subkategorya",
+       "listingcontinuesabbrev": "tol.",
        "about": "Nipakar ed",
        "article": "Bolong na laman",
+       "newwindow": "(onlukas ed balon durongawan)",
        "cancel": "I-tonda",
-       "mypage": "Say bolong ko",
-       "mytalk": "Say tongtongan ko",
-       "anontalk": "Tongtongan para ed sayan IP",
+       "moredotdotdot": "Lalo...",
+       "mypage": "Bolong",
+       "mytalk": "Tongtongan",
+       "anontalk": "Tongtongan",
+       "navigation": "Nabigasyon",
        "and": "&#32;san",
-       "qbpageoptions": "Ayan bolong",
+       "actions": "Saray kiwas",
+       "errorpagetitle": "Lingo",
        "returnto": "Impawel ed $1.",
+       "tagline": "Manlapud {{SITENAME}}",
        "help": "Tolong",
        "search": "Anapen",
        "searchbutton": "Anapen",
        "go": "Ula",
        "searcharticle": "Ula",
        "history": "Awaran na sayan bolong",
-       "history_short": "awaran na sayan bolong",
+       "history_short": "Awaran",
+       "history_small": "awaran",
        "printableversion": "Naigalot ya bersion",
        "permalink": "Masiansian gawing",
-       "edit": "Baloen o dagdagan",
+       "view": "Nengnengen",
+       "view-foreign": "Nengnengen diad $1",
+       "edit": "Dumaen",
+       "create": "Palsaen",
        "delete": "Buralen",
-       "deletethispage": "Buralen so ayan page",
        "protect": "Iyagel",
-       "protectthispage": "Iyagel yan bolong",
-       "unprotect": "aga la iyagel",
-       "unprotectthispage": "Aga la iyagel yan bolong",
+       "protect_change": "salatan",
+       "unprotect": "salatan so iyagel",
        "newpage": "Balon bolong",
-       "talkpage": "Pantongtongan yan bolong",
-       "specialpage": "Niduman Bolong",
-       "articlepage": "Nengnengen so content page",
+       "talkpagelinktext": "tongtongan",
+       "specialpage": "Niduman bolong",
        "talk": "Tongtongan",
-       "userpage": "Basaen so bolong na manag-usar",
+       "views": "Saray nengneng",
+       "toolbox": "Kagawaan",
+       "tool-link-userrights": "Salatan saray grupo {{GENDER:$1|manguusar}}",
+       "tool-link-userrights-readonly": "Nengnengen saray grupo {{GENDER:$1|manguusar}}",
        "mediawikipage": "Nengnengen so bolong na pakabat",
        "viewhelppage": "Nengnengen so bolong na tolong",
        "categorypage": "Nengnengen so bolong na saray category",
        "viewtalkpage": "Nengnengen so tongtongan",
        "otherlanguages": "Diad arom ran salita",
-       "lastmodifiedat": "Say ayan bolong: otet ya binalo nen $2, $1.",
+       "lastmodifiedat": "Say ayan bolong otet ya dimuna nen $1, diad $2.",
        "protectedpage": "Iyayagel yan bolong",
+       "jumptonavigation": "nabigasyon",
        "jumptosearch": "anapen",
        "aboutsite": "Nipakar ed {{SITENAME}}",
        "aboutpage": "Project:Nipaakar",
        "currentevents": "Saray nagagawa natan",
        "currentevents-url": "Project:Saray nagagawa natan",
+       "disclaimers": "Saray kiapapasen",
        "edithelp": "Tolong nipakar ed panagbalo na artikulo",
+       "helppage-top-gethelp": "Tolong",
        "mainpage": "Arapan ya Bolong",
-       "mainpage-description": "Arapan ya Bolong",
+       "mainpage-description": "Arapan ya bolong",
+       "policy-url": "Project:Totontonen",
        "portal": "Pwerta na komyunidad",
        "portal-url": "Project:Pwerta na Komyunidad",
-       "badaccess-group0": "Agmo sarag ya gaween so action ya kekerewen mo.",
-       "youhavenewmessages": "Walay $1 ($2).",
+       "privacy": "Panamaakar nipakar ed privacy",
+       "privacypage": "Project:Panamaakar nipakar ed privacy",
+       "badaccess": "Lingud pangiabuloy",
+       "badaccess-group0": "Agmo sarag ya gaween so kiwas ya kekerewen mo.",
+       "ok": "OK",
+       "youhavenewmessages": "{{PLURAL:$3|Walay}} $1 ($2).",
        "youhavenewmessagesmulti": "Walay balo ran pakabat mo ed $1",
+       "editsection": "dumaen",
+       "editold": "dumaen",
+       "viewsourceold": "nengnengen so pinanlapuan",
+       "editlink": "dumaen",
+       "viewsourcelink": "nengnengen so pinanlapuan",
+       "toc": "Saray napera",
+       "showtoc": "ipanengneng",
+       "hidetoc": "iyamot",
+       "collapsible-collapse": "Kakukusbo",
+       "collapsible-expand": "Palakbanen",
+       "confirmable-yes": "On",
+       "confirmable-no": "Anggapo",
        "viewdeleted": "Nengnengen so $1?",
-       "nstab-user": "Bolong na manag-usar",
+       "nstab-main": "Bolong",
+       "nstab-user": "Bolong na manguusar",
+       "nstab-special": "Niduman bolong",
        "nstab-mediawiki": "Pakabat",
-       "badarticleerror": "Aga sarag ya gaween so ayan action ed sayan bolong.",
+       "nstab-category": "Kategorya",
+       "mainpage-nstab": "Arapan ya bolong",
+       "error": "Lingo",
+       "databaseerror-error": "Lingo: $1",
+       "badarticleerror": "Aga sarag ya gaween so ayan kiwas ed sayan bolong.",
        "cannotdelete": "Aga nabural so nibagan bolong o file. (Sarag ton abural la na arom.)",
        "badtitle": "Aga sarag ya titulo",
        "viewsource": "Nengnengen so pinanlapuan",
+       "viewsource-title": "Nengnengen so pinanlapuan ed $1",
+       "actionthrottled": "Tinikel so kiwas",
        "viewsourcetext": "Sarag mon nengnengen san kopyaen so pinanlapuan na ayan bolong:",
        "yourdomainname": "Say domain mo",
        "login": "Onloob",
        "logout": "Paway",
        "userlogout": "Paway",
        "createaccount": "Mangawa na account",
-       "gotaccountlink": "Onloob",
+       "createacct-reason": "Katonongan",
+       "createacct-benefit-body2": "{{PLURAL:$1|bolong|bolobolong}}",
        "badretype": "Aga parehas so en-type mo ran password.",
-       "acct_creation_throttle_hit": "Sorry, nangawala ka la na $1 account. Agka la makapangawa na account.",
+       "acct_creation_throttle_hit": "Masayem, nangawa ka la na $1 account. Agka la makapangawa na account.",
        "accountcreated": "Agawa so account",
        "accountcreatedtext": "Agawa la so user account para $1.",
+       "loginlanguagelabel": "Salita: $1",
+       "pt-login": "Onloob",
+       "pt-login-button": "Onloob",
+       "pt-userlogout": "Paway",
        "changepassword": "Salatan so password",
        "newpassword": "Balon password:",
+       "botpasswords-label-create": "Palsaen",
+       "botpasswords-label-cancel": "I-tonda",
+       "botpasswords-label-delete": "Buralen",
+       "resetpass-submit-cancel": "I-tonda",
+       "changeemail-none": "(anggapo)",
        "link_tip": "Gawing ed loob",
-       "minoredit": "Melag yan edit.",
+       "summary": "Sumaryo:",
+       "subject": "Suheto:",
+       "minoredit": "Melag yan dinuma",
        "watchthis": "Bantayan yan bolong",
-       "preview": "Nengnengen",
+       "savearticle": "Yagel so bolong",
+       "savearticle-start": "Yagel so bolong…",
+       "publishpage-start": "Ipalapag so bolong…",
+       "preview": "Parlasan",
+       "showpreview": "Ipanengneng so parlasan",
        "showdiff": "Ipanengneng so binalo",
        "anoneditwarning": "'''Pasakbay:''' Agka ni limmoob. Aka-record so IP address mo ed agawgawa ed bolong.",
+       "subject-preview": "Parlasan ed suheto:",
        "blockedtitle": "Sebel ed sayan manag-usar",
-       "blockednoreason": "anggapon katunungan so inter",
+       "blockednoreason": "anggapon katunongan so inter",
        "whitelistedittext": "Nakaukulan mo ya $1 umpian nabalo o nadagdagan ray bolobolong.",
        "loginreqtitle": "Nakaukulan kan Onloob",
        "loginreqlink": "onloob",
        "loginreqpagetext": "Nakaukulan kan $1 umpian nanengneng so arom ran bolobolong.",
-       "accmailtitle": "Say Password impawet la.",
+       "accmailtitle": "Say password impawet la",
        "accmailtext": "Empawet ed $2 so password para ed $1.",
        "newarticle": "(Balo)",
-       "editing": "Babaloen so $1",
+       "updated": "(Binalo)",
+       "note": "<strong>Nota:</strong>",
+       "editing": "Dudumaen so $1",
+       "creating": "Papalsaen so $1",
+       "editingsection": "Dudumaen so $1 (seksion)",
+       "editingcomment": "Dudumaen so $1 (balon seksion)",
        "yourdiff": "Saray niduma",
        "copyrightwarning": "Tandaan komon ya amin ya contribution para ed {{SITENAME}} et nonoten ya pinaolian onong ed $2 (nengnengen so $1 para ed detalye).\nNo ag mo labay ya say inkorit mo ed sarag ya baloen odino ibonog ed anggan siopa, ag mo ipapalima dia.<br />\nSan ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya public domain odino parehas ya libren resource.\n'''AG MANPALIMA NA KIMEY YA WALAY COPYRIGHT TO YA ANGGAPOY ABOLOY!'''",
-       "cantcreateaccounttitle": "Aga makagawa na account",
-       "last": "sampot",
-       "histfirst": "Sankaunaan",
-       "histlast": "Sankautetan",
-       "mypreferences": "Saray preference ko",
+       "next": "ontumbok",
+       "last": "apalabas",
+       "page_first": "unona",
+       "page_last": "imbeneg",
+       "histfirst": "sankaunaan",
+       "histlast": "sankautetan",
+       "rev-showdeleted": "ipanengneng",
+       "revdelete-show-file-submit": "On",
+       "revdelete-log": "Katonongan:",
+       "revdelete-reasonotherlist": "Arum nin katonongan",
+       "mergehistory-reason": "Katonongan:",
+       "lineno": "Linya $1:",
+       "prevn": "apalabas {{PLURAL:$1|$1}}",
+       "nextn": "ontumbok {{PLURAL:$1|$1}}",
+       "prev-page": "apalabas ya bolong",
+       "next-page": "ontombok ya bolong",
+       "searchprofile-articles": "Saray bolong na laman",
+       "searchprofile-everything": "Amin a bengatla",
+       "searchprofile-articles-tooltip": "Anapen diad $1",
+       "search-section": "(seksion $1)",
+       "search-category": "(kategorya $1)",
+       "search-interwiki-more": "(lalo)",
+       "searchall": "amin",
+       "powersearch-toggleall": "Amin",
+       "powersearch-togglenone": "Anggapo",
+       "preferences": "Saray panlabayan",
+       "mypreferences": "Saray panlabayan",
+       "prefs-skin": "Katat",
+       "skin-preview": "Parlasan",
        "datedefault": "Anggapoy preference",
-       "prefs-rc": "Sampot ran binalo",
+       "prefs-user-pages": "Bolobolong na manguusar",
+       "prefs-rc": "Sampot ran dinuma",
        "prefs-watchlist": "Listaan na babantayan",
-       "prefs-editing": "Babaloen",
+       "prefs-resetpass": "Salatan so password",
+       "prefs-rendering": "Itsura",
+       "prefs-editing": "Dudumaen",
        "searchresultshead": "Anapen",
+       "stub-threshold-sample-link": "pangaligan",
+       "timezoneregion-africa": "Aprika",
+       "timezoneregion-america": "Amerika",
+       "timezoneregion-antarctica": "Antartika",
+       "timezoneregion-arctic": "Artiko",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Dayat Atlantiko",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europa",
+       "timezoneregion-indian": "Dayat Indiano",
+       "timezoneregion-pacific": "Dayat Pasipiko",
+       "prefs-searchoptions": "Anapen",
        "yourrealname": "Tuwan ngaran:",
+       "yourlanguage": "Salita:",
        "badsiglength": "Andukey ya maong so nickname. Say dukey to dapat mas daiset en say $1 ya character.",
+       "prefs-signature": "Pirma",
+       "prefs-editor": "Editor",
+       "prefs-preview": "Parlasan",
        "userrights-user-editname": "Isulat so username:",
-       "recentchanges": "Sampot ran binalo",
-       "hide": "Yamot",
+       "userrights-reason": "Katonongan:",
+       "group": "Grupo:",
+       "group-user": "Saray manguusar",
+       "group-bot": "Saray bot",
+       "group-sysop": "Saray administrador",
+       "group-all": "(amin)",
+       "group-user-member": "{{GENDER:$1|manguusar}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|administrador}}",
+       "grouppage-user": "{{ns:project}}:Saray manguusar",
+       "grouppage-bot": "{{ns:project}}:Saray bot",
+       "grouppage-sysop": "{{ns:project}}:Saray administrador",
+       "action-edit": "dumaen sayan bolong",
+       "action-createpage": "palsaen say bolong",
+       "enhancedrc-history": "awaran",
+       "recentchanges": "Sampot ran dinuma",
+       "recentchanges-summary": "Tontonen so sankasampotan ran binalo ed ayan wiki diad panamegley to yan bolong.",
+       "recentchanges-label-minor": "Melag yan dinuma",
+       "recentchanges-submit": "Ipanengneng",
+       "rcfilters-activefilters-hide": "Iyamot",
+       "rcfilters-activefilters-show": "Ipanengneng",
+       "rcfilters-savedqueries-remove": "Buralen",
+       "rcfilters-savedqueries-new-name-label": "Ngaran",
+       "rcfilters-savedqueries-cancel-label": "I-tonda",
+       "rclistfrom": "Ipanengneng so balo ran binalo manggapod $2, $3",
+       "rcshowhideminor": "$1 so melag ran dinuma",
+       "rcshowhideminor-show": "Ipanengneng",
+       "rcshowhideminor-hide": "Iyamot",
+       "rcshowhidebots-show": "Ipanengneng",
+       "rcshowhidebots-hide": "Iyamot",
+       "rcshowhideliu-show": "Ipanengneng",
+       "rcshowhideliu-hide": "Iyamot",
+       "rcshowhideanons": "$1 so manguusar ran agkabat",
+       "rcshowhideanons-show": "Ipanengneng",
+       "rcshowhideanons-hide": "Iyamot",
+       "rcshowhidepatr-show": "Ipanengneng",
+       "rcshowhidepatr-hide": "Iyamot",
+       "rcshowhidemine": "$1 so saray dinuma ko",
+       "rcshowhidemine-show": "Ipanengneng",
+       "rcshowhidemine-hide": "Iyamot",
+       "rcshowhidecategorization-show": "Ipanengneng",
+       "rcshowhidecategorization-hide": "Iyamot",
+       "rclinks": "Ipanengneng so sampot ya $1 ran binalo ed sampot $2 ran agew",
+       "hide": "Iyamot",
        "show": "Ipanengneng",
+       "minoreditletter": "m",
+       "newpageletter": "B",
+       "boteditletter": "b",
        "recentchangeslinked": "Kabiangan ran binalo",
        "recentchangeslinked-feed": "Kabiangan ran binalo",
        "recentchangeslinked-toolbox": "Kabiangan ran binalo",
+       "recentchangeslinked-page": "Ngaran na bolong:",
        "upload": "Mangisigep na file",
+       "uploadbtn": "Mangisigep na file",
+       "filedesc": "Sumaryo",
+       "fileuploadsummary": "Sumaryo:",
        "filesource": "Pinanlapuan:",
        "badfilename": "Binalo so ngaran na file, umpian \"$1\" so balon ngaran to.",
        "sourcefilename": "Filename na pinanlapuan:",
        "watchthisupload": "Bantayan yan bolong",
+       "upload-dialog-button-cancel": "I-tonda",
+       "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-infoform-description": "Deskripsion",
+       "upload-form-label-infoform-categories": "Saray kategorya",
+       "upload-form-label-infoform-date": "Agew",
        "listfiles_name": "Ngaran",
+       "filehist-current": "kaplesan",
+       "filehist-datetime": "Agew/Oras",
+       "filehist-user": "Manguusar",
+       "filehist-comment": "Komento",
        "imagelinks": "Saray Gawing",
+       "filerevert-comment": "Katonongan:",
+       "filedelete-comment": "Katonongan:",
+       "filedelete-submit": "Buralen",
+       "filedelete-reason-otherlist": "Arum nin katonongan",
        "download": "mangileksab (download)",
        "unusedtemplateswlh": "arom ran gawing",
        "randompage": "Random ya bolong",
        "randompage-nopages": "Anggapoy bolong ya wadya ed ayan namespace.",
+       "randomincategory-category": "Kategorya:",
+       "randomincategory-submit": "Ula",
+       "statistics": "Estadistika",
+       "statistics-pages": "Bolobolong",
+       "pageswithprop-submit": "Ula",
+       "brokenredirects-edit": "dumaen",
+       "brokenredirects-delete": "buralen",
        "withoutinterwiki": "Saray bolobolong ya anggapoy gawing ya language",
        "withoutinterwiki-summary": "Anggapoy gawin paulad version na arum ran salita so ontombok ran bolobolong:",
+       "withoutinterwiki-submit": "Ipanengneng",
+       "fewestrevisions": "Saray bolong ya sankadaisetan so dinuma",
+       "mostrevisions": "Saray bolong ya sankarakelan so dinuma",
+       "prefixindex-submit": "Ipanengneng",
        "shortpages": "Antikey ran bolong",
        "longpages": "Andokoy ran bolong",
+       "deadendpagestext": "Say ontombok ran bolobolong anggapoy gawing da ed arom ran bolobolong ed {{SITENAME}}.",
        "protectedpages": "Iyayagel ran bolobolong",
+       "protectedpages-page": "Bolong",
+       "protectedpages-reason": "Katonongan",
        "newpages": "Balo ran bolong",
+       "newpages-submit": "Ipanengneng",
        "ancientpages": "Sankadaanan ran bolobolong",
        "move": "Iyales",
        "movethispage": "Iyales yan bolong",
+       "apisandbox-results": "Saray resulta",
        "booksources": "Saray liblibron pinanlapuan",
        "booksources-search-legend": "Mananap na saray libron pinanlapuan",
+       "booksources-search": "Anapen",
        "all-logs-page": "Amin ran log",
        "allpages": "Amin ya bolobolong",
        "nextpage": "Ontombok ya page ($1)",
        "allinnamespace": "Amin ya bolobolong ($1 namespace)",
        "allpagessubmit": "Ula",
        "allpagesprefix": "Ipanengneng so saray bolobolong ya walay prefix:",
+       "categories": "Saray kategorya",
+       "categories-submit": "Ipanengneng",
+       "deletedcontributions": "Binural saray entolong na manguusar",
        "linksearch": "Anapen ramay gawing ed web",
        "linksearch-pat": "Anapen so pattern:",
        "linksearch-ok": "Anapen",
+       "listusers-submit": "Ipanengneng",
        "emailuser": "E-mail so ayan user",
        "emailfrom": "Manlapud",
        "emailto": "Para ed",
        "emailsend": "Paawit",
        "emailsent": "Say e-mail impawet la",
        "emailsenttext": "Impawit la so e-mail message mo.",
-       "mywatchlist": "Listaan na babantayan ko",
+       "mywatchlist": "Listaan na babantayan",
        "watchnologin": "Agka ni akaloob",
        "addedwatchtext": "Impila so bolong ya \"[[:$1]]\" diad [[Special:Watchlist|listaan na babantayan]] mo. Isulat diman so saray ontombok ran idagdag o panagbalo ed sayan bolong san diad bolong na tongtongan. San akasulat ran '''mapatnag''' (bolded) ed [[Special:RecentChanges|listaan na saray sampot ran binalo]] umpian mas maganom ya nanengneng.\n\nNo labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"ekalen ed babantayan\" (unwatch) diad gilig ya bar.",
-       "watch": "bantayan",
+       "watch": "Bantayan",
        "watchthispage": "Bantayan yan bolong",
        "watching": "Babantayan...",
        "created": "agawa",
        "changed": "asalatan",
        "deletepage": "Buralen so bolong",
        "confirm": "Paletan",
-       "actioncomplete": "Asumpal lan agawa",
+       "delete-legend": "Buralen",
+       "historyaction-submit": "Ipanengneng",
+       "actioncomplete": "Agawa la so kiwas",
        "deletedtext": "Abural lay \"$1\".\nPinengneng so $2 para ed listaan na saray abural ran balo.",
-       "deletecomment": "Katonongan",
+       "deletecomment": "Katonongan:",
+       "deletereasonotherlist": "Arum nin katonongan",
        "prot_1movedto2": "say [[$1]] enyales paula ed [[$2]]",
        "protect-legend": "Palitaen so pangiyagel",
+       "protectcomment": "Katonongan:",
        "protect-level-sysop": "Sysops labat",
+       "restriction-type": "Pangiyaabuloy:",
+       "restriction-edit": "Dumaen",
+       "restriction-move": "Iyales",
+       "restriction-create": "Palsaen",
        "undelete": "Nengnengen so inekal ran bolobolong",
        "viewdeletedpage": "Nengnengen so inekal ran bolong",
+       "undeleteviewlink": "nengnengen",
+       "undeletecomment": "Katonongan:",
        "undelete-search-box": "Anapen ramay binural ran bolobolong",
        "undelete-search-prefix": "Ipanengneng ray bolobolong ya mangagapo ed:",
        "undelete-search-submit": "Anapen",
-       "contributions": "Saray contribution na user",
-       "mycontris": "Saray entolong ko",
+       "undelete-show-file-submit": "On",
+       "blanknamespace": "(Manuman)",
+       "contributions": "Saray kontribusyon na {{GENDER:$1|manguusar}}",
+       "mycontris": "Saray entolong",
+       "anoncontribs": "Saray entolong",
        "year": "Taon:",
        "sp-contributions-newbies-sub": "Para balo ran account",
+       "sp-contributions-talk": "tongtongan",
        "sp-contributions-submit": "Anapen",
        "whatlinkshere": "Antoray akaturo dia",
-       "whatlinkshere-title": "Saray bolong ya aka-gawing ed $1",
+       "whatlinkshere-title": "Saray bolong ya aka-gawing ed \"$1\"",
        "whatlinkshere-page": "Bolong:",
-       "blockip": "Isara ed para ayan manag-usar",
+       "whatlinkshere-submit": "Ula",
+       "blockip": "Aperen yan {{GENDER:$1|manguusar}}",
        "ipbreason": "Katonongan",
        "ipbsubmit": "Isebel ed sayan manag-usar",
        "badipaddress": "Aga nayarin IP address",
        "ipusubmit": "Aga la isebel so ayan address",
+       "autoblocklist-submit": "Anapen",
        "ipblocklist": "Listaan na saray sebel ran IP address san username",
+       "blocklist-reason": "Katonongan",
        "ipblocklist-submit": "Anapen",
        "expiringblock": "nabalang no $1 $2",
-       "blocklink": "isara",
+       "blocklink": "aperen",
        "contribslink": "saray entolong to",
+       "block-log-flags-noemail": "inaper so e-mail",
+       "block-log-flags-nousertalk": "aga naduma so sarilin bolong para tongtongan",
        "move-page-legend": "Iyales so bolong",
-       "movearticle": "Iyales so bolong",
        "movepagebtn": "Iyales so bolong",
        "pagemovedsub": "Asumpal lan inyales",
        "articleexists": "Wala lay bolong to may ngaran ya atan, odino aga valid so pinilim ya ngaran. Pili ka pa na arom ya ngaran.",
-       "movereason": "Katonongan",
-       "delete_and_move": "Buralen san iyales",
+       "movereason": "Katonongan:",
        "delete_and_move_confirm": "On, buralen yan page",
        "export-submit": "Ipaawit",
        "export-addcat": "Iyarom",
        "allmessages": "Saray pakabat na oksoy",
        "allmessagesname": "Ngaran",
        "allmessagestext": "Aya so listaan na amin ya pakabat na oksoy ya naanap ed MediaWiki namespace.",
+       "allmessages-filter-legend": "Sapit",
+       "allmessages-filter-all": "Amin",
+       "allmessages-filter-submit": "Ula",
+       "allmessages-filter-translate": "Ipatalos",
        "filemissing": "Nababalang so file",
        "tooltip-pt-logout": "Paway",
-       "tooltip-ca-viewsource": "Iya-yagel yan bolong. Sarag mon nengnengen so pinanlapuan to.",
+       "tooltip-ca-edit": "Dumaen yan bolong",
+       "tooltip-ca-viewsource": "Iya-yagel yan bolong. \nSarag mon nengnengen so pinanlapuan to",
        "tooltip-ca-protect": "Iyagel yan bolong",
+       "tooltip-ca-delete": "Buralen so ayan bolong",
        "tooltip-ca-move": "Iyales so ayan bolong",
        "tooltip-search": "Anapen {{SITENAME}}",
-       "tooltip-p-logo": "Arapan ya Bolong",
+       "tooltip-p-logo": "Ombisita arapan ya bolong",
+       "tooltip-n-mainpage": "Ombisita arapan ya bolong",
+       "tooltip-n-mainpage-description": "Ombisita arapan ya bolong",
        "tooltip-t-specialpages": "Listaan na amin ran niduman bolobolong",
        "tooltip-ca-nstab-user": "Nengnengen so bolong na manag-usar",
        "tooltip-ca-nstab-mediawiki": "Nengnengen so pakabat na oksoy",
-       "lastmodifiedatby": "Sampot ya binalo yan bolong nen agew ya $2, $1 nen $3.",
+       "lastmodifiedatby": "Sampot ya dimuna yan bolong ya $2, $1 nen $3.",
+       "pageinfo-language-change": "salatan",
+       "pageinfo-content-model-change": "salatan",
+       "pageinfo-contentpage-yes": "On",
+       "pageinfo-protect-cascading-yes": "On",
+       "markedaspatrollederrortext": "Nakaukulan mon itanda so inpanguman umpian natandaan ya apatrol.",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|bolong|bolobolong}}",
+       "noimages": "Anggapoy nanengneng.",
        "ilsubmit": "Anapen",
        "exif-filesource": "File na pinanlapuan",
+       "exif-gaincontrol-0": "Anggapo",
        "namespacesall": "amin",
        "monthsall": "amin",
        "confirmemail": "Kumpirmaen so E-mail address",
        "confirmemail_needlogin": "Nakaukulan mo ya $1 umpian nakompirma so email address mo.",
        "confirmemail_success": "Akompirma so e-mail address mo. Sarag mo lay man-log-in san panliketan so wiki.",
        "confirmemail_loggedin": "Akompira la so e-mail address mo.",
-       "deletedwhileediting": "Pasakbay: Abural yan bolong nen ginapuan mon baloen!",
+       "deletedwhileediting": "<strong>Pasakbay:</strong>: Abural yan bolong nen ginapuan mon dumaen!",
        "confirm-purge-top": "Ekalen so cache na sayan bolong?",
        "imgmultipagenext": "ontombok ya bolong →",
        "imgmultigo": "Ula!",
+       "img-lang-go": "Ula",
        "table_pager_next": "Ontombok ya bolong",
        "table_pager_prev": "Embeneg ya bolong",
        "table_pager_first": "Unaan ya bolong",
        "autosumm-replace": "Salatan yan bolong na '$1'",
        "autoredircomment": "Ituturo paulad [[$1]]",
        "autosumm-new": "Balon bolong: $1",
-       "specialpages": "Niduma ran bolobolong"
+       "version": "Bersion",
+       "version-specialpages": "Niduma ran bolobolong",
+       "version-skin-colheader-name": "Katat",
+       "version-ext-colheader-version": "Bersion",
+       "version-ext-colheader-license": "Lisensia",
+       "version-ext-colheader-description": "Deskripsion",
+       "version-ext-colheader-credits": "Saray autor",
+       "version-software-product": "Produkto",
+       "version-software-version": "Bersion",
+       "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Librarya",
+       "version-libraries-version": "Bersion",
+       "version-libraries-license": "Lisensia",
+       "version-libraries-description": "Deskripsion",
+       "version-libraries-authors": "Saray autor",
+       "redirect-submit": "Ula",
+       "redirect-value": "Balor:",
+       "fileduplicatesearch-submit": "Anapen",
+       "specialpages": "Niduma ran bolobolong",
+       "tag-filter-submit": "Sapit",
+       "tags-active-yes": "On",
+       "tags-active-no": "Anggapo",
+       "tags-edit": "dumaen",
+       "tags-delete": "buralen",
+       "tags-create-reason": "Katonongan:",
+       "tags-create-submit": "Palsaen",
+       "tags-delete-reason": "Katonongan:",
+       "tags-activate-reason": "Katonongan:",
+       "tags-deactivate-reason": "Katonongan:",
+       "tags-edit-existing-tags-none": "<em>Anggapo</em>",
+       "tags-edit-reason": "Katonongan:",
+       "compare-page1": "Bolong 1",
+       "compare-page2": "Bolong 2",
+       "compare-submit": "Ikompara",
+       "permanentlink": "Masiansian gawing",
+       "htmlform-selectorother-other": "Arum",
+       "htmlform-no": "Anggapo",
+       "htmlform-yes": "On",
+       "htmlform-cloner-delete": "Ekalen",
+       "rightsnone": "(anggapo)",
+       "feedback-cancel": "I-tonda",
+       "feedback-message": "Mensahe:",
+       "feedback-subject": "Suheto:",
+       "feedback-thanks-title": "Salamat!",
+       "searchsuggest-search": "Anapen {{SITENAME}}",
+       "expand_templates_output": "Resulta",
+       "expand_templates_preview": "Parlasan",
+       "pagelang-name": "Bolong",
+       "pagelang-language": "Salita",
+       "pagelang-reason": "Katonongan",
+       "mediastatistics-header-office": "Opisina",
+       "special-characters-group-persian": "Persiano",
+       "special-characters-group-hebrew": "Hebreo",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "log-action-filter-all": "Amin",
+       "log-action-filter-block-block": "Aperen",
+       "authmanager-realname-label": "Tuwan ngaran",
+       "edit-error-short": "Lingo: $1",
+       "edit-error-long": "Saray lingo:\n\n$1",
+       "passwordpolicies-group": "Grupo"
 }
index 2fd9b77..72fe13b 100644 (file)
        "badarticleerror": "Dla tej strony ta operacja nie może być wykonana.",
        "cannotdelete": "Nie można usunąć strony lub pliku „$1”.\nMożliwe, że zostało to już zrobione przez kogoś innego.",
        "cannotdelete-title": "Strona „$1” nie może być usunięta.",
+       "delete-scheduled": "Strona „$1” znajduje się w kolejce do usunięcia.\nProsimy o cierpliwość.",
        "delete-hook-aborted": "Usuwanie przerwane przez hak.\nPrzyczyna nieokreślona.",
        "no-null-revision": "Nie można utworzyć zerowej wersji strony \"$1\"",
        "badtitle": "Niepoprawny tytuł",
        "movepage-moved": "'''„$1” została przeniesiona do „$2”'''",
        "movepage-moved-redirect": "Zostało utworzone przekierowanie.",
        "movepage-moved-noredirect": "Nie zostało utworzone przekierowanie.",
+       "movepage-delete-first": "Strona docelowa ma zbyt wiele utworzonych wersji, aby usunąć ja podczas przenoszenia. Usuń ją ręcznie a następnie spróbuj ponownie.",
        "articleexists": "Strona o podanej nazwie już istnieje albo wybrana przez Ciebie nazwa nie jest poprawna.\nWybierz inną nazwę.",
        "cantmove-titleprotected": "Nie możesz przenieść strony, ponieważ nowa nazwa strony jest niedozwolona z powodu zabezpieczenia przed utworzeniem.",
        "movetalk": "Przenieś także stronę dyskusji, jeśli to możliwe.",
        "confirmrecreate": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję, podając jako powód usunięcia:\n: <em>$2</em>\nPotwierdź, że na pewno chcesz odtworzyć tę stronę.",
        "confirmrecreate-noreason": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję. Potwierdź, że naprawdę chcesz odtworzyć tę stronę.",
        "recreate": "Utwórz powtórnie",
-       "confirm-purge-title": "Wyczyść pamięć podręczną tej strony",
+       "confirm-purge-title": "Wyczyść pamięć podręczną",
        "confirm_purge_button": "Wyczyść",
        "confirm-purge-top": "Wyczyścić pamięć podręczną dla tej strony?",
        "confirm-purge-bottom": "Odświeżenie strony wyczyści pamięć podręczną i wymusi pokazanie jej aktualnej wersji.",
index a0fe773..8679c61 100644 (file)
        "blocklogpage": "Jurnal blocări",
        "blocklog-showlog": "Acest utilizator a fost blocat în trecut.\nJurnalul blocărilor este indicat mai jos:",
        "blocklog-showsuppresslog": "Acest utilizator a fost blocat și suprimat în trecut.\nJurnalul suprimărilor este indicat mai jos:",
-       "blocklogentry": "a blocat utilizatorul „[[$1]]” pe o perioadă de $2 $3",
+       "blocklogentry": "a blocat utilizatorul „[[$1]]” cu termenul de expirare $2 $3",
        "reblock-logentry": "a fost schimbată blocarea pentru [[$1]] cu data expirării la $2 $3",
        "blocklogtext": "Acest jurnal cuprinde acțiunile de blocare și deblocare. Adresele IP blocate automat nu sunt afișate. Vizitați [[Special:BlockList|lista blocărilor]] pentru o listă explicită a adreselor blocate în acest moment.",
        "unblocklogentry": "a deblocat utilizatorul $1",
        "revdelete-uname-unhid": "numele de utilizator afișat",
        "revdelete-restricted": "restricții aplicate administratorilor",
        "revdelete-unrestricted": "restricții eliminate pentru administratori",
-       "logentry-block-block": "$1 {{GENDER:$2|a blocat}} utilizatorul {{GENDER:$4|$3}} pe o perioadă de $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|a blocat}} utilizatorul {{GENDER:$4|$3}} cu termenul de expirare $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|a deblocat}} utilizatorul {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|a schimbat}} parametrii blocării pentru utilizatorul {{GENDER:$4|$3}} cu o perioadă de expirare de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|a blocat}} utilizatorul {{GENDER:$4|$3}} pe o perioadă de $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|a schimbat}} parametrii blocării pentru utilizatorul {{GENDER:$4|$3}} cu o perioadă de expirare de $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|a schimbat}} parametrii blocării pentru utilizatorul {{GENDER:$4|$3}} cu termenul de expirare $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|a blocat}} utilizatorul {{GENDER:$4|$3}} cu termenul de expirare $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|a schimbat}} parametrii blocării pentru utilizatorul {{GENDER:$4|$3}} cu termenul de expirare $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|a importat}} $3 prin încărcare de fișier",
        "logentry-import-upload-details": "$1 {{GENDER:$2|a importat}} $3 prin încărcare de fișier ($4 {{PLURAL:$4|versiune|versiuni|de versiuni}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|a importat}} $3 din alt wiki",
index 2f5e7cb..0155b22 100644 (file)
        "grant-basic": "Основные права",
        "grant-viewdeleted": "Просмотр удалённых файлов и страниц",
        "grant-viewmywatchlist": "Просмотр вашего списка наблюдения",
-       "grant-viewrestrictedlogs": "просмотр записей журналов с ограниченным доступом",
+       "grant-viewrestrictedlogs": "Ð\9fросмотр записей журналов с ограниченным доступом",
        "newuserlogpage": "Журнал регистрации участников",
        "newuserlogpagetext": "Список недавно зарегистрировавшихся участников",
        "rightslog": "Журнал прав участника",
index ba7acd8..97fc212 100644 (file)
        "right-nominornewtalk": "Невыписованя новых повідомлїнь по малых управах діскузной сторінкы",
        "right-apihighlimits": "Хоснованя высшых лімітів в  API запытах",
        "right-writeapi": "Хосновати API про писаня",
-       "right-delete": "Ð\97мазаня сторінок",
+       "right-delete": "Ð\9cазаня сторінок",
        "right-bigdelete": "Мазаня сторінок з довгов історіёв",
        "right-deletelogentry": "Мазаня тай обновлїня окремых записів лоґів\n,",
        "right-deleterevision": "Мазаня і обновованя конкретных ревізій сторінок",
        "special-characters-group-lao": "Лаоськы",
        "special-characters-group-khmer": "Кгмерськы",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ"
+       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
+       "log-action-filter-all": "Вшыткы"
 }
index 8e74b77..b82e2b8 100644 (file)
        "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب <em>$2</em> ڄاڻايو ويو آهي.",
        "invalidtitle": "غلط عنوان",
        "exception-nologin": "داخل ٿيل نہ آهيو",
-       "virus-unknownscanner": "اڻڄاتل نِس وائرس:",
+       "virus-unknownscanner": "اڻڄاتل اينٽي وائرس:",
        "cannotlogoutnow-title": "ھاڻي خارج نٿو ٿي سگھجي",
        "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران خارج ٿيڻ ممڪن نہ آھي.",
        "welcomeuser": "ڀليڪار، $1!",
        "hide": "لڪايو",
        "show": "ڏيکاريو",
        "minoreditletter": "م",
-       "newpageletter": "ن",
+       "newpageletter": "نئون",
        "boteditletter": "گ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|واپرائيندڙ|واپرائيندڙن}} کي نظر ۾ رکندي]",
index 10e1ac2..4c86ecb 100644 (file)
@@ -7,7 +7,8 @@
                        "Saiddzone",
                        "Saimawnkham",
                        "Saosukham",
-                       "Sengwan"
+                       "Sengwan",
+                       "Ninjastrikers"
                ]
        },
        "tog-underline": "ႁဵင်းၵွင်ႉ ဢၼ်ထတ်းထႅဝ်တႂ်ႈဝႆႉ:",
@@ -49,7 +50,7 @@
        "tog-watchlisthidecategorization": "သိူင်ႇၼႃႈလိၵ်ႈ လွင်ႈပၢႆး-",
        "tog-ccmeonemails": "သူင်ႇၽိုၼ်မိူၼ်ဢီးမဵလ်း ဢၼ်ၵဝ်ၶႃႈသူင်ႇၸူး ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉၶဝ်",
        "tog-diffonly": "ယႃႇပေၼႄ လွင်ႈၶဝ်ႈပႃးၼႂ်း ၼႃႈလိၵ်ႈ ၸွမ်းၼင်ႇ လွၵ်းၽၢႆႇတႂ်ႈၼႆႉ",
-       "tog-showhiddencats": "á\80\95á\80­á\80¯á\80\90á\80ºá\82\87á\81¼á\82\84 á\80\9cá\80­á\80°á\80\84်ႈ ဢၼ်လပ်ႉဝႆႉ",
+       "tog-showhiddencats": "á\80\95á\80­á\80¯á\80\90á\80ºá\82\87á\81¼á\82\84 á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ ဢၼ်လပ်ႉဝႆႉ",
        "tog-norollbackdiff": "ဝၢႆးသေႁဵတ်း ႁူၼ်လင်ၶိုၼ်းယဝ်ႉၼႆ ယႃႇပေၼႄ လွၵ်း diff လႃႈ",
        "tog-useeditwarning": "ပေႃးပႆႇလႆႈ ၵဵပ်းသိမ်းၼႃႈလိၵ်ႈ ဢၼ်ၶႃႈမူၼ်ႉမႄးဝႆႉသေ သင်ၸိူဝ်ႉဝႃႈ ၶႃႈဢွၵ်ႇၵႂႃႇၼႆ ၽၢင်ႉတိူၼ်ႇပၼ်ၶႃႈ သေၵမ်း",
        "tog-prefershttps": "ၽွင်းၶဝ်ႈၸႂ်ႉတိုဝ်းၼၼ်ႉ ၸႂ်ႉတိုဝ်းၶွၼ်ႇၼႅၵ်ႉသျိၼ်ႇ ဢၼ်ႁူမ်ႇလူမ်ႈ",
        "category_header": "ၼႃႈလိၵ်ႈၼႂ်းလိူင်ႈ \"$1\"",
        "subcategories": "ၵိင်ႇၽႄလိူင်ႈ",
        "category-media-header": "သိုဝ်ႇၼႂ်းလိူင်ႈ \"$1\"",
-       "category-empty": "<em> á\80\9cá\80­á\80°á\80\84်ႈဢၼ်ၼႆႉ ယၢမ်းလဵဝ် ဢမ်ႇပႆႇမီး ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် သိုဝ်ႇသင်ဝႆႉ</em>",
+       "category-empty": "<em> á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈဢၼ်ၼႆႉ ယၢမ်းလဵဝ် ဢမ်ႇပႆႇမီး ၼႃႈလိၵ်ႈ ဢမ်ႇၼၼ် သိုဝ်ႇသင်ဝႆႉ</em>",
        "hidden-categories": "{{PLURAL:$1|လိူင်ႈဢၼ်လပ်ႉဝႆႉ |လိူင်ႈၸိူဝ်း ဢၼ်လပ်ႉဝႆႉ}}",
-       "hidden-category-category": "á\80\9cá\80­á\80°á\80\84်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "hidden-category-category": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်ႇလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-subcat-count-limited": "ၼႂ်းလိူင်ႈၼႆႉ မီးဝႆႉလိူင်ႈၼင်ႇၼႆ {{PLURAL:$1| ၵိင်ႇၽႄလိူင်ႈ |$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆ}}",
-       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84်ႈဢၼ်ၼႆႉ {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} တင်းသဵင်ႈတင်းမူတ်း မီးဝႆႉ $2 ႁူဝ်}}။",
+       "category-article-count": "{{PLURAL:$2| á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\81¼á\82\82á\80ºá\80¸á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈဢၼ်ၼႆႉ {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} တင်းသဵင်ႈတင်းမူတ်း မီးဝႆႉ $2 ႁူဝ်}}။",
        "category-article-count-limited": "တၢင်းပႃႈတႂ်ႈၼႆႉ  {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} မီးၼႂ်းလိူင်ႈ တေႃႈလဵဝ်ၼႆႉ",
-       "category-file-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\80\90á\81¢á\80\84á\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89{{PLURAL:$1| á\81¾á\82\86á\82\87á\81¼á\82\86á\82\89á\80\95á\80µá\81¼á\80º|$1 á\81¾á\81¢á\82\86á\82\87á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\81¼á\82\86á\82\89á\80\95á\80µá\81¼á\80º }} á\80\99á\80®á\80¸á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81µá\82\83á\82\8aၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
+       "category-file-count": "{{PLURAL:$2| á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\80\90á\81¢á\80\84á\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89{{PLURAL:$1| á\81¾á\82\86á\82\87á\81¼á\82\86á\82\89á\80\95á\80µá\81¼á\80º|$1 á\81¾á\81¢á\82\86á\82\87á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\81¼á\82\86á\82\89á\80\95á\80µá\81¼á\80º }} á\80\99á\80®á\80¸á\81¼á\82\82á\80ºá\80¸á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼á\80ºá\82\88á\81¼á\82\86á\82\89 á\81µá\82\83á\82\88ၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-file-count-limited": "ဢၼ်ပဵၼ် {{PLURAL:$1|ၾၢႆႇၼႆႉ|$1 ၾၢႆႇၸိူဝ်းၼႆႉ}} မီးဝႆႉတီႈၼႂ်း တွၼ်ႈၵၼ်ၼႆ့။",
        "listingcontinuesabbrev": "သိုပ်ႇ",
        "index-category": "ၼႃႈလိၵ်ႈ ၸိူဝ်းၸီ့ဝႆ့",
        "viewdeleted": "တေတူၺ်း $1 ၼေ?",
        "restorelink": "တူၺ်း {{PLURAL:$1|လွင်ႈထတ်းသၢင်ႈ ဢၼ်မွတ်ႇပႅတ်ႈ|$1 ၸိူဝ်းထတ်းသၢင်ႈ ဢၼ်မွတ်ႇပႅတ်ႈ}}",
        "feedlinks": "ၶၢဝ်ႇၶီး:",
-       "feed-invalid": "á\80\9cá\80­á\80°á\80\84်ႈၶၢဝ်ႇၶီး ဢၼ်ဢၢၼ်းဢဝ်ၼႆႉ ၽိတ်းပိူင်ႈဝႆႉ",
+       "feed-invalid": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈၶၢဝ်ႇၶီး ဢၼ်ဢၢၼ်းဢဝ်ၼႆႉ ၽိတ်းပိူင်ႈဝႆႉ",
        "feed-unavailable": "ၶၢဝ်ႇၶီးတႃႇ ၸုမ်းႁူမ်ႈသၢင်ႈၼၼ်ႉ ဢမ်ႇပႆႇၸႂ်ႉလႆႈ။",
        "site-rss-feed": "$1 ၶၢဝ်ႇၶီး RSS",
        "site-atom-feed": "ၾိတ်ႉဢတွမ်ႊ $1 ဢၼ်",
        "nstab-mediawiki": "ၶေႃႈၽၢၵ်ႇ",
        "nstab-template": "ပိူင်",
        "nstab-help": "ၼႃႈလိၵ်ႈ ၸွႆႈထႅမ်",
-       "nstab-category": "á\80\9cá\80­á\80°á\80\84်ႈ",
+       "nstab-category": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
        "mainpage-nstab": "ၼႃႈႁူဝ်ႁႅၵ်ႈ",
        "nosuchaction": "ဢမ်ႇမီး လွင်ႈတူင်ႉၼိုင်",
        "nosuchactiontext": "လွင်ႈတူင်ႉၼိုင်ဢၼ် URL မၵ်းမၼ်ႈဝႆႉၼၼ်ႉ မၼ်းဢမ်ႇမီးဝႆႉ။\n ၸဝ်ႈၵဝ်ႇတေပေႃႉ URL မၼ်းၽိတ်းဝႆႉ ဢမ်ႇၼၼ် လႆႈၸွမ်းဝႆႉ ႁဵင်းၵွင်ႉ ဢၼ်ၽိတ်းဝႆ့။ ပေႃးၸႂ်ႉ  {{SITENAME}} ၼႆ မၼ်းတေၸီ့ၼႄပၼ် ၶေႃႈယုင်ႈယၢင်ႈ တီႈၼႂ်း သွပ်ႉၾ်ဝႄးယူႇ။",
        "rcfilters-filter-minor-description": "မႄးထတ်း ၽူႈတႅမ်ႈလိၵ်ႈ ဢၼ်မၢႆၸပ်းဝႆႉၼင်ႇ တွၼ်ႈဢွၼ်ႇ။",
        "rcfilters-filter-major-label": "ဢမ်ႇမီး ၵၢၼ်မႄးထွၼ်း တွၼ်ႈဢွၼ်ႇ",
        "rcfilters-filter-major-description": "မႄးထတ်း ဢၼ်ဢမ်ႇမၢႆၸပ်းဝႆႉၼင်ႇ တွၼ်ႈဢွၼ်ႇ။",
-       "rcfilters-filtergroup-changetype": "á\80\9cá\80­á\80°á\80\84á\80ºá\82\88 လွင်ႈလႅၵ်ႈလၢႆႈ",
+       "rcfilters-filtergroup-changetype": "á\80\99á\80µá\80\9dá\80ºá\80¸လွင်ႈလႅၵ်ႈလၢႆႈ",
        "rcfilters-filter-pageedits-label": "မႄးထတ်းၼႃႈလိၵ်ႈ",
        "rcfilters-filter-pageedits-description": "မႄးထတ်းၸူး လမ်းၼႂ်းဝီႇၶီႇ၊ လွင်ႈဢုပ်ႇဢူဝ်း၊ ၶေႃႈသပ်းလႅင်း တွၼ်ႈၵၼ်...",
        "rcfilters-filter-newpages-label": "လွင်ႈၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ",
        "empty-file": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မၼ်းပဝ်ႇဝႆႉ။",
        "file-too-large": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မႂ်းယႂ်ႇႁႅင်းၼႃႇ။",
        "filename-tooshort": "ၸိုဝ်ႈၾၢႆႇၼႆႉ ပွတ်းႁႅင်းၼႃႇၽႅဝ်။",
-       "filetype-banned": "á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¾á\81¢á\82\86á\82\87á\80\99á\80µá\80\9dá\80ºá\80¸á\81¼á\82\86á\82\89 á\81¼á\82\86á\82\89 á\80\91á\80¯á\81µá\80ºá\82\87á\80¢á\80­á\80¯á\80\90á\80ºá\80¸á\80\90á\80\90á\80ºá\80¸á\80\9dá\82\86á\82\89á\81\8b",
+       "filetype-banned": "ၾၢႆႇမဵဝ်းၼႆႉ ၼႆႉ ထုၵ်ႇဢိုတ်းတတ်းဝႆႉ။",
        "verification-error": "ၾၢႆႇဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇၶၢမ်ႈပူၼ်ႉလႆႈ ၵၢၼ်ၼႄႉၼွၼ်း။",
        "illegal-filename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ၼႆႉ မၼ်းဢမ်ႇၶႂၢင်းပၼ်ႁႂ်ႈၸႂ်ႉ။",
        "overwrite": "လွင်ဢဝ်တဵင်သႂ်ႇ ၾၢႆႇဢၼ်မီးဝႆႉၼႆႉၵေႃႈ ဢမ်ႇလႆႈၶႂၢင်ႈပၼ်ဝႆႉ။",
        "upload-form-label-usage-title": "ၶေႃႈၸႂ်ႉ",
        "upload-form-label-usage-filename": "ၸိုဝ်ႈၾၢႆႇ",
        "upload-form-label-own-work": "ဢၼ်ၼႆႉပဵၼ် ၼႃႈၵၢၼ်တူဝ်ၶႃႈ။",
-       "upload-form-label-infoform-categories": "á\80\9cá\80­á\80°á\80\84်ႈ",
+       "upload-form-label-infoform-categories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
        "upload-form-label-infoform-date": "ဝၼ်းထီႉ",
        "backend-fail-stream": "ဢမ်ႇၸၢင်ႈပိုတ်ႇလႆၾၢႆႇ \"$1\" ဢၼ်ၼႆႉ။",
        "backend-fail-backup": "ဢမ်ႇၸၢင်ႈႁဵတ်း ၵႅမ်လင်ၾၢႆႇ \"$1\" ၼႆႉ။",
        "filedelete-maintenance": "ၽွင်းမိူဝ်ႈ တိုၵ်ႉမႄးၵုမ်းယူႇၼႆႉ ၵၢၼ်မွတ်ႇပႅတ်ႈလႄႈ ၵၢၼ်ဢဝ်ၶိုၼ်း ၾၢႆႇၸိူဝ်းၼႆႉ တေဢမ်ႇၸႂ်ႉလႆႈ ၸူဝ်ႈၶၢဝ်း။",
        "filedelete-maintenance-title": "ဢမ်ႇၸၢင်ႈမွတ်ႇပႅတ်ႈ ၾၢႆႇ",
        "mimesearch": "ၶူၼ်ႉႁႃ MIME",
-       "mimetype": "á\80\9cá\80­á\80°á\80\84á\80ºá\82\88 MIME :",
+       "mimetype": "á\80\99á\80µá\80\9dá\80ºá\80¸ MIME :",
        "download": "လူတ်ႇလူင်း",
        "unwatchedpages": "ၼႃႈလိၵ်ႈ ၸိူဝ်းဢမ်ႇပႆႇလႆႈတူၺ်း။",
        "listredirects": "သဵၼ်ႈမၢႆ ၸိူဝ်းပိၼ်ႇၸီႉ",
        "unusedtemplateswlh": "ႁဵင်းၵွင်ႉ တၢင်ႇၸိူဝ်း",
        "randompage": "ဢဝ်ၼႃႈလိၵ်ႈသၢင်ႇထုၵ်ႇဝႃႈ",
        "randompage-nopages": "တၢင်းၽၢႆႇတႂ်ႈၼၼ်ႉ ဢမ်ႇမီးဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ}}: $1 ။",
-       "randomincategory": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81µá\80\99á\80ºá\82\89á\80\9eá\81¢á\80\84á\80ºá\82\87á\80\90á\80±á\82\83á\82\87 á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ á\80\9cá\80­á\80°á\80\84်ႈ",
+       "randomincategory": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81µá\80\99á\80ºá\82\89á\80\9eá\81¢á\80\84á\80ºá\82\87á\80\90á\80±á\82\83á\82\87 á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
        "randomincategory-invalidcategory": "\"$1\" ၼႆႉ ပဵၼ်ၸိုဝ်ႈလိူင်ႈ ဢၼ်ဢမ်ႇပဵၼ်လႆႈ။",
-       "randomincategory-nopages": "á\80\99á\81¼á\80ºá\80¸á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸á\80\9dá\82\86 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\9eá\80\84á\80º á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:Category:$1|$1]] á\80\9cá\80­á\80°á\80\84်ႈ။",
-       "randomincategory-category": "á\80\9cá\80­á\80°á\80\84်ႈ",
-       "randomincategory-legend": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81µá\80\99á\80ºá\82\89á\80\9eá\81¢á\80\84á\80ºá\82\87á\80\90á\80±á\82\83á\82\87 á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ á\80\9cá\80­á\80°á\80\84်ႈ",
+       "randomincategory-nopages": "á\80\99á\81¼á\80ºá\80¸á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸á\80\9dá\82\86 á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\9eá\80\84á\80º á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:Category:$1|$1]] á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ။",
+       "randomincategory-category": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
+       "randomincategory-legend": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81µá\80\99á\80ºá\82\89á\80\9eá\81¢á\80\84á\80ºá\82\87á\80\90á\80±á\82\83á\82\87 á\81µá\82\83á\82\88á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
        "randomincategory-submit": "သိုပ်ႇၵႂႃႇ",
        "randomredirect": "တူဝ်ပိၼ်ႇၸီႉ ၵမ်ႉသၢင်ႇတေႃႇ",
        "randomredirect-nopages": "မၼ်းဢမ်ႇမီးဝႆႉ တူဝ်ပိၼ်ႇၸီႈ ၼင်ႇလွၵ်းၸိုဝ်ႈ ဝႃႈ \"$1\" ။",
        "lonelypages": "ၼႃႈလိၵ်ႈ ႁၢမ်းႁိူၼ်း",
        "lonelypagestext": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵွင်ႉဝႆႉ ဢမ်ႇၼၼ် ဢမ်ႇလႆႈၶဝ်ႈပႃႈဝႆႉ တႂ်ႈၼႂ်း ၼႃႈလိၵ်ႈတႃႇၸိူဝ်း ၼင်ႇ  {{SITENAME}} ၼႆႉ။",
        "uncategorizedpages": "ၼႃႈလိၵ်ႈၸိူဝ်းဢမ်ႇမီးလိူင်ႈ",
-       "uncategorizedcategories": "á\80\9cá\80­á\80°á\80\84á\80ºá\82\88 á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80¢á\80\99á\80ºá\82\87á\81¶á\80\95á\80ºá\82\89á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80\9dá\82\86á\82\89",
+       "uncategorizedcategories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼á\80ºá\82\88á\80\9cá\80±á\82\83á\80¸á\80\9cá\82\84á\80¸",
        "uncategorizedimages": "ၽၢႆႇၸိူဝ်း ဢမ်ႇမီးလိူင်ႈ",
        "uncategorizedtemplates": "လွၵ်းပိူင် ၸိူဝ်းဢမ်ႇမီးလိူင်ႈ",
-       "unusedcategories": "á\80\9cá\80­á\80°á\80\84်ႈၸိူဝ်း ဢမ်ႇၸႂ်ႉဝႆႉ",
+       "unusedcategories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈၸိူဝ်း ဢမ်ႇၸႂ်ႉဝႆႉ",
        "unusedimages": "ၾၢႆႇ ၸိူဝ်းဢမ်ႇၸႂ်ႉဝႆႉ",
-       "wantedcategories": "á\80\9cá\80­á\80°á\80\84်ႈၸိူဝ်း ၶႂ်ႈလႆႈမႃး",
+       "wantedcategories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈၸိူဝ်း ၶႂ်ႈလႆႈမႃး",
        "wantedpages": "ၼႃႈလိူၵ်ႈ ၸိူဝ်းၶႂ်ႈလႆႈမႃး",
        "wantedpages-badtitle": "ႁူဝ်ၶေႃႈၽိတ်းပိူင်ႈ ၵႃႈတႂ်ႈၼႂ်း ၽွၼ်းလႆႈ မၵ်းသႂ်ႇဝႆႉ : $1",
        "wantedfiles": "ၾၢႆႇ ၸိူဝ်းၶႂ်ႈလႆႈမႃး",
        "wantedfiletext-nocat-noforeign": "ၾၢႆႇၸိူဝ်းပႃႈတႂ်ႈၼႆႉ ၸႂ်ႉဝႆႉသေတႃႉ မၼ်းဢမ်ႇမီးဝႆႉယဝ်ႉ။",
        "wantedtemplates": "လွၵ်းပိူင် ဢၼ်ၶႂ်ႈလႆႈမႃး",
        "mostlinked": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
-       "mostlinkedcategories": "á\80\9cá\80­á\80°á\80\84်ႈ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၼမ်သေပိူၼ်ႈ",
+       "mostlinkedcategories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၼမ်သေပိူၼ်ႈ",
        "mostlinkedtemplates": "ၼႃႈလိၵ်ႈ ၸိူဝ်းမီးၵဵင်ႇၽႄ ၼမ်သေပိူၼ်ႈ",
        "mostcategories": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးလိူင်ႈၼမ်သေပိူၼ်ႈ",
        "mostimages": "ၾၢႆႇ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
        "ancientpages": "ၼႃႈလိၵ်ႈ ၵဝ်ႇမွၼ်ႇ",
        "move": "ၶၢႆႉ",
        "movethispage": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
-       "unusedcategoriestext": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\9cá\80­á\80°á\80\84á\80ºá\82\88 á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89 á\80\99á\80®á\80¸á\80\9dá\82\86á\82\89á\80\9aá\80°á\82\87á\81\8a á\82\81á\80°á\80\99á\80ºá\82\88á\80\9dá\82\83á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\90á\81¢á\80\84á\80ºá\82\87á\81¸á\80­á\80°á\80\9dá\80ºá\80¸ á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80ºá\82\89 á\80\9cá\80­á\80°á\80\84်ႈ ဢၼ်ၸႂ်ႉၶဝ်ဝႆႉ။",
+       "unusedcategoriestext": "á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼á\80ºá\82\88 á\81¸á\80­á\80°á\80\9dá\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89 á\80\99á\80®á\80¸á\80\9dá\82\86á\82\89á\80\9aá\80°á\82\87á\81\8a á\82\81á\80°á\80\99á\80ºá\82\88á\80\9dá\82\83á\82\88 á\80¢á\80\99á\80ºá\82\87á\80\99á\80®á\80¸ á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\80\90á\81¢á\80\84á\80ºá\82\87á\81¸á\80­á\80°á\80\9dá\80ºá\80¸ á\80¢á\80\99á\80ºá\82\87á\81¼á\81¼á\80º á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ ဢၼ်ၸႂ်ႉၶဝ်ဝႆႉ။",
        "notargettitle": "ဢမ်ႇမီး တီႈယိူင်း",
        "notargettext": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈမၵ်းမၼ်ႈဝႆႉ ၼႃႈလိၵ်ႈတီႈယိူင်း ဢမ်ႇၼၼ် ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇႁဵတ်း ၼႃႈၵၢၼ်ၼႆႉ။",
        "nopagetitle": "ဢမ်ႇမီး ၼႃႈလိၵ်ႈ တီႈယိူင်းၸူး",
        "log": "သၢႆမၢႆ",
        "logeventslist-submit": "ၼႄ",
        "all-logs-page": "သဵၼ်ႈမၢႆၵူၼ်းတင်းၼမ် တင်းမူတ်း",
-       "alllogstext": "á\82\81á\80°á\80\99á\80ºá\82\88á\81µá\81¼á\80ºá\81¼á\82\84á\80\9dá\82\86á\82\89á\80\95á\81¼á\80º á\80\9eá\80µá\81¼á\80ºá\82\88á\80\99á\81¢á\82\86á\80\90á\80½á\80\84á\80ºá\80¸ á\81¶á\80½á\80\84á\80º {{SITENAME}} á\80¢á\81¼á\80ºá\81¸á\81¢á\80\84á\80ºá\82\88á\80¢á\80\9dá\80ºá\80\9cá\82\86á\82\88á\81¼á\81¼á\80ºá\82\89á\81\8b\ná\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\80­á\80°á\81µá\80ºá\82\88 á\80\9cá\80­á\80°á\80\84်ႈသဵၼ်ႈမၢႆတွင်း၊ ၽူႈၸႂ်ႉတိုဝ်း(ၼင်ႇတူဝ်လိၵ်ႈလဵၵ်ႉယႂ်ႇ)၊ ဢမ်ႇၼၼ် ၼႃႈလိၵ်ႈဢၼ်ၵပ်းၵၢႆႇ (ၼင်ႇတူဝ်လိၵ်ႈလဵၵ်ႉယႂ်ႇ) သေၵေႃႈ တူၺ်းလႆႈယူႇ။",
+       "alllogstext": "á\82\81á\80°á\80\99á\80ºá\82\88á\81µá\81¼á\80ºá\81¼á\82\84á\80\9dá\82\86á\82\89á\80\95á\81¼á\80º á\80\9eá\80µá\81¼á\80ºá\82\88á\80\99á\81¢á\82\86á\80\90á\80½á\80\84á\80ºá\80¸ á\81¶á\80½á\80\84á\80º {{SITENAME}} á\80¢á\81¼á\80ºá\81¸á\81¢á\80\84á\80ºá\82\88á\80¢á\80\9dá\80ºá\80\9cá\82\86á\82\88á\81¼á\81¼á\80ºá\82\89á\81\8b\ná\81¸á\80\9dá\80ºá\82\88á\81µá\80\9dá\80ºá\82\87 á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\80­á\80°á\81µá\80ºá\82\88 á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈသဵၼ်ႈမၢႆတွင်း၊ ၽူႈၸႂ်ႉတိုဝ်း(ၼင်ႇတူဝ်လိၵ်ႈလဵၵ်ႉယႂ်ႇ)၊ ဢမ်ႇၼၼ် ၼႃႈလိၵ်ႈဢၼ်ၵပ်းၵၢႆႇ (ၼင်ႇတူဝ်လိၵ်ႈလဵၵ်ႉယႂ်ႇ) သေၵေႃႈ တူၺ်းလႆႈယူႇ။",
        "logempty": "ဢမ်ႇငမ်ႇၵၼ်တင်း တီႈၼႂ်းသဵၼ်ႈမၢႆ",
        "log-title-wildcard": "ဢဝ်လိၵ်ႈၸိူဝ်းၼႆႉသေ တႄႇသွၵ်ႈႁႃ ႁူဝ်ၶေႃႈ",
        "showhideselectedlogentries": "လႅၵ်ႈလၢႆႈ ၵၢၼ်ႁၼ်လႆႈ ၶွင် ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ ၸိူဝ်းလိူၵ်ႈဝႆႉ",
        "allpagessubmit": "သိုပ်ႇၵႂႃႇ",
        "allpagesprefix": "ၼႃးလိၵ်ႈဢၼ်ၼႄ ဢိၵ်ႇတင်း ၶေႃႈလူင်ႈၼႃႈ",
        "allpages-hide-redirects": "သိူင်ႇ ၸိူဝ်းတူဝ်ပိၼ်ႇၸီႉ",
-       "categories": "á\80\9cá\80­á\80°á\80\84်ႈ",
+       "categories": "á\80\95á\80­á\80°á\80\84á\80ºá\80\91á\81¢á\81¼်ႈ",
        "sp-deletedcontributions-contribs": "လွင်ႈၶဝ်ႈႁူမ်ႈ",
        "linksearch": "သွၵ်ႈႁႃ ႁဵင်းၵွင်ႉၽၢႆႇၼွၵ်ႈ",
        "linksearch-pat": "လၢႆးသွၵ်ႈႁႃႈ :",
        "changecontentmodel-submit": "လႅၵ်ႈလၢႆႈ",
        "changecontentmodel-success-title": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ထုၵ်ႇလႅၵ်ႈလၢႆႈဝႆႉယဝ်ႉ",
        "changecontentmodel-success-text": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင် [[:$1]] ၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈဝႆႉယဝ်ႉ။",
-       "changecontentmodel-cannot-convert": "á\80\9cá\80\99á\80ºá\80¸á\81¼á\82\82á\80ºá\80¸ á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:$1]] á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\81¢á\82\86á\82\88á\80\95á\80µá\81¼á\80º á\80\9cá\80­á\80°á\80\84á\80ºá\82\88 ၶွင်ႈ $2.",
+       "changecontentmodel-cannot-convert": "á\80\9cá\80\99á\80ºá\80¸á\81¼á\82\82á\80ºá\80¸ á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:$1]] á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\81¢á\82\86á\82\88á\80\95á\80µá\81¼á\80º á\80\99á\80µá\80\9dá\80ºá\80¸ ၶွင်ႈ $2.",
        "changecontentmodel-nodirectediting": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း $1 ၼႆႉ မၼ်းဢမ်ႇၵမ်ႉထႅမ်ပၼ်ဝႆႉ တွၼ်ႈတႃႇ တေမေးထတ်း ၵမ်းသိုဝ်ႈ",
        "changecontentmodel-emptymodels-title": "ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ဢၼ်ၸႂ်ႉလႆႈ ပႆႇမီး",
-       "changecontentmodel-emptymodels-text": "á\80\9cá\80\99á\80ºá\80¸á\81¼á\82\82á\80ºá\80¸ á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:$1]] á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\81¢á\82\86á\82\88á\81¸á\80°á\80¸ á\80\9cá\80­á\80°á\80\84á\80ºá\82\88သေဢၼ်ဢၼ်။",
+       "changecontentmodel-emptymodels-text": "á\80\9cá\80\99á\80ºá\80¸á\81¼á\82\82á\80ºá\80¸ á\80\90á\80®á\82\88á\81¼á\82\82á\80ºá\80¸ [[:$1]] á\81¼á\82\86á\82\89 á\80¢á\80\99á\80ºá\82\87á\81¸á\81¢á\80\84á\80ºá\82\88 á\80\9cá\81¢á\82\86á\82\88á\81¸á\80°á\80¸ á\80\99á\80µá\80\9dá\80ºá\80¸သေဢၼ်ဢၼ်။",
        "log-name-contentmodel": "မၢႆတမ်း လွင်ႈလႅၵ်ႈလၢႆႈ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း",
        "log-description-contentmodel": "ၼႃႈလိၵ်ႈၼႆႉ ၼႄသဵၼ်ႈမၢႆ လွင်ႈလႅၵ်ႈလၢႆႈၸူး ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း ၶွင်ၼႃႈလိၵ်ႈ လႄႈ ၼႃႈလိၵ်ႈ ၸိူဝ်းဢၼ် ၵေႃႇသၢင်ႈဝႆႉတင်း ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း တၢင်ႇဢၼ် ဢၼ်ၸိူဝ်းလိူဝ်သေ ပိူင်ၵႅဝ်ႈ။",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|ၵေႃႇသၢင်ႈဝႆႉ}} ၼႃႈလိၵ်ႈ $3 ဢၼ်ၸႂ်ႉတိုဝ်းဝႆႉ ပိူင်ၵေႃႇသၢင်ႈ လမ်းၼႂ်း \"$5\" ဢၼ်ဢမ်ႇၸႂ်ႈ ပိူင်ၵႅဝ်ႈ",
        "immobile-target-page": "ဢမ်ႇၸၢင်ႈၶၢႆႉၸူး ႁူဝ်ၶေႃႈ ဢွင်ႈတီႈဝႆႉဢၼ်ၼၼ်ႉ။",
        "imagenocrossnamespace": "ဢမ်ႇၸၢင်ႈၶၢႆႉၾၢႆႇၸူး ဢွင်ႈၸိုဝ်း ဢမ်ႇမီးၾၢႆႇ။",
        "nonfile-cannot-move-to-file": "ဢမ်ႇၸၢင်ႈၶၢႆႉ ဢၼ်ဢမ်ႇမီးၾၢႆႇ ၸူး လွၵ်းၸိုဝ်ႈၾၢႆႇ။",
-       "imagetypemismatch": "á\80\9eá\81¢á\82\86á\80\9cá\80\84á\80ºá\81¾á\81¢á\82\86á\82\87á\80¢á\81¼á\80ºá\80\99á\82\82á\80ºá\82\87á\81¼á\82\86á\82\89 á\80\99á\81¼á\80ºá\80¸á\80¢á\80\99á\80ºá\82\87á\81¶á\80°á\80\95á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80\90á\80ºá\80¸ á\80\9cá\80­á\80°á\80\84á\80ºá\82\88သႅၼ်းမၼ်း။",
+       "imagetypemismatch": "á\80\9eá\81¢á\82\86á\80\9cá\80\84á\80ºá\81¾á\81¢á\82\86á\82\87á\80¢á\81¼á\80ºá\80\99á\82\82á\80ºá\82\87á\81¼á\82\86á\82\89 á\80\99á\81¼á\80ºá\80¸á\80¢á\80\99á\80ºá\82\87á\81¶á\80°á\80\95á\80ºá\80¸á\81µá\81¼á\80ºá\80\90á\80\84á\80ºá\80¸ á\80\99á\80µá\80\9dá\80ºá\80¸သႅၼ်းမၼ်း။",
        "imageinvalidfilename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ယိူင်းၸူးၼၼ်ႉ မၼ်းၽိတ်းပိူင်ႈ။",
        "export": "သူင်ႇၼႃႈလိၵ်ႈဢွၵ်ႇ",
        "exportall": "သူင်ႇဢွၵ်ႇ ၼႃႈလိၵ်ႈတင်းမူတ်း",
        "version": "မၢႆဢွၵ်ႇ",
        "version-extensions": "သၢႆလင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
        "version-skins": "ၽိဝ်ၼင် ၸိူဝ်းဢူၼ်းသႂ်ႇဝႆႉ�",
-       "version-specialpages": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
+       "version-specialpages": "ၼႃႈလိၵ်ႈ ၶိုၵ်ႉတွၼ်း",
        "redirect": "ၶိုၼ်းပိၼ်ႇၽၢႆ ၼင်ႇ ၾၢႆႇ၊ ၽူႈၸႂ်ႉတိုဝ်း၊ ၼႃႈလိၵ်ႈ၊ လွင်ႈမႄးၶိုၼ်း ဢမ်ႇၼၼ် မၢႆၽၢင် သဵၼ်ႈမၢႆ",
        "redirect-summary": "ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း ၼႃႈၼႆႉ ပိၼ်ႇၽၢႆႇၸူး ၾၢႆႇဢၼ်ၼိုင်ႈ (ၸွမ်းၼင်ႇၸိုဝ်ႈၾၢႆႇဢၼ်ပၼ်ဝႆႉ)၊ ၼႃးလိၵ်ႈဢၼ်ၼိုင်ႈ(ၸွမ်းၼင်ႇ မၢႆၽၢင်ႇမႄးထတ်းဢၼ်ပၼ်ဝႆႉ ဢမ်ႇၼၼ် မၢႆၽၢင်ၼႃႈလိၵ်ႈ)၊ ၼႃႈလိၵ်ႈၽူႈၸႂ်ႉတိုဝ်းဢၼ်ၼိုင်ႈ (ၸွမ်းၼင်ႇ တူဝ်ၼပ်ႉမၢႆၽၢင်ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ပၼ်ဝႆႉ)၊ ဢမ်ႇၼၼ် သဵၼ်ႈမၢႆတွင်း ဢၼ်ၼိုင်ႈ (ၸွမ်းၼင်ႇ သဵၼ်ႈမၢႆတွင်း မၢႆၽၢင်)။ လၢႆးၸႂ်ႉတိုဝ်း -\n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ဢမ်ႇၼၼ် [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "သိုပ်ႇၵႂႃႇ",
index a23c3e3..cd490af 100644 (file)
        "upload_directory_read_only": "Webový server nemôže zapisovať do adresára pre nahrávanie ($1).",
        "uploaderror": "Chyba pri nahrávaní",
        "upload-recreate-warning": "'''Upozornenie: Súbor s týmto názvom bol zmazaný alebo presunutý.'''\n\nĎalšie informácie si môžete pozrieť v zázname zmazaní a presunutí:",
-       "uploadtext": "Tento formulár použite na nahrávanie súborov.\nUž nahrané súbory môžete zobraziť alebo hľadať v [[Special:FileList|zozname nahraných súborov]]. Nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].\n\nPre vloženie obrázka do stránky použite odkaz v tvare:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.jpg]]</nowiki>''' – vloží sa originál obrázka,\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.png|náhľad|Popis]]</nowiki>''' – vloží sa zmenšený náhľad s rámikom a popisom,\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Súbor.ogg]]</nowiki>''' – vloží sa odkaz na súbor (bez zobrazenia obrázku na stránke)",
+       "uploadtext": "Tento formulár použite na nahrávanie súborov.\nUž nahrané súbory môžete zobraziť alebo hľadať v [[Special:FileList|zozname nahraných súborov]]. Nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].\n\nPre vloženie obrázka do stránky použite odkaz v tvare:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.jpg]]</nowiki></code></strong> – vloží sa originál obrázka,\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Súbor.png|náhľad|Popis]]</nowiki></code></strong> – vloží sa zmenšený náhľad s rámikom a popisom,\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Súbor.ogg]]</nowiki></code></strong> – vloží sa odkaz na súbor (bez zobrazenia obrázku na stránke)",
        "upload-permitted": "{{PLURAL:$2|Povolený formát súboru|Povolené typy súborov}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Uprednostňovaný formát súboru|Uprednostňované typy súborov}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Zakázaný formát súboru|Zakázané formáty súborov}}: $1.",
index 2c9e026..75ed13d 100644 (file)
        "tool-link-userrights": "Промена {{GENDER:$1|корисничких}} групе",
        "tool-link-userrights-readonly": "Приказ {{GENDER:$1|корисничких}} група",
        "tool-link-emailuser": "Слање имејла {{GENDER:$1|кориснику|корисници}}",
-       "imagepage": "Погледај страницу датотеке",
-       "mediawikipage": "Погледај страницу поруке",
-       "templatepage": "Погледај страницу шаблона",
-       "viewhelppage": "Погледај страницу помоћи",
-       "categorypage": "Погледај страницу категорије",
+       "imagepage": "Прикажи страницу датотеке",
+       "mediawikipage": "Прикажи страницу поруке",
+       "templatepage": "Прикажи страницу шаблона",
+       "viewhelppage": "Прикажи страницу помоћи",
+       "categorypage": "Прикажи страницу категорије",
        "viewtalkpage": "Прикажи дискусију",
        "otherlanguages": "На другим језицима",
        "redirectedfrom": "(преусмерено са $1)",
        "privacypage": "Project:Политика приватности",
        "badaccess": "Грешка у дозволама",
        "badaccess-group0": "Није вам дозвољено да извршите радњу коју сте захтевали.",
-       "badaccess-groups": "Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.",
+       "badaccess-groups": "Радња коју сте захтевали је ограничена на кориснике из {{PLURAL:$2|следеће групе|једне од следећих група}}: $1.",
        "versionrequired": "Потребна је верзија $1 Медијавикија",
        "versionrequiredtext": "Потребна је верзија $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу [[Special:Version|верзије]].",
        "ok": "У реду",
        "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом",
        "recentchanges-feed-description": "Пратите најскорије промене на викију у овом фиду.",
        "recentchanges-label-newpage": "Овом изменом је направљена нова страница",
-       "recentchanges-label-minor": "Ð\9eво Ñ\98е Ð¼ања измена",
-       "recentchanges-label-bot": "Ð\9eвÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\98е Ð½Ð°Ð¿Ñ\80авио Ð±Ð¾Ñ\82",
-       "recentchanges-label-unpatrolled": "Ð\9eва Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98оÑ\88 Ð½Ð¸Ñ\98е Ð¿Ð°Ñ\82Ñ\80олиÑ\80ана",
+       "recentchanges-label-minor": "Ð\9cања измена",
+       "recentchanges-label-bot": "Ð\91оÑ\82овÑ\81ка Ð¸Ð·Ð¼ÐµÐ½Ð°",
+       "recentchanges-label-unpatrolled": "Ð\9dепаÑ\82Ñ\80олиÑ\80ана Ð¸Ð·Ð¼Ðµна",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (такође погледајте [[Special:NewPages|списак нових страница]])",
        "rcfilters-filterlist-whatsthis": "Како ово функционише?",
        "rcfilters-filterlist-feedbacklink": "Реците нам шта мислите о овим алаткама за филтрирање",
        "rcfilters-highlightbutton-title": "Истакни резултате",
-       "rcfilters-highlightmenu-title": "Ð\98збоÑ\80 Ð±Ð¾Ñ\98е",
+       "rcfilters-highlightmenu-title": "Ð\98забеÑ\80иÑ\82е Ð±Ð¾Ñ\98Ñ\83",
        "rcfilters-highlightmenu-help": "Изаберите боју да бисте истакнули ово својство",
        "rcfilters-filterlist-noresults": "Нема пронађених филтера",
        "rcfilters-noresults-conflict": "Није пронађен ниједан резултат јер су критеријуми претраге сукобљени",
index 5e43b33..8a9a78e 100644 (file)
        "upload_directory_missing": "Katalog lo wćepywanych plikůw ($1) ńy istńeje a serwer WWW ńy poradźi go utwořić.",
        "upload_directory_read_only": "Serwer ńy može škryflać do katalůgu ($1) kery je přeznačůny na wćepywane pliki.",
        "uploaderror": "Feler při wćepywańu",
-       "uploadtext": "Ůžyj formulařa půńižej do wćepywańo plikůw.\nJak chceš přejřeć dotychčas wćepane pliki, abo w ńich šnupać, přeńdź do [[Special:FileList|listy douůnčůnych plikůw]]. Wšyjstke wćepańo uodnotowane sům we [[Special:Log/upload|rejeře přesůuanych plikůw]], a jygo wyćepańy we [[Special:Log/delete|rejeře wyćepanych]].\n\nPlik pojawi śe na zajće, jak užyješ linka wedle jydnygo s nastympujůncych wzorůw:\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki>''' pokože plik we pounyj postaći,\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|tekst uopisu]]</nowiki>''' pokože šyroko na 200 pikseli mińjaturka umjyščůno při lewym margineśe, uotočůno bez ramka, s podpisym „podpis grafiki”\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki>''' dowo bezpostředńi link do plika ńy pokozujůnc go.",
+       "uploadtext": "Ůžyj formulařa půńižej do wćepywańo plikůw.\nJak chceš přejřeć dotychčas wćepane pliki, abo w ńich šnupać, přeńdź do [[Special:FileList|listy douůnčůnych plikůw]]. Wšyjstke wćepańo uodnotowane sům we [[Special:Log/upload|rejeře přesůuanych plikůw]], a jygo wyćepańy we [[Special:Log/delete|rejeře wyćepanych]].\n\nPlik pojawi śe na zajće, jak užyješ linka wedle jydnygo s nastympujůncych wzorůw:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokože plik we pounyj postaći\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|tekst uopisu]]</nowiki></code>''' pokože šyroko na 200 pikseli mińjaturka umjyščůno při lewym margineśe, uotočůno bez ramka, s podpisym „podpis grafiki”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' dowo bezpostředńi link do plika ńy pokozujůnc go",
        "upload-permitted": "Dopuščalne formaty plikůw: $1.",
        "upload-preferred": "Zalecane formaty plikůw: $1.",
        "upload-prohibited": "Zakozane formaty plikůw: $1.",
index 7734c11..d443304 100644 (file)
        "dellogpagetext": "Aşağıda en son silme işlemlerinin bir listesi bulunmaktadır.",
        "deletionlog": "silme günlüğü",
        "log-name-create": "Sayfa oluşturma günlüğü",
+       "log-description-create": "Aşağıda en son yeni sayfa oluşturma işlemlerinin bir listesi bulunmaktadır.",
        "logentry-create-create": "$1, $3 adlı sayfayı {{GENDER:$2|oluşturdu}}",
        "reverted": "Önceki sürüm geri getirildi",
        "deletecomment": "Neden:",
        "log-action-filter-upload-upload": "Yeni yükleme",
        "log-action-filter-upload-overwrite": "Yeniden yükle",
        "authmanager-authplugin-setpass-bad-domain": "Geçersiz alanadı.",
+       "authmanager-autocreate-noperm": "Otomatik kullanıcı oluşturma izni yok.",
        "authmanager-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "authmanager-email-label": "E-posta",
        "authmanager-email-help": "E-posta adresi",
index 3917508..8da3909 100644 (file)
        "notloggedin": "Ви не увійшли до системи",
        "userlogin-noaccount": "Немає облікового запису?",
        "userlogin-joinproject": "Приєднатися до {{GRAMMAR:genitive|{{SITENAME}}}}",
-       "createaccount": "Ð\97аÑ\80еÑ\94Ñ\81Ñ\82Ñ\80Ñ\83ваÑ\82иÑ\81Ñ\8f",
+       "createaccount": "СÑ\82воÑ\80иÑ\82и Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81",
        "userlogin-resetpassword-link": "Забули пароль?",
        "userlogin-helplink2": "Допомога з входом у систему",
        "userlogin-loggedin": "Ви вже увійшли як {{GENDER:$1|$1}}.\nВикористайте нижче форму для входу як інший користувач.",
        "right-importupload": "імпорт сторінок через завантаження файлів",
        "right-patrol": "позначення редагувань патрульованими",
        "right-autopatrol": "автоматичне позначення редагувань патрульованими",
-       "right-patrolmarks": "Ð\9fеÑ\80еглÑ\8fд Ð¿Ð°Ñ\82Ñ\80Ñ\83лÑ\8cованиÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок у нових редагуваннях",
+       "right-patrolmarks": "пеÑ\80еглÑ\8fд Ð¿Ð¾Ð·Ð½Ð°Ñ\87ок Ð¿Ð°Ñ\82Ñ\80Ñ\83лÑ\8eваннÑ\8f у нових редагуваннях",
        "right-unwatchedpages": "перегляд списку сторінок, за якими ніхто не спостерігає",
        "right-mergehistory": "об'єднання історій редагувань сторінок",
        "right-userrights": "зміна всіх прав користувачів",
        "upload_directory_read_only": "Веб-сервер не має прав запису в папку ($1), в якій планується зберігати завантажувані файли.",
        "uploaderror": "Помилка завантаження файлу",
        "upload-recreate-warning": "'''Увага. Файл з такою назвою був раніше вилучений або перейменований.''\n\nДалі наведено журнал вилучень і перейменувань цього файлу:",
-       "uploadtext": "За допомогою цієї форми ви можете завантажити файли на сервер.\n\nЯкщо файл із зазначеною вами назвою вже існує в проекті, то його буде замінено без попередження. Тому, якщо ви не збираєтесь оновлювати файл,\nбуло б непогано перевірити, чи такий файл уже існує.\n\nЩоби переглянути вже завантажені файли,\nзайдіть на: [[Special:FileList|список завантажених файлів]].\n\nЗавантаження відображаються в [[Special:Log/upload|журналі завантажень]], вилучення – у [[Special:Log/delete|журналі вилучень]].\n\nДля вставки зображень в статті можна використовувати такі рядки:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.jpg<nowiki>]]</nowiki></code>''', щоб використати повну версію файлу\n* '''<code><nowiki>[[</nowiki>{{ns:file}}:Назва_зображення.png|200px|thumb|left|Підпис під зображенням<nowiki>]]</nowiki></code>''', щоб використати зображення у рамці зліва сторінки з підписом під зображенням\n\nдля інших медіа-файлів використовуйте рядок виду:\n* '''<code><nowiki>[[</nowiki>{{ns:media}}:Назва_файлу.ogg<nowiki>]]</nowiki></code>'''.",
+       "uploadtext": "За допомогою цієї форми ви можете завантажити файли на сервер.\nЩоби переглянути вже завантажені файли,\nзайдіть на [[Special:FileList|список завантажених файлів]]. Завантаження відображаються в [[Special:Log/upload|журналі завантажень]], вилучення – у [[Special:Log/delete|журналі вилучень]].\n\nДля вставки зображень в статті можна використовувати такі рядки:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}:Файл.jpg<nowiki>]]</nowiki></code>''', щоб використати повну версію файлу\n* '''<code><nowiki>[[</nowiki>{{ns:file}}:Файл.png|200px|thumb|left|Підпис під зображенням<nowiki>]]</nowiki></code>''', щоб використати зображення у рамці зліва сторінки з підписом під зображенням\n* '''<code><nowiki>[[</nowiki>{{ns:media}}:Файл.ogg<nowiki>]]</nowiki></code>''' для прямого посилання на файл, без відображення його на сторінці",
        "upload-permitted": "Дозволен{{PLURAL:$2|ий тип|і типи}} файлів: $1.",
        "upload-preferred": "Бажан{{PLURAL:$2|ий тип|і типи}} файлів: $1.",
        "upload-prohibited": "Заборонен{{PLURAL:$2|ий тип|і типи}} файлів: $1.",
index 8ed22c4..a5bc856 100644 (file)
        "group-autoconfirmed": "خود توثیق شدہ صارفین",
        "group-bot": "روبہ جات",
        "group-sysop": "منتظمین",
+       "group-interface-admin": "انٹرفیس منتظمین",
        "group-bureaucrat": "مامورین اداری",
        "group-suppress": "Suppressors",
        "group-all": "(تمام)",
        "group-autoconfirmed-member": "خودتوثیق شدہ صارف",
        "group-bot-member": "خودکار صارف",
        "group-sysop-member": "{{GENDER:$1|منتظم}}",
+       "group-interface-admin-member": "{{GENDER:$1|انٹرفیس منتظم}}",
        "group-bureaucrat-member": "{{GENDER:$1|مامور اداری}}",
        "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:صارفین",
        "grouppage-autoconfirmed": "{{ns:project}}:خود توثیق شدہ صارف",
        "grouppage-bot": "{{ns:project}}:روبہ جات",
        "grouppage-sysop": "{{ns:project}}:منتظمین",
+       "grouppage-interface-admin": "{{ns:project}}:انٹرفیس منتظمین",
        "grouppage-bureaucrat": "{{ns:project}}:مامورین اداری",
        "grouppage-suppress": "{{ns:project}}:پوشیدگی",
        "right-read": "مطالعہ صفحات",
index 5227669..4d21f32 100644 (file)
        "badarticleerror": "מען קען נישט טאן די אקציע וואס איר ווילט אויף דעם בלאט.",
        "cannotdelete": "נישט געווען מעגלעך אויסמעקן דעם בלאט אדער די טעקע \"$1\".\nקען זיין  אז דאס איז שוין געווארן אויסגעמעקט דורך אן אנדערן.",
        "cannotdelete-title": "מען קען נישט אויסמעקן בלאט \"$1\"",
+       "delete-scheduled": "דעם בלאט \"$1\" פלאנירט מען אויסצומעקן.\nהאטס געדולד.",
        "delete-hook-aborted": "אויסמעקונג אנולירט דורך hook.\nנישט געגעבן קיין דערקלערונג.",
        "no-null-revision": "נישט מעגלעך צו שאפן א נול־ווערסיע פונעם בלאט \"$1\".",
        "badtitle": "שלעכט קעפל",
        "botpasswords-existing": "עקזיסטירנדע באט פאסווערטער",
        "botpasswords-createnew": "שאפֿן א ניי באט פאסווארט",
        "botpasswords-editexisting": "רעדאקטירן אן עקזיסטירנדיק באט פאסווארט",
+       "botpasswords-label-needsreset": "(פאסווארט דארף ווערן צוריקגעשטעלט)",
        "botpasswords-label-appid": "באט נאמען:",
        "botpasswords-label-create": "שאַפֿן",
        "botpasswords-label-update": "דערהײַנטיקן",
        "prefs-watchlist-edits": "מאַקסימום צאָל ענדערונגען צו ווייַזן אין אויפֿפאַסונג ליסטע:",
        "prefs-watchlist-edits-max": "מאַקסימום נומער: 1000",
        "prefs-watchlist-token": "אויפֿפאַסונג ליסטע סימן:",
+       "prefs-watchlist-managetokens": "פֿארוואלטן סימנים",
        "prefs-misc": "פֿאַרשידנס",
        "prefs-resetpass": "טוישן פאַסווארט",
        "prefs-changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
        "group-autoconfirmed": "באַשטעטיקטע באַניצער",
        "group-bot": "באטס",
        "group-sysop": "סיסאפן",
+       "group-interface-admin": "אייבערפֿלאך־אדמיניסטראטארן",
        "group-bureaucrat": "ביוראקראטן",
        "group-suppress": "אונטערדריקער",
        "group-all": "(אלע)",
        "group-autoconfirmed-member": "{{GENDER:$1|באַשטעטיקטער באַניצער|באַשטעטיקטע באַניצערין}}",
        "group-bot-member": "{{GENDER:$1|באט}}",
        "group-sysop-member": "{{GENDER:$1|סיסאפ}}",
+       "group-interface-admin-member": "{{GENDER:$1|אייבערפֿלאך־אדמיניסטראטאר}}",
        "group-bureaucrat-member": "{{GENDER:$1|ביוראקראַט}}",
        "group-suppress-member": "{{GENDER:$1|אונטעדריקער}}",
        "grouppage-user": "{{ns:project}}:אײַנגעשריבענער באניצער",
        "action-editcontentmodel": "רעדאקטירן אינהאלט־מאדעל פון א בלאט",
        "action-managechangetags": "שאפן און (אומ)אקטיווירן טאגן פון דער דאטנבאזע",
        "action-applychangetags": "אנווענדן טאגן צוזאמען מיט אייערע ענדערונגען",
+       "action-deletechangetags": "אויסמעקן טאגן פון דער דאטנבאזע",
        "action-purge": "אויסרייניגן דעם דאזיגן בלאט",
        "nchanges": "{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|זײַט לעצטן וויזיט}}",
        "rcfilters-savedqueries-new-name-label": "נאָמען",
        "rcfilters-savedqueries-apply-label": "שאפן פילטער",
        "rcfilters-savedqueries-cancel-label": "אַנולירן",
+       "rcfilters-clear-all-filters": "אפראמען אלע פֿילטערן",
        "rcfilters-show-new-changes": "ווייזן די נייעסטע ענדערונגען",
        "rcfilters-search-placeholder": "פֿילטערן ענדערונגען (ניצט מעניו אדער זוכט פֿילטער־נאמען)",
        "rcfilters-invalid-filter": "אומגילטיגער פֿילטער",
        "rcfilters-filter-minor-description": "רעדאקטירונגען וואס דער שרייבער האט מארקירט פֿארמינערט.",
        "rcfilters-filter-watchlist-watched-label": "אויף דער אויפֿפאַסונג ליסטע",
        "rcfilters-filter-watchlist-notwatched-label": "נישט אויף דער אויפֿפאַסונג ליסטע",
+       "rcfilters-filter-watchlistactivity-seen-label": "געזעענע ענדערונגען",
        "rcfilters-filtergroup-changetype": "טיפ ענדערונג",
        "rcfilters-filter-pageedits-label": "בלאט רעדאקטירונגען",
        "rcfilters-filter-newpages-label": "בלאַט־שאַפֿונגען",
        "filehist-filesize": "טעקע גרייס",
        "filehist-comment": "באמערקונג",
        "imagelinks": "טעקע באַניץ",
-       "linkstoimage": "{{PLURAL:$1|×\93ער ×¤×\90×\9c×\92× ×\93ער ×\91×\9c×\90×\98 × ×\99צ×\98\93×\99 ×¤×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער × ×\99צ×\9f}} ×\93×\90ס ×\93×\90×\96×\99×\92×¢ ×\91×\99×\9c×\93:",
+       "linkstoimage": "{{PLURAL:$1|×\93ער ×¤×\90×\9c×\92× ×\93ער ×\91×\9c×\90×\98 × ×\99צ×\98\93×\99 ×¤×\90×\9c×\92× ×\93×¢ ×\91×\9c×¢×\98ער × ×\99צ×\9f}} ×\93×\99 ×\93×\90×\96×\99×\92×¢ ×\98עקע:",
        "linkstoimage-more": "מער ווי $1 {{PLURAL:$1|בלאַט ניצט|בלעטער ניצן}} די דאזיגע טעקע.\nדי פֿאלגנדע ליסטע ווײַזט נאר {{PLURAL:$1|דעם ערשטן בלאַט וואס ניצט|די ערשטע $1 בלעטער וואס ניצן}} די טעקע.\nס'איז פֿאַראַן א [[Special:WhatLinksHere/$2|פֿולע רשימה]].",
-       "nolinkstoimage": "× ×\99ש×\98×\90 ×§×\99×\99×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס ×¤×\90ר×\91×\99× ×\93×\9f ×¦×\95 די טעקע.",
+       "nolinkstoimage": "× ×\99ש×\98×\90 ×§×\99×\99×\9f ×\91×\9c×¢×\98ער ×\95×\95×\90ס × ×\99צ×\9f די טעקע.",
        "morelinkstoimage": "באַקוקן  [[Special:WhatLinksHere/$1|מער לינקען]] צו דער טעקע.",
        "linkstoimage-redirect": "$1 (טעקע ווײַטערפֿירונג) $2",
        "duplicatesoffile": "די פֿאלגנדע {{PLURAL:$1|טעקע דופליקירט|$1 טעקעס דופליקירן}} די דאזיגע טעקע ([[Special:FileDuplicateSearch/$2|נאך פרטים]]):",
        "cachedspecial-refresh-now": "באקוקן די לעצטע.",
        "categories": "קאַטעגאָריעס",
        "categories-submit": "ווייזן",
-       "categoriespagetext": "×\93×\99 ×¤Ö¿×\90×\9c×\92×¢× ×\93×¢ {{PLURAL:$1| ×§×\90Ö·×\98×¢×\92×\90ָר×\99×¢ ×\90Ö·× ×\98×\94×\90Ö·×\9c×\98|ק×\90Ö·×\98×¢×\92×\90ָר×\99עס ×\90Ö·× ×\98×\94×\90Ö·×\9c×\98×\9f}} ×\91×\9c×¢×\98ער ×\90×\93ער ×\9e×¢×\93×\99×¢.\n[[Special:UnusedCategories|×\90×\95×\9e×\91×\90Ö·× ×\99צ×\98×¢ ×§×\90Ö·×\98×¢×\92×\90ר×\99עס]] ×\96×¢× ×¢×\9f × ×\99ש×\98 ×\92×¢×\95×\95×\99×\96×\9f ×\93×\90.\nזעט אויך [[Special:WantedCategories|געזוכטע קאַטעגאריעס]].",
+       "categoriespagetext": "×\93×\99 ×¤Ö¿×\90×\9c×\92×¢× ×\93×¢ {{PLURAL:$1| ×§×\90Ö·×\98×¢×\92×\90ָר×\99×¢ ×¢×§×\96×\99ס×\98×\99ר×\98|ק×\90Ö·×\98×¢×\92×\90ָר×\99עס ×¢×§×\96×\99ס×\98×\99ר×\9f}} ×\90×\95×\99×£ ×\93ער ×\95×\95×\99ק×\99, ×\90×\95×\9f ×\90×\99×\96 ×\90פשר ×\90×\99×\9f ×\91×\90× ×\99×¥ ×\90פשר × ×\99ש×\98.\n\nזעט אויך [[Special:WantedCategories|געזוכטע קאַטעגאריעס]].",
        "categoriesfrom": "ווײַזן קאַטעגאריעס אָנהייבנדיג פֿון:",
        "deletedcontributions": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
        "deletedcontributions-title": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
        "move-page-legend": "באַוועגן בלאַט",
        "movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט <strong> נישט</strong> ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong>\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
        "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט <strong>נישט</strong> ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong> אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַרזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
-       "movepagetalktext": "×\98×\90×\9eער ×¦×\99×\99×\9bנס איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
+       "movepagetalktext": "×\98×\90×\9eער ×¦×\99×\99×\9b× ×\98 איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
        "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "previousdiff": "פריערדיקער אונטערשייד →",
        "nextdiff": "קומענדיקע ווערסיע ←",
        "mediawarning": "'''ווארענונג''': דער טעקע טיפ קען אנטהאלטן בייזוויליקן קאד.\nדורכפירן דעם קאד קען שעדיקן אייער סיסטעם.",
-       "imagemaxsize": "מאקסימאלע בילד גרייס :<br />''(פאר טעקע באשרייבונג בלעטער)''",
+       "imagemaxsize": "מאקסימאלע בילד גרייס אויף טעקע באשרייבונג בלעטער:",
        "thumbsize": "קליינבילד גרייס:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, {{PLURAL:$3|איין בלאט|$3 בלעטער}}",
index c7d4b3f..7f82f70 100644 (file)
@@ -55,7 +55,7 @@
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
        "tog-watchuploads": "加入我監視清單入面上載嘅檔案",
        "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
-       "tog-minordefault": "預設全部編輯做修改",
+       "tog-minordefault": "預設全部編輯做修改",
        "tog-previewontop": "喺修改欄上邊顯示預覽",
        "tog-previewonfirst": "第一次修改時顯示預覽",
        "tog-enotifwatchlistpages": "喺我張監視清單度嘅頁同檔有修改時,用電郵通知我。",
        "variants": "變種",
        "navigation-heading": "導覽選單",
        "errorpagetitle": "出錯",
-       "returnto": "返去$1 。",
+       "returnto": "返去$1。",
        "tagline": "出自{{SITENAME}}",
        "help": "幫手",
        "search": "搵嘢",
        "grouppage-bureaucrat": "{{ns:project}}:事務員",
        "grouppage-suppress": "{{ns:project}}:監督",
        "right-read": "讀版",
-       "right-edit": "編輯版",
+       "right-edit": "版",
        "right-createpage": "開版(唔包討論版)",
        "right-createtalk": "開討論版",
        "right-createaccount": "開新用戶戶口",
        "exif-subjectnewscode": "項碼",
        "exif-compression-1": "未壓過",
        "exif-copyrighted-true": "受版權保護",
+       "exif-photometricinterpretation-1": "黑同白(黑係0)",
        "exif-unknowndate": "未知日期",
        "exif-orientation-1": "正常",
        "exif-orientation-2": "左右倒轉",
index 2e84b26..c9ecdf1 100644 (file)
                        "夢蝶葬花",
                        "Dcljr",
                        "Phenolla",
-                       "Hello903hello"
+                       "Hello903hello",
+                       "A Chinese Wikipedian"
                ]
        },
        "tog-underline": "链接下划线:",
        "badarticleerror": "无法在此页进行该操作。",
        "cannotdelete": "无法删除页面或文件“$1”。它可能已被其他人删除了。",
        "cannotdelete-title": "无法删除页面“$1”",
+       "delete-scheduled": "页面“$1”计划删除。\n请耐心等待。",
        "delete-hook-aborted": "删除被扩展钩子取消。钩子并没有给出解释。",
        "no-null-revision": "无法创建对“$1”页面新的空白版本",
        "badtitle": "错误标题",
        "searchdisabled": "{{SITENAME}}的搜索已被禁用。您可以暂时使用搜索引擎进行搜索,须注意其索引的{{SITENAME}}内容可能不是最新的。",
        "search-error": "搜索时发生错误:$1",
        "search-warning": "搜索时发生警告:$1",
-       "preferences": "设置",
+       "preferences": "参数设置",
        "mypreferences": "参数设置",
        "prefs-edits": "编辑数:",
        "prefsnologintext2": "请登录以更改您的用户设置。",
        "movepage-moved": "'''“$1”已移动到“$2”'''",
        "movepage-moved-redirect": "重定向已创建。",
        "movepage-moved-noredirect": "重定向的创建已被禁用。",
+       "movepage-delete-first": "作为页面移动的一部分,目标页面有太多的修改要删除。请先手动删除网页,然后再试一次。",
        "articleexists": "该名称的页面已存在,或者您使用的名称无效。请另选一名。",
        "cantmove-titleprotected": "您无法将页面移动到该位置,因为新标题已被保护以防止创建。",
        "movetalk": "移动关联的讨论页",
        "pageinfo-category-files": "文件数",
        "pageinfo-user-id": "用户ID",
        "pageinfo-file-hash": "哈希值",
+       "pageinfo-view-protect-log": "视此页之保护日志。",
        "markaspatrolleddiff": "标记为已巡查",
        "markaspatrolledtext": "标记此页面为已巡查",
        "markaspatrolledtext-file": "将此文件版本标记为已巡查",
index a3b3a71..de0a559 100644 (file)
@@ -365,7 +365,9 @@ $magicWords = [
 ];
 
 $bookstoreList = [
-       'Aladin.co.kr' => 'http://www.aladin.co.kr/catalog/book.asp?ISBN=$1',
+       'Aladin.co.kr' => 'https://www.aladin.co.kr/catalog/book.asp?ISBN=$1',
+       'National Library of Korea' => 'http://www.nl.go.kr/search/web_search/search/list.php?search_field1=all&tmode=1&value1=$1',
+       'Naver' => 'https://book.naver.com/search/search.nhn?query=$1',
        'inherit' => true,
 ];
 
diff --git a/languages/messages/MessagesShn.php b/languages/messages/MessagesShn.php
new file mode 100644 (file)
index 0000000..6376978
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+/** Shan (ၵႂၢမ်းတႆးလူင်)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$namespaceNames = [
+       NS_MEDIA            => 'သိုဝ်ႇၶၢဝ်ႇ',
+       NS_SPECIAL          => 'ၶိုၵ်ႉတွၼ်း',
+       NS_TALK             => 'ဢုပ်ႇၵုမ်',
+       NS_USER             => 'ၽူႈၸႂ်ႉတိုဝ်း',
+       NS_USER_TALK        => 'ဢုပ်ႇၵုမ်_ၽူႈၸႂ်ႉတိုဝ်း',
+       NS_PROJECT_TALK     => 'ဢုပ်ႇၵုမ်_$1',
+       NS_FILE             => 'ၾၢႆႇ',
+       NS_FILE_TALK        => 'ဢုပ်ႇၵုမ်_ၾၢႆႇ',
+       NS_MEDIAWIKI        => 'သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ',
+       NS_MEDIAWIKI_TALK   => 'ဢုပ်ႇၵုမ်_သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ',
+       NS_TEMPLATE         => 'ထႅမ်းပလဵၵ်ႉ',
+       NS_TEMPLATE_TALK    => 'ဢုပ်ႇၵုမ်_ထႅမ်းပလဵၵ်ႉ',
+       NS_HELP             => 'လွင်ႈၸွႆႈထႅမ်',
+       NS_HELP_TALK        => 'ဢုပ်ႇၵုမ်_လွင်ႈၸွႆႈထႅမ်',
+       NS_CATEGORY         => 'ပိူင်ထၢၼ်ႈ',
+       NS_CATEGORY_TALK    => 'ဢုပ်ႇၵုမ်_ပိူင်ထၢၼ်ႈ',
+];
+
+$specialPageAliases = [
+       'Activeusers'               => [ 'ၽူႈၸႂ်ႉတိုဝ်းတူင်ႉတိုၼ်ႇ' ],
+       'Allmessages'               => [ 'ၶေႃႈၶၢဝ်ႇတင်းသဵင်ႈ' ],
+       'AllMyUploads'              => [ 'လွင်ႈလူတ်ႇၶိုၼ်ႈၵဝ်ၶႃႈတင်းသဵင်ႈ', 'ၾၢႆႇၶႃႇတင်းသဵင်ႈ' ],
+       'Allpages'                  => [ 'ၼႃႈလိၵ်ႈတင်းသဵင်ႈ' ],
+       'ApiHelp'                   => [ 'ၵၼ်ၸွႆႈထႅမ်ဢေႇၽီႇဢၢႆႇ' ],
+       'ApiSandbox'                => [ 'ဢေႇၽီႇဢၢႆႇသႅၼ်ႉပွၵ်ႉ' ],
+       'Ancientpages'              => [ 'ၼႃႈလိၵ်ႈၵဝ်ႇမွၼ်ႇ' ],
+       'AutoblockList'             => [ 'သဵၼ်ႈမၢႆႁႄႉတတ်းႁင်းတူဝ်', 'သဵၼ်ႈမၢႆႁႄႉတတ်းႁင်းတူဝ်' ],
+       'Badtitle'                  => [ 'ႁူဝ်ၶေႃႈႁၢႆႉၸႃႉ' ],
+       'Blankpage'                 => [ 'ၼႃႈလိၵ်ႈပဝ်ႇ' ],
+       'Block'                     => [ 'ႁႄႉတတ်း', 'ႁႄႉတတ်းဢၢႆႇၽီႇ', 'ႁႄႉတတ်းၽူႈၸႂ်ႉတိုဝ်း' ],
+       'Booksources'               => [ 'ငဝ်ႈငႃႇပပ်ႉ' ],
+       'BotPasswords'              => [ 'ၶေႃႈလပ်ႉပွတ်ႉ' ],
+       'BrokenRedirects'           => [ 'လွင်ႈပိၼ်ႇၸီႉဢၼ်ၵွႆဝႆႉ' ],
+       'Categories'                => [ 'ပိူင်ထၢၼ်ႈ' ],
+       'ChangeContentModel'        => [ 'လႅၵ်ႈလၢႆႈမေႃႇတႄႇလမ်းၼႂ်း' ],
+       'ChangeCredentials'         => [ 'လႅၵ်ႈလၢႆႈလၵ်းထၢၼ်' ],
+       'ChangeEmail'               => [ 'လႅၵ်ႈလၢႆႈဢီးမေးလ်' ],
+       'ChangePassword'            => [ 'လႅၵ်ႈလၢႆႈၶေႃႈလပ်ႉ', 'တင်ႈၶိုၼ်းၶေႃႈလပ်ႉ', 'တင်ႈၶိုၼ်းၶေႃႈလပ်ႉ' ],
+       'ComparePages'              => [ 'ၼိူင်းတူၺ်းၼႃႈလိၵ်ႈ' ],
+       'Confirmemail'              => [ 'ၼႄႉၼွၼ်းဢီးမေးလ်' ],
+       'Contributions'             => [ 'လွင်ႈၶဝ်ႈႁူမ်ႈ', 'ၶဝ်ႈႁူမ်ႈ' ],
+       'CreateAccount'             => [ 'ၵေႃႇသၢင်ႈဢၶွင်ႉ' ],
+       'Deadendpages'              => [ 'ၼႃႈလိၵ်ႈသုတ်းႁၢမ်း' ],
+       'DeletedContributions'      => [ 'လွင်ႈၶဝ်ႈႁူမ်ႈၸိူဝ်းမွတ်ႇဝႆႉ' ],
+       'DoubleRedirects'           => [ 'ၶေႃႈပိၼ်ႇၸီႉသွင်ၵမ်း' ],
+       'EditTags'                  => [ 'မႄးတတ်းတိတ်းၸပ်း' ],
+       'EditWatchlist'             => [ 'မႄးထတ်းသဵၼ်ႈမၢႆတူၺ်း' ],
+       'Emailuser'                 => [ 'ၽူႈၸႂ်ႉတိုဝ်းဢီးမေးလ်', 'ဢီးမေးလ်' ],
+       'ExpandTemplates'           => [ 'ၵီႈပိုတ်ႇထႅမ်းပလဵၵ်ႉ' ],
+       'Export'                    => [ 'သူင်ႇဢွၵ်ႇ' ],
+       'Fewestrevisions'           => [ 'လွင်ႈမႄးၶိုၼ်းဢၼ်ႇဢေႇသုတ်း' ],
+       'FileDuplicateSearch'       => [ 'သွၵ်ႈႁႃၾၢႆႇထပ်းၵၼ်' ],
+       'Filepath'                  => [ 'သၢႆတၢင်းၾၢႆႇ' ],
+       'GoToInterwiki'             => [ 'ၵႂႃႇၸူးဢိၼ်ႇထႃႇဝီႇၶီႇ' ],
+       'Import'                    => [ 'သူင်ႇၶဝ်ႈ' ],
+       'Invalidateemail'           => [ 'ဢီးမေးလ်ဢမ်ႇၼႄႉၼွၼ်း' ],
+       'JavaScriptTest'            => [ 'လွင်ႈၸၢမ်းၵျႃႇပႃးၸၶရိပ်ႉ' ],
+       'BlockList'                 => [ 'သဵၼ်ႈမၢႆႁႄႉတတ်း', 'သဵၼ်ႈမၢႆႁႄႉတတ်း', 'သဵၼ်ႈမၢႆႁႄႉတတ်းဢၢႆႇၽီႇ' ],
+       'LinkSearch'                => [ 'သွၵ်ႈႁႃႁဵင်းၵွင်ႉ' ],
+       'LinkAccounts'              => [ 'ႁဵင်းၵွင်ႉဢၶွင်ႉ' ],
+       'Listadmins'                => [ 'သဵၼ်ႈမၢႆၽူႈၵုမ်းၵၢၼ်' ],
+       'Listbots'                  => [ 'သဵၼ်ႈမၢႆပွတ်ႉ' ],
+       'Listfiles'                 => [ 'သဵၼ်ႈမၢႆၾၢႆႇ', 'သဵၼ်ႈမၢႆၾၢႆႇ', 'သဵၼ်ႈမၢႆၶႅပ်းႁၢင်ႈ' ],
+       'Listgrouprights'           => [ 'သဵၼ်ႈမၢႆသုၼ်ႇၸုမ်း', 'ၽူႈၸႂ်ႉတိုဝ်းသုၼ်ႇၸုမ်း' ],
+       'Listgrants'                => [ 'သဵၼ်ႈမၢႆၶႂၢင်းပၼ်' ],
+       'Listredirects'             => [ 'သဵၼ်ႈမၢႆတူဝ်ပိၼ်ႇၸီႉ' ],
+       'ListDuplicatedFiles'       => [ 'သဵၼ်ႈမၢႆၾၢႆႇထပ်းၵၼ်', 'သဵၼ်ႈမၢႆၾၢႆႇထပ်းၵၼ်' ],
+       'Listusers'                 => [ 'သဵၼ်ႈမၢႆၽူႈၸႂ်ႉတိုဝ်း', 'သဵၼ်ႈမၢႆၽူႈၸႂ်ႉတိုဝ်း' ],
+       'Lockdb'                    => [ 'ၶတ်းယွင်ၶေႃႈမုၼ်း' ],
+       'Log'                       => [ 'သၢႆမၢႆ', 'သၢႆမၢႆ' ],
+       'Lonelypages'               => [ 'ၼႃႈလိၵ်ႈတူဝ်လဵဝ်', 'ၼႃႈလိၵ်ႈၽၢၼ်ပေႃႈ' ],
+       'Longpages'                 => [ 'ၼႃႈလိၵ်ႈယၢဝ်း' ],
+       'MediaStatistics'           => [ 'သဵၼ်ႈသၢႆမၢႆသိုဝ်ႇၶၢဝ်ႇ' ],
+       'MergeHistory'              => [ 'ပိုၼ်းလေႃး' ],
+       'MIMEsearch'                => [ 'သွၵ်ႈႁႃဢႅမ်ႇဢၢႆႇဢႅမ်ႇဢီး' ],
+       'Mostcategories'            => [ 'ပူင်ထၢၼ်ႈၵမ်ႉၼမ်' ],
+       'Mostimages'                => [ 'ၾၢႆႇၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်', 'ၾၢႆႇၵမ်ႉၼမ်', 'ၶႅပ်းႁၢင်ႈၵမ်ႉၼမ်' ],
+       'Mostinterwikis'            => [ 'ဢိၼ်ႇထႃႇဝီႇၶီႇၵမ်ႉၼမ်' ],
+       'Mostlinked'                => [ 'ၼႃႈလိၵ်ႈၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်', 'ၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်' ],
+       'Mostlinkedcategories'      => [ 'ပိူင်ထၢၼ်ႈၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်', 'ပိူင်ထၢၼ်ႈၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်' ],
+       'Mostlinkedtemplates'       => [ 'ၼႃႈလိၵ်ႈၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်', 'ထႅမ်းပလဵၵ်ႉၸိူဝ်းၵွင်ႉဝႆႉၵမ်ႉၼမ်', 'ထႅမ်းပလဵၵ်ႉၸိူဝ်းၸႂ်ႉဝႆႉၵမ်ႉၼမ်' ],
+       'Mostrevisions'             => [ 'လွင်ႈမႄးၶိုၼ်းၵမ်ႉၼမ်' ],
+       'Movepage'                  => [ 'ၶၢႆႉၼႃႈလိၵ်ႈ' ],
+       'Mycontributions'           => [ 'လွင်ႈၶဝ်ႈႁူမ်ႈၵဝ်ၶႃႈ' ],
+       'MyLanguage'                => [ 'ၽႃႇသႃႇၵႂၢမ်းၵဝ်ၶႃႈ' ],
+       'Mypage'                    => [ 'ၼႃႈလိၵ်ႈၵဝ်ၶႃႈ' ],
+       'Mytalk'                    => [ 'လွင်ႈဢုပ်ႇၵုမ်ၵဝ်ၶႃႈ' ],
+       'Myuploads'                 => [ 'လွင်ႈလူတ်ႇၶိုၼ်ႈၵဝ်ၶႃႈ', 'ၾၢႆႇၵဝ်ၶႃႈ' ],
+       'Newimages'                 => [ 'ၾၢႆႇဢၼ်မႂ်ႇ', 'ၶႅပ်းႁၢင်ႈဢၼ်မႂ်ႇ' ],
+       'Newpages'                  => [ 'ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ' ],
+       'PagesWithProp'             => [ 'ၼႃႈလိၵ်ႈတင်းၶူဝ်းၶွင်', 'ၼႃႈလိၵ်ႈတင်းၶူဝ်းၶွင်', 'ၼႃႈလိၵ်ႈတင်းၶူဝ်းၶွင်', 'ၼႃႈလိၵ်ႈတင်းၶူဝ်းၶွင်' ],
+       'PageData'                  => [ 'ၶေႃႈမုၼ်းၼႃႈလိၵ်ႈ' ],
+       'PageLanguage'              => [ 'ၽႃႇသႃႇၵႂၢမ်းၼႃႈလိၵ်ႈ' ],
+       'PasswordPolicies'          => [ 'ပေႃႇလၸီႇၶေႃႈလပ်ႉ' ],
+       'PasswordReset'             => [ 'တင်ႈၶိုၼ်းၶေႃႈလပ်ႉ' ],
+       'PermanentLink'             => [ 'ႁဵင်းၵွင်ႉမၼ်ႈၵႅၼ်ႇ', 'ႁဵင်းၵွင်ႉမၼ်ႈၵႅၼ်ႇ' ],
+       'Preferences'               => [ 'ငဝ်ႈၵုမ်းၵၢၼ်' ],
+       'Prefixindex'               => [ 'တူဝ်ၶပ်ႉဝႆႉၼႃႈ' ],
+       'Protectedpages'            => [ 'ၼႃႈလိၵ်ႈၸိူဝ်းႁႄႉၵင်ႈဝႆႉ' ],
+       'Protectedtitles'           => [ 'ႁူဝ်ၶေႃႈၸိူဝ်းႁႄႉၵင်ႈဝႆႉ' ],
+       'Randompage'                => [ 'ၵမ်ႉသၢင်ႇတေႃႇ', 'ၼႃႈလိၵ်ႈၵမ်ႉသၢင်ႇတေႃႇ' ],
+       'RandomInCategory'          => [ 'ပိူင်ထၢၼ်ႈတီႈၵမ်ႉသၢင်ႇတေႃႇ' ],
+       'Randomredirect'            => [ 'တူဝ်ပိၼ်ႇၸီႉၵမ်ႉသၢင်ႇတေႃႇ' ],
+       'Randomrootpage'            => [ 'ၼႃႈလိၵ်ႈငဝ်ႈငႃႇၵမ်ႉသၢင်ႇတေႃႇ' ],
+       'Recentchanges'             => [ 'လွင်ႈလႅၵ်ႈလၢႆႈမႂ်ႇမႂ်ႇ' ],
+       'Recentchangeslinked'       => [ 'လွင်ႈလႅၵ်ႈလၢႆႈမႂ်ႇမႂ်ႇၸိူဝ်းၵွင်ႉဝႆႉ', 'လွင်ႈလႅၵ်ႈလၢႆႈၸိူဝ်းၵွင်ႉၵၢႆႇ' ],
+       'Redirect'                  => [ 'ပိၼ်ႇၸီႉ' ],
+       'RemoveCredentials'         => [ 'ထွၼ်ပႅတ်ႈလၵ်းထၢၼ်' ],
+       'ResetTokens'               => [ 'တင်ႈၶိုၼ်းမၢႆၶပ်ႉ' ],
+       'Revisiondelete'            => [ 'မွတ်ႇပႅတ်ႈလွင်ႈမႄးၶိုၼ်း' ],
+       'RunJobs'                   => [ 'ႁဵတ်းၵၢၼ်' ],
+       'Search'                    => [ 'သွၵ်ႈႁႃ' ],
+       'Shortpages'                => [ 'ၼႃႈလိၵ်ႈဢၼ်ပွတ်း' ],
+       'Specialpages'              => [ 'ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်း' ],
+       'Statistics'                => [ 'သဵၼ်ႈသၢႆမၢႆ', 'သဵၼ်ႈသၢႆမၢႆ' ],
+       'Tags'                      => [ 'တိတ်းၸပ်း' ],
+       'TrackingCategories'        => [ 'ၸွမ်းႁွႆးပိူင်ထၢၼ်ႈ' ],
+       'Unblock'                   => [ 'ပိုတ်ႇသေႃး' ],
+       'Uncategorizedcategories'   => [ 'ပိူင်ထၢၼ်ႈလေႃးလႄး' ],
+       'Uncategorizedimages'       => [ 'ၾၢႆႇလေႃးလႄး', 'ၶႅပ်းႁၢင်ႈလေႃးလႄး' ],
+       'Uncategorizedpages'        => [ 'ၼႃႈလိၵ်ႈလေႃးလႄး' ],
+       'Uncategorizedtemplates'    => [ 'ထႅမ်းပလဵၵ်ႉလေႃးလႄး' ],
+       'Undelete'                  => [ 'ၶိုၼ်းဢမ်ႇမွတ်ႇ' ],
+       'UnlinkAccounts'            => [ 'ၶိုၼ်းဢမ်ႇၵွင်ႉဢၶွင်ႉ' ],
+       'Unlockdb'                  => [ 'ၶိုၼ်းဢမ်ႇၶတ်းယွင်ၶေႃႈမုၼ်း' ],
+       'Unusedcategories'          => [ 'ပိူင်ထၢၼ်ႈဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ' ],
+       'Unusedimages'              => [ 'ၾၢႆႇဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ', 'ၶႅပ်းႁၢင်ႈဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ' ],
+       'Unusedtemplates'           => [ 'ထႅမ်းပလဵၵ်ႉဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ' ],
+       'Unwatchedpages'            => [ 'ၼႃႈလိၵ်ႈဢၼ်ဢမ်ႇတူၺ်းဝႆႉ' ],
+       'Upload'                    => [ 'လူတ်ႇၶိုၼ်ႈ' ],
+       'UploadStash'               => [ 'လူတ်ႇၶိုၼ်ႈတီႈသိမ်းသူင်ႇ' ],
+       'Userlogin'                 => [ 'လွၵ်ႉဢိၼ်ႇၽူႈၸႂ်ႉတိုဝ်း', 'လွၵ်ႉဢိၼ်ႇ' ],
+       'Userlogout'                => [ 'လွၵ်ႉဢွၵ်ႉၽူႈၸႂ်ႉတိုဝ်း', 'လွၵ်ႉဢွၵ်ႉ' ],
+       'Userrights'                => [ 'သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်း', 'သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်း', 'ႁဵတ်းပွတ်ႉ' ],
+       'Version'                   => [ 'ဝႃးသျိၼ်း' ],
+       'Wantedcategories'          => [ 'ပိူင်ထၢၼ်ႈဢၼ်ၶႂ်ႈလႆႈ' ],
+       'Wantedfiles'               => [ 'ၾၢႆႇဢၼ်ၶႂ်ႈလႆႈ' ],
+       'Wantedpages'               => [ 'ၼႃႈလိၵ်ႈဢၼ်ၶႂ်ႈလႆႈ', 'ႁဵင်းၵွင်ႉၸိူဝ်းလူႉဝႆႉ' ],
+       'Wantedtemplates'           => [ 'ထႅမ်းပလဵၵ်ႉဢၼ်ၶႂ်ႈလႆႈ' ],
+       'Watchlist'                 => [ 'သဵၼ်ႈမၢႆတႃႇတူၺ်း' ],
+       'Whatlinkshere'             => [ 'ႁဵင်းၵွင်ႉသင်တီႈၼႆႈ' ],
+       'Withoutinterwiki'          => [ 'ဢမ်ႇမီးဢိၼ်ႇထႃႇဝီႇၶီႇ' ],
+];
index 51de082..501f383 100644 (file)
@@ -67,6 +67,16 @@ jquery:
   integrity: sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=
   dest: jquery.js
 
+jquery.client:
+  type: tar
+  src: https://registry.npmjs.org/jquery-client/-/jquery-client-2.0.1.tgz
+  integrity: sha256-tizJojJ55YYdKh67Zj/ho/9IAkDDA2UGKpcNvzn96Zs=
+  dest:
+    package/AUTHORS.txt:
+    package/jquery.client.js:
+    package/LICENSE-MIT:
+    package/README.md:
+
 jquery.cookie:
   type: multi-file
   files:
index 0ec24af..0dfb834 100644 (file)
@@ -266,12 +266,12 @@ class CheckStorage {
                                                case 'historyblobcurstub':
                                                        if ( strlen( $row->header ) == $headerLength ) {
                                                                $this->addError( 'unfixable', "Error: overlong stub header", $oldId );
-                                                               continue;
+                                                               break;
                                                        }
                                                        $stubObj = unserialize( $row->header );
                                                        if ( !is_object( $stubObj ) ) {
                                                                $this->addError( 'restore text', "Error: unable to unserialize stub object", $oldId );
-                                                               continue;
+                                                               break;
                                                        }
                                                        if ( $className == 'historyblobstub' ) {
                                                                $concatBlobs[$stubObj->mOldId][] = $oldId;
index 6233d5b..a27c8a5 100644 (file)
@@ -59,6 +59,13 @@ class UpdateExtensionJsonSchema extends Maintenance {
                                                $json['config'][$name]['merge_strategy'] = $value[ExtensionRegistry::MERGE_STRATEGY];
                                                unset( $value[ExtensionRegistry::MERGE_STRATEGY] );
                                        }
+                                       if ( isset( $config["@$name"] ) ) {
+                                               // Put 'description' first for better human-legibility.
+                                               $json['config'][$name] = array_merge(
+                                                       [ 'description' => $config["@$name"] ],
+                                                       $json['config'][$name]
+                                               );
+                                       }
                                }
                        }
                }
diff --git a/resources/lib/jquery.client/LICENSE-MIT b/resources/lib/jquery.client/LICENSE-MIT
new file mode 100644 (file)
index 0000000..f149289
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright 2010-2015 jquery-client maintainers and other contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/lib/jquery.client/LICENSE-MIT.txt b/resources/lib/jquery.client/LICENSE-MIT.txt
deleted file mode 100644 (file)
index f149289..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright 2010-2015 jquery-client maintainers and other contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
index bcd9c5c..cfe2d29 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery Client v2.0.0
+ * jQuery Client v2.0.1
  * https://www.mediawiki.org/wiki/JQuery_Client
  *
  * Copyright 2010-2015 jquery-client maintainers and other contributors.
@@ -42,8 +42,6 @@
                 *     }
                 */
                profile: function ( nav ) {
-                       /*jshint boss:true */
-
                        if ( nav === undefined ) {
                                nav = window.navigator;
                        }
                                // Generic version digit
                                x = 'x',
                                // Strings found in user agent strings that need to be conformed
-                               wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
+                               wildUserAgents = [ 'Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel' ],
                                // Translations for conforming user agent strings
                                userAgentTranslations = [
                                        // Tons of browsers lie about being something they are not
-                                       [/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
+                                       [ /(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, '' ],
                                        // Chrome lives in the shadow of Safari still
-                                       ['Chrome Safari', 'Chrome'],
+                                       [ 'Chrome Safari', 'Chrome' ],
                                        // KHTML is the layout engine not the browser - LIES!
-                                       ['KHTML', 'Konqueror'],
+                                       [ 'KHTML', 'Konqueror' ],
                                        // Firefox nightly builds
-                                       ['Minefield', 'Firefox'],
+                                       [ 'Minefield', 'Firefox' ],
                                        // This helps keep different versions consistent
-                                       ['Navigator', 'Netscape'],
+                                       [ 'Navigator', 'Netscape' ],
                                        // This prevents version extraction issues, otherwise translation would happen later
-                                       ['PLAYSTATION 3', 'PS3']
+                                       [ 'PLAYSTATION 3', 'PS3' ]
                                ],
                                // Strings which precede a version number in a user agent string - combined and used as
                                // match 1 in version detection
                                        'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
                                        'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
                                ],
-                               // Translations for conforming browser names
+                               // Tanslations for conforming browser names
                                nameTranslations = [],
                                // Names of known layout engines
-                               layouts = ['gecko', 'konqueror', 'msie', 'trident', 'edge', 'opera', 'webkit'],
+                               layouts = [ 'gecko', 'konqueror', 'msie', 'trident', 'edge', 'opera', 'webkit' ],
                                // Translations for conforming layout names
-                               layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
+                               layoutTranslations = [ [ 'konqueror', 'khtml' ], [ 'msie', 'trident' ], [ 'opera', 'presto' ] ],
                                // Names of supported layout engines for version number
-                               layoutVersions = ['applewebkit', 'gecko', 'trident', 'edge'],
+                               layoutVersions = [ 'applewebkit', 'gecko', 'trident', 'edge' ],
                                // Names of known operating systems
-                               platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+                               platforms = [ 'win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone' ],
                                // Translations for conforming operating system names
-                               platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
+                               platformTranslations = [ [ 'sunos', 'solaris' ], [ 'wow64', 'win' ] ],
 
                                /**
                                 * Performs multiple replacements on a string
                                translate = function ( source, translations ) {
                                        var i;
                                        for ( i = 0; i < translations.length; i++ ) {
-                                               source = source.replace( translations[i][0], translations[i][1] );
+                                               source = source.replace( translations[ i ][ 0 ], translations[ i ][ 1 ] );
                                        }
                                        return source;
                                },
                        // Extraction
 
                        if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
-                               name = translate( match[1], nameTranslations );
+                               name = translate( match[ 1 ], nameTranslations );
                        }
                        if ( match = new RegExp( '(' + layouts.join( '|' ) + ')' ).exec( ua ) ) {
-                               layout = translate( match[1], layoutTranslations );
+                               layout = translate( match[ 1 ], layoutTranslations );
                        }
-                       if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\\/(\\d+)').exec( ua ) ) {
-                               layoutversion = parseInt( match[2], 10 );
+                       if ( match = new RegExp( '(' + layoutVersions.join( '|' ) + ')\\/(\\d+)' ).exec( ua ) ) {
+                               layoutversion = parseInt( match[ 2 ], 10 );
                        }
                        if ( match = new RegExp( '(' + platforms.join( '|' ) + ')' ).exec( nav.platform.toLowerCase() ) ) {
-                               platform = translate( match[1], platformTranslations );
+                               platform = translate( match[ 1 ], platformTranslations );
                        }
                        if ( match = new RegExp( '(' + versionPrefixes.join( '|' ) + ')' + versionSuffix ).exec( ua ) ) {
-                               version = match[3];
+                               version = match[ 3 ];
                        }
 
                        // Edge Cases -- did I mention about how user agent string lie?
                        }
                        // Expose Opera 10's lies about being Opera 9.8
                        if ( name === 'opera' && version >= 9.8 ) {
-                               match = ua.match( /\bversion\/([0-9\.]*)/ );
-                               if ( match && match[1] ) {
-                                       version = match[1];
+                               match = ua.match( /\bversion\/([0-9.]*)/ );
+                               if ( match && match[ 1 ] ) {
+                                       version = match[ 1 ];
                                } else {
                                        version = '10';
                                }
                        }
                        // And Opera 15's lies about being Chrome
-                       if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
-                               if ( match[1] ) {
+                       if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9.]*)/ ) ) ) {
+                               if ( match[ 1 ] ) {
                                        name = 'opera';
-                                       version = match[1];
+                                       version = match[ 1 ];
                                }
                        }
                        // And IE 11's lies about being not being IE
-                       if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
-                               if ( match[1] ) {
+                       if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :/]([0-9.]*)/ ) ) ) {
+                               if ( match[ 1 ] ) {
                                        name = 'msie';
-                                       version = match[1];
+                                       version = match[ 1 ];
                                }
                        }
                        // And MS Edge's lies about being Chrome
                        //
                        // It's different enough from classic IE Trident engine that they do this
                        // to avoid getting caught by MSIE-specific browser sniffing.
-                       if ( name === 'chrome' && ( match = ua.match( /\bedge\/([0-9\.]*)/ ) ) ) {
+                       if ( name === 'chrome' && ( match = ua.match( /\bedge\/([0-9.]*)/ ) ) ) {
                                name = 'edge';
-                               version = match[1];
+                               version = match[ 1 ];
                                layout = 'edge';
-                               layoutversion = parseInt( match[1], 10 );
+                               layoutversion = parseInt( match[ 1 ], 10 );
                        }
                        // And Amazon Silk's lies about being Android on mobile or Safari on desktop
                        if ( match = ua.match( /\bsilk\/([0-9.\-_]*)/ ) ) {
-                               if ( match[1] ) {
+                               if ( match[ 1 ] ) {
                                        name = 'silk';
-                                       version = match[1];
+                                       version = match[ 1 ];
                                }
                        }
 
 
                        // Caching
 
-                       return profileCache[ key  ] = {
+                       return profileCache[ key ] = {
                                name: name,
                                layout: layout,
                                layoutVersion: layoutversion,
                 * @return {boolean} The current browser is in the support map
                 */
                test: function ( map, profile, exactMatchOnly ) {
-                       /*jshint evil:true */
+                       /* eslint-disable no-eval */
 
                        var conditions, dir, i, op, val, j, pieceVersion, pieceVal, compare;
                        profile = $.isPlainObject( profile ) ? profile : $.client.profile();
                        if ( map.ltr && map.rtl ) {
                                dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
-                               map = map[dir];
+                               map = map[ dir ];
                        }
                        // Check over each browser condition to determine if we are running in a compatible client
-                       if ( typeof map !== 'object' || map[profile.name] === undefined ) {
+                       if ( typeof map !== 'object' || map[ profile.name ] === undefined ) {
                                // Not found, return true if exactMatchOnly not set, false otherwise
                                return !exactMatchOnly;
                        }
-                       conditions = map[profile.name];
+                       conditions = map[ profile.name ];
                        if ( conditions === false ) {
                                // Match no versions
                                return false;
                                return true;
                        }
                        for ( i = 0; i < conditions.length; i++ ) {
-                               op = conditions[i][0];
-                               val = conditions[i][1];
+                               op = conditions[ i ][ 0 ];
+                               val = conditions[ i ][ 1 ];
                                if ( typeof val === 'string' ) {
                                        // Perform a component-wise comparison of versions, similar to PHP's version_compare
                                        // but simpler. '1.11' is larger than '1.2'.
                                        // Compare components
                                        compare = 0;
                                        for ( j = 0; j < pieceVersion.length; j++ ) {
-                                               if ( Number( pieceVersion[j] ) < Number( pieceVal[j] ) ) {
+                                               if ( Number( pieceVersion[ j ] ) < Number( pieceVal[ j ] ) ) {
                                                        compare = -1;
                                                        break;
-                                               } else if ( Number( pieceVersion[j] ) > Number( pieceVal[j] ) ) {
+                                               } else if ( Number( pieceVersion[ j ] ) > Number( pieceVal[ j ] ) ) {
                                                        compare = 1;
                                                        break;
                                                }
index d1fb98b..5b73e7c 100644 (file)
                                }
                        }, this )
                        .next( function () {
-                               var plainMsg, parsedMsg,
+                               var $link,
                                        settings = data.settings;
                                data.contents = data.contents || {};
 
                                this.useragentMandatory = settings.useragentCheckbox.mandatory;
                                this.useragentFieldLayout.toggle( settings.useragentCheckbox.show );
 
-                               // HACK: Setting a link in the messages doesn't work. There is already a report
-                               // about this, and the bug report offers a somewhat hacky work around that
-                               // includes setting a separate message to be parsed.
-                               // We want to make sure the user can configure both the title of the page and
-                               // a separate url, so this must be allowed to parse correctly.
-                               // See https://phabricator.wikimedia.org/T49395#490610
-                               mw.messages.set( {
-                                       'feedback-dialog-temporary-message':
-                                               '<a href="' + this.feedbackPageUrl + '" target="_blank">' + this.feedbackPageName + '</a>'
-                               } );
-                               plainMsg = mw.message( 'feedback-dialog-temporary-message' ).plain();
-                               mw.messages.set( { 'feedback-dialog-temporary-message-parsed': plainMsg } );
-                               parsedMsg = mw.message( 'feedback-dialog-temporary-message-parsed' );
+                               $link = $( '<a>' )
+                                       .attr( 'href', this.feedbackPageUrl )
+                                       .attr( 'target', '_blank' )
+                                       .text( this.feedbackPageName );
                                this.feedbackMessageLabel.setLabel(
-                                       // Double-parse
-                                       $( '<span>' )
-                                               .append( mw.message( 'feedback-dialog-intro', parsedMsg ).parse() )
+                                       mw.message( 'feedback-dialog-intro', $link ).parseDom()
                                );
 
                                this.validateFeedbackForm();
index 12ef1ba..8b348c8 100644 (file)
        // Replace the default message parser with jqueryMsg
        oldParser = mw.Message.prototype.parser;
        mw.Message.prototype.parser = function () {
-               if ( this.format === 'plain' || !/\{\{|[<>[&]/.test( this.map.get( this.key ) ) ) {
-                       // Fall back to mw.msg's simple parser
+               // Fall back to mw.msg's simple parser where possible
+               if (
+                       // Plain text output always uses the simple parser
+                       this.format === 'plain' ||
+                       (
+                               // jqueryMsg parser is needed for messages containing wikitext
+                               !/\{\{|[<>[&]/.test( this.map.get( this.key ) ) &&
+                               // jqueryMsg parser is needed when jQuery objects or DOM nodes are passed in as parameters
+                               !this.parameters.some( function ( param ) {
+                                       return param instanceof $ || param.nodeType !== undefined;
+                               } )
+                       )
+               ) {
                        return oldParser.apply( this );
                }
 
index 83e0d8a..cdf47d0 100644 (file)
@@ -210,9 +210,7 @@ td.mw-submit {
        display: inline;
        margin: 0;
        padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
+       list-style: none none;
        vertical-align: middle !ie;
 }
 
index 55be237..7e7821e 100644 (file)
@@ -1,4 +1,4 @@
-// Common Less mixin library for MediaWiki
+// Common LESS mixin library for MediaWiki
 //
 // By default the folder containing this file is included in the LESS import paths,
 // which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
index 26f347a..333b8f9 100644 (file)
                // Parent constructor
                mw.widgets.ExpiryWidget.parent.call( this, config );
 
-               // If the wiki does not want the date picker, then initialize the relative
-               // field and exit.
-               if ( config.noDatePicker ) {
-                       this.relativeField.on( 'change', function ( event ) {
-                               // Emit a change event for this widget.
-                               this.emit( 'change', event );
-                       }.bind( this ) );
-
-                       // Initialization
-                       this.$element
-                               .addClass( 'mw-widget-ExpiryWidget' )
-                               .append(
-                                       this.relativeField.$element
-                               );
-
-                       return;
-               }
-
                // Properties
                this.inputSwitch = new OO.ui.ButtonSelectWidget( {
                        tabIndex: -1,
index ac100af..2789571 100644 (file)
@@ -30,25 +30,38 @@ class ReleaseNotesTest extends MediaWikiTestCase {
                );
 
                foreach ( $notesFiles as $index => $fileName ) {
-                       $file = file( $fileName, FILE_IGNORE_NEW_LINES );
+                       $this->assertFileLength( "Release Notes", $fileName );
+               }
 
-                       $this->assertFalse(
-                               !$file,
-                               "Release Notes file '$fileName' is inaccessible."
-                       );
+               // Also test the README and similar files
+               $otherFiles = [ "$IP/COPYING", "$IP/FAQ", "$IP/INSTALL", "$IP/README", "$IP/SECURITY" ];
 
-                       $lines = count( $file );
+               foreach ( $otherFiles as $index => $fileName ) {
+                       $this->assertFileLength( "Help", $fileName );
+               }
+       }
 
-                       for ( $i = 0; $i < $lines; $i++ ) {
-                               $line = $file[$i];
+       /**
+        */
+       private function assertFileLength( $type, $fileName ) {
+               $file = file( $fileName, FILE_IGNORE_NEW_LINES );
 
-                               $this->assertLessThanOrEqual(
-                                       // FILE_IGNORE_NEW_LINES drops the \n at the EOL, so max length is 80 not 81.
-                                       80,
-                                       mb_strlen( $line ),
-                                       "Release notes file '$fileName' line $i is longer than 80 chars:\n\t'$line'"
-                               );
-                       }
+               $this->assertFalse(
+                       !$file,
+                       "$type file '$fileName' is inaccessible."
+               );
+
+               $lines = count( $file );
+
+               for ( $i = 0; $i < $lines; $i++ ) {
+                       $line = $file[$i];
+
+                       $this->assertLessThanOrEqual(
+                               // FILE_IGNORE_NEW_LINES drops the \n at the EOL, so max length is 80 not 81.
+                               80,
+                               mb_strlen( $line ),
+                               "$type file '$fileName' line $i is longer than 80 chars:\n\t'$line'"
+                       );
                }
        }
 }
index 53e6f46..211169e 100644 (file)
@@ -1430,6 +1430,7 @@ class OutputPageTest extends MediaWikiTestCase {
         * @dataProvider provideAddWikiText
         * @covers OutputPage::addWikiText
         * @covers OutputPage::addWikiTextAsInterface
+        * @covers OutputPage::wrapWikiTextAsInterface
         * @covers OutputPage::addWikiTextAsContent
         * @covers OutputPage::addWikiTextWithTitle
         * @covers OutputPage::addWikiTextTitle
@@ -1545,6 +1546,21 @@ class OutputPageTest extends MediaWikiTestCase {
                                        '<div class="mw-editintro">' . "Some page\n</div>"
                                ],
                        ],
+                       'wrapWikiTextAsInterface' => [
+                               'Simple' => [
+                                       [ 'wrapperClass', 'text' ],
+                                       "<div class=\"wrapperClass\"><p>text\n</p></div>"
+                               ], 'Spurious </div>' => [
+                                       [ 'wrapperClass', 'text</div><div>more' ],
+                                       "<div class=\"wrapperClass\"><p>text</p><div>more\n</div></div>"
+                               ], 'Extra newlines would break <p> wrappers' => [
+                                       [ 'two classes', "1\n\n2\n\n3" ],
+                                       "<div class=\"two classes\"><p>1\n</p><p>2\n</p><p>3\n</p></div>"
+                               ], 'Other unclosed tags' => [
+                                       [ 'error', 'a<b>c<i>d' ],
+                                       "<div class=\"error\"><p>a<b>c<i>d\n</i></b></p></div>"
+                               ],
+                       ],
                ];
 
                // Test all the others on addWikiTextTitle as well
index cc166a3..e5e5551 100644 (file)
@@ -1601,4 +1601,38 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                $this->assertSame( $expected, $rev->getTextId() );
        }
 
+       public function provideGetRevisionText() {
+               yield [
+                       [ 'text' ]
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetRevisionText
+        * @covers Revision::getRevisionText
+        */
+       public function testGetRevisionText( array $queryInfoOptions, array $queryInfoExtra = [] ) {
+               $rev = $this->testPage->getRevisionRecord();
+
+               $queryInfo = Revision::getQueryInfo( $queryInfoOptions );
+               $queryInfo['tables'] = array_merge( $queryInfo['tables'], $queryInfoExtra['tables'] ?? [] );
+               $queryInfo['fields'] = array_merge( $queryInfo['fields'], $queryInfoExtra['fields'] ?? [] );
+               $queryInfo['joins'] = array_merge( $queryInfo['joins'], $queryInfoExtra['joins'] ?? [] );
+
+               $conds = [ 'rev_id' => $rev->getId() ];
+               $row = $this->db->selectRow(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $conds,
+                       __METHOD__,
+                       [],
+                       $queryInfo['joins']
+               );
+
+               $expected = $rev->getContent( SlotRecord::MAIN )->serialize();
+
+               $this->hideDeprecated( 'Revision::getRevisionText (MCR without SCHEMA_COMPAT_WRITE_OLD)' );
+               $this->assertSame( $expected, Revision::getRevisionText( $row ) );
+       }
+
 }
index d6ac35b..2da2275 100644 (file)
@@ -46,4 +46,10 @@ class RevisionMcrDbTest extends RevisionDbTestBase {
                yield [ $rec, 789 ];
        }
 
+       public function provideGetRevisionText() {
+               yield 'no text table' => [
+                       []
+               ];
+       }
+
 }
index df54f56..64de854 100644 (file)
@@ -42,4 +42,18 @@ class RevisionMcrReadNewDbTest extends RevisionDbTestBase {
                yield [ $rec, 789 ];
        }
 
+       public function provideGetRevisionText() {
+               yield 'no text table' => [
+                       []
+               ];
+               yield 'force text table' => [
+                       [],
+                       [
+                               'tables' => [ 'text' ],
+                               'fields' => [ 'old_id', 'old_text', 'old_flags', 'rev_text_id' ],
+                               'joins' => [ 'text' => [ 'INNER JOIN', 'old_id=rev_text_id' ] ]
+                       ]
+               ];
+       }
+
 }
index 5868b8d..c053104 100644 (file)
@@ -289,16 +289,6 @@ class RevisionTest extends MediaWikiTestCase {
                Wikimedia\restoreWarnings();
        }
 
-       public function provideGetRevisionText() {
-               yield 'Generic test' => [
-                       'This is a goat of revision text.',
-                       [
-                               'old_flags' => '',
-                               'old_text' => 'This is a goat of revision text.',
-                       ],
-               ];
-       }
-
        public function provideGetId() {
                yield [
                        [],
@@ -365,6 +355,20 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertSame( $expected, $rev->getParentId() );
        }
 
+       public function provideGetRevisionText() {
+               yield 'Generic test' => [
+                       'This is a goat of revision text.',
+                       (object)[
+                               'old_flags' => '',
+                               'old_text' => 'This is a goat of revision text.',
+                       ],
+               ];
+               yield 'garbage in, garbage out' => [
+                       false,
+                       false,
+               ];
+       }
+
        /**
         * @covers Revision::getRevisionText
         * @dataProvider provideGetRevisionText
@@ -372,13 +376,13 @@ class RevisionTest extends MediaWikiTestCase {
        public function testGetRevisionText( $expected, $rowData, $prefix = 'old_', $wiki = false ) {
                $this->assertEquals(
                        $expected,
-                       Revision::getRevisionText( (object)$rowData, $prefix, $wiki ) );
+                       Revision::getRevisionText( $rowData, $prefix, $wiki ) );
        }
 
        public function provideGetRevisionTextWithZlibExtension() {
                yield 'Generic gzip test' => [
                        'This is a small goat of revision text.',
-                       [
+                       (object)[
                                'old_flags' => 'gzip',
                                'old_text' => gzdeflate( 'This is a small goat of revision text.' ),
                        ],
@@ -397,7 +401,7 @@ class RevisionTest extends MediaWikiTestCase {
        public function provideGetRevisionTextWithZlibExtension_badData() {
                yield 'Generic gzip test' => [
                        'This is a small goat of revision text.',
-                       [
+                       (object)[
                                'old_flags' => 'gzip',
                                'old_text' => 'DEAD BEEF',
                        ],
@@ -481,7 +485,7 @@ class RevisionTest extends MediaWikiTestCase {
                        "Wiki est l'\xc3\xa9cole superieur !",
                        'fr',
                        'iso-8859-1',
-                       [
+                       (object)[
                                'old_flags' => 'utf-8',
                                'old_text' => "Wiki est l'\xc3\xa9cole superieur !",
                        ]
@@ -490,7 +494,7 @@ class RevisionTest extends MediaWikiTestCase {
                        "Wiki est l'\xc3\xa9cole superieur !",
                        'fr',
                        'iso-8859-1',
-                       [
+                       (object)[
                                'old_flags' => '',
                                'old_text' => "Wiki est l'\xe9cole superieur !",
                        ]
@@ -519,7 +523,7 @@ class RevisionTest extends MediaWikiTestCase {
                        "Wiki est l'\xc3\xa9cole superieur !",
                        'fr',
                        'iso-8859-1',
-                       [
+                       (object)[
                                'old_flags' => 'gzip,utf-8',
                                'old_text' => gzdeflate( "Wiki est l'\xc3\xa9cole superieur !" ),
                        ]
@@ -528,7 +532,7 @@ class RevisionTest extends MediaWikiTestCase {
                        "Wiki est l'\xc3\xa9cole superieur !",
                        'fr',
                        'iso-8859-1',
-                       [
+                       (object)[
                                'old_flags' => 'gzip',
                                'old_text' => gzdeflate( "Wiki est l'\xe9cole superieur !" ),
                        ]
@@ -729,13 +733,6 @@ class RevisionTest extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * @covers Revision::getRevisionText
-        */
-       public function testGetRevisionText_returnsFalseWhenNoTextField() {
-               $this->assertFalse( Revision::getRevisionText( new stdClass() ) );
-       }
-
        public function provideTestGetRevisionText_returnsDecompressedTextFieldWhenNotExternal() {
                yield 'Just text' => [
                        (object)[ 'old_text' => 'SomeText' ],
index f36faf7..d11e314 100644 (file)
@@ -14,6 +14,7 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter( $result, Language::factory( 'de' ), 'wikitext', false );
                $this->assertSame( 'de', $formatter->getLanguage()->getCode() );
+               $this->assertSame( 'wikitext', $formatter->getFormat() );
 
                $formatter->addMessagesFromStatus( null, Status::newGood() );
                $this->assertSame(
@@ -31,6 +32,25 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                );
        }
 
+       /**
+        * @covers ApiErrorFormatter
+        * @covers ApiErrorFormatter_BackCompat
+        */
+       public function testNewWithFormat() {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'de' ), 'wikitext', false );
+               $formatter2 = $formatter->newWithFormat( 'html' );
+
+               $this->assertSame( $formatter->getLanguage(), $formatter2->getLanguage() );
+               $this->assertSame( 'html', $formatter2->getFormat() );
+
+               $formatter3 = new ApiErrorFormatter_BackCompat( $result );
+               $formatter4 = $formatter3->newWithFormat( 'html' );
+               $this->assertNotInstanceOf( ApiErrorFormatter_BackCompat::class, $formatter4 );
+               $this->assertSame( $formatter3->getLanguage(), $formatter4->getLanguage() );
+               $this->assertSame( 'html', $formatter4->getFormat() );
+       }
+
        /**
         * @covers ApiErrorFormatter
         * @dataProvider provideErrorFormatter
@@ -351,6 +371,7 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
                $this->assertSame( 'en', $formatter->getLanguage()->getCode() );
+               $this->assertSame( 'bc', $formatter->getFormat() );
 
                $this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
 
@@ -526,10 +547,6 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
         * @param array $expect
         */
        public function testGetMessageFromException( $exception, $options, $expect ) {
-               if ( $exception instanceof UsageException ) {
-                       $this->hideDeprecated( 'UsageException::getMessageArray' );
-               }
-
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'html', false );
 
@@ -555,10 +572,6 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
         * @param array $expect
         */
        public function testGetMessageFromException_BC( $exception, $options, $expect ) {
-               if ( $exception instanceof UsageException ) {
-                       $this->hideDeprecated( 'UsageException::getMessageArray' );
-               }
-
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
@@ -579,12 +592,6 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
        }
 
        public static function provideGetMessageFromException() {
-               Wikimedia\suppressWarnings();
-               $usageException = new UsageException(
-                       '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ]
-               );
-               Wikimedia\restoreWarnings();
-
                return [
                        'Normal exception' => [
                                new RuntimeException( '<b>Something broke!</b>' ),
@@ -604,24 +611,6 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
                                        'data' => [ 'foo' => 'bar', 'baz' => 42 ],
                                ]
                        ],
-                       'UsageException' => [
-                               $usageException,
-                               [],
-                               [
-                                       'text' => '&#60;b&#62;Something broke!&#60;/b&#62;',
-                                       'code' => 'ue-code',
-                                       'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
-                               ]
-                       ],
-                       'UsageException, wrapped' => [
-                               $usageException,
-                               [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
-                               [
-                                       'text' => '(&#60;b&#62;Something broke!&#60;/b&#62;)',
-                                       'code' => 'some-code',
-                                       'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
-                               ]
-                       ],
                        'LocalizedException' => [
                                new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
                                [],
index 20d758e..a6083cd 100644 (file)
@@ -1010,10 +1010,6 @@ class ApiMainTest extends ApiTestCase {
                        MWExceptionHandler::getRedactedTraceAsString( $dbex )
                )->inLanguage( 'en' )->useDatabase( false )->text();
 
-               Wikimedia\suppressWarnings();
-               $usageEx = new UsageException( 'Usage exception!', 'ue', 0, [ 'foo' => 'bar' ] );
-               Wikimedia\restoreWarnings();
-
                $apiEx1 = new ApiUsageException( null,
                        StatusValue::newFatal( new ApiRawMessage( 'An error', 'sv-error1' ) ) );
                TestingAccessWrapper::newFromObject( $apiEx1 )->modulePath = 'foo+bar';
@@ -1059,23 +1055,6 @@ class ApiMainTest extends ApiTestCase {
                                        'servedby' => wfHostname(),
                                ]
                        ],
-                       [
-                               $usageEx,
-                               [ 'existing-error', 'ue' ],
-                               [
-                                       'warnings' => [
-                                               [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
-                                       ],
-                                       'errors' => [
-                                               [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
-                                               [ 'code' => 'ue', 'text' => "Usage exception!", 'data' => [ 'foo' => 'bar' ] ]
-                                       ],
-                                       'docref' => "See $doclink for API usage. Subscribe to the mediawiki-api-announce mailing " .
-                                               "list at &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; " .
-                                               "for notice of API deprecations and breaking changes.",
-                                       'servedby' => wfHostname(),
-                               ]
-                       ],
                        [
                                $apiEx1,
                                [ 'existing-error', 'sv-error1', 'sv-error2' ],
diff --git a/tests/phpunit/includes/api/ApiQueryInfoTest.php b/tests/phpunit/includes/api/ApiQueryInfoTest.php
new file mode 100644 (file)
index 0000000..80043da
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @group API
+ * @group medium
+ * @group Database
+ *
+ * @coversDefaultClass ApiQueryInfo
+ */
+class ApiQueryInfoTest extends ApiTestCase {
+
+       /**
+        * @covers ::execute
+        * @covers ::extractPageInfo
+        */
+       public function testExecute() {
+               $page = $this->getExistingTestPage( 'Pluto' );
+               $title = $page->getTitle();
+
+               list( $data ) = $this->doApiRequest( [
+                               'action' => 'query',
+                               'prop' => 'info',
+                               'titles' => $title->getText(),
+               ] );
+
+               $this->assertArrayHasKey( 'query', $data );
+               $this->assertArrayHasKey( 'pages', $data['query'] );
+               $this->assertArrayHasKey( $page->getId(), $data['query']['pages'] );
+
+               $info = $data['query']['pages'][$page->getId()];
+               $this->assertSame( $page->getId(), $info['pageid'] );
+               $this->assertSame( $title->getNamespace(), $info['ns'] );
+               $this->assertSame( $title->getText(), $info['title'] );
+               $this->assertSame( $title->getContentModel(), $info['contentmodel'] );
+               $this->assertSame( $title->getPageLanguage()->getCode(), $info['pagelanguage'] );
+               $this->assertSame( $title->getPageLanguage()->getHtmlCode(), $info['pagelanguagehtmlcode'] );
+               $this->assertSame( $title->getPageLanguage()->getDir(), $info['pagelanguagedir'] );
+               $this->assertSame( wfTimestamp( TS_ISO_8601, $title->getTouched() ), $info['touched'] );
+               $this->assertSame( $title->getLatestRevID(), $info['lastrevid'] );
+               $this->assertSame( $title->getLength(), $info['length'] );
+               $this->assertSame( $title->isNewPage(), $info['new'] );
+               $this->assertArrayNotHasKey( 'actions', $info );
+       }
+
+       /**
+        * @covers ::execute
+        * @covers ::extractPageInfo
+        */
+       public function testExecuteEditActions() {
+               $page = $this->getExistingTestPage( 'Pluto' );
+               $title = $page->getTitle();
+
+               list( $data ) = $this->doApiRequest( [
+                               'action' => 'query',
+                               'prop' => 'info',
+                               'titles' => $title->getText(),
+                               'intestactions' => 'edit'
+               ] );
+
+               $this->assertArrayHasKey( 'query', $data );
+               $this->assertArrayHasKey( 'pages', $data['query'] );
+               $this->assertArrayHasKey( $page->getId(), $data['query']['pages'] );
+
+               $info = $data['query']['pages'][$page->getId()];
+               $this->assertArrayHasKey( 'actions', $info );
+               $this->assertArrayHasKey( 'edit', $info['actions'] );
+               $this->assertTrue( $info['actions']['edit'] );
+       }
+
+       /**
+        * @covers ::execute
+        * @covers ::extractPageInfo
+        */
+       public function testExecuteEditActionsFull() {
+               $page = $this->getExistingTestPage( 'Pluto' );
+               $title = $page->getTitle();
+
+               list( $data ) = $this->doApiRequest( [
+                               'action' => 'query',
+                               'prop' => 'info',
+                               'titles' => $title->getText(),
+                               'intestactions' => 'edit',
+                               'intestactionsdetail' => 'full',
+               ] );
+
+               $this->assertArrayHasKey( 'query', $data );
+               $this->assertArrayHasKey( 'pages', $data['query'] );
+               $this->assertArrayHasKey( $page->getId(), $data['query']['pages'] );
+
+               $info = $data['query']['pages'][$page->getId()];
+               $this->assertArrayHasKey( 'actions', $info );
+               $this->assertArrayHasKey( 'edit', $info['actions'] );
+               $this->assertInternalType( 'array', $info['actions']['edit'] );
+               $this->assertSame( [], $info['actions']['edit'] );
+       }
+
+       /**
+        * @covers ::execute
+        * @covers ::extractPageInfo
+        */
+       public function testExecuteEditActionsFullBlock() {
+               $badActor = $this->getTestUser()->getUser();
+               $sysop = $this->getTestSysop()->getUser();
+
+               $block = new \Block( [
+                       'address' => $badActor->getName(),
+                       'user' => $badActor->getId(),
+                       'by' => $sysop->getId(),
+                       'expiry' => 'infinity',
+                       'sitewide' => 0,
+                       'enableAutoblock' => true,
+               ] );
+
+               $block->insert();
+
+               $page = $this->getExistingTestPage( 'Pluto' );
+               $title = $page->getTitle();
+
+               list( $data ) = $this->doApiRequest( [
+                               'action' => 'query',
+                               'prop' => 'info',
+                               'titles' => $title->getText(),
+                               'intestactions' => 'edit',
+                               'intestactionsdetail' => 'full',
+               ], null, false, $badActor );
+
+               $block->delete();
+
+               $this->assertArrayHasKey( 'query', $data );
+               $this->assertArrayHasKey( 'pages', $data['query'] );
+               $this->assertArrayHasKey( $page->getId(), $data['query']['pages'] );
+
+               $info = $data['query']['pages'][$page->getId()];
+               $this->assertArrayHasKey( 'actions', $info );
+               $this->assertArrayHasKey( 'edit', $info['actions'] );
+               $this->assertInternalType( 'array', $info['actions']['edit'] );
+               $this->assertArrayHasKey( 0, $info['actions']['edit'] );
+               $this->assertArrayHasKey( 'code', $info['actions']['edit'][0] );
+               $this->assertSame( 'blocked', $info['actions']['edit'][0]['code'] );
+               $this->assertArrayHasKey( 'data', $info['actions']['edit'][0] );
+               $this->assertArrayHasKey( 'blockinfo', $info['actions']['edit'][0]['data'] );
+               $this->assertArrayHasKey( 'blockid', $info['actions']['edit'][0]['data']['blockinfo'] );
+               $this->assertSame( $block->getId(), $info['actions']['edit'][0]['data']['blockinfo']['blockid'] );
+       }
+
+}
index 661f325..c340c08 100644 (file)
@@ -196,4 +196,21 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                        [ 'ćaB', 'ćaB' ],
                ];
        }
+
+       public function testNoDBAccess() {
+               global $wgContLanguageCode;
+
+               $dbr = wfGetDB( DB_REPLICA );
+
+               MessageCache::singleton()->getMsgFromNamespace( 'allpages', $wgContLanguageCode );
+
+               $this->assertEquals( 0, $dbr->trxLevel() );
+               $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
+
+               MessageCache::singleton()->getMsgFromNamespace( 'go', $wgContLanguageCode );
+
+               $dbr->restoreFlags();
+
+               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries" );
+       }
 }
index b2e7155..b36fe11 100644 (file)
@@ -130,4 +130,87 @@ class DatabaseDomainTest extends PHPUnit\Framework\TestCase {
                $this->assertSame( null, $domain->getSchema() );
                $this->assertSame( '', $domain->getTablePrefix() );
        }
+
+       public static function provideIsCompatible() {
+               return [
+                       'Basic' =>
+                               [ 'foo', 'foo', null, '', true ],
+                       'db+prefix' =>
+                               [ 'foo-bar', 'foo', null, 'bar', true ],
+                       'db+schema+prefix' =>
+                               [ 'foo-bar-baz', 'foo', 'bar', 'baz', true ],
+                       'db+dontcare_schema+prefix' =>
+                               [ 'foo-bar-baz', 'foo', null, 'baz', false ],
+                       '?h -> -' =>
+                               [ 'foo?hbar-baz-baa', 'foo-bar', 'baz', 'baa', true ],
+                       '?? -> ?' =>
+                               [ 'foo??bar-baz-baa', 'foo?bar', 'baz', 'baa', true ],
+                       'Nothing' =>
+                               [ '', null, null, '', true ],
+                       'dontcaredb+dontcaredbschema+prefix' =>
+                               [ 'mywiki-mediawiki-prefix', null, null, 'prefix', false ],
+                       'dontcaredb+schema+prefix' =>
+                               [ 'mywiki-schema-prefix', null, 'schema', 'prefix', false ],
+                       'db+dontcareschema+prefix' =>
+                               [ 'mywiki-schema-prefix', 'mywiki', null, 'prefix', false ],
+                       'postgres-db-jobqueue' =>
+                               [ 'postgres-mediawiki-', 'postgres', null, '', false ]
+               ];
+       }
+
+       /**
+        * @dataProvider provideIsCompatible
+        * @covers Wikimedia\Rdbms\DatabaseDomain::isCompatible
+        */
+       public function testIsCompatible( $id, $db, $schema, $prefix, $transitive ) {
+               $compareIdObj = DatabaseDomain::newFromId( $id );
+               $this->assertInstanceOf( DatabaseDomain::class, $compareIdObj );
+
+               $fromId = new DatabaseDomain( $db, $schema, $prefix );
+
+               $this->assertTrue( $fromId->isCompatible( $id ), 'constructed equals string' );
+               $this->assertTrue( $fromId->isCompatible( $compareIdObj ), 'fromId equals string' );
+
+               $this->assertEquals( $transitive, $compareIdObj->isCompatible( $fromId ),
+                       'test transitivity of nulls components' );
+       }
+
+       public static function provideIsCompatible2() {
+               return [
+                       'db+schema+prefix' =>
+                               [ 'mywiki-schema-prefix', 'thatwiki', 'schema', 'prefix' ],
+                       'dontcaredb+dontcaredbschema+prefix' =>
+                               [ 'thatwiki-mediawiki-otherprefix', null, null, 'prefix' ],
+                       'dontcaredb+schema+prefix' =>
+                               [ 'mywiki-otherschema-prefix', null, 'schema', 'prefix' ],
+                       'db+dontcareschema+prefix' =>
+                               [ 'notmywiki-schema-prefix', 'mywiki', null, 'prefix' ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideIsCompatible2
+        * @covers Wikimedia\Rdbms\DatabaseDomain::isCompatible
+        */
+       public function testIsCompatible2( $id, $db, $schema, $prefix ) {
+               $compareIdObj = DatabaseDomain::newFromId( $id );
+               $this->assertInstanceOf( DatabaseDomain::class, $compareIdObj );
+
+               $fromId = new DatabaseDomain( $db, $schema, $prefix );
+
+               $this->assertFalse( $fromId->isCompatible( $id ), 'constructed equals string' );
+               $this->assertFalse( $fromId->isCompatible( $compareIdObj ), 'fromId equals string' );
+       }
+
+       /**
+        * @covers Wikimedia\Rdbms\DatabaseDomain::isUnspecified
+        */
+       public function testIsUnspecified() {
+               $domain = new DatabaseDomain( null, null, '' );
+               $this->assertTrue( $domain->isUnspecified() );
+               $domain = new DatabaseDomain( 'mywiki', null, '' );
+               $this->assertFalse( $domain->isUnspecified() );
+               $domain = new DatabaseDomain( 'mywiki', null, '' );
+               $this->assertFalse( $domain->isUnspecified() );
+       }
 }
index 4488d9e..4a9603c 100644 (file)
@@ -2139,4 +2139,21 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->assertLastSql( 'BEGIN; SELECT 1; ROLLBACK' );
                $this->assertEquals( 0, $this->database->trxLevel() );
        }
+
+       /**
+        * @covers Wikimedia\Rdbms\Database::selectFieldValues()
+        */
+       public function testSelectFieldValues() {
+               $this->database->forceNextResult( [
+                       (object)[ 'value' => 'row1' ],
+                       (object)[ 'value' => 'row2' ],
+                       (object)[ 'value' => 'row3' ],
+               ] );
+
+               $this->assertSame(
+                       [ 'row1', 'row2', 'row3' ],
+                       $this->database->selectFieldValues( 'table', 'table.field', 'conds', __METHOD__ )
+               );
+               $this->assertLastSql( 'SELECT table.field AS value FROM table WHERE conds' );
+       }
 }
index 762812c..bd1c112 100644 (file)
@@ -681,4 +681,5 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $this->assertSame( $oldPrefix, $this->db->tablePrefix() );
                $this->assertSame( $oldDomain, $this->db->getDomainId() );
        }
+
 }
index ae19278..48c3d17 100644 (file)
@@ -941,6 +941,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                \Wikimedia\quietCall( 'session_start' );
                $backend->unpersist();
                $this->assertSame( self::SESSIONID . 'x', session_id() );
+               session_write_close();
 
                session_id( self::SESSIONID );
                $wrap->persist = true;
index e042f76..b33cd24 100644 (file)
@@ -82,6 +82,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $context->setRequest( $request );
                $id = $request->getSession()->getId();
 
+               session_write_close();
                session_id( '' );
                $session = SessionManager::getGlobalSession();
                $this->assertSame( $id, $session->getId() );
index cee15e8..1e1f739 100644 (file)
@@ -1015,6 +1015,7 @@ class UserTest extends MediaWikiTestCase {
        }
 
        public function testActorId() {
+               $domain = MediaWikiServices::getInstance()->getDBLoadBalancer()->getLocalDomainID();
                $this->hideDeprecated( 'User::selectFields' );
 
                // Newly-created user has an actor ID
@@ -1042,7 +1043,7 @@ class UserTest extends MediaWikiTestCase {
                        'Actor ID can be retrieved for user loaded with User::selectFields()' );
 
                $this->db->delete( 'actor', [ 'actor_user' => $id ], __METHOD__ );
-               User::purge( wfWikiId(), $id );
+               User::purge( $domain, $id );
                // Because WANObjectCache->delete() stupidly doesn't delete from the process cache.
                ObjectCache::getMainWANInstance()->clearProcessCache();
 
index 8c6f788..405a60f 100644 (file)
 
                expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
                mw.messages.set( 'integration-test', '<b>[[Bold]]!</b>' );
+               mw.messages.set( 'param-test', 'Hello $1' );
+               mw.messages.set( 'param-test-with-link', 'Hello $1 [[$2|$3]]' );
 
                assert.strictEqual(
                        mw.message( 'integration-test' ).parse(),
                        'jQuery plugin $.fn.msg() works correctly'
                );
 
+               assert.strictEqual(
+                       mw.message( 'param-test', $( '<span>' ).text( 'World' ) ).parse(),
+                       'Hello <span>World</span>',
+                       'Passing a jQuery object as a parameter to a message without wikitext works correctly'
+               );
+
+               assert.strictEqual(
+                       mw.message( 'param-test', $( '<span>' ).text( 'World' ).get( 0 ) ).parse(),
+                       'Hello <span>World</span>',
+                       'Passing a DOM node as a parameter to a message without wikitext works correctly'
+               );
+
+               assert.strictEqual(
+                       mw.message(
+                               'param-test-with-link',
+                               $( '<span>' ).text( 'cruel' ),
+                               'Globe',
+                               'world'
+                       ).parse(),
+                       'Hello <span>cruel</span> <a title="Globe" href="/wiki/Globe">world</a>',
+                       'Message with a jQuery parameter and a parsed link'
+               );
+
                mw.messages.set( 'integration-test-extlink', '[$1 Link]' );
                msg = mw.message(
                        'integration-test-extlink',
index a7c9aa6..038b757 100644 (file)
@@ -20,8 +20,26 @@ If using MediaWiki-Vagrant:
 
     npm run selenium
 
-By default, Chrome will run in headless mode. If you want to see Chrome, set DISPLAY
-environment variable to any value:
+There are three supported modes of running the tests:
+
+- Headless. It's the default. You will not see the browser while tests are
+  running because it's running in a headless mode. This mode should run fine
+  on all supported platforms.
+- Headless recording. Set DISPLAY environment variable to a value that starts
+  with colon (`:`) and video of each test will be recorded. Browser will run
+  headless. Recording videos works only on Linux.
+- Visible. If you want to see the browser, set DISPLAY environment variable to
+  any value that does not start with colon. This mode will not work in a
+  headless environment like MediaWiki-Vagrant.
+
+Example recording session:
+
+    sudo apt-get install chromedriver ffmpeg xvfb
+    export DISPLAY=:94
+    Xvfb "$DISPLAY" -screen 0 1280x1024x24 &
+    npm run selenium
+
+Example visible session:
 
     DISPLAY=1 npm run selenium
 
index 8b47dff..916ee74 100644 (file)
@@ -1,8 +1,20 @@
 const fs = require( 'fs' ),
        path = require( 'path' ),
-       saveScreenshot = require( 'wdio-mediawiki' ).saveScreenshot,
-       logPath = process.env.LOG_DIR || __dirname + '/log';
+       logPath = process.env.LOG_DIR || path.join( __dirname, '/log' );
 
+let ffmpeg;
+
+// get current test title and clean it, to use it as file name
+function fileName( title ) {
+       return encodeURIComponent( title.replace( /\s+/g, '-' ) );
+}
+
+// build file path
+function filePath( test, screenshotPath, extension ) {
+       return path.join( screenshotPath, `${fileName( test.parent )}-${fileName( test.title )}.${extension}` );
+}
+
+// relative path
 function relPath( foo ) {
        return path.resolve( __dirname, '../..', foo );
 }
@@ -135,16 +147,57 @@ exports.config = {
        // =====
        // See also: http://webdriver.io/guide/testrunner/configurationfile.html
 
+       /**
+       * Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       * @param {Object} test test details
+       */
+       beforeTest: function ( test ) {
+               if ( process.env.DISPLAY && process.env.DISPLAY.startsWith( ':' ) ) {
+                       let videoPath = filePath( test, this.screenshotPath, 'mp4' );
+                       const { spawn } = require( 'child_process' );
+                       ffmpeg = spawn( 'ffmpeg', [
+                               '-f', 'x11grab', //  grab the X11 display
+                               '-video_size', '1280x1024', // video size
+                               '-i', process.env.DISPLAY, // input file url
+                               '-loglevel', 'error', // log only errors
+                               '-y', // overwrite output files without asking
+                               '-pix_fmt', 'yuv420p', // QuickTime Player support, "Use -pix_fmt yuv420p for compatibility with outdated media players"
+                               videoPath // output file
+                       ] );
+
+                       ffmpeg.stdout.on( 'data', ( data ) => {
+                               console.log( `ffmpeg stdout: ${data}` );
+                       } );
+
+                       ffmpeg.stderr.on( 'data', ( data ) => {
+                               console.log( `ffmpeg stderr: ${data}` );
+                       } );
+
+                       ffmpeg.on( 'close', ( code ) => {
+                               console.log( '\n\tVideo location:', videoPath, '\n' );
+                               console.log( `ffmpeg exited with code ${code}` );
+                       } );
+               }
+       },
+
        /**
         * Save a screenshot when test fails.
         *
         * @param {Object} test Mocha Test object
         */
        afterTest: function ( test ) {
-               var filePath;
-               if ( !test.passed ) {
-                       filePath = saveScreenshot( test.title );
-                       console.log( '\n\tScreenshot: ' + filePath + '\n' );
+               if ( ffmpeg ) {
+                       // stop video recording
+                       ffmpeg.kill( 'SIGINT' );
+               }
+
+               // if test passed, ignore, else take and save screenshot
+               if ( test.passed ) {
+                       return;
                }
+               // save screenshot
+               let screenshotPath = filePath( test, this.screenshotPath, 'png' );
+               browser.saveScreenshot( screenshotPath );
+               console.log( '\n\tScreenshot location:', screenshotPath, '\n' );
        }
 };