From: jenkins-bot Date: Thu, 22 Feb 2018 19:19:29 +0000 (+0000) Subject: Merge "Title: Refactor JS/CSS page handling to be more sane" X-Git-Tag: 1.31.0-rc.0~537 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=8624538de243da3779db5eb3362bedf78d2e2931;hp=6d4e15476c6ec12ecc671c1d3536eacede7211b2 Merge "Title: Refactor JS/CSS page handling to be more sane" --- diff --git a/.gitignore b/.gitignore index bb3a946593..0112cf31a6 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,8 @@ sftp-config.json /images/timeline ## Extension:Score /images/lilypond +## Extension:TimedMediaHandler +/images/transcoded /images/tmp /maintenance/.mweval_history /maintenance/.mwsql_history diff --git a/.phpcs.xml b/.phpcs.xml index 7f90f2788b..cd55428f63 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -7,7 +7,6 @@ - @@ -29,6 +28,8 @@ + + diff --git a/.travis.yml b/.travis.yml index b06d9f431b..a28dac0ff0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,6 +69,8 @@ before_script: --dbuser "$dbuser" --dbpass "" --scriptpath "/w" + - echo -en "\n\nrequire_once __DIR__ . '/includes/DevelopmentSettings.php';\n" >> ./LocalSettings.php + - php -l ./LocalSettings.php script: - php tests/phpunit/phpunit.php diff --git a/Gruntfile.js b/Gruntfile.js index d1ef72f270..cb9a20d0a7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -98,8 +98,8 @@ module.exports = function ( grunt ) { chromium: { browsers: [ 'Chromium' ] }, - more: { - browsers: [ 'Chrome', 'Firefox' ] + firefox: { + browsers: [ 'Firefox' ] } }, copy: { diff --git a/RELEASE-NOTES-1.31 b/RELEASE-NOTES-1.31 index c1bc8f7f39..131a3b959a 100644 --- a/RELEASE-NOTES-1.31 +++ b/RELEASE-NOTES-1.31 @@ -26,6 +26,8 @@ production. default mode. * CACHE_ACCEL now only supports APC(u) or WinCache. XCache support was removed as upstream is inactive and has no plans to move to PHP 7. +* The old CategorizedRecentChanges feature, including its related configuration + option $wgAllowCategorizedRecentChanges, has been removed. === New features in 1.31 === * Wikimedia\Rdbms\IDatabase->select() and similar methods now support @@ -63,6 +65,7 @@ production. * Updated wikimedia/running-stat from 1.1.0 to 1.2.0. * Updated wikimedia/wrappedstring from 2.2.0 to 2.3.0. * Updated mediawiki/at-ease from 1.1.0 to 1.2.0. +* Updated wikimedia/php-session-serializer from 1.0.4 to 1.0.5. * … ==== New external libraries ==== @@ -100,8 +103,10 @@ changes to languages because of Phabricator reports. * (T186359) New language support: Siberian Tatar [cебертатар] (sty). * (T186635) New language support: Guianan Creole (gcr). * (T186647) New language support: Kumyk [къумукъ] (kum). +* (T187750) New language support: Spanish formal address (es-formal). === Other changes in 1.31 === +* Browser support for Internet Explorer 10 was lowered from Grade A to Grade C. * Introducing multi-content-revision capability into the storage layer. For details, see . * The Revision class was deprecated in favor of RevisionStore, BlobStore, and @@ -240,6 +245,9 @@ changes to languages because of Phabricator reports. * Title::isCssSubpage – use ::isUserCssConfigPage * Title::isJsSubpage – use ::isUserJsConfigPage * The method ResourceLoaderModule::getPosition(), deprecated in 1.29, has been removed. +* The DeferredStringifier class is deprecated, use Message::listParam() instead. +* The type string for the parameter $lang of DateFormatter::getInstance is + deprecated. == Compatibility == MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported, diff --git a/autoload.php b/autoload.php index fc77fcb91c..7f90d4753e 100644 --- a/autoload.php +++ b/autoload.php @@ -647,6 +647,10 @@ $wgAutoloadLocalClasses = [ 'ImportStringSource' => __DIR__ . '/includes/import/ImportStringSource.php', 'ImportTextFiles' => __DIR__ . '/maintenance/importTextFiles.php', 'ImportTitleFactory' => __DIR__ . '/includes/title/ImportTitleFactory.php', + 'ImportableOldRevision' => __DIR__ . '/includes/import/ImportableOldRevision.php', + 'ImportableOldRevisionImporter' => __DIR__ . '/includes/import/ImportableOldRevisionImporter.php', + 'ImportableUploadRevision' => __DIR__ . '/includes/import/ImportableUploadRevision.php', + 'ImportableUploadRevisionImporter' => __DIR__ . '/includes/import/ImportableUploadRevisionImporter.php', 'IncludableSpecialPage' => __DIR__ . '/includes/specialpage/IncludableSpecialPage.php', 'IndexPager' => __DIR__ . '/includes/pager/IndexPager.php', 'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php', @@ -1075,6 +1079,7 @@ $wgAutoloadLocalClasses = [ 'ObjectFactory' => __DIR__ . '/includes/compat/ObjectFactory.php', 'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php', 'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php', + 'OldRevisionImporter' => __DIR__ . '/includes/import/OldRevisionImporter.php', 'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php', 'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php', 'OrderedStreamingForkController' => __DIR__ . '/includes/OrderedStreamingForkController.php', @@ -1570,6 +1575,7 @@ $wgAutoloadLocalClasses = [ 'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php', 'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php', 'UploadLogFormatter' => __DIR__ . '/includes/logging/UploadLogFormatter.php', + 'UploadRevisionImporter' => __DIR__ . '/includes/import/UploadRevisionImporter.php', 'UploadSourceAdapter' => __DIR__ . '/includes/import/UploadSourceAdapter.php', 'UploadSourceField' => __DIR__ . '/includes/specials/formfields/UploadSourceField.php', 'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php', @@ -1591,6 +1597,7 @@ $wgAutoloadLocalClasses = [ 'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php', 'UserCache' => __DIR__ . '/includes/cache/UserCache.php', 'UserDupes' => __DIR__ . '/maintenance/userDupes.inc', + 'UserGroupExpiryJob' => __DIR__ . '/includes/jobqueue/jobs/UserGroupExpiryJob.php', 'UserGroupMembership' => __DIR__ . '/includes/user/UserGroupMembership.php', 'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php', 'UserNamePrefixSearch' => __DIR__ . '/includes/user/UserNamePrefixSearch.php', diff --git a/composer.json b/composer.json index c3ff8d6659..c96374feb4 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "wikimedia/html-formatter": "1.0.1", "wikimedia/ip-set": "1.2.0", "wikimedia/object-factory": "1.0.0", - "wikimedia/php-session-serializer": "1.0.4", + "wikimedia/php-session-serializer": "1.0.5", "wikimedia/purtle": "1.0.6", "wikimedia/relpath": "2.1.1", "wikimedia/remex-html": "1.0.2", @@ -55,7 +55,7 @@ "jakub-onderka/php-parallel-lint": "0.9.2", "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a", "justinrainbow/json-schema": "~5.2", - "mediawiki/mediawiki-codesniffer": "15.0.0", + "mediawiki/mediawiki-codesniffer": "16.0.0", "monolog/monolog": "~1.22.1", "nikic/php-parser": "3.1.3", "nmred/kafka-php": "0.1.5", diff --git a/docs/hooks.txt b/docs/hooks.txt index 7084b51d56..4e8474bfd6 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2333,6 +2333,7 @@ $wikiPage: the WikiPage edited $rev: the new revision $baseID: the revision ID this was based off, if any $user: the editing user +&$tags: tags to apply to the edit and recent change 'OldChangesListRecentChangesLine': Customize entire recent changes line, or return false to omit the line from RecentChanges and Watchlist special pages. diff --git a/includes/CategoryFinder.php b/includes/CategoryFinder.php index 3561f7f586..7446b59025 100644 --- a/includes/CategoryFinder.php +++ b/includes/CategoryFinder.php @@ -42,6 +42,8 @@ use Wikimedia\Rdbms\IDatabase; * $a = $cf->run(); * print implode( ',' , $a ); * @endcode + * + * @deprecated since 1.31 */ class CategoryFinder { /** @var int[] The original article IDs passed to the seed function */ diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index f31238acb2..35b821cfa0 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -6954,11 +6954,6 @@ $wgShowUpdatedMarker = true; */ $wgDisableAnonTalk = false; -/** - * Enable filtering of categories in Recentchanges - */ -$wgAllowCategorizedRecentChanges = false; - /** * Allow filtering by change tag in recentchanges, history, etc * Has no effect if no tags are defined in valid_tag. @@ -7460,6 +7455,7 @@ $wgJobClasses = [ 'clearUserWatchlist' => ClearUserWatchlistJob::class, 'cdnPurge' => CdnPurgeJob::class, 'enqueue' => EnqueueJob::class, // local queue for multi-DC setups + 'userGroupExpiry' => UserGroupExpiryJob::class, 'null' => NullJob::class, ]; diff --git a/includes/DevelopmentSettings.php b/includes/DevelopmentSettings.php new file mode 100644 index 0000000000..96ed56b94d --- /dev/null +++ b/includes/DevelopmentSettings.php @@ -0,0 +1,54 @@ +getService( 'ReadOnlyMode' ); } + /** + * @since 1.31 + * @return \UploadRevisionImporter + */ + public function getWikiRevisionUploadImporter() { + return $this->getService( 'UploadRevisionImporter' ); + } + + /** + * @since 1.31 + * @return \OldRevisionImporter + */ + public function getWikiRevisionOldRevisionImporter() { + return $this->getService( 'OldRevisionImporter' ); + } + + /** + * @since 1.31 + * @return \OldRevisionImporter + */ + public function getWikiRevisionOldRevisionImporterNoUpdates() { + return $this->getService( 'WikiRevisionOldRevisionImporterNoUpdates' ); + } + /** * @since 1.30 * @return CommandFactory diff --git a/includes/Message.php b/includes/Message.php index fac9a59893..7d05f41e86 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -1105,7 +1105,7 @@ class Message implements MessageSpecifier, Serializable { public static function listParam( array $list, $type = 'text' ) { if ( !isset( self::$listTypeMap[$type] ) ) { throw new InvalidArgumentException( - "Invalid type '$type'. Known types are: " . join( ', ', array_keys( self::$listTypeMap ) ) + "Invalid type '$type'. Known types are: " . implode( ', ', array_keys( self::$listTypeMap ) ) ); } return [ 'list' => $list, 'type' => $type ]; diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 8b0452db3d..dab9fb9955 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -442,6 +442,29 @@ return [ ); }, + 'UploadRevisionImporter' => function ( MediaWikiServices $services ) { + return new ImportableUploadRevisionImporter( + $services->getMainConfig()->get( 'EnableUploads' ), + LoggerFactory::getInstance( 'UploadRevisionImporter' ) + ); + }, + + 'OldRevisionImporter' => function ( MediaWikiServices $services ) { + return new ImportableOldRevisionImporter( + true, + LoggerFactory::getInstance( 'OldRevisionImporter' ), + $services->getDBLoadBalancer() + ); + }, + + 'WikiRevisionOldRevisionImporterNoUpdates' => function ( MediaWikiServices $services ) { + return new ImportableOldRevisionImporter( + false, + LoggerFactory::getInstance( 'OldRevisionImporter' ), + $services->getDBLoadBalancer() + ); + }, + 'ShellCommandFactory' => function ( MediaWikiServices $services ) { $config = $services->getMainConfig(); diff --git a/includes/SiteStats.php b/includes/SiteStats.php index 7b2b8d38e2..745c89166b 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -56,13 +56,13 @@ class SiteStats { wfDebug( __METHOD__ . ": reading site_stats from replica DB\n" ); $row = self::doLoadFromDB( $dbr ); - if ( !self::isSane( $row ) && $lb->hasOrMadeRecentMasterChanges() ) { + if ( !self::isRowSane( $row ) && $lb->hasOrMadeRecentMasterChanges() ) { // Might have just been initialized during this request? Underflow? wfDebug( __METHOD__ . ": site_stats damaged or missing on replica DB\n" ); $row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) ); } - if ( !self::isSane( $row ) ) { + if ( !self::isRowSane( $row ) ) { if ( $config->get( 'MiserMode' ) ) { // Start off with all zeroes, assuming that this is a new wiki or any // repopulations where done manually via script. @@ -79,35 +79,22 @@ class SiteStats { $row = self::doLoadFromDB( $lb->getConnection( DB_MASTER ) ); } - if ( !self::isSane( $row ) ) { + if ( !self::isRowSane( $row ) ) { wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" ); // Always return a row-like object - $row = (object)array_fill_keys( self::selectFields(), 0 ); + $row = self::salvageInsaneRow( $row ); } return $row; } - /** - * @param IDatabase $db - * @return stdClass|bool - */ - private static function doLoadFromDB( IDatabase $db ) { - return $db->selectRow( - 'site_stats', - self::selectFields(), - [ 'ss_row_id' => 1 ], - __METHOD__ - ); - } - /** * @return int */ public static function edits() { self::load(); - return self::$row->ss_total_edits; + return (int)self::$row->ss_total_edits; } /** @@ -116,7 +103,7 @@ class SiteStats { public static function articles() { self::load(); - return self::$row->ss_good_articles; + return (int)self::$row->ss_good_articles; } /** @@ -125,7 +112,7 @@ class SiteStats { public static function pages() { self::load(); - return self::$row->ss_total_pages; + return (int)self::$row->ss_total_pages; } /** @@ -134,7 +121,7 @@ class SiteStats { public static function users() { self::load(); - return self::$row->ss_users; + return (int)self::$row->ss_users; } /** @@ -143,7 +130,7 @@ class SiteStats { public static function activeUsers() { self::load(); - return self::$row->ss_active_users; + return (int)self::$row->ss_active_users; } /** @@ -152,7 +139,7 @@ class SiteStats { public static function images() { self::load(); - return self::$row->ss_images; + return (int)self::$row->ss_images; } /** @@ -245,6 +232,19 @@ class SiteStats { ]; } + /** + * @param IDatabase $db + * @return stdClass|bool + */ + private static function doLoadFromDB( IDatabase $db ) { + return $db->selectRow( + 'site_stats', + self::selectFields(), + [ 'ss_row_id' => 1 ], + __METHOD__ + ); + } + /** * Is the provided row of site stats sane, or should it be regenerated? * @@ -253,7 +253,7 @@ class SiteStats { * @param bool|object $row * @return bool */ - private static function isSane( $row ) { + private static function isRowSane( $row ) { if ( $row === false || $row->ss_total_pages < $row->ss_good_articles || $row->ss_total_edits < $row->ss_total_pages @@ -268,7 +268,7 @@ class SiteStats { 'ss_users', 'ss_images', ] as $member ) { - if ( $row->$member > 2000000000 || $row->$member < 0 ) { + if ( $row->$member < 0 ) { return false; } } @@ -276,6 +276,22 @@ class SiteStats { return true; } + /** + * @param stdClass|bool $row + * @return stdClass + */ + private static function salvageInsaneRow( $row ) { + $map = $row ? (array)$row : []; + // Fill in any missing values with zero + $map += array_fill_keys( self::selectFields(), 0 ); + // Convert negative values to zero + foreach ( $map as $field => $value ) { + $map[$field] = max( 0, $value ); + } + + return (object)$row; + } + /** * @return LoadBalancer */ diff --git a/includes/SiteStatsInit.php b/includes/SiteStatsInit.php index f8886909a9..f527cb226b 100644 --- a/includes/SiteStatsInit.php +++ b/includes/SiteStatsInit.php @@ -198,9 +198,12 @@ class SiteStatsInit { /** * @param int $index + * @param string[] $groups * @return IDatabase */ - private static function getDB( $index ) { - return MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection( $index ); + private static function getDB( $index, $groups = [] ) { + $lb = MediaWikiServices::getInstance()->getDBLoadBalancer(); + + return $lb->getConnection( $index, $groups ); } } diff --git a/includes/Storage/RevisionStore.php b/includes/Storage/RevisionStore.php index e7c9060411..2992211630 100644 --- a/includes/Storage/RevisionStore.php +++ b/includes/Storage/RevisionStore.php @@ -740,8 +740,6 @@ class RevisionStore if ( isset( $row->rev_text_id ) && $row->rev_text_id > 0 ) { $mainSlotRow->cont_address = 'tt:' . $row->rev_text_id; - } elseif ( isset( $row->ar_id ) ) { - $mainSlotRow->cont_address = 'ar:' . $row->ar_id; } if ( isset( $row->old_text ) ) { diff --git a/includes/Storage/SqlBlobStore.php b/includes/Storage/SqlBlobStore.php index 031cb587ed..b890e5acaa 100644 --- a/includes/Storage/SqlBlobStore.php +++ b/includes/Storage/SqlBlobStore.php @@ -299,7 +299,6 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { list( $schema, $id, ) = self::splitBlobAddress( $blobAddress ); //TODO: MCR: also support 'ex' schema with ExternalStore URLs, plus flags encoded in the URL! - //TODO: MCR: also support 'ar' schema for content blobs in old style archive rows! if ( $schema === 'tt' ) { $textId = intval( $id ); } else { diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index 62d73f480c..228d319f18 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -897,7 +897,7 @@ abstract class ApiBase extends ContextSource { if ( $badParams ) { $this->dieWithError( - [ 'apierror-mustpostparams', join( ', ', $badParams ), count( $badParams ) ] + [ 'apierror-mustpostparams', implode( ', ', $badParams ), count( $badParams ) ] ); } } @@ -1152,7 +1152,7 @@ abstract class ApiBase extends ContextSource { if ( $multi ) { // This loses the potential $wgContLang->checkTitleEncoding() transformation // done by WebRequest for $_GET. Let's call that a feature. - $value = join( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) ); + $value = implode( "\x1f", $request->normalizeUnicode( explode( "\x1f", $rawValue ) ) ); } else { $this->dieWithError( 'apierror-badvalue-notmultivalue', 'badvalue_notmultivalue' ); } @@ -1829,7 +1829,7 @@ abstract class ApiBase extends ContextSource { $msgs = [ $this->msg( 'api-usage-mailinglist-ref' ) ]; Hooks::run( 'ApiDeprecationHelp', [ &$msgs ] ); if ( count( $msgs ) > 1 ) { - $key = '$' . join( ' $', range( 1, count( $msgs ) ) ); + $key = '$' . implode( ' $', range( 1, count( $msgs ) ) ); $msg = ( new RawMessage( $key ) )->params( $msgs ); } else { $msg = reset( $msgs ); diff --git a/includes/api/ApiFeedRecentChanges.php b/includes/api/ApiFeedRecentChanges.php index 2a80dd5354..e5dba8fe4a 100644 --- a/includes/api/ApiFeedRecentChanges.php +++ b/includes/api/ApiFeedRecentChanges.php @@ -169,16 +169,6 @@ class ApiFeedRecentChanges extends ApiBase { 'showlinkedto' => false, ]; - if ( $config->get( 'AllowCategorizedRecentChanges' ) ) { - $ret += [ - 'categories' => [ - ApiBase::PARAM_TYPE => 'string', - ApiBase::PARAM_ISMULTI => true, - ], - 'categories_any' => false, - ]; - } - return $ret; } diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index 008015b881..a7e3c1bd54 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -593,7 +593,7 @@ class ApiMain extends ApiBase { $this->setCacheMode( 'private' ); $response = $this->getRequest()->response(); - $headerStr = 'MediaWiki-API-Error: ' . join( ', ', $errCodes ); + $headerStr = 'MediaWiki-API-Error: ' . implode( ', ', $errCodes ); $response->header( $headerStr ); // Reset and print just the error message diff --git a/includes/api/i18n/ar.json b/includes/api/i18n/ar.json index 57d4b05200..f07c6e2dcb 100644 --- a/includes/api/i18n/ar.json +++ b/includes/api/i18n/ar.json @@ -160,8 +160,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.", "apihelp-feedrecentchanges-param-target": "أحدث التغييرات في الصفحات الموصولة من هذه الصفحة فقط", "apihelp-feedrecentchanges-param-showlinkedto": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك", - "apihelp-feedrecentchanges-param-categories": "أظهر التغييرات في الصفحات في كل تصنيف من هذه التصنيفات فقط.", - "apihelp-feedrecentchanges-param-categories_any": "أظهر التغييرات في الصفحات في أي تصنيف بدلا من ذلك.", "apihelp-feedrecentchanges-example-simple": " اظهر التغييرات الحديثة", "apihelp-feedrecentchanges-example-30days": "أظهر التغييرات الأخيرة في 30 يوم.", "apihelp-feedwatchlist-summary": "إرجاع تغذية قائمة المراقبة.", diff --git a/includes/api/i18n/ba.json b/includes/api/i18n/ba.json index da8535d6d6..99421fed90 100644 --- a/includes/api/i18n/ba.json +++ b/includes/api/i18n/ba.json @@ -153,8 +153,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Тэг буйынса һөҙгөс", "apihelp-feedrecentchanges-param-target": "Был биттән һылтанған биттәрҙә һуңғы үҙгәртеүҙәрҙе күрһәтергә", "apihelp-feedrecentchanges-param-showlinkedto": "Киреһенсә, был биткә һылтанма яһаған биттәрҙәге үҙгәртеүҙәрҙе күрһәтергә", - "apihelp-feedrecentchanges-param-categories": "Бар категория биттәрендәге үҙгәрештәрҙе генә күрһәтергә", - "apihelp-feedrecentchanges-param-categories_any": "Был категориянан башҡа теләһә ҡайһы категориялар биттәрендәге үҙгәрештәрҙе генә күрһәтергә", "apihelp-feedrecentchanges-example-simple": "Һуңғы үҙгәртеүҙәрҙе күрһәтергә.", "apihelp-feedrecentchanges-example-30days": "30 көн арауығындағы һуңғы үҙгәртеүҙәрҙе күрһәтергә.", "apihelp-feedwatchlist-summary": "Күҙәтеү каналын ҡайтара", diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index 37a259d52e..bbee4fa6ef 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -184,8 +184,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.", "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.", "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.", - "apihelp-feedrecentchanges-param-categories": "Zeigt nur Änderungen von Seiten in all diesen Kategorien.", - "apihelp-feedrecentchanges-param-categories_any": "Zeigt stattdessen nur Änderungen auf Seiten in einer dieser Kategorien.", "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen", "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen", "apihelp-feedwatchlist-summary": "Gibt einen Beobachtungslisten-Feed zurück.", diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index 168901971b..8d7a61c9ec 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -211,8 +211,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.", "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.", "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.", - "apihelp-feedrecentchanges-param-categories": "Show only changes on pages in all of these categories.", - "apihelp-feedrecentchanges-param-categories_any": "Show only changes on pages in any of the categories instead.", "apihelp-feedrecentchanges-example-simple": "Show recent changes.", "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.", diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json index d2aaa7710d..7cbf1e1169 100644 --- a/includes/api/i18n/es.json +++ b/includes/api/i18n/es.json @@ -206,8 +206,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.", "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.", - "apihelp-feedrecentchanges-param-categories": "Mostrar sólo cambios en las páginas en todas estas categorías.", - "apihelp-feedrecentchanges-param-categories_any": "Mostrar sólo cambios en las páginas en cualquiera de las categorías en lugar.", "apihelp-feedrecentchanges-example-simple": "Mostrar los cambios recientes.", "apihelp-feedrecentchanges-example-30days": "Mostrar los cambios recientes limitados a 30 días.", "apihelp-feedwatchlist-summary": "Devuelve el suministro de una lista de seguimiento.", diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index 3e5fb41913..4c3b74d193 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -222,8 +222,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.", "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.", "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.", - "apihelp-feedrecentchanges-param-categories": "Afficher uniquement les modifications sur les pages dans toutes ces catégories", - "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.", "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes", "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours", "apihelp-feedwatchlist-summary": "Renvoie un flux de liste de suivi.", diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json index 6b01875cc2..4c66794c79 100644 --- a/includes/api/i18n/gl.json +++ b/includes/api/i18n/gl.json @@ -189,8 +189,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.", "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.", - "apihelp-feedrecentchanges-param-categories": "Só mostrar cambios en páxinas pertencentes a todas estas categorías.", - "apihelp-feedrecentchanges-param-categories_any": "Só mostrar cambios en páxinas pertencentes a calquera das categorías.", "apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes", "apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días", "apihelp-feedwatchlist-summary": "Devolve o fluxo dunha lista de vixiancia.", diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index 2e689461ad..2064b7b652 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -205,8 +205,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.", "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.", "apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.", - "apihelp-feedrecentchanges-param-categories": "להציג רק שינויים בדפים בכל הקטגוריות האלו.", - "apihelp-feedrecentchanges-param-categories_any": "להציג רק שינויים בדפים בכל הקטגוריות במקום.", "apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.", "apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.", "apihelp-feedwatchlist-summary": "החזרת הזנת רשימת מעקב.", diff --git a/includes/api/i18n/hu.json b/includes/api/i18n/hu.json index 7c03097460..f6f813d452 100644 --- a/includes/api/i18n/hu.json +++ b/includes/api/i18n/hu.json @@ -158,8 +158,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.", "apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.", "apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.", - "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.", - "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.", "apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.", "apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.", "apihelp-feedwatchlist-summary": "A figyelőlista lekérése hírcsatornaként.", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index 25da0e6e4b..66b09428a1 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -142,8 +142,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.", "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.", - "apihelp-feedrecentchanges-param-categories": "Mostra solo le variazioni sulle pagine di tutte queste categorie.", - "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo le variazioni sulle pagine in una qualunque categoria.", "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.", "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.", "apihelp-feedwatchlist-param-feedformat": "Il formato del feed.", diff --git a/includes/api/i18n/ksh.json b/includes/api/i18n/ksh.json index 1ed917a784..b0231df904 100644 --- a/includes/api/i18n/ksh.json +++ b/includes/api/i18n/ksh.json @@ -152,8 +152,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Noh Makkehronge beschängke.", "apihelp-feedrecentchanges-param-target": "Zeijsch Änderonge aan Sigge, op di vun heh dä Sigg ene Lengk jeihd.", "apihelp-feedrecentchanges-param-showlinkedto": "Zeijsch Änderonge aan Sigge, op di vun dä ußjesöhk Sigg ene Lengk jeihd.", - "apihelp-feedrecentchanges-param-categories": "Donn blohß de Änderonge aan de Zohjehüreshkeit för all heh di Saachjroppe zeije.", - "apihelp-feedrecentchanges-param-categories_any": "Donn deföhr blohß de Änderonge aan de Zohjehüreshkeit för öhndseijn fun heh dä Saachjroppe zeije.", "apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}", "apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.", "apihelp-feedwatchlist-summary": "Donn ene Kannahl met dä Oppaßleß zerökjävve.", diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json index fc2c789a9f..d2c759378c 100644 --- a/includes/api/i18n/lb.json +++ b/includes/api/i18n/lb.json @@ -52,8 +52,6 @@ "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.", "apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.", "apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.", - "apihelp-feedrecentchanges-param-categories": "Nëmmen Ännerunge vu Säiten aus all dëse Kategorië weisen.", - "apihelp-feedrecentchanges-param-categories_any": "Nëmmen Ännerunge vu Säiten aus enger vun dëse Kategorië weisen.", "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen", "apihelp-filerevert-param-comment": "Bemierkung eroplueden.", "apihelp-help-example-main": "Hëllef fir den Haaptmodul.", diff --git a/includes/api/i18n/lt.json b/includes/api/i18n/lt.json index 6f4c6a32b7..9d39405b06 100644 --- a/includes/api/i18n/lt.json +++ b/includes/api/i18n/lt.json @@ -72,8 +72,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtruoti pagal žymę.", "apihelp-feedrecentchanges-param-target": "Rodyti tik keitimus puslapiuose, pasiekiamuose iš šio puslapio.", "apihelp-feedrecentchanges-param-showlinkedto": "Vietoj to, rodyti pakeitimus puslapyje, susietame su pasirinktu puslapiu.", - "apihelp-feedrecentchanges-param-categories": "Rodyti pakeitimus tik puslapiuose, esančiuose visuose šiuose kategorijose.", - "apihelp-feedrecentchanges-param-categories_any": "Vietoj to, rodyti tik pakeitimus puslapiuse, esančiuose bet kurioje iš kategorijų.", "apihelp-feedrecentchanges-example-simple": "Parodyti naujausius keitimus.", "apihelp-feedrecentchanges-example-30days": "Rodyti naujausius pakeitimus per 30 dienų.", "apihelp-feedwatchlist-summary": "Gražina stebimųjų sąrašo srautą.", diff --git a/includes/api/i18n/mk.json b/includes/api/i18n/mk.json index a0129009c6..3cec5d49bb 100644 --- a/includes/api/i18n/mk.json +++ b/includes/api/i18n/mk.json @@ -147,8 +147,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.", "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.", "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.", - "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.", - "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.", "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени", "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена", "apihelp-feedwatchlist-summary": "Дава тековник со набљудуваните.", diff --git a/includes/api/i18n/nb.json b/includes/api/i18n/nb.json index dc9fb1169c..c2fea1c0ec 100644 --- a/includes/api/i18n/nb.json +++ b/includes/api/i18n/nb.json @@ -188,8 +188,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrer etter tagger.", "apihelp-feedrecentchanges-param-target": "Vis bare endringer på sider som lenkes fra denne siden.", "apihelp-feedrecentchanges-param-showlinkedto": "Vis endringer på sider som lenker til den valgte siden i stedet.", - "apihelp-feedrecentchanges-param-categories": "Vis bare endringer på sider i alle disse kategoriene.", - "apihelp-feedrecentchanges-param-categories_any": "Vis bare endringer på sider som er i noen av kategoriene i stedet.", "apihelp-feedrecentchanges-example-simple": "Vis siste endringer.", "apihelp-feedrecentchanges-example-30days": "Vis siste endringer for 30 døgn.", "apihelp-feedwatchlist-summary": "Returnerer en overvåkningslistemating.", diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json index 6c311d0118..8591ebae10 100644 --- a/includes/api/i18n/pl.json +++ b/includes/api/i18n/pl.json @@ -149,8 +149,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtruj po znacznikach.", "apihelp-feedrecentchanges-param-target": "Pokaż tylko zmiany na stronach linkowanych z tej strony.", "apihelp-feedrecentchanges-param-showlinkedto": "Pokaż zmiany na stronach linkujących do wybranej strony.", - "apihelp-feedrecentchanges-param-categories": "Pokaż zmiany tylko na stronach będących we wszystkich tych kategoriach.", - "apihelp-feedrecentchanges-param-categories_any": "Pokaż zmiany tylko na stronach będących w jednej z tych kategorii.", "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.", "apihelp-feedrecentchanges-example-30days": "Pokaż ostatnie zmiany z 30 dni.", "apihelp-feedwatchlist-summary": "Zwraca kanał listy obserwowanych.", diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json index 408b4196c8..fec224e38f 100644 --- a/includes/api/i18n/pt-br.json +++ b/includes/api/i18n/pt-br.json @@ -205,8 +205,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.", "apihelp-feedrecentchanges-param-target": "Mostrar apenas as alterações nas páginas vinculadas por esta página.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostra as alterações nas páginas vigiadas à página selecionada.", - "apihelp-feedrecentchanges-param-categories": "Mostre apenas as alterações em páginas em todas essas categorias.", - "apihelp-feedrecentchanges-param-categories_any": "Mostre apenas as alterações em páginas em qualquer uma das categorias.", "apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.", "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.", "apihelp-feedwatchlist-summary": "Retornar um feed da lista de páginas vigiadas.", diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json index aa697fbdb9..c18160a521 100644 --- a/includes/api/i18n/pt.json +++ b/includes/api/i18n/pt.json @@ -201,8 +201,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.", "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar mudanças em páginas com hiperligações para a página selecionada.", - "apihelp-feedrecentchanges-param-categories": "Mostrar apenas mudanças nas páginas que estão em todas estas categorias.", - "apihelp-feedrecentchanges-param-categories_any": "Mostrar apenas mudanças nas páginas que estão em qualquer uma das categorias.", "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes.", "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes de 30 dias.", "apihelp-feedwatchlist-summary": "Devolve um ''feed'' das páginas vigiadas.", @@ -366,6 +364,7 @@ "apihelp-parse-param-disablepp": "Em vez deste, usar $1disablelimitreport.", "apihelp-parse-param-disableeditsection": "Omitir as hiperligações para edição da secção no resultado da análise sintática.", "apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.", + "apihelp-parse-param-disablestylededuplication": "Não desduplica as folhas de estilo incluídas na saída do analisador sintático.", "apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo $1; substituído por $2prop=parsetree).", "apihelp-parse-param-preview": "Executar a análise em modo de antevisão.", "apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).", diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json index e76988058b..fc0de4e333 100644 --- a/includes/api/i18n/qqq.json +++ b/includes/api/i18n/qqq.json @@ -206,8 +206,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}", "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}", "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}", - "apihelp-feedrecentchanges-param-categories": "{{doc-apihelp-param|feedrecentchanges|categories}}", - "apihelp-feedrecentchanges-param-categories_any": "{{doc-apihelp-param|feedrecentchanges|categories_any}}", "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}", "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}", "apihelp-feedwatchlist-summary": "{{doc-apihelp-summary|feedwatchlist}}", diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json index 9ee35274fc..215e2ffe43 100644 --- a/includes/api/i18n/ru.json +++ b/includes/api/i18n/ru.json @@ -219,8 +219,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Фильтр по меткам.", "apihelp-feedrecentchanges-param-target": "Показать только правки на страницах, на которые ссылается данная.", "apihelp-feedrecentchanges-param-showlinkedto": "Показать правки на страницах, ссылающихся на данную.", - "apihelp-feedrecentchanges-param-categories": "Показать только правки на страницах, включённых во все данные категории.", - "apihelp-feedrecentchanges-param-categories_any": "Показать только правки на страницах, включённых в хотя бы одну из данных категорий.", "apihelp-feedrecentchanges-example-simple": "Список последних изменений.", "apihelp-feedrecentchanges-example-30days": "Список последних изменений за 30 дней.", "apihelp-feedwatchlist-summary": "Возвращает ленту списка наблюдения.", diff --git a/includes/api/i18n/sv.json b/includes/api/i18n/sv.json index 8e5228a7d4..e4cff6a90b 100644 --- a/includes/api/i18n/sv.json +++ b/includes/api/i18n/sv.json @@ -170,8 +170,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.", "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.", "apihelp-feedrecentchanges-param-showlinkedto": "Visa ändringarna på sidor som är länkade till den valda sidan i stället.", - "apihelp-feedrecentchanges-param-categories": "Visa endast ändringar på sidor i alla dessa kategorier.", - "apihelp-feedrecentchanges-param-categories_any": "Visa endast ändringar på sidor i någon av kategorierna istället.", "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar", "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn", "apihelp-feedwatchlist-summary": "Returnerar ett flöde från bevakningslistan.", diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json index ca0b0a89bc..f55f65e397 100644 --- a/includes/api/i18n/uk.json +++ b/includes/api/i18n/uk.json @@ -203,8 +203,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.", "apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.", "apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.", - "apihelp-feedrecentchanges-param-categories": "Показати лише зміни сторінок у всіх цих категоріях.", - "apihelp-feedrecentchanges-param-categories_any": "Показати натомість лише зміни на сторінках у будь-якій з цих категорій.", "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.", "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.", "apihelp-feedwatchlist-summary": "Видає стрічку списку спостереження.", diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json index d09ccad6dc..5eec830c20 100644 --- a/includes/api/i18n/zh-hans.json +++ b/includes/api/i18n/zh-hans.json @@ -215,8 +215,6 @@ "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。", "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。", "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。", - "apihelp-feedrecentchanges-param-categories": "只显示所有这些分类中的页面上的更改。", - "apihelp-feedrecentchanges-param-categories_any": "只显示这些分类以外页面的更改。", "apihelp-feedrecentchanges-example-simple": "显示最近更改。", "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改。", "apihelp-feedwatchlist-summary": "返回监视列表纲要。", diff --git a/includes/auth/AuthPluginPrimaryAuthenticationProvider.php b/includes/auth/AuthPluginPrimaryAuthenticationProvider.php index b8e36bc4f3..cd0734d847 100644 --- a/includes/auth/AuthPluginPrimaryAuthenticationProvider.php +++ b/includes/auth/AuthPluginPrimaryAuthenticationProvider.php @@ -272,7 +272,7 @@ class AuthPluginPrimaryAuthenticationProvider if ( $failed ) { throw new \UnexpectedValueException( "AuthPlugin failed to reset password for $username in the following domains: " - . join( ' ', $failed ) + . implode( ' ', $failed ) ); } } diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index d5ff6cbc9a..71fcd8bde5 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -300,7 +300,7 @@ class MessageCache { } if ( !$success ) { - $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Key in memc for messages + $cacheKey = $this->clusterCache->makeKey( 'messages', $code ); # Try the global cache. If it is empty, try to acquire a lock. If # the lock can't be acquired, wait for the other thread to finish # and then try the global cache a second time. @@ -613,7 +613,7 @@ class MessageCache { // load() calls do try to refresh the cache with replica DB data $this->mCache[$code]['LATEST'] = time(); // Pre-emptively update the local datacenter cache so things like edit filter and - // blacklist changes are reflect immediately, as these often use MediaWiki: pages. + // blacklist changes are reflected immediately; these often use MediaWiki: pages. // The datacenter handling replace() calls should be the same one handling edits // as they require HTTP POST. $this->saveToCaches( $this->mCache[$code], 'all', $code ); @@ -622,19 +622,7 @@ class MessageCache { // Relay the purge. Touching this check key expires cache contents // and local cache (APC) validation hash across all datacenters. - $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) ); - // Also delete cached sidebar... just in case it is affected - // @TODO: shouldn't this be $code === $wgLanguageCode? - if ( $code === 'en' ) { - // Purge all language sidebars, e.g. on ?action=purge to the sidebar messages - $codes = array_keys( Language::fetchLanguageNames() ); - } else { - // Purge only the sidebar for this language - $codes = [ $code ]; - } - foreach ( $codes as $code ) { - $this->wanCache->delete( $this->wanCache->makeKey( 'sidebar', $code ) ); - } + $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) ); // Purge the message in the message blob store $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader(); @@ -701,7 +689,7 @@ class MessageCache { $value = $this->wanCache->get( $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ), $curTTL, - [ $this->wanCache->makeKey( 'messages', $code ) ] + [ $this->getCheckKey( $code ) ] ); if ( $value ) { @@ -906,7 +894,7 @@ class MessageCache { if ( $useDB ) { $uckey = $wgContLang->ucfirst( $lckey ); - if ( !isset( $alreadyTried[ $langcode ] ) ) { + if ( !isset( $alreadyTried[$langcode] ) ) { $message = $this->getMsgFromNamespace( $this->getMessagePageName( $langcode, $uckey ), $langcode @@ -915,7 +903,7 @@ class MessageCache { if ( $message !== false ) { return $message; } - $alreadyTried[ $langcode ] = true; + $alreadyTried[$langcode] = true; } } else { $uckey = null; @@ -932,7 +920,7 @@ class MessageCache { $fallbackChain = Language::getFallbacksFor( $langcode ); foreach ( $fallbackChain as $code ) { - if ( isset( $alreadyTried[ $code ] ) ) { + if ( isset( $alreadyTried[$code] ) ) { continue; } @@ -942,7 +930,7 @@ class MessageCache { if ( $message !== false ) { return $message; } - $alreadyTried[ $code ] = true; + $alreadyTried[$code] = true; } } @@ -985,13 +973,12 @@ class MessageCache { if ( isset( $this->mCache[$code][$title] ) ) { $entry = $this->mCache[$code][$title]; if ( substr( $entry, 0, 1 ) === ' ' ) { - // The message exists, so make sure a string is returned. + // The message exists and is not '!TOO BIG' return (string)substr( $entry, 1 ); } elseif ( $entry === '!NONEXISTENT' ) { return false; - } elseif ( $entry === '!TOO BIG' ) { - // Fall through and try invididual message cache below } + // Fall through and try invididual message cache below } else { // XXX: This is not cached in process cache, should it? $message = false; @@ -1077,11 +1064,11 @@ class MessageCache { /** * @param string $message * @param bool $interface - * @param string $language Language code + * @param Language $language * @param Title $title * @return string */ - function transform( $message, $interface = false, $language = null, $title = null ) { + public function transform( $message, $interface = false, $language = null, $title = null ) { // Avoid creating parser if nothing to transform if ( strpos( $message, '{{' ) === false ) { return $message; @@ -1110,7 +1097,7 @@ class MessageCache { /** * @return Parser */ - function getParser() { + public function getParser() { global $wgParser, $wgParserConf; if ( !$this->mParser && isset( $wgParser ) ) { @@ -1174,11 +1161,11 @@ class MessageCache { return $res; } - function disable() { + public function disable() { $this->mDisable = true; } - function enable() { + public function enable() { $this->mDisable = false; } @@ -1199,13 +1186,14 @@ class MessageCache { } /** - * Clear all stored messages. Mainly used after a mass rebuild. + * Clear all stored messages in global and local cache + * + * Mainly used after a mass rebuild */ function clear() { $langs = Language::fetchLanguageNames( null, 'mw' ); foreach ( array_keys( $langs ) as $code ) { - # Global and local caches - $this->wanCache->touchCheckKey( $this->wanCache->makeKey( 'messages', $code ) ); + $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) ); } $this->mLoadedLanguages = []; @@ -1283,6 +1271,14 @@ class MessageCache { } } + /** + * @param string $code Language code + * @return string WAN cache key usable as a "check key" against language page edits + */ + public function getCheckKey( $code ) { + return $this->wanCache->makeKey( 'messages', $code ); + } + /** * @param Content|null $content Content or null if the message page does not exist * @return string|bool|null Returns false if $content is null and null on error diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index 7e4dd006ac..b30b82df1d 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -181,6 +181,28 @@ class ChangeTags { return $msg; } + /** + * Get truncated message for the tag's long description. + * + * @param string $tag Tag name. + * @param int $length Maximum length of truncated message, including ellipsis. + * @param IContextSource $context + * + * @return string Truncated long tag description. + */ + public static function truncateTagDescription( $tag, $length, IContextSource $context ) { + $originalDesc = self::tagLongDescriptionMessage( $tag, $context ); + // If there is no tag description, return empty string + if ( !$originalDesc ) { + return ''; + } + + $taglessDesc = Sanitizer::stripAllTags( $originalDesc->parse() ); + $escapedDesc = Sanitizer::escapeHtmlAllowEntities( $taglessDesc ); + + return $context->getLanguage()->truncateForVisual( $escapedDesc, $length ); + } + /** * Add tags to a change given its rc_id, rev_id and/or log_id * diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index eb28b30138..156e315833 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -61,7 +61,7 @@ class DatabaseOracle extends Database { } function __destruct() { - if ( $this->mOpened ) { + if ( $this->opened ) { Wikimedia\suppressWarnings(); $this->close(); Wikimedia\restoreWarnings(); @@ -100,21 +100,21 @@ class DatabaseOracle extends Database { } $this->close(); - $this->mUser = $user; - $this->mPassword = $password; + $this->user = $user; + $this->password = $password; // changed internal variables functions // mServer now holds the TNS endpoint // mDBname is schema name if different from username if ( !$server ) { // backward compatibillity (server used to be null and TNS was supplied in dbname) - $this->mServer = $dbName; - $this->mDBname = $user; + $this->server = $dbName; + $this->dbName = $user; } else { - $this->mServer = $server; + $this->server = $server; if ( !$dbName ) { - $this->mDBname = $user; + $this->dbName = $user; } else { - $this->mDBname = $dbName; + $this->dbName = $dbName; } } @@ -126,53 +126,53 @@ class DatabaseOracle extends Database { $this->setFlag( DBO_PERSISTENT ); } - $session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT; + $session_mode = $this->flags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT; Wikimedia\suppressWarnings(); - if ( $this->mFlags & DBO_PERSISTENT ) { - $this->mConn = oci_pconnect( - $this->mUser, - $this->mPassword, - $this->mServer, + if ( $this->flags & DBO_PERSISTENT ) { + $this->conn = oci_pconnect( + $this->user, + $this->password, + $this->server, $this->defaultCharset, $session_mode ); - } elseif ( $this->mFlags & DBO_DEFAULT ) { - $this->mConn = oci_new_connect( - $this->mUser, - $this->mPassword, - $this->mServer, + } elseif ( $this->flags & DBO_DEFAULT ) { + $this->conn = oci_new_connect( + $this->user, + $this->password, + $this->server, $this->defaultCharset, $session_mode ); } else { - $this->mConn = oci_connect( - $this->mUser, - $this->mPassword, - $this->mServer, + $this->conn = oci_connect( + $this->user, + $this->password, + $this->server, $this->defaultCharset, $session_mode ); } Wikimedia\restoreWarnings(); - if ( $this->mUser != $this->mDBname ) { + if ( $this->user != $this->dbName ) { // change current schema in session - $this->selectDB( $this->mDBname ); + $this->selectDB( $this->dbName ); } - if ( !$this->mConn ) { + if ( !$this->conn ) { throw new DBConnectionError( $this, $this->lastError() ); } - $this->mOpened = true; + $this->opened = true; # removed putenv calls because they interfere with the system globaly $this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' ); $this->doQuery( 'ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT=\'DD-MM-YYYY HH24:MI:SS.FF6\'' ); $this->doQuery( 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=\'.,\'' ); - return $this->mConn; + return $this->conn; } /** @@ -181,11 +181,11 @@ class DatabaseOracle extends Database { * @return bool */ protected function closeConnection() { - return oci_close( $this->mConn ); + return oci_close( $this->conn ); } function execFlags() { - return $this->mTrxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS; + return $this->trxLevel ? OCI_NO_AUTO_COMMIT : OCI_COMMIT_ON_SUCCESS; } protected function doQuery( $sql ) { @@ -217,9 +217,9 @@ class DatabaseOracle extends Database { Wikimedia\suppressWarnings(); - $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ); + $this->mLastResult = $stmt = oci_parse( $this->conn, $sql ); if ( $stmt === false ) { - $e = oci_error( $this->mConn ); + $e = oci_error( $this->conn ); $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ ); return false; @@ -335,20 +335,20 @@ class DatabaseOracle extends Database { } function lastError() { - if ( $this->mConn === false ) { + if ( $this->conn === false ) { $e = oci_error(); } else { - $e = oci_error( $this->mConn ); + $e = oci_error( $this->conn ); } return $e['message']; } function lastErrno() { - if ( $this->mConn === false ) { + if ( $this->conn === false ) { $e = oci_error(); } else { - $e = oci_error( $this->mConn ); + $e = oci_error( $this->conn ); } return $e['code']; @@ -470,9 +470,9 @@ class DatabaseOracle extends Database { } $sql .= ')'; - $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ); + $this->mLastResult = $stmt = oci_parse( $this->conn, $sql ); if ( $stmt === false ) { - $e = oci_error( $this->mConn ); + $e = oci_error( $this->conn ); $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ ); return false; @@ -502,7 +502,7 @@ class DatabaseOracle extends Database { } } else { /** @var OCI_Lob[] $lob */ - $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ); + $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB ); if ( $lob[$col] === false ) { $e = oci_error( $stmt ); throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] ); @@ -545,8 +545,8 @@ class DatabaseOracle extends Database { } } - if ( !$this->mTrxLevel ) { - oci_commit( $this->mConn ); + if ( !$this->trxLevel ) { + oci_commit( $this->conn ); } return oci_free_statement( $stmt ); @@ -658,13 +658,13 @@ class DatabaseOracle extends Database { FROM all_sequences asq, all_tab_columns atc WHERE decode( atc.table_name, - '{$this->mTablePrefix}MWUSER', - '{$this->mTablePrefix}USER', + '{$this->tablePrefix}MWUSER', + '{$this->tablePrefix}USER', atc.table_name ) || '_' || - atc.column_name || '_SEQ' = '{$this->mTablePrefix}' || asq.sequence_name - AND asq.sequence_owner = upper('{$this->mDBname}') - AND atc.owner = upper('{$this->mDBname}')" ); + atc.column_name || '_SEQ' = '{$this->tablePrefix}' || asq.sequence_name + AND asq.sequence_owner = upper('{$this->dbName}') + AND atc.owner = upper('{$this->dbName}')" ); while ( ( $row = $result->fetchRow() ) !== false ) { $this->sequenceData[$row[1]] = [ @@ -730,9 +730,9 @@ class DatabaseOracle extends Database { $newName = strtoupper( $newName ); $oldName = strtoupper( $oldName ); - $tabName = substr( $newName, strlen( $this->mTablePrefix ) ); + $tabName = substr( $newName, strlen( $this->tablePrefix ) ); $oldPrefix = substr( $oldName, 0, strlen( $oldName ) - strlen( $tabName ) ); - $newPrefix = strtoupper( $this->mTablePrefix ); + $newPrefix = strtoupper( $this->tablePrefix ); return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', " . "'$oldPrefix', '$newPrefix', $temporary ); END;" ); @@ -744,7 +744,7 @@ class DatabaseOracle extends Database { $listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\''; } - $owner = strtoupper( $this->mDBname ); + $owner = strtoupper( $this->dbName ); $result = $this->doQuery( "SELECT table_name FROM all_tables " . "WHERE owner='$owner' AND table_name NOT LIKE '%!_IDX\$_' ESCAPE '!' $listWhere" ); @@ -805,7 +805,7 @@ class DatabaseOracle extends Database { ); $row = $rset->fetchRow(); if ( !$row ) { - return oci_server_version( $this->mConn ); + return oci_server_version( $this->conn ); } return $row['version']; @@ -822,7 +822,7 @@ class DatabaseOracle extends Database { $table = $this->tableName( $table ); $table = strtoupper( $this->removeIdentifierQuotes( $table ) ); $index = strtoupper( $index ); - $owner = strtoupper( $this->mDBname ); + $owner = strtoupper( $this->dbName ); $sql = "SELECT 1 FROM all_indexes WHERE owner='$owner' AND index_name='{$table}_{$index}'"; $res = $this->doQuery( $sql ); if ( $res ) { @@ -844,7 +844,7 @@ class DatabaseOracle extends Database { function tableExists( $table, $fname = __METHOD__ ) { $table = $this->tableName( $table ); $table = $this->addQuotes( strtoupper( $this->removeIdentifierQuotes( $table ) ) ); - $owner = $this->addQuotes( strtoupper( $this->mDBname ) ); + $owner = $this->addQuotes( strtoupper( $this->dbName ) ); $sql = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table"; $res = $this->doQuery( $sql ); if ( $res && $res->numRows() > 0 ) { @@ -890,7 +890,7 @@ class DatabaseOracle extends Database { } $fieldInfoStmt = oci_parse( - $this->mConn, + $this->conn, 'SELECT * FROM wiki_field_info_full WHERE table_name ' . $tableWhere . ' and column_name = \'' . $field . '\'' ); @@ -935,25 +935,25 @@ class DatabaseOracle extends Database { } protected function doBegin( $fname = __METHOD__ ) { - $this->mTrxLevel = 1; + $this->trxLevel = 1; $this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' ); } protected function doCommit( $fname = __METHOD__ ) { - if ( $this->mTrxLevel ) { - $ret = oci_commit( $this->mConn ); + if ( $this->trxLevel ) { + $ret = oci_commit( $this->conn ); if ( !$ret ) { throw new DBUnexpectedError( $this, $this->lastError() ); } - $this->mTrxLevel = 0; + $this->trxLevel = 0; $this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' ); } } protected function doRollback( $fname = __METHOD__ ) { - if ( $this->mTrxLevel ) { - oci_rollback( $this->mConn ); - $this->mTrxLevel = 0; + if ( $this->trxLevel ) { + oci_rollback( $this->conn ); + $this->trxLevel = 0; $this->doQuery( 'SET CONSTRAINTS ALL IMMEDIATE' ); } } @@ -1041,12 +1041,12 @@ class DatabaseOracle extends Database { } function selectDB( $db ) { - $this->mDBname = $db; - if ( $db == null || $db == $this->mUser ) { + $this->dbName = $db; + if ( $db == null || $db == $this->user ) { return true; } $sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper( $db ); - $stmt = oci_parse( $this->mConn, $sql ); + $stmt = oci_parse( $this->conn, $sql ); Wikimedia\suppressWarnings(); $success = oci_execute( $stmt ); Wikimedia\restoreWarnings(); @@ -1245,9 +1245,9 @@ class DatabaseOracle extends Database { $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND ); } - $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ); + $this->mLastResult = $stmt = oci_parse( $this->conn, $sql ); if ( $stmt === false ) { - $e = oci_error( $this->mConn ); + $e = oci_error( $this->conn ); $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ ); return false; @@ -1276,7 +1276,7 @@ class DatabaseOracle extends Database { } } else { /** @var OCI_Lob[] $lob */ - $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ); + $lob[$col] = oci_new_descriptor( $this->conn, OCI_D_LOB ); if ( $lob[$col] === false ) { $e = oci_error( $stmt ); throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] ); @@ -1319,8 +1319,8 @@ class DatabaseOracle extends Database { } } - if ( !$this->mTrxLevel ) { - oci_commit( $this->mConn ); + if ( !$this->trxLevel ) { + oci_commit( $this->conn ); } return oci_free_statement( $stmt ); @@ -1340,11 +1340,11 @@ class DatabaseOracle extends Database { } function getDBname() { - return $this->mDBname; + return $this->dbName; } function getServer() { - return $this->mServer; + return $this->server; } public function buildGroupConcatField( diff --git a/includes/deferred/SiteStatsUpdate.php b/includes/deferred/SiteStatsUpdate.php index ad1f172460..2f882b830e 100644 --- a/includes/deferred/SiteStatsUpdate.php +++ b/includes/deferred/SiteStatsUpdate.php @@ -101,9 +101,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { $pd = []; if ( $config->get( 'SiteStatsAsyncFactor' ) ) { // Lock the table so we don't have double DB/memcached updates - if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) - || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout - ) { + if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) { $this->doUpdatePendingDeltas(); return; diff --git a/includes/exception/MWException.php b/includes/exception/MWException.php index 16f226c78f..b3e9422b8d 100644 --- a/includes/exception/MWException.php +++ b/includes/exception/MWException.php @@ -189,7 +189,7 @@ class MWException extends Exception { } elseif ( self::isCommandLine() ) { $message = $this->getText(); // T17602: STDERR may not be available - if ( defined( 'STDERR' ) ) { + if ( !defined( 'MW_PHPUNIT_TEST' ) && defined( 'STDERR' ) ) { fwrite( STDERR, $message ); } else { echo $message; diff --git a/includes/import/ImportableOldRevision.php b/includes/import/ImportableOldRevision.php new file mode 100644 index 0000000000..6d1e24264c --- /dev/null +++ b/includes/import/ImportableOldRevision.php @@ -0,0 +1,68 @@ +doUpdates = $doUpdates; + $this->logger = $logger; + $this->loadBalancer = $loadBalancer; + } + + public function import( ImportableOldRevision $importableRevision, $doUpdates = true ) { + $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER ); + + # Sneak a single revision into place + $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() ); + if ( $user ) { + $userId = intval( $user->getId() ); + $userText = $user->getName(); + } else { + $userId = 0; + $userText = $importableRevision->getUser(); + $user = new User; + } + + // avoid memory leak...? + Title::clearCaches(); + + $page = WikiPage::factory( $importableRevision->getTitle() ); + $page->loadPageData( 'fromdbmaster' ); + if ( !$page->exists() ) { + // must create the page... + $pageId = $page->insertOn( $dbw ); + $created = true; + $oldcountable = null; + } else { + $pageId = $page->getId(); + $created = false; + + // Note: sha1 has been in XML dumps since 2012. If you have an + // older dump, the duplicate detection here won't work. + $prior = $dbw->selectField( 'revision', '1', + [ 'rev_page' => $pageId, + 'rev_timestamp' => $dbw->timestamp( $importableRevision->getTimestamp() ), + 'rev_sha1' => $importableRevision->getSha1Base36() ], + __METHOD__ + ); + if ( $prior ) { + // @todo FIXME: This could fail slightly for multiple matches :P + $this->logger->debug( __METHOD__ . ": skipping existing revision for [[" . + $importableRevision->getTitle()->getPrefixedText() . "]], timestamp " . + $importableRevision->getTimestamp() . "\n" ); + return false; + } + } + + if ( !$pageId ) { + // This seems to happen if two clients simultaneously try to import the + // same page + $this->logger->debug( __METHOD__ . ': got invalid $pageId when importing revision of [[' . + $importableRevision->getTitle()->getPrefixedText() . ']], timestamp ' . + $importableRevision->getTimestamp() . "\n" ); + return false; + } + + // Select previous version to make size diffs correct + // @todo This assumes that multiple revisions of the same page are imported + // in order from oldest to newest. + $prevId = $dbw->selectField( 'revision', 'rev_id', + [ + 'rev_page' => $pageId, + 'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $importableRevision->getTimestamp() ) ), + ], + __METHOD__, + [ 'ORDER BY' => [ + 'rev_timestamp DESC', + 'rev_id DESC', // timestamp is not unique per page + ] + ] + ); + + # @todo FIXME: Use original rev_id optionally (better for backups) + # Insert the row + $revision = new Revision( [ + 'title' => $importableRevision->getTitle(), + 'page' => $pageId, + 'content_model' => $importableRevision->getModel(), + 'content_format' => $importableRevision->getFormat(), + // XXX: just set 'content' => $wikiRevision->getContent()? + 'text' => $importableRevision->getContent()->serialize( $importableRevision->getFormat() ), + 'comment' => $importableRevision->getComment(), + 'user' => $userId, + 'user_text' => $userText, + 'timestamp' => $importableRevision->getTimestamp(), + 'minor_edit' => $importableRevision->getMinor(), + 'parent_id' => $prevId, + ] ); + $revision->insertOn( $dbw ); + $changed = $page->updateIfNewerOn( $dbw, $revision ); + + if ( $changed !== false && $this->doUpdates ) { + $this->logger->debug( __METHOD__ . ": running updates\n" ); + // countable/oldcountable stuff is handled in WikiImporter::finishImportPage + $page->doEditUpdates( + $revision, + $user, + [ 'created' => $created, 'oldcountable' => 'no-change' ] + ); + } + + return true; + } + +} diff --git a/includes/import/ImportableUploadRevision.php b/includes/import/ImportableUploadRevision.php new file mode 100644 index 0000000000..3f60112a0f --- /dev/null +++ b/includes/import/ImportableUploadRevision.php @@ -0,0 +1,68 @@ +enableUploads = $enableUploads; + $this->logger = $logger; + } + + /** + * @return StatusValue + */ + private function newNotOkStatus() { + $statusValue = new StatusValue(); + $statusValue->setOK( false ); + return $statusValue; + } + + public function import( ImportableUploadRevision $importableRevision ) { + # Construct a file + $archiveName = $importableRevision->getArchiveName(); + if ( $archiveName ) { + $this->logger->debug( __METHOD__ . "Importing archived file as $archiveName\n" ); + $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(), + RepoGroup::singleton()->getLocalRepo(), $archiveName ); + } else { + $file = wfLocalFile( $importableRevision->getTitle() ); + $file->load( File::READ_LATEST ); + $this->logger->debug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" ); + if ( $file->exists() && $file->getTimestamp() > $importableRevision->getTimestamp() ) { + $archiveName = $file->getTimestamp() . '!' . $file->getName(); + $file = OldLocalFile::newFromArchiveName( $importableRevision->getTitle(), + RepoGroup::singleton()->getLocalRepo(), $archiveName ); + $this->logger->debug( __METHOD__ . "File already exists; importing as $archiveName\n" ); + } + } + if ( !$file ) { + $this->logger->debug( __METHOD__ . ': Bad file for ' . $importableRevision->getTitle() . "\n" ); + return $this->newNotOkStatus(); + } + + # Get the file source or download if necessary + $source = $importableRevision->getFileSrc(); + $autoDeleteSource = $importableRevision->isTempSrc(); + if ( !strlen( $source ) ) { + $source = $this->downloadSource( $importableRevision ); + $autoDeleteSource = true; + } + if ( !strlen( $source ) ) { + $this->logger->debug( __METHOD__ . ": Could not fetch remote file.\n" ); + return $this->newNotOkStatus(); + } + + $tmpFile = new TempFSFile( $source ); + if ( $autoDeleteSource ) { + $tmpFile->autocollect(); + } + + $sha1File = ltrim( sha1_file( $source ), '0' ); + $sha1 = $importableRevision->getSha1(); + if ( $sha1 && ( $sha1 !== $sha1File ) ) { + $this->logger->debug( __METHOD__ . ": Corrupt file $source.\n" ); + return $this->newNotOkStatus(); + } + + $user = $importableRevision->getUserObj() ?: User::newFromName( $importableRevision->getUser() ); + + # Do the actual upload + if ( $archiveName ) { + $status = $file->uploadOld( $source, $archiveName, + $importableRevision->getTimestamp(), $importableRevision->getComment(), $user ); + } else { + $flags = 0; + $status = $file->upload( + $source, + $importableRevision->getComment(), + $importableRevision->getComment(), + $flags, + false, + $importableRevision->getTimestamp(), + $user + ); + } + + if ( $status->isGood() ) { + $this->logger->debug( __METHOD__ . ": Successful\n" ); + } else { + $this->logger->debug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" ); + } + + return $status; + } + + /** + * @deprecated DO NOT CALL ME. + * This method was introduced when factoring UploadImporter out of WikiRevision. + * It only has 1 use by the deprecated downloadSource method in WikiRevision. + * Do not use this in new code. + * + * @param ImportableUploadRevision $wikiRevision + * + * @return bool|string + */ + public function downloadSource( ImportableUploadRevision $wikiRevision ) { + if ( !$this->enableUploads ) { + return false; + } + + $tempo = tempnam( wfTempDir(), 'download' ); + $f = fopen( $tempo, 'wb' ); + if ( !$f ) { + $this->logger->debug( "IMPORT: couldn't write to temp file $tempo\n" ); + return false; + } + + // @todo FIXME! + $src = $wikiRevision->getSrc(); + $data = Http::get( $src, [], __METHOD__ ); + if ( !$data ) { + $this->logger->debug( "IMPORT: couldn't fetch source $src\n" ); + fclose( $f ); + unlink( $tempo ); + return false; + } + + fwrite( $f, $data ); + fclose( $f ); + + return $tempo; + } + +} diff --git a/includes/import/OldRevisionImporter.php b/includes/import/OldRevisionImporter.php new file mode 100644 index 0000000000..72af43b918 --- /dev/null +++ b/includes/import/OldRevisionImporter.php @@ -0,0 +1,17 @@ +src = $src; @@ -494,7 +496,7 @@ class WikiRevision { /** * @since 1.12.2 - * @return mixed + * @return string|null */ public function getSrc() { return $this->src; @@ -511,6 +513,17 @@ class WikiRevision { return false; } + /** + * @since 1.31 + * @return bool|string + */ + public function getSha1Base36() { + if ( $this->sha1base36 ) { + return $this->sha1base36; + } + return false; + } + /** * @since 1.17 * @return string @@ -577,106 +590,16 @@ class WikiRevision { /** * @since 1.4.1 + * @deprecated in 1.31. Use OldRevisionImporter::import * @return bool */ public function importOldRevision() { - $dbw = wfGetDB( DB_MASTER ); - - # Sneak a single revision into place - $user = $this->getUserObj() ?: User::newFromName( $this->getUser() ); - if ( $user ) { - $userId = intval( $user->getId() ); - $userText = $user->getName(); - } else { - $userId = 0; - $userText = $this->getUser(); - $user = new User; - } - - // avoid memory leak...? - Title::clearCaches(); - - $page = WikiPage::factory( $this->title ); - $page->loadPageData( 'fromdbmaster' ); - if ( !$page->exists() ) { - // must create the page... - $pageId = $page->insertOn( $dbw ); - $created = true; - $oldcountable = null; + if ( $this->mNoUpdates ) { + $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporterNoUpdates(); } else { - $pageId = $page->getId(); - $created = false; - - // Note: sha1 has been in XML dumps since 2012. If you have an - // older dump, the duplicate detection here won't work. - $prior = $dbw->selectField( 'revision', '1', - [ 'rev_page' => $pageId, - 'rev_timestamp' => $dbw->timestamp( $this->timestamp ), - 'rev_sha1' => $this->sha1base36 ], - __METHOD__ - ); - if ( $prior ) { - // @todo FIXME: This could fail slightly for multiple matches :P - wfDebug( __METHOD__ . ": skipping existing revision for [[" . - $this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" ); - return false; - } - } - - if ( !$pageId ) { - // This seems to happen if two clients simultaneously try to import the - // same page - wfDebug( __METHOD__ . ': got invalid $pageId when importing revision of [[' . - $this->title->getPrefixedText() . ']], timestamp ' . $this->timestamp . "\n" ); - return false; + $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporter(); } - - // Select previous version to make size diffs correct - // @todo This assumes that multiple revisions of the same page are imported - // in order from oldest to newest. - $prevId = $dbw->selectField( 'revision', 'rev_id', - [ - 'rev_page' => $pageId, - 'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $this->timestamp ) ), - ], - __METHOD__, - [ 'ORDER BY' => [ - 'rev_timestamp DESC', - 'rev_id DESC', // timestamp is not unique per page - ] - ] - ); - - # @todo FIXME: Use original rev_id optionally (better for backups) - # Insert the row - $revision = new Revision( [ - 'title' => $this->title, - 'page' => $pageId, - 'content_model' => $this->getModel(), - 'content_format' => $this->getFormat(), - // XXX: just set 'content' => $this->getContent()? - 'text' => $this->getContent()->serialize( $this->getFormat() ), - 'comment' => $this->getComment(), - 'user' => $userId, - 'user_text' => $userText, - 'timestamp' => $this->timestamp, - 'minor_edit' => $this->minor, - 'parent_id' => $prevId, - ] ); - $revision->insertOn( $dbw ); - $changed = $page->updateIfNewerOn( $dbw, $revision ); - - if ( $changed !== false && !$this->mNoUpdates ) { - wfDebug( __METHOD__ . ": running updates\n" ); - // countable/oldcountable stuff is handled in WikiImporter::finishImportPage - $page->doEditUpdates( - $revision, - $user, - [ 'created' => $created, 'oldcountable' => 'no-change' ] - ); - } - - return true; + return $importer->import( $this ); } /** @@ -737,106 +660,26 @@ class WikiRevision { /** * @since 1.12.2 + * @deprecated in 1.31. Use UploadImporter::import * @return bool */ public function importUpload() { - # Construct a file - $archiveName = $this->getArchiveName(); - if ( $archiveName ) { - wfDebug( __METHOD__ . "Importing archived file as $archiveName\n" ); - $file = OldLocalFile::newFromArchiveName( $this->getTitle(), - RepoGroup::singleton()->getLocalRepo(), $archiveName ); - } else { - $file = wfLocalFile( $this->getTitle() ); - $file->load( File::READ_LATEST ); - wfDebug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" ); - if ( $file->exists() && $file->getTimestamp() > $this->getTimestamp() ) { - $archiveName = $file->getTimestamp() . '!' . $file->getName(); - $file = OldLocalFile::newFromArchiveName( $this->getTitle(), - RepoGroup::singleton()->getLocalRepo(), $archiveName ); - wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" ); - } - } - if ( !$file ) { - wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" ); - return false; - } - - # Get the file source or download if necessary - $source = $this->getFileSrc(); - $autoDeleteSource = $this->isTempSrc(); - if ( !strlen( $source ) ) { - $source = $this->downloadSource(); - $autoDeleteSource = true; - } - if ( !strlen( $source ) ) { - wfDebug( __METHOD__ . ": Could not fetch remote file.\n" ); - return false; - } - - $tmpFile = new TempFSFile( $source ); - if ( $autoDeleteSource ) { - $tmpFile->autocollect(); - } - - $sha1File = ltrim( sha1_file( $source ), '0' ); - $sha1 = $this->getSha1(); - if ( $sha1 && ( $sha1 !== $sha1File ) ) { - wfDebug( __METHOD__ . ": Corrupt file $source.\n" ); - return false; - } - - $user = $this->getUserObj() ?: User::newFromName( $this->getUser() ); - - # Do the actual upload - if ( $archiveName ) { - $status = $file->uploadOld( $source, $archiveName, - $this->getTimestamp(), $this->getComment(), $user ); - } else { - $flags = 0; - $status = $file->upload( $source, $this->getComment(), $this->getComment(), - $flags, false, $this->getTimestamp(), $user ); - } - - if ( $status->isGood() ) { - wfDebug( __METHOD__ . ": Successful\n" ); - return true; - } else { - wfDebug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" ); - return false; - } + $importer = MediaWikiServices::getInstance()->getWikiRevisionUploadImporter(); + $statusValue = $importer->import( $this ); + return $statusValue->isGood(); } /** * @since 1.12.2 + * @deprecated in 1.31. Use UploadImporter::downloadSource * @return bool|string */ public function downloadSource() { - if ( !$this->config->get( 'EnableUploads' ) ) { - return false; - } - - $tempo = tempnam( wfTempDir(), 'download' ); - $f = fopen( $tempo, 'wb' ); - if ( !$f ) { - wfDebug( "IMPORT: couldn't write to temp file $tempo\n" ); - return false; - } - - // @todo FIXME! - $src = $this->getSrc(); - $data = Http::get( $src, [], __METHOD__ ); - if ( !$data ) { - wfDebug( "IMPORT: couldn't fetch source $src\n" ); - fclose( $f ); - unlink( $tempo ); - return false; - } - - fwrite( $f, $data ); - fclose( $f ); - - return $tempo; + $importer = new ImportableUploadRevisionImporter( + $this->config->get( 'EnableUploads' ), + LoggerFactory::getInstance( 'UploadRevisionImporter' ) + ); + return $importer->downloadSource( $this ); } } diff --git a/includes/installer/i18n/ast.json b/includes/installer/i18n/ast.json index 5b24d7c183..92eef9597f 100644 --- a/includes/installer/i18n/ast.json +++ b/includes/installer/i18n/ast.json @@ -63,7 +63,7 @@ "config-apc": "[http://www.php.net/apc APC] ta instaláu", "config-apcu": "[http://www.php.net/apcu APCu] ta instaláu", "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu", - "config-no-cache-apcu": "Warning: Non pudo atopase[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caxé d'oxetos nun ta activáu.", + "config-no-cache-apcu": "Atención: Nun pudo alcontrase [http://www.php.net/apcu APCu] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa caché d'oxetos nun ta activada.", "config-mod-security": "Alvertencia: El to servidor web tien activáu [https://modsecurity.org/mod_security]/mod_security2 .Munches de les sos configuraciones comunes pueden causar problemes a MediaWiki o otru software que dexe a los usuarios publicar conteníu arbitrario. De ser posible, tendríes de desactivalo. Si non, consulta la [https://modsecurity.org/documentation/ mod_security documentation] o contacta col alministrador del to servidor si atopes erros aleatorios.", "config-diff3-bad": "Nun s'alcontró GNU diff3.", "config-git": "Alcontróse'l software de control de versiones Git: $1.", diff --git a/includes/installer/i18n/fi.json b/includes/installer/i18n/fi.json index c1332b15eb..1b9a146792 100644 --- a/includes/installer/i18n/fi.json +++ b/includes/installer/i18n/fi.json @@ -24,7 +24,7 @@ "Pyscowicz" ] }, - "config-desc": "MediaWiki-asennin", + "config-desc": "Asennin MediaWikiä varten", "config-title": "MediaWikin version $1 asennus", "config-information": "Tiedot", "config-localsettings-upgrade": "LocalSettings.php-tiedosto havaittiin.\nKirjoita muuttujan $wgUpgradeKey arvo alla olevaan kenttään päivittääksesi asennuksen.\nLöydät sen LocalSettings.php-tiedostosta.", @@ -37,7 +37,7 @@ "config-session-error": "Istunnon aloittaminen epäonnistui: $1", "config-session-expired": "Istuntotietosi näyttävät olevan vanhentuneita.\nIstuntojen elinajaksi on määritelty $1.\nVoit muuttaa tätä asetusta vaihtamalla kohtaa session.gc_maxlifetime php.ini-tiedostossa.\nKäynnistä asennusprosessi uudelleen.", "config-no-session": "Istuntosi tiedot menetettiin!\nTarkista php.ini-tiedostosi ja varmista, että session.save_path on asetettu sopivaan kansioon.", - "config-your-language": "Asennuksen kieli", + "config-your-language": "Kielesi:", "config-your-language-help": "Valitse kieli, jota haluat käyttää asennuksen ajan.", "config-wiki-language": "Wikin kieli", "config-wiki-language-help": "Valitse kieli, jota wikissä tullaan etupäässä käyttämään.", @@ -91,17 +91,17 @@ "config-no-cli-uploads-check": "Varoitus: Tiedostojen lähetyshakemistoa ($1) ei ole tarkistettu haavoittuvuuksien varalta komentoriviasennuksen aikana.", "config-brokenlibxml": "Järjestelmässäsi on käytössä PHP:n ja libxml2:n versioyhdistelmä, joka ei toimi kunnolla ja voi aiheuttaa tiedon vahingoittumista MediaWikissä ja muissa web-sovelluksissa.\nPäivitä libxml2 versioon 2.7.3 tai uudempaan ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nAsennus keskeytetty.", "config-suhosin-max-value-length": "Suhosin on asennettu ja se rajoittaa GET-parametrin length $1 tavuun.\nMediaWikin ResourceLoader-komponentti pystyy toimimaan tämän kanssa, mutta ohjelmiston suorituskyky heikkenee.\nMikäli mahdollista, aseta muuttuja suhosin.get.max_value_length arvoon 1024 (tai suurempaan) tiedostossa php.ini ja aseta myös $wgResourceLoaderMaxQueryLength samaksi arvoksi tiedostossa LocalSettings.php.", - "config-db-type": "Tietokannan tyyppi", - "config-db-host": "Tietokantapalvelin", + "config-db-type": "Tietokannan tyyppi:", + "config-db-host": "Tietokantapalvelin:", "config-db-host-help": "Jos tietokantapalvelimesi sijaitsee eri palvelimella, syötä palvelimen nimi tai ip-osoite tähän.\n\nJos käytössäsi on ulkoinen palveluntarjoaja, pitäisi palvelimen nimen löytyä yrityksen ohjesivuilta.\n\nJos asennat MediaWikiä Windows-palvelimelle ja käytät MySQL:ää ei palvelimen nimi \"localhost\" välttämättä toimi. Tässä tapauksessa koita käyttää osoitetta 127.0.0.1.\n\nJos käytät PostgreSQL:ää jätä tämä kenttä tyhjäksi.", "config-db-host-oracle": "Tietokannan TNS:", "config-db-wiki-settings": "Identifioi tämä wiki", - "config-db-name": "Tietokannan nimi", + "config-db-name": "Tietokannan nimi:", "config-db-name-help": "Valitse wikiäsi kuvaava nimi.\nNimessä ei saa olla välilyöntejä.\n\nMikäli et pysty itse hallitsemaan tietokantojasi, pyydä palveluntarjoajaasi luomaan tietokanta tai tee se palveluntarjoajasi hallintapaneelissa.", "config-db-name-oracle": "Tietokannan rakenne:", "config-db-install-account": "Asennuksessa käytettävä käyttäjätili", - "config-db-username": "Tietokannan käyttäjätunnus", - "config-db-password": "Tietokannan salasana", + "config-db-username": "Tietokannan käyttäjätunnus:", + "config-db-password": "Tietokannan salasana:", "config-db-install-username": "Syötä käyttäjänimi jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin käyttäjänimi; tämä on tietokannan käyttäjänimi.", "config-db-install-password": "Syötä salasana jota käytetään muodostettaessa yhteys tietokantaan asennuksen aikana.\nTämä ei ole MediaWiki tilin salasana; tämä on tietokannan salasana.", "config-db-install-help": "Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.", @@ -176,10 +176,10 @@ "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.", "config-mssql-sqlauth": "SQL Server varmennus", "config-mssql-windowsauth": "Windows-varmennus", - "config-site-name": "Wikin nimi", + "config-site-name": "Wikin nimi:", "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.", "config-site-name-blank": "Kirjoita sivuston nimi.", - "config-project-namespace": "Projektinimiavaruus", + "config-project-namespace": "Projektinimiavaruus:", "config-ns-generic": "Projekti", "config-ns-site-name": "Sama kuin wikin nimi: $1", "config-ns-other": "Muu (määritä)", @@ -189,14 +189,14 @@ "config-ns-conflict": "Määritelty nimiavaruus \"$1\" on ristiriidassa MediaWikin oletusnimiavaruuksien kanssa.\nSyötä joku muu nimiavaruus.", "config-admin-box": "Ylläpitäjän tili", "config-admin-name": "Käyttäjänimesi:", - "config-admin-password": "Salasana", - "config-admin-password-confirm": "Salasana uudelleen", + "config-admin-password": "Salasana:", + "config-admin-password-confirm": "Salasana uudelleen:", "config-admin-help": "Syötä käyttäjänimi tähän, esimerkiksi \"Matti Meikäläinen\".\nTätä nimeä käytetään kirjauduttaessa wikiin.", "config-admin-name-blank": "Anna ylläpitäjän käyttäjänimi.", "config-admin-name-invalid": "Annettu nimi \"$1\" on virheellinen.\nSyötä toinen nimi.", "config-admin-password-blank": "Syötä ylläpitäjän salasana.", "config-admin-password-mismatch": "Antamasi salasanat eivät täsmää.", - "config-admin-email": "Sähköpostiosoite", + "config-admin-email": "Sähköpostiosoite:", "config-admin-email-help": "Syötä sähköpostiosoite johon vastaanotetaan viestit muilta wikin käyttäjiltä, nollataan salasana ja ilmoitetaan tarkkailulistalla olevista sivuista. Kenttä voidaan jättää myös tyhjäksi.", "config-admin-error-user": "Sisäinen virhe luodessa ylläpitäjää nimellä \"$1\".", "config-admin-error-password": "Sisäinen virhe asetettaessa salasanaa ylläpitäjälle \"$1\":\n
$2
", @@ -239,7 +239,7 @@ "config-upload-enable": "Ota käyttöön tiedostojen lataaminen", "config-upload-deleted": "Poistettujen tiedostojen hakemisto:", "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.", - "config-logo": "Logon URL-osoite", + "config-logo": "Logon URL-osoite:", "config-logo-help": "MediaWikin oletusulkoasussa on paikka 135x160 pikselin kokoiselle logolle sivupalkin yläpuolella.\nTallenna sopivan kokoinen kuva ja lisää URL tähän.\n\nVoit käyttää muuttujia $wgStylePath tai $wgScriptPath, jos logosi on määritelty suhteessa näihin polkuihin.\n\nJos et halua logoa, jätä tämä kenttä tyhjäksi.", "config-instantcommons": "Aktivoi Instant Commons", "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] on ominaisuus, joka antaa wikien käyttää kuvia, ääniä ja muuta mediaa [https://commons.wikimedia.org/ Wikimedia Commons] -sivustolta.\nTehdäkseen tämän MediaWiki tarvitsee Internet-yhteyden.\n\nLisätietoja tästä ominaisuudesta, mukaan lukien ohjeet, kuinka sen voi asettaa muille wikeille kuin Wikimedia Commons, löytyy [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos ohjeista].", @@ -293,6 +293,7 @@ "config-install-keys": "Muodostetaan salausavaimia", "config-insecure-keys": "Varoitus: Asennuksen aikana {{PLURAL:$2|luotu turva-avain|luodut turva-avaimet}} ($1) {{PLURAL:$2|ei|eivät}} ole täysin {{PLURAL:$2|turvallinen|turvallisia}}. Harkitse {{PLURAL:$2|sen|niiden}} muuttamista manuaalisesti.", "config-install-updates": "Estä tarpeettomien päivitysten asennus", + "config-install-updates-failed": "Virhe: Päivitysavainten lisääminen taulukoihin epäonnistui seuraavalla virheellä: $1", "config-install-sysop": "Luodaan ylläpitäjän tiliä", "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1", "config-install-subscribe-notpossible": "cURL-ohjelmaa ei ole asennettu eikä allow_url_fopen ole saatavilla.", @@ -302,6 +303,7 @@ "config-install-mainpage-failed": "Etusivun lisääminen ei onnistunut: $1", "config-install-done": "Onnittelut!\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut LocalSettings.php -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se MediaWikin asennushakemistoon (sama kuin missä on index.php). Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\nHuom: Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit [$2 mennä wikiisi].", "config-install-done-path": "Onnittelut!\nOlet asentanut MediaWikin.\n\nAsennusohjelma on luonut LocalSettings.php -tiedoston.\nSiinä on kaikki MediaWikin asetukset.\n\nLataa tiedosto ja laita se sijaintiin $4. Lataamisen olisi pitänyt alkaa automaattisesti.\n\nMikäli latausta ei tarjottu tai keskeytit latauksen, käynnistä se uudestaan tästä linkistä:\n\n$3\n\nHuom: Mikäli et nyt lataa tiedostoa, luotu tiedosto ei ole saatavissa myöhemmin, jos poistut asennuksesta lataamatta sitä.\n\nKun olet laittanut tiedoston oikeaan paikkaan, voit [$2 mennä wikiisi].", + "config-install-success": "MediaWiki on asennettu onnistuneesti. Voit nyt vierailla <$1$2> katsellaksesi wikiäsi. Jos sinulla on kysyttävää, \ntutustu usein kysyttyjen kysymysten luetteloon: tai käytä yhtä sivulle linkitettyä tukifoorumia.", "config-download-localsettings": "Lataa LocalSettings.php", "config-help": "ohje", "config-help-tooltip": "Klikkaa laajentaaksesi", diff --git a/includes/installer/i18n/nan.json b/includes/installer/i18n/nan.json index b3aa13737b..953b672aa3 100644 --- a/includes/installer/i18n/nan.json +++ b/includes/installer/i18n/nan.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Ianbu", - "唐吉訶德的侍從" + "唐吉訶德的侍從", + "Yoxem" ] }, "config-desc": "MediaWiki的安裝程式", @@ -13,7 +14,7 @@ "config-localsettings-key": "Seng-kip--ê bi̍t-bé:", "config-localsettings-badkey": "Lí phah--ê bi̍t-bé bô chèng-khak.", "config-upgrade-key-missing": "已經有一个MediaWiki矣。若要升級,請共下面這逝加去LocalSettings.php的下跤:\n\n$1", - "config-localsettings-incomplete": "這馬的LocalSettings.php可能無齊全,因為無設變量$1。請佇LocalSettings.php設彼个變量,並且揤「{{int:Config-continue}}」。", + "config-localsettings-incomplete": "Chit-má--ê LocalSettings.php khó-lêng bô chiâu-chn̂g, in-ūi bô siat piān-liōng $1. Chhiáⁿ tī LocalSettings.php siat hit-ê piān-liōng, pēng-chhiá chhi̍h \"{{int:Config-continue}}\".", "config-localsettings-connection-error": "An error was encountered when connecting to the database 用LocalSettings.php的設定去連接資料庫的時陣有一个錯誤發生,請改遮的設定了,才閣試。\n\n$1", "config-session-error": "連線開始了的錯誤:$1", "config-session-expired": "你連線資料已經過時矣,連線的使用期限是設做$1。你會使改共php.ini的session.gc_maxlifetime改較長,並且重新安裝動作。", @@ -42,17 +43,17 @@ "config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?", "config-restart": "是,重來", "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。", - "config-copyright": "=== 版權聲明佮授權條款 ===\n\n$1\n\n本程式是自由軟體;你會當照自由軟體基金會所發表的 GNU 通用公共授權條款規定,共本程式重新發佈抑是修改;無論你是照本授權條款的第二版抑第二版以後的任何版本(你會當家己選) 。\n\n本程式發佈的目的是希望會當提供幫助,但是 無負任何擔保責任;抑無表示講對 販賣性 抑 特定用途的適用性 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n你應該已隨本程式收著 GNU 通用公共授權條款的副本;若無,請寫批通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [https://www.gnu.org/copyleft/gpl.html 線頂看]。", + "config-copyright": "=== Pán-koân seng-bêng kap siū-koân tiâu-khoán ===\n\n$1\n\nPún têng-sek sī chū-iû nńg-thé; lí thang chiàu Chū-iû Nńg-thé Ki-kim-hoē só͘ hoat-piáu--ê GNU Thong-iōng Kong-kiōng Siū-koân Tiâu-khoán kui-tēng, kā pún têng-sek têng hoat-pò͘ iah-sī siu-kái; bô-lūn lí sī chiàu pún siū-koân tiâu-khoán--ê tē 2 pán iah koh khah sin--ê pán-pún (lí thang ka-kī kéng).\n\nPún têng-sek hoat-pò͘--ê bo̍k-tek sī ǹg-bāng ē-tàng pang-chān, m̄-koh bô hù jīm-hô tam-pó͘ chek-jīm; iah bô piáu-sī kóng tùi hoàn-bē-sèng iah te̍k-tēng iōng-tô͘--ê sek-iōng-sèng--ê chêng-hêng tam-pó͘. Siông-sè chhiáⁿ chham-khó GNU Thong-iōng Kong-kiōng Siū-koân.\n\nLí èng-kai tùi pún têng-sek siu-tio̍h GNU Thong-iōng Kong-kiōng Siū-koân--ê Hù-pún; nā-bô, chhiáⁿ siá-phoe thong-tī Chū-iû Nńg-thé KI-kim-hoē, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, iah-sī [https://www.gnu.org/copyleft/gpl.html soàⁿ-téng khoàⁿ].", "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 頭頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 四常問題集]\n----\n* 讀我說明\n* 發行說明\n* 版權聲明\n* 升級", "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。", - "config-env-bad": "環境檢查已完成。\n你無法度安裝 MediaWiki。", + "config-env-bad": "Khoân-kèng kiám-cha oân-sêng--ah.\nLí bô-hoat-tō͘ an-chng MediaWiki.", "config-env-php": "PHP $1 已經安裝。", "config-unicode-using-intl": "用 [https://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。", - "config-unicode-pure-php-warning": "警告: 無法度用 [https://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,所以退回用純 PHP 實作的正規化程式,這種方式處理速度較慢。\n\n若你的網站瀏覽人數誠濟,你應該先看 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。", + "config-unicode-pure-php-warning": "Kéng-kò: Bô-hoat-tō͘ iōng [https://pecl.php.net/intl intl PECL extension] chhú-lí Unicode chèng-kui-hoà, só͘-í thè kàu iōng sûn PHP si̍t-chok--ê chèng-kui-hoà têng-sek, chit khoán hong-sek chhú-lí sok-tō͘ khah bān. Nā lí--ê bāng-chām liú-lám--ê lâng chiâⁿ chē, lí èng-kai ài khoàⁿ [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode chèng-kui-hoà].", "config-unicode-update-warning": "警告:這馬安裝的 Unicode 正規化包裝程式用舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若你需要用 Unicode,你應該先進行 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。", "config-no-db": "揣無適合的資料庫驅動程式!你需要安裝 PHP 資料庫驅動程式。\n這馬支援下跤類型的資料庫: $1 。\n\n若你是家己編譯 PHP,你需要重新設定並且開資料庫客戶端,譬如:用 ./configure --with-mysqli 指令參數。\n如你是用 Debian 或 Ubuntu 的套件安裝,你著需要閣另外安裝,例:php5-mysql 套件。", - "config-outdated-sqlite": "警告:你已經安裝 SQLite $1,毋閣伊的版本比會當裝的版本 $2閣較舊。所以你無法度用 SQLite。", - "config-no-fts3": "警告: SQLite 佇編譯的時陣無包括 [//sqlite.org/fts3.html FTS3 模組],後台搜揣功能就會無法度用。", + "config-outdated-sqlite": "Kéng-kò: Lí í-keng an-chng SQLite $1, m̄-koh i--ê pán-pún pí thang-chng--ê pán-pún $2 khah kū. Só͘-í lí bô-hoat-tō͘ ēng SQLite.", + "config-no-fts3": "Kéng-kò: SQLite tī pian-e̍k--ê sî-chūn bô pau-koat [//sqlite.org/fts3.html FTS3 module], āu-tâi chhiau-chhoē kong-lêng tiō ē bô-hoat-tō͘ iōng.", "mainpagetext": "'''MediaWiki已經裝好矣。'''", "mainpagedocfooter": "請查看[https://meta.wikimedia.org/wiki/Help:Contents 用者說明書]的資料通使用wiki 軟體\n\n== 入門 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置的設定]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki時常問答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]" } diff --git a/includes/installer/i18n/sv.json b/includes/installer/i18n/sv.json index 74b8ac19e8..0ca73d3d8f 100644 --- a/includes/installer/i18n/sv.json +++ b/includes/installer/i18n/sv.json @@ -68,7 +68,7 @@ "config-apc": "[http://www.php.net/apc APC] är installerat", "config-apcu": "[http://www.php.net/apcu APCu] är installerat", "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] är installerat", - "config-no-cache-apcu": "'''Varning:''' Kunde inte hitta [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.", + "config-no-cache-apcu": "Varning: Kunde inte hitta [http://www.php.net/apcu APCu] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nCachelagring av objekt är inte aktiverat.", "config-mod-security": "'''Varning:''' Din webbserver har [https://modsecurity.org/ mod_security] aktiverat. Om felaktigt konfigurerat kan den skapa problem för MediaWiki eller annan programvara som tillåter användaren att posta godtyckligt innehåll.\nTitta på [https://modsecurity.org/documentation/ mod_security-dokumentationen] eller kontakta din värd om du påträffar slumpmässiga fel.", "config-diff3-bad": "GNU diff3 hittades inte.", "config-git": "Hittade Git-mjukvara för versionskontroll: $1.", @@ -254,7 +254,7 @@ "config-cache-options": "Inställningar för cachelagring av objekt:", "config-cache-help": "Cachelagring av objekt används för att förbättra hastigheten på MediaWiki genom att cachelagra data som används ofta.\nMedelstora till stora webbplatser är starkt uppmuntrade att aktivera detta, och små webbplatser kommer även att se fördelar.", "config-cache-none": "Ingen cachelagring (ingen funktionalitet tas bort, men hastighet kan påverkas på större wiki-webbplatser)", - "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu, XCache eller WinCache)", + "config-cache-accel": "Cachelagring av PHP-objekt (APC, APCu eller WinCache)", "config-cache-memcached": "Använda Memcached (kräver ytterligare inställningar och konfiguration)", "config-memcached-servers": "Memcached-servrar:", "config-memcached-help": "Lista över IP-adresser som ska användas för Memcached.\nBör ange en per rad och specificera den port som ska användas. Till exempel:\n 127.0.0.1:11211\n 192.168.1.25:1234", diff --git a/includes/jobqueue/jobs/RecentChangesUpdateJob.php b/includes/jobqueue/jobs/RecentChangesUpdateJob.php index a92ae96074..d97e4f9ad3 100644 --- a/includes/jobqueue/jobs/RecentChangesUpdateJob.php +++ b/includes/jobqueue/jobs/RecentChangesUpdateJob.php @@ -76,10 +76,9 @@ class RecentChangesUpdateJob extends Job { $lockKey = wfWikiID() . ':recentchanges-prune'; $dbw = wfGetDB( DB_MASTER ); - if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) - || !$dbw->lock( $lockKey, __METHOD__, 1 ) - ) { - return; // already in progress + if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) { + // already in progress + return; } $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); @@ -138,7 +137,7 @@ class RecentChangesUpdateJob extends Job { $dbw->setSessionOptions( [ 'connTimeout' => 900 ] ); $lockKey = wfWikiID() . '-activeusers'; - if ( !$dbw->lockIsFree( $lockKey, __METHOD__ ) || !$dbw->lock( $lockKey, __METHOD__, 1 ) ) { + if ( !$dbw->lock( $lockKey, __METHOD__, 0 ) ) { // Exclusive update (avoids duplicate entries)… it's usually fine to just drop out here, // if the Job is already running. return; diff --git a/includes/jobqueue/jobs/UserGroupExpiryJob.php b/includes/jobqueue/jobs/UserGroupExpiryJob.php new file mode 100644 index 0000000000..0945e58f16 --- /dev/null +++ b/includes/jobqueue/jobs/UserGroupExpiryJob.php @@ -0,0 +1,39 @@ +removeDuplicates = true; + } + + /** + * Run the job + * @return bool Success + */ + public function run() { + UserGroupMembership::purgeExpired(); + + return true; + } +} diff --git a/includes/libs/DeferredStringifier.php b/includes/libs/DeferredStringifier.php index a6fd11a433..94704133ae 100644 --- a/includes/libs/DeferredStringifier.php +++ b/includes/libs/DeferredStringifier.php @@ -22,6 +22,7 @@ /** * @since 1.25 + * @deprecated since 1.31, use Message::listParam() instead */ class DeferredStringifier { /** @var callable Callback used for result string generation */ diff --git a/includes/libs/objectcache/IExpiringStore.php b/includes/libs/objectcache/IExpiringStore.php index 0e09f16f04..7bab20a3b9 100644 --- a/includes/libs/objectcache/IExpiringStore.php +++ b/includes/libs/objectcache/IExpiringStore.php @@ -30,6 +30,7 @@ */ interface IExpiringStore { // Constants for TTL values, in seconds + const TTL_SECOND = 1; const TTL_MINUTE = 60; const TTL_HOUR = 3600; const TTL_DAY = 86400; // 24 * 3600 diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php index eec766b9d7..bcd95c1c20 100644 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@ -1536,7 +1536,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { } /** - * Locally set a key to expire soon if it is stale based on $purgeTimestamp + * Set a key to soon expire in the local cluster if it pre-dates $purgeTimestamp * * This sets stale keys' time-to-live at HOLDOFF_TTL seconds, which both avoids * broadcasting in mcrouter setups and also avoids races with new tombstones. @@ -1568,7 +1568,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { } /** - * Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp + * Set a "check" key to soon expire in the local cluster if it pre-dates $purgeTimestamp * * @param string $key Cache key * @param int $purgeTimestamp UNIX timestamp of purge @@ -1581,7 +1581,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { if ( $purge && $purge[self::FLD_TIME] < $purgeTimestamp ) { $isStale = true; $this->logger->warning( "Reaping stale check key '$key'." ); - $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, 1 ); + $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, self::TTL_SECOND ); if ( !$ok ) { $this->logger->error( "Could not complete reap of check key '$key'." ); } @@ -1824,7 +1824,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { 'cmd' => 'set', 'key' => $key, 'val' => 'PURGED:$UNIXTIME$:' . (int)$holdoff, - 'ttl' => max( $ttl, 1 ), + 'ttl' => max( $ttl, self::TTL_SECOND ), 'sbt' => true, // substitute $UNIXTIME$ with actual microtime ] ); diff --git a/includes/libs/rdbms/ChronologyProtector.php b/includes/libs/rdbms/ChronologyProtector.php index 4fcd88599c..88e276f122 100644 --- a/includes/libs/rdbms/ChronologyProtector.php +++ b/includes/libs/rdbms/ChronologyProtector.php @@ -124,7 +124,7 @@ class ChronologyProtector implements LoggerAwareInterface { $this->startupPositions[$masterName] instanceof DBMasterPos ) { $pos = $this->startupPositions[$masterName]; - $this->logger->info( __METHOD__ . ": LB for '$masterName' set to pos $pos\n" ); + $this->logger->debug( __METHOD__ . ": LB for '$masterName' set to pos $pos\n" ); $lb->waitFor( $pos ); } } @@ -148,11 +148,11 @@ class ChronologyProtector implements LoggerAwareInterface { if ( $lb->getServerCount() > 1 ) { $pos = $lb->getMasterPos(); if ( $pos ) { - $this->logger->info( __METHOD__ . ": LB for '$masterName' has pos $pos\n" ); + $this->logger->debug( __METHOD__ . ": LB for '$masterName' has pos $pos\n" ); $this->shutdownPositions[$masterName] = $pos; } } else { - $this->logger->info( __METHOD__ . ": DB '$masterName' touched\n" ); + $this->logger->debug( __METHOD__ . ": DB '$masterName' touched\n" ); } $this->shutdownTouchDBs[$masterName] = 1; } @@ -186,7 +186,7 @@ class ChronologyProtector implements LoggerAwareInterface { return []; // nothing to save } - $this->logger->info( __METHOD__ . ": saving master pos for " . + $this->logger->debug( __METHOD__ . ": saving master pos for " . implode( ', ', array_keys( $this->shutdownPositions ) ) . "\n" ); @@ -299,10 +299,10 @@ class ChronologyProtector implements LoggerAwareInterface { } $this->startupPositions = $data ? $data['positions'] : []; - $this->logger->info( __METHOD__ . ": key is {$this->key} (read)\n" ); + $this->logger->debug( __METHOD__ . ": key is {$this->key} (read)\n" ); } else { $this->startupPositions = []; - $this->logger->info( __METHOD__ . ": key is {$this->key} (unread)\n" ); + $this->logger->debug( __METHOD__ . ": key is {$this->key} (unread)\n" ); } } diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index d1814e18b5..572a798c06 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -59,19 +59,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware const SMALL_WRITE_ROWS = 100; /** @var string SQL query */ - protected $mLastQuery = ''; + protected $lastQuery = ''; /** @var float|bool UNIX timestamp of last write query */ - protected $mLastWriteTime = false; + protected $lastWriteTime = false; /** @var string|bool */ - protected $mPHPError = false; + protected $phpError = false; /** @var string */ - protected $mServer; + protected $server; /** @var string */ - protected $mUser; + protected $user; /** @var string */ - protected $mPassword; + protected $password; /** @var string */ - protected $mDBname; + protected $dbName; /** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */ protected $tableAliases = []; /** @var bool Whether this PHP instance is for a CLI script */ @@ -89,35 +89,33 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware protected $errorLogger; /** @var resource|null Database connection */ - protected $mConn = null; + protected $conn = null; /** @var bool */ - protected $mOpened = false; + protected $opened = false; /** @var array[] List of (callable, method name) */ - protected $mTrxIdleCallbacks = []; + protected $trxIdleCallbacks = []; /** @var array[] List of (callable, method name) */ - protected $mTrxPreCommitCallbacks = []; + protected $trxPreCommitCallbacks = []; /** @var array[] List of (callable, method name) */ - protected $mTrxEndCallbacks = []; + protected $trxEndCallbacks = []; /** @var callable[] Map of (name => callable) */ - protected $mTrxRecurringCallbacks = []; + protected $trxRecurringCallbacks = []; /** @var bool Whether to suppress triggering of transaction end callbacks */ - protected $mTrxEndCallbacksSuppressed = false; + protected $trxEndCallbacksSuppressed = false; /** @var string */ - protected $mTablePrefix = ''; + protected $tablePrefix = ''; /** @var string */ - protected $mSchema = ''; + protected $schema = ''; /** @var int */ - protected $mFlags; + protected $flags; /** @var array */ - protected $mLBInfo = []; - /** @var bool|null */ - protected $mDefaultBigSelects = null; + protected $lbInfo = []; /** @var array|bool */ - protected $mSchemaVars = false; + protected $schemaVars = false; /** @var array */ - protected $mSessionVars = []; + protected $sessionVars = []; /** @var array|null */ protected $preparedArgs; /** @var string|bool|null Stashed value of html_errors INI setting */ @@ -135,94 +133,94 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * * @var int */ - protected $mTrxLevel = 0; + protected $trxLevel = 0; /** * Either a short hexidecimal string if a transaction is active or "" * * @var string - * @see Database::mTrxLevel + * @see Database::trxLevel */ - protected $mTrxShortId = ''; + protected $trxShortId = ''; /** * The UNIX time that the transaction started. Callers can assume that if * snapshot isolation is used, then the data is *at least* up to date to that * point (possibly more up-to-date since the first SELECT defines the snapshot). * * @var float|null - * @see Database::mTrxLevel + * @see Database::trxLevel */ - private $mTrxTimestamp = null; + private $trxTimestamp = null; /** @var float Lag estimate at the time of BEGIN */ - private $mTrxReplicaLag = null; + private $trxReplicaLag = null; /** * Remembers the function name given for starting the most recent transaction via begin(). * Used to provide additional context for error reporting. * * @var string - * @see Database::mTrxLevel + * @see Database::trxLevel */ - private $mTrxFname = null; + private $trxFname = null; /** * Record if possible write queries were done in the last transaction started * * @var bool - * @see Database::mTrxLevel + * @see Database::trxLevel */ - private $mTrxDoneWrites = false; + private $trxDoneWrites = false; /** * Record if the current transaction was started implicitly due to DBO_TRX being set. * * @var bool - * @see Database::mTrxLevel + * @see Database::trxLevel */ - private $mTrxAutomatic = false; + private $trxAutomatic = false; /** * Array of levels of atomicity within transactions * * @var array */ - private $mTrxAtomicLevels = []; + private $trxAtomicLevels = []; /** * Record if the current transaction was started implicitly by Database::startAtomic * * @var bool */ - private $mTrxAutomaticAtomic = false; + private $trxAutomaticAtomic = false; /** * Track the write query callers of the current transaction * * @var string[] */ - private $mTrxWriteCallers = []; + private $trxWriteCallers = []; /** * @var float Seconds spent in write queries for the current transaction */ - private $mTrxWriteDuration = 0.0; + private $trxWriteDuration = 0.0; /** * @var int Number of write queries for the current transaction */ - private $mTrxWriteQueryCount = 0; + private $trxWriteQueryCount = 0; /** * @var int Number of rows affected by write queries for the current transaction */ - private $mTrxWriteAffectedRows = 0; + private $trxWriteAffectedRows = 0; /** - * @var float Like mTrxWriteQueryCount but excludes lock-bound, easy to replicate, queries + * @var float Like trxWriteQueryCount but excludes lock-bound, easy to replicate, queries */ - private $mTrxWriteAdjDuration = 0.0; + private $trxWriteAdjDuration = 0.0; /** - * @var int Number of write queries counted in mTrxWriteAdjDuration + * @var int Number of write queries counted in trxWriteAdjDuration */ - private $mTrxWriteAdjQueryCount = 0; + private $trxWriteAdjQueryCount = 0; /** * @var float RTT time estimate */ - private $mRTTEstimate = 0.0; + private $rttEstimate = 0.0; /** @var array Map of (name => 1) for locks obtained via lock() */ - private $mNamedLocksHeld = []; + private $namedLocksHeld = []; /** @var array Map of (table name => 1) for TEMPORARY tables */ - protected $mSessionTempTables = []; + protected $sessionTempTables = []; /** @var IDatabase|null Lazy handle to the master DB this server replicates from */ private $lazyMasterHandle; @@ -230,7 +228,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware /** @var float UNIX timestamp */ protected $lastPing = 0.0; - /** @var int[] Prior mFlags values */ + /** @var int[] Prior flags member variable values */ private $priorFlags = []; /** @var object|string Class name or object With profileIn/profileOut methods */ @@ -252,23 +250,23 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $password = $params['password']; $dbName = $params['dbname']; - $this->mSchema = $params['schema']; - $this->mTablePrefix = $params['tablePrefix']; + $this->schema = $params['schema']; + $this->tablePrefix = $params['tablePrefix']; $this->cliMode = $params['cliMode']; // Agent name is added to SQL queries in a comment, so make sure it can't break out $this->agent = str_replace( '/', '-', $params['agent'] ); - $this->mFlags = $params['flags']; - if ( $this->mFlags & self::DBO_DEFAULT ) { + $this->flags = $params['flags']; + if ( $this->flags & self::DBO_DEFAULT ) { if ( $this->cliMode ) { - $this->mFlags &= ~self::DBO_TRX; + $this->flags &= ~self::DBO_TRX; } else { - $this->mFlags |= self::DBO_TRX; + $this->flags |= self::DBO_TRX; } } - $this->mSessionVars = $params['variables']; + $this->sessionVars = $params['variables']; $this->srvCache = isset( $params['srvCache'] ) ? $params['srvCache'] @@ -290,9 +288,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } // Set the domain object after open() sets the relevant fields - if ( $this->mDBname != '' ) { + if ( $this->dbName != '' ) { // Domains with server scope but a table prefix are not used by IDatabase classes - $this->currentDomain = new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix ); + $this->currentDomain = new DatabaseDomain( $this->dbName, null, $this->tablePrefix ); } } @@ -464,9 +462,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $ignoreErrors !== null ) { // setFlag()/clearFlag() do not allow DBO_IGNORE changes for sanity if ( $ignoreErrors ) { - $this->mFlags |= self::DBO_IGNORE; + $this->flags |= self::DBO_IGNORE; } else { - $this->mFlags &= ~self::DBO_IGNORE; + $this->flags &= ~self::DBO_IGNORE; } } @@ -474,19 +472,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function trxLevel() { - return $this->mTrxLevel; + return $this->trxLevel; } public function trxTimestamp() { - return $this->mTrxLevel ? $this->mTrxTimestamp : null; + return $this->trxLevel ? $this->trxTimestamp : null; } public function tablePrefix( $prefix = null ) { - $old = $this->mTablePrefix; + $old = $this->tablePrefix; if ( $prefix !== null ) { - $this->mTablePrefix = $prefix; - $this->currentDomain = ( $this->mDBname != '' ) - ? new DatabaseDomain( $this->mDBname, null, $this->mTablePrefix ) + $this->tablePrefix = $prefix; + $this->currentDomain = ( $this->dbName != '' ) + ? new DatabaseDomain( $this->dbName, null, $this->tablePrefix ) : DatabaseDomain::newUnspecified(); } @@ -494,9 +492,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function dbSchema( $schema = null ) { - $old = $this->mSchema; + $old = $this->schema; if ( $schema !== null ) { - $this->mSchema = $schema; + $this->schema = $schema; } return $old; @@ -504,10 +502,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function getLBInfo( $name = null ) { if ( is_null( $name ) ) { - return $this->mLBInfo; + return $this->lbInfo; } else { - if ( array_key_exists( $name, $this->mLBInfo ) ) { - return $this->mLBInfo[$name]; + if ( array_key_exists( $name, $this->lbInfo ) ) { + return $this->lbInfo[$name]; } else { return null; } @@ -516,9 +514,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function setLBInfo( $name, $value = null ) { if ( is_null( $value ) ) { - $this->mLBInfo = $name; + $this->lbInfo = $name; } else { - $this->mLBInfo[$name] = $value; + $this->lbInfo[$name] = $value; } } @@ -544,55 +542,55 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function lastQuery() { - return $this->mLastQuery; + return $this->lastQuery; } public function doneWrites() { - return (bool)$this->mLastWriteTime; + return (bool)$this->lastWriteTime; } public function lastDoneWrites() { - return $this->mLastWriteTime ?: false; + return $this->lastWriteTime ?: false; } public function writesPending() { - return $this->mTrxLevel && $this->mTrxDoneWrites; + return $this->trxLevel && $this->trxDoneWrites; } public function writesOrCallbacksPending() { - return $this->mTrxLevel && ( - $this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks + return $this->trxLevel && ( + $this->trxDoneWrites || $this->trxIdleCallbacks || $this->trxPreCommitCallbacks ); } public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { return false; - } elseif ( !$this->mTrxDoneWrites ) { + } elseif ( !$this->trxDoneWrites ) { return 0.0; } switch ( $type ) { case self::ESTIMATE_DB_APPLY: $this->ping( $rtt ); - $rttAdjTotal = $this->mTrxWriteAdjQueryCount * $rtt; - $applyTime = max( $this->mTrxWriteAdjDuration - $rttAdjTotal, 0 ); + $rttAdjTotal = $this->trxWriteAdjQueryCount * $rtt; + $applyTime = max( $this->trxWriteAdjDuration - $rttAdjTotal, 0 ); // For omitted queries, make them count as something at least - $omitted = $this->mTrxWriteQueryCount - $this->mTrxWriteAdjQueryCount; + $omitted = $this->trxWriteQueryCount - $this->trxWriteAdjQueryCount; $applyTime += self::TINY_WRITE_SEC * $omitted; return $applyTime; default: // everything - return $this->mTrxWriteDuration; + return $this->trxWriteDuration; } } public function pendingWriteCallers() { - return $this->mTrxLevel ? $this->mTrxWriteCallers : []; + return $this->trxLevel ? $this->trxWriteCallers : []; } public function pendingWriteRowsAffected() { - return $this->mTrxWriteAffectedRows; + return $this->trxWriteAffectedRows; } /** @@ -602,15 +600,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @return array */ protected function pendingWriteAndCallbackCallers() { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { return []; } - $fnames = $this->mTrxWriteCallers; + $fnames = $this->trxWriteCallers; foreach ( [ - $this->mTrxIdleCallbacks, - $this->mTrxPreCommitCallbacks, - $this->mTrxEndCallbacks + $this->trxIdleCallbacks, + $this->trxPreCommitCallbacks, + $this->trxEndCallbacks ] as $callbacks ) { foreach ( $callbacks as $callback ) { $fnames[] = $callback[1]; @@ -621,7 +619,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function isOpen() { - return $this->mOpened; + return $this->opened; } public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) { @@ -630,9 +628,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } if ( $remember === self::REMEMBER_PRIOR ) { - array_push( $this->priorFlags, $this->mFlags ); + array_push( $this->priorFlags, $this->flags ); } - $this->mFlags |= $flag; + $this->flags |= $flag; } public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) { @@ -641,9 +639,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } if ( $remember === self::REMEMBER_PRIOR ) { - array_push( $this->priorFlags, $this->mFlags ); + array_push( $this->priorFlags, $this->flags ); } - $this->mFlags &= ~$flag; + $this->flags &= ~$flag; } public function restoreFlags( $state = self::RESTORE_PRIOR ) { @@ -652,15 +650,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } if ( $state === self::RESTORE_INITIAL ) { - $this->mFlags = reset( $this->priorFlags ); + $this->flags = reset( $this->priorFlags ); $this->priorFlags = []; } else { - $this->mFlags = array_pop( $this->priorFlags ); + $this->flags = array_pop( $this->priorFlags ); } } public function getFlag( $flag ) { - return !!( $this->mFlags & $flag ); + return !!( $this->flags & $flag ); } /** @@ -701,7 +699,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * Set a custom error handler for logging errors during database connection */ protected function installErrorHandler() { - $this->mPHPError = false; + $this->phpError = false; $this->htmlErrors = ini_set( 'html_errors', '0' ); set_error_handler( [ $this, 'connectionErrorLogger' ] ); } @@ -724,8 +722,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @return string|bool Last PHP error for this DB (typically connection errors) */ protected function getLastPHPError() { - if ( $this->mPHPError ) { - $error = preg_replace( '!\[\]!', '', $this->mPHPError ); + if ( $this->phpError ) { + $error = preg_replace( '!\[\]!', '', $this->phpError ); $error = preg_replace( '!^.*?:\s?(.*)$!', '$1', $error ); return $error; @@ -742,7 +740,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @param string $errstr */ public function connectionErrorLogger( $errno, $errstr ) { - $this->mPHPError = $errstr; + $this->phpError = $errstr; } /** @@ -754,32 +752,32 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware protected function getLogContext( array $extras = [] ) { return array_merge( [ - 'db_server' => $this->mServer, - 'db_name' => $this->mDBname, - 'db_user' => $this->mUser, + 'db_server' => $this->server, + 'db_name' => $this->dbName, + 'db_user' => $this->user, ], $extras ); } public function close() { - if ( $this->mConn ) { + if ( $this->conn ) { if ( $this->trxLevel() ) { $this->commit( __METHOD__, self::FLUSHING_INTERNAL ); } $closed = $this->closeConnection(); - $this->mConn = false; + $this->conn = false; } elseif ( - $this->mTrxIdleCallbacks || - $this->mTrxPreCommitCallbacks || - $this->mTrxEndCallbacks + $this->trxIdleCallbacks || + $this->trxPreCommitCallbacks || + $this->trxEndCallbacks ) { // sanity throw new RuntimeException( "Transaction callbacks still pending." ); } else { $closed = true; } - $this->mOpened = false; + $this->opened = false; return $closed; } @@ -868,7 +866,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $sql, $matches ) ) { - $this->mSessionTempTables[$matches[1]] = 1; + $this->sessionTempTables[$matches[1]] = 1; return true; } elseif ( preg_match( @@ -876,8 +874,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $sql, $matches ) ) { - $isTemp = isset( $this->mSessionTempTables[$matches[1]] ); - unset( $this->mSessionTempTables[$matches[1]] ); + $isTemp = isset( $this->sessionTempTables[$matches[1]] ); + unset( $this->sessionTempTables[$matches[1]] ); return $isTemp; } elseif ( preg_match( @@ -885,13 +883,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $sql, $matches ) ) { - return isset( $this->mSessionTempTables[$matches[1]] ); + return isset( $this->sessionTempTables[$matches[1]] ); } elseif ( preg_match( '/^(?:INSERT\s+(?:\w+\s+)?INTO|UPDATE|DELETE\s+FROM)\s+[`"\']?(\w+)[`"\']?/i', $sql, $matches ) ) { - return isset( $this->mSessionTempTables[$matches[1]] ); + return isset( $this->sessionTempTables[$matches[1]] ); } return false; @@ -899,7 +897,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) { $priorWritesPending = $this->writesOrCallbacksPending(); - $this->mLastQuery = $sql; + $this->lastQuery = $sql; $isWrite = $this->isWriteQuery( $sql ); if ( $isWrite ) { @@ -922,7 +920,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware throw new DBReadOnlyError( $this, "Database is read-only: $reason" ); } # Set a flag indicating that writes have been done - $this->mLastWriteTime = microtime( true ); + $this->lastWriteTime = microtime( true ); } # Add trace comment to the begin of the sql string, right after the operator. @@ -930,22 +928,22 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 ); # Start implicit transactions that wrap the request if DBO_TRX is enabled - if ( !$this->mTrxLevel && $this->getFlag( self::DBO_TRX ) + if ( !$this->trxLevel && $this->getFlag( self::DBO_TRX ) && $this->isTransactableQuery( $sql ) ) { $this->begin( __METHOD__ . " ($fname)", self::TRANSACTION_INTERNAL ); - $this->mTrxAutomatic = true; + $this->trxAutomatic = true; } # Keep track of whether the transaction has write queries pending - if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $isWrite ) { - $this->mTrxDoneWrites = true; + if ( $this->trxLevel && !$this->trxDoneWrites && $isWrite ) { + $this->trxDoneWrites = true; $this->trxProfiler->transactionWritingIn( - $this->mServer, $this->mDBname, $this->mTrxShortId ); + $this->server, $this->dbName, $this->trxShortId ); } if ( $this->getFlag( self::DBO_DEBUG ) ) { - $this->queryLogger->debug( "{$this->mDBname} {$commentedSql}" ); + $this->queryLogger->debug( "{$this->dbName} {$commentedSql}" ); } # Avoid fatals if close() was called @@ -1024,7 +1022,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } # Include query transaction state - $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : ""; + $queryProf .= $this->trxShortId ? " [TRX#{$this->trxShortId}]" : ""; $startTime = microtime( true ); if ( $this->profiler ) { @@ -1042,14 +1040,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $ret !== false ) { $this->lastPing = $startTime; - if ( $isWrite && $this->mTrxLevel ) { + if ( $isWrite && $this->trxLevel ) { $this->updateTrxWriteQueryTime( $sql, $queryRuntime, $this->affectedRows() ); - $this->mTrxWriteCallers[] = $fname; + $this->trxWriteCallers[] = $fname; } } if ( $sql === self::PING_QUERY ) { - $this->mRTTEstimate = $queryRuntime; + $this->rttEstimate = $queryRuntime; } $this->trxProfiler->recordQueryCompletion( @@ -1089,12 +1087,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } } - $this->mTrxWriteDuration += $runtime; - $this->mTrxWriteQueryCount += 1; - $this->mTrxWriteAffectedRows += $affected; + $this->trxWriteDuration += $runtime; + $this->trxWriteQueryCount += 1; + $this->trxWriteAffectedRows += $affected; if ( $indicativeOfReplicaRuntime ) { - $this->mTrxWriteAdjDuration += $runtime; - $this->mTrxWriteAdjQueryCount += 1; + $this->trxWriteAdjDuration += $runtime; + $this->trxWriteAdjQueryCount += 1; } } @@ -1113,7 +1111,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware # Dropped connections also mean that named locks are automatically released. # Only allow error suppression in autocommit mode or when the lost transaction # didn't matter anyway (aside from DBO_TRX snapshot loss). - if ( $this->mNamedLocksHeld ) { + if ( $this->namedLocksHeld ) { return false; // possible critical section violation } elseif ( $sql === 'COMMIT' ) { return !$priorWritesPending; // nothing written anyway? (T127428) @@ -1134,13 +1132,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @return null|Exception */ private function handleSessionLoss() { - $this->mTrxLevel = 0; - $this->mTrxIdleCallbacks = []; // T67263 - $this->mTrxPreCommitCallbacks = []; // T67263 - $this->mSessionTempTables = []; - $this->mNamedLocksHeld = []; + $this->trxLevel = 0; + $this->trxIdleCallbacks = []; // T67263 + $this->trxPreCommitCallbacks = []; // T67263 + $this->sessionTempTables = []; + $this->namedLocksHeld = []; try { - // Handle callbacks in mTrxEndCallbacks + // Handle callbacks in trxEndCallbacks $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK ); $this->runTransactionListenerCallbacks( self::TRIGGER_ROLLBACK ); return null; @@ -1405,13 +1403,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->tableNamesWithIndexClauseOrJOIN( $table, $useIndexes, $ignoreIndexes, $join_conds ); } elseif ( $table != '' ) { - if ( $table[0] == ' ' ) { - $from = ' FROM ' . $table; - } else { - $from = ' FROM ' . - $this->tableNamesWithIndexClauseOrJOIN( - [ $table ], $useIndexes, $ignoreIndexes, [] ); - } + $from = ' FROM ' . + $this->tableNamesWithIndexClauseOrJOIN( + [ $table ], $useIndexes, $ignoreIndexes, [] ); } else { $from = ''; } @@ -1545,7 +1539,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function tableExists( $table, $fname = __METHOD__ ) { $tableRaw = $this->tableName( $table, 'raw' ); - if ( isset( $this->mSessionTempTables[$tableRaw] ) ) { + if ( isset( $this->sessionTempTables[$tableRaw] ) ) { return true; // already known to exist } @@ -1811,17 +1805,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware # Stub. Shouldn't cause serious problems if it's not overridden, but # if your database engine supports a concept similar to MySQL's # databases you may as well. - $this->mDBname = $db; + $this->dbName = $db; return true; } public function getDBname() { - return $this->mDBname; + return $this->dbName; } public function getServer() { - return $this->mServer; + return $this->server; } public function tableName( $name, $format = 'quoted' ) { @@ -1890,14 +1884,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $database = $this->tableAliases[$table]['dbname']; $schema = is_string( $this->tableAliases[$table]['schema'] ) ? $this->tableAliases[$table]['schema'] - : $this->mSchema; + : $this->schema; $prefix = is_string( $this->tableAliases[$table]['prefix'] ) ? $this->tableAliases[$table]['prefix'] - : $this->mTablePrefix; + : $this->tablePrefix; } else { $database = ''; - $schema = $this->mSchema; # Default schema - $prefix = $this->mTablePrefix; # Default prefix + $schema = $this->schema; # Default schema + $prefix = $this->tablePrefix; # Default prefix } } @@ -2250,37 +2244,51 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $rows = [ $rows ]; } - $affectedRowCount = 0; - foreach ( $rows as $row ) { - // Delete rows which collide with this one - $indexWhereClauses = []; - foreach ( $uniqueIndexes as $index ) { - $indexColumns = (array)$index; - $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) ); - if ( count( $indexRowValues ) != count( $indexColumns ) ) { - throw new DBUnexpectedError( - $this, - 'New record does not provide all values for unique key (' . + $useTrx = !$this->trxLevel; + if ( $useTrx ) { + $this->begin( $fname, self::TRANSACTION_INTERNAL ); + } + try { + $affectedRowCount = 0; + foreach ( $rows as $row ) { + // Delete rows which collide with this one + $indexWhereClauses = []; + foreach ( $uniqueIndexes as $index ) { + $indexColumns = (array)$index; + $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) ); + if ( count( $indexRowValues ) != count( $indexColumns ) ) { + throw new DBUnexpectedError( + $this, + 'New record does not provide all values for unique key (' . implode( ', ', $indexColumns ) . ')' - ); - } elseif ( in_array( null, $indexRowValues, true ) ) { - throw new DBUnexpectedError( - $this, - 'New record has a null value for unique key (' . + ); + } elseif ( in_array( null, $indexRowValues, true ) ) { + throw new DBUnexpectedError( + $this, + 'New record has a null value for unique key (' . implode( ', ', $indexColumns ) . ')' - ); + ); + } + $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND ); + } + + if ( $indexWhereClauses ) { + $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname ); + $affectedRowCount += $this->affectedRows(); } - $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND ); - } - if ( $indexWhereClauses ) { - $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname ); + // Now insert the row + $this->insert( $table, $row, $fname ); $affectedRowCount += $this->affectedRows(); } - - // Now insert the row - $this->insert( $table, $row, $fname ); - $affectedRowCount += $this->affectedRows(); + } catch ( Exception $e ) { + if ( $useTrx ) { + $this->rollback( $fname, self::FLUSHING_INTERNAL ); + } + throw $e; + } + if ( $useTrx ) { + $this->commit( $fname, self::FLUSHING_INTERNAL ); } $this->affectedRowCount = $affectedRowCount; @@ -2349,7 +2357,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } $affectedRowCount = 0; - $useTrx = !$this->mTrxLevel; + $useTrx = !$this->trxLevel; if ( $useTrx ) { $this->begin( $fname, self::TRANSACTION_INTERNAL ); } @@ -2756,25 +2764,25 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } final public function onTransactionResolution( callable $callback, $fname = __METHOD__ ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { throw new DBUnexpectedError( $this, "No transaction is active." ); } - $this->mTrxEndCallbacks[] = [ $callback, $fname ]; + $this->trxEndCallbacks[] = [ $callback, $fname ]; } final public function onTransactionIdle( callable $callback, $fname = __METHOD__ ) { - $this->mTrxIdleCallbacks[] = [ $callback, $fname ]; - if ( !$this->mTrxLevel ) { + $this->trxIdleCallbacks[] = [ $callback, $fname ]; + if ( !$this->trxLevel ) { $this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE ); } } final public function onTransactionPreCommitOrIdle( callable $callback, $fname = __METHOD__ ) { - if ( $this->mTrxLevel || $this->getFlag( self::DBO_TRX ) ) { + if ( $this->trxLevel || $this->getFlag( self::DBO_TRX ) ) { // As long as DBO_TRX is set, writes will accumulate until the load balancer issues // an implicit commit of all peer databases. This is true even if a transaction has // not yet been triggered by writes; make sure $callback runs *after* any such writes. - $this->mTrxPreCommitCallbacks[] = [ $callback, $fname ]; + $this->trxPreCommitCallbacks[] = [ $callback, $fname ]; } else { // No transaction is active nor will start implicitly, so make one for this callback $this->startAtomic( __METHOD__ ); @@ -2790,9 +2798,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware final public function setTransactionListener( $name, callable $callback = null ) { if ( $callback ) { - $this->mTrxRecurringCallbacks[$name] = $callback; + $this->trxRecurringCallbacks[$name] = $callback; } else { - unset( $this->mTrxRecurringCallbacks[$name] ); + unset( $this->trxRecurringCallbacks[$name] ); } } @@ -2805,7 +2813,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @since 1.28 */ final public function setTrxEndCallbackSuppression( $suppress ) { - $this->mTrxEndCallbacksSuppressed = $suppress; + $this->trxEndCallbacksSuppressed = $suppress; } /** @@ -2818,7 +2826,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @throws Exception */ public function runOnTransactionIdleCallbacks( $trigger ) { - if ( $this->mTrxEndCallbacksSuppressed ) { + if ( $this->trxEndCallbacksSuppressed ) { return; } @@ -2827,11 +2835,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $e = null; // first exception do { // callbacks may add callbacks :) $callbacks = array_merge( - $this->mTrxIdleCallbacks, - $this->mTrxEndCallbacks // include "transaction resolution" callbacks + $this->trxIdleCallbacks, + $this->trxEndCallbacks // include "transaction resolution" callbacks ); - $this->mTrxIdleCallbacks = []; // consumed (and recursion guard) - $this->mTrxEndCallbacks = []; // consumed (recursion guard) + $this->trxIdleCallbacks = []; // consumed (and recursion guard) + $this->trxEndCallbacks = []; // consumed (recursion guard) foreach ( $callbacks as $callback ) { try { list( $phpCallback ) = $callback; @@ -2852,7 +2860,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } } } - } while ( count( $this->mTrxIdleCallbacks ) ); + } while ( count( $this->trxIdleCallbacks ) ); if ( $e instanceof Exception ) { throw $e; // re-throw any first exception @@ -2870,8 +2878,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function runOnTransactionPreCommitCallbacks() { $e = null; // first exception do { // callbacks may add callbacks :) - $callbacks = $this->mTrxPreCommitCallbacks; - $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard) + $callbacks = $this->trxPreCommitCallbacks; + $this->trxPreCommitCallbacks = []; // consumed (and recursion guard) foreach ( $callbacks as $callback ) { try { list( $phpCallback ) = $callback; @@ -2881,7 +2889,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $e = $e ?: $ex; } } - } while ( count( $this->mTrxPreCommitCallbacks ) ); + } while ( count( $this->trxPreCommitCallbacks ) ); if ( $e instanceof Exception ) { throw $e; // re-throw any first exception @@ -2898,14 +2906,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @since 1.20 */ public function runTransactionListenerCallbacks( $trigger ) { - if ( $this->mTrxEndCallbacksSuppressed ) { + if ( $this->trxEndCallbacksSuppressed ) { return; } /** @var Exception $e */ $e = null; // first exception - foreach ( $this->mTrxRecurringCallbacks as $phpCallback ) { + foreach ( $this->trxRecurringCallbacks as $phpCallback ) { try { $phpCallback( $trigger, $this ); } catch ( Exception $ex ) { @@ -2920,29 +2928,29 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } final public function startAtomic( $fname = __METHOD__ ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { $this->begin( $fname, self::TRANSACTION_INTERNAL ); // If DBO_TRX is set, a series of startAtomic/endAtomic pairs will result // in all changes being in one transaction to keep requests transactional. if ( !$this->getFlag( self::DBO_TRX ) ) { - $this->mTrxAutomaticAtomic = true; + $this->trxAutomaticAtomic = true; } } - $this->mTrxAtomicLevels[] = $fname; + $this->trxAtomicLevels[] = $fname; } final public function endAtomic( $fname = __METHOD__ ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { throw new DBUnexpectedError( $this, "No atomic transaction is open (got $fname)." ); } - if ( !$this->mTrxAtomicLevels || - array_pop( $this->mTrxAtomicLevels ) !== $fname + if ( !$this->trxAtomicLevels || + array_pop( $this->trxAtomicLevels ) !== $fname ) { throw new DBUnexpectedError( $this, "Invalid atomic section ended (got $fname)." ); } - if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) { + if ( !$this->trxAtomicLevels && $this->trxAutomaticAtomic ) { $this->commit( $fname, self::FLUSHING_INTERNAL ); } } @@ -2962,17 +2970,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware final public function begin( $fname = __METHOD__, $mode = self::TRANSACTION_EXPLICIT ) { // Protect against mismatched atomic section, transaction nesting, and snapshot loss - if ( $this->mTrxLevel ) { - if ( $this->mTrxAtomicLevels ) { - $levels = implode( ', ', $this->mTrxAtomicLevels ); + if ( $this->trxLevel ) { + if ( $this->trxAtomicLevels ) { + $levels = implode( ', ', $this->trxAtomicLevels ); $msg = "$fname: Got explicit BEGIN while atomic section(s) $levels are open."; throw new DBUnexpectedError( $this, $msg ); - } elseif ( !$this->mTrxAutomatic ) { - $msg = "$fname: Explicit transaction already active (from {$this->mTrxFname})."; + } elseif ( !$this->trxAutomatic ) { + $msg = "$fname: Explicit transaction already active (from {$this->trxFname})."; throw new DBUnexpectedError( $this, $msg ); } else { // @TODO: make this an exception at some point - $msg = "$fname: Implicit transaction already active (from {$this->mTrxFname})."; + $msg = "$fname: Implicit transaction already active (from {$this->trxFname})."; $this->queryLogger->error( $msg ); return; // join the main transaction set } @@ -2987,27 +2995,27 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->assertOpen(); $this->doBegin( $fname ); - $this->mTrxTimestamp = microtime( true ); - $this->mTrxFname = $fname; - $this->mTrxDoneWrites = false; - $this->mTrxAutomaticAtomic = false; - $this->mTrxAtomicLevels = []; - $this->mTrxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) ); - $this->mTrxWriteDuration = 0.0; - $this->mTrxWriteQueryCount = 0; - $this->mTrxWriteAffectedRows = 0; - $this->mTrxWriteAdjDuration = 0.0; - $this->mTrxWriteAdjQueryCount = 0; - $this->mTrxWriteCallers = []; + $this->trxTimestamp = microtime( true ); + $this->trxFname = $fname; + $this->trxDoneWrites = false; + $this->trxAutomaticAtomic = false; + $this->trxAtomicLevels = []; + $this->trxShortId = sprintf( '%06x', mt_rand( 0, 0xffffff ) ); + $this->trxWriteDuration = 0.0; + $this->trxWriteQueryCount = 0; + $this->trxWriteAffectedRows = 0; + $this->trxWriteAdjDuration = 0.0; + $this->trxWriteAdjQueryCount = 0; + $this->trxWriteCallers = []; // First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ. // Get an estimate of the replica DB lag before then, treating estimate staleness // as lag itself just to be safe $status = $this->getApproximateLagStatus(); - $this->mTrxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] ); + $this->trxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] ); // T147697: make explicitTrxActive() return true until begin() finishes. This way, no // caller will think its OK to muck around with the transaction just because startAtomic() - // has not yet completed (e.g. setting mTrxAtomicLevels). - $this->mTrxAutomatic = ( $mode === self::TRANSACTION_INTERNAL ); + // has not yet completed (e.g. setting trxAtomicLevels). + $this->trxAutomatic = ( $mode === self::TRANSACTION_INTERNAL ); } /** @@ -3018,13 +3026,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware */ protected function doBegin( $fname ) { $this->query( 'BEGIN', $fname ); - $this->mTrxLevel = 1; + $this->trxLevel = 1; } final public function commit( $fname = __METHOD__, $flush = '' ) { - if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) { + if ( $this->trxLevel && $this->trxAtomicLevels ) { // There are still atomic sections open. This cannot be ignored - $levels = implode( ', ', $this->mTrxAtomicLevels ); + $levels = implode( ', ', $this->trxAtomicLevels ); throw new DBUnexpectedError( $this, "$fname: Got COMMIT while atomic sections $levels are still open." @@ -3032,20 +3040,20 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { return; // nothing to do - } elseif ( !$this->mTrxAutomatic ) { + } elseif ( !$this->trxAutomatic ) { throw new DBUnexpectedError( $this, "$fname: Flushing an explicit transaction, getting out of sync." ); } } else { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { $this->queryLogger->error( "$fname: No transaction to commit, something got out of sync." ); return; // nothing to do - } elseif ( $this->mTrxAutomatic ) { + } elseif ( $this->trxAutomatic ) { // @TODO: make this an exception at some point $msg = "$fname: Explicit commit of implicit transaction."; $this->queryLogger->error( $msg ); @@ -3059,14 +3067,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->runOnTransactionPreCommitCallbacks(); $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY ); $this->doCommit( $fname ); - if ( $this->mTrxDoneWrites ) { - $this->mLastWriteTime = microtime( true ); + if ( $this->trxDoneWrites ) { + $this->lastWriteTime = microtime( true ); $this->trxProfiler->transactionWritingOut( - $this->mServer, - $this->mDBname, - $this->mTrxShortId, + $this->server, + $this->dbName, + $this->trxShortId, $writeTime, - $this->mTrxWriteAffectedRows + $this->trxWriteAffectedRows ); } @@ -3081,19 +3089,19 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @param string $fname */ protected function doCommit( $fname ) { - if ( $this->mTrxLevel ) { + if ( $this->trxLevel ) { $this->query( 'COMMIT', $fname ); - $this->mTrxLevel = 0; + $this->trxLevel = 0; } } final public function rollback( $fname = __METHOD__, $flush = '' ) { if ( $flush === self::FLUSHING_INTERNAL || $flush === self::FLUSHING_ALL_PEERS ) { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { return; // nothing to do } } else { - if ( !$this->mTrxLevel ) { + if ( !$this->trxLevel ) { $this->queryLogger->error( "$fname: No transaction to rollback, something got out of sync." ); return; // nothing to do @@ -3109,17 +3117,17 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->assertOpen(); $this->doRollback( $fname ); - $this->mTrxAtomicLevels = []; - if ( $this->mTrxDoneWrites ) { + $this->trxAtomicLevels = []; + if ( $this->trxDoneWrites ) { $this->trxProfiler->transactionWritingOut( - $this->mServer, - $this->mDBname, - $this->mTrxShortId + $this->server, + $this->dbName, + $this->trxShortId ); } - $this->mTrxIdleCallbacks = []; // clear - $this->mTrxPreCommitCallbacks = []; // clear + $this->trxIdleCallbacks = []; // clear + $this->trxPreCommitCallbacks = []; // clear try { $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK ); } catch ( Exception $e ) { @@ -3139,11 +3147,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @param string $fname */ protected function doRollback( $fname ) { - if ( $this->mTrxLevel ) { + if ( $this->trxLevel ) { # Disconnects cause rollback anyway, so ignore those errors $ignoreErrors = true; $this->query( 'ROLLBACK', $fname, $ignoreErrors ); - $this->mTrxLevel = 0; + $this->trxLevel = 0; } } @@ -3161,7 +3169,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function explicitTrxActive() { - return $this->mTrxLevel && ( $this->mTrxAtomicLevels || !$this->mTrxAutomatic ); + return $this->trxLevel && ( $this->trxAtomicLevels || !$this->trxAutomatic ); } public function duplicateTableStructure( @@ -3232,8 +3240,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware public function ping( &$rtt = null ) { // Avoid hitting the server if it was hit recently if ( $this->isOpen() && ( microtime( true ) - $this->lastPing ) < self::PING_TTL ) { - if ( !func_num_args() || $this->mRTTEstimate > 0 ) { - $rtt = $this->mRTTEstimate; + if ( !func_num_args() || $this->rttEstimate > 0 ) { + $rtt = $this->rttEstimate; return true; // don't care about $rtt } } @@ -3244,7 +3252,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->restoreFlags( self::RESTORE_PRIOR ); if ( $ok ) { - $rtt = $this->mRTTEstimate; + $rtt = $this->rttEstimate; } return $ok; @@ -3257,10 +3265,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware */ protected function reconnect() { $this->closeConnection(); - $this->mOpened = false; - $this->mConn = false; + $this->opened = false; + $this->conn = false; try { - $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname ); + $this->open( $this->server, $this->user, $this->password, $this->dbName ); $this->lastPing = microtime( true ); $ok = true; } catch ( DBConnectionError $e ) { @@ -3286,8 +3294,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @since 1.27 */ protected function getTransactionLagStatus() { - return $this->mTrxLevel - ? [ 'lag' => $this->mTrxReplicaLag, 'since' => $this->trxTimestamp() ] + return $this->trxLevel + ? [ 'lag' => $this->trxReplicaLag, 'since' => $this->trxTimestamp() ] : null; } @@ -3395,7 +3403,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function setSchemaVars( $vars ) { - $this->mSchemaVars = $vars; + $this->schemaVars = $vars; } public function sourceStream( @@ -3547,8 +3555,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @return array */ protected function getSchemaVars() { - if ( $this->mSchemaVars ) { - return $this->mSchemaVars; + if ( $this->schemaVars ) { + return $this->schemaVars; } else { return $this->getDefaultSchemaVars(); } @@ -3567,17 +3575,20 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } public function lockIsFree( $lockName, $method ) { - return true; + // RDBMs methods for checking named locks may or may not count this thread itself. + // In MySQL, IS_FREE_LOCK() returns 0 if the thread already has the lock. This is + // the behavior choosen by the interface for this method. + return !isset( $this->namedLocksHeld[$lockName] ); } public function lock( $lockName, $method, $timeout = 5 ) { - $this->mNamedLocksHeld[$lockName] = 1; + $this->namedLocksHeld[$lockName] = 1; return true; } public function unlock( $lockName, $method ) { - unset( $this->mNamedLocksHeld[$lockName] ); + unset( $this->namedLocksHeld[$lockName] ); return true; } @@ -3733,9 +3744,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** - * Get the underlying binding handle, mConn + * Get the underlying binding connection handle * - * Makes sure that mConn is set (disconnects and ping() failure can unset it). + * Makes sure the connection resource is set (disconnects and ping() failure can unset it). * This catches broken callers than catch and ignore disconnection exceptions. * Unlike checking isOpen(), this is safe to call inside of open(). * @@ -3744,14 +3755,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @since 1.26 */ protected function getBindingHandle() { - if ( !$this->mConn ) { + if ( !$this->conn ) { throw new DBUnexpectedError( $this, 'DB connection was already closed or the connection dropped.' ); } - return $this->mConn; + return $this->conn; } /** @@ -3759,7 +3770,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * @return string */ public function __toString() { - return (string)$this->mConn; + return (string)$this->conn; } /** @@ -3774,11 +3785,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware if ( $this->isOpen() ) { // Open a new connection resource without messing with the old one - $this->mOpened = false; - $this->mConn = false; - $this->mTrxEndCallbacks = []; // don't copy + $this->opened = false; + $this->conn = false; + $this->trxEndCallbacks = []; // don't copy $this->handleSessionLoss(); // no trx or locks anymore - $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname ); + $this->open( $this->server, $this->user, $this->password, $this->dbName ); $this->lastPing = microtime( true ); } } @@ -3797,8 +3808,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware * Run a few simple sanity checks and close dangling connections */ public function __destruct() { - if ( $this->mTrxLevel && $this->mTrxDoneWrites ) { - trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." ); + if ( $this->trxLevel && $this->trxDoneWrites ) { + trigger_error( "Uncommitted DB writes (transaction from {$this->trxFname})." ); } $danglingWriters = $this->pendingWriteAndCallbackCallers(); @@ -3807,14 +3818,14 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware trigger_error( "DB transaction writes or callbacks still pending ($fnames)." ); } - if ( $this->mConn ) { + if ( $this->conn ) { // Avoid connection leaks for sanity. Normally, resources close at script completion. // The connection might already be closed in zend/hhvm by now, so suppress warnings. Wikimedia\suppressWarnings(); $this->closeConnection(); Wikimedia\restoreWarnings(); - $this->mConn = false; - $this->mOpened = false; + $this->conn = false; + $this->opened = false; } } } diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php index 9a0e8c9cf5..b1c8909c30 100644 --- a/includes/libs/rdbms/database/DatabaseMssql.php +++ b/includes/libs/rdbms/database/DatabaseMssql.php @@ -35,19 +35,28 @@ use stdClass; * @ingroup Database */ class DatabaseMssql extends Database { - protected $mPort; - protected $mUseWindowsAuth = false; - - protected $mInsertId = null; - protected $mLastResult = null; - protected $mAffectedRows = null; - protected $mSubqueryId = 0; - protected $mScrollableCursor = true; - protected $mPrepareStatements = true; - protected $mBinaryColumnCache = null; - protected $mBitColumnCache = null; - protected $mIgnoreDupKeyErrors = false; - protected $mIgnoreErrors = []; + /** @var int */ + protected $serverPort; + /** @var bool */ + protected $useWindowsAuth = false; + /** @var int|null */ + protected $lastInsertId = null; + /** @var int|null */ + protected $lastAffectedRowCount = null; + /** @var int */ + protected $subqueryId = 0; + /** @var bool */ + protected $scrollableCursor = true; + /** @var bool */ + protected $prepareStatements = true; + /** @var stdClass[][]|null */ + protected $binaryColumnCache = null; + /** @var stdClass[][]|null */ + protected $bitColumnCache = null; + /** @var bool */ + protected $ignoreDupKeyErrors = false; + /** @var string[] */ + protected $ignoreErrors = []; public function implicitGroupby() { return false; @@ -62,8 +71,8 @@ class DatabaseMssql extends Database { } public function __construct( array $params ) { - $this->mPort = $params['port']; - $this->mUseWindowsAuth = $params['UseWindowsAuth']; + $this->serverPort = $params['port']; + $this->useWindowsAuth = $params['UseWindowsAuth']; parent::__construct( $params ); } @@ -93,10 +102,10 @@ class DatabaseMssql extends Database { } $this->close(); - $this->mServer = $server; - $this->mUser = $user; - $this->mPassword = $password; - $this->mDBname = $dbName; + $this->server = $server; + $this->user = $user; + $this->password = $password; + $this->dbName = $dbName; $connectionInfo = []; @@ -106,22 +115,22 @@ class DatabaseMssql extends Database { // Decide which auth scenerio to use // if we are using Windows auth, then don't add credentials to $connectionInfo - if ( !$this->mUseWindowsAuth ) { + if ( !$this->useWindowsAuth ) { $connectionInfo['UID'] = $user; $connectionInfo['PWD'] = $password; } Wikimedia\suppressWarnings(); - $this->mConn = sqlsrv_connect( $server, $connectionInfo ); + $this->conn = sqlsrv_connect( $server, $connectionInfo ); Wikimedia\restoreWarnings(); - if ( $this->mConn === false ) { + if ( $this->conn === false ) { throw new DBConnectionError( $this, $this->lastError() ); } - $this->mOpened = true; + $this->opened = true; - return $this->mConn; + return $this->conn; } /** @@ -130,7 +139,7 @@ class DatabaseMssql extends Database { * @return bool */ protected function closeConnection() { - return sqlsrv_close( $this->mConn ); + return sqlsrv_close( $this->conn ); } /** @@ -178,25 +187,25 @@ class DatabaseMssql extends Database { // needed if we want to be able to seek around the result set), however CLIENT_BUFFERED // has a bug in the sqlsrv driver where wchar_t types (such as nvarchar) that are empty // strings make php throw a fatal error "Severe error translating Unicode" - if ( $this->mScrollableCursor ) { + if ( $this->scrollableCursor ) { $scrollArr = [ 'Scrollable' => SQLSRV_CURSOR_STATIC ]; } else { $scrollArr = []; } - if ( $this->mPrepareStatements ) { + if ( $this->prepareStatements ) { // we do prepare + execute so we can get its field metadata for later usage if desired - $stmt = sqlsrv_prepare( $this->mConn, $sql, [], $scrollArr ); + $stmt = sqlsrv_prepare( $this->conn, $sql, [], $scrollArr ); $success = sqlsrv_execute( $stmt ); } else { - $stmt = sqlsrv_query( $this->mConn, $sql, [], $scrollArr ); + $stmt = sqlsrv_query( $this->conn, $sql, [], $scrollArr ); $success = (bool)$stmt; } // Make a copy to ensure what we add below does not get reflected in future queries - $ignoreErrors = $this->mIgnoreErrors; + $ignoreErrors = $this->ignoreErrors; - if ( $this->mIgnoreDupKeyErrors ) { + if ( $this->ignoreDupKeyErrors ) { // ignore duplicate key errors // this emulates INSERT IGNORE in MySQL $ignoreErrors[] = '2601'; // duplicate key error caused by unique index @@ -220,7 +229,7 @@ class DatabaseMssql extends Database { } } // remember number of rows affected - $this->mAffectedRows = sqlsrv_rows_affected( $stmt ); + $this->lastAffectedRowCount = sqlsrv_rows_affected( $stmt ); return $stmt; } @@ -300,7 +309,7 @@ class DatabaseMssql extends Database { * @return int|null */ public function insertId() { - return $this->mInsertId; + return $this->lastInsertId; } /** @@ -354,7 +363,7 @@ class DatabaseMssql extends Database { * @return int */ protected function fetchAffectedRowCount() { - return $this->mAffectedRows; + return $this->lastAffectedRowCount; } /** @@ -381,8 +390,8 @@ class DatabaseMssql extends Database { $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds ); if ( isset( $options['EXPLAIN'] ) ) { try { - $this->mScrollableCursor = false; - $this->mPrepareStatements = false; + $this->scrollableCursor = false; + $this->prepareStatements = false; $this->query( "SET SHOWPLAN_ALL ON" ); $ret = $this->query( $sql, $fname ); $this->query( "SET SHOWPLAN_ALL OFF" ); @@ -402,13 +411,13 @@ class DatabaseMssql extends Database { } else { // someone actually wanted the query plan instead of an est row count // let them know of the error - $this->mScrollableCursor = true; - $this->mPrepareStatements = true; + $this->scrollableCursor = true; + $this->prepareStatements = true; throw $dqe; } } - $this->mScrollableCursor = true; - $this->mPrepareStatements = true; + $this->scrollableCursor = true; + $this->prepareStatements = true; return $ret; } return $this->query( $sql, $fname ); @@ -468,25 +477,25 @@ class DatabaseMssql extends Database { public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) { - $this->mScrollableCursor = false; + $this->scrollableCursor = false; try { parent::deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname ); } catch ( Exception $e ) { - $this->mScrollableCursor = true; + $this->scrollableCursor = true; throw $e; } - $this->mScrollableCursor = true; + $this->scrollableCursor = true; } public function delete( $table, $conds, $fname = __METHOD__ ) { - $this->mScrollableCursor = false; + $this->scrollableCursor = false; try { parent::delete( $table, $conds, $fname ); } catch ( Exception $e ) { - $this->mScrollableCursor = true; + $this->scrollableCursor = true; throw $e; } - $this->mScrollableCursor = true; + $this->scrollableCursor = true; } /** @@ -617,7 +626,7 @@ class DatabaseMssql extends Database { // remove IGNORE from options list and set ignore flag to true if ( in_array( 'IGNORE', $options ) ) { $options = array_diff( $options, [ 'IGNORE' ] ); - $this->mIgnoreDupKeyErrors = true; + $this->ignoreDupKeyErrors = true; } $ret = null; @@ -681,32 +690,32 @@ class DatabaseMssql extends Database { $sql .= ')' . $sqlPost; // Run the query - $this->mScrollableCursor = false; + $this->scrollableCursor = false; try { $ret = $this->query( $sql ); } catch ( Exception $e ) { - $this->mScrollableCursor = true; - $this->mIgnoreDupKeyErrors = false; + $this->scrollableCursor = true; + $this->ignoreDupKeyErrors = false; throw $e; } - $this->mScrollableCursor = true; + $this->scrollableCursor = true; if ( $ret instanceof ResultWrapper && !is_null( $identity ) ) { // Then we want to get the identity column value we were assigned and save it off $row = $ret->fetchObject(); if ( is_object( $row ) ) { - $this->mInsertId = $row->$identity; + $this->lastInsertId = $row->$identity; // It seems that mAffectedRows is -1 sometimes when OUTPUT INSERTED.identity is // used if we got an identity back, we know for sure a row was affected, so // adjust that here - if ( $this->mAffectedRows == -1 ) { - $this->mAffectedRows = 1; + if ( $this->lastAffectedRowCount == -1 ) { + $this->lastAffectedRowCount = 1; } } } } - $this->mIgnoreDupKeyErrors = false; + $this->ignoreDupKeyErrors = false; return $ret; } @@ -724,13 +733,13 @@ class DatabaseMssql extends Database { * @param array $insertOptions * @param array $selectOptions * @param array $selectJoinConds - * @return null|ResultWrapper + * @return bool * @throws Exception */ public function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__, $insertOptions = [], $selectOptions = [], $selectJoinConds = [] ) { - $this->mScrollableCursor = false; + $this->scrollableCursor = false; try { $ret = parent::nativeInsertSelect( $destTable, @@ -743,10 +752,10 @@ class DatabaseMssql extends Database { $selectJoinConds ); } catch ( Exception $e ) { - $this->mScrollableCursor = true; + $this->scrollableCursor = true; throw $e; } - $this->mScrollableCursor = true; + $this->scrollableCursor = true; return $ret; } @@ -787,14 +796,14 @@ class DatabaseMssql extends Database { $sql .= " WHERE " . $this->makeList( $conds, LIST_AND, $binaryColumns ); } - $this->mScrollableCursor = false; + $this->scrollableCursor = false; try { $this->query( $sql ); } catch ( Exception $e ) { - $this->mScrollableCursor = true; + $this->scrollableCursor = true; throw $e; } - $this->mScrollableCursor = true; + $this->scrollableCursor = true; return true; } @@ -887,9 +896,9 @@ class DatabaseMssql extends Database { $postOrder = ''; $first = $offset + 1; $last = $offset + $limit; - $sub1 = 'sub_' . $this->mSubqueryId; - $sub2 = 'sub_' . ( $this->mSubqueryId + 1 ); - $this->mSubqueryId += 2; + $sub1 = 'sub_' . $this->subqueryId; + $sub2 = 'sub_' . ( $this->subqueryId + 1 ); + $this->subqueryId += 2; if ( !$s1 ) { // wat throw new DBUnexpectedError( $this, "Attempting to LIMIT a non-SELECT query\n" ); @@ -953,7 +962,7 @@ class DatabaseMssql extends Database { * @return string Version information from the database */ public function getServerVersion() { - $server_info = sqlsrv_server_info( $this->mConn ); + $server_info = sqlsrv_server_info( $this->conn ); $version = 'Error'; if ( isset( $server_info['SQLServerVersion'] ) ) { $version = $server_info['SQLServerVersion']; @@ -977,7 +986,7 @@ class DatabaseMssql extends Database { } if ( $schema === false ) { - $schema = $this->mSchema; + $schema = $this->schema; } $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES @@ -1042,8 +1051,8 @@ class DatabaseMssql extends Database { * @param string $fname */ protected function doBegin( $fname = __METHOD__ ) { - sqlsrv_begin_transaction( $this->mConn ); - $this->mTrxLevel = 1; + sqlsrv_begin_transaction( $this->conn ); + $this->trxLevel = 1; } /** @@ -1051,8 +1060,8 @@ class DatabaseMssql extends Database { * @param string $fname */ protected function doCommit( $fname = __METHOD__ ) { - sqlsrv_commit( $this->mConn ); - $this->mTrxLevel = 0; + sqlsrv_commit( $this->conn ); + $this->trxLevel = 0; } /** @@ -1061,8 +1070,8 @@ class DatabaseMssql extends Database { * @param string $fname */ protected function doRollback( $fname = __METHOD__ ) { - sqlsrv_rollback( $this->mConn ); - $this->mTrxLevel = 0; + sqlsrv_rollback( $this->conn ); + $this->trxLevel = 0; } /** @@ -1131,7 +1140,7 @@ class DatabaseMssql extends Database { */ public function selectDB( $db ) { try { - $this->mDBname = $db; + $this->dbName = $db; $this->query( "USE $db" ); return true; } catch ( Exception $e ) { @@ -1204,8 +1213,8 @@ class DatabaseMssql extends Database { public function buildGroupConcatField( $delim, $table, $field, $conds = '', $join_conds = [] ) { - $gcsq = 'gcsq_' . $this->mSubqueryId; - $this->mSubqueryId++; + $gcsq = 'gcsq_' . $this->subqueryId; + $this->subqueryId++; $delimLen = strlen( $delim ); $fld = "{$field} + {$this->addQuotes( $delim )}"; @@ -1226,12 +1235,12 @@ class DatabaseMssql extends Database { $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) ); $tableRaw = array_pop( $tableRawArr ); - if ( $this->mBinaryColumnCache === null ) { + if ( $this->binaryColumnCache === null ) { $this->populateColumnCaches(); } - return isset( $this->mBinaryColumnCache[$tableRaw] ) - ? $this->mBinaryColumnCache[$tableRaw] + return isset( $this->binaryColumnCache[$tableRaw] ) + ? $this->binaryColumnCache[$tableRaw] : []; } @@ -1243,30 +1252,30 @@ class DatabaseMssql extends Database { $tableRawArr = explode( '.', preg_replace( '#\[([^\]]*)\]#', '$1', $table ) ); $tableRaw = array_pop( $tableRawArr ); - if ( $this->mBitColumnCache === null ) { + if ( $this->bitColumnCache === null ) { $this->populateColumnCaches(); } - return isset( $this->mBitColumnCache[$tableRaw] ) - ? $this->mBitColumnCache[$tableRaw] + return isset( $this->bitColumnCache[$tableRaw] ) + ? $this->bitColumnCache[$tableRaw] : []; } private function populateColumnCaches() { $res = $this->select( 'INFORMATION_SCHEMA.COLUMNS', '*', [ - 'TABLE_CATALOG' => $this->mDBname, - 'TABLE_SCHEMA' => $this->mSchema, + 'TABLE_CATALOG' => $this->dbName, + 'TABLE_SCHEMA' => $this->schema, 'DATA_TYPE' => [ 'varbinary', 'binary', 'image', 'bit' ] ] ); - $this->mBinaryColumnCache = []; - $this->mBitColumnCache = []; + $this->binaryColumnCache = []; + $this->bitColumnCache = []; foreach ( $res as $row ) { if ( $row->DATA_TYPE == 'bit' ) { - $this->mBitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row; + $this->bitColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row; } else { - $this->mBinaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row; + $this->binaryColumnCache[$row->TABLE_NAME][$row->COLUMN_NAME] = $row; } } } @@ -1330,9 +1339,9 @@ class DatabaseMssql extends Database { * @return bool|null */ public function prepareStatements( $value = null ) { - $old = $this->mPrepareStatements; + $old = $this->prepareStatements; if ( $value !== null ) { - $this->mPrepareStatements = $value; + $this->prepareStatements = $value; } return $old; @@ -1345,9 +1354,9 @@ class DatabaseMssql extends Database { * @return bool|null */ public function scrollableCursor( $value = null ) { - $old = $this->mScrollableCursor; + $old = $this->scrollableCursor; if ( $value !== null ) { - $this->mScrollableCursor = $value; + $this->scrollableCursor = $value; } return $old; diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index 390f9a9c3d..57b75445ef 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -60,6 +60,8 @@ abstract class DatabaseMysqlBase extends Database { protected $sqlMode; /** @var bool Use experimental UTF-8 transmission encoding */ protected $utf8Mode; + /** @var bool|null */ + protected $defaultBigSelects = null; /** @var string|null */ private $serverVersion = null; @@ -126,14 +128,14 @@ abstract class DatabaseMysqlBase extends Database { # Close/unset connection handle $this->close(); - $this->mServer = $server; - $this->mUser = $user; - $this->mPassword = $password; - $this->mDBname = $dbName; + $this->server = $server; + $this->user = $user; + $this->password = $password; + $this->dbName = $dbName; $this->installErrorHandler(); try { - $this->mConn = $this->mysqlConnect( $this->mServer ); + $this->conn = $this->mysqlConnect( $this->server ); } catch ( Exception $ex ) { $this->restoreErrorHandler(); throw $ex; @@ -141,7 +143,7 @@ abstract class DatabaseMysqlBase extends Database { $error = $this->restoreErrorHandler(); # Always log connection errors - if ( !$this->mConn ) { + if ( !$this->conn ) { if ( !$error ) { $error = $this->lastError(); } @@ -171,7 +173,7 @@ abstract class DatabaseMysqlBase extends Database { ] ) ); $this->queryLogger->debug( - "Error selecting database $dbName on server {$this->mServer}" ); + "Error selecting database $dbName on server {$this->server}" ); $this->reportConnectionError( "Error selecting database $dbName" ); } @@ -190,7 +192,7 @@ abstract class DatabaseMysqlBase extends Database { } // Set any custom settings defined by site config // (e.g. https://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html) - foreach ( $this->mSessionVars as $var => $val ) { + foreach ( $this->sessionVars as $var => $val ) { // Escape strings but not numbers to avoid MySQL complaining if ( !is_int( $val ) && !is_float( $val ) ) { $val = $this->addQuotes( $val ); @@ -213,7 +215,7 @@ abstract class DatabaseMysqlBase extends Database { } } - $this->mOpened = true; + $this->opened = true; return true; } @@ -465,10 +467,10 @@ abstract class DatabaseMysqlBase extends Database { * @return string */ public function lastError() { - if ( $this->mConn ) { + if ( $this->conn ) { # Even if it's non-zero, it can still be invalid Wikimedia\suppressWarnings(); - $error = $this->mysqlError( $this->mConn ); + $error = $this->mysqlError( $this->conn ); if ( !$error ) { $error = $this->mysqlError(); } @@ -477,7 +479,7 @@ abstract class DatabaseMysqlBase extends Database { $error = $this->mysqlError(); } if ( $error ) { - $error .= ' (' . $this->mServer . ')'; + $error .= ' (' . $this->server . ')'; } return $error; @@ -594,7 +596,7 @@ abstract class DatabaseMysqlBase extends Database { list( $database, , $prefix, $table ) = $this->qualifiedTableComponents( $table ); $tableName = "{$prefix}{$table}"; - if ( isset( $this->mSessionTempTables[$tableName] ) ) { + if ( isset( $this->sessionTempTables[$tableName] ) ) { return true; // already known to exist and won't show in SHOW TABLES anyway } @@ -890,9 +892,15 @@ abstract class DatabaseMysqlBase extends Database { } // Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set - if ( $pos->gtids ) { + if ( $pos->getGTIDs() ) { + // Ignore GTIDs from domains exclusive to the master DB (presumably inactive) + $rpos = $this->getReplicaPos(); + $gtidsWait = $rpos ? MySQLMasterPos::getCommonDomainGTIDs( $pos, $rpos ) : []; + if ( !$gtidsWait ) { + return -1; // $pos is from the wrong cluster? + } // Wait on the GTID set (MariaDB only) - $gtidArg = $this->addQuotes( implode( ',', $pos->gtids ) ); + $gtidArg = $this->addQuotes( implode( ',', $gtidsWait ) ); $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" ); } else { // Wait on the binlog coordinates @@ -910,7 +918,7 @@ abstract class DatabaseMysqlBase extends Database { // Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual $status = ( $row[0] !== null ) ? intval( $row[0] ) : null; if ( $status === null ) { - if ( !$pos->gtids ) { + if ( !$pos->getGTIDs() ) { // T126436: jobs programmed to wait on master positions might be referencing // binlogs with an old master hostname; this makes MASTER_POS_WAIT() return null. // Try to detect this case and treat the replica DB as having reached the given @@ -1079,6 +1087,10 @@ abstract class DatabaseMysqlBase extends Database { * @since 1.20 */ public function lockIsFree( $lockName, $method ) { + if ( !parent::lockIsFree( $lockName, $method ) ) { + return false; // already held + } + $encName = $this->addQuotes( $this->makeLockName( $lockName ) ); $result = $this->query( "SELECT IS_FREE_LOCK($encName) AS lockstatus", $method ); $row = $this->fetchObject( $result ); @@ -1170,14 +1182,14 @@ abstract class DatabaseMysqlBase extends Database { */ public function setBigSelects( $value = true ) { if ( $value === 'default' ) { - if ( $this->mDefaultBigSelects === null ) { + if ( $this->defaultBigSelects === null ) { # Function hasn't been called before so it must already be set to the default return; } else { - $value = $this->mDefaultBigSelects; + $value = $this->defaultBigSelects; } - } elseif ( $this->mDefaultBigSelects === null ) { - $this->mDefaultBigSelects = + } elseif ( $this->defaultBigSelects === null ) { + $this->defaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects', '', __METHOD__ ); } $encValue = $value ? '1' : '0'; @@ -1376,7 +1388,7 @@ abstract class DatabaseMysqlBase extends Database { */ public function listViews( $prefix = null, $fname = __METHOD__ ) { // The name of the column containing the name of the VIEW - $propertyName = 'Tables_in_' . $this->mDBname; + $propertyName = 'Tables_in_' . $this->dbName; // Query for the VIEWS $res = $this->query( 'SHOW FULL TABLES WHERE TABLE_TYPE = "VIEW"' ); @@ -1445,6 +1457,11 @@ abstract class DatabaseMysqlBase extends Database { return $index; } } + + protected function isTransactableQuery( $sql ) { + return parent::isTransactableQuery( $sql ) && + !preg_match( '/^SELECT\s+(GET|RELEASE|IS_FREE)_LOCK\(/', $sql ); + } } class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' ); diff --git a/includes/libs/rdbms/database/DatabaseMysqli.php b/includes/libs/rdbms/database/DatabaseMysqli.php index 09ea66cac8..9152d1e9f9 100644 --- a/includes/libs/rdbms/database/DatabaseMysqli.php +++ b/includes/libs/rdbms/database/DatabaseMysqli.php @@ -86,7 +86,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { $mysqli = mysqli_init(); $connFlags = 0; - if ( $this->mFlags & self::DBO_SSL ) { + if ( $this->flags & self::DBO_SSL ) { $connFlags |= MYSQLI_CLIENT_SSL; $mysqli->ssl_set( $this->sslKeyPath, @@ -96,10 +96,10 @@ class DatabaseMysqli extends DatabaseMysqlBase { $this->sslCiphers ); } - if ( $this->mFlags & self::DBO_COMPRESS ) { + if ( $this->flags & self::DBO_COMPRESS ) { $connFlags |= MYSQLI_CLIENT_COMPRESS; } - if ( $this->mFlags & self::DBO_PERSISTENT ) { + if ( $this->flags & self::DBO_PERSISTENT ) { $realServer = 'p:' . $realServer; } @@ -112,8 +112,8 @@ class DatabaseMysqli extends DatabaseMysqlBase { } $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 ); - if ( $mysqli->real_connect( $realServer, $this->mUser, - $this->mPassword, $this->mDBname, $port, $socket, $connFlags ) + if ( $mysqli->real_connect( $realServer, $this->user, + $this->password, $this->dbName, $port, $socket, $connFlags ) ) { return $mysqli; } @@ -162,8 +162,8 @@ class DatabaseMysqli extends DatabaseMysqlBase { * @return int */ function lastErrno() { - if ( $this->mConn ) { - return $this->mConn->errno; + if ( $this->conn ) { + return $this->conn->errno; } else { return mysqli_connect_errno(); } @@ -185,7 +185,7 @@ class DatabaseMysqli extends DatabaseMysqlBase { function selectDB( $db ) { $conn = $this->getBindingHandle(); - $this->mDBname = $db; + $this->dbName = $db; return $conn->select_db( $db ); } @@ -326,11 +326,11 @@ class DatabaseMysqli extends DatabaseMysqlBase { * @return string */ public function __toString() { - if ( $this->mConn instanceof mysqli ) { - return (string)$this->mConn->thread_id; + if ( $this->conn instanceof mysqli ) { + return (string)$this->conn->thread_id; } else { // mConn might be false or something. - return (string)$this->mConn; + return (string)$this->conn; } } } diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index 8fbb7de7ce..7d346410e5 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -35,16 +35,16 @@ class DatabasePostgres extends Database { protected $port; /** @var resource */ - protected $mLastResult = null; + protected $lastResultHandle = null; /** @var int The number of rows affected as an integer */ - protected $mAffectedRows = null; + protected $lastAffectedRowCount = null; /** @var float|string */ private $numericVersion = null; /** @var string Connect string to open a PostgreSQL connection */ private $connectString; /** @var string */ - private $mCoreSchema; + private $coreSchema; /** @var string[] Map of (reserved table name => alternate table name) */ private $keywordTableMap = []; @@ -97,10 +97,10 @@ class DatabasePostgres extends Database { ); } - $this->mServer = $server; - $this->mUser = $user; - $this->mPassword = $password; - $this->mDBname = $dbName; + $this->server = $server; + $this->user = $user; + $this->password = $password; + $this->dbName = $dbName; $connectVars = [ // pg_connect() user $user as the default database. Since a database is *required*, @@ -116,7 +116,7 @@ class DatabasePostgres extends Database { if ( (int)$this->port > 0 ) { $connectVars['port'] = (int)$this->port; } - if ( $this->mFlags & self::DBO_SSL ) { + if ( $this->flags & self::DBO_SSL ) { $connectVars['sslmode'] = 1; } @@ -126,7 +126,7 @@ class DatabasePostgres extends Database { try { // Use new connections to let LoadBalancer/LBFactory handle reuse - $this->mConn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW ); + $this->conn = pg_connect( $this->connectString, PGSQL_CONNECT_FORCE_NEW ); } catch ( Exception $ex ) { $this->restoreErrorHandler(); throw $ex; @@ -134,7 +134,7 @@ class DatabasePostgres extends Database { $phpError = $this->restoreErrorHandler(); - if ( !$this->mConn ) { + if ( !$this->conn ) { $this->queryLogger->debug( "DB connection error\n" . "Server: $server, Database: $dbName, User: $user, Password: " . @@ -144,7 +144,7 @@ class DatabasePostgres extends Database { throw new DBConnectionError( $this, str_replace( "\n", ' ', $phpError ) ); } - $this->mOpened = true; + $this->opened = true; # If called from the command-line (e.g. importDump), only show errors if ( $this->cliMode ) { @@ -159,11 +159,11 @@ class DatabasePostgres extends Database { $this->query( "SET bytea_output = 'escape'", __METHOD__ ); // PHP bug 53127 } - $this->determineCoreSchema( $this->mSchema ); + $this->determineCoreSchema( $this->schema ); // The schema to be used is now in the search path; no need for explicit qualification - $this->mSchema = ''; + $this->schema = ''; - return $this->mConn; + return $this->conn; } public function databasesAreIndependent() { @@ -178,8 +178,8 @@ class DatabasePostgres extends Database { * @throws DBUnexpectedError */ public function selectDB( $db ) { - if ( $this->mDBname !== $db ) { - return (bool)$this->open( $this->mServer, $this->mUser, $this->mPassword, $db ); + if ( $this->dbName !== $db ) { + return (bool)$this->open( $this->server, $this->user, $this->password, $db ); } else { return true; } @@ -199,7 +199,12 @@ class DatabasePostgres extends Database { } protected function closeConnection() { - return $this->mConn ? pg_close( $this->mConn ) : true; + return $this->conn ? pg_close( $this->conn ) : true; + } + + protected function isTransactableQuery( $sql ) { + return parent::isTransactableQuery( $sql ) && + !preg_match( '/^SELECT\s+pg_(try_|)advisory_\w+\(/', $sql ); } public function doQuery( $sql ) { @@ -213,13 +218,13 @@ class DatabasePostgres extends Database { if ( pg_send_query( $conn, $sql ) === false ) { throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" ); } - $this->mLastResult = pg_get_result( $conn ); - $this->mAffectedRows = null; - if ( pg_result_error( $this->mLastResult ) ) { + $this->lastResultHandle = pg_get_result( $conn ); + $this->lastAffectedRowCount = null; + if ( pg_result_error( $this->lastResultHandle ) ) { return false; } - return $this->mLastResult; + return $this->lastResultHandle; } protected function dumpError() { @@ -239,7 +244,7 @@ class DatabasePostgres extends Database { ]; foreach ( $diags as $d ) { $this->queryLogger->debug( sprintf( "PgSQL ERROR(%d): %s\n", - $d, pg_result_error_field( $this->mLastResult, $d ) ) ); + $d, pg_result_error_field( $this->lastResultHandle, $d ) ) ); } } @@ -253,7 +258,7 @@ class DatabasePostgres extends Database { } } /* Transaction stays in the ERROR state until rolled back */ - if ( $this->mTrxLevel ) { + if ( $this->trxLevel ) { // Throw away the transaction state, then raise the error as normal. // Note that if this connection is managed by LBFactory, it's already expected // that the other transactions LBFactory manages will be rolled back. @@ -365,9 +370,9 @@ class DatabasePostgres extends Database { } public function lastError() { - if ( $this->mConn ) { - if ( $this->mLastResult ) { - return pg_result_error( $this->mLastResult ); + if ( $this->conn ) { + if ( $this->lastResultHandle ) { + return pg_result_error( $this->lastResultHandle ); } else { return pg_last_error(); } @@ -377,23 +382,23 @@ class DatabasePostgres extends Database { } public function lastErrno() { - if ( $this->mLastResult ) { - return pg_result_error_field( $this->mLastResult, PGSQL_DIAG_SQLSTATE ); + if ( $this->lastResultHandle ) { + return pg_result_error_field( $this->lastResultHandle, PGSQL_DIAG_SQLSTATE ); } else { return false; } } protected function fetchAffectedRowCount() { - if ( !is_null( $this->mAffectedRows ) ) { + if ( !is_null( $this->lastAffectedRowCount ) ) { // Forced result for simulated queries - return $this->mAffectedRows; + return $this->lastAffectedRowCount; } - if ( empty( $this->mLastResult ) ) { + if ( empty( $this->lastResultHandle ) ) { return 0; } - return pg_affected_rows( $this->mLastResult ); + return pg_affected_rows( $this->lastResultHandle ); } /** @@ -639,7 +644,7 @@ __INDEXATTR__; $tempres = (bool)$this->query( $tempsql, $fname, $savepoint ); if ( $savepoint ) { - $bar = pg_result_error( $this->mLastResult ); + $bar = pg_result_error( $this->lastResultHandle ); if ( $bar != false ) { $savepoint->rollback(); } else { @@ -664,7 +669,7 @@ __INDEXATTR__; $sql .= '(' . $this->makeList( $args ) . ')'; $res = (bool)$this->query( $sql, $fname, $savepoint ); if ( $savepoint ) { - $bar = pg_result_error( $this->mLastResult ); + $bar = pg_result_error( $this->lastResultHandle ); if ( $bar != false ) { $savepoint->rollback(); } else { @@ -678,7 +683,7 @@ __INDEXATTR__; $savepoint->commit(); // Set the affected row count for the whole operation - $this->mAffectedRows = $numrowsinserted; + $this->lastAffectedRowCount = $numrowsinserted; // IGNORE always returns true return true; @@ -963,7 +968,7 @@ __INDEXATTR__; $this->begin( __METHOD__, self::TRANSACTION_INTERNAL ); if ( $this->schemaExists( $desiredSchema ) ) { if ( in_array( $desiredSchema, $this->getSchemas() ) ) { - $this->mCoreSchema = $desiredSchema; + $this->coreSchema = $desiredSchema; $this->queryLogger->debug( "Schema \"" . $desiredSchema . "\" already in the search path\n" ); } else { @@ -976,15 +981,15 @@ __INDEXATTR__; array_unshift( $search_path, $this->addIdentifierQuotes( $desiredSchema ) ); $this->setSearchPath( $search_path ); - $this->mCoreSchema = $desiredSchema; + $this->coreSchema = $desiredSchema; $this->queryLogger->debug( "Schema \"" . $desiredSchema . "\" added to the search path\n" ); } } else { - $this->mCoreSchema = $this->getCurrentSchema(); + $this->coreSchema = $this->getCurrentSchema(); $this->queryLogger->debug( "Schema \"" . $desiredSchema . "\" not found, using current \"" . - $this->mCoreSchema . "\"\n" ); + $this->coreSchema . "\"\n" ); } /* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */ $this->commit( __METHOD__, self::FLUSHING_INTERNAL ); @@ -997,7 +1002,7 @@ __INDEXATTR__; * @return string Core schema name */ public function getCoreSchema() { - return $this->mCoreSchema; + return $this->coreSchema; } public function getServerVersion() { @@ -1255,11 +1260,11 @@ SQL; } public function getDBname() { - return $this->mDBname; + return $this->dbName; } public function getServer() { - return $this->mServer; + return $this->server; } public function buildConcat( $stringList ) { @@ -1319,6 +1324,9 @@ SQL; } public function lockIsFree( $lockName, $method ) { + if ( !parent::lockIsFree( $lockName, $method ) ) { + return false; // already held + } // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) ); $result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key)) diff --git a/includes/libs/rdbms/database/DatabaseSqlite.php b/includes/libs/rdbms/database/DatabaseSqlite.php index 01772cf809..58b6ef934c 100644 --- a/includes/libs/rdbms/database/DatabaseSqlite.php +++ b/includes/libs/rdbms/database/DatabaseSqlite.php @@ -46,12 +46,12 @@ class DatabaseSqlite extends Database { protected $trxMode; /** @var int The number of rows affected as an integer */ - protected $mAffectedRows; + protected $lastAffectedRowCount; /** @var resource */ - protected $mLastResult; + protected $lastResultHandle; /** @var PDO */ - protected $mConn; + protected $conn; /** @var FSLockManager (hopefully on the same server as the DB) */ protected $lockMgr; @@ -79,8 +79,8 @@ class DatabaseSqlite extends Database { throw new InvalidArgumentException( "Need 'dbDirectory' or 'dbFilePath' parameter." ); } else { $this->dbDir = $p['dbDirectory']; - $this->mDBname = $p['dbname']; - $lockDomain = $this->mDBname; + $this->dbName = $p['dbname']; + $lockDomain = $this->dbName; // Stock wiki mode using standard file names per DB. parent::__construct( $p ); // Super doesn't open when $user is false, but we can work with $dbName @@ -153,12 +153,12 @@ class DatabaseSqlite extends Database { $this->close(); $fileName = self::generateFileName( $this->dbDir, $dbName ); if ( !is_readable( $fileName ) ) { - $this->mConn = false; + $this->conn = false; throw new DBConnectionError( $this, "SQLite database not accessible" ); } $this->openFile( $fileName ); - return (bool)$this->mConn; + return (bool)$this->conn; } /** @@ -173,29 +173,29 @@ class DatabaseSqlite extends Database { $this->dbPath = $fileName; try { - if ( $this->mFlags & self::DBO_PERSISTENT ) { - $this->mConn = new PDO( "sqlite:$fileName", '', '', + if ( $this->flags & self::DBO_PERSISTENT ) { + $this->conn = new PDO( "sqlite:$fileName", '', '', [ PDO::ATTR_PERSISTENT => true ] ); } else { - $this->mConn = new PDO( "sqlite:$fileName", '', '' ); + $this->conn = new PDO( "sqlite:$fileName", '', '' ); } } catch ( PDOException $e ) { $err = $e->getMessage(); } - if ( !$this->mConn ) { + if ( !$this->conn ) { $this->queryLogger->debug( "DB connection error: $err\n" ); throw new DBConnectionError( $this, $err ); } - $this->mOpened = !!$this->mConn; - if ( $this->mOpened ) { + $this->opened = !!$this->conn; + if ( $this->opened ) { # Set error codes only, don't raise exceptions - $this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); + $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); # Enforce LIKE to be case sensitive, just like MySQL $this->query( 'PRAGMA case_sensitive_like = 1' ); - return $this->mConn; + return $this->conn; } return false; @@ -218,7 +218,7 @@ class DatabaseSqlite extends Database { * @return bool */ protected function closeConnection() { - $this->mConn = null; + $this->conn = null; return true; } @@ -311,13 +311,13 @@ class DatabaseSqlite extends Database { * @return bool|ResultWrapper */ protected function doQuery( $sql ) { - $res = $this->mConn->query( $sql ); + $res = $this->conn->query( $sql ); if ( $res === false ) { return false; } $r = $res instanceof ResultWrapper ? $res->result : $res; - $this->mAffectedRows = $r->rowCount(); + $this->lastAffectedRowCount = $r->rowCount(); $res = new ResultWrapper( $this, $r->fetchAll() ); return $res; @@ -447,7 +447,7 @@ class DatabaseSqlite extends Database { */ function insertId() { // PDO::lastInsertId yields a string :( - return intval( $this->mConn->lastInsertId() ); + return intval( $this->conn->lastInsertId() ); } /** @@ -472,10 +472,10 @@ class DatabaseSqlite extends Database { * @return string */ function lastError() { - if ( !is_object( $this->mConn ) ) { + if ( !is_object( $this->conn ) ) { return "Cannot return last error, no db connection"; } - $e = $this->mConn->errorInfo(); + $e = $this->conn->errorInfo(); return isset( $e[2] ) ? $e[2] : ''; } @@ -484,10 +484,10 @@ class DatabaseSqlite extends Database { * @return string */ function lastErrno() { - if ( !is_object( $this->mConn ) ) { + if ( !is_object( $this->conn ) ) { return "Cannot return last error, no db connection"; } else { - $info = $this->mConn->errorInfo(); + $info = $this->conn->errorInfo(); return $info[1]; } @@ -497,7 +497,7 @@ class DatabaseSqlite extends Database { * @return int */ protected function fetchAffectedRowCount() { - return $this->mAffectedRows; + return $this->lastAffectedRowCount; } /** @@ -720,7 +720,7 @@ class DatabaseSqlite extends Database { * @return string Version information from the database */ function getServerVersion() { - $ver = $this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION ); + $ver = $this->conn->getAttribute( PDO::ATTR_SERVER_VERSION ); return $ver; } @@ -752,7 +752,7 @@ class DatabaseSqlite extends Database { } else { $this->query( 'BEGIN', $fname ); } - $this->mTrxLevel = 1; + $this->trxLevel = 1; } /** @@ -810,7 +810,7 @@ class DatabaseSqlite extends Database { ); return "x'" . bin2hex( (string)$s ) . "'"; } else { - return $this->mConn->quote( (string)$s ); + return $this->conn->quote( (string)$s ); } } @@ -1054,7 +1054,7 @@ class DatabaseSqlite extends Database { * @return string */ public function __toString() { - return 'SQLite ' . (string)$this->mConn->getAttribute( PDO::ATTR_SERVER_VERSION ); + return 'SQLite ' . (string)$this->conn->getAttribute( PDO::ATTR_SERVER_VERSION ); } } diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 0964dd55fe..d59bee38c1 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -1776,7 +1776,7 @@ interface IDatabase { public function setSchemaVars( $vars ); /** - * Check to see if a named lock is available (non-blocking) + * Check to see if a named lock is not locked by any thread (non-blocking) * * @param string $lockName Name of lock to poll * @param string $method Name of method calling us diff --git a/includes/libs/rdbms/database/position/MySQLMasterPos.php b/includes/libs/rdbms/database/position/MySQLMasterPos.php index e5bb2c0147..2ee9068446 100644 --- a/includes/libs/rdbms/database/position/MySQLMasterPos.php +++ b/includes/libs/rdbms/database/position/MySQLMasterPos.php @@ -32,9 +32,15 @@ class MySQLMasterPos implements DBMasterPos { $this->binlog = $m[1]; // ideally something like host name $this->pos = [ (int)$m[2], (int)$m[3] ]; } else { - $this->gtids = array_map( 'trim', explode( ',', $position ) ); + $gtids = array_filter( array_map( 'trim', explode( ',', $position ) ) ); + foreach ( $gtids as $gtid ) { + if ( !$this->parseGTID( $gtid ) ) { + throw new InvalidArgumentException( "Invalid GTID '$gtid'." ); + } + $this->gtids[] = $gtid; + } if ( !$this->gtids ) { - throw new InvalidArgumentException( "GTID set should not be empty." ); + throw new InvalidArgumentException( "Got empty GTID set." ); } } @@ -54,14 +60,18 @@ class MySQLMasterPos implements DBMasterPos { $thisPosByDomain = $this->getGtidCoordinates(); $thatPosByDomain = $pos->getGtidCoordinates(); if ( $thisPosByDomain && $thatPosByDomain ) { - $reached = true; - // Check that this has positions GTE all of those in $pos for all domains in $pos + $comparisons = []; + // Check that this has positions reaching those in $pos for all domains in common foreach ( $thatPosByDomain as $domain => $thatPos ) { - $thisPos = isset( $thisPosByDomain[$domain] ) ? $thisPosByDomain[$domain] : -1; - $reached = $reached && ( $thatPos <= $thisPos ); + if ( isset( $thisPosByDomain[$domain] ) ) { + $comparisons[] = ( $thatPos <= $thisPosByDomain[$domain] ); + } } - - return $reached; + // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB + // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot + // be cleaned up. Assume that the domains in both this and $pos cover the relevant + // active channels. + return ( $comparisons && !in_array( false, $comparisons, true ) ); } // Fallback to the binlog file comparisons @@ -84,8 +94,11 @@ class MySQLMasterPos implements DBMasterPos { $thisPosDomains = array_keys( $this->getGtidCoordinates() ); $thatPosDomains = array_keys( $pos->getGtidCoordinates() ); if ( $thisPosDomains && $thatPosDomains ) { - // Check that this has GTIDs for all domains in $pos - return !array_diff( $thatPosDomains, $thisPosDomains ); + // Check that $this has a GTID for at least one domain also in $pos; due to MariaDB + // quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot + // easily be cleaned up. Assume that the domains in both this and $pos cover the + // relevant active channels. + return array_intersect( $thatPosDomains, $thisPosDomains ) ? true : false; } // Fallback to the binlog file comparisons @@ -102,6 +115,13 @@ class MySQLMasterPos implements DBMasterPos { return $this->gtids ? null : "{$this->binlog}.{$this->pos[0]}"; } + /** + * @return string[] + */ + public function getGTIDs() { + return $this->gtids; + } + /** * @return string GTID set or / (e.g db1034-bin.000976/843431247) */ @@ -112,7 +132,25 @@ class MySQLMasterPos implements DBMasterPos { } /** - * @note: this returns false for multi-source replication GTID sets + * @param MySQLMasterPos $pos + * @param MySQLMasterPos $refPos + * @return string[] List of GTIDs from $pos that have domains in $refPos + */ + public static function getCommonDomainGTIDs( MySQLMasterPos $pos, MySQLMasterPos $refPos ) { + $gtidsCommon = []; + + $relevantDomains = $refPos->getGtidCoordinates(); // (domain => unused) + foreach ( $pos->gtids as $gtid ) { + list( $domain ) = self::parseGTID( $gtid ); + if ( isset( $relevantDomains[$domain] ) ) { + $gtidsCommon[] = $gtid; + } + } + + return $gtidsCommon; + } + + /** * @see https://mariadb.com/kb/en/mariadb/gtid * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html * @return array Map of (domain => integer position); possibly empty @@ -120,23 +158,30 @@ class MySQLMasterPos implements DBMasterPos { protected function getGtidCoordinates() { $gtidInfos = []; foreach ( $this->gtids as $gtid ) { - $m = []; - // MariaDB style: -- - if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) { - $gtidInfos[(int)$m[1]] = (int)$m[2]; - // MySQL style: : - } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) { - $gtidInfos[$m[1]] = (int)$m[2]; - } else { - $gtidInfos = []; - break; // unrecognized GTID - } - + list( $domain, $pos ) = self::parseGTID( $gtid ); + $gtidInfos[$domain] = $pos; } return $gtidInfos; } + /** + * @param string $gtid + * @return array|null [domain, integer position] or null + */ + protected static function parseGTID( $gtid ) { + $m = []; + if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) { + // MariaDB style: -- + return [ (int)$m[1], (int)$m[2] ]; + } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) { + // MySQL style: : + return [ $m[1], (int)$m[2] ]; + } + + return null; + } + /** * @see https://dev.mysql.com/doc/refman/5.7/en/show-master-status.html * @see https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html diff --git a/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php b/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php index 4b79044655..ba79be14f0 100644 --- a/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php +++ b/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php @@ -6,7 +6,7 @@ use stdClass; class MssqlResultWrapper extends ResultWrapper { /** @var int|null */ - private $mSeekTo = null; + private $seekTo = null; /** * @return stdClass|bool @@ -14,10 +14,10 @@ class MssqlResultWrapper extends ResultWrapper { public function fetchObject() { $res = $this->result; - if ( $this->mSeekTo !== null ) { + if ( $this->seekTo !== null ) { $result = sqlsrv_fetch_object( $res, stdClass::class, [], - SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo ); - $this->mSeekTo = null; + SQLSRV_SCROLL_ABSOLUTE, $this->seekTo ); + $this->seekTo = null; } else { $result = sqlsrv_fetch_object( $res ); } @@ -36,10 +36,10 @@ class MssqlResultWrapper extends ResultWrapper { public function fetchRow() { $res = $this->result; - if ( $this->mSeekTo !== null ) { + if ( $this->seekTo !== null ) { $result = sqlsrv_fetch_array( $res, SQLSRV_FETCH_BOTH, - SQLSRV_SCROLL_ABSOLUTE, $this->mSeekTo ); - $this->mSeekTo = null; + SQLSRV_SCROLL_ABSOLUTE, $this->seekTo ); + $this->seekTo = null; } else { $result = sqlsrv_fetch_array( $res ); } @@ -70,7 +70,7 @@ class MssqlResultWrapper extends ResultWrapper { } // Unlike MySQL, the seek actually happens on the next access - $this->mSeekTo = $row; + $this->seekTo = $row; return true; } } diff --git a/includes/libs/rdbms/encasing/Blob.php b/includes/libs/rdbms/encasing/Blob.php index e2d685cbb9..7bc3eacfe8 100644 --- a/includes/libs/rdbms/encasing/Blob.php +++ b/includes/libs/rdbms/encasing/Blob.php @@ -4,17 +4,17 @@ namespace Wikimedia\Rdbms; class Blob implements IBlob { /** @var string */ - protected $mData; + protected $data; /** * @param string $data */ public function __construct( $data ) { - $this->mData = $data; + $this->data = $data; } public function fetch() { - return $this->mData; + return $this->data; } } diff --git a/includes/libs/rdbms/encasing/MssqlBlob.php b/includes/libs/rdbms/encasing/MssqlBlob.php index aacdf402f4..8e68aba0d7 100644 --- a/includes/libs/rdbms/encasing/MssqlBlob.php +++ b/includes/libs/rdbms/encasing/MssqlBlob.php @@ -12,11 +12,11 @@ class MssqlBlob extends Blob { if ( $data instanceof MssqlBlob ) { return $data; } elseif ( $data instanceof Blob ) { - $this->mData = $data->fetch(); + $this->data = $data->fetch(); } elseif ( is_array( $data ) && is_object( $data ) ) { - $this->mData = serialize( $data ); + $this->data = serialize( $data ); } else { - $this->mData = $data; + $this->data = $data; } } @@ -26,14 +26,14 @@ class MssqlBlob extends Blob { * @return string */ public function fetch() { - if ( $this->mData === null ) { + if ( $this->data === null ) { return 'null'; } $ret = '0x'; - $dataLength = strlen( $this->mData ); + $dataLength = strlen( $this->data ); for ( $i = 0; $i < $dataLength; $i++ ) { - $ret .= bin2hex( pack( 'C', ord( $this->mData[$i] ) ) ); + $ret .= bin2hex( pack( 'C', ord( $this->data[$i] ) ) ); } return $ret; diff --git a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php index e246b79f80..7bbb530730 100644 --- a/includes/libs/rdbms/loadbalancer/ILoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/ILoadBalancer.php @@ -170,15 +170,21 @@ interface ILoadBalancer { public function getAnyOpenConnection( $i ); /** - * Get a connection by index + * Get a connection handle by server index * * Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first) * + * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also + * call ILoadBalancer::reuseConnection() on the handle when finished using it. + * In all other cases, this is not necessary, though not harmful either. + * * @param int $i Server index or DB_MASTER/DB_REPLICA * @param array|string|bool $groups Query group(s), or false for the generic reader * @param string|bool $domain Domain ID, or false for the current domain * @param int $flags Bitfield of CONN_* class constants * + * @note This method throws DBAccessError if ILoadBalancer::disable() was called + * * @throws DBError * @return Database */ @@ -193,7 +199,7 @@ interface ILoadBalancer { * @param IDatabase $conn * @throws InvalidArgumentException */ - public function reuseConnection( $conn ); + public function reuseConnection( IDatabase $conn ); /** * Get a database connection handle reference @@ -254,7 +260,11 @@ interface ILoadBalancer { * * Avoid using CONN_TRX_AUTO with sqlite (e.g. check getServerType() first) * - * @note If disable() was called on this LoadBalancer, this method will throw a DBAccessError. + * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also + * call ILoadBalancer::reuseConnection() on the handle when finished using it. + * In all other cases, this is not necessary, though not harmful either. + * + * @note This method throws DBAccessError if ILoadBalancer::disable() was called * * @param int $i Server index (does not support DB_MASTER/DB_REPLICA) * @param string|bool $domain Domain ID, or false for the current domain diff --git a/includes/libs/rdbms/loadbalancer/LoadBalancer.php b/includes/libs/rdbms/loadbalancer/LoadBalancer.php index 04b3ea33f1..569ea0e06c 100644 --- a/includes/libs/rdbms/loadbalancer/LoadBalancer.php +++ b/includes/libs/rdbms/loadbalancer/LoadBalancer.php @@ -39,15 +39,15 @@ use Exception; */ class LoadBalancer implements ILoadBalancer { /** @var array[] Map of (server index => server config array) */ - private $mServers; + private $servers; /** @var Database[][][] Map of (connection category => server index => IDatabase[]) */ - private $mConns; + private $conns; /** @var float[] Map of (server index => weight) */ - private $mLoads; + private $loads; /** @var array[] Map of (group => server index => weight) */ - private $mGroupLoads; + private $groupLoads; /** @var bool Whether to disregard replica DB lag as a factor in replica DB selection */ - private $mAllowLagged; + private $allowLagged; /** @var int Seconds to spend waiting on replica DB lag to resolve */ private $waitTimeout; /** @var array The LoadMonitor configuration */ @@ -79,15 +79,15 @@ class LoadBalancer implements ILoadBalancer { /** @var Database DB connection object that caused a problem */ private $errorConnection; /** @var int The generic (not query grouped) replica DB index (of $mServers) */ - private $mReadIndex; + private $readIndex; /** @var bool|DBMasterPos False if not set */ - private $mWaitForPos; + private $waitForPos; /** @var bool Whether the generic reader fell back to a lagged replica DB */ private $laggedReplicaMode = false; /** @var bool Whether the generic reader fell back to a lagged replica DB */ private $allReplicasDownMode = false; /** @var string The last DB selection or connection error */ - private $mLastError = 'Unknown error'; + private $lastError = 'Unknown error'; /** @var string|bool Reason the LB is read-only or false if not */ private $readOnlyReason = false; /** @var int Total connections opened */ @@ -139,12 +139,12 @@ class LoadBalancer implements ILoadBalancer { if ( !isset( $params['servers'] ) ) { throw new InvalidArgumentException( __CLASS__ . ': missing servers parameter' ); } - $this->mServers = $params['servers']; - foreach ( $this->mServers as $i => $server ) { + $this->servers = $params['servers']; + foreach ( $this->servers as $i => $server ) { if ( $i == 0 ) { - $this->mServers[$i]['master'] = true; + $this->servers[$i]['master'] = true; } else { - $this->mServers[$i]['replica'] = true; + $this->servers[$i]['replica'] = true; } } @@ -157,8 +157,8 @@ class LoadBalancer implements ILoadBalancer { ? $params['waitTimeout'] : self::MAX_WAIT_DEFAULT; - $this->mReadIndex = -1; - $this->mConns = [ + $this->readIndex = -1; + $this->conns = [ // Connection were transaction rounds may be applied self::KEY_LOCAL => [], self::KEY_FOREIGN_INUSE => [], @@ -168,9 +168,9 @@ class LoadBalancer implements ILoadBalancer { self::KEY_FOREIGN_INUSE_NOROUND => [], self::KEY_FOREIGN_FREE_NOROUND => [] ]; - $this->mLoads = []; - $this->mWaitForPos = false; - $this->mAllowLagged = false; + $this->loads = []; + $this->waitForPos = false; + $this->allowLagged = false; if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) { $this->readOnlyReason = $params['readOnlyReason']; @@ -188,13 +188,13 @@ class LoadBalancer implements ILoadBalancer { $this->loadMonitorConfig += [ 'lagWarnThreshold' => $this->maxLag ]; foreach ( $params['servers'] as $i => $server ) { - $this->mLoads[$i] = $server['load']; + $this->loads[$i] = $server['load']; if ( isset( $server['groupLoads'] ) ) { foreach ( $server['groupLoads'] as $group => $ratio ) { - if ( !isset( $this->mGroupLoads[$group] ) ) { - $this->mGroupLoads[$group] = []; + if ( !isset( $this->groupLoads[$group] ) ) { + $this->groupLoads[$group] = []; } - $this->mGroupLoads[$group][$i] = $ratio; + $this->groupLoads[$group][$i] = $ratio; } } } @@ -289,8 +289,8 @@ class LoadBalancer implements ILoadBalancer { foreach ( $lags as $i => $lag ) { if ( $i != 0 ) { # How much lag this server nominally is allowed to have - $maxServerLag = isset( $this->mServers[$i]['max lag'] ) - ? $this->mServers[$i]['max lag'] + $maxServerLag = isset( $this->servers[$i]['max lag'] ) + ? $this->servers[$i]['max lag'] : $this->maxLag; // default # Constrain that futher by $maxLag argument $maxServerLag = min( $maxServerLag, $maxLag ); @@ -298,11 +298,13 @@ class LoadBalancer implements ILoadBalancer { $host = $this->getServerName( $i ); if ( $lag === false && !is_infinite( $maxServerLag ) ) { $this->replLogger->error( - "Server {host} is not replicating?", [ 'host' => $host ] ); + __METHOD__ . + ": server {host} is not replicating?", [ 'host' => $host ] ); unset( $loads[$i] ); } elseif ( $lag > $maxServerLag ) { $this->replLogger->info( - "Server {host} has {lag} seconds of lag (>= {maxlag})", + __METHOD__ . + ": server {host} has {lag} seconds of lag (>= {maxlag})", [ 'host' => $host, 'lag' => $lag, 'maxlag' => $maxServerLag ] ); unset( $loads[$i] ); @@ -332,18 +334,18 @@ class LoadBalancer implements ILoadBalancer { } public function getReaderIndex( $group = false, $domain = false ) { - if ( count( $this->mServers ) == 1 ) { + if ( count( $this->servers ) == 1 ) { // Skip the load balancing if there's only one server return $this->getWriterIndex(); - } elseif ( $group === false && $this->mReadIndex >= 0 ) { + } elseif ( $group === false && $this->readIndex >= 0 ) { // Shortcut if the generic reader index was already cached - return $this->mReadIndex; + return $this->readIndex; } if ( $group !== false ) { // Use the server weight array for this load group - if ( isset( $this->mGroupLoads[$group] ) ) { - $loads = $this->mGroupLoads[$group]; + if ( isset( $this->groupLoads[$group] ) ) { + $loads = $this->groupLoads[$group]; } else { // No loads for this group, return false and the caller can use some other group $this->connLogger->info( __METHOD__ . ": no loads for group $group" ); @@ -352,7 +354,7 @@ class LoadBalancer implements ILoadBalancer { } } else { // Use the generic load group - $loads = $this->mLoads; + $loads = $this->loads; } // Scale the configured load ratios according to each server's load and state @@ -365,7 +367,7 @@ class LoadBalancer implements ILoadBalancer { return false; } - if ( $this->mWaitForPos && $i != $this->getWriterIndex() ) { + if ( $this->waitForPos && $i != $this->getWriterIndex() ) { // Before any data queries are run, wait for the server to catch up to the // specified position. This is used to improve session consistency. Note that // when LoadBalancer::waitFor() sets mWaitForPos, the waiting triggers here, @@ -375,9 +377,9 @@ class LoadBalancer implements ILoadBalancer { } } - if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) { + if ( $this->readIndex <= 0 && $this->loads[$i] > 0 && $group === false ) { // Cache the generic reader index for future ungrouped DB_REPLICA handles - $this->mReadIndex = $i; + $this->readIndex = $i; // Record if the generic reader index is in "lagged replica DB" mode if ( $laggedReplicaMode ) { $this->laggedReplicaMode = true; @@ -408,15 +410,15 @@ class LoadBalancer implements ILoadBalancer { // Quickly look through the available servers for a server that meets criteria... $currentLoads = $loads; while ( count( $currentLoads ) ) { - if ( $this->mAllowLagged || $laggedReplicaMode ) { + if ( $this->allowLagged || $laggedReplicaMode ) { $i = ArrayUtils::pickRandom( $currentLoads ); } else { $i = false; - if ( $this->mWaitForPos && $this->mWaitForPos->asOfTime() ) { + if ( $this->waitForPos && $this->waitForPos->asOfTime() ) { // ChronologyProtecter sets mWaitForPos for session consistency. // This triggers doWait() after connect, so it's especially good to // avoid lagged servers so as to avoid excessive delay in that method. - $ago = microtime( true ) - $this->mWaitForPos->asOfTime(); + $ago = microtime( true ) - $this->waitForPos->asOfTime(); // Aim for <= 1 second of waiting (being too picky can backfire) $i = $this->getRandomNonLagged( $currentLoads, $domain, $ago + 1 ); } @@ -426,7 +428,8 @@ class LoadBalancer implements ILoadBalancer { } if ( $i === false && count( $currentLoads ) != 0 ) { // All replica DBs lagged. Switch to read-only mode - $this->replLogger->error( "All replica DBs lagged. Switch to read-only mode" ); + $this->replLogger->error( + __METHOD__ . ": all replica DBs lagged. Switch to read-only mode" ); $i = ArrayUtils::pickRandom( $currentLoads ); $laggedReplicaMode = true; } @@ -464,18 +467,18 @@ class LoadBalancer implements ILoadBalancer { // If all servers were down, quit now if ( !count( $currentLoads ) ) { - $this->connLogger->error( "All servers down" ); + $this->connLogger->error( __METHOD__ . ": all servers down" ); } return [ $i, $laggedReplicaMode ]; } public function waitFor( $pos ) { - $oldPos = $this->mWaitForPos; + $oldPos = $this->waitForPos; try { - $this->mWaitForPos = $pos; + $this->waitForPos = $pos; // If a generic reader connection was already established, then wait now - $i = $this->mReadIndex; + $i = $this->readIndex; if ( $i > 0 ) { if ( !$this->doWait( $i ) ) { $this->laggedReplicaMode = true; @@ -488,14 +491,14 @@ class LoadBalancer implements ILoadBalancer { } public function waitForOne( $pos, $timeout = null ) { - $oldPos = $this->mWaitForPos; + $oldPos = $this->waitForPos; try { - $this->mWaitForPos = $pos; + $this->waitForPos = $pos; - $i = $this->mReadIndex; + $i = $this->readIndex; if ( $i <= 0 ) { // Pick a generic replica DB if there isn't one yet - $readLoads = $this->mLoads; + $readLoads = $this->loads; unset( $readLoads[$this->getWriterIndex()] ); // replica DBs only $readLoads = array_filter( $readLoads ); // with non-zero load $i = ArrayUtils::pickRandom( $readLoads ); @@ -508,7 +511,7 @@ class LoadBalancer implements ILoadBalancer { } } finally { # Restore the old position, as this is not used for lag-protection but for throttling - $this->mWaitForPos = $oldPos; + $this->waitForPos = $oldPos; } return $ok; @@ -517,14 +520,14 @@ class LoadBalancer implements ILoadBalancer { public function waitForAll( $pos, $timeout = null ) { $timeout = $timeout ?: $this->waitTimeout; - $oldPos = $this->mWaitForPos; + $oldPos = $this->waitForPos; try { - $this->mWaitForPos = $pos; - $serverCount = count( $this->mServers ); + $this->waitForPos = $pos; + $serverCount = count( $this->servers ); $ok = true; for ( $i = 1; $i < $serverCount; $i++ ) { - if ( $this->mLoads[$i] > 0 ) { + if ( $this->loads[$i] > 0 ) { $start = microtime( true ); $ok = $this->doWait( $i, true, $timeout ) && $ok; $timeout -= ( microtime( true ) - $start ); @@ -535,7 +538,7 @@ class LoadBalancer implements ILoadBalancer { } } finally { # Restore the old position, as this is not used for lag-protection but for throttling - $this->mWaitForPos = $oldPos; + $this->waitForPos = $oldPos; } return $ok; @@ -549,8 +552,8 @@ class LoadBalancer implements ILoadBalancer { return; } - if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) { - $this->mWaitForPos = $pos; + if ( !$this->waitForPos || $pos->hasReached( $this->waitForPos ) ) { + $this->waitForPos = $pos; } } @@ -559,7 +562,7 @@ class LoadBalancer implements ILoadBalancer { * @return IDatabase|bool */ public function getAnyOpenConnection( $i ) { - foreach ( $this->mConns as $connsByServer ) { + foreach ( $this->conns as $connsByServer ) { if ( !empty( $connsByServer[$i] ) ) { /** @var IDatabase[] $serverConns */ $serverConns = $connsByServer[$i]; @@ -588,7 +591,7 @@ class LoadBalancer implements ILoadBalancer { $knownReachedPos = $this->srvCache->get( $key ); if ( $knownReachedPos instanceof DBMasterPos && - $knownReachedPos->hasReached( $this->mWaitForPos ) + $knownReachedPos->hasReached( $this->waitForPos ) ) { $this->replLogger->debug( __METHOD__ . @@ -627,18 +630,18 @@ class LoadBalancer implements ILoadBalancer { $this->replLogger->info( __METHOD__ . - ': Waiting for replica DB {dbserver} to catch up...', + ': waiting for replica DB {dbserver} to catch up...', [ 'dbserver' => $server ] ); - $result = $conn->masterPosWait( $this->mWaitForPos, $timeout ); + $result = $conn->masterPosWait( $this->waitForPos, $timeout ); if ( $result === null ) { $this->replLogger->warning( __METHOD__ . ': Errored out waiting on {host} pos {pos}', [ 'host' => $server, - 'pos' => $this->mWaitForPos, + 'pos' => $this->waitForPos, 'trace' => ( new RuntimeException() )->getTraceAsString() ] ); @@ -648,16 +651,16 @@ class LoadBalancer implements ILoadBalancer { __METHOD__ . ': Timed out waiting on {host} pos {pos}', [ 'host' => $server, - 'pos' => $this->mWaitForPos, + 'pos' => $this->waitForPos, 'trace' => ( new RuntimeException() )->getTraceAsString() ] ); $ok = false; } else { - $this->replLogger->info( __METHOD__ . ": Done" ); + $this->replLogger->debug( __METHOD__ . ": done waiting" ); $ok = true; // Remember that the DB reached this point - $this->srvCache->set( $key, $this->mWaitForPos, BagOStuff::TTL_DAY ); + $this->srvCache->set( $key, $this->waitForPos, BagOStuff::TTL_DAY ); } if ( $close ) { @@ -699,14 +702,14 @@ class LoadBalancer implements ILoadBalancer { # Operation-based index if ( $i == self::DB_REPLICA ) { - $this->mLastError = 'Unknown error'; // reset error string + $this->lastError = 'Unknown error'; // reset error string # Try the general server pool if $groups are unavailable. $i = ( $groups === [ false ] ) ? false // don't bother with this if that is what was tried above : $this->getReaderIndex( false, $domain ); # Couldn't find a working server in getReaderIndex()? if ( $i === false ) { - $this->mLastError = 'No working replica DB server: ' . $this->mLastError; + $this->lastError = 'No working replica DB server: ' . $this->lastError; // Throw an exception $this->reportConnectionError(); return null; // not reached @@ -736,7 +739,7 @@ class LoadBalancer implements ILoadBalancer { return $conn; } - public function reuseConnection( $conn ) { + public function reuseConnection( IDatabase $conn ) { $serverIndex = $conn->getLBInfo( 'serverIndex' ); $refCount = $conn->getLBInfo( 'foreignPoolRefCount' ); if ( $serverIndex === null || $refCount === null ) { @@ -754,7 +757,8 @@ class LoadBalancer implements ILoadBalancer { } elseif ( $conn instanceof DBConnRef ) { // DBConnRef already handles calling reuseConnection() and only passes the live // Database instance to this method. Any caller passing in a DBConnRef is broken. - $this->connLogger->error( __METHOD__ . ": got DBConnRef instance.\n" . + $this->connLogger->error( + __METHOD__ . ": got DBConnRef instance.\n" . ( new RuntimeException() )->getTraceAsString() ); return; @@ -773,20 +777,20 @@ class LoadBalancer implements ILoadBalancer { } $domain = $conn->getDomainID(); - if ( !isset( $this->mConns[$connInUseKey][$serverIndex][$domain] ) ) { + if ( !isset( $this->conns[$connInUseKey][$serverIndex][$domain] ) ) { throw new InvalidArgumentException( __METHOD__ . ": connection $serverIndex/$domain not found; it may have already been freed." ); - } elseif ( $this->mConns[$connInUseKey][$serverIndex][$domain] !== $conn ) { + } elseif ( $this->conns[$connInUseKey][$serverIndex][$domain] !== $conn ) { throw new InvalidArgumentException( __METHOD__ . ": connection $serverIndex/$domain mismatched; it may have already been freed." ); } $conn->setLBInfo( 'foreignPoolRefCount', --$refCount ); if ( $refCount <= 0 ) { - $this->mConns[$connFreeKey][$serverIndex][$domain] = $conn; - unset( $this->mConns[$connInUseKey][$serverIndex][$domain] ); - if ( !$this->mConns[$connInUseKey][$serverIndex] ) { - unset( $this->mConns[$connInUseKey][$serverIndex] ); // clean up + $this->conns[$connFreeKey][$serverIndex][$domain] = $conn; + unset( $this->conns[$connInUseKey][$serverIndex][$domain] ); + if ( !$this->conns[$connInUseKey][$serverIndex] ) { + unset( $this->conns[$connInUseKey][$serverIndex] ); // clean up } $this->connLogger->debug( __METHOD__ . ": freed connection $serverIndex/$domain" ); } else { @@ -838,14 +842,14 @@ class LoadBalancer implements ILoadBalancer { } else { // Connection is to the local domain $connKey = $autoCommit ? self::KEY_LOCAL_NOROUND : self::KEY_LOCAL; - if ( isset( $this->mConns[$connKey][$i][0] ) ) { - $conn = $this->mConns[$connKey][$i][0]; + if ( isset( $this->conns[$connKey][$i][0] ) ) { + $conn = $this->conns[$connKey][$i][0]; } else { - if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) { + if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) { throw new InvalidArgumentException( "No server with index '$i'." ); } // Open a new connection - $server = $this->mServers[$i]; + $server = $this->servers[$i]; $server['serverIndex'] = $i; $server['autoCommitOnly'] = $autoCommit; if ( $this->localDomain->getDatabase() !== null ) { @@ -855,10 +859,12 @@ class LoadBalancer implements ILoadBalancer { $conn = $this->reallyOpenConnection( $server, $this->localDomain ); $host = $this->getServerName( $i ); if ( $conn->isOpen() ) { - $this->connLogger->debug( "Connected to database $i at '$host'." ); - $this->mConns[$connKey][$i][0] = $conn; + $this->connLogger->debug( + __METHOD__ . ": connected to database $i at '$host'." ); + $this->conns[$connKey][$i][0] = $conn; } else { - $this->connLogger->warning( "Failed to connect to database $i at '$host'." ); + $this->connLogger->warning( + __METHOD__ . ": failed to connect to database $i at '$host'." ); $this->errorConnection = $conn; $conn = false; } @@ -916,39 +922,39 @@ class LoadBalancer implements ILoadBalancer { $connInUseKey = self::KEY_FOREIGN_INUSE; } - if ( isset( $this->mConns[$connInUseKey][$i][$domain] ) ) { + if ( isset( $this->conns[$connInUseKey][$i][$domain] ) ) { // Reuse an in-use connection for the same domain - $conn = $this->mConns[$connInUseKey][$i][$domain]; + $conn = $this->conns[$connInUseKey][$i][$domain]; $this->connLogger->debug( __METHOD__ . ": reusing connection $i/$domain" ); - } elseif ( isset( $this->mConns[$connFreeKey][$i][$domain] ) ) { + } elseif ( isset( $this->conns[$connFreeKey][$i][$domain] ) ) { // Reuse a free connection for the same domain - $conn = $this->mConns[$connFreeKey][$i][$domain]; - unset( $this->mConns[$connFreeKey][$i][$domain] ); - $this->mConns[$connInUseKey][$i][$domain] = $conn; + $conn = $this->conns[$connFreeKey][$i][$domain]; + unset( $this->conns[$connFreeKey][$i][$domain] ); + $this->conns[$connInUseKey][$i][$domain] = $conn; $this->connLogger->debug( __METHOD__ . ": reusing free connection $i/$domain" ); - } elseif ( !empty( $this->mConns[$connFreeKey][$i] ) ) { + } elseif ( !empty( $this->conns[$connFreeKey][$i] ) ) { // Reuse a free connection from another domain - $conn = reset( $this->mConns[$connFreeKey][$i] ); - $oldDomain = key( $this->mConns[$connFreeKey][$i] ); + $conn = reset( $this->conns[$connFreeKey][$i] ); + $oldDomain = key( $this->conns[$connFreeKey][$i] ); if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) { - $this->mLastError = "Error selecting database '$dbName' on server " . + $this->lastError = "Error selecting database '$dbName' on server " . $conn->getServer() . " from client host {$this->host}"; $this->errorConnection = $conn; $conn = false; } else { $conn->tablePrefix( $prefix ); - unset( $this->mConns[$connFreeKey][$i][$oldDomain] ); + unset( $this->conns[$connFreeKey][$i][$oldDomain] ); // Note that if $domain is an empty string, getDomainID() might not match it - $this->mConns[$connInUseKey][$i][$conn->getDomainId()] = $conn; + $this->conns[$connInUseKey][$i][$conn->getDomainId()] = $conn; $this->connLogger->debug( __METHOD__ . ": reusing free connection from $oldDomain for $domain" ); } } else { - if ( !isset( $this->mServers[$i] ) || !is_array( $this->mServers[$i] ) ) { + if ( !isset( $this->servers[$i] ) || !is_array( $this->servers[$i] ) ) { throw new InvalidArgumentException( "No server with index '$i'." ); } // Open a new connection - $server = $this->mServers[$i]; + $server = $this->servers[$i]; $server['serverIndex'] = $i; $server['foreignPoolRefCount'] = 0; $server['foreign'] = true; @@ -961,7 +967,7 @@ class LoadBalancer implements ILoadBalancer { } else { $conn->tablePrefix( $prefix ); // as specified // Note that if $domain is an empty string, getDomainID() might not match it - $this->mConns[$connInUseKey][$i][$conn->getDomainID()] = $conn; + $this->conns[$connInUseKey][$i][$conn->getDomainID()] = $conn; $this->connLogger->debug( __METHOD__ . ": opened new connection for $i/$domain" ); } } @@ -1079,27 +1085,28 @@ class LoadBalancer implements ILoadBalancer { $conn = $this->errorConnection; // the connection which caused the error $context = [ 'method' => __METHOD__, - 'last_error' => $this->mLastError, + 'last_error' => $this->lastError, ]; if ( $conn instanceof IDatabase ) { $context['db_server'] = $conn->getServer(); $this->connLogger->warning( - "Connection error: {last_error} ({db_server})", + __METHOD__ . ": connection error: {last_error} ({db_server})", $context ); // throws DBConnectionError - $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" ); + $conn->reportConnectionError( "{$this->lastError} ({$context['db_server']})" ); } else { // No last connection, probably due to all servers being too busy $this->connLogger->error( - "LB failure with no last connection. Connection error: {last_error}", + __METHOD__ . + ": LB failure with no last connection. Connection error: {last_error}", $context ); // If all servers were busy, mLastError will contain something sensible - throw new DBConnectionError( null, $this->mLastError ); + throw new DBConnectionError( null, $this->lastError ); } } @@ -1108,22 +1115,22 @@ class LoadBalancer implements ILoadBalancer { } public function haveIndex( $i ) { - return array_key_exists( $i, $this->mServers ); + return array_key_exists( $i, $this->servers ); } public function isNonZeroLoad( $i ) { - return array_key_exists( $i, $this->mServers ) && $this->mLoads[$i] != 0; + return array_key_exists( $i, $this->servers ) && $this->loads[$i] != 0; } public function getServerCount() { - return count( $this->mServers ); + return count( $this->servers ); } public function getServerName( $i ) { - if ( isset( $this->mServers[$i]['hostName'] ) ) { - $name = $this->mServers[$i]['hostName']; - } elseif ( isset( $this->mServers[$i]['host'] ) ) { - $name = $this->mServers[$i]['host']; + if ( isset( $this->servers[$i]['hostName'] ) ) { + $name = $this->servers[$i]['hostName']; + } elseif ( isset( $this->servers[$i]['host'] ) ) { + $name = $this->servers[$i]['host']; } else { $name = ''; } @@ -1132,7 +1139,7 @@ class LoadBalancer implements ILoadBalancer { } public function getServerType( $i ) { - return isset( $this->mServers[$i]['type'] ) ? $this->mServers[$i]['type'] : 'unknown'; + return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown'; } public function getMasterPos() { @@ -1140,7 +1147,7 @@ class LoadBalancer implements ILoadBalancer { # master (however unlikely that may be), then we can fetch the position from the replica DB. $masterConn = $this->getAnyOpenConnection( $this->getWriterIndex() ); if ( !$masterConn ) { - $serverCount = count( $this->mServers ); + $serverCount = count( $this->servers ); for ( $i = 1; $i < $serverCount; $i++ ) { $conn = $this->getAnyOpenConnection( $i ); if ( $conn ) { @@ -1162,11 +1169,12 @@ class LoadBalancer implements ILoadBalancer { public function closeAll() { $this->forEachOpenConnection( function ( IDatabase $conn ) { $host = $conn->getServer(); - $this->connLogger->debug( "Closing connection to database '$host'." ); + $this->connLogger->debug( + __METHOD__ . ": closing connection to database '$host'." ); $conn->close(); } ); - $this->mConns = [ + $this->conns = [ self::KEY_LOCAL => [], self::KEY_FOREIGN_INUSE => [], self::KEY_FOREIGN_FREE => [], @@ -1179,7 +1187,7 @@ class LoadBalancer implements ILoadBalancer { public function closeConnection( IDatabase $conn ) { $serverIndex = $conn->getLBInfo( 'serverIndex' ); // second index level of mConns - foreach ( $this->mConns as $type => $connsByServer ) { + foreach ( $this->conns as $type => $connsByServer ) { if ( !isset( $connsByServer[$serverIndex] ) ) { continue; } @@ -1187,8 +1195,9 @@ class LoadBalancer implements ILoadBalancer { foreach ( $connsByServer[$serverIndex] as $i => $trackedConn ) { if ( $conn === $trackedConn ) { $host = $this->getServerName( $i ); - $this->connLogger->debug( "Closing connection to database $i at '$host'." ); - unset( $this->mConns[$type][$serverIndex][$i] ); + $this->connLogger->debug( + __METHOD__ . ": closing connection to database $i at '$host'." ); + unset( $this->conns[$type][$serverIndex][$i] ); --$this->connsOpened; break 2; } @@ -1552,11 +1561,11 @@ class LoadBalancer implements ILoadBalancer { public function allowLagged( $mode = null ) { if ( $mode === null ) { - return $this->mAllowLagged; + return $this->allowLagged; } - $this->mAllowLagged = $mode; + $this->allowLagged = $mode; - return $this->mAllowLagged; + return $this->allowLagged; } public function pingAll() { @@ -1571,7 +1580,7 @@ class LoadBalancer implements ILoadBalancer { } public function forEachOpenConnection( $callback, array $params = [] ) { - foreach ( $this->mConns as $connsByServer ) { + foreach ( $this->conns as $connsByServer ) { foreach ( $connsByServer as $serverConns ) { foreach ( $serverConns as $conn ) { $mergedParams = array_merge( [ $conn ], $params ); @@ -1583,7 +1592,7 @@ class LoadBalancer implements ILoadBalancer { public function forEachOpenMasterConnection( $callback, array $params = [] ) { $masterIndex = $this->getWriterIndex(); - foreach ( $this->mConns as $connsByServer ) { + foreach ( $this->conns as $connsByServer ) { if ( isset( $connsByServer[$masterIndex] ) ) { /** @var IDatabase $conn */ foreach ( $connsByServer[$masterIndex] as $conn ) { @@ -1595,7 +1604,7 @@ class LoadBalancer implements ILoadBalancer { } public function forEachOpenReplicaConnection( $callback, array $params = [] ) { - foreach ( $this->mConns as $connsByServer ) { + foreach ( $this->conns as $connsByServer ) { foreach ( $connsByServer as $i => $serverConns ) { if ( $i === $this->getWriterIndex() ) { continue; // skip master @@ -1619,9 +1628,9 @@ class LoadBalancer implements ILoadBalancer { $lagTimes = $this->getLagTimes( $domain ); foreach ( $lagTimes as $i => $lag ) { - if ( $this->mLoads[$i] > 0 && $lag > $maxLag ) { + if ( $this->loads[$i] > 0 && $lag > $maxLag ) { $maxLag = $lag; - $host = $this->mServers[$i]['host']; + $host = $this->servers[$i]['host']; $maxIndex = $i; } } @@ -1636,7 +1645,7 @@ class LoadBalancer implements ILoadBalancer { $knownLagTimes = []; // map of (server index => 0 seconds) $indexesWithLag = []; - foreach ( $this->mServers as $i => $server ) { + foreach ( $this->servers as $i => $server ) { if ( empty( $server['is static'] ) ) { $indexesWithLag[] = $i; // DB server might have replication lag } else { @@ -1683,7 +1692,7 @@ class LoadBalancer implements ILoadBalancer { if ( $pos instanceof DBMasterPos ) { $result = $conn->masterPosWait( $pos, $timeout ); if ( $result == -1 || is_null( $result ) ) { - $msg = __METHOD__ . ': Timed out waiting on {host} pos {pos}'; + $msg = __METHOD__ . ': timed out waiting on {host} pos {pos}'; $this->replLogger->warning( $msg, [ 'host' => $conn->getServer(), 'pos' => $pos, @@ -1691,7 +1700,7 @@ class LoadBalancer implements ILoadBalancer { ] ); $ok = false; } else { - $this->replLogger->info( __METHOD__ . ': Done' ); + $this->replLogger->debug( __METHOD__ . ': done waiting' ); $ok = true; } } else { diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitor.php b/includes/libs/rdbms/loadmonitor/LoadMonitor.php index 74c7765844..50c878d06b 100644 --- a/includes/libs/rdbms/loadmonitor/LoadMonitor.php +++ b/includes/libs/rdbms/loadmonitor/LoadMonitor.php @@ -81,13 +81,13 @@ class LoadMonitor implements ILoadMonitor { $this->replLogger = $logger; } - public function scaleLoads( array &$weightByServer, $domain ) { + final public function scaleLoads( array &$weightByServer, $domain ) { $serverIndexes = array_keys( $weightByServer ); $states = $this->getServerStates( $serverIndexes, $domain ); - $coefficientsByServer = $states['weightScales']; + $newScalesByServer = $states['weightScales']; foreach ( $weightByServer as $i => $weight ) { - if ( isset( $coefficientsByServer[$i] ) ) { - $weightByServer[$i] = $weight * $coefficientsByServer[$i]; + if ( isset( $newScalesByServer[$i] ) ) { + $weightByServer[$i] = $weight * $newScalesByServer[$i]; } else { // server recently added to config? $host = $this->parent->getServerName( $i ); $this->replLogger->error( __METHOD__ . ": host $host not in cache" ); @@ -95,10 +95,8 @@ class LoadMonitor implements ILoadMonitor { } } - public function getLagTimes( array $serverIndexes, $domain ) { - $states = $this->getServerStates( $serverIndexes, $domain ); - - return $states['lagTimes']; + final public function getLagTimes( array $serverIndexes, $domain ) { + return $this->getServerStates( $serverIndexes, $domain )['lagTimes']; } protected function getServerStates( array $serverIndexes, $domain ) { diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php index 712906e0e7..b88a34dcad 100644 --- a/includes/media/Bitmap.php +++ b/includes/media/Bitmap.php @@ -440,6 +440,14 @@ class BitmapHandler extends TransformationalImageHandler { return $this->getMediaTransformError( $params, $errMsg ); } + if ( filesize( $params['srcPath'] ) === 0 ) { + $err = "Image file size seems to be zero."; + wfDebug( "$err\n" ); + $errMsg = wfMessage( 'thumbnail_image-size-zero', $params['srcPath'] )->text(); + + return $this->getMediaTransformError( $params, $errMsg ); + } + $src_image = call_user_func( $loader, $params['srcPath'] ); $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] ) ? diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php index 229a891db8..0bd01cd6c9 100644 --- a/includes/media/JpegMetadataExtractor.php +++ b/includes/media/JpegMetadataExtractor.php @@ -82,7 +82,7 @@ class JpegMetadataExtractor { // this is just a sanity check throw new MWException( 'Too many jpeg segments. Aborting' ); } - while ( $buffer !== "\xFF" ) { + while ( $buffer !== "\xFF" && !feof( $fh ) ) { // In theory JPEG files are not allowed to contain anything between the sections, // but in practice they sometimes do. It's customary to ignore the garbage data. $buffer = fread( $fh, 1 ); diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index c7bb8ecc62..544d23d290 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -1771,8 +1771,9 @@ class WikiPage implements Page, IDBAccessObject { throw new MWException( "Failed to update page row to use new revision." ); } + $tags = $meta['tags']; Hooks::run( 'NewRevisionFromEditComplete', - [ $this, $revision, $meta['baseRevId'], $user ] ); + [ $this, $revision, $meta['baseRevId'], $user, &$tags ] ); // Update recentchanges if ( !( $flags & EDIT_SUPPRESS_RC ) ) { @@ -1794,7 +1795,7 @@ class WikiPage implements Page, IDBAccessObject { $newsize, $revisionId, $patrolled, - $meta['tags'] + $tags ); } @@ -2269,10 +2270,10 @@ class WikiPage implements Page, IDBAccessObject { $good = 0; } $edits = $options['changed'] ? 1 : 0; - $total = $options['created'] ? 1 : 0; + $pages = $options['created'] ? 1 : 0; DeferredUpdates::addUpdate( SiteStatsUpdate::factory( - [ 'edits' => $edits, 'articles' => $good, 'total' => $total ] + [ 'edits' => $edits, 'articles' => $good, 'pages' => $pages ] ) ); DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) ); diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php index 605a873b7d..0a4a60e9e5 100644 --- a/includes/parser/DateFormatter.php +++ b/includes/parser/DateFormatter.php @@ -126,13 +126,16 @@ class DateFormatter { /** * Get a DateFormatter object * - * @param Language|string|null $lang In which language to format the date + * @param Language|null $lang In which language to format the date * Defaults to the site content language * @return DateFormatter */ public static function getInstance( $lang = null ) { global $wgContLang, $wgMainCacheType; + if ( is_string( $lang ) ) { + wfDeprecated( __METHOD__ . ' with type string for $lang', '1.31' ); + } $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang; $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType ); diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index bbddbe2809..ff21ef0239 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -1254,7 +1254,7 @@ class ParserOptions { } elseif ( $value instanceof Language ) { return $value->getCode(); } elseif ( is_array( $value ) ) { - return '[' . join( ',', array_map( [ $this, 'optionToString' ], $value ) ) . ']'; + return '[' . implode( ',', array_map( [ $this, 'optionToString' ], $value ) ) . ']'; } else { return (string)$value; } @@ -1295,7 +1295,7 @@ class ParserOptions { } } - $confstr = $values ? join( '!', $values ) : 'canonical'; + $confstr = $values ? implode( '!', $values ) : 'canonical'; // add in language specific options, if any // @todo FIXME: This is just a way of retrieving the url/user preferred variant diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php index 9021652958..d02011fa34 100644 --- a/includes/profiler/Profiler.php +++ b/includes/profiler/Profiler.php @@ -188,7 +188,7 @@ abstract class Profiler { * Get all usable outputs. * * @throws MWException - * @return array Array of ProfilerOutput instances. + * @return ProfilerOutput[] * @since 1.25 */ private function getOutputs() { diff --git a/includes/skins/QuickTemplate.php b/includes/skins/QuickTemplate.php index e8466dc11f..1886746489 100644 --- a/includes/skins/QuickTemplate.php +++ b/includes/skins/QuickTemplate.php @@ -153,7 +153,7 @@ abstract class QuickTemplate { /** * An ugly, ugly hack. * @private - * @param string $str + * @param string $msgKey */ function msgWiki( $msgKey ) { global $wgOut; diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php index 4f271c7937..65a300afef 100644 --- a/includes/skins/Skin.php +++ b/includes/skins/Skin.php @@ -1253,7 +1253,7 @@ abstract class Skin extends ContextSource { * * @return array */ - function buildSidebar() { + public function buildSidebar() { global $wgEnableSidebarCache, $wgSidebarCacheExpiry; $callback = function ( $old = null, &$ttl = null ) { @@ -1267,13 +1267,22 @@ abstract class Skin extends ContextSource { return $bar; }; - $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $msgCache = MessageCache::singleton(); + $wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $sidebar = $wgEnableSidebarCache - ? $cache->getWithSetCallback( - $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ), + ? $wanCache->getWithSetCallback( + $wanCache->makeKey( 'sidebar', $this->getLanguage()->getCode() ), $wgSidebarCacheExpiry, $callback, - [ 'lockTSE' => 30 ] + [ + 'checkKeys' => [ + // Unless there is both no exact $code override nor an i18n definition + // in the the software, the only MediaWiki page to check is for $code. + $msgCache->getCheckKey( $this->getLanguage()->getCode() ) + ], + 'lockTSE' => 30 + ] ) : $callback(); diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index cf990c2839..5aa1c6bc31 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -33,6 +33,12 @@ use Wikimedia\Rdbms\IDatabase; * @ingroup SpecialPage */ abstract class ChangesListSpecialPage extends SpecialPage { + /** + * Maximum length of a tag description in UTF-8 characters. + * Longer descriptions will be truncated. + */ + const TAG_DESC_CHARACTER_LIMIT = 120; + /** * Preference name for saved queries. Subclasses that use saved queries should override this. * @var string @@ -794,15 +800,15 @@ abstract class ChangesListSpecialPage extends SpecialPage { isset( $explicitlyDefinedTags[ $tagName ] ) || isset( $softwareActivatedTags[ $tagName ] ) ) { - // Parse description - $desc = ChangeTags::tagLongDescriptionMessage( $tagName, $context ); - $result[] = [ 'name' => $tagName, 'label' => Sanitizer::stripAllTags( ChangeTags::tagDescription( $tagName, $context ) ), - 'description' => $desc ? Sanitizer::stripAllTags( $desc->parse() ) : '', + 'description' => + ChangeTags::truncateTagDescription( + $tagName, self::TAG_DESC_CHARACTER_LIMIT, $context + ), 'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ), 'hits' => $hits, ]; diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 4775a7f928..806713b4ef 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -40,14 +40,12 @@ class SpecialContributions extends IncludableSpecialPage { $this->setHeaders(); $this->outputHeader(); $out = $this->getOutput(); + // Modules required for viewing the list of contributions (also when included on other pages) $out->addModuleStyles( [ 'mediawiki.special', 'mediawiki.special.changeslist', - 'mediawiki.widgets.DateInputWidget.styles', ] ); - $out->addModules( 'mediawiki.special.contributions' ); $this->addHelpLink( 'Help:User contributions' ); - $out->enableOOUI(); $this->opts = []; $request = $this->getRequest(); @@ -497,6 +495,14 @@ class SpecialContributions extends IncludableSpecialPage { $this->opts['hideMinor'] = false; } + // Modules required only for the form + $this->getOutput()->addModules( [ + 'mediawiki.userSuggest', + 'mediawiki.special.contributions', + ] ); + $this->getOutput()->addModuleStyles( 'mediawiki.widgets.DateInputWidget.styles' ); + $this->getOutput()->enableOOUI(); + $form = Html::openElement( 'form', [ @@ -544,8 +550,6 @@ class SpecialContributions extends IncludableSpecialPage { $filterSelection = Html::rawElement( 'div', [], '' ); } - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - $labelNewbies = Xml::radioLabel( $this->msg( 'sp-contributions-newbies' )->text(), 'contribs', diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 7cc0dc6d10..4abdebf8b5 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -220,20 +220,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage { } } - /** - * Get a FormOptions object containing the default options - * - * @return FormOptions - */ - public function getDefaultOptions() { - $opts = parent::getDefaultOptions(); - - $opts->add( 'categories', '' ); - $opts->add( 'categories_any', false ); - - return $opts; - } - /** * Get all custom filters * @@ -359,11 +345,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $join_conds ); - // Build the final data - if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) { - $this->filterByCategories( $rows, $opts ); - } - return $rows; } @@ -667,16 +648,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage { */ function getExtraOptions( $opts ) { $opts->consumeValues( [ - 'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any' + 'namespace', 'invert', 'associated', 'tagfilter' ] ); $extraOpts = []; $extraOpts['namespace'] = $this->namespaceFilterForm( $opts ); - if ( $this->getConfig()->get( 'AllowCategorizedRecentChanges' ) ) { - $extraOpts['category'] = $this->categoryFilterForm( $opts ); - } - $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'], false, $this->getContext() ); if ( count( $tagFilter ) ) { @@ -740,29 +717,17 @@ class SpecialRecentChanges extends ChangesListSpecialPage { return [ $nsLabel, "$nsSelect $invert $associated" ]; } - /** - * Create an input to filter changes by categories - * - * @param FormOptions $opts - * @return array - */ - protected function categoryFilterForm( FormOptions $opts ) { - list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(), - 'categories', 'mw-categories', false, $opts['categories'] ); - - $input .= ' ' . Xml::checkLabel( $this->msg( 'rc_categories_any' )->text(), - 'categories_any', 'mw-categories_any', $opts['categories_any'] ); - - return [ $label, $input ]; - } - /** * Filter $rows by categories set in $opts * + * @deprecated since 1.31 + * * @param ResultWrapper &$rows Database rows * @param FormOptions $opts */ function filterByCategories( &$rows, FormOptions $opts ) { + wfDeprecated( __METHOD__, '1.31' ); + $categories = array_map( 'trim', explode( '|', $opts['categories'] ) ); if ( !count( $categories ) ) { diff --git a/includes/user/ExternalUserNames.php b/includes/user/ExternalUserNames.php index 13ac6b2566..f039d04ec1 100644 --- a/includes/user/ExternalUserNames.php +++ b/includes/user/ExternalUserNames.php @@ -56,7 +56,7 @@ class ExternalUserNames { if ( $interwikiLookup->isValidInterwiki( $firstIw ) ) { $title = MWNamespace::getCanonicalName( NS_USER ) . ':' . substr( $userName, $pos + 1 ); if ( $iw ) { - $title = join( ':', $iw ) . ':' . $title; + $title = implode( ':', $iw ) . ':' . $title; } return Title::makeTitle( NS_MAIN, $title, '', $firstIw ); } diff --git a/includes/user/UserGroupMembership.php b/includes/user/UserGroupMembership.php index f771f4285e..e757e59629 100644 --- a/includes/user/UserGroupMembership.php +++ b/includes/user/UserGroupMembership.php @@ -21,6 +21,7 @@ */ use Wikimedia\Rdbms\IDatabase; +use MediaWiki\MediaWikiServices; /** * Represents a "user group membership" -- a specific instance of a user belonging @@ -158,7 +159,7 @@ class UserGroupMembership { } // Purge old, expired memberships from the DB - self::purgeExpired( $dbw ); + JobQueueGroup::singleton()->push( new UserGroupExpiryJob() ); // Check that the values make sense if ( $this->group === null ) { @@ -236,38 +237,59 @@ class UserGroupMembership { /** * Purge expired memberships from the user_groups table - * - * @param IDatabase|null $dbw */ - public static function purgeExpired( IDatabase $dbw = null ) { - if ( wfReadOnly() ) { + public static function purgeExpired() { + $services = MediaWikiServices::getInstance(); + if ( $services->getReadOnlyMode()->isReadOnly() ) { return; } - if ( $dbw === null ) { - $dbw = wfGetDB( DB_MASTER ); - } + $lbFactory = $services->getDBLoadBalancerFactory(); + $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ ); + $dbw = $services->getDBLoadBalancer()->getConnection( DB_MASTER ); - DeferredUpdates::addUpdate( new AtomicSectionUpdate( - $dbw, - __METHOD__, - function ( IDatabase $dbw, $fname ) { - $expiryCond = [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ]; - $res = $dbw->select( 'user_groups', self::selectFields(), $expiryCond, $fname ); + $lockKey = $dbw->getDomainID() . ':usergroups-prune'; // specific to this wiki + $scopedLock = $dbw->getScopedLockAndFlush( $lockKey, __METHOD__, 0 ); + if ( !$scopedLock ) { + return; // already running + } - // save an array of users/groups to insert to user_former_groups - $usersAndGroups = []; + $now = time(); + do { + $dbw->startAtomic( __METHOD__ ); + + $res = $dbw->select( + 'user_groups', + self::selectFields(), + [ 'ug_expiry < ' . $dbw->addQuotes( $dbw->timestamp( $now ) ) ], + __METHOD__, + [ 'FOR UPDATE', 'LIMIT' => 100 ] + ); + + if ( $res->numRows() > 0 ) { + $insertData = []; // array of users/groups to insert to user_former_groups + $deleteCond = []; // array for deleting the rows that are to be moved around foreach ( $res as $row ) { - $usersAndGroups[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ]; + $insertData[] = [ 'ufg_user' => $row->ug_user, 'ufg_group' => $row->ug_group ]; + $deleteCond[] = $dbw->makeList( + [ 'ug_user' => $row->ug_user, 'ug_group' => $row->ug_group ], + $dbw::LIST_AND + ); } + // Delete the rows we're about to move + $dbw->delete( + 'user_groups', + $dbw->makeList( $deleteCond, $dbw::LIST_OR ), + __METHOD__ + ); + // Push the groups to user_former_groups + $dbw->insert( 'user_former_groups', $insertData, __METHOD__, [ 'IGNORE' ] ); + } - // delete 'em all - $dbw->delete( 'user_groups', $expiryCond, $fname ); + $dbw->endAtomic( __METHOD__ ); - // and push the groups to user_former_groups - $dbw->insert( 'user_former_groups', $usersAndGroups, __METHOD__, [ 'IGNORE' ] ); - } - ) ); + $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket ); + } while ( $res->numRows() > 0 ); } /** diff --git a/languages/Language.php b/languages/Language.php index 084a2e76ae..fc8ef87c64 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -3472,27 +3472,103 @@ class Language { } /** - * Truncate a string to a specified length in bytes, appending an optional - * string (e.g. for ellipses) + * This method is deprecated since 1.31 and kept as alias for truncateForDatabase, which + * has replaced it. This method provides truncation suitable for DB. * * The database offers limited byte lengths for some columns in the database; * multi-byte character sets mean we need to ensure that only whole characters - * are included, otherwise broken characters can be passed to the user + * are included, otherwise broken characters can be passed to the user. * - * If $length is negative, the string will be truncated from the beginning + * @deprecated since 1.31, use truncateForDatabase or truncateForVisual as appropriate. * * @param string $string String to truncate - * @param int $length Maximum length (including ellipses) + * @param int $length Maximum length (including ellipsis) * @param string $ellipsis String to append to the truncated text * @param bool $adjustLength Subtract length of ellipsis from $length. * $adjustLength was introduced in 1.18, before that behaved as if false. * @return string */ function truncate( $string, $length, $ellipsis = '...', $adjustLength = true ) { + return $this->truncateForDatabase( $string, $length, $ellipsis, $adjustLength ); + } + + /** + * Truncate a string to a specified length in bytes, appending an optional + * string (e.g. for ellipsis) + * + * If $length is negative, the string will be truncated from the beginning + * + * @since 1.31 + * + * @param string $string String to truncate + * @param int $length Maximum length in bytes + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * + * @return string + */ + function truncateForDatabase( $string, $length, $ellipsis = '...', $adjustLength = true ) { + return $this->truncateInternal( + $string, $length, $ellipsis, $adjustLength, 'strlen', 'substr' + ); + } + + /** + * Truncate a string to a specified number of characters, appending an optional + * string (e.g. for ellipsis). + * + * This provides multibyte version of truncate() method of this class, suitable for truncation + * based on number of characters, instead of number of bytes. + * + * If $length is negative, the string will be truncated from the beginning. + * + * @since 1.31 + * + * @param string $string String to truncate + * @param int $length Maximum number of characters + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * + * @return string + */ + function truncateForVisual( $string, $length, $ellipsis = '...', $adjustLength = true ) { + // Passing encoding to mb_strlen and mb_substr is optional. + // Encoding defaults to mb_internal_encoding(), which is set to UTF-8 in Setup.php, so + // explicit specification of encoding is skipped. + // Note: Both multibyte methods are callables invoked in truncateInternal. + return $this->truncateInternal( + $string, $length, $ellipsis, $adjustLength, 'mb_strlen', 'mb_substr' + ); + } + + /** + * Internal method used for truncation. This method abstracts text truncation into + * one common method, allowing users to provide length measurement function and + * function for finding substring. + * + * For usages, see truncateForDatabase and truncateForVisual. + * + * @param string $string String to truncate + * @param int $length Maximum length of final text + * @param string $ellipsis String to append to the end of truncated text + * @param bool $adjustLength Subtract length of ellipsis from $length + * @param callable $measureLength Callable function used for determining the length of text + * @param callable $getSubstring Callable function used for getting the substrings + * + * @return string + */ + private function truncateInternal( + $string, $length, $ellipsis = '...', $adjustLength = true, $measureLength, $getSubstring + ) { + if ( !is_callable( $measureLength ) || !is_callable( $getSubstring ) ) { + throw new InvalidArgumentException( 'Invalid callback provided' ); + } + # Check if there is no need to truncate - if ( strlen( $string ) <= abs( $length ) ) { + if ( $measureLength( $string ) <= abs( $length ) ) { return $string; // no need to truncate } + # Use the localized ellipsis character if ( $ellipsis == '...' ) { $ellipsis = wfMessage( 'ellipsis' )->inLanguage( $this )->escaped(); @@ -3500,31 +3576,33 @@ class Language { if ( $length == 0 ) { return $ellipsis; // convention } + $stringOriginal = $string; # If ellipsis length is >= $length then we can't apply $adjustLength - if ( $adjustLength && strlen( $ellipsis ) >= abs( $length ) ) { + if ( $adjustLength && $measureLength( $ellipsis ) >= abs( $length ) ) { $string = $ellipsis; // this can be slightly unexpected # Otherwise, truncate and add ellipsis... } else { - $eLength = $adjustLength ? strlen( $ellipsis ) : 0; + $ellipsisLength = $adjustLength ? $measureLength( $ellipsis ) : 0; if ( $length > 0 ) { - $length -= $eLength; - $string = substr( $string, 0, $length ); // xyz... + $length -= $ellipsisLength; + $string = $getSubstring( $string, 0, $length ); // xyz... $string = $this->removeBadCharLast( $string ); $string = rtrim( $string ); $string = $string . $ellipsis; } else { - $length += $eLength; - $string = substr( $string, $length ); // ...xyz + $length += $ellipsisLength; + $string = $getSubstring( $string, $length ); // ...xyz $string = $this->removeBadCharFirst( $string ); $string = ltrim( $string ); $string = $ellipsis . $string; } } + # Do not truncate if the ellipsis makes the string longer/equal (T24181). # This check is *not* redundant if $adjustLength, due to the single case where # LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string. - if ( strlen( $string ) < strlen( $stringOriginal ) ) { + if ( $measureLength( $string ) < $measureLength( $stringOriginal ) ) { return $string; } else { return $stringOriginal; diff --git a/languages/data/Names.php b/languages/data/Names.php index 982f97a7aa..2252645c42 100644 --- a/languages/data/Names.php +++ b/languages/data/Names.php @@ -148,6 +148,7 @@ class Names { 'en-gb' => 'British English', # British English 'eo' => 'Esperanto', # Esperanto 'es' => 'español', # Spanish + 'es-formal' => 'español (formal)', # Spanish formal address 'et' => 'eesti', # Estonian 'eu' => 'euskara', # Basque 'ext' => 'estremeñu', # Extremaduran @@ -260,7 +261,7 @@ class Names { 'ky' => 'Кыргызча', # Kirghiz 'la' => 'Latina', # Latin 'lad' => 'Ladino', # Ladino - 'lb' => 'Lëtzebuergesch', # Luxemburguish + 'lb' => 'Lëtzebuergesch', # Luxembourgish 'lbe' => 'лакку', # Lak 'lez' => 'лезги', # Lezgi 'lfn' => 'Lingua Franca Nova', # Lingua Franca Nova diff --git a/languages/i18n/ace.json b/languages/i18n/ace.json index 985f664325..ed36e93aae 100644 --- a/languages/i18n/ace.json +++ b/languages/i18n/ace.json @@ -776,7 +776,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 kalön {{PLURAL:$1|ureuëng ngui}}]", - "rc_categories_any": "Pue-pue mantöng", "rc-change-size-new": "$1 {{PLURAL:$1|bita}} lheuëh neuubah", "newsectionsummary": "/* $1 */ bideung barô", "rc-enhanced-expand": "Peuleumah rincian", diff --git a/languages/i18n/ady-cyrl.json b/languages/i18n/ady-cyrl.json index 2350e81cdd..264a16d1a4 100644 --- a/languages/i18n/ady-cyrl.json +++ b/languages/i18n/ady-cyrl.json @@ -781,7 +781,6 @@ "minoreditletter": "ц", "newpageletter": "КӀ", "boteditletter": "б", - "rc_categories_any": "ХэшыпыкIыгъэмэ ащыщ горэ", "rc-change-size-new": "$1 {{PLURAL:$1|байт}} зэхъокӀым ыуж", "newsectionsummary": "/* $1 */ секциякIэ", "rc-enhanced-expand": "Ӏэмэ-псымэхэр къэгъэлъагъу", diff --git a/languages/i18n/af.json b/languages/i18n/af.json index 85441b6e0a..c467a1ee83 100644 --- a/languages/i18n/af.json +++ b/languages/i18n/af.json @@ -1248,8 +1248,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|gebruiker|gebruikers}} hou die bladsy dop]", - "rc_categories": "Beperk tot kategorieë (skei met \"|\"):", - "rc_categories_any": "Enige van die gekose", "rc-change-size-new": "$1 {{PLURAL:$1|greep|grepe}} na die wysiging", "newsectionsummary": "/* $1 */ nuwe afdeling", "rc-enhanced-expand": "Wys details", diff --git a/languages/i18n/ais.json b/languages/i18n/ais.json index 488a0b49a5..adae8ab0b5 100644 --- a/languages/i18n/ais.json +++ b/languages/i18n/ais.json @@ -1331,8 +1331,6 @@ "newpageletter": "baluhay", "boteditletter": "kikay a tademaw", "number_of_watching_users_pageview": "[$1 imahini miazihay a {{PLURAL:$1|misaungayay}}]", - "rc_categories": "kakuniza kelec (ku \"|\" palaliyas):", - "rc_categories_any": "amahicahica tu mipili’ay", "rc-change-size-new": "masumadtu sa u $1 {{PLURAL:$1|wyiyincu}}", "newsectionsummary": "/* $1 */ baluhay a tusil", "rc-enhanced-expand": "paazih pulita kalunasulitan", diff --git a/languages/i18n/am.json b/languages/i18n/am.json index 85ab197cda..7128e15543 100644 --- a/languages/i18n/am.json +++ b/languages/i18n/am.json @@ -822,7 +822,6 @@ "newpageletter": "አ", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 የሚከታተሉ {{PLURAL:$1|ተጠቃሚ|ተጠቃሚዎች}}]", - "rc_categories_any": "ማንኛውም", "newsectionsummary": "/* $1 */ አዲስ ክፍል", "rc-enhanced-expand": "ዝርዝሩን አሳይ (JavaScript ያስፈልጋል)", "rc-enhanced-hide": "ዝርዝሩን ደብቅ", diff --git a/languages/i18n/an.json b/languages/i18n/an.json index dac87ec25a..792b9e0a7d 100644 --- a/languages/i18n/an.json +++ b/languages/i18n/an.json @@ -958,8 +958,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} cosirando]", - "rc_categories": "Limite ta las categorías (deseparatas por \"|\")", - "rc_categories_any": "Todas", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dimpués d'o cambio", "newsectionsummary": "Nueva sección: /* $1 */", "rc-enhanced-expand": "Amostrar detalles", diff --git a/languages/i18n/ang.json b/languages/i18n/ang.json index d1e4b144da..84eaa796ea 100644 --- a/languages/i18n/ang.json +++ b/languages/i18n/ang.json @@ -640,7 +640,6 @@ "minoreditletter": "ly", "newpageletter": "N", "boteditletter": "þr", - "rc_categories_any": "Ǣnig", "rc-enhanced-expand": "Īwan stafas", "rc-enhanced-hide": "Hȳdan stafas", "recentchangeslinked": "Sibba andwendunga", diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 9a0844a9fa..0062d9985e 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -1513,8 +1513,6 @@ "newpageletter": "ج‌", "boteditletter": "ب", "number_of_watching_users_pageview": "[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]", - "rc_categories": "حصر لتصنيفات (مفرقة برمز \"|\"):", - "rc_categories_any": "أي من المختار", "rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير", "newsectionsummary": "/* $1 */ قسم جديد", "rc-enhanced-expand": "عرض التفاصيل", @@ -2266,7 +2264,7 @@ "rollback-success": "تم استرجاع تعديلات {{GENDER:$3|$1}}، حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.", "rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]", "sessionfailure-title": "فشل في الجلسة", - "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.", + "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك أعد إرسال الاستمارة مرة أخرى.", "changecontentmodel": "غير نموذج المحتوى لصفحة", "changecontentmodel-legend": "غير نموذج المحتوى", "changecontentmodel-title-label": "عنوان الصفحة", @@ -2672,6 +2670,7 @@ "thumbnail_dest_directory": "غير قادر على إنشاء المجلد الهدف", "thumbnail_image-type": "نوع الصورة غير مدعوم", "thumbnail_gd-library": "ضبط مكتبة GD غير مكتمل: دالة مفقودة $1", + "thumbnail_image-size-zero": "حجم ملف الصورة يبدو أنه صفر.", "thumbnail_image-missing": "الملف يبدو أنه مفقود: $1", "thumbnail_image-failure-limit": "هناك الكثير من المحاولات الفاشلة مؤخراً ($1 أو أكثر) لتَصْيير هذه الصورة المصغرة. الرجاء المحاولة مرة أخرى لاحقاً.", "import": "استيراد صفحات", @@ -3459,6 +3458,7 @@ "watchlistedit-clear-titles": "العناوين:", "watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)", "watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.", + "watchlistedit-clear-jobqueue": "قائمة مراقبتك يتم إفراغها. هذا قد يستغرق بعض الوقت!", "watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:", "watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.", "watchlisttools-clear": "امسح قائمة المراقبة", diff --git a/languages/i18n/arc.json b/languages/i18n/arc.json index 93fc59e954..9a9b6a8e50 100644 --- a/languages/i18n/arc.json +++ b/languages/i18n/arc.json @@ -629,7 +629,6 @@ "minoreditletter": "ܙ", "newpageletter": "ܚ", "boteditletter": "ܒ", - "rc_categories_any": "ܐܝܢܐ ܕܗܘ", "rc-change-size-new": "$1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܒܬܪ ܫܘܚܠܦܐ", "newsectionsummary": "/* $1 */ ܡܢܬܐ ܚܕܬܐ", "rc-enhanced-expand": "ܚܘܝ ܐܪ̈ܝܟܬܐ", diff --git a/languages/i18n/ary.json b/languages/i18n/ary.json index ed0e562a87..367890f609 100644 --- a/languages/i18n/ary.json +++ b/languages/i18n/ary.json @@ -858,8 +858,6 @@ "newpageletter": "J", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 katchof {{PLURAL:$1|mostkhdim|mostkhdimin}}]", - "rc_categories": "limiti tsnifat (frqha b \"|\")", - "rc_categories_any": "ay wahd", "rc-change-size": "$1", "newsectionsummary": "/* $1 */ qism jdid", "rc-enhanced-expand": "Werri ṫ-ṫafaṣil (kayḫṫaj JavaScript)", diff --git a/languages/i18n/arz.json b/languages/i18n/arz.json index 1d36ebacc0..b7d65d299e 100644 --- a/languages/i18n/arz.json +++ b/languages/i18n/arz.json @@ -443,7 +443,7 @@ "summary-preview": "بروفه للملخص:", "subject-preview": "بروفة للعنوان/للموضوع", "blockedtitle": "اليوزر ممنوع", - "blockedtext": "'''تم منع اسم اليوزر أو عنوان الااى بى بتاعك .'''\n\nسبب المنع هو: ''$2''. وقام بالمنع $1.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع>\nافتكر انه مش ممكن تبعت ايميل لليوزرز الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك.\nعنوان الااى بى بتاعك حاليا هو $3 وكود المنع هو #$5.من فضلك ضيف اى واحد منهم أو كلاهما فى اى رسالة للتساؤل عن المنع.", + "blockedtext": "'''تم منع اسم اليوزر أو عنوان الاى بى بتاعك .'''\n\nسبب المنع هو: ''$2''. وقام بالمنع $1.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nممكن التواصل مع $1 لمناقشة المنع، أو مع واحد من [[{{MediaWiki:Grouppage-sysop}}|الاداريين]] عن المنع>\nافتكر انه مش ممكن تبعت ايميل لليوزرز الا اذا كنت سجلت عنوان ايميل صحيح فى صفحة [[Special:Preferences|التفضيلات]] بتاعتك.\nعنوان الااى بى بتاعك حاليا هو $3 وكود المنع هو #$5.من فضلك ضيف اى واحد منهم أو كلاهما فى اى رسالة للتساؤل عن المنع.", "autoblockedtext": "عنوان الأيبى بتاعك اتمنع اتوماتيكى علشان فى يوزر تانى استخدمه واللى هو كمان ممنوع بــ $1.\nالسبب هو:\n\n:''$2''\n\n* بداية المنع: $8\n* انهاية المنع: $6\n* الممنوع المقصود: $7\n\nممكن تتصل ب $1 أو واحد من\n[[{{MediaWiki:Grouppage-sysop}}|الإداريين]] االتانيين لمناقشة المنع.\n\nلاحظ أنه مش ممكن استخدام خاصية \"ابعت رسالة لليوزر دا\" إلا اذا كان عندك ايميل صحيح متسجل فى [[Special:Preferences|تفضيلاتك]].\n\nعنوان الأيبى الحالى الخاص بك هو $3، رقم المنع هو $5. لو سمحت تذكر الرقم دا فى اى استفسار.", "blockednoreason": "ما فيش سبب", "whitelistedittext": "لازم $1 علشان تقدر تعدل الصفحات.", @@ -954,8 +954,6 @@ "newpageletter": "ج", "boteditletter": "ب", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1| يوزر مراقب|يوزر مراقب}}]", - "rc_categories": "حصر لتصنيفات (مفصولة برمز \"|\")", - "rc_categories_any": "أى", "rc-change-size-new": "$1 {{PLURAL:$1|بايت|بايتس}} بعد التغيير", "newsectionsummary": "/* $1 */ قسم جديد", "rc-enhanced-expand": "[اعرض التفاصيل]", @@ -1560,7 +1558,7 @@ "ipb_already_blocked": "\"$1\" ممنوع فعلا", "ipb-needreblock": "$1 ممنوع فعلا. عايز تغير الإعدادات؟", "ipb-otherblocks-header": "{{PLURAL:$1||المنع التانى|المنعين التانيين|المنوعات التانيين}}", - "ipb_cant_unblock": "غلطه: عنوان الااى بى الممنوع مش موجود $1.\nيمكن اترفع منعه فعلا.", + "ipb_cant_unblock": "غلطه: عنوان الاى بى الممنوع مش موجود $1.\nيمكن اترفع منعه فعلا.", "ipb_blocked_as_range": "غلط: الأيبى $1 مش ممنوع مباشرةو مش ممكن رفع المنع عنه.\nبس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2، و اللى ممكن رفع المنع عنه.", "ip_range_invalid": "نطاق عناوين الأيبى مش صحيح.", "ip_range_toolarge": "حدود المنع اللى اكبر من /$1 مش مسموح بيها.", diff --git a/languages/i18n/as.json b/languages/i18n/as.json index 98b56751de..43e759152a 100644 --- a/languages/i18n/as.json +++ b/languages/i18n/as.json @@ -1180,8 +1180,6 @@ "newpageletter": "ন", "boteditletter": "ব", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন সদস্যই|জন সদস্যই}} এই পৃষ্ঠা নিৰীক্ষণ কৰিছে]", - "rc_categories": "শ্ৰেণীসমূহৰ সীমাবদ্ধতা (\"|\" দি পৃথক কৰক):", - "rc_categories_any": "বাছনি কৰাৰ মাজত যিকোনো", "rc-change-size-new": "$1 {{PLURAL:$1|বাইট}} যোগ দিয়া হ’ল", "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ", "rc-enhanced-expand": "সবিশেষ দেখুৱাওক", diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index 10c3855ba1..258e0c1334 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -1456,8 +1456,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuariu|usuarios}} vixilando]", - "rc_categories": "Llendar a les categoríes (dixebrar con \"|\"):", - "rc_categories_any": "Cualquiera de les esbillaes", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués del cambiu", "newsectionsummary": "/* $1 */ nueva seición", "rc-enhanced-expand": "Amosar detalles", @@ -2207,7 +2205,7 @@ "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.", "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]", "sessionfailure-title": "Fallu de sesión", - "sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nTorna a la páxina anterior, recarga esa páxina y vuelve a tentalo.", + "sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nUnvia'l formulariu otra vegada.", "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina", "changecontentmodel-legend": "Cambiar el modelu de conteníu", "changecontentmodel-title-label": "Títulu de la páxina", @@ -3344,6 +3342,7 @@ "watchlistedit-clear-titles": "Títulos:", "watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)", "watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.", + "watchlistedit-clear-jobqueue": "Ta llimpiándose la llista de siguimientu. ¡Esta aición puede tardar daqué de tiempu!", "watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:", "watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.", "watchlisttools-clear": "Llimpiar la llista de siguimientu", diff --git a/languages/i18n/avk.json b/languages/i18n/avk.json index a7d5330e0d..39b2b3097a 100644 --- a/languages/i18n/avk.json +++ b/languages/i18n/avk.json @@ -741,8 +741,6 @@ "newpageletter": "W", "boteditletter": "s", "number_of_watching_users_pageview": "[$1 nedis {{PLURAL:$1|favesik|favesik}}]", - "rc_categories": "Kimara kare loma yo (solparsana kan \"|\")", - "rc_categories_any": "Kon", "newsectionsummary": "/* $1 */ warzaf gabot", "rc-enhanced-expand": "Pintanedira (JavaScript tir adraf)", "rc-enhanced-hide": "Pintapalsera", diff --git a/languages/i18n/awa.json b/languages/i18n/awa.json index a1eadcb32a..684937992e 100644 --- a/languages/i18n/awa.json +++ b/languages/i18n/awa.json @@ -1134,8 +1134,6 @@ "newpageletter": "न", "boteditletter": "बॉ", "number_of_watching_users_pageview": "[$1 ध्यान राखय वाले {{PLURAL:$1|सदस्य}}]", - "rc_categories": "श्रेणीन् तक सीमीत रक्खा जाय (\"|\" से अलग करा जाय)", - "rc_categories_any": "कवनो भी", "rc-change-size-new": "बदलाव कय बाद $1 {{PLURAL:$1|बाइट}}", "newsectionsummary": "/* $1 */ नँवा अनुभाग", "rc-enhanced-expand": "विस्तृत जानकारी देखावा जाय", diff --git a/languages/i18n/az.json b/languages/i18n/az.json index 48c0971509..f428e9ca40 100644 --- a/languages/i18n/az.json +++ b/languages/i18n/az.json @@ -1113,8 +1113,6 @@ "newpageletter": "Y", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 izləyən istifadəçi]", - "rc_categories": "Kateqoriyalara limit qoy (\"|\" ilə ayır)", - "rc_categories_any": "Seçilənlərdən hər hansı biri", "rc-change-size": "$1", "rc-change-size-new": "Dəyişiklikdən sonrakı ölçü: $1 bayt", "newsectionsummary": "/* $1 */ yeni bölmə", diff --git a/languages/i18n/azb.json b/languages/i18n/azb.json index 9abf0be9b5..3137638812 100644 --- a/languages/i18n/azb.json +++ b/languages/i18n/azb.json @@ -1195,8 +1195,6 @@ "newpageletter": "ی", "boteditletter": "ب", "number_of_watching_users_pageview": "[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیفاده‌چی]", - "rc_categories": "بؤلمه‌لره محدودلاشدیر («|» ایله آییر)", - "rc_categories_any": "سئچیلمیشلرین هر بیریسی", "rc-change-size-new": "دَییشیکلیک‌دن سوْنرا {{PLURAL:|بیر|$1}} بایت", "newsectionsummary": "/* $1 */ یئنی بؤلمه", "rc-enhanced-expand": "تفصیل‌لری گؤستر", diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json index 988ecdf16c..a44a7c0877 100644 --- a/languages/i18n/ba.json +++ b/languages/i18n/ba.json @@ -1441,8 +1441,6 @@ "newpageletter": "Я", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 күҙәткән {{PLURAL:$1|ҡатнашыусы}}]", - "rc_categories": "Тик категорияларҙан ғына (бүлеүсе «|»):", - "rc_categories_any": "Һайланғандың теләһә ҡайһыһы", "rc-change-size-new": "Үҙгәртештән һуң күләм: $1 {{PLURAL:$1|1=байт|байт}}", "newsectionsummary": "/* $1 */ яңы бүлек", "rc-enhanced-expand": "Ваҡ-төйәгенә тиклем күрһәтергә", diff --git a/languages/i18n/bar.json b/languages/i18n/bar.json index 5e6571d4e2..143531c818 100644 --- a/languages/i18n/bar.json +++ b/languages/i18n/bar.json @@ -574,8 +574,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beówochtender|beówochtende}} Benutzer]", - "rc_categories": "Netter Seiten aus d' Kategorien (trennd mid \"l\"):", - "rc_categories_any": "Olle", "newsectionsummary": "Neicher Obschnit /* $1 */", "rc-enhanced-expand": "Details zoagn (braucht JavaScript)", "rc-enhanced-hide": "Details vastecka", diff --git a/languages/i18n/bcc.json b/languages/i18n/bcc.json index 49f94579f8..22f8bbbf30 100644 --- a/languages/i18n/bcc.json +++ b/languages/i18n/bcc.json @@ -1120,8 +1120,6 @@ "newpageletter": "ن", "boteditletter": "ب", "number_of_watching_users_pageview": "[$1 چارگنت {{PLURAL:$1|کاربر|کابران}}]", - "rc_categories": "محدودیت په دسته جات(دورش گون\"|\")", - "rc_categories_any": "هرچی", "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} رند چه تغییر", "newsectionsummary": "/* $1 */ نوکین بخش", "rc-enhanced-expand": "جزئیاتء پیس دارگ", diff --git a/languages/i18n/bcl.json b/languages/i18n/bcl.json index cdacb1a58c..2208f5bbb8 100644 --- a/languages/i18n/bcl.json +++ b/languages/i18n/bcl.json @@ -1093,8 +1093,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 naka-antabay sa {{PLURAL:$1|paragamit|mga paragamit}}]", - "rc_categories": "Limitado sa mga kategorya (suhayon nin \"|\")", - "rc_categories_any": "Dawà arín", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} pagtatapos kan pagbabago", "newsectionsummary": "/* $1 */ bàgong seksyon", "rc-enhanced-expand": "Ipahiling an mga detalye", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index dfff3a8e60..c428513142 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -1144,13 +1144,13 @@ "right-deletelogentry": "выдаленьне і аднаўленьне асобных запісаў журналу", "right-deleterevision": "выдаленьне і аднаўленьне асобных вэрсіяў старонак", "right-deletedhistory": "Прагляд выдаленай гісторыі старонак бяз доступу да выдаленага тэксту", - "right-deletedtext": "прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак", - "right-browsearchive": "пошук выдаленых старонак", - "right-undelete": "аднаўленьне старонак", + "right-deletedtext": "Прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак", + "right-browsearchive": "Пошук выдаленых старонак", + "right-undelete": "Аднаўленьне старонак", "right-suppressrevision": "праглядаць, хаваць і аднаўляць пэўныя вэрсіі старонак, зробленыя любым удзельнікам", "right-viewsuppressed": "праглядаць вэрсіі старонак, схаваныя ад усіх удзельнікаў", - "right-suppressionlog": "прагляд прыватных журналаў", - "right-block": "блякаваньне іншых удзельнікаў ад рэдагаваньняў", + "right-suppressionlog": "Прагляд прыватных журналаў", + "right-block": "Блякаваньне іншых удзельнікаў ад рэдагаваньняў", "right-blockemail": "блякаваньне іншых ўдзельнікаў ад дасылкі электроннай пошты", "right-hideuser": "блякаваньне рахунку ўдзельніка і яго хаваньне", "right-ipblock-exempt": "абход блякаваньняў IP-адрасоў, аўта-блякаваньняў і блякаваньняў дыяпазонаў", @@ -1455,8 +1455,6 @@ "newpageletter": "Н", "boteditletter": "р", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]", - "rc_categories": "Абмежаваць катэгорыямі (разьдзяляйце знакам «|»):", - "rc_categories_any": "Любая з абраных", "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасьля зьмены", "newsectionsummary": "/* $1 */ новая сэкцыя", "rc-enhanced-expand": "Паказаць падрабязнасьці", @@ -2611,6 +2609,7 @@ "thumbnail_dest_directory": "Немагчыма стварыць мэтавую дырэкторыю", "thumbnail_image-type": "Тып выявы не падтрымліваецца", "thumbnail_gd-library": "Няпоўная канфігурацыя бібліятэкі GD: няма функцыі $1", + "thumbnail_image-size-zero": "Падобна, што файл мае нулявы памер.", "thumbnail_image-missing": "Верагодна няма файла $1", "thumbnail_image-failure-limit": "Было зроблена зашмат няўдалых спробаў ($1 ці болей) сфармаваць гэтую мініятуру. Калі ласка, паспрабуйце пазьней.", "import": "Імпартаваць старонкі", diff --git a/languages/i18n/be.json b/languages/i18n/be.json index 6dac67ef6b..795ab33661 100644 --- a/languages/i18n/be.json +++ b/languages/i18n/be.json @@ -1364,8 +1364,6 @@ "newpageletter": "Н", "boteditletter": "р", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}]", - "rc_categories": "Абмежаваць катэгорыямі (размяжоўваць знакам \"|\"):", - "rc_categories_any": "Любая з абраных", "rc-change-size-new": "$1 {{PLURAL:$1|байт|байты|байтаў}} пасля змены", "newsectionsummary": "/* $1 */ новы падраздзел", "rc-enhanced-expand": "Паказаць падрабязнасці", diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json index f166881a3b..2b077734b3 100644 --- a/languages/i18n/bg.json +++ b/languages/i18n/bg.json @@ -1415,8 +1415,6 @@ "newpageletter": "Н", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдаващ потребител|наблюдаващи потребители}}]", - "rc_categories": "Само от категории (разделител „|“)", - "rc_categories_any": "Която и да е от избраните", "rc-change-size-new": "$1 {{PLURAL:$1|байт|байта}} след редакцията", "newsectionsummary": "Нова тема /* $1 */", "rc-enhanced-expand": "Показване на детайли", diff --git a/languages/i18n/bgn.json b/languages/i18n/bgn.json index d919c28e9c..c25ab3e7a9 100644 --- a/languages/i18n/bgn.json +++ b/languages/i18n/bgn.json @@ -1095,8 +1095,6 @@ "newpageletter": "نوک", "boteditletter": "ر", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کار زوروک}} دیستینوک]", - "rc_categories": "ای تهرهانی حد ئا (گۆ «|» ئا جیتا کنیت)", - "rc_categories_any": "هر گوجام", "rc-change-size-new": "$1 {{PLURAL:$1|بایٹ}} پد شه تغیرا", "newsectionsummary": "/* $1 */ نوکین بخش", "rc-enhanced-expand": "جزئیات ئی نشان داتین", diff --git a/languages/i18n/bho.json b/languages/i18n/bho.json index 79f2d7e661..bda0e0645e 100644 --- a/languages/i18n/bho.json +++ b/languages/i18n/bho.json @@ -1219,8 +1219,6 @@ "newpageletter": "न", "boteditletter": "बॉ", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता लोग}} के धियानसूची में बा]", - "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं):", - "rc_categories_any": "बीछल में से कौनों एक ठो", "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट|बाइट्स}}", "newsectionsummary": "/* $1 */ नया खंड", "rc-enhanced-expand": "डिटेल देखावल जाय", diff --git a/languages/i18n/bjn.json b/languages/i18n/bjn.json index 9431cf9b84..e1a1d8e42a 100644 --- a/languages/i18n/bjn.json +++ b/languages/i18n/bjn.json @@ -943,8 +943,6 @@ "newpageletter": "H", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pa'itihi|papa'itihi}}]", - "rc_categories": "Watasi tutumbung (pisahakan lawan \"|\")", - "rc_categories_any": "Napa gin", "rc-change-size-new": "$1 {{PLURAL:$1|bita|bita}} limbah paubahan", "newsectionsummary": "/* $1 */ hagian hanyar", "rc-enhanced-expand": "Tampaiakan rincian (parlu ada JavaScript)", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index 48f961f208..e39abd1b40 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -1473,8 +1473,6 @@ "newpageletter": "ন", "boteditletter": "ব", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|জন ব্যবহারকারী|জন ব্যবহারকারী}} এই পাতার উপর নজর রাখছেন]", - "rc_categories": "বিষয়শ্রেণীগুলিতে সীমা (\"|\" দিয়ে আলাদা করুন):", - "rc_categories_any": "চয়নের জন্য যেকোনো কিছু", "rc-change-size-new": "পরিবর্তনের পর $1 {{PLURAL:$1|বাইট}}", "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ", "rc-enhanced-expand": "বিস্তারিত দেখাও", diff --git a/languages/i18n/bo.json b/languages/i18n/bo.json index ca9d0bddb3..33a3f39f9d 100644 --- a/languages/i18n/bo.json +++ b/languages/i18n/bo.json @@ -568,7 +568,6 @@ "minoreditletter": "སྒྲིག་ཆུང་།", "newpageletter": "ཤོག་གསར།", "boteditletter": "རང་འགུལ་འཕྲུལ་ཆས།", - "rc_categories_any": "གང་རུང་།", "rc-enhanced-expand": "ཞིབ་ཕྲར་སྟོན།", "rc-enhanced-hide": "ཞིབ་ཕྲ་སྦས་བ།", "recentchangeslinked": "འབྲེལ་བའི་བཟོ་བཅོས།", diff --git a/languages/i18n/br.json b/languages/i18n/br.json index 3147d4ca28..8f05d05a1d 100644 --- a/languages/i18n/br.json +++ b/languages/i18n/br.json @@ -1416,8 +1416,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|implijer o heuliañ|implijer}} o heuliañ]", - "rc_categories": "Bevenniñ d'ar rummadoù (dispartiet gant \"|\") :", - "rc_categories_any": "Unan e-touez ar re zibabet", "rc-change-size-new": "$1 {{PLURAL:$1|okted|okted}} goude kemmañ", "newsectionsummary": "/* $1 */ rann nevez", "rc-enhanced-expand": "Diskouez ar munudoù", diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json index 27151181f4..991dc1e535 100644 --- a/languages/i18n/bs.json +++ b/languages/i18n/bs.json @@ -1448,8 +1448,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]", - "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):", - "rc_categories_any": "Bilo koju odabranu", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene", "newsectionsummary": "/* $1 */ novi odlomak", "rc-enhanced-expand": "Prikaži detalje", diff --git a/languages/i18n/bto.json b/languages/i18n/bto.json index e06a65f08b..3eaf1b5864 100644 --- a/languages/i18n/bto.json +++ b/languages/i18n/bto.json @@ -409,7 +409,6 @@ "minoreditletter": "m", "newpageletter": "B", "boteditletter": "b", - "rc_categories_any": "Dawa uno", "newsectionsummary": "/* $1 */ bagong seksyon", "rc-enhanced-expand": "Ipabayad a mga detalye", "filename": "Filename", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 5657fb207a..13918d8998 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -575,11 +575,11 @@ "botpasswords-insert-failed": "No s'ha pogut afegir el nom del bot «$1». Ja hi estava afegit?", "botpasswords-update-failed": "No s'ha pogut actualitzar el nom del bot «$1». Hi estava suprimit?", "botpasswords-created-title": "S'ha creat la contrasenya del bot", - "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».", + "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de {{GENDER:$2||l'usuari|la usuària}} «$2».", "botpasswords-updated-title": "Contrasenya de bot actualitzada", - "botpasswords-updated-body": "La contrasenya pel bot «$1» de l'usuari «$2» ha estat actualitzada.", + "botpasswords-updated-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat actualitzada.", "botpasswords-deleted-title": "S'ha eliminat la contrasenya del bot", - "botpasswords-deleted-body": "La contrasenya del bot \"$1\", pertanyent a l'usuari \"$2\", ha estat eliminada.", + "botpasswords-deleted-body": "La contrasenya pel bot «$1» de {{GENDER:$2|l'usuari|la usuària}} «$2» ha estat eliminada.", "botpasswords-newpassword": "La nova contrasenya per a iniciar sessió amb $1 és $2. Guardeu-la de cara al futur.
(Per a bots vells que necessiten que el nom per a iniciar sessió sigui el mateix que el nom d'usuari, també podeu usar $3 com a nom d'usuari i $4 com a contrasenya.)", "botpasswords-no-provider": "BotPasswordsSessionProvider no està disponible.", "botpasswords-restriction-failed": "Les restriccions de contrasenyes de bots impedeixen aquest inici de sessió.", @@ -1045,7 +1045,7 @@ "recentchangesdays-max": "(màxim $1 {{PLURAL:$1|dia|dies}})", "recentchangescount": "Nombre d'edicions a mostrar per defecte:", "prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.", - "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].", + "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\nSi és necessari, [[Special:ResetTokens|la podeu restaurar]].", "savedprefs": "S’han desat les vostres preferències.", "savedrights": "S'han desat els grups d'usuari de {{GENDER:$1|$1}}.", "timezonelegend": "Fus horari:", @@ -1334,6 +1334,8 @@ "recentchanges-legend": "Opcions de canvis recents", "recentchanges-summary": "Seguiu els canvis més recents del wiki en aquesta pàgina.", "recentchanges-noresult": "Cap canvi corresponent a aquests criteris en el període indicat.", + "recentchanges-timeout": "Aquesta cerca ha temporitzat. Podeu provar amb paràmetres de cerca diferents.", + "recentchanges-network": "A causa d'un error tècnic no s'ha pogut recuperar cap resultat. Intenteu refrescar la pàgina.", "recentchanges-feed-description": "Segueix en aquest canal els canvis més recents del wiki.", "recentchanges-label-newpage": "Aquesta modificació creà una pàgina", "recentchanges-label-minor": "Aquesta és una modificació menor", @@ -1445,6 +1447,7 @@ "rcfilters-filter-previousrevision-label": "No la darrera revisió", "rcfilters-filter-previousrevision-description": "Tots els canvis que no són «la darrera revisió».", "rcfilters-filter-excluded": "Exclòs", + "rcfilters-tag-prefix-namespace-inverted": ":no $1", "rcfilters-exclude-button-off": "Exclou els seleccionats", "rcfilters-exclude-button-on": "Excloent els seleccionats", "rcfilters-view-tags": "Canvis etiquetats", @@ -1494,8 +1497,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[{{PLURAL:$1|Un usuari vigila|$1 usuaris vigilen}} aquesta pàgina]", - "rc_categories": "Limita a les categories (separades amb «|»):", - "rc_categories_any": "Qualsevol de les triades", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} després del canvi", "newsectionsummary": "/* $1 */ secció nova", @@ -1506,7 +1507,7 @@ "recentchangeslinked-feed": "Canvis relacionats", "recentchangeslinked-toolbox": "Canvis relacionats", "recentchangeslinked-title": "Canvis relacionats amb «$1»", - "recentchangeslinked-summary": "Aquesta llista reflecteix els canvis recents a les pàgines enllaçades des d'una pàgina concreta (o als membres d'una categoria concreta).\nLes pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en negreta.", + "recentchangeslinked-summary": "Introduïu un nom de pàgina per veure els canvis en les pàgines enllaçades des de o cap a aquesta pàgina (per veure els membres d'una categoria, introduïu Categoria:Nom de la categoria).\nEls canvis en pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en negreta.", "recentchangeslinked-page": "Nom de la pàgina:", "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada", "recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria", @@ -1847,7 +1848,7 @@ "doubleredirects": "Redireccions dobles", "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i la segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades ratllades s'han resolt.", "double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].", - "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.", + "double-redirect-fixed-maintenance": "Correcció automàtica de la redirecció doble de [[$1]] a [[$2]] en un tasca de manteniment", "double-redirect-fixer": "Supressor de dobles redireccions", "brokenredirects": "Redireccions rompudes", "brokenredirectstext": "Les següents redireccions enllacen a pàgines inexistents:", @@ -2633,6 +2634,7 @@ "import-mapping-namespace": "Importa a un espai de noms:", "import-mapping-subpage": "Importa com a subpàgines de la pàgina següent:", "import-upload-filename": "Nom de fitxer:", + "import-upload-username-prefix": "Prefix interwiki:", "import-comment": "Comentari:", "importtext": "Exporteu el fitxer des del wiki d'origen utilitzant l'[[Special:Export|eina d'exportació]].\nDeseu-lo al vostre ordinador i carregueu-ne una còpia ací.", "importstart": "S'estan important pàgines...", @@ -3413,7 +3415,7 @@ "version-poweredby-others": "altres", "version-poweredby-translators": "Traductors de translatewiki.net", "version-credits-summary": "El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]", - "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a la Llicència Pública General GNU.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].", + "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. Vegeu la Llicència Pública General GNU per a més informació.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].", "version-software": "Programari instal·lat", "version-software-product": "Producte", "version-software-version": "Versió", diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json index d5aa840013..66aa5b2222 100644 --- a/languages/i18n/ce.json +++ b/languages/i18n/ce.json @@ -158,7 +158,7 @@ "faq": "СиХХ", "actions": "Дийраш", "namespaces": "ЦӀерийн меттигаш", - "variants": "Кепараш", + "variants": "Варианташ", "navigation-heading": "Навигацин меню", "errorpagetitle": "ГӀалат", "returnto": "ЮхагӀо оцу агӀоне $1.", @@ -1286,8 +1286,6 @@ "newpageletter": "К", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|тӀехьожу декъашхо|тӀехьожу декъашхой}}]", - "rc_categories": "Категори чура бен (къасторг «|»)", - "rc_categories_any": "Муьлха а хаьржиначух", "rc-change-size-new": "Хийцам бин чул тӀехьа болу барам: $1 {{PLURAL:$1|байт}}", "newsectionsummary": "/* $1 */ Керла хьедар", "rc-enhanced-expand": "Гайта мадарра", @@ -1857,6 +1855,8 @@ "changecontentmodel-title-label": "АгӀона цӀе", "changecontentmodel-reason-label": "Бахьана:", "changecontentmodel-submit": "Хийца", + "log-name-contentmodel": "Модулийн чулацам хийцаран тептар", + "log-description-contentmodel": "ХӀокху агӀонгахь гойтуш ю, чулацаман хийцамаш бина модулаш.", "logentry-contentmodel-change-revertlink": "юхаяккха", "logentry-contentmodel-change-revert": "Юхаяккха", "protectlogpage": "Ларяран тептар", @@ -2831,6 +2831,7 @@ "tag-filter": "[[Special:Tags|Билгалонаш]] луьттург:", "tag-filter-submit": "Литта", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билгало|Билгалонаш}}]]: $2)", + "tag-mw-contentmodelchange": "модулан чулацаман хийцам", "tag-mw-new-redirect": "Керла дӀасахьажорг", "tag-mw-removed-redirect": "дӀаяьккхина дӀасхьажорг", "tag-mw-rollback": "Юхаяккха", @@ -3104,10 +3105,13 @@ "sessionprovider-generic": "$1 сесси", "randomrootpage": "Цахууш нисъелла ораман агӀо", "log-action-filter-block": "Блоктохаран тайпа:", + "log-action-filter-contentmodel": "Модулан чулацаман хийцамбаран тайпа:", "log-action-filter-all": "Ерриге", "log-action-filter-block-block": "Блоктохар", "log-action-filter-block-reblock": "Блоктохар хийцар", "log-action-filter-block-unblock": "БлокдӀаяхарш", + "log-action-filter-contentmodel-change": "Модулан чулацаман хийцам", + "log-action-filter-contentmodel-new": "Чулацаман стандартан йоцуш модулан агӀо кхоллар", "log-action-filter-rights-autopromote": "Авто хийцар", "log-action-filter-upload-upload": "Керла чудаккхар", "log-action-filter-upload-overwrite": "Юху чуяккха", diff --git a/languages/i18n/ch.json b/languages/i18n/ch.json index f1145ad449..21c7ea1a8f 100644 --- a/languages/i18n/ch.json +++ b/languages/i18n/ch.json @@ -8,7 +8,8 @@ "MisterWiki", "Shirayuki", "아라", - "Macofe" + "Macofe", + "Fanjiayi" ] }, "tog-underline": "Na'raya i inachetton:", @@ -206,6 +207,7 @@ "nstab-template": "Plantiyas", "nstab-help": "Påhinan ayudo", "nstab-category": "Katigoria", + "mainpage-nstab": "Fanhaluman", "nosuchaction": "Tåya' na aksion taiguenao", "nosuchspecialpage": "Tåya' na påhinan espesiat taiguenao", "error": "Linachi", @@ -228,6 +230,7 @@ "titleprotected": "Prinetehi este na titulo ginen fina'tinas-ña as [[User:$1|$1]].\nHa nå'i i rason $2.", "logouttext": "'''Malog-out hao på'go.'''\n\nSiña hao kumontinua manu'usa {{SITENAME}} sin nå'an, pat siña uma'log ta'lo pat siña un usa otra na nå'an muna'sesetbi.\nFanapunta na pålu na påhina siha para u na'annok na ma'log-in hao, asta ki un funas iyo-mu browser cache.", "yourname": "Nå'an ni muna'setbi:", + "userlogin-yourname": "Nå'an ni muna'setbi", "yourpassword": "Password:", "yourpasswordagain": "Taip ta'lo i password:", "yourdomainname": "Lugat-mu:", @@ -268,6 +271,10 @@ "accountcreatedtext": "Mafa'tinas i kuentan muna'sesetbi nu $1.", "createaccount-title": "Nina'huyong kuenta nu {{SITENAME}}", "loginlanguagelabel": "Lengguahe: $1", + "pt-login": "Log in", + "pt-login-button": "Log in", + "pt-createaccount": "Fa'tinas kuenta-hu", + "pt-userlogout": "Log out", "changepassword": "Tulaika password", "oldpassword": "Password bihu:", "newpassword": "Password nuebu:", @@ -446,7 +453,7 @@ "search-external": "Inaligao sanhiyong", "searchdisabled": "Mana'påra i inaligao {{SITENAME}}.\nSiña hao manaligao gi Google gi entretanto.\nFanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.", "preferences": "I ga'ña-mu", - "mypreferences": "I ga'ña-hu", + "mypreferences": "I ga'ña-mu", "prefs-edits": "Numirun tinilaika:", "prefs-skin": "Låssas", "skin-preview": "Na'annok", @@ -491,14 +498,25 @@ "grouppage-sysop": "{{ns:project}}:Atministradot siha", "rightslog": "I log ni direchun muna'sesetbi", "nchanges": "$1 {{PLURAL:$1|na tinilaika|na tinilaika siha}}", + "enhancedrc-history": "historia", "recentchanges": "Tinilaika siha gi halacha", "rcnotefrom": "Gi papa' guåha i tinilaika siha ginen '''$2''' (fa'na'an '''$1''' ma'annok).", "rclistfrom": "Na'annok i mannuebun tinilaika siha ginen $3 $2", "rcshowhideminor": "$1 na mandikike' na tinilaika siha", + "rcshowhideminor-show": "Na'annok", + "rcshowhideminor-hide": "Nå'na'", "rcshowhidebots": "$1 na bots siha", + "rcshowhidebots-show": "Na'annok", + "rcshowhidebots-hide": "Nå'na'", "rcshowhideliu": "$1 na muna'sesetbi ni ma log in", + "rcshowhideliu-show": "Na'annok", + "rcshowhideliu-hide": "Nå'na'", "rcshowhideanons": "$1 i muna'sesetbi taina'an", + "rcshowhideanons-show": "Na'annok", + "rcshowhideanons-hide": "Nå'na'", "rcshowhidemine": "$1 na tinilaika-hu", + "rcshowhidemine-show": "Na'annok", + "rcshowhidemine-hide": "Nå'na'", "rclinks": "Na'annok na $1 tinilaika siha ginen $2 na dihas manmaloffan", "diff": "dif", "hist": "hist", @@ -516,10 +534,13 @@ "upload": "Na'kåtga hulu' i atkibu", "uploadbtn": "Na'kåtga hulu' atkibu", "uploadlogpage": "Na'kåtga i log", + "filedesc": "Sumaria", + "imgfile": "atkibu", "listfiles": "Listan atkibu", "file-anchor-link": "Atkibu", "filehist": "Historian atkibu", "filehist-help": "Yemme' i fecha/ora para un li'e' i atkibu annai annok guihi na momentu.", + "filehist-revert": "tulaika tatte", "filehist-current": "pa'go", "filehist-datetime": "Fecha/Ora", "filehist-user": "Muna'sesetbi", @@ -570,6 +591,7 @@ "move": "Kånya", "movethispage": "Kånya i påhina", "booksources": "I source i lepblo", + "booksources-search": "Aligao", "specialloguserlabel": "Muna'sesetbi:", "speciallogtitlelabel": "Titulo:", "log": "Logs", @@ -586,7 +608,7 @@ "linksearch-ok": "Aligao", "emailuser": "Na'e-mail i muna'sesetbi este", "watchlist": "Listan pinilan-hu", - "mywatchlist": "Listan pinilan-hu", + "mywatchlist": "Listan pinilan", "addedwatchtext": "Mana'suha i påhina \"[[:$1]]\" para iyo-mu [[Special:Watchlist|Listan pinilan]].\nI tinilaika siha mo'na gi tiempo kontodu i påhinan kombetsasion siha para u fana'lista guihi, yan para u '''na'potpot''' i påhina gi halom [[Special:RecentChanges|i listan tinilaika gi halacha]] para un ayek ha' mas libianu.", "removedwatchtext": "Mana'suha i påhinan \"[[:$1]]\" gi [[Special:Watchlist|listan pinilan-mu]].", "watch": "Pulan", @@ -629,7 +651,7 @@ "blanknamespace": "(Fanhaluman)", "contributions": "Kontribusion siha ni muna'sesetbi", "mycontris": "Kontribusion-hu", - "contribsub2": "Para $1 ($2)", + "contribsub2": "Para {{GENDER:$3|$1}} ($2)", "uctop": "(sanhilo')", "month": "Ginen i mes (yan eståba):", "year": "Ginen i sakkan (yan eståba):", @@ -639,6 +661,7 @@ "sp-contributions-submit": "Aligao", "whatlinkshere": "Håfa ha na'chetton guini", "whatlinkshere-title": "I påhina siha ni mana'chetton yan \"$1\"", + "whatlinkshere-page": "Påhina:", "linkshere": "Umachetton i sigienten påhina siha yan '''[[:$1]]''':", "nolinkshere": "Taya' umachetton yan '''[[:$1]]'''.", "isredirect": "dirihi i påhina", @@ -680,7 +703,7 @@ "tooltip-pt-login": "Maolek-ña mohon yanggen humålom hao kuenta-mu, lao ti nesisariu ha'.", "tooltip-pt-logout": "Log out", "tooltip-ca-talk": "Diskuti i infotmasion i påhina", - "tooltip-ca-edit": "Siña un tulaika este na påhina. Pot fabot usa i batunes ni manchek åntes di un satba.", + "tooltip-ca-edit": "Tulaika i påhina", "tooltip-ca-addsection": "Nå'ye komentu gi kometsasion.", "tooltip-ca-viewsource": "Maprotehi i påhina. Siña un li'e' iyo-ña code.", "tooltip-ca-history": "I uttimo siha na tinilaika para este na påhina", @@ -721,6 +744,7 @@ "tooltip-diff": "Na'annok håfa i tinilaika-mu gi tinige'", "tooltip-compareselectedversions": "Na'annok i diferensia siha gi i dos ma'ayek na tinilaika ni påhina.", "tooltip-watch": "Po'lo i påhina gi listan pinilan-mu", + "pageinfo-article-id": "Påhina ID", "previousdiff": "← I må'pos na dif", "nextdiff": "Mamaila' na dif →", "file-info-size": "$1 × $2 na pixel, mineddong atkibu: $3, MIME klåsi: $4", @@ -742,6 +766,9 @@ "watchlisttools-raw": "Tulaika i listan pinilan ti mana'finu", "version": "Tinilaika", "version-specialpages": "Manespesiat na påhina", + "redirect-submit": "Hånao", + "redirect-page": "Påhina ID", "fileduplicatesearch-submit": "Aligao", - "specialpages": "Manespesiat na påhina" + "specialpages": "Manespesiat na påhina", + "searchsuggest-search": "Aligao gi {{SITENAME}}" } diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index 7d057e578e..76d1f58d62 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -1275,8 +1275,6 @@ "newpageletter": "ن", "boteditletter": "بۆت", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|بەکارھێنەر}}ی چاودێر]", - "rc_categories": "بەرتەسککردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)", - "rc_categories_any": "هەرکامێک بێت", "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری", "newsectionsummary": "/* $1 */ بەشی نوێ", "rc-enhanced-expand": "وردەکارییەکان نیشان بدە", diff --git a/languages/i18n/crh-cyrl.json b/languages/i18n/crh-cyrl.json index 81902e2b9b..3eaeffe7d5 100644 --- a/languages/i18n/crh-cyrl.json +++ b/languages/i18n/crh-cyrl.json @@ -788,8 +788,6 @@ "newpageletter": "Я", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|1=къулланыджы|къулланыджы}} козете]", - "rc_categories": "Тек категориялардан («|» иле айырыла)", - "rc_categories_any": "Эр анги", "rc-change-size-new": "Денъиштирильген сонъ $1 {{PLURAL:$1|байт|байт}}", "newsectionsummary": "/* $1 */ янъы болюк", "rc-enhanced-expand": "Тафсилятыны косьтер", diff --git a/languages/i18n/crh-latn.json b/languages/i18n/crh-latn.json index 9fc1e44873..13d8a415a4 100644 --- a/languages/i18n/crh-latn.json +++ b/languages/i18n/crh-latn.json @@ -785,8 +785,6 @@ "newpageletter": "Y", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|qullanıcı|qullanıcı}} közete]", - "rc_categories": "Tek kategoriyalardan (\"|\" ile ayırıla)", - "rc_categories_any": "Er angi", "rc-change-size-new": "Deñiştirilgen soñ $1 {{PLURAL:$1|bayt|bayt}}", "newsectionsummary": "/* $1 */ yañı bölük", "rc-enhanced-expand": "Tafsilâtını köster", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index bdcc5c1931..55083ffbe0 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -877,7 +877,7 @@ "revdelete-reasonotherlist": "Jiný důvod", "revdelete-edit-reasonlist": "Editovat důvody smazání", "revdelete-offender": "Autor revize:", - "suppressionlog": "Záznam utajení", + "suppressionlog": "Kniha utajení", "suppressionlogtext": "Toto je seznam mazání a blokování zahrnující skrytí obsahu i před správci.\nVizte též [[Special:BlockList|seznam všech probíhajících bloků]].", "mergehistory": "Slučování historií stránek", "mergehistory-header": "Tato stránka Vám umožní sloučit historii verzí jedné zdrojové stránky s novější stránkou.\nUjistěte se, že tato změna udrží souvislost a posloupnost verzí v historii.", @@ -1479,8 +1479,6 @@ "newpageletter": "N", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledující uživatel|sledující uživatelé|sledujících uživatelů}}]", - "rc_categories": "Omezit na kategorie (oddělené „|“):", - "rc_categories_any": "Jakákoli z vybraných", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtů}} po změně", "newsectionsummary": "Nová sekce /* $1 */", "rc-enhanced-expand": "Zobrazit detaily", @@ -2626,6 +2624,7 @@ "thumbnail_dest_directory": "Nelze vytvořit cílový adresář", "thumbnail_image-type": "Nepodporovaný typ obrázku", "thumbnail_gd-library": "Neúplná konfigurace knihovny GD: chybí funkce $1", + "thumbnail_image-size-zero": "Velikost souboru je zřejmě nulová.", "thumbnail_image-missing": "Soubor patrně chybí: $1", "thumbnail_image-failure-limit": "V poslední době došlo k příliš mnoha neúspěšným pokusům (nejméně $1) o vytvoření tohoto náhledu. Zkuste to později.", "import": "Import stránek", diff --git a/languages/i18n/csb.json b/languages/i18n/csb.json index 400c353cdd..38984f9839 100644 --- a/languages/i18n/csb.json +++ b/languages/i18n/csb.json @@ -137,7 +137,7 @@ "hidden-category-category": "Zataconé kategòrëje", "category-subcat-count": "{{PLURAL:$2|Na kategòrrjô zamëkô w se blós nôslédną pòdkategòrëjã.|Na kategòrëjô mô {{PLURAL:$1|pòdkategòrëje|$1 pòdkategòrëjôw}}, w $2 kategòrëjach.}}", "category-subcat-count-limited": "Na kategòrëjô zamëkô w se {{PLURAL:$1|1 pòdkategòrëjã|$1 pòdkategòrëje|$1 pòdkategòrëjów}}.", - "category-article-count": "{{PLURAL:$2|Na kategòrëjô zamëkôw w se blós jedną starnã.|Niżi mómë $1 westrzód $2 starów w ti kategòrëji.}}", + "category-article-count": "{{PLURAL:$2|Na kategòrëjô zamëkô w se blós jedną starnã.|Niżi mómë $1 westrzód $2 starnów w ti kategòrëji.}}", "category-article-count-limited": "W ti kategòrëji {{PLURAL:$1|je 1 starna|są $1 starnë|je $1 starnów}}.", "category-file-count": "{{PLURAL:$2|Na kategòrëjô zamëkô w se blós jeden lopk.|W ti kategòrëji {{PLURAL:$1|je 1 lopk|są $1 lopczi|je $1 lopków}} z oòglowi wielënë $2 lopków.}}", "category-file-count-limited": "W ti kategòrëji {{PLURAL:$1|je 1 lopk|są $1 lopczi|je $1 lopków}}.", @@ -684,6 +684,7 @@ "rcfilters-savedqueries-defaultlabel": "Zapisóné filtrë", "rcfilters-savedqueries-add-new-title": "Zapiszë aktualné ùstôwë filtrów.", "rcfilters-clear-all-filters": "Wëczëszczë filtrë", + "rcfilters-show-new-changes": "Òbôcz nowszé zjinaczi", "rcfilters-search-placeholder": "Fitruj nowé zjinaczi (ùżij do te menu abò wëszukôj pòdle pòzwë filtra)", "rcfilters-filterlist-title": "Filtrë", "rcfilters-filterlist-feedbacklink": "Napiszë, jak cë sã widzą te nowé nôrzãdza filtrowaniô.", @@ -1240,6 +1241,7 @@ "specialpages": "Specjalné starnë", "tag-filter": "Filtr [[Special:Tags|znakòwników]]:", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Znakòwnik|Znakòwniczi}}]]: $2)", + "tag-mw-changed-redirect-target": "Pòzmiana célu przeczerowaniô", "tag-mw-blank": "Rëmniãcé całi zamkłoscë starnë", "tag-mw-rollback": "Copniãcé zjinaków", "tags-title": "Znakòwniczi", diff --git a/languages/i18n/cu.json b/languages/i18n/cu.json index 8a10d62665..6d27e3e037 100644 --- a/languages/i18n/cu.json +++ b/languages/i18n/cu.json @@ -428,7 +428,6 @@ "minoreditletter": "м҃л", "newpageletter": "н҃в", "boteditletter": "а҃ѵ", - "rc_categories_any": "Любы из выбраных", "rc-change-size-new": "$1 {{PLURAL:$1|баитъ|баита|баитъ}} послѣди мѣнꙑ", "rc-old-title": "напрьва страница створѥна ꙗко ⁖ $1 ⁖", "recentchangeslinked": "съвѧꙁанꙑ страницѧ", diff --git a/languages/i18n/cv.json b/languages/i18n/cv.json index cac833e37a..946c6c97f4 100644 --- a/languages/i18n/cv.json +++ b/languages/i18n/cv.json @@ -125,6 +125,7 @@ "faq": "ЫйХу", "namespaces": "Ят хушшисем", "variants": "Вариантсем", + "navigation-heading": "Навигаци", "errorpagetitle": "Йăнăш", "returnto": "$1 таврăн.", "tagline": "{{SITENAME}}", @@ -163,7 +164,7 @@ "otherlanguages": "Урăх чĕлхесем", "redirectedfrom": "($1 çинчен куçарнă)", "redirectpagesub": "Куçаракан страница", - "lastmodifiedat": "Ку страницăна юлашки улăштарнă вăхăт: $2, $1.", + "lastmodifiedat": "Ку страницăна .юлашки хут хӑҫан улӑштарни: $1 $2.", "viewcount": "Ку страницăна $1 хут пăхнă.", "protectedpage": "Хӳтĕленĕ статья", "jumpto": "Куçас:", @@ -225,6 +226,7 @@ "nstab-template": "Шаблон", "nstab-help": "Пулăшу", "nstab-category": "Категори", + "mainpage-nstab": "Тӗпел", "nosuchaction": "Ку ĕçе тăваймастпăр", "nosuchactiontext": "URLта çырнă хушăва вики скрипчĕ ăнланмасть", "nosuchspecialpage": "Ун пек страница çук", @@ -432,14 +434,22 @@ "lineno": "$1-мĕш йĕрке:", "editundo": "унчченхи", "searchresults": "Шыранă результачĕсем", + "searchresults-title": "\"$1\" шыраса тупни", "textmatches": "Статьясенчи текст пĕрпеклĕхĕ", "prevn": "унчченхи {{PLURAL:$1|$1}}", "nextn": "урăххисем {{PLURAL:$1|$1}}", "prev-page": "унчченхи страницă", "next-page": "урăх страницă", + "shown-title": "Пӗр элте $1 результат кӑтарт", "viewprevnext": "Пăх ($1 {{int:pipe-separator}} $2) ($3)", + "searchprofile-articles": "Статьясем", + "searchprofile-images": "Мультимедиа", + "searchprofile-everything": "Пур ҫӗрте", + "searchprofile-advanced": "Анлӑлатнӑ", "searchprofile-articles-tooltip": "$1 -ре шырани", "searchprofile-images-tooltip": "Файăлсене шырани", + "searchprofile-everything-tooltip": "Мӗнпур элсенче (сӳтсе явнинче те) шыра", + "searchprofile-advanced-tooltip": "Ятарлӑ ят талккӑшӗсенче шыра", "search-result-size": "$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})", "search-category": "(категори $1)", "search-interwiki-caption": "Тăван проектсем", @@ -518,6 +528,7 @@ "grouppage-sysop": "{{ns:project}}:Администраторсем", "grouppage-bureaucrat": "{{ns:project}}:Бюрократсем", "grouppage-suppress": "{{ns:project}}:Тĕрĕслекенсем", + "newuserlogpage": "Хутшӑнакан регистрациленнин кун-ҫулӗ", "rightslogtext": "Ку хутшăнакансен прависене улăштарнисен журналĕ.", "enhancedrc-history": "истори", "recentchanges": "Улăшăннисем", @@ -558,7 +569,7 @@ "newpageletter": "Ç", "boteditletter": "б", "unpatrolledletter": "!", - "rc_categories_any": "Кашни", + "rc-change-size-new": "Улӑштарнӑ хыҫҫӑн $1 байт пулать", "newsectionsummary": "/* $1 */ Çĕнĕ тема", "recentchangeslinked": "Çыхăннă улшăнусем", "recentchangeslinked-feed": "Çыхăннă улшăнусем", @@ -607,6 +618,7 @@ "listfiles_description": "Ăнлантаркăч", "file-anchor-link": "Файл", "filehist": "Файл историйĕ", + "filehist-help": "Вӑхӑт ҫине пуссан, ун чухнехи версине пӑхма пулать.", "filehist-current": "хальхи", "filehist-datetime": "Дата/Вăхăт", "filehist-thumb": "Миниатюра", @@ -778,6 +790,7 @@ "undelete-search-box": "Кăларса пăрахнă страницăсен хушшинчи шырав", "undelete-search-submit": "Шыра", "namespace": "Ят хушши:", + "invert": "Суйланине ҫавӑр", "blanknamespace": "(Тĕп)", "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем", "contributions-title": "Усă куракан $1 хушни", @@ -868,25 +881,44 @@ "tooltip-pt-watchlist": "Эсир пăхакан страницисем", "tooltip-pt-mycontris": "Сирĕн хушнисем", "tooltip-pt-anoncontribs": "Ку IP адреспа тӳрлетнисем", + "tooltip-pt-login": "Кӗме кирлех мар-ха та, ара аванрах.", "tooltip-pt-logout": "Сеансне пĕтер", + "tooltip-pt-createaccount": "Аккаунт ту та системӑна кӗр. Паллах, унсӑрах та юрать, анчах та аккаунтпа кӗни лайӑхрах.", "tooltip-ca-talk": "Статьяна сӳтсе явасси", - "tooltip-ca-edit": "Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.", + "tooltip-ca-edit": "Эле тӳрлет", "tooltip-ca-addsection": "Çĕнĕ пай ту", "tooltip-ca-viewsource": "Ку страницӑна эсир улӑштарма пултараймастӑр. Ӑна мӗнле ҫырнине кӑна пӑхма пултаратӑр.", + "tooltip-ca-history": "Эле улӑштарнин кун-ҫулӗ", "tooltip-ca-protect": "Улӑшратусенчен сыхласси", "tooltip-ca-delete": "Страницӑна кӑларса пӑрахмалли", "tooltip-ca-move": "Страницӑна урӑх ҫӗре куҫарасси", "tooltip-ca-watch": "Ку страницӑ хыҫҫӑн сӑнама пуҫласси", "tooltip-ca-unwatch": "Ку страницӑ хыҫҫӑн урӑх сӑнамалла мар", "tooltip-search": "Шырав {{SITENAME}}", + "tooltip-search-go": "Пур пулсан ҫак ятлӑ страницӑна куҫ", + "tooltip-search-fulltext": "Ҫак текстлӑ страницисене туп", "tooltip-p-logo": "Тӗп страницӑ", + "tooltip-n-mainpage": "Тӗпеле куҫ", + "tooltip-n-mainpage-description": "Тӗпеле куҫ", + "tooltip-n-portal": "Проект ҫинченне, мӗн тума пултарнине, япаласем ӑҫтине пӗл", + "tooltip-n-currentevents": "Хальхи пулӑмсем ҫинчен", + "tooltip-n-recentchanges": "Юлашки улӑштарнин йышӗ", + "tooltip-n-randompage": "Ӑнсӑртран суйланӑ страница кӑтарт", + "tooltip-n-help": "Ыйтса пӗлмелли вырӑн", + "tooltip-t-whatlinkshere": "Кунта каҫакан пур страницӑн ят-йышӗ", "tooltip-feed-atom": "Ку страницăн Atom куçару", "tooltip-t-upload": "Файлсем хушмалли", + "tooltip-t-specialpages": "Ятарлӑ страницӑсен пӗтӗм ят-йышӗ", + "tooltip-t-print": "Ҫак страницӑн пичет версийӗ", + "tooltip-t-permalink": "Элӗн ҫак версийӗн улӑштарман каҫҫи", + "tooltip-ca-nstab-main": "Статьяна пăх", + "tooltip-ca-nstab-special": "Ку ятарлӑ эл, ӑна тӳрлетме май ҫук", "tooltip-ca-nstab-image": "Файлăн страници", "tooltip-ca-nstab-template": "Шаблонăн страници", "tooltip-ca-nstab-category": "Категорин страницине пăхни", "tooltip-save": "Тӳрлетӳсене астуса хăвармалла", "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш", + "tooltip-rollback": "Пӗрре пуссан, юлашки тӳрлетекенӗн улӑштарнине катерт", "tooltip-summary": "Кĕскĕн ăнлантарса парăр", "anonymous": "Паллă мар {{PLURAL:$1|хутшăнакан|хутшăнакансем}} {{SITENAME}}", "siteuser": "{{SITENAME}} усă куракан $1", @@ -912,6 +944,7 @@ "file-info": "файл пысăкăшĕ: $1, MIME-тĕсĕ: $2", "file-info-size": "$1 × $2 пиксел, файл пысăкăше: $3, MIME-тĕсĕ: $4", "file-nohires": "Пысăкрах калăпăшли çук.", + "show-big-image-size": "$1 × $2 пиксел", "newimages": "Çĕнĕ файлсен галерейи", "newimages-summary": "Ку ятарлă страницăра эсир нумай пулмасть кĕртнĕ файлсене куратăр", "noimages": "Ӳкерчĕксем çук.", @@ -967,6 +1000,7 @@ "specialpages-group-media": "Медиа-материалсемпе тултарăшсем", "specialpages-group-users": "Хутшăнакансем тата правасем", "specialpages-group-highuse": "Нумай усă куракан страницăсем", + "tag-list-wrapper": "([[Special:Tags|$1 метка]]: $2)", "compare-submit": "Танлаштар", "htmlform-selectorother-other": "Урăххи", "htmlform-no": "Çук", @@ -977,7 +1011,7 @@ "logentry-newusers-create": "Хутшăнакан $1 аккаунтне {{GENDER:$2|турĕ}}", "rightsnone": "(çук)", "feedback-back": "Каялла", - "searchsuggest-search": "Шырамалли", + "searchsuggest-search": "{{SITENAME}} сайтӗнче шыра", "pagelang-select-lang": "Чĕлхе суйлăр", "mediastatistics-header-audio": "Аудио", "mediastatistics-header-video": "Видеосем", diff --git a/languages/i18n/cy.json b/languages/i18n/cy.json index 1a1e6a2edd..10b4025a71 100644 --- a/languages/i18n/cy.json +++ b/languages/i18n/cy.json @@ -1367,8 +1367,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|defnyddwyr|defnyddiwr|ddefnyddiwr|defnyddiwr|defnyddiwr|o ddefnyddwyr}} yn gwylio]", - "rc_categories": "Cyfyngu i gategorïau (gwahanwch gyda \"|\")", - "rc_categories_any": "Unrhyw un", "rc-change-size-new": "$1 {{PLURAL:$1|beit}} wedi'r newid", "newsectionsummary": "/* $1 */ adran newydd", "rc-enhanced-expand": "Dangos y manylion", diff --git a/languages/i18n/da.json b/languages/i18n/da.json index 9e4e93f288..e065bb9e87 100644 --- a/languages/i18n/da.json +++ b/languages/i18n/da.json @@ -1467,8 +1467,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|overvågende bruger|overvågende brugere}}]", - "rc_categories": "Grænse for kategorier (adskilt med \"|\"):", - "rc_categories_any": "Nogen af de valgte", "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter ændring", "newsectionsummary": "/* $1 */ nyt afsnit", diff --git a/languages/i18n/de-ch.json b/languages/i18n/de-ch.json index 8a26c7d36f..642130bff3 100644 --- a/languages/i18n/de-ch.json +++ b/languages/i18n/de-ch.json @@ -165,7 +165,6 @@ "right-editmyprivateinfo": "Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, richtiger Name)", "right-override-export-depth": "Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5", "recentchanges-label-plusminus": "Die Änderung der Seitengrösse in Bytes", - "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit «|»):", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung", "rc-old-title": "ursprünglich erstellt als «$1»", "recentchangeslinked-title": "Änderungen an Seiten, die von «$1» verlinkt sind", diff --git a/languages/i18n/de.json b/languages/i18n/de.json index 79a3ab60fa..b343b68a76 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -1536,8 +1536,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]", - "rc_categories": "Nur Seiten aus den Kategorien (getrennt mit „|“):", - "rc_categories_any": "Beliebige der ausgewählten", "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung", "newsectionsummary": "Neuer Abschnitt /* $1 */", @@ -2694,6 +2692,7 @@ "thumbnail_dest_directory": "Zielverzeichnis kann nicht erstellt werden.", "thumbnail_image-type": "Bildtyp nicht unterstützt", "thumbnail_gd-library": "Unvollständige Konfiguration der GD-Bibliothek: Fehlende Funktion $1", + "thumbnail_image-size-zero": "Die Dateigröße des Bildes scheint null zu sein.", "thumbnail_image-missing": "Datei scheint fehlend zu sein: $1", "thumbnail_image-failure-limit": "Es wurden in letzter Zeit zu viele Versuche ($1 oder mehr) unternommen, dieses Vorschaubild zu rendern. Bitte versuche es später erneut.", "import": "Seiten importieren", diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json index ecf8cc4fb0..de567481a8 100644 --- a/languages/i18n/diq.json +++ b/languages/i18n/diq.json @@ -222,7 +222,7 @@ "templatepage": "Pera şabloni bımotné", "viewhelppage": "Pera peşti bıvin", "categorypage": "Pera kategori bımotné", - "viewtalkpage": "Vaten bıvin", + "viewtalkpage": "Werênayışi bıvêne", "otherlanguages": "Zıwananê binan de", "redirectedfrom": "($1 ra kırışı yê)", "redirectpagesub": "Perra kırıştışi", @@ -1255,8 +1255,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 ho seyr keno {{PLURAL:$1|karber|karberî}}]", - "rc_categories": "Kategoriyan rêz kı ( \"|“ ya ciya yo):", - "rc_categories_any": "Weçinayiyan ra her yew", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bayt|bayti}} ra dıma vurnayış", "newsectionsummary": "/* $1 */ qısımo newe", @@ -2014,7 +2012,7 @@ "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi", "sp-contributions-uploads": "Barkerdışi", "sp-contributions-logs": "qeydi", - "sp-contributions-talk": "vaten", + "sp-contributions-talk": "werênayış", "sp-contributions-userrights": "idareyê heqanê karberan", "sp-contributions-blocked-notice": "verniyê no/na karber/e geriyayo/a\nqê referansi qeydê vernigrewtışi cêr de eşkera biyo:", "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:", @@ -2320,7 +2318,7 @@ "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo", "tooltip-pt-logout": "Bıveciye", "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.", - "tooltip-ca-talk": "Heqa zerreki vaten", + "tooltip-ca-talk": "Heqa zerreki de werênayış", "tooltip-ca-edit": "Ena pele bıvurne", "tooltip-ca-addsection": "Bınleteyo newe akerê", "tooltip-ca-viewsource": "Ena pele kılit biya.\nŞıma şenê çımeyê aye bıvênê", diff --git a/languages/i18n/dsb.json b/languages/i18n/dsb.json index 53f742af40..2919aed5d8 100644 --- a/languages/i18n/dsb.json +++ b/languages/i18n/dsb.json @@ -1108,8 +1108,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobglědowaŕ|wobglědowarja|wobglědowarje}}]", - "rc_categories": "Jano boki z kategorijow (źělone z pomocu „|“):", - "rc_categories_any": "wše", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byta|byty|bytow}} pó změnje", "newsectionsummary": "Nowy wótrězk /* $1 */", "rc-enhanced-expand": "Drobnostki pokazaś", diff --git a/languages/i18n/dty.json b/languages/i18n/dty.json index dc25eb0565..5d5449a531 100644 --- a/languages/i18n/dty.json +++ b/languages/i18n/dty.json @@ -1021,7 +1021,6 @@ "minoreditletter": "ना", "newpageletter": "नौ", "boteditletter": "बो", - "rc_categories": "श्रेणीहरूमी सीमित (\"|\" ले छुट्याओ)", "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट्स}}फेरबदल पाछा", "recentchangeslinked": "सम्बन्धित फेरबदल", "recentchangeslinked-toolbox": "सम्बन्धित फेरबदल", diff --git a/languages/i18n/egl.json b/languages/i18n/egl.json index 52595ad44e..4d97f4b279 100644 --- a/languages/i18n/egl.json +++ b/languages/i18n/egl.json @@ -1141,8 +1141,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[vésta da {{PLURAL:$1|un utèint|$1 utèint}}]", - "rc_categories": "Lémita al categoréi (separêdi da \"|\")", - "rc_categories_any": "Bast' ech sia fra còli sgnêdi", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} dôp la mudéfica", "newsectionsummary": "/* $1 */ sesiòn nōva", "rc-enhanced-expand": "Fà vèder i particulêr.", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index 096d8914b9..5040de9b89 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -1065,7 +1065,7 @@ "default": "προεπιλογή", "prefs-files": "Αρχεία", "prefs-custom-css": "Προκαθορισμένη CSS", - "prefs-custom-js": "Προκαθορισμένη JS", + "prefs-custom-js": "Προσαρμοσμένη JavaScript", "prefs-common-css-js": "Κοινά CSS/JavaScript για όλα τα θέματα εμφάνισης:", "prefs-reset-intro": "Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.", "prefs-emailconfirm-label": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου:", @@ -1101,7 +1101,7 @@ "prefs-editor": "Συντάκτης", "prefs-preview": "Προεπισκόπηση", "prefs-advancedrc": "Προηγμένες επιλογές", - "prefs-opt-out": "Optar por no los mejoramientos", + "prefs-opt-out": "Απόρριψη βελτιώσεων", "prefs-advancedrendering": "Προηγμένες επιλογές", "prefs-advancedsearchoptions": "Προηγμένες επιλογές", "prefs-advancedwatchlist": "Προηγμένες επιλογές", @@ -1445,6 +1445,8 @@ "rcfilters-view-namespaces-tooltip": "Φιλτράρισμα αποτελεσμάτων κατά ονοματοχώρο", "rcfilters-liveupdates-button": "Ζωντανή ανανέωση", "rcfilters-liveupdates-button-title-on": "Απενεργοποίηση ζωντανής ανανέωσης", + "rcfilters-preference-label": "Απόκρυψη της βελτιωμένης έκδοσης των Πρόσφατων Αλλαγών", + "rcfilters-preference-help": "Αναστέλλει τον επανασχεδιασμό διεπαφής 2017 και όλα τα εργαλεία που προστέθηκαν στη συνέχεια και από τότε.", "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από $3, $4 (έως $1 που εμφανίζεται).", "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2", "rcshowhideminor": "$1 μικροεπεξεργασιών", @@ -1477,8 +1479,6 @@ "newpageletter": "Ν", "boteditletter": "ρ", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|χρήστης|χρήστες}} παρακολουθούν]", - "rc_categories": "Περιορίστε τις κατηγορίες (διαχωρίστε τις με \"|\"):", - "rc_categories_any": "Οποιαδήποτε από τις επιλεγμένες", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} μετά από την αλλαγή", "newsectionsummary": "/* $1 */ νέα ενότητα", "rc-enhanced-expand": "Εμφάνιση λεπτομερειών", @@ -3760,6 +3760,8 @@ "linkaccounts": "Σύνδεση λογαριασμών", "linkaccounts-success-text": "Ο λογαριασμός συνδέθηκε", "linkaccounts-submit": "Σύνδεση λογαριασμών", + "userjsispublic": "Σημείωση: Οι υποσελίδες JavaScript δεν πρέπει να περιέχουν εμπιστευτικά δεδομένα καθώς είναι ορατά από άλλους χρήστες.", + "usercssispublic": "Σημείωση: Οι υποσελίδες CSS δεν πρέπει να περιέχουν εμπιστευτικά δεδομένα καθώς είναι ορατά από άλλους χρήστες.", "revid": "αναθεώρηση $1", "pagedata-bad-title": "Μη έγκυρος τίτλος: $1." } diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 3dc01d9a29..d0ee41c27f 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1523,8 +1523,6 @@ "unpatrolledletter": "!", "number_of_watching_users_RCview": "[$1]", "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]", - "rc_categories": "Limit to categories (separate with \"|\"):", - "rc_categories_any": "Any of the chosen", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change", "newsectionsummary": "/* $1 */ new section", @@ -2763,6 +2761,7 @@ "thumbnail_dest_directory": "Unable to create destination directory", "thumbnail_image-type": "Image type not supported", "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1", + "thumbnail_image-size-zero": "Image file size seems to be zero.", "thumbnail_image-missing": "File seems to be missing: $1", "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.", "import": "Import pages", diff --git a/languages/i18n/eo.json b/languages/i18n/eo.json index 57213c2385..1ebc823009 100644 --- a/languages/i18n/eo.json +++ b/languages/i18n/eo.json @@ -1422,8 +1422,6 @@ "newpageletter": "N", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]", - "rc_categories": "Nur paĝoj el jenaj kategorioj (disigu per \"|\"):", - "rc_categories_any": "Iuj el la elektitaj", "rc-change-size-new": "$1 {{PLURAL:$1|bitoko|bitokoj}} post ŝanĝo", "newsectionsummary": "/* $1 */ nova sekcio", "rc-enhanced-expand": "Montri detalojn (per JavaScript)", diff --git a/languages/i18n/es-formal.json b/languages/i18n/es-formal.json index a98ddaedb0..99d0511018 100644 --- a/languages/i18n/es-formal.json +++ b/languages/i18n/es-formal.json @@ -262,6 +262,8 @@ "wrongpasswordempty": "No ha introducido una contraseña.\nPor favor inténtelo de nuevo.", "password-name-match": "Su contraseña debe ser diferente de su nombre de usuario.", "passwordsent": "Se ha enviado una nueva contraseña al correo electrónico de «$1».\nPor favor, identifíquese de nuevo tras recibirla.", + "emailconfirmlink": "Confirme su dirección de correo electrónico", + "invalidemailaddress": "No se puede aceptar la dirección de correo electrónico, pues parece que tiene un formato no válido.\nPor favor, escriba una dirección bien formada o deje el campo en blanco.", "anoneditwarning": "Advertencia: no ha iniciado sesión. Su dirección IP se hará pública si hace cualquier edición en estas condiciones. Si [$1 inicia sesión] o [$2 crea una cuenta], sus ediciones se atribuirán a su nombre de usuario, además de otros beneficios.", "newarticletext": "Ha seguido usted un enlace a una página que aún no existe.\nPara crear esta página, escriba en el campo a continuación. Para más información, consulte la [$1 página de ayuda].\nSi ha llegado aquí por error, vuelva a la página anterior.", "noarticletext": "En este momento no hay texto en esta página.\nPuede [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta página].", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 94f3a21544..d1989acaca 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -1609,8 +1609,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vigilando]", - "rc_categories": "Limitar a categorías (sep.: |):", - "rc_categories_any": "Cualquiera de las elegidas", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} después del cambio", "newsectionsummary": "Sección nueva: /* $1 */", "rc-enhanced-expand": "Mostrar detalles", @@ -3866,7 +3864,7 @@ "feedback-thanks-title": "¡Muchas gracias!", "feedback-useragent": "Agente de usuario:", "searchsuggest-search": "Buscar en {{SITENAME}}", - "searchsuggest-containing": "que contiene...", + "searchsuggest-containing": "que contenga…", "api-error-badtoken": "Error interno: Símbolo incorrecto.", "api-error-emptypage": "No se pueden crear páginas nuevas que estén vacías.", "api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.", diff --git a/languages/i18n/et.json b/languages/i18n/et.json index 3030d0a37c..152bfc4c6e 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -1469,8 +1469,6 @@ "newpageletter": "U", "boteditletter": "R", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|jälgiv kasutaja|jälgivat kasutajat}}]", - "rc_categories": "Ainult neist kategooriatest (eraldajaks \"|\"):", - "rc_categories_any": "Mõnes valitutest", "rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} pärast muudatust", "newsectionsummary": "/* $1 */ uus alaosa", "rc-enhanced-expand": "Näita üksikasju", diff --git a/languages/i18n/eu.json b/languages/i18n/eu.json index 8bb471cefb..3100c46847 100644 --- a/languages/i18n/eu.json +++ b/languages/i18n/eu.json @@ -1470,8 +1470,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|lankide|lankide}} jarraitzen]", - "rc_categories": "Kategorietara mugatu (\"|\" karaktereaz banandu):", - "rc_categories_any": "Aukeratutako edozein", "rc-change-size-new": "{{PLURAL:$1|Byte 1|$1 byte}} aldaketaren ostean", "newsectionsummary": "/* $1 */ atal berria", "rc-enhanced-expand": "Erakutsi xehetasunak", diff --git a/languages/i18n/ext.json b/languages/i18n/ext.json index 41cf60fc3a..0b1ecfa123 100644 --- a/languages/i18n/ext.json +++ b/languages/i18n/ext.json @@ -743,8 +743,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuáriu está|usuárius están}} vehilandu]", - "rc_categories": "Arrayal a categorias (separás pol \"|\")", - "rc_categories_any": "Cualisquiá", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués el chambu", "newsectionsummary": "/* $1 */ seción nueva", "rc-enhanced-expand": "muestral detallis (es mestel JavaScript)", diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json index 9a699398b2..9c1f343392 100644 --- a/languages/i18n/fa.json +++ b/languages/i18n/fa.json @@ -1507,8 +1507,6 @@ "newpageletter": "نو", "boteditletter": "ر", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]", - "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید):", - "rc_categories_any": "هر کدام از منتخب‌ها", "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} پس از تغییر", "newsectionsummary": "/* $1 */ بخش جدید", "rc-enhanced-expand": "نمایش جزئیات", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index ab94885b49..71c593e02c 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -92,6 +92,7 @@ "tog-watchlisthideminor": "Piilota pienet muokkaukset tarkkailulistalta", "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta", "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)", + "tog-watchlistunwatchlinks": "Lisää suorat tarkkailemattomat/tarkkaillut linkit tarkkailulistan merkintöihin (JavaScriptiä edellytetään nappuloiden toiminnallisuuteen)", "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta", "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta", "tog-watchlisthidecategorization": "Piilota sivujen luokitusmuutokset", @@ -747,6 +748,7 @@ "postedit-confirmation-created": "Sivu on nyt luotu.", "postedit-confirmation-restored": "Sivu on nyt palautettu (aiempaan versioonsa).", "postedit-confirmation-saved": "Muokkauksesi on tallennettu.", + "postedit-confirmation-published": "Muokkauksesi julkaistiin.", "edit-already-exists": "Uuden sivun luominen ei onnistunut.\nSe on jo olemassa.", "defaultmessagetext": "Viestin oletusteksti", "content-failed-to-parse": "Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3", @@ -1478,8 +1480,6 @@ "newpageletter": "U", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|tarkkaileva käyttäjä|tarkkailevaa käyttäjää}}]", - "rc_categories": "Rajoita luokkiin (erota luokat merkillä ”|”)", - "rc_categories_any": "Mikä tahansa valituista", "rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavua}} muutosten jälkeen", "newsectionsummary": "/* $1 */ uusi osio", "rc-enhanced-expand": "Näytä yksityiskohdat", @@ -1501,6 +1501,7 @@ "uploadbtn": "Tallenna tiedosto", "reuploaddesc": "Peruuta tallennus ja palaa tallennuslomakkeelle.", "upload-tryagain": "Lähetä muutettu tiedostokuvaus", + "upload-tryagain-nostash": "Lähetä uudelleenlähetetty tiedosto ja muokattu kuvaus", "uploadnologin": "Et ole kirjautunut sisään", "uploadnologintext": "Sinun pitää $1, jotta voit tallentaa tiedostoja.", "upload_directory_missing": "Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.", @@ -1560,6 +1561,7 @@ "file-deleted-duplicate-notitle": "Tämän tiedoston kanssa samanlainen tiedosto on aikaisemmin poistettu ja tiedoston nimi on häivytetty.\nSinun on syytä pyytää jotakuta häivytettyjen tietojen näkemiseen oikeutettua käyttäjää katsomaan tiedoston tiedot asian arvioimiseksi ennen kuin jatkat tiedoston lataamista tietokantaan.", "uploadwarning": "Tallennusvaroitus", "uploadwarning-text": "Muuta alla olevaa tiedostokuvausta ja yritä uudelleen.", + "uploadwarning-text-nostash": "Uudelleenlähetä tiedosto, muokkaa kuvausta alla ja yritä uudelleen.", "savefile": "Tallenna", "uploaddisabled": "Tiedostojen tallennus ei ole käytössä.", "copyuploaddisabled": "Tallennus URL:n kautta on poistettu käytöstä.", @@ -1567,6 +1569,7 @@ "php-uploaddisabledtext": "PHP:n tiedostojen lähetys ei ole käytössä. Tarkista asetukset kohdasta file_uploads.", "uploadscripted": "Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.", "upload-scripted-pi-callback": "Ei voida tallentaa tiedostoa, joka sisältää XML-tyylimääritteen käsittelyohjeen.", + "upload-scripted-dtd": "Ei voida lähettää SVG-tiedostoja, jotka sisältävät ei-standardin DTD-selityksen.", "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.", "uploaded-hostile-svg": "Tallennetun SVG-tiedoston tyylielementissä löytyi turvaton CSS.", "uploaded-event-handler-on-svg": "Setting event-handler attributes $1=\"$2\" is not allowed in SVG files.", @@ -1682,6 +1685,7 @@ "uploadstash-not-logged-in": "Käyttäjää ei ole kirjautunut sisään, tiedostojen on kuuluttava käyttäjille.", "uploadstash-no-such-key": "Ei tälläistä avainta ($1), ei voi poistaa.", "uploadstash-no-extension": "Laajennus on tyhjä.", + "uploadstash-zero-length": "Tiedoston pituus on nolla.", "invalid-chunk-offset": "Kelpaamaton siirtymä lohkoissa", "img-auth-accessdenied": "Pääsy estetty", "img-auth-nopathinfo": "PATH_INFO puuttuu.\nPalvelintasi ei ole asetettu välittämään tätä tietoa.\nSe saattaa olla CGI-pohjainen eikä voi tukea img_authia.\nLisätietoja löytyy sivulta https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1826,13 +1830,15 @@ "pageswithprop-legend": "Sivut sivun ominaisuuden mukaan", "pageswithprop-text": "Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.", "pageswithprop-prop": "Ominaisuuden nimi", + "pageswithprop-reverse": "Lajittele päinvastaisessa järjestyksessä", + "pageswithprop-sortbyvalue": "Lajittele ominaisuuden arvon mukaan", "pageswithprop-submit": "Siirry", "pageswithprop-prophidden-long": "Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)", "pageswithprop-prophidden-binary": "ominaisuuden binääriarvo on piilotettu ($1)", "doubleredirects": "Kaksinkertaiset ohjaukset", "doubleredirectstext": "Tällä sivulla on lueteltu ne sivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteeseen, joka on yleensä ”oikea” kohdesivu, johon ensimmäisen ohjauksen pitäisi johtaa.\nYliviivatut kohteet on korjattu.", "double-redirect-fixed-move": "[[$1]] on siirretty.\nSe on automaattisesti päivitetty ja se ohjaa nyt sivulle [[$2]].", - "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]].", + "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]] huoltotyössä", "double-redirect-fixer": "Ohjausten korjaaja", "brokenredirects": "Virheelliset ohjaukset", "brokenredirectstext": "Seuraavat ohjaukset osoittavat sivuihin, joita ei ole olemassa.", @@ -2812,6 +2818,7 @@ "pageinfo-category-subcats": "Alaluokkien määrä", "pageinfo-category-files": "Tiedostojen määrä", "pageinfo-user-id": "Käyttäjän tunnistenumero", + "pageinfo-file-hash": "Hash-arvo", "markaspatrolleddiff": "Merkitse tarkastetuksi", "markaspatrolledtext": "Merkitse muutos tarkastetuksi", "markaspatrolledtext-file": "Merkitse tämä tiedoston versio tarkastetuksi", @@ -3357,6 +3364,7 @@ "watchlistedit-clear-titles": "Sivujen nimet:", "watchlistedit-clear-submit": "Tyhjennä tarkkailulista (pysyvästi ja peruuttamattomasti!)", "watchlistedit-clear-done": "Tarkkailulistasi on tyhjennetty.", + "watchlistedit-clear-jobqueue": "Tarkkailulistaasi ollaan tyhjentämässä. Tämä voi kestää jonkin aikaa!", "watchlistedit-clear-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} on poistettu:", "watchlistedit-too-many": "Luettelossa on liikaa sivuja näytettäväksi tässä.", "watchlisttools-clear": "Tyhjennä tarkkailulista", @@ -3973,7 +3981,7 @@ "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1", "restrictionsfield-label": "Sallitut IP-alueet:", "restrictionsfield-help": "Yksi IP-osoite tai CIDR-alue per rivi. Ottaaksesi kaiken käyttöön, käytä:
0.0.0.0/0\n::/0
", - "edit-error-short": "$1", + "edit-error-short": "Virhe: $1", "edit-error-long": "Virheet:\n\n$1", "revid": "versio $1", "pageid": "sivun tunnistenumero $1", diff --git a/languages/i18n/fo.json b/languages/i18n/fo.json index 535d81f96d..d1142f8607 100644 --- a/languages/i18n/fo.json +++ b/languages/i18n/fo.json @@ -1094,8 +1094,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 ansar eftir {{PLURAL:$1|brúkara|brúkarum}}]", - "rc_categories": "Avmarkað til síður frá bólkunum (skil sundur við \"|\")", - "rc_categories_any": "Nakar", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} eftir broyting", "newsectionsummary": "/* $1 */ nýtt innlegg", "rc-enhanced-expand": "Vís smálutir", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 550bce9093..4168900689 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -1619,8 +1619,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]", - "rc_categories": "Limiter aux catégories (séparées par « | ») :", - "rc_categories_any": "Une des sélectionnées", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement", "newsectionsummary": "/* $1 */ nouvelle section", @@ -2780,6 +2778,7 @@ "thumbnail_dest_directory": "Impossible de créer le répertoire de destination", "thumbnail_image-type": "Type d’image non pris en charge", "thumbnail_gd-library": "Configuration incomplète de la bibliothèque GD : fonction $1 introuvable", + "thumbnail_image-size-zero": "La taille du fichier image semble être de zéro.", "thumbnail_image-missing": "Le fichier suivant est introuvable : $1", "thumbnail_image-failure-limit": "Il y a eu récemment trop de tentatives échouées ($1 ou plus) pour restituer cette vignette. Veuillez réessayer ultérieurement.", "import": "Importer des pages", diff --git a/languages/i18n/frp.json b/languages/i18n/frp.json index 048526e90a..bebff59b44 100644 --- a/languages/i18n/frp.json +++ b/languages/i18n/frp.json @@ -1253,8 +1253,6 @@ "newpageletter": "N", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisator qu’est|utilisators que sont}} aprés siuvre]", - "rc_categories": "Limitar a les catègories (sèparâyes per « | ») :", - "rc_categories_any": "Yona de les chouèsies", "rc-change-size-new": "$1 octèt{{PLURAL:$1||s}} aprés changement", "newsectionsummary": "/* $1 */ novèla sèccion", "rc-enhanced-expand": "Montrar los dètalys", diff --git a/languages/i18n/frr.json b/languages/i18n/frr.json index 3c5c93a5a7..396ff16810 100644 --- a/languages/i18n/frr.json +++ b/languages/i18n/frr.json @@ -1280,8 +1280,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|brüker|brükern}}, diar tuluke]", - "rc_categories": "Bluas sidjen ütj jo kategoriin (apdiald mä „|“):", - "rc_categories_any": "Arke ütjsoocht", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter't feranrin", "newsectionsummary": "Nei kirew /* $1 */", "rc-enhanced-expand": "Enkelthaiden wise", diff --git a/languages/i18n/fur.json b/languages/i18n/fur.json index 3ed0d0d92b..c71f994032 100644 --- a/languages/i18n/fur.json +++ b/languages/i18n/fur.json @@ -707,8 +707,6 @@ "newpageletter": "G", "boteditletter": "b", "number_of_watching_users_pageview": "[tignude di voli di {{PLURAL:$1|un utent|$1 utents}}]", - "rc_categories": "Limite aes categoriis (dividilis cun \"|\")", - "rc_categories_any": "Cualsisei", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la modifiche", "newsectionsummary": "/* $1 */ gnove sezion", "rc-enhanced-expand": "Cjale i detais (al covente JavaScript)", diff --git a/languages/i18n/fy.json b/languages/i18n/fy.json index 25d39645e5..3a25100d7b 100644 --- a/languages/i18n/fy.json +++ b/languages/i18n/fy.json @@ -958,8 +958,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 folgjende {{PLURAL:$1|meidogger|meidoggers}}]", - "rc_categories": "Alline kategoryen (skiede mei in \"|\")", - "rc_categories_any": "Elk", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nei de wiziging", "newsectionsummary": "/* $1 */ nije seksje", diff --git a/languages/i18n/ga.json b/languages/i18n/ga.json index df5c88562a..40b291953a 100644 --- a/languages/i18n/ga.json +++ b/languages/i18n/ga.json @@ -790,7 +790,6 @@ "newpageletter": "N", "boteditletter": "r", "number_of_watching_users_pageview": "[{{PLURAL:$1|úsáideoir amháin|$1 úsáideoirí}} ag faire]", - "rc_categories_any": "Aon chatagóir", "rc-change-size-new": "$1 {{PLURAL:$1|bheart|beart}} tar éis an athraithe", "newsectionsummary": "/* $1 */ mír nua", "rc-enhanced-expand": "Taispeáin mionsonraithe", diff --git a/languages/i18n/gan-hans.json b/languages/i18n/gan-hans.json index 4e01b8ea55..0764f301b6 100644 --- a/languages/i18n/gan-hans.json +++ b/languages/i18n/gan-hans.json @@ -647,8 +647,6 @@ "newpageletter": "新", "boteditletter": "机", "number_of_watching_users_pageview": "[$1只监视用户]", - "rc_categories": "分类界定(用\"|\"隔开)", - "rc_categories_any": "任何", "newsectionsummary": "/* $1 */ 新段落", "rc-enhanced-expand": "显到细节(需要 JavaScript)", "rc-enhanced-hide": "弆到细节", diff --git a/languages/i18n/gan-hant.json b/languages/i18n/gan-hant.json index 03c6063e71..a683acb8b4 100644 --- a/languages/i18n/gan-hant.json +++ b/languages/i18n/gan-hant.json @@ -639,8 +639,6 @@ "newpageletter": "新", "boteditletter": "機", "number_of_watching_users_pageview": "[$1隻監視用戶]", - "rc_categories": "分類界定(用\"|\"隔開)", - "rc_categories_any": "任何", "newsectionsummary": "/* $1 */ 新段落", "rc-enhanced-expand": "顯到細節(需要 JavaScript)", "rc-enhanced-hide": "弆到細節", diff --git a/languages/i18n/gd.json b/languages/i18n/gd.json index 600f0e9ca0..b30a5bdd12 100644 --- a/languages/i18n/gd.json +++ b/languages/i18n/gd.json @@ -1221,8 +1221,6 @@ "boteditletter": "bt", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]", - "rc_categories": "Dìreach sna roinnean-seòrsa (sgaraich le “|”):", - "rc_categories_any": "Gin dhe na chaidh a thaghadh", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh", "newsectionsummary": "Earrann ùr /* $1 */", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index 5be70565b2..fb44ca6a0d 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -1483,8 +1483,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuario|usuarios}} vixiando]", - "rc_categories": "Limitar ás categorías (separadas por \"|\"):", - "rc_categories_any": "Calquera das elixidas", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} despois da modificación", "newsectionsummary": "Nova sección: /* $1 */", diff --git a/languages/i18n/gom-deva.json b/languages/i18n/gom-deva.json index e8b07f68ca..beecd23003 100644 --- a/languages/i18n/gom-deva.json +++ b/languages/i18n/gom-deva.json @@ -503,7 +503,6 @@ "minoreditletter": "द", "newpageletter": "न", "boteditletter": "र", - "rc_categories_any": "वेंचिल्ल्या मदलें खंयचेय", "rc-change-size-new": "$1 {{बहुवचन:$1|byte|bytes}}बदल केल्या उपरांत", "rc-enhanced-expand": "म्हायती दाखय", "rc-enhanced-hide": "म्हायती लिपय", diff --git a/languages/i18n/gom-latn.json b/languages/i18n/gom-latn.json index 493e03387f..976847b001 100644 --- a/languages/i18n/gom-latn.json +++ b/languages/i18n/gom-latn.json @@ -511,7 +511,6 @@ "minoreditletter": "d", "newpageletter": "N", "boteditletter": "r", - "rc_categories_any": "Vinchlele modlem khuimchem-i", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byti}} bodol kel'lea uprant", "rc-enhanced-expand": "Bariksann dakhoi", "rc-enhanced-hide": "Bariksann lipoi", diff --git a/languages/i18n/grc.json b/languages/i18n/grc.json index 492adc82e0..c9d4291fd5 100644 --- a/languages/i18n/grc.json +++ b/languages/i18n/grc.json @@ -859,8 +859,6 @@ "newpageletter": "Ν", "boteditletter": "αὐτ", "number_of_watching_users_pageview": "[$1 ἐφορᾶν {{PLURAL:$1|χρώμενον|χρωμένους}}]", - "rc_categories": "Ὅριον κατηγοριῶν (σήμανσις διαχωρίσεως: \"|\")", - "rc_categories_any": "Οἵα δήποτε", "rc-change-size-new": "$1 {{PLURAL:$1|δυφιολέξις|δυφιολέξεις}} μεθύστερον μεταβολής", "newsectionsummary": "/* $1 */ νέον τμῆμα", "rc-enhanced-expand": "Δεικνύναι λεπτομέρειας (ἀπαιτεῖ JavaScript)", diff --git a/languages/i18n/gsw.json b/languages/i18n/gsw.json index 6814844063..f16e09edd4 100644 --- a/languages/i18n/gsw.json +++ b/languages/i18n/gsw.json @@ -1217,8 +1217,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]", - "rc_categories": "Nume Syten us bestimmte Kategorie (mit «|» trenne):", - "rc_categories_any": "Beliebigi vo den usgwählte", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig", "newsectionsummary": "Neje Abschnitt /* $1 */", "rc-enhanced-expand": "Detail aazeige", diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json index c0424f67ff..a75b84c752 100644 --- a/languages/i18n/gu.json +++ b/languages/i18n/gu.json @@ -1142,8 +1142,6 @@ "newpageletter": "નવું", "boteditletter": "બૉટ", "number_of_watching_users_pageview": "[$1 જોઇરહેલ {{PLURAL:$1|સભ્ય|સભ્યો}}]", - "rc_categories": "શ્રેણીઓ સુધી મર્યાદિત (\"|\" થી જુદા પાડો):", - "rc_categories_any": "કોઇ પણ પસંદ કરેલ", "rc-change-size-new": "બદલાયા પછી $1 {{PLURAL:$1|બાઈટ|બાઇટ્સ}}", "newsectionsummary": "/* $1 */ નવો વિભાગ", "rc-enhanced-expand": "વિગતો બતાવો", diff --git a/languages/i18n/gv.json b/languages/i18n/gv.json index 0c4d19e156..c80216e23b 100644 --- a/languages/i18n/gv.json +++ b/languages/i18n/gv.json @@ -562,7 +562,6 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "r", - "rc_categories_any": "Ronney erbee", "rc-enhanced-expand": "Taishbyn sonreeaghtyn (ta feme er JavaScript)", "rc-enhanced-hide": "Follee sonreeaghtyn", "recentchangeslinked": "Caghlaaghyn conastagh", diff --git a/languages/i18n/hak.json b/languages/i18n/hak.json index 126d1e240a..c4819f74e8 100644 --- a/languages/i18n/hak.json +++ b/languages/i18n/hak.json @@ -791,8 +791,6 @@ "newpageletter": "Sîn", "boteditletter": "kî", "number_of_watching_users_pageview": "[$1隻用戶關注]", - "rc_categories": "分類界限(以“|”分割)", - "rc_categories_any": "任意", "rc-change-size-new": "Kiên-kói heu ke $1 vi-ngièn-chû", "rc-enhanced-expand": "展示細節 (愛有JavaScript)", "rc-enhanced-hide": "隱藏細節", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 1e5187b7aa..8f7f434328 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -183,7 +183,7 @@ "mytalk": "שיחה", "anontalk": "שיחה", "navigation": "ניווט", - "and": " ו", + "and": " וגם", "faq": "שאלות ותשובות", "actions": "פעולות", "namespaces": "מרחבי שם", @@ -1479,8 +1479,6 @@ "newpageletter": "ח", "boteditletter": "ב", "number_of_watching_users_pageview": "[{{PLURAL:$1|משתמש אחד עוקב|$1 משתמשים עוקבים}} אחרי הדף]", - "rc_categories": "הגבלה לקטגוריות (מופרדות בתו \"|\"):", - "rc_categories_any": "כל אחת מהנבחרות", "rc-change-size-new": "{{PLURAL:$1|בית אחד|$1 בתים}} לאחר השינוי", "newsectionsummary": "/* $1 */ פסקה חדשה", "rc-enhanced-expand": "הצגת הפרטים", diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index fd014098d2..7e0397decf 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -1535,8 +1535,6 @@ "newpageletter": "न", "boteditletter": "बॉ", "number_of_watching_users_pageview": "[$1 ध्यान रखने वाले {{PLURAL:$1|सदस्य}}]", - "rc_categories": "श्रेणीयों तक सीमीत रखें (\"|\" से अलग करें)", - "rc_categories_any": "कोई भी चुनिन्दा", "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट}}", "newsectionsummary": "/* $1 */ नया अनुभाग", "rc-enhanced-expand": "विस्तृत जानकारी दिखाएँ", diff --git a/languages/i18n/hif-latn.json b/languages/i18n/hif-latn.json index 0c8b5709d9..c60a53469b 100644 --- a/languages/i18n/hif-latn.json +++ b/languages/i18n/hif-latn.json @@ -1420,8 +1420,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|user|users}} ke dekhta hae]", - "rc_categories": "Categories me limit (\"|\" se separate karo)", - "rc_categories_any": "Chuna gais me se koi", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} badlao ke baad", "newsectionsummary": "/* $1 */ nawaa vibhag", "rc-enhanced-expand": "Details dekhao", diff --git a/languages/i18n/hil.json b/languages/i18n/hil.json index 4a94fc3e10..48292317ec 100644 --- a/languages/i18n/hil.json +++ b/languages/i18n/hil.json @@ -969,8 +969,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 ginabantayan {{PLURAL:$1|naga-usar|mga naga-usar}}]", - "rc_categories": "Limitahan ang mga kategorya (ibulag lakip sang \"|\")", - "rc_categories_any": "Bisan ano", "rc-change-size-new": "$1 {{PLURAL:$1|byte|mga byte}} pagkatapos sang pag-ilis", "newsectionsummary": "/* $1 */ bag-o nga seksyon", "rc-enhanced-expand": "Ipakita ang mga detalye", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 5fd0fe9da6..63b9bce36c 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -1405,8 +1405,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|suradnik|suradnika|suradnika}} prati ovu stranicu]", - "rc_categories": "Ograniči na kategorije (odvoji sa \"|\")", - "rc_categories_any": "Bilo koji od odabranih", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije uređivanja", "newsectionsummary": "/* $1 */ novi odlomak", "rc-enhanced-expand": "Pokaži detalje (potreban JavaScript)", diff --git a/languages/i18n/hrx.json b/languages/i18n/hrx.json index c20b3ad67c..09ee5b6900 100644 --- a/languages/i18n/hrx.json +++ b/languages/i18n/hrx.json @@ -1096,8 +1096,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Benutzer]", - "rc_categories": "Nur Seite aus den Kategorie (getrennt mit „|“):", - "rc_categories_any": "Alle", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} noh der Ännrung", "newsectionsummary": "Neier Abschnitt /* $1 */", "rc-enhanced-expand": "Einzelheite oonzeiche", diff --git a/languages/i18n/hsb.json b/languages/i18n/hsb.json index e203fed5c8..1a19adb1dc 100644 --- a/languages/i18n/hsb.json +++ b/languages/i18n/hsb.json @@ -1205,8 +1205,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|wobkedźbowacy wužiwar|wobkedźbowacaj wužiwarjej|wobkedźbowacy wužiwarjo|wobkedźbowacych wužiwarjow}}]", - "rc_categories": "Jenož kategorije (dźělene z \"|\")", - "rc_categories_any": "Někajka z wubranych", "rc-change-size": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}}", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtaj|bajty|bajtow}} po změnje", "newsectionsummary": "Nowy wotrězk: /* $1 */", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index da7d658873..174e576684 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -1491,8 +1491,6 @@ "newpageletter": "Ú", "boteditletter": "b", "number_of_watching_users_pageview": "[Jelenleg {{PLURAL:$1|egy|$1}} felhasználó figyeli]", - "rc_categories": "Szűkítés kategóriákra („|” jellel válaszd el őket):", - "rc_categories_any": "Választottak közül bármelyik", "rc-change-size-new": "$1 bájt módosítás után", "newsectionsummary": "/* $1 */ (új szakasz)", "rc-enhanced-expand": "Részletek megjelenítése", @@ -2646,6 +2644,7 @@ "thumbnail_dest_directory": "Nem hozható létre a célkönyvtár", "thumbnail_image-type": "A képformátum nem támogatott", "thumbnail_gd-library": "A GD-könyvtár nincs megfelelően beállítva: a(z) $1 függvény hiányzik", + "thumbnail_image-size-zero": "A képfájl mérete nullának tűnik.", "thumbnail_image-missing": "Úgy tűnik, hogy a fájl hiányzik: $1", "thumbnail_image-failure-limit": "Túl sok hibás bélyegkép létrehozás (több mint $1). Próbáld meg később!", "import": "Lapok importálása", diff --git a/languages/i18n/hy.json b/languages/i18n/hy.json index 3f6c0cbccc..a16a994d19 100644 --- a/languages/i18n/hy.json +++ b/languages/i18n/hy.json @@ -66,7 +66,7 @@ "tog-watchlisthidebots": "Թաքցնել բոտերի խմբագրումները հսկացանկից", "tog-watchlisthideminor": "Թաքցնել չնչին խմբագրումները հսկացանկից", "tog-watchlisthideliu": "Թաքցնել մուտք գործած մասնակիցների խմբագրումները հսկացանկից", - "tog-watchlistreloadautomatically": "Ֆիլտրի ամեն փոփոխության դեպքում ինքնաշխատ կերպով վերբեռնել հսկացանկը (անհրաժեշտ է JavaScript)", + "tog-watchlistreloadautomatically": "Զտիչի ամեն փոփոխության դեպքում ինքնաշխատ կերպով վերբեռնել հսկացանկը (անհրաժեշտ է JavaScript)", "tog-watchlisthideanons": "Թաքցնել անանուն մասնակիցների խմբագրումները հսկացանկից", "tog-watchlisthidepatrolled": "Թաքցնել պարեկված խմբագրումները հսկացանկից", "tog-watchlisthidecategorization": "Թաքցնել էջերի կատեգորիզացիան", @@ -413,7 +413,7 @@ "userlogin-resetpassword-link": "Մոռացե՞լ եք գաղտնաբառը", "userlogin-helplink2": "Մուտք գործելու օգնություն", "userlogin-loggedin": "Դուք արդեն մտել է որպես {{GENDER:$1|$1}}.\nՕգտագործեք ստորև բերված ձևը մուտք գործելու համար այլ հաշից", - "userlogin-reauth": "Դուք պետք է կրկին համակարգ մուտք գործեք հաստատելու որ դուք դուք եք {{GENDER:$1|$1}}.", + "userlogin-reauth": "Դուք պետք է կրկին մուտք գործեք համակարգ` հաստատելու, որ դուք դուք եք {{GENDER:$1|$1}}։", "userlogin-createanother": "Ստեղծել այլ հաշիվ", "createacct-emailrequired": "Էլ–փոստի հասցե", "createacct-emailoptional": "Էլ–փոստի հասցե (ոչ պարտադիր)", @@ -965,20 +965,58 @@ "recentchanges-submit": "Ցույց տալ", "rcfilters-tag-remove": "Հեռացնել '$1'", "rcfilters-legend-heading": "Հապավումների ցանկ.", + "rcfilters-other-review-tools": "Վերանայման այլ գործիքներ", + "rcfilters-group-results-by-page": "Արդյունքները խմբավորել էջերով", + "rcfilters-activefilters": "Ակտիվ զտիչներ", + "rcfilters-advancedfilters": "Ընդլայնված ֆիլտրեր", + "rcfilters-limit-title": "Ցուցադրվող արդյունքներ", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|փոփոխություն|փոփոխություններ}}, $2", + "rcfilters-date-popup-title": "Որոնման ժամանակահատված", "rcfilters-days-title": "Վերջին օրերին", "rcfilters-hours-title": "Վերջին ժամերը", + "rcfilters-days-show-days": "$1 {{PLURAL:$1|օր|օրեր}}", + "rcfilters-quickfilters": "Պահպանված զտիչներ", + "rcfilters-quickfilters-placeholder-title": "Պահպանված ֆիլտրեր դեռ չկան", + "rcfilters-quickfilters-placeholder-description": "Ձեր զտիչի կայանքները պահպանելու և հետագայում օգտագործելու համար՝ սեղմեք ստորև գտնվող «Ակտիվ ֆիլտր» դաշտի էջանշի պատկերակին։", + "rcfilters-savedqueries-defaultlabel": "Պահպանված ֆիլտրեր", "rcfilters-savedqueries-rename": "Վերանվանել", "rcfilters-savedqueries-remove": "Ջնջել", "rcfilters-savedqueries-new-name-label": "Անուն", "rcfilters-savedqueries-apply-label": "Ստեղծել արագ հղում", "rcfilters-savedqueries-cancel-label": "Չեղարկել", + "rcfilters-show-new-changes": "Դիտել ամենանոր փոփոխությունները", + "rcfilters-search-placeholder": "Զտիչի փոփոխություններ (զտիչի անվան համար օգտագործեք մենյուն կամ որոնումը)", "rcfilters-filterlist-title": "Զտիչներ", "rcfilters-filterlist-whatsthis": "Ինչպե՞ս է սա աշխատում:", + "rcfilters-highlightbutton-title": "Ընդգծել արդյունքները", "rcfilters-highlightmenu-title": "Ընտրեք գույնը", + "rcfilters-filterlist-noresults": "Զտիչներ չեն գտնվել", + "rcfilters-filtergroup-authorship": "Ներդրումների հեղինակ", "rcfilters-filter-editsbyself-label": "Ձեր խմբագրումներ", + "rcfilters-filter-editsbyother-label": "Այլոց փոփոխությունները", + "rcfilters-filtergroup-userExpLevel": "Մասնակիցների գրանցում և փորձ", + "rcfilters-filter-user-experience-level-registered-label": "Գրանցված", + "rcfilters-filter-user-experience-level-unregistered-label": "Չգրանցված", "rcfilters-filter-user-experience-level-newcomer-label": "Նորեկներ", "rcfilters-filter-user-experience-level-newcomer-description": "Գրանցված խմբագիրներ՝ ոչ պակաս քան 10 խմբագրումով և 4 օր ակտիվությամբ:", - "rcfilters-filtergroup-lastRevision": "Ընթացիկ տարբերակ", + "rcfilters-filter-user-experience-level-learner-label": "Սովորողներ", + "rcfilters-filter-bots-label": "Բոտ", + "rcfilters-filter-humans-label": "Մարդ (ոչ բոտ)", + "rcfilters-filtergroup-significance": "Նշանակալիություն", + "rcfilters-filter-minor-label": "Չնչին խմբագրումներ", + "rcfilters-filter-major-label": "Սովորական խմբագրումներ", + "rcfilters-filtergroup-watchlist": "Հսկացանկի էջեր", + "rcfilters-filter-watchlist-watched-label": "Հսկացանկում", + "rcfilters-filter-watchlist-watchednew-label": "Հսկացանկի նոր փոփոխություններ", + "rcfilters-filter-watchlist-notwatched-label": "Հսկացանկից դուրս", + "rcfilters-filtergroup-changetype": "Փոփոխության տեսակ", + "rcfilters-filter-pageedits-label": "Էջի խմբագրումներ", + "rcfilters-filter-newpages-label": "Նոր էջեր", + "rcfilters-filter-logactions-label": "Մուտ գործած գործողություններ", + "rcfilters-filtergroup-lastRevision": "Ամենավերջին տարբերակ", + "rcfilters-filter-previousrevision-label": "Ոչ վերջին տարբերակ", + "rcfilters-view-tags": "Պիտակված խմբագրումներ", + "rcfilters-liveupdates-button": "Կենդանի թարմացումներ", "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։", "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2", "rcshowhideminor": "$1 չնչին խմբագրումները", @@ -1011,8 +1049,6 @@ "newpageletter": "Ն", "boteditletter": "բ", "number_of_watching_users_pageview": "[$1 հսկող {{PLURAL:$1|մասնակից|մասնակիցներին}}]", - "rc_categories": "Սահմանափակել կատեգորիաներով (բաժանեք «|» նշանով)", - "rc_categories_any": "Բոլոր", "rc-change-size-new": "$1 {{PLURAL:$1|բայթ|բայթ}} փոփոխությունից հետո", "newsectionsummary": "/* $1 */ Նոր բաժին", "rc-enhanced-expand": "Ցուցադրել մանրամասներ (պահանջում է ՋավաՍկրիպտ)", @@ -1856,7 +1892,7 @@ "show-big-image-size": "$1 × $2 պիքսել", "newimages": "Նոր նիշքերի սրահ", "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։", - "newimages-legend": "Ֆիլտր", + "newimages-legend": "Զտիչ", "newimages-showbots": "Ցույց տալ բոտերի բեռնումները", "noimages": "Տեսնելու բան չկա։", "ilsubmit": "Որոնել", @@ -2001,11 +2037,13 @@ "tag-filter": "[[Special:Tags|Պիտակների]] զտիչ՝", "tag-filter-submit": "Ֆիլտրել", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Պիտակ}}]]: $2)", + "tags-title": "Պիտակներ", "tags-source-header": "Աղբյուր", "tags-actions-header": "Գործողություններ", "tags-edit": "խմբագրել", "tags-delete": "ջնջել", "tags-deactivate": "Ապաակտիվացնել", + "tags-hitcount": "$1 {{PLURAL:$1|փոփոխություն|փոփոխություններ}}", "tags-create-reason": "Պատճառ՝", "tags-create-submit": "Ստեղծել", "tags-delete-reason": "Պատճառ՝", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index 9053071d28..7703ba28ab 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -1456,8 +1456,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[observate per $1 {{PLURAL:$1|usator|usatores}}]", - "rc_categories": "Limitar al categorias (separar con \"|\"):", - "rc_categories_any": "Qualcunque categoria seligite", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} post cambio", "newsectionsummary": "/* $1 */ nove section", "rc-enhanced-expand": "Revelar detalios", diff --git a/languages/i18n/id.json b/languages/i18n/id.json index 1d3b47ced1..62e0e978da 100644 --- a/languages/i18n/id.json +++ b/languages/i18n/id.json @@ -1507,8 +1507,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|pemantau|pemantau}}]", - "rc_categories": "Batasi sampai kategori (dipisah dengan \"|\"):", - "rc_categories_any": "Setiap yang terpilih", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bita}} setelah perubahan", "newsectionsummary": "/* $1 */ bagian baru", diff --git a/languages/i18n/ie.json b/languages/i18n/ie.json index 47489293fd..4acbcf7947 100644 --- a/languages/i18n/ie.json +++ b/languages/i18n/ie.json @@ -311,6 +311,7 @@ "userlogin-yourname-ph": "Vor nómine de usator", "createacct-another-username-ph": "Nómine del usator", "yourpassword": "Parol-clave:", + "userlogin-yourpassword": "Parol-clave", "yourpasswordagain": "Parol-clave denov:", "userlogin-signwithsecure": "Usar un secur conexion", "yourdomainname": "Tui dominia:", @@ -885,7 +886,7 @@ "whatlinkshere-hideredirs": "$1 redirectiones", "whatlinkshere-hidetrans": "$1 transclusiones", "whatlinkshere-hidelinks": "$1 catenunes", - "whatlinkshere-hideimages": "$1 referenties a picturas.", + "whatlinkshere-hideimages": "$1 pictura links", "whatlinkshere-filters": "Filtres", "blockip": "Blocar usator", "ipbreason": "Motive:", @@ -985,6 +986,7 @@ "simpleantispam-label": "Control anti-spam.\nNe plena to ci!", "pageinfo-article-id": "Págine ID", "pageinfo-toolboxlink": "Information pri li págine", + "pageinfo-contentpage-yes": "Yes", "previousdiff": "← Redaction anteriori", "nextdiff": "Proxim redaction →", "thumbsize": "Mesura de miniatura:", @@ -1061,6 +1063,8 @@ "version-software-version": "Version", "redirect-submit": "Ear", "redirect-user": "Usator ID", + "redirect-page": "Págine ID", + "redirect-file": "File-nómine", "specialpages": "Special págines", "specialpages-group-maintenance": "Raportes de conservation", "specialpages-group-other": "Altri págines special", @@ -1085,6 +1089,7 @@ "tags-description-header": "Descrition complet de signification", "tags-hitcount-header": "Changes nómiat", "tags-active-yes": "Yes", + "tags-active-no": "No", "tags-edit": "redacter", "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}", "logentry-delete-delete": "$1 ha removet li págine $3", diff --git a/languages/i18n/ig.json b/languages/i18n/ig.json index 59306c6ec8..d739147ff2 100644 --- a/languages/i18n/ig.json +++ b/languages/i18n/ig.json @@ -601,7 +601,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ọ'bànifé|ọ'bànifé}} ne lé anya]", - "rc_categories_any": "Nkówụlà", "newsectionsummary": "/* $1 */ nkeji ohúrù", "rc-enhanced-expand": "Zi ihe di ime (Í gí nwere JavaScript)", "rc-enhanced-hide": "Zonari ihe di ime", diff --git a/languages/i18n/ilo.json b/languages/i18n/ilo.json index 78e20ff454..abed7eb93a 100644 --- a/languages/i18n/ilo.json +++ b/languages/i18n/ilo.json @@ -1404,8 +1404,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]", - "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\"):", - "rc_categories_any": "Ti ania man a napili", "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panagsukat", "newsectionsummary": "/* $1 */ baro a seksion", "rc-enhanced-expand": "Ipakita dagiti salaysay", diff --git a/languages/i18n/inh.json b/languages/i18n/inh.json index f4fe4cd664..3e871a5937 100644 --- a/languages/i18n/inh.json +++ b/languages/i18n/inh.json @@ -615,7 +615,6 @@ "minoreditletter": "зI", "newpageletter": "К", "boteditletter": "б", - "rc_categories_any": "МоллагIа яр хержа йолчарна юкъера", "rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}", "rc-enhanced-expand": "Хьахьокха ма дарра", "rc-enhanced-hide": "Къайладаккха ма дарра дар", diff --git a/languages/i18n/io.json b/languages/i18n/io.json index 595ae1f1de..648c280e2e 100644 --- a/languages/i18n/io.json +++ b/languages/i18n/io.json @@ -400,6 +400,7 @@ "cannotcreateaccount-text": "Krear uzerokonto ne posibligas en ita wiki.", "yourdomainname": "Vua domano:", "password-change-forbidden": "Vu ne darfas chanjar pasovorti en ita wiki.", + "externaldberror": "Sive eventis eroro en la bazo di dati dum l'autentiko, sive vu ne permisesas aktualigar vua extera konto.", "login": "Enirar", "login-security": "Kontrolez vua identeso.", "nav-login-createaccount": "Enirar / Krear konto", @@ -419,9 +420,11 @@ "createacct-email-ph": "Prizentez vua e-postal adreso", "createacct-another-email-ph": "Prizentez vua e-postal adreso", "createaccountmail": "Uzez provizora pasovorto, ed ad adresizez ol a la korespondanta e-posto", + "createaccountmail-help": "Povas uzesar por krear konto por altra persono, sen lernar la pasovorto.", "createacct-realname": "Vera nomo (fakultativa)", "createacct-reason": "Motivo", "createacct-reason-ph": "Pro quo tu kreas nova konto", + "createacct-reason-help": "Mesajo videbla dum la 'log' por krear konto", "createacct-submit": "Kreez konto", "createacct-another-submit": "Krear konto", "createacct-continue-submit": "Durez krear konto", @@ -481,6 +484,7 @@ "login-migrated-generic": "Vua konto esas migrata, e vua uzeronomo ne plus existas che ita wikio.", "loginlanguagelabel": "Linguo: $1", "suspicious-userlogout": "Vua demando pri ekiro ('log out') refuzesis, pro ke ol semblas sendesir de retnavigilo krevita, o de 'proxy' antee konservita.", + "createacct-another-realname-tip": "Uzar vera nomo esas fakultativa.\nSe vu deziras furnisar ol, ol uzesos por atribuar la verko a lua autoro.", "pt-login": "Enirar", "pt-login-button": "Enirar", "pt-login-continue-button": "Durez enirar", @@ -499,6 +503,7 @@ "changepassword-success": "Vua chanjo di pasovorto sucesis!", "changepassword-throttled": "Vu probis enirar tro multafoye.\nVoluntez vartar $1 ante riprobar.", "botpasswords": "Robotala pasovorti", + "botpasswords-summary": "Bot passwords allow access to a user account via the API without using the account's main login credentials. The user rights available when logged in with a bot password may be restricted.\n\nIf you don't know why you might want to do this, you should probably not do it. No one should ever ask you to generate one of these and give it to them.", "botpasswords-disabled": "Ne povas uzesar \"bot\"-pasovorti", "botpasswords-no-central-id": "Por uzar \"bot\"-pasovorti, vu mustas havar centraligata konto", "botpasswords-existing": "\"bot\"-pasovorti existanta", @@ -513,13 +518,22 @@ "botpasswords-label-grants": "Uzebla grantaji:", "botpasswords-label-grants-column": "Permisita", "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.", + "botpasswords-created-title": "Kreita pasovorto por la 'bot'", + "botpasswords-created-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.", "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis", + "botpasswords-updated-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.", + "botpasswords-deleted-title": "La pasovorto por la 'bot' efacesis", + "resetpass_forbidden": "La pasovorti ne povas chanjesar", + "resetpass_forbidden-reason": "Pasovorti ne povas chanjesar: $1", + "resetpass-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.", "resetpass-submit-loggedin": "Chanjar pasovorto", "resetpass-submit-cancel": "Anular", "resetpass-wrong-oldpass": "Nevalida provizora od aktuala pasovorto.\nForsan vu ja chanjis vua pasovorto o demandis nova provizora pasovorto.", "resetpass-recycled": "Voluntez chanjar vua pasovorto ad ulo diferanta de vua aktuala pasovorto.", "resetpass-temp-emailed": "Vu eniris uzante provizora pasovorto.\nPor parkompletigar enirado, vu mustas krear nova pasovorto hike:", "resetpass-temp-password": "Provizora pasovorto:", + "resetpass-abort-generic": "La modifiko dil pasovorto interuptesis per ula 'extension'.", + "resetpass-expired": "Vua pasovorto perdis la valideso. Voluntez krear nova pasovorto por facar 'log in'.", "passwordreset": "Sendez nova pasovorto per e-posto", "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.", "passwordreset-username": "Uzantonomo:", @@ -529,6 +543,8 @@ "passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.", "passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2", "passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.", + "passwordreset-nocaller": "Ula demandero mustas furnisesar", + "passwordreset-nosuchcaller": "La demandero ne existas: $1", "passwordreset-invalidemail": "Ne-valida e-posto-adreso", "passwordreset-nodata": "Nek uzeronomo nek e-posto-adreso esis provizita", "changeemail": "Chanjar od efacar e-postal adreso", @@ -579,7 +595,8 @@ "blankarticle": "Averto: La pagino vu kreas es vakua.\nSe vu ri-selektos \"$1\", la pagino kreesos sen irga kontenajo.", "anoneditwarning": "Averto: Vu ne eniris.\nVua IP-adreso esos videbla publike se vu redaktos. Se vu [$1 enirus] od [$2 kreus konto], vua redakti atribuesos a vua uzeronomo, kune kun altra bonaji.", "anonpreviewwarning": "Vu ne eniris. Konservar chanji registragos vua IP-adreso en la redakto-historio di ta pagino.", - "missingcommenttext": "Voluntez, skribez komento sube.", + "missingcommenttext": "Voluntez skribar komento.", + "missingcommentheader": "Atencez: Vu ne furnisis titulo por ica komento.\nSe vu itere kliktos \"$1\", vua editado salveskos sen ula titulo.", "summary-preview": "Previdado di la rezumo:", "subject-preview": "Previdado di la temo:", "previewerrortext": "Eventis eroro kande on probis krear previdado pri vua modifikuri.", @@ -864,7 +881,6 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "r", - "rc_categories_any": "Irga selektita", "rc-change-size-new": "$1 {{PLURAL:$1|bicoko|bicoki}} pos la modifiki", "newsectionsummary": "/* $1 */ nova seciono", "rc-enhanced-expand": "Montrez detali", diff --git a/languages/i18n/is.json b/languages/i18n/is.json index f0d3cd3243..3a54234782 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -63,6 +63,7 @@ "tog-watchlisthideminor": "Ekki sýna minniháttar breytingar á vaktlistanum", "tog-watchlisthideliu": "Ekki sýna breytingar innskráðra notenda á vaktlistanum", "tog-watchlistreloadautomatically": "Endurhlaða vaktlista sjálfkrafa þegar síu er breytt (krefst JavaScript)", + "tog-watchlistunwatchlinks": "Bæta við beinum vakta/ekki vakta tenglum við færslur á vöktunarlista (krefst JavaScript til að víxla af/á)", "tog-watchlisthideanons": "Ekki sýna breytingar óþekktra notenda á vaktlistanum", "tog-watchlisthidepatrolled": "Fela yfirfarnar breytingar í vaktlistanum", "tog-watchlisthidecategorization": "Fela flokkun á síðum", @@ -161,6 +162,7 @@ "noindex-category": "Óraðaðar skrár", "broken-file-category": "Síður með brotna skráartengla", "categoryviewer-pagedlinks": "($1) ($2)", + "category-header-numerals": "$1–$2", "about": "Um", "article": "Efnissíða", "newwindow": "(opnast í nýjum glugga)", @@ -182,12 +184,13 @@ "tagline": "Úr {{SITENAME}}", "help": "Hjálp", "search": "Leit", + "search-ignored-headings": " #
\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #
", "searchbutton": "Leita", "go": "Áfram", "searcharticle": "Áfram", - "history": "Breytingaskrá", + "history": "Breytingaskrá síðu", "history_short": "Breytingaskrá", - "history_small": "skrá", + "history_small": "breytingaskrá", "updatedmarker": "uppfært frá síðustu heimsókn minni", "printableversion": "Prentvæn útgáfa", "permalink": "Varanlegur tengill", @@ -329,6 +332,7 @@ "missingarticle-rev": "(breyting#: $1)", "missingarticle-diff": "(Munur: $1, $2)", "readonly_lag": "Gagnagrunninum hefur verið læst sjálfkrafa á meðan undirvefþjónarnir reyna að hafa í við aðalvefþjóninn", + "nonwrite-api-promise-error": "HTTP-hausinn 'Promise-Non-Write-API-Action' var sendur en beiðnin var til API-skrifeiningar.", "internalerror": "Kerfisvilla", "internalerror_info": "Innri villa: $1", "internalerror-fatal-exception": "Banvæn undantekning af gerðinni \"$1\"", @@ -350,7 +354,10 @@ "badtitletext": "Umbeðinn síðutitill er ógildur.", "title-invalid-empty": "Umbeðinn síðutitill er auður eða inniheldur aðeins heiti nafnrýmis.", "title-invalid-utf8": "Umbeðinn síðutitill inniheldur ógilda UTF-8 runu.", + "title-invalid-interwiki": "Umbeðinn síðutitill inniheldur interwiki-tengil sem ekki er hægt að nota í titlum.", + "title-invalid-talk-namespace": "Umbeðinn síðutitill vísar í spjallsíðu sem ekki getur verið til.", "title-invalid-characters": "Umbeðinn síðutitill inniheldur ógilda stafi: \"$1\".", + "title-invalid-relative": "Titillinn er með afstæða slóð. Afstæðir síðutitlar (./, ../) eru ekki gildir, því þeir verða oft ekki tiltækir í meðhöndlun í vöfrum notenda.", "title-invalid-magic-tilde": "Umbeðinn síðutitill inniheldur ógilda tildurunu (~~~).", "title-invalid-too-long": "Umbeðinn síðutitill er of langur. Hann má ekki vera lengri en $1 {{PLURAL:$1|bæti}} í UTF-8 stafatöflu.", "title-invalid-leading-colon": "Umbeðinn síðutitill inniheldur ógildan tvípunkt í byrjun.", @@ -409,6 +416,7 @@ "cannotloginnow-title": "Get ekki skráð inn núna", "cannotloginnow-text": "Innskráning er ekki möguleg þegar verið er að nota $1.", "cannotcreateaccount-title": "Ekki hægt að búa til aðganga", + "cannotcreateaccount-text": "Bein stofnun aðgangs er ekki virk á þessu wiki.", "yourdomainname": "Þitt lén:", "password-change-forbidden": "Þú getur ekki breytt lykilorðum á þessum wiki.", "externaldberror": "Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.", @@ -431,9 +439,11 @@ "createacct-email-ph": "Settu inn netfangið þitt", "createacct-another-email-ph": "Skrifaðu netfang", "createaccountmail": "Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan", + "createaccountmail-help": "Er hægt að nota til að útbúa aðgang fyrir einhvern annann án þess að sjá lykilorðið.", "createacct-realname": "Raunverulegt nafn (valfrjálst)", "createacct-reason": "Ástæða", "createacct-reason-ph": "Afhverju ertu að búa til annan aðgang", + "createacct-reason-help": "Skilaboð sem birtast í atvikaskrá við gerð notandaaðgangs", "createacct-submit": "Búa til aðganginn", "createacct-another-submit": "Stofna aðgang", "createacct-continue-submit": "Halda áfram við að búa til aðgang", @@ -451,6 +461,8 @@ "nocookiesnew": "Notandaaðgangur var búin til, en þú ert ekki skráð(ur) inn.\n{{SITENAME}} notar vefkökur til að skrá inn notendur.\nÞú hefur lokað fyrir vefkökur.\nEndilega opnaðu fyrir þær, skráðu þig svo inn með notandanafni og lykilorði.", "nocookieslogin": "{{SITENAME}} notar vefkökur til innskráningar. Vafrinn þinn er ekki að taka á móti þeim. Virkjaðu móttöku á vefkökum í vafranum þínum til að geta skráð þig inn.", "nocookiesfornew": "Notandaaðgangurinn var ekki stofnaður, því ekki var hægt að staðfesta uppruna beiðnarinnar.\nGakktu úr skugga um að vefkökur séu virkar, endurlestu þessa síðu og reyndu aftur.", + "nocookiesforlogin": "{{int:nocookieslogin}}", + "createacct-loginerror": "Það tókst að útbúa notandaaðganginn en hins vegar var ekki hægt að skrá þig sjálfkrafa inn. Farðu áfram á [[Special:UserLogin|handvirka innskráningu]].", "noname": "Þú hefur ekki tilgreint gilt notandanafn.", "loginsuccesstitle": "Innskráning tókst", "loginsuccess": "'''Þú ert nú innskráð(ur) á {{SITENAME}} sem „$1“.'''", @@ -497,7 +509,7 @@ "pt-login-button": "Skrá inn", "pt-login-continue-button": "Halda áfram við að skrá þig inn", "pt-createaccount": "Stofna aðgang", - "pt-userlogout": "Útskrá", + "pt-userlogout": "Útskráning", "php-mail-error-unknown": "Óþekkt villa í PHP mail() aðgerð.", "user-mail-no-addy": "Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.", "user-mail-no-body": "Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.", @@ -511,26 +523,37 @@ "resetpass_submit": "Skrifaðu aðgangsorðið og skráðu þig inn", "changepassword-success": "Það tókst að breyta lykilorðinu þínu!", "changepassword-throttled": "Þú hefur gert of margar tilraunir til innskráningar að undanförnu.\nBíddu í $1 áður en þú reynir aftur.", - "botpasswords": "Lykilorð róbóta", - "botpasswords-label-appid": "Nafn vélmennis:", + "botpasswords": "Lykilorð vélmenna", + "botpasswords-disabled": "Lykilorð vélmenna eru óvirk.", + "botpasswords-existing": "Fyrirliggjandi lykilorð vélmenna", + "botpasswords-createnew": "Búa til nýtt lykilorð vélmennis", + "botpasswords-editexisting": "Breyta fyrirliggjandi lykilorði vélmennis", + "botpasswords-label-appid": "Heiti vélmennis:", "botpasswords-label-create": "Búa til", "botpasswords-label-update": "Uppfæra", "botpasswords-label-cancel": "Hætta við", "botpasswords-label-delete": "Eyða", "botpasswords-label-resetpassword": "Endurstilla lykilorðið", "botpasswords-bad-appid": "Vélmennanafnið „$1“ er ógilt.", + "botpasswords-created-title": "Vélmennalykilorð var búið til", + "botpasswords-updated-title": "Vélmennalykilorð var uppfært", + "botpasswords-deleted-title": "Vélmennalykilorði var eytt", "resetpass_forbidden": "Ekki er hægt að breyta lykilorðum", "resetpass_forbidden-reason": "Ekki er hægt að breyta lykilorðum: $1", "resetpass-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.", "resetpass-submit-loggedin": "Breyta lykilorði", "resetpass-submit-cancel": "Hætta við", "resetpass-wrong-oldpass": "Vitlaust bráðabirgða- eða núverandi lykilorð.\nÞú gætir þegar verið búin/n að breyta lykilorðinu eða sótt um nýtt bráðabirgðalykilorð", + "resetpass-recycled": "Settu lykilorðið þitt til að vera eitthvað annað en lykilorðið sem þú ert núna með.", "resetpass-temp-emailed": "Þú skráðir þig inn með bráðabirgðakóða úr tölvupósti.\nTil að klára að skrá þig inn, verður þú að velja nýtt lykilorð hér:", "resetpass-temp-password": "Bráðabirgðalykilorð:", "resetpass-abort-generic": "Breytingum á lykilorðum hefur verið hætt með viðbót.", "resetpass-expired": "Lykilorðið þitt er útrunnið. Skráðu nýtt lykilorð til að skrá þig inn.", + "resetpass-expired-soft": "Lykilorðið þitt er útrunnið og þarf að endurstilla það. Veldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.", + "resetpass-validity-soft": "Lykilorðið þitt er ekki lengur gilt: $1\n\nVeldu núna nýtt lykilorð, eða smelltu á \"{{int:authprovider-resetpass-skip-label}}\" til að endurstilla það síðar.", "passwordreset": "Endurstilla lykilorð", "passwordreset-text-one": "Útfylltu þetta eyðublað til þess að endursetja lykilorðið.", + "passwordreset-text-many": "{{PLURAL:$1|Fylltu í einn af reitunum hér fyrir neðan til að fá tölvupóst með bráðabirgðalykilorði.}}", "passwordreset-disabled": "Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.", "passwordreset-emaildisabled": "Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.", "passwordreset-username": "Notandanafn:", @@ -543,11 +566,13 @@ "passwordreset-emailsentemail": "Ef þetta netfang er skráð fyrir aðganginum þínum þá hefur töluvpóstur verið sendur til að endursetja lykilorðið.", "passwordreset-emailsentusername": "Ef eitthvað netfang er skráð fyrir aðganginum þínum, þá mun verða sendur töluvpóstur til að endursetja lykilorðið.", "passwordreset-invalidemail": "Ógilt tölvupóstfang", + "passwordreset-nodata": "Hvorki notandanafn né tölvupóstfang var gefið upp", "changeemail": "Breyta eða fjarlægja netfang", "changeemail-header": "Fylltu út þetta eyðublað til að breyta netfanginu þínu. Ef þú vilt fjarlægja tengingu allra netfanga frá aðganginum þínum skildu þá netfangs reitinn eftir tóman.", "changeemail-no-info": "Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.", "changeemail-oldemail": "Núverandi netfang:", "changeemail-newemail": "Nýtt netfang:", + "changeemail-newemail-help": "Þessi reitur ætti að vera auður ef þú vilt fjarlægja tölvupóstfangið þitt. Þú munt þá ekki geta endurstillt gleymt lykilorð og munt ekki fá tilkynningu í tölvupósti ef tölvupóstfangið er fjarlægt.", "changeemail-none": "(ekkert)", "changeemail-password": "{{SITENAME}} lykilorðið þitt:", "changeemail-submit": "Breyta netfangi", @@ -597,9 +622,11 @@ "missingcommentheader": "Áminning: Þú hefur ekki gefið upp umræðuefni.\nEf þú smellir á \"$1\" aftur, verður breyting þín vistuð án þess.", "summary-preview": "Forskoða breytingarágrip:", "subject-preview": "Forskoðun viðfangsefnis:", + "previewerrortext": "Óvænt villa kom upp þegar reynt var að forskoða breytingarnar þínar.", "blockedtitle": "Notandi er bannaður", "blockedtext": "'''Notandanafn þitt eða vistfang hefur verið bannað.'''\n\nBannið var sett af $1.\nÁstæðan er eftirfarandi: ''$2''.\n\n* Bannið hófst: $8\n* Banninu lýkur: $6\n* Sá sem banna átti: $7\n\nÞú getur haft samband við $1 eða annan [[{{MediaWiki:Grouppage-sysop}}|stjórnanda]] til að ræða bannið.\nÞú getur ekki notað „Senda þessum notanda tölvupóst“ aðgerðina nema gilt netfang sé skráð í [[Special:Preferences|kjörstillingum þínum]] og að þér hafi ekki verið óheimilað það.\nNúverandi vistfang þitt er $3, og bannnúmerið er #$5.\nHafðu með allar þessar upplýsingar hér fyrir ofan í fyrirspurnum þínum.", "autoblockedtext": "Vistfang þitt hefur verið sjálfvirkt bannað því það var notað af öðrum notanda, sem var bannaður af $1.\nÁstæðan er eftirfarandi:\n\n:''$2''\n\n* Bannið hófst: $8\n* Banninu lýkur: $6\n* Sá sem banna átti: $7\n\nÞú getur haft samband við $1 eða annan [[{{MediaWiki:Grouppage-sysop}}|stjórnanda]] til að ræða bannið.\n\nAthugaðu að þú getur ekki notað „Senda þessum notanda tölvupóst“ aðgerðina nema gilt netfang sé skráð í [[Special:Preferences|kjörstillingum þínum]] og að þér hafi ekki verið óheimilað það.\n\nNúverandi vistfang þitt er $3, og bannnúmerið er #$5.\nHafðu með allar þessar upplýsingar hér fyrir ofan í fyrirspurnum þínum.", + "systemblockedtext": "Notandanafnið þitt eða IP-vistfangið hafa verið útilokuð sjálfvirkt af MediaWiki.\nUppgefin ástæða er:\n\n:$2\n\n* Upphaf útilokunar: $8\n* Útilokun rennur út: $6\n* Sá sem átti að útiloka: $7\n\nNúverandi IP-vistfang þitt er$3.\nHafðu allar þessar upplýsingar með í öllum þeim fyrirspurnum sem þú gætir gert vegna þessa.", "blockednoreason": "engin ástæða gefin", "whitelistedittext": "Þú þarft að $1 þig til að breyta síðum.", "confirmedittext": "Þú verður að staðfesta netfangið þitt áður en þú getur breytt síðum. Stilltu og staðfestu netfangið þitt í gegnum [[Special:Preferences|kjörstillingarnar]].", @@ -645,6 +672,7 @@ "yourtext": "Þinn texti", "storedversion": "Geymd útgáfa", "editingold": "'''ATH: Þú ert að breyta gamalli útgáfu þessarar síðu og munu allar breytingar sem gerðar hafa verið á henni frá þeirri útgáfu vera fjarlægðar ef þú vistar.'''", + "unicode-support-fail": "Það lítur út fyrir að vafrinn þinn styðji ekki Unicode. Það er nauðsynlegt til að geta breytt síðum, þannig að breytingarnar þínar voru ekki vistaðar.", "yourdiff": "Mismunur", "copyrightwarning": "Vinsamlegast athugaðu að öll framlög á {{SITENAME}} eru álitin leyfisbundin samkvæmt $2 (sjá $1 fyrir frekari upplýsingar). Ef þú vilt ekki að skrif þín falli undir þetta leyfi og öllum verði frjálst að breyta og endurútgefa efnið samkvæmt því skaltu ekki leggja þau fram hér.
\nÞú berð ábyrgð á framlögum þínum, þau verða að vera þín skrif eða afrit texta í almannaeigu eða sambærilegs frjáls texta.\nAFRITIÐ EKKI HÖFUNDARRÉTTARVARIN VERK Á ÞESSA SÍÐU ÁN LEYFIS", "copyrightwarning2": "Vinsamlegast athugið að aðrir notendur geta breytt eða fjarlægt öll framlög til {{SITENAME}}.\nEf þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.
\nÞú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).\nEKKI SENDA INN HÖFUNDARRÉTTARVARIÐ EFNI ÁN LEYFIS RÉTTHAFA!", @@ -680,6 +708,7 @@ "postedit-confirmation-created": "Síðan hefur verið búin til.", "postedit-confirmation-restored": "Síðan hefur verið endurheimt.", "postedit-confirmation-saved": "Breytingin þín hefur verið vistuð.", + "postedit-confirmation-published": "Breytingin þín var gefin út.", "edit-already-exists": "Gat ekki skapað nýja síðu.\nHún er nú þegar til.", "defaultmessagetext": "Sjálfgefinn texti skilaboða", "content-failed-to-parse": "Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3", @@ -690,6 +719,7 @@ "content-model-text": "hreinn texti", "content-model-javascript": "JavaScript", "content-model-css": "CSS", + "content-model-json": "JSON", "content-json-empty-object": "Tómur hlutur", "content-json-empty-array": "Tómt fylki", "duplicate-args-category": "Síður sem nota tvíteknar breytur við ítengingu sniðmáts", @@ -742,6 +772,7 @@ "history-feed-description": "Breytingaskrá fyrir þessa síðu á wiki-síðunni", "history-feed-item-nocomment": "$1 á $2", "history-feed-empty": "Síðan sem þú leitaðir að er ekki til.\nMöglegt er að henni hafi verið eytt út af þessari wiki síðu, eða endurnefnd.\nPrófaðu [[Special:Search|að leita á þessari wiki síðu]] að svipuðum síðum.", + "history-edit-tags": "Breyta merkjum á völdum breytingaútgáfum", "rev-deleted-comment": "(breytingarágrip fjarlægt)", "rev-deleted-user": "(notandanafn fjarlægt)", "rev-deleted-event": "(smáatriði atriðs fjarlægt)", @@ -813,7 +844,7 @@ "mergehistory-header": "Þessi síða gerir þér kleift að sameina breytingaskrá tveggja síðna.\nSjáðu til þess að þessi breyting sameini breytingaskrárnar samfellt.", "mergehistory-box": "Sameina breytingaskrár tveggja síðna:", "mergehistory-from": "Upprunaleg síða:", - "mergehistory-into": "Áætlunarsíða:", + "mergehistory-into": "Marksíða:", "mergehistory-list": "Breytingaskrár sem hægt er að sameina", "mergehistory-merge": "Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].\nNotaðu valreitadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.\nAthugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.", "mergehistory-go": "Sýna breytingar sem hægt er að sameina", @@ -823,6 +854,8 @@ "mergehistory-fail": "Gat ekki sameinað breytingaskrár. Athugaðu vel síðuna og tímabreyturnar.", "mergehistory-fail-bad-timestamp": "Tímamerkið er ógilt.", "mergehistory-fail-invalid-source": "Frumsíðan er ógild.", + "mergehistory-fail-invalid-dest": "Marksíða er ógild.", + "mergehistory-fail-self-merge": "Upprunasíðan og marksíðan eru sú sama.", "mergehistory-no-source": "Upprunasíðan $1 er ekki til.", "mergehistory-no-destination": "Marksíðan $1 er ekki til.", "mergehistory-invalid-source": "Upprunasíðan verður að hafa gildan titil.", @@ -831,6 +864,7 @@ "mergehistory-comment": "Sameinaði [[:$1]] inn í [[:$2]]: $3", "mergehistory-same-destination": "Upprunasíðan og marksíðan mega ekki vera sú sama", "mergehistory-reason": "Ástæða:", + "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6", "mergelog": "Sameiningar skrá", "revertmerge": "Taka aftur sameiningu", "mergelogpagetext": "Þetta er skrá yfir síðustu sameiningar einnar síðu við aðra.", @@ -846,6 +880,8 @@ "diff-multi-sameuser": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá sama notandanum)", "diff-multi-otherusers": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá $2 {{PLURAL:$2|notanda|notendum}})", "diff-multi-manyusers": "($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)", + "diff-paragraph-moved-tonew": "Málsgrein var færð. Smelltu til að hoppa á nýju staðsetninguna.", + "diff-paragraph-moved-toold": "Málsgrein var færð. Smelltu til að hoppa á gömlu staðsetninguna.", "difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].", "searchresults": "Leitarniðurstöður", "searchresults-title": "Leitarniðurstöður fyrir „$1“", @@ -959,6 +995,7 @@ "timezoneregion-pacific": "Kyrrahaf", "allowemail": "Leyfa öðrum notendum að senda mér tölvupóst", "email-allow-new-users-label": "Leyfa tölvupóst frá nýskráðum notendum", + "email-blacklist-label": "Banna þessum notendum að senda mér tölvupóst:", "prefs-searchoptions": "Leit", "prefs-namespaces": "Nafnrými", "default": "sjálfgefið", @@ -1012,11 +1049,13 @@ "prefs-diffs": "Breytingar", "prefs-help-prefershttps": "Þessi stilling tekur gildi í næsta skiptið sem þú skráir þig inn.", "prefswarning-warning": "Þú hefur gert breytingar á kjörstillingum þínum sem ekki er búið að vista.\nEf þú ferð af þessari síðu án þess að smella á \"$1\" verða kjörstillingar þínar ekki uppfærðar.", + "prefs-tabs-navigation-hint": "Ábending: Þú getur notað vinstri og hægri örvalyklana til að flakka á milli flipa í flipalistanum.", "userrights": "Notandaréttindi", "userrights-lookup-user": "Velja notanda", "userrights-user-editname": "Skráðu notandanafn:", "editusergroup": "Hlaða inn notanda hópum", "editinguser": "Breyti réttindum {{GENDER:$1|notandans}} [[User:$1|$1]] $2", + "viewinguserrights": "Skoða notandaréttindi {{GENDER:$1|notandans}} [[User:$1|$1]] $2", "userrights-editusergroup": "Breyta hópum {{GENDER:$1|notanda}}", "userrights-viewusergroup": "Skoða hópa {{GENDER:$1|notanda}}", "saveusergroups": "Vista {{GENDER:$1|notanda}} hópa", @@ -1030,6 +1069,7 @@ "userrights-changeable-col": "Hópar sem þú getur breytt", "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt", "userrights-irreversible-marker": "$1*", + "userrights-no-shorten-expiry-marker": "$1#", "userrights-expiry-current": "Rennur út $1", "userrights-expiry-none": "Rennur ekki út", "userrights-expiry": "Rennur út:", @@ -1126,6 +1166,9 @@ "right-sendemail": "Senda tölvupóst til annara notenda", "right-managechangetags": "Búa til og (af)virkja [[Special:Tags|merki]] úr gagnagrunni", "right-applychangetags": "Virkja [[Special:Tags|merki]] ásamt öðrum breytingum", + "grant-group-page-interaction": "Gagnvirkni með síður", + "grant-group-file-interaction": "Gagnvirkni með gögn", + "grant-group-watchlist-interaction": "Gagnvirkni með vaktlistann þinn", "grant-group-email": "Senda tölvupóst", "grant-group-high-volume": "Framkvæma magnaðgerðir", "grant-group-customization": "Sérsníðing og kjörstillingar", @@ -1206,6 +1249,7 @@ "action-deletechangetags": "eyða merkjum úr gagnagrunni", "action-purge": "hreinsa þessa síðu", "nchanges": "$1 {{PLURAL:$1|breyting|breytingar}}", + "ntimes": "$1×", "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|síðan síðustu heimsókn}}", "enhancedrc-history": "breytingaskrá", "recentchanges": "Nýlegar breytingar", @@ -1376,8 +1420,6 @@ "boteditletter": "v", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[{{PLURAL:$1|notandi skoðandi|$1 notendur skoðandi}}]", - "rc_categories": "Takmarka við flokka (aðskilja með \"|\"):", - "rc_categories_any": "Allt valið", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bæt|bæti}} eftir breytingu", "newsectionsummary": "Nýr hluti: /* $1 */", @@ -1562,6 +1604,7 @@ "uploadstash-bad-path-unknown-type": "Óþekkt gerð \"$1\".", "uploadstash-bad-path-unrecognized-thumb-name": "Óþekkt heiti á smámynd.", "uploadstash-file-not-found-no-thumb": "Gat ekki náð í smámynd.", + "uploadstash-zero-length": "Lengd skráar er núll.", "invalid-chunk-offset": "Ógild raðbreyting bunka", "img-auth-accessdenied": "Aðgangur óheimill", "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", @@ -1828,6 +1871,10 @@ "apisandbox-deprecated-parameters": "Úrelt viðföng", "apisandbox-submit-invalid-fields-title": "Sumir reitir eru ógildir", "apisandbox-results": "Niðurstöður", + "apisandbox-request-url-label": "Slóð á beiðni:", + "apisandbox-request-format-json-label": "JSON", + "apisandbox-request-json-label": "JSON beiðni:", + "apisandbox-request-time": "Tími beiðnar: {{PLURAL:$1|$1 ms}}", "apisandbox-alert-field": "Gildi þessa reits er ekki leyfilegt.", "apisandbox-continue": "Halda áfram", "apisandbox-continue-clear": "Hreinsa", @@ -1913,6 +1960,7 @@ "listgrouprights-namespaceprotection-namespace": "Nafnrými", "listgrouprights-namespaceprotection-restrictedto": "Réttindi sem leyfa notanda að breyta", "listgrants-rights": "Réttindi", + "listgrants-grant-display": "$1 ($2)", "trackingcategories-name": "Heiti skilaboða", "restricted-displaytitle-ignored": "Síður með hunsaða sýnda titla", "trackingcategories-nodesc": "Enginn lýsing tiltæk.", @@ -2040,7 +2088,7 @@ "revertpage-nouser": "Tók aftur breytingar falins notanda til síðustu útgáfu {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Tók til baka breytingar eftir {{GENDER:$3|$1}};\nsetti yfir á síðustu útgáfu eftir {{GENDER:$4|$2}}.", "sessionfailure-title": "Mistök í setu", - "sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nFarðu aftur á fyrri síðu, endurhladdu hana og reyndu aftur.", + "sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nReyndu að senda upplýsingarnar aftur inn.", "changecontentmodel-title-label": "Titill síðu", "changecontentmodel-reason-label": "Ástæða:", "changecontentmodel-submit": "Breyta", @@ -2355,7 +2403,7 @@ "movenosubpage": "Þessi síða hefur engar undirsíður.", "movereason": "Ástæða:", "revertmove": "taka til baka", - "delete_and_move_text": "Úttakssíðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?", + "delete_and_move_text": "Marksíðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?", "delete_and_move_confirm": "Já, eyða síðunni", "delete_and_move_reason": "Eytt til að rýma til fyrir flutning frá \"[[$1]]\"", "selfmove": "Nýi titillinn er sá sami og gamli, þú verður að velja annan titil.", @@ -2363,7 +2411,7 @@ "immobile-target-namespace": "Get ekki fært síður inn í nafnrýmið „$1“", "immobile-target-namespace-iw": "Óheimilt er að færa síðu með tungumálatengli.", "immobile-source-page": "Þessi síða er ekki færanleg.", - "immobile-target-page": "Get ekki fært á áætlaðan titil.", + "immobile-target-page": "Get ekki fært á þennan úttakstitil.", "bad-target-model": "Markstaðurinn sem þú valdir notast við annað innihaldslíkan. Get ekki umbreytt frá $1 í $2.", "imagenocrossnamespace": "Get ekki fært skrá í skrálaust nafnrými", "nonfile-cannot-move-to-file": "Get ekki fært annað en skrár í nafnrými skráa.", @@ -2415,7 +2463,7 @@ "thumbnail-dest-create": "Gat ekki vistað smámynd á markstað", "thumbnail_invalid_params": "Breytur smámyndarinnar eru rangar", "thumbnail_toobigimagearea": "Skrá með málsetningar stærri en $1", - "thumbnail_dest_directory": "Mistókst að búa til niðurhals möppu", + "thumbnail_dest_directory": "Mistókst að búa til úttaksmöppu", "thumbnail_image-type": "Enginn stuðningur er við þetta skráarsnið", "thumbnail_gd-library": "Ófullkomin stilling GD-aðgerðasafns: Vantar aðgerðina $1", "thumbnail_image-missing": "Skrána virðist vanta: $1", @@ -2717,6 +2765,46 @@ "sunday-at": "Sunnudag klukkan $1", "yesterday-at": "Í gær klukkan $1", "bad_image_list": "Sniðið er eftirfarandi:\n\nAðeins listaeigindi (línur sem byrja á *) eru meðtalin.\nFyrsti tengillinn í hverri línu verður að tengja í slæma skrá.\nAllir síðari tenglar á sömu línu eru taldir vera undantekningar, þ.e. síður þar sem að skráin kann að koma fyrir innfelld.", + "variantname-zh-hans": "hans", + "variantname-zh-hant": "hant", + "variantname-zh-cn": "cn", + "variantname-zh-tw": "tw", + "variantname-zh-hk": "hk", + "variantname-zh-mo": "mo", + "variantname-zh-sg": "sg", + "variantname-zh-my": "my", + "variantname-zh": "zh", + "variantname-gan-hans": "hans", + "variantname-gan-hant": "hant", + "variantname-gan": "gan", + "variantname-sr-ec": "sr-ec", + "variantname-sr-el": "sr-el", + "variantname-sr": "sr", + "variantname-kk-kz": "kk-kz", + "variantname-kk-tr": "kk-tr", + "variantname-kk-cn": "kk-cn", + "variantname-kk-cyrl": "kk-cyrl", + "variantname-kk-latn": "kk-latn", + "variantname-kk-arab": "kk-arab", + "variantname-kk": "kk", + "variantname-ku-arab": "ku-Arab", + "variantname-ku-latn": "ku-Latn", + "variantname-ku": "ku", + "variantname-tg-cyrl": "tg-Cyrl", + "variantname-tg-latn": "tg-Latn", + "variantname-tg": "tg", + "variantname-ike-cans": "ike-Cans", + "variantname-ike-latn": "ike-Latn", + "variantname-iu": "iu", + "variantname-shi-tfng": "shi-Tfng", + "variantname-shi-latn": "shi-Latn", + "variantname-shi": "shi", + "variantname-uz": "uz", + "variantname-uz-latn": "uz-Latn", + "variantname-uz-cyrl": "uz-Cyrl", + "variantname-crh": "crh", + "variantname-crh-latn": "crh-Latn", + "variantname-crh-cyrl": "crh-Cyrl", "metadata": "Lýsigögn", "metadata-help": "Þessi skrá inniheldur viðbótarupplýsingar, líklega frá stafrænu myndavélinni eða skannanum sem notaður var til að gera eða stafræna hana.\nEf skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi ekki við um hana.", "metadata-expand": "Sýna frekari upplýsingar", @@ -2823,9 +2911,13 @@ "exif-gpstrack": "Átt hreyfingar", "exif-gpsimgdirection": "Stefna myndarinnar", "exif-gpsmapdatum": "Landmælingagögn", + "exif-gpsdestlatituderef": "Tilvísun breiddargráðu áfangastaðar", "exif-gpsdestlatitude": "Breiddargráða áfangastaðar", + "exif-gpsdestlongituderef": "Tilvísun lengdargráðu áfangastaðar", "exif-gpsdestlongitude": "Lengdargráða áfangastaðar", + "exif-gpsdestbearingref": "Tilvísun stefnu áfangastaðar", "exif-gpsdestbearing": "Stefna til áfangastaðar", + "exif-gpsdestdistanceref": "Tilvísun fyrir fjarlægð á áfangastað", "exif-gpsdestdistance": "Fjarlægð á áfangastað", "exif-gpsprocessingmethod": "GPS vinnsluaðferð", "exif-gpsareainformation": "Heiti GPS-svæðis", @@ -3321,6 +3413,7 @@ "version-libraries-description": "Lýsing", "version-libraries-authors": "Höfundar", "redirect": "Endurbeining miðað við skrá, notanda, síðu, útgáfu eða innskráningarauðkenni", + "redirect-summary": "Þessi kerfissíða endurbeinir á skrá (sé uppgefið skráarheiti), síðu (sé uppgefið auðkenni útgáfu eða auðkenni síðu), notandasíðu (sé uppgefið tölulegt gildi notanda), eða færslu í aðgerðaskrá (sé uppgefið auðkenni færslu). Notkun: [[{{#Special:Redirect}}/file/Dæmi.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "Áfram", "redirect-lookup": "Fletta upp:", "redirect-value": "Gildi:", @@ -3360,6 +3453,8 @@ "tag-filter": "[[Special:Tags|Merkja]]sía:", "tag-filter-submit": "Sía", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merki}}]]: $2)", + "tag-mw-new-redirect": "Ný endurbeining", + "tag-mw-removed-redirect": "Fjarlægði endurbeiningu", "tag-mw-replace": "Skipt út", "tag-mw-undo": "Afturkalla", "tags-title": "Merki", @@ -3624,9 +3719,11 @@ "mediastatistics-header-text": "Textar", "mediastatistics-header-executable": "Uppsetninga skrár", "mediastatistics-header-archive": "Þjappaðar skrár", + "mediastatistics-header-3d": "3D", "mediastatistics-header-total": "Allar skrár", "json-warn-trailing-comma": "$1 eftirfylgjandi {{PLURAL:$1|komma var fjarlægð|kommur voru fjarlægðar}} úr JSON", "json-error-unknown": "Það varð villa í JSON. Villa: $1", + "json-error-depth": "Hámarki stafladýptar hefur verið náð", "json-error-state-mismatch": "Ógild eða ranglega uppsett JSON", "json-error-ctrl-char": "Villa í stýritákni, hugsanlega röng stafatafla (encoding)", "json-error-syntax": "Formvilla í málsetningu", @@ -3674,5 +3771,42 @@ "sessionprovider-nocookies": "Vefkökur gætu verið óvirkar. Gakktu úr skugga um að smákökur séu virkar og byrjaðu svo aftur.", "randomrootpage": "Handahófsvalin rótarsíða", "log-action-filter-all": "Allt", - "log-action-filter-delete-delete": "Eyðing síðu" + "log-action-filter-delete-delete": "Eyðing síðu", + "authmanager-email-label": "Tölvupóstur", + "authmanager-email-help": "Tölvupóstfang", + "authmanager-realname-label": "Raunverulegt nafn", + "authmanager-realname-help": "Raunverulegt nafn notandans", + "authmanager-provider-password": "Auðkenning með lykilorði", + "authmanager-provider-password-domain": "Auðkenning með lykilorði og léni", + "authmanager-provider-temporarypassword": "Bráðabirgðalykilorð", + "authprovider-confirmlink-option": "$1 ($2)", + "authprovider-confirmlink-request-label": "Aðgangar sem ættu að tengjast", + "authprovider-confirmlink-success-line": "$1: Tókst að tengja.", + "authprovider-confirmlink-failed-line": "$1: $2", + "authprovider-resetpass-skip-label": "Sleppa", + "authprovider-resetpass-skip-help": "Sleppa að endursetja lykilorð.", + "authform-newtoken": "Teikn vantar. $1", + "authform-notoken": "Teikn vantar", + "authform-wrongtoken": "Röng teikn", + "specialpage-securitylevel-not-allowed-title": "Ekki leyft", + "cannotauth-not-allowed-title": "Heimild hafnað", + "cannotauth-not-allowed": "Þú hefur ekki heimild til að nota þessa síðu", + "changecredentials": "Breyta auðkennum", + "changecredentials-submit": "Breyta auðkennum", + "credentialsform-provider": "Gerð auðkenna:", + "credentialsform-account": "Heiti aðgangs:", + "linkaccounts": "Tengja aðganga", + "linkaccounts-success-text": "Notandaaðgangurinn var tengdur.", + "linkaccounts-submit": "Tengja aðganga", + "unlinkaccounts": "Aftengja aðganga", + "unlinkaccounts-success": "Notandaaðgangurinn var aftengdur.", + "restrictionsfield-badip": "Ógilt IP-vistfang eða vistfangasvið: $1", + "restrictionsfield-label": "Leyfð svið IP-vistfanga:", + "edit-error-short": "Villa: $1", + "edit-error-long": "Villur: \n\n$1", + "revid": "útgáfa $1", + "pageid": "auðkennisnúmer síðu $1", + "gotointerwiki": "Fer af {{SITENAME}}", + "pagedata-title": "Síðugögn", + "pagedata-bad-title": "Ógildur titill: $1." } diff --git a/languages/i18n/it.json b/languages/i18n/it.json index aafc2d267d..44c3da9a2c 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -1552,8 +1552,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[osservata da {{PLURAL:$1|un utente|$1 utenti}}]", - "rc_categories": "Limita alle categorie (separate da \"|\"):", - "rc_categories_any": "Qualsiasi fra quelle indicate", "rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo la modifica", "newsectionsummary": "/* $1 */ nuova sezione", "rc-enhanced-expand": "Mostra dettagli", @@ -2684,6 +2682,7 @@ "thumbnail_dest_directory": "Impossibile creare la directory di destinazione", "thumbnail_image-type": "Tipo di immagine non supportato", "thumbnail_gd-library": "Configurazione incompleta della libreria GD: funzione $1 mancante", + "thumbnail_image-size-zero": "La dimensione del file di immagine sembra essere zero.", "thumbnail_image-missing": "Sembra essere mancante il file: $1", "thumbnail_image-failure-limit": "Ci sono stati recentemente troppi tentativi falliti ($1 o più) di generare questa miniatura. Riprova più tardi.", "import": "Importa pagine", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index 6be5b5db88..0381d192aa 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -1542,8 +1542,6 @@ "boteditletter": "ボ", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]", - "rc_categories": "カテゴリを限定 (「|」で区切る):", - "rc_categories_any": "選択したもの全部", "rc-change-size": "$1", "rc-change-size-new": "変更後は $1 {{PLURAL:$1|バイト}}", "newsectionsummary": "/* $1 */ 新しい節", diff --git a/languages/i18n/jv.json b/languages/i18n/jv.json index 48bd40ea23..b67539cb38 100644 --- a/languages/i18n/jv.json +++ b/languages/i18n/jv.json @@ -1330,8 +1330,6 @@ "newpageletter": "A", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]", - "rc_categories": "Watesi tekan kategori (dipisah nganggo \"|\")", - "rc_categories_any": "Apa waé sing dipilih", "rc-change-size-new": "$1 {{PLURAL:$1|bét|bét}} sawisé diowahi", "newsectionsummary": "/* $1 */ pérangan anyar", "rc-enhanced-expand": "Tuduhaké princèn", diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json index f77067d14a..58fc69db19 100644 --- a/languages/i18n/ka.json +++ b/languages/i18n/ka.json @@ -69,7 +69,7 @@ "tog-watchlisthideanons": "დამალეთ ანონიმურ მომხმარებელთა შესწორებები ჩემი კონტროლის სიიდან", "tog-watchlisthidepatrolled": "დამალეთ საკონტროლო სიიდან პატრულირებული რედაქტირებები", "tog-watchlisthidecategorization": "გვერდების კატეგორიზაციის დამალვა", - "tog-ccmeonemails": "გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი", + "tog-ccmeonemails": "გამომიგზავნე ელექტრონული ფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი", "tog-diffonly": "დამალე გვერდის შიგთავსი ცვლილების ქვევით", "tog-showhiddencats": "დამალული კატეგორიების ჩვენება", "tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება", @@ -1033,7 +1033,8 @@ "timezoneregion-europe": "ევროპა", "timezoneregion-indian": "ინდოეთის ოკეანე", "timezoneregion-pacific": "წყნარი ოკეანე", - "allowemail": "სხვა მომხმარებლებისგან ელ. ფოსტის მიღების ჩართვა", + "allowemail": "სხვა მომხმარებლებისგან ელექტრონული ფოსტის მიღების ჩართვა", + "email-allow-new-users-label": "ელექტრონული ფოსტის მიღება ახალთახალი მომხმარებლებისაგან", "email-blacklist-label": "აუკრძალე შემდეგ მომხმარებლებს ჩემთვის მეილების გამოგზავნა:", "prefs-searchoptions": "ძიების პარამეტრები", "prefs-namespaces": "სახელთა სივრცეები", @@ -1472,8 +1473,6 @@ "boteditletter": "რ", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]", - "rc_categories": "მხოლოდ კატეგორიებიდან (გამყოფი „|“)", - "rc_categories_any": "არჩეულიდან ნებისმიერი", "rc-change-size": "$1", "rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}", "newsectionsummary": "/* $1 */ ახალი სექცია", diff --git a/languages/i18n/kaa.json b/languages/i18n/kaa.json index 9dc959c26b..2838ab11a3 100644 --- a/languages/i18n/kaa.json +++ b/languages/i18n/kaa.json @@ -677,8 +677,6 @@ "newpageletter": "T", "boteditletter": "b", "number_of_watching_users_pageview": "[Baqlag'an {{PLURAL:$1|1 paydalanıwshı|$1 paydalanıwshı}}]", - "rc_categories": "Kategoriyalarg'a sheklew (\"|\" belgisi menen ajıratın')", - "rc_categories_any": "Ha'r qanday", "newsectionsummary": "/* $1 */ taza bo'lim", "rc-enhanced-expand": "Tolıq mag'lıwmattı ko'rsetiw (JavaScriptti talap etedi)", "rc-enhanced-hide": "Tolıq mag'lıwmattı jasırıw", diff --git a/languages/i18n/kab.json b/languages/i18n/kab.json index d79e343657..e47ef2c7ea 100644 --- a/languages/i18n/kab.json +++ b/languages/i18n/kab.json @@ -1302,8 +1302,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|aɛessas|iɛessasen}}]", - "rc_categories": "Ḥedded i taggayin (ferreq s \"|\")", - "rc_categories_any": "Yiwet seg tid yettwafernen", "rc-change-size-new": "$1 {{PLURAL:$1|atamḍan|itamḍanen}} seld abeddel", "newsectionsummary": "/* $1 */ tigezmi tamaynut", "rc-enhanced-expand": "Ẓeṛ ttfaṣil", diff --git a/languages/i18n/kiu.json b/languages/i18n/kiu.json index 3e7f13ff55..f412f1d6c0 100644 --- a/languages/i18n/kiu.json +++ b/languages/i18n/kiu.json @@ -171,7 +171,7 @@ "templatepage": "Pela nımunu bıvêne", "viewhelppage": "Pela phoşti bıvêne", "categorypage": "Pela kategoriye bıvêne", - "viewtalkpage": "Hurênaişi bıvêne", + "viewtalkpage": "Hurênayişi bıvêne", "otherlanguages": "Zonunê binu de", "redirectedfrom": "($1 ra ard)", "redirectpagesub": "Pela berdene", @@ -876,7 +876,7 @@ "sp-contributions-blocklog": "qeydê engeli", "sp-contributions-uploads": "barbiyaey", "sp-contributions-logs": "qeydi", - "sp-contributions-talk": "hurênais", + "sp-contributions-talk": "hurênayiş", "sp-contributions-search": "Ebe iştıraku cı feteliye", "sp-contributions-username": "IP ya ki karber:", "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne", @@ -963,7 +963,7 @@ "tooltip-pt-mycontris": "Lista iştıraqunê sıma", "tooltip-pt-login": "Serba cıkotene sıma rê sılaiya; hama, na zeruriye niya", "tooltip-pt-logout": "Veciye", - "tooltip-ca-talk": "Pela tedeesteu sero hurênais", + "tooltip-ca-talk": "Pela tedeesteyu sero hurênayiş", "tooltip-ca-edit": "Tı şikina na pele bıvurnê.\nKerem ke, qeydkerdene ra ver gozaga verqayti bıgurene.", "tooltip-ca-addsection": "Jü qısımo newe rake", "tooltip-ca-viewsource": "Na pele seveknaiya.\nTı şikina çımunê dae bıvênê", diff --git a/languages/i18n/kk-arab.json b/languages/i18n/kk-arab.json index 27e73ff613..bdc33180bd 100644 --- a/languages/i18n/kk-arab.json +++ b/languages/i18n/kk-arab.json @@ -658,8 +658,6 @@ "newpageletter": "ج", "boteditletter": "ب", "number_of_watching_users_pageview": "[باقىلاعان $1 قاتىسۋشى]", - "rc_categories": "ساناتتارعا شەكتەۋ (\"|\" بەلگىسىمەن بولىكتەڭىز)", - "rc_categories_any": "قايسىبىر", "newsectionsummary": "/* $1 */ جاڭا ٴبولىم", "recentchangeslinked": "قاتىستى وزگەرىستەر", "recentchangeslinked-feed": "قاتىستى وزگەرىستەر", diff --git a/languages/i18n/kk-cyrl.json b/languages/i18n/kk-cyrl.json index d83a5ea782..ca4071eccc 100644 --- a/languages/i18n/kk-cyrl.json +++ b/languages/i18n/kk-cyrl.json @@ -1205,8 +1205,6 @@ "newpageletter": "Ж", "boteditletter": "б", "number_of_watching_users_pageview": "[бақылаған $1 қатысушы]", - "rc_categories": "Санаттарға шектеу («|» белгісімен бөлектеңіз):", - "rc_categories_any": "Таңдалғанның кез келгені", "rc-change-size-new": "Өңдеуден кейінгі көлемі: $1 {{PLURAL:$1|байт|байт}}", "newsectionsummary": "/* $1 */ жаңа бөлім", "rc-enhanced-expand": "Толық ақпаратты көрсету", diff --git a/languages/i18n/kk-latn.json b/languages/i18n/kk-latn.json index af23527804..6b8e7845a7 100644 --- a/languages/i18n/kk-latn.json +++ b/languages/i18n/kk-latn.json @@ -660,8 +660,6 @@ "newpageletter": "J", "boteditletter": "b", "number_of_watching_users_pageview": "[baqılağan $1 qatıswşı]", - "rc_categories": "Sanattarğa şektew (\"|\" belgisimen bölikteñiz)", - "rc_categories_any": "Qaýsıbir", "newsectionsummary": "/* $1 */ jaña bölim", "recentchangeslinked": "Qatıstı özgerister", "recentchangeslinked-feed": "Qatıstı özgerister", diff --git a/languages/i18n/km.json b/languages/i18n/km.json index aa0ac6e7a6..f467d58fb8 100644 --- a/languages/i18n/km.json +++ b/languages/i18n/km.json @@ -1219,8 +1219,6 @@ "newpageletter": "ថ្មី", "boteditletter": "យន្ត", "number_of_watching_users_pageview": "[មាន{{PLURAL:$1|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}}$1នាក់កំពុងមើល]", - "rc_categories": "កំហិតត្រឹមចំណាត់ថ្នាក់ក្រុម(ខណ្ឌដោយសញ្ញា \"|\")៖", - "rc_categories_any": "មួយណាក៏បាន", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|បៃ|បៃ}} បន្ទាប់ពីបន្លាស់ប្ដូរ", "newsectionsummary": "/* $1 */ ផ្នែកថ្មី", diff --git a/languages/i18n/kn.json b/languages/i18n/kn.json index c79f960feb..5dc544ec71 100644 --- a/languages/i18n/kn.json +++ b/languages/i18n/kn.json @@ -1002,8 +1002,6 @@ "newpageletter": "ಹೊ", "boteditletter": "ಬಾ", "number_of_watching_users_pageview": "[$1 ವೀಕ್ಷಿಸುತ್ತಿರುವ {{PLURAL:$1|ಸದಸ್ಯ|ಸದಸ್ಯರು}}]", - "rc_categories": "ವರ್ಗಗಳಿಗೆ ಮಾತ್ರ ಸೀಮಿತವಾಗಿಸು (\"|\" ಇಂದ ಬೇರ್ಪಡಿಸು)", - "rc_categories_any": "ಯಾವುದೇ", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ಬದಲಾವಣೆಯ ನಂತರ", "newsectionsummary": "/* $1 */ ಹೊಸ ವಿಭಾಗ", "rc-enhanced-expand": "ವಿವರಗಳನ್ನು ತೋರಿಸು", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index 89b88e5458..ecf9ce88e3 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -1507,8 +1507,6 @@ "newpageletter": "새글", "boteditletter": "봇", "number_of_watching_users_pageview": "[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]", - "rc_categories": "다음 분류로 제한 (\"|\"로 구분):", - "rc_categories_any": "선택된 것 중 아무거나", "rc-change-size-new": "바꾼 후 $1 {{PLURAL:$1|바이트}}", "newsectionsummary": "/* $1 */ 새 문단", "rc-enhanced-expand": "자세한 내용 보기", @@ -2259,7 +2257,7 @@ "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.", "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]", "sessionfailure-title": "세션 실패", - "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.", + "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.", "changecontentmodel": "문서의 콘텐츠 모델을 변경", "changecontentmodel-legend": "콘텐츠 모델 변경", "changecontentmodel-title-label": "문서 제목", diff --git a/languages/i18n/krc.json b/languages/i18n/krc.json index d3e55ee739..89e9c6a974 100644 --- a/languages/i18n/krc.json +++ b/languages/i18n/krc.json @@ -1076,8 +1076,6 @@ "newpageletter": "Дж", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|кёзюнде тутуучу къошулуучу}}]", - "rc_categories": "Къуру бу категорияладан («|» бла айыр):", - "rc_categories_any": "Сайланнгандан къайсысы да", "rc-change-size": "$1", "rc-change-size-new": "Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}", "newsectionsummary": "/* $1 */ Джангы бёлюм", diff --git a/languages/i18n/ksh.json b/languages/i18n/ksh.json index 0456b68ecc..a2df7722da 100644 --- a/languages/i18n/ksh.json +++ b/languages/i18n/ksh.json @@ -1289,8 +1289,6 @@ "boteditletter": "B", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[{{PLURAL:$1|eine|$1|kein}} Oppasser]", - "rc_categories": "Bejränz op de Saachjroppe (schrihv „|“ dozwesche):", - "rc_categories_any": "Öhndseijne vun dä aanjejovve Saachjroppe", "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes|Bytes}} noh dem Ändere", "newsectionsummary": "Neuje Afschnet /* $1 */", diff --git a/languages/i18n/ku-latn.json b/languages/i18n/ku-latn.json index 2a054643d0..6ef7b8e977 100644 --- a/languages/i18n/ku-latn.json +++ b/languages/i18n/ku-latn.json @@ -908,7 +908,6 @@ "newpageletter": "Nû", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]", - "rc_categories_any": "Qet", "rc-change-size-new": "Piştî guhertinê $1 {{PLURAL:$1|bayt}}", "newsectionsummary": "/* $1 */ beşeke nû", "rc-enhanced-expand": "Hûragahiyan nîşan bide", diff --git a/languages/i18n/kum.json b/languages/i18n/kum.json index bd008e6f59..dc859203a7 100644 --- a/languages/i18n/kum.json +++ b/languages/i18n/kum.json @@ -59,7 +59,10 @@ "category_header": "\"$1\" категориядан сагьифалар", "subcategories": "Субкатегориялар", "category-media-header": "\"$1\" категориядагъы сапламлар", + "category-empty": "\"Бу категория буссагьат бош.\"", "hidden-categories": "{{PLURAL:$1|Яшырылгъан категория|Яшырылгъан категориялар}}‎", + "category-subcat-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген тюп категориясы бар.|Бу категорияда янгыз гелеген $2 тюп категорядан {{PLURAL:$1|тюп категория}} гёрсетилген.}}", + "category-article-count": "{{PLURAL:$2|Бу категорияда янгыз гелеген бир сагьифа бар.|Бу категорияда бар $2 сагьифаны {{PLURAL:$1|сагьифасы}} гёрсетилген.}}", "listingcontinuesabbrev": "давам", "noindex-category": "Индексленмейген сагьифалар", "broken-file-category": "Ишлеймейген саплам байланывлары булан сагьифалар", @@ -104,6 +107,7 @@ "jumptosearch": "излев", "aboutsite": "{{SITENAME}} гьакъында", "aboutpage": "Project:Сыпатлав", + "copyright": "Ичделиги $1 лисензиягъа гёре гиришли (башгъасы мекенленмеген буса).", "copyrightpage": "{{ns:project}}:Ясавчу гьакълар", "currentevents": "Гьалиги гьаллар", "currentevents-url": "Project:Гьалиги гьаллар", @@ -198,6 +202,7 @@ "showdiff": "Тюзлевлени гёрсетмек", "loginreqlink": "гирмек", "noarticletext": "Бу сагьифа гьали де матынсыз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]] боласан, [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделик язывланы тапмагъа] яда '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} булай аты булан сагьифа яратмагъа боласан]'''.", + "noarticletext-nopermission": "Бу сагьифа гьали де текстсиз. Сен башгъа сагьифаларда [[Special:Search/{{PAGENAME}}|булай атын эсгеривлерини излемеге]], яда [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийишли гюнделиклени тапмагъа боласан]. Тек бу сагьифаны яратмагъа ихтиярынг ёкъ.", "userpage-userdoesnotexist-view": "\"$1\" гьисап къайытланмагъан.", "previewnote": "Бу ингкъарав экенни эсде сакъла.\nАлышынывларынг гьали де сакъланмагъан!", "continue-editing": "Тюзлевню давамламакъ", @@ -211,6 +216,7 @@ "hiddencategories": "Бу сагьифа {{PLURAL:$1|1 яшырылгъан категориягъа}} янаша:", "permissionserrors": "Гириш ихтиярланы хатасы", "permissionserrorstext-withaction": "Бугъар $2 гелеген {{PLURAL:$1|себепге|себеплеге}} гёре ихтиярынг ёкъ:", + "recreate-moveddeleted-warn": "Тергев бер: Алдын тайдырылгъан сагьифаны ярашдырма айланасан.\n\nБашлап тергеп къара, гертиден де тарыкъмы экен ол сагьифаны ярашдырмагъа.\nТайдырыв ва атын алышдырыв гюнделиги тюпде берилген:", "content-model-wikitext": "викиматын", "undo-failure": "Аралыкъ алышынывланы къыйышывсызлгъы учун тюзлев гери алынмай.", "viewpagelogs": "Бу сагьифа учун гюнделиклени гёрсетмек", @@ -237,6 +243,7 @@ "editundo": "гери алмакъ", "diff-empty": "(башгъалыкълар ёкъ)", "diff-multi-sameuser": "(шо къоллавчуну {{PLURAL:$1|$1 аралыкъ тюрю}} гёрсетилмеген)", + "diff-multi-otherusers": "({{PLURAL:$2|къоллавчуну}}{{PLURAL:$1|аралыкъ тюзлевю|$1 аралыкъ тюзлевлери}} гёрсетилмеген)", "searchresults": "Излевню натижалар", "searchresults-title": "\"$1\" учун натижаланы излемек", "prevn": "алдагъы {{PLURAL:$1|$1}}", @@ -245,6 +252,7 @@ "nextn-title": "Гелеген $1 {{PLURAL:$1|гьасил}}", "shown-title": "Айры бир сагьифада $1 {{PLURAL:$1|языв|язывланы}} гёрсетмек", "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) къарамакъ", + "searchmenu-exists": "Бу викиде \"[[:$1]]\" деп аты булан сагьифа бар. {{PLURAL:$2|0=|Дагъы да табылгъан натижалагъа да къара.}}", "searchmenu-new": "\"[[:$1]]\" сагьифа бу викиде яратмакъ! {{PLURAL:$2|0=|Излевюнге кёре табылгъан сагьифалагъа да къара.|Дагъы да излев гьасиллеге къара.}}", "searchprofile-articles": "Аслу сагьифалар", "searchprofile-images": "Мюлтимедиа", @@ -255,6 +263,7 @@ "searchprofile-everything-tooltip": "Бары да сагьифаларда излемек (сёйлешив сагьифаланы да къошуп)", "searchprofile-advanced-tooltip": "Сайлангъан аралыкъларда излемек", "search-result-size": "$1 ({{PLURAL:$2|1 сёз|$2 сёз}})‎", + "search-result-category-size": "{{PLURAL:$1|1 ортакъчы|$1 ортакъчы}} ({{PLURAL:$2|1 тюп категория|$2 тюп категория}}, {{PLURAL:$3|1 саплам|$3 саплам}})", "search-redirect": "($1 сагьифадан бакъдырылгъан)‎", "search-section": "($1 бёлме)", "search-file-match": "(сапламны ичделигине рас геле)", @@ -315,6 +324,7 @@ "recentchangeslinked-feed": "Байлавлу тюзлевлер", "recentchangeslinked-toolbox": "Байлавлу тюзлевлер", "recentchangeslinked-title": "\"$1\" сагьифагъа байлавлу тюзлевлер", + "recentchangeslinked-summary": "Бу сагьифагъа байлавлу тюзлевлери булан сагьифаланы яда о сагьифа байлавлуланы гёрмек учун атын яз. (Категорияны ортакъчаларын гёрмек учун Category:категорияны атын яз). Сени [[Special:Watchlist|гьызарлав тизменгдеги]] алышынывлар къалын гьарплылар.", "recentchangeslinked-page": "Сагьифаны аты:", "recentchangeslinked-to": "Къайта, бу сагьифагъа байлавлу сагьифаланы алышынывларын гёрсетмек", "upload": "Сапламны юклемек", @@ -348,6 +358,7 @@ "statistics": "Истатистик", "double-redirect-fixer": "Ёллав дуруславу", "nbytes": "$1 {{PLURAL:$1|байт|байтлар}}‎", + "nmembers": "$1 {{PLURAL:$1|ортакъчы}}", "prefixindex": "Префикс булан бары да сагьифалар", "listusers": "Ортакъчы тизмеси", "newpages": "Янгы сагьифалар", @@ -361,6 +372,7 @@ "speciallogtitlelabel": "Мурат (аты яда {{ns:user}}:ортакъчы):", "log": "Гюнделиклер", "all-logs-page": "Бары да гиришли гюнделиклер", + "alllogstext": "{{SITENAME}} сайфаны жыйымлы гюнделик тизмеси.\nНатижаланы гюнделик тайпасына, ортакъчы атына (уллу-гиччи гьарпланы гьисапгъа алып) яда тийилген сагьифасына (уллу-гиччи гьарпланы гьисапгъа алып) гёре айырма боласан.", "logempty": "Къыйышывлу язывлар гюнделикде ёкъ.", "allpages": "Бары сагьифалар", "allarticles": "Бары сагьифалар", @@ -392,6 +404,7 @@ "namespace": "Атлар аралыгъы:", "invert": "Сайлангъанын айландырмакъ", "namespace_association": "Байланышлы атлар аралыгъы", + "tooltip-namespace_association": "Сайлангъан атысакъламагъа байлавлу атсакъламаны, пикирлешивлени къошмакъ учун бу белгини де сал.", "blanknamespace": "(Аслу)", "contributions": "{{GENDER:$1|Къоллавчуну}} къошуму", "contributions-title": "Ортакъчыны ярдымы $1", @@ -489,6 +502,7 @@ "tooltip-ca-nstab-category": "Категорияны сагьифасына къарамакъ", "tooltip-minoredit": "Увакъ алышынывдай белгилемек", "tooltip-save": "Алышдырывларынг сакъламакъ", + "tooltip-preview": "Сагьифаны ингкъараву. Сакъълагъанчакъы пайдалан.", "tooltip-diff": "Сен этген матынны тюзлевлеринг гёрсетмек", "tooltip-compareselectedversions": "Бу сагьифаны сайлангъан эки тюрлерин башгъалыгъына къарамакъ.", "tooltip-watch": "Сени тергев сиягьынга бу сагьифаны къошмакъ", @@ -502,6 +516,7 @@ "pageinfo-header-restrictions": "Сагьифа къорув", "pageinfo-header-properties": "Сагьифа кюйлемлер", "pageinfo-display-title": "Гёрсетилеген аты", + "pageinfo-default-sort": "Бар кюйде айырыв ачгъычы", "pageinfo-length": "Сагьифаны узунлугъу (байтларда)", "pageinfo-article-id": "Сагьифа ID", "pageinfo-language": "Сагьифаны тили", @@ -541,14 +556,17 @@ "show-big-image-other": "Башгъа {{PLURAL:$2|айырым|айырымлар}}: $1.", "show-big-image-size": "$1 × $2 пиксел", "metadata": "Мета маълюматлар", + "exif-orientation": "Онгарылым", "exif-xresolution": "Гёнделен айырым", "exif-yresolution": "Тик айырым", "exif-datetime": "Сапламны алышыныв тархы ва заманы", "exif-make": "Камераны ясавчусу", "exif-model": "Камераны модели", + "exif-software": "Програм таъмини", "exif-exifversion": "Exif тюрю", "exif-colorspace": "Тюслер аралыгъы", "exif-datetimeoriginal": "Аслу тарх ва заман", + "exif-datetimedigitized": "Санавлашдырывну тархы ва заманы", "exif-orientation-1": "Нормал", "namespacesall": "бары да", "monthsall": "бары да", @@ -560,6 +578,7 @@ "watchlisttools-edit": "Тизмени къарап тюзлемек", "watchlisttools-raw": "Саяв текстни тюзлемек", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|сёйлешив]])", + "redirect": "Сапламны, къоллавчуну, сагьифаны, тюрню яда гюнделикни менлигине гёре ёллав", "redirect-submit": "Гёчмек", "redirect-lookup": "Излев:", "redirect-value": "Къыймат:", @@ -575,9 +594,14 @@ "tags-hitcount": "$1 {{PLURAL:$1|алышыныв|алышынывлар}}", "logentry-delete-delete": "$1 {{GENDER:$2|тайдыргъан}} сагьифаны $3", "logentry-delete-restore": "$1 бу $3 ($4) сагьифаны {{GENDER:$2ярашдыргъан|}}", + "logentry-delete-revision": "$1 бу сагьифаны $3: $4 {{PLURAL:$5|тюрюн}} гёрюнегенлигин {{GENDER:$2|алышдырды}}", "revdelete-content-hid": "ичделиги яшырылгъан", "logentry-move-move": "$1 къоллавчу $3 сагьифаны $4 сагьифагъа атын айландыргъан", + "logentry-move-move-noredirect": "$1 бу сагьифаны $3 атын бугъар $4 {{GENDER:$2|алышдырды}} онгарывсуз да къойду", + "logentry-move-move_redir": "$1 бу сагьифаны $3 атын бугъар $4 {{GENDER:$2|алышдырды}} онгарывсуз да къойду", + "logentry-patrol-patrol-auto": "$1 оьзлюгюнден $3 сагьифаны $4 тюрюн патруллангъандай {{GENDER:$2|белгилеген}}", "logentry-newusers-create": "$2 къоллавчу $1 бетин этген", + "logentry-newusers-autocreate": "$1 ортакъчыны гьисабы оьзлюгюнден {{GENDER:$2|яратылды}}", "logentry-upload-upload": "$1 {{GENDER:$2|юклеген}} $3", "logentry-upload-overwrite": "$1 буну $3 янгы тюрюн {{GENDER:$2|юклеген}}", "searchsuggest-search": "{{SITENAME}} ичинде излемек", diff --git a/languages/i18n/ky.json b/languages/i18n/ky.json index 1dbb6c6c8f..19f7d87f02 100644 --- a/languages/i18n/ky.json +++ b/languages/i18n/ky.json @@ -781,7 +781,6 @@ "minoreditletter": "м", "newpageletter": "Ж", "boteditletter": "б", - "rc_categories_any": "Каалаган", "rc-enhanced-expand": "Кошумча маалыматтарды көрсөтүү (JavaScript талап кылынат)", "rc-enhanced-hide": "Кошумча маалыматтарды жашыруу", "recentchangeslinked": "Байланыштуу өзгөрүүлөр", diff --git a/languages/i18n/la.json b/languages/i18n/la.json index a70c190325..e07ef69ea6 100644 --- a/languages/i18n/la.json +++ b/languages/i18n/la.json @@ -848,7 +848,6 @@ "newpageletter": "N", "boteditletter": "a", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor observans|usores observantes}}]", - "rc_categories_any": "Ulla", "rc-change-size-new": "$1 {{PLURAL:$1|octetus|octeti}} post recensionem", "newsectionsummary": "/* $1 */ nova pars", "rc-enhanced-expand": "Minima monstrare", diff --git a/languages/i18n/lad.json b/languages/i18n/lad.json index 53efa23fa6..dfc7321383 100644 --- a/languages/i18n/lad.json +++ b/languages/i18n/lad.json @@ -635,7 +635,6 @@ "minoreditletter": "ch", "newpageletter": "M", "boteditletter": "b", - "rc_categories_any": "Kualkyer", "rc-change-size-new": "$1 {{PLURAL:$1|bayt|baytes}} dospués del trocamiento", "rc-enhanced-expand": "Amostrar los detalios", "rc-enhanced-hide": "Esconder los detalios", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 92531efb84..6f98e939d3 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -1407,8 +1407,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 Benotzer {{PLURAL:$1|iwwerwaacht|iwwerwaachen}}]", - "rc_categories": "Limitéieren op d'Kategorie (getrennt mat \"|\"):", - "rc_categories_any": "Aus iergendenger vun den erausgesichten", "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}", "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} no der Ännerung", "newsectionsummary": "Neien Abschnitt /* $1 */", diff --git a/languages/i18n/lez.json b/languages/i18n/lez.json index 832a9ecbfa..0ea7d77d4c 100644 --- a/languages/i18n/lez.json +++ b/languages/i18n/lez.json @@ -563,7 +563,6 @@ "minoreditletter": "гъ", "newpageletter": "Цl", "boteditletter": "б", - "rc_categories_any": "ГЬар са", "rc-change-size-new": "Масакlа авунилай ахпа кьадар: $1 байт", "rc-enhanced-expand": "Куьлуь-шуьлуьяр къалурун (JavaScript герекзава)", "rc-enhanced-hide": "Куьлуь-шуьлуьяр чуьнуьха", diff --git a/languages/i18n/lfn.json b/languages/i18n/lfn.json index f590c4a5ef..4f57acb90a 100644 --- a/languages/i18n/lfn.json +++ b/languages/i18n/lfn.json @@ -701,6 +701,7 @@ "postedit-confirmation-created": "La paje es creada.", "postedit-confirmation-restored": "La paje es restorada.", "postedit-confirmation-saved": "Tua edita es fisada.", + "postedit-confirmation-published": "Tua edita ia es publicida.", "edit-already-exists": "Un paje nova no ia pote es creada.\nLo esiste ja.", "defaultmessagetext": "Testo inisial de mesaje", "content-failed-to-parse": "La contenida $2 per model $1 no ia pote es analiseda: $3", @@ -887,6 +888,8 @@ "diff-multi-sameuser": "({{PLURAL:$1|Un revisa|$1 revisas}} media par la mesma usor no es mostrada)", "diff-multi-otherusers": "({{PLURAL:$1|Un revisa|$1 revisas}} media par {{PLURAL:$2|un otra usor|$2 usores}} no es mostrada)", "diff-multi-manyusers": "({{PLURAL:$1|Un revisa|$1 revisas}} media par plu ca $2 {{PLURAL:$2|usor|$2 usores}} no es mostrada)", + "diff-paragraph-moved-tonew": "La paragraf ia move. Clica per salta a la loca nova.", + "diff-paragraph-moved-toold": "La paragraf ia move. Clica per salta a la loca vea.", "difference-missing-revision": "{{PLURAL:$2|Un revisa|$2 revisas}} de esta difere ($1) no ia es trovada.\n\nEsta es usual causada par segue un lia nonfresca de istoria a un paje cual on ia sutrae.\nDetalias es trovable en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejistra de sutraes].", "searchresults": "Resultas de xerca", "searchresults-title": "Resultas de xerca \"$1\"", @@ -1000,6 +1003,7 @@ "timezoneregion-indian": "Mar Indian", "timezoneregion-pacific": "Mar Pasifica", "allowemail": "Permete ce otra usores pote eposta me", + "email-allow-new-users-label": "Permete epostas de usores intera nova.", "email-blacklist-label": "Proibi esta usores de eposta a me:", "prefs-searchoptions": "Xerca", "prefs-namespaces": "Spasios de nom", @@ -1269,6 +1273,8 @@ "recentchanges-summary": "Segue asi la cambias la plu resente a la vici.", "recentchanges-noresult": "No cambias en la periodo spesifada coresponde a esta criterios.", "recentchanges-timeout": "Esta xerca ia es abandonada. Posible, tu desira atenta otra parametres de xerca.", + "recentchanges-network": "Par un era tecnical, no resultas pote es cargada. Proba refresci la paje, per favore.", + "recentchanges-notargetpage": "Tape un nom de paje a supra per vide cambias relatada a acel paje.", "recentchanges-feed-description": "Segue la cambias la plu resente a la vici en esta flue.", "recentchanges-label-newpage": "Esta edita ia crea un paje nova", "recentchanges-label-minor": "Esta es un edita minor", @@ -1284,7 +1290,9 @@ "rcfilters-group-results-by-page": "Grupi resultas par paje", "rcfilters-activefilters": "Filtros ativa", "rcfilters-advancedfilters": "Filtros avansada", - "rcfilters-limit-title": "Mostra cuanto cambias", + "rcfilters-limit-title": "Mostra cuanto resultas", + "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambia|cambias}}, $2‎", + "rcfilters-date-popup-title": "Periodo de tempo per la xerca", "rcfilters-days-title": "Dias resente", "rcfilters-hours-title": "Oras resente", "rcfilters-days-show-days": "$1 {{PLURAL:$1|dia|dias}}", @@ -1304,10 +1312,11 @@ "rcfilters-savedqueries-apply-and-setdefault-label": "Crea filtro inisial", "rcfilters-savedqueries-cancel-label": "Cansela", "rcfilters-savedqueries-add-new-title": "Fisa ajustas presente de filtro", + "rcfilters-savedqueries-already-saved": "Esta filtros es ja fisada. Cambia tua ajustas per crea un filtro fisada nova.", "rcfilters-restore-default-filters": "Restora filtros inisial", "rcfilters-clear-all-filters": "Vacui tota filtros", "rcfilters-show-new-changes": "Regarda cambias la plu resente", - "rcfilters-search-placeholder": "Filtri cambias resente (eleje o comensa tape)", + "rcfilters-search-placeholder": "Filtri cambias (usa la menu o xerca un nom de filtro)", "rcfilters-invalid-filter": "Filtro nonvalida", "rcfilters-empty-filter": "No filtros es ativa. Tota contribuis es mostrada.", "rcfilters-filterlist-title": "Filtros", @@ -1397,6 +1406,11 @@ "rcfilters-watchlist-showupdated": "Cambias a pajes cual tu no ia visita pos cuando los ia aveni es en\ntesto spesa, con indicadores solida.", "rcfilters-preference-label": "Asconde la varia bonida de Cambias Resente", "rcfilters-preference-help": "Desfa la redesinia de interfas de 2017 e tota utiles ajuntada alora e\na pos.", + "rcfilters-filter-showlinkedfrom-label": "Mostra cambias en pajes liada de", + "rcfilters-filter-showlinkedfrom-option-label": "Pajes liada de la paje elejeda", + "rcfilters-filter-showlinkedto-label": "Mostra cambias en pajes liante a", + "rcfilters-filter-showlinkedto-option-label": "Pajes liante a la paje elejeda", + "rcfilters-target-page-placeholder": "Tape un nom de paje (o categoria)", "rcnotefrom": "A su es la {{PLURAL:$5|cambia|cambias}} de $3, $4 (asta $1).", "rclistfromreset": "Reinisia la eleje de data", "rclistfrom": "Mostra cambias nova, comensante de $2, $3", @@ -1430,8 +1444,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usor|usores}} monitorinte]", - "rc_categories": "Limita de categorias (separa con \"|\"):", - "rc_categories_any": "Cualce de la elejedas", "rc-change-size-new": "$1 {{PLURAL:$1|bait|baites}} pos cambia", "newsectionsummary": "/* $1 */ parte nova", "rc-enhanced-expand": "Mostra detalias", @@ -1441,7 +1453,7 @@ "recentchangeslinked-feed": "Cambias relatada", "recentchangeslinked-toolbox": "Cambias relatada", "recentchangeslinked-title": "Cambias relatada a \"$1\"", - "recentchangeslinked-summary": "Esta es un lista de cambias resente a pajes liada de un paje spesifada (o a membros de un categoria spesifada).\nPajes en [[Special:Watchlist|tua lista monitorida]] es spesa.", + "recentchangeslinked-summary": "Tape un nom de paje per vide cambias en pajes liada a o de acel paje. (Per vide membros de un categoria, tape bold.) Cambias a pajes en [[Special:Watchlist|tua lista monitorida]] es spesa.", "recentchangeslinked-page": "Nom de paje:", "recentchangeslinked-to": "Mostra cambias a pajes cual lia a la paje indicada, en loca", "recentchanges-page-added-to-category": "[[:$1]] ajuntada a categoria", @@ -1615,7 +1627,7 @@ "lockmanager-fail-closelock": "La fix de semafor per \"$1\" no ia pote es cluida.", "lockmanager-fail-deletelock": "La fix de semafor per \"$1\" no ia pote es sutraeda.", "lockmanager-fail-acquirelock": "La semafor per \"$1\" no ia pote es otenida.", - "lockmanager-fail-openlock": "La fix de semafor per \"$1\" no ia pote es abrida.", + "lockmanager-fail-openlock": "La fix de semafor per \"$1\" no ia pote es abrida. Serti ce tua arcivo de carga es bon ajustada e ce tua servador es permeteda a scrive en acel arcivo. Vide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory per plu informa.", "lockmanager-fail-releaselock": "La semafor per \"$1\" no ia pote es relasada.", "lockmanager-fail-db-bucket": "Tro poca bancos de semafor ia pote es contatada en balde $1.", "lockmanager-fail-db-release": "Semafores per banco de datos $1 no ia pote es relasada.", @@ -1634,6 +1646,25 @@ "uploadstash-refresh": "Refresci la lista de fixes", "uploadstash-thumbnail": "regarda imajeta", "uploadstash-exception": "Carga no ia pote es ajuntada a la cargas pendente ($1): \"$2\".", + "uploadstash-bad-path": "La adirije no esiste.", + "uploadstash-bad-path-invalid": "La adirije no es valida.", + "uploadstash-bad-path-unknown-type": "Tipo \"$1\" nonconoseda.", + "uploadstash-bad-path-unrecognized-thumb-name": "Imajeta nonreconoseda.", + "uploadstash-bad-path-no-handler": "No tratador ia es trovada per tipo $1 de fix $2.", + "uploadstash-bad-path-bad-format": "Clave \"$1\" no es en forma coreta.", + "uploadstash-file-not-found": "Clave \"$1\" no ia es trovada en la pendentes.", + "uploadstash-file-not-found-no-thumb": "La imajeta no ia pote es otenida.", + "uploadstash-file-not-found-no-local-path": "No adirije local per la ojeto regrandida.", + "uploadstash-file-not-found-no-object": "La fix local per la imajeta no ia pote es creada.", + "uploadstash-file-not-found-no-remote-thumb": "Retrae de imajeta ia fali: $1 URL = $2", + "uploadstash-file-not-found-missing-content-type": "La xapo \"Content-Type\" manca.", + "uploadstash-file-not-found-not-exists": "La adirije no es trovable, o la fix no es plata.", + "uploadstash-file-too-large": "Fixes plu grande ca $1 baites no pote es servida.", + "uploadstash-not-logged-in": "No usor es autenticida; fixes debe parteni a usores.", + "uploadstash-wrong-owner": "Esta fix ($1) no parteni a la usor presente.", + "uploadstash-no-such-key": "No tal clave ($1); sutrae no es posible.", + "uploadstash-no-extension": "La sufisa manca.", + "uploadstash-zero-length": "La fix ave zero baites.", "invalid-chunk-offset": "Bloco con numero nonvalida", "img-auth-accessdenied": "Nonasedable", "img-auth-nopathinfo": "PATH_INFO manca.\nTua servador no es ajustada per envia esta informa.Cisa lo usa CGI e no pote suporta img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1786,7 +1817,7 @@ "doubleredirects": "Redirijes duple", "doubleredirectstext": "Esta paje lista pajes cual redirije a otra pajes redirijente.\nCada linia conteni linias a la redirije prima e du, como ance la gol de la redirije du, cual es usual la paje \"vera\" a cual la redirije prima debe punta.\nEntradas barida es ja solveda.", "double-redirect-fixed-move": "[[$1]] es moveda.\nLo ia es automata cambiada e aora lo redirije a [[$2]].", - "double-redirect-fixed-maintenance": "Automata reparante redirije duple de [[$1]] a [[$2]] en taxe de manteni.", + "double-redirect-fixed-maintenance": "Automata reparante redirije duple de [[$1]] a [[$2]] en taxe de manteni", "double-redirect-fixer": "Reparor de redirijes", "brokenredirects": "Redirijes rompeda", "brokenredirectstext": "La redirijes seguente lia a pajes nonesistente:", @@ -2161,7 +2192,7 @@ "rollback-success": "Editas par {{GENDER:$3|$1}} ia es reversada e cambiada a la revisa la plu resente par {{GENDER:$4|$2}}", "rollback-success-notify": "Editas par $1 ia es reversada e cambiada a la revisa la plu resente par $2. [$3 Mostra cambias]", "sessionfailure-title": "Fali de sesion", - "sessionfailure": "Lo pare ce tua sesion de autentici ave un problem;\nesta ata ia es canselada per proteje contra saisis de sesion.\nRevade a la paje presedente, recarga acel paje, e atenta alora denova.", + "sessionfailure": "Lo pare ce tua sesion de autentici ave un problem; esta ata ia es canselada per proteje contra saisis de sesion. Reenvia la formulario, per favore.", "changecontentmodel": "Cambia model de contenida de un paje", "changecontentmodel-legend": "Cambia model de contenida", "changecontentmodel-title-label": "Titulo de paje", @@ -2566,6 +2597,7 @@ "thumbnail_dest_directory": "Arcivo destinal no pote es creada", "thumbnail_image-type": "Tipo nonsuportada de imaje", "thumbnail_gd-library": "Ajusta noncompleta de biblioteca GD: Funsiona $1 manca", + "thumbnail_image-size-zero": "La grandia de la fix de imaje pare es zero.", "thumbnail_image-missing": "Fix pare manca: $1", "thumbnail_image-failure-limit": "Tro multe atentas resente ($1 o plu) ia fali rendere esta imajeta. Atenta denova plu tarda, per favore.", "import": "Emporta pajes", @@ -2580,6 +2612,8 @@ "import-mapping-namespace": "Emporta a un spasio de nom:", "import-mapping-subpage": "Emporta como supajes de la paje seguente:", "import-upload-filename": "Nom de fix:", + "import-upload-username-prefix": "Prefisa intervical:", + "import-assign-known-users": "Asinia editas a usores local do la usor nomida esiste local", "import-comment": "Comenta:", "importtext": "Per favore, esporta la fix de la vici fontal par usa la [[Special:Export|util de esporta]].\nFisa lo a tu computador e carga lo asi.", "importstart": "Emportante pajes...", @@ -2588,6 +2622,7 @@ "imported-log-entries": "$1 {{PLURAL:$1|entrada|entradas}} de rejistra ia es emportada.", "importfailed": "Emporta ia fali: $1", "importunknownsource": "Tipo nonconoseda de fonte de emporta", + "importnoprefix": "No prefisa intervical ia es furnida", "importcantopen": "Fix de emporta no ia pote es abrida", "importbadinterwiki": "Mal lia intervical", "importsuccess": "Emporta ia fini!", @@ -2773,6 +2808,7 @@ "pageinfo-category-subcats": "Cuantia de sucategorias", "pageinfo-category-files": "Cuantia de fixes", "pageinfo-user-id": "Numero de usor", + "pageinfo-file-hash": "Valua axida", "markaspatrolleddiff": "Marca como patruliada", "markaspatrolledtext": "Marca esta paje como patruliada", "markaspatrolledtext-file": "Marca esta varia de fix como patruliada", @@ -3266,6 +3302,8 @@ "autosumm-blank": "Paje vacuida", "autosumm-replace": "Contenida sustituida par \"$1\"", "autoredircomment": "Paje redirijeda a [[$1]]", + "autosumm-removed-redirect": "Sutrae de redirije a [[$1]]", + "autosumm-changed-redirect-target": "Gol de redirije cambiada de [[$1]] a [[$2]]", "autosumm-new": "Paje creada con \"$1\"", "autosumm-newblank": "Paje vacua creada", "lag-warn-normal": "Cambias plu resente ca $1 {{PLURAL:$1|secondo|secondos}} ante aora es cisa no mostrada en esta lista.", @@ -3289,6 +3327,7 @@ "watchlistedit-clear-titles": "Titulos:", "watchlistedit-clear-submit": "Vacui la lista (Esta es permanente!)", "watchlistedit-clear-done": "Tua lista de pajes monitorida es vacuida.", + "watchlistedit-clear-jobqueue": "Tua lista monitorida deveni vacuida. Esta pote ocupa alga tempo!", "watchlistedit-clear-removed": "{{PLURAL:$1|1 titulo|$1 titulos}} ia es sutraeda:", "watchlistedit-too-many": "La lista ave tro multe pajes per mostra asi.", "watchlisttools-clear": "Vacui la lista monitorida.", @@ -3333,7 +3372,7 @@ "version-poweredby-others": "otras", "version-poweredby-translators": "traduores a translatewiki.net", "version-credits-summary": "Nos desira reconose la persones seguente per sua contribuis a [[Special:Version|MediaWiki]].", - "version-license-info": "MediaWiki es un program libre; tu pote redistribui lo e/o altera lo su la restrinjes de la Lisensa Publica Jeneral GNU como publicida par la Funda de Programes Libre (Free Software Foundation); o revisa 2 de la Lisensa, o (si tu prefere) cualce revisa plu tarda.\n\nMediaWiki es distribuida con la espera ce lo va es usosa, ma CON NO GARANTIA; lo an no ave la garantia implicada de CONVENI PER VENDE (merchantability) or CONVENI PER UN INTENDE SPESIFADA (fitness for a particular purpose). Vide la Lisensa Publica Jeneral GNU per plu detalias.\n\nEsperable tu ia reseta [{{SERVER}}{{SCRIPTPATH}}/COPYING un copia de la Lisensa Publica Jeneral GNU] con esta program; si no, scrive a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html leje lo enlinia].", + "version-license-info": "MediaWiki es un program libre; tu pote redistribui lo e/o altera lo su la restrinjes de la Lisensa Publica Jeneral GNU como publicida par la Funda de Programes Libre (Free Software Foundation); o revisa 2 de la Lisensa, o (si tu prefere) cualce revisa plu tarda. MediaWiki es distribuida con la espera ce lo va es usosa, ma CON NO GARANTIA; lo an no ave la garantia implicada de CONVENI PER VENDE (merchantability) or CONVENI PER UN INTENDE SPESIFADA (fitness for a particular purpose). Vide la Lisensa Publica Jeneral GNU per plu detalias. Esperable tu ia reseta [{{SERVER}}{{SCRIPTPATH}}/COPYING un copia de la Lisensa Publica Jeneral GNU] con esta program; si no, scrive a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html leje lo enlinia].", "version-software": "Programes instalada", "version-software-product": "Produida", "version-software-version": "Revisa", @@ -3390,6 +3429,20 @@ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Eticeta|Eticetas}}]]: $2)", "tag-mw-contentmodelchange": "cambia de model de contenida", "tag-mw-contentmodelchange-description": "Editas cual [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cambia la model de contenida] de un paje", + "tag-mw-new-redirect": "Redirije nova", + "tag-mw-new-redirect-description": "Editas cual crea un redirije nova o cambia un paje a un redirije", + "tag-mw-removed-redirect": "Redirije sutraeda", + "tag-mw-removed-redirect-description": "Editas cual cambia un redirije esistente a un nonredirije", + "tag-mw-changed-redirect-target": "Gol de redirije cambiada", + "tag-mw-changed-redirect-target-description": "Editas cual cambia la gol de un redirije", + "tag-mw-blank": "Vacui", + "tag-mw-blank-description": "Editas cual vacui un paje", + "tag-mw-replace": "Suprascriveda", + "tag-mw-replace-description": "Editas cual sutrae plu ca 90% de la contenida de un paje", + "tag-mw-rollback": "Reversa", + "tag-mw-rollback-description": "Editas cual reversa editas presedente par la lia \"reversa\"", + "tag-mw-undo": "Desfa", + "tag-mw-undo-description": "Editas cual desfa editas presedente par la lia \"desfa\"", "tags-title": "Eticetas", "tags-intro": "Esta paje lista la eticetas con cual la program pote marca un edita, e sua sinifias.", "tags-tag": "Nom de eticeta", @@ -3659,9 +3712,9 @@ "limitreport-expansiondepth": "Profondia la plu grande de despaci", "limitreport-expensivefunctioncount": "Cuantia de funsionas custosa de analisador sintatical", "expandtemplates": "Despaci stensiles", - "expand_templates_intro": "Esta paje spesial prende testo e despaci tota stensiles en lo, en modo recorsante.\nLo despaci ance funsionas suportada de analisador sintatical como\n{{#language:…}} e variables como\n{{CURRENTDAY}}.\nEn fato, lo despaci cuasi tota cosas entre brasetas risa duple.", + "expand_templates_intro": "Esta paje spesial prende vicitesto e despaci tota stensiles en lo, en modo recorsante. Lo despaci ance funsionas suportada de analisador sintatical como {{#language:…}} e variables como {{CURRENTDAY}}. En fato, lo despaci cuasi tota cosas entre brasetas risa duple.", "expand_templates_title": "Titulo de contesto, per {{FULLPAGENAME}}, etc.:", - "expand_templates_input": "Testo enflual:", + "expand_templates_input": "Vicitesto enflual:", "expand_templates_output": "Resulta", "expand_templates_xml_output": "Esflue XML", "expand_templates_html_output": "Esflue HTML cru", @@ -3673,7 +3726,7 @@ "expand_templates_preview": "Previde", "expand_templates_preview_fail_html": "Car HTML cru es comutada en {{SITENAME}} e datos de sesion ia es perdeda, la previde es ascondeda per preveni atacas par JavaScript.\n\nSi esta es un atenta valida de previde, atenta denova, per favore.\nSi lo ancora no funsiona, proba [[Special:UserLogout|desautentici]] e reautentici, e serti ce tua surfador permete cucis de esta pajeria.", "expand_templates_preview_fail_html_anon": "\nCar HTML cru es comutada en {{SITENAME}} e tu no es autenticida, la previde es ascondeda per preveni atacas par JavaScript.\n\nSi esta es un atenta valida de previde, [[Special:UserLogin|autentici]] e atenta denova, per favore.", - "expand_templates_input_missing": "Tu debe furni a la min alga testo enflual.", + "expand_templates_input_missing": "Tu debe furni a la min alga vicitesto enflual.", "pagelanguage": "Cambia lingua de paje", "pagelang-name": "Paje", "pagelang-language": "Lingua", @@ -3890,6 +3943,8 @@ "restrictionsfield-badip": "Adirije o estende IP nonvalida: $1", "restrictionsfield-label": "Estendes IP permeteda:", "restrictionsfield-help": "Un adirije IP o estende CIDR per linia: Per comuta tota, usa:
0.0.0.0/0\n::/0
", + "edit-error-short": "Era: $1", + "edit-error-long": "Eras:\n\n$1", "revid": "revisa $1", "pageid": "numero de paje $1", "rawhtml-notallowed": "Eticetas <html> no pote es usada estra pajes normal.", diff --git a/languages/i18n/li.json b/languages/i18n/li.json index 4c3fc7e88b..57977985a3 100644 --- a/languages/i18n/li.json +++ b/languages/i18n/li.json @@ -1333,8 +1333,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op 'ne volglies]", - "rc_categories": "Bepirk tot categorieë (sjeij mit 'n \"|\")", - "rc_categories_any": "Idder vanne gekaozene", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao verangering", "newsectionsummary": "/* $1 */ nuje subkop", "rc-enhanced-expand": "Toean details", diff --git a/languages/i18n/lij.json b/languages/i18n/lij.json index 74558b9e01..58978b9fc7 100644 --- a/languages/i18n/lij.json +++ b/languages/i18n/lij.json @@ -1404,8 +1404,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[osservâ da {{PLURAL:$1|un utente|$1 utenti}}]", - "rc_categories": "Limite a-e categorie (separæ da \"|\"):", - "rc_categories_any": "Quâ-se-sæ fra quelle indicæ", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica", "newsectionsummary": "/* $1 */ neuva seçion", "rc-enhanced-expand": "Fanni vedde i detaggi", diff --git a/languages/i18n/lki.json b/languages/i18n/lki.json index 137a1bc334..a375bcc53f 100644 --- a/languages/i18n/lki.json +++ b/languages/i18n/lki.json @@ -1266,8 +1266,6 @@ "newpageletter": "نو", "boteditletter": "ر", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کاربر}} پی‌گیرنده]", - "rc_categories": "محدود به این رده‌ها (رده‌ها را با «|» جدا کنید):", - "rc_categories_any": "هر کدام از منتخب‌ها", "rc-change-size-new": " $1دؤما تۀقیر دائن{{PLURAL:$1|بایت|بایتل}}", "newsectionsummary": "/* $1 */ بەخش نوو", "rc-enhanced-expand": "نمایش جزئیات", diff --git a/languages/i18n/lmo.json b/languages/i18n/lmo.json index f3b0346ec8..6f924deae4 100644 --- a/languages/i18n/lmo.json +++ b/languages/i18n/lmo.json @@ -868,7 +868,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[tignìda d'öcc de {{PLURAL:$1|1 ütènt|$1 ütèncc}}]", - "rc_categories_any": "Töcc", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica", "newsectionsummary": "/* $1 */ sezión növa", "rc-enhanced-expand": "Fà ved i detai", diff --git a/languages/i18n/lrc.json b/languages/i18n/lrc.json index 4fcbd645bf..d2e547436f 100644 --- a/languages/i18n/lrc.json +++ b/languages/i18n/lrc.json @@ -54,8 +54,8 @@ "tog-norollbackdiff": "فأرخیا نە د یئ گئل ڤادئما رأتئن د بئین بوریت", "tog-useeditwarning": "د گاتی کئ آلئشتیا ئمایە نأبینە د بألگە ڤیرایئشت ڤئ جا مئ نئم مئنە ڤارئسیاری بأک", "tog-prefershttps": "هأمیشە د گاتی کئ مئ هام د ساموٙنە پئیڤأند أمن نە ڤئ کار بئیر", - "underline-always": "هأمیشە", - "underline-never": "هیژڤأخت", + "underline-always": "همیشٱ", + "underline-never": "هیژۋخت", "underline-default": "پوٙسە یا دوڤارتە نییأر پیش فأرض", "editfont-style": "راساگه فونت شیڤات نە ڤیرایئشت کو", "editfont-monospace": "فونت تأک بألگە یی", @@ -102,13 +102,13 @@ "jan": "جانۋیٱ", "feb": "فۋریٱ", "mar": "مارس", - "apr": "آڤریل", + "apr": "آۋریل", "may": "مئی", - "jun": "جوٙأن", + "jun": "جۊٱن", "jul": "جوٙلای", "aug": "آگوست", - "sep": "سئپتامر", - "oct": "ئوکتوڤر", + "sep": "سپتامر", + "oct": "اوکتوبر", "nov": "نوڤامر", "dec": "داٛسامر", "january-date": "جانڤیە $1", @@ -214,11 +214,11 @@ "pool-servererror": "پوٙل ئشمار خئذمأتگە د دأسرئس نی($1).", "poolcounter-usage-error": "خأطا ڤئ کار گئرئتئن:$1", "aboutsite": "داٛبارٱ {{SITENAME}}", - "aboutpage": "پوروجٱ:دبارٱ", + "aboutpage": "Project:دبارٱ", "copyright": "مینوٙنە یا هان د دأسرئس $1 مأر یە کئ ڤئ یئ گئل شیڤە هأنی نیسأنە بوٙە.", "copyrightpage": "{{ns:project}}:کوپی رایت", "currentevents": "روخ ڤأنیا ئیسئنی", - "currentevents-url": "پوروجە یا:روخ ڤأنیا ئیسئنی", + "currentevents-url": "Project:روخ ۋٱنیا ایساٛنی", "disclaimers": "تیٱپۊشکاریا", "disclaimerpage": "پوروجٱ: تیٱپوشی کردن همٱگیر", "edithelp": "هومياری سی ڤیرایئشت", @@ -574,8 +574,8 @@ "newarticle": "تازە", "newarticletext": "شوما هایین ڤا دئما هوم پئیڤأندی کئ ڤوجوٙد نارە.\nسی رأڤأندیاری بألگە.شوروٙ بأکیت مینئ جأڤە هاری بأنیسیت (سی دوٙنئسئن بیشتئر سئیل [$1 ] بأکیت).\nأر شوما سی ئشتئڤا کئردئن هائیت ئیچئ، ری دوگمە ڤادئما رأتئن دوڤارتە نیأر بأپوٙرنیت.", "anontalkpagetext": "----", - "noarticletext": "د ئیسئنیا د ئی بألگؤ نیسئسە یی ڤوجوٙد ناشتە.\nشوما می توٙنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ئی بألگە یا د بألگە هأنی یا [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هأنی نە پئی جوری بوٙە]، [{{fullurl:{{FULLPAGENAME}}|action=edit}} یا ئی بألگە نە ڤیرایئشت بأکیت].", - "noarticletext-nopermission": "د ئیسئنیا د ئی بألگؤ نیسئسە یی ڤوجوٙد ناشتە.\nشوما می توٙنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ئی بألگە یا د بألگە هأنی یا [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د هأنی نە پئی جوری بوٙە]، [{{fullurl:{{FULLPAGENAME}}|action=edit}}.ڤألی شوما صئلا یە نە کئ ئی بألگە نە راس بأکیت ناریت.", + "noarticletext": "د ایساٛنیا ای بلگٱ نیسسٱ ۋوجۊد ناشتٱ.\nشوما می تۊنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ای بلگٱ ای د بلگٱ هٱنی یا [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د نۏ پی جۊری بۊٱ]، [{{fullurl:{{FULLPAGENAME}}|action=edit}} یا ای بلگٱ ناٛ ۋیرایشت بٱکیت].", + "noarticletext-nopermission": "د ایساٛنیا ای بلگٱ نیسسٱ یی ۋوجۊد ناشتٱ.\nشوما می تۊنیت د[[Special:Search/{{PAGENAME}}|بگردید]] د ای بلگٱ یا د بلگٱ هٱنی یا [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د نۏ پی جۊری بۊٱ]، [{{fullurl:{{FULLPAGENAME}}|action=edit}}.ۋلی شوما ساٛلا یٱ نٱ کاٛ ای بلگٱ ناٛ راس بٱکیت ناریت.", "missing-revision": "ڤانئیأری #$1 د بألگە یی کئ نومئش ڤئنە \"{{FULLPAGENAME}}\" ڤوجوٙد نارە.\n\nگاسی سی یئ گئل ڤیرگار ڤئ هئنگوم نأبییە کئ د یئ گئل بألگە پاکسا بییە هوم پئیڤأند بییە رأڤأندیاری بییە.\nگاسی جوزئیات د[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] دیاری بأکأن.", "userpage-userdoesnotexist": "حئساڤ کاریاری \"$1\" ثأڤت نأم نأبییە.\nأر میھایت ئی بألگە نئ بأسازیت یا ڤیرایئشت کاری بأکیت یئ گئل ڤارئسی أنجوم بئیتوٙ.", "userpage-userdoesnotexist-view": "حئساڤ کاریاری \"$1\" ثأڤت نأبییە.", @@ -805,7 +805,7 @@ "difference-title": "فرخ مینجا وانیریا \"$1\"", "difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"", "difference-multipage": "(فرخ مینجا بلگه یا)", - "lineno": "خط $1:", + "lineno": "خٱت $1:", "compareselectedversions": "دوبار دیئنیایی که انتخاو بینه مقایسه بکیتو", "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید", "editundo": "ناانجومگر کردن", @@ -825,7 +825,7 @@ "next-page": "بلگه نهایی", "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}", "nextn-title": "نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}", - "shown-title": "نئشوٙ دأئن $1 {{PLURAL:$1|نأتیجە|نأتیجە}} سی هأر بألگە", + "shown-title": "نشۊ دٱئن $1 {{PLURAL:$1|نتیجٱ|نتیجٱیا}} سی هار بلگٱ", "viewprevnext": "ديئن ($1 {{int:pipe-separator}} $2) ($3)", "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''", "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای ويكي!'''", @@ -839,7 +839,7 @@ "searchprofile-advanced-tooltip": "نوم جايا نوم ديار بگرد", "search-result-size": "$1 ({{PLURAL:$2|1 کلیمه|$2 کلیمه یا}})", "search-result-category-size": "{{PLURAL:$1|1 أندوم|$1 أندومیا}} ({{PLURAL:$2|1 زیردأسە|$2 زیردأسە یا}}، {{PLURAL:$3|1 جانیا|$3 جانیایا}}", - "search-redirect": "(ورگشتن $1)", + "search-redirect": "(ۋورگشتن سی $1)", "search-section": "(بهرجا $1)", "search-category": "(دسه $1)", "search-file-match": "(یکی کردن مینونه جانیا)", @@ -1171,7 +1171,7 @@ "rcshowhidecategorization": "جأرغە کاری بألگە $1", "rcshowhidecategorization-show": "نئشوٙ دأئن", "rcshowhidecategorization-hide": "قام کئردئن", - "rclinks": "آخرین آلشتیا $1 نشو بیه د اخرین روزیا $2", + "rclinks": "آخرین آلشتیا $1 د آخرین رۊزیا دیاری بٱک $2", "diff": "فأرخ", "hist": "ڤیرگار", "hide": "قام کئردئن", @@ -1181,8 +1181,6 @@ "boteditletter": "ب", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]", - "rc_categories": "جأرغە یا نە مأدوٙد کو(ڤا \"|\" جئگا بان)", - "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} ناٛها آلشتکاری", "newsectionsummary": "/* $1 */ بهرجا تازه", @@ -2237,7 +2235,7 @@ "tooltip-pt-logout": "د سامونه دراومائن", "tooltip-pt-createaccount": "شما تشویق بییته که یه گل حساو راست بکیت و بیایت وامین؛ د هر جور ای کار اژباری نئ", "tooltip-ca-talk": "قسه دباره مینونه بلگه", - "tooltip-ca-edit": "شما تونيد ای بلگه نه ويرايشت بكيد. لطف بكيد دگمه پيش ديئن پيش د اماییه کردن نه وه کار بیئریت", + "tooltip-ca-edit": "ۋیرایشت ای بلگٱ", "tooltip-ca-addsection": "د یه گل بهرجا هنی شرو بک", "tooltip-ca-viewsource": "ای بلگه پر و پیم بيه.\nشما تونيت سرچمه ش بئوينيت", "tooltip-ca-history": "دوواره ديئن ای بلگه", @@ -2263,7 +2261,7 @@ "tooltip-t-recentchangeslinked": "آلشتیا تازه باو مئن بلگيايي كه د ای بلگه هوم پیوند بيئنه", "tooltip-feed-rss": "هوال حون آر اس اس سی ای بلگه", "tooltip-feed-atom": "حوال هون اتمی سی ای بلگه", - "tooltip-t-contributions": "یه نوم گه د هومیاریا ای کارور", + "tooltip-t-contributions": "یاٛ گاٛل سیائٱ هومیاری سی {{GENDER:$1|ای کاریار}}", "tooltip-t-emailuser": "سی ای كارور ايميل كل كو", "tooltip-t-info": "دونسمنیا بیشتر دباره ای بلگه", "tooltip-t-upload": "سوارکردن جانیایا", @@ -2273,7 +2271,7 @@ "tooltip-ca-nstab-main": "ديئن مینونه بلگه", "tooltip-ca-nstab-user": "ديئن بلگه کاریار", "tooltip-ca-nstab-media": "دیئن بلگه وارسگر", - "tooltip-ca-nstab-special": "اي بلگه ويجه يه، شما نتونيت خود اي بلگه نه ويرايشت بكيد", + "tooltip-ca-nstab-special": "یٱ یاٛ گاٛل بلگٱ ۋیجٱ یٱ؛ نبۊٱ ۋیرایشتش بٱکیت", "tooltip-ca-nstab-project": "ديئن بلگه پروجه", "tooltip-ca-nstab-image": "ديئن بلگه جانیا", "tooltip-ca-nstab-mediawiki": "دیئن پیغوم سامونه", @@ -2313,7 +2311,7 @@ "spam_reverting": "واگردونی وه آخری نسقه ای که هوم پیوندی وه $1 ناره.", "spam_blanking": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن حالی بوئن", "spam_deleting": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن پاکساگری بوئن", - "simpleantispam-label": "وارسی ضد اسپم.\nای \"جاگه\" نه پر نکیت!", + "simpleantispam-label": "ۋارسی ری ۋ ری کاری اٛسپم.\nای \"جاگٱ\" نٱ پور نٱکیت!", "pageinfo-title": "دونسمنیا سی \"$1\"", "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.", "pageinfo-header-basic": "دونسمنیا پایه", @@ -2393,7 +2391,7 @@ "file-info-size": "$1 × $2 پیکسل, انازه فایل: $3, MIME نوع: $4", "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}", "file-nohires": "عسك ون بالاتري دش ني", - "svg-long-desc": "اس وی جی جانیا.نومن $1 $2 پيكسل $1", + "svg-long-desc": "جانیا اٛس ۋی جی, نومی $1 × $2 پیکسل, ٱنازٱ جانیا: $3", "svg-long-desc-animated": "جانیا جمشدار اس وی جی .نومنا $1 × $2 پيكسل،انازه جانیا:$3", "svg-long-error": "جانیا اس وی جی نامعتور:$1", "show-big-image": "جانیا اصلی", diff --git a/languages/i18n/lt.json b/languages/i18n/lt.json index d4b1f93a71..873c63c118 100644 --- a/languages/i18n/lt.json +++ b/languages/i18n/lt.json @@ -546,11 +546,11 @@ "botpasswords-insert-failed": "Nepavyko pridėti boto vardo \"$1\". Gal jis jau pridėtas?", "botpasswords-update-failed": "Nepavyko atnaujinti boto vardo \"$1\". Gal jis buvo ištrintas?", "botpasswords-created-title": "Boto slaptažodis sukurtas", - "botpasswords-created-body": "Naudotojo $2 boto „$1“ slaptažodis buvo sukurtas.", + "botpasswords-created-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo sukurtas.", "botpasswords-updated-title": "Boto slaptažodis atnaujintas", - "botpasswords-updated-body": "Naudotojo $2 boto „$1“ slaptažodis buvo atnaujintas.", + "botpasswords-updated-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo atnaujintas.", "botpasswords-deleted-title": "Boto slaptažodis ištrintas", - "botpasswords-deleted-body": "Naudotojo $2 boto „$1“ slaptažodis buvo ištrintas.", + "botpasswords-deleted-body": "{{GENDER:$2|Naudotojo|Naudotojos}} $2 boto „$1“ slaptažodis buvo ištrintas.", "botpasswords-newpassword": "Naujas slaptažodis prisijungimui su $1 yra $2. Prašome įsiminti jį naudojimui ateityje.", "botpasswords-no-provider": "BotPasswordsSessionProvider nėra prieinamas.", "botpasswords-restriction-failed": "Boto slaptažodžio apribojimai draudžia šį prisijungimą.", @@ -677,7 +677,7 @@ "userinvalidcssjstitle": "'''Dėmesio:''' Nėra jokios išvaizdos „$1“. Nepamirškite, kad savo .css ir .js puslapiai naudoja pavadinimą mažosiomis raidėmis, pvz., {{ns:user}}:Foo/vector.css, o ne {{ns:user}}:Foo/Vector.css.", "updated": "(Atnaujinta)", "note": "'''Pastaba:'''", - "previewnote": "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''", + "previewnote": "Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!", "continue-editing": "Eiti į redagavimo sritį", "previewconflict": "Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.", "session_fail_preview": "'''Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.\nPrašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''", @@ -1457,8 +1457,6 @@ "newpageletter": "N", "boteditletter": "a", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|stebintis naudotojas|stebintys naudotojai|stebinčių naudotojų}}]", - "rc_categories": "Riboti kategorijoms (atskirkite su „|“)", - "rc_categories_any": "Bet kuris iš pasirinktųjų", "rc-change-size-new": "$1 {{PLURAL:$1|baitas|baitai|baitų}} po pakeitimo", "newsectionsummary": "/* $1 */ naujas skyrius", "rc-enhanced-expand": "Rodyti detales", @@ -2502,7 +2500,7 @@ "delete_and_move_text": "Paskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?", "delete_and_move_confirm": "Taip, trinti puslapį", "delete_and_move_reason": "Ištrinta dėl perkėlimo iš \"[[$1]]\"", - "selfmove": "Šaltinio ir paskirties pavadinimai yra tokie patys; negalima pervardinti puslapio į save.", + "selfmove": " Pavadinimai yra tokie patys; negalima pervardyti puslapio į save.", "immobile-source-namespace": "Negalima perkelti puslapių vardų srityje „$1“", "immobile-target-namespace": "Perkelti puslapius į „$1“ vardų sritį negalima", "immobile-target-namespace-iw": "Tarprojektinė nuoroda yra neleistina paskirtis perkelti puslapį.", @@ -3828,6 +3826,7 @@ "rawhtml-notallowed": "<html> negali būti naudojamos ne normaliuose puslapiuose.", "gotointerwiki": "Išeinama iš {{SITENAME}}", "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas.", + "undelete-cantedit": "Negalite atkurti šio puslapio, nes jums neleidžiama redaguoti šio puslapio.", "pagedata-title": "Puslapio duomenys", "pagedata-bad-title": "Negalimas pavadinimas: $1." } diff --git a/languages/i18n/lus.json b/languages/i18n/lus.json index 3130025916..c68c6671c1 100644 --- a/languages/i18n/lus.json +++ b/languages/i18n/lus.json @@ -761,8 +761,6 @@ "newpageletter": "T", "boteditletter": "k", "number_of_watching_users_pageview": "[$1 hmangtu {{PLURAL:$1||te}} vil mék]", - "rc_categories": "Pawla bithliahna (\"|\" hmangin kárdan rawh)", - "rc_categories_any": "Väi", "rc-change-size-new": "Tihdanglam hnuah {{PLURAL:$1|bait|bait}} $1", "newsectionsummary": "/* $1 */ hläwm thar", "rc-enhanced-expand": "Tilang kim rawh (JavaScript a ngai)", diff --git a/languages/i18n/lv.json b/languages/i18n/lv.json index ff62ec0b1b..96c7c6513e 100644 --- a/languages/i18n/lv.json +++ b/languages/i18n/lv.json @@ -1245,8 +1245,6 @@ "newpageletter": "J", "boteditletter": "b", "number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]", - "rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):", - "rc_categories_any": "Jebkas no izvēlētā", "rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām", "newsectionsummary": "/* $1 */ jauna sadaļa", "rc-enhanced-expand": "Skatīt detaļas", diff --git a/languages/i18n/lzh.json b/languages/i18n/lzh.json index 95d230f07a..e121124087 100644 --- a/languages/i18n/lzh.json +++ b/languages/i18n/lzh.json @@ -1048,7 +1048,6 @@ "newpageletter": "新", "boteditletter": "僕", "number_of_watching_users_pageview": "[放有$1哨]", - "rc_categories_any": "任", "rc-change-size-new": "既纂,本文有$1字節", "newsectionsummary": "/* $1 */ 新節", "rc-enhanced-expand": "示細", diff --git a/languages/i18n/lzz.json b/languages/i18n/lzz.json index 280eefa317..c1f7582b1b 100644 --- a/languages/i18n/lzz.json +++ b/languages/i18n/lzz.json @@ -345,7 +345,6 @@ "minoreditletter": "çʼ", "newpageletter": "A", "boteditletter": "b", - "rc_categories_any": "Çkar", "rc-enhanced-expand": "Detayepe ko3ʼiri (JavaScript-i unon)", "rc-enhanced-hide": "Detayepe doşinaxi", "recentchangeslinked": "Alakʼali na renan oktirobape", diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json index fc89c73314..f76bfc0628 100644 --- a/languages/i18n/mai.json +++ b/languages/i18n/mai.json @@ -1276,8 +1276,6 @@ "boteditletter": "ब", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 ध्यान राखैवाला {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}]", - "rc_categories": "श्रेणीसभ धरि सीमीत राखी (\"|\" सँ अलग करी)", - "rc_categories_any": "कोनो भी चुनिन्दा", "rc-change-size": "$1", "rc-change-size-new": "परिवर्तनक बाद $1 {{PLURAL:$1|बाइट}}", "newsectionsummary": "/* $1 */ नव अनुभाग", diff --git a/languages/i18n/map-bms.json b/languages/i18n/map-bms.json index e07c525e4e..72dcde6086 100644 --- a/languages/i18n/map-bms.json +++ b/languages/i18n/map-bms.json @@ -979,8 +979,6 @@ "minoreditletter": "c", "newpageletter": "A", "boteditletter": "b", - "rc_categories": "Batesi gutul kategori (dipisah karo \"|\")", - "rc_categories_any": "Apa baen", "newsectionsummary": "/* $1 */ bagiyan anyar", "rc-enhanced-expand": "Tidokna detile (merlokna JavaScript)", "rc-enhanced-hide": "Umpetna rincian", diff --git a/languages/i18n/mdf.json b/languages/i18n/mdf.json index 21121e9dce..33f6892a5c 100644 --- a/languages/i18n/mdf.json +++ b/languages/i18n/mdf.json @@ -846,8 +846,6 @@ "newpageletter": "О", "boteditletter": "р", "number_of_watching_users_pageview": "[$1 ваны {{PLURAL:$1|тии|тиихть}}]", - "rc_categories": "Аньцек категориеста (явфтомс \"|\" вельде)", - "rc_categories_any": "Эрь кодама", "newsectionsummary": "/* $1 */ од пялькс", "rc-enhanced-expand": "Няфтемс анцяйнятне (эряви JavaScript)", "rc-enhanced-hide": "Кяшемс анцяйнятне", diff --git a/languages/i18n/mg.json b/languages/i18n/mg.json index 2a527db2f7..c775763470 100644 --- a/languages/i18n/mg.json +++ b/languages/i18n/mg.json @@ -1347,8 +1347,6 @@ "newpageletter": "V", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|mpikambana|mpikambana}} manara-maso]", - "rc_categories": "Ferana amin'ireto sokajy ireto (saraho amin'ny \"|\")", - "rc_categories_any": "Anisan'ireo nofidiana", "rc-change-size-new": "$1{{PLURAL:}} oktety taorian'ny fanovana", "newsectionsummary": "/* $1 */ fizarana vaovao", "rc-enhanced-expand": "Hijery ny antsipirihany", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 4069ec05e0..88b8dbda14 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -1469,8 +1469,6 @@ "newpageletter": "Н", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник што набљудува|корисници што набљудуваат}}]", - "rc_categories": "Само од категории (одделувајќи со „|“):", - "rc_categories_any": "Било која од избраните", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајти}} по промената", "newsectionsummary": "/* $1 */ ново заглавие", @@ -2630,6 +2628,7 @@ "thumbnail_dest_directory": "Целниот именик не може да се создаде", "thumbnail_image-type": "Неподдржан тип на слика", "thumbnail_gd-library": "Нецелосни поставки на графичката библиотека: недостасува функцијата $1", + "thumbnail_image-size-zero": "Големината на сликата е нула.", "thumbnail_image-missing": "Изгледа дека податотеката недостасува: $1", "thumbnail_image-failure-limit": "Направив премногу обиди ($1 или повеќе) за да ја прикажам минијатурава. Обидете се подоцна.", "import": "Увезување на страници", diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json index d797652f8c..7f068cd96b 100644 --- a/languages/i18n/ml.json +++ b/languages/i18n/ml.json @@ -1406,8 +1406,6 @@ "boteditletter": "(യ.)", "unpatrolledletter": "(!)", "number_of_watching_users_pageview": "[{{PLURAL:$1|ഒരു ഉപയോക്താവ്|$1 ഉപയോക്താക്കൾ}} ഈ താൾ ശ്രദ്ധിക്കുന്നുണ്ട്]", - "rc_categories": "വർഗ്ഗങ്ങളുടെ പരിധി (\"|\" ഉപയോഗിച്ച് പിരിക്കുക):", - "rc_categories_any": "തിരഞ്ഞെടുത്തതിൽ ഏതെങ്കിലും", "rc-change-size-new": "മാറ്റത്തിനു ശേഷം {{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റുകൾ}}", "newsectionsummary": "/* $1 */ പുതിയ ഉപവിഭാഗം", "rc-enhanced-expand": "അധികവിവരങ്ങൾ പ്രദർശിപ്പിക്കുക", @@ -3455,7 +3453,9 @@ "htmlform-user-not-exists": "$1 നിലവിലില്ല.", "htmlform-user-not-valid": "$1 സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.", "logentry-delete-delete": "$3 എന്ന താൾ $1 {{GENDER:$2|മായ്ച്ചിരിക്കുന്നു}}", + "logentry-delete-delete_redir": " $3 എന്ന തിരിച്ചുവിടൽ, $1, മുകളിൽ ചേർത്തത് വഴി {{GENDER:$2|മായ്‌ച്ചിരിക്കുന്നു}}", "logentry-delete-restore": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}} ($4)", + "logentry-delete-restore-nocount": "$3 എന്ന താൾ $1 {{GENDER:$2|പുനഃസ്ഥാപിച്ചിരിക്കുന്നു}}", "restore-count-revisions": "{{PLURAL:$1|ഒരു നാൾപ്പതിപ്പ്|$1 നാൾപ്പതിപ്പുകൾ}}", "restore-count-files": "{{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}}", "logentry-delete-event": "$3 എന്ന {{PLURAL:$5|രേഖയിലെ മാറ്റത്തിന്റെ|രേഖയിലെ $5 മാറ്റങ്ങളുടെ}} ദർശനീയത $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}: $4", @@ -3502,7 +3502,7 @@ "logentry-protect-protect-cascade": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4 [നിർഝരിതം]", "logentry-protect-modify": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4", "logentry-protect-modify-cascade": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4 [നിർഝരിതം]", - "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}", + "logentry-rights-rights": "{{GENDER:$6|$3}} എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}", "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}", "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}", "logentry-upload-upload": "$1 $3 {{GENDER:$2|അപ്‌ലോഡ് ചെയ്തു}}", @@ -3523,6 +3523,7 @@ "logentry-tag-update-revision": "$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})", "logentry-tag-update-logentry": "$3 എന്ന താളിന്റെ $5 എന്ന രേഖയിലെ ഉൾപ്പെടുത്തലിൽ ടാഗുകൾ $1 {{GENDER:$2|പുതുക്കി}} ($6 {{PLURAL:$7|ചേർത്തു}}; $8 {{PLURAL:$9|നീക്കംചെയ്തു}})", "rightsnone": "(ഒന്നുമില്ല)", + "rightslogentry-temporary-group": "$1 (താത്കാലികം, $2 വരെ)", "feedback-adding": "താങ്കളുടെ അഭിപ്രായങ്ങൾ താളിലേയ്ക്ക് ചേർക്കുന്നു...", "feedback-back": "പുറകോട്ട്", "feedback-bugcheck": "കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.", @@ -3690,6 +3691,7 @@ "log-action-filter-delete-revision": "നാൾപ്പതിപ്പ് മായ്ക്കൽ", "log-action-filter-import-interwiki": "ട്രാൻസ്‌‌വിക്കി ഇറക്കുമതി", "log-action-filter-import-upload": "എക്സ്.എം.എൽ. അപ്‌ലോഡ് വഴിയുള്ള ഇറക്കുമതി", + "log-action-filter-protect-protect": "സംരക്ഷണം", "log-action-filter-protect-unprotect": "സംരക്ഷണമൊഴിവാക്കൽ", "log-action-filter-protect-move_prot": "സംരക്ഷണം മാറ്റി", "log-action-filter-suppress-event": "രേഖ ഒതുക്കൽ", diff --git a/languages/i18n/mn.json b/languages/i18n/mn.json index dabc353ac1..78ffe439a1 100644 --- a/languages/i18n/mn.json +++ b/languages/i18n/mn.json @@ -1139,8 +1139,6 @@ "newpageletter": "Ш", "boteditletter": "р", "number_of_watching_users_pageview": "[$1 хэрэглэгч харж байна]", - "rc_categories": "Ангиллуудад хязгаарлах (\"|\" тэмдгээр тусгаарлана)", - "rc_categories_any": "Хамаагүй", "rc-change-size-new": "Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}", "newsectionsummary": "/* $1 */ шинэ хэсэг", "rc-enhanced-expand": "Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)", diff --git a/languages/i18n/mr.json b/languages/i18n/mr.json index aa9690c3a9..bd57dcceb1 100644 --- a/languages/i18n/mr.json +++ b/languages/i18n/mr.json @@ -50,7 +50,8 @@ "Nemo bis", "Suyog", "Matma Rex", - "Tiven2240" + "Tiven2240", + "Sureshkhole" ] }, "tog-underline": "दुव्यांचे अधोरेखन:", @@ -905,7 +906,7 @@ "revertmerge": "अविलीन करा", "mergelogpagetext": "एका पानाचा इतिहास इतर पानात टाकून अगदी अलीकडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.", "history-title": "\"$1\" चा संपादन इतिहास", - "difference-title": "\"$1\" च्या विविध उजळण्यांमधील फरक", + "difference-title": "\"$1\" च्या विविध आवृत्यांमधील फरक", "difference-title-multipage": "\"$1\" व \"$2\" या पानांमधला फरक", "difference-multipage": "(पानांमधील फरक)", "lineno": "ओळ $1:", @@ -939,7 +940,7 @@ "searchprofile-articles-tooltip": "$1 मध्ये शोधा", "searchprofile-images-tooltip": "संचिकांसाठी शोधा", "searchprofile-everything-tooltip": "सर्व पाने शोधा (चर्चापानांसहित)", - "searchprofile-advanced-tooltip": "पारंपरित(कस्टम) नामविश्वांमध्ये शोधा", + "searchprofile-advanced-tooltip": "बदलत्या येण्याजोग्या(कस्टम) नामविश्वांमध्ये शोधा", "search-result-size": "$1 ({{PLURAL:$2|१ शब्द|$2 शब्द}})", "search-result-category-size": "{{PLURAL:$1|१ सदस्य|$1 सदस्य}} ({{PLURAL:$2|१ उपवर्ग|$2 उपवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})", "search-redirect": "($1 पासून पुनर्निर्देशन)", @@ -1297,7 +1298,7 @@ "recentchanges-label-newpage": "या संपादनाने नवीन पान तयार झाले", "recentchanges-label-minor": "हे एक किरकोळ संपादन आहे", "recentchanges-label-bot": "हे संपादन एका सांगकाम्याकडून केले गेले आहे", - "recentchanges-label-unpatrolled": "हे संपादन अजून तपासल्या गेले नाही", + "recentchanges-label-unpatrolled": "हे संपादन अजून तपासले गेले नाही", "recentchanges-label-plusminus": "या पानाचा आकार इतक्या बाइटस् ने बदलला", "recentchanges-legend-heading": "विवरण:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)", @@ -1446,8 +1447,6 @@ "newpageletter": "न.पा.", "boteditletter": "सां.", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]", - "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):", - "rc_categories_any": "निवडल्यापैकी कोणतेही", "rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}", "newsectionsummary": "/* $1 */ नवीन विभाग", "rc-enhanced-expand": "तपशील दाखवा", @@ -2203,7 +2202,7 @@ "undelete-show-file-submit": "होय", "namespace": "नामविश्व:", "invert": "निवडीचा क्रम उलटा करा", - "tooltip-invert": "निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील) पानांचे बदल अदृष्य करण्यासाठी टिचकी मारा", + "tooltip-invert": "निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील) पानांचे बदल लपवण्यासाठी टिचकी मारा", "namespace_association": "सहभागी नामविश्वे", "tooltip-namespace_association": "निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा", "blanknamespace": "(मुख्य)", @@ -2238,7 +2237,7 @@ "whatlinkshere": "येथे काय जोडले आहे", "whatlinkshere-title": "\"$1\" ला जुळलेली पाने", "whatlinkshere-page": "पान:", - "linkshere": "खालील लेख '''[[:$1]]''' या पानाशी जोडले आहेत:", + "linkshere": "खालील लेख '''[[:$1]]''' या पानांशी जोडले आहेत:", "nolinkshere": "'''[[:$1]]''' येथे कोणत्याही पानांचे दुवे नाहीत.", "nolinkshere-ns": "निवडलेल्या नामविश्वातील कोणतीही पाने [[:$1]]ला दुवा देत नाहीत .", "isredirect": "पुनर्निर्देशित पान", diff --git a/languages/i18n/ms.json b/languages/i18n/ms.json index 660dc872af..74271ebd03 100644 --- a/languages/i18n/ms.json +++ b/languages/i18n/ms.json @@ -1295,8 +1295,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 pemantau]", - "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")", - "rc_categories_any": "Mana-mana yang terpilih", "rc-change-size": "$1", "rc-change-size-new": "$1 bait selepas perubahan", "newsectionsummary": "/* $1 */ bahagian baru", diff --git a/languages/i18n/mt.json b/languages/i18n/mt.json index 5202c2e0d8..55f3314684 100644 --- a/languages/i18n/mt.json +++ b/languages/i18n/mt.json @@ -1117,8 +1117,6 @@ "newpageletter": "Ġ", "boteditletter": "b", "number_of_watching_users_pageview": "[osservat minn {{PLURAL:$1|$1 utent|$1 utent}}]", - "rc_categories": "Illimita għall-kategoriji (issepara b' \"|\")", - "rc_categories_any": "Kwalunkwe", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} wara l-modifika", "newsectionsummary": "/* $1 */ sezzjoni ġdida", "rc-enhanced-expand": "Uri d-dettalji", diff --git a/languages/i18n/mwl.json b/languages/i18n/mwl.json index 6729c105a3..8571dbd243 100644 --- a/languages/i18n/mwl.json +++ b/languages/i18n/mwl.json @@ -688,7 +688,6 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "b", - "rc_categories_any": "Qualquiera de ls scolhidos", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} açpuis las altaraçones", "newsectionsummary": "/* $1 */ nuobo cacho", "rc-enhanced-expand": "Amostrar detailhes", diff --git a/languages/i18n/my.json b/languages/i18n/my.json index e78a52faeb..2a2b710199 100644 --- a/languages/i18n/my.json +++ b/languages/i18n/my.json @@ -1037,8 +1037,6 @@ "newpageletter": "အသစ်", "boteditletter": "ဘော့", "number_of_watching_users_pageview": "[စောင့်ကြည့်နေသော အသုံးပြုသူ $1 {{PLURAL:$1|ဦး|ဦး}}]", - "rc_categories": "ကဏ္ဍများအား ကန့်သတ်ရန် (\"|\" ဖြင့် ခွဲခြား):", - "rc_categories_any": "ရွေးချယ်ခံရသော မည်သူမဆို", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ပြောင်းလဲပြီးနောက်", "newsectionsummary": "/* $1 */ အပိုင်းသစ်", "rc-enhanced-expand": "အသေးစိတ် ပြရန်", diff --git a/languages/i18n/myv.json b/languages/i18n/myv.json index 41b957e941..a13b456df7 100644 --- a/languages/i18n/myv.json +++ b/languages/i18n/myv.json @@ -768,7 +768,6 @@ "minoreditletter": "а", "newpageletter": "О", "boteditletter": "б", - "rc_categories_any": "Кочказетнень эйстэ кодамо-понгсь", "rc-change-size-new": "Полавтнемадонть мейле {{PLURAL:$1|байттнэде}}: $1", "newsectionsummary": "/* $1 */ од пелькс", "rc-enhanced-expand": "Невтемс седе ламо тень ланга", diff --git a/languages/i18n/nah.json b/languages/i18n/nah.json index 7776556b43..19efe88db3 100644 --- a/languages/i18n/nah.json +++ b/languages/i18n/nah.json @@ -616,7 +616,6 @@ "newpageletter": "Y", "boteditletter": "T", "number_of_watching_users_pageview": "[$1 tlatequitiltilīlli {{PLURAL:$1|tlachiya|tlachiyah}}]", - "rc_categories_any": "Zāzo in tlaihittalli", "newsectionsummary": "Yancuīc tlahtōltzintli: /* $1 */", "recentchangeslinked": "Tlapatlaliztli tzonhuilizpan", "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan", diff --git a/languages/i18n/nan.json b/languages/i18n/nan.json index 4bec17e307..66a71d2b47 100644 --- a/languages/i18n/nan.json +++ b/languages/i18n/nan.json @@ -9,7 +9,8 @@ "Luuva", "Macofe", "進也", - "Liuxinyu970226" + "Liuxinyu970226", + "Yoxem" ] }, "tog-underline": "Liân-kiat oē té-sûn:", @@ -218,7 +219,7 @@ "pool-timeout": "Chhiau-koè só-tēng ê sî-kan", "pool-queuefull": "Tūi-lia̍t pâi moá ah", "pool-errorunknown": "M̄-chai siáⁿ chhò-gō͘", - "pool-servererror": "無提供系統服務總數的統計。", + "pool-servererror": "Bô thê-kiong hē-thóng ho̍k-bū chóng-sò͘--ê thóng-kè ($1).", "poolcounter-usage-error": "Ēng-hoat chhò-gō͘: $1", "aboutsite": "Koan-hē {{SITENAME}}", "aboutpage": "Project:Koan-hē", @@ -263,7 +264,7 @@ "collapsible-expand": "Hiàn", "confirmable-confirm": "{{GENDER:$1|你}}敢確定唅?", "confirmable-yes": "著啦", - "confirmable-no": "無啦!毋是!", + "confirmable-no": "Bô--lah!", "thisisdeleted": "Khoàⁿ a̍h-sī kiù $1?", "viewdeleted": "Beh khoàⁿ $1?", "restorelink": "{{PLURAL:$1|chi̍t ê thâi-tiàu ê pian-chi̍p|$1 thâi-tiàu ê pian-chi̍p}}", @@ -323,7 +324,7 @@ "formerror": "Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.", "badarticleerror": "Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.", "cannotdelete": "Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng 「$1」 thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)", - "cannotdelete-title": "無法度共\"$1\"這頁刣掉。", + "cannotdelete-title": "Bô-hoat-tō͘ kā \"$1\" chit ia̍h thâi-tiāu.", "delete-hook-aborted": "有設定阻擋刣掉的動作。\n毋閣無其他的解說。", "no-null-revision": "袂當予\"$1\"產生一个空的修訂本。", "badtitle": "M̄-chiâⁿ piau-tê", @@ -354,20 +355,20 @@ "namespaceprotected": "Lí bô khoân-lī kái '''$1''' miâ-khong-kan ê ia̍h", "customcssprotected": "你無受權去改這个 CSS頁,因為這个頁有包括別个用者的個人設定。", "customjsprotected": "你無授權去改這个JavaScript頁,因為這个頁包括別个用者的個人設定。", - "mycustomcssprotected": "你無授權去改這个CSS頁。", - "mycustomjsprotected": "你無授權去改這个JavaScript頁。", - "myprivateinfoprotected": "你無授權改你家己的私人資訊。", - "mypreferencesprotected": "你無授權改你的家己的喜愛設定。", + "mycustomcssprotected": "Lí bô hí-khó lâi kái chit ê CSS ia̍h.", + "mycustomjsprotected": "Lí bô hí-khó lâi kái chit ê Javascript ia̍h.", + "myprivateinfoprotected": "Lí bô hí-khó lâi kái lí ka-tī--ê su-jîn chu-sìn.", + "mypreferencesprotected": "Lí bô hí-khó kái ka-kī--ê iōng-chiá siat-tēng.", "ns-specialprotected": "特殊頁袂得改。", "titleprotected": "這个標題已經予[[User:$1|$1]]保護起來,袂得提來用。\n原因是 $2。", "filereadonlyerror": "因為檔案庫這馬只會使看,所以袂得改 \"$1\"這个檔案。\n鎖檔案庫的管理員講是因為:\"$3\"。", "invalidtitle-knownnamespace": "佇名空間 \"$2\"佮文字\"$3\"的標題袂使得。", "invalidtitle-unknownnamespace": "名空間編號 $1(毋知名)的\"$2\"文字標題袂使用。", "exception-nologin": "Bô teng-ji̍p", - "exception-nologin-text": "請先登入,才有法度看這頁抑對這頁做動作。", - "exception-nologin-text-manual": "請先$1,才有法度看這頁抑對這頁做動作。", + "exception-nologin-text": "Chhiáⁿ seng teng-ji̍p, chiah ū hoat-tō͘ khoàⁿ chit ia̍h iah tùi chit ia̍h chò tōng-chok.", + "exception-nologin-text-manual": "Chhiáⁿ seng $1, chiah ū hoat-tō͘ khoàⁿ chit ia̍h iah tùi chit ia̍h chò tōng-chok.", "virus-badscanner": "設定毋著:你的病毒掃描程式阮毋知:$1", - "virus-scanfailed": "掃病毒無成功(代碼$1)", + "virus-scanfailed": "Sáu pēⁿ-to̍k bô sêng-kong (tāi-bé: $1)", "virus-unknownscanner": "M̄-chai siáⁿ pēⁿ-to̍k:", "logouttext": "'''Lí í-keng teng-chhut.'''\nChhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iáu teng-ji̍p tī leh; che chi-iàu piàⁿ tiāu liû-lám-khì ê khoài-chhú-khu, tiō ē chèng-siông.", "welcomeuser": "Hoan-gêng, $1!", @@ -420,11 +421,11 @@ "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.", "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.", "loginerror": "Teng-ji̍p chhò-gō·", - "createacct-error": "開口座無成功", + "createacct-error": "Khui kháu-chō bô sêng-kong", "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1", "nocookiesnew": "Lí--ê iōng-chiá kháu-chō í-keng khui hó--ah, m̄-koh lí iáu-boē teng-ji̍p.\n{{SITENAME}} ū sái Cookies choè kì-lio̍k teng-ji̍p--ê iōng-chiá.\nLí bô ín-chún iōng Cookies, chhiáⁿ lí seng kā chó͘-tòng the̍h tiāu, chiah koh iōng lí--ê iōng-chiá-miâ kap bi̍t-bé teng-ji̍p.", "nocookieslogin": "{{SITENAME}}有用cookies做記錄用者,毋過你無允準用cookies,等你改做會當了後,才閣試。", - "nocookiesfornew": "因為不明的原因,阮無法度建立用者的口座。\n請先確定你的cookie會使用,閣重進入這頁,閣試一擺。", + "nocookiesfornew": "In-ūi put-bêng--ê goân-in, gún bô-hoat-tō͘ kiàn-li̍p iōng-chiá--ê kháu-chō. Chhiáⁿ seng khak-tēng lí--ê cookie ē-tàng ēng, têng chìn-ji̍p chit ia̍h, koh chhì chi̍t pái.", "noname": "Lí phah--ê iōng-chiá-miâ boē-sái.", "loginsuccesstitle": "Teng-ji̍p sêng-kong", "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".", @@ -512,7 +513,7 @@ "anonpreviewwarning": "Lí bô teng-ji̍p. Nā-sī lí beh pó-chûn, lí--ê IP ūi-chí ē kì-lo̍k tī i--ê siu-kái le̍k-sú lāi-bīn.", "summary-preview": "Khài-iàu ê preview:", "subject-preview": "Ū-lám tê-bo̍k/piau-tê:", - "blockednoreason": "無寫理由", + "blockednoreason": "bô siá lí-iû", "whitelistedittext": "Lí ài $1 chiah ē-sái siu-kái.", "nosuchsectiontitle": "Chhoé bô toān-lo̍h", "loginreqtitle": "Su-iàu Teng-ji̍p", @@ -582,7 +583,7 @@ "histfirst": "Tùi thâu-chêng", "histlast": "Tùi āu-piah", "history-feed-item-nocomment": "$1 tī $2", - "revdel-restore": "改會當看無", + "revdel-restore": "kái ē-tàng khoàⁿ--bô", "revertmerge": "取消合併", "history-title": "\"$1\"--ê le̍k-sú pán-pún", "difference-title": "\"$1\" pán-pún chi-kan bô-kāng--ê tē-hng", @@ -688,7 +689,7 @@ "recentchanges-label-newpage": "Chit ê siu-kái ē sán-seng sin ia̍h", "recentchanges-label-minor": "Che sī sió siu-kái", "recentchanges-label-bot": "Che sī ki-khì-lâng kái--ê", - "recentchanges-label-unpatrolled": "這个編輯抑無巡視過", + "recentchanges-label-unpatrolled": "Chit ê pian-chi̍p iah bô sûn--koè.", "recentchanges-label-plusminus": "Hit ia̍h kái liáu; cheng-chha ê ūi-goân-cho͘", "recentchanges-legend-heading": "Ké-soeh:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])", diff --git a/languages/i18n/nap.json b/languages/i18n/nap.json index 61e4403b25..d8cd8f690b 100644 --- a/languages/i18n/nap.json +++ b/languages/i18n/nap.json @@ -1308,8 +1308,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[osservata 'a {{PLURAL:$1|n'utente|$1 utente}}]", - "rc_categories": "Lemmeta a 'e categurìe (spartute 'a \"|\"):", - "rc_categories_any": "Qualunque d' 'e scigliute", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento", "newsectionsummary": "/* $1 */ sezziona nnova", "rc-enhanced-expand": "Fa vede dettaglie", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index dd522a15a3..276c072b2f 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -1493,8 +1493,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]", - "rc_categories": "Begrens til kategorier (skilletegn: «|»)", - "rc_categories_any": "Alle", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} etter endring", "newsectionsummary": "/* $1 */ ny seksjon", "rc-enhanced-expand": "Vis detaljer", diff --git a/languages/i18n/nds-nl.json b/languages/i18n/nds-nl.json index 02609e6beb..b6211630a0 100644 --- a/languages/i18n/nds-nl.json +++ b/languages/i18n/nds-nl.json @@ -1154,8 +1154,6 @@ "boteditletter": "B", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op n volglieste]", - "rc_categories": "Beparking tot kategorieën (scheien mit \"|\")", - "rc_categories_any": "alles", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao de wieziging", "newsectionsummary": "Niej onderwarp: /* $1 */", "rc-enhanced-expand": "Details bekieken", diff --git a/languages/i18n/nds.json b/languages/i18n/nds.json index 19a85d059e..e71366a665 100644 --- a/languages/i18n/nds.json +++ b/languages/i18n/nds.json @@ -919,8 +919,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[{{PLURAL:$1|Een Bruker|$1 Brukers}}, de oppasst]", - "rc_categories": "Blot Sieden ut de Kategorien (trennt mit „|“):", - "rc_categories_any": "All", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} achter Ännern", "newsectionsummary": "/* $1 */ nee Afsnitt", "rc-enhanced-expand": "Details wiesen (bruukt JavaScript)", diff --git a/languages/i18n/ne.json b/languages/i18n/ne.json index de3b42e286..3a5365709e 100644 --- a/languages/i18n/ne.json +++ b/languages/i18n/ne.json @@ -1236,8 +1236,6 @@ "boteditletter": "बो", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 निगरानी गर्दै{{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ताहरु}}]", - "rc_categories": "श्रेणीहरूमा सीमित (\"|\" ले छुट्याउनुहोस्)", - "rc_categories_any": "छानिएका कुनै", "rc-change-size": "$1", "rc-change-size-new": "परिवर्तनपछि $1 {{PLURAL:$1|बाइट|बाइट}}", "newsectionsummary": "/* $1 */ नयाँ खण्ड", diff --git a/languages/i18n/nl-informal.json b/languages/i18n/nl-informal.json index fc0f1569a1..a6d0fadb89 100644 --- a/languages/i18n/nl-informal.json +++ b/languages/i18n/nl-informal.json @@ -9,7 +9,8 @@ "McDutchie", "Romaine", "Mainframe98", - "Mar(c)" + "Mar(c)", + "Robin van der Vliet" ] }, "view-pool-error": "De servers zijn op het moment helaas overbelast.\nTe veel gebruikers proberen deze pagina te bekijken.\nWacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.\n\n$1", @@ -138,6 +139,7 @@ "prefs-help-variant": "Jouw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.", "prefs-help-signature": "Reacties op de overlegpagina's worden meestal ondertekend met \"~~~~\".\nDe tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.", "badsiglength": "Je ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.", + "gender-unknown": "De software gebruikt waar mogelijk geslachtsneutrale woorden als het over je gaat", "prefs-help-realname": "Echte naam is optioneel.\nAls je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor je werk.", "prefs-help-email": "E-mailadres is optioneel, maar maakt het mogelijk om jou je wachtwoord te e-mailen als je het bent vergeten.", "prefs-help-email-others": "Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index dd8808abb9..48620c4578 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -1530,8 +1530,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op een volglijst]", - "rc_categories": "Beperken tot categorieën (scheiden met een \"|\"):", - "rc_categories_any": "Een van de gekozen", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} na de wijziging", "newsectionsummary": "/* $1 */ nieuwe subkop", "rc-enhanced-expand": "Details weergeven", diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index bf46ac3ea8..ed3f7330c5 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -824,7 +824,7 @@ "textmatches": "Sider med treff på førespurnaden", "notextmatches": "Ingen sider hadde treff på førespurnaden", "prevn": "førre {{PLURAL:$1|$1}}", - "nextn": "neste {{PLURAL:$1|$1}}", + "nextn": "{{PLURAL:$1|neste|neste $1}}", "prev-page": "førre sida", "next-page": "neste side", "prevn-title": "Førre $1 {{PLURAL:$1|resultat|resultat}}", @@ -1265,8 +1265,6 @@ "newpageletter": "n", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|Éin brukar|$1 brukarar}} overvakar]", - "rc_categories": "Avgrens til kategoriar (skil med «|»):", - "rc_categories_any": "Alle", "rc-change-size-new": "$1 {{PLURAL:$1|byte}} etter endringa", "newsectionsummary": "/* $1 */ ny bolk", "rc-enhanced-expand": "Vis detaljar", diff --git a/languages/i18n/oc.json b/languages/i18n/oc.json index 92ea2fc0ef..6d4e26dda6 100644 --- a/languages/i18n/oc.json +++ b/languages/i18n/oc.json @@ -282,6 +282,7 @@ "site-atom-feed": "Flux Atom de $1", "page-rss-feed": "Flux RSS de \"$1\"", "page-atom-feed": "Flux Atom de \"$1\"", + "feed-atom": "Atom", "red-link-title": "$1 (la pagina existís pas)", "sort-descending": "Botar en òrdre creissent", "sort-ascending": "Botar en òrdre descreissent", @@ -441,7 +442,7 @@ "nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.", "nouserspecified": "Vos cal especificar vòstre nom d'utilizaire.", "login-userblocked": "Aqueste utilizaire es blocat. Connexion pas autorizada.", - "wrongpassword": "Lo senhal es incorrècte. Ensajatz tornarmai.", + "wrongpassword": "Lo nom d'utilizaire o lo senhal es incorrècte.\nEnsajatz tornarmai.", "wrongpasswordempty": "Lo senhal picat èra void. Se vos plai, ensajatz tornarmai.", "passwordtooshort": "Vòstre senhal deu conténer al mens {{PLURAL:$1|1 caractèr|$1 caractèrs}}.", "password-name-match": "Vòstre senhal deu èsser diferent de vòstre nom d’utilizaire.", @@ -508,11 +509,11 @@ "botpasswords-bad-appid": "Lo nom del robòt «$1» es pas valid.", "botpasswords-insert-failed": "Fracàs de l’apondon del nom de robòt « $1 ». Es ja estat apondut ?", "botpasswords-created-title": "Senhal de robòts creat", - "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat creat.", + "botpasswords-created-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat creat.", "botpasswords-updated-title": "Senhal de robòts mes a jorn", - "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat mes a jorn.", + "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat mes a jorn.", "botpasswords-deleted-title": "Senhal de robòts suprimit", - "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'utilizaire « $2 » es estat suprimit.", + "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es suprimit.", "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.", "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats", "resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1", @@ -593,7 +594,7 @@ "anoneditwarning": "Atencion : sètz pas connectat.\nVòstra adreça IP serà visibla per tot lo monde se fasètz de modificacions. Se [$1 vos connectatz] o [$2 creatz un compte], vòstras modificacions seràn atribuidas a vòstre nom d’utilizaire, entre autres avantatges.", "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''", "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.", - "missingcommenttext": "Mercé de metre un comentari çaijós.", + "missingcommenttext": "Mercé de metre un comentari.", "missingcommentheader": "Rapèl : Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.", "summary-preview": "Apercebut del resumit de modificacion :", "subject-preview": "Apercebut del subjècte :", @@ -652,7 +653,7 @@ "readonlywarning": "AVERTIMENT : La basa de donadas es estada verrolhada per d'operacions de mantenença. Doncas, poiretz pas publicar vòstras modificacions pel moment.\nL’administrator sistèma qu'an verrolhada la basa de donadas a donat l’explicacion seguenta : $1", "protectedpagewarning": "'''AVERTIMENT : Aquesta pagina es protegida. Sols los utilizaires qu'an l'estatut d'administrator la p�don modificar. ''' La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :", "semiprotectedpagewarning": "'''N�ta:''' Aquesta pagina es estada protegida d'un tal biais que sols los contributors enregistrats la p�scan modificar. La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :", - "cascadeprotectedwarning": "'''ATENCION :''' Aquesta pagina es estada protegida de biais que sols los administrators la pòscan editar perque es transclusa dins {{PLURAL:$1|la pagina protegida seguenta, qu'a|las paginas protegidas seguentas, qu'an}} la « proteccion en cascada » activada :", + "cascadeprotectedwarning": "ATENCION : Aquesta pagina es estada protegida de biais que sols los utilizaires amb [[Special:ListGroupRights|de dreches especifics]] la pòscan modificar perque es inclusa dins {{PLURAL:$1|la pagina protegida seguenta, qu'a|las paginas protegidas seguentas, qu'an}} la « proteccion en cascada » activada :", "titleprotectedwarning": "'''ATENCION : Aquesta pagina es estada protegida de tal biais que de [[Special:ListGroupRights|dreits especifics]] son requesits per la poder crear.''' La darrièra entrada del jornal es afichada çaijós per referéncia :", "templatesused": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} sus aquesta pagina :", "templatesusedpreview": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} dins aquesta previsualizacion :", @@ -923,7 +924,7 @@ "prefs-editwatchlist-clear": "Escafar la lista de seguiment", "prefs-watchlist-days": "Nombre de jorns d'afichar dins la lista de seguiment :", "prefs-watchlist-days-max": "(maximum $1 jorn{{PLURAL:$1||s}})", - "prefs-watchlist-edits": "Nombre de modificacions d'afichar dins la lista de seguiment espandida :", + "prefs-watchlist-edits": "Nombre maximal de modificacions d'afichar dins la lista de seguiment :", "prefs-watchlist-edits-max": "Nombre maximum : 1000", "prefs-watchlist-token": "Geton per la lista de seguiment :", "prefs-misc": "Preferéncias divèrsas", @@ -943,7 +944,7 @@ "recentchangesdays-max": "(maximum $1 {{PLURAL:$1|jorn|jorns}})", "recentchangescount": "Nombre de modificacions d'afichar per defaut :", "prefs-help-recentchangescount": "Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.", - "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\n[[Special:ResetTokens|Clicatz aicí se la vos cal reïnicializar]].", + "prefs-help-watchlist-token2": "Aquí la clau secreta del flux Web de vòstra lista de seguiment.\nTota persona que la coneis poirà legir vòstra lista de seguiment, doncas, la comuniquetz pas.\nSe necessari, [[Special:ResetTokens|clicatz aicí per la reïnicializar]].", "savedprefs": "Las preferéncias son estadas salvadas.", "savedrights": "Los dreits d'utilizaire de {{GENDER:$1|$1}} son estats enregistrats.", "timezonelegend": "Fus orari :", @@ -962,7 +963,7 @@ "timezoneregion-europe": "Euròpa", "timezoneregion-indian": "Ocean Indian", "timezoneregion-pacific": "Ocean Pacific", - "allowemail": "Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires", + "allowemail": "Autorizar los autres utilizaires a me mandar de corrièls", "prefs-searchoptions": "Recèrca", "prefs-namespaces": "Noms d’espacis", "default": "defaut", @@ -1211,6 +1212,7 @@ "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.", "recentchanges-legend-heading": "Legenda :", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).", + "recentchanges-legend-plusminus": "(''±123'')", "recentchanges-submit": "Afichar", "rcfilters-activefilters": "Filtres actius", "rcfilters-hours-title": "Darrièras oras", @@ -1293,8 +1295,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizaire seguent|utilizaires seguents}}]", - "rc_categories": "Limitar a las categorias (separadas per « | ») :", - "rc_categories_any": "Una de las seleccionadas", "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} aprèp cambiament", "newsectionsummary": "/* $1 */ seccion novèla", "rc-enhanced-expand": "Vejatz los detalhs", @@ -2083,7 +2083,7 @@ "sp-contributions-uploads": "impòrts", "sp-contributions-logs": "jornals", "sp-contributions-talk": "Discutir", - "sp-contributions-userrights": "gerir los dreits", + "sp-contributions-userrights": "gerir los dreits d’utilizair{{GENDER:$1|e|a}}", "sp-contributions-blocked-notice": "Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :", "sp-contributions-blocked-notice-anon": "Aquesta adreça IP es actualament blocada.\nLa darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :", "sp-contributions-search": "Cercar las contribucions", @@ -3000,7 +3000,7 @@ "autoredircomment": "Redireccion cap a [[$1]]", "autosumm-new": "Creacion de la pagina amb « $1 »", "autosumm-newblank": "Pagina voida creada", - "size-bytes": "$1 o", + "size-bytes": "$1 {{PLURAL:$1|octet|octets}}", "size-kilobytes": "$1 Ko", "size-megabytes": "$1 Mo", "size-gigabytes": "$1 Go", diff --git a/languages/i18n/or.json b/languages/i18n/or.json index 87afb1efcb..3fbf2c49d3 100644 --- a/languages/i18n/or.json +++ b/languages/i18n/or.json @@ -1211,8 +1211,6 @@ "newpageletter": "ନୂଆ", "boteditletter": "ବଟ", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]", - "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)", - "rc_categories_any": "ଯେ କୌଣସି", "rc-change-size-new": "ବଦଳ ପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟସବୁ}}", "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ", "rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ", diff --git a/languages/i18n/os.json b/languages/i18n/os.json index 1009452c74..f30e77cdcb 100644 --- a/languages/i18n/os.json +++ b/languages/i18n/os.json @@ -906,7 +906,6 @@ "minoreditletter": "ч", "newpageletter": "Н", "boteditletter": "б", - "rc_categories_any": "Кæцы фæнды", "newsectionsummary": "/* $1 */ ног хай", "rc-enhanced-expand": "Лæмбынæг информаци равдисын", "rc-enhanced-hide": "Айсын лæмбынæг информаци", diff --git a/languages/i18n/pa.json b/languages/i18n/pa.json index a3fad6037e..2460fdc48e 100644 --- a/languages/i18n/pa.json +++ b/languages/i18n/pa.json @@ -1067,7 +1067,6 @@ "newpageletter": "ਨ", "boteditletter": "ਬੋਟ", "number_of_watching_users_pageview": "[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]", - "rc_categories_any": "ਚੁਣੇ ਹੋਇਅਾਂ ਵਿੱਚੋਂ ਕੋਈ ਵੀ", "rc-change-size-new": "$1 {{PLURAL:$|ਬਾਈਟ|ਬਾਈਟਾਂ}} ਤਬਦੀਲੀ ਤੋਂ ਬਾਅਦ", "newsectionsummary": "/* $1 */ ਨਵਾਂ ਭਾਗ", "rc-enhanced-expand": "ਵੇਰਵੇ ਵੇਖਾਓ", diff --git a/languages/i18n/pam.json b/languages/i18n/pam.json index e75d87d399..21f57d3ef7 100644 --- a/languages/i18n/pam.json +++ b/languages/i18n/pam.json @@ -723,8 +723,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 lalbe {{PLURAL:$1|talagamit|talagamit}}]", - "rc_categories": "Angganan/limitasiun da reng kategoriya (pikawani la king \"|\")", - "rc_categories_any": "Andyang sanu", "newsectionsummary": "/* $1 */ bayung seksiyon/dake", "rc-enhanced-expand": "Pakit la reng detalle (mangailangan yang JavaScript)", "rc-enhanced-hide": "Isalikut la reng detalle", diff --git a/languages/i18n/pdc.json b/languages/i18n/pdc.json index 4f526d1dcd..97b14273bb 100644 --- a/languages/i18n/pdc.json +++ b/languages/i18n/pdc.json @@ -383,7 +383,6 @@ "minoreditletter": "g", "newpageletter": "N", "boteditletter": "W", - "rc_categories_any": "All", "rc-change-size-new": "$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering", "newsectionsummary": "Neier Abschnitt /* $1 */", "recentchangeslinked": "Was on verlinkde Bledder geduh warre iss", diff --git a/languages/i18n/pfl.json b/languages/i18n/pfl.json index f5807e4024..fd24862d4b 100644 --- a/languages/i18n/pfl.json +++ b/languages/i18n/pfl.json @@ -644,8 +644,6 @@ "minoreditletter": "k", "newpageletter": "N", "boteditletter": "B", - "rc_categories": "Oigschrengd uff Sachgrubbe (abgdeeld middm \"|\")", - "rc_categories_any": "Ebbes", "rc-change-size-new": "$1 {{PLURAL:$1|Byte}} nochde Ännarung", "rc-enhanced-expand": "Änzlhaide zaische", "rc-enhanced-hide": "Oagawe vaschdeggle", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index f602865ca4..b6bff28368 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -94,7 +94,8 @@ "Kastanoto", "Sebek Adamowicz", "Cholewka", - "Ankam" + "Ankam", + "Anwar2" ] }, "tog-underline": "Podkreślenie linków:", @@ -792,6 +793,7 @@ "postedit-confirmation-created": "Strona została utworzona.", "postedit-confirmation-restored": "Strona została przywrócona.", "postedit-confirmation-saved": "Twoja edycja została zapisana.", + "postedit-confirmation-published": "Twoja edycja została opublikowana.", "edit-already-exists": "Nie udało się stworzyć nowej strony.\nStrona już istnieje.", "defaultmessagetext": "Domyślny tekst komunikatu", "content-failed-to-parse": "Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3", @@ -1363,6 +1365,7 @@ "recentchanges-legend": "Opcje ostatnich zmian", "recentchanges-summary": "Ta strona przedstawia historię ostatnich zmian w tej wiki.", "recentchanges-noresult": "Brak zmian w wybranym okresie spełniających twoje kryteria.", + "recentchanges-timeout": "To wyszukiwanie przekroczyło limit czasu. Możesz spróbować z innymi parametrami wyszukiwania.", "recentchanges-network": "Z powodu błędu technicznego nie można załadować żadnych wyników. Spróbuj odświeżyć stronę.", "recentchanges-notargetpage": "Wprowadź powyżej nazwę strony, aby zobaczy zmiany związane z tą stroną.", "recentchanges-feed-description": "Obserwuj najświeższe zmiany w tej wiki.", @@ -1535,8 +1538,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|obserwujący użytkownik|obserwujących użytkowników}}]", - "rc_categories": "Ogranicz do kategorii (oddzielaj za pomocą „|”)", - "rc_categories_any": "Dowolna z wybranych", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtów}} po zmianie", "newsectionsummary": "/* $1 */ nowa sekcja", "rc-enhanced-expand": "Pokaż szczegóły", @@ -1630,7 +1631,7 @@ "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.", "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.", "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń $1=\"$2\" jest niedozwolone w plikach SVG.", - "uploaded-href-attribute-svg": "atrybuty href w plikach SVG mogą linkować tylko do celów z http:// lub https://, znaleziono <$1 $2=\"$3\">.", + "uploaded-href-attribute-svg": "Elementy mogą tylko łączyć (href) z danymi: (wbudowany plik), http: // lub https: // lub fragmentami (#, ten sam-dokument) obiektami docelowymi. W przypadku innych elementów, takich jak , dozwolone są tylko dane: i fragment. Spróbuj osadzać obrazy podczas eksportowania SVG. Znaleziono & lt; 1 $ 2 $ = \"$ 3\" & gt; .", "uploaded-href-unsafe-target-svg": "Znaleziono atrybut href kierujący do niebezpiecznych danych: cel URI <$1 $2=\"$3\"> w przesłanym pliku SVG.", "uploaded-animate-svg": "Znaleziono znacznik \"animate\", który może zmieniać atrybut href, przy użyciu atrybutu \"from\" <$1 $2=\"$3\"> w przesłanym pliku SVG.", "uploaded-setting-event-handler-svg": "Ustawianie atrybutów obsługi zdarzeń jest zablokowane, znaleziono <$1 $2=\"$3\"> w przesyłanym pliku SVG.", @@ -1720,7 +1721,7 @@ "lockmanager-fail-closelock": "Nie można znieść blokady z pliku \"$1\".", "lockmanager-fail-deletelock": "Nie można usunąć blokady z pliku \"$1\".", "lockmanager-fail-acquirelock": "Nie można ustawić blokady dla pliku \"$1\".", - "lockmanager-fail-openlock": "Nie można znieść blokady z pliku \"$1\".", + "lockmanager-fail-openlock": "Nie można otworzyć pliku blokady dla \"$1\". Upewnij się, że katalog przesyłania jest poprawnie skonfigurowany, a twój serwer internetowy ma uprawnienia do zapisu w tym katalogu. Więcej informacji można znaleźć na stronie https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory.", "lockmanager-fail-releaselock": "Nie może zwolnić blokady dla \" $1 \".", "lockmanager-fail-db-bucket": "Nie można powiązać wystarczającej ilości zablokowanych baz danych w segmencie $1 .", "lockmanager-fail-db-release": "Nie udało się zwolnić blokad w bazie danych $1.", @@ -1742,11 +1743,16 @@ "uploadstash-bad-path": "Ścieżka nie istnieje.", "uploadstash-bad-path-invalid": "Ścieżka jest nieprawidłowa.", "uploadstash-bad-path-unknown-type": "Nieznany typ „$1”.", + "uploadstash-bad-path-unrecognized-thumb-name": "Nierozpoznana nazwa miniaturki.", + "uploadstash-bad-path-no-handler": "Nie znaleziono obsługi dla typu mime 1 $ pliku $2.", + "uploadstash-bad-path-bad-format": "Klucz \"$1\" nie jest w odpowiednim formacie.", + "uploadstash-file-not-found": "Klucz \"$1\" nie został znaleziony w schowku.", "uploadstash-file-not-found-no-thumb": "Nie można uzyskać miniaturki.", "uploadstash-file-not-found-no-local-path": "Brak lokalnej ścieżki dla skalowanego elementu.", "uploadstash-file-not-found-no-object": "Nie można utworzyć lokalnego obiektu pliku dla miniatury.", "uploadstash-file-not-found-no-remote-thumb": "Nie udało się pobrać miniatury: $1\nURL = $2", "uploadstash-file-not-found-missing-content-type": "Brakuje nagłówka content-type.", + "uploadstash-file-not-found-not-exists": "Nie można znaleźć ścieżki ani zwykłego pliku.", "uploadstash-file-too-large": "Nie można wyświetlić pliku większego niż $1 bajtów.", "uploadstash-not-logged-in": "Użytkownik nie jest zalogowany, a pliki muszą należeć do użytkowników.", "uploadstash-wrong-owner": "Ten plik ($1) nie należy do bieżącego użytkownika.", diff --git a/languages/i18n/pms.json b/languages/i18n/pms.json index 9f03ec0abc..9644648db6 100644 --- a/languages/i18n/pms.json +++ b/languages/i18n/pms.json @@ -1173,8 +1173,6 @@ "newpageletter": "N", "boteditletter": "t", "number_of_watching_users_pageview": "[tnùa sot-euj da {{PLURAL:$1|n'utent|$1 utent}}]", - "rc_categories": "Limité a le categorìe (che a jë scriva separand-je antra 'd lor con un \"|\"):", - "rc_categories_any": "Un-a qualsëssìa ëd cole selessionà", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apress ij cambi", "newsectionsummary": "/* $1 */ session neuva", "rc-enhanced-expand": "Mostré ij detaj", diff --git a/languages/i18n/pnb.json b/languages/i18n/pnb.json index d4a025f25c..985ec4198a 100644 --- a/languages/i18n/pnb.json +++ b/languages/i18n/pnb.json @@ -117,7 +117,7 @@ "oct": "اکتوبر", "nov": "نومبر", "dec": "دسمبر", - "january-date": "جنوری $1", + "january-date": "جنوری", "february-date": "فروری $1", "march-date": "مارچ $1", "april-date": "اپریل $1", @@ -684,7 +684,7 @@ "history-title": "\"$1\" دا ریکارڈ", "difference-title": "\"$1\" دیاں دہرائیاں وچ وکھراپا", "difference-multipage": "(صفیاں چ فرق)", - "lineno": "لیک $1:", + "lineno": "لیک 1:", "compareselectedversions": "چنے صفحے آپنے سامنے کرو", "showhideselectedversions": "وکھاؤ/لکاؤ چنیاں دہرائیاں", "editundo": "واپس", @@ -997,8 +997,6 @@ "newpageletter": "نواں", "boteditletter": "بوٹ", "number_of_watching_users_pageview": "[ $1 ویکھ رہیا اے{{PLURAL:$1|ورتن والا|والے}}]", - "rc_categories": "گٹھاں دی حد (وکھرے کرو \"|\")", - "rc_categories_any": "کوئی", "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹاں}} تبدیلی مگروں", "newsectionsummary": "/* $1 */ نواں پاسہ", "rc-enhanced-expand": "تفضیل وکھاؤ (جاوا سکرپٹ چائیدا اے)", diff --git a/languages/i18n/pnt.json b/languages/i18n/pnt.json index bd423a5337..c28659a8cf 100644 --- a/languages/i18n/pnt.json +++ b/languages/i18n/pnt.json @@ -491,7 +491,6 @@ "minoreditletter": "μ", "newpageletter": "Ν", "boteditletter": "b", - "rc_categories_any": "Κάθαν", "rc-enhanced-expand": "Δείξον λεπτομέρειας (θελ' JavaScript)", "rc-enhanced-hide": "Κρύψον λεπτομέρειας", "recentchangeslinked": "Σχετικά αλλαγάς", diff --git a/languages/i18n/prg.json b/languages/i18n/prg.json index a24b37de9d..f1e170f69d 100644 --- a/languages/i18n/prg.json +++ b/languages/i18n/prg.json @@ -781,8 +781,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|nadirīnts tērpautajs|nadirīntei tērpautajai}}]", - "rc_categories": "Arāikinais prei kategōrijan (izsklaitinnais sen \"|\")", - "rc_categories_any": "Wisāi", "newsectionsummary": "/* $1 */ naunā sekciōni", "rc-enhanced-expand": "Waidinnais malkans (izkīnina JavaScript)", "rc-enhanced-hide": "Kliptinais malkans", diff --git a/languages/i18n/ps.json b/languages/i18n/ps.json index ab90f28e55..a6c4a99616 100644 --- a/languages/i18n/ps.json +++ b/languages/i18n/ps.json @@ -1330,8 +1330,6 @@ "boteditletter": "ر", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]", - "rc_categories": "د وېشنيزو تر بريده (په \"|\" بېلول)", - "rc_categories_any": "له ټاکل شويو هر يو", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته", "newsectionsummary": "/* $1 */ نوې برخه", diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index b88d805853..d75932d2a3 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -1558,8 +1558,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 usuário|$1 usuários}} vigiando]", - "rc_categories": "Limitar às categorias (separar com \"|\"):", - "rc_categories_any": "Qualquer um dos escolhidos", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após alterações", "newsectionsummary": "/* $1 */ nova seção", "rc-enhanced-expand": "Exibir detalhes", @@ -2714,6 +2712,7 @@ "thumbnail_dest_directory": "Não foi possível criar o diretório de destino", "thumbnail_image-type": "Tipo de imagem não suportado", "thumbnail_gd-library": "Configuração da biblioteca GD incompleta: função $1 não encontrada", + "thumbnail_image-size-zero": "O tamanho do arquivo de imagem parece ser zero.", "thumbnail_image-missing": "Arquivo aparentemente inexistente: $1", "thumbnail_image-failure-limit": "Houveram muitas tentativas falhas recentemente ($1 ou mais) de criação desta miniatura. Por favor, tente novamente mais tarde.", "import": "Importar páginas", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index a2728273bd..8a34f80070 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -1532,8 +1532,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 utilizador|$1 utilizadores}} a vigiar]", - "rc_categories": "Limitar às categorias (separar com \"|\"):", - "rc_categories_any": "Qualquer dos escolhidos", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança", "newsectionsummary": "/* $1 */ nova secção", "rc-enhanced-expand": "Mostrar detalhes", @@ -2687,6 +2685,7 @@ "thumbnail_dest_directory": "Não foi possível criar o diretório de destino", "thumbnail_image-type": "Tipo de imagem não suportado", "thumbnail_gd-library": "Configuração da biblioteca GD incompleta: função $1 em falta", + "thumbnail_image-size-zero": "O tamanho do ficheiro de imagem parece ser zero.", "thumbnail_image-missing": "Ficheiro em falta: $1", "thumbnail_image-failure-limit": "Ocorreram demasiadas tentativas recentes ($1 ou mais) de criação desta miniatura. Tente novamente mais tarde, por favor.", "import": "Importar páginas", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index c92d7051eb..ec41d37cc1 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -195,7 +195,8 @@ "Wladek92", "Gombang", "Trizek (WMF)", - "Acamicamacaraca" + "Acamicamacaraca", + "Avatar6" ] }, "sidebar": "{{notranslate}}", @@ -1719,8 +1720,6 @@ "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".", "number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching", "number_of_watching_users_pageview": "Used if $wgPageShowWatchingUsers is true.\n* $1 - number of watching user(s)", - "rc_categories": "A label of an input box. Appears on Special:RecentChanges if filtering recent changes by category is enabled (that is, $wgAllowCategorizedRecentChanges is set to true).", - "rc_categories_any": "Appears ''after'' the input box the label of which is {{msg-mw|rc_categories}}, which appears on [[Special:RecentChanges]], if $wgAllowCategorizedRecentChanges is true. \"Chosen\" refers to categories.", "rc-change-size": "{{optional}}\nDoes not work under $wgMiserMode ([[mwr:48986|r48986]]).\n\nParameters:\n* $1 - size of diff", "rc-change-size-new": "Tooltip when hovering a change list diff size. Parameters:\n* $1 - the resulting new size (in bytes)", "newsectionsummary": "Default summary when adding a new section to a page. Parameters:\n* $1 - section title", @@ -2959,6 +2958,7 @@ "thumbnail_dest_directory": "Used as thumbnail error message.\n\nSee also:\n* {{msg-mw|Thumbnail error}}\n* {{msg-mw|Thumbnail-temp-create}}\n* {{msg-mw|Thumbnail-dest-create}}\n* {{msg-mw|Thumbnail invalid params}}", "thumbnail_image-type": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}", "thumbnail_gd-library": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is a function name of the GD library", + "thumbnail_image-size-zero": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is the path incl. filename of the image with zero size", "thumbnail_image-missing": "This is the parameter 1 of the message {{msg-mw|thumbnail error}}.\n*$1 is the path incl. filename of the missing image", "thumbnail_image-failure-limit": "Used as $1 in {{msg-mw|Thumbnail error}}.\n\nParameters:\n* $1 - the maximum allowed number of failed attempts", "import": "The title of the special page [[Special:Import]];", @@ -3966,7 +3966,7 @@ "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user", "timezone-utc": "{{optional}}", "timezone-local": "Label to indicate that a time is in the user's local timezone.\n{{Identical|Local}}", - "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key", + "duplicate-defaultsort": "Warning: Default sort key \"$2\" overrides earlier default sort key \"$1\".", "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title", "restricted-displaytitle": "Warning shown when a display title is ignored because it is not equivalent to its actual title. Parameters:\n* $1 - the ignored display title", "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators <indicator name=\"''unique-identifier''\">''content''</indicator>] parser tag is used incorrectly.", diff --git a/languages/i18n/qu.json b/languages/i18n/qu.json index ab0277a3a9..edf5b8f5ab 100644 --- a/languages/i18n/qu.json +++ b/languages/i18n/qu.json @@ -1096,8 +1096,6 @@ "newpageletter": "M", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 watiqachkaq {{PLURAL:$1|ruraq|ruraqkuna}}]", - "rc_categories": "Kay katiguriyakunaman saywachay (\"|\" nisqawan rakisqa)", - "rc_categories_any": "Imallapas", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña", "newsectionsummary": "Musuq raki: /* $1 */", "rc-enhanced-expand": "Imaymanachakunata rikuchiy", diff --git a/languages/i18n/rm.json b/languages/i18n/rm.json index 30cb14ae05..fa48180b2d 100644 --- a/languages/i18n/rm.json +++ b/languages/i18n/rm.json @@ -1011,8 +1011,6 @@ "newpageletter": "N", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilisader|utilisaders}} observeschan quest artitgel]", - "rc_categories": "Be paginas ord las categorias (seperar cun \"|\")", - "rc_categories_any": "Tuts", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} suenter la midada", "newsectionsummary": "Nov chapitel /* $1 */", "rc-enhanced-expand": "Mussar detagls", diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index e4f3e9f399..2386dc4359 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -1351,7 +1351,7 @@ "rcfilters-filter-editsbyself-label": "Modificările tale", "rcfilters-filter-editsbyself-description": "Contribuțiile tale.", "rcfilters-filter-editsbyother-label": "Contribuțiile altora", - "rcfilters-filter-editsbyother-description": "Toate modificările mai puțin ale tale.", + "rcfilters-filter-editsbyother-description": "Toate modificările cu excepția celor proprii.", "rcfilters-filtergroup-userExpLevel": "Nivelul de experiență a utilizatorilor", "rcfilters-filter-user-experience-level-registered-label": "Înregistrat", "rcfilters-filter-user-experience-level-registered-description": "Editorii conectați.", @@ -1378,10 +1378,10 @@ "rcfilters-filter-minor-description": "Modificări pe care autorul le-a marcat ca fiind minore.", "rcfilters-filter-major-label": "Modificări non-minore", "rcfilters-filter-major-description": "Modificări care nu sunt etichetate ca minore.", - "rcfilters-filtergroup-watchlist": "Pagini urmărite de dv.", - "rcfilters-filter-watchlist-watched-label": "Listă de urmărire", - "rcfilters-filter-watchlist-watched-description": "Modificări are paginilor urmărite de dv.", - "rcfilters-filter-watchlist-watchednew-label": "Modificari ale listei urmărite de dv.", + "rcfilters-filtergroup-watchlist": "Pagini urmărite de dvs.", + "rcfilters-filter-watchlist-watched-label": "În lista de pagini urmărite", + "rcfilters-filter-watchlist-watched-description": "Modificări ale paginilor urmărite de dvs.", + "rcfilters-filter-watchlist-watchednew-label": "Modificări noi ale paginilor urmărite de dvs.", "rcfilters-filter-watchlist-watchednew-description": "Modificările paginilor urmărite care nu au fost vizitate de la efectuarea schimbărilor.", "rcfilters-filter-watchlist-notwatched-label": "Care nu sunt pe lista urmărită de dv.", "rcfilters-filter-watchlist-notwatched-description": "Totul, cu excepția modificărilor aduse paginilor urmărite de dvs.", @@ -1394,8 +1394,8 @@ "rcfilters-filter-pageedits-label": "Editări ale paginii", "rcfilters-filter-pageedits-description": "Editări ale conținutului wiki, discuții, descrieri de categorii…", "rcfilters-filter-newpages-label": "Creare de pagini", - "rcfilters-filter-newpages-description": "Modificări care creează pagini noi.", - "rcfilters-filter-categorization-label": "Modificări de categorie", + "rcfilters-filter-newpages-description": "Modificări care au dus la crearea de pagini noi.", + "rcfilters-filter-categorization-label": "Modificări de categorii", "rcfilters-filter-categorization-description": "Înregistrări ale paginilor adăugate sau eliminate din categorii.", "rcfilters-filter-logactions-label": "Acțiuni logate", "rcfilters-filter-logactions-description": "Acțiuni administrative, creare de conturi, ștergere de pagini, încărcări…", @@ -1454,8 +1454,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utilizator|utilizatori|de utilizatori}} care urmăresc]", - "rc_categories": "Limitează la categoriile (separate prin „|”):", - "rc_categories_any": "Oricare dintre cele alese", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|octet|octeți|de octeți}} după modificare", "newsectionsummary": "/* $1 */ secțiune nouă", diff --git a/languages/i18n/roa-tara.json b/languages/i18n/roa-tara.json index 1c77450965..640c04038b 100644 --- a/languages/i18n/roa-tara.json +++ b/languages/i18n/roa-tara.json @@ -1380,8 +1380,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|utende|utinde}} ca condrollene]", - "rc_categories": "Limite de le categorije (separate cu \"|\")", - "rc_categories_any": "Qualsiasi de le scacchiate", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apprisse 'u cangiamende", "newsectionsummary": "/* $1 */ seziona nove", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index 201ba88017..e4f7dd8437 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -120,7 +120,8 @@ "Staspotanin2", "Edible Melon", "Adam-Yourist", - "MaksimPinigin" + "MaksimPinigin", + "Smigles" ] }, "tog-underline": "Подчёркивание ссылок:", @@ -1010,7 +1011,7 @@ "diff-empty": "(нет различий)", "diff-multi-sameuser": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} этого же участника)", "diff-multi-otherusers": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})", - "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})", + "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточные версии, сделанные|не показано $1 промежуточных версий, сделанных}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})", "diff-paragraph-moved-tonew": "Параграф был перемещён. Нажмите, чтобы перейти к новому местоположению.", "diff-paragraph-moved-toold": "Пункт был перемещен. Нажмите, чтобы перейти к старому местоположению.", "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].", @@ -1569,8 +1570,6 @@ "boteditletter": "б", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]", - "rc_categories": "Только из категорий (разделитель «|»):", - "rc_categories_any": "Любая из выбранных", "rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}", "newsectionsummary": "/* $1 */ новая тема", "rc-enhanced-expand": "Показать подробности", @@ -3002,7 +3001,7 @@ "newimages-newbies": "Показать только вклад, сделанный с новых учётных записей", "newimages-showbots": "Показать загрузки ботов", "newimages-hidepatrolled": "Скрыть отпатрулированные загрузки", - "newimages-mediatype": "Медиа тип:", + "newimages-mediatype": "Тип медиафайла:", "noimages": "Изображения отсутствуют.", "gallery-slideshow-toggle": "Переключить миниатюры", "ilsubmit": "Найти", @@ -3640,7 +3639,7 @@ "specialpages-group-other": "Другие служебные страницы", "specialpages-group-login": "Представиться / Зарегистрироваться", "specialpages-group-changes": "Свежие правки и журналы", - "specialpages-group-media": "Отчёты о медиа-материалах и загрузка", + "specialpages-group-media": "Отчёты о медиаматериалах и загрузка", "specialpages-group-users": "Участники и права", "specialpages-group-highuse": "Интенсивно используемые страницы", "specialpages-group-pages": "Списки страниц", @@ -3749,7 +3748,7 @@ "tags-edit-add": "Добавить эти метки:", "tags-edit-remove": "Удалить эти метки:", "tags-edit-remove-all-tags": "(удалить все метки)", - "tags-edit-chosen-placeholder": "Выберите один или несколько тэгов", + "tags-edit-chosen-placeholder": "Выберите один или несколько тегов", "tags-edit-chosen-no-results": "Соответствующие метки не найдены", "tags-edit-reason": "Причина:", "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}", @@ -3980,7 +3979,7 @@ "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики $wgDefaultSkin, $1 недоступна.\n\nУ вас нет установленных тем оформления.\n\n; Если вы только что установили или обновили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. MediaWiki версии 1.24 и новее не содержат темы оформления в основном репозитории. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* скачав [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений; вы можете скопировать папку skins/ из него;\n:* скачав архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins использовав Git для загрузки тем оформления].\n: Это не должно навредить вашему репозиторию Git, если вы разработчик MediaWiki. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] с информацией о том, как включить темы оформления и выбрать тему по умолчанию.", "default-skin-not-found-row-enabled": "* $1 / $2 (включено)", "default-skin-not-found-row-disabled": "* $1 / $2 (отключено)", - "mediastatistics": "Медиа-статистика", + "mediastatistics": "Статистика медиа", "mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.", "mediastatistics-nfiles": "$1 ($2%)", "mediastatistics-nbytes": "$1 {{PLURAL:$1|байт|байта|байт}} ($2; $3%)", diff --git a/languages/i18n/rue.json b/languages/i18n/rue.json index 712c93eb24..2eb7f447fa 100644 --- a/languages/i18n/rue.json +++ b/languages/i18n/rue.json @@ -1073,8 +1073,6 @@ "newpageletter": "Н", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|слїдуючій хоснователь|слїдуючі хоснователї|слїдуючіх хоснователїв}}]", - "rc_categories": "Лем з катеґорій (роздїлёвач «|»)", - "rc_categories_any": "Будь-якый", "rc-change-size-new": "$1 {{PLURAL:$1|байтt|байты|байтів}} по змінї", "newsectionsummary": "/* $1 */ нова секція", "rc-enhanced-expand": "Вказати детайлы", diff --git a/languages/i18n/sa.json b/languages/i18n/sa.json index 666f91a1f9..0c2f265298 100644 --- a/languages/i18n/sa.json +++ b/languages/i18n/sa.json @@ -1176,8 +1176,6 @@ "newpageletter": "(नवीनम्)", "boteditletter": "(बोट्)", "number_of_watching_users_pageview": "[$1 अवलोकयति {{PLURAL:$1|सदस्यः|सदस्याः}}]", - "rc_categories": "वर्गान् नियतीकरोतु ।", - "rc_categories_any": "कश्चित्", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।", "newsectionsummary": "/* $1 */ नवीनविभागः", "rc-enhanced-expand": "विवरणानि दृश्यन्ताम्", diff --git a/languages/i18n/sah.json b/languages/i18n/sah.json index 55494e24b8..5820e6e683 100644 --- a/languages/i18n/sah.json +++ b/languages/i18n/sah.json @@ -1455,8 +1455,6 @@ "newpageletter": "С", "boteditletter": "р", "number_of_watching_users_pageview": "[$1 кэтиир {{PLURAL:$1|кыттааччы|кыттааччылар}}]", - "rc_categories": "Бу эрэ категориялартан (араарар бэлиэ \"|\")", - "rc_categories_any": "Талыллыбыттан хайата баҕарар", "rc-change-size-new": "Уларытыы кээмэйэ: $1 баайт", "newsectionsummary": "/* $1 */ саҥа сиэксийэ", "rc-enhanced-expand": "Сиһилии көрдөр", diff --git a/languages/i18n/sat.json b/languages/i18n/sat.json index d5cb44a4f7..22178a09b4 100644 --- a/languages/i18n/sat.json +++ b/languages/i18n/sat.json @@ -127,22 +127,22 @@ "december-date": "ᱰᱤᱥᱮᱢᱵᱚᱨ $1", "pagecategories": "{{PLURAL:$1|ᱛᱷᱚᱠ|ᱛᱷᱚᱠᱠᱩ}}", "category_header": "ᱛᱷᱚᱠ ᱨᱮᱱ ᱥᱟᱦᱴᱟᱞᱩ \"$1\"", - "subcategories": "Huḍiń rokom sokomko", - "category-media-header": "\"$1\" babot reaḱ rokom sokomte emen meḍiya rẽtko", + "subcategories": "ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ", + "category-media-header": "\"$1\" ᱵᱟᱵᱚᱛ ᱨᱮᱭᱟᱜ ᱢᱤᱰᱤᱭᱟ ᱛᱷᱚᱠ", "category-empty": "ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱱᱮᱛᱚᱜ ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱮ ᱢᱤᱰᱤᱭᱟ ᱵᱟᱱᱩᱜ-ᱟ᱾", "hidden-categories": "{{PLURAL:$1|ᱫᱟᱱᱟᱝ ᱛᱷᱚᱠ|ᱫᱟᱱᱟᱝ ᱛᱷᱚᱠᱠᱩ}}", "hidden-category-category": "Uku akan rokom sokom ko", - "category-subcat-count": "{{PLURAL:$2| keṭagorire eken tayom hudińkeṭagori menaḱa. |Noa keṭagorire tayom menaḱa {{PLURAL:$1 hudińkeṭagoriko}}, jotokote $2}}", + "category-subcat-count": "{{PLURAL:$2| ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱱᱚᱣᱟᱠᱩ ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠ ᱠᱩ ᱢᱮᱱᱟᱜ-ᱟ|ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ {{PLURAL:$1|ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ}}, ᱡᱚᱛᱚᱠᱚᱛᱮ $2}}", "category-subcat-count-limited": "Noa rokom sokomre latar reaḱ {{PLURAL:$1 gan kạṭic rokom sokom $1gan kạtic rokom sokom menaḱa}}", "category-article-count": "{{PLURAL:$2| ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮᱫᱚ ᱮᱠᱮᱱ ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ ᱥᱟᱦᱴᱟ ᱢᱮᱱᱟᱜ-ᱟ᱾| ᱛᱟᱭᱚᱢ {{PLURAL:$2| ᱥᱟᱦᱴᱟ ᱫᱚ |$1 ᱥᱟᱦᱴᱟᱠᱚ ᱠᱟᱱᱟ}} ᱱᱤᱭᱟᱹ ᱛᱷᱚᱠᱨᱮ, ᱥᱟᱱᱟᱢᱠᱚᱛᱮ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ $2 ᱾}}", "category-article-count-limited": "Noa {{PLURAL:$1 sakam sakamko}} rokom sokomre menaḱa.", "category-file-count": "{{PLURAL:$2|ᱱᱚᱣᱟ ᱛᱷᱚᱠ ᱨᱮᱭᱟᱜ ᱩᱱᱩᱫᱩᱜ ᱫᱚ ᱮᱠᱮᱱ ᱯᱟᱸᱡᱟᱸ ᱨᱮᱫ ᱜᱮ᱾| ᱱᱚᱣᱟ ᱯᱟᱸᱡᱟᱸ \n{{PLURAL:$1|ᱨᱮᱫ ᱫᱚ|$1 ᱨᱮᱫ ᱫᱚᱠᱚ}} ᱱᱤᱭᱟᱹ ᱛᱷᱚᱠᱨᱮ $2 ᱡᱚᱛᱚᱜᱮ᱾}}", "category-file-count-limited": "Latar reaḱ {{PLURAL:$1 rẽt rẽtko}} noa rokom sokomre menaḱa.", - "listingcontinuesabbrev": "Calaḱa", + "listingcontinuesabbrev": "ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ", "index-category": "ᱩᱱᱩᱫᱩᱜ-ᱟᱱ ᱥᱟᱦᱴᱟᱠᱚ", "noindex-category": "ᱩᱱᱩᱫᱩᱜ ᱵᱟᱹᱱᱩᱜ-ᱟᱱ ᱥᱟᱦᱴᱟᱠᱚ", "broken-file-category": "ᱨᱟᱹᱯᱩᱫ ᱨᱮᱫ ᱡᱚᱱᱚᱲᱠᱩ ᱥᱟᱞᱟᱫ ᱥᱟᱦᱴᱟᱠᱚ", - "about": "Lạgitte, Lạgti", + "about": "ᱞᱟᱹᱜᱤᱛ", "article": "ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟ", "newwindow": "(ᱱᱟᱣᱟ ᱡᱟᱱᱞᱟᱨᱮ ᱡᱷᱤᱡ ᱢᱮ)", "cancel": "ᱵᱟᱫᱽ", @@ -159,7 +159,7 @@ "variants": "ᱮᱴᱟᱜᱠᱳ", "navigation-heading": "ᱟᱪᱩᱨᱵᱟᱲᱟ ᱢᱮᱱᱩ", "errorpagetitle": "vul", - "returnto": "$1 te ruar-rok' me", + "returnto": "$1 ᱛᱮ ᱨᱩᱭᱟᱹᱲᱚᱜ ᱢᱮ", "tagline": " {{SITENAME}} ᱠᱷᱚᱱ", "help": "ᱜᱚᱸᱲᱚᱸ", "search": "ᱥᱮᱸᱫᱽᱨᱟ", @@ -200,7 +200,7 @@ "otherlanguages": "ᱮᱴᱟᱜ ᱯᱟᱹᱨᱥᱤ ᱛᱮ", "redirectedfrom": "($1 ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱦᱮᱡᱠᱟᱱᱟ)", "redirectpagesub": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ", - "redirectto": "Ar hõ udugoḱakana:", + "redirectto": "ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ:", "lastmodifiedat": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱢᱩᱪᱟᱹᱫ ᱫᱷᱟᱣ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ $1 ᱢᱟᱹᱦᱤᱛ, $2 ᱚᱠᱛᱚᱨᱮ", "viewcount": "Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.", "protectedpage": "Rukhíạ sakamko", @@ -220,7 +220,7 @@ "disclaimers": "ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱳ", "disclaimerpage": "Project: ᱥᱟᱫᱷᱟᱨᱚᱱ ᱫᱟᱹᱵᱤ ᱵᱟᱱᱩᱜᱠᱩ", "edithelp": "ᱥᱟᱯᱲᱟᱣ ᱜᱚᱸᱲᱚᱸ", - "helppage-top-gethelp": "ᱜᱚᱲᱚ", + "helppage-top-gethelp": "ᱜᱚᱸᱲᱚᱸ", "mainpage": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ", "mainpage-description": "ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ", "policy-url": "Project:Ritiniti", @@ -235,14 +235,14 @@ "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].", "ok": "Ṭhik gea", "retrievedfrom": "\"$1\" ᱠᱷᱚᱱ ᱧᱟᱢ ᱟᱹᱜᱩᱭ", - "youhavenewmessages": "Amaḱ do $1 ($2) menaḱa", + "youhavenewmessages": "{{PLURAL:$3|ᱟᱢᱟᱜ ᱢᱮᱱᱟᱜ-ᱟ}} $1 ($2)᱾", "youhavenewmessagesfromusers": "{{PLURAL:$4|ᱟᱢ ᱫᱚ}} $1 ᱠᱷᱚᱱ {{PLURAL:$3|ᱟᱨᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ|$3 ᱵᱷᱮᱵᱷᱟᱨᱩᱭᱟᱹ}} ($2) ᱾", "newmessageslinkplural": "{{PLURAL:$1|ᱢᱤᱫ ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽ|999=ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽᱠᱚ}}", "newmessagesdifflinkplural": "ᱢᱩᱪᱟᱹᱫ {{PLURAL:$1|ᱵᱚᱫᱚᱞ|999=ᱵᱚᱫᱚᱞᱠᱚ}}", "youhavenewmessagesmulti": "ᱟᱢᱟᱜ ᱱᱟᱣᱟ ᱠᱷᱚᱵᱟᱨᱠᱚ ᱫᱚ $1 ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ", "editsection": "ᱥᱟᱯᱲᱟᱣ", "editold": "ᱥᱟᱯᱲᱟᱣ", - "viewsourceold": "Ńamoḱ jayga", + "viewsourceold": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ", "editlink": "ᱥᱟᱯᱲᱟᱣ", "viewsourcelink": "ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱧᱮᱞᱢᱮ", "editsectionhint": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱭᱜᱟ: $1", @@ -262,7 +262,7 @@ "site-rss-feed": "$1 RSS feed", "site-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ", "page-rss-feed": "\"$1\" RSS feed", - "page-atom-feed": "\"$1\" khon khudri jom", + "page-atom-feed": " $1 ᱡᱚᱢ ᱚᱪᱚ", "red-link-title": "$1 (ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ)", "sort-descending": "Ulṭạo horop lekate sajao", "sort-ascending": "Horop lekate sajao", @@ -272,7 +272,7 @@ "nstab-special": "ᱚᱥᱚᱠᱟᱭᱛᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ", "nstab-project": "ᱯᱨᱚᱡᱮᱠᱴ ᱥᱟᱦᱴᱟ", "nstab-image": "ᱨᱮᱫ", - "nstab-mediawiki": "Mesag", + "nstab-mediawiki": "ᱠᱷᱚᱵᱚᱨ", "nstab-template": "ᱪᱷᱟᱸᱪ", "nstab-help": "ᱜᱚᱸᱲᱚ ᱥᱟᱦᱴᱟ", "nstab-category": "ᱛᱷᱚᱠ", @@ -304,11 +304,11 @@ "badarticleerror": "Noa sakamre kạmiko do baṅ puraolena.", "cannotdelete": "$1 sakam se rẽt do baṅ get giḍilena.\nPasec eṭaḱ hoṛ noa do lahareko get giḍi akada.", "cannotdelete-title": "\"$1\" Sakam do baṅ get giḍiḱkana", - "badtitle": "barich' bishó́́́́y", + "badtitle": "ᱵᱟᱹᱨᱤᱡ ᱴᱟᱭᱴᱮᱞ", "badtitletext": "ᱟᱢᱮᱢ ᱱᱮᱦᱚᱨᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ ᱫᱚ ᱵᱟᱝ ᱴᱷᱤᱠᱟ, ᱠᱷᱟᱹᱞᱤ ᱥᱮ ᱵᱷᱩᱞᱜᱮ ᱵᱷᱤᱛᱨᱤ ᱯᱟᱹᱨᱥᱤᱛᱮ ᱥᱮ ᱩᱭᱠᱤ ᱴᱟᱭᱴᱮᱞ ᱛᱮ ᱡᱚᱱᱚᱲ ᱜᱮᱭᱟ᱾\nᱱᱚᱣᱟᱨᱮ ᱫᱚ ᱢᱤᱫ ᱥᱮ ᱟᱭᱢᱟ ᱩᱱᱩᱫᱩᱜ ᱢᱮᱱᱟᱜ ᱚᱠᱟ ᱫᱚ ᱧᱤᱛᱩᱢᱨᱮ ᱵᱟᱝ ᱵᱮᱵᱦᱟᱨᱚᱜ᱾", "querypage-no-updates": "Noa sakam reaḱ nahaḱ halot bondo gea. Nonḍe doho akana ḍaṭako do baṅ saphaḱa.", "viewsource": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ", - "viewsource-title": "$1 renaḱ ńamoḱ ṭhại ńelmẽ", + "viewsource-title": "$1 ᱨᱮᱱᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ", "actionthrottled": "Kạmi reaḱ dhara bại", "protectedpagetext": "Noa sakam do ol toṅge lạgit́te do bańcao gea.", "viewsourcetext": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱢ ᱧᱮᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨᱮᱢ ᱠᱚᱯᱤ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾", @@ -335,19 +335,19 @@ "yourpasswordagain": "Arhõ oku namber olme", "createacct-yourpasswordagain": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱴᱷᱟᱹᱣᱠᱟᱹᱭ ᱢᱮ", "createacct-yourpasswordagain-ph": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱫᱮᱨᱢᱮ ᱫᱚᱲᱦᱟ", - "userlogin-remembermypassword": "Bolo thirege dohokạńme", + "userlogin-remembermypassword": "ᱵᱚᱞᱚ ᱛᱷᱤᱨᱜᱮ ᱫᱚᱦᱚᱠᱟᱹᱧᱢᱮ", "yourdomainname": "Amaḱ ḍomen:", "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.", "login": "ᱵᱚᱞᱚᱜ ᱢᱮ", "nav-login-createaccount": "Boloḱ́ duạr / ekaunt tearme", - "logout": "Bahre oḍoń", - "userlogout": "Bahre oḍoń", - "notloggedin": "Bhitri baṅ bolokana", + "logout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", + "userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", + "notloggedin": "ᱵᱟᱢ ᱵᱚᱞᱚ ᱟᱠᱟᱱᱟ", "userlogin-noaccount": "ᱠᱷᱟᱛᱟ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱢᱟ?", "userlogin-joinproject": "ᱠᱷᱚᱸᱡᱟ {{SITENAME}}", - "createaccount": "Ṭhai benaome", + "createaccount": "ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ", "userlogin-resetpassword-link": "ᱟᱢᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱦᱤᱲᱤᱧ ᱠᱮᱫᱟᱢ?", - "userlogin-helplink2": "Bolon khạtir go̠ṛo̠", + "userlogin-helplink2": "ᱵᱚᱞᱚᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱜᱚᱸᱲᱚᱸ", "userlogin-createanother": "ᱮᱴᱟᱜ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ", "createacct-emailrequired": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ", "createacct-emailoptional": "Email ᱴᱷᱤᱠᱱᱟ (ᱵᱟᱹᱲᱛᱤᱛᱮ)", @@ -407,7 +407,7 @@ "login-abort-generic": "Amaḱ bhitri boloḱ do baṅ hoylena - batena.", "loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1", "pt-login": "ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ", - "pt-login-button": "Bolon", + "pt-login-button": "ᱵᱚᱞᱚᱜ ᱢᱮ", "pt-createaccount": "ᱴᱷᱟᱭ ᱵᱮᱱᱟᱣᱢᱮ", "pt-userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.", @@ -441,35 +441,35 @@ "passwordreset-disabled": "Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.", "passwordreset-username": "Beoharicaḱ ńutum:", "passwordreset-domain": "Ḍomen:", - "passwordreset-email": "E-mail ṭhikạna:", + "passwordreset-email": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:", "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko", - "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2", + "passwordreset-emailelement": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ: \n$1\n\nᱢᱤᱫ ᱜᱷᱟᱹᱲᱤ ᱞᱟᱹᱜᱤᱛ ᱫᱟᱱᱟᱝ ᱱᱟᱵᱟᱫᱽ: \n$2", "passwordreset-emailsentemail": "Mitṭen disạ ruaṛ e-mail do kulena.", "changeemail": "email ᱴᱷᱤᱠᱱᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱥᱮ ᱚᱪᱚᱜᱽ ᱢᱮ", "changeemail-header": "Ekaunṭ e-mail ṭhikạna do bodolme", "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.", - "changeemail-oldemail": "Nitaḱ e-mail ṭhikạna:", + "changeemail-oldemail": "ᱱᱮᱛᱚᱜ-ᱟᱜ email ᱴᱷᱤᱠᱟᱹᱱᱟ", "changeemail-newemail": "ᱱᱟᱣᱟ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ:", - "changeemail-none": "(Okaṭaḱ hõ baṅ)", + "changeemail-none": "(ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱱᱩᱜ-ᱟ)", "changeemail-password": "ᱟᱢᱟᱜ {{SITENAME}} ᱩᱠᱩ ᱮᱞᱥᱚᱝ:", - "changeemail-submit": "E-mail bodolme", + "changeemail-submit": "E-mail ᱵᱚᱫᱚᱞᱢᱮ", "bold_sample": "ᱢᱚᱴᱟ ᱚᱞ", "bold_tip": "ᱢᱚᱴᱟ ᱚᱞ", "italic_sample": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ", "italic_tip": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ", - "link_sample": "Joṛaotet́ reaḱ bohoḱ", + "link_sample": "ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ", "link_tip": "ᱵᱷᱤᱛᱨᱤ ᱡᱚᱱᱚᱲ", - "extlink_sample": "http://www.nạmuna.makaṛgạṭi ạmạli", + "extlink_sample": "http://www.example.com ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ", "extlink_tip": "ᱵᱟᱨᱦᱮ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http://prefix)", "headline_sample": "ᱵᱚᱦᱚᱜ ᱨᱮᱱᱟᱜ ᱚᱞ", - "headline_tip": "level 2 guḍkatha", - "nowiki_sample": "Begor format olko bhoraome", - "nowiki_tip": "wiki formatting bạgiyaḱme", + "headline_tip": "ᱞᱮᱵᱷᱮᱞ ᱒ ᱦᱮᱰᱞᱟᱭᱤᱱ", + "nowiki_sample": "ᱵᱮᱜᱚᱨ ᱯᱷᱚᱨᱢᱮᱴ ᱚᱞᱠᱩ ᱵᱷᱚᱨᱟᱣᱢᱮ", + "nowiki_tip": "ᱣᱤᱠᱤ ᱯᱷᱚᱨᱢᱟᱴᱤᱝ ᱵᱟᱹᱜᱤᱭᱢᱮ", "image_tip": "ᱛᱚᱞᱟᱠᱟᱱ ᱨᱮᱫ", "media_tip": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ", - "sig_tip": "Amaḱ suhi sãote okte", - "hr_tip": "Barabạri dag", - "summary": "Guṭ katha", + "sig_tip": "ᱟᱢᱟᱜ ᱥᱩᱦᱤ ᱥᱟᱶᱛᱮ ᱚᱠᱛᱚ ᱪᱷᱟᱯ", + "hr_tip": "ᱵᱟᱨᱟᱵᱟᱹᱨᱤ ᱫᱟᱜᱽ", + "summary": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ:", "subject": "ᱥᱟᱛᱟᱢ:", "minoredit": "ᱱᱚᱣᱟ ᱫᱚ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱱᱟ", "watchthis": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ", @@ -477,67 +477,67 @@ "savechanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ", "publishpage": "ᱥᱟᱦᱴᱟ ᱯᱟᱨᱥᱟᱞ ᱢᱮ", "publishchanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱨᱥᱟᱞ ᱢᱮ", - "preview": "Ńel, Unuduḱ", - "showpreview": "Unuduḱ", + "preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ", + "showpreview": "ᱧᱮᱞᱡᱚᱝ ᱩᱫᱩᱜᱽᱢᱮ", "showdiff": "ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽ ᱢᱮ", "anoneditwarning": "ᱦᱩᱥᱤᱭᱟᱹᱨ: ᱟᱢ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱥᱟᱯᱲᱟᱣᱟᱢ ᱟᱢᱟᱜ IP ᱵᱩᱴᱟᱹ ᱥᱚᱫᱚᱨ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ [$1 ᱵᱚᱞᱚᱱᱟᱢ] ᱟᱨᱵᱟᱝ [$2 ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱟᱢ], ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱫᱩᱜᱚᱜ-ᱟ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ, ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱥᱩᱵᱤᱫᱷᱟ ᱠᱚ ᱾", "anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"", "missingcommenttext": "ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱵᱚᱞᱚᱭ ᱢᱮ᱾", "summary-preview": "Guṭ katha unuduḱ:", "subject-preview": "Babot/Guṭkatha unuduḱ:", - "blockedtitle": "Beoharić doe eset ocoakana.", + "blockedtitle": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱮᱥᱮᱛ ᱚᱪᱚᱟᱠᱟᱱᱟ", "blockedtext": "ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱾ \n\nᱱᱚᱶᱟ ᱵᱚᱸᱫᱽ ᱫᱚ $1 ᱫᱟᱨᱟᱭᱛᱮ ᱦᱩᱭᱟᱠᱱᱟ ᱾\nᱱᱚᱶᱟ ᱨᱮᱱᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱢᱮᱱᱟ $2.\n\n* ᱵᱚᱸᱫᱽ ᱮᱦᱚᱵ: $8\n* ᱵᱚᱸᱫᱽ ᱢᱩᱪᱟᱹᱫ: $6\n* ᱟᱥᱟᱦᱟᱱ ᱵᱚᱸᱫᱽᱠᱚ: $7\n\nᱟᱢ $1 ᱮᱢ ᱥᱟᱹᱜᱟᱹᱭ ᱫᱟᱲᱮᱭᱟᱭᱟ ᱵᱟᱝᱠᱷᱟᱱ ᱮᱴᱟᱜ [[{{MediaWiki:Grouppage-sysop}}|ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ]] ᱵᱚᱸᱫᱽ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱜᱟᱞᱚᱪ ᱞᱟᱹᱜᱤᱫ ᱾\nᱟᱢ ᱵᱟᱢ ᱵᱮᱵᱷᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ \"email this user\" ᱥᱩᱵᱤᱫᱷᱟ ᱡᱚᱛᱷᱟᱛ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱛᱟᱢ ᱵᱟᱝ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱟᱨ ᱱᱚᱶᱟ ᱫᱚ ᱪᱤᱱᱦᱟᱹᱣ-ᱟ [[Special:Preferences|ᱠᱷᱟᱛᱟ ᱧᱮᱞᱚᱚᱜ]] ᱠᱷᱚᱱ ᱟᱨ ᱟᱢ ᱫᱚ ᱵᱟᱢ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ ᱠᱷᱚᱱ ᱾\nᱟᱢᱟᱜ ᱱᱤᱛᱚᱜᱟᱜ IP ᱵᱩᱴᱟᱹ ᱫᱚ $3, ᱟᱨ ᱵᱚᱸᱫᱽ ID ᱫᱚ #$5 \nᱫᱟᱭᱟᱠᱟᱛᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ ᱪᱮᱛᱟᱱᱟᱜ ᱠᱟᱛᱷᱟᱠᱚ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ ᱠᱩᱠᱞᱤ ᱨᱮ ᱾", - "blockednoreason": "jahan babot baṅ em akana", + "blockednoreason": "ᱡᱟᱸᱦᱟᱸᱱ ᱚᱡᱮ ᱵᱟᱝ ᱮᱢᱠᱟᱱᱟ", "whitelistedittext": "Sakamre sompadon lạgit́te $1 em hoyoḱa.", "nosuchsectiontitle": "Pahaṭa bȧn ńamlena", - "loginreqtitle": "Boloḱ jạruṛa", + "loginreqtitle": "ᱵᱚᱞᱚᱜ ᱡᱟᱹᱨᱩᱲᱟ", "loginreqlink": "ᱵᱚᱞᱚᱜ ᱢᱮ", "loginreqpagetext": "Eṭagaḱ sakamko ńel lạgit́te do am $1 hoyoḱ jạruṛtama.", "accmailtitle": "Uku nambar do kulena.", "accmailtext": "[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.\nBhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar \"[[Special:ChangePassword Change password]]\" sakam khonem bodol daṛyakya.", - "newarticle": "(Nãwa)", + "newarticle": "(ᱱᱟᱣᱟᱱᱟᱜ)", "newarticletext": "ᱟᱢ ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱡᱚᱱᱟᱲᱮᱢ ᱯᱟᱸᱡᱟᱸ ᱟᱹᱜᱩᱭᱫᱟ ᱚᱱᱚ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ᱾\nᱚᱱᱟ ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱛ ᱛᱮ, ᱞᱟᱛᱟᱨ ᱵᱟᱠᱥᱚ ᱵᱷᱤᱛᱨᱤᱨᱮ ᱚᱞ ᱮᱦᱚᱵ ᱢᱮ (ᱟᱨᱦᱚᱸ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱛᱴᱮ [$1 ᱜᱚᱸᱲᱚᱸ ᱥᱟᱦᱴᱟ] ᱯᱟᱸᱡᱚᱸᱭᱢᱮ)᱾\nᱟᱢ ᱵᱷᱩᱞᱛᱮ ᱱᱚᱸᱰᱮᱢ ᱦᱮᱡ ᱟᱠᱟᱱ ᱠᱷᱟᱡ, ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱟᱨ ᱨᱮᱱᱟᱜ '''ᱛᱟᱭᱚᱢ''' ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾", "anontalkpagetext": "----\n\nᱱᱚᱶᱟ ᱫᱚ ᱜᱟᱞᱚᱪ ᱥᱟᱦᱴᱟ ᱠᱟᱱᱟ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱫᱚ ᱠᱷᱟᱛᱟ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ, ᱟᱨᱵᱟᱝ ᱡᱟᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱫᱟ ᱱᱚᱶᱟ ᱾\nᱚᱱᱟᱛᱮ ᱟᱞᱮ ᱮᱞᱮᱞ IP ᱞᱮ ᱵᱮᱵᱷᱟᱨᱮᱜ-ᱟ ᱩᱱᱤ ᱪᱤᱱᱦᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱾\nᱚᱱᱠᱟᱱ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱛᱤᱢᱤᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱟᱨᱟᱭᱛᱮ ᱾\nᱡᱩᱫᱤ ᱟᱢ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱟᱱᱟᱢ ᱟᱨ ᱵᱷᱟᱹᱵᱤᱭᱮᱜ-ᱟᱢ ᱵᱟᱝ ᱡᱚᱲᱟᱣᱟᱱ ᱠᱟᱛᱷᱟ ᱟᱢᱮ ᱩᱫᱩᱜᱢᱮ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ [[Special:CreateAccount|ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱢᱮ]] ᱟᱨᱵᱟᱝ [[Special:UserLogin|ᱞᱚᱜᱤᱱ]] ᱢᱮ ᱫᱟᱨᱟᱭ ᱵᱷᱮᱣᱱᱟ ᱠᱚ ᱥᱟᱦᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱮᱴᱟᱜ ᱩᱠᱩᱧᱩᱛᱩᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱥᱟᱶ ᱾", "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|search for this page title]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page].", "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs].", "userpage-userdoesnotexist": "\"$1\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.", - "userpage-userdoesnotexist-view": "Beoharićaḱ \"$1\" ekaunṭ do baṅ resṭire akana.", + "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ \"$1\" ᱮᱠᱟᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾", "blocked-notice-logextract": "Nui beoharić do nitoḱe esetgea.\nRefarens lạgit́te nahaḱ boloḱ do latare em hoena:", "clearyourcache": "Note: After saving, you may have to bypass your browser's cache to see the changes.\n* Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)\n* Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)\n* Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5\n* Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.", - "updated": "(Halot ruaṛ)", + "updated": "(ᱦᱟᱞᱚᱛ ᱜᱮᱭᱟ)", "note": "'''Noṭ:'''", - "previewnote": "'''kheyalmẽ, noa do eken ńeloḱ lạgit.'''\nAmaḱ bodolaḱ kodo nit habićte bań rukhíạakana!", + "previewnote": "'''ᱠᱷᱮᱭᱟᱞᱢᱮ, ᱱᱚᱣᱟ ᱫᱚ ᱮᱠᱮᱱ ᱧᱮᱞᱚᱜ ᱞᱟᱹᱜᱤᱛ᱾'''\nᱟᱢᱟᱜ ᱵᱚᱫᱚᱞ ᱠᱚᱫᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱵᱟᱝ ᱨᱩᱠᱷᱤᱭᱟᱹᱣᱠᱟᱱᱟ!", "continue-editing": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱜᱟ ᱪᱟᱞᱟᱜ ᱢᱮ", - "editing": "Joṛao do purạena: $1", + "editing": "ᱥᱟᱯᱲᱟᱣ ᱪᱟᱞᱟᱜᱠᱟᱱᱟ $1", "creating": "$1 ᱛᱮᱭᱟᱨᱚᱜᱠᱟᱱᱟ", "editingsection": "ᱥᱟᱯᱲᱟᱣᱢᱮ $1 (ᱦᱟᱹᱴᱤᱧ)", - "editingcomment": "Sompadon akadae $1 (Nãwa pahaṭa)", - "editconflict": "Sompadon reaḱ bene bạiri: $1", - "yourtext": "Amaḱ ol", + "editingcomment": "ᱥᱟᱯᱲᱟᱣᱢᱮ $1 (ᱱᱟᱣᱟ ᱦᱟᱹᱴᱤᱧ)", + "editconflict": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱹᱭᱨᱤ: $1", + "yourtext": "ᱟᱢᱟᱜ ᱚᱞ", "storedversion": "ᱡᱚᱜᱟᱣᱠᱟᱱ ᱥᱩᱫᱷᱨᱟᱹᱣ", - "yourdiff": "Farak", + "yourdiff": "ᱯᱷᱟᱨᱟᱠ", "templatesused": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ {{PLURAL:$1|ᱪᱷᱟᱸᱪ|ᱪᱷᱟᱸᱪᱠᱚ}} :", "templatesusedpreview": "{{PLURAL:$1|ᱪᱷᱟᱸᱪ|ᱪᱷᱟᱸᱪᱠᱚ}} ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ ᱱᱟᱶᱟ ᱧᱮᱱᱮᱞᱨᱮ:", "template-protected": "(ᱨᱩᱠᱷᱤᱭᱟᱹ)", - "template-semiprotected": "(Kạṭic-rukhiyạ)", + "template-semiprotected": "(ᱦᱩᱰᱤᱧ ᱨᱩᱠᱷᱤᱭᱟᱹ)", "hiddencategories": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ {{PLURAL:$1 1 ᱩᱠᱩ ᱛᱷᱚᱠ|$1 ᱩᱠᱩ ᱛᱷᱚᱠᱠᱩ}} ᱜᱟᱶᱛᱟᱨᱮᱱᱜᱮ:", "nocreate-loggedin": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ᱾", "sectioneditnotsupported-title": "Pahaṭa sompadona do bae hataoeda", "sectioneditnotsupported-text": "Noa sompadona sakamre pahaṭa sompadona do bae hataoeda", "permissionserrors": "ᱟᱹᱭᱫᱟᱹᱨᱤ ᱦᱩᱲᱟᱹᱜ", "permissionserrorstext": "Noa kạmi amaḱ ạidạri do banuḱa, {{PLURAL:$1 gan karon reaḱ gan karon reaḱ}} lạgit:", - "permissionserrorstext-withaction": "Amaḱ $2 kạmire ạydạri do bạnuḱa, Ona reaḱ {{PLURAL:$1 Karon/ Karonko}}:", + "permissionserrorstext-withaction": "ᱟᱢᱟᱜ $2 ᱠᱟᱹᱢᱤᱨᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱫᱚ ᱵᱟᱱᱩᱜ-ᱟ, ᱚᱱᱟ ᱨᱮᱭᱟᱜ {{PLURAL:$1 ᱠᱟᱨᱚᱱ/ ᱠᱟᱨᱚᱱᱠᱚ}}:", "recreate-moveddeleted-warn": "'''ᱥᱚᱱᱛᱚᱨᱚᱜᱢᱮ: ᱟᱢ ᱫᱚ ᱟᱨᱦᱚᱸ ᱫᱚᱲᱦᱟᱛᱮ ᱥᱟᱦᱴᱟᱢ ᱛᱮᱭᱟᱨᱫᱟ ᱡᱟᱸᱦᱟ ᱫᱚ ᱞᱟᱦᱟᱨᱮᱜᱮ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱠᱟᱱᱟ᱾\nᱟᱢ ᱫᱚ ᱜᱩᱱᱟᱹᱱᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤ ᱪᱟᱹᱞᱩ ᱜᱟᱱᱚᱜ-ᱟ ᱥᱮ ᱵᱟᱝ᱾\nᱱᱚᱣᱟ ᱜᱮᱫ ᱜᱤᱰᱤ ᱟᱨ ᱛᱟᱞᱟ ᱚᱪᱚᱜ ᱥᱟᱦᱴᱟ ᱱᱚᱸᱰᱮ ᱮᱢ ᱦᱩᱭᱱᱟ ᱫᱷᱚᱠ ᱞᱟᱹᱜᱤᱛᱛᱮ᱾", "moveddeleted-notice": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱜᱮᱫ ᱜᱤᱰᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱜᱮᱫ ᱥᱮ ᱵᱟᱸᱪᱟᱣ ᱥᱮ ᱚᱪᱚᱜ ᱜᱤᱰᱤᱭᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱹᱠᱷᱤ ᱞᱮᱠᱟᱛᱮ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ᱾", "log-fulllog": "Joto cạbi udugmẽ", "edit-hook-aborted": "Huk hotete joto sompadonko bạgi hoeakana.\nNoa reaḱ jahan katha do bạnuḱa.", "edit-gone-missing": "ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱟᱝ ᱦᱟᱞᱚᱛ ᱨᱩᱭᱟᱹᱲᱞᱮᱱᱟ᱾\nᱯᱟᱥᱮᱡᱽ ᱫᱚ ᱚᱪᱚᱜ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾", - "edit-conflict": "Sompadon reṭepeṭe.", + "edit-conflict": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱹᱭᱨᱤ᱾", "edit-no-change": "Amaḱ sompadon do baṅ hataolena, Cedaḱ je olre jahan bodol bạnuḱa.", "postedit-confirmation-created": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱛᱮᱭᱟᱨᱠᱟᱱᱟ᱾", "postedit-confirmation-restored": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱹᱜᱩ ᱨᱩᱣᱟᱹᱲ ᱦᱩᱭᱠᱟᱱᱟ᱾", "edit-already-exists": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱟᱝ ᱛᱮᱭᱟᱨ ᱞᱮᱱᱟ᱾\nᱱᱚᱣᱟ ᱫᱚ ᱞᱟᱦᱟ ᱠᱷᱚᱱ ᱢᱮᱱᱟᱜ ᱜᱮᱭᱟ᱾", - "defaultmessagetext": "Sedae olko", + "defaultmessagetext": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ", "content-model-wikitext": "ᱣᱤᱠᱤ-ᱚᱞ", "content-model-text": "ᱥᱚᱢᱟᱱ ᱚᱞ", "post-expand-template-inclusion-warning": "\"Sontoroḱme\" Noa format do lạṭu geya.\nThoṛa format do noare banuḱana.", @@ -555,45 +555,45 @@ "nextrevision": "ᱱᱟᱣᱟᱛᱮ ᱧᱮᱞ ᱨᱩᱣᱟᱹᱲ →", "currentrevisionlink": "ᱱᱮᱛᱟᱨ ᱧᱮᱞ", "cur": "ᱱᱮᱛᱚᱜ", - "next": "Laha seć", + "next": "ᱛᱟᱭᱚᱢ ᱨᱮᱱᱟᱜ", "last": "ᱞᱟᱦᱟ ᱛᱮᱱᱟᱜ", - "page_first": "Pahilaḱ", - "page_last": "Mucạt́aḱ", + "page_first": "ᱯᱟᱹᱦᱤᱞ", + "page_last": "ᱢᱩᱪᱟᱹᱫ", "histlegend": "ᱮᱴᱟᱜ ᱵᱟᱪᱷᱟᱣ: ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱛᱩᱞᱟᱹᱣ ᱢᱮᱱᱠᱷᱟᱱ, ᱨᱮᱰᱤᱭᱳ ᱵᱟᱠᱥᱚᱨᱮ ᱪᱤᱱ ᱮᱢ ᱠᱟᱛᱮ ᱵᱚᱞᱚᱜ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾
\nᱩᱱᱩᱫᱩᱜ: '''({{int:cur}})''' = ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, '''({{int:last}})''' = ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, '''{{int:minoreditletter}}''' = ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ᱾", "history-fieldset-title": "ᱧᱮᱞ ᱟᱹᱨᱩ ᱞᱟᱹᱜᱤᱫ ᱥᱮᱸᱫᱽᱨᱟ", "history-show-deleted": "khạli get giḍiyaḱ koge", "histfirst": "ᱢᱟᱨᱮᱱᱟᱜ", "histlast": "ᱱᱟᱣᱟᱱᱟᱜ", - "historysize": "({{PLURAL:$1 1 bayeṭ $1 bayeṭko}})", - "historyempty": "(banuḱa)", + "historysize": "({{PLURAL:$1 1 ᱵᱟᱭᱤᱴ $1 ᱵᱟᱭᱤᱴᱠᱩ}})", + "historyempty": "(ᱠᱷᱟᱹᱞᱤ)", "history-feed-title": "ᱥᱩᱫᱷᱨᱟᱹᱣ ᱱᱟᱜᱟᱢ", "history-feed-description": "ᱩᱭᱠᱤᱨᱮ ᱱᱤᱭᱟᱹ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞ ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ", - "history-feed-item-nocomment": "re", - "rev-deleted-comment": "(Sompadon reaḱ guṭ katha do ocoǵ hoena)", - "rev-deleted-user": "(laṛcaṛić ńutum ocoḱena)", + "history-feed-item-nocomment": "$1 ᱨᱮ $2", + "rev-deleted-comment": "(ᱥᱟᱯᱲᱟᱣ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ ᱚᱪᱟᱜᱠᱟᱱᱟ)", + "rev-deleted-user": "(ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱚᱪᱚᱜᱠᱟᱱᱟ)", "rev-deleted-event": "(Log kạmi do ocog hoena)", "rev-deleted-user-contribs": "[Beoharićaḱ ńutum se IP ṭhikạna do ocog hoena - kạmi khon sompadon do uku hoe akana]", - "rev-delundel": "Juḍawaḱko ńel", - "rev-showdeleted": "Uduḱme", + "rev-delundel": "ᱧᱮᱧᱮᱞᱟᱜ ᱵᱚᱫᱚᱞ", + "rev-showdeleted": "ᱥᱚᱫᱚᱨ", "revisiondelete": "ᱜᱮᱫ ᱜᱤᱰᱤ/ᱵᱟᱝ ᱜᱮᱫ ᱜᱤᱰᱤ ᱥᱩᱫᱷᱨᱟᱹᱣᱠᱚ", - "revdelete-show-file-submit": "Hẽ", + "revdelete-show-file-submit": "ᱦᱮᱸ", "revdelete-hide-text": "Nãwã aroe olko ukuemẽ", - "revdelete-hide-image": "Rẽt reaḱ babotko ukue mẽ", + "revdelete-hide-image": "ᱨᱮᱫ ᱥᱟᱛᱚᱢᱠᱩ ᱩᱠᱩᱭᱢᱮ", "revdelete-hide-name": "Kạmi ar bejha ukue mẽ", "revdelete-hide-comment": "Sompadon gut katha ukue mẽ", "revdelete-hide-user": "Sompadonićaḱ beohar ńutum/IP ṭhikạna ukuemẽ", - "revdelete-radio-same": "(alom bodola)", + "revdelete-radio-same": "(ᱟᱞᱚᱢ ᱵᱚᱫᱚᱞᱟ)", "revdelete-radio-set": "ᱩᱠᱩ", "revdelete-radio-unset": "ᱧᱮᱞ ᱜᱟᱱᱚᱜ", - "revdelete-log": "Babot:", - "revdel-restore": "Judạ lekate ńel", + "revdelete-log": "ᱚᱡᱮ:", + "revdel-restore": "ᱧᱮᱧᱮᱞᱟᱜ ᱵᱚᱫᱚᱞ", "pagehist": "ᱥᱟᱦᱴᱟ ᱱᱟᱜᱟᱢ", - "deletedhist": "Get giḍi jạṛ", - "revdelete-reasonotherlist": "Eṭaḱak karon", + "deletedhist": "ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱠᱟᱱ ᱱᱟᱜᱟᱢ", + "revdelete-reasonotherlist": "ᱮᱴᱟᱜ ᱚᱡᱮ", "mergehistory-from": "ᱯᱷᱮᱰᱟᱛ ᱥᱟᱦᱴᱟᱺ", "mergehistory-reason": "ᱚᱡᱮ:", "mergelog": "ᱞᱚᱜᱽ ᱢᱮᱥᱟ", - "revertmerge": "bań mit́", + "revertmerge": "ᱵᱟᱝ ᱢᱤᱛ", "history-title": "\"$1\" ᱨᱮᱱᱟᱜ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱱᱟᱜᱟᱢ", "difference-title": "\"$1\" ᱨᱮᱱᱟᱜ ᱫᱚᱦᱲᱟᱭᱮᱱ ᱛᱟᱞᱟᱨᱮ ᱯᱷᱟᱨᱟᱠ", "lineno": "ᱫᱷᱟᱹᱲ $1:", @@ -604,64 +604,64 @@ "diff-multi-otherusers": "({{PLURAL:$1|ᱢᱤᱫ ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱫᱚᱦᱲᱟ|$1 ᱛᱟᱞᱟ-ᱢᱟᱞᱟ ᱫᱚᱦᱲᱟᱠᱚ}} {{PLURAL:$2|ᱢᱤᱫ ᱮᱴᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ|$2 ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱚ}} ᱵᱟᱠᱚ ᱧᱮᱞᱚᱜ-ᱟ)", "searchresults": "ᱥᱮᱸᱫᱽᱨᱟ ᱚᱨᱡᱚᱠᱳ", "searchresults-title": "\"$1\" ᱨᱮᱱᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱯᱷᱚᱞ", - "prevn": "Laha reaḱ {{PLURAL:$1|$1}}", - "nextn": "Táyom teaḱ {{PLURAL:$1|$1}}", + "prevn": "ᱞᱟᱦᱟᱛᱮᱱᱟᱜ {{PLURAL:$1|$1}}", + "nextn": "ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ {{PLURAL:$1|$1}}", "prev-page": "ᱯᱟᱪᱮ ᱥᱟᱦᱴᱟ", "next-page": "ᱫᱟᱨᱟᱭ ᱥᱟᱦᱴᱟ", "prevn-title": "ᱞᱟᱦᱟᱛᱮᱱᱟᱜ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱚ}}", - "nextn-title": "Tayom $1 {{PLURAL:$1|result|results}}", + "nextn-title": "ᱛᱟᱭᱚᱢᱛᱮᱱᱟᱜ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱚ}}", "shown-title": "ᱥᱟᱦᱴᱟ $1 {{PLURAL:$1|ᱚᱨᱡᱚ|ᱚᱨᱡᱚᱠᱳ}} ᱩᱰᱩᱜᱽᱢᱮ", - "viewprevnext": "Ńelme ($1 {{int:pipe-separator}} $2) ($3)", + "viewprevnext": "ᱧᱮᱞᱢᱮ ($1 {{int:pipe-separator}} $2) ($3)", "searchmenu-exists": "ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ ᱫᱚ \"[[:$1]]\" ᱱᱤᱭᱟᱹ ᱩᱭᱠᱤᱨᱮ᱾ {{PLURAL:$2|0=|ᱟᱨᱦᱚᱸ ᱧᱮᱞᱢᱮ ᱮᱴᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱟᱨᱡᱚ ᱠᱚᱨᱮ᱾}}", "searchmenu-new": "ᱥᱟᱦᱴᱟ ᱛᱮᱭᱟᱨ ᱢᱮ \"[[:$1]]\" ᱱᱚᱶᱟ ᱣᱤᱠᱤ ᱨᱮ! {{PLURAL:$2|0=|ᱟᱢᱟᱜ ᱥᱮᱸᱫᱽᱨᱟ ᱛᱮ ᱧᱟᱢᱮᱱ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ|ᱧᱟᱢᱮᱱ ᱥᱮᱸᱫᱽᱨᱟ ᱚᱨᱡᱚ ᱠᱚ ᱦᱚᱸ ᱧᱮᱞᱢᱮ}}", "searchprofile-articles": "ᱩᱱᱩᱫᱩᱜ ᱥᱟᱦᱴᱟᱠᱚ", - "searchprofile-images": "Multimedia", + "searchprofile-images": "ᱢᱟᱞᱴᱤᱢᱤᱰᱤᱭᱟ", "searchprofile-everything": "ᱡᱚᱛᱚᱜᱮ", - "searchprofile-advanced": "Sompadon", + "searchprofile-advanced": "ᱢᱟᱲᱟᱝ", "searchprofile-articles-tooltip": "$1 ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭᱢᱮ", "searchprofile-images-tooltip": "ᱨᱮᱫᱠᱩ ᱥᱮᱸᱫᱽᱨᱟ", "searchprofile-everything-tooltip": "ᱡᱚᱛᱚ ᱥᱟᱛᱚᱢ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)", "searchprofile-advanced-tooltip": "ᱵᱮᱱᱟᱣ ᱧᱤᱛᱩᱢ ᱛᱮ ᱥᱮᱸᱫᱽᱨᱟ", "search-result-size": "$1 ({{PLURAL:$2|1 ᱟᱹᱲᱟᱹ|$2 ᱟᱹᱲᱟᱹᱠᱳ}})", - "search-result-category-size": "{{PLURAL:$1 1 gãoren $1 gãota renko}} ({{PLURAL:$2 1 kạṭic rokom sokom $ 2 goṭen}}, {{PLURAL:$3 1 rẽt $3 rẽtko}})", + "search-result-category-size": "{{PLURAL:$1|1 ᱥᱚᱦᱮᱫ|$1 ᱥᱚᱦᱮᱫᱠᱩ}} ({{PLURAL:$2|1 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠ|$ 2 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ}}, {{PLURAL:$3|1 ᱨᱮᱫ|$3 ᱨᱮᱫᱠᱩ}})", "search-redirect": "(ᱥᱚᱡᱷᱮ ᱦᱤᱡᱩᱜ-ᱟ $1 ᱠᱷᱚᱱ)", - "search-section": "(Pahaṭa $1)", + "search-section": "(ᱛᱷᱟᱠ $1)", "search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)", "search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1", "search-interwiki-caption": "ᱦᱚᱯᱚᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ", "search-interwiki-default": "$1 folko:", - "search-interwiki-more": "(Arhõ)", + "search-interwiki-more": "(ᱵᱟᱹᱲᱛᱤ)", "search-interwiki-more-results": "ᱵᱟᱹᱲᱛᱤ ᱚᱨᱡᱚᱠᱚ", "search-relatedarticle": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ", - "searchrelated": "songenko", + "searchrelated": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱᱠᱩ", "searchall": "ᱡᱚᱛᱚ", "search-showingresults": "{{PLURAL:$4|ᱚᱨᱡᱚ $1 ᱨᱮᱱᱟᱜ $3|ᱚᱨᱡᱚᱠᱚ $1 - $2 ᱨᱮᱱᱟᱜ $3}}", - "search-nonefound": "Kupuli leka roṛruạṛ bạnuḱa", + "search-nonefound": "ᱠᱩᱠᱞᱤ ᱥᱟᱶᱛᱮ ᱯᱷᱚᱞ ᱵᱟᱝ ᱢᱤᱞᱟᱹᱮ ᱞᱮᱱᱟ᱾", "powersearch-ns": "ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟ", - "powersearch-togglelabel": "Sendra", - "powersearch-toggleall": "Sanamaḱ", - "powersearch-togglenone": "Okaṭaḱ hõ baṅ", + "powersearch-togglelabel": "ᱠᱷᱚᱸᱡᱽ:", + "powersearch-toggleall": "ᱡᱚᱛᱚ", + "powersearch-togglenone": "ᱚᱠᱟᱴᱟᱜ ᱦᱚᱸ ᱵᱟᱝ", "preferences": "ᱠᱩᱥᱤᱠᱚ", "mypreferences": "ᱠᱩᱥᱤᱠᱚ", "prefs-edits": "ᱥᱟᱯᱲᱟᱣᱟᱜ ᱮᱞ:", - "prefs-skin": "Harta", - "skin-preview": "Ńel, Unuduḱ", - "datedefault": "Pạsind banuḱa", + "prefs-skin": "ᱦᱟᱨᱛᱟ", + "skin-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ", + "datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ", "prefs-user-pages": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ", - "prefs-resetpass": "Uku nombor bodolme", + "prefs-resetpass": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ", "prefs-changeemail": "E-mail ṭhikạna bodolme", - "prefs-setemail": "E-mail ṭhikana benaome", - "saveprefs": "Rukhiyạymẽ", - "searchresultshead": "Sendra", - "timezoneregion-africa": "Aphrika", - "timezoneregion-america": "Amirika", - "timezoneregion-asia": "Esiya", - "timezoneregion-australia": "Ausṭralia", + "prefs-setemail": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱡᱚᱲᱟᱣᱢᱮ", + "saveprefs": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ", + "searchresultshead": "ᱥᱮᱸᱫᱽᱨᱟ", + "timezoneregion-africa": "ᱟᱯᱷᱨᱤᱠᱟ", + "timezoneregion-america": "ᱟᱢᱮᱨᱤᱠᱟ", + "timezoneregion-asia": "ᱮᱥᱤᱭᱟ", + "timezoneregion-australia": "ᱚᱥᱴᱨᱮᱞᱤᱭᱟ", "prefs-searchoptions": "ᱥᱮᱸᱫᱽᱨᱟ", - "prefs-files": "Rẽtko", + "prefs-files": "ᱨᱮᱫᱠᱚ", "youremail": "E-mail:", "username": "Beoharićaḱ ńutum:", - "yourrealname": "Sạri ńutum", + "yourrealname": "ᱟᱥᱚᱞ ᱧᱩᱛᱩᱢ:", "yourlanguage": "ᱯᱟᱹᱨᱥᱤ:", "yournick": "ᱱᱟᱶᱟ ᱥᱩᱦᱤ:", "gender-male": "Baba hoṛ", @@ -674,7 +674,7 @@ "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ", "userrights": "Beoharićaḱ laṛcaṛ ektiạrko", "userrights-lookup-user": "Beoharkoaḱ gãotako laṛcaṛ", - "userrights-user-editname": "Beoharićaḱ ńutum emmẽ", + "userrights-user-editname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱤᱛᱩᱢ ᱵᱚᱞᱚᱭ ᱢᱮ:", "editusergroup": "Beoharićaḱ gãotako toṅgeymẽ", "userrights-editusergroup": "Beoharićaḱ gãotako toṅgeymẽ", "saveusergroups": "Beoharićaḱ gãotako rukhiyaymẽ", @@ -683,19 +683,19 @@ "group-sysop": "ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ", "grouppage-bot": "{{ns:project}}:ᱵᱚᱴᱠᱚ", "grouppage-sysop": "{{ns:project}}:ᱯᱟᱨᱜᱟᱱᱟᱠᱚ", - "right-read": "Sakamko paṛhaomẽ", - "right-edit": "Sakamko toṅge", + "right-read": "ᱥᱟᱦᱴᱟᱠᱩ ᱯᱟᱲᱦᱟᱣᱢᱮ", + "right-edit": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱟᱯᱲᱟᱣ", "right-createpage": "Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)", "right-createtalk": "Galmarao sakamko benaomẽ", "right-createaccount": "ᱱᱟᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨ", - "right-move": "Sakamko ocogmẽ", + "right-move": "ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱦᱟᱭᱢᱮ", "right-move-subpages": "ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱦᱟᱭᱢᱮ ᱥᱟᱶᱛᱮᱱ ᱥᱟᱦᱴᱟᱠᱚ ᱥᱟᱶ", - "right-movefile": "Rẽtko ocogmẽ", + "right-movefile": "ᱨᱮᱫᱠᱚ ᱚᱪᱚᱜᱽ ᱢᱮ", "right-upload": "Rẽtko rakabmẽ", "right-writeapi": "ᱚᱞ API ᱨᱮᱱᱟᱜ ᱵᱮᱵᱷᱟᱨ", - "right-delete": "Sakamko get giḍiymẽ", + "right-delete": "ᱥᱟᱦᱴᱟᱠᱚ ᱜᱮᱫᱽ ᱢᱮ", "right-browsearchive": "ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱥᱟᱦᱴᱟᱠᱚ", - "newuserlogpage": "Laṛcaṛićaḱ tear cạbi", + "newuserlogpage": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱛᱮᱭᱟᱨ ᱪᱟᱹᱵᱤ", "rightslog": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱹᱭᱫᱟᱹᱨ ᱞᱚᱜᱽ", "action-edit": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣᱢᱮ", "action-createaccount": "ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ ᱵᱮᱱᱟᱣ", @@ -716,17 +716,17 @@ "action-browsearchive": "ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ ᱥᱟᱦᱴᱟᱠᱚ", "action-undelete": "ᱵᱟᱝ ᱜᱮᱫᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ", "action-suppressrevision": "ᱧᱮᱞᱟᱹᱨᱩ ᱟᱨ ᱛᱷᱟᱯᱚᱱᱟᱹᱨᱩ ᱫᱟᱱᱟᱝ ᱧᱮᱞᱟᱹᱨᱩᱠᱚ", - "nchanges": "$1 {{PLURAL:$1 bodol bodolko}}", + "nchanges": "$1 {{PLURAL:$1|ᱟᱹᱨᱩ|ᱟᱹᱨᱩᱠᱚ}}", "enhancedrc-history": "ᱱᱟᱜᱟᱢ", "recentchanges": "ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱠᱚ", - "recentchanges-legend": "Nahaḱ bodol teaḱko", + "recentchanges-legend": "ᱱᱟᱣᱟᱱᱟ ᱵᱚᱫᱚᱞ ᱛᱮᱭᱟᱜᱠᱚ", "recentchanges-summary": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱸᱡᱟᱸᱭᱢᱮ᱾", "recentchanges-noresult": "ᱮᱢᱞᱮᱱ ᱥᱚᱢᱚᱭ ᱵᱷᱤᱛᱤᱨ ᱨᱮ ᱵᱚᱫᱚᱞᱟᱜ ᱠᱚ ᱵᱟᱭ ᱢᱤᱫᱩᱜ ᱠᱟᱱᱟ ᱾", "recentchanges-feed-description": "ᱱᱚᱣᱟ feed ᱨᱮ ᱩᱭᱠᱤ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱸᱡᱟᱸᱭᱢᱮ᱾", "recentchanges-label-newpage": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱤᱫᱴᱮᱱ ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟᱭ ᱛᱮᱭᱟᱨᱠᱮᱫᱟ", "recentchanges-label-minor": "ᱱᱚᱣᱟ ᱫᱚ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱱᱟ", "recentchanges-label-bot": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱵᱚᱴ ᱮ ᱠᱚᱨᱟᱣᱠᱟᱫᱟ", - "recentchanges-label-unpatrolled": "Noa sompadon do ńit́ hạbić baṅ ńel ńamakana", + "recentchanges-label-unpatrolled": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱵᱟᱝ ᱧᱮᱞ ᱧᱟᱢ ᱟᱠᱟᱱᱟ", "recentchanges-label-plusminus": "ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱚᱫᱚᱞᱮᱱᱟ ᱱᱤᱱᱟᱹᱜ ᱮᱞ ᱵᱟᱭᱤᱴᱥ ᱛᱮ", "recentchanges-legend-heading": "ᱞᱤᱡᱮᱸᱰ:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ᱟᱨᱦᱚᱸ ᱧᱮᱞᱢᱮ [[Special:NewPages|ᱱᱟᱶᱟ ᱥᱟᱦᱴᱟ ᱞᱤᱥᱴᱤ]])", @@ -753,13 +753,13 @@ "rcshowhidebots": "ᱵᱚᱴᱠᱚ $1", "rcshowhidebots-show": "ᱧᱮᱞ", "rcshowhidebots-hide": "ᱫᱟᱱᱟᱝ", - "rcshowhideliu": "Regisṭari beoharićko $1", + "rcshowhideliu": "ᱵᱚᱞᱚᱣᱠᱟᱱ ᱵᱮᱵᱟᱦᱟᱨᱤᱠᱩ $1", "rcshowhideliu-show": "ᱧᱮᱞ", "rcshowhideliu-hide": "ᱫᱟᱱᱟᱝ", "rcshowhideanons": "$1 ᱧᱤᱛᱩᱢ ᱵᱟᱱᱩᱜ ᱵᱮᱵᱦᱟᱨᱤᱪ", "rcshowhideanons-show": "ᱧᱮᱞ", "rcshowhideanons-hide": "ᱫᱟᱱᱟᱝ", - "rcshowhidepatr": "$1 Biḍạen sompadonko", + "rcshowhidepatr": "$1 ᱵᱤᱰᱟᱭᱮᱱ ᱥᱟᱯᱲᱟᱣᱠᱩ", "rcshowhidepatr-show": "ᱥᱚᱫᱚᱨ", "rcshowhidepatr-hide": "ᱫᱟᱱᱟᱝ", "rcshowhidemine": "$1 ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ", @@ -768,7 +768,7 @@ "rcshowhidecategorization": "$1 ᱥᱟᱦᱴᱟ ᱛᱷᱚᱠ", "rcshowhidecategorization-show": "ᱧᱮᱞ", "rcshowhidecategorization-hide": "ᱫᱟᱱᱟᱝ", - "rclinks": "$2 din lahare $1 bodol unuduḱme", + "rclinks": "$2 ᱫᱤᱱ ᱞᱟᱦᱟᱨᱮ $1 ᱵᱚᱫᱚᱞ ᱩᱫᱩᱜᱽᱢᱮ", "diff": "ᱡᱩᱫᱟᱹ", "hist": "ᱱᱟᱜᱟᱢ", "hide": "ᱫᱟᱱᱟᱝ", @@ -778,29 +778,29 @@ "boteditletter": "b", "rc-change-size-new": "$1 {{PLURAL:$1|ᱵᱟᱭᱤᱴ|ᱵᱟᱭᱤᱴᱥ}} ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ", "rc-enhanced-expand": "Purạote uduḱ", - "rc-enhanced-hide": "Purạo cuku", + "rc-enhanced-hide": "ᱡᱚᱛᱚᱭᱟᱜ ᱩᱠᱩᱭᱢᱮ", "rc-old-title": "ᱚᱥᱚᱞᱨᱮ ᱛᱮᱭᱟᱨᱟᱠᱟᱱᱟ \"$1\" ᱞᱮᱠᱟᱛᱮ", "recentchangeslinked": "ᱥᱟᱶᱛᱮᱱᱟᱜ ᱵᱚᱫᱚᱞᱠᱚ", "recentchangeslinked-feed": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ", "recentchangeslinked-toolbox": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ", - "recentchangeslinked-title": "Bodolaḱko do \"$1\" sãote joṛao geya", - "recentchangeslinked-summary": "ᱱᱚᱣᱟ ᱫᱚ ᱚᱱᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱟ ᱱᱮᱵᱮᱛᱟᱨᱜᱮ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱟᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱚ category ᱦᱟᱛᱟᱣ ᱟᱠᱟᱱ ᱥᱟᱠᱟᱢ ᱠᱷᱚᱱ᱾\n\n[[Special:Watchlist|your watchlist]] ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ ᱫᱚ'''bold''' .", + "recentchangeslinked-title": "ᱵᱚᱫᱚᱞᱟᱜ ᱠᱚᱫᱚ \"$1\" ᱥᱟᱶᱛᱮ ᱡᱚᱲᱟᱣ ᱜᱮᱭᱟ", + "recentchangeslinked-summary": "ᱱᱚᱣᱟ ᱫᱚ ᱚᱱᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱟ ᱱᱮᱵᱮᱛᱟᱨᱜᱮ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱟᱠᱟᱱᱟ ᱚᱠᱟ ᱫᱚ category ᱦᱟᱛᱟᱣ ᱟᱠᱟᱱ ᱥᱟᱠᱟᱢ ᱠᱷᱚᱱ᱾\n\n[[Special:Watchlist|your watchlist]] ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟ ᱫᱚ '''bold''' .", "recentchangeslinked-page": "ᱥᱟᱦᱴᱟ ᱧᱤᱛᱩᱢ :", "recentchangeslinked-to": "ᱡᱚᱱᱚᱲ ᱥᱟᱦᱴᱟᱨᱮ ᱧᱮᱞ ᱚᱪᱚᱭ ᱢᱮ ᱮᱢᱟᱜ ᱥᱟᱦᱴᱟ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ", "upload": "ᱨᱮᱫ ᱞᱟᱫᱮᱢᱮ", - "uploadbtn": "Rẽt rakabmẽ", - "uploadlogpage": "Chạbi do uthạome", - "filename": "Rẽt ńutum", - "filedesc": "Guṭ katha", - "fileuploadsummary": "Guṭ katha", + "uploadbtn": "ᱨᱮᱫ ᱞᱟᱫᱮ", + "uploadlogpage": "ᱨᱟᱠᱟᱵ ᱛᱟᱹᱞᱠᱟᱹ", + "filename": "ᱨᱮᱫ ᱧᱩᱛᱩᱢ", + "filedesc": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ", + "fileuploadsummary": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ:", "filestatus": "ᱟᱫᱚᱞ ᱚᱵᱚᱥᱛᱟ:", - "savefile": "Rẽt rukhiyaymẽ", + "savefile": "ᱨᱮᱫ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ", "upload-source": "ᱯᱷᱮᱰᱟᱛ ᱨᱮᱫ", "sourcefilename": "ᱯᱷᱮᱰᱟᱛ ᱨᱮᱫᱧᱩᱢ:", "sourceurl": "ᱯᱷᱮᱰᱟᱛ URL:", - "upload-description": "Rẽt reaḱ jạṛ", - "watchthisupload": "Noa rẽt ńelmẽ", - "upload-file-error": "Bhitri reaḱ bhul", + "upload-description": "ᱨᱮᱫ ᱵᱤᱵᱚᱨᱚᱱᱤ", + "watchthisupload": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱧᱮᱞᱢᱮ", + "upload-file-error": "ᱵᱷᱤᱛᱨᱤ ᱵᱷᱩᱞ", "upload-dialog-title": "ᱨᱮᱫ ᱞᱟᱫᱮ", "upload-dialog-button-cancel": "ᱵᱟᱫᱽ", "upload-dialog-button-back": "ᱛᱟᱭᱚᱢ", @@ -812,22 +812,22 @@ "upload-form-label-usage-filename": "ᱨᱮᱫ ᱧᱩᱛᱩᱢ", "upload-form-label-own-work": "ᱱᱚᱶᱟ ᱫᱚ ᱤᱧᱟᱜ ᱠᱟᱹᱢᱤᱭᱟᱜ", "upload-form-label-infoform-date": "ᱢᱟᱹᱦᱤᱛ", - "license": "Laisence benao", - "license-header": "Laisense benao", + "license": "ᱞᱟᱭᱥᱮᱱᱥ ᱛᱮᱭᱟᱨ:", + "license-header": "ᱞᱟᱭᱥᱮᱱᱥ ᱛᱮᱭᱟᱨ", "imgfile": "ᱨᱮᱫ", "listfiles": "ᱨᱮᱫ ᱛᱟᱹᱞᱠᱟᱹ", - "listfiles_date": "Tạrikh", - "listfiles_name": "Ńutum", - "listfiles_user": "Beoharić, Laṛcaṛic", + "listfiles_date": "ᱢᱟᱹᱦᱤᱛ", + "listfiles_name": "ᱧᱩᱛᱩᱢ", + "listfiles_user": "ᱵᱮᱵᱦᱟᱨᱤᱡ", "file-anchor-link": "ᱨᱮᱫ", "filehist": "ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ", "filehist-help": "ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱱ ᱢᱮ/ᱚᱠᱛᱚ ᱨᱮ ᱨᱮᱫ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱛ ᱞᱤᱱ ᱢᱮ", - "filehist-deleteall": "Joto get giḍi", - "filehist-deleteone": "Get giḍi", - "filehist-revert": "Lahaleka", + "filehist-deleteall": "ᱡᱚᱛᱚ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱢᱮ", + "filehist-deleteone": "ᱜᱮᱫ ᱜᱤᱰᱤ", + "filehist-revert": "ᱨᱩᱣᱟᱹᱲ ᱟᱹᱜᱩ", "filehist-current": "ᱱᱤᱛᱚᱜ", "filehist-datetime": "ᱛᱟᱹᱨᱤᱠᱷ/ᱚᱠᱛᱚ", - "filehist-thumb": "Ṭip", + "filehist-thumb": "ᱴᱤᱯ", "filehist-thumbtext": "Thumbnail for version as of $1", "filehist-nothumb": "ᱵᱟᱹᱱᱩᱜ-ᱟ ᱴᱤᱯ-ᱨᱟᱢᱟ", "filehist-user": "ᱵᱮᱵᱦᱟᱨᱤᱡᱽ", @@ -843,30 +843,30 @@ "upload-disallowed-here": "ᱟᱢᱫᱚ ᱱᱚᱣᱟ ᱨᱮᱫ ᱪᱮᱛᱟᱱ ᱵᱟᱢ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾", "mimesearch": "MIME ᱥᱮᱸᱫᱽᱨᱟ", "randompage": "ᱡᱚᱲᱟᱣ ᱥᱟᱦᱴᱟ", - "statistics": "Halot", - "statistics-pages": "Sakamko", + "statistics": "ᱦᱟᱞᱚᱛ", + "statistics-pages": "ᱥᱟᱦᱴᱟᱠᱚ", "double-redirect-fixer": "ᱢᱚᱸᱦᱟᱰᱟ ᱴᱷᱟᱹᱣᱠᱟᱹᱭᱤᱡ", "nbytes": "$1 {{PLURAL:$1|byte|bytes}}", - "nmembers": "$1 {{PLURAL:$1 Gaõtaren Gaõtarenko}}", + "nmembers": "$1 {{PLURAL:$1|ᱥᱚᱦᱮᱫ|ᱥᱚᱦᱮᱫᱠᱩ}}", "prefixindex": "ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟᱠᱚ prefix ᱥᱟᱶ", - "shortpages": "Huḍiń sakamko", - "longpages": "Jiliń sakamko", + "shortpages": "ᱦᱩᱰᱤᱧ ᱥᱟᱦᱴᱟᱠᱚ", + "longpages": "ᱞᱟᱹᱴᱩ ᱥᱟᱦᱴᱟᱠᱚ", "listusers": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱛᱟᱹᱞᱠᱟᱹ", "listusers-creationsort": "ᱛᱮᱭᱟᱨᱟᱠᱟᱱ ᱢᱟᱹᱦᱤᱛ ᱞᱮᱠᱟᱛᱮ ᱯᱟᱱᱛᱮ", - "usercreated": "{{JẠT: $3 | benawakan}} $1 tarikre $2 okte", + "usercreated": "{{ᱡᱟᱱᱟᱝ:$3|ᱵᱮᱱᱟᱣᱠᱟᱱ}} $1 ᱢᱟᱹᱦᱤᱛᱨᱮ $2 ᱚᱠᱛᱚᱨᱮ", "newpages": "ᱱᱟᱶᱟ ᱥᱟᱦᱴᱟᱠᱳ", - "newpages-username": "Beoharićaḱ ńutum:", - "ancientpages": "Mare sakamko", + "newpages-username": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ", + "ancientpages": "ᱢᱟᱨᱮ ᱥᱟᱦᱴᱟᱠᱚ", "move": "ᱚᱪᱚᱜ", "movethispage": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱭᱢᱮ", "pager-newer-n": "{{PLURAL:$1|1 ᱱᱟᱣᱟᱱᱟᱜ | ᱱᱟᱣᱟᱱᱟᱜ $1}}", - "pager-older-n": "{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}", + "pager-older-n": "{{PLURAL:$1|ᱢᱟᱨᱮᱭᱟᱜ 1|ᱢᱟᱨᱮᱭᱟᱜ $1}}", "booksources": "ᱯᱚᱛᱚᱵ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨᱠᱟ", "booksources-search-legend": "ᱯᱚᱛᱚᱵ ᱨᱮᱭᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱦᱚᱨ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱽᱨᱟ", "booksources-search": "ᱥᱮᱸᱫᱽᱨᱟ", "specialloguserlabel": "ᱠᱟᱹᱢᱤᱭᱟᱹ:", "speciallogtitlelabel": "ᱡᱚᱥ (ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ {{ns:user}}:ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱩᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ):", - "log": "Cạbiko", + "log": "ᱪᱟᱹᱵᱤᱠᱩ", "all-logs-page": "ᱡᱚᱛᱚ ᱫᱤᱥᱣᱟᱹ ᱞᱚᱜᱽ ᱠᱚ", "alllogstext": "ᱢᱮᱥᱟᱠᱟᱛᱮ ᱩᱫᱩᱜᱽᱢᱮ ᱡᱚᱛᱚ ᱢᱮᱱᱟᱜ {{SITENAME}} ᱞᱚᱜᱽᱠᱚ ᱾\nᱧᱮᱞᱚᱜ ᱠᱚᱢ ᱠᱟᱹᱡ ᱫᱟᱲᱮᱭᱟᱠᱚᱣᱟ ᱞᱚᱜᱽ ᱞᱮᱠᱟᱱ, ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ (case-sensitive), ᱟᱨᱵᱟᱝ ᱯᱨᱚᱵᱷᱟᱵᱟᱱ ᱥᱟᱦᱴᱟ (also case-sensitive) ᱠᱚ ᱵᱟᱪᱷᱚᱱ ᱠᱟᱛᱮ ᱾", "logempty": "ᱞᱚᱜᱽ ᱨᱮ ᱚᱱᱟᱞᱮᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾", @@ -876,80 +876,80 @@ "allpages-hide-redirects": "ᱢᱚᱦᱰᱟᱦᱟᱜᱠᱚ ᱫᱟᱱᱟᱝ", "categories": "ᱛᱷᱚᱠᱠᱚ", "linksearch-ok": "ᱥᱮᱸᱫᱽᱨᱟ", - "linksearch-line": "$2 khon $1 re joṛao hoeakana", - "listusers-submit": "Udugmẽ", - "listusers-blocked": "(Esetgea)", - "listgrouprights-group": "Gaõta", - "listgrouprights-rights": "Ạidạriko", + "linksearch-line": "$2 ᱠᱷᱚᱱ $1 ᱨᱮ ᱡᱚᱱᱚᱲ ᱟᱠᱟᱱ", + "listusers-submit": "ᱧᱮᱞ", + "listusers-blocked": "(ᱮᱥᱮᱫ ᱜᱮᱭᱟ)", + "listgrouprights-group": "ᱜᱟᱶᱛᱟ", + "listgrouprights-rights": "ᱟᱹᱭᱫᱟᱹᱨᱤᱠᱚ", "listgrouprights-helppage": "Goṛo:Gaõta ạidạri", - "listgrouprights-members": "Saõtenkoaḱ tạlika", + "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)", "listgrouprights-addgroup-all": "Joto gaõtare ko soṅgekom", "listgrouprights-removegroup-all": "Joto gaõtaren ko ocoḱgiḍikom", - "emailuser": "Nui beoharić e-mail emayme", + "emailuser": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ e-mail ᱮᱢᱟᱭᱢᱮ", "noemailtitle": "E-mail ṭhikạna do banuḱa", - "emailusername": "Beoharićaḱ ńutum:", - "emailusernamesubmit": "Em", - "emailfrom": "Kulić:", - "emailto": "Ńamić:", - "emailmessage": "Mesag", - "emailsend": "Kulmẽ", + "emailusername": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱧᱩᱛᱩᱢᱺ", + "emailusernamesubmit": "ᱮᱢ", + "emailfrom": "ᱠᱩᱞᱤᱪ:", + "emailto": "ᱱᱟᱹᱢᱤᱪ:", + "emailmessage": "ᱠᱷᱚᱵᱚᱨ:", + "emailsend": "ᱠᱩᱞᱢᱮ", "usermessage-editor": "ᱥᱤᱥᱴᱚᱢ ᱨᱟᱭᱵᱟᱨ", "watchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ", "mywatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ", "watchlistfor2": "$1 ($2) ᱞᱟᱹᱜᱤᱛ", "watch": "ᱧᱮᱞ", - "unwatch": "bang nelok' a", + "unwatch": "ᱵᱟᱱᱝ ᱧᱮᱞᱠᱟᱱ", "watchlist-details": "ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ{{PLURAL:$1 ᱥᱟᱦᱴᱟ $1 ᱥᱟᱦᱴᱟ}} ᱢᱮᱱᱟᱜ-ᱟ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)", "wlheader-showupdated": "ᱟᱢᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱞᱚᱝᱨᱮ ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱠᱚᱢ ᱵᱚᱫᱚᱞ ᱞᱮᱫᱟ ᱚᱱᱟᱠᱩ ᱧᱮᱞᱚᱜ-ᱟ bold.", "wlnote": "ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ {{PLURAL:$1|ᱫᱚ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞ ᱠᱟᱱᱟ|ᱠᱚ ᱫᱚ ᱢᱩᱪᱟᱹᱫ $1 ᱵᱚᱫᱚᱞᱠᱟᱱᱟ}} ᱢᱩᱪᱟᱹᱫ ᱨᱮ {{PLURAL:$2|ᱴᱟᱲᱟᱝ|$2 ᱴᱟᱲᱟᱝ}}, $3, $4 ᱞᱮᱠᱟᱛᱮ ᱾", "wlshowlast": "ᱢᱩᱪᱟᱹᱛ ᱩᱫᱩᱜᱢᱮ $1 ᱴᱟᱲᱟᱝ $2 ᱢᱟᱦᱟᱸ", - "watchlist-options": "Ńelok tạlika reak sonketko", - "watching": "Ńeloḱ kana...", + "watchlist-options": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮᱭᱟᱜ ᱥᱚᱝᱠᱮᱛᱠᱩ", + "watching": "ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ...", "enotif_reset": "ᱱᱤᱱᱦᱟᱹᱭᱢᱮ ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟ ᱦᱤᱨᱤᱭᱟᱠᱟᱱᱟ", "changed": "Bodolena", "deletepage": "ᱥᱟᱦᱴᱟ ᱜᱮᱫᱽ ᱢᱮ", - "delete-legend": "Get giḍi", + "delete-legend": "ᱜᱮᱫ ᱜᱤᱰᱤ", "actioncomplete": "kami Chabae-ena", "actionfailed": "Kami bang hoe-lena", - "dellogpage": "Mãrao log", + "dellogpage": "ᱢᱩᱪᱷᱟᱹᱣ ᱪᱟᱹᱵᱤ", "rollbacklink": "ᱜᱷᱩᱨᱞᱟᱹᱣ ᱟᱹᱪᱩᱨ", "rollbacklinkcount": "ᱜᱚᱰᱟᱣ ᱨᱩᱣᱟᱹᱲ $1 {{PLURAL:$1|ᱥᱟᱯᱲᱟᱣ|ᱥᱟᱯᱲᱟᱣᱠᱚ}}", "changecontentmodel-reason-label": "ᱚᱡᱮ:", "changecontentmodel-submit": "ᱵᱚᱫᱚᱞ", - "protectlogpage": "Rukhiyạy tala cạbi", - "protectedarticle": "Rukhiyạgeya \"[[$1]]\"", + "protectlogpage": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱛᱟᱞᱟ ᱪᱟᱹᱵᱤ", + "protectedarticle": "ᱨᱩᱠᱷᱤᱭᱟᱹᱜᱮᱭᱟ \"[[$1]]\"", "modifiedarticleprotection": "\"[[$1]]\" ᱞᱟᱹᱜᱤᱫ ᱨᱩᱠᱷᱭᱟᱹ ᱟᱲᱮ ᱵᱚᱫᱚᱞᱮᱱᱟ", - "protectcomment": "karon", + "protectcomment": "ᱚᱡᱮ:", "protectexpiry": "Cabaḱ", "protect-default": "ᱡᱚᱛᱚ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱚ ᱫᱟᱣ ᱮᱢ", "restriction-edit": "ᱥᱟᱯᱲᱟᱣ", "restriction-move": "ᱚᱪᱚᱜ", - "restriction-create": "Tearmẽ, Benaomẽ", - "undeletelink": "Ńel/doho ruạṛ", - "undeleteviewlink": "Ńel", + "restriction-create": "ᱛᱮᱭᱟᱨ", + "undeletelink": "ᱧᱮᱞ/ᱫᱚᱦᱚ ᱨᱩᱣᱟᱹᱲ", + "undeleteviewlink": "ᱧᱮᱞ", "undelete-search-submit": "ᱥᱮᱸᱫᱽᱨᱟ", "namespace": "ᱧᱤᱛᱩᱢ ᱡᱟᱜᱟ", - "invert": "Seć bachao", + "invert": "ᱥᱮᱪ ᱵᱟᱪᱷᱟᱣ", "tooltip-invert": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞᱟᱜᱠᱚ ᱫᱟᱱᱟᱝ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱛᱷᱚᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶᱛᱮ (ᱟᱨ ᱡᱚᱯᱚᱲᱟᱣᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱡᱩᱫᱤ ᱴᱤᱠ ᱟᱠᱟᱱᱟ)", "namespace_association": "ᱥᱚᱦᱚᱫᱤᱭᱟᱹ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ", "tooltip-namespace_association": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱨᱚᱯᱚᱲ ᱵᱟᱝᱠᱷᱟᱱ ᱥᱟᱛᱟᱢ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱚᱱ ᱟᱠᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱡᱚᱯᱚᱲᱟᱣ ᱟᱠᱟᱱᱟᱜ", "blanknamespace": "(ᱢᱩᱬᱩᱛ)", - "contributions": "{{GENDER:$1|Beoharićaḱ }} Kạmiko", - "contributions-title": "$1 Beoharićaḱ kạmiko", + "contributions": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱮᱱᱮᱢᱠᱩ", + "contributions-title": "$1 ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ", "mycontris": "ᱮᱱᱮᱢᱠᱩ", "anoncontribs": "ᱮᱱᱮᱢᱠᱩ", "contribsub2": "{{GENDER:$3|$1}} ($2) ᱞᱟᱹᱜᱤᱫ ᱛᱮ", "nocontribs": "ᱱᱚᱶᱟ ᱮᱢᱟᱜ ᱥᱟᱶ ᱡᱚᱲᱟᱣᱟᱱ ᱵᱚᱫᱚᱞᱠᱚ ᱵᱟᱭ ᱧᱟᱢᱞᱮᱱᱟ |", "uctop": "(ᱱᱤᱛᱚᱜ)", - "month": "Cando khon (ar etohopreaḱ)", - "year": "Nia serma reak' pahil khoch'", + "month": "ᱪᱟᱸᱫᱚ ᱠᱷᱚᱱ (ᱟᱨ ᱞᱟᱦᱟᱨᱮᱭᱟᱜ)", + "year": "ᱱᱚᱣᱟ ᱥᱮᱨᱢᱟ ᱠᱷᱚᱡ (ᱟᱨ ᱞᱟᱦᱟᱨᱮᱭᱟᱜ):", "sp-contributions-newbies": "ᱱᱟᱣᱟ ᱦᱤᱥᱟᱵ ᱨᱮᱱᱟᱜ ᱮᱱᱮᱢᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ", - "sp-contributions-blocklog": "Tala eset", - "sp-contributions-uploads": "Rakaṕme", - "sp-contributions-logs": "Tala", + "sp-contributions-blocklog": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ", + "sp-contributions-uploads": "ᱞᱟᱫᱮᱠᱩ", + "sp-contributions-logs": "ᱛᱟᱞᱟᱠᱩ", "sp-contributions-talk": "ᱨᱚᱲ", - "sp-contributions-search": "Kạmiko emoḱ lạgitte sendrayme", - "sp-contributions-username": "IP ṭhikạna se laṛcaṛićaḱ n̕utum", + "sp-contributions-search": "ᱮᱱᱮᱢᱠᱩ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱨᱟ", + "sp-contributions-username": "IP ᱴᱷᱤᱠᱟᱹᱱᱟ ᱥᱮ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ", "sp-contributions-toponly": "ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱠᱚᱨᱮᱭᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ", "sp-contributions-newonly": "ᱥᱩᱢᱩᱝ ᱟᱹᱨᱩᱠᱚ ᱥᱚᱫᱚᱨᱢᱮ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱟᱴᱟ ᱫᱚ ᱥᱤᱨᱡᱟᱹᱣᱟᱜ ᱠᱟᱱᱟ", "sp-contributions-submit": "ᱥᱮᱸᱫᱽᱨᱟ", @@ -959,56 +959,56 @@ "linkshere": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ '''[[:$1]]''' ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :", "nolinkshere": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ [[:$1]].", "isredirect": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ", - "istemplate": "Ar mit́ teć sãote joṛao", + "istemplate": "ᱥᱮᱞᱮᱫ", "isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ", "whatlinkshere-prev": "{{PLURAL:$1|ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ |ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ$1}}", "whatlinkshere-next": "{{PLURAL:$1 |ᱛᱟᱭᱚᱢ |ᱛᱟᱭᱚᱢ $1}}", "whatlinkshere-links": "← ᱡᱚᱱᱚᱲᱠᱚ", - "whatlinkshere-hideredirs": "$1 arhõ unuduḱ", - "whatlinkshere-hidetrans": "Selet́ $1", + "whatlinkshere-hideredirs": "$1 ᱟᱨᱦᱚᱸ ᱩᱱᱩᱫᱩᱜ", + "whatlinkshere-hidetrans": "ᱥᱮᱞᱮᱫ $1", "whatlinkshere-hidelinks": "$1 ᱡᱚᱱᱚᱲᱠᱚ", "whatlinkshere-hideimages": "$1 ᱨᱮᱫ ᱡᱳᱱᱳᱲᱠᱚ", "whatlinkshere-filters": "ᱪᱷᱟᱹᱱᱤᱠᱩ", - "block": "Beoharić esedem", + "block": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱮᱢ", "blockip": "Beoharić esedem", - "ipboptions": "2 Ghonṭa : 2 hours, 1 maha:1 day, 3 maha : 3 days,1 hapta :1 week, 2 hapta : 2 weeks, 1 cando :1 month, 3 cando : 3 months,6 cando :6 months, 1 serma :1 year, Aemamaha : infinite", + "ipboptions": "᱒ ᱜᱷᱚᱱᱴᱟ : 2 hours, ᱑ ᱢᱟᱦᱟᱸ:1 day, ᱓ ᱢᱟᱦᱟᱸ : 3 days,᱑ ᱦᱟᱯᱛᱟ:1 week, ᱒ ᱦᱟᱯᱛᱟ : 2 weeks, ᱑ ᱪᱟᱸᱫᱚ :1 month, ᱓ ᱪᱟᱸᱫᱚ : 3 months, ᱖ ᱪᱟᱸᱫᱚ:6 months, ᱑ ᱥᱮᱨᱢᱟ:1 year, ᱥᱤᱢᱟᱹᱱᱟᱹ ᱪᱷᱟᱲᱟ : infinite", "autoblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ", - "ipblocklist": "Beoharic esetgeyay", - "ipblocklist-submit": "Sendra", + "ipblocklist": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱜᱮᱭᱟᱭ", + "ipblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ", "infiniteblock": "ᱚᱦᱤᱥᱟᱹᱵᱽ", "emailblock": "E-mail do esetgea", "blocklink": "ᱮᱥᱮᱫᱽ", - "unblocklink": "bań block", + "unblocklink": "ᱵᱟᱝ ᱮᱥᱮᱫ", "change-blocklink": "block judạ", "contribslink": "ᱮᱱᱮᱢ", "emaillink": "E-mail kulmẽ", - "blocklogpage": "Tala eset", - "blocklogentry": "Eset [[$1]] sãote cabaḱ okte oka do $2 $3", + "blocklogpage": "ᱠᱩᱞᱩᱯ ᱮᱥᱮᱫ", + "blocklogentry": "ᱮᱥᱮᱫ [[$1]] ᱥᱟᱶᱛᱮ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ ᱚᱠᱟ ᱫᱚ $2 $3", "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ", - "block-log-flags-nocreate": "Ekaunṭ benao do bondogeya", + "block-log-flags-nocreate": "ᱮᱠᱟᱣᱱᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱱᱫᱷ ᱜᱮᱭᱟ", "block-log-flags-noemail": "E-mail do esetgea", "block-log-flags-hiddenname": "Beoharićaḱ ńutum do ukugea", "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ", "movepagebtn": "ᱥᱟᱦᱴᱟ ᱥᱟᱦᱟᱭᱢᱮ", "pagemovedsub": "Ocogoḱ do hoena", - "movelogpage": "Tala cạbi ocoḱme", - "revertmove": "ruạr agu", + "movelogpage": "ᱛᱟᱞᱟ ᱪᱟᱹᱵᱤ ᱚᱪᱚᱜᱽᱢᱮ", + "revertmove": "ᱨᱩᱣᱟᱹᱲ ᱟᱹᱜᱩ", "export": "ᱟᱹᱜᱩᱭᱮᱱ ᱥᱟᱦᱴᱟᱠᱚ", - "export-addcat": "Joṛaomẽ", - "export-addns": "Joṛaomẽ", - "allmessagesname": "Ńutum", + "export-addcat": "ᱥᱮᱞᱮᱫ", + "export-addns": "ᱥᱮᱞᱮᱫ", + "allmessagesname": "ᱧᱩᱛᱩᱢ", "allmessagesdefault": "Bań bhul mesag ol", - "allmessages-filter-all": "Sanamaḱ", - "allmessages-filter-submit": "Calaḱmẽ", + "allmessages-filter-all": "ᱡᱚᱛᱚ", + "allmessages-filter-submit": "ᱪᱟᱞᱟᱜ ᱢᱮ", "thumbnail-more": "ᱞᱟᱹᱴᱩᱭ ᱢᱮ", "thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1", - "import-upload-filename": "Rẽt ńutum", + "import-upload-filename": "ᱨᱮᱫᱧᱩᱛᱩᱢᱺ", "importlogpage": "ᱞᱚᱜᱽ ᱟᱹᱜᱩ", "tooltip-pt-userpage": "{{GENDER:|ᱟᱢᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱥᱟᱦᱴᱟ", "tooltip-pt-mytalk": "{{GENDER:|ᱟᱢᱟᱜ}} ᱨᱚᱲ ᱥᱟᱦᱴᱟ", "tooltip-pt-preferences": "{{GENDER:|ᱟᱢᱟᱜ}} ᱠᱩᱥᱤᱠᱚ", "tooltip-pt-watchlist": "ᱥᱟᱦᱴᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱚᱠᱟᱛᱟᱜᱛᱮ ᱟᱢ ᱫᱚ ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱛ ᱛᱮ ᱧᱮᱞᱮᱜ ᱠᱟᱱ", - "tooltip-pt-mycontris": "Mit́ṭen lisṭ {{GENDER:|amaḱ}} kạmiko reaḱ", + "tooltip-pt-mycontris": "ᱛᱟᱹᱞᱠᱟᱹ {{GENDER:|ᱟᱢᱟᱜ}} ᱮᱱᱮᱢᱠᱚ ᱨᱮᱭᱟᱜ", "tooltip-pt-login": "ᱟᱢ ᱫᱚ ᱵᱚᱞᱟᱜ ᱞᱟᱹᱜᱤᱛ ᱩᱫᱽᱜᱟᱣᱤᱧ ᱮᱢᱟᱢᱠᱟᱱᱟ; ᱵᱚᱞᱚᱜ ᱞᱟᱜᱟᱜ-ᱟ ᱚᱝᱠᱟ ᱫᱚ ᱵᱟᱝ", "tooltip-pt-logout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ", "tooltip-pt-createaccount": "ᱟᱢ ᱫᱚ ᱢᱤᱫᱽᱴᱮᱱ ᱦᱤᱥᱟᱹᱵ ᱡᱷᱤᱪ ᱠᱟᱛᱮ ᱵᱚᱞᱚᱜ ᱞᱟᱹᱜᱤᱛᱤᱧ ᱩᱫᱽᱜᱟᱣᱮᱛ ᱢᱮᱭᱟ; ᱟᱫᱚ ᱡᱟᱹᱨᱩᱲ ᱵᱚᱞᱚᱜ ᱚᱝᱠᱟ ᱫᱚ ᱵᱟᱝ ᱠᱟᱱᱟ", @@ -1051,18 +1051,18 @@ "tooltip-ca-nstab-template": "ᱪᱷᱟᱸᱪ ᱧᱮᱞᱢᱮ", "tooltip-ca-nstab-help": "ᱜᱚᱸᱲᱚ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ", "tooltip-ca-nstab-category": "ᱛᱷᱚᱠ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ", - "tooltip-minoredit": "Noa do huḍiń joṛao lekate lekhay me", - "tooltip-save": "Bodolaḱko rukhiyayme", - "tooltip-preview": "Amaḱ bodolaḱ uduḱme, noa beoharme ạuri rukhiyayre", - "tooltip-diff": "Uduḱme okaṭaḱ onolem bodolakada", + "tooltip-minoredit": "ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱦᱤᱥᱟᱹᱵᱛᱮ ᱞᱮKᱦᱟᱭᱢᱮ", + "tooltip-save": "ᱵᱚᱫᱚᱞᱠᱩ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ", + "tooltip-preview": "ᱟᱢᱟᱜ ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽᱢᱮ, ᱨᱩᱠᱷᱤᱭᱟᱹ ᱞᱟᱦᱟᱨᱮ ᱱᱚᱣᱟ ᱵᱮᱵᱦᱟᱨ ᱢᱮ᱾", + "tooltip-diff": "ᱚᱠᱟᱴᱟᱜ ᱮᱢ ᱵᱚᱫᱚᱞᱠᱟᱫᱟ ᱚᱱᱟ ᱩᱫᱩᱜᱽᱢᱮ", "tooltip-compareselectedversions": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱵᱟᱨᱭᱟ ᱧᱮᱞᱟᱹᱨᱩ ᱵᱷᱮᱜᱮᱫ ᱧᱮᱞ ᱢᱮ", "tooltip-watch": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱟᱢᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱡᱚᱲᱟᱣᱢᱮ", "tooltip-rollback": "ᱫᱚᱲᱦᱟᱛᱮ ᱢᱤᱫ ᱫᱷᱟᱣ ᱞᱤᱱ ᱛᱮ contributor ᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱥᱟᱯᱲᱟᱣ \"ᱜᱷᱩᱨᱞᱟᱹ ᱟᱹᱪᱩᱨ\" ᱢᱮ", - "tooltip-undo": "Noa joṛao kạmire ulṭao \"bạgiyaḱme\" ar ńeloḱ lekate noa joṛao jhicme. Noa do am guḍ karon joṛaoe ektiyariye emama.", + "tooltip-undo": "ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱨᱮ \"ᱩᱞᱴᱟᱹᱣ ᱠᱟᱹᱢᱤ\" ᱟᱨ ᱧᱮᱞᱚᱜ ᱞᱮᱠᱟᱛᱮ ᱱᱚᱣᱟ ᱥᱟᱯᱲᱟᱣ ᱡᱷᱤᱡᱽᱢᱮ᱾ ᱱᱚᱣᱟ ᱫᱚ ᱟᱢ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟᱨᱮ ᱥᱞᱮᱫᱚᱜ ᱨᱮᱱᱟᱜ ᱮᱠᱛᱤᱭᱟᱨ ᱮᱢᱟᱢᱟ᱾", "tooltip-preferences-save": "ᱠᱩᱥᱤᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ", - "tooltip-summary": "Khaṭote guṭ katha bhoraome", - "others": "Eṭagaḱko", - "simpleantispam-label": "Enṭi espam ńel\nDo not noa purạome!", + "tooltip-summary": "ᱦᱩᱰᱤᱧᱛᱮ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟ ᱵᱷᱚᱨᱟᱣᱢᱮ", + "others": "ᱮᱴᱟᱜᱠᱚ", + "simpleantispam-label": "ᱮᱱᱴᱤ ᱮᱥᱯᱮᱢ ᱧᱮᱞ᱾\nDo not ᱱᱚᱣᱟ ᱯᱩᱨᱟᱧᱢᱮ!", "pageinfo-title": "\"$1\" ᱞᱟᱹᱜᱤᱫ ᱥᱩᱪᱱᱟ", "pageinfo-header-basic": "ᱢᱩᱬ ᱥᱩᱪᱱᱟ", "pageinfo-header-edits": "ᱥᱟᱯᱲᱟᱣ ᱱᱟᱜᱟᱢ", @@ -1102,13 +1102,13 @@ "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱚ}}", "file-info-size": "$1 x $2 pixels, file size: $3, MIME type: $4", "file-info-size-pages": "$1 × $2 ᱯᱤᱠᱥᱮᱞ, ᱨᱮᱫ ᱥᱚᱝ: $3, MIME ᱞᱮᱠᱟᱱ: $4, $5 {{PLURAL:$5|ᱥᱟᱦᱴᱟ|ᱥᱟᱦᱴᱟᱠᱚ}}", - "file-nohires": "Aema resulation nondḍe banuḱa", - "svg-long-desc": "SVG rẽt, normalte $1 x $2 pixels, rẽt sayej: $3", + "file-nohires": "ᱟᱭᱢᱟ ᱨᱮᱡᱩᱞᱮᱥᱚᱱ ᱵᱟᱱᱩᱜ-ᱟ᱾", + "svg-long-desc": "SVG ᱨᱮᱫ, ᱱᱚᱨᱢᱟᱞᱛᱮ $1 x $2 pixels, ᱨᱮᱫ ᱡᱟᱜᱟ: $3", "show-big-image": "ᱟᱥᱚᱞ ᱨᱮᱫ", - "show-big-image-preview": "Noa ńeloḱ akar do:$1", + "show-big-image-preview": "ᱧᱮᱞᱡᱚᱝ ᱨᱮᱱᱟᱜ ᱟᱠᱟᱨ:$1", "show-big-image-other": "ᱮᱢᱟᱱ ᱛᱮᱭᱟᱜ {{PLURAL:$2|resolution|resolutions}}: $1", "show-big-image-size": "$1 X $2 Pixels", - "ilsubmit": "Sendra", + "ilsubmit": "ᱥᱮᱸᱫᱽᱨᱟ", "bydate": "ᱢᱟᱹᱦᱤᱛ ᱛᱮ", "monday-at": "ᱚᱛᱮᱢᱟᱦᱟᱸ $1 ᱨᱮ", "tuesday-at": "ᱵᱟᱞᱮᱢᱟᱦᱟᱸ $1 ᱨᱮ", @@ -1120,18 +1120,18 @@ "metadata": "ᱢᱮᱴᱟ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ", "metadata-help": "ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱠᱟᱛᱷᱟᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ, ᱯᱟᱥᱮᱡ ᱱᱚᱣᱟ ᱫᱚ ᱰᱤᱡᱤᱴᱟᱞ ᱠᱮᱢᱨᱟ ᱥᱮ ᱮᱥᱠᱮᱱᱟᱨ ᱵᱮᱵᱦᱟᱨ ᱠᱟᱛᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱟᱠᱟᱫᱟᱠᱚ᱾ ᱡᱩᱫᱤ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱭᱟᱜ ᱵᱩᱱᱤᱭᱟᱹᱫ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱣ ᱞᱮᱱᱠᱷᱟᱱ, ᱯᱟᱥᱮᱡ ᱥᱟᱱᱟᱢᱠᱚ ᱛᱷᱚᱲᱟ ᱵᱟᱝᱠᱩ ᱥᱚᱫᱚᱨᱚᱜ-ᱟ ᱱᱚᱣᱟ ᱨᱮᱫ ᱨᱮᱫᱚ᱾", "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", - "exif-imagewidth": "Ganḍe", - "exif-imagelength": "Usul", + "exif-imagewidth": "ᱜᱟᱸᱰᱮ", + "exif-imagelength": "ᱩᱥᱩᱞ", "exif-orientation": "ᱥᱟᱢᱟᱝ", "exif-xresolution": "ᱜᱤᱛᱤᱡ ᱛᱮ", "exif-yresolution": "ᱛᱤᱝᱜᱩ ᱛᱮ", "exif-datetime": "ᱨᱮᱫ ᱵᱚᱫᱚᱞ ᱛᱟᱹᱨᱤᱠᱷ ᱟᱨ ᱚᱠᱛᱚ", - "exif-make": "Kemera tearić", - "exif-model": "Kemera model", - "exif-software": "Beoharen Software", - "exif-artist": "Onoliạ", - "exif-exifversion": "Exif bharson", - "exif-colorspace": "Roṅcoṅ dhạrti", + "exif-make": "ᱠᱮᱢᱮᱨᱟ ᱵᱮᱱᱟᱣᱤᱪ", + "exif-model": "ᱠᱮᱢᱮᱨᱟ ᱢᱚᱰᱮᱞ", + "exif-software": "ᱵᱮᱵᱦᱟᱨᱟᱠᱟᱱ ᱥᱚᱯᱷᱴᱚᱭᱟᱨ", + "exif-artist": "ᱚᱱᱚᱞᱤᱭᱟᱹ", + "exif-exifversion": "Exif ᱵᱷᱟᱨᱥᱚᱱ", + "exif-colorspace": "ᱨᱚᱝᱪᱚᱝ ᱡᱟᱜᱟ", "exif-datetimeoriginal": "ᱰᱟᱴᱟ ᱛᱮᱭᱟᱨ ᱨᱮᱱᱟᱜ ᱢᱟᱹᱦᱤᱛ ᱟᱨ ᱚᱠᱛᱚ", "exif-datetimedigitized": "ᱰᱤᱡᱤᱴᱟᱭᱡᱤᱝᱟᱜ ᱢᱟᱹᱦᱤᱛ ᱟᱨ ᱚᱠᱛᱚ", "exif-subsectime": "ᱢᱟᱹᱦᱤᱛ ᱚᱠᱛᱚ ᱴᱤᱯᱤᱡ", @@ -1147,10 +1147,10 @@ "imgmultigo": "ᱥᱮᱱᱚᱜ!", "imgmultigoto": "ᱥᱮᱱᱚᱜ ᱢᱮ ᱥᱟᱦᱴᱟ $1", "watchlisttools-clear": "ᱠᱩᱥᱤᱭᱟᱜ ᱞᱤᱥᱴᱤ ᱥᱟᱯᱷᱟ", - "watchlisttools-view": "Jońgṛao bodolaḱko ńel", - "watchlisttools-edit": "Ńelok tạlika ńel ar joṛao", - "watchlisttools-raw": "Baṇ purạo akan ńelok tạlika purạomẽ", - "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|galmarao]])", + "watchlisttools-view": "ᱡᱚᱝᱲᱟᱣ ᱵᱚᱫᱚᱞᱠᱩ ᱧᱮᱞ", + "watchlisttools-edit": "ᱧᱮᱞᱢᱮ ᱟᱨ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ", + "watchlisttools-raw": "ᱵᱟᱝ ᱯᱩᱨᱟᱣ ᱟᱠᱟᱱ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣᱢᱮ", + "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ᱜᱟᱞᱢᱟᱨᱟᱣ]])", "duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.", "redirect": "ᱨᱮᱫ, ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ, ᱥᱟᱦᱴᱟ, ᱧᱮᱞ-ᱟᱹᱨᱩ, ᱵᱟᱝᱠᱷᱟᱱ ᱞᱚᱜᱽ ID ᱫᱟᱨᱟᱭᱛᱮ ᱢᱚᱦᱰᱟ", "redirect-summary": "ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱢᱚᱦᱰᱟ ᱟ ᱢᱤᱫ ᱨᱮᱫ (ᱮᱢᱟᱠᱟᱱ ᱨᱮᱫᱧᱩᱛᱩᱢ) ᱴᱷᱮᱱ, ᱢᱤᱫ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱟᱹᱨᱩᱣᱟᱜ ID ᱟᱨᱵᱟᱝ ᱥᱟᱦᱴᱟ ID), ᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱩᱭᱟᱹ ᱥᱟᱦᱴᱟ (ᱮᱢᱮᱱ ᱮᱞᱩᱠ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ID ), ᱟᱨᱵᱟᱝ ᱢᱤᱫ ᱞᱚᱜᱽ ᱵᱚᱞᱚ (ᱮᱢᱮᱱ ᱞᱚᱜᱽ ID) ᱾ ᱵᱮᱵᱷᱟᱨᱟᱠᱟᱱ: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], ᱟᱨᱵᱟᱝ [[{{#Special:Redirect}}/logid/186]]", @@ -1165,7 +1165,7 @@ "fileduplicatesearch-submit": "ᱥᱮᱸᱫᱽᱨᱟ", "specialpages": "ᱵᱤᱥᱮᱥ ᱥᱟᱦᱴᱟᱠᱚ", "external_image_whitelist": "#Noa sakam do cet leka menaḱa oṅkage dohoemẽ\n#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ\n#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa\n#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa\n#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka\n#Noa do kas-baṅ rimjhạoaḱge\n#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ", - "tag-filter": "[[Special:Tags|Tag]] saphay:", + "tag-filter": "[[Special:Tags|Tag]] ᱪᱷᱟᱹᱠᱱᱤ:", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ᱥᱟᱛᱚᱢ|ᱥᱟᱛᱚᱢᱠᱩ}}]]: $2)", "tags-active-yes": "ᱦᱮᱸ", "tags-active-no": "ᱵᱟᱝ", @@ -1182,7 +1182,7 @@ "logentry-patrol-patrol-auto": "$1 ᱟᱡᱛᱮᱜᱮ {{GENDER:$2|ᱪᱤᱱᱦᱟᱹᱭᱮᱱᱟ}} $4 ᱧᱮᱞᱟᱹᱨᱩ $3 ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱾", "logentry-newusers-create": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱱᱟ}}", "logentry-newusers-autocreate": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱮᱱᱟ}} ᱟᱡᱛᱮᱜᱮ", - "logentry-upload-upload": "$1 {{GENDER:$2|rakaṕ akadae}} $3", + "logentry-upload-upload": "$1 {{GENDER:$2|ᱨᱟᱠᱟᱵᱠᱟᱱ}} $3", "logentry-upload-overwrite": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} ᱢᱤᱫ ᱱᱟᱶᱟ ᱵᱷᱟᱨᱥᱚᱱ $3 ᱨᱮᱱᱟᱜ", "searchsuggest-search": "ᱥᱮᱸᱫᱽᱨᱟ {{SITENAME}}", "duration-days": "$1 {{PLURAL:$1|ᱢᱟᱦᱟᱸ|ᱢᱟᱸᱦᱟᱸ}}", diff --git a/languages/i18n/sc.json b/languages/i18n/sc.json index ac93b67363..6f3fefcb87 100644 --- a/languages/i18n/sc.json +++ b/languages/i18n/sc.json @@ -842,7 +842,6 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "b", - "rc_categories_any": "Calesisiat", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica", "newsectionsummary": "/* $1 */ setzione noa", diff --git a/languages/i18n/scn.json b/languages/i18n/scn.json index ca6b172681..d2c3b55ffc 100644 --- a/languages/i18n/scn.json +++ b/languages/i18n/scn.json @@ -1169,8 +1169,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[taliata di {{PLURAL:$1|nu utenti|$1 utenti}}]", - "rc_categories": "Lìmita a li catigurìi (spartuti cu «|»)", - "rc_categories_any": "Qualegghiè tra chiddi scigghiuti", "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} appressu dû canciamentu", "newsectionsummary": "/* $1 */ sizzioni nova", "rc-enhanced-expand": "Ammustra li dittagghî", diff --git a/languages/i18n/sco.json b/languages/i18n/sco.json index c6d54eb47d..c58040b05e 100644 --- a/languages/i18n/sco.json +++ b/languages/i18n/sco.json @@ -1411,8 +1411,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 watchin {{PLURAL:$1|uiser|uisers}}]", - "rc_categories": "Leemit tae categories (separate wi \"|\"):", - "rc_categories_any": "Ony o the chosen", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter chynge", "newsectionsummary": "/* $1 */ new section", "rc-enhanced-expand": "Shaw details", diff --git a/languages/i18n/sd.json b/languages/i18n/sd.json index 598395977c..e23d82dce4 100644 --- a/languages/i18n/sd.json +++ b/languages/i18n/sd.json @@ -1026,7 +1026,6 @@ "boteditletter": "گ", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|واپرائيندڙ|واپرائيندڙن}} کي نظر ۾ رکندي]", - "rc_categories_any": "چونڊيلن مان ڪو بہ", "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کانپوءِ", "newsectionsummary": "/* $1 */ نئون سيڪشن", "rc-enhanced-expand": "تفصيل ڏيکاريو", diff --git a/languages/i18n/sdc.json b/languages/i18n/sdc.json index 180e320bfe..93a1a4018a 100644 --- a/languages/i18n/sdc.json +++ b/languages/i18n/sdc.json @@ -653,8 +653,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[abbaidadda da {{PLURAL:$1|un'utenti|$1 utenti}}]", - "rc_categories": "Limita a li categuri (siparaddi da \"|\")", - "rc_categories_any": "Cassisia", "newsectionsummary": "/* $1 */ noba sezzioni", "rc-enhanced-expand": "Musthrà dettagli (dumanda JavaScript)", "rc-enhanced-hide": "Cua dettàgli", diff --git a/languages/i18n/se.json b/languages/i18n/se.json index 9f53e48cac..901b15a1b4 100644 --- a/languages/i18n/se.json +++ b/languages/i18n/se.json @@ -509,8 +509,6 @@ "minoreditletter": "u", "newpageletter": "O", "number_of_watching_users_pageview": "[$1 čuovvujeaddji geavaheaddji]", - "rc_categories": "Beare luohkáin (earuheaddji lea ”|”)", - "rc_categories_any": "Mii beare", "recentchangeslinked": "Dán siiddu varas rievdadusat", "recentchangeslinked-feed": "Dán siiddu varas rievdadusat", "recentchangeslinked-toolbox": "Dán siiddu varas rievdadusat", diff --git a/languages/i18n/sei.json b/languages/i18n/sei.json index bfa6b5e5ea..1436537453 100644 --- a/languages/i18n/sei.json +++ b/languages/i18n/sei.json @@ -493,8 +493,6 @@ "newpageletter": "H", "boteditletter": "R", "number_of_watching_users_pageview": "[$1 cait(o/ó)m cáminot]", - "rc_categories": "Limitde cayliíb (separatman \"|\" mii)", - "rc_categories_any": "Jömde pac", "newsectionsummary": "/* $1 */ hunseccion", "recentchangeslinked": "Quiix hámíigonix", "recentchangeslinked-feed": "Quiix hámíigonix", diff --git a/languages/i18n/ses.json b/languages/i18n/ses.json index f629d11ae8..da31a63398 100644 --- a/languages/i18n/ses.json +++ b/languages/i18n/ses.json @@ -1130,8 +1130,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 goo ma {{PLURAL:$1|goykaa|goykey}} guna]", - "rc_categories": "Kayandi dumey ga (i fay nda \"|\")", - "rc_categories_any": "Affoo kul", "rc-change-size": "$1", "rc-change-size-new": "{{PLURAL:$1|cebsi}} $1 barmaa banda ga", "newsectionsummary": "/* $1 */ dunbu taaga", diff --git a/languages/i18n/sgs.json b/languages/i18n/sgs.json index 392a55b98c..2ebb63ad73 100644 --- a/languages/i18n/sgs.json +++ b/languages/i18n/sgs.json @@ -898,8 +898,6 @@ "newpageletter": "N", "boteditletter": "r", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keravuojontis nauduotuos|keravuojontīs nauduotuojē|keravuojontiu nauduotuoju}}]", - "rc_categories": "Ruodītė tėk tas kateguorėjės (atskirkat nauduojont „|“)", - "rc_categories_any": "Bikuokė", "rc-change-size-new": "$1 {{PLURAL:$1|baits|baitā|baitu}} pu pakeitėma", "newsectionsummary": "/* $1 */ naus skėrsnelis", "rc-enhanced-expand": "Ruodītė smolkmenas", diff --git a/languages/i18n/sh.json b/languages/i18n/sh.json index 3f0065fd17..ca5597b0a8 100644 --- a/languages/i18n/sh.json +++ b/languages/i18n/sh.json @@ -1178,8 +1178,6 @@ "newpageletter": "N/Н", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]", - "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):", - "rc_categories_any": "Bilo koju odabranu", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene", "newsectionsummary": "/* $1 */ nova sekcija", "rc-enhanced-expand": "Pokaži detalje", @@ -3004,7 +3002,7 @@ "feedback-subject": "Tema:", "feedback-submit": "Unesi", "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.", - "searchsuggest-search": "Traži", + "searchsuggest-search": "Traži {{GRAMMAR:akuzativ|{{SITENAME}}}}", "searchsuggest-containing": "sadrži...", "api-error-badtoken": "Unutrašnja greška: token nije ispravan.", "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.", diff --git a/languages/i18n/shi.json b/languages/i18n/shi.json index 38894c0b7a..7d7adf55bd 100644 --- a/languages/i18n/shi.json +++ b/languages/i18n/shi.json @@ -637,7 +637,6 @@ "boteditletter": "ⴱ", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 iżŗi {{PLURAL:$1|amsqdac|imsqdacn}}]", - "rc_categories_any": "wanna", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|ⴱⴰⵢⵜ|ⵉⴷ ⴱⴰⵢⵜ}} ⴷⴼⴼⵉⵔ ⵏ ⵓⵙⵏⴼⵍ", "newsectionsummary": "/* $1 */ ⵜⵉⴳⵣⵎⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ", diff --git a/languages/i18n/shn.json b/languages/i18n/shn.json index 74f24b1155..7849d68db8 100644 --- a/languages/i18n/shn.json +++ b/languages/i18n/shn.json @@ -1178,7 +1178,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 ပႂ်ႉတူၺ်း {{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း|ၽူႈၸႂ်ႉတိုဝ်းၶဝ်}}]", - "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ", "newsectionsummary": "/* $1 */ ၵၼ်ဢၼ်မႂ်ႇ", "rc-enhanced-expand": "ၼႄပၼ် ႁူဝ်ယွႆႈမၼ်း", diff --git a/languages/i18n/si.json b/languages/i18n/si.json index b1980a40e5..0fb539bd7e 100644 --- a/languages/i18n/si.json +++ b/languages/i18n/si.json @@ -1213,8 +1213,6 @@ "newpageletter": "නව", "boteditletter": "රොබෝ", "number_of_watching_users_pageview": "[ {{PLURAL:$1| එක් පරිශීලකයෙක් මුර-කරයි|පරිශීලකවරුන් $1 ක් මුර-කරති}} ]", - "rc_categories": "ප්‍රවර්ගයන්ට සීමා කරන්න (\"|\" මගින් වෙන් කරන්න):", - "rc_categories_any": "තෝරාගත් ඕනෑම එකක්", "rc-change-size": "$1", "rc-change-size-new": "වෙනස් කළ පසු {{PLURAL:$1|බයිට|බයිටයන්}} $1 ක්", "newsectionsummary": "/* $1 */ නව ඡේදය", diff --git a/languages/i18n/sk.json b/languages/i18n/sk.json index 4ada884f72..e962b5039a 100644 --- a/languages/i18n/sk.json +++ b/languages/i18n/sk.json @@ -1434,8 +1434,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|sledujúci používateľ|sledujúci používatelia|sledujúcich používateľov}}]", - "rc_categories": "Obmedziť na kategórie (oddeľte znakom „|“)", - "rc_categories_any": "Akékoľvek z vybraných", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtov}} po zmene", "newsectionsummary": "/* $1 */ nová sekcia", "rc-enhanced-expand": "Zobraziť podrobnosti", diff --git a/languages/i18n/skr-arab.json b/languages/i18n/skr-arab.json index f76e8dc632..991e75691f 100644 --- a/languages/i18n/skr-arab.json +++ b/languages/i18n/skr-arab.json @@ -390,6 +390,7 @@ "loginreqlink": "لاگ ان", "accmailtitle": "پاس ورڈ بھیج ݙتے", "newarticle": "(نواں)", + "noarticletext": "ہݨ ایں ورقے تے کجھ کائنی لکھیا ہویا۔تساں ٻیاں ورقیاں وچ [[Special:Search/{{PAGENAME}}|ایں ورقے دے عنوان کوں ڳولھ سڳدے ہو]]، [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ لاڳ وچ ڳولھ سڳدے ہو]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ایں ورقے کوں مُنڈھوں بݨا سڳدے ہو]۔", "userpage-userdoesnotexist-view": "صارف کھاتہ \"$1\" رجسٹرڈ کائنی۔", "updated": "(اپ ڈیٹ تھی ڳیا)", "note": "نوٹ:", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 982fb961b0..b08b5cf8f4 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -1457,8 +1457,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[temo {{PLURAL:$1|spremlja|spremljata|spremljajo|spremlja|spremlja}} $1 {{PLURAL:$1|uporabnik|uporabnika|uporabniki|uporabnikov|uporabnikov}}]", - "rc_categories": "Omejitev na kategorije (ločite jih z »|«):", - "rc_categories_any": "Katera koli od izbranih", "rc-change-size-new": "po spremembi: $1 {{PLURAL:$1|zlog|zloga|zlogi|zlogov}}", "newsectionsummary": "/* $1 */ nov razdelek", "rc-enhanced-expand": "Pokaži podrobnosti", diff --git a/languages/i18n/sli.json b/languages/i18n/sli.json index e25511cbd0..835e324503 100644 --- a/languages/i18n/sli.json +++ b/languages/i18n/sli.json @@ -727,8 +727,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beobachtender|beobachtende}} Nutzer]", - "rc_categories": "Ock Seyta aus dann Kategorien (getrennt miet „|“):", - "rc_categories_any": "Olle", "newsectionsummary": "Neuer Obschnitt /* $1 */", "rc-enhanced-expand": "Details oazeega (beneetigt JavaScript)", "rc-enhanced-hide": "Details verstecka", diff --git a/languages/i18n/so.json b/languages/i18n/so.json index e5f30ea130..c043222969 100644 --- a/languages/i18n/so.json +++ b/languages/i18n/so.json @@ -707,7 +707,6 @@ "minoreditletter": "y", "newpageletter": "C", "boteditletter": "b", - "rc_categories": "Wuxuu u gaar yahay qeybaha (u kala qeybsan \"|\")", "rc-enhanced-expand": "Itus ka hadalka (waxaa loo baahanyahay JavaScript)", "rc-enhanced-hide": "Qari ka hadalka", "recentchangeslinked": "Isbedelada la'xiriira", diff --git a/languages/i18n/sq.json b/languages/i18n/sq.json index 355a49b94e..a679ae46d9 100644 --- a/languages/i18n/sq.json +++ b/languages/i18n/sq.json @@ -101,30 +101,30 @@ "thu": "Enj", "fri": "Pre", "sat": "Sht", - "january": "Janar", - "february": "Shkurt", - "march": "Mars", - "april": "Prill", - "may_long": "Maj", - "june": "Qershor", - "july": "Korrik", - "august": "Gusht", - "september": "Shtator", - "october": "Tetor", - "november": "Nëntor", - "december": "Dhjetor", - "january-gen": "Janar", - "february-gen": "Shkurt", - "march-gen": "Mars", - "april-gen": "Prill", - "may-gen": "Maj", - "june-gen": "Qershor", - "july-gen": "Korrik", - "august-gen": "Gusht", - "september-gen": "Shtator", - "october-gen": "Tetor", - "november-gen": "Nëntor", - "december-gen": "Dhjetor", + "january": "janar", + "february": "shkurt", + "march": "mars", + "april": "prill", + "may_long": "maj", + "june": "qershor", + "july": "korrik", + "august": "gusht", + "september": "shtator", + "october": "tetor", + "november": "nëntor", + "december": "dhjetor", + "january-gen": "janar", + "february-gen": "shkurt", + "march-gen": "mars", + "april-gen": "prill", + "may-gen": "maj", + "june-gen": "qershor", + "july-gen": "korrik", + "august-gen": "gusht", + "september-gen": "shtator", + "october-gen": "tetor", + "november-gen": "nëntor", + "december-gen": "dhjetor", "jan": "Jan", "feb": "Shk", "mar": "Mar", @@ -308,7 +308,7 @@ "nstab-project": "Projekti", "nstab-image": "Skedari", "nstab-mediawiki": "Mesazhi", - "nstab-template": "Shablloni", + "nstab-template": "Stampa", "nstab-help": "Ndihmë", "nstab-category": "Kategoria", "mainpage-nstab": "Faqja kryesore", @@ -1363,8 +1363,6 @@ "newpageletter": "R", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 duke u mbikqyrur nga {{PLURAL:$1|përdorues|përdorues}}]", - "rc_categories": "Kufizimi i kategorive (të ndara me \"|\")", - "rc_categories_any": "Ndonjë nga të zgjedhurat", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajtë}} pas ndryshimit", "newsectionsummary": "/* $1 */ seksion i ri", "rc-enhanced-expand": "Trego detajet", diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index b891c43211..12a90f7f79 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -45,35 +45,35 @@ "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница", "tog-hidecategorization": "Сакриј категоризацију страница", "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих", - "tog-usenewrc": "Групни приказ измена сваке појединачне странице у скорашњим изменама и списку надгледања", + "tog-usenewrc": "Групиши измене по страници у скорашњим изменама и списку надгледања", "tog-numberheadings": "Аутоматски нумериши поднаслове", "tog-showtoolbar": "Прикажи траку с алаткама за уређивање", "tog-editondblclick": "Уређивање страница двоструким кликом", "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове", - "tog-watchcreations": "Додај странице које направим и датотеке које пошаљем у мој списак надгледања", + "tog-watchcreations": "Додај странице које направим и датотеке које отпремим у мој списак надгледања", "tog-watchdefault": "Додај странице и датотеке које изменим у мој списак надгледања", "tog-watchmoves": "Додај странице и датотеке које преместим у мој списак надгледања", "tog-watchdeletion": "Додај странице и датотеке које обришем у мој списак надгледања", "tog-watchuploads": "Додај датотеке које отпремим у мој списак надгледања", "tog-watchrollback": "Додај странице на којима сам вратио измене у мој списак надгледања", "tog-minordefault": "Означавај све измене као мање", - "tog-previewontop": "Прикажи претпреглед пре оквира за уређивање", - "tog-previewonfirst": "Прикажи преглед на првој измени", - "tog-enotifwatchlistpages": "Пошаљи ми имејл када се страница или датотека коју надгледам измени", - "tog-enotifusertalkpages": "Пошаљи ми имејл када се моја страница за разговор измени", - "tog-enotifminoredits": "Пошаљи ми имејл и за мање измене страница и датотека", - "tog-enotifrevealaddr": "Прикажи моју имејл адресу у порукама обавештења", + "tog-previewontop": "Прикажи претпреглед изнад оквира за уређивање", + "tog-previewonfirst": "Прикажи претпреглед при првој измени", + "tog-enotifwatchlistpages": "Пошаљи ми имејл када се промени страница или датотека са мог списка надгледања", + "tog-enotifusertalkpages": "Пошаљи ми имејл кад се промени моја страница за разговор", + "tog-enotifminoredits": "Пошаљи ми имејл и код мањих измена страница и датотека", + "tog-enotifrevealaddr": "Откриј моју имејл адресу у порукама обавештења", "tog-shownumberswatching": "Прикажи број корисника који надгледају", - "tog-oldsig": "Тренутни потпис:", + "tog-oldsig": "Ваш тренутни потпис:", "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)", - "tog-uselivepreview": "Прикажи претпреглед без освежавања странице", + "tog-uselivepreview": "Прикажи претпреглед без поновног учитавања странице", "tog-forceeditsummary": "Упозори ме када не унесем опис измене", "tog-watchlisthideown": "Сакриј моје измене са списка надгледања", "tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања", "tog-watchlisthideminor": "Сакриј мање измене са списка надгледања", "tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања", - "tog-watchlistreloadautomatically": "Аутоматски освежи списак надгледања кад год се филтер измени (потребан JavaScript)", - "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан ЈаваСкрипт)", + "tog-watchlistreloadautomatically": "Аутоматски поново учитај списак надгледања кад год се филтер измени (потребан JavaScript)", + "tog-watchlistunwatchlinks": "Додај везе за директно додавање/уклањање ставки са списка надгледања (потребан JavaScript)", "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања", "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања", "tog-watchlisthidecategorization": "Сакриј категоризацију страница", @@ -82,11 +82,11 @@ "tog-showhiddencats": "Прикажи скривене категорије", "tog-norollbackdiff": "Не приказуј разлику након извршеног враћања", "tog-useeditwarning": "Упозори ме када напуштам страницу са несачуваним изменама", - "tog-prefershttps": "Увек користи сигурну конекцију када сам пријављен.", + "tog-prefershttps": "Увек користи сигурну везу док сам пријављен.", "underline-always": "Увек", "underline-never": "Никад", "underline-default": "Према теми или прегледачу", - "editfont-style": "Изглед фонта у уређивачком оквиру:", + "editfont-style": "Стил фонта у оквиру за уређивање:", "editfont-monospace": "Сразмерно широк фонт", "editfont-sansserif": "Бесерифни фонт", "editfont-serif": "Серифни фонт", @@ -140,18 +140,18 @@ "oct": "окт", "nov": "нов", "dec": "дец", - "january-date": "$1 јануар", - "february-date": "$1 фебруар", - "march-date": "$1 март", - "april-date": "$1 април", - "may-date": "$1 мај", - "june-date": "$1 јун", - "july-date": "$1 јул", - "august-date": "$1 август", - "september-date": "$1 септембар", - "october-date": "$1 окотобар", - "november-date": "$1 новембар", - "december-date": "$1 децембар", + "january-date": "$1. јануар", + "february-date": "$1. фебруар", + "march-date": "$1. март", + "april-date": "$1. април", + "may-date": "$1. мај", + "june-date": "$1. јун", + "july-date": "$1. јул", + "august-date": "$1. август", + "september-date": "$1. септембар", + "october-date": "$1. окотобар", + "november-date": "$1. новембар", + "december-date": "$1. децембар", "period-am": "преподне", "period-pm": "поподне", "pagecategories": "{{PLURAL:$1|Категорија|Категорије|Категорија}}", @@ -172,7 +172,7 @@ "noindex-category": "Непописане странице", "broken-file-category": "Странице с неисправним везама до датотека", "about": "О нама", - "article": "Страница са садржајем", + "article": "Чланак", "newwindow": "(отвара се у новом прозору)", "cancel": "Откажи", "moredotdotdot": "Више…", @@ -189,10 +189,10 @@ "navigation-heading": "Навигациони мени", "errorpagetitle": "Грешка", "returnto": "Назад на $1.", - "tagline": "Из {{SITENAME}}", + "tagline": "Извор: {{SITENAME}}", "help": "Помоћ", "search": "Претражи", - "search-ignored-headings": "#
\n# Наслови који ће бити игнорисани упитом\n# Промене су видљиве одмах након што страница са насловом буде пописана\n# Можете изнудити поновно пописивање са \"нулл\" променом\n# Синтакса је следећа:\n# * Свака врста која започиње \"#\" знаком па све до краја је коментар\n# * Свака не празна врста је тачан наслов за занемарити, у тачном облику\nРеференце\nСпољашње везе\nПогледајте\n#
", + "search-ignored-headings": " #
\n# Наслови који ће бити занемарени при претрази.\n# Измене су видљиве одмах након што се страница са насловом попише.\n# Можете изнудити поновно пописивање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #
", "searchbutton": "Претражи", "go": "Иди", "searcharticle": "Иди", @@ -231,12 +231,12 @@ "viewhelppage": "Погледај страницу помоћи", "categorypage": "Погледај страницу категорије", "viewtalkpage": "Погледај разговор", - "otherlanguages": "На другим језицима", + "otherlanguages": "Други језици", "redirectedfrom": "(преусмерено са $1)", "redirectpagesub": "Преусмерење", "redirectto": "Преусмерава на:", "lastmodifiedat": "Ова страница је последњи пут уређена на датум $1 у $2 ч.", - "viewcount": "Ова страница је прегледана {{PLURAL:$1|једанпут|$1 пута|$1 пута}}.", + "viewcount": "Овој страници је приступљено {{PLURAL:$1|једанпут|$1 пута}}.", "protectedpage": "Заштићена страница", "jumpto": "Иди на:", "jumptonavigation": "навигацију", @@ -252,35 +252,35 @@ "aboutpage": "Project:О нама", "copyright": "Садржај је доступан под лиценцом $1 осим ако је другачије наведено.", "copyrightpage": "{{ns:project}}:Ауторска права", - "currentevents": "Актуелности", - "currentevents-url": "Project:Актуелности", + "currentevents": "Новости", + "currentevents-url": "Project:Новости", "disclaimers": "Одрицање одговорности", "disclaimerpage": "Project:Одрицање одговорности", "edithelp": "Помоћ при уређивању", "helppage-top-gethelp": "Помоћ", - "mainpage": "Главна страна", - "mainpage-description": "Главна страна", + "mainpage": "Главна страница", + "mainpage-description": "Главна страница", "policy-url": "Project:Правила", "portal": "Портал заједнице", - "portal-url": "Project:Радионица", + "portal-url": "Project:Портал заједнице", "privacy": "Политика приватности", "privacypage": "Project:Политика приватности", "badaccess": "Грешке у овлашћењима", - "badaccess-group0": "Није вам дозвољено да извршите захтевану радњу.", + "badaccess-group0": "Није Вам дозвољено да извршите захтевану радњу.", "badaccess-groups": "Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.", - "versionrequired": "Потребно је издање $1 Медијавикија", - "versionrequiredtext": "Потребно је издање $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].", + "versionrequired": "Потребно је $1 издање Медијавикија", + "versionrequiredtext": "Потребно је $1 издање Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].", "ok": "У реду", "pagetitle": "$1 — {{SITENAME}}", "pagetitle-view-mainpage": "{{SITENAME}}", "backlinksubtitle": "← $1", "retrievedfrom": "Преузето из „$1“", "youhavenewmessages": "Имате $1 ($2).", - "youhavenewmessagesfromusers": "Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).", + "youhavenewmessagesfromusers": "{{PLURAL:$4|Имате}} $1 од {{PLURAL:$3|другог корисника|$3 корисника}} ($2).", "youhavenewmessagesmanyusers": "Имате $1 од много корисника ($2).", - "newmessageslinkplural": "{{PLURAL:$1|нову поруку|999=нове поруке}}", - "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|999=последње измене}}", - "youhavenewmessagesmulti": "Имате нових порука на $1", + "newmessageslinkplural": "{{PLURAL:$1|нову поруку|нове поруке|нових порука}}", + "newmessagesdifflinkplural": "{{PLURAL:$1|последња измена|последње измене|последњих измена}}", + "youhavenewmessagesmulti": "Имате нове поруке на $1", "editsection": "уреди", "editold": "уреди", "viewsourceold": "изворни код", @@ -295,8 +295,8 @@ "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?", "confirmable-yes": "Да", "confirmable-no": "Не", - "thisisdeleted": "Погледати или вратити $1?", - "viewdeleted": "Погледати $1?", + "thisisdeleted": "Погледај или врати $1?", + "viewdeleted": "Погледај $1?", "restorelink": "{{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}", "feedlinks": "Довод:", "feed-invalid": "Неисправна врста довода.", @@ -320,7 +320,7 @@ "nstab-template": "Шаблон", "nstab-help": "Помоћ", "nstab-category": "Категорија", - "mainpage-nstab": "Главна страна", + "mainpage-nstab": "Главна страница", "nosuchaction": "Нема такве радње", "nosuchactiontext": "Радња наведена у адреси није исправна.\nМожда сте погрешно написали адресу или сте пратили застарелу везу.\nМогуће је и да се ради о грешци у софтверу викија.", "nosuchspecialpage": "Нема такве посебне странице", @@ -332,7 +332,7 @@ "databaseerror-query": "Упит: $1", "databaseerror-function": "Функција: $1", "databaseerror-error": "Грешка: $1", - "laggedslavemode": "Упозорење: страница је можда застарела.", + "laggedslavemode": "Упозорење: могуће је да страница није ажурирана.", "readonly": "База података је закључана", "enterlockreason": "Унесите разлог за закључавање, укључујући и време откључавања", "readonlytext": "База података је тренутно закључана, што значи да је није могуће мењати.\n\nСистемски администратор је навео следеће објашњење: $1", @@ -341,17 +341,17 @@ "missingarticle-diff": "(разлика: $1, $2)", "readonly_lag": "База података је аутоматски закључана да би се секундарни сервери базе података ускладили с главним.", "internalerror": "Унутрашња грешка", - "internalerror_info": "Унутрашња грешка: $1", + "internalerror_info": "Интерна грешка: $1", "internalerror-fatal-exception": "Фатална грешка типа „$1“", - "filecopyerror": "Не могу да умножим датотеку „$1“ у „$2“.", + "filecopyerror": "Не могу да копирам датотеку „$1“ у „$2“.", "filerenameerror": "Не могу да преименујем датотеку „$1“ у „$2“.", "filedeleteerror": "Не могу да обришем датотеку „$1“.", - "directorycreateerror": "Не могу да направим фасциклу „$1“.", + "directorycreateerror": "Не могу да направим директоријум „$1“.", "directoryreadonlyerror": "Директоријум „$1“ је само за читање.", "directorynotreadableerror": "Директоријум „$1“ није читљив.", "filenotfound": "Не могу да пронађем датотеку „$1“.", "unexpected": "Неочекивана вредност: „$1“=„$2“.", - "formerror": "Грешка: не могу да пошаљем образац", + "formerror": "Грешка: не могу да пошаљем образац.", "badarticleerror": "Ова радња се не може извршити на овој страници.", "cannotdelete": "Не могу да обришем страницу или датотеку „$1“.\nВероватно ју је неко други обрисао.", "cannotdelete-title": "Не могу да обришем страницу „$1“", @@ -423,6 +423,7 @@ "cannotloginnow-title": "Пријава тренутно није могућа", "cannotloginnow-text": "Пријава није могућа када се користи $1.", "cannotcreateaccount-title": "Отварање налога није могуће", + "cannotcreateaccount-text": "Директно прављење налога није омогућено на овом викију.", "yourdomainname": "Домен:", "password-change-forbidden": "Не можете да промените лозинку на овом викију.", "externaldberror": "Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.", @@ -445,9 +446,11 @@ "createacct-email-ph": "Унесите Вашу имејл адресу", "createacct-another-email-ph": "Унесите имејл адресу", "createaccountmail": "Користите привремену, случајно створену лозинку и пошаљите на наведену имејл адресу", + "createaccountmail-help": "Може се користити да се некоме направи налог без сазнања лозинке.", "createacct-realname": "Право име (необавезно)", "createacct-reason": "Разлог", "createacct-reason-ph": "Зашто правите још један налог?", + "createacct-reason-help": "Порука која се приказује у дневнику стварања корисничких налога", "createacct-submit": "Отвори налог", "createacct-another-submit": "Отвори налог", "createacct-continue-submit": "Наставите отварање налога", @@ -537,6 +540,7 @@ "botpasswords-label-cancel": "Откажи", "botpasswords-label-delete": "Обриши", "botpasswords-label-resetpassword": "Ресетуј лозинку", + "botpasswords-label-grants": "Применљиве дозволе:", "botpasswords-label-grants-column": "Одобрено", "botpasswords-bad-appid": "„$1” није исправан назив бота.", "botpasswords-insert-failed": "Неуспешно додавање бота \"$1\". Да ли је већ додат?", @@ -548,6 +552,8 @@ "botpasswords-deleted-title": "Обрисана лозинка бота", "botpasswords-deleted-body": "Лозинка за бота „$1” корисника „$2” је обрисана.", "botpasswords-no-provider": "BotPasswordsSessionProvider није доступан.", + "botpasswords-restriction-failed": "Не можете се пријавити због ограничења лозинки за ботове.", + "botpasswords-not-exist": "Корисник „$1“ нема лозинку бота „$2“.", "resetpass_forbidden": "Лозинка не може бити промењена", "resetpass_forbidden-reason": "Лозинке није могуће променити: $1", "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.", @@ -998,7 +1004,7 @@ "recentchangesdays-max": "Највише $1 {{PLURAL:$1|дан|дана}}", "recentchangescount": "Број измена за приказ:", "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.", - "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].", + "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваш списак надгледања, зато кључ немојте одавати никоме. \nАко је потребно, кључ [[Special:ResetTokens|можете ресетовати]].", "savedprefs": "Ваша подешавања су сачувана.", "savedrights": "Корисничке групе за {{GENDER:$1|$1}} су сачуване.", "timezonelegend": "Временска зона:", @@ -1022,7 +1028,7 @@ "email-blacklist-label": "Онемогући следећим корисницима да ми шаљу имејлове:", "prefs-searchoptions": "Претрага", "prefs-namespaces": "Именски простори", - "default": "подразумевано", + "default": "подразумевана", "prefs-files": "Датотеке", "prefs-custom-css": "Прилагођени CSS", "prefs-custom-js": "Прилагођени јаваскрипт", @@ -1197,6 +1203,10 @@ "grant-group-file-interaction": "Уређивање датотека", "grant-group-watchlist-interaction": "Уређивање вашег списка надгледања", "grant-group-email": "Пошаљи имејл", + "grant-group-high-volume": "Извршавање великог броја радњи", + "grant-group-customization": "Прилагођавање и подешавања", + "grant-group-administration": "Извршавање административних радњи", + "grant-group-private-information": "Приступање Вашим личним подацима", "grant-group-other": "Разне активности", "grant-blockusers": "Блокирање и деблокирање корисника", "grant-createaccount": "Отварање налога", @@ -1209,6 +1219,7 @@ "grant-editpage": "Уређивање постојећих страница", "grant-editprotected": "Уређивање заштићених страница", "grant-highvolume": "Масовно уређивање", + "grant-oversight": "Скривање корисника и измена", "grant-patrol": "Патролирање измена", "grant-privateinfo": "Приступи приватним информацијама", "grant-protect": "Закључавање и откључавање страница", @@ -1219,6 +1230,7 @@ "grant-basic": "Основна права", "grant-viewdeleted": "Преглед обрисаних страница и датотека", "grant-viewmywatchlist": "Преглед вашег списак надгледања", + "grant-viewrestrictedlogs": "Прегледање ограничених уноса у дневнику", "newuserlogpage": "Дневник нових корисника", "newuserlogpagetext": "Ово је дневник нових корисника.", "rightslog": "Дневник корисничких права", @@ -1242,7 +1254,9 @@ "action-writeapi": "писање АПИ-ја", "action-delete": "брисање ове странице", "action-deleterevision": "брисање измена", + "action-deletelogentry": "бирсање уноса у дневницима", "action-deletedhistory": "прегледање обрисане историје странице", + "action-deletedtext": "преглед обрисаног текста измене", "action-browsearchive": "претраживање обрисаних страница", "action-undelete": "враћање страница", "action-suppressrevision": "прегледање и враћање сакривених измена", @@ -1276,9 +1290,10 @@ "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|измена од ваше последње посете}}", "enhancedrc-history": "историја", "recentchanges": "Скорашње измене", - "recentchanges-legend": "Опције скорашњих измена", + "recentchanges-legend": "Подешавања скорашњих измена", "recentchanges-summary": "Пратите скорашње измене на овој страници.", - "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.", + "recentchanges-noresult": "Нема измена у задатом периоду који одговарају овим критеријумима.", + "recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.", "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.", "recentchanges-label-newpage": "Нова страница", "recentchanges-label-minor": "Мања измена", @@ -1298,7 +1313,7 @@ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене}}, $2", "rcfilters-date-popup-title": "Временски период", "rcfilters-days-title": "Скорашњи дани", - "rcfilters-hours-title": "Скорашњи сати", + "rcfilters-hours-title": "Скорашње сати", "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}", "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}", "rcfilters-highlighted-filters-list": "Истакнуто: $1", @@ -1410,6 +1425,10 @@ "rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су подебљане, са испуњеним ознакама.", "rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена", "rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.", + "rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе", + "rcfilters-filter-showlinkedfrom-option-label": "Странице са којих долазе везе до изабране странице", + "rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе", + "rcfilters-filter-showlinkedto-option-label": "Странице ка којима воде везе са одабране странице", "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од $3, $4 (до $1 приказано).", "rclistfromreset": "Ресетуј одабир датума", "rclistfrom": "Прикажи нове измене почев од $2, $3", @@ -1444,8 +1463,6 @@ "boteditletter": "б", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]", - "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом):", - "rc_categories_any": "Сви изабрани", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене", "newsectionsummary": "/* $1 */ нови одељак", @@ -1541,6 +1558,7 @@ "uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <$1 $2=\"$3\"> у постављеној SVG датотеци.", "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <$1 $2=\"$3\"> у постављеној SVG датотеци.", "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „$1“", + "uploadinvalidxml": "Није могуће рашчланити XML отпремљене датотеке.", "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1", "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.", "upload-source": "Изворна датотека", @@ -1563,7 +1581,8 @@ "upload-too-many-redirects": "Адреса садржи превише преусмерења", "upload-http-error": "Дошло је до HTTP грешке: $1", "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.", - "upload-dialog-title": "Отпремање датотека", + "upload-dialog-disabled": "Постављање датотека помоћу овог дијалога је онемогућено на овом викију.", + "upload-dialog-title": "Отпреми датотеку", "upload-dialog-button-cancel": "Откажи", "upload-dialog-button-back": "Назад", "upload-dialog-button-done": "Готово", @@ -1577,6 +1596,7 @@ "upload-form-label-own-work": "Ово је моје сопствено дело", "upload-form-label-infoform-categories": "Категорије", "upload-form-label-infoform-date": "Датум", + "upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].", "backend-fail-stream": "Не могу да емитујем датотеку $1.", "backend-fail-backup": "Не могу да направим резерву датотеке $1.", "backend-fail-notexists": "Датотека $1 не постоји.", @@ -1625,9 +1645,22 @@ "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.", "uploadstash-errclear": "Чишћење датотека није успело.", "uploadstash-refresh": "Освежи списак датотека", + "uploadstash-thumbnail": "погледај минијатуру", "uploadstash-bad-path": "Путања не постоји.", "uploadstash-bad-path-invalid": "Путања није исправна.", "uploadstash-bad-path-unknown-type": "Непознат тип „$1“.", + "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.", + "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.", + "uploadstash-file-not-found-no-thumb": "Не могу добити минијатуру.", + "uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.", + "uploadstash-file-not-found-no-object": "Не могу направити локални датотечни објекат за минијатуру.", + "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2", + "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.", + "uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.", + "uploadstash-wrong-owner": "Ова датотека ($1) не припада тренутном кориснику.", + "uploadstash-no-such-key": "Нема таквог кључа ($1). Не могу уклонити.", + "uploadstash-no-extension": "Нема траженог додатка.", + "uploadstash-zero-length": "Датотека је празна", "invalid-chunk-offset": "Неисправна полазна тачка", "img-auth-accessdenied": "Приступ је одбијен", "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.", @@ -1774,9 +1807,11 @@ "pageswithprop-legend": "Стране с особином стране", "pageswithprop-text": "Ова страна излистава стране које имају одређену особину", "pageswithprop-prop": "Име особине:", - "pageswithprop-reverse": "Сортирај у супротном редоследу", - "pageswithprop-sortbyvalue": "Сортирај према својствима", + "pageswithprop-reverse": "Поређај у супротном редоследу", + "pageswithprop-sortbyvalue": "Поређај према својствима", "pageswithprop-submit": "Иди", + "pageswithprop-prophidden-long": "сакривено дуго текстуално својство ($1)", + "pageswithprop-prophidden-binary": "сакривено дуго бинарно својство ($1)", "doubleredirects": "Двострука преусмерења", "doubleredirectstext": "Ова страница приказује странице које преусмеравају на друга преусмерења.\nСваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.\nПрецртани уноси су већ решени.", "double-redirect-fixed-move": "[[$1]] је премештен.\nАутоматски је ажурирано и сада преусмерава на [[$2]].", @@ -1855,7 +1890,7 @@ "listusers": "Списак корисника", "listusers-editsonly": "Прикажи само кориснике који су уређивали", "listusers-creationsort": "Поређај по датуму стварања", - "listusers-desc": "Сортирај у опадајућем редоследу", + "listusers-desc": "Поређај у опадајућем редоследу", "usereditcount": "$1 {{PLURAL:$1|измена|измене|измена}}", "usercreated": "{{GENDER:$3|је направио|је направила|је направио}} дана $1 у $2", "newpages": "Нове странице", @@ -1903,7 +1938,12 @@ "apisandbox-sending-request": "Слање API захтева...", "apisandbox-loading-results": "Пријем API резултата...", "apisandbox-results-error": "Дошло је до грешке приликом учитавања резултата API упита: $1.", + "apisandbox-request-selectformat-label": "Прикажи сахтеване податке као:", "apisandbox-request-url-label": "Адреса захтева:", + "apisandbox-request-time": "Време за извршавање захтјева: {{PLURAL:$1|$1 милисекунда|$1 милисекунде|$1 милисекунди}}", + "apisandbox-results-fixtoken": "Исправи жетон и пошаљи поново", + "apisandbox-alert-page": "Поља на страници су неисправна.", + "apisandbox-alert-field": "Вредност овог поља је неисправна.", "apisandbox-continue": "Настави", "apisandbox-continue-clear": "Очисти", "apisandbox-multivalue-all-namespaces": "$1 (сви именски простори)", @@ -1914,6 +1954,8 @@ "booksources-search": "Претражи", "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:", "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.", + "magiclink-tracking-rfc": "Странице с магичним RFC везама", + "magiclink-tracking-pmid": "Странице с магичним PMID везама", "magiclink-tracking-isbn": "Странице са ISBN магичним везама", "specialloguserlabel": "Извршилац:", "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):", @@ -1966,6 +2008,8 @@ "activeusers-intro": "Ово је списак корисника који су били активни {{PLURAL:$1|1=претходни дан|у последња $1 дана|у последњих $1 дана}}.", "activeusers-count": "$1 {{PLURAL:$1|радња|радње|радњи}} {{PLURAL:$3|претходни дан|у последња $3 дана|у последњих $3 дана}}", "activeusers-from": "Прикажи кориснике почев од:", + "activeusers-groups": "Прикажи кориснике који су чланови група:", + "activeusers-excludegroups": "Изузми кориснике који су чланови група:", "activeusers-noresult": "Корисник није пронађен.", "activeusers-submit": "Прикажи активне кориснике", "listgrouprights": "Права корисничких група", @@ -1989,11 +2033,14 @@ "listgrouprights-namespaceprotection-namespace": "Именски простор", "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање", "listgrants": "Дозволе", + "listgrants-grant": "Дозвола", "listgrants-rights": "Права", "trackingcategories": "Медијавики категорије", "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењати уређивањем системских порука у именском простору {{ns:8}}.", + "trackingcategories-msg": "Праћење категорије", "trackingcategories-name": "Име поруке", "trackingcategories-desc": "Које странице се налазе у категорији", + "restricted-displaytitle-ignored": "Странице са занемареним насловима за приказ", "noindex-category-desc": "Странице које у себи имају магичну реч __NOINDEX__.", "index-category-desc": "Странице које у себи имају магичну реч __INDEX__ и самим тим су индексиране од стране робота.", "broken-file-category-desc": "Странице које имају везе до непостојећих датотека.", @@ -2118,14 +2165,15 @@ "rollbacklinkcount": "врати $1 {{PLURAL:$1|измену|измене|измена}}", "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}", "rollbackfailed": "Неуспешно враћање", + "rollback-missingrevision": "Не могу учитати податке о измени.", "cantrollback": "Не могу да вратим измену.\nПоследњи аутор је уједно и једини.", "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", "editcomment": "Опис измене: $1.", "revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]", - "revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", - "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.", + "revertpage-nouser": "Измене скривеног корисника су враћене на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", + "rollback-success": "Измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} су враћене на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.", "sessionfailure-title": "Сесија је окончана", - "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.", + "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.", "changecontentmodel": "Промени модел садржаја странице", "changecontentmodel-legend": "Промени модел садржаја", "changecontentmodel-title-label": "Наслов странице", @@ -2136,6 +2184,7 @@ "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.", "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.", "changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање", + "changecontentmodel-emptymodels-title": "Нема доступних модела садржаја", "log-name-contentmodel": "Дневник промене модела садржаја", "log-description-contentmodel": "Ова страница приказује измене у моделима садржаја страница и странице које су направљене са моделом садржаја који се разликује од подразумеваног.", "logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“", @@ -2381,6 +2430,7 @@ "block-log-flags-hiddenname": "корисничко име је сакривено", "range_block_disabled": "Администраторска могућност за блокирање распона ИП адреса је онемогућена.", "ipb_expiry_invalid": "Време истека је неисправно.", + "ipb_expiry_old": "Време истека је у прошлости.", "ipb_expiry_temp": "Сакривене блокаде корисника морају бити трајне.", "ipb_hide_invalid": "Не могу да потиснем овај налог; има више од {{PLURAL:$1|једне измене|$1 измена}}.", "ipb_already_blocked": "„$1“ је већ блокиран.", @@ -2391,6 +2441,7 @@ "ipb_blocked_as_range": "Грешка: IP адреса $1 није директно блокирана и не може да се деблокира.\nОна је блокирана као део блокаде $2, која може бити деблокирана.", "ip_range_invalid": "Неисправан распон IP адреса.", "ip_range_toolarge": "Опсежна блокирања већа од /$1 нису дозвољена.", + "ip_range_toolow": "IP-опсези нису дозвољени.", "proxyblocker": "Блокер посредника", "proxyblockreason": "Ваша ИП адреса је блокирана јер представља отворени посредник.\nОбратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.", "sorbs": "DNSBL", @@ -2429,6 +2480,9 @@ "cant-move-user-page": "Немате дозволу за премештање основних корисничких страница (осим подстраница).", "cant-move-to-user-page": "Немате дозволу за премештање странице на вашу корисничку страницу (осим на корисничку подстраницу).", "cant-move-category-page": "Немате дозволу да премештате странице категорија.", + "cant-move-to-category-page": "Немате дозволу да преместите страницу на страницу категорије.", + "cant-move-subpages": "Немате дозволу да премештате подстранице.", + "namespace-nosubpages": "Имениски простор „$1“ не дозвољава подстранице.", "newtitle": "Нови наслов:", "move-watch": "Надгледај ову страницу", "movepagebtn": "Премести страницу", @@ -2486,6 +2540,7 @@ "export-download": "Сачувај као датотеку", "export-templates": "Укључи шаблоне", "export-pagelinks": "Укључи повезане странице до дубине од:", + "export-manual": "Ручно додај странице:", "allmessages": "Системске поруке", "allmessagesname": "Назив", "allmessagesdefault": "Подразумевани текст", @@ -2525,6 +2580,7 @@ "import-mapping-namespace": "Увези у именски простор:", "import-mapping-subpage": "Увези као подстранице следеће странице:", "import-upload-filename": "Назив датотеке:", + "import-upload-username-prefix": "Међувики префикс:", "import-comment": "Коментар:", "importtext": "Извезите датотеку с изворног викија користећи [[Special:Export|извоз]].\nСачувајте је на рачунар и пошаљите овде.", "importstart": "Увозим странице…", @@ -2533,6 +2589,7 @@ "imported-log-entries": "{{PLURAL:$1|Увезена је $1 ставка извештаја|Увезене су $1 ставке извештаја|Увезено је $1 ставки извештаја}}.", "importfailed": "Неуспешан увоз: $1", "importunknownsource": "Непозната врста за увоз", + "importnoprefix": "Није наведен међувики префикс", "importcantopen": "Не могу да отворим датотеку за увоз", "importbadinterwiki": "Неисправна међувики веза", "importsuccess": "Увожење је завршено!", @@ -2543,7 +2600,7 @@ "importuploaderrortemp": "Не могу да пошаљем датотеку за увоз.\nНедостаје привремена фасцикла.", "import-parse-failure": "Погрешно рашчлањивање XML-а.", "import-noarticle": "Нема странице за увоз!", - "import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешки).", + "import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешака).", "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5", "import-upload": "Отпремање XML података", "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.", @@ -2554,7 +2611,7 @@ "import-error-special": "Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.", "import-error-invalid": "Не могу да увезем страницу „$1“ јер је њен назив неисправан.", "import-error-unserialize": "Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.", - "import-options-wrong": "{{PLURAL:$2|Погрешна опција|Погрешне опције}}: $1", + "import-options-wrong": "{{PLURAL:$2|Погрешно подешавање|Погрешна подешавања}}: $1", "import-rootpage-invalid": "Наведена основна страница има неисправан наслов.", "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.", "importlogpage": "Дневник увоза", @@ -2588,17 +2645,17 @@ "tooltip-ca-move": "Премести ову страницу", "tooltip-ca-watch": "Додај ову страницу на списак надгледања", "tooltip-ca-unwatch": "Уклони ову страницу са списка надгледања", - "tooltip-search": "Претрага", + "tooltip-search": "Претражи", "tooltip-search-go": "Идите на страницу с овим именом, ако постоји", "tooltip-search-fulltext": "Претражите странице с овим текстом", - "tooltip-p-logo": "Посетите главну страну", - "tooltip-n-mainpage": "Посетите главну страну", - "tooltip-n-mainpage-description": "Посетите главну страну", + "tooltip-p-logo": "Посети главну страницу", + "tooltip-n-mainpage": "Посети главну страницу", + "tooltip-n-mainpage-description": "Посети главну страницу", "tooltip-n-portal": "О пројекту, шта можете да радите и где да пронађете ствари", - "tooltip-n-currentevents": "Сазнајте више о текућим догађајима", + "tooltip-n-currentevents": "Сазнај више о тренутним догађајима", "tooltip-n-recentchanges": "Списак скорашњих измена на викију", - "tooltip-n-randompage": "Учитајте случајну страницу", - "tooltip-n-help": "Место где можете да се информишете", + "tooltip-n-randompage": "Учитај случајну страницу", + "tooltip-n-help": "Место где можеш да се информишеш", "tooltip-t-whatlinkshere": "Списак свих страница које воде овде", "tooltip-t-recentchangeslinked": "Скорашње измене на страницама које су повезане с овом страницом", "tooltip-feed-rss": "RSS довод ове странице", @@ -2678,6 +2735,7 @@ "pageinfo-length": "Дужина странице (у бајтовима)", "pageinfo-article-id": "ID странице", "pageinfo-language": "Језик садржаја странице", + "pageinfo-language-change": "промени", "pageinfo-content-model": "Модел садржаја странице", "pageinfo-content-model-change": "промени", "pageinfo-robot-policy": "Индексирање од стране робота", @@ -2714,6 +2772,8 @@ "pageinfo-category-pages": "Број страница", "pageinfo-category-subcats": "Број поткатегорија", "pageinfo-category-files": "Број датотека", + "pageinfo-user-id": "ID корисника", + "pageinfo-file-hash": "Hash вредност", "markaspatrolleddiff": "Означи као патролирано", "markaspatrolledtext": "Означи страницу као патролирану", "markaspatrolledtext-file": "Означи ову верзију датотеке као патролирану", @@ -2776,6 +2836,7 @@ "newimages-hidepatrolled": "Сакриј патролирана отпремања", "newimages-mediatype": "Врста датотеке:", "noimages": "Нема ништа.", + "gallery-slideshow-toggle": "минијатуре", "ilsubmit": "Претражи", "bydate": "по датуму", "sp-newimages-showfrom": "прикажи нове датотеке почевши од $1, $2", @@ -3040,6 +3101,7 @@ "exif-compression-34712": "JPEG2000", "exif-copyrighted-true": "Заштићено ауторским правом", "exif-copyrighted-false": "Није дефинисан", + "exif-photometricinterpretation-1": "Црно-бело (црна је 0)", "exif-photometricinterpretation-2": "RGB", "exif-photometricinterpretation-6": "YCbCr", "exif-unknowndate": "Непознат датум", @@ -3252,6 +3314,7 @@ "confirm-unwatch-button": "У реду", "confirm-unwatch-top": "Уклонити ову страницу са списка надгледања?", "confirm-rollback-button": "У реду", + "confirm-rollback-top": "Врати измене на овој страници?", "semicolon-separator": "; ", "comma-separator": ", ", "colon-separator": ": ", @@ -3370,6 +3433,7 @@ "hebrew-calendar-m12-gen": "Елул", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|разговор]])", "timezone-utc": "UTC", + "timezone-local": "Локално", "duplicate-defaultsort": "Упозорење: Подразумевани кључ сврставања „$2“ мења ранији подразумевани кључ сврставања „$1“.", "duplicate-displaytitle": "Упозорење: наслов за приказ „$2“ замениће постојећи „$1“.", "restricted-displaytitle": "Упозорење: Наслов за приказ „$1” је игнорисан пошто није еквивалентан стварном наслову странице.", @@ -3400,6 +3464,7 @@ "version-ext-colheader-credits": "Аутори", "version-license-title": "Лиценца за $1", "version-license-not-found": "За ову екстензију није нађена информација о лиценци.", + "version-credits-title": "Заслуге за $1", "version-poweredby-credits": "Овај вики покреће '''[https://www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.", "version-poweredby-others": "остали", "version-poweredby-translators": "translatewiki.net преводиоци", @@ -3426,6 +3491,7 @@ "redirect-page": "ID странице", "redirect-revision": "Измена странице", "redirect-file": "Назив датотеке", + "redirect-logid": "ID дневника", "redirect-not-exists": "Вредност није пронађена", "fileduplicatesearch": "Претрага дупликата", "fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.", @@ -3472,7 +3538,7 @@ "tag-mw-replace-description": "Измене који уклањају више од 90% садржаја странице", "tag-mw-rollback": "Враћање", "tag-mw-rollback-description": "Измене које враћају страницу на претходне измене", - "tag-mw-undo": "Поништена измена", + "tag-mw-undo": "Поништена ранија измена", "tag-mw-undo-description": "Измене које поништавају претходне измене", "tags-title": "Ознаке", "tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.", @@ -3522,7 +3588,13 @@ "tags-edit-title": "Уреди ознаке", "tags-edit-manage-link": "Управљај ознакама", "tags-edit-existing-tags": "Постојеће ознаке:", + "tags-edit-existing-tags-none": "Нема", "tags-edit-new-tags": "Нове ознаке:", + "tags-edit-add": "Додај ове ознаке:", + "tags-edit-remove": "Уклони ове ознаке:", + "tags-edit-remove-all-tags": "(уклони све ознаке)", + "tags-edit-chosen-placeholder": "Изабери неке ознаке", + "tags-edit-chosen-no-results": "Одговарајуће ознаке нису пронађене", "tags-edit-reason": "Разлог:", "tags-edit-success": "Измене су примењене.", "comparepages": "Упоређивање страница", @@ -3535,6 +3607,7 @@ "compare-title-not-exists": "Наведени наслов не постоји.", "compare-revision-not-exists": "Наведена измена не постоји.", "diff-form": "Разлике", + "diff-form-oldid": "ID старе измене (необавезно)", "diff-form-submit": "Прикажи разлике", "permanentlink": "Стална веза", "permanentlink-revid": "ID измене", @@ -3653,7 +3726,8 @@ "feedback-termsofuse": "Прихватам да пошаљем повратне информације у складу са условима коришћења.", "feedback-thanks": "Хвала! Ваша повратна информација је постављена на страницу „[$2 $1]“.", "feedback-thanks-title": "Хвала вам!", - "searchsuggest-search": "Претрага", + "feedback-useragent": "Кориснички агент:", + "searchsuggest-search": "Претражи", "searchsuggest-containing": "садржи...", "api-error-badtoken": "Унутрашња грешка: неисправан жетон.", "api-error-emptypage": "Стварање нових празних страница није дозвољено.", @@ -3697,15 +3771,21 @@ "expand_templates_generate_xml": "Прикажи XML стабло", "expand_templates_generate_rawhtml": "Прикажи сиров HTML", "expand_templates_preview": "Претпреглед", + "pagelanguage": "Промени језик странице", "pagelang-name": "Страница", "pagelang-language": "Језик", + "pagelang-use-default": "Користи подразумевани језик", "pagelang-select-lang": "Изабери језик", "pagelang-reason": "Разлог", "pagelang-submit": "Пошаљи", "pagelang-nonexistent-page": "Страница $1 не постоји.", + "pagelang-unchanged-language": "Страница $1 је већ постављена на језик $2.", + "pagelang-db-failed": "База података није успела променити језик странице.", "right-pagelang": "мењање језика странице", "action-pagelang": "промену језика странице", + "log-name-pagelang": "Дневник промене језика", "logentry-pagelang-pagelang": "$1 је {{GENDER:$2|променио|променила}} језик странице $3 из $4 у $5.", + "default-skin-not-found-row-enabled": "* $1 / $2 (омогућена)", "mediastatistics": "Статистика датотека", "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.", "mediastatistics-table-mimetype": "MIME тип", @@ -3745,6 +3825,9 @@ "special-characters-group-lao": "Лаоски", "special-characters-group-khmer": "Кмерски", "special-characters-group-canadianaboriginal": "Канадски абориџински", + "special-characters-title-endash": "цртица", + "special-characters-title-emdash": "дуга цртица", + "special-characters-title-minus": "минус", "mw-widgets-dateinput-no-date": "Датум није изабран", "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД", "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ", @@ -3756,6 +3839,7 @@ "mw-widgets-usersmultiselect-placeholder": "Додај још...", "date-range-from": "Од датума:", "date-range-to": "До датума:", + "sessionprovider-generic": "$1 сесије", "randomrootpage": "Случајна коренска страница", "log-action-filter-block": "Тип блокирања:", "log-action-filter-contentmodel": "Тип промене модела садржаја:", @@ -3767,16 +3851,20 @@ "log-action-filter-patrol": "Тип патролирања:", "log-action-filter-protect": "Тип закључавања:", "log-action-filter-rights": "Тип промене корисничких права:", + "log-action-filter-suppress": "Врста скривања:", "log-action-filter-upload": "Тип отпремања:", "log-action-filter-all": "Све", "log-action-filter-block-block": "блокирање", "log-action-filter-block-reblock": "измена блокирања", "log-action-filter-block-unblock": "деблокирање", + "log-action-filter-contentmodel-change": "Измена модела садржаја", + "log-action-filter-contentmodel-new": "Нова страница с нестандардним моделом садржаја", "log-action-filter-delete-delete": "брисање странице", "log-action-filter-delete-delete_redir": "преснимавање преусмерења", "log-action-filter-delete-restore": "враћање странице", "log-action-filter-delete-event": "брисање уноса у дневницима", "log-action-filter-delete-revision": "брисање измене", + "log-action-filter-import-interwiki": "Међувики увоз", "log-action-filter-managetags-create": "нова ознака", "log-action-filter-managetags-delete": "брисање ознаке", "log-action-filter-managetags-activate": "активирање ознаке", @@ -3794,23 +3882,38 @@ "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": "промена постојећег", + "authmanager-authn-no-primary": "Пружени акредитиви не могу се проверити.", + "authmanager-create-disabled": "Онемогућено прављење налога.", + "authmanager-create-from-login": "Попуните поља да бисте направили налог.", "authmanager-authplugin-setpass-failed-title": "Неуспешна промена лозинке", "authmanager-authplugin-setpass-bad-domain": "Неисправан домен.", + "authmanager-autocreate-noperm": "Аутоматско прављење налога није дозвољено.", "authmanager-userdoesnotexist": "Кориснички налог „$1“ није отворен.", "authmanager-email-label": "Имејл", "authmanager-email-help": "Имејл адреса", "authmanager-realname-label": "Право име", "authmanager-realname-help": "Право име корисника", + "authmanager-provider-temporarypassword": "Привремена лозинка", "authprovider-confirmlink-option": "$1 ($2)", + "authprovider-confirmlink-request-label": "Рачуни који се требају повезати", "authprovider-confirmlink-success-line": "$1: Успешно повезано.", "authprovider-resetpass-skip-label": "Прескочи", "authform-newtoken": "Недостаје жетон. $1", "authform-notoken": "Недостаје жетон", "authform-wrongtoken": "Погрешан жетон", "specialpage-securitylevel-not-allowed-title": "Није дозвољено", + "authpage-cannot-login": "Не могу започети пријаву.", + "authpage-cannot-create": "Не могу започети стварање налога.", + "authpage-cannot-link": "Не могу започети спајање налога.", "cannotauth-not-allowed-title": "Приступ је одбијен", + "cannotauth-not-allowed": "Није Вам дозвољено да користите ову страницу", "changecredentials": "Промјена акредитива", "changecredentials-submit": "Промени", "removecredentials": "Уклањање акредитива", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index f671e6e99e..fca6d7cac0 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -214,7 +214,7 @@ "talk": "Razgovor", "views": "Pregledi", "toolbox": "Alatke", - "tool-link-userrights": "Promeni {{GENDER:$1|korisničke}} grupe", + "tool-link-userrights": "Uredi {{GENDER:$1|korisničke}} grupe", "tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe", "tool-link-emailuser": "Pošalji imejl", "imagepage": "Pogledaj stranicu datoteke", @@ -1174,6 +1174,7 @@ "recentchanges-legend": "Opcije skorašnjih izmena", "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.", "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.", + "recentchanges-notargetpage": "Unesite naziv stranice kako biste videli srodne izmene.", "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.", "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena", "recentchanges-label-minor": "Ovo je manja izmena", @@ -1274,8 +1275,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik nadgleda|korisnika nadgledaju|korisnika nadgledaju}}]", - "rc_categories": "Ograniči na kategorije (razdvoji s uspravnom crtom):", - "rc_categories_any": "Sve", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene", "newsectionsummary": "/* $1 */ novi odeljak", diff --git a/languages/i18n/stq.json b/languages/i18n/stq.json index 5eb4ab7ad6..148cde983f 100644 --- a/languages/i18n/stq.json +++ b/languages/i18n/stq.json @@ -913,8 +913,6 @@ "newpageletter": "Näi", "boteditletter": "B", "number_of_watching_users_pageview": "[$1 beooboachtjende {{PLURAL:$1|Benutser|Benutsere}}]", - "rc_categories": "Bloot Sieden uut do Kategorien (tränd mäd „|“):", - "rc_categories_any": "Aal", "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}", "newsectionsummary": "Näie Apsats /* $1 */", "rc-enhanced-expand": "Details anwiese (bruukt JavaScript)", diff --git a/languages/i18n/su.json b/languages/i18n/su.json index ca646b2a03..fa6ae891c1 100644 --- a/languages/i18n/su.json +++ b/languages/i18n/su.json @@ -1397,8 +1397,6 @@ "newpageletter": "A", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ngawaskeun|ngawaskeun}}]", - "rc_categories": "Watesan nepi ka kategori (dipisah ku \"|\"):", - "rc_categories_any": "Unggal nu kapilih", "rc-change-size-new": "$1 {{PLURAL:$1|bit|bit}} sanggeus robah", "newsectionsummary": "/* $1 */ bagean anyar", "rc-enhanced-expand": "Témbongkeun rincian", diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index bd5e3ff571..3ab3adb454 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -1520,8 +1520,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 bevakande {{PLURAL:$1|användare|användare}}]", - "rc_categories": "Begränsa till följande kategorier (separera med \"|\"):", - "rc_categories_any": "Någon av de valda", "rc-change-size-new": "$1 {{PLURAL:$1|byte}} efter ändring", "newsectionsummary": "/* $1 */ nytt avsnitt", "rc-enhanced-expand": "Visa detaljer", @@ -2272,7 +2270,7 @@ "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.", "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]", "sessionfailure-title": "Sessionsfel", - "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.", + "sessionfailure": "Någonting med din inloggningssession är på tok;\ndin begärda åtgärd har avbrutits för att förhindra att någon kapar din session.\nSkicka formuläret igen.", "changecontentmodel": "Ändra innehållsmodell för en sida", "changecontentmodel-legend": "Ändra innehållsmodell", "changecontentmodel-title-label": "Sidtitel", @@ -3415,6 +3413,7 @@ "watchlistedit-clear-titles": "Sidor:", "watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)", "watchlistedit-clear-done": "Din bevakningslista har rensats.", + "watchlistedit-clear-jobqueue": "Din bevakningslista skapas. Detta kan ta en stund!", "watchlistedit-clear-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:", "watchlistedit-too-many": "Det finns för många sidor att visa här.", "watchlisttools-clear": "Rensa bevakningslistan", diff --git a/languages/i18n/sw.json b/languages/i18n/sw.json index 7a2bbbafd2..219a4f6a97 100644 --- a/languages/i18n/sw.json +++ b/languages/i18n/sw.json @@ -1125,8 +1125,6 @@ "newpageletter": "P", "boteditletter": "r", "number_of_watching_users_pageview": "[idadi ya {{PLURAL:$1|watumiaji}} wanaoufuatilia ni $1]", - "rc_categories": "Chagua jamii zingine (uzitenge na kigawaji hiki \"|\")", - "rc_categories_any": "Yoyote", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} baada ya mabadiliko", "newsectionsummary": "/* $1 */ mjadala mpya", "rc-enhanced-expand": "Onyesha maelezo", diff --git a/languages/i18n/szl.json b/languages/i18n/szl.json index 66ce850876..0ba4ef53d2 100644 --- a/languages/i18n/szl.json +++ b/languages/i18n/szl.json @@ -977,8 +977,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|dowajůncy pozůr užytkowńik|dowajůncych pozůr užytkowńikůw}}]", - "rc_categories": "Uůgrańič do katygorii (oddźelej za půmocům \"|\")", - "rc_categories_any": "Wšyskie", "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po půmjyńyńu", "newsectionsummary": "/* $1 */ nowo tajla", "rc-enhanced-expand": "Pokoż szczygůły", diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json index 638d3ebb38..979c3f2785 100644 --- a/languages/i18n/ta.json +++ b/languages/i18n/ta.json @@ -1339,8 +1339,6 @@ "newpageletter": "பு", "boteditletter": "தா", "number_of_watching_users_pageview": "[இப்பக்க்த்தை {{PLURAL:$1|ஒரு பயனர் பார்கிறார்|$1 பயனர்கள் பார்கிறார்கள்}}]", - "rc_categories": "பகுப்புகளுக்கு மட்டுப்படுத்து (\"|\" குறியீட்டால் பிரிக்கப்பட்டுள்ளது)", - "rc_categories_any": "தெரிவு செய்ததில் ஏதாவது", "rc-change-size-new": "$1 {{PLURAL:$1|பைட்டு|பைட்டுகள்}} -மாற்றத்திற்குப் பிறகு", "newsectionsummary": "/* $1 */ புதிய பகுதி", "rc-enhanced-expand": "விவரத்தை காட்டு", diff --git a/languages/i18n/tay.json b/languages/i18n/tay.json index 449a4123cc..ca2bec2dcb 100644 --- a/languages/i18n/tay.json +++ b/languages/i18n/tay.json @@ -649,7 +649,6 @@ "minoreditletter": "cipuq", "newpageletter": "Giqas", "boteditletter": "squliq na kikay", - "rc_categories_any": "Ana nanu’ binzyagan na", "rc-change-size-new": "sin-nbah$1 {{PLURAL:bzyaqan kkayal na llpgan}}", "rc-old-title": "pins’ruxsa minqsu’ na lalu’ ga \"$1\"", "recentchangeslinked": "M’ubuy quw zyuwaw na sinbahan", diff --git a/languages/i18n/tcy.json b/languages/i18n/tcy.json index 86866310f3..9f1cba9bb2 100644 --- a/languages/i18n/tcy.json +++ b/languages/i18n/tcy.json @@ -807,7 +807,6 @@ "minoreditletter": "ಕಿ", "newpageletter": "ಪೊ", "boteditletter": "ಬಾ", - "rc_categories_any": "ಒವ್ವೇ", "rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ", "newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ", "rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜಾವ್", diff --git a/languages/i18n/te.json b/languages/i18n/te.json index 696bcfc502..03054cd3f4 100644 --- a/languages/i18n/te.json +++ b/languages/i18n/te.json @@ -1395,8 +1395,6 @@ "newpageletter": "కొ", "boteditletter": "బా", "number_of_watching_users_pageview": "[వీక్షిస్తున్న సభ్యులు: {{PLURAL:$1|ఒక్కరు|$1}}]", - "rc_categories": "ఈ వర్గాలకు పరిమితం చెయ్యి (\"|\" తో వేరు చెయ్యండి):", - "rc_categories_any": "ఎంచుకున్నది ఏదయినా", "rc-change-size-new": "మార్పు తర్వాత $1 {{PLURAL:$1|బైటు|బైట్లు}}", "newsectionsummary": "/* $1 */ కొత్త విభాగం", "rc-enhanced-expand": "వివరాలను చూపించు", diff --git a/languages/i18n/tg-cyrl.json b/languages/i18n/tg-cyrl.json index 82a51cda13..85d3bf0152 100644 --- a/languages/i18n/tg-cyrl.json +++ b/languages/i18n/tg-cyrl.json @@ -917,8 +917,6 @@ "newpageletter": "Нав", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 пайгирикунанда {{PLURAL:$1|корбар|корбарон}}]", - "rc_categories": "Маҳдудият ба гурӯҳҳо (бо аломати \"|\" ҷудо кунед)", - "rc_categories_any": "Ҳар кадом", "rc-change-size-new": "$1 {{PLURAL:$1|байт}} пас аз тағйир", "newsectionsummary": "/* $1 */ бахши ҷадид", "rc-enhanced-expand": "Намоиши ҷузъиёт", diff --git a/languages/i18n/tg-latn.json b/languages/i18n/tg-latn.json index effda3db8c..36e76c3cf0 100644 --- a/languages/i18n/tg-latn.json +++ b/languages/i18n/tg-latn.json @@ -668,8 +668,6 @@ "newpageletter": "Nav", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 pajgirikunanda {{PLURAL:$1|korbar|korbaron}}]", - "rc_categories": "Mahdudijat ba gurūhho (bo alomati \"|\" çudo kuned)", - "rc_categories_any": "Har kadom", "newsectionsummary": "/* $1 */ baxşi çadid", "rc-enhanced-expand": "Namoişi çuz'ijot (nijozmand ba Çava Skript)", "rc-enhanced-hide": "Pinhoni çuz'ijot", diff --git a/languages/i18n/th.json b/languages/i18n/th.json index 2c7efb9c01..a938047a26 100644 --- a/languages/i18n/th.json +++ b/languages/i18n/th.json @@ -1457,8 +1457,6 @@ "boteditletter": "บ", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 ผู้ใช้เฝ้าดู]", - "rc_categories": "จำกัดเฉพาะหมวดหมู่ (แยกด้วย \"|\"):", - "rc_categories_any": "อะไรก็ได้ที่เลือก", "rc-change-size-new": "$1 ไบต์หลังเปลี่ยนแปลง", "newsectionsummary": "/* $1 */ ส่วนใหม่", "rc-enhanced-expand": "แสดงรายละเอียด", @@ -2119,7 +2117,7 @@ "unprotectedarticle-comment": "{{GENDER:$2|}}ปลดล็อก \"[[$1]]\"", "protect-title": "เปลี่ยนระดับการล็อกสำหรับ \"$1\"", "protect-title-notallowed": "ดูระดับการล็อกของ \"$1\"", - "prot_1movedto2": "เปลี่ยนชื่อ [[$1]] เป็น [[$2]]", + "prot_1movedto2": "ย้าย [[$1]] เป็น [[$2]]", "protect-badnamespace-title": "เนมสเปซล็อกไม่ได้", "protect-badnamespace-text": "ล็อกหน้าในเนมสเปซนี้ไม่ได้", "protect-norestrictiontypes-text": "หน้านี้ไม่สามารถถูกล็อก เพราะไม่มีประเภทการจำกัดที่ใช้ได้", @@ -2160,7 +2158,7 @@ "maximum-size": "ขนาดอย่างมาก", "pagesize": "(ไบต์)", "restriction-edit": "แก้ไข", - "restriction-move": "เปลี่ยนชื่อ", + "restriction-move": "ย้าย", "restriction-create": "สร้าง", "restriction-upload": "อัปโหลด", "restriction-level-sysop": "ป้องกันสมบูรณ์", @@ -2382,7 +2380,7 @@ "databasenotlocked": "ฐานข้อมูลไม่ได้ล็อก", "lockedbyandtime": "(โดย {{GENDER:$1|$1}} เมื่อวันที่ $2 เวลา $3)", "move-page": "ย้าย $1", - "move-page-legend": "เปลี่ยนชื่อ", + "move-page-legend": "ย้ายหน้า", "movepagetext": "การใช้แบบด้านล่างจะเปลี่ยนชื่อหน้า และย้ายประวัติทั้งหมดไปชื่อใหม่\nชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปชื่อเรื่องใหม่\nคุณสามารถปรับการเปลี่ยนทางซึ่งชี้ไปยังชื่อเรื่องเดิมได้อัตโนมัติ\nแต่หากคุณเลือกไม่ทำเช่นนั้น ให้แน่ใจว่าตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางเสีย]]\nคุณเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร\n\nโปรดทราบว่าหน้าดังกล่าวจะไม่ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่แล้ว เว้นแต่หน้านั้นเป็นหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\nคำเตือน!\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดให้แน่ใจว่าคุณเข้าใจผลลัพธ์นี้ก่อนดำเนินการ", "movepagetext-noredirectfixer": "การใช้แบบด้านล่างจะเปลี่ยนชื่อหน้า ซึ่งจะทำให้ประวัติทั้งหมดย้ายไปยังชื่อใหม่\nชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปยังชื่อเรื่องใหม่\nให้แน่ใจว่า ตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางที่เสีย]]\nคุณจะเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร\n\nโปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าว่างหรือหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n'''คำเตือน!'''\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดแน่ใจว่าคุณเข้าใจถึงผลลัพธ์นี้ก่อนที่จะดำเนินการต่อไป", "movepagetalktext": "หากคุณเลือกกล่องนี้ หน้าคุยของหน้านี้จะถูกย้ายไปชื่อเรื่องใหม่โดยอัตโนมัติเว้นแต่ปลายทางมีหน้าคุยไม่ว่างแล้ว\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือผสานหน้าเองหากต้องการ", @@ -2398,8 +2396,8 @@ "namespace-nosubpages": "เนมสเปซ \"$1\" ไม่อนุญาตให้มีหน้าย่อย", "newtitle": "ชื่อเรื่องใหม่:", "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง", - "movepagebtn": "เปลี่ยนชื่อ", - "pagemovedsub": "เปลี่ยนชื่อสำเร็จ", + "movepagebtn": "ย้ายหน้า", + "pagemovedsub": "ย้ายสำเร็จ", "movepage-moved": "เปลี่ยนชื่อ \"$1\" เป็น \"$2\" แล้ว", "movepage-moved-redirect": "สร้างหน้าเปลี่ยนทางแล้ว", "movepage-moved-noredirect": "การสร้างหน้าเปลี่ยนทางถูกระงับ", @@ -2409,9 +2407,9 @@ "move-subpages": "ย้ายหน้าย่อยทั้งหมด (มากสุด $1 หน้า)", "move-talk-subpages": "ย้ายหน้าย่อยทั้งหมดของหน้าคุย (มากสุด $1 หน้า)", "movepage-page-exists": "มีหน้า $1 อยู่แล้วและไม่สามารถบันทึกทับอัตโนมัติ", - "movepage-page-moved": "เปลี่ยนชื่อหน้า $1 เป็น $2 แล้ว", + "movepage-page-moved": "ย้ายหน้า $1 เป็น $2 แล้ว", "movepage-page-unmoved": "ไม่สามารถเปลี่ยนชื่อหน้า $1 เป็น $2", - "movepage-max-pages": "เปลี่ยนชื่อหน้ามากสุด $1 หน้าแล้วและจะไม่เปลี่ยนชื่อหน้าเพิ่มอีกอัตโนมัติ", + "movepage-max-pages": "ย้ายหน้ามากสุด $1 หน้าแล้วและจะไม่ย้ายหน้าเพิ่มอีกอัตโนมัติ", "movelogpage": "ปูมการเปลี่ยนชื่อ", "movelogpagetext": "ด้านล่างเป็นรายการการเปลี่ยนชื่อทั้งหมด", "movesubpage": "{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}", @@ -2544,7 +2542,7 @@ "tooltip-ca-unprotect": "เปลี่ยนการป้องกันหน้านี้", "tooltip-ca-delete": "ลบหน้านี้", "tooltip-ca-undelete": "กู้คืนการแก้ไขหน้านี้กลับมาเป็นรุ่นก่อนที่ถูกลบ", - "tooltip-ca-move": "เปลี่ยนชื่อหน้านี้", + "tooltip-ca-move": "ย้ายหน้านี้", "tooltip-ca-watch": "เพิ่มหน้านี้เข้ารายการเฝ้าดู", "tooltip-ca-unwatch": "นำหน้านี้ออกจากรายการเฝ้าดู", "tooltip-search": "ค้นหา {{SITENAME}}", diff --git a/languages/i18n/tk.json b/languages/i18n/tk.json index 40d36a6119..73e5cd2487 100644 --- a/languages/i18n/tk.json +++ b/languages/i18n/tk.json @@ -887,8 +887,6 @@ "newpageletter": "T", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ulanyjy|ulanyjy}} gözegçilik edýär]", - "rc_categories": "Kategoriýalar bilen çäklendir (\"|\" bilen aýyr)", - "rc_categories_any": "Islendik", "newsectionsummary": "/* $1 */ täze bölüm", "rc-enhanced-expand": "Jikme-jikligi görkez", "rc-enhanced-hide": "Jikme-jiklikleri gizle", diff --git a/languages/i18n/tl.json b/languages/i18n/tl.json index 2e8b8e99e5..9d822ad1e2 100644 --- a/languages/i18n/tl.json +++ b/languages/i18n/tl.json @@ -1155,8 +1155,6 @@ "boteditletter": "b", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 binabantayang {{PLURAL:$1|tagagamit|mga tagagamit}}]", - "rc_categories": "Itakda lang sa mga kaurian (ihiwalay sa pamamagitan ng \"|\")", - "rc_categories_any": "Kahit ano", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte}} pagkaraan ng pagbabago", "newsectionsummary": "/* $1 */ bagong seksyon", diff --git a/languages/i18n/tly.json b/languages/i18n/tly.json index 3bed975b8a..02f50c0cf7 100644 --- a/languages/i18n/tly.json +++ b/languages/i18n/tly.json @@ -395,7 +395,6 @@ "minoreditletter": "г", "newpageletter": "Т", "boteditletter": "б", - "rc_categories_any": "Һар гылә", "newsectionsummary": "/* $1 */ нујә мывзу", "rc-enhanced-expand": "Тәфсилотон нишо дој (JavaScript истифодә бедә)", "rc-enhanced-hide": "Тәфсилотон нијо кардеј", diff --git a/languages/i18n/to.json b/languages/i18n/to.json index ed2838bd56..422b90565a 100644 --- a/languages/i18n/to.json +++ b/languages/i18n/to.json @@ -5,7 +5,8 @@ "Tauʻolunga", "לערי ריינהארט", "아라", - "Macofe" + "Macofe", + "Fanjiayi" ] }, "tog-underline": "Ngaahi fehokotaki ʻoku laineʻi ʻi lalo:", @@ -181,6 +182,7 @@ "nstab-template": "Sīpinga", "nstab-help": "Tokoni", "nstab-category": "Faʻahinga", + "mainpage-nstab": "Peesi tali fiefia", "nosuchaction": "Hala ha ngāue pehē", "nosuchspecialpage": "Hala ha peesi makehe pehē", "error": "Halaʻi", @@ -341,7 +343,7 @@ "showingresults": "ʻOku ʻasi ʻi lalo ʻa e ngaahi fua ʻoku kamata mo e #'''$2''' (aʻu ki he '''$1''').", "powersearch-legend": "Kumi lakasi", "preferences": "Faʻiteliha", - "mypreferences": "faʻiteliha ʻaʻaku", + "mypreferences": "Faʻiteliha", "prefs-skin": "Kili", "skin-preview": "Vakai pē", "datedefault": "ʻIkai ha faʻiteliha", @@ -389,10 +391,19 @@ "rcnotefrom": "ʻOku ʻasi ʻi lalo ʻa e liliu talu mei '''$2''' (aʻu ki he '''$1''').", "rclistfrom": "ʻAsi mai ha ngaahi liliu foʻou ʻo kamata mei he $3 $2", "rcshowhideminor": "$1 fatu siʻi", + "rcshowhideminor-show": "ʻAsi mai", + "rcshowhideminor-hide": "Toi", "rcshowhidebots": "$1 fatu fakamīsini", + "rcshowhidebots-show": "ʻAsi mai", + "rcshowhidebots-hide": "Toi", "rcshowhideliu": "$1 kau ʻetita ʻoku kau-ki-ai", + "rcshowhideliu-show": "ʻAsi mai", "rcshowhideanons": "$1 kau ʻetita taʻehingoa", + "rcshowhideanons-show": "ʻAsi mai", + "rcshowhideanons-hide": "Toi", "rcshowhidemine": "$1 fatu ʻaʻaku", + "rcshowhidemine-show": "ʻAsi mai", + "rcshowhidemine-hide": "Toi", "rclinks": "ʻAsi mai ha liliu ʻe $1 lolotonga ha ʻaho ʻe $2 fakamuimui", "diff": "kehe", "hist": "hisi", @@ -401,8 +412,6 @@ "minoreditletter": "s", "newpageletter": "F", "boteditletter": "m", - "rc_categories": "Fakangatangata ki he faʻahinga (vaheʻi he \"|\")", - "rc_categories_any": "Faʻahinga noa pē", "rc-enhanced-expand": "ʻAsi ngaahi ʻeu (fiemaʻu ʻa e ''Javascript'')", "rc-enhanced-hide": "Toi ngaahi ʻeu", "recentchangeslinked": "Ngaahi liliu fekauʻaki", @@ -627,6 +636,7 @@ "sp-contributions-deleted": "Ngaahi foaki ʻo ha ʻetita kuo tāmateʻi", "sp-contributions-talk": "Alea", "whatlinkshere": "Ngaahi fehokotaki ki heni", + "whatlinkshere-page": "Peesi:", "linkshere": "ʻOku fehokotaki ki heni ʻa e ngaahi peesi:", "nolinkshere": "ʻOku ʻikai ha ngaahi kupu fehokotaki ki heni.", "isredirect": "Peesi leʻei", @@ -737,6 +747,8 @@ "siteusers": "Kau ʻetita {{SITENAME}} $1", "creditspage": "Peesi fakangeiaʻi", "spamprotectionmatch": "Naʻe kamosi ʻemau meʻasivi tohila ʻe he ngaahi mataʻitohi koʻeni: $1", + "pageinfo-article-id": "Peesi ID", + "pageinfo-toolboxlink": "Peesi information", "rcpatroldisabled": "ʻOku fakataʻeʻaʻongaʻi ʻa e leʻo ʻo e ngaahi toki liliu", "deletedrevision": "Kuo tāmateʻi he paaki motuʻa $1.", "previousdiff": "← Faikehe ki muʻa", @@ -876,6 +888,7 @@ "watchlisttools-edit": "Sio pea fatu ʻete hokohoko leʻo", "watchlisttools-raw": "Fatu ʻa e hokohoko leʻo taʻengaohi", "version": "Paaki", + "redirect-page": "Peesi ID", "specialpages": "Ngaahi peesi makehe", "rightsnone": "(hala)", "expandtemplates": "Fakalahiange ʻa e ngaahi sīpinga" diff --git a/languages/i18n/tpi.json b/languages/i18n/tpi.json index 324ac59489..82afb38c8b 100644 --- a/languages/i18n/tpi.json +++ b/languages/i18n/tpi.json @@ -348,8 +348,6 @@ "minoreditletter": "m", "newpageletter": "N", "boteditletter": "b", - "rc_categories": "Soim ol senis insait long ol dispela grup tasol (raitim wantaim \"|\" namel long wanwan)", - "rc_categories_any": "Olgeta", "recentchangeslinked": "Ol senis klostu", "recentchangeslinked-feed": "Ol senis klostu", "recentchangeslinked-toolbox": "Ol senis klostu", diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index 496748453d..bf167952dc 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -1457,8 +1457,6 @@ "newpageletter": "Y", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 izlenilen {{PLURAL:$1|kullanıcı|kullanıcı}}]", - "rc_categories": "Kategorileri sınırla (\"|\" ile ayır)", - "rc_categories_any": "Seçilen herhangi bir", "rc-change-size-new": "Değişiklikten sonraki boyut: $1 {{PLURAL:$1|bayt|bayt}}", "newsectionsummary": "/* $1 */ yeni başlık", "rc-enhanced-expand": "Ayrıntıları göster", diff --git a/languages/i18n/tt-cyrl.json b/languages/i18n/tt-cyrl.json index 56b6f9e4d2..fe6c9bffa3 100644 --- a/languages/i18n/tt-cyrl.json +++ b/languages/i18n/tt-cyrl.json @@ -1062,8 +1062,6 @@ "newpageletter": "Я", "boteditletter": "б", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтүче кулланучы}}]", - "rc_categories": "Төркемнәрдән генә («|» бүлүче):", - "rc_categories_any": "Сайланганның һәрберсе", "rc-change-size-new": "Кертелгән үзгәрешләр белән бергә зурлык: $1 {{PLURAL:$1|байт}}", "newsectionsummary": "/* $1 */ яңа бүлек", "rc-enhanced-expand": "Ваклыкларны күрсәтү", diff --git a/languages/i18n/tt-latn.json b/languages/i18n/tt-latn.json index 7bb64cf73a..91cf0b4029 100644 --- a/languages/i18n/tt-latn.json +++ b/languages/i18n/tt-latn.json @@ -800,8 +800,6 @@ "newpageletter": "Y", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|küzätep tora qullanuçı}}]", - "rc_categories": "Törkemnärdä genä tora («|» bülüçe)", - "rc_categories_any": "Härber", "rc-change-size-new": "üzgäreştän soñ $1 {{PLURAL:$1|bayt}}", "newsectionsummary": "/* $1 */ yaña bülek", "rc-enhanced-expand": "Waqlıqlarnı kürsätü (JavaScript kiräk)", diff --git a/languages/i18n/tzm.json b/languages/i18n/tzm.json index a1c22fbeed..dc4821da9f 100644 --- a/languages/i18n/tzm.json +++ b/languages/i18n/tzm.json @@ -335,7 +335,6 @@ "newpageletter": "ⵏ", "boteditletter": "ⴱ", "unpatrolledletter": "!", - "rc_categories_any": "ⵎⴰⵏ", "recentchangeslinked-toolbox": "ⵉⴱⴷⴷⴻⵍⵏ ⵖⵓⵔ ⵜⴰⵣⴷⴰⵢⵜ", "recentchangeslinked-page": "ⴰⵙⵙⴰⵖ ⵏ ⵜⴰⵙⵏⴰ:", "upload": "ⵣⴷⴻⵎ ⴰⵙⴷⴰⵡ", diff --git a/languages/i18n/ug-arab.json b/languages/i18n/ug-arab.json index 82eefc5920..706c3a491b 100644 --- a/languages/i18n/ug-arab.json +++ b/languages/i18n/ug-arab.json @@ -1239,8 +1239,6 @@ "boteditletter": "ماشىنا ئادەم", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ئىشلەتكۈچى|ئىشلەتكۈچى}}كۆزىتىۋاتىدۇ]", - "rc_categories": "تۈر چېگرىسى (\"|\" بىلەن ئايرىلىدۇ )", - "rc_categories_any": "خالىغانچە تاللاش", "rc-change-size": "$1", "rc-change-size-new": "ئۆزگەرتكەندىن كېيىن $1 {{PLURAL:$1|بايت}}", "newsectionsummary": "* $1 * يېڭى ئابزاس", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index d40a8d82c4..81c211f517 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -370,7 +370,7 @@ "databaseerror-function": "Функція: $1", "databaseerror-error": "Помилка: $1", "transaction-duration-limit-exceeded": "Щоб уникнути великого лагу при реплікації, ця транзакція була перервана, оскільки тривалість запису ($1) перевищила обмеження в $2 {{PLURAL:$2|секунду|секунд|секунди}}.\n\nЯкщо ви змінюєте декілька елементів за один раз, постарайтесь замість цього зробити декілька невеликих операцій.", - "laggedslavemode": "Увага: сторінка може не містити останніх редагувань.", + "laggedslavemode": "Увага: сторінка може не містити останніх редагувань.", "readonly": "Запис до бази даних заблокований", "enterlockreason": "Зазначте причину і приблизний термін блокування", "readonlytext": "Додавання нових статей та інші зміни бази даних у даний момент заблоковані: ймовірно, через планове сервісне обслуговування бази даних, після закінчення якого буде відновлено нормальний стан.\n\nАдміністратор, що заблокував базу, дав таке пояснення: $1", @@ -776,6 +776,7 @@ "postedit-confirmation-created": "Створено сторінку.", "postedit-confirmation-restored": "Сторінка була відновлена.", "postedit-confirmation-saved": "Ваше редагування збережено", + "postedit-confirmation-published": "Ваше редагування опубліковано.", "edit-already-exists": "Неможливо створити нову сторінку.\nВона вже існує.", "defaultmessagetext": "Стандартний текст повідомлення", "content-failed-to-parse": "Не вдалось ідентифікувати $2 як тип $1 через: $3", @@ -1524,8 +1525,6 @@ "boteditletter": "б", "unpatrolledletter": "!", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|користувач спостерігає|користувачі спостерігають|користувачів спостерігають}}]", - "rc_categories": "Тільки з категорій (розділювач «|»):", - "rc_categories_any": "Будь-яка з обраних", "rc-change-size": "$1", "rc-change-size-new": "Розмір після зміни: $1 {{PLURAL:$1|байт|байти|байтів}}", "newsectionsummary": "/* $1 */ нова тема", @@ -3556,7 +3555,7 @@ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обговорення]])", "timezone-utc": "UTC", "timezone-local": "Місцеві", - "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».", + "duplicate-defaultsort": "{{#if:{{REVISIONID}}||\n}}Увага! Ключ сортування «$2» перекриває попередній ключ сортування «$1».{{\n#if:{{REVISIONID}}|}}", "duplicate-displaytitle": "Увага: Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".", "restricted-displaytitle": "Увага: Відображувану назву «$1» було проігноровано, оскільки вона не відповідає чинній назві сторінки.", "invalid-indicator-name": "Помилка: Сторінка індикатора стану name атрибута не може бути пуста.", diff --git a/languages/i18n/ur.json b/languages/i18n/ur.json index d363408dad..e33c54504a 100644 --- a/languages/i18n/ur.json +++ b/languages/i18n/ur.json @@ -1476,8 +1476,6 @@ "newpageletter": "نیا ..", "boteditletter": " خودکار", "number_of_watching_users_pageview": "[$1 مشاہد {{PLURAL:$1|صارف|صارفین}}]", - "rc_categories": "ان زمروں تک محدود رکھیں («|» سے علاحدہ کریں):", - "rc_categories_any": "کوئی بھی منتخب", "rc-change-size-new": "تبدیلی کے بعد $1 {{PLURAL:$1|بائٹ}}", "newsectionsummary": "/* $1 */ نیا قطعہ", "rc-enhanced-expand": "تفصیلات دکھائیں", @@ -3608,7 +3606,7 @@ "logentry-move-move": "$1 نے صفحہ $3 کو $4 کی جانب منتقل کیا", "logentry-move-move-noredirect": "$1 نے صفحہ $3 کو $4 کی جانب بدون رجوع مکرر {{GENDER:$2|منتقل کیا}}", "logentry-move-move_redir": "$1 نے رجوع مکرر ہٹا کر صفحہ $3 کو $4 کی جانب {{GENDER:$2|منتقل کیا}}", - "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکر تھا {{GENDER:$2|منتقل کیا}}", + "logentry-move-move_redir-noredirect": "$1 نے صفحہ $3 کو رجوع مکرر چھوڑے بغیر $4 کی جانب جو رجوع مکرر تھا {{GENDER:$2|منتقل کیا}}", "logentry-patrol-patrol": "$1 نے صفحہ $3 کے نسخہ $4 کو مراجعت شدہ {{GENDER:$2|نشان زد کیا}}", "logentry-patrol-patrol-auto": "$1 نے صفحہ $3 کے نسخہ $4 کو خودکار طور پر مراجعت شدہ {{GENDER:$2|نشان زد کیا}}", "logentry-newusers-newusers": "صارف کھاتہ $1 {{GENDER:$2|تخلیق ہو چکا ہے}}", diff --git a/languages/i18n/vec.json b/languages/i18n/vec.json index 4c45461074..b4b772bb9c 100644 --- a/languages/i18n/vec.json +++ b/languages/i18n/vec.json @@ -1055,8 +1055,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[osservà da {{PLURAL:$1|un utente|$1 utenti}}]", - "rc_categories": "Limita a le categorie (separà da \"|\")", - "rc_categories_any": "Qualsiasi", "rc-change-size-new": "$1 {{PLURAL:$1|byte}} dopo ła modifega", "newsectionsummary": "/* $1 */ sezion nova", "rc-enhanced-expand": "Mostra detaji", diff --git a/languages/i18n/vep.json b/languages/i18n/vep.json index 33e5953f7c..61c6728a5d 100644 --- a/languages/i18n/vep.json +++ b/languages/i18n/vep.json @@ -934,8 +934,6 @@ "newpageletter": "U", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|kaclii kävutai|kaclijad kävutajad}}]", - "rc_categories": "Vaiše kategorijoišpäi (erigoitkat znamaižel \"|\")", - "rc_categories_any": "Eraz", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt", "newsectionsummary": "/* $1 */ uz' jaguz", diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index ab931ffb70..84c0a4771d 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -1459,8 +1459,6 @@ "newpageletter": "M", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 người đang xem]", - "rc_categories": "Hạn chế theo thể loại (phân cách bằng “|”):", - "rc_categories_any": "Bất kỳ được chọn", "rc-change-size-new": "$1 byte sau thay đổi", "newsectionsummary": "Đề mục mới: /* $1 */", "rc-enhanced-expand": "Xem chi tiết", @@ -1470,7 +1468,7 @@ "recentchangeslinked-feed": "Thay đổi liên quan", "recentchangeslinked-toolbox": "Thay đổi liên quan", "recentchangeslinked-title": "Thay đổi liên quan tới “$1”", - "recentchangeslinked-summary": "Đây là danh sách các thay đổi được thực hiện gần đây tại những trang được liên kết đến từ một trang nào đó (hoặc tại các trang thuộc một thể loại nào đó).\nCác trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.", + "recentchangeslinked-summary": "Nhập tên trang để xem các thay đổi được thực hiện tại những trang được liên kết với trang đó. (Để xem các trang được xếp vào một thể loại nào đó, nhập Thể loại:Tên thể loại). Các thay đổi được thực hiện tại trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.", "recentchangeslinked-page": "Tên trang:", "recentchangeslinked-to": "Hiện thay đổi tại những trang có liên kết đến trang này thay thế", "recentchanges-page-added-to-category": "[[:$1]] được xếp vào thể loại", diff --git a/languages/i18n/vo.json b/languages/i18n/vo.json index 0162941a58..478a77fc3a 100644 --- a/languages/i18n/vo.json +++ b/languages/i18n/vo.json @@ -900,8 +900,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|geban|gebans}} galädöl $1]", - "rc_categories": "Te klads fovik (ditolös me el \"|\")", - "rc_categories_any": "Alseimik", "rc-change-size-new": "{{PLURAL:$1|jölät|jöläts}} $1 po votükam", "newsectionsummary": "/* $1 */ diläd nulik", "rc-enhanced-expand": "Jonön patis", diff --git a/languages/i18n/vro.json b/languages/i18n/vro.json index d77bff24e0..5caa1875e3 100644 --- a/languages/i18n/vro.json +++ b/languages/i18n/vro.json @@ -818,8 +818,6 @@ "newpageletter": "V", "boteditletter": "rb", "number_of_watching_users_pageview": "[{{PLURAL:$1|$1 perräkaejat|üts perräkaeja}}]", - "rc_categories": "Õnnõ katõgoorijist (eräldedäs märgiga \"|\")", - "rc_categories_any": "Miä taht", "rc-change-size-new": "$1 {{PLURAL:$1|bait|baiti}} peräst muutmist", "rc-enhanced-expand": "Näütäq ütsikasjo", "rc-enhanced-hide": "Käkiq ütsikas'aq ärq", diff --git a/languages/i18n/wa.json b/languages/i18n/wa.json index 3b13ff3041..c84e1e2e03 100644 --- a/languages/i18n/wa.json +++ b/languages/i18n/wa.json @@ -804,8 +804,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[shuvou pa $1 {{PLURAL:$1|uzeu|uzeus}}]", - "rc_categories": "Limiter åzès categoreyes (separer avou des «|»)", - "rc_categories_any": "Totes", "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après l' candjmint", "newsectionsummary": "/* $1 */ novele seccion", "rc-enhanced-expand": "Mostrer les detays", diff --git a/languages/i18n/war.json b/languages/i18n/war.json index d99800e25d..9c35d91aad 100644 --- a/languages/i18n/war.json +++ b/languages/i18n/war.json @@ -1086,7 +1086,6 @@ "newpageletter": "B", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 nagbabatay hin {{PLURAL:$1|gumaramit|mga gumaramit}}]", - "rc_categories_any": "Bisan ano nga pinili", "rc-change-size-new": "$1 {{PLURAL:$1|nga byte|nga mga byte}} kahuman han pagbag-o", "newsectionsummary": "/* $1 */ bag-o nga bahin", "rc-enhanced-expand": "Igpakita an detalye", diff --git a/languages/i18n/wo.json b/languages/i18n/wo.json index 6c191b3999..a82560f872 100644 --- a/languages/i18n/wo.json +++ b/languages/i18n/wo.json @@ -858,8 +858,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|jëfandikukat moo koy topp|$1 jëfandikukat ñoo koy topp}}]", - "rc_categories": "Digalub wàll yi (xaajale leen ak « \"|\" »)", - "rc_categories_any": "Yépp", "rc-change-size": "$1", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ginnaaw coppite gi", "newsectionsummary": "/* $1 */ xaaj bu bees", diff --git a/languages/i18n/xmf.json b/languages/i18n/xmf.json index 5aeadb03c6..eda53746f3 100644 --- a/languages/i18n/xmf.json +++ b/languages/i18n/xmf.json @@ -1129,8 +1129,6 @@ "newpageletter": "ახ.", "boteditletter": "ბ", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|მომხმარებლის|მომხმარებლის}} კონტროლი]", - "rc_categories": "ხვალო კატეგორიეფშე (გეგშართით \"|\"-იშ მეჯინათ)", - "rc_categories_any": "არძონერი", "rc-change-size-new": "ზჷმა თირუაშ უკული რე: {{PLURAL:$1|ბაიტი|ბაიტი}}", "newsectionsummary": "/* $1 */ ახალი სექცია", "rc-enhanced-expand": "დეტალების ჩვენება", diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json index c4c61e2571..d0d7069602 100644 --- a/languages/i18n/yi.json +++ b/languages/i18n/yi.json @@ -1345,8 +1345,6 @@ "newpageletter": "נ", "boteditletter": "ב", "number_of_watching_users_pageview": "[{{PLURAL:$1|איין באַניצער פאַסט|$1 באַניצערס פאַסן}} אויף]", - "rc_categories": "גרענעץ פֿאַר קאַטעגאריעס (אָפשיידן מיט \"|\")", - "rc_categories_any": "איינער פון די געקליבענע", "rc-change-size-new": "$1 {{PLURAL:$1|בייט|בייטן}} נאך דער ענדערונג", "newsectionsummary": "/* $1 */ נייע אפטיילונג", "rc-enhanced-expand": "צייגן דעטאלן", diff --git a/languages/i18n/yo.json b/languages/i18n/yo.json index ed42790015..51832136e2 100644 --- a/languages/i18n/yo.json +++ b/languages/i18n/yo.json @@ -1105,8 +1105,6 @@ "newpageletter": "T", "boteditletter": "b", "number_of_watching_users_pageview": "[{{PLURAL:$1|Oníṣe $1|Àwọn oníṣe $1}} ún ṣe ìmójútó]", - "rc_categories": "Òpin sí àwọn ẹ̀ka (pínsọ́tọ̀ pẹ̀lú \"|\")", - "rc_categories_any": "Èyíkéyìí", "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} lẹ́yìn àtúnṣe", "newsectionsummary": "/* $1 */ abala tuntun", "rc-enhanced-expand": "Ìfihàn ẹ̀kúnrẹ́rẹ́", diff --git a/languages/i18n/yue.json b/languages/i18n/yue.json index b303cf70d7..4b22b1bcd8 100644 --- a/languages/i18n/yue.json +++ b/languages/i18n/yue.json @@ -231,7 +231,7 @@ "lastmodifiedat": "呢一頁嘅最後修改係響$1 $2。", "viewcount": "呢一頁已經有$1人次睇過。", "protectedpage": "受保護頁", - "jumpto": "跳去:", + "jumpto": "跳去:", "jumptonavigation": "定向", "jumptosearch": "搵嘢", "view-pool-error": "對唔住,個伺服器響呢段時間超出咗負荷。\n太多用戶試過去睇呢一版。\n響再睇呢一版之前請等多一陣。\n\n$1", @@ -1403,8 +1403,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1位用戶監視]", - "rc_categories": "限定到分類(以\"|\"作分隔):", - "rc_categories_any": "任何揀咗嘅", "rc-change-size-new": "改完後係$1位元組", "newsectionsummary": "/* $1 */ 新小節", "rc-enhanced-expand": "顯示細節", @@ -1414,7 +1412,7 @@ "recentchangeslinked-feed": "連結頁嘅更改", "recentchangeslinked-toolbox": "連結頁嘅更改", "recentchangeslinked-title": "對「$1」有關嘅更改", - "recentchangeslinked-summary": "呢一個特別頁列示咗''由''所畀到嘅一版連結到頁嘅最近更改(或者係指定分類嘅成員)。\n響[[Special:Watchlist|你張監視清單]]嘅版會以'''粗體'''顯示。", + "recentchangeslinked-summary": "輸入一個頁名來睇下嗰版連出去或者連入去嗰版嘅頁面嘅相關更改(想睇一個類入面嘅版,請輸入Category:分類名)。喺[[Special:Watchlist|你張監視清單]]嘅版會以粗體顯示。", "recentchangeslinked-page": "頁名:", "recentchangeslinked-to": "顯示連到所畀到嘅版", "recentchanges-page-added-to-category": "[[:$1]] 加咗落分類", diff --git a/languages/i18n/zea.json b/languages/i18n/zea.json index 2eb2b61bf1..01a162d47a 100644 --- a/languages/i18n/zea.json +++ b/languages/i18n/zea.json @@ -650,8 +650,6 @@ "newpageletter": "N", "boteditletter": "b", "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keêr|keêr}} op een volglieste]", - "rc_categories": "Beperk'n tot categorieën (scheien mie een \"|\")", - "rc_categories_any": "Elk'n", "newsectionsummary": "/* $1 */ nieuwe subkop", "rc-enhanced-expand": "Details weerheven (JavaScript vereist)", "rc-enhanced-hide": "Verbarg details", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index 298d6b3fa3..da7d0d2377 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -1541,8 +1541,6 @@ "newpageletter": "新", "boteditletter": "机", "number_of_watching_users_pageview": "[$1个关注用户]", - "rc_categories": "分类限制(用“|”分隔):", - "rc_categories_any": "任何选择的", "rc-change-size-new": "更改后有$1字节", "newsectionsummary": "/* $1 */ 新章节", "rc-enhanced-expand": "显示细节", @@ -2700,6 +2698,7 @@ "thumbnail_dest_directory": "无法建立目标目录", "thumbnail_image-type": "图像类型不支持", "thumbnail_gd-library": "未完成的GD设置:功能遗失 $1", + "thumbnail_image-size-zero": "图片文件大小看似为0。", "thumbnail_image-missing": "文件可能丢失:$1", "thumbnail_image-failure-limit": "近期尝试生成此缩略图失败太多次($1次或更多)。请稍后再试。", "import": "导入页面", diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index 0387142a06..212487e717 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -376,7 +376,7 @@ "nosuchaction": "無此動作", "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。", "nosuchspecialpage": "無此特殊頁面", - "nospecialpagetext": "您請求的特殊頁面無效。\n\n欲取得有效的特殊頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。", + "nospecialpagetext": "您請求的特定頁面無效。\n\n欲取得有效的特定頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。", "error": "錯誤", "databaseerror": "資料庫錯誤", "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。", @@ -1534,8 +1534,6 @@ "newpageletter": "新", "boteditletter": "機", "number_of_watching_users_pageview": "[$1 位正在監視的使用者]", - "rc_categories": "分類限制 (以 \"|\" 分隔):", - "rc_categories_any": "任何選擇的", "rc-change-size-new": "變更後為 $1 位元組", "newsectionsummary": "/* $1 */ 新章節", "rc-enhanced-expand": "顯示詳細資料", @@ -2840,7 +2838,7 @@ "creditspage": "頁面製作群", "nocredits": "此頁面沒有製作群資訊。", "spamprotectiontitle": "垃圾訊息過濾程式", - "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,\n可能因您的內容包含了已封鎖的外部連結。", + "spamprotectiontext": "您輸入文字內容已被垃圾訊息過濾程式禁止儲存,可能因您的內容包含了已封鎖的外部連結。", "spamprotectionmatch": "以下文字內容觸發垃圾訊息過濾程式:$1", "spambot_username": "MediaWiki 垃圾訊息清理", "spam_reverting": "還原至未包含 $1 連結的最新修訂", @@ -3387,7 +3385,7 @@ "colon-separator": ":", "word-separator": "", "ellipsis": "…", - "parentheses": " ($1)", + "parentheses": "($1)", "quotation-marks": "\"$1\"", "imgmultipageprev": "← 上一頁", "imgmultipagenext": "下一頁 →", @@ -3746,7 +3744,7 @@ "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]", "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4", "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]", - "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} {{GENDER:$6|$3}} 的群組成員資格由 $4 成為 $5", + "logentry-rights-rights": "$1已將{{GENDER:$6|$3}}的使用者群組從$4{{GENDER:$2|更改}}至$5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格", "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5", "logentry-upload-upload": "$1 {{GENDER:$2|已上傳}} $3", @@ -3766,7 +3764,7 @@ "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|已移除}}{{PLURAL:$9|標籤|標籤}} $8 自日誌項目 $3 的修訂 $5。", "logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。", "logentry-tag-update-logentry": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的日誌項目 $5 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。", - "rightsnone": "(無)", + "rightsnone": "(無)", "rightslogentry-temporary-group": "$1 (臨時,直到 $2)", "feedback-adding": "正在新增意見回饋至頁面...", "feedback-back": "返回", diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php index 94b0a348a1..affcc8358a 100644 --- a/languages/messages/MessagesCs.php +++ b/languages/messages/MessagesCs.php @@ -160,6 +160,7 @@ $specialPageAliases = [ 'Withoutinterwiki' => [ 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ], ]; +// TODO: unify "Strana" with "Stránka" $magicWords = [ 'redirect' => [ '0', '#PŘESMĚRUJ', '#REDIRECT' ], 'notoc' => [ '0', '__BEZOBSAHU__', '__NOTOC__' ], @@ -199,6 +200,7 @@ $magicWords = [ 'pagenamee' => [ '1', 'NÁZEVSTRANYE', 'PAGENAMEE' ], 'namespace' => [ '1', 'JMENNÝPROSTOR', 'NAMESPACE' ], 'namespacee' => [ '1', 'JMENNÝPROSTORE', 'NAMESPACEE' ], + 'namespacenumber' => [ '1', 'ČÍSLOJMENNÉHOPROSTORU', 'NAMESPACENUMBER' ], 'talkspace' => [ '1', 'DISKUSNÍPROSTOR', 'TALKSPACE' ], 'talkspacee' => [ '1', 'DISKUSNÍPROSTORE', 'TALKSPACEE' ], 'subjectspace' => [ '1', 'ČLÁNEKPROSTOR', 'SUBJECTSPACE', 'ARTICLESPACE' ], @@ -207,6 +209,8 @@ $magicWords = [ 'fullpagenamee' => [ '1', 'PLNÝNÁZEVSTRANYE', 'FULLPAGENAMEE' ], 'subpagename' => [ '1', 'NÁZEVPODSTRANY', 'SUBPAGENAME' ], 'subpagenamee' => [ '1', 'NÁZEVPODSTRANYE', 'SUBPAGENAMEE' ], + 'rootpagename' => [ '1', 'NÁZEVKOŘENOVÉSTRANY', 'ROOTPAGENAME' ], + 'rootpagenamee' => [ '1', 'NÁZEVKOŘENOVÉSTRANYE', 'ROOTPAGENAMEE' ], 'basepagename' => [ '1', 'NÁZEVNADSTRANY', 'BASEPAGENAME' ], 'basepagenamee' => [ '1', 'NÁZEVNADSTRANYE', 'BASEPAGENAMEE' ], 'talkpagename' => [ '1', 'NÁZEVDISKUSE', 'TALKPAGENAME' ], @@ -227,12 +231,22 @@ $magicWords = [ 'img_lang' => [ '1', 'jazyk=$1', 'lang=$1' ], 'img_page' => [ '1', 'strana=$1', 'strana_$1', 'page=$1', 'page $1' ], 'img_border' => [ '1', 'okraj', 'border' ], + 'img_link' => [ '1', 'odkaz=$1', 'link=$1' ], + 'img_class' => [ '1', 'třída=$1', 'class=$1' ], + 'int' => [ '0', 'HLÁŠENÍ:', 'INT:' ], 'sitename' => [ '1', 'NÁZEVWEBU', 'SITENAME' ], 'ns' => [ '0', 'JMENNÝPROSTOR:', 'NS:' ], + 'nse' => [ '0', 'JMENNÝPROSTORE:', 'NSE:' ], 'localurl' => [ '0', 'MÍSTNÍURL:', 'LOCALURL:' ], 'localurle' => [ '0', 'MÍSTNÍURLE:', 'LOCALURLE:' ], + 'articlepath' => [ '0', 'CESTAKČLÁNKU', 'ARTICLEPATH' ], + 'pageid' => [ '0', 'IDSTRÁNKY', 'PAGEID' ], 'servername' => [ '0', 'NÁZEVSERVERU', 'SERVERNAME' ], + 'scriptpath' => [ '0', 'CESTAKESKRIPTŮM', 'SCRIPTPATH' ], + 'stylepath' => [ '0', 'CESTAKESTYLŮM', 'STYLEPATH' ], 'grammar' => [ '0', 'SKLOŇUJ:', 'GRAMMAR:' ], + 'gender' => [ '0', 'POHLAVÍ:', 'GENDER:' ], + 'bidi' => [ '0', 'OBASMĚRY:', 'BIDI:' ], 'notitleconvert' => [ '0', '__BEZKONVERZENADPISU__', '__NOTITLECONVERT__', '__NOTC__' ], 'nocontentconvert' => [ '0', '__BEZKONVERZEOBSAHU__', '__NOCONTENTCONVERT__', '__NOCC__' ], 'currentweek' => [ '1', 'AKTUÁLNÍTÝDEN', 'CURRENTWEEK' ], @@ -243,24 +257,32 @@ $magicWords = [ 'revisionday' => [ '1', 'DENREVIZE', 'REVISIONDAY' ], 'revisionday2' => [ '1', 'DENREVIZE2', 'REVISIONDAY2' ], 'revisionmonth' => [ '1', 'MĚSÍCREVIZE', 'REVISIONMONTH' ], + 'revisionmonth1' => [ '1', 'MĚSÍCREVIZE1', 'REVISIONMONTH1' ], 'revisionyear' => [ '1', 'ROKREVIZE', 'REVISIONYEAR' ], 'revisiontimestamp' => [ '1', 'KÓDČASUREVIZE', 'REVISIONTIMESTAMP' ], + 'revisionuser' => [ '1', 'AUTORREVIZE', 'REVISIONUSER' ], + 'revisionsize' => [ '1', 'VELIKOSTREVIZE', 'REVISIONSIZE' ], 'plural' => [ '0', 'PLURÁL:', 'PLURAL:' ], 'fullurl' => [ '0', 'PLNÉURL:', 'FULLURL:' ], 'fullurle' => [ '0', 'PLNÉURLE:', 'FULLURLE:' ], + 'canonicalurl' => [ '0', 'KANONICKÉURL:', 'CANONICALURL:' ], + 'canonicalurle' => [ '0', 'KANONICKÉURLE:', 'CANONICALURLE:' ], 'lcfirst' => [ '0', 'PRVNÍMALÉ:', 'LCFIRST:' ], 'ucfirst' => [ '0', 'PRVNÍVELKÉ:', 'UCFIRST:' ], 'lc' => [ '0', 'MALÁ:', 'LC:' ], 'uc' => [ '0', 'VELKÁ:', 'UC:' ], 'displaytitle' => [ '1', 'ZOBRAZOVANÝNADPIS', 'DISPLAYTITLE' ], 'newsectionlink' => [ '1', '__LINKPŘIDATKOMENTÁŘ__', '__NEWSECTIONLINK__' ], + 'nonewsectionlink' => [ '1', '__BEZLINKUPŘIDATKOMENTÁŘ__', '__NONEWSECTIONLINK__' ], 'currentversion' => [ '1', 'VERZESOFTWARE', 'CURRENTVERSION' ], 'urlencode' => [ '0', 'ENKÓDOVATURL:', 'URLENCODE:' ], 'anchorencode' => [ '0', 'ENKÓDOVATNADPIS', 'ANCHORENCODE' ], 'currenttimestamp' => [ '1', 'AKTUÁLNÍKÓDČASU', 'CURRENTTIMESTAMP' ], 'localtimestamp' => [ '1', 'MÍSTNÍKÓDČASU', 'LOCALTIMESTAMP' ], + 'directionmark' => [ '1', 'ZNAKSMĚRU', 'DIRECTIONMARK', 'DIRMARK' ], 'language' => [ '0', '#JAZYK:', '#LANGUAGE:' ], 'contentlanguage' => [ '1', 'JAZYKOBSAHU', 'CONTENTLANGUAGE', 'CONTENTLANG' ], + 'pagelanguage' => [ '1', 'JAZYKSTRÁNKY', 'PAGELANGUAGE' ], 'pagesinnamespace' => [ '1', 'STRÁNEKVEJMENNÉMPROSTORU:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ], 'numberofadmins' => [ '1', 'POČETSPRÁVCŮ', 'NUMBEROFADMINS' ], 'formatnum' => [ '0', 'FORMÁTUJČÍSLO', 'FORMATNUM' ], @@ -268,7 +290,7 @@ $magicWords = [ 'padright' => [ '0', 'ZAROVNATVPRAVO', 'PADRIGHT' ], 'special' => [ '0', 'speciální', 'special' ], 'defaultsort' => [ '1', 'KLÍČŘAZENÍ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ], - 'filepath' => [ '0', 'CESTAKSOUBORU', 'FILEPATH:' ], + 'filepath' => [ '0', 'CESTAKSOUBORU:', 'FILEPATH:' ], 'tag' => [ '0', 'značka', 'tag' ], 'hiddencat' => [ '1', '__SKRÝTKAT__', '__HIDDENCAT__' ], 'pagesincategory' => [ '1', 'STRÁNEKVKATEGORII', 'STRÁNEKVKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ], @@ -276,7 +298,13 @@ $magicWords = [ 'index' => [ '1', '__INDEXOVAT__', '__INDEX__' ], 'noindex' => [ '1', '__NEINDEXOVAT__', '__NOINDEX__' ], 'staticredirect' => [ '1', '__STATICKÉPŘESMĚROVÁNÍ__', '__STATICREDIRECT__' ], + 'numberingroup' => [ '1', 'POČETVESKUPINĚ', 'NUMBERINGROUP', 'NUMINGROUP' ], 'protectionlevel' => [ '1', 'ÚROVEŇZAMČENÍ', 'PROTECTIONLEVEL' ], + 'protectionexpiry' => [ '1', 'VYPRŠENÍZAMČENÍ', 'PROTECTIONEXPIRY' ], + 'formatdate' => [ '0', 'formátujdatum', 'formatdate', 'dateformat' ], + 'pagesincategory_all' => [ '0', 'vše', 'all' ], + 'pagesincategory_pages' => [ '0', 'stránky', 'pages' ], + 'pagesincategory_subcats' => [ '0', 'kategorie', 'subcats' ], 'pagesincategory_files' => [ '0', 'soubory', 'files' ], ]; diff --git a/languages/messages/MessagesEs_formal.php b/languages/messages/MessagesEs_formal.php new file mode 100644 index 0000000000..2c5d727c0e --- /dev/null +++ b/languages/messages/MessagesEs_formal.php @@ -0,0 +1,11 @@ +addOption( 'profiler', 'Profiler output format (usually "text")', false, true ); + // This is named --mwdebug, because --debug would conflict in the phpunit.php CLI script. + $this->addOption( 'mwdebug', 'Enable built-in MediaWiki development settings', false, true ); # Save generic options to display them separately in help $this->mGenericParameters = $this->mParams; @@ -1149,6 +1151,11 @@ abstract class Maintenance { MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->destroy(); } + # Apply debug settings + if ( $this->hasOption( 'mwdebug' ) ) { + require __DIR__ . '/../includes/DevelopmentSettings.php'; + } + // Per-script profiling; useful for debugging $this->activateProfiler(); diff --git a/maintenance/checkLess.php b/maintenance/checkLess.php index f001236a58..55ffcb838f 100644 --- a/maintenance/checkLess.php +++ b/maintenance/checkLess.php @@ -43,7 +43,7 @@ class CheckLess extends Maintenance { self::requireTestsAutoloader(); // If phpunit isn't available by autoloader try pulling it in - if ( !class_exists( 'PHPUnit_Framework_TestCase' ) ) { + if ( !class_exists( 'PHPUnit\\Framework\\TestCase' ) ) { require_once 'PHPUnit/Autoload.php'; } diff --git a/maintenance/cleanupUsersWithNoId.php b/maintenance/cleanupUsersWithNoId.php index 3763d3b1c1..b2fdf2f9c7 100644 --- a/maintenance/cleanupUsersWithNoId.php +++ b/maintenance/cleanupUsersWithNoId.php @@ -110,7 +110,7 @@ class CleanupUsersWithNoId extends LoggedUpdateMaintenance { $next = "$field > $value OR $field = $value AND ($next)"; } } - $display = join( ' ', array_reverse( $display ) ); + $display = implode( ' ', array_reverse( $display ) ); return [ $next, $display ]; } diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json index 66e8d01fcb..bebee85f3f 100644 --- a/maintenance/jsduck/categories.json +++ b/maintenance/jsduck/categories.json @@ -23,6 +23,7 @@ "mw.Title", "mw.Uri", "mw.RegExp", + "mw.String", "mw.messagePoster.*", "mw.notification", "mw.Notification_", diff --git a/maintenance/migrateComments.php b/maintenance/migrateComments.php index c35315d71b..cb72c1ec2f 100644 --- a/maintenance/migrateComments.php +++ b/maintenance/migrateComments.php @@ -205,7 +205,7 @@ class MigrateComments extends LoggedUpdateMaintenance { $next = "$field > $value OR $field = $value AND ($next)"; } } - $prompt = join( ' ', array_reverse( $prompt ) ); + $prompt = implode( ' ', array_reverse( $prompt ) ); $this->output( "... $prompt\n" ); wfWaitForSlaves(); } diff --git a/maintenance/sql.php b/maintenance/sql.php index dd05bbe4ad..2c8bdb67ce 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -40,6 +40,7 @@ class MwSql extends Maintenance { 'Takes a file name containing SQL as argument or runs interactively.' ); $this->addOption( 'query', 'Run a single query instead of running interactively', false, true ); + $this->addOption( 'json', 'Output the results as JSON instead of PHP objects' ); $this->addOption( 'cluster', 'Use an external cluster by name', false, true ); $this->addOption( 'wikidb', 'The database wiki ID to use if not the current one', false, true ); @@ -175,9 +176,15 @@ class MwSql extends Maintenance { // Do nothing return; } elseif ( is_object( $res ) && $res->numRows() ) { + $out = ''; foreach ( $res as $row ) { - $this->output( print_r( $row, true ) ); + $out .= print_r( $row, true ); + $rows[] = $row; } + if ( $this->hasOption( 'json' ) ) { + $out = json_encode( $rows, JSON_PRETTY_PRINT ); + } + $this->output( $out . "\n" ); } else { $affected = $db->affectedRows(); $this->output( "Query OK, $affected row(s) affected\n" ); diff --git a/resources/Resources.php b/resources/Resources.php index e139c3af81..24654419b0 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -156,11 +156,13 @@ return [ ], 'jquery.byteLength' => [ 'scripts' => 'resources/src/jquery/jquery.byteLength.js', + 'deprecated' => 'Use "mediawiki.String" instead.', + 'dependencies' => 'mediawiki.String', 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.byteLimit' => [ 'scripts' => 'resources/src/jquery/jquery.byteLimit.js', - 'dependencies' => 'jquery.byteLength', + 'dependencies' => 'mediawiki.String', 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.checkboxShiftClick' => [ @@ -1105,7 +1107,7 @@ return [ 'mediawiki.inspect' => [ 'scripts' => 'resources/src/mediawiki/mediawiki.inspect.js', 'dependencies' => [ - 'jquery.byteLength', + 'mediawiki.String', 'mediawiki.RegExp', ], 'targets' => [ 'desktop', 'mobile' ], @@ -1169,6 +1171,10 @@ return [ 'scripts' => 'resources/src/mediawiki/mediawiki.RegExp.js', 'targets' => [ 'desktop', 'mobile' ], ], + 'mediawiki.String' => [ + 'scripts' => 'resources/src/mediawiki/mediawiki.String.js', + 'targets' => [ 'desktop', 'mobile' ], + ], 'mediawiki.pager.tablePager' => [ 'styles' => 'resources/src/mediawiki/mediawiki.pager.tablePager.less', ], @@ -1201,7 +1207,7 @@ return [ 'resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js', ], 'dependencies' => [ - 'jquery.byteLength', + 'mediawiki.String', 'mediawiki.util', ], 'targets' => [ 'desktop', 'mobile' ], @@ -1761,7 +1767,7 @@ return [ 'resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js', ], 'dependencies' => [ - 'jquery.byteLength', + 'mediawiki.String', 'oojs', 'mediawiki.api', 'mediawiki.api.options', @@ -2420,7 +2426,7 @@ return [ // TitleInputWidget 'mediawiki.Title', 'mediawiki.api', - 'jquery.byteLimit', + 'mediawiki.String', ], 'messages' => [ // NamespaceInputWidget @@ -2479,7 +2485,8 @@ return [ ], 'dependencies' => [ 'oojs-ui-core', - 'jquery.byteLimit' + 'jquery.byteLimit', + 'mediawiki.String', ], 'targets' => [ 'desktop', 'mobile' ] ], diff --git a/resources/src/jquery/jquery.byteLength.js b/resources/src/jquery/jquery.byteLength.js index 222f14afd8..5764ae90ad 100644 --- a/resources/src/jquery/jquery.byteLength.js +++ b/resources/src/jquery/jquery.byteLength.js @@ -1,38 +1,19 @@ /** * @class jQuery.plugin.byteLength - * @author Jan Paul Posma, 2011 - * @author Timo Tijhof, 2012 - * @author David Chan, 2013 */ /** * Calculate the byte length of a string (accounting for UTF-8). * + * @method byteLength + * @deprecated Use `require( 'mediawiki.String' ).byteLength` instead. * @static * @inheritable * @param {string} str * @return {number} */ -jQuery.byteLength = function ( str ) { - // This basically figures out how many bytes a UTF-16 string (which is what js sees) - // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that. - // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them - // and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in - // edge cases such as illegal sequences, but that should never happen. - - // https://en.wikipedia.org/wiki/UTF-8#Description - // The mapping from UTF-16 code units to UTF-8 bytes is as follows: - // > Range 0000-007F: codepoints that become 1 byte of UTF-8 - // > Range 0080-07FF: codepoints that become 2 bytes of UTF-8 - // > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8 - // > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8) - // > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued) - - return str - .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' ) - .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' ) - .length; -}; +mediaWiki.log.deprecate( jQuery, 'byteLength', require( 'mediawiki.String' ).byteLength, + 'Use require( \'mediawiki.String\' ).byteLength instead.', '$.byteLength' ); /** * @class jQuery diff --git a/resources/src/jquery/jquery.byteLimit.js b/resources/src/jquery/jquery.byteLimit.js index c75246c0f6..eb21846935 100644 --- a/resources/src/jquery/jquery.byteLimit.js +++ b/resources/src/jquery/jquery.byteLimit.js @@ -1,18 +1,20 @@ /** * @class jQuery.plugin.byteLimit */ -( function ( $ ) { - - var eventKeys = [ - 'keyup.byteLimit', - 'keydown.byteLimit', - 'change.byteLimit', - 'mouseup.byteLimit', - 'cut.byteLimit', - 'paste.byteLimit', - 'focus.byteLimit', - 'blur.byteLimit' - ].join( ' ' ); +( function ( $, mw ) { + + var + eventKeys = [ + 'keyup.byteLimit', + 'keydown.byteLimit', + 'change.byteLimit', + 'mouseup.byteLimit', + 'cut.byteLimit', + 'paste.byteLimit', + 'focus.byteLimit', + 'blur.byteLimit' + ].join( ' ' ), + trimByteLength = require( 'mediawiki.String' ).trimByteLength; /** * Utility function to trim down a string, based on byteLimit @@ -21,6 +23,8 @@ * "fobo", not "foba". Basically emulating the native maxlength by * reconstructing where the insertion occurred. * + * @method trimByteLength + * @deprecated Use `require( 'mediawiki.String' ).trimByteLength` instead. * @static * @param {string} safeVal Known value that was previously returned by this * function, if none, pass empty string. @@ -31,79 +35,8 @@ * @return {string} return.newVal * @return {boolean} return.trimmed */ - $.trimByteLength = function ( safeVal, newVal, byteLimit, fn ) { - var startMatches, endMatches, matchesLen, inpParts, - oldVal = safeVal; - - // Run the hook if one was provided, but only on the length - // assessment. The value itself is not to be affected by the hook. - if ( $.byteLength( fn ? fn( newVal ) : newVal ) <= byteLimit ) { - // Limit was not reached, just remember the new value - // and let the user continue. - return { - newVal: newVal, - trimmed: false - }; - } - - // Current input is longer than the active limit. - // Figure out what was added and limit the addition. - startMatches = 0; - endMatches = 0; - - // It is important that we keep the search within the range of - // the shortest string's length. - // Imagine a user adds text that matches the end of the old value - // (e.g. "foo" -> "foofoo"). startMatches would be 3, but without - // limiting both searches to the shortest length, endMatches would - // also be 3. - matchesLen = Math.min( newVal.length, oldVal.length ); - - // Count same characters from the left, first. - // (if "foo" -> "foofoo", assume addition was at the end). - while ( - startMatches < matchesLen && - oldVal.charAt( startMatches ) === newVal.charAt( startMatches ) - ) { - startMatches += 1; - } - - while ( - endMatches < ( matchesLen - startMatches ) && - oldVal.charAt( oldVal.length - 1 - endMatches ) === newVal.charAt( newVal.length - 1 - endMatches ) - ) { - endMatches += 1; - } - - inpParts = [ - // Same start - newVal.slice( 0, startMatches ), - // Inserted content - newVal.slice( startMatches, newVal.length - endMatches ), - // Same end - newVal.slice( newVal.length - endMatches ) - ]; - - // Chop off characters from the end of the "inserted content" string - // until the limit is statisfied. - if ( fn ) { - // stop, when there is nothing to slice - T43450 - while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) { - inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 ); - } - } else { - while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) { - inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -1 ); - } - } - - return { - newVal: inpParts.join( '' ), - // For pathological fn() that always returns a value longer than the limit, we might have - // ended up not trimming - check for this case to avoid infinite loops - trimmed: newVal !== inpParts.join( '' ) - }; - }; + mw.log.deprecate( $, 'trimByteLength', trimByteLength, + 'Use require( \'mediawiki.String\' ).trimByteLength instead.', '$.trimByteLength' ); /** * Enforces a byte limit on an input field, so that UTF-8 entries are counted as well, @@ -206,7 +139,7 @@ // See https://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for // the order and characteristics of the key events. $el.on( eventKeys, function () { - var res = $.trimByteLength( + var res = trimByteLength( prevSafeVal, this.value, elLimit, @@ -235,4 +168,4 @@ * @class jQuery * @mixins jQuery.plugin.byteLimit */ -}( jQuery ) ); +}( jQuery, mediaWiki ) ); diff --git a/resources/src/mediawiki.language/mediawiki.cldr.js b/resources/src/mediawiki.language/mediawiki.cldr.js index ca4b6fbe49..a13f0591e2 100644 --- a/resources/src/mediawiki.language/mediawiki.cldr.js +++ b/resources/src/mediawiki.language/mediawiki.cldr.js @@ -19,9 +19,9 @@ * @return {number} plural form index */ getPluralForm: function ( number, pluralRules ) { - var i; + var i, pluralRuleParser = require( 'mediawiki.libs.pluralruleparser' ); for ( i = 0; i < pluralRules.length; i++ ) { - if ( mw.libs.pluralRuleParser( pluralRules[ i ], number ) ) { + if ( pluralRuleParser( pluralRules[ i ], number ) ) { break; } } diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js index bb29b36191..eda8c0d36b 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js @@ -266,17 +266,17 @@ } } + if ( this.isSticky() ) { + // If this group is sticky, then change the default according to the + // current selection. + this.defaultParams = this.getParamRepresentation( this.getSelectedState() ); + } + if ( changed || this.active !== active || this.currSelected !== item ) { - if ( this.isSticky() ) { - // If this group is sticky, then change the default according to the - // current selection. - this.defaultParams = this.getParamRepresentation( this.getSelectedState() ); - } - this.active = active; this.currSelected = item; diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index 4b78175064..dcce92d6bd 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -1,4 +1,7 @@ ( function ( mw, $ ) { + + var byteLength = require( 'mediawiki.String' ).byteLength; + /* eslint no-underscore-dangle: "off" */ /** * Controller for the filters in Recent Changes @@ -804,7 +807,7 @@ // Stringify state stringified = JSON.stringify( state ); - if ( $.byteLength( stringified ) > 65535 ) { + if ( byteLength( stringified ) > 65535 ) { // Sanity check, since the preference can only hold that. return; } diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.js b/resources/src/mediawiki.special/mediawiki.special.upload.js index 57578a647e..de5ab87732 100644 --- a/resources/src/mediawiki.special/mediawiki.special.upload.js +++ b/resources/src/mediawiki.special/mediawiki.special.upload.js @@ -349,7 +349,7 @@ }; reader.readAsArrayBuffer( file ); } else if ( 'URL' in window && 'createObjectURL' in window.URL ) { - // Supported in Firefox 4.0 and above + // Supported in Firefox 4.0 and above // WebKit has it in a namespace for now but that's ok. ;) // // Lifetime of this URL is until document close, which is fine diff --git a/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js b/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js index a810c9834b..03ffca7b95 100644 --- a/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js +++ b/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js @@ -1,25 +1,31 @@ -/** - * @class mw.widgets - */ +( function ( mw ) { -/** - * Add a visible byte limit label to a TextInputWidget. - * - * Uses jQuery#byteLimit to enforce the limit. - * - * @param {OO.ui.TextInputWidget} textInputWidget Text input widget - * @param {number} [limit] Byte limit, defaults to $input's maxlength - */ -mediaWiki.widgets.visibleByteLimit = function ( textInputWidget, limit ) { - limit = limit || +textInputWidget.$input.attr( 'maxlength' ); + var byteLength = require( 'mediawiki.String' ).byteLength; - function updateCount() { - textInputWidget.setLabel( ( limit - $.byteLength( textInputWidget.getValue() ) ).toString() ); - } - textInputWidget.on( 'change', updateCount ); - // Initialise value - updateCount(); + /** + * @class mw.widgets + */ - // Actually enforce limit - textInputWidget.$input.byteLimit( limit ); -}; + /** + * Add a visible byte limit label to a TextInputWidget. + * + * Uses jQuery#byteLimit to enforce the limit. + * + * @param {OO.ui.TextInputWidget} textInputWidget Text input widget + * @param {number} [limit] Byte limit, defaults to $input's maxlength + */ + mw.widgets.visibleByteLimit = function ( textInputWidget, limit ) { + limit = limit || +textInputWidget.$input.attr( 'maxlength' ); + + function updateCount() { + textInputWidget.setLabel( ( limit - byteLength( textInputWidget.getValue() ) ).toString() ); + } + textInputWidget.on( 'change', updateCount ); + // Initialise value + updateCount(); + + // Actually enforce limit + textInputWidget.$input.byteLimit( limit ); + }; + +}( mediaWiki ) ); diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js index 98d07f3bb7..4b1109b491 100644 --- a/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js +++ b/resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js @@ -6,6 +6,8 @@ */ ( function ( $, mw ) { + var trimByteLength = require( 'mediawiki.String' ).trimByteLength; + /** * Creates an mw.widgets.TitleInputWidget object. * @@ -130,7 +132,7 @@ // Parent method value = mw.widgets.TitleInputWidget.parent.prototype.cleanUpValue.call( this, value ); - return $.trimByteLength( this.value, value, this.maxLength, function ( value ) { + return trimByteLength( this.value, value, this.maxLength, function ( value ) { var title = widget.getMWTitle( value ); return title ? title.getMain() : value; } ).newVal; diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js index 4d569402b0..177861ec05 100644 --- a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js +++ b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js @@ -180,8 +180,9 @@ * @return {string} */ ForeignStructuredUpload.prototype.getDescriptions = function () { + var upload = this; return this.descriptions.map( function ( desc ) { - return this.config.format.description + return upload.config.format.description .replace( '$LANGUAGE', desc.language ) .replace( '$TEXT', desc.text ); } ).join( '\n' ); diff --git a/resources/src/mediawiki/mediawiki.String.js b/resources/src/mediawiki/mediawiki.String.js new file mode 100644 index 0000000000..5e11680543 --- /dev/null +++ b/resources/src/mediawiki/mediawiki.String.js @@ -0,0 +1,156 @@ +( function () { + + /** + * @class mw.String + * @singleton + */ + + /** + * Calculate the byte length of a string (accounting for UTF-8). + * + * @author Jan Paul Posma, 2011 + * @author Timo Tijhof, 2012 + * @author David Chan, 2013 + * + * @param {string} str + * @return {number} + */ + function byteLength( str ) { + // This basically figures out how many bytes a UTF-16 string (which is what js sees) + // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that. + // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them + // and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in + // edge cases such as illegal sequences, but that should never happen. + + // https://en.wikipedia.org/wiki/UTF-8#Description + // The mapping from UTF-16 code units to UTF-8 bytes is as follows: + // > Range 0000-007F: codepoints that become 1 byte of UTF-8 + // > Range 0080-07FF: codepoints that become 2 bytes of UTF-8 + // > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8 + // > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8) + // > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued) + + return str + .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' ) + .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' ) + .length; + } + + // Like String#charAt, but return the pair of UTF-16 surrogates for characters outside of BMP. + function codePointAt( string, offset, backwards ) { + // We don't need to check for offsets at the beginning or end of string, + // String#slice will simply return a shorter (or empty) substring. + var maybePair = backwards ? + string.slice( offset - 1, offset + 1 ) : + string.slice( offset, offset + 2 ); + if ( /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( maybePair ) ) { + return maybePair; + } else { + return string.charAt( offset ); + } + } + + /** + * Utility function to trim down a string, based on byteLimit + * and given a safe start position. It supports insertion anywhere + * in the string, so "foo" to "fobaro" if limit is 4 will result in + * "fobo", not "foba". Basically emulating the native maxlength by + * reconstructing where the insertion occurred. + * + * @param {string} safeVal Known value that was previously returned by this + * function, if none, pass empty string. + * @param {string} newVal New value that may have to be trimmed down. + * @param {number} byteLimit Number of bytes the value may be in size. + * @param {Function} [fn] Function to call on the string before assessing the length. + * @return {Object} + * @return {string} return.newVal + * @return {boolean} return.trimmed + */ + function trimByteLength( safeVal, newVal, byteLimit, fn ) { + var startMatches, endMatches, matchesLen, inpParts, chopOff, oldChar, newChar, + oldVal = safeVal; + + // Run the hook if one was provided, but only on the length + // assessment. The value itself is not to be affected by the hook. + if ( byteLength( fn ? fn( newVal ) : newVal ) <= byteLimit ) { + // Limit was not reached, just remember the new value + // and let the user continue. + return { + newVal: newVal, + trimmed: false + }; + } + + // Current input is longer than the active limit. + // Figure out what was added and limit the addition. + startMatches = 0; + endMatches = 0; + + // It is important that we keep the search within the range of + // the shortest string's length. + // Imagine a user adds text that matches the end of the old value + // (e.g. "foo" -> "foofoo"). startMatches would be 3, but without + // limiting both searches to the shortest length, endMatches would + // also be 3. + matchesLen = Math.min( newVal.length, oldVal.length ); + + // Count same characters from the left, first. + // (if "foo" -> "foofoo", assume addition was at the end). + while ( startMatches < matchesLen ) { + oldChar = codePointAt( oldVal, startMatches, false ); + newChar = codePointAt( newVal, startMatches, false ); + if ( oldChar !== newChar ) { + break; + } + startMatches += oldChar.length; + } + + while ( endMatches < ( matchesLen - startMatches ) ) { + oldChar = codePointAt( oldVal, oldVal.length - 1 - endMatches, true ); + newChar = codePointAt( newVal, newVal.length - 1 - endMatches, true ); + if ( oldChar !== newChar ) { + break; + } + endMatches += oldChar.length; + } + + inpParts = [ + // Same start + newVal.slice( 0, startMatches ), + // Inserted content + newVal.slice( startMatches, newVal.length - endMatches ), + // Same end + newVal.slice( newVal.length - endMatches ) + ]; + + // Chop off characters from the end of the "inserted content" string + // until the limit is statisfied. + if ( fn ) { + // stop, when there is nothing to slice - T43450 + while ( byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[ 1 ].length > 0 ) { + // Do not chop off halves of surrogate pairs + chopOff = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( inpParts[ 1 ] ) ? 2 : 1; + inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -chopOff ); + } + } else { + while ( byteLength( inpParts.join( '' ) ) > byteLimit ) { + // Do not chop off halves of surrogate pairs + chopOff = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test( inpParts[ 1 ] ) ? 2 : 1; + inpParts[ 1 ] = inpParts[ 1 ].slice( 0, -chopOff ); + } + } + + return { + newVal: inpParts.join( '' ), + // For pathological fn() that always returns a value longer than the limit, we might have + // ended up not trimming - check for this case to avoid infinite loops + trimmed: newVal !== inpParts.join( '' ) + }; + } + + module.exports = { + byteLength: byteLength, + trimByteLength: trimByteLength + }; + +}() ); diff --git a/resources/src/mediawiki/mediawiki.Title.js b/resources/src/mediawiki/mediawiki.Title.js index 851f06c2d1..2b76187359 100644 --- a/resources/src/mediawiki/mediawiki.Title.js +++ b/resources/src/mediawiki/mediawiki.Title.js @@ -32,6 +32,8 @@ /* Private members */ var + mwString = require( 'mediawiki.String' ), + namespaceIds = mw.config.get( 'wgNamespaceIds' ), /** @@ -320,7 +322,7 @@ // Except for special pages, e.g. [[Special:Block/Long name]] // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should // be less than 512 bytes. - if ( namespace !== NS_SPECIAL && $.byteLength( title ) > TITLE_MAX_BYTES ) { + if ( namespace !== NS_SPECIAL && mwString.byteLength( title ) > TITLE_MAX_BYTES ) { return false; } @@ -407,21 +409,7 @@ * @return {string} */ trimToByteLength = function ( s, length ) { - var byteLength, chopOffChars, chopOffBytes; - - // bytelength is always greater or equal to the length in characters - s = s.substr( 0, length ); - while ( ( byteLength = $.byteLength( s ) ) > length ) { - // Calculate how many characters can be safely removed - // First, we need to know how many bytes the string exceeds the threshold - chopOffBytes = byteLength - length; - // A character in UTF-8 is at most 4 bytes - // One character must be removed in any case because the - // string is too long - chopOffChars = Math.max( 1, Math.floor( chopOffBytes / 4 ) ); - s = s.substr( 0, s.length - chopOffChars ); - } - return s; + return mwString.trimByteLength( '', s, length ).newVal; }, /** diff --git a/resources/src/mediawiki/mediawiki.inspect.js b/resources/src/mediawiki/mediawiki.inspect.js index f91ffbb41b..6478fd96d3 100644 --- a/resources/src/mediawiki/mediawiki.inspect.js +++ b/resources/src/mediawiki/mediawiki.inspect.js @@ -10,6 +10,7 @@ ( function ( mw, $ ) { var inspect, + byteLength = require( 'mediawiki.String' ).byteLength, hasOwn = Object.prototype.hasOwnProperty; function sortByProperty( array, prop, descending ) { @@ -117,9 +118,9 @@ size = 0; for ( i = 0; i < args.length; i++ ) { if ( typeof args[ i ] === 'function' ) { - size += $.byteLength( getFunctionBody( args[ i ] ) ); + size += byteLength( getFunctionBody( args[ i ] ) ); } else { - size += $.byteLength( JSON.stringify( args[ i ] ) ); + size += byteLength( JSON.stringify( args[ i ] ) ); } } @@ -285,8 +286,8 @@ $.extend( stats, mw.loader.store.stats ); try { raw = localStorage.getItem( mw.loader.store.getStoreKey() ); - stats.totalSizeInBytes = $.byteLength( raw ); - stats.totalSize = humanSize( $.byteLength( raw ) ); + stats.totalSizeInBytes = byteLength( raw ); + stats.totalSize = humanSize( byteLength( raw ) ); } catch ( e ) {} } return [ stats ]; diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js index 104f6990b0..a2e071e11a 100644 --- a/resources/src/mediawiki/mediawiki.js +++ b/resources/src/mediawiki/mediawiki.js @@ -53,7 +53,7 @@ } function defineFallbacks() { - // + // StringSet = window.Set || ( function () { /** * @private @@ -1982,6 +1982,12 @@ * OO.compare( [ 1 ], [ 1 ] ); * } ); * + * Example of inline dependency obtained via `require()`: + * + * mw.loader.using( [ 'mediawiki.util' ], function ( require ) { + * var util = require( 'mediawiki.util' ); + * } ); + * * Since MediaWiki 1.23 this also returns a promise. * * Since MediaWiki 1.28 the promise is resolved with a `require` function. @@ -2154,9 +2160,14 @@ /** * Get the exported value of a module. * - * Modules may provide this via their local `module.exports`. + * This static method is publicly exposed for debugging purposes + * only and must not be used in production code. In production code, + * please use the dynamically provided `require()` function instead. * - * @protected + * In case of lazy-loaded modules via mw.loader#using(), the returned + * Promise provides the function, see #using() for examples. + * + * @private * @since 1.27 * @param {string} moduleName Module name * @return {Mixed} Exported value diff --git a/resources/src/startup.js b/resources/src/startup.js index fe0b02998b..cc313c7c74 100644 --- a/resources/src/startup.js +++ b/resources/src/startup.js @@ -30,7 +30,7 @@ window.mwNow = ( function () { * * Browsers we support in our modern run-time (Grade A): * - Chrome 13+ - * - IE 10+ + * - IE 11+ * - Firefox 4+ * - Safari 5+ * - Opera 15+ @@ -86,7 +86,7 @@ window.isCompatible = function ( str ) { // support in the modern run-time. // Note: Please extend the regex instead of adding new ones !( - ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$|googleweblight/ ) || + ua.match( /MSIE 10|webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$|googleweblight/ ) || ua.match( /PlayStation/i ) ) ); diff --git a/tests/integration/includes/http/MWHttpRequestTestCase.php b/tests/integration/includes/http/MWHttpRequestTestCase.php index cc769d7ee8..262eb35080 100644 --- a/tests/integration/includes/http/MWHttpRequestTestCase.php +++ b/tests/integration/includes/http/MWHttpRequestTestCase.php @@ -2,7 +2,7 @@ use Wikimedia\TestingAccessWrapper; -abstract class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase { +abstract class MWHttpRequestTestCase extends PHPUnit\Framework\TestCase { protected static $httpEngine; protected $oldHttpEngine; diff --git a/tests/integration/includes/shell/FirejailCommandTest.php b/tests/integration/includes/shell/FirejailCommandTest.php index 598c715ed7..c69fa730a3 100644 --- a/tests/integration/includes/shell/FirejailCommandTest.php +++ b/tests/integration/includes/shell/FirejailCommandTest.php @@ -9,7 +9,7 @@ use MediaWiki\Shell\Shell; * as long as firejail and sudo has similar config. * @group Shell */ -class FirejailCommandIntegrationTest extends PHPUnit_Framework_TestCase { +class FirejailCommandIntegrationTest extends PHPUnit\Framework\TestCase { public function setUp() { parent::setUp(); diff --git a/tests/parser/ParserTestRunner.php b/tests/parser/ParserTestRunner.php index 4dd4bc67d2..4f6f6b6758 100644 --- a/tests/parser/ParserTestRunner.php +++ b/tests/parser/ParserTestRunner.php @@ -889,7 +889,7 @@ class ParserTestRunner { if ( isset( $output ) && isset( $opts['showflags'] ) ) { $actualFlags = array_keys( TestingAccessWrapper::newFromObject( $output )->mFlags ); sort( $actualFlags ); - $out .= "\nflags=" . join( ', ', $actualFlags ); + $out .= "\nflags=" . implode( ', ', $actualFlags ); } ScopedCallback::consume( $teardownGuard ); diff --git a/tests/parser/PhpunitTestRecorder.php b/tests/parser/PhpunitTestRecorder.php index 2f82ca7267..1a2cfc918d 100644 --- a/tests/parser/PhpunitTestRecorder.php +++ b/tests/parser/PhpunitTestRecorder.php @@ -3,7 +3,7 @@ class PhpunitTestRecorder extends TestRecorder { private $testCase; - public function setTestCase( PHPUnit_Framework_TestCase $testCase ) { + public function setTestCase( PHPUnit\Framework\TestCase $testCase ) { $this->testCase = $testCase; } diff --git a/tests/phpunit/MediaWikiPHPUnitTestListener.php b/tests/phpunit/MediaWikiPHPUnitTestListener.php index dd606d8a4b..0a162a283d 100644 --- a/tests/phpunit/MediaWikiPHPUnitTestListener.php +++ b/tests/phpunit/MediaWikiPHPUnitTestListener.php @@ -11,7 +11,7 @@ class MediaWikiPHPUnitTestListener protected function getTestName( PHPUnit_Framework_Test $test ) { $name = get_class( $test ); - if ( $test instanceof PHPUnit_Framework_TestCase ) { + if ( $test instanceof PHPUnit\Framework\TestCase ) { $name .= '::' . $test->getName( true ); } diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index 817f161504..652b1ee1bf 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -14,7 +14,7 @@ use Wikimedia\TestingAccessWrapper; /** * @since 1.18 */ -abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase { +abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/data/media/jpeg-xmp-loop.jpg b/tests/phpunit/data/media/jpeg-xmp-loop.jpg new file mode 100644 index 0000000000..962f3fe0e7 Binary files /dev/null and b/tests/phpunit/data/media/jpeg-xmp-loop.jpg differ diff --git a/tests/phpunit/includes/FauxRequestTest.php b/tests/phpunit/includes/FauxRequestTest.php index f6ccbc78a8..9f8bb385f2 100644 --- a/tests/phpunit/includes/FauxRequestTest.php +++ b/tests/phpunit/includes/FauxRequestTest.php @@ -2,7 +2,7 @@ use MediaWiki\Session\SessionManager; -class FauxRequestTest extends PHPUnit_Framework_TestCase { +class FauxRequestTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php b/tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php index 8adb55fc14..1011a37c3e 100644 --- a/tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php +++ b/tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php @@ -5,7 +5,7 @@ * @covers ::wfArrayFilter * @covers ::wfArrayFilterByKey */ -class WfArrayFilterTest extends \PHPUnit_Framework_TestCase { +class WfArrayFilterTest extends \PHPUnit\Framework\TestCase { public function testWfArrayFilter() { $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ]; $filtered = wfArrayFilter( $arr, function ( $val, $key ) { diff --git a/tests/phpunit/includes/MediaWikiVersionFetcherTest.php b/tests/phpunit/includes/MediaWikiVersionFetcherTest.php index 6aa98490e7..87a7dffde1 100644 --- a/tests/phpunit/includes/MediaWikiVersionFetcherTest.php +++ b/tests/phpunit/includes/MediaWikiVersionFetcherTest.php @@ -10,7 +10,7 @@ * * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -class MediaWikiVersionFetcherTest extends PHPUnit_Framework_TestCase { +class MediaWikiVersionFetcherTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/SanitizerValidateEmailTest.php b/tests/phpunit/includes/SanitizerValidateEmailTest.php index c7e15ea5d1..c4e430848b 100644 --- a/tests/phpunit/includes/SanitizerValidateEmailTest.php +++ b/tests/phpunit/includes/SanitizerValidateEmailTest.php @@ -5,7 +5,7 @@ * @todo all test methods in this class should be refactored and... * use a single test method and a single data provider... */ -class SanitizerValidateEmailTest extends PHPUnit_Framework_TestCase { +class SanitizerValidateEmailTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/SiteStatsTest.php b/tests/phpunit/includes/SiteStatsTest.php index cdbf9fd944..56bde5da08 100644 --- a/tests/phpunit/includes/SiteStatsTest.php +++ b/tests/phpunit/includes/SiteStatsTest.php @@ -11,9 +11,10 @@ class SiteStatsTest extends MediaWikiTestCase { $cache = \MediaWiki\MediaWikiServices::getInstance()->getMainWANObjectCache(); $jobq = JobQueueGroup::singleton(); - // Delete EditPage jobs that might have been left behind by other tests + // Delete jobs that might have been left behind by other tests $jobq->get( 'htmlCacheUpdate' )->delete(); $jobq->get( 'recentChangesUpdate' )->delete(); + $jobq->get( 'userGroupExpiry' )->delete(); $cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) ); $jobq->push( new NullJob( Title::newMainPage(), [] ) ); diff --git a/tests/phpunit/includes/TitleArrayFromResultTest.php b/tests/phpunit/includes/TitleArrayFromResultTest.php index 63956c123a..af49ecf73a 100644 --- a/tests/phpunit/includes/TitleArrayFromResultTest.php +++ b/tests/phpunit/includes/TitleArrayFromResultTest.php @@ -4,7 +4,7 @@ * @author Addshore * @covers TitleArrayFromResult */ -class TitleArrayFromResultTest extends PHPUnit_Framework_TestCase { +class TitleArrayFromResultTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/WikiReferenceTest.php b/tests/phpunit/includes/WikiReferenceTest.php index dc2e9ae412..e4b21ce5ac 100644 --- a/tests/phpunit/includes/WikiReferenceTest.php +++ b/tests/phpunit/includes/WikiReferenceTest.php @@ -3,7 +3,7 @@ /** * @covers WikiReference */ -class WikiReferenceTest extends PHPUnit_Framework_TestCase { +class WikiReferenceTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/XmlJsTest.php b/tests/phpunit/includes/XmlJsTest.php index dec7bf3d2a..c7975efabc 100644 --- a/tests/phpunit/includes/XmlJsTest.php +++ b/tests/phpunit/includes/XmlJsTest.php @@ -3,7 +3,7 @@ /** * @group Xml */ -class XmlJsTest extends PHPUnit_Framework_TestCase { +class XmlJsTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/api/ApiPageSetTest.php b/tests/phpunit/includes/api/ApiPageSetTest.php index 10bdfa735c..b9e4645d52 100644 --- a/tests/phpunit/includes/api/ApiPageSetTest.php +++ b/tests/phpunit/includes/api/ApiPageSetTest.php @@ -108,7 +108,7 @@ class ApiPageSetTest extends ApiTestCase { $userName = $user->getName(); $userDbkey = str_replace( ' ', '_', $userName ); $request = new FauxRequest( [ - 'titles' => join( '|', [ + 'titles' => implode( '|', [ 'Special:MyContributions', 'Special:MyPage', 'Special:MyTalk/subpage', diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php index 2371eea87a..d2bdb496af 100644 --- a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php +++ b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php @@ -157,7 +157,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase { /** * Recursively merge the new result returned from the query to the previous results. - * @param mixed $results + * @param mixed &$results * @param mixed $newResult * @param bool $numericIds If true, treat keys as ids to be merged instead of appending */ diff --git a/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php index dd027937cc..1a7ed12da7 100644 --- a/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php @@ -5,7 +5,7 @@ namespace MediaWiki\Auth; use Psr\Log\LoggerInterface; use Wikimedia\TestingAccessWrapper; -class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Framework_TestCase { +class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit\Framework\TestCase { public function testConstructor() { $config = new \HashConfig( [ 'EnableEmail' => true, diff --git a/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php b/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php index 9ade89248b..c607ae5b50 100644 --- a/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php +++ b/tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php @@ -7,7 +7,7 @@ * * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase { +class ComposerVersionNormalizerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/config/EtcdConfigTest.php b/tests/phpunit/includes/config/EtcdConfigTest.php index 379eebd8a4..c833934bfd 100644 --- a/tests/phpunit/includes/config/EtcdConfigTest.php +++ b/tests/phpunit/includes/config/EtcdConfigTest.php @@ -2,7 +2,7 @@ use Wikimedia\TestingAccessWrapper; -class EtcdConfigTest extends PHPUnit_Framework_TestCase { +class EtcdConfigTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php index 369aa83c7b..2de35a7c88 100644 --- a/tests/phpunit/includes/db/DatabaseSqliteTest.php +++ b/tests/phpunit/includes/db/DatabaseSqliteTest.php @@ -6,8 +6,6 @@ use Wikimedia\Rdbms\DatabaseSqlite; use Wikimedia\Rdbms\ResultWrapper; class DatabaseSqliteMock extends DatabaseSqlite { - private $lastQuery; - public static function newInstance( array $p = [] ) { $p['dbFilePath'] = ':memory:'; $p['schema'] = false; @@ -16,8 +14,6 @@ class DatabaseSqliteMock extends DatabaseSqlite { } function query( $sql, $fname = '', $tempIgnore = false ) { - $this->lastQuery = $sql; - return true; } diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php index fa9898d1cd..606c12d58e 100644 --- a/tests/phpunit/includes/db/DatabaseTestHelper.php +++ b/tests/phpunit/includes/db/DatabaseTestHelper.php @@ -108,7 +108,7 @@ class DatabaseTestHelper extends Database { public function tableExists( $table, $fname = __METHOD__ ) { $tableRaw = $this->tableName( $table, 'raw' ); - if ( isset( $this->mSessionTempTables[$tableRaw] ) ) { + if ( isset( $this->sessionTempTables[$tableRaw] ) ) { return true; // already known to exist } diff --git a/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php b/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php index 8086b4bf23..1ee188e7cd 100644 --- a/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php +++ b/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php @@ -2,7 +2,7 @@ namespace MediaWiki\Logger\Monolog; -class LogstashFormatterTest extends \PHPUnit_Framework_TestCase { +class LogstashFormatterTest extends \PHPUnit\Framework\TestCase { /** * @dataProvider provideV1 * @param array $record The input record. diff --git a/tests/phpunit/includes/deferred/MWCallableUpdateTest.php b/tests/phpunit/includes/deferred/MWCallableUpdateTest.php index 6977aef1a2..3ab9b5659e 100644 --- a/tests/phpunit/includes/deferred/MWCallableUpdateTest.php +++ b/tests/phpunit/includes/deferred/MWCallableUpdateTest.php @@ -3,7 +3,7 @@ /** * @covers MWCallableUpdate */ -class MWCallableUpdateTest extends PHPUnit_Framework_TestCase { +class MWCallableUpdateTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/deferred/TransactionRoundDefiningUpdateTest.php b/tests/phpunit/includes/deferred/TransactionRoundDefiningUpdateTest.php index 1261c24b26..693897e676 100644 --- a/tests/phpunit/includes/deferred/TransactionRoundDefiningUpdateTest.php +++ b/tests/phpunit/includes/deferred/TransactionRoundDefiningUpdateTest.php @@ -3,7 +3,7 @@ /** * @covers TransactionRoundDefiningUpdate */ -class TransactionRoundDefiningUpdateTest extends PHPUnit_Framework_TestCase { +class TransactionRoundDefiningUpdateTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/exception/BadTitleErrorTest.php b/tests/phpunit/includes/exception/BadTitleErrorTest.php index dcdb1cd198..b706facedc 100644 --- a/tests/phpunit/includes/exception/BadTitleErrorTest.php +++ b/tests/phpunit/includes/exception/BadTitleErrorTest.php @@ -10,8 +10,10 @@ class BadTitleErrorTest extends MediaWikiTestCase { try { throw new BadTitleError(); } catch ( BadTitleError $e ) { + ob_start(); $e->report(); - $this->assertTrue( true ); + $text = ob_get_clean(); + $this->assertContains( $e->getText(), $text ); } } diff --git a/tests/phpunit/includes/exception/ThrottledErrorTest.php b/tests/phpunit/includes/exception/ThrottledErrorTest.php index 15f08966dc..5214b6d4d1 100644 --- a/tests/phpunit/includes/exception/ThrottledErrorTest.php +++ b/tests/phpunit/includes/exception/ThrottledErrorTest.php @@ -11,8 +11,10 @@ class ThrottledErrorTest extends MediaWikiTestCase { try { throw new ThrottledError(); } catch ( ThrottledError $e ) { + ob_start(); $e->report(); - $this->assertTrue( true ); + $text = ob_get_clean(); + $this->assertContains( $e->getText(), $text ); } } diff --git a/tests/phpunit/includes/externalstore/ExternalStoreFactoryTest.php b/tests/phpunit/includes/externalstore/ExternalStoreFactoryTest.php index d43e04a4aa..f762693864 100644 --- a/tests/phpunit/includes/externalstore/ExternalStoreFactoryTest.php +++ b/tests/phpunit/includes/externalstore/ExternalStoreFactoryTest.php @@ -3,7 +3,7 @@ /** * @covers ExternalStoreFactory */ -class ExternalStoreFactoryTest extends PHPUnit_Framework_TestCase { +class ExternalStoreFactoryTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/htmlform/HTMLRestrictionsFieldTest.php b/tests/phpunit/includes/htmlform/HTMLRestrictionsFieldTest.php index 75c93be698..c4290e1e64 100644 --- a/tests/phpunit/includes/htmlform/HTMLRestrictionsFieldTest.php +++ b/tests/phpunit/includes/htmlform/HTMLRestrictionsFieldTest.php @@ -3,7 +3,7 @@ /** * @covers HTMLRestrictionsField */ -class HTMLRestrictionsFieldTest extends PHPUnit_Framework_TestCase { +class HTMLRestrictionsFieldTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php b/tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php index d5a267e5b4..b5d6144242 100644 --- a/tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php +++ b/tests/phpunit/includes/jobqueue/JobQueueMemoryTest.php @@ -8,7 +8,7 @@ * @licence GNU GPL v2+ * @author Thiemo Kreuz */ -class JobQueueMemoryTest extends PHPUnit_Framework_TestCase { +class JobQueueMemoryTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/ArrayUtilsTest.php b/tests/phpunit/includes/libs/ArrayUtilsTest.php index 88312657d4..4fbbc99b6a 100644 --- a/tests/phpunit/includes/libs/ArrayUtilsTest.php +++ b/tests/phpunit/includes/libs/ArrayUtilsTest.php @@ -4,7 +4,7 @@ * * @group Database */ -class ArrayUtilsTest extends PHPUnit_Framework_TestCase { +class ArrayUtilsTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/DeferredStringifierTest.php b/tests/phpunit/includes/libs/DeferredStringifierTest.php index c9958403f9..c9cdf5831d 100644 --- a/tests/phpunit/includes/libs/DeferredStringifierTest.php +++ b/tests/phpunit/includes/libs/DeferredStringifierTest.php @@ -3,7 +3,7 @@ /** * @covers DeferredStringifier */ -class DeferredStringifierTest extends PHPUnit_Framework_TestCase { +class DeferredStringifierTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php index 264cc00a7d..1b3397c12a 100644 --- a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php +++ b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php @@ -3,7 +3,7 @@ /** * @covers DnsSrvDiscoverer */ -class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase { +class DnsSrvDiscovererTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/GenericArrayObjectTest.php b/tests/phpunit/includes/libs/GenericArrayObjectTest.php index 3e8aaeba02..a7cf755329 100644 --- a/tests/phpunit/includes/libs/GenericArrayObjectTest.php +++ b/tests/phpunit/includes/libs/GenericArrayObjectTest.php @@ -26,7 +26,7 @@ * * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -abstract class GenericArrayObjectTest extends PHPUnit_Framework_TestCase { +abstract class GenericArrayObjectTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/HashRingTest.php b/tests/phpunit/includes/libs/HashRingTest.php index 040bebf4f0..ba288281f6 100644 --- a/tests/phpunit/includes/libs/HashRingTest.php +++ b/tests/phpunit/includes/libs/HashRingTest.php @@ -3,7 +3,7 @@ /** * @group HashRing */ -class HashRingTest extends PHPUnit_Framework_TestCase { +class HashRingTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/HtmlArmorTest.php b/tests/phpunit/includes/libs/HtmlArmorTest.php index eb601e7fc8..c5e87e4e2a 100644 --- a/tests/phpunit/includes/libs/HtmlArmorTest.php +++ b/tests/phpunit/includes/libs/HtmlArmorTest.php @@ -3,7 +3,7 @@ /** * @covers HtmlArmor */ -class HtmlArmorTest extends PHPUnit_Framework_TestCase { +class HtmlArmorTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/IEUrlExtensionTest.php b/tests/phpunit/includes/libs/IEUrlExtensionTest.php index 8192f01828..03c7b0c05c 100644 --- a/tests/phpunit/includes/libs/IEUrlExtensionTest.php +++ b/tests/phpunit/includes/libs/IEUrlExtensionTest.php @@ -5,7 +5,7 @@ * @todo tests below for findIE6Extension should be split into... * ...a dataprovider and test method. */ -class IEUrlExtensionTest extends PHPUnit_Framework_TestCase { +class IEUrlExtensionTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/IPTest.php b/tests/phpunit/includes/libs/IPTest.php index a36b259300..6a751816a6 100644 --- a/tests/phpunit/includes/libs/IPTest.php +++ b/tests/phpunit/includes/libs/IPTest.php @@ -8,7 +8,7 @@ * @todo Test methods in this call should be split into a method and a * dataprovider. */ -class IPTest extends PHPUnit_Framework_TestCase { +class IPTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php index 98494c4386..61056784fb 100644 --- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php +++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php @@ -1,6 +1,6 @@ */ -class TimingTest extends PHPUnit_Framework_TestCase { +class TimingTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/XhprofDataTest.php b/tests/phpunit/includes/libs/XhprofDataTest.php index d226227b0b..1cbd86f1ef 100644 --- a/tests/phpunit/includes/libs/XhprofDataTest.php +++ b/tests/phpunit/includes/libs/XhprofDataTest.php @@ -24,7 +24,7 @@ * @copyright © 2014 Wikimedia Foundation and contributors * @since 1.25 */ -class XhprofDataTest extends PHPUnit_Framework_TestCase { +class XhprofDataTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/XhprofTest.php b/tests/phpunit/includes/libs/XhprofTest.php index e2723b9dc9..0ea132896d 100644 --- a/tests/phpunit/includes/libs/XhprofTest.php +++ b/tests/phpunit/includes/libs/XhprofTest.php @@ -18,7 +18,7 @@ * @file */ -class XhprofTest extends PHPUnit_Framework_TestCase { +class XhprofTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/XmlTypeCheckTest.php b/tests/phpunit/includes/libs/XmlTypeCheckTest.php index 8a11d874e2..8616b41922 100644 --- a/tests/phpunit/includes/libs/XmlTypeCheckTest.php +++ b/tests/phpunit/includes/libs/XmlTypeCheckTest.php @@ -5,7 +5,7 @@ * @group Xml * @covers XMLTypeCheck */ -class XmlTypeCheckTest extends PHPUnit_Framework_TestCase { +class XmlTypeCheckTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/http/HttpAcceptNegotiatorTest.php b/tests/phpunit/includes/libs/http/HttpAcceptNegotiatorTest.php index 10dca7dcf0..02eac11887 100644 --- a/tests/phpunit/includes/libs/http/HttpAcceptNegotiatorTest.php +++ b/tests/phpunit/includes/libs/http/HttpAcceptNegotiatorTest.php @@ -7,7 +7,7 @@ use Wikimedia\Http\HttpAcceptNegotiator; * * @author Daniel Kinzler */ -class HttpAcceptNegotiatorTest extends \PHPUnit_Framework_TestCase { +class HttpAcceptNegotiatorTest extends \PHPUnit\Framework\TestCase { public function provideGetFirstSupportedValue() { return [ diff --git a/tests/phpunit/includes/libs/http/HttpAcceptParserTest.php b/tests/phpunit/includes/libs/http/HttpAcceptParserTest.php index 788c297f05..e4b47b46d5 100644 --- a/tests/phpunit/includes/libs/http/HttpAcceptParserTest.php +++ b/tests/phpunit/includes/libs/http/HttpAcceptParserTest.php @@ -7,7 +7,7 @@ use Wikimedia\Http\HttpAcceptParser; * * @author Daniel Kinzler */ -class HttpAcceptParserTest extends \PHPUnit_Framework_TestCase { +class HttpAcceptParserTest extends \PHPUnit\Framework\TestCase { public function provideParseWeights() { return [ diff --git a/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php b/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php index 1f3cae5347..fbe5a2bada 100644 --- a/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php +++ b/tests/phpunit/includes/libs/mime/MimeAnalyzerTest.php @@ -3,7 +3,7 @@ * @group Media * @covers MimeAnalyzer */ -class MimeAnalyzerTest extends PHPUnit_Framework_TestCase { +class MimeAnalyzerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php index d71b16c682..d0360a99f2 100644 --- a/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php @@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper; /** * @group BagOStuff */ -class CachedBagOStuffTest extends PHPUnit_Framework_TestCase { +class CachedBagOStuffTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php index 9eb34099e3..332e23b25b 100644 --- a/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php @@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper; /** * @group BagOStuff */ -class HashBagOStuffTest extends PHPUnit_Framework_TestCase { +class HashBagOStuffTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php index ca78f6500c..77198f9d18 100644 --- a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php +++ b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php @@ -16,7 +16,7 @@ use Wikimedia\TestingAccessWrapper; * @covers WANObjectCache::getInterimValue * @covers WANObjectCache::setInterimValue */ -class WANObjectCacheTest extends PHPUnit_Framework_TestCase { +class WANObjectCacheTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php b/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php index 25613fed6b..538d625cc2 100644 --- a/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php +++ b/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php @@ -6,7 +6,7 @@ use Psr\Log\LoggerInterface; /** * @covers \Wikimedia\Rdbms\TransactionProfiler */ -class TransactionProfilerTest extends PHPUnit_Framework_TestCase { +class TransactionProfilerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php index 2a707d3968..dd86a73eca 100644 --- a/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php +++ b/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php @@ -12,7 +12,7 @@ use Wikimedia\Rdbms\ConnectionManager; * * @author Daniel Kinzler */ -class ConnectionManagerTest extends \PHPUnit_Framework_TestCase { +class ConnectionManagerTest extends \PHPUnit\Framework\TestCase { /** * @return IDatabase|PHPUnit_Framework_MockObject_MockObject diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php index 20ce095c87..8d7d104c1e 100644 --- a/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php +++ b/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php @@ -12,7 +12,7 @@ use Wikimedia\Rdbms\SessionConsistentConnectionManager; * * @author Daniel Kinzler */ -class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase { +class SessionConsistentConnectionManagerTest extends \PHPUnit\Framework\TestCase { /** * @return IDatabase|PHPUnit_Framework_MockObject_MockObject diff --git a/tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php b/tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php index e660265125..d1f961a809 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php @@ -10,7 +10,7 @@ use Wikimedia\Rdbms\ResultWrapper; /** * @covers Wikimedia\Rdbms\DBConnRef */ -class DBConnRefTest extends PHPUnit_Framework_TestCase { +class DBConnRefTest extends PHPUnit\Framework\TestCase { /** * @return ILoadBalancer diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php index 4e5f735b60..b13e8fca62 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseDomainTest.php @@ -5,7 +5,7 @@ use Wikimedia\Rdbms\DatabaseDomain; /** * @covers Wikimedia\Rdbms\DatabaseDomain */ -class DatabaseDomainTest extends PHPUnit_Framework_TestCase { +class DatabaseDomainTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php index b2eabb1fc2..b9f57b568b 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php @@ -109,7 +109,7 @@ class FakeDatabaseMysqlBase extends DatabaseMysqlBase { } } -class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase { +class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; @@ -228,13 +228,20 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase { * @dataProvider provideComparePositions * @covers Wikimedia\Rdbms\MySQLMasterPos */ - public function testHasReached( MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match ) { + public function testHasReached( + MySQLMasterPos $lowerPos, MySQLMasterPos $higherPos, $match, $hetero + ) { if ( $match ) { $this->assertTrue( $lowerPos->channelsMatch( $higherPos ) ); - $this->assertTrue( $higherPos->hasReached( $lowerPos ) ); - $this->assertTrue( $higherPos->hasReached( $higherPos ) ); + if ( $hetero ) { + // Each position is has one channel higher than the other + $this->assertFalse( $higherPos->hasReached( $lowerPos ) ); + } else { + $this->assertTrue( $higherPos->hasReached( $lowerPos ) ); + } $this->assertTrue( $lowerPos->hasReached( $lowerPos ) ); + $this->assertTrue( $higherPos->hasReached( $higherPos ) ); $this->assertFalse( $lowerPos->hasReached( $higherPos ) ); } else { // channels don't match $this->assertFalse( $lowerPos->channelsMatch( $higherPos ) ); @@ -252,48 +259,93 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase { [ new MySQLMasterPos( 'db1034-bin.000976/843431247', $now ), new MySQLMasterPos( 'db1034-bin.000976/843431248', $now ), - true + true, + false ], [ new MySQLMasterPos( 'db1034-bin.000976/999', $now ), new MySQLMasterPos( 'db1034-bin.000976/1000', $now ), - true + true, + false ], [ new MySQLMasterPos( 'db1034-bin.000976/999', $now ), new MySQLMasterPos( 'db1035-bin.000976/1000', $now ), + false, false ], // MySQL GTID style [ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:23', $now ), new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:24', $now ), - true + true, + false ], [ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ), new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ), - true + true, + false ], [ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ), new MySQLMasterPos( '1E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ), + false, false ], // MariaDB GTID style [ new MySQLMasterPos( '255-11-23', $now ), new MySQLMasterPos( '255-11-24', $now ), - true + true, + false ], [ new MySQLMasterPos( '255-11-99', $now ), new MySQLMasterPos( '255-11-100', $now ), - true + true, + false ], [ new MySQLMasterPos( '255-11-999', $now ), new MySQLMasterPos( '254-11-1000', $now ), + false, + false + ], + [ + new MySQLMasterPos( '255-11-23,256-12-50', $now ), + new MySQLMasterPos( '255-11-24', $now ), + true, + false + ], + [ + new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ), + new MySQLMasterPos( '255-11-1000', $now ), + true, + false + ], + [ + new MySQLMasterPos( '255-11-23,256-12-50', $now ), + new MySQLMasterPos( '255-11-24,155-52-63', $now ), + true, + false + ], + [ + new MySQLMasterPos( '255-11-99,256-12-50,257-12-50', $now ), + new MySQLMasterPos( '255-11-1000,256-12-51', $now ), + true, + false + ], + [ + new MySQLMasterPos( '255-11-99,256-12-50', $now ), + new MySQLMasterPos( '255-13-1000,256-14-49', $now ), + true, + true + ], + [ + new MySQLMasterPos( '253-11-999,255-11-999', $now ), + new MySQLMasterPos( '254-11-1000', $now ), + false, false ], ]; @@ -338,6 +390,38 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase { ]; } + /** + * @dataProvider provideCommonDomainGTIDs + * @covers Wikimedia\Rdbms\MySQLMasterPos + */ + public function testCommonGtidDomains( MySQLMasterPos $pos, MySQLMasterPos $ref, $gtids ) { + $this->assertEquals( $gtids, MySQLMasterPos::getCommonDomainGTIDs( $pos, $ref ) ); + } + + public static function provideCommonDomainGTIDs() { + return [ + [ + new MySQLMasterPos( '255-13-99,256-12-50,257-14-50', 1 ), + new MySQLMasterPos( '255-11-1000', 1 ), + [ '255-13-99' ] + ], + [ + new MySQLMasterPos( + '2E11FA47-71CA-11E1-9E33-C80AA9429562:5,' . + '3E11FA47-71CA-11E1-9E33-C80AA9429562:99,' . + '7E11FA47-71CA-11E1-9E33-C80AA9429562:30', + 1 + ), + new MySQLMasterPos( + '1E11FA47-71CA-11E1-9E33-C80AA9429562:100,' . + '3E11FA47-71CA-11E1-9E33-C80AA9429562:66', + 1 + ), + [ '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ] + ] + ]; + } + /** * @dataProvider provideLagAmounts * @covers Wikimedia\Rdbms\DatabaseMysqlBase::getLag diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php index d8ebeff170..ebf6e45199 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php @@ -6,7 +6,7 @@ use Wikimedia\Rdbms\LikeMatch; * Test the parts of the Database abstract class that deal * with creating SQL text. */ -class DatabaseSQLTest extends PHPUnit_Framework_TestCase { +class DatabaseSQLTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; @@ -559,11 +559,11 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { 'uniqueIndexes' => [ 'field' ], 'rows' => [ 'field' => 'text', 'field2' => 'text2' ], ], - "DELETE FROM replace_table " . + "BEGIN; DELETE FROM replace_table " . "WHERE (field = 'text'); " . "INSERT INTO replace_table " . "(field,field2) " . - "VALUES ('text','text2')" + "VALUES ('text','text2'); COMMIT" ], [ [ @@ -575,11 +575,11 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { 'md_deps' => 'deps', ], ], - "DELETE FROM module_deps " . + "BEGIN; DELETE FROM module_deps " . "WHERE (md_module = 'module' AND md_skin = 'skin'); " . "INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . - "VALUES ('module','skin','deps')" + "VALUES ('module','skin','deps'); COMMIT" ], [ [ @@ -597,7 +597,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { ], ], ], - "DELETE FROM module_deps " . + "BEGIN; DELETE FROM module_deps " . "WHERE (md_module = 'module' AND md_skin = 'skin'); " . "INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . @@ -606,7 +606,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { "WHERE (md_module = 'module2' AND md_skin = 'skin2'); " . "INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . - "VALUES ('module2','skin2','deps2')" + "VALUES ('module2','skin2','deps2'); COMMIT" ], [ [ @@ -624,7 +624,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { ], ], ], - "DELETE FROM module_deps " . + "BEGIN; DELETE FROM module_deps " . "WHERE (md_module = 'module') OR (md_skin = 'skin'); " . "INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . @@ -633,7 +633,7 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { "WHERE (md_module = 'module2') OR (md_skin = 'skin2'); " . "INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . - "VALUES ('module2','skin2','deps2')" + "VALUES ('module2','skin2','deps2'); COMMIT" ], [ [ @@ -645,9 +645,9 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase { 'md_deps' => 'deps', ], ], - "INSERT INTO module_deps " . + "BEGIN; INSERT INTO module_deps " . "(md_module,md_skin,md_deps) " . - "VALUES ('module','skin','deps')" + "VALUES ('module','skin','deps'); COMMIT" ], ]; } diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php index e131506729..542470d0a6 100644 --- a/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php +++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php @@ -5,7 +5,7 @@ use Wikimedia\Rdbms\LBFactorySingle; use Wikimedia\Rdbms\TransactionProfiler; use Wikimedia\TestingAccessWrapper; -class DatabaseTest extends PHPUnit_Framework_TestCase { +class DatabaseTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; @@ -370,10 +370,34 @@ class DatabaseTest extends PHPUnit_Framework_TestCase { $this->assertFalse( (bool)$db->trxLevel(), "Transaction cleared." ); } + /** + * @covers Wikimedia\Rdbms\Database::getScopedLockAndFlush + * @covers Wikimedia\Rdbms\Database::lock + * @covers Wikimedia\Rdbms\Database::unlock + * @covers Wikimedia\Rdbms\Database::lockIsFree + */ public function testGetScopedLock() { $db = $this->getMockDB( [ 'isOpen' ] ); $db->method( 'isOpen' )->willReturn( true ); + $this->assertEquals( 0, $db->trxLevel() ); + $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) ); + $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) ); + $this->assertEquals( 0, $db->trxLevel() ); + + $db->setFlag( DBO_TRX ); + $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) ); + $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) ); + $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) ); + $db->clearFlag( DBO_TRX ); + + $this->assertEquals( 0, $db->trxLevel() ); + $db->setFlag( DBO_TRX ); try { $this->badLockingMethodImplicit( $db ); diff --git a/tests/phpunit/includes/libs/xmp/XMPTest.php b/tests/phpunit/includes/libs/xmp/XMPTest.php index 7becad2bb8..73fd47167c 100644 --- a/tests/phpunit/includes/libs/xmp/XMPTest.php +++ b/tests/phpunit/includes/libs/xmp/XMPTest.php @@ -4,7 +4,7 @@ * @group Media * @covers XMPReader */ -class XMPTest extends PHPUnit_Framework_TestCase { +class XMPTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/libs/xmp/XMPValidateTest.php b/tests/phpunit/includes/libs/xmp/XMPValidateTest.php index 0785920d44..746f68aca7 100644 --- a/tests/phpunit/includes/libs/xmp/XMPValidateTest.php +++ b/tests/phpunit/includes/libs/xmp/XMPValidateTest.php @@ -5,7 +5,7 @@ use Psr\Log\NullLogger; /** * @group Media */ -class XMPValidateTest extends PHPUnit_Framework_TestCase { +class XMPValidateTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php index 0991254119..97921727f5 100644 --- a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php +++ b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php @@ -108,4 +108,10 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase { $expected = 'BE'; $this->assertEquals( $expected, $res['byteOrder'] ); } + + public function testInfiniteRead() { + // Should get past infinite loop and throw in wfUnpack() + $this->setExpectedException( 'MWException' ); + $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-loop.jpg' ); + } } diff --git a/tests/phpunit/includes/objectcache/RedisBagOStuffTest.php b/tests/phpunit/includes/objectcache/RedisBagOStuffTest.php index 6e8c9cee80..df5614d8c1 100644 --- a/tests/phpunit/includes/objectcache/RedisBagOStuffTest.php +++ b/tests/phpunit/includes/objectcache/RedisBagOStuffTest.php @@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper; /** * @group BagOStuff */ -class RedisBagOStuffTest extends PHPUnit_Framework_TestCase { +class RedisBagOStuffTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/parser/ParserIntegrationTest.php b/tests/phpunit/includes/parser/ParserIntegrationTest.php index 28430ad7cd..0e1605a944 100644 --- a/tests/phpunit/includes/parser/ParserIntegrationTest.php +++ b/tests/phpunit/includes/parser/ParserIntegrationTest.php @@ -26,7 +26,7 @@ use Wikimedia\ScopedCallback; * @covers ParserOptions * @covers ParserOutput */ -class ParserIntegrationTest extends PHPUnit_Framework_TestCase { +class ParserIntegrationTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/registration/VersionCheckerTest.php b/tests/phpunit/includes/registration/VersionCheckerTest.php index 4a2810bb58..929ff0fa62 100644 --- a/tests/phpunit/includes/registration/VersionCheckerTest.php +++ b/tests/phpunit/includes/registration/VersionCheckerTest.php @@ -3,7 +3,7 @@ /** * @covers VersionChecker */ -class VersionCheckerTest extends PHPUnit_Framework_TestCase { +class VersionCheckerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php b/tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php index db1fb6452f..e4f58eb124 100644 --- a/tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php +++ b/tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php @@ -4,7 +4,7 @@ * @group ResourceLoader * @covers DerivativeResourceLoaderContext */ -class DerivativeResourceLoaderContextTest extends PHPUnit_Framework_TestCase { +class DerivativeResourceLoaderContextTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php b/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php index c00432efe8..fa4d804ee8 100644 --- a/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php +++ b/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php @@ -6,7 +6,7 @@ use Wikimedia\TestingAccessWrapper; * @group Cache * @covers MessageBlobStore */ -class MessageBlobStoreTest extends PHPUnit_Framework_TestCase { +class MessageBlobStoreTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php index e51d0d6252..7bfd7698ea 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php @@ -5,7 +5,7 @@ use Wikimedia\TestingAccessWrapper; /** * @group ResourceLoader */ -class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase { +class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php index f848556a42..b226ee1caf 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderContextTest.php @@ -8,7 +8,7 @@ * @group Cache * @covers ResourceLoaderContext */ -class ResourceLoaderContextTest extends PHPUnit_Framework_TestCase { +class ResourceLoaderContextTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php index 0718af6d8e..a1b1422060 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderSkinModuleTest.php @@ -3,7 +3,7 @@ /** * @group ResourceLoader */ -class ResourceLoaderSkinModuleTest extends PHPUnit_Framework_TestCase { +class ResourceLoaderSkinModuleTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/search/SearchSuggestionSetTest.php b/tests/phpunit/includes/search/SearchSuggestionSetTest.php index 28c69fa4b1..54533a7333 100644 --- a/tests/phpunit/includes/search/SearchSuggestionSetTest.php +++ b/tests/phpunit/includes/search/SearchSuggestionSetTest.php @@ -19,7 +19,7 @@ * http://www.gnu.org/copyleft/gpl.html */ -class SearchSuggestionSetTest extends \PHPUnit_Framework_TestCase { +class SearchSuggestionSetTest extends \PHPUnit\Framework\TestCase { /** * Test that adding a new suggestion at the end * will keep proper score ordering diff --git a/tests/phpunit/includes/services/ServiceContainerTest.php b/tests/phpunit/includes/services/ServiceContainerTest.php index 768ed9106f..1e8175e1b0 100644 --- a/tests/phpunit/includes/services/ServiceContainerTest.php +++ b/tests/phpunit/includes/services/ServiceContainerTest.php @@ -6,7 +6,7 @@ use MediaWiki\Services\ServiceContainer; * * @group MediaWiki */ -class ServiceContainerTest extends PHPUnit_Framework_TestCase { +class ServiceContainerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/shell/CommandFactoryTest.php b/tests/phpunit/includes/shell/CommandFactoryTest.php index cb2669f8fc..b031431af7 100644 --- a/tests/phpunit/includes/shell/CommandFactoryTest.php +++ b/tests/phpunit/includes/shell/CommandFactoryTest.php @@ -9,7 +9,7 @@ use Wikimedia\TestingAccessWrapper; /** * @group Shell */ -class CommandFactoryTest extends PHPUnit_Framework_TestCase { +class CommandFactoryTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/shell/CommandTest.php b/tests/phpunit/includes/shell/CommandTest.php index 2ba7bdc011..3862cc2444 100644 --- a/tests/phpunit/includes/shell/CommandTest.php +++ b/tests/phpunit/includes/shell/CommandTest.php @@ -7,7 +7,7 @@ use Wikimedia\TestingAccessWrapper; * @covers \MediaWiki\Shell\Command * @group Shell */ -class CommandTest extends PHPUnit_Framework_TestCase { +class CommandTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/shell/FirejailCommandTest.php b/tests/phpunit/includes/shell/FirejailCommandTest.php index 15853753c1..199393c692 100644 --- a/tests/phpunit/includes/shell/FirejailCommandTest.php +++ b/tests/phpunit/includes/shell/FirejailCommandTest.php @@ -23,7 +23,7 @@ use MediaWiki\Shell\FirejailCommand; use MediaWiki\Shell\Shell; use Wikimedia\TestingAccessWrapper; -class FirejailCommandTest extends PHPUnit_Framework_TestCase { +class FirejailCommandTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/shell/ShellTest.php b/tests/phpunit/includes/shell/ShellTest.php index 986a66560e..8162bc0299 100644 --- a/tests/phpunit/includes/shell/ShellTest.php +++ b/tests/phpunit/includes/shell/ShellTest.php @@ -6,7 +6,7 @@ use MediaWiki\Shell\Shell; * @covers \MediaWiki\Shell\Shell * @group Shell */ -class ShellTest extends PHPUnit_Framework_TestCase { +class ShellTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/site/FileBasedSiteLookupTest.php b/tests/phpunit/includes/site/FileBasedSiteLookupTest.php index 05aa6d393a..69e0e38936 100644 --- a/tests/phpunit/includes/site/FileBasedSiteLookupTest.php +++ b/tests/phpunit/includes/site/FileBasedSiteLookupTest.php @@ -27,7 +27,7 @@ * * @author Katie Filbert < aude.wiki@gmail.com > */ -class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase { +class FileBasedSiteLookupTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php b/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php index d2305508e5..2ac2714650 100644 --- a/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php +++ b/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php @@ -27,7 +27,7 @@ use MediaWiki\Site\MediaWikiPageNameNormalizer; * * @author Marius Hoch */ -class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase { +class MediaWikiPageNameNormalizerTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/site/SiteExporterTest.php b/tests/phpunit/includes/site/SiteExporterTest.php index 3a41b5fc69..279bbb21c5 100644 --- a/tests/phpunit/includes/site/SiteExporterTest.php +++ b/tests/phpunit/includes/site/SiteExporterTest.php @@ -29,7 +29,7 @@ * * @author Daniel Kinzler */ -class SiteExporterTest extends PHPUnit_Framework_TestCase { +class SiteExporterTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/site/SiteImporterTest.php b/tests/phpunit/includes/site/SiteImporterTest.php index 373dcc2912..7c949ac7d0 100644 --- a/tests/phpunit/includes/site/SiteImporterTest.php +++ b/tests/phpunit/includes/site/SiteImporterTest.php @@ -29,7 +29,7 @@ * * @author Daniel Kinzler */ -class SiteImporterTest extends PHPUnit_Framework_TestCase { +class SiteImporterTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php b/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php index c411ed8799..8c84ce57c0 100644 --- a/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php +++ b/tests/phpunit/includes/site/SitesCacheFileBuilderTest.php @@ -27,7 +27,7 @@ * * @author Katie Filbert < aude.wiki@gmail.com > */ -class SitesCacheFileBuilderTest extends PHPUnit_Framework_TestCase { +class SitesCacheFileBuilderTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/sparql/SparqlClientTest.php b/tests/phpunit/includes/sparql/SparqlClientTest.php index e07e425930..cfaf49b5cd 100644 --- a/tests/phpunit/includes/sparql/SparqlClientTest.php +++ b/tests/phpunit/includes/sparql/SparqlClientTest.php @@ -4,12 +4,11 @@ namespace MediaWiki\Sparql; use Http; use MediaWiki\Http\HttpRequestFactory; use MWHttpRequest; -use PHPUnit_Framework_TestCase; /** * @covers \MediaWiki\Sparql\SparqlClient */ -class SparqlClientTest extends PHPUnit_Framework_TestCase { +class SparqlClientTest extends \PHPUnit\Framework\TestCase { private function getRequestFactory( $request ) { $requestFactory = $this->getMock( HttpRequestFactory::class ); diff --git a/tests/phpunit/includes/utils/AvroValidatorTest.php b/tests/phpunit/includes/utils/AvroValidatorTest.php index caeeaabeae..12d2574e69 100644 --- a/tests/phpunit/includes/utils/AvroValidatorTest.php +++ b/tests/phpunit/includes/utils/AvroValidatorTest.php @@ -12,7 +12,7 @@ /** * @covers AvroValidator */ -class AvroValidatorTest extends PHPUnit_Framework_TestCase { +class AvroValidatorTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/utils/ClassCollectorTest.php b/tests/phpunit/includes/utils/ClassCollectorTest.php index 796d459a67..9e5163f9ce 100644 --- a/tests/phpunit/includes/utils/ClassCollectorTest.php +++ b/tests/phpunit/includes/utils/ClassCollectorTest.php @@ -3,7 +3,7 @@ /** * @covers ClassCollector */ -class ClassCollectorTest extends PHPUnit_Framework_TestCase { +class ClassCollectorTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/utils/FileContentsHasherTest.php b/tests/phpunit/includes/utils/FileContentsHasherTest.php index b3885bdd25..316d9f429a 100644 --- a/tests/phpunit/includes/utils/FileContentsHasherTest.php +++ b/tests/phpunit/includes/utils/FileContentsHasherTest.php @@ -3,7 +3,7 @@ /** * @covers FileContentsHasherTest */ -class FileContentsHasherTest extends PHPUnit_Framework_TestCase { +class FileContentsHasherTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/utils/MWCryptHashTest.php b/tests/phpunit/includes/utils/MWCryptHashTest.php index 66c8d00e3a..94705bff48 100644 --- a/tests/phpunit/includes/utils/MWCryptHashTest.php +++ b/tests/phpunit/includes/utils/MWCryptHashTest.php @@ -5,7 +5,7 @@ * * @covers MWCryptHash */ -class MWCryptHashTest extends PHPUnit_Framework_TestCase { +class MWCryptHashTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/includes/utils/MWRestrictionsTest.php b/tests/phpunit/includes/utils/MWRestrictionsTest.php index c411e53319..abdfbb1459 100644 --- a/tests/phpunit/includes/utils/MWRestrictionsTest.php +++ b/tests/phpunit/includes/utils/MWRestrictionsTest.php @@ -1,5 +1,5 @@ will( $this->returnCallback( function ( $a, $conj ) { $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR '; - return join( $sqlConj, array_map( function ( $s ) { + return implode( $sqlConj, array_map( function ( $s ) { return '(' . $s . ')'; }, $a ) ); @@ -1572,7 +1572,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase { ) ->will( $this->returnCallback( function ( $a, $conj ) { $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR '; - return join( $sqlConj, array_map( function ( $s ) { + return implode( $sqlConj, array_map( function ( $s ) { return '(' . $s . ')'; }, $a ) ); diff --git a/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php b/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php index 52e653cb4c..948517067c 100644 --- a/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php +++ b/tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php @@ -443,7 +443,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { ) ->will( $this->returnCallback( function ( $a, $conj ) { $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR '; - return join( $sqlConj, array_map( function ( $s ) { + return implode( $sqlConj, array_map( function ( $s ) { return '(' . $s . ')'; }, $a ) ); @@ -540,7 +540,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { ) ->will( $this->returnCallback( function ( $a, $conj ) { $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR '; - return join( $sqlConj, array_map( function ( $s ) { + return implode( $sqlConj, array_map( function ( $s ) { return '(' . $s . ')'; }, $a ) ); diff --git a/tests/phpunit/languages/LanguageCodeTest.php b/tests/phpunit/languages/LanguageCodeTest.php index d77291a042..544a063566 100644 --- a/tests/phpunit/languages/LanguageCodeTest.php +++ b/tests/phpunit/languages/LanguageCodeTest.php @@ -6,7 +6,7 @@ * * @author Thiemo Kreuz */ -class LanguageCodeTest extends PHPUnit_Framework_TestCase { +class LanguageCodeTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php index 5cb560299f..050ed83bed 100644 --- a/tests/phpunit/languages/LanguageTest.php +++ b/tests/phpunit/languages/LanguageTest.php @@ -209,70 +209,104 @@ class LanguageTest extends LanguageClassesTestCase { } /** - * @covers Language::truncate + * @covers Language::truncateForDatabase + * @covers Language::truncateInternal */ - public function testTruncate() { + public function testTruncateForDatabase() { $this->assertEquals( "XXX", - $this->getLang()->truncate( "1234567890", 0, 'XXX' ), + $this->getLang()->truncateForDatabase( "1234567890", 0, 'XXX' ), 'truncate prefix, len 0, small ellipsis' ); $this->assertEquals( "12345XXX", - $this->getLang()->truncate( "1234567890", 8, 'XXX' ), + $this->getLang()->truncateForDatabase( "1234567890", 8, 'XXX' ), 'truncate prefix, small ellipsis' ); $this->assertEquals( "123456789", - $this->getLang()->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ), + $this->getLang()->truncateForDatabase( "123456789", 5, 'XXXXXXXXXXXXXXX' ), 'truncate prefix, large ellipsis' ); $this->assertEquals( "XXX67890", - $this->getLang()->truncate( "1234567890", -8, 'XXX' ), + $this->getLang()->truncateForDatabase( "1234567890", -8, 'XXX' ), 'truncate suffix, small ellipsis' ); $this->assertEquals( "123456789", - $this->getLang()->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ), + $this->getLang()->truncateForDatabase( "123456789", -5, 'XXXXXXXXXXXXXXX' ), 'truncate suffix, large ellipsis' ); $this->assertEquals( "123XXX", - $this->getLang()->truncate( "123 ", 9, 'XXX' ), + $this->getLang()->truncateForDatabase( "123 ", 9, 'XXX' ), 'truncate prefix, with spaces' ); $this->assertEquals( "12345XXX", - $this->getLang()->truncate( "12345 8", 11, 'XXX' ), + $this->getLang()->truncateForDatabase( "12345 8", 11, 'XXX' ), 'truncate prefix, with spaces and non-space ending' ); $this->assertEquals( "XXX234", - $this->getLang()->truncate( "1 234", -8, 'XXX' ), + $this->getLang()->truncateForDatabase( "1 234", -8, 'XXX' ), 'truncate suffix, with spaces' ); $this->assertEquals( "12345XXX", - $this->getLang()->truncate( "1234567890", 5, 'XXX', false ), + $this->getLang()->truncateForDatabase( "1234567890", 5, 'XXX', false ), 'truncate without adjustment' ); $this->assertEquals( "泰乐菌...", - $this->getLang()->truncate( "泰乐菌素123456789", 11, '...', false ), + $this->getLang()->truncateForDatabase( "泰乐菌素123456789", 11, '...', false ), 'truncate does not chop Unicode characters in half' ); $this->assertEquals( "\n泰乐菌...", - $this->getLang()->truncate( "\n泰乐菌素123456789", 12, '...', false ), + $this->getLang()->truncateForDatabase( "\n泰乐菌素123456789", 12, '...', false ), 'truncate does not chop Unicode characters in half if there is a preceding newline' ); } + /** + * @dataProvider provideTruncateData + * @covers Language::truncateForVisual + * @covers Language::truncateInternal + */ + public function testTruncateForVisual( + $expected, $string, $length, $ellipsis = '...', $adjustLength = true + ) { + $this->assertEquals( + $expected, + $this->getLang()->truncateForVisual( $string, $length, $ellipsis, $adjustLength ) + ); + } + + /** + * @return array Format is ($expected, $string, $length, $ellipsis, $adjustLength) + */ + public static function provideTruncateData() { + return [ + [ "XXX", "тестирам да ли ради", 0, "XXX" ], + [ "testnXXX", "testni scenarij", 8, "XXX" ], + [ "حالة اختبار", "حالة اختبار", 5, "XXXXXXXXXXXXXXX" ], + [ "XXXедент", "прецедент", -8, "XXX" ], + [ "XXപിൾ", "ആപ്പിൾ", -5, "XX" ], + [ "神秘XXX", "神秘 ", 9, "XXX" ], + [ "ΔημιουργXXX", "Δημιουργία Σύμπαντος", 11, "XXX" ], + [ "XXXの家です", "地球は私たちの唯 の家です", -8, "XXX" ], + [ "زندگیXXX", "زندگی زیباست", 6, "XXX", false ], + [ "ცხოვრება...", "ცხოვრება არის საოცარი", 8, "...", false ], + [ "\nທ່ານ...", "\nທ່ານບໍ່ຮູ້ຫນັງສື", 5, "...", false ], + ]; + } + /** * @dataProvider provideHTMLTruncateData * @covers Language::truncateHTML diff --git a/tests/phpunit/maintenance/BenchmarkerTest.php b/tests/phpunit/maintenance/BenchmarkerTest.php index 0b8d0d98e4..c15d789d0e 100644 --- a/tests/phpunit/maintenance/BenchmarkerTest.php +++ b/tests/phpunit/maintenance/BenchmarkerTest.php @@ -4,13 +4,12 @@ namespace MediaWiki\Tests\Maintenance; use Benchmarker; use MediaWikiCoversValidator; -use PHPUnit_Framework_TestCase; use Wikimedia\TestingAccessWrapper; /** * @covers Benchmarker */ -class BenchmarkerTest extends PHPUnit_Framework_TestCase { +class BenchmarkerTest extends \PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php index 14dfb4448b..97e0c88fd8 100644 --- a/tests/phpunit/maintenance/fetchTextTest.php +++ b/tests/phpunit/maintenance/fetchTextTest.php @@ -215,7 +215,7 @@ class FetchTextTest extends MediaWikiTestCase { function testExistingSeveral() { $this->assertFilter( - join( "\n", [ + implode( "\n", [ self::$textId1, self::$textId5, self::$textId3, diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php index 7203777096..fa249b2244 100755 --- a/tests/phpunit/phpunit.php +++ b/tests/phpunit/phpunit.php @@ -21,6 +21,7 @@ class PHPUnitMaintClass extends Maintenance { 'use-bagostuff' => false, 'use-jobqueue' => false, 'use-normal-tables' => false, + 'mwdebug' => false, 'reuse-db' => false, 'wiki' => false, 'profiler' => false, @@ -112,7 +113,7 @@ class PHPUnitMaintClass extends Maintenance { } } - if ( !class_exists( 'PHPUnit_Framework_TestCase' ) ) { + if ( !class_exists( 'PHPUnit\\Framework\\TestCase' ) ) { echo "PHPUnit not found. Please install it and other dev dependencies by running `composer install` in MediaWiki root directory.\n"; exit( 1 ); diff --git a/tests/phpunit/structure/ApiStructureTest.php b/tests/phpunit/structure/ApiStructureTest.php index 6d8655137f..d0126f2cf9 100644 --- a/tests/phpunit/structure/ApiStructureTest.php +++ b/tests/phpunit/structure/ApiStructureTest.php @@ -20,11 +20,9 @@ class ApiStructureTest extends MediaWikiTestCase { private static $testGlobals = [ [ 'MiserMode' => false, - 'AllowCategorizedRecentChanges' => false, ], [ 'MiserMode' => true, - 'AllowCategorizedRecentChanges' => true, ], ]; diff --git a/tests/phpunit/structure/AvailableRightsTest.php b/tests/phpunit/structure/AvailableRightsTest.php index 4ab0c2c9af..6c2ff024e1 100644 --- a/tests/phpunit/structure/AvailableRightsTest.php +++ b/tests/phpunit/structure/AvailableRightsTest.php @@ -6,7 +6,7 @@ * * @author Marius Hoch < hoo@online.de > */ -class AvailableRightsTest extends PHPUnit_Framework_TestCase { +class AvailableRightsTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/structure/ExtensionJsonValidationTest.php b/tests/phpunit/structure/ExtensionJsonValidationTest.php index 0cf4659471..60c97ccfac 100644 --- a/tests/phpunit/structure/ExtensionJsonValidationTest.php +++ b/tests/phpunit/structure/ExtensionJsonValidationTest.php @@ -20,7 +20,7 @@ * Validates all loaded extensions and skins using the ExtensionRegistry * against the extension.json schema in the docs/ folder. */ -class ExtensionJsonValidationTest extends PHPUnit_Framework_TestCase { +class ExtensionJsonValidationTest extends PHPUnit\Framework\TestCase { use MediaWikiCoversValidator; diff --git a/tests/phpunit/structure/StructureTest.php b/tests/phpunit/structure/StructureTest.php index 9016cb7b67..35434634cf 100644 --- a/tests/phpunit/structure/StructureTest.php +++ b/tests/phpunit/structure/StructureTest.php @@ -25,6 +25,7 @@ class StructureTest extends MediaWikiTestCase { 'MediaWikiTestCase', 'ResourceLoaderTestCase', 'PHPUnit_Framework_TestCase', + '\\?PHPUnit\\Framework\\TestCase', 'DumpTestCase', ] ); $testClassRegex = "^class .* extends ($testClassRegex)"; diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php index 8390ab3c58..3372bf01fc 100644 --- a/tests/qunit/QUnitTestResources.php +++ b/tests/qunit/QUnitTestResources.php @@ -45,7 +45,6 @@ return [ 'scripts' => [ 'tests/qunit/suites/resources/startup.test.js', 'tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js', - 'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js', 'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js', 'tests/qunit/suites/resources/jquery/jquery.color.test.js', 'tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js', @@ -65,6 +64,8 @@ return [ 'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js', + 'tests/qunit/suites/resources/mediawiki/mediawiki.String.byteLength.test.js', + 'tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js', 'tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js', @@ -102,7 +103,6 @@ return [ ], 'dependencies' => [ 'jquery.accessKeyLabel', - 'jquery.byteLength', 'jquery.byteLimit', 'jquery.color', 'jquery.colorUtil', @@ -125,6 +125,7 @@ return [ 'mediawiki.jqueryMsg', 'mediawiki.messagePoster', 'mediawiki.RegExp', + 'mediawiki.String', 'mediawiki.storage', 'mediawiki.Title', 'mediawiki.toc', diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js deleted file mode 100644 index 558e64161d..0000000000 --- a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js +++ /dev/null @@ -1,37 +0,0 @@ -( function ( $ ) { - QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() ); - - QUnit.test( 'Simple text', function ( assert ) { - var azLc = 'abcdefghijklmnopqrstuvwxyz', - azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', - num = '0123456789', - x = '*', - space = ' '; - - assert.equal( $.byteLength( azLc ), 26, 'Lowercase a-z' ); - assert.equal( $.byteLength( azUc ), 26, 'Uppercase A-Z' ); - assert.equal( $.byteLength( num ), 10, 'Numbers 0-9' ); - assert.equal( $.byteLength( x ), 1, 'An asterisk' ); - assert.equal( $.byteLength( space ), 3, '3 spaces' ); - - } ); - - QUnit.test( 'Special text', function ( assert ) { - // https://en.wikipedia.org/wiki/UTF-8 - var u0024 = '$', - // Cent symbol - u00A2 = '\u00A2', - // Euro symbol - u20AC = '\u20AC', - // Character \U00024B62 (Han script) can't be represented in javascript as a single - // code point, instead it is composed as a surrogate pair of two separate code units. - // http://codepoints.net/U+24B62 - // http://www.fileformat.info/info/unicode/char/24B62/index.htm - u024B62 = '\uD852\uDF62'; - - assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024' ); - assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2' ); - assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC' ); - assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62 (surrogate pair: \\uD852\\uDF62)' ); - } ); -}( jQuery ) ); diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js index 8555a7e4d8..d3233da475 100644 --- a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js @@ -1,5 +1,5 @@ ( function ( $, mw ) { - var simpleSample, U_20AC, mbSample; + var simpleSample, U_20AC, poop, mbSample; QUnit.module( 'jquery.byteLimit', QUnit.newMwEnvironment() ); @@ -9,6 +9,9 @@ // 3 bytes (euro-symbol) U_20AC = '\u20AC'; + // Outside of the BMP (pile of poo emoji) + poop = '\uD83D\uDCA9'; // "💩" + // Multi-byte sample (22 chars, 26 bytes) mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC; @@ -109,6 +112,14 @@ expected: '1234567890' + U_20AC + '1' } ); + byteLimitTest( { + description: 'Limit using a custom value (multibyte, outside BMP)', + $input: $( '' ).attr( 'type', 'text' ) + .byteLimit( 3 ), + sample: poop, + expected: '' + } ); + byteLimitTest( { description: 'Limit using a custom value (multibyte) overlapping a byte', $input: $( '' ).attr( 'type', 'text' ) @@ -176,8 +187,6 @@ return 'prefix' + text; } ), sample: simpleSample, - hasLimit: true, - limit: 6, // 'prefix' length expected: '' } ); @@ -245,4 +254,33 @@ assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 1), not the end' ); } ); + + QUnit.test( 'Do not cut up false matching substrings in emoji insertions', function ( assert ) { + var $el, + oldVal = '\uD83D\uDCA9\uD83D\uDCA9', // "💩💩" + newVal = '\uD83D\uDCA9\uD83D\uDCB9\uD83E\uDCA9\uD83D\uDCA9', // "💩💹🢩💩" + expected = '\uD83D\uDCA9\uD83D\uDCB9\uD83D\uDCA9'; // "💩💹💩" + + // Possible bad results: + // * With no surrogate support: + // '\uD83D\uDCA9\uD83D\uDCB9\uD83E\uDCA9' "💩💹🢩" + // * With correct trimming but bad detection of inserted text: + // '\uD83D\uDCA9\uD83D\uDCB9\uDCA9' "💩💹�" + + $el = $( '' ).attr( 'type', 'text' ) + .appendTo( '#qunit-fixture' ) + .byteLimit( 12 ) + .val( oldVal ).trigger( 'change' ) + .val( newVal ).trigger( 'change' ); + + assert.strictEqual( $el.val(), expected, 'Pasted emoji correctly trimmed at the end' ); + } ); + + byteLimitTest( { + description: 'Unpaired surrogates do not crash', + $input: $( '' ).attr( 'type', 'text' ).byteLimit( 4 ), + sample: '\uD800\uD800\uDFFF', + expected: '\uD800' + } ); + }( jQuery, mediaWiki ) ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.String.byteLength.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.String.byteLength.test.js new file mode 100644 index 0000000000..ae3ebbf742 --- /dev/null +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.String.byteLength.test.js @@ -0,0 +1,39 @@ +( function () { + var byteLength = require( 'mediawiki.String' ).byteLength; + + QUnit.module( 'mediawiki.String.byteLength', QUnit.newMwEnvironment() ); + + QUnit.test( 'Simple text', function ( assert ) { + var azLc = 'abcdefghijklmnopqrstuvwxyz', + azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + num = '0123456789', + x = '*', + space = ' '; + + assert.equal( byteLength( azLc ), 26, 'Lowercase a-z' ); + assert.equal( byteLength( azUc ), 26, 'Uppercase A-Z' ); + assert.equal( byteLength( num ), 10, 'Numbers 0-9' ); + assert.equal( byteLength( x ), 1, 'An asterisk' ); + assert.equal( byteLength( space ), 3, '3 spaces' ); + + } ); + + QUnit.test( 'Special text', function ( assert ) { + // https://en.wikipedia.org/wiki/UTF-8 + var u0024 = '$', + // Cent symbol + u00A2 = '\u00A2', + // Euro symbol + u20AC = '\u20AC', + // Character \U00024B62 (Han script) can't be represented in javascript as a single + // code point, instead it is composed as a surrogate pair of two separate code units. + // http://codepoints.net/U+24B62 + // http://www.fileformat.info/info/unicode/char/24B62/index.htm + u024B62 = '\uD852\uDF62'; + + assert.strictEqual( byteLength( u0024 ), 1, 'U+0024' ); + assert.strictEqual( byteLength( u00A2 ), 2, 'U+00A2' ); + assert.strictEqual( byteLength( u20AC ), 3, 'U+20AC' ); + assert.strictEqual( byteLength( u024B62 ), 4, 'U+024B62 (surrogate pair: \\uD852\\uDF62)' ); + } ); +}() ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js new file mode 100644 index 0000000000..e2eea94e84 --- /dev/null +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js @@ -0,0 +1,150 @@ +( function ( $, mw ) { + var simpleSample, U_20AC, poop, mbSample, + trimByteLength = require( 'mediawiki.String' ).trimByteLength; + + QUnit.module( 'mediawiki.String.trimByteLength', QUnit.newMwEnvironment() ); + + // Simple sample (20 chars, 20 bytes) + simpleSample = '12345678901234567890'; + + // 3 bytes (euro-symbol) + U_20AC = '\u20AC'; + + // Outside of the BMP (pile of poo emoji) + poop = '\uD83D\uDCA9'; // "💩" + + // Multi-byte sample (22 chars, 26 bytes) + mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC; + + /** + * Test factory for mw.String#trimByteLength + * + * @param {Object} options + * @param {string} options.description Test name + * @param {string} options.sample Sequence of characters to trim + * @param {string} [options.initial] Previous value of the sequence of characters, if any + * @param {Number} options.limit Length to trim to + * @param {Function} [options.fn] Filter function + * @param {string} options.expected Expected final value + */ + function byteLimitTest( options ) { + var opt = $.extend( { + description: '', + sample: '', + initial: '', + limit: 0, + fn: function ( a ) { return a; }, + expected: '' + }, options ); + + QUnit.test( opt.description, function ( assert ) { + var res = trimByteLength( opt.initial, opt.sample, opt.limit, opt.fn ); + + assert.equal( + res.newVal, + opt.expected, + 'New value matches the expected string' + ); + } ); + } + + byteLimitTest( { + description: 'Limit using the maxlength attribute', + limit: 10, + sample: simpleSample, + expected: '1234567890' + } ); + + byteLimitTest( { + description: 'Limit using a custom value (multibyte)', + limit: 14, + sample: mbSample, + expected: '1234567890' + U_20AC + '1' + } ); + + byteLimitTest( { + description: 'Limit using a custom value (multibyte, outside BMP)', + limit: 3, + sample: poop, + expected: '' + } ); + + byteLimitTest( { + description: 'Limit using a custom value (multibyte) overlapping a byte', + limit: 12, + sample: mbSample, + expected: '1234567890' + } ); + + byteLimitTest( { + description: 'Pass the limit and a callback as input filter', + limit: 6, + fn: function ( val ) { + var title = mw.Title.newFromText( String( val ) ); + // Return without namespace prefix + return title ? title.getMain() : ''; + }, + sample: 'User:Sample', + expected: 'User:Sample' + } ); + + byteLimitTest( { + description: 'Pass the limit and a callback as input filter', + limit: 6, + fn: function ( val ) { + var title = mw.Title.newFromText( String( val ) ); + // Return without namespace prefix + return title ? title.getMain() : ''; + }, + sample: 'User:Example', + // The callback alters the value to be used to calculeate + // the length. The altered value is "Exampl" which has + // a length of 6, the "e" would exceed the limit. + expected: 'User:Exampl' + } ); + + byteLimitTest( { + description: 'Input filter that increases the length', + limit: 10, + fn: function ( text ) { + return 'prefix' + text; + }, + sample: simpleSample, + // Prefix adds 6 characters, limit is reached after 4 + expected: '1234' + } ); + + byteLimitTest( { + description: 'Trim from insertion when limit exceeded', + limit: 3, + initial: 'abc', + sample: 'zabc', + // Trim from the insertion point (at 0), not the end + expected: 'abc' + } ); + + byteLimitTest( { + description: 'Trim from insertion when limit exceeded', + limit: 3, + initial: 'abc', + sample: 'azbc', + // Trim from the insertion point (at 1), not the end + expected: 'abc' + } ); + + byteLimitTest( { + description: 'Do not cut up false matching substrings in emoji insertions', + limit: 12, + initial: '\uD83D\uDCA9\uD83D\uDCA9', // "💩💩" + sample: '\uD83D\uDCA9\uD83D\uDCB9\uD83E\uDCA9\uD83D\uDCA9', // "💩💹🢩💩" + expected: '\uD83D\uDCA9\uD83D\uDCB9\uD83D\uDCA9' // "💩💹💩" + } ); + + byteLimitTest( { + description: 'Unpaired surrogates do not crash', + limit: 4, + sample: '\uD800\uD800\uDFFF', + expected: '\uD800' + } ); + +}( jQuery, mediaWiki ) ); diff --git a/tests/qunit/suites/resources/startup.test.js b/tests/qunit/suites/resources/startup.test.js index 0866b9ecee..6a704b5af8 100644 --- a/tests/qunit/suites/resources/startup.test.js +++ b/tests/qunit/suites/resources/startup.test.js @@ -21,11 +21,8 @@ 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 OPR/16.0.1196.62', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 OPR/23.0.1522.75', - // Internet Explorer 10+ - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', + // Internet Explorer 11 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko', - // IE Mobile - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)', // Edge 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246', // Edge Mobile @@ -107,6 +104,10 @@ blacklisted: [ /* Grade C */ + // Internet Explorer 10 + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', + // IE Mobile 10 + 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)', // PlayStation 'Mozilla/5.0 (PLAYSTATION 3; 1.10)', 'Mozilla/5.0 (PLAYSTATION 3; 3.55)', diff --git a/tests/selenium/README.md b/tests/selenium/README.md index 16283772a0..2dbf27140a 100644 --- a/tests/selenium/README.md +++ b/tests/selenium/README.md @@ -37,14 +37,14 @@ To run only one test (name contains string 'preferences'): The runner reads the config file `wdio.conf.js` and runs the spec listed in `page.js`. -The defaults in the configuration files aim are targetting a MediaWiki-Vagrant -installation on installation on http://127.0.0.1:8080 with a user Admin and -password 'vagrant'. Those settings can be overriden using environment +The defaults in the configuration files aim are targeting a MediaWiki-Vagrant +installation on http://127.0.0.1:8080 with a user Admin and +password 'vagrant'. Those settings can be overridden using environment variables: `MW_SERVER`: to be set to the value of your $wgServer -`MW_SCRIPT_PATH`: ditto with $wgScriptPath -`MEDIAWIKI_USER`: username of an account that can create users on the wiki. +`MW_SCRIPT_PATH`: ditto with $wgScriptPath +`MEDIAWIKI_USER`: username of an account that can create users on the wiki `MEDIAWIKI_PASSWORD`: password for above user Example: