Merge "Make MWLBFactory sanity check that postgres is not used with a table prefix"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 26 Mar 2019 20:18:42 +0000 (20:18 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 26 Mar 2019 20:18:42 +0000 (20:18 +0000)
39 files changed:
HISTORY
includes/OutputPage.php
includes/api/ApiQueryRevisionsBase.php
includes/api/i18n/he.json
includes/api/i18n/ja.json
includes/context/RequestContext.php
includes/db/DatabaseOracle.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/OOUIHTMLForm.php
includes/installer/i18n/pms.json
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/exception/DBQueryError.php
includes/logging/LogEntry.php
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/diq.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gcr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/io.json
languages/i18n/mk.json
languages/i18n/ms.json
languages/i18n/nan.json
maintenance/convertLinks.php
maintenance/storage/checkStorage.php
tests/phpunit/includes/db/LBFactoryTest.php

diff --git a/HISTORY b/HISTORY
index e8a3692..d00da92 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -2,6 +2,25 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.33.
 
 = MediaWiki 1.32 =
 
+== MediaWiki 1.32.1 ==
+
+=== Changes since MediaWiki 1.32.0 ===
+* (T213577) rdbms: avoid transaction status errors from ping() in rollback().
+* rdbms: Pass required parameter.
+* rdbms: do not treat SAVEPOINT and RELEASE SAVEPOINT as write queries.
+* (T204531) rdbms: reduce LoadBalancer replication log spam.
+* (T213489) Avoid session double-start in Setup.php.
+* (T213717) Correct namespace 'Template' for gom-deva
+* (T198054) Fix login page crash caused by unknown language via ?uselang
+* (T215324) (T210937) list=users mistakenly reports user as missing.
+* (T209483) Add ILBFactory::redefineLocalDomain method. This is intended for
+use with scripts like addWiki.php to avoid mismatched domain errors.
+* (T208871) The hard-coded Google search form on the database error page was
+removed.
+* (T204800) Fix Title::getFragmentForURL for bad interwiki prefix
+* (T215566) Fix installer being unable to determine if the database exists
+during a fresh installation.
+
 == MediaWiki 1.32.0 ==
 
 === Changes since MediaWiki 1.32.0-rc.2 ===
@@ -11406,6 +11425,43 @@ regularly. Below only new and removed languages are listed.
 
 == MediaWiki 1.13 ==
 
+== MediaWiki 1.13.5 ==
+
+February 22, 2009
+
+This is a maintenance update to the Summer 2008 snapshot release of MediaWiki.
+
+MediaWiki is now using a "continuous integration" development model with
+quarterly snapshot releases. The latest development code is always kept
+"ready to run", and in fact runs our own sites on Wikipedia.
+
+Release branches will continue to receive security updates for about a year
+from first release, but nonessential bugfixes and feature developments
+will be made on the development trunk and appear in the next quarterly release.
+
+Those wishing to use the latest code instead of a branch release can obtain
+it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+
+== Changes since 1.13.4 ==
+
+* (bug 17449) Fixed PostgreSQL installation
+* (bug 17527) Fixed missing MySQL-specific options in installer
+
+== Changes since 1.13.3 ==
+
+A number of cross-site scripting (XSS) security vulnerabilities were discovered
+in the web-based installer (config/index.php). These vulnerabilities all
+require a live installer -- once the installer has been used to install a wiki,
+it is deactivated.
+
+Note that cross-site scripting vulnerabilities can be used to attack any website
+in the same cookie domain. So if you have an uninstalled copy of MediaWiki on
+the same site as an active web service, MediaWiki could be used to attack the
+active service.
+
+If you are hosting an old copy of MediaWiki that you have never installed, you
+are advised to remove it from the web.
+
 == Changes since 1.13.2 ==
 
 David Remahl of Apple's Product Security team has identified a number of
@@ -13424,6 +13480,121 @@ Full API documentation is available at https://www.mediawiki.org/wiki/API
 
 == MediaWiki 1.10 ==
 
+== MediaWiki 1.10.4 ==
+
+March 2, 2008
+
+* Correction for API path fix, broken in 1.10.3
+
+== MediaWiki 1.10.3 ==
+
+January 23, 2008
+
+This is a security update to the Winter 2007 quarterly release. A potential
+XSS injection vector affecting api.php only for Microsoft Internet Explorer
+users has been closed.
+
+
+To work around the vulnerability without upgrading, you may disable the API if
+you don't need it:
+
+:[[Manual:$wgEnableAPI|$wgEnableAPI]] = false;
+
+Not vulnerable versions:
+* 1.12 or later
+* 1.11 >= 1.11.1
+* 1.10 >= 1.10.3
+* 1.9 >= 1.9.5
+* 1.8 any version (if $wgEnableAPI has been left off)
+
+Vulnerable versions:
+* 1.11 <= 1.11.0rc1
+* 1.10 <= 1.10.2
+* 1.9 <= 1.9.4
+* 1.8 any version (if $wgEnableAPI has been switched on)
+
+MediaWiki 1.7 and below are not affected as they do not include the API
+functionality, however the BotQuery extension is similarly vulnerable unless
+updated to the latest SVN version.
+
+== MediaWiki 1.10.2 ==
+September 10, 2007
+
+This is a security fix update to the Spring 2007 quarterly release snapshot. A
+possible HTML/XSS injection vector in the API pretty-printing mode has been
+found and fixed.
+
+The vulnerability may be worked around in an unfixed version by simply
+disabling the API interface if it is not in use, by adding this to
+LocalSettings.php:
+:[[Manual:$wgEnableAPI|$wgEnableAPI]] = false;
+
+Not vulnerable versions:
+* 1.11 >= 1.11.0
+* 1.10 >= 1.10.2
+* 1.9 >= 1.9.4
+* 1.8 >= 1.8.5
+
+Vulnerable versions:
+* 1.11 <= 1.11.0rc1
+* 1.10 <= 1.10.1
+* 1.9 <= 1.9.3
+* 1.8 <= 1.8.4 (if $wgEnableAPI has been switched on)
+
+MediaWiki 1.7 and below are not affected as they do not include the faulty
+function, however the BotQuery extension is similarly vulnerable unless updated
+to the latest SVN version.
+
+== MediaWiki 1.10.1 ==
+July 13, 2007
+
+This is a bugfix update to the Spring 2007 quarterly release snapshot. A number
+of fixes to improve compatibility with PostgreSQL, some versions of MySQL, and
+some PHP configurations are included.
+
+Changes since 1.10.0:
+
+* (bug [[bugzilla:9417|9417]]) Uploading new versions of images when using
+Postgres no longer  throws warnings.
+* (bug [[bugzilla:9908|9908]]) Using tsearch2 with Postgres 8.1 no longer gives
+an error.
+* (bug [[bugzilla:9973|9973]]) Changed size was shown in advanced recentchanges
+collapsible items with $wgRCShowChangedSized = false.
+* Fixed installation on MyISAM or old InnoDB with charset=utf8, was giving
+overlong key errors.
+* Fixed zero-padding issues with MySQL 5 binary schema
+* (bug [[bugzilla:9820|9820]]) session.save_path check no longer halts
+installation, but warns of possible bad values
+* (bug [[bugzilla:9978|9978]]) Fixed session.save_path validation when using
+extended configuration format, e.g. "5;/tmp"
+
+== MediaWiki 1.10.0 ==
+May 9, 2007
+
+This is the quarterly release snapshot for Spring 2007. See below for a full
+list of changes since the 1.9.x series.
+
+Changes since 1.10.0rc2:
+
+* (bug [[bugzilla:9808|9808]]) Fix regression that ignored user 'rclimit'
+option for Special:Contributions
+
+== MediaWiki 1.10.0rc2 ==
+May 4, 2007
+
+THIS IS A RELEASE CANDIDATE MADE AVAILABLE FOR TESTING!
+A FINAL 1.10.0 RELEASE WILL APPEAR WITHIN A FEW DAYS.
+
+Changes since 1.10.0rc1:
+* Various l10n fixes and updates
+* Fix for upgrade of page_restrictions table
+* (bug [[bugzilla:9780|9780]]) Fix normalization of titles with initial colon
+followed by whitespace
+* Fix for regression in upload: wrong size info saved into image table
+* Avoid cyclic stub problems when authorization hooks do funny things with the
+user and the database at load time
+
+== MediaWiki 1.10.0rc1 ==
 This is the Spring 2007 branch release of MediaWiki.
 
 MediaWiki is now using a "continuous integration" development model with
@@ -13913,10 +14084,159 @@ break. Don't forget to always back up your database before upgrading!
 See the file UPGRADE for more detailed upgrade instructions.
 
 = MediaWiki release notes =
-
 Security reminder: MediaWiki does not require PHP's register_globals
 setting since version 1.2.0. If you have it on, turn it *off* if you can.
 
+= MediaWiki 1.9 =
+
+== MediaWiki 1.9.6 ==
+
+March 2, 2008
+
+* Correction for API path fix, broken in 1.9.5
+
+== MediaWiki 1.9.5 ==
+
+January 23, 2008
+
+This is a security update to the Winter 2007 quarterly release. A potential XSS
+injection vector affecting api.php only for Microsoft Internet Explorer users
+has been closed.
+
+
+To work around the vulnerability without upgrading, you may disable the API if
+you don't need it:
+
+:[[Manual:$wgEnableAPI|$wgEnableAPI]] = false;
+
+Not vulnerable versions:
+* 1.12 or later
+* 1.11 >= 1.11.1
+* 1.10 >= 1.10.3
+* 1.9 >= 1.9.5
+* 1.8 any version (if $wgEnableAPI has been left off)
+
+Vulnerable versions:
+* 1.11 <= 1.11.0rc1
+* 1.10 <= 1.10.2
+* 1.9 <= 1.9.4
+* 1.8 any version (if $wgEnableAPI has been switched on)
+
+MediaWiki 1.7 and below are not affected as they do not include the API
+functionality, however the BotQuery extension is similarly vulnerable unless
+updated to the latest SVN version.
+
+== MediaWiki 1.9.4 ==
+
+September 10, 2007
+
+This is a security and bug fix update to the Winter 2007 quarterly release.
+Minor compatibility fixes for IIS 5 are included.
+
+* (bug [[bugzilla:8847|8847]]) Strip spurious #fragments from request URI to
+fix redirect loops on some server configurations
+* A possible HTML/XSS injection vector in the API pretty-printing mode has been
+found and fixed.
+
+The vulnerability may be worked around in an unfixed version by simply
+disabling the API interface if it is not in use, by adding this to
+LocalSettings.php:
+
+:[[Manual:$wgEnableAPI|$wgEnableAPI]] = false;
+
+Not vulnerable versions:
+* 1.11 >= 1.11.0
+* 1.10 >= 1.10.2
+* 1.9 >= 1.9.4
+* 1.8 >= 1.8.5
+
+Vulnerable versions:
+* 1.11 <= 1.11.0rc1
+* 1.10 <= 1.10.1
+* 1.9 <= 1.9.3
+* 1.8 <= 1.8.4 (if $wgEnableAPI has been switched on)
+
+MediaWiki 1.7 and below are not affected as they do not include the faulty
+function, however the BotQuery extension is similarly vulnerable unless updated
+to the latest SVN version.
+
+== MediaWiki 1.9.3 ==
+
+February 20, 2007
+
+This is a security and bug-fix update to the Winter 2007 quarterly release.
+Minor compatibility fixes for IIS and PostgreSQL are included.
+
+An XSS injection vulnerability based on Microsoft Internet Explorer's UTF-7
+charset autodetection was located in the AJAX support module, affecting MSIE
+users on MediaWiki 1.6.x and up when the optional setting $wgUseAjax is enabled.
+
+If you are using an extension based on the optional Ajax module, either disable
+it or upgrade to a version containing the fix:
+
+* 1.9: fixed in 1.9.3
+* 1.8: fixed in 1.8.4
+* 1.7: fixed in 1.7.3
+* 1.6: fixed in 1.6.10
+
+There is no known danger in the default configuration, with ''$wgUseAjax'' off.
+
+* ([[mediazilla:8992|8992]]) Fix a remaining raw use of REQUEST_URI in history
+* ([[mediazilla:8984|8984]]) Fix a database error in
+Special:Recentchangeslinked when using the PostgreSQL database.
+* Add ''charset'' to Content-Type headers on various HTTP error responses to
+forestall additional UTF-7-autodetect XSS issues. PHP sends only ''text/html''
+by default when the script didn't specify more details, which some
+inconsiderate browsers consider a license to autodetect the deadly,
+hard-to-escape UTF-7. This fixes an issue with the Ajax interface error message
+on MSIE when ''$wgUseAjax'' is enabled (not default configuration); this UTF-7
+variant on a previously fixed attack vector was discovered by Moshe BA from
+BugSec: [http://www.bugsec.com/articles.php?Security=24
+http://www.bugsec.com/articles.php?Security=24]
+* Trackback responses now specify XML content type
+
+== MediaWiki 1.9.2 ==
+
+February 4, 2007
+
+This is a bug-fix update that fixes some installation and other minor issues
+with the 1.9.1 release as well as a security issue which was introduced in the
+1.9 branch.
+
+JavaScript code which regenerated the "sortable tables" feature did not
+properly sanitize input, leading to an HTML injection vulnerability.
+
+* ([[mediazilla:8774|8774]]) Fix path for GNU FDL rights icon on new installs
+* ([[mediazilla:8819|8819]]) Fix full path disclosure with skins dependencies
+* ([[mediazilla:8819|8819]]) Fixed data-loss bug in compressOld batch text
+compression affecting pages which had null edits (move, protect, etc) as second
+edit in a batch group. Isolated and patched by Travis Derouin.
+* Security fix for sortable tables JavaScript
+
+== MediaWiki 1.9.1 ==
+
+January 24, 2007
+
+This is a bug-fix update that fixes some installation and upgrade issues with
+the original 1.9.0 release.
+
+* ([[mediazilla:3000|3000]]) Fall back to SCRIPT_NAME plus QUERY_STRING when
+REQUEST_URI is not available, as on IIS with PHP-CGI
+* Security fix for DjVu images. (Only affects servers where .djvu file  uploads
+are enabled and ''$wgDjvuToXML'' is set.)
+* ([[mediazilla:8638|8638]]) Fix update from 1.4 and earlier
+* ([[mediazilla:8641|8641]]) Fix order of updates to ipblocks table for updates
+from <=1.7
+* ([[mediazilla:8673|8673]]) Minor fix for web service API content-type header
+* Fix API revision list on PHP 5.2.1; bad reference assignment
+* Fixed up the AjaxSearch
+* Exclude settings files when generating documentation. That could expose the
+database user and password to remote users.
+* ar: fix the 'create a new page' on search page when no exact match found
+* Correct tooltip accesskey hint for Opera on the Macintosh (uses Shift-Esc-,
+not Ctrl-).
+* ([[mediazilla:8719|8719]]) Firefox release notes lie! Fix tooltips for
+Firefox 2 on x11; accesskeys default settings appear to be same as Windows.
 
 == Changes since 1.8 ==
 
index cb90ccf..8a19c51 100644 (file)
@@ -2984,7 +2984,7 @@ class OutputPage extends ContextSource {
         */
        public function showFileRenameError( $old, $new ) {
                wfDeprecated( __METHOD__, '1.32' );
-               $this->showFatalError( $this->msg( 'filerenameerror', $old, $new )->escpaed() );
+               $this->showFatalError( $this->msg( 'filerenameerror', $old, $new )->escaped() );
        }
 
        /**
index 51f4d41..565e615 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\Revision\RevisionAccessException;
 use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\SlotRecord;
@@ -292,69 +293,27 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                }
 
-               if ( $this->fld_roles ) {
-                       $vals['roles'] = $revision->getSlotRoles();
-               }
-
-               if ( $this->needSlots ) {
-                       $revDel = $this->checkRevDel( $revision, RevisionRecord::DELETED_TEXT );
-                       if ( ( $this->fld_slotsha1 || $this->fetchContent ) && ( $revDel & self::IS_DELETED ) ) {
-                               $anyHidden = true;
+               try {
+                       if ( $this->fld_roles ) {
+                               $vals['roles'] = $revision->getSlotRoles();
                        }
-                       if ( $this->slotRoles === null ) {
-                               try {
-                                       $slot = $revision->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
-                               } catch ( RevisionAccessException $e ) {
-                                       // Back compat: If there's no slot, there's no content, so set 'textmissing'
-                                       // @todo: Gergő says to mention T198099 as a "todo" here.
-                                       $vals['textmissing'] = true;
-                                       $slot = null;
-                               }
 
-                               if ( $slot ) {
-                                       $content = null;
-                                       $vals += $this->extractSlotInfo( $slot, $revDel, $content );
-                                       if ( !empty( $vals['nosuchsection'] ) ) {
-                                               $this->dieWithError(
-                                                       [
-                                                               'apierror-nosuchsection-what',
-                                                               wfEscapeWikiText( $this->section ),
-                                                               $this->msg( 'revid', $revision->getId() )
-                                                       ],
-                                                       'nosuchsection'
-                                               );
-                                       }
-                                       if ( $content ) {
-                                               $vals += $this->extractDeprecatedContent( $content, $revision );
-                                       }
-                               }
-                       } else {
-                               $roles = array_intersect( $this->slotRoles, $revision->getSlotRoles() );
-                               $vals['slots'] = [
-                                       ApiResult::META_KVP_MERGE => true,
-                               ];
-                               foreach ( $roles as $role ) {
-                                       try {
-                                               $slot = $revision->getSlot( $role, RevisionRecord::RAW );
-                                       } catch ( RevisionAccessException $e ) {
-                                               // Don't error out here so the client can still process other slots/revisions.
-                                               // @todo: Gergő says to mention T198099 as a "todo" here.
-                                               $vals['slots'][$role]['missing'] = true;
-                                               continue;
-                                       }
-                                       $content = null;
-                                       $vals['slots'][$role] = $this->extractSlotInfo( $slot, $revDel, $content );
-                                       // @todo Move this into extractSlotInfo() (and remove its $content parameter)
-                                       // when extractDeprecatedContent() is no more.
-                                       if ( $content ) {
-                                               $vals['slots'][$role]['contentmodel'] = $content->getModel();
-                                               $vals['slots'][$role]['contentformat'] = $content->getDefaultFormat();
-                                               ApiResult::setContentValue( $vals['slots'][$role], 'content', $content->serialize() );
-                                       }
+                       if ( $this->needSlots ) {
+                               $revDel = $this->checkRevDel( $revision, RevisionRecord::DELETED_TEXT );
+                               if ( ( $this->fld_slotsha1 || $this->fetchContent ) && ( $revDel & self::IS_DELETED ) ) {
+                                       $anyHidden = true;
                                }
-                               ApiResult::setArrayType( $vals['slots'], 'kvp', 'role' );
-                               ApiResult::setIndexedTagName( $vals['slots'], 'slot' );
+                               $vals = array_merge( $vals, $this->extractAllSlotInfo( $revision, $revDel ) );
                        }
+               } catch ( RevisionAccessException $ex ) {
+                       // This is here so T212428 doesn't spam the log.
+                       // TODO: find out why T212428 happens in the first place!
+                       $vals['slotsmissing'] = true;
+
+                       LoggerFactory::getInstance( 'api-warning' )->error(
+                               'Failed to access revision slots',
+                               [ 'revision' => $revision->getId(), 'exception' => $ex, ]
+                       );
                }
 
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
@@ -396,6 +355,79 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                return $vals;
        }
 
+       /**
+        * Extracts information about all relevant slots.
+        *
+        * @param RevisionRecord $revision
+        * @param int $revDel
+        *
+        * @return array
+        * @throws ApiUsageException
+        */
+       private function extractAllSlotInfo( RevisionRecord $revision, $revDel ): array {
+               $vals = [];
+
+               if ( $this->slotRoles === null ) {
+                       try {
+                               $slot = $revision->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
+                       } catch ( RevisionAccessException $e ) {
+                               // Back compat: If there's no slot, there's no content, so set 'textmissing'
+                               // @todo: Gergő says to mention T198099 as a "todo" here.
+                               $vals['textmissing'] = true;
+                               $slot = null;
+                       }
+
+                       if ( $slot ) {
+                               $content = null;
+                               $vals += $this->extractSlotInfo( $slot, $revDel, $content );
+                               if ( !empty( $vals['nosuchsection'] ) ) {
+                                       $this->dieWithError(
+                                               [
+                                                       'apierror-nosuchsection-what',
+                                                       wfEscapeWikiText( $this->section ),
+                                                       $this->msg( 'revid', $revision->getId() )
+                                               ],
+                                               'nosuchsection'
+                                       );
+                               }
+                               if ( $content ) {
+                                       $vals += $this->extractDeprecatedContent( $content, $revision );
+                               }
+                       }
+               } else {
+                       $roles = array_intersect( $this->slotRoles, $revision->getSlotRoles() );
+                       $vals['slots'] = [
+                               ApiResult::META_KVP_MERGE => true,
+                       ];
+                       foreach ( $roles as $role ) {
+                               try {
+                                       $slot = $revision->getSlot( $role, RevisionRecord::RAW );
+                               } catch ( RevisionAccessException $e ) {
+                                       // Don't error out here so the client can still process other slots/revisions.
+                                       // @todo: Gergő says to mention T198099 as a "todo" here.
+                                       $vals['slots'][$role]['missing'] = true;
+                                       continue;
+                               }
+                               $content = null;
+                               $vals['slots'][$role] = $this->extractSlotInfo( $slot, $revDel, $content );
+                               // @todo Move this into extractSlotInfo() (and remove its $content parameter)
+                               // when extractDeprecatedContent() is no more.
+                               if ( $content ) {
+                                       $vals['slots'][$role]['contentmodel'] = $content->getModel();
+                                       $vals['slots'][$role]['contentformat'] = $content->getDefaultFormat();
+                                       ApiResult::setContentValue(
+                                               $vals['slots'][$role],
+                                               'content',
+                                               $content->serialize()
+                                       );
+                               }
+                       }
+                       ApiResult::setArrayType( $vals['slots'], 'kvp', 'role' );
+                       ApiResult::setIndexedTagName( $vals['slots'], 'slot' );
+               }
+               return $vals;
+       }
+
        /**
         * Extract information from the SlotRecord
         *
index 04efe36..3b13904 100644 (file)
        "apihelp-parse-paramvalue-prop-revid": "הוספת מזהה הגרסה של הדף המפוענח.",
        "apihelp-parse-paramvalue-prop-displaytitle": "הוספת הכותרת של קוד הוויקי המפוענח.",
        "apihelp-parse-paramvalue-prop-headitems": "נותן פריטים לשים ב־<code>&lt;head&gt;</code> של הדף.",
-       "apihelp-parse-paramvalue-prop-headhtml": "נותן את ה־<code>&lt;head&gt;</code> המפוענח של הדף.",
+       "apihelp-parse-paramvalue-prop-headhtml": "נותן doctype מפוענח, תג <code>&lt;html&gt;</code> פותח, רכיב <code>&lt;head&gt;</code>, ותג <code>&lt;body&gt;</code> פותח של הדף.",
        "apihelp-parse-paramvalue-prop-modules": "מתן יחידות ResourceLoader שמשמשות בדף. כדי לטעון, יש להשתמש ב<code dir=\"ltr\">mw.loader.using()</code>. יש לבקש את <kbd>jsconfigvars</kbd> או את <kbd>encodedjsconfigvars</kbd> יחד עם <kbd>modules</kbd>.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה. כדי להחיל, יש להשתמש ב<code dir=\"ltr\">mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "נותן משתני הגדרות של JavaScript שייחודיים לדף הזה בתור מחרוזת JSON.",
index 6629309..9e28c39 100644 (file)
        "apierror-mustbeloggedin": "$1にログインしている必要があります。",
        "apierror-noimageredirect": "画像のリダイレクトを作成する権限がありません。",
        "apierror-nosuchpageid": "ID $1のページはありません。",
+       "apierror-pagelang-disabled": "このウィキではページの言語は変更できません。",
        "apierror-permissiondenied": "$1に必要な権限がありません。",
        "apierror-permissiondenied-generic": "アクセスが拒否されました。",
        "apierror-readonly": "ウィキは現在読み取り専用モードです。",
index 2cbe67c..a4225a1 100644 (file)
@@ -345,12 +345,8 @@ class RequestContext implements IContextSource, MutableContext {
                                        $obj = Language::factory( $code );
                                        $this->lang = $obj;
                                }
-
-                               unset( $this->recursion );
-                       }
-                       catch ( Exception $ex ) {
+                       } finally {
                                unset( $this->recursion );
-                               throw $ex;
                        }
                }
 
index bc3873d..3d80bbd 100644 (file)
@@ -53,11 +53,6 @@ class DatabaseOracle extends Database {
        private $mFieldInfoCache = [];
 
        function __construct( array $p ) {
-               global $wgDBprefix;
-
-               if ( $p['tablePrefix'] == 'get from global' ) {
-                       $p['tablePrefix'] = $wgDBprefix;
-               }
                $p['tablePrefix'] = strtoupper( $p['tablePrefix'] );
                parent::__construct( $p );
                Hooks::run( 'DatabaseOraclePostInit', [ $this ] );
@@ -961,7 +956,7 @@ class DatabaseOracle extends Database {
                // Defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
                while ( !feof( $fp ) ) {
                        if ( $lineCallback ) {
-                               call_user_func( $lineCallback );
+                               $lineCallback();
                        }
                        $line = trim( fgets( $fp, 1024 ) );
                        $sl = strlen( $line ) - 1;
@@ -1007,7 +1002,7 @@ class DatabaseOracle extends Database {
 
                                        $cmd = $this->replaceVars( $cmd );
                                        if ( $inputCallback ) {
-                                               call_user_func( $inputCallback, $cmd );
+                                               $inputCallback( $cmd );
                                        }
                                        $res = $this->doQuery( $cmd );
                                        if ( $resultCallback ) {
index 82cbb40..ee0da7b 100644 (file)
@@ -605,7 +605,7 @@ class HTMLForm extends ContextSource {
                $valid = true;
                $hoistedErrors = Status::newGood();
                if ( $this->mValidationErrorMessage ) {
-                       foreach ( (array)$this->mValidationErrorMessage as $error ) {
+                       foreach ( $this->mValidationErrorMessage as $error ) {
                                $hoistedErrors->fatal( ...$error );
                        }
                } else {
@@ -700,8 +700,8 @@ class HTMLForm extends ContextSource {
        /**
         * Set a message to display on a validation error.
         *
-        * @param string|array $msg String or Array of valid inputs to wfMessage()
-        *     (so each entry can be either a String or Array)
+        * @param array $msg Array of valid inputs to wfMessage()
+        *     (so each entry must itself be an array of arguments)
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
index 818474d..16dc465 100644 (file)
@@ -586,7 +586,7 @@ abstract class HTMLFormField {
                        // It might look weird, but it'll work OK.
                        return $this->getFieldLayoutOOUI(
                                new OOUI\Widget( [ 'content' => new OOUI\HtmlSnippet( $this->getDiv( $value ) ) ] ),
-                               [ 'infusable' => false, 'align' => 'top' ]
+                               [ 'align' => 'top' ]
                        );
                }
 
index 49cbdee..e7e3ff6 100644 (file)
@@ -151,13 +151,11 @@ class OOUIHTMLForm extends HTMLForm {
                        'expanded' => false,
                        'padded' => true,
                        'framed' => true,
-                       'infusable' => false,
                ] );
 
                $layout->appendContent(
                        new OOUI\FieldsetLayout( [
                                'label' => $legend,
-                               'infusable' => false,
                                'items' => [
                                        new OOUI\Widget( [
                                                'content' => new OOUI\HtmlSnippet( $section )
index f928e20..9d41768 100644 (file)
@@ -77,7 +77,7 @@
        "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
        "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.",
        "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bigat archivià con PHP]).\nAnstalassion abortìa.",
-       "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_length a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .",
+       "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la <code>longheur</code> dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté <code>suhosin.get.max_value_length</code> a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an <code>LocalSettings.php</code>.",
        "config-db-type": "Sòrt ëd base ëd dàit:",
        "config-db-host": "Ospitant ëd la base ëd dàit:",
        "config-db-host-help": "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anserissa ambelessì ël nòm dl'ospitant o l'adrëssa IP.\n\nS'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.\n\nSe a anstala su un servent Windows e a deuvra MySQL, dovré «localhost» a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva «127.0.0.1» com adrëssa IP local.\n\nS'a deuvra PostgresSQL, ch'a lassa sto camp bianch për coleghesse a travers un socket UNIX.",
index ad5cf98..57412c2 100644 (file)
@@ -1328,8 +1328,9 @@ class DatabaseMssql extends Database {
 
        /**
         * @param string $name
-        * @param string $format
-        * @return string
+        * @param string $format One of "quoted" (default), "raw", or "split".
+        * @return string|array When the requested $format is "split", a list of database, schema, and
+        *  table name is returned. Database and schema can be `false`.
         */
        function tableName( $name, $format = 'quoted' ) {
                # Replace reserved words with better ones
@@ -1344,18 +1345,17 @@ class DatabaseMssql extends Database {
        /**
         * call this instead of tableName() in the updater when renaming tables
         * @param string $name
-        * @param string $format One of quoted, raw, or split
-        * @return string
+        * @param string $format One of "quoted" (default), "raw", or "split".
+        * @return string|array When the requested $format is "split", a list of database, schema, and
+        *  table name is returned. Database and schema can be `false`.
+        * @private
         */
        function realTableName( $name, $format = 'quoted' ) {
                $table = parent::tableName( $name, $format );
                if ( $format == 'split' ) {
                        // Used internally, we want the schema split off from the table name and returned
                        // as a list with 3 elements (database, schema, table)
-                       $table = explode( '.', $table );
-                       while ( count( $table ) < 3 ) {
-                               array_unshift( $table, false );
-                       }
+                       return array_pad( explode( '.', $table, 3 ), -3, false );
                }
                return $table;
        }
index 25d78da..77bb677 100644 (file)
@@ -225,6 +225,39 @@ abstract class DatabaseMysqlBase extends Database {
                }
        }
 
+       protected function doSelectDomain( DatabaseDomain $domain ) {
+               if ( $domain->getSchema() !== null ) {
+                       throw new DBExpectedError( $this, __CLASS__ . ": domain schemas are not supported." );
+               }
+
+               $database = $domain->getDatabase();
+               // A null database means "don't care" so leave it as is and update the table prefix
+               if ( $database === null ) {
+                       $this->currentDomain = new DatabaseDomain(
+                               $this->currentDomain->getDatabase(),
+                               null,
+                               $domain->getTablePrefix()
+                       );
+
+                       return true;
+               }
+
+               if ( $database !== $this->getDBname() ) {
+                       $sql = 'USE ' . $this->addIdentifierQuotes( $database );
+                       $ret = $this->doQuery( $sql );
+                       if ( $ret === false ) {
+                               $error = $this->lastError();
+                               $errno = $this->lastErrno();
+                               $this->reportQueryError( $error, $errno, $sql, __METHOD__ );
+                       }
+               }
+
+               // Update that domain fields on success (no exception thrown)
+               $this->currentDomain = $domain;
+
+               return true;
+       }
+
        /**
         * Open a connection to a MySQL server
         *
index 15eeccf..1a5cdab 100644 (file)
@@ -178,25 +178,6 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $conn->affected_rows;
        }
 
-       function doSelectDomain( DatabaseDomain $domain ) {
-               if ( $domain->getSchema() !== null ) {
-                       throw new DBExpectedError( $this, __CLASS__ . ": domain schemas are not supported." );
-               }
-
-               $database = $domain->getDatabase();
-               if ( $database !== $this->getDBname() ) {
-                       $conn = $this->getBindingHandle();
-                       if ( !$conn->select_db( $database ) ) {
-                               throw new DBExpectedError( $this, "Could not select database '$database'." );
-                       }
-               }
-
-               // Update that domain fields on success (no exception thrown)
-               $this->currentDomain = $domain;
-
-               return true;
-       }
-
        /**
         * @param mysqli_result $res
         * @return bool
index 481dd9a..4ae4104 100644 (file)
@@ -116,7 +116,7 @@ class DatabasePostgres extends Database {
                        $connectVars['port'] = (int)$this->port;
                }
                if ( $this->flags & self::DBO_SSL ) {
-                       $connectVars['sslmode'] = 1;
+                       $connectVars['sslmode'] = 'require';
                }
 
                $this->connectString = $this->makeConnectionString( $connectVars );
index 1355e22..a9befc2 100644 (file)
@@ -69,7 +69,6 @@ class ResultWrapper implements IResultWrapper {
 
        public function free() {
                if ( $this->db ) {
-                       $this->db->freeResult( $this );
                        $this->db = null;
                }
                $this->result = null;
index b1353b7..9b664fc 100644 (file)
@@ -45,7 +45,7 @@ class DBQueryError extends DBExpectedError {
        public function __construct( IDatabase $db, $error, $errno, $sql, $fname, $message = null ) {
                if ( $message === null ) {
                        if ( $db instanceof Database && $db->wasConnectionError( $errno ) ) {
-                               $message = "A connection error occurred. \n" .
+                               $message = "A connection error occurred during a query. \n" .
                                         "Query: $sql\n" .
                                         "Function: $fname\n" .
                                         "Error: $errno $error\n";
index 33dd69b..5cad31f 100644 (file)
@@ -793,8 +793,24 @@ class ManualLogEntry extends LogEntryBase implements Taggable {
         * @param string $to One of: rcandudp (default), rc, udp
         */
        public function publish( $newId, $to = 'rcandudp' ) {
+               $canAddTags = true;
+               // FIXME: this code should be removed once all callers properly call publish()
+               if ( $to === 'udp' && !$newId && !$this->getAssociatedRevId() ) {
+                       \MediaWiki\Logger\LoggerFactory::getInstance( 'logging' )->warning(
+                               'newId and/or revId must be set when calling ManualLogEntry::publish()',
+                               [
+                                       'newId' => $newId,
+                                       'to' => $to,
+                                       'revId' => $this->getAssociatedRevId(),
+                                       // pass a new exception to register the stack trace
+                                       'exception' => new RuntimeException()
+                               ]
+                       );
+                       $canAddTags = false;
+               }
+
                DeferredUpdates::addCallableUpdate(
-                       function () use ( $newId, $to ) {
+                       function () use ( $newId, $to, $canAddTags ) {
                                $log = new LogPage( $this->getType() );
                                if ( !$log->isRestricted() ) {
                                        Hooks::runWithoutAbort( 'ManualLogEntryBeforePublish', [ $this ] );
@@ -806,9 +822,14 @@ class ManualLogEntry extends LogEntryBase implements Taggable {
                                                $rc->save( $rc::SEND_NONE );
                                        } else {
                                                $tags = $this->getTags();
-                                               if ( $tags ) {
-                                                       $revId = $this->getAssociatedRevId(); // Use null if $revId is 0
-                                                       ChangeTags::addTags( $tags, null, $revId > 0 ? $revId : null, $newId );
+                                               if ( $tags && $canAddTags ) {
+                                                       $revId = $this->getAssociatedRevId();
+                                                       ChangeTags::addTags(
+                                                               $tags,
+                                                               null,
+                                                               $revId > 0 ? $revId : null,
+                                                               $newId > 0 ? $newId : null
+                                                       );
                                                }
                                        }
 
index b917b9d..cb005a9 100644 (file)
@@ -33,7 +33,8 @@
                        "Neriman2003",
                        "Fitoschido",
                        "Toghrul Rahimli",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Hüseynzadə"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "userlogin-signwithsecure": "Etibarlı bağlantıdan istifadə edin",
        "cannotlogin-title": "Daxil olmaq mümkün olmadı",
        "cannotlogin-text": "Daxil olmaq mümkün deyil.",
-       "cannotloginnow-title": "Daxil olmaq indi mümkün deyil",
+       "cannotloginnow-title": "İndi daxil olmaq mümkün deyil",
        "cannotloginnow-text": "$1 istifadə edərkən daxil olmaq mümkün deyil.",
        "cannotcreateaccount-title": "Hesablar yaradıla bilmədi",
        "cannotcreateaccount-text": "Bu vikidə birbaşa hesab yaratma aktiv deyil.",
index ec4d676..6a17cc9 100644 (file)
        "pager-newer-n": "$1 {{PLURAL:$1|навейшая|навейшыя|навейшых}}",
        "pager-older-n": "$1 {{PLURAL:$1|старэйшая|старэйшыя|старэйшых}}",
        "suppress": "Падавіць вэрсію",
-       "querypage-disabled": "Гэта спэцыяльная старонка адключаная для падвышэньня прадукцыйнасьці",
+       "querypage-disabled": "Гэтая спэцыяльная старонка адключаная для падвышэньня прадукцыйнасьці.",
        "apihelp": "Даведка API",
        "apihelp-no-such-module": "Модуль «$1» ня знойдзены.",
        "apisandbox": "Пясочніца API",
        "deleting-backlinks-warning": "<strong>Увага:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншыя старонкі]] ўключаюць або спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
        "deleting-subpages-warning": "<strong>Папярэджаньне:</strong> старонка, якую вы зьбіраецеся выдаліць, мае [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 падстаронку|$1 падстаронкі|$1 падстаронак|51=болей за 50 падстаронак}}]].",
        "rollback": "Адкаціць рэдагаваньні",
+       "rollback-confirmation-confirm": "Калі ласка, пацьвердзіце:",
+       "rollback-confirmation-yes": "Адкаціць",
        "rollbacklink": "адкат",
        "rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
index 12ce570..5df588d 100644 (file)
        "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
        "pagelang-nonexistent-page": "Страницата $1 не съществува.",
+       "pagelang-unchanged-language": "Страницата $1 вече е със зададен език $2.",
+       "pagelang-unchanged-language-default": "Страницата $1 вече е със зададен език, съвпадащ с езика по подразбиране за това уики.",
+       "pagelang-db-failed": "Базата данни не успя да смени езика на страницата.",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "log-name-pagelang": "Дневник на езиковите промени",
        "mediastatistics-header-multimedia": "Мултимедия",
        "mediastatistics-header-office": "Офис",
        "mediastatistics-header-total": "Всички файлове",
+       "json-error-state-mismatch": "Невалиден или грешно структуриран JSON",
+       "json-error-ctrl-char": "Грешка в контролния знак. Вероятно е неправилно кодиран",
        "json-error-syntax": "Синтактична грешка",
        "headline-anchor-title": "Препратка към този раздел",
        "special-characters-group-latin": "Латиница",
        "log-action-filter-protect-move_prot": "Преместване на защитата",
        "log-action-filter-rights-rights": "Ръчна промяна",
        "log-action-filter-rights-autopromote": "Автоматична промяна",
+       "log-action-filter-suppress-event": "Потискане на дневника",
+       "log-action-filter-suppress-revision": "Потискане на версията",
+       "log-action-filter-suppress-delete": "Потискане на страницата",
+       "log-action-filter-suppress-block": "Потискане на потребителя чрез блокиране",
+       "log-action-filter-suppress-reblock": "Потискане на потребителя чрез повторно блокиране",
        "log-action-filter-upload-upload": "Ново качване",
        "log-action-filter-upload-overwrite": "Повторно качване",
        "log-action-filter-upload-revert": "Връщане",
index f2c6016..7ba93cc 100644 (file)
        "deleting-backlinks-warning": "<strong>সতর্কীকরণ:</strong> আপনি যেটি মুছে ফেলতে যাচ্ছেন তা [[Special:WhatLinksHere/{{FULLPAGENAME}}|অন্যান্য পাতাসমূহে]] সংযুক্ত অথবা অন্তর্ভুক্ত রয়েছে।",
        "deleting-subpages-warning": "<strong>সতর্কীকরণ:</strong> আপনি যে পাতাটি মুছে ফেলতে যাচ্ছেন তাঁর [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|একটি উপপাতা|$1টি উপপাতা|51=৫০টির বেশী}}]] রয়েছে।",
        "rollback": "সম্পাদনা ফিরিয়ে নিন",
+       "rollback-confirmation-confirm": "দয়া করে নিশ্চিত করুন:",
+       "rollback-confirmation-yes": "পুনর্বহাল করুন",
+       "rollback-confirmation-no": "বাতিল করুন",
        "rollbacklink": "পুনর্বহাল",
        "rollbacklinkcount": "$1টি {{PLURAL:$1|সম্পাদনা}} রোলব্যাক করুন",
        "rollbacklinkcount-morethan": "$1টির বেশি {{PLURAL:$1|সম্পাদনা}} রোলব্যাক করুন",
index c17a6bb..366a783 100644 (file)
        "delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
        "deleteprotected": "Şıma nêşenê ena perer esternê,  çıkı per starya ya.",
        "rollback": "vurnayişan tepiya bıger",
+       "rollback-confirmation-no": "Bıtexelne",
        "rollbacklink": "ageyrayış",
        "rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
index 6f32bc0..a8515a9 100644 (file)
@@ -78,6 +78,7 @@
        "tog-norollbackdiff": "Ära näita erinevusi pärast tühistamist",
        "tog-useeditwarning": "Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata",
        "tog-prefershttps": "Kasuta sisselogimisel alati turvalist ühendust",
+       "tog-showrollbackconfirmation": "Küsi tühistamislingile klõpsamise järel kinnitust",
        "underline-always": "Alati",
        "underline-never": "Mitte kunagi",
        "underline-default": "Kujunduse või brauseri vaikeväärtus",
        "badretype": "Sisestatud paroolid ei lange kokku.",
        "usernameinprogress": "Selle kasutajanimega konto loomine on juba pooleli.\nPalun oota.",
        "userexists": "Sisestatud kasutajanimi on juba kasutusel.\nPalun valige uus nimi.",
+       "createacct-normalization": "Tehniliste piirangute tõttu kohandatakse sinu kasutajanimi kujule \"$2\".",
        "loginerror": "Viga sisselogimisel",
        "createacct-error": "Tõrge konto loomisel",
        "createaccounterror": "Kasutajakonto loomine ebaõnnestus: $1",
        "deleting-backlinks-warning": "<strong>Hoiatus:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
        "deleting-subpages-warning": "<strong>Hoiatus:</strong> Oled kustutamas lehekülge, millel on [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|alamlehekülg|$1 alamlehekülge|51=üle 50 alamlehekülje}}]].",
        "rollback": "Tühista muudatused",
+       "rollback-confirmation-confirm": "Palun kinnita:",
+       "rollback-confirmation-yes": "Tühista",
+       "rollback-confirmation-no": "Loobu",
        "rollbacklink": "tühista",
        "rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
        "rollbacklinkcount-morethan": "tühista üle {{PLURAL:$1|ühe muudatuse|10 muudatuse}}",
        "ipb-confirm": "Kinnita blokeering",
        "ipb-sitewide": "Saidiülene",
        "ipb-partial": "Osaline",
+       "ipb-sitewide-help": "Viki kõigi lehekülgede muutmine ja kogu ülejäänud kaastöö.",
+       "ipb-partial-help": "Teatud lehekülgede või nimeruumide muutmine.",
        "ipb-pages-label": "Leheküljed",
        "ipb-namespaces-label": "Nimeruumid",
        "badipaddress": "Vigane IP-aadress",
        "confirm-unwatch-top": "Kas eemaldad selle lehekülje oma jälgimisloendist?",
        "confirm-rollback-button": "Sobib",
        "confirm-rollback-top": "Kas tühistad sellel leheküljel tehtud muudatused?",
+       "confirm-rollback-bottom": "See toiming tühistab koheselt valitud muudatused sellel leheküljel.",
        "confirm-mcrrestore-title": "Redaktsiooni taastamine",
        "confirm-mcrundo-title": "Muudatuse eemaldamine",
        "mcrundofailed": "Eemaldamine ebaõnnestus",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|viidi}} automaatselt üle teise rühma; enne oli $4, nüüd on $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|laadis üles}} faili $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laadis üles}} uue versiooni failist $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|laadis üles}} faili $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|taastas}} faili $3 vanema versiooni",
        "log-name-managetags": "Märgiste haldamise logi",
        "log-description-managetags": "Sellel leheküljel on toodud [[Special:Tags|märgiste]] haldamisega seotud tegevused. Logis on ainult toimingud, mida administraatorid on teinud käsitsi. Siin puuduvad logisissekanded viki tarkvaras koostatud või sealt kustutatud märgiste kohta.",
        "logentry-managetags-create": "$1 {{GENDER:$2|koostas}} märgise \"$4\"",
        "log-action-filter-suppress-reblock": "Kasutaja varjamine taasblokeerimise teel",
        "log-action-filter-upload-upload": "Uus üleslaadimine",
        "log-action-filter-upload-overwrite": "Uuesti üleslaadimine",
+       "log-action-filter-upload-revert": "Taastamine",
        "authmanager-authn-not-in-progress": "Autentimine pole teoksil või seansiandmed läksid kaduma. Palun alusta uuesti.",
        "authmanager-authn-no-primary": "Ette antud autentimisandmeid ei õnnestunud autentida.",
        "authmanager-authn-no-local-user": "Ette antud autentimisandmed pole selles vikis seotud ühegi kasutajaga.",
        "passwordpolicies-policy-maximalpasswordlength": "Parool peab olema $1 {{PLURAL:$1|märgist}} lühem.",
        "passwordpolicies-policy-passwordcannotbepopular": "Parool ei tohi olla {{PLURAL:$1|populaarne parool|$1 populaarse parooli loendis}}.",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Parool ei saa olla 100&nbsp;000 kõige levinuma parooli loendis.",
+       "passwordpolicies-policyflag-forcechange": "peab muutma sisselogimisel",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "soovita muutmist sisselogimisel",
        "easydeflate-invaliddeflate": "Ette antud sisu ei ole õigesti vähendatud",
        "unprotected-js": "Turvalisuse huvides ei saa JavaScripti laadida kaitsmata lehekülgedelt. Palun koosta JavaScripti ainult nimeruumis MediaWiki või kasutajate nimeruumi alamleheküljel."
 }
index 76decac..f7fd250 100644 (file)
@@ -72,7 +72,8 @@
                        "Physicsch",
                        "Nbi",
                        "Amjad Khan",
-                       "Ahmad252"
+                       "Ahmad252",
+                       "FarsiNevis"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "subject-preview": "پیش‌نمایش موضوع:",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطایی رخ داد.",
        "blockedtitle": "کاربر بسته شده‌است",
-       "blockedtext-partial": "<strong>حساب کاربری یا آدرس آی‌پی شما از انجام تغییرات در این صفحه منع شده‌است. شما همچنان می‌توانید در دیگر صفحه‌های این ویکی ویرایش کنید.</strong> برای مشاهده جزئیات کامل قطع دسترسی به [[ویژه:مشارکت‌های من|مشارکت‌های حساب]] مراجعه کنید.\n\nاین قطع دسترسی توسط $1 انجام گرفته‌است.\n\nدلیل قطع دسترسی <em>$2</em> است.\n\n* زمان آغاز قطع دسترسی: $8\n* زمان پایان قطع دسترسی: $6\n* موارد مورد نظر: $7\n* شناسه قطع دسترسی: #$5",
+       "blocked-email-user": "<strong>دسترسی حساب کاربری شما از ارسال ایمیل قطع شده است. شما همچنان می‌توانید سایر صفحات این ویکی را ویرایش کنید.</strong>می‌توانید جزئیات کامل قطع دسترسی را در [[Special:MyContributions|مشارکت‌های حساب]] ببینید.\n\nقطع دسترسی توسط $1 انجام شده است.\n\nدلیل داده‌شده <em>$2</em> بوده است.\n\n* شروع قطع دسترسی: $8\n* اتمام قطع دسترسی: $6\n* هدف قطع دسترسی: $7\n* شناسه قطع دسترسی #$5",
+       "blockedtext-partial": "<strong>حساب کاربری یا آدرس آی‌پی شما از انجام تغییرات در این صفحه منع شده‌است. شما همچنان می‌توانید در دیگر صفحه‌های این ویکی ویرایش کنید.</strong> برای مشاهده جزئیات کامل قطع دسترسی به [[Special:MyContributions|مشارکت‌های حساب]] مراجعه کنید.\n\nاین قطع دسترسی توسط $1 انجام گرفته‌است.\n\nدلیل قطع دسترسی <em>$2</em> است.\n\n* زمان آغاز قطع دسترسی: $8\n* زمان پایان قطع دسترسی: $6\n* موارد مورد نظر: $7\n* شناسه قطع دسترسی: #$5",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "systemblockedtext": "نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسی‌شده مورد نظر: $7\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
        "edit-gone-missing": "امکان به‌روز کردن صفحه وجود ندارد.\nبه نظرمی‌رسد که صفحه حذف شده باشد.",
        "edit-conflict": "تعارض ویرایشی.",
        "edit-no-change": "ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.",
+       "edit-slots-cannot-add": "این {{PLURAL:$1|اسلات|اسلات‌ها}} پشتیبانی نمی‌شود: $2.",
+       "edit-slots-cannot-remove": "امکان حذف این {{PLURAL:$1|اسلات|اسلات‌ها}} وجود ندارد: $2.",
+       "edit-slots-missing": "این {{PLURAL:$1|اسلات|اسلات‌ها}} ناموجود است: $2.",
        "postedit-confirmation-created": "صفحه ایجاد شده است.",
        "postedit-confirmation-restored": "صفحه بازیابی شده است.",
        "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
        "defaultmessagetext": "متن پیش‌فرض پیغام",
        "content-failed-to-parse": "عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3",
        "invalid-content-data": "داده محتوای نامعتبر",
-       "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[:$2]] مجاز نیست",
+       "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[:$2]] بخش «$3» مجاز نیست",
        "editwarning-warning": "خروج از این صفحه ممکن است باعث شود که شما هر شانسی که به وجود آورده‌اید را از دست بدهید.\nاگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.",
        "editpage-invalidcontentmodel-title": "مدل محتوای پشتیبانی نشده",
        "editpage-invalidcontentmodel-text": "مدل محتوای «$1» پشتیبای نمی‌شود.",
        "move": "انتقال",
        "movethispage": "انتقال این صفحه",
        "unusedimagestext": "پرونده‌های زیر موجودند اما در هیچ صفحه‌ای به کار نرفته‌اند.\nلطفاً توجه داشته باشید که دیگر وبگاه‌ها ممکن است با یک نشانی اینترنتی مستقیم به یک پرونده پیوند دهند، و با وجود این که در استفادهٔ فعال هستند در این جا فهرست شوند.",
+       "unusedimagestext-categorizedimgisused": "فایل موردنظر موجود است اما در هیچ صفحه‌ای استفاده نشده است. تصاویر رده‌بندی‌شده حتی اگر در هیچ صفحه‌ای درج نشده باشند، به عنوان تصاویر مورداستفاده محسوب می‌شوند.\nلطفا توجه داشته باشید که دیگر وب‌سایت‌ها ممکن است به صورت مستقیم به یک فایل پیوند داده باشند و با وجود اینکه آن فایل فعال محسوب می‌شود در اینجا لیست شده باشد.",
        "unusedcategoriestext": "این رده‌ها وجود دارند ولی هیچ مقاله یا ردهٔ دیگری از آنها استفاده نمی‌کند.",
        "notargettitle": "مقصدی نیست",
        "notargettext": "شما صفحهٔ یا کاربر مقصدی برای انجام این عمل روی آن مشخص نکرده‌اید.",
        "deleting-backlinks-warning": "<strong>هشدار:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحه‌های دیگری]] هستند که به صفحه‌ای که شما در حال حذف آن هستید پیوند دارند یا آن را تراگنجانیده‌اند.",
        "deleting-subpages-warning": "<strong>هشدار:</strong> صفحه‌ای که شما می‌خواهید حذف کنید [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|یک زیرصفحه|$1 زیرصفحه|51=بیش از پنجاه زیرصفحه}}]] دارد.",
        "rollback": "واگردانی ویرایش‌ها",
-       "rollback-confirmation-confirm": "لطفا تایید کنید:",
+       "rollback-confirmation-confirm": "لطفاً تأیید کنید:",
        "rollback-confirmation-yes": "واگردانی",
        "rollback-confirmation-no": "انصراف",
        "rollbacklink": "واگردانی",
        "movepage-moved": "'''«$1» به «$2» منتقل شد'''",
        "movepage-moved-redirect": "یک تغییرمسیر ایجاد شد.",
        "movepage-moved-noredirect": "از ایجاد تغییرمسیر ممانعت شد.",
+       "movepage-delete-first": "صفحه مقصد تعداد زیادی نسخه برای حذف دارد. لطفا ابتدا صفحه را دستی حذف کنید و سپس دوباره سعی کنید.",
        "articleexists": "صفحه‌ای با این نام از قبل وجود دارد، یا نامی که انتخاب کرده‌اید معتبر نیست.\nلطفاً نام دیگری انتخاب کنید.",
        "cantmove-titleprotected": "شما نمی‌توانید صفحه را به این نشانی انتقال دهید، چرا که عنوان جدید در برابر ایجاد محافظت شده‌است",
        "movetalk": "صفحهٔ بحث هم منتقل شود",
        "mcrundofailed": "واگردانی ناموفق بود",
        "mcrundo-missingparam": "فقدان پارامترهای ضروری در درخواست",
        "mcrundo-changed": "این صفحه از زمانی که شما تفاوت را دیده‌اید تغییر کرده است. تغییر جدید را مشاهده کنید.",
+       "mcrundo-parse-failed": "قادر به تجزیه نسخه جدید نیست: $1",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "percent": "$1٪",
        "logentry-block-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به پایان قطع دسترسی $5 $6 تغییر داد.",
        "logentry-partialblock-block-page": "{{PLURAL:$1|صفحه|صفحات}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|فضای نام|فضاهای نام}} $2",
-       "logentry-partialblock-block": "$1 {{GENDER:$4|$3}} را از ویرایش $7 با انقضای $5 $6 قطع دسترسی کرد",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به جلوگیری از ویرایش $7 و پایان قطع دسترسی $5 $6 تغییر داد.",
+       "logentry-partialblock-block": "$1 {{GENDER:$4|$3}} را از ویرایش $7 با انقضای $5 $6 {{GENDER:$2|قطع دسترسی کرد}}",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به جلوگیری از ویرایش $7 و پایان قطع دسترسی $5 $6 تغییر داد",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$4|$3}} را از اعمال مشخص‌شده غیرویرایشی با انقضای $5 $6 {{GENDER:$2|قطع دسترسی کرد}}",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به جلوگیری از اعمال مشخص‌شده غیرویرایشی و پایان قطع دسترسی $5 $6 تغییر داد.",
        "logentry-suppress-block": "$1 {{GENDER:$2|بسته شد}} {{GENDER:$4|$3}} با پایان قطع دسترسی در زمان $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن برای  {{GENDER:$4|$3}} به پایان قطع دسترسی  $5 $6 تغییر یافت",
        "logentry-import-upload": "$1 $3 را توسط بارگذار پرونده {{GENDER:$2|درون‌ریزی کرد}}",
        "passwordpolicies-policy-maximalpasswordlength": "گذرواژه باید کمتر از $1 {{PLURAL:$1|نویسه|نویسه}} طول داشته باشد",
        "passwordpolicies-policy-passwordcannotbepopular": "گذرواژه نمی‌تواند {{PLURAL:$1|گذرواژه پراستفاده باشد|در فهرست $1 گذرواژه‌های پراستفاده باشد}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "گذرواژه نمی‌تواند یکی از ۱۰۰٬۰۰۰ گذرواژه پراستفاده باشد.",
-       "passwordpolicies-policyflag-forcechange": "در هنگام ورود باید تغییر کند",
-       "passwordpolicies-policyflag-suggestchangeonlogin": "در هنگام ورود پیشنهاد تغییر داده می‌شود",
+       "passwordpolicies-policyflag-forcechange": "در هنگام ورود باید تغییر دهید",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "در هنگام ورود، پیشنهاد تغییر بده",
        "easydeflate-invaliddeflate": "محتوی تهیه‌شده به صورت درست خالی نشده‌است",
        "unprotected-js": "به دلایل امنیتی، جاوااسکریپت نمی‌تواند از صفحات محافظت‌نشده بارگیری شود. لطفا جاوااسکریپت را تنها در فضای نام مدیاویکی: و یا در زیرصفحهٔ کاربری خودتان ایجاد کنید."
 }
index 6afa75e..cd60511 100644 (file)
        "tog-useeditwarning": "M’avertir quand je quitte une page en cours de modification sans avoir sauvegardé",
        "tog-prefershttps": "Toujours utiliser une connexion sécurisée lorsque je suis connecté",
        "tog-showrollbackconfirmation": "Afficher une demande de confirmation en cliquant sur un lien d’annulation",
+       "tog-showrollbackconfirmation-prerelease-warning": "Veuillez prendre note : Cette fonctionnalité n’est pas encore disponible. Si vous définissez cette préférence maintenant, votre choix sera pris en compte [https://meta.wikimedia.org/wiki/WMDE_Technical_Wishes/Rollback#Status quand la fonctionnalité sera livrée].",
        "underline-always": "Toujours",
        "underline-never": "Jamais",
        "underline-default": "Valeur par défaut du thème ou du navigateur",
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Révoquer les modifications de cette page ?",
+       "confirm-rollback-bottom": "Cette action annulera immédiatement les modifications sélectionnées sur cette page.",
        "confirm-mcrrestore-title": "Restaurer une version",
        "confirm-mcrundo-title": "Annuler une modification",
        "mcrundofailed": "L’annulation a échoué",
index 4830ea0..a3903bb 100644 (file)
        "blankpage": "Side is leech",
        "intentionallyblankpage": "Dizze side is bewust leech lizzen en wurdt brûkt foar benchmarks, ensfh.",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Lebel|Lebels}}]]: $2",
+       "tag-mw-new-redirect": "Nije trochferwizing",
+       "tag-mw-undo": "Ungedien meitsjen",
        "tags-source-header": "Boarne",
        "tags-active-header": "Aktyf?",
        "tags-actions-header": "Aksjes",
        "logentry-delete-delete": "$1 {{GENDER:$2|hat}} de side $3 wiske",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
+       "logentry-move-move": "$1 {{GENDER:$2|hat}} de side $3 omneamd ta $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|hat}} de side $3 omneamd ta $4 sûnder in trochferwizing efter te litten",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|hat}} de side $3 omneamd ta $4 fan de trochferwizing",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|hat}} de side $3 omneamd ta $4 fan de trochferwizing, sûnder in trochferwizing efter te litten",
        "logentry-newusers-create": "It meidochakkount $1 is {{GENDER:$2|oanmakke}}",
        "logentry-newusers-autocreate": "It meidochakkount $1 is automatysk {{GENDER:$2|oanmakke}}",
        "logentry-upload-upload": "$1 hat $3 {{GENDER:$2|opladen}}",
index c0c3832..fc566aa 100644 (file)
@@ -22,7 +22,8 @@
                        "Macofe",
                        "Tem",
                        "Nmacu",
-                       "ديفيد"
+                       "ديفيد",
+                       "Xqt"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
        "ilsubmit": "Cuardaigh",
        "bydate": "de réir dáta",
        "sp-newimages-showfrom": "Taispeáin íomhánna nua as $2, $1",
-       "days": "{{PLURAL:$1|$1 lá}}",
+       "days": "$1 lá",
        "bad_image_list": "Is é seo a leanas an formáid:\n\nNíl ach míreanna liosta amháin (línte ag tosú le *) san áireamh.\nIs riachtanach gur nasc do dhrochchomhad é an chéad nasc ar líne.\nIs eisceachtaí iad na naisc eile ar an líne céanna, .i. leathanaigh gur féidir an comhad a bheith orthu go hinlíne.",
        "metadata": "Meiteasonraí",
        "metadata-help": "Tá breis eolais sa comhad seo, curtha, is dócha, as ceamara digiteach ná scanóir a chruthaigh ná a digitigh é.\nMá tá an comhad mionathraithe as an bunleagan, b'fhéidir nach mbeidh ceann de na sonraí fágtha sa comhad atá athruithe.",
index c033735..c6c810e 100644 (file)
        "print": "Enprimé",
        "view": "Lir",
        "view-foreign": "Wè asou $1",
-       "edit": "Modifyé",
-       "edit-local": "Modifyé dèskripsyon lokal",
+       "edit": "Chanjé",
+       "edit-local": "Chanjé dèskripsyon lokal-a",
        "create": "Kréyé",
        "create-local": "Ajouté roun dèskripsyon lokal",
        "delete": "Siprimen",
        "undelete_short": "Rèstoré {{PLURAL:$1|roun modifikasyon|$1 modifikasyon}}",
        "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon ki siprimen|$1 modifikasyon ki siprimen}}",
        "protect": "Protéjé",
-       "protect_change": "modifyé",
+       "protect_change": "chanjé",
        "unprotect": "Chanjé protègsyon-an",
        "newpage": "Nouvèl paj",
        "talkpagelinktext": "diskisyon",
        "newmessageslinkplural": "{{PLURAL:$1|oun nouvèl mésaj|dé nouvèl mésaj}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|dannyé modifikasyon}}",
        "youhavenewmessagesmulti": "Zòt gen dé nouvèl mésaj asou $1.",
-       "editsection": "Modifyé",
-       "editold": "modifyé",
+       "editsection": "chanjé",
+       "editold": "chanjé",
        "viewsourceold": "wè sours-a",
-       "editlink": "modifyé",
+       "editlink": "chanjé",
        "viewsourcelink": "wè sours-a",
        "editsectionhint": "Modifyé ségsyon-an : $1",
        "toc": "Baydivan",
        "yourpasswordagain": "Konfirmen modipas-a :",
        "createacct-yourpasswordagain": "Konfirmen modipas-a",
        "createacct-yourpasswordagain-ph": "Rantré òkò menm modipas-a",
-       "userlogin-remembermypassword": "Gardé mo sésyon aktiv",
+       "userlogin-remembermypassword": "Gadé mo sésyon agtiv",
        "userlogin-signwithsecure": "Itilizé roun konnègsyon sékirizé",
        "cannotlogin-title": "Enposib di konnègté so kò",
        "cannotlogin-text": "Konnègsyon-an pa posib",
        "cannotcreateaccount-title": "Kréyasyon di kont enposib",
        "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa fika agtivé asou sa wiki.",
        "yourdomainname": "Zòt domenn :",
-       "password-change-forbidden": "Zòt pa pouvé modifyé mo di pas asou sa wiki.",
+       "password-change-forbidden": "Zòt pa pouvé chanjé modipas-ya asou sa wiki.",
        "externaldberror": "Swé roun lérò prodjwi so kò asou baz-a di data d'otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont ègstèrn.",
        "login": "Konnègsyon",
        "login-security": "Vérifyé zòt idantité",
        "createacct-benefit-body1": "modifikasyon{{PLURAL:$1|}}",
        "createacct-benefit-body2": "paj{{PLURAL:$1|}}",
        "createacct-benefit-body3": "{{PLURAL:$1|kontribitò résan}}",
-       "badretype": "Mo di pas ki zòt sézi pa ka korèsponn.",
+       "badretype": "Modipas-ya ki zòt sézi pa ka korèsponn.",
        "usernameinprogress": "Oun kréyasyon di kont pou sa non d'itilizatò ja an kour.\nSouplé, pasyanté.",
        "userexists": "Non d'itilizatò sézi ja itilizé.\nSouplé, chwézi roun non diféran.",
        "loginerror": "Lérò di konnègsyon",
        "nosuchusershort": "I pa gen kontribitò ké non-an « $1 ».\nSouplé, vérifyé lòrtograf.",
        "nouserspecified": "Zòt divèt sézi roun non d'itilizatò.",
        "login-userblocked": "{{GENDER:$1|Sa itilizatò}} bloké. Konnègsyon-an pa otorizé.",
-       "wrongpassword": "Non d'itilizatò oben mo di pas enkorèk.\nSouplé, éséyé òkò.",
+       "wrongpassword": "Non-an di itilizatò oben modipas enkorèk.\nSouplé, éséyé òkò.",
        "wrongpasswordempty": "Zòt pa rantré pyès modipas.\nSouplé, éséyé òkò.",
        "passwordtooshort": "Zòt mo di pas divèt kontni omwen $1 karaktèr{{PLURAL:$1|}}.",
-       "passwordtoolong": "Mo di pas pa pouvé dépasé $1 karaktèr{{PLURAL:$1|}}.",
-       "passwordtoopopular": "Mo di pas ki tròp kouran pa pouvé fika itilizé. Souplé, chwézi roun mo di pas pli difisil à douviné.",
+       "passwordtoolong": "Modipas-ya pa pouvé dépasé $1 karagtèr{{PLURAL:$1|}}.",
+       "passwordtoopopular": "Modipas ki tròp kouran pa pouvé fika itilizé. Souplé, chwézi roun modipas ki pi difisil pou sonjé.",
        "password-name-match": "Zòt mo di pas divèt fika diféran di zòt non d'itilizatò.",
        "password-login-forbidden": "Litilizasyon-an di sa non d'itilizatò oben di sa modipas sa entèrdi.",
        "mailmypassword": "Réynisyalizé modipas-a",
        "newpassword": "Nouvèl modipas :",
        "retypenew": "Konfirmen modipas nòv-a :",
        "resetpass_submit": "Chanjé modipas-a é konnègté so kò.",
-       "changepassword-success": "Zòt modipas modifyé !",
+       "changepassword-success": "Zòt modipas chanjé !",
        "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.",
        "botpasswords": "Modipas di robo",
        "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò-ya ki disponnib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
        "botpasswords-disabled": "Modipas-ya di robo dézagtivé.",
        "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.",
        "botpasswords-existing": "Modipas di robo ki ka ègzisté",
-       "botpasswords-createnew": "Kréyé roun mo di pas nòv di robo",
+       "botpasswords-createnew": "Kréyé roun nouvèl modipas di robo",
        "botpasswords-editexisting": "Modifyé roun modipas di robo ki ka ègzisté",
        "botpasswords-label-needsreset": "(Modipas-a divèt fika réynisyalizé)",
        "botpasswords-label-appid": "Non di robo :",
        "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò à<strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryòrman.</em><br> (Pou ansyen robo-ya ki ka nésésité ki non-an ki fourni pou konnègsyon-an ka fika menm-an ki non-an di itilizatò évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
        "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponnib.",
        "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.",
-       "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).",
+       "botpasswords-invalid-name": "Non-an d'itilizatò ki èspésifyé pa ka kontni di séparatò di modipas di robo (« $1 »).",
        "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».",
        "botpasswords-needs-reset": "Modipas-a di robo di non « $2 » di itilizatò-a « $1 » divèt fika réynisyalizé.",
        "resetpass_forbidden": "Modipas-ya pa pouvé fika chanjé.",
-       "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1",
+       "resetpass_forbidden-reason": "Modipas-ya pa pouvé fika chanjé : $1",
        "resetpass-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "resetpass-submit-loggedin": "Chanjé di modipas",
        "resetpass-submit-cancel": "Annilé",
        "resetpass-expired-soft": "Zòt modipas èspiré, é divèt fika modifyé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.",
        "resetpass-validity-soft": "Zòt modipas pa valid : $1\n\nSouplé, chwézi roun nouvèl modipas atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou modifyé li plita.",
        "passwordreset": "Réynisyalizasyon di modipas",
-       "passwordreset-text-one": "Ranplisé sa fòrmilèr pou zòt mo di pas.",
+       "passwordreset-text-one": "Ranpli sa fòrmilèr pou réynisyalizé zòt modipas.",
        "passwordreset-emaildisabled": "Fongsyonnalité-ya di kourilèt fika dézagtivé asou sa wiki.",
        "passwordreset-username": "Non di itilizatò :",
        "passwordreset-domain": "Domenn :",
        "protectedarticle": "protéjé « [[$1]] »",
        "modifiedarticleprotection": "modifyé nivo-a di protègsyon di « [[$1]] »",
        "protect-default": "Otorizé tout itilizatò-ya",
-       "restriction-edit": "Modifyé",
+       "restriction-edit": "Chanjé",
        "restriction-move": "Rounonmen",
        "namespace": "Lèspas di non",
        "invert": "Envèrsé sélègsyon-an",
        "pageinfo-magic-words": "{{PLURAL:$1|Mo majik}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Katégori kaché|}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèl enkli}} ($1)",
-       "pageinfo-toolboxlink": "Lenfòrmasyon asou paj-a",
+       "pageinfo-toolboxlink": "Lenfòrmasyon asou paj",
        "pageinfo-contentpage": "Konté kou paj di kontni",
        "pageinfo-contentpage-yes": "Enren",
        "patrol-log-page": "Journal dé roulèktir",
index 01162a4..1716310 100644 (file)
@@ -86,7 +86,7 @@
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
        "tog-showrollbackconfirmation": "הצגת הודעת אישור לאחר לחיצה על קישור \"שחזור\"",
-       "tog-showrollbackconfirmation-prerelease-warning": "×\9cתש×\95×\9eת ×\9c×\91×\9a: ×\94×\90פשר×\95ת ×\94×\96×\90ת ×¢×\93×\99×\99×\9f ×\90×\99× ×\94 ×\96×\9e×\99× ×\94. ×\90×\9d {{GENDER:|ת×\92×\93×\99ר|ת×\92×\93×\99ר×\99}} ×\94×\94×¢×\93פ×\94 ×\94×\96×\90ת ×¢×\9bש×\99×\95, ×\94×\91×\97×\99ר×\94 ×©×\9c×\9a ×ª×\99×\96×\9bר [https://meta.wikimedia.org/wiki/WMDE_Technical_Wishes/Rollback#Status ×\9c×\96×\9e×\9f ×©×\94×\90פשר×\95ת ×\94×\96×\90ת ×ª×¦×\90 ×\9c×\90×\95ר].",
+       "tog-showrollbackconfirmation-prerelease-warning": "×\9cתש×\95×\9eת ×\9c×\91×\9a: ×ª×\9b×\95× ×\94 ×\96×\95 ×¢×\93×\99×\99×\9f ×\90×\99× ×\94 ×\96×\9e×\99× ×\94. ×\90×\9d {{GENDER:|תפע×\99×\9c|תפע×\99×\9c×\99}} ×\90ת ×\94×\94×¢×\93פ×\94 ×\94×\96×\90ת ×¢×\9bש×\99×\95, ×\91×\97×\99רת×\9a ×ª×\99ש×\9eר ×\95ת×\99×\9bנס ×\9cת×\95קף [https://meta.wikimedia.org/wiki/WMDE_Technical_Wishes/Rollback#Status ×\9bש×\94ת×\9b×\95× ×\94 ×ª×\94פ×\95×\9a ×\9c×\96×\9e×\99× ×\94].",
        "underline-always": "תמיד",
        "underline-never": "לעולם לא",
        "underline-default": "ברירת המחדל של העיצוב או של הדפדפן",
        "deleting-backlinks-warning": "<strong>אזהרה:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף זה (שעומד להימחק) או מכלילים אותו.",
        "deleting-subpages-warning": "<strong>אזהרה:</strong> לדף שעומד להימחק יש [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|דף משנה|$1 דפי משנה|51=יותר מ־50 דפי משנה}}]].",
        "rollback": "שחזור עריכות",
-       "rollback-confirmation-confirm": "× ×\90 ×\9c×\90שר:",
+       "rollback-confirmation-confirm": "×\9c×\90×\99ש×\95ר×\9a:",
        "rollback-confirmation-yes": "שחזור",
        "rollback-confirmation-no": "ביטול",
        "rollbacklink": "שחזור",
        "confirm-unwatch-top": "להסיר את הדף הזה מרשימת המעקב שלך?",
        "confirm-rollback-button": "אישור",
        "confirm-rollback-top": "לשחזר את העריכות בדף זה?",
-       "confirm-rollback-bottom": "×\94פע×\95×\9c×\94 ×\94×\96×\90ת ×ª×©×\97×\96ר ×\91×\90×\95פ×\9f ×\9e×\99×\99×\93×\99 ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×©× ×\91×\97ר×\95 ×\91×\93×£ ×\94זה.",
+       "confirm-rollback-bottom": "פע×\95×\9c×\94 ×\96×\95 ×ª×©×\97×\96ר ×\91×\90×\95פ×\9f ×\9e×\99×\99×\93×\99 ×\90ת ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\97רת ×\91×\93×£ זה.",
        "confirm-mcrrestore-title": "שחזור גרסה",
        "confirm-mcrundo-title": "ביטול שינוי",
        "mcrundofailed": "הביטול נכשל",
index 2383108..9aeb97d 100644 (file)
                        "Zeljko.filipin"
                ]
        },
-       "tog-underline": "Podcrtavanje poveznica",
-       "tog-hideminor": "Sakrij manje izmjene u nedavnim promjenama",
-       "tog-hidepatrolled": "Sakrij pregledane izmjene u nedavnim promjenama",
-       "tog-newpageshidepatrolled": "Sakrij pregledane stranice iz popisa novih stranica",
-       "tog-hidecategorization": "Sakrij kategorizaciju stranica",
+       "tog-underline": "Podcrtavanje veza:",
+       "tog-hideminor": "Sakrivaj manje izmjene sa popisa nedavnih promjena",
+       "tog-hidepatrolled": "Sakrivaj patrolirane izmjene sa popisa nedavnih promjena",
+       "tog-newpageshidepatrolled": "Sakrivaj patrolirane stranice sa popisa novih stranica",
+       "tog-hidecategorization": "Sakrivaj kategorizaciju stranica",
        "tog-extendwatchlist": "Proširi popis praćenih stranica tako da prikaže sve promjene, ne samo najnovije",
        "tog-usenewrc": "Grupne promjene po stranici u popisu nedavnih izmjena i popisu praćenih stranica (zahtijeva JavaScript)",
        "tog-numberheadings": "Automatski označi naslove brojevima",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "editold": "uredi",
-       "viewsourceold": "vidi izvor",
+       "viewsourceold": "prikaži izvor",
        "editlink": "uredi",
-       "viewsourcelink": "vidi izvornik",
+       "viewsourcelink": "prikaži izvor",
        "editsectionhint": "Uredi odlomak: $1",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "perfcached": "Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. Međuspremnik sadrži $1 {{PLURAL:$1|rezultat|rezultata}} pretraživanja.",
        "perfcachedts": "Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.",
        "querypage-no-updates": "Osvježavanje ove stranice je trenutačno onemogućeno. Nove promjene neće biti vidljive.",
-       "viewsource": "Vidi izvornik",
+       "viewsource": "Prikaži izvor",
        "viewsource-title": "Vidi kôd stranice $1",
        "actionthrottled": "Uređivanje je usporeno",
        "actionthrottledtext": "Kao mjera protiv spama, ograničeni vam je broj ovih radnji u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte opet za par minuta.",
index 929235c..41135bc 100644 (file)
@@ -98,6 +98,7 @@
        "tog-norollbackdiff": "Ne jelenjenek meg az eltérések visszaállítás után",
        "tog-useeditwarning": "Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot",
        "tog-prefershttps": "Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve",
+       "tog-showrollbackconfirmation": "Megerősítés kérése, amikor a visszaállítás linkre kattintasz",
        "underline-always": "mindig",
        "underline-never": "soha",
        "underline-default": "Felület és böngésző alapértelmezése szerint",
        "deleting-backlinks-warning": "<strong>Figyelem:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Más lapok]] hivatkoznak a törlendő oldalra (vagy beillesztik azt).",
        "deleting-subpages-warning": "<strong>Figyelem:</strong> A törlésre jelölt lapnak [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|van egy allapja|$1 allapja van|51=több mint 50 allapja van}}]].",
        "rollback": "Szerkesztések visszaállítása",
+       "rollback-confirmation-confirm": "Kérlek erősítsd meg:",
+       "rollback-confirmation-yes": "Visszaállítás",
+       "rollback-confirmation-no": "Mégse",
        "rollbacklink": "visszaállítás",
        "rollbacklinkcount": "$1 szerkesztés visszaállítása",
        "rollbacklinkcount-morethan": "több mint $1 szerkesztés visszaállítása",
        "ipb-confirm": "Blokk megerősítése",
        "ipb-sitewide": "Teljes körű",
        "ipb-partial": "Részleges",
+       "ipb-sitewide-help": "A wiki összes lapja és minden egyéb közreműködési művelet.",
+       "ipb-partial-help": "Meghatározott lapok vagy névterek.",
        "ipb-pages-label": "Lapok",
        "ipb-namespaces-label": "Névterek",
        "badipaddress": "Érvénytelen IP-cím",
        "ipb_expiry_old": "A lejárati idő a múltban van.",
        "ipb_expiry_temp": "A láthatatlan felhasználóinév-blokkok lehetnek állandóak.",
        "ipb_hide_invalid": "A felhasználói fiókot nem lehet elrejteni; több mint $1 szerkesztése van.",
+       "ipb_hide_partial": "Felhasználói nevek elrejtésekor és blokkolásakor a blokknak az egész wikire ki kell terjednie.",
        "ipb_already_blocked": "\"$1\" már blokkolva",
        "ipb-needreblock": "$1 már blokkolva van. Meg szeretnéd változtatni a beállításokat?",
        "ipb-otherblocks-header": "További {{PLURAL:$1|blokk|blokkok}}",
        "confirm-unwatch-top": "El szeretnéd távolítani a lapot a figyelőlistádról?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Visszavonod a változtatásokat?",
+       "confirm-rollback-bottom": "Ez a művelet azonnal visszaállítja a lap kiválasztott változtatásait.",
        "confirm-mcrrestore-title": "Egy változat visszaállítása",
        "confirm-mcrundo-title": "Egy változtatás visszavonva",
        "mcrundofailed": "A visszavonás nem sikerült",
        "passwordpolicies-policy-maximalpasswordlength": "A jelszó legfeljebb $1 karakter hosszú lehet",
        "passwordpolicies-policy-passwordcannotbepopular": "A jelszó nem {{PLURAL:$1|lehet a gyakran használt jelszó|szerepelhet a(z) $1 leggyakrabban használt jelszó listáján}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "A jelszó nem szerepelhet a 100 000 leggyakrabban használt jelszó listáján .",
+       "passwordpolicies-policyflag-forcechange": "lecserélés követelése bejelentkezéskor",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "lecserélés ajánlása bejelentkezéskor",
        "unprotected-js": "Biztonsági okokból JavaScript nem tölthető be védtelen lapokról. Kérlek egyedül a MediaWiki névtérben készíts JavaScriptet, vagy szerkesztői allapként."
 }
index edeeb8a..d7eb2bb 100644 (file)
        "help": "Helpo",
        "help-mediawiki": "Helpo pri MediaWiki",
        "search": "Sercho",
-       "search-ignored-headings": " #<!-- mantenez ica lineo sen modifiki --> <pre>\n# Tituli qui ignoresos per la sistemo di serchado.\n# Modifiki en ca parto efikeskos balde pos la titulo di la pagino adicionesos a l'indexo.\n# Tu povas acelerar la riindexigo di la pagino facante nihila editado.\n# La sintaxo esas quale infre:\n#   * Omna texti qui finas kun la signo \"#\" fine de la lineo, esas komentaro.\n#   * Omna lineo ne blanka - to esas: skriptata -, esas l'exakta titulo por ignorar la diferi inter mayuskula e minuskula literi, ed altra.\nReferi\nExtera ligili\nVidez anke\n #</pre> <!-- mantenez ica lineo sen modifiki -->",
+       "search-ignored-headings": " #<!-- mantenez ica lineo sen modifiki --> <pre>\n# Tituli qui ignoresos dal sistemo di serchado.\n# Modifiki en ca parto efikeskos balde pos la titulo di la pagino adicionesos a l'indexo.\n# Tu povas acelerar la riindexigo di la pagino facante nihila editado.\n# La sintaxo esas quale infre:\n#   * Omna texti qui finas kun la signo \"#\" fine de la lineo, esas komentaro.\n#   * Omna lineo ne blanka - to esas: skriptata -, esas l'exakta titulo por ignorar la diferi inter mayuskula e minuskula literi, ed altra.\nReferi\nExtera ligili\nVidez anke\n #</pre> <!-- mantenez ica lineo sen modifiki -->",
        "searchbutton": "Serchez",
        "go": "Irar",
        "searcharticle": "Irez",
index 2d3e88b..20ebf2a 100644 (file)
@@ -71,6 +71,7 @@
        "tog-useeditwarning": "Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените",
        "tog-prefershttps": "Секогаш најавувај ме преку безбедна врска",
        "tog-showrollbackconfirmation": "Прикажи потврдница при стискање на врската за отповикување",
+       "tog-showrollbackconfirmation-prerelease-warning": "Имајте предвид: Оваа можност сè уште не е достапна. Ако ја зададете поставката сега, изборот ќе ви се зачува [https://meta.wikimedia.org/wiki/WMDE_Technical_Wishes/Rollback#Status кога ќе излезе алатката].",
        "underline-always": "Секогаш",
        "underline-never": "Никогаш",
        "underline-default": "Според рувото или прелистувачот",
        "deleting-backlinks-warning": "<strong>Предупредување:</strong>  До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.",
        "deleting-subpages-warning": "<strong>Предупредување:</strong> Страницата што сакате да ја избришете има [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|потстраница|$1 потстраници|51=преку 50 потстраници}}]].",
        "rollback": "Отповикај промени",
-       "rollback-confirmation-confirm": "Ð\94а {{PLURAL:$1|0=ги Ð¾Ñ\82повикам Ð¾Ð²Ð¸Ðµ Ñ\83Ñ\80едÑ\83ваÑ\9aа|оÑ\82повикам ÐµÐ´Ð½Ð¾ Ñ\83Ñ\80едÑ\83ваÑ\9aе|оÑ\82повикам $1 Ñ\83Ñ\80едÑ\83ваÑ\9aа}}?",
+       "rollback-confirmation-confirm": "Ð\9fоÑ\82вÑ\80деÑ\82е:",
        "rollback-confirmation-yes": "Отповикај",
        "rollback-confirmation-no": "Откажи",
        "rollbacklink": "отповикај",
index 62e2047..61d40cb 100644 (file)
        "rightslogtext": "Ini ialah log perubahan terhadap hak pengguna.",
        "action-read": "membaca laman ini",
        "action-edit": "menyunting laman ini",
-       "action-createpage": "mencipta laman",
-       "action-createtalk": "mencipta laman perbincangan",
+       "action-createpage": "ciptakan laman ini",
+       "action-createtalk": "ciptakan laman perbincangan ini",
        "action-createaccount": "mencipta akaun pengguna ini",
        "action-history": "melihat sejarah halaman ini",
        "action-minoredit": "menanda suntingan ini sebagai suntingan kecil",
index 89ea2a3..ff71467 100644 (file)
        "cantrollback": "Bô-hoat-tō· kā siu-kái ká-tńg--khì; téng ūi kòng-hiàn-chiá sī chit ia̍h î-it ê chok-chiá.",
        "alreadyrolled": "Bô-hoat-tō· kā [[User:$2|$2]] ([[User talk:$2|Thó-lūn]]) tùi [[:$1]] ê siu-kái ká-tńg-khì; í-keng ū lâng siu-kái a̍h-sī ká-tńg chit ia̍h. Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|Thó-lūn]]).",
        "editcomment": "Siu-kái phêng-lūn sī: <em>$1</em>.",
-       "protectedarticle": "pó-hō͘ \"[[$1]]\"",
+       "protectedarticle": "pó-hō͘ liáu \"[[$1]]\"",
        "protect-title": "Kái-piàn \"$1\" ê pó-hō͘ chân-kip",
        "prot_1movedto2": "[[$1]] sóa khì tī [[$2]]",
        "protect-legend": "Khak-tēng beh pó-hō·",
        "protectcomment": "Lí-iû:",
-       "protect-level-autoconfirmed": "Chí ín-chún chū-tōng khak-jīn iōng-chiá",
-       "protect-level-sysop": "Chí ín-chún koán-lí jîn-oân",
+       "protect-level-autoconfirmed": "Ta ín-chún chū-tōng khak-jīn iōng-chiá",
+       "protect-level-sysop": "Ta ín-chún koán-lí jîn-oân",
+       "protect-expiring": "chì $1 (UTC) kòe-kî",
+       "protect-expiring-local": "chì $1 kòe-kî",
        "protect-cascade": "Cascading protection - pó-hō͘ jīm-hô pau-hâm tī chit ia̍h ê ia̍h.",
        "restriction-edit": "Siu-kái",
        "restriction-move": "Sóa khì",
index af60eaa..59820a5 100644 (file)
@@ -126,7 +126,6 @@ class ConvertLinks extends Maintenance {
                $res = $dbw->query( "SELECT COUNT(*) AS count FROM $links" );
                $row = $dbw->fetchObject( $res );
                $numRows = $row->count;
-               $dbw->freeResult( $res );
 
                if ( $numRows == 0 ) {
                        $this->output( "Updating schema (no rows to convert)...\n" );
@@ -168,7 +167,6 @@ class ConvertLinks extends Maintenance {
                                        }
                                }
                        }
-                       $dbw->freeResult( $res );
                        $dbw->bufferResults( true );
                        $this->output( "Finished loading IDs.\n\n" );
                        $this->performanceLog(
@@ -214,7 +212,6 @@ class ConvertLinks extends Maintenance {
                                                $numBadLinks++;
                                        }
                                }
-                               $dbw->freeResult( $res );
                                # $this->output( "rowOffset: $rowOffset\ttuplesAdded: "
                                #       . "$tuplesAdded\tnumBadLinks: $numBadLinks\n" );
                                if ( $tuplesAdded != 0 ) {
index a95789d..26d4e79 100644 (file)
@@ -86,7 +86,6 @@ class CheckStorage {
                        foreach ( $res as $row ) {
                                $this->oldIdMap[$row->rev_id] = $row->rev_text_id;
                        }
-                       $dbr->freeResult( $res );
 
                        if ( !count( $this->oldIdMap ) ) {
                                continue;
@@ -147,7 +146,6 @@ class CheckStorage {
                                        $this->addError( 'unfixable', "Error: invalid flags field \"$flags\"", $id );
                                }
                        }
-                       $dbr->freeResult( $res );
 
                        // Output errors for any missing text rows
                        foreach ( $missingTextRows as $oldId => $revId ) {
@@ -187,7 +185,6 @@ class CheckStorage {
                                                $externalNormalBlobs[$cluster][$id][] = $row->old_id;
                                        }
                                }
-                               $dbr->freeResult( $res );
                        }
 
                        // Check external concat blobs for the right header
@@ -210,7 +207,6 @@ class CheckStorage {
                                        foreach ( $res as $row ) {
                                                unset( $xBlobIds[$row->blob_id] );
                                        }
-                                       $extDb->freeResult( $res );
                                        // Print errors for missing blobs rows
                                        foreach ( $xBlobIds as $blobId => $oldId ) {
                                                $this->addError(
@@ -279,7 +275,6 @@ class CheckStorage {
                                                        $this->addError( 'unfixable', "Error: unrecognised object class \"$className\"", $oldId );
                                        }
                                }
-                               $dbr->freeResult( $res );
                        }
 
                        // Check local concat blob validity
@@ -333,7 +328,6 @@ class CheckStorage {
 
                                        unset( $concatBlobs[$row->old_id] );
                                }
-                               $dbr->freeResult( $res );
                        }
 
                        // Check targets of unresolved stubs
@@ -421,7 +415,6 @@ class CheckStorage {
                                }
                                unset( $oldIds[$row->blob_id] );
                        }
-                       $extDb->freeResult( $res );
 
                        // Print errors for missing blobs rows
                        foreach ( $oldIds as $blobId => $oldIds2 ) {
index 3d1bf59..2559b67 100644 (file)
@@ -438,6 +438,13 @@ class LBFactoryTest extends MediaWikiTestCase {
                ] );
        }
 
+       /**
+        * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+        * @covers DatabaseOracle::selectDB
+        */
        public function testNiceDomains() {
                global $wgDBname;
 
@@ -518,6 +525,13 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->destroy();
        }
 
+       /**
+        * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+        * @covers DatabaseOracle::selectDB
+        */
        public function testTrickyDomain() {
                global $wgDBname;
 
@@ -530,7 +544,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory = $this->newLBFactoryMulti(
                        [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
                        [
-                               'dbName' => 'do_not_select_me' // explodes if DB is selected
+                               'dbname' => 'do_not_select_me' // explodes if DB is selected
                        ]
                );
                $lb = $factory->getMainLB();
@@ -584,46 +598,94 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->destroy();
        }
 
+       /**
+        * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::doSelectDomain
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+        * @covers DatabaseOracle::selectDB
+        */
        public function testInvalidSelectDB() {
-               // FIXME: fails under sqlite
-               $this->markTestSkippedIfDbType( 'sqlite' );
+               if ( wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+                       $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
+               }
+
                $dbname = 'unittest-domain'; // explodes if DB is selected
                $factory = $this->newLBFactoryMulti(
                        [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
                        [
-                               'dbName' => 'do_not_select_me' // explodes if DB is selected
+                               'dbname' => 'do_not_select_me' // explodes if DB is selected
                        ]
                );
                $lb = $factory->getMainLB();
                /** @var IDatabase $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
 
-               if ( $db->getType() === 'sqlite' ) {
+               \Wikimedia\suppressWarnings();
+               try {
                        $this->assertFalse( $db->selectDB( 'garbage-db' ) );
-               } elseif ( $db->databasesAreIndependent() ) {
-                       try {
-                               $e = null;
-                               $db->selectDB( 'garbage-db' );
-                       } catch ( \Wikimedia\Rdbms\DBConnectionError $e ) {
-                               // expected
-                       }
-                       $this->assertInstanceOf( \Wikimedia\Rdbms\DBConnectionError::class, $e );
-                       $this->assertFalse( $db->isOpen() );
-               } else {
-                       \Wikimedia\suppressWarnings();
-                       try {
-                               $this->assertFalse( $db->selectDB( 'garbage-db' ) );
-                               $this->fail( "No error thrown." );
-                       } catch ( \Wikimedia\Rdbms\DBExpectedError $e ) {
-                               $this->assertEquals(
-                                       "Could not select database 'garbage-db'.",
-                                       $e->getMessage()
-                               );
-                       }
-                       \Wikimedia\restoreWarnings();
+                       $this->fail( "No error thrown." );
+               } catch ( \Wikimedia\Rdbms\DBQueryError $e ) {
+                       $this->assertRegExp( '/[\'"]garbage-db[\'"]/', $e->getMessage() );
+               }
+               \Wikimedia\restoreWarnings();
+       }
+
+       /**
+        * @covers \Wikimedia\Rdbms\DatabaseSqlite::selectDB
+        * @covers \Wikimedia\Rdbms\DatabasePostgres::selectDB
+        * @expectedException \Wikimedia\Rdbms\DBConnectionError
+        */
+       public function testInvalidSelectDBIndependant() {
+               $dbname = 'unittest-domain'; // explodes if DB is selected
+               $factory = $this->newLBFactoryMulti(
+                       [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
+                       [
+                               'dbname' => 'do_not_select_me' // explodes if DB is selected
+                       ]
+               );
+               $lb = $factory->getMainLB();
+
+               if ( !wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+                       $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
+               }
+
+               /** @var IDatabase $db */
+               $lb->getConnection( DB_MASTER, [], '' );
+       }
+
+       /**
+        * @covers \Wikimedia\Rdbms\DatabaseSqlite::selectDB
+        * @covers \Wikimedia\Rdbms\DatabasePostgres::selectDB
+        * @expectedException \Wikimedia\Rdbms\DBConnectionError
+        */
+       public function testInvalidSelectDBIndependant2() {
+               $dbname = 'unittest-domain'; // explodes if DB is selected
+               $factory = $this->newLBFactoryMulti(
+                       [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
+                       [
+                               'dbname' => 'do_not_select_me' // explodes if DB is selected
+                       ]
+               );
+               $lb = $factory->getMainLB();
+
+               if ( !wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+                       $this->markTestSkipped( "Not applicable per databasesAreIndependent()" );
                }
+
+               $db = $lb->getConnection( DB_MASTER );
+               \Wikimedia\suppressWarnings();
+               $db->selectDB( 'garbage-db' );
+               \Wikimedia\restoreWarnings();
        }
 
+       /**
+        * @covers \Wikimedia\Rdbms\LoadBalancer::getConnection
+        * @covers \Wikimedia\Rdbms\LoadBalancer::redefineLocalDomain
+        * @covers \Wikimedia\Rdbms\DatabaseMysqlBase::selectDB
+        * @covers \Wikimedia\Rdbms\DatabaseMssql::selectDB
+        * @covers DatabaseOracle::selectDB
+        */
        public function testRedefineLocalDomain() {
                global $wgDBname;