{{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.
* Adrian Lang
* Ævar Arnfjörð Bjarmason
* Aftab
+* Agabi10
* Agbad
* Ahmad Sherif
* Ajayrahul P
* Alejandro Mery
* Aleksey Bekh-Ivanov
* AlephNull
+* Alex Ezell
* Alex Ivanov
* Alex Shih-Han Lin
* Alex Z.
* Bagariavivek
* Bahodir Mansurov
* balloonguy
+* Bartek Łukawski
* Bartosz Dziewoński
* Base
* Beau
* David Sn
* Dayllan Maza
* dcausse
+* dcot
* dennisroczek
* Denny Vrandecic
* Dereckson
* Jakub Vrana
* James D. Forrester
* James Earl Douglas
+* James Montalvo
* Jan Berkel
* Jan Drewniak
* Jan Gerber
* Moritz Oberhauser
* Mormegil
* Mr. E23
+* MR70
* MrBlueSky
* MrPete
* Mukunda Modell
* Pavel Selitskas
* Pcoombe
* Perside Rosalie
-* petarpetkovic
+* Petar Petković
* Peter Coombe
* Peter Gehres
* Peter Hedenskog
* ptarjan
* pubudu538
* Purodha Blissenbach
+* Pwirth
* quiddity
* quietust
* Quim Gil
* Suriyaa Kudo
* svip
* Szymon Świerkosz
+* T. Bayer
* T.D. Corell
* tacsipacsi
* Tarquin
* Thomas Dalton
* Thomas Gries
* ThomasV
+* Tim Eulitz
* Tim Hollmann
* Tim Landscheidt
* Tim Laqua
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...
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).
----
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.
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,
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
* (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.
* 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.
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.
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.
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
* 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
* 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
--- /dev/null
+== 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 ===
+* …
+
+=== 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.
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 ===
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.
=== 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 ====
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 ===
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 ==
== 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;
== 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";
$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
* 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.
'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',
* 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
*/
$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.
*
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
$opts['timeout'] = $timeout;
}
- $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
return $lbFactory->waitForReplication( $opts );
}
$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
* 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;
$this->addParserOutput( $parserOutput, [
'enableSectionEditLinks' => false,
- 'wrapperDivClass' => '',
+ 'wrapperDivClass' => $wrapperClass ?? '',
] );
}
*/
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',
$services->getMagicWordFactory(),
$services->getContentLanguage(),
wfUrlProtocols(),
- $services->getSpecialPageFactory()
+ $services->getSpecialPageFactory(),
+ $services->getMainConfig()
);
},
$dbw = wfGetDB( DB_MASTER );
$dbw->onTransactionPreCommitOrIdle(
- function () {
- ResourceLoaderWikiModule::invalidateModuleCache( $this, null, null, wfWikiID() );
+ function () use ( $dbw ) {
+ ResourceLoaderWikiModule::invalidateModuleCache(
+ $this, null, null, $dbw->getDomainId() );
},
__METHOD__
);
return $status;
}
+ /**
+ * Call wfTransactionalTimeLimit() if this request was POSTed
+ * @since 1.26
+ */
+ protected function useTransactionalTimeLimit() {
+ if ( $this->getRequest()->wasPosted() ) {
+ wfTransactionalTimeLimit();
+ }
+ }
+
/**@}*/
/************************************************************************//**
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.
*
$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
$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 {
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 [];
$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, '', '', '' );
*/
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 );
}
$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;
* 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).
}
} 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();
} else {
$path = null;
}
- if ( $e instanceof ApiUsageException || $e instanceof UsageException ) {
+ if ( $e instanceof ApiUsageException ) {
$link = wfExpandUrl( wfScript( 'api' ) );
$result->addContentValue(
$path,
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
* @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' );
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;
$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.
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
+ ) );
+ }
}
}
// 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,
$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 = [
* 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;
// 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 );
}
/**
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
*/
+++ /dev/null
-<?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()}";
- }
-}
"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\" ليس عنوانا صالحا.",
"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-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-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+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.",
"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.",
"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.",
"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.",
"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\" אינה כותרת תקינה.",
"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.",
"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 해시가 잘못되었습니다.",
"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.",
"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.",
"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.",
"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» не является некорректным заголовком.",
"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>.",
"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”不是一个有效的标题。",
"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>__NOTOC__</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 匯入:完整匯入歷史,而不只是最新版本。",
*/
protected $cache;
+ /**
+ * Map of (lowercase message key => index) for all software defined messages
+ *
+ * @var array
+ */
+ protected $overridable;
+
/**
* @var bool[] Map of (language code => boolean)
*/
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;
$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 ] );
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" );
}
break;
};
}
- $conds['ct_tag_id'] = $filterTagIds;
+
+ if ( $filterTagIds !== [] ) {
+ $conds['ct_tag_id'] = $filterTagIds;
+ }
} else {
$conds['ct_tag'] = $filter_tag;
}
* @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;
}
/**
return $this->newNotOkStatus();
}
- $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() );
+ $user = $importableRevision->getUserObj()
+ ?: User::newFromName( $importableRevision->getUser(), false );
# Do the actual upload
if ( $archiveName ) {
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',
[
"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 איך להיאבק נגד ספאם באתר הוויקי שלך]"
}
"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 Дознајте како да се борите против спам на вашето вики]"
}
}
// 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;
$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() );
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();
$database = null;
}
+ if ( $schema === '' ) {
+ $schema = null;
+ }
+
return new self( $database, $schema, $prefix );
}
/**
* @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 &&
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
*/
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;
}
use EmptyBagOStuff;
use WANObjectCache;
use ArrayUtils;
+use UnexpectedValueException;
use InvalidArgumentException;
use RuntimeException;
use Exception;
}
}
+ // 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;
}
}
}
- // 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 );
}
$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() ) {
/** @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;
$this->factory = $factory ?? $services->getParserFactory();
$this->specialPageFactory = $spFactory ?? $services->getSpecialPageFactory();
+ $this->siteConfig = $siteConfig ?? MediaWikiServices::getInstance()->getMainConfig();
}
/**
* @return string
*/
protected function makeLimitReport() {
- global $wgShowHostnames;
-
$maxIncludeSize = $this->mOptions->getMaxIncludeSize();
$cpuTime = $this->mOutput->getTimeSinceStart( 'cpu' );
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";
$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',
* @private
*/
public function replaceInternalLinks2( &$s ) {
- global $wgExtraInterlanguageLinkPrefixes;
-
static $tc = false, $e1, $e1_img;
# the % is needed to support urlencoded titles as well
if ( !$tc ) {
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
* @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
$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;
* @return string
*/
public function interwikiTransclude( $title, $action ) {
- global $wgEnableScaryTranscluding, $wgTranscludeCacheExpiry;
-
- if ( !$wgEnableScaryTranscluding ) {
+ if ( !$this->siteConfig->get( 'EnableScaryTranscluding' ) ) {
return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
}
( $wikiId !== false ) ? $wikiId : 'external',
sha1( $url )
),
- $wgTranscludeCacheExpiry,
+ $this->siteConfig->get( 'TranscludeCacheExpiry' ),
function ( $oldValue, &$ttl ) use ( $url, $fname, $cache ) {
$req = MWHttpRequest::factory( $url, [], $fname );
* @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;
$headlines = $numMatches !== false ? $matches[3] : [];
+ $maxTocLevel = $this->siteConfig->get( 'MaxTocLevel' );
foreach ( $headlines as $headline ) {
$isTemplate = false;
$titleText = false;
# Increase TOC level
$toclevel++;
$sublevelCount[$toclevel] = 0;
- if ( $toclevel < $wgMaxTocLevel ) {
+ if ( $toclevel < $maxTocLevel ) {
$prevtoclevel = $toclevel;
$toc .= Linker::tocIndent();
$numVisible++;
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;
}
} else {
# No change in level, end TOC line
- if ( $toclevel < $wgMaxTocLevel ) {
+ if ( $toclevel < $maxTocLevel ) {
$toc .= Linker::tocLineEnd();
}
}
) . ' ' . $headline;
}
- if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) {
+ if ( $enoughToc && ( !isset( $maxTocLevel ) || $toclevel < $maxTocLevel ) ) {
$toc .= Linker::tocLine( $linkAnchor, $tocline,
$numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) );
}
}
if ( $enoughToc ) {
- if ( $prevtoclevel > 0 && $prevtoclevel < $wgMaxTocLevel ) {
+ if ( $prevtoclevel > 0 && $prevtoclevel < $maxTocLevel ) {
$toc .= Linker::tocUnindent( $prevtoclevel - 1 );
}
$toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
* @return string
*/
public function getUserSig( &$user, $nickname = false, $fancySig = null ) {
- global $wgMaxSigChars;
-
$username = $user->getName();
# If not given, retrieve from the user object.
$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 ) {
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 {
# Strip out wikitext links(they break the anchor)
$text = $this->stripSectionName( $text );
$sectionName = self::getSectionNameFromStrippedText( $text );
- return self::makeLegacyAnchor( $sectionName );
+ return $this->makeLegacyAnchor( $sectionName );
}
/**
*/
class ParserFactory {
/** @var array */
- private $conf;
+ private $parserConf;
/** @var MagicWordFactory */
private $magicWordFactory;
/** @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;
}
/**
* @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 );
}
}
$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;
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
* @param string $section The designation of the section being pointed to,
* to be included in the link, like "§ion=$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 )
$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 );
* @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 );
}
* @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 );
}
/**
*/
protected $relativeInput;
- /**
- * @var bool
- */
- protected $noDatePicker;
-
/**
* @var bool
*/
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
$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 );
}
* {@inheritdoc}
*/
public function getConfig( &$config ) {
- $config['noDatePicker'] = $this->noDatePicker;
$config['required'] = $this->required;
$config['relativeInput'] = [];
$this->relativeInput->getConfig( $config['relativeInput'] );
"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",
"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.",
"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 файлове",
"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|بەکارھێنەرانی پەسەندکراوی خۆگەڕ}}",
"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",
"Fitoschido",
"Alireza Ivaz",
"Iriman",
- "Matěj Suchánek"
+ "Matěj Suchánek",
+ "Amirsara"
]
},
"tog-underline": "خط کشیدن زیر پیوندها:",
"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": "؛ ",
"comma-separator": "، ",
"percent": "$1٪",
"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",
"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",
"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\" ခဝ့် လိက်မေံလ်ုဖး",
"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": "ၮ်ုအင်းလယ်ထး မ်ုယောဝ်ႋၮင်ႋ။ အုဲးသာဆိုင် လ်ုအှ်ကှ်ေဍာ်ၜး သုံဖှ်ေလာ။",
"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",
"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": "တမ်ရိုဟ်",
"@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": " 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"
}
"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",
"right-nominornewtalk": "Невыписованя новых повідомлїнь по малых управах діскузной сторінкы",
"right-apihighlimits": "Хоснованя высшых лімітів в API запытах",
"right-writeapi": "Хосновати API про писаня",
- "right-delete": "Ð\97мазаня сторінок",
+ "right-delete": "Ð\9cазаня сторінок",
"right-bigdelete": "Мазаня сторінок з довгов історіёв",
"right-deletelogentry": "Мазаня тай обновлїня окремых записів лоґів\n,",
"right-deleterevision": "Мазаня і обновованя конкретных ревізій сторінок",
"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|واپرائيندڙ|واپرائيندڙن}} کي نظر ۾ رکندي]",
"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.",
"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.",
"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Використайте нижче форму для входу як інший користувач.",
"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.",
"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": "مطالعہ صفحات",
"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 בלעטער}}",
"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": "左右倒轉",
];
$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,
];
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:
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;
$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]
+ );
+ }
}
}
}
--- /dev/null
+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.
+++ /dev/null
-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.
/*!
- * 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.
* }
*/
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;
}
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;
}
-// 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';`.
// 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,
);
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'"
+ );
}
}
}
* @dataProvider provideAddWikiText
* @covers OutputPage::addWikiText
* @covers OutputPage::addWikiTextAsInterface
+ * @covers OutputPage::wrapWikiTextAsInterface
* @covers OutputPage::addWikiTextAsContent
* @covers OutputPage::addWikiTextWithTitle
* @covers OutputPage::addWikiTextTitle
'<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
$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(
);
}
+ /**
+ * @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
$formatter = new ApiErrorFormatter_BackCompat( $result );
$this->assertSame( 'en', $formatter->getLanguage()->getCode() );
+ $this->assertSame( 'bc', $formatter->getFormat() );
$this->assertSame( [], $formatter->arrayFromStatus( Status::newGood() ) );
* @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 );
* @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 );
}
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>' ),
'data' => [ 'foo' => 'bar', 'baz' => 42 ],
]
],
- 'UsageException' => [
- $usageException,
- [],
- [
- 'text' => '<b>Something broke!</b>',
- 'code' => 'ue-code',
- 'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
- ]
- ],
- 'UsageException, wrapped' => [
- $usageException,
- [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
- [
- 'text' => '(<b>Something broke!</b>)',
- 'code' => 'some-code',
- 'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
- ]
- ],
'LocalizedException' => [
new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
[],
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';
'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 <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> " .
- "for notice of API deprecations and breaking changes.",
- 'servedby' => wfHostname(),
- ]
- ],
[
$apiEx1,
[ 'existing-error', 'sv-error1', 'sv-error2' ],
--- /dev/null
+<?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'] );
+ }
+
+}
[ 'ć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" );
+ }
}
$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() );
+ }
}
\Wikimedia\quietCall( 'session_start' );
$backend->unpersist();
$this->assertSame( self::SESSIONID . 'x', session_id() );
+ session_write_close();
session_id( self::SESSIONID );
$wrap->persist = true;
$context->setRequest( $request );
$id = $request->getSession()->getId();
+ session_write_close();
session_id( '' );
$session = SessionManager::getGlobalSession();
$this->assertSame( $id, $session->getId() );
}
public function testActorId() {
+ $domain = MediaWikiServices::getInstance()->getDBLoadBalancer()->getLocalDomainID();
$this->hideDeprecated( 'User::selectFields' );
// Newly-created user has an actor ID
'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();
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
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 );
}
// =====
// 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' );
}
};