From: jenkins-bot Date: Fri, 1 Apr 2016 11:47:19 +0000 (+0000) Subject: Merge "UserrightsPage::makeGroupNameListForLog() was removed" X-Git-Tag: 1.31.0-rc.0~7461 X-Git-Url: http://git.cyclocoop.org//%27%40script%40/%27?a=commitdiff_plain;h=6fa889309d6dde3bcfd1c5f939e317abf0f3e790;hp=018e13a6c9dab199ed9112fef2a569bab665df26;p=lhc%2Fweb%2Fwiklou.git Merge "UserrightsPage::makeGroupNameListForLog() was removed" --- diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27 index 8a0ab11d0f..e8924ef0ee 100644 --- a/RELEASE-NOTES-1.27 +++ b/RELEASE-NOTES-1.27 @@ -104,6 +104,9 @@ HHVM 3.1. * $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26). Extensions, skins, gadgets and scripts that use the mediawiki.util module must express a dependency on it. +* $wgIncludeLegacyJavaScript, deprecated in MediaWiki 1.26, now defaults false. + Extensions, skins, gadgets and scripts that need the mediawiki.legacy.wikibits + module should express a dependency on it. === New features in 1.27 === * $wgDataCenterUpdateStickTTL was also added. This decides how long a user @@ -172,6 +175,12 @@ HHVM 3.1. be a good idea, but will log out all current sessions. * $wgEventRelayerConfig was added, for managing PubSub event relay configuration, specifically for reliable CDN url purges. +* Requests have unique IDs, equal to the UNIQUE_ID environment variable (when + MediaWiki is behind Apache+mod_unique_id or something similar) or a randomly- + generated 24-character string. This request ID is used to annotate log records + and error messages. It is available client-side via mw.config.get( 'wgRequestId' ). + The request ID supplants exception IDs. Accordingly, MWExceptionHandler::getLogId() + is deprecated. === External library changes in 1.27 === diff --git a/autoload.php b/autoload.php index e74df0aa1f..a4c09e0390 100644 --- a/autoload.php +++ b/autoload.php @@ -7,11 +7,11 @@ $wgAutoloadLocalClasses = [ 'APCBagOStuff' => __DIR__ . '/includes/libs/objectcache/APCBagOStuff.php', 'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php', 'Action' => __DIR__ . '/includes/actions/Action.php', - 'ActiveUsersPager' => __DIR__ . '/includes/specials/SpecialActiveusers.php', + 'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php', 'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php', 'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php', 'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php', - 'AllMessagesTablePager' => __DIR__ . '/includes/specials/SpecialAllMessages.php', + 'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php', 'AllTrans' => __DIR__ . '/maintenance/language/alltrans.php', 'AlphabeticPager' => __DIR__ . '/includes/pager/AlphabeticPager.php', 'AlterSharedConstraints' => __DIR__ . '/maintenance/oracle/alterSharedConstraints.php', @@ -180,7 +180,7 @@ $wgAutoloadLocalClasses = [ 'BitmapMetadataHandler' => __DIR__ . '/includes/media/BitmapMetadataHandler.php', 'Blob' => __DIR__ . '/includes/db/DatabaseUtility.php', 'Block' => __DIR__ . '/includes/Block.php', - 'BlockListPager' => __DIR__ . '/includes/specials/SpecialBlockList.php', + 'BlockListPager' => __DIR__ . '/includes/specials/pagers/BlockListPager.php', 'BlockLogFormatter' => __DIR__ . '/includes/logging/BlockLogFormatter.php', 'BmpHandler' => __DIR__ . '/includes/media/BMP.php', 'BotPassword' => __DIR__ . '/includes/user/BotPassword.php', @@ -200,7 +200,7 @@ $wgAutoloadLocalClasses = [ 'CategoryMembershipChange' => __DIR__ . '/includes/changes/CategoryMembershipChange.php', 'CategoryMembershipChangeJob' => __DIR__ . '/includes/jobqueue/jobs/CategoryMembershipChangeJob.php', 'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php', - 'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php', + 'CategoryPager' => __DIR__ . '/includes/specials/pagers/CategoryPager.php', 'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php', 'CdbException' => __DIR__ . '/includes/compat/CdbCompat.php', 'CdbReader' => __DIR__ . '/includes/compat/CdbCompat.php', @@ -263,7 +263,7 @@ $wgAutoloadLocalClasses = [ 'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php', 'ContentModelLogFormatter' => __DIR__ . '/includes/logging/ContentModelLogFormatter.php', 'ContextSource' => __DIR__ . '/includes/context/ContextSource.php', - 'ContribsPager' => __DIR__ . '/includes/specials/SpecialContributions.php', + 'ContribsPager' => __DIR__ . '/includes/specials/pagers/ContribsPager.php', 'ConvertExtensionToRegistration' => __DIR__ . '/maintenance/convertExtensionToRegistration.php', 'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php', 'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php', @@ -332,7 +332,7 @@ $wgAutoloadLocalClasses = [ 'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php', 'DeleteRevision' => __DIR__ . '/maintenance/deleteRevision.php', 'DeleteSelfExternals' => __DIR__ . '/maintenance/deleteSelfExternals.php', - 'DeletedContribsPager' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php', + 'DeletedContribsPager' => __DIR__ . '/includes/specials/pagers/DeletedContribsPager.php', 'DeletedContributionsPage' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php', 'DependencyWrapper' => __DIR__ . '/includes/cache/CacheDependency.php', 'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php', @@ -573,7 +573,7 @@ $wgAutoloadLocalClasses = [ 'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php', 'ImageHistoryList' => __DIR__ . '/includes/page/ImageHistoryList.php', 'ImageHistoryPseudoPager' => __DIR__ . '/includes/page/ImageHistoryPseudoPager.php', - 'ImageListPager' => __DIR__ . '/includes/specials/SpecialListfiles.php', + 'ImageListPager' => __DIR__ . '/includes/specials/pagers/ImageListPager.php', 'ImagePage' => __DIR__ . '/includes/page/ImagePage.php', 'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php', 'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php', @@ -634,11 +634,11 @@ $wgAutoloadLocalClasses = [ 'LBFactoryMulti' => __DIR__ . '/includes/db/loadbalancer/LBFactoryMulti.php', 'LBFactorySimple' => __DIR__ . '/includes/db/loadbalancer/LBFactorySimple.php', 'LBFactorySingle' => __DIR__ . '/includes/db/loadbalancer/LBFactorySingle.php', - 'LCStore' => __DIR__ . '/includes/cache/LocalisationCache.php', - 'LCStoreCDB' => __DIR__ . '/includes/cache/LocalisationCache.php', - 'LCStoreDB' => __DIR__ . '/includes/cache/LocalisationCache.php', - 'LCStoreNull' => __DIR__ . '/includes/cache/LocalisationCache.php', - 'LCStoreStaticArray' => __DIR__ . '/includes/cache/LCStoreStaticArray.php', + 'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php', + 'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php', + 'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php', + 'LCStoreNull' => __DIR__ . '/includes/cache/localisation/LCStoreNull.php', + 'LCStoreStaticArray' => __DIR__ . '/includes/cache/localisation/LCStoreStaticArray.php', 'LangMemUsage' => __DIR__ . '/maintenance/language/langmemusage.php', 'Language' => __DIR__ . '/languages/Language.php', 'LanguageAr' => __DIR__ . '/languages/classes/LanguageAr.php', @@ -718,8 +718,9 @@ $wgAutoloadLocalClasses = [ 'LocalIdLookup' => __DIR__ . '/includes/user/LocalIdLookup.php', 'LocalRepo' => __DIR__ . '/includes/filerepo/LocalRepo.php', 'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php', - 'LocalisationCache' => __DIR__ . '/includes/cache/LocalisationCache.php', - 'LocalisationCacheBulkLoad' => __DIR__ . '/includes/cache/LocalisationCache.php', + 'LocalisationCache' => __DIR__ . '/includes/cache/localisation/LocalisationCache.php', + 'LocalisationCacheBulkLoad' => __DIR__ . + '/includes/cache/localisation/LocalisationCacheBulkLoad.php', 'LockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php', 'LockManagerGroup' => __DIR__ . '/includes/filebackend/lockmanager/LockManagerGroup.php', 'LogEntry' => __DIR__ . '/includes/logging/LogEntry.php', @@ -833,7 +834,7 @@ $wgAutoloadLocalClasses = [ 'MemoizedCallable' => __DIR__ . '/includes/libs/MemoizedCallable.php', 'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php', 'MergeHistory' => __DIR__ . '/includes/MergeHistory.php', - 'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php', + 'MergeHistoryPager' => __DIR__ . '/includes/specials/pagers/MergeHistoryPager.php', 'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php', 'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php', 'MergeableUpdate' => __DIR__ . '/includes/deferred/MergeableUpdate.php', @@ -880,8 +881,8 @@ $wgAutoloadLocalClasses = [ 'NamespaceAwareForeignTitleFactory' => __DIR__ . '/includes/title/NamespaceAwareForeignTitleFactory.php', 'NamespaceConflictChecker' => __DIR__ . '/maintenance/namespaceDupes.php', 'NamespaceImportTitleFactory' => __DIR__ . '/includes/title/NamespaceImportTitleFactory.php', - 'NewFilesPager' => __DIR__ . '/includes/specials/SpecialNewimages.php', - 'NewPagesPager' => __DIR__ . '/includes/specials/SpecialNewpages.php', + 'NewFilesPager' => __DIR__ . '/includes/specials/pagers/NewFilesPager.php', + 'NewPagesPager' => __DIR__ . '/includes/specials/pagers/NewPagesPager.php', 'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php', 'NolinesImageGallery' => __DIR__ . '/includes/gallery/NolinesImageGallery.php', 'NotRecursiveIterator' => __DIR__ . '/includes/utils/iterators/NotRecursiveIterator.php', @@ -1006,7 +1007,7 @@ $wgAutoloadLocalClasses = [ 'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php', 'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php', 'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php', - 'ProtectedTitlesPager' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php', + 'ProtectedTitlesPager' => __DIR__ . '/includes/specials/pagers/ProtectedTitlesPager.php', 'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php', 'PruneFileCache' => __DIR__ . '/maintenance/pruneFileCache.php', 'PublishStashedFileJob' => __DIR__ . '/includes/jobqueue/jobs/PublishStashedFileJob.php', @@ -1387,7 +1388,7 @@ $wgAutoloadLocalClasses = [ 'UsercreateTemplate' => __DIR__ . '/includes/templates/Usercreate.php', 'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php', 'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php', - 'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php', + 'UsersPager' => __DIR__ . '/includes/specials/pagers/UsersPager.php', 'UtfNormal' => __DIR__ . '/includes/compat/normal/UtfNormal.php', 'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php', 'VFormHTMLForm' => __DIR__ . '/includes/htmlform/VFormHTMLForm.php', diff --git a/composer.json b/composer.json index 0dc151165e..e0667e2f3c 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "ext-iconv": "*", "liuggio/statsd-php-client": "1.0.18", "mediawiki/at-ease": "1.1.0", - "oojs/oojs-ui": "0.16.3", + "oojs/oojs-ui": "0.16.4", "oyejorge/less.php": "1.7.0.10", "php": ">=5.5.9", "psr/log": "1.0.0", @@ -45,7 +45,7 @@ "monolog/monolog": "~1.17.2", "nikic/php-parser": "1.4.1", "nmred/kafka-php": "0.1.5", - "phpunit/phpunit": "4.8.23", + "phpunit/phpunit": "4.8.24", "wikimedia/avro": "1.7.7" }, "suggest": { diff --git a/docs/extension.schema.json b/docs/extension.schema.json index 4218e8a50a..a743afa080 100644 --- a/docs/extension.schema.json +++ b/docs/extension.schema.json @@ -422,7 +422,7 @@ ] }, "templates": { - "type": "object", + "type": ["object", "array"], "description": "Templates to be loaded for client-side usage" }, "targets": { diff --git a/docs/memcached.txt b/docs/memcached.txt index e914a3a6a7..8c59e72dd6 100644 --- a/docs/memcached.txt +++ b/docs/memcached.txt @@ -122,7 +122,7 @@ Lag time of the databases: key: $wgDBname:lag_times ex: wikidb:lag_times stores: array mapping the database id to its lag time - expriy: 5 secondes + expiry: 5 secondes cleared by: nothing Localisation: @@ -139,7 +139,7 @@ Message Cache: ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status stores: an array where the keys are DB keys and the values are messages set in: wfMessage(), Article::editUpdates() and Title::moveTo() - expriy: $wgMsgCacheExpiry + expiry: $wgMsgCacheExpiry cleared by: nothing Newtalk: @@ -194,14 +194,14 @@ Revision text: ex: wikidb:revisiontext:textid:1012 stores: text of a revision cleared by: nothing - expriry: $wgRevisionCacheExpiry + expiry: $wgRevisionCacheExpiry Sessions: controlled by: $wgSessionsInObjectCache key: $wgBDname:session:$id ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3 stores: $SESSION, useful when using a multi-sever wiki - expriy: one hour + expiry: one hour cleared by: session_destroy() Sidebar: @@ -210,7 +210,7 @@ Sidebar: key: $wgDBname:sidebar ex: wikidb:sidebar stores: the html output of the sidebar - expriy: $wgSidebarCacheExpiry + expiry: $wgSidebarCacheExpiry cleared by: MessageCache::replace() Special:Allpages: diff --git a/includes/Block.php b/includes/Block.php index b8e900d90a..93df004c5f 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -137,7 +137,7 @@ class Block { if ( $options['by'] ) { # Local user - $this->setBlocker( User::newFromID( $options['by'] ) ); + $this->setBlocker( User::newFromId( $options['by'] ) ); } else { # Foreign user $this->setBlocker( $options['byText'] ); @@ -568,7 +568,7 @@ class Block { if ( $this->forcedTargetID ) { $uid = $this->forcedTargetID; } else { - $uid = $this->target instanceof User ? $this->target->getID() : 0; + $uid = $this->target instanceof User ? $this->target->getId() : 0; } $a = [ diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 63d04c95ba..49503594ee 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -3562,7 +3562,7 @@ $wgResourceLoaderMinifierMaxLineLength = 1000; * * @deprecated since 1.26: Always declare dependencies. */ -$wgIncludeLegacyJavaScript = true; +$wgIncludeLegacyJavaScript = false; /** * Whether or not to assign configuration variables to the global window object. @@ -4631,15 +4631,15 @@ $wgAuthenticationTokenVersion = null; * @since 1.27 */ $wgSessionProviders = [ - 'MediaWiki\\Session\\CookieSessionProvider' => [ - 'class' => 'MediaWiki\\Session\\CookieSessionProvider', + MediaWiki\Session\CookieSessionProvider::class => [ + 'class' => MediaWiki\Session\CookieSessionProvider::class, 'args' => [ [ 'priority' => 30, 'callUserSetCookiesHook' => true, ] ], ], - 'MediaWiki\\Session\\BotPasswordSessionProvider' => [ - 'class' => 'MediaWiki\\Session\\BotPasswordSessionProvider', + MediaWiki\Session\BotPasswordSessionProvider::class => [ + 'class' => MediaWiki\Session\BotPasswordSessionProvider::class, 'args' => [ [ 'priority' => 40, ] ], @@ -6210,14 +6210,15 @@ $wgGitBin = '/usr/bin/git'; * %h will be replaced by the short SHA-1 (7 first chars) and %H by the * full SHA-1 of the HEAD revision. * %r will be replaced with a URL-encoded version of $1. + * %R will be replaced with $1 and no URL-encoding * * @since 1.20 */ $wgGitRepositoryViewers = [ 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => - 'https://git.wikimedia.org/tree/%r/%H', + 'https://phabricator.wikimedia.org/r/revision/%R;%H', 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => - 'https://git.wikimedia.org/tree/%r/%H', + 'https://phabricator.wikimedia.org/r/revision/%R;%H', ]; /** @} */ # End of maintenance } @@ -7190,6 +7191,7 @@ $wgLogActionsHandlers = [ 'move/move' => 'MoveLogFormatter', 'move/move_redir' => 'MoveLogFormatter', 'patrol/patrol' => 'PatrolLogFormatter', + 'patrol/autopatrol' => 'PatrolLogFormatter', 'protect/modify' => 'ProtectLogFormatter', 'protect/move_prot' => 'ProtectLogFormatter', 'protect/protect' => 'ProtectLogFormatter', @@ -7207,6 +7209,41 @@ $wgLogActionsHandlers = [ 'upload/upload' => 'UploadLogFormatter', ]; +/** + * List of log types that can be filtered by action types + * + * To each action is associated the list of log_action + * subtypes to search for, usually one, but not necessarily so + * Extensions may append to this array + * @since 1.27 + */ +$wgActionFilteredLogs = [ + 'block' => [ + 'block' => [ 'block' ], + 'reblock' => [ 'reblock' ], + 'unblock' => [ 'unblock' ], + ], + 'delete' => [ + 'delete' => [ 'delete' ], + 'restore' => [ 'restore' ], + 'event' => [ 'event' ], + 'revision' => [ 'revision' ], + ], + 'patrol' => [ + 'patrol' => [ 'patrol' ], + 'autopatrol' => [ 'autopatrol' ], + ], + 'protect' => [ + 'protect' => [ 'protect' ], + 'modify' => [ 'modify' ], + 'unprotect' => [ 'unprotect' ], + ], + 'upload' => [ + 'upload' => [ 'upload' ], + 'overwrite' => [ 'overwrite' ], + ], +]; + /** * Maintain a log of newusers at Log/newusers? */ diff --git a/includes/EditPage.php b/includes/EditPage.php index 520ca57cfe..b3bb07aa37 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1521,7 +1521,7 @@ class EditPage { // is if an extension hook aborted from inside ArticleSave. // Render the status object into $this->hookError // FIXME this sucks, we should just use the Status object throughout - $this->hookError = '
' . $status->getWikitext() . + $this->hookError = '
' . $status->getWikiText() . '
'; return true; } diff --git a/includes/GitInfo.php b/includes/GitInfo.php index 29516ab7cd..de7e8c28e2 100644 --- a/includes/GitInfo.php +++ b/includes/GitInfo.php @@ -257,9 +257,6 @@ class GitInfo { if ( $url === false ) { return false; } - if ( substr( $url, -4 ) !== '.git' ) { - $url .= '.git'; - } foreach ( self::getViewers() as $repo => $viewer ) { $pattern = '#^' . $repo . '$#'; if ( preg_match( $pattern, $url, $matches ) ) { @@ -269,6 +266,7 @@ class GitInfo { '%h' => substr( $headSHA1, 0, 7 ), '%H' => $headSHA1, '%r' => urlencode( $matches[1] ), + '%R' => $matches[1], ]; return strtr( $viewerUrl, $replacements ); } diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php index 87fc0122e7..8673125550 100644 --- a/includes/HistoryBlob.php +++ b/includes/HistoryBlob.php @@ -263,7 +263,7 @@ class HistoryBlobStub { if ( !isset( $parts[1] ) || $parts[1] == '' ) { return false; } - $row->old_text = ExternalStore::fetchFromUrl( $url ); + $row->old_text = ExternalStore::fetchFromURL( $url ); } diff --git a/includes/Html.php b/includes/Html.php index 3b360392d1..890beb0e0d 100644 --- a/includes/Html.php +++ b/includes/Html.php @@ -216,7 +216,7 @@ class Html { if ( in_array( $element, self::$voidElements ) ) { if ( $wgWellFormedXml ) { // Silly XML. - return substr( $start, 0, -1 ) . ' />'; + return substr( $start, 0, -1 ) . '/>'; } return $start; } else { diff --git a/includes/HtmlFormatter.php b/includes/HtmlFormatter.php index 5b8122dcca..5749775749 100644 --- a/includes/HtmlFormatter.php +++ b/includes/HtmlFormatter.php @@ -290,7 +290,7 @@ class HtmlFormatter { } $html = $this->doc->saveHTML(); - $html = $this->fixLibXml( $html ); + $html = $this->fixLibXML( $html ); if ( wfIsWindows() ) { // Cleanup for CRLF misprocessing of unknown origin on Windows. // If this error continues in the future, please track it down in the diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php index f980a93d56..3f42038242 100644 --- a/includes/HttpFunctions.php +++ b/includes/HttpFunctions.php @@ -192,6 +192,26 @@ class Http { $uri ); } + + /** + * Gets the relevant proxy from $wgHTTPProxy/http_proxy (when set). + * + * @return mixed The proxy address or an empty string if not set. + */ + public static function getProxy() { + global $wgHTTPProxy; + + if ( $wgHTTPProxy ) { + return $wgHTTPProxy; + } + + $envHttpProxy = getenv( "http_proxy" ); + if ( $envHttpProxy ) { + return $envHttpProxy; + } + + return ""; + } } /** @@ -368,8 +388,6 @@ class MWHttpRequest { * @return void */ public function proxySetup() { - global $wgHTTPProxy; - // If there is an explicit proxy set and proxies are not disabled, then use it if ( $this->proxy && !$this->noProxy ) { return; @@ -379,10 +397,8 @@ class MWHttpRequest { // local URL and proxies are not disabled if ( Http::isLocalURL( $this->url ) || $this->noProxy ) { $this->proxy = ''; - } elseif ( $wgHTTPProxy ) { - $this->proxy = $wgHTTPProxy; - } elseif ( getenv( "http_proxy" ) ) { - $this->proxy = getenv( "http_proxy" ); + } else { + $this->proxy = Http::getProxy(); } } @@ -991,7 +1007,7 @@ class PhpHttpRequest extends MWHttpRequest { ]; if ( $this->proxy ) { - $options['http']['proxy'] = $this->urlToTCP( $this->proxy ); + $options['http']['proxy'] = $this->urlToTcp( $this->proxy ); $options['http']['request_fulluri'] = true; } diff --git a/includes/Linker.php b/includes/Linker.php index 43df8397cf..4ba3a755a3 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -992,7 +992,7 @@ class Linker { */ public static function makeMediaLinkFile( Title $title, $file, $html = '' ) { if ( $file && $file->exists() ) { - $url = $file->getURL(); + $url = $file->getUrl(); $class = 'internal'; } else { $url = self::getUploadUrl( $title ); diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index 45a13853e4..ad02e68bb5 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -246,13 +246,13 @@ class MediaWiki { } elseif ( !$this->tryNormaliseRedirect( $title ) ) { // Prevent information leak via Special:MyPage et al (T109724) if ( $title->isSpecialPage() ) { - $specialPage = SpecialPageFactory::getPage( $title->getDBKey() ); + $specialPage = SpecialPageFactory::getPage( $title->getDBkey() ); if ( $specialPage instanceof RedirectSpecialPage ) { $specialPage->setContext( $this->context ); if ( $this->config->get( 'HideIdentifiableRedirects' ) && $specialPage->personallyIdentifiableTarget() ) { - list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBKey() ); + list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBkey() ); $target = $specialPage->getRedirect( $subpage ); // target can also be true. We let that case fall through to normal processing. if ( $target instanceof Title ) { @@ -830,9 +830,18 @@ class MediaWiki { $errno = $errstr = null; $info = wfParseUrl( $this->config->get( 'Server' ) ); MediaWiki\suppressWarnings(); + $host = $info['host']; + $port = 80; + if ( isset( $info['scheme'] ) && $info['scheme'] == 'https' ) { + $host = "tls://" . $host; + $port = 443; + } + if ( isset( $info['port'] ) ) { + $port = $info['port']; + } $sock = fsockopen( - $info['host'], - isset( $info['port'] ) ? $info['port'] : 80, + $host, + $port, $errno, $errstr, // If it takes more than 100ms to connect to ourselves there diff --git a/includes/MergeHistory.php b/includes/MergeHistory.php index a92056dda5..441fe9e2c0 100644 --- a/includes/MergeHistory.php +++ b/includes/MergeHistory.php @@ -51,7 +51,7 @@ class MergeHistory { /** @var string SQL WHERE condition that selects source revisions to insert into destination */ protected $timeWhere; - /** @var MWTimestamp|boolean Timestamp upto which history from the source will be merged */ + /** @var MWTimestamp|bool Timestamp upto which history from the source will be merged */ protected $timestampLimit; /** @var integer Number of revisions merged (for Special:MergeHistory success message) */ @@ -61,7 +61,7 @@ class MergeHistory { * MergeHistory constructor. * @param Title $source Page from which history will be merged * @param Title $dest Page to which history will be merged - * @param string|boolean $timestamp Timestamp up to which history from the source will be merged + * @param string|bool $timestamp Timestamp up to which history from the source will be merged */ public function __construct( Title $source, Title $dest, $timestamp = false ) { // Save the parameters diff --git a/includes/Message.php b/includes/Message.php index 9d5f5e642a..fd016fcb37 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -160,19 +160,18 @@ class Message implements MessageSpecifier, Serializable { /** * In which language to get this message. True, which is the default, - * means the current interface language, false content language. + * means the current user language, false content language. * * @var bool */ protected $interface = true; /** - * In which language to get this message. Overrides the $interface - * variable. + * In which language to get this message. Overrides the $interface setting. * - * @var Language + * @var Language|bool Explicit language object, or false for user language */ - protected $language = null; + protected $language = false; /** * @var string The message key. If $keysToTry has more than one element, @@ -225,18 +224,14 @@ class Message implements MessageSpecifier, Serializable { /** * @since 1.17 - * * @param string|string[]|MessageSpecifier $key Message key, or array of * message keys to try and use the first non-empty message for, or a * MessageSpecifier to copy from. * @param array $params Message parameters. - * @param Language $language Optional language of the message, defaults to $wgLang. - * + * @param Language $language [optional] Language to use (defaults to current user language). * @throws InvalidArgumentException */ public function __construct( $key, $params = [], Language $language = null ) { - global $wgLang; - if ( $key instanceof MessageSpecifier ) { if ( $params ) { throw new InvalidArgumentException( @@ -260,7 +255,9 @@ class Message implements MessageSpecifier, Serializable { $this->key = reset( $this->keysToTry ); $this->parameters = array_values( $params ); - $this->language = $language ?: $wgLang; + // User language is only resolved in getLanguage(). This helps preserve the + // semantic intent of "user language" across serialize() and unserialize(). + $this->language = $language ?: false; } /** @@ -271,7 +268,7 @@ class Message implements MessageSpecifier, Serializable { public function serialize() { return serialize( [ 'interface' => $this->interface, - 'language' => $this->language instanceof StubUserLang ? false : $this->language->getCode(), + 'language' => $this->language ? $this->language->getCode() : false, 'key' => $this->key, 'keysToTry' => $this->keysToTry, 'parameters' => $this->parameters, @@ -287,8 +284,6 @@ class Message implements MessageSpecifier, Serializable { * @param string $serialized */ public function unserialize( $serialized ) { - global $wgLang; - $data = unserialize( $serialized ); $this->interface = $data['interface']; $this->key = $data['key']; @@ -296,7 +291,7 @@ class Message implements MessageSpecifier, Serializable { $this->parameters = $data['parameters']; $this->format = $data['format']; $this->useDatabase = $data['useDatabase']; - $this->language = $data['language'] ? Language::factory( $data['language'] ) : $wgLang; + $this->language = $data['language'] ? Language::factory( $data['language'] ) : false; $this->title = $data['title']; } @@ -365,7 +360,8 @@ class Message implements MessageSpecifier, Serializable { * @return Language */ public function getLanguage() { - return $this->language; + // Defaults to false which means current user language + return $this->language ?: RequestContext::getMain()->getLanguage(); } /** @@ -425,7 +421,7 @@ class Message implements MessageSpecifier, Serializable { public function getTitle() { global $wgContLang, $wgForceUIMsgAsContentMsg; - $code = $this->language->getCode(); + $code = $this->getLanguage()->getCode(); $title = $this->key; if ( $wgContLang->getCode() !== $code @@ -656,23 +652,24 @@ class Message implements MessageSpecifier, Serializable { /** * Request the message in any language that is supported. + * * As a side effect interface message status is unconditionally * turned off. * * @since 1.17 - * * @param Language|string $lang Language code or Language object. - * * @return Message $this * @throws MWException */ public function inLanguage( $lang ) { - if ( $lang instanceof Language || $lang instanceof StubUserLang ) { + if ( $lang instanceof Language ) { $this->language = $lang; } elseif ( is_string( $lang ) ) { if ( !$this->language instanceof Language || $this->language->getCode() != $lang ) { $this->language = Language::factory( $lang ); } + } elseif ( $lang instanceof StubUserLang ) { + $this->language = false; } else { $type = gettype( $lang ); throw new MWException( __METHOD__ . " must be " @@ -1061,17 +1058,17 @@ class Message implements MessageSpecifier, Serializable { } elseif ( isset( $param['num'] ) ) { // Replace number params always in before step for now. // No support for combined raw and num params - return [ 'before', $this->language->formatNum( $param['num'] ) ]; + return [ 'before', $this->getLanguage()->formatNum( $param['num'] ) ]; } elseif ( isset( $param['duration'] ) ) { - return [ 'before', $this->language->formatDuration( $param['duration'] ) ]; + return [ 'before', $this->getLanguage()->formatDuration( $param['duration'] ) ]; } elseif ( isset( $param['expiry'] ) ) { - return [ 'before', $this->language->formatExpiry( $param['expiry'] ) ]; + return [ 'before', $this->getLanguage()->formatExpiry( $param['expiry'] ) ]; } elseif ( isset( $param['period'] ) ) { - return [ 'before', $this->language->formatTimePeriod( $param['period'] ) ]; + return [ 'before', $this->getLanguage()->formatTimePeriod( $param['period'] ) ]; } elseif ( isset( $param['size'] ) ) { - return [ 'before', $this->language->formatSize( $param['size'] ) ]; + return [ 'before', $this->getLanguage()->formatSize( $param['size'] ) ]; } elseif ( isset( $param['bitrate'] ) ) { - return [ 'before', $this->language->formatBitrate( $param['bitrate'] ) ]; + return [ 'before', $this->getLanguage()->formatBitrate( $param['bitrate'] ) ]; } elseif ( isset( $param['plaintext'] ) ) { return [ 'after', $this->formatPlaintext( $param['plaintext'] ) ]; } else { @@ -1108,7 +1105,7 @@ class Message implements MessageSpecifier, Serializable { $this->title, /*linestart*/true, $this->interface, - $this->language + $this->getLanguage() ); return $out instanceof ParserOutput ? $out->getText() : $out; @@ -1127,7 +1124,7 @@ class Message implements MessageSpecifier, Serializable { return MessageCache::singleton()->transform( $string, $this->interface, - $this->language, + $this->getLanguage(), $this->title ); } @@ -1145,7 +1142,7 @@ class Message implements MessageSpecifier, Serializable { $cache = MessageCache::singleton(); foreach ( $this->keysToTry as $key ) { - $message = $cache->get( $key, $this->useDatabase, $this->language ); + $message = $cache->get( $key, $this->useDatabase, $this->getLanguage() ); if ( $message !== false && $message !== '' ) { break; } diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php index aedfd8fece..a432d44c9a 100644 --- a/includes/MimeMagic.php +++ b/includes/MimeMagic.php @@ -645,7 +645,7 @@ class MimeMagic { throw new MWException( "Seeking $tailLength bytes from EOF failed in " . __METHOD__ ); } - $tail = fread( $f, $tailLength ); + $tail = $tailLength ? fread( $f, $tailLength ) : ''; fclose( $f ); wfDebug( __METHOD__ . ": analyzing head and tail of $file for magic numbers.\n" ); diff --git a/includes/MovePage.php b/includes/MovePage.php index 321b7e3339..b9af755325 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -238,7 +238,7 @@ class MovePage { $file->load( File::READ_LATEST ); if ( $file->exists() ) { $status = $file->move( $this->newTitle ); - if ( !$status->isOk() ) { + if ( !$status->isOK() ) { return $status; } } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 6774072d11..c724207034 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -460,7 +460,7 @@ class OutputPage extends ContextSource { * @param string $script Raw HTML */ function addScript( $script ) { - $this->mScripts .= $script . "\n"; + $this->mScripts .= $script; } /** @@ -516,7 +516,7 @@ class OutputPage extends ContextSource { * @param string $script JavaScript text, no "" + '' ); } @@ -1396,7 +1396,7 @@ MESSAGE; 'mw.config.set', [ $configuration ], ResourceLoader::inDebugMode() - ) . ResourceLoader::FILTER_NOMIN; + ); } /** diff --git a/includes/resourceloader/ResourceLoaderImage.php b/includes/resourceloader/ResourceLoaderImage.php index 43fd2dbb9c..f784d0346c 100644 --- a/includes/resourceloader/ResourceLoaderImage.php +++ b/includes/resourceloader/ResourceLoaderImage.php @@ -272,7 +272,7 @@ class ResourceLoaderImage { */ protected function variantize( $variantConf, ResourceLoaderContext $context ) { $dom = new DomDocument; - $dom->loadXml( file_get_contents( $this->getPath( $context ) ) ); + $dom->loadXML( file_get_contents( $this->getPath( $context ) ) ); $root = $dom->documentElement; $wrapper = $dom->createElement( 'g' ); while ( $root->firstChild ) { @@ -280,7 +280,7 @@ class ResourceLoaderImage { } $root->appendChild( $wrapper ); $wrapper->setAttribute( 'fill', $variantConf['color'] ); - return $dom->saveXml(); + return $dom->saveXML(); } /** @@ -295,7 +295,7 @@ class ResourceLoaderImage { */ protected function massageSvgPathdata( $svg ) { $dom = new DomDocument; - $dom->loadXml( $svg ); + $dom->loadXML( $svg ); foreach ( $dom->getElementsByTagName( 'path' ) as $node ) { $pathData = $node->getAttribute( 'd' ); // Make sure there is at least one space between numbers, and that leading zero is not omitted. @@ -305,7 +305,7 @@ class ResourceLoaderImage { $pathData = preg_replace( '/([ -])0(\d)/', '$1$2', $pathData ); $node->setAttribute( 'd', $pathData ); } - return $dom->saveXml(); + return $dom->saveXML(); } /** diff --git a/includes/resourceloader/ResourceLoaderRawFileModule.php b/includes/resourceloader/ResourceLoaderRawFileModule.php index d9005fa5e2..beab53eb8d 100644 --- a/includes/resourceloader/ResourceLoaderRawFileModule.php +++ b/includes/resourceloader/ResourceLoaderRawFileModule.php @@ -31,7 +31,7 @@ class ResourceLoaderRawFileModule extends ResourceLoaderFileModule { /** * Enable raw mode to omit mw.loader.state() call as mw.loader * does not yet exist when these modules execute. - * @var boolean + * @var bool */ protected $raw = true; diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php index bf4e8a7e21..cea1f3940b 100644 --- a/includes/resourceloader/ResourceLoaderUserTokensModule.php +++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php @@ -54,8 +54,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule { /** * Generate the JavaScript content of this module. * - * Add '@nomin' annotation to prevent the module's contents from getting - * cached (T84960). + * Add FILTER_NOMIN annotation to prevent needless minification and caching (T84960). * * @param ResourceLoaderContext $context * @return string diff --git a/includes/search/SearchSuggestion.php b/includes/search/SearchSuggestion.php index cd9062b16f..80a437b6c9 100644 --- a/includes/search/SearchSuggestion.php +++ b/includes/search/SearchSuggestion.php @@ -84,7 +84,7 @@ class SearchSuggestion { */ public function setText( $text, $setTitle = true ) { $this->text = $text; - if ( $setTitle && $text ) { + if ( $setTitle && $text !== '' && $text !== null ) { $this->setSuggestedTitle( Title::makeTitle( 0, $text ) ); } } diff --git a/includes/session/BotPasswordSessionProvider.php b/includes/session/BotPasswordSessionProvider.php index bbdfdc3f26..5831b098fa 100644 --- a/includes/session/BotPasswordSessionProvider.php +++ b/includes/session/BotPasswordSessionProvider.php @@ -147,7 +147,7 @@ class BotPasswordSessionProvider extends ImmutableSessionProviderWithCookie { } $status = $bp->getRestrictions()->check( $request ); - if ( !$status->isOk() ) { + if ( !$status->isOK() ) { $this->logger->info( 'Session "{session}": Restrictions check failed', [ diff --git a/includes/session/SessionManager.php b/includes/session/SessionManager.php index 0a304a99b2..da7bc57334 100644 --- a/includes/session/SessionManager.php +++ b/includes/session/SessionManager.php @@ -197,13 +197,17 @@ final class SessionManager implements SessionManagerInterface { } $session = null; + $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'id' => $id, 'idIsSafe' => true ] ); - // Test this here to provide a better log message for the common case - // of "no such ID" + // If we already have the backend loaded, use it directly + if ( isset( $this->allSessionBackends[$id] ) ) { + return $this->getSessionFromInfo( $info, $request ); + } + + // Test if the session is in storage, and if so try to load it. $key = wfMemcKey( 'MWSession', $id ); if ( is_array( $this->store->get( $key ) ) ) { - $create = false; - $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'id' => $id, 'idIsSafe' => true ] ); + $create = false; // If loading fails, don't bother creating because it probably will fail too. if ( $this->loadSessionInfoFromStore( $info, $request ) ) { $session = $this->getSessionFromInfo( $info, $request ); } diff --git a/includes/site/HashSiteStore.php b/includes/site/HashSiteStore.php index 0d0e448fd1..198d331d95 100644 --- a/includes/site/HashSiteStore.php +++ b/includes/site/HashSiteStore.php @@ -50,7 +50,7 @@ class HashSiteStore implements SiteStore { * * @param Site $site * - * @return boolean Success indicator + * @return bool Success indicator */ public function saveSite( Site $site ) { $this->sites[$site->getGlobalId()] = $site; @@ -65,7 +65,7 @@ class HashSiteStore implements SiteStore { * * @param Site[] $sites * - * @return boolean Success indicator + * @return bool Success indicator */ public function saveSites( array $sites ) { foreach ( $sites as $site ) { diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php index 419c4b4653..2d1679d3ce 100644 --- a/includes/skins/SkinTemplate.php +++ b/includes/skins/SkinTemplate.php @@ -45,6 +45,14 @@ class SkinTemplate extends Skin { */ public $template = 'QuickTemplate'; + public $thispage; + public $titletxt; + public $userpage; + public $thisquery; + public $loggedin; + public $username; + public $userpageUrlDetails; + /** * Add specific styles for this skin * @@ -650,33 +658,42 @@ class SkinTemplate extends Skin { 'active' => false ]; } else { + $useCombinedLoginLink = $this->useCombinedLoginLink(); + $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink + ? 'nav-login-createaccount' + : 'pt-login'; + $is_signup = $request->getText( 'type' ) == 'signup'; + + $login_url = [ + 'text' => $this->msg( $loginlink )->text(), + 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ), + 'active' => $title->isSpecial( 'Userlogin' ) + && ( $loginlink == 'nav-login-createaccount' || !$is_signup ), + ]; + $createaccount_url = [ + 'text' => $this->msg( 'pt-createaccount' )->text(), + 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ), + 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup, + ]; + // No need to show Talk and Contributions to anons if they can't contribute! if ( User::groupHasPermission( '*', 'edit' ) ) { + // Show the text "Not logged in" + $personal_urls['anonuserpage'] = [ + 'text' => $this->msg( 'notloggedin' )->text() + ]; - // Because of caching, we can't link directly to the anonymous - // user page (for example [[User:127.0.0.1]]), talk page, and - // contributions pages. Instead we use the special page - // shortcuts (which work correctly regardless of caching). This - // means we can't determine whether these links are active or - // not, but since major skins (MonoBook, Vector) don't use this - // information, it's not a huge loss. - - // Only show (red) link to anon user page if anon users are - // allowed to create that page - if ( User::groupHasPermission( '*', 'createpage' ) ) { - $personal_urls[ 'anonuserpage' ] = [ - 'text' => $this->msg( 'anonuserpage' )->text(), - 'href' => self::makeSpecialUrlSubpage( 'Mypage', false ), - 'active' => false - ]; - } - + // Because of caching, we can't link directly to the IP talk and + // contributions pages. Instead we use the special page shortcuts + // (which work correctly regardless of caching). This means we can't + // determine whether these links are active or not, but since major + // skins (MonoBook, Vector) don't use this information, it's not a + // huge loss. $personal_urls['anontalk'] = [ 'text' => $this->msg( 'anontalk' )->text(), 'href' => self::makeSpecialUrlSubpage( 'Mytalk', false ), 'active' => false ]; - $personal_urls['anoncontribs'] = [ 'text' => $this->msg( 'anoncontribs' )->text(), 'href' => self::makeSpecialUrlSubpage( 'Mycontributions', false ), @@ -684,21 +701,11 @@ class SkinTemplate extends Skin { ]; } - $is_signup = $request->getText( 'type' ) === 'signup'; - - if ( $this->getUser()->isAllowed( 'createaccount' ) && !( $this->useCombinedLoginLink() ) ) { - $personal_urls[ 'createaccount' ] = [ - 'text' => $this->msg( 'pt-createaccount' )->text(), - 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ), - 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup, - ]; + if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) { + $personal_urls['createaccount'] = $createaccount_url; } - $personal_urls['login'] = [ - 'text' => $this->msg( 'pt-login' )->text(), - 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ), - 'active' => $title->isSpecial( 'Userlogin' ) && !$is_signup, - ]; + $personal_urls['login'] = $login_url; } Hooks::run( 'PersonalUrls', [ &$personal_urls, &$title, $this ] ); diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php index 9c5fc2f973..d6d4500972 100644 --- a/includes/specials/SpecialActiveusers.php +++ b/includes/specials/SpecialActiveusers.php @@ -23,235 +23,6 @@ * @ingroup SpecialPage */ -/** - * This class is used to get a list of active users. The ones with specials - * rights (sysop, bureaucrat, developer) will have them displayed - * next to their names. - * - * @ingroup SpecialPage - */ -class ActiveUsersPager extends UsersPager { - /** - * @var FormOptions - */ - protected $opts; - - /** - * @var array - */ - protected $hideGroups = []; - - /** - * @var array - */ - protected $hideRights = []; - - /** - * @var array - */ - private $blockStatusByUid; - - /** - * @param IContextSource $context - * @param null $group Unused - * @param string $par Parameter passed to the page - */ - function __construct( IContextSource $context = null, $group = null, $par = null ) { - parent::__construct( $context ); - - $this->RCMaxAge = $this->getConfig()->get( 'ActiveUserDays' ); - $un = $this->getRequest()->getText( 'username', $par ); - $this->requestedUser = ''; - if ( $un != '' ) { - $username = Title::makeTitleSafe( NS_USER, $un ); - if ( !is_null( $username ) ) { - $this->requestedUser = $username->getText(); - } - } - - $this->setupOptions(); - } - - public function setupOptions() { - $this->opts = new FormOptions(); - - $this->opts->add( 'hidebots', false, FormOptions::BOOL ); - $this->opts->add( 'hidesysops', false, FormOptions::BOOL ); - - $this->opts->fetchValuesFromRequest( $this->getRequest() ); - - if ( $this->opts->getValue( 'hidebots' ) == 1 ) { - $this->hideRights[] = 'bot'; - } - if ( $this->opts->getValue( 'hidesysops' ) == 1 ) { - $this->hideGroups[] = 'sysop'; - } - } - - function getIndexField() { - return 'qcc_title'; - } - - function getQueryInfo() { - $dbr = $this->getDatabase(); - - $activeUserSeconds = $this->getConfig()->get( 'ActiveUserDays' ) * 86400; - $timestamp = $dbr->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds ); - $conds = [ - 'qcc_type' => 'activeusers', - 'qcc_namespace' => NS_USER, - 'user_name = qcc_title', - 'rc_user_text = qcc_title', - 'rc_type != ' . $dbr->addQuotes( RC_EXTERNAL ), // Don't count wikidata. - 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' ), - 'rc_timestamp >= ' . $dbr->addQuotes( $timestamp ), - ]; - if ( $this->requestedUser != '' ) { - $conds[] = 'qcc_title >= ' . $dbr->addQuotes( $this->requestedUser ); - } - if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { - $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText( - 'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ] - ) . ')'; - } - - if ( $dbr->implicitGroupby() ) { - $options = [ 'GROUP BY' => [ 'qcc_title' ] ]; - } else { - $options = [ 'GROUP BY' => [ 'user_name', 'user_id', 'qcc_title' ] ]; - } - - return [ - 'tables' => [ 'querycachetwo', 'user', 'recentchanges' ], - 'fields' => [ 'user_name', 'user_id', 'recentedits' => 'COUNT(*)', 'qcc_title' ], - 'options' => $options, - 'conds' => $conds - ]; - } - - function doBatchLookups() { - parent::doBatchLookups(); - - $uids = []; - foreach ( $this->mResult as $row ) { - $uids[] = $row->user_id; - } - // Fetch the block status of the user for showing "(blocked)" text and for - // striking out names of suppressed users when privileged user views the list. - // Although the first query already hits the block table for un-privileged, this - // is done in two queries to avoid huge quicksorts and to make COUNT(*) correct. - $dbr = $this->getDatabase(); - $res = $dbr->select( 'ipblocks', - [ 'ipb_user', 'MAX(ipb_deleted) AS block_status' ], - [ 'ipb_user' => $uids ], - __METHOD__, - [ 'GROUP BY' => [ 'ipb_user' ] ] - ); - $this->blockStatusByUid = []; - foreach ( $res as $row ) { - $this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1 - } - $this->mResult->seek( 0 ); - } - - function formatRow( $row ) { - $userName = $row->user_name; - - $ulinks = Linker::userLink( $row->user_id, $userName ); - $ulinks .= Linker::userToolLinks( $row->user_id, $userName ); - - $lang = $this->getLanguage(); - - $list = []; - $user = User::newFromId( $row->user_id ); - - // User right filter - foreach ( $this->hideRights as $right ) { - // Calling User::getRights() within the loop so that - // if the hideRights() filter is empty, we don't have to - // trigger the lazy-init of the big userrights array in the - // User object - if ( in_array( $right, $user->getRights() ) ) { - return ''; - } - } - - // User group filter - // Note: This is a different loop than for user rights, - // because we're reusing it to build the group links - // at the same time - $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache ); - foreach ( $groups_list as $group ) { - if ( in_array( $group, $this->hideGroups ) ) { - return ''; - } - $list[] = self::buildGroupLink( $group, $userName ); - } - - $groups = $lang->commaList( $list ); - - $item = $lang->specialList( $ulinks, $groups ); - - $isBlocked = isset( $this->blockStatusByUid[$row->user_id] ); - if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) { - $item = "$item"; - } - $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits ) - ->params( $userName )->numParams( $this->RCMaxAge )->escaped(); - $blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : ''; - - return Html::rawElement( 'li', [], "{$item} [{$count}]{$blocked}" ); - } - - function getPageHeader() { - $self = $this->getTitle(); - $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : ''; - - # Form tag - $out = Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ); - $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n"; - $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n"; - - # Username field (with autocompletion support) - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - $out .= Xml::inputLabel( - $this->msg( 'activeusers-from' )->text(), - 'username', - 'offset', - 20, - $this->requestedUser, - [ - 'class' => 'mw-ui-input-inline mw-autocomplete-user', - 'tabindex' => 1, - ] + ( - // Set autofocus on blank input - $this->requestedUser === '' ? [ 'autofocus' => '' ] : [] - ) - ) . '
'; - - $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(), - 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), [ 'tabindex' => 2 ] ); - - $out .= Xml::checkLabel( - $this->msg( 'activeusers-hidesysops' )->text(), - 'hidesysops', - 'hidesysops', - $this->opts->getValue( 'hidesysops' ), - [ 'tabindex' => 3 ] - ) . '
'; - - # Submit button and form bottom - $out .= Xml::submitButton( - $this->msg( 'activeusers-submit' )->text(), - [ 'tabindex' => 4 ] - ) . "\n"; - $out .= Xml::closeElement( 'fieldset' ); - $out .= Xml::closeElement( 'form' ); - - return $out; - } -} - /** * @ingroup SpecialPage */ diff --git a/includes/specials/SpecialAllMessages.php b/includes/specials/SpecialAllMessages.php index 49d5d6e596..49ca9f45de 100644 --- a/includes/specials/SpecialAllMessages.php +++ b/includes/specials/SpecialAllMessages.php @@ -77,403 +77,3 @@ class SpecialAllMessages extends SpecialPage { return 'wiki'; } } - -/** - * Use TablePager for prettified output. We have to pretend that we're - * getting data from a table when in fact not all of it comes from the database. - */ -class AllMessagesTablePager extends TablePager { - protected $filter, $prefix, $langcode, $displayPrefix; - - public $mLimitsShown; - - /** - * @var Language - */ - public $lang; - - /** - * @var null|bool - */ - public $custom; - - function __construct( $page, $conds, $langObj = null ) { - parent::__construct( $page->getContext() ); - $this->mIndexField = 'am_title'; - $this->mPage = $page; - $this->mConds = $conds; - // FIXME: Why does this need to be set to DIR_DESCENDING to produce ascending ordering? - $this->mDefaultDirection = IndexPager::DIR_DESCENDING; - $this->mLimitsShown = [ 20, 50, 100, 250, 500, 5000 ]; - - global $wgContLang; - - $this->talk = $this->msg( 'talkpagelinktext' )->escaped(); - - $this->lang = ( $langObj ? $langObj : $wgContLang ); - $this->langcode = $this->lang->getCode(); - $this->foreign = $this->langcode !== $wgContLang->getCode(); - - $request = $this->getRequest(); - - $this->filter = $request->getVal( 'filter', 'all' ); - if ( $this->filter === 'all' ) { - $this->custom = null; // So won't match in either case - } else { - $this->custom = ( $this->filter === 'unmodified' ); - } - - $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) ); - $prefix = $prefix !== '' ? - Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : - null; - - if ( $prefix !== null ) { - $this->displayPrefix = $prefix->getDBkey(); - $this->prefix = '/^' . preg_quote( $this->displayPrefix, '/' ) . '/i'; - } else { - $this->displayPrefix = false; - $this->prefix = false; - } - - // The suffix that may be needed for message names if we're in a - // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr' - if ( $this->foreign ) { - $this->suffix = '/' . $this->langcode; - } else { - $this->suffix = ''; - } - } - - function buildForm() { - $attrs = [ 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ]; - $msg = wfMessage( 'allmessages-language' ); - $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg ); - - $out = Xml::openElement( 'form', [ - 'method' => 'get', - 'action' => $this->getConfig()->get( 'Script' ), - 'id' => 'mw-allmessages-form' - ] ) . - Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) . - Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . - Xml::openElement( 'table', [ 'class' => 'mw-allmessages-table' ] ) . "\n" . - ' - ' . - Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) . - "\n - " . - Xml::input( - 'prefix', - 20, - str_replace( '_', ' ', $this->displayPrefix ), - [ 'id' => 'mw-allmessages-form-prefix' ] - ) . - "\n - - \n - " . - $this->msg( 'allmessages-filter' )->escaped() . - "\n - " . - Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(), - 'filter', - 'unmodified', - 'mw-allmessages-form-filter-unmodified', - ( $this->filter === 'unmodified' ) - ) . - Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(), - 'filter', - 'all', - 'mw-allmessages-form-filter-all', - ( $this->filter === 'all' ) - ) . - Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(), - 'filter', - 'modified', - 'mw-allmessages-form-filter-modified', - ( $this->filter === 'modified' ) - ) . - "\n - - \n - " . $langSelect[0] . "\n - " . $langSelect[1] . "\n - " . - - ' - ' . - Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) . - ' - ' . - $this->getLimitSelect( [ 'id' => 'mw-table_pager_limit_label' ] ) . - ' - - - ' . - Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) . - "\n - " . - - Xml::closeElement( 'table' ) . - $this->getHiddenFields( [ 'title', 'prefix', 'filter', 'lang', 'limit' ] ) . - Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ); - - return $out; - } - - function getAllMessages( $descending ) { - $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' ); - - // Normalise message names so they look like page titles and sort correctly - T86139 - $messageNames = array_map( [ $this->lang, 'ucfirst' ], $messageNames ); - - if ( $descending ) { - rsort( $messageNames ); - } else { - asort( $messageNames ); - } - - return $messageNames; - } - - /** - * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist. - * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have - * an entry for each existing page, with the key being the message name and - * value arbitrary. - * - * @param array $messageNames - * @param string $langcode What language code - * @param bool $foreign Whether the $langcode is not the content language - * @return array A 'pages' and 'talks' array with the keys of existing pages - */ - public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) { - // FIXME: This function should be moved to Language:: or something. - - $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( 'page', - [ 'page_namespace', 'page_title' ], - [ 'page_namespace' => [ NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ] ], - __METHOD__, - [ 'USE INDEX' => 'name_title' ] - ); - $xNames = array_flip( $messageNames ); - - $pageFlags = $talkFlags = []; - - foreach ( $res as $s ) { - $exists = false; - - if ( $foreign ) { - $titleParts = explode( '/', $s->page_title ); - if ( count( $titleParts ) === 2 && - $langcode === $titleParts[1] && - isset( $xNames[$titleParts[0]] ) - ) { - $exists = $titleParts[0]; - } - } elseif ( isset( $xNames[$s->page_title] ) ) { - $exists = $s->page_title; - } - - $title = Title::newFromRow( $s ); - if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) { - $pageFlags[$exists] = true; - } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) { - $talkFlags[$exists] = true; - } - } - - return [ 'pages' => $pageFlags, 'talks' => $talkFlags ]; - } - - /** - * This function normally does a database query to get the results; we need - * to make a pretend result using a FakeResultWrapper. - * @param string $offset - * @param int $limit - * @param bool $descending - * @return FakeResultWrapper - */ - function reallyDoQuery( $offset, $limit, $descending ) { - $result = new FakeResultWrapper( [] ); - - $messageNames = $this->getAllMessages( $descending ); - $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign ); - - $count = 0; - foreach ( $messageNames as $key ) { - $customised = isset( $statuses['pages'][$key] ); - if ( $customised !== $this->custom && - ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) && - ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false ) - ) { - $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain(); - $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain(); - $result->result[] = [ - 'am_title' => $key, - 'am_actual' => $actual, - 'am_default' => $default, - 'am_customised' => $customised, - 'am_talk_exists' => isset( $statuses['talks'][$key] ) - ]; - $count++; - } - - if ( $count === $limit ) { - break; - } - } - - return $result; - } - - function getStartBody() { - $tableClass = $this->getTableClass(); - return Xml::openElement( 'table', [ - 'class' => "mw-datatable $tableClass", - 'id' => 'mw-allmessagestable' - ] ) . - "\n" . - " - " . - $this->msg( 'allmessagesname' )->escaped() . " - - " . - $this->msg( 'allmessagesdefault' )->escaped() . - " - \n - - " . - $this->msg( 'allmessagescurrent' )->escaped() . - " - \n"; - } - - function formatValue( $field, $value ) { - switch ( $field ) { - case 'am_title' : - $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix ); - $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix ); - $translation = Linker::makeExternalLink( - 'https://translatewiki.net/w/i.php?' . wfArrayToCgi( [ - 'title' => 'Special:SearchTranslations', - 'group' => 'mediawiki', - 'grouppath' => 'mediawiki', - 'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' . - 'messageid:"MediaWiki:' . $value . '"^10 "' . - $this->msg( $value )->inLanguage( 'en' )->plain() . '"' - ] ), - $this->msg( 'allmessages-filter-translate' )->text() - ); - - if ( $this->mCurrentRow->am_customised ) { - $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) ); - } else { - $title = Linker::link( - $title, - $this->getLanguage()->lcfirst( $value ), - [], - [], - [ 'broken' ] - ); - } - if ( $this->mCurrentRow->am_talk_exists ) { - $talk = Linker::linkKnown( $talk, $this->talk ); - } else { - $talk = Linker::link( - $talk, - $this->talk, - [], - [], - [ 'broken' ] - ); - } - - return $title . ' ' . - $this->msg( 'parentheses' )->rawParams( $talk )->escaped() . - ' ' . - $this->msg( 'parentheses' )->rawParams( $translation )->escaped(); - - case 'am_default' : - case 'am_actual' : - return Sanitizer::escapeHtmlAllowEntities( $value ); - } - - return ''; - } - - function formatRow( $row ) { - // Do all the normal stuff - $s = parent::formatRow( $row ); - - // But if there's a customised message, add that too. - if ( $row->am_customised ) { - $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) ); - $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) ); - - if ( $formatted === '' ) { - $formatted = ' '; - } - - $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted ) - . "\n"; - } - - return $s; - } - - function getRowAttrs( $row, $isSecond = false ) { - $arr = []; - - if ( $row->am_customised ) { - $arr['class'] = 'allmessages-customised'; - } - - if ( !$isSecond ) { - $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) ); - } - - return $arr; - } - - function getCellAttrs( $field, $value ) { - if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) { - return [ 'rowspan' => '2', 'class' => $field ]; - } elseif ( $field === 'am_title' ) { - return [ 'class' => $field ]; - } else { - return [ - 'lang' => $this->lang->getHtmlCode(), - 'dir' => $this->lang->getDir(), - 'class' => $field - ]; - } - } - - // This is not actually used, as getStartBody is overridden above - function getFieldNames() { - return [ - 'am_title' => $this->msg( 'allmessagesname' )->text(), - 'am_default' => $this->msg( 'allmessagesdefault' )->text() - ]; - } - - function getTitle() { - return SpecialPage::getTitleFor( 'Allmessages', false ); - } - - function isFieldSortable( $x ) { - return false; - } - - function getDefaultSort() { - return ''; - } - - function getQueryInfo() { - return ''; - } -} diff --git a/includes/specials/SpecialBlockList.php b/includes/specials/SpecialBlockList.php index e589ecb00a..dbbee71453 100644 --- a/includes/specials/SpecialBlockList.php +++ b/includes/specials/SpecialBlockList.php @@ -222,244 +222,3 @@ class SpecialBlockList extends SpecialPage { return 'users'; } } - -class BlockListPager extends TablePager { - protected $conds; - protected $page; - - /** - * @param SpecialPage $page - * @param array $conds - */ - function __construct( $page, $conds ) { - $this->page = $page; - $this->conds = $conds; - $this->mDefaultDirection = IndexPager::DIR_DESCENDING; - parent::__construct( $page->getContext() ); - } - - function getFieldNames() { - static $headers = null; - - if ( $headers === null ) { - $headers = [ - 'ipb_timestamp' => 'blocklist-timestamp', - 'ipb_target' => 'blocklist-target', - 'ipb_expiry' => 'blocklist-expiry', - 'ipb_by' => 'blocklist-by', - 'ipb_params' => 'blocklist-params', - 'ipb_reason' => 'blocklist-reason', - ]; - foreach ( $headers as $key => $val ) { - $headers[$key] = $this->msg( $val )->text(); - } - } - - return $headers; - } - - function formatValue( $name, $value ) { - static $msg = null; - if ( $msg === null ) { - $keys = [ - 'anononlyblock', - 'createaccountblock', - 'noautoblockblock', - 'emailblock', - 'blocklist-nousertalk', - 'unblocklink', - 'change-blocklink', - ]; - - foreach ( $keys as $key ) { - $msg[$key] = $this->msg( $key )->escaped(); - } - } - - /** @var $row object */ - $row = $this->mCurrentRow; - - $language = $this->getLanguage(); - - $formatted = ''; - - switch ( $name ) { - case 'ipb_timestamp': - $formatted = htmlspecialchars( $language->userTimeAndDate( $value, $this->getUser() ) ); - break; - - case 'ipb_target': - if ( $row->ipb_auto ) { - $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse(); - } else { - list( $target, $type ) = Block::parseTarget( $row->ipb_address ); - switch ( $type ) { - case Block::TYPE_USER: - case Block::TYPE_IP: - $formatted = Linker::userLink( $target->getId(), $target ); - $formatted .= Linker::userToolLinks( - $target->getId(), - $target, - false, - Linker::TOOL_LINKS_NOBLOCK - ); - break; - case Block::TYPE_RANGE: - $formatted = htmlspecialchars( $target ); - } - } - break; - - case 'ipb_expiry': - $formatted = htmlspecialchars( $language->formatExpiry( - $value, - /* User preference timezone */true - ) ); - if ( $this->getUser()->isAllowed( 'block' ) ) { - if ( $row->ipb_auto ) { - $links[] = Linker::linkKnown( - SpecialPage::getTitleFor( 'Unblock' ), - $msg['unblocklink'], - [], - [ 'wpTarget' => "#{$row->ipb_id}" ] - ); - } else { - $links[] = Linker::linkKnown( - SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ), - $msg['unblocklink'] - ); - $links[] = Linker::linkKnown( - SpecialPage::getTitleFor( 'Block', $row->ipb_address ), - $msg['change-blocklink'] - ); - } - $formatted .= ' ' . Html::rawElement( - 'span', - [ 'class' => 'mw-blocklist-actions' ], - $this->msg( 'parentheses' )->rawParams( - $language->pipeList( $links ) )->escaped() - ); - } - break; - - case 'ipb_by': - if ( isset( $row->by_user_name ) ) { - $formatted = Linker::userLink( $value, $row->by_user_name ); - $formatted .= Linker::userToolLinks( $value, $row->by_user_name ); - } else { - $formatted = htmlspecialchars( $row->ipb_by_text ); // foreign user? - } - break; - - case 'ipb_reason': - $formatted = Linker::formatComment( $value ); - break; - - case 'ipb_params': - $properties = []; - if ( $row->ipb_anon_only ) { - $properties[] = $msg['anononlyblock']; - } - if ( $row->ipb_create_account ) { - $properties[] = $msg['createaccountblock']; - } - if ( $row->ipb_user && !$row->ipb_enable_autoblock ) { - $properties[] = $msg['noautoblockblock']; - } - - if ( $row->ipb_block_email ) { - $properties[] = $msg['emailblock']; - } - - if ( !$row->ipb_allow_usertalk ) { - $properties[] = $msg['blocklist-nousertalk']; - } - - $formatted = $language->commaList( $properties ); - break; - - default: - $formatted = "Unable to format $name"; - break; - } - - return $formatted; - } - - function getQueryInfo() { - $info = [ - 'tables' => [ 'ipblocks', 'user' ], - 'fields' => [ - 'ipb_id', - 'ipb_address', - 'ipb_user', - 'ipb_by', - 'ipb_by_text', - 'by_user_name' => 'user_name', - 'ipb_reason', - 'ipb_timestamp', - 'ipb_auto', - 'ipb_anon_only', - 'ipb_create_account', - 'ipb_enable_autoblock', - 'ipb_expiry', - 'ipb_range_start', - 'ipb_range_end', - 'ipb_deleted', - 'ipb_block_email', - 'ipb_allow_usertalk', - ], - 'conds' => $this->conds, - 'join_conds' => [ 'user' => [ 'LEFT JOIN', 'user_id = ipb_by' ] ] - ]; - - # Filter out any expired blocks - $db = $this->getDatabase(); - $info['conds'][] = 'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ); - - # Is the user allowed to see hidden blocks? - if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { - $info['conds']['ipb_deleted'] = 0; - } - - return $info; - } - - public function getTableClass() { - return parent::getTableClass() . ' mw-blocklist'; - } - - function getIndexField() { - return 'ipb_timestamp'; - } - - function getDefaultSort() { - return 'ipb_timestamp'; - } - - function isFieldSortable( $name ) { - return false; - } - - /** - * Do a LinkBatch query to minimise database load when generating all these links - * @param ResultWrapper $result - */ - function preprocessResults( $result ) { - # Do a link batch query - $lb = new LinkBatch; - $lb->setCaller( __METHOD__ ); - - foreach ( $result as $row ) { - $lb->add( NS_USER, $row->ipb_address ); - $lb->add( NS_USER_TALK, $row->ipb_address ); - - if ( isset( $row->by_user_name ) ) { - $lb->add( NS_USER, $row->by_user_name ); - $lb->add( NS_USER_TALK, $row->by_user_name ); - } - } - - $lb->execute(); - } -} diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php index 5314f63489..d7d338ccf9 100644 --- a/includes/specials/SpecialCategories.php +++ b/includes/specials/SpecialCategories.php @@ -92,109 +92,3 @@ class SpecialCategories extends SpecialPage { return 'pages'; } } - -/** - * TODO: Allow sorting by count. We need to have a unique index to do this - * properly. - * - * @ingroup SpecialPage Pager - */ -class CategoryPager extends AlphabeticPager { - - /** - * @var PageLinkRenderer - */ - protected $linkRenderer; - - /** - * @param IContextSource $context - * @param string $from - * @param PageLinkRenderer $linkRenderer - */ - public function __construct( IContextSource $context, $from, PageLinkRenderer $linkRenderer - ) { - parent::__construct( $context ); - $from = str_replace( ' ', '_', $from ); - if ( $from !== '' ) { - $from = Title::capitalize( $from, NS_CATEGORY ); - $this->setOffset( $from ); - $this->setIncludeOffset( true ); - } - - $this->linkRenderer = $linkRenderer; - } - - function getQueryInfo() { - return [ - 'tables' => [ 'category' ], - 'fields' => [ 'cat_title', 'cat_pages' ], - 'conds' => [ 'cat_pages > 0' ], - 'options' => [ 'USE INDEX' => 'cat_title' ], - ]; - } - - function getIndexField() { -# return array( 'abc' => 'cat_title', 'count' => 'cat_pages' ); - return 'cat_title'; - } - - function getDefaultQuery() { - parent::getDefaultQuery(); - unset( $this->mDefaultQuery['from'] ); - - return $this->mDefaultQuery; - } - -# protected function getOrderTypeMessages() { -# return array( 'abc' => 'special-categories-sort-abc', -# 'count' => 'special-categories-sort-count' ); -# } - - protected function getDefaultDirections() { -# return array( 'abc' => false, 'count' => true ); - return false; - } - - /* Override getBody to apply LinksBatch on resultset before actually outputting anything. */ - public function getBody() { - $batch = new LinkBatch; - - $this->mResult->rewind(); - - foreach ( $this->mResult as $row ) { - $batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) ); - } - $batch->execute(); - $this->mResult->rewind(); - - return parent::getBody(); - } - - function formatRow( $result ) { - $title = new TitleValue( NS_CATEGORY, $result->cat_title ); - $text = $title->getText(); - $link = $this->linkRenderer->renderHtmlLink( $title, $text ); - - $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped(); - return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n"; - } - - public function getStartForm( $from ) { - return Xml::tags( - 'form', - [ 'method' => 'get', 'action' => wfScript() ], - Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . - Xml::fieldset( - $this->msg( 'categories' )->text(), - Xml::inputLabel( - $this->msg( 'categoriesfrom' )->text(), - 'from', 'from', 20, $from, [ 'class' => 'mw-ui-input-inline' ] ) . - ' ' . - Html::submitButton( - $this->msg( 'categories-submit' )->text(), - [], [ 'mw-ui-progressive' ] - ) - ) - ); - } -} diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php index 2d0d020cac..5adc315095 100644 --- a/includes/specials/SpecialChangePassword.php +++ b/includes/specials/SpecialChangePassword.php @@ -332,7 +332,7 @@ class SpecialChangePassword extends FormSpecialPage { $dbw->update( 'user', [ 'user_password_expires' => $dbw->timestampOrNull( $newExpire ) ], - [ 'user_id' => $user->getID() ], + [ 'user_id' => $user->getId() ], __METHOD__ ); } diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 7b8aa4c5f8..431b556cb3 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -673,508 +673,3 @@ class SpecialContributions extends IncludableSpecialPage { return 'users'; } } - -/** - * Pager for Special:Contributions - * @ingroup SpecialPage Pager - */ -class ContribsPager extends ReverseChronologicalPager { - public $mDefaultDirection = IndexPager::DIR_DESCENDING; - public $messages; - public $target; - public $namespace = ''; - public $mDb; - public $preventClickjacking = false; - - /** @var IDatabase */ - public $mDbSecondary; - - /** - * @var array - */ - protected $mParentLens; - - function __construct( IContextSource $context, array $options ) { - parent::__construct( $context ); - - $msgs = [ - 'diff', - 'hist', - 'pipe-separator', - 'uctop' - ]; - - foreach ( $msgs as $msg ) { - $this->messages[$msg] = $this->msg( $msg )->escaped(); - } - - $this->target = isset( $options['target'] ) ? $options['target'] : ''; - $this->contribs = isset( $options['contribs'] ) ? $options['contribs'] : 'users'; - $this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : ''; - $this->tagFilter = isset( $options['tagfilter'] ) ? $options['tagfilter'] : false; - $this->nsInvert = isset( $options['nsInvert'] ) ? $options['nsInvert'] : false; - $this->associated = isset( $options['associated'] ) ? $options['associated'] : false; - - $this->deletedOnly = !empty( $options['deletedOnly'] ); - $this->topOnly = !empty( $options['topOnly'] ); - $this->newOnly = !empty( $options['newOnly'] ); - - $year = isset( $options['year'] ) ? $options['year'] : false; - $month = isset( $options['month'] ) ? $options['month'] : false; - $this->getDateCond( $year, $month ); - - // Most of this code will use the 'contributions' group DB, which can map to slaves - // with extra user based indexes or partioning by user. The additional metadata - // queries should use a regular slave since the lookup pattern is not all by user. - $this->mDbSecondary = wfGetDB( DB_SLAVE ); // any random slave - $this->mDb = wfGetDB( DB_SLAVE, 'contributions' ); - } - - function getDefaultQuery() { - $query = parent::getDefaultQuery(); - $query['target'] = $this->target; - - return $query; - } - - /** - * This method basically executes the exact same code as the parent class, though with - * a hook added, to allow extensions to add additional queries. - * - * @param string $offset Index offset, inclusive - * @param int $limit Exact query limit - * @param bool $descending Query direction, false for ascending, true for descending - * @return ResultWrapper - */ - function reallyDoQuery( $offset, $limit, $descending ) { - list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( - $offset, - $limit, - $descending - ); - - /* - * This hook will allow extensions to add in additional queries, so they can get their data - * in My Contributions as well. Extensions should append their results to the $data array. - * - * Extension queries have to implement the navbar requirement as well. They should - * - have a column aliased as $pager->getIndexField() - * - have LIMIT set - * - have a WHERE-clause that compares the $pager->getIndexField()-equivalent column to the offset - * - have the ORDER BY specified based upon the details provided by the navbar - * - * See includes/Pager.php buildQueryInfo() method on how to build LIMIT, WHERE & ORDER BY - * - * &$data: an array of results of all contribs queries - * $pager: the ContribsPager object hooked into - * $offset: see phpdoc above - * $limit: see phpdoc above - * $descending: see phpdoc above - */ - $data = [ $this->mDb->select( - $tables, $fields, $conds, $fname, $options, $join_conds - ) ]; - Hooks::run( - 'ContribsPager::reallyDoQuery', - [ &$data, $this, $offset, $limit, $descending ] - ); - - $result = []; - - // loop all results and collect them in an array - foreach ( $data as $query ) { - foreach ( $query as $i => $row ) { - // use index column as key, allowing us to easily sort in PHP - $result[$row->{$this->getIndexField()} . "-$i"] = $row; - } - } - - // sort results - if ( $descending ) { - ksort( $result ); - } else { - krsort( $result ); - } - - // enforce limit - $result = array_slice( $result, 0, $limit ); - - // get rid of array keys - $result = array_values( $result ); - - return new FakeResultWrapper( $result ); - } - - function getQueryInfo() { - list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond(); - - $user = $this->getUser(); - $conds = array_merge( $userCond, $this->getNamespaceCond() ); - - // Paranoia: avoid brute force searches (bug 17342) - if ( !$user->isAllowed( 'deletedhistory' ) ) { - $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0'; - } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { - $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::SUPPRESSED_USER ) . - ' != ' . Revision::SUPPRESSED_USER; - } - - # Don't include orphaned revisions - $join_cond['page'] = Revision::pageJoinCond(); - # Get the current user name for accounts - $join_cond['user'] = Revision::userJoinCond(); - - $options = []; - if ( $index ) { - $options['USE INDEX'] = [ 'revision' => $index ]; - } - - $queryInfo = [ - 'tables' => $tables, - 'fields' => array_merge( - Revision::selectFields(), - Revision::selectUserFields(), - [ 'page_namespace', 'page_title', 'page_is_new', - 'page_latest', 'page_is_redirect', 'page_len' ] - ), - 'conds' => $conds, - 'options' => $options, - 'join_conds' => $join_cond - ]; - - ChangeTags::modifyDisplayQuery( - $queryInfo['tables'], - $queryInfo['fields'], - $queryInfo['conds'], - $queryInfo['join_conds'], - $queryInfo['options'], - $this->tagFilter - ); - - Hooks::run( 'ContribsPager::getQueryInfo', [ &$this, &$queryInfo ] ); - - return $queryInfo; - } - - function getUserCond() { - $condition = []; - $join_conds = []; - $tables = [ 'revision', 'page', 'user' ]; - $index = false; - if ( $this->contribs == 'newbie' ) { - $max = $this->mDb->selectField( 'user', 'max(user_id)', false, __METHOD__ ); - $condition[] = 'rev_user >' . (int)( $max - $max / 100 ); - # ignore local groups with the bot right - # @todo FIXME: Global groups may have 'bot' rights - $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' ); - if ( count( $groupsWithBotPermission ) ) { - $tables[] = 'user_groups'; - $condition[] = 'ug_group IS NULL'; - $join_conds['user_groups'] = [ - 'LEFT JOIN', [ - 'ug_user = rev_user', - 'ug_group' => $groupsWithBotPermission - ] - ]; - } - } else { - $uid = User::idFromName( $this->target ); - if ( $uid ) { - $condition['rev_user'] = $uid; - $index = 'user_timestamp'; - } else { - $condition['rev_user_text'] = $this->target; - $index = 'usertext_timestamp'; - } - } - - if ( $this->deletedOnly ) { - $condition[] = 'rev_deleted != 0'; - } - - if ( $this->topOnly ) { - $condition[] = 'rev_id = page_latest'; - } - - if ( $this->newOnly ) { - $condition[] = 'rev_parent_id = 0'; - } - - return [ $tables, $index, $condition, $join_conds ]; - } - - function getNamespaceCond() { - if ( $this->namespace !== '' ) { - $selectedNS = $this->mDb->addQuotes( $this->namespace ); - $eq_op = $this->nsInvert ? '!=' : '='; - $bool_op = $this->nsInvert ? 'AND' : 'OR'; - - if ( !$this->associated ) { - return [ "page_namespace $eq_op $selectedNS" ]; - } - - $associatedNS = $this->mDb->addQuotes( - MWNamespace::getAssociated( $this->namespace ) - ); - - return [ - "page_namespace $eq_op $selectedNS " . - $bool_op . - " page_namespace $eq_op $associatedNS" - ]; - } - - return []; - } - - function getIndexField() { - return 'rev_timestamp'; - } - - function doBatchLookups() { - # Do a link batch query - $this->mResult->seek( 0 ); - $parentRevIds = []; - $this->mParentLens = []; - $batch = new LinkBatch(); - # Give some pointers to make (last) links - foreach ( $this->mResult as $row ) { - if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) { - $parentRevIds[] = $row->rev_parent_id; - } - if ( isset( $row->rev_id ) ) { - $this->mParentLens[$row->rev_id] = $row->rev_len; - if ( $this->contribs === 'newbie' ) { // multiple users - $batch->add( NS_USER, $row->user_name ); - $batch->add( NS_USER_TALK, $row->user_name ); - } - $batch->add( $row->page_namespace, $row->page_title ); - } - } - # Fetch rev_len for revisions not already scanned above - $this->mParentLens += Revision::getParentLengths( - $this->mDbSecondary, - array_diff( $parentRevIds, array_keys( $this->mParentLens ) ) - ); - $batch->execute(); - $this->mResult->seek( 0 ); - } - - /** - * @return string - */ - function getStartBody() { - return "\n"; - } - - /** - * Generates each row in the contributions list. - * - * Contributions which are marked "top" are currently on top of the history. - * For these contributions, a [rollback] link is shown for users with roll- - * back privileges. The rollback link restores the most recent version that - * was not written by the target user. - * - * @todo This would probably look a lot nicer in a table. - * @param object $row - * @return string - */ - function formatRow( $row ) { - - $ret = ''; - $classes = []; - - /* - * There may be more than just revision rows. To make sure that we'll only be processing - * revisions here, let's _try_ to build a revision out of our row (without displaying - * notices though) and then trying to grab data from the built object. If we succeed, - * we're definitely dealing with revision data and we may proceed, if not, we'll leave it - * to extensions to subscribe to the hook to parse the row. - */ - MediaWiki\suppressWarnings(); - try { - $rev = new Revision( $row ); - $validRevision = (bool)$rev->getId(); - } catch ( Exception $e ) { - $validRevision = false; - } - MediaWiki\restoreWarnings(); - - if ( $validRevision ) { - $classes = []; - - $page = Title::newFromRow( $row ); - $link = Linker::link( - $page, - htmlspecialchars( $page->getPrefixedText() ), - [ 'class' => 'mw-contributions-title' ], - $page->isRedirect() ? [ 'redirect' => 'no' ] : [] - ); - # Mark current revisions - $topmarktext = ''; - $user = $this->getUser(); - if ( $row->rev_id == $row->page_latest ) { - $topmarktext .= '' . $this->messages['uctop'] . ''; - # Add rollback link - if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user ) - && $page->quickUserCan( 'edit', $user ) - ) { - $this->preventClickjacking(); - $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() ); - } - } - # Is there a visible previous revision? - if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) { - $difftext = Linker::linkKnown( - $page, - $this->messages['diff'], - [], - [ - 'diff' => 'prev', - 'oldid' => $row->rev_id - ] - ); - } else { - $difftext = $this->messages['diff']; - } - $histlink = Linker::linkKnown( - $page, - $this->messages['hist'], - [], - [ 'action' => 'history' ] - ); - - if ( $row->rev_parent_id === null ) { - // For some reason rev_parent_id isn't populated for this row. - // Its rumoured this is true on wikipedia for some revisions (bug 34922). - // Next best thing is to have the total number of bytes. - $chardiff = ' . . '; - $chardiff .= Linker::formatRevisionSize( $row->rev_len ); - $chardiff .= ' . . '; - } else { - $parentLen = 0; - if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) { - $parentLen = $this->mParentLens[$row->rev_parent_id]; - } - - $chardiff = ' . . '; - $chardiff .= ChangesList::showCharacterDifference( - $parentLen, - $row->rev_len, - $this->getContext() - ); - $chardiff .= ' . . '; - } - - $lang = $this->getLanguage(); - $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true ); - $date = $lang->userTimeAndDate( $row->rev_timestamp, $user ); - if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) { - $d = Linker::linkKnown( - $page, - htmlspecialchars( $date ), - [ 'class' => 'mw-changeslist-date' ], - [ 'oldid' => intval( $row->rev_id ) ] - ); - } else { - $d = htmlspecialchars( $date ); - } - if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { - $d = '' . $d . ''; - } - - # Show user names for /newbies as there may be different users. - # Note that we already excluded rows with hidden user names. - if ( $this->contribs == 'newbie' ) { - $userlink = ' . . ' . $lang->getDirMark() - . Linker::userLink( $rev->getUser(), $rev->getUserText() ); - $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams( - Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; - } else { - $userlink = ''; - } - - if ( $rev->getParentId() === 0 ) { - $nflag = ChangesList::flag( 'newpage' ); - } else { - $nflag = ''; - } - - if ( $rev->isMinor() ) { - $mflag = ChangesList::flag( 'minor' ); - } else { - $mflag = ''; - } - - $del = Linker::getRevDeleteLink( $user, $rev, $page ); - if ( $del !== '' ) { - $del .= ' '; - } - - $diffHistLinks = $this->msg( 'parentheses' ) - ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink ) - ->escaped(); - $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} "; - $ret .= "{$link}{$userlink} {$comment} {$topmarktext}"; - - # Denote if username is redacted for this edit - if ( $rev->isDeleted( Revision::DELETED_USER ) ) { - $ret .= " " . - $this->msg( 'rev-deleted-user-contribs' )->escaped() . - ""; - } - - # Tags, if any. - list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( - $row->ts_tags, - 'contributions', - $this->getContext() - ); - $classes = array_merge( $classes, $newClasses ); - $ret .= " $tagSummary"; - } - - // Let extensions add data - Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); - - if ( $classes === [] && $ret === '' ) { - wfDebug( "Dropping Special:Contribution row that could not be formatted\n" ); - $ret = "\n"; - } else { - $ret = Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; - } - - return $ret; - } - - /** - * Overwrite Pager function and return a helpful comment - * @return string - */ - function getSqlComment() { - if ( $this->namespace || $this->deletedOnly ) { - // potentially slow, see CR r58153 - return 'contributions page filtered for namespace or RevisionDeleted edits'; - } else { - return 'contributions page unfiltered'; - } - } - - protected function preventClickjacking() { - $this->preventClickjacking = true; - } - - /** - * @return bool - */ - public function getPreventClickjacking() { - return $this->preventClickjacking; - } -} diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php index b790fdf5a8..190bf9f981 100644 --- a/includes/specials/SpecialDeletedContributions.php +++ b/includes/specials/SpecialDeletedContributions.php @@ -25,337 +25,6 @@ * Implements Special:DeletedContributions to display archived revisions * @ingroup SpecialPage */ -class DeletedContribsPager extends IndexPager { - public $mDefaultDirection = IndexPager::DIR_DESCENDING; - public $messages; - public $target; - public $namespace = ''; - public $mDb; - - /** - * @var string Navigation bar with paging links. - */ - protected $mNavigationBar; - - function __construct( IContextSource $context, $target, $namespace = false ) { - parent::__construct( $context ); - $msgs = [ 'deletionlog', 'undeleteviewlink', 'diff' ]; - foreach ( $msgs as $msg ) { - $this->messages[$msg] = $this->msg( $msg )->escaped(); - } - $this->target = $target; - $this->namespace = $namespace; - $this->mDb = wfGetDB( DB_SLAVE, 'contributions' ); - } - - function getDefaultQuery() { - $query = parent::getDefaultQuery(); - $query['target'] = $this->target; - - return $query; - } - - function getQueryInfo() { - list( $index, $userCond ) = $this->getUserCond(); - $conds = array_merge( $userCond, $this->getNamespaceCond() ); - $user = $this->getUser(); - // Paranoia: avoid brute force searches (bug 17792) - if ( !$user->isAllowed( 'deletedhistory' ) ) { - $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0'; - } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { - $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) . - ' != ' . Revision::SUPPRESSED_USER; - } - - return [ - 'tables' => [ 'archive' ], - 'fields' => [ - 'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', - 'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted' - ], - 'conds' => $conds, - 'options' => [ 'USE INDEX' => $index ] - ]; - } - - /** - * This method basically executes the exact same code as the parent class, though with - * a hook added, to allow extensions to add additional queries. - * - * @param string $offset Index offset, inclusive - * @param int $limit Exact query limit - * @param bool $descending Query direction, false for ascending, true for descending - * @return ResultWrapper - */ - function reallyDoQuery( $offset, $limit, $descending ) { - $data = [ parent::reallyDoQuery( $offset, $limit, $descending ) ]; - - // This hook will allow extensions to add in additional queries, nearly - // identical to ContribsPager::reallyDoQuery. - Hooks::run( - 'DeletedContribsPager::reallyDoQuery', - [ &$data, $this, $offset, $limit, $descending ] - ); - - $result = []; - - // loop all results and collect them in an array - foreach ( $data as $query ) { - foreach ( $query as $i => $row ) { - // use index column as key, allowing us to easily sort in PHP - $result[$row->{$this->getIndexField()} . "-$i"] = $row; - } - } - - // sort results - if ( $descending ) { - ksort( $result ); - } else { - krsort( $result ); - } - - // enforce limit - $result = array_slice( $result, 0, $limit ); - - // get rid of array keys - $result = array_values( $result ); - - return new FakeResultWrapper( $result ); - } - - function getUserCond() { - $condition = []; - - $condition['ar_user_text'] = $this->target; - $index = 'usertext_timestamp'; - - return [ $index, $condition ]; - } - - function getIndexField() { - return 'ar_timestamp'; - } - - function getStartBody() { - return "\n"; - } - - function getNavigationBar() { - if ( isset( $this->mNavigationBar ) ) { - return $this->mNavigationBar; - } - - $linkTexts = [ - 'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(), - 'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(), - 'first' => $this->msg( 'histlast' )->escaped(), - 'last' => $this->msg( 'histfirst' )->escaped() - ]; - - $pagingLinks = $this->getPagingLinks( $linkTexts ); - $limitLinks = $this->getLimitLinks(); - $lang = $this->getLanguage(); - $limits = $lang->pipeList( $limitLinks ); - - $firstLast = $lang->pipeList( [ $pagingLinks['first'], $pagingLinks['last'] ] ); - $firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped(); - $prevNext = $this->msg( 'viewprevnext' ) - ->rawParams( - $pagingLinks['prev'], - $pagingLinks['next'], - $limits - )->escaped(); - $separator = $this->msg( 'word-separator' )->escaped(); - $this->mNavigationBar = $firstLast . $separator . $prevNext; - - return $this->mNavigationBar; - } - - function getNamespaceCond() { - if ( $this->namespace !== '' ) { - return [ 'ar_namespace' => (int)$this->namespace ]; - } else { - return []; - } - } - - /** - * Generates each row in the contributions list. - * - * @todo This would probably look a lot nicer in a table. - * @param stdClass $row - * @return string - */ - function formatRow( $row ) { - $ret = ''; - $classes = []; - - /* - * There may be more than just revision rows. To make sure that we'll only be processing - * revisions here, let's _try_ to build a revision out of our row (without displaying - * notices though) and then trying to grab data from the built object. If we succeed, - * we're definitely dealing with revision data and we may proceed, if not, we'll leave it - * to extensions to subscribe to the hook to parse the row. - */ - MediaWiki\suppressWarnings(); - try { - $rev = Revision::newFromArchiveRow( $row ); - $validRevision = (bool)$rev->getId(); - } catch ( Exception $e ) { - $validRevision = false; - } - MediaWiki\restoreWarnings(); - - if ( $validRevision ) { - $ret = $this->formatRevisionRow( $row ); - } - - // Let extensions add data - Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); - - if ( $classes === [] && $ret === '' ) { - wfDebug( "Dropping Special:DeletedContribution row that could not be formatted\n" ); - $ret = "\n"; - } else { - $ret = Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; - } - - return $ret; - } - - /** - * Generates each row in the contributions list for archive entries. - * - * Contributions which are marked "top" are currently on top of the history. - * For these contributions, a [rollback] link is shown for users with sysop - * privileges. The rollback link restores the most recent version that was not - * written by the target user. - * - * @todo This would probably look a lot nicer in a table. - * @param stdClass $row - * @return string - */ - function formatRevisionRow( $row ) { - $page = Title::makeTitle( $row->ar_namespace, $row->ar_title ); - - $rev = new Revision( [ - 'title' => $page, - 'id' => $row->ar_rev_id, - 'comment' => $row->ar_comment, - 'user' => $row->ar_user, - 'user_text' => $row->ar_user_text, - 'timestamp' => $row->ar_timestamp, - 'minor_edit' => $row->ar_minor_edit, - 'deleted' => $row->ar_deleted, - ] ); - - $undelete = SpecialPage::getTitleFor( 'Undelete' ); - - $logs = SpecialPage::getTitleFor( 'Log' ); - $dellog = Linker::linkKnown( - $logs, - $this->messages['deletionlog'], - [], - [ - 'type' => 'delete', - 'page' => $page->getPrefixedText() - ] - ); - - $reviewlink = Linker::linkKnown( - SpecialPage::getTitleFor( 'Undelete', $page->getPrefixedDBkey() ), - $this->messages['undeleteviewlink'] - ); - - $user = $this->getUser(); - - if ( $user->isAllowed( 'deletedtext' ) ) { - $last = Linker::linkKnown( - $undelete, - $this->messages['diff'], - [], - [ - 'target' => $page->getPrefixedText(), - 'timestamp' => $rev->getTimestamp(), - 'diff' => 'prev' - ] - ); - } else { - $last = $this->messages['diff']; - } - - $comment = Linker::revComment( $rev ); - $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ); - $date = htmlspecialchars( $date ); - - if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) { - $link = $date; // unusable link - } else { - $link = Linker::linkKnown( - $undelete, - $date, - [ 'class' => 'mw-changeslist-date' ], - [ - 'target' => $page->getPrefixedText(), - 'timestamp' => $rev->getTimestamp() - ] - ); - } - // Style deleted items - if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { - $link = '' . $link . ''; - } - - $pagelink = Linker::link( - $page, - null, - [ 'class' => 'mw-changeslist-title' ] - ); - - if ( $rev->isMinor() ) { - $mflag = ChangesList::flag( 'minor' ); - } else { - $mflag = ''; - } - - // Revision delete link - $del = Linker::getRevDeleteLink( $user, $rev, $page ); - if ( $del ) { - $del .= ' '; - } - - $tools = Html::rawElement( - 'span', - [ 'class' => 'mw-deletedcontribs-tools' ], - $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( - [ $last, $dellog, $reviewlink ] ) )->escaped() - ); - - $separator = '. .'; - $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}"; - - # Denote if username is redacted for this edit - if ( $rev->isDeleted( Revision::DELETED_USER ) ) { - $ret .= " " . $this->msg( 'rev-deleted-user-contribs' )->escaped() . ""; - } - - return $ret; - } - - /** - * Get the Database object in use - * - * @return IDatabase - */ - public function getDatabase() { - return $this->mDb; - } -} - class DeletedContributionsPage extends SpecialPage { function __construct() { parent::__construct( 'DeletedContributions', 'deletedhistory', @@ -470,7 +139,7 @@ class DeletedContributionsPage extends SpecialPage { } $links = ''; $nt = $userObj->getUserPage(); - $id = $userObj->getID(); + $id = $userObj->getId(); $talk = $nt->getTalkPage(); if ( $talk ) { # Talk page link diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php index e76988dd7d..c1abd6ecbf 100644 --- a/includes/specials/SpecialEditWatchlist.php +++ b/includes/specials/SpecialEditWatchlist.php @@ -49,10 +49,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { private $badItems = []; + /** + * @var TitleParser + */ + private $titleParser; + public function __construct() { parent::__construct( 'EditWatchlist', 'editmywatchlist' ); } + /** + * Initialize any services we'll need (unless it has already been provided via a setter). + * This allows for dependency injection even though we don't control object creation. + */ + private function initServices() { + if ( !$this->titleParser ) { + $lang = $this->getContext()->getLanguage(); + $this->titleParser = new MediaWikiTitleCodec( $lang, GenderCache::singleton() ); + } + } + public function doesWrites() { return true; } @@ -63,6 +79,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { * @param int $mode */ public function execute( $mode ) { + $this->initServices(); $this->setHeaders(); # Anons don't get a watchlist @@ -307,32 +324,25 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { private function getWatchlist() { $list = []; - $index = $this->getRequest()->wasPosted() ? DB_MASTER : DB_SLAVE; - $dbr = wfGetDB( $index ); - - $res = $dbr->select( - 'watchlist', - [ - 'wl_namespace', 'wl_title' - ], [ - 'wl_user' => $this->getUser()->getId(), - ], - __METHOD__ + $watchedItems = WatchedItemStore::getDefaultInstance()->getWatchedItemsForUser( + $this->getUser(), + [ 'forWrite' => $this->getRequest()->wasPosted() ] ); - if ( $res->numRows() > 0 ) { + if ( $watchedItems ) { /** @var Title[] $titles */ $titles = []; - foreach ( $res as $row ) { - $title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title ); + foreach ( $watchedItems as $watchedItem ) { + $namespace = $watchedItem->getLinkTarget()->getNamespace(); + $dbKey = $watchedItem->getLinkTarget()->getDBkey(); + $title = Title::makeTitleSafe( $namespace, $dbKey ); - if ( $this->checkTitle( $title, $row->wl_namespace, $row->wl_title ) + if ( $this->checkTitle( $title, $namespace, $dbKey ) && !$title->isTalkPage() ) { $titles[] = $title; } } - $res->free(); GenderCache::singleton()->doTitlesArray( $titles ); @@ -354,22 +364,18 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { */ protected function getWatchlistInfo() { $titles = []; - $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( - [ 'watchlist' ], - [ 'wl_namespace', 'wl_title' ], - [ 'wl_user' => $this->getUser()->getId() ], - __METHOD__, - [ 'ORDER BY' => [ 'wl_namespace', 'wl_title' ] ] - ); + $watchedItems = WatchedItemStore::getDefaultInstance() + ->getWatchedItemsForUser( $this->getUser(), [ 'sort' => WatchedItemStore::SORT_ASC ] ); $lb = new LinkBatch(); - foreach ( $res as $row ) { - $lb->add( $row->wl_namespace, $row->wl_title ); - if ( !MWNamespace::isTalk( $row->wl_namespace ) ) { - $titles[$row->wl_namespace][$row->wl_title] = 1; + foreach ( $watchedItems as $watchedItem ) { + $namespace = $watchedItem->getLinkTarget()->getNamespace(); + $dbKey = $watchedItem->getLinkTarget()->getDBkey(); + $lb->add( $namespace, $dbKey ); + if ( !MWNamespace::isTalk( $namespace ) ) { + $titles[$namespace][$dbKey] = 1; } } @@ -421,7 +427,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { $action = $title ? 'cleaning up' : 'deleting'; wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, $action.\n" ); - $store->removeWatch( $user, new TitleValue( $namespace, $dbKey ) ); + $store->removeWatch( $user, new TitleValue( (int)$namespace, $dbKey ) ); // Can't just do an UPDATE instead of DELETE/INSERT due to unique index if ( $title ) { @@ -443,39 +449,32 @@ class SpecialEditWatchlist extends UnlistedSpecialPage { } /** - * Add a list of titles to a user's watchlist - * - * $titles can be an array of strings or Title objects; the former - * is preferred, since Titles are very memory-heavy + * Add a list of targets to a user's watchlist * - * @param array $titles Array of strings, or Title objects + * @param string[]|LinkTarget[] $targets */ - private function watchTitles( $titles ) { - $dbw = wfGetDB( DB_MASTER ); - $rows = []; - - foreach ( $titles as $title ) { - if ( !$title instanceof Title ) { - $title = Title::newFromText( $title ); + private function watchTitles( $targets ) { + $expandedTargets = []; + foreach ( $targets as $target ) { + if ( !$target instanceof LinkTarget ) { + try { + $target = $this->titleParser->parseTitle( $target, NS_MAIN ); + } + catch ( MalformedTitleException $e ) { + continue; + } } - if ( $title instanceof Title ) { - $rows[] = [ - 'wl_user' => $this->getUser()->getId(), - 'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ), - 'wl_title' => $title->getDBkey(), - 'wl_notificationtimestamp' => null, - ]; - $rows[] = [ - 'wl_user' => $this->getUser()->getId(), - 'wl_namespace' => MWNamespace::getTalk( $title->getNamespace() ), - 'wl_title' => $title->getDBkey(), - 'wl_notificationtimestamp' => null, - ]; - } + $ns = $target->getNamespace(); + $dbKey = $target->getDBkey(); + $expandedTargets[] = new TitleValue( MWNamespace::getSubject( $ns ), $dbKey ); + $expandedTargets[] = new TitleValue( MWNamespace::getTalk( $ns ), $dbKey ); } - $dbw->insert( 'watchlist', $rows, __METHOD__, 'IGNORE' ); + WatchedItemStore::getDefaultInstance()->addWatchBatchForUser( + $this->getUser(), + $expandedTargets + ); } /** diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php index 3528be0dc0..fb1943fb1e 100644 --- a/includes/specials/SpecialEmailuser.php +++ b/includes/specials/SpecialEmailuser.php @@ -154,6 +154,10 @@ class SpecialEmailUser extends UnlistedSpecialPage { $this->mTargetObj = $ret; + // Set the 'relevant user' in the skin, so it displays links like Contributions, + // User logs, UserRights, etc. + $this->getSkin()->setRelevantUser( $this->mTargetObj ); + $context = new DerivativeContext( $this->getContext() ); $context->setTitle( $this->getPageTitle() ); // Remove subpage $form = new HTMLForm( $this->getFormFields(), $context ); diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php index 7f3eff7317..68960d3aad 100644 --- a/includes/specials/SpecialFileDuplicateSearch.php +++ b/includes/specials/SpecialFileDuplicateSearch.php @@ -122,7 +122,7 @@ class FileDuplicateSearchPage extends QueryPage { ], ]; $hiddenFields = [ - 'title' => $this->getPageTitle()->getPrefixedDBKey(), + 'title' => $this->getPageTitle()->getPrefixedDBkey(), ]; $htmlForm = HTMLForm::factory( 'inline', $formFields, $this->getContext() ); $htmlForm->addHiddenFields( $hiddenFields ); diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php index e20382cba0..37dba53774 100644 --- a/includes/specials/SpecialJavaScriptTest.php +++ b/includes/specials/SpecialJavaScriptTest.php @@ -168,12 +168,12 @@ class SpecialJavaScriptTest extends SpecialPage {
HTML; - $out->addHtml( $this->getSummaryHtml() . $baseHtml ); + $out->addHTML( $this->getSummaryHtml() . $baseHtml ); // The testrunner configures QUnit and essentially depends on it. However, test suites // are reusable in environments that preload QUnit (or a compatibility interface to // another framework). Therefore we have to load it ourselves. - $out->addHtml( ResourceLoader::makeInlineScript( + $out->addHTML( ResourceLoader::makeInlineScript( Xml::encodeJsCall( 'mw.loader.using', [ [ 'jquery.qunit', 'jquery.qunit.completenessTest' ], new XmlJsCode( diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php index 16471feb71..e6e1048cd6 100644 --- a/includes/specials/SpecialListfiles.php +++ b/includes/specials/SpecialListfiles.php @@ -52,6 +52,8 @@ class SpecialListFiles extends IncludableSpecialPage { if ( $this->including() ) { $out->addParserOutputContent( $pager->getBodyOutput() ); } else { + $user = $pager->getRelevantUser(); + $this->getSkin()->setRelevantUser( $user ); $pager->getForm(); $out->addParserOutputContent( $pager->getFullOutput() ); } @@ -79,555 +81,3 @@ class SpecialListFiles extends IncludableSpecialPage { return 'media'; } } - -/** - * @ingroup SpecialPage Pager - */ -class ImageListPager extends TablePager { - protected $mFieldNames = null; - - // Subclasses should override buildQueryConds instead of using $mQueryConds variable. - protected $mQueryConds = []; - - protected $mUserName = null; - - protected $mSearch = ''; - - protected $mIncluding = false; - - protected $mShowAll = false; - - protected $mTableName = 'image'; - - function __construct( IContextSource $context, $userName = null, $search = '', - $including = false, $showAll = false - ) { - $this->setContext( $context ); - $this->mIncluding = $including; - $this->mShowAll = $showAll; - - if ( $userName !== null && $userName !== '' ) { - $nt = Title::newFromText( $userName, NS_USER ); - $user = User::newFromName( $userName, false ); - if ( !is_null( $nt ) ) { - $this->mUserName = $nt->getText(); - } - if ( !$user || ( $user->isAnon() && !User::isIP( $user->getName() ) ) ) { - $this->getOutput()->wrapWikiMsg( - "
\n$1\n
", - [ - 'listfiles-userdoesnotexist', - wfEscapeWikiText( $userName ), - ] - ); - } - - } - - if ( $search !== '' && !$this->getConfig()->get( 'MiserMode' ) ) { - $this->mSearch = $search; - $nt = Title::newFromText( $this->mSearch ); - - if ( $nt ) { - $dbr = wfGetDB( DB_SLAVE ); - $this->mQueryConds[] = 'LOWER(img_name)' . - $dbr->buildLike( $dbr->anyString(), - strtolower( $nt->getDBkey() ), $dbr->anyString() ); - } - } - - if ( !$including ) { - if ( $this->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) { - $this->mDefaultDirection = IndexPager::DIR_DESCENDING; - } else { - $this->mDefaultDirection = IndexPager::DIR_ASCENDING; - } - } else { - $this->mDefaultDirection = IndexPager::DIR_DESCENDING; - } - - parent::__construct( $context ); - } - - /** - * Build the where clause of the query. - * - * Replaces the older mQueryConds member variable. - * @param string $table Either "image" or "oldimage" - * @return array The query conditions. - */ - protected function buildQueryConds( $table ) { - $prefix = $table === 'image' ? 'img' : 'oi'; - $conds = []; - - if ( !is_null( $this->mUserName ) ) { - $conds[$prefix . '_user_text'] = $this->mUserName; - } - - if ( $this->mSearch !== '' ) { - $nt = Title::newFromText( $this->mSearch ); - if ( $nt ) { - $dbr = wfGetDB( DB_SLAVE ); - $conds[] = 'LOWER(' . $prefix . '_name)' . - $dbr->buildLike( $dbr->anyString(), - strtolower( $nt->getDBkey() ), $dbr->anyString() ); - } - } - - if ( $table === 'oldimage' ) { - // Don't want to deal with revdel. - // Future fixme: Show partial information as appropriate. - // Would have to be careful about filtering by username when username is deleted. - $conds['oi_deleted'] = 0; - } - - // Add mQueryConds in case anyone was subclassing and using the old variable. - return $conds + $this->mQueryConds; - } - - /** - * @return array - */ - function getFieldNames() { - if ( !$this->mFieldNames ) { - $this->mFieldNames = [ - 'img_timestamp' => $this->msg( 'listfiles_date' )->text(), - 'img_name' => $this->msg( 'listfiles_name' )->text(), - 'thumb' => $this->msg( 'listfiles_thumb' )->text(), - 'img_size' => $this->msg( 'listfiles_size' )->text(), - ]; - if ( is_null( $this->mUserName ) ) { - // Do not show username if filtering by username - $this->mFieldNames['img_user_text'] = $this->msg( 'listfiles_user' )->text(); - } - // img_description down here, in order so that its still after the username field. - $this->mFieldNames['img_description'] = $this->msg( 'listfiles_description' )->text(); - - if ( !$this->getConfig()->get( 'MiserMode' ) && !$this->mShowAll ) { - $this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text(); - } - if ( $this->mShowAll ) { - $this->mFieldNames['top'] = $this->msg( 'listfiles-latestversion' )->text(); - } - } - - return $this->mFieldNames; - } - - function isFieldSortable( $field ) { - if ( $this->mIncluding ) { - return false; - } - $sortable = [ 'img_timestamp', 'img_name', 'img_size' ]; - /* For reference, the indicies we can use for sorting are: - * On the image table: img_usertext_timestamp, img_size, img_timestamp - * On oldimage: oi_usertext_timestamp, oi_name_timestamp - * - * In particular that means we cannot sort by timestamp when not filtering - * by user and including old images in the results. Which is sad. - */ - if ( $this->getConfig()->get( 'MiserMode' ) && !is_null( $this->mUserName ) ) { - // If we're sorting by user, the index only supports sorting by time. - if ( $field === 'img_timestamp' ) { - return true; - } else { - return false; - } - } elseif ( $this->getConfig()->get( 'MiserMode' ) - && $this->mShowAll /* && mUserName === null */ - ) { - // no oi_timestamp index, so only alphabetical sorting in this case. - if ( $field === 'img_name' ) { - return true; - } else { - return false; - } - } - - return in_array( $field, $sortable ); - } - - function getQueryInfo() { - // Hacky Hacky Hacky - I want to get query info - // for two different tables, without reimplementing - // the pager class. - $qi = $this->getQueryInfoReal( $this->mTableName ); - - return $qi; - } - - /** - * Actually get the query info. - * - * This is to allow displaying both stuff from image and oldimage table. - * - * This is a bit hacky. - * - * @param string $table Either 'image' or 'oldimage' - * @return array Query info - */ - protected function getQueryInfoReal( $table ) { - $prefix = $table === 'oldimage' ? 'oi' : 'img'; - - $tables = [ $table ]; - $fields = array_keys( $this->getFieldNames() ); - - if ( $table === 'oldimage' ) { - foreach ( $fields as $id => &$field ) { - if ( substr( $field, 0, 4 ) !== 'img_' ) { - continue; - } - $field = $prefix . substr( $field, 3 ) . ' AS ' . $field; - } - $fields[array_search( 'top', $fields )] = "'no' AS top"; - } else { - if ( $this->mShowAll ) { - $fields[array_search( 'top', $fields )] = "'yes' AS top"; - } - } - $fields[] = $prefix . '_user AS img_user'; - $fields[array_search( 'thumb', $fields )] = $prefix . '_name AS thumb'; - - $options = $join_conds = []; - - # Depends on $wgMiserMode - # Will also not happen if mShowAll is true. - if ( isset( $this->mFieldNames['count'] ) ) { - $tables[] = 'oldimage'; - - # Need to rewrite this one - foreach ( $fields as &$field ) { - if ( $field == 'count' ) { - $field = 'COUNT(oi_archive_name) AS count'; - } - } - unset( $field ); - - $dbr = wfGetDB( DB_SLAVE ); - if ( $dbr->implicitGroupby() ) { - $options = [ 'GROUP BY' => 'img_name' ]; - } else { - $columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) ); - $options = [ 'GROUP BY' => array_merge( [ 'img_user' ], $columnlist ) ]; - } - $join_conds = [ 'oldimage' => [ 'LEFT JOIN', 'oi_name = img_name' ] ]; - } - - return [ - 'tables' => $tables, - 'fields' => $fields, - 'conds' => $this->buildQueryConds( $table ), - 'options' => $options, - 'join_conds' => $join_conds - ]; - } - - /** - * Override reallyDoQuery to mix together two queries. - * - * @note $asc is named $descending in IndexPager base class. However - * it is true when the order is ascending, and false when the order - * is descending, so I renamed it to $asc here. - * @param int $offset - * @param int $limit - * @param bool $asc - * @return array - * @throws MWException - */ - function reallyDoQuery( $offset, $limit, $asc ) { - $prevTableName = $this->mTableName; - $this->mTableName = 'image'; - list( $tables, $fields, $conds, $fname, $options, $join_conds ) = - $this->buildQueryInfo( $offset, $limit, $asc ); - $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ); - $this->mTableName = $prevTableName; - - if ( !$this->mShowAll ) { - return $imageRes; - } - - $this->mTableName = 'oldimage'; - - # Hacky... - $oldIndex = $this->mIndexField; - if ( substr( $this->mIndexField, 0, 4 ) !== 'img_' ) { - throw new MWException( "Expected to be sorting on an image table field" ); - } - $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 ); - - list( $tables, $fields, $conds, $fname, $options, $join_conds ) = - $this->buildQueryInfo( $offset, $limit, $asc ); - $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ); - - $this->mTableName = $prevTableName; - $this->mIndexField = $oldIndex; - - return $this->combineResult( $imageRes, $oldimageRes, $limit, $asc ); - } - - /** - * Combine results from 2 tables. - * - * Note: This will throw away some results - * - * @param ResultWrapper $res1 - * @param ResultWrapper $res2 - * @param int $limit - * @param bool $ascending See note about $asc in $this->reallyDoQuery - * @return FakeResultWrapper $res1 and $res2 combined - */ - protected function combineResult( $res1, $res2, $limit, $ascending ) { - $res1->rewind(); - $res2->rewind(); - $topRes1 = $res1->next(); - $topRes2 = $res2->next(); - $resultArray = []; - for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) { - if ( strcmp( $topRes1->{$this->mIndexField}, $topRes2->{$this->mIndexField} ) > 0 ) { - if ( !$ascending ) { - $resultArray[] = $topRes1; - $topRes1 = $res1->next(); - } else { - $resultArray[] = $topRes2; - $topRes2 = $res2->next(); - } - } else { - if ( !$ascending ) { - $resultArray[] = $topRes2; - $topRes2 = $res2->next(); - } else { - $resultArray[] = $topRes1; - $topRes1 = $res1->next(); - } - } - } - - // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect - for ( ; $i < $limit && $topRes1; $i++ ) { - // @codingStandardsIgnoreEnd - $resultArray[] = $topRes1; - $topRes1 = $res1->next(); - } - - // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect - for ( ; $i < $limit && $topRes2; $i++ ) { - // @codingStandardsIgnoreEnd - $resultArray[] = $topRes2; - $topRes2 = $res2->next(); - } - - return new FakeResultWrapper( $resultArray ); - } - - function getDefaultSort() { - if ( $this->mShowAll && $this->getConfig()->get( 'MiserMode' ) && is_null( $this->mUserName ) ) { - // Unfortunately no index on oi_timestamp. - return 'img_name'; - } else { - return 'img_timestamp'; - } - } - - function doBatchLookups() { - $userIds = []; - $this->mResult->seek( 0 ); - foreach ( $this->mResult as $row ) { - $userIds[] = $row->img_user; - } - # Do a link batch query for names and userpages - UserCache::singleton()->doQuery( $userIds, [ 'userpage' ], __METHOD__ ); - } - - /** - * @param string $field - * @param string $value - * @return Message|string|int The return type depends on the value of $field: - * - thumb: string - * - img_timestamp: string - * - img_name: string - * - img_user_text: string - * - img_size: string - * - img_description: string - * - count: int - * - top: Message - * @throws MWException - */ - function formatValue( $field, $value ) { - switch ( $field ) { - case 'thumb': - $opt = [ 'time' => wfTimestamp( TS_MW, $this->mCurrentRow->img_timestamp ) ]; - $file = RepoGroup::singleton()->getLocalRepo()->findFile( $value, $opt ); - // If statement for paranoia - if ( $file ) { - $thumb = $file->transform( [ 'width' => 180, 'height' => 360 ] ); - - return $thumb->toHtml( [ 'desc-link' => true ] ); - } else { - return htmlspecialchars( $value ); - } - case 'img_timestamp': - // We may want to make this a link to the "old" version when displaying old files - return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) ); - case 'img_name': - static $imgfile = null; - if ( $imgfile === null ) { - $imgfile = $this->msg( 'imgfile' )->text(); - } - - // Weird files can maybe exist? Bug 22227 - $filePage = Title::makeTitleSafe( NS_FILE, $value ); - if ( $filePage ) { - $link = Linker::linkKnown( - $filePage, - htmlspecialchars( $filePage->getText() ) - ); - $download = Xml::element( 'a', - [ 'href' => wfLocalFile( $filePage )->getURL() ], - $imgfile - ); - $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped(); - - // Add delete links if allowed - // From https://github.com/Wikia/app/pull/3859 - if ( $filePage->userCan( 'delete', $this->getUser() ) ) { - $deleteMsg = $this->msg( 'listfiles-delete' )->escaped(); - - $delete = Linker::linkKnown( - $filePage, $deleteMsg, [], [ 'action' => 'delete' ] - ); - $delete = $this->msg( 'parentheses' )->rawParams( $delete )->escaped(); - - return "$link $download $delete"; - } - - return "$link $download"; - } else { - return htmlspecialchars( $value ); - } - case 'img_user_text': - if ( $this->mCurrentRow->img_user ) { - $name = User::whoIs( $this->mCurrentRow->img_user ); - $link = Linker::link( - Title::makeTitle( NS_USER, $name ), - htmlspecialchars( $name ) - ); - } else { - $link = htmlspecialchars( $value ); - } - - return $link; - case 'img_size': - return htmlspecialchars( $this->getLanguage()->formatSize( $value ) ); - case 'img_description': - return Linker::formatComment( $value ); - case 'count': - return intval( $value ) + 1; - case 'top': - // Messages: listfiles-latestversion-yes, listfiles-latestversion-no - return $this->msg( 'listfiles-latestversion-' . $value ); - default: - throw new MWException( "Unknown field '$field'" ); - } - } - - function getForm() { - $fields = []; - $fields['limit'] = [ - 'type' => 'select', - 'name' => 'limit', - 'label-message' => 'table_pager_limit_label', - 'options' => $this->getLimitSelectList(), - 'default' => $this->mLimit, - ]; - - if ( !$this->getConfig()->get( 'MiserMode' ) ) { - $fields['ilsearch'] = [ - 'type' => 'text', - 'name' => 'ilsearch', - 'id' => 'mw-ilsearch', - 'label-message' => 'listfiles_search_for', - 'default' => $this->mSearch, - 'size' => '40', - 'maxlength' => '255', - ]; - } - - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - $fields['user'] = [ - 'type' => 'text', - 'name' => 'user', - 'id' => 'mw-listfiles-user', - 'label-message' => 'username', - 'default' => $this->mUserName, - 'size' => '40', - 'maxlength' => '255', - 'cssclass' => 'mw-autocomplete-user', // used by mediawiki.userSuggest - ]; - - $fields['ilshowall'] = [ - 'type' => 'check', - 'name' => 'ilshowall', - 'id' => 'mw-listfiles-show-all', - 'label-message' => 'listfiles-show-all', - 'default' => $this->mShowAll, - ]; - - $query = $this->getRequest()->getQueryValues(); - unset( $query['title'] ); - unset( $query['limit'] ); - unset( $query['ilsearch'] ); - unset( $query['ilshowall'] ); - unset( $query['user'] ); - - $form = new HTMLForm( $fields, $this->getContext() ); - - $form->setMethod( 'get' ); - $form->setTitle( $this->getTitle() ); - $form->setId( 'mw-listfiles-form' ); - $form->setWrapperLegendMsg( 'listfiles' ); - $form->setSubmitTextMsg( 'table_pager_limit_submit' ); - $form->addHiddenFields( $query ); - - $form->prepareForm(); - $form->displayForm( '' ); - } - - function getTableClass() { - return parent::getTableClass() . ' listfiles'; - } - - function getNavClass() { - return parent::getNavClass() . ' listfiles_nav'; - } - - function getSortHeaderClass() { - return parent::getSortHeaderClass() . ' listfiles_sort'; - } - - function getPagingQueries() { - $queries = parent::getPagingQueries(); - if ( !is_null( $this->mUserName ) ) { - # Append the username to the query string - foreach ( $queries as &$query ) { - if ( $query !== false ) { - $query['user'] = $this->mUserName; - } - } - } - - return $queries; - } - - function getDefaultQuery() { - $queries = parent::getDefaultQuery(); - if ( !isset( $queries['user'] ) && !is_null( $this->mUserName ) ) { - $queries['user'] = $this->mUserName; - } - - return $queries; - } - - function getTitle() { - return SpecialPage::getTitleFor( 'Listfiles' ); - } -} diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php index da31f009a2..1a8dccf4de 100644 --- a/includes/specials/SpecialListusers.php +++ b/includes/specials/SpecialListusers.php @@ -25,376 +25,6 @@ * @ingroup SpecialPage */ -/** - * This class is used to get a list of user. The ones with specials - * rights (sysop, bureaucrat, developer) will have them displayed - * next to their names. - * - * @ingroup SpecialPage - */ -class UsersPager extends AlphabeticPager { - - /** - * @var array A array with user ids as key and a array of groups as value - */ - protected $userGroupCache; - - /** - * @param IContextSource $context - * @param array $par (Default null) - * @param bool $including Whether this page is being transcluded in - * another page - */ - function __construct( IContextSource $context = null, $par = null, $including = null ) { - if ( $context ) { - $this->setContext( $context ); - } - - $request = $this->getRequest(); - $par = ( $par !== null ) ? $par : ''; - $parms = explode( '/', $par ); - $symsForAll = [ '*', 'user' ]; - - if ( $parms[0] != '' && - ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) - ) { - $this->requestedGroup = $par; - $un = $request->getText( 'username' ); - } elseif ( count( $parms ) == 2 ) { - $this->requestedGroup = $parms[0]; - $un = $parms[1]; - } else { - $this->requestedGroup = $request->getVal( 'group' ); - $un = ( $par != '' ) ? $par : $request->getText( 'username' ); - } - - if ( in_array( $this->requestedGroup, $symsForAll ) ) { - $this->requestedGroup = ''; - } - $this->editsOnly = $request->getBool( 'editsOnly' ); - $this->creationSort = $request->getBool( 'creationSort' ); - $this->including = $including; - $this->mDefaultDirection = $request->getBool( 'desc' ) - ? IndexPager::DIR_DESCENDING - : IndexPager::DIR_ASCENDING; - - $this->requestedUser = ''; - - if ( $un != '' ) { - $username = Title::makeTitleSafe( NS_USER, $un ); - - if ( !is_null( $username ) ) { - $this->requestedUser = $username->getText(); - } - } - - parent::__construct(); - } - - /** - * @return string - */ - function getIndexField() { - return $this->creationSort ? 'user_id' : 'user_name'; - } - - /** - * @return array - */ - function getQueryInfo() { - $dbr = wfGetDB( DB_SLAVE ); - $conds = []; - - // Don't show hidden names - if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { - $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; - } - - $options = []; - - if ( $this->requestedGroup != '' ) { - $conds['ug_group'] = $this->requestedGroup; - } - - if ( $this->requestedUser != '' ) { - # Sorted either by account creation or name - if ( $this->creationSort ) { - $conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) ); - } else { - $conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser ); - } - } - - if ( $this->editsOnly ) { - $conds[] = 'user_editcount > 0'; - } - - $options['GROUP BY'] = $this->creationSort ? 'user_id' : 'user_name'; - - $query = [ - 'tables' => [ 'user', 'user_groups', 'ipblocks' ], - 'fields' => [ - 'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name', - 'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)', - 'edits' => 'MAX(user_editcount)', - 'creation' => 'MIN(user_registration)', - 'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status - ], - 'options' => $options, - 'join_conds' => [ - 'user_groups' => [ 'LEFT JOIN', 'user_id=ug_user' ], - 'ipblocks' => [ - 'LEFT JOIN', [ - 'user_id=ipb_user', - 'ipb_auto' => 0 - ] - ], - ], - 'conds' => $conds - ]; - - Hooks::run( 'SpecialListusersQueryInfo', [ $this, &$query ] ); - - return $query; - } - - /** - * @param stdClass $row - * @return string - */ - function formatRow( $row ) { - if ( $row->user_id == 0 ) { # Bug 16487 - return ''; - } - - $userName = $row->user_name; - - $ulinks = Linker::userLink( $row->user_id, $userName ); - $ulinks .= Linker::userToolLinksRedContribs( - $row->user_id, - $userName, - (int)$row->edits - ); - - $lang = $this->getLanguage(); - - $groups = ''; - $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache ); - - if ( !$this->including && count( $groups_list ) > 0 ) { - $list = []; - foreach ( $groups_list as $group ) { - $list[] = self::buildGroupLink( $group, $userName ); - } - $groups = $lang->commaList( $list ); - } - - $item = $lang->specialList( $ulinks, $groups ); - - if ( $row->ipb_deleted ) { - $item = "$item"; - } - - $edits = ''; - if ( !$this->including && $this->getConfig()->get( 'Edititis' ) ) { - $count = $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped(); - $edits = $this->msg( 'word-separator' )->escaped() . $this->msg( 'brackets', $count )->escaped(); - } - - $created = ''; - # Some rows may be null - if ( !$this->including && $row->creation ) { - $user = $this->getUser(); - $d = $lang->userDate( $row->creation, $user ); - $t = $lang->userTime( $row->creation, $user ); - $created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped(); - $created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped(); - } - $blocked = !is_null( $row->ipb_deleted ) ? - ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : - ''; - - Hooks::run( 'SpecialListusersFormatRow', [ &$item, $row ] ); - - return Html::rawElement( 'li', [], "{$item}{$edits}{$created}{$blocked}" ); - } - - function doBatchLookups() { - $batch = new LinkBatch(); - $userIds = []; - # Give some pointers to make user links - foreach ( $this->mResult as $row ) { - $batch->add( NS_USER, $row->user_name ); - $batch->add( NS_USER_TALK, $row->user_name ); - $userIds[] = $row->user_id; - } - - // Lookup groups for all the users - $dbr = wfGetDB( DB_SLAVE ); - $groupRes = $dbr->select( - 'user_groups', - [ 'ug_user', 'ug_group' ], - [ 'ug_user' => $userIds ], - __METHOD__ - ); - $cache = []; - $groups = []; - foreach ( $groupRes as $row ) { - $cache[intval( $row->ug_user )][] = $row->ug_group; - $groups[$row->ug_group] = true; - } - $this->userGroupCache = $cache; - - // Add page of groups to link batch - foreach ( $groups as $group => $unused ) { - $groupPage = User::getGroupPage( $group ); - if ( $groupPage ) { - $batch->addObj( $groupPage ); - } - } - - $batch->execute(); - $this->mResult->rewind(); - } - - /** - * @return string - */ - function getPageHeader() { - list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() ); - - $this->getOutput()->addModules( 'mediawiki.userSuggest' ); - - # Form tag - $out = Xml::openElement( - 'form', - [ 'method' => 'get', 'action' => wfScript(), 'id' => 'mw-listusers-form' ] - ) . - Xml::fieldset( $this->msg( 'listusers' )->text() ) . - Html::hidden( 'title', $self ); - - # Username field (with autocompletion support) - $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' . - Html::input( - 'username', - $this->requestedUser, - 'text', - [ - 'class' => 'mw-autocomplete-user', - 'id' => 'offset', - 'size' => 20, - 'autofocus' => $this->requestedUser === '' - ] - ) . ' '; - - # Group drop-down list - $sel = new XmlSelect( 'group', 'group', $this->requestedGroup ); - $sel->addOption( $this->msg( 'group-all' )->text(), '' ); - foreach ( $this->getAllGroups() as $group => $groupText ) { - $sel->addOption( $groupText, $group ); - } - - $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' '; - $out .= $sel->getHTML() . '
'; - $out .= Xml::checkLabel( - $this->msg( 'listusers-editsonly' )->text(), - 'editsOnly', - 'editsOnly', - $this->editsOnly - ); - $out .= ' '; - $out .= Xml::checkLabel( - $this->msg( 'listusers-creationsort' )->text(), - 'creationSort', - 'creationSort', - $this->creationSort - ); - $out .= ' '; - $out .= Xml::checkLabel( - $this->msg( 'listusers-desc' )->text(), - 'desc', - 'desc', - $this->mDefaultDirection - ); - $out .= '
'; - - Hooks::run( 'SpecialListusersHeaderForm', [ $this, &$out ] ); - - # Submit button and form bottom - $out .= Html::hidden( 'limit', $this->mLimit ); - $out .= Xml::submitButton( $this->msg( 'listusers-submit' )->text() ); - Hooks::run( 'SpecialListusersHeader', [ $this, &$out ] ); - $out .= Xml::closeElement( 'fieldset' ) . - Xml::closeElement( 'form' ); - - return $out; - } - - /** - * Get a list of all explicit groups - * @return array - */ - function getAllGroups() { - $result = []; - foreach ( User::getAllGroups() as $group ) { - $result[$group] = User::getGroupName( $group ); - } - asort( $result ); - - return $result; - } - - /** - * Preserve group and username offset parameters when paging - * @return array - */ - function getDefaultQuery() { - $query = parent::getDefaultQuery(); - if ( $this->requestedGroup != '' ) { - $query['group'] = $this->requestedGroup; - } - if ( $this->requestedUser != '' ) { - $query['username'] = $this->requestedUser; - } - Hooks::run( 'SpecialListusersDefaultQuery', [ $this, &$query ] ); - - return $query; - } - - /** - * Get a list of groups the specified user belongs to - * - * @param int $uid User id - * @param array|null $cache - * @return array - */ - protected static function getGroups( $uid, $cache = null ) { - if ( $cache === null ) { - $user = User::newFromId( $uid ); - $effectiveGroups = $user->getEffectiveGroups(); - } else { - $effectiveGroups = isset( $cache[$uid] ) ? $cache[$uid] : []; - } - $groups = array_diff( $effectiveGroups, User::getImplicitGroups() ); - - return $groups; - } - - /** - * Format a link to a group description page - * - * @param string $group Group name - * @param string $username Username - * @return string - */ - protected static function buildGroupLink( $group, $username ) { - return User::makeGroupLinkHtml( - $group, - User::getGroupMember( $group, $username ) - ); - } -} - /** * @ingroup SpecialPage */ diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php index d4c7c6ad2b..7132207e24 100644 --- a/includes/specials/SpecialLog.php +++ b/includes/specials/SpecialLog.php @@ -49,6 +49,7 @@ class SpecialLog extends SpecialPage { $opts->add( 'offset', '' ); $opts->add( 'dir', '' ); $opts->add( 'offender', '' ); + $opts->add( 'subtype', '' ); // Set values $opts->fetchValuesFromRequest( $this->getRequest() ); @@ -167,6 +168,26 @@ class SpecialLog extends SpecialPage { null, LogEventsList::USE_CHECKBOXES ); + + $action = ''; + // Allow to filter the log by actions + $type = $opts->getValue( 'type' ); + if ( $type !== '' ) { + $actions = $this->getConfig()->get( 'ActionFilteredLogs' ); + if ( isset( $actions[$type] ) ) { + // log type can be filtered by actions + $loglist->setAllowedActions( array_keys( $actions[$type] ) ); + $action = $opts->getValue( 'subtype' ); + if ( $action !== '' && isset( $actions[$type][$action] ) ) { + // add condition to query + $extraConds['log_action'] = $actions[$type][$action]; + } else { + // no action or invalid action + $action = ''; + } + } + } + $pager = new LogPager( $loglist, $opts->getValue( 'type' ), @@ -195,7 +216,8 @@ class SpecialLog extends SpecialPage { $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), - $opts->getValue( 'tagfilter' ) + $opts->getValue( 'tagfilter' ), + $action ); # Insert list diff --git a/includes/specials/SpecialMediaStatistics.php b/includes/specials/SpecialMediaStatistics.php index ed12e047c7..8ba90a6a6a 100644 --- a/includes/specials/SpecialMediaStatistics.php +++ b/includes/specials/SpecialMediaStatistics.php @@ -154,7 +154,7 @@ class MediaStatisticsPage extends QueryPage { * Output closing */ protected function outputTableEnd() { - $this->getOutput()->addHtml( Html::closeElement( 'table' ) ); + $this->getOutput()->addHTML( Html::closeElement( 'table' ) ); $this->getOutput()->addWikiText( $this->msg( 'mediastatistics-bytespertype' ) ->numParams( $this->totalPerType ) diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php index 3310538a59..b916c1fc78 100644 --- a/includes/specials/SpecialMergeHistory.php +++ b/includes/specials/SpecialMergeHistory.php @@ -379,78 +379,3 @@ class SpecialMergeHistory extends SpecialPage { return 'pagetools'; } } - -class MergeHistoryPager extends ReverseChronologicalPager { - /** @var SpecialMergeHistory */ - public $mForm; - - /** @var array */ - public $mConds; - - function __construct( SpecialMergeHistory $form, $conds, Title $source, Title $dest ) { - $this->mForm = $form; - $this->mConds = $conds; - $this->title = $source; - $this->articleID = $source->getArticleID(); - - $dbr = wfGetDB( DB_SLAVE ); - $maxtimestamp = $dbr->selectField( - 'revision', - 'MIN(rev_timestamp)', - [ 'rev_page' => $dest->getArticleID() ], - __METHOD__ - ); - $this->maxTimestamp = $maxtimestamp; - - parent::__construct( $form->getContext() ); - } - - function getStartBody() { - # Do a link batch query - $this->mResult->seek( 0 ); - $batch = new LinkBatch(); - # Give some pointers to make (last) links - $this->mForm->prevId = []; - foreach ( $this->mResult as $row ) { - $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) ); - $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) ); - - $rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id; - if ( $rev_id > $row->rev_id ) { - $this->mForm->prevId[$rev_id] = $row->rev_id; - } elseif ( $rev_id < $row->rev_id ) { - $this->mForm->prevId[$row->rev_id] = $rev_id; - } - - $rev_id = $row->rev_id; - } - - $batch->execute(); - $this->mResult->seek( 0 ); - - return ''; - } - - function formatRow( $row ) { - return $this->mForm->formatRevisionRow( $row ); - } - - function getQueryInfo() { - $conds = $this->mConds; - $conds['rev_page'] = $this->articleID; - $conds[] = "rev_timestamp < " . $this->mDb->addQuotes( $this->maxTimestamp ); - - return [ - 'tables' => [ 'revision', 'page', 'user' ], - 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ), - 'conds' => $conds, - 'join_conds' => [ - 'page' => Revision::pageJoinCond(), - 'user' => Revision::userJoinCond() ] - ]; - } - - function getIndexField() { - return 'rev_timestamp'; - } -} diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php index 9e28908204..14391d2459 100644 --- a/includes/specials/SpecialNewimages.php +++ b/includes/specials/SpecialNewimages.php @@ -71,189 +71,3 @@ class SpecialNewFiles extends IncludableSpecialPage { } } } - -/** - * @ingroup SpecialPage Pager - */ -class NewFilesPager extends ReverseChronologicalPager { - /** - * @var ImageGallery - */ - protected $gallery; - - /** - * @var bool - */ - protected $showBots; - - /** - * @var bool - */ - protected $hidePatrolled; - - function __construct( IContextSource $context, $par = null ) { - $this->like = $context->getRequest()->getText( 'like' ); - $this->showBots = $context->getRequest()->getBool( 'showbots', 0 ); - $this->hidePatrolled = $context->getRequest()->getBool( 'hidepatrolled', 0 ); - if ( is_numeric( $par ) ) { - $this->setLimit( $par ); - } - - parent::__construct( $context ); - } - - function getQueryInfo() { - $conds = $jconds = []; - $tables = [ 'image' ]; - $fields = [ 'img_name', 'img_user', 'img_timestamp' ]; - $options = []; - - if ( !$this->showBots ) { - $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' ); - - if ( count( $groupsWithBotPermission ) ) { - $tables[] = 'user_groups'; - $conds[] = 'ug_group IS NULL'; - $jconds['user_groups'] = [ - 'LEFT JOIN', - [ - 'ug_group' => $groupsWithBotPermission, - 'ug_user = img_user' - ] - ]; - } - } - - if ( $this->hidePatrolled ) { - $tables[] = 'recentchanges'; - $conds['rc_type'] = RC_LOG; - $conds['rc_log_type'] = 'upload'; - $conds['rc_patrolled'] = 0; - $conds['rc_namespace'] = NS_FILE; - $jconds['recentchanges'] = [ - 'INNER JOIN', - [ - 'rc_title = img_name', - 'rc_user = img_user', - 'rc_timestamp = img_timestamp' - ] - ]; - // We're ordering by img_timestamp, so we have to make sure MariaDB queries `image` first. - // It sometimes decides to query `recentchanges` first and filesort the result set later - // to get the right ordering. T124205 / https://mariadb.atlassian.net/browse/MDEV-8880 - $options[] = 'STRAIGHT_JOIN'; - } - - if ( !$this->getConfig()->get( 'MiserMode' ) && $this->like !== null ) { - $dbr = wfGetDB( DB_SLAVE ); - $likeObj = Title::newFromText( $this->like ); - if ( $likeObj instanceof Title ) { - $like = $dbr->buildLike( - $dbr->anyString(), - strtolower( $likeObj->getDBkey() ), - $dbr->anyString() - ); - $conds[] = "LOWER(img_name) $like"; - } - } - - $query = [ - 'tables' => $tables, - 'fields' => $fields, - 'join_conds' => $jconds, - 'conds' => $conds, - 'options' => $options, - ]; - - return $query; - } - - function getIndexField() { - return 'img_timestamp'; - } - - function getStartBody() { - if ( !$this->gallery ) { - // Note that null for mode is taken to mean use default. - $mode = $this->getRequest()->getVal( 'gallerymode', null ); - try { - $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() ); - } catch ( Exception $e ) { - // User specified something invalid, fallback to default. - $this->gallery = ImageGalleryBase::factory( false, $this->getContext() ); - } - } - - return ''; - } - - function getEndBody() { - return $this->gallery->toHTML(); - } - - function formatRow( $row ) { - $name = $row->img_name; - $user = User::newFromId( $row->img_user ); - - $title = Title::makeTitle( NS_FILE, $name ); - $ul = Linker::link( $user->getUserpage(), $user->getName() ); - $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() ); - - $this->gallery->add( - $title, - "$ul
\n" - . htmlspecialchars( $time ) - . "
\n" - ); - } - - function getForm() { - $fields = [ - 'like' => [ - 'type' => 'text', - 'label-message' => 'newimages-label', - 'name' => 'like', - ], - 'showbots' => [ - 'type' => 'check', - 'label-message' => 'newimages-showbots', - 'name' => 'showbots', - ], - 'hidepatrolled' => [ - 'type' => 'check', - 'label-message' => 'newimages-hidepatrolled', - 'name' => 'hidepatrolled', - ], - 'limit' => [ - 'type' => 'hidden', - 'default' => $this->mLimit, - 'name' => 'limit', - ], - 'offset' => [ - 'type' => 'hidden', - 'default' => $this->getRequest()->getText( 'offset' ), - 'name' => 'offset', - ], - ]; - - if ( $this->getConfig()->get( 'MiserMode' ) ) { - unset( $fields['like'] ); - } - - if ( !$this->getUser()->useFilePatrol() ) { - unset( $fields['hidepatrolled'] ); - } - - $context = new DerivativeContext( $this->getContext() ); - $context->setTitle( $this->getTitle() ); // Remove subpage - $form = new HTMLForm( $fields, $context ); - - $form->setSubmitTextMsg( 'ilsubmit' ); - $form->setSubmitProgressive(); - - $form->setMethod( 'get' ); - $form->setWrapperLegendMsg( 'newimages-legend' ); - - return $form; - } -} diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php index f1b231d546..c24b054750 100644 --- a/includes/specials/SpecialNewpages.php +++ b/includes/specials/SpecialNewpages.php @@ -265,11 +265,11 @@ class SpecialNewpages extends IncludableSpecialPage { ); $htmlForm->setMethod( 'get' ); - $out->addHtml( Xml::fieldset( $this->msg( 'newpages' )->text() ) ); + $out->addHTML( Xml::fieldset( $this->msg( 'newpages' )->text() ) ); $htmlForm->show(); - $out->addHtml( + $out->addHTML( Html::rawElement( 'div', null, @@ -479,130 +479,3 @@ class SpecialNewpages extends IncludableSpecialPage { return 'changes'; } } - -/** - * @ingroup SpecialPage Pager - */ -class NewPagesPager extends ReverseChronologicalPager { - // Stored opts - protected $opts; - - /** - * @var HtmlForm - */ - protected $mForm; - - function __construct( $form, FormOptions $opts ) { - parent::__construct( $form->getContext() ); - $this->mForm = $form; - $this->opts = $opts; - } - - function getQueryInfo() { - $conds = []; - $conds['rc_new'] = 1; - - $namespace = $this->opts->getValue( 'namespace' ); - $namespace = ( $namespace === 'all' ) ? false : intval( $namespace ); - - $username = $this->opts->getValue( 'username' ); - $user = Title::makeTitleSafe( NS_USER, $username ); - - $rcIndexes = []; - - if ( $namespace !== false ) { - if ( $this->opts->getValue( 'invert' ) ) { - $conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace ); - } else { - $conds['rc_namespace'] = $namespace; - } - } - - if ( $user ) { - $conds['rc_user_text'] = $user->getText(); - $rcIndexes = 'rc_user_text'; - } elseif ( User::groupHasPermission( '*', 'createpage' ) && - $this->opts->getValue( 'hideliu' ) - ) { - # If anons cannot make new pages, don't "exclude logged in users"! - $conds['rc_user'] = 0; - } - - # If this user cannot see patrolled edits or they are off, don't do dumb queries! - if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) { - $conds['rc_patrolled'] = 0; - } - - if ( $this->opts->getValue( 'hidebots' ) ) { - $conds['rc_bot'] = 0; - } - - if ( $this->opts->getValue( 'hideredirs' ) ) { - $conds['page_is_redirect'] = 0; - } - - // Allow changes to the New Pages query - $tables = [ 'recentchanges', 'page' ]; - $fields = [ - 'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text', - 'rc_comment', 'rc_timestamp', 'rc_patrolled', 'rc_id', 'rc_deleted', - 'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid', - 'page_namespace', 'page_title' - ]; - $join_conds = [ 'page' => [ 'INNER JOIN', 'page_id=rc_cur_id' ] ]; - - Hooks::run( 'SpecialNewpagesConditions', - [ &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] ); - - $options = []; - - if ( $rcIndexes ) { - $options = [ 'USE INDEX' => [ 'recentchanges' => $rcIndexes ] ]; - } - - $info = [ - 'tables' => $tables, - 'fields' => $fields, - 'conds' => $conds, - 'options' => $options, - 'join_conds' => $join_conds - ]; - - // Modify query for tags - ChangeTags::modifyDisplayQuery( - $info['tables'], - $info['fields'], - $info['conds'], - $info['join_conds'], - $info['options'], - $this->opts['tagfilter'] - ); - - return $info; - } - - function getIndexField() { - return 'rc_timestamp'; - } - - function formatRow( $row ) { - return $this->mForm->formatRow( $row ); - } - - function getStartBody() { - # Do a batch existence check on pages - $linkBatch = new LinkBatch(); - foreach ( $this->mResult as $row ) { - $linkBatch->add( NS_USER, $row->rc_user_text ); - $linkBatch->add( NS_USER_TALK, $row->rc_user_text ); - $linkBatch->add( $row->page_namespace, $row->page_title ); - } - $linkBatch->execute(); - - return ''; - } -} diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php index 44f31a53e6..c3ed91feca 100644 --- a/includes/specials/SpecialPasswordReset.php +++ b/includes/specials/SpecialPasswordReset.php @@ -218,7 +218,7 @@ class SpecialPasswordReset extends FormSpecialPage { $firstUser = $users[0]; - if ( !$firstUser instanceof User || !$firstUser->getID() ) { + if ( !$firstUser instanceof User || !$firstUser->getId() ) { // Don't parse username as wikitext (bug 65501) return [ [ 'nosuchuser', wfEscapeWikiText( $data['Username'] ) ] ]; } diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php index 5df425a18c..c800d96c78 100644 --- a/includes/specials/SpecialProtectedtitles.php +++ b/includes/specials/SpecialProtectedtitles.php @@ -190,74 +190,3 @@ class SpecialProtectedtitles extends SpecialPage { return 'maintenance'; } } - -/** - * @todo document - * @ingroup Pager - */ -class ProtectedTitlesPager extends AlphabeticPager { - public $mForm, $mConds; - - function __construct( $form, $conds = [], $type, $level, $namespace, - $sizetype = '', $size = 0 - ) { - $this->mForm = $form; - $this->mConds = $conds; - $this->level = $level; - $this->namespace = $namespace; - $this->size = intval( $size ); - parent::__construct( $form->getContext() ); - } - - function getStartBody() { - # Do a link batch query - $this->mResult->seek( 0 ); - $lb = new LinkBatch; - - foreach ( $this->mResult as $row ) { - $lb->add( $row->pt_namespace, $row->pt_title ); - } - - $lb->execute(); - - return ''; - } - - /** - * @return Title - */ - function getTitle() { - return $this->mForm->getTitle(); - } - - function formatRow( $row ) { - return $this->mForm->formatRow( $row ); - } - - /** - * @return array - */ - function getQueryInfo() { - $conds = $this->mConds; - $conds[] = 'pt_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) . - ' OR pt_expiry IS NULL'; - if ( $this->level ) { - $conds['pt_create_perm'] = $this->level; - } - - if ( !is_null( $this->namespace ) ) { - $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace ); - } - - return [ - 'tables' => 'protected_titles', - 'fields' => [ 'pt_namespace', 'pt_title', 'pt_create_perm', - 'pt_expiry', 'pt_timestamp' ], - 'conds' => $conds - ]; - } - - function getIndexField() { - return 'pt_timestamp'; - } -} diff --git a/includes/specials/SpecialRandomInCategory.php b/includes/specials/SpecialRandomInCategory.php index d4c1004ab5..efb1748913 100644 --- a/includes/specials/SpecialRandomInCategory.php +++ b/includes/specials/SpecialRandomInCategory.php @@ -206,7 +206,7 @@ class SpecialRandomInCategory extends FormSpecialPage { 'tables' => [ 'categorylinks', 'page' ], 'fields' => [ 'page_title', 'page_namespace' ], 'conds' => array_merge( [ - 'cl_to' => $this->category->getDBKey(), + 'cl_to' => $this->category->getDBkey(), ], $this->extra ), 'options' => [ 'ORDER BY' => 'cl_timestamp ' . $dir, diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 7be95fa842..de773800ac 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -366,7 +366,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $rclistOutput .= $list->endRecentChangesList(); if ( $rows->numRows() === 0 ) { - $this->getOutput()->addHtml( + $this->getOutput()->addHTML( '
' . $this->msg( 'recentchanges-noresult' )->parse() . '
' @@ -399,7 +399,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $extraOpts = $this->getExtraOptions( $opts ); $extraOptsCount = count( $extraOpts ); $count = 0; - $submit = ' ' . Xml::submitbutton( $this->msg( 'recentchanges-submit' )->text() ); + $submit = ' ' . Xml::submitButton( $this->msg( 'recentchanges-submit' )->text() ); $out = Xml::openElement( 'table', [ 'class' => 'mw-recentchanges-table' ] ); foreach ( $extraOpts as $name => $optionRow ) { diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php index c0ed4c9943..12959a3e6a 100644 --- a/includes/specials/SpecialRedirect.php +++ b/includes/specials/SpecialRedirect.php @@ -272,7 +272,6 @@ class SpecialRedirect extends FormSpecialPage { $url = $this->dispatchLog(); break; default: - $this->getOutput()->setStatusCode( 404 ); $url = null; break; } diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 9bb5d9592e..dfab8d437c 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -299,7 +299,7 @@ class SpecialSearch extends SpecialPage { } // start rendering the page - $out->addHtml( + $out->addHTML( Xml::openElement( 'form', [ @@ -323,7 +323,7 @@ class SpecialSearch extends SpecialPage { $num = $titleMatchesNum + $textMatchesNum; $totalRes = $numTitleMatches + $numTextMatches; - $out->addHtml( + $out->addHTML( # This is an awful awful ID name. It's not a table, but we # named it poorly from when this was a table so now we're # stuck with it @@ -342,7 +342,7 @@ class SpecialSearch extends SpecialPage { return; } - $out->addHtml( "
" ); + $out->addHTML( "
" ); // prev/next links $prevnext = null; @@ -429,7 +429,7 @@ class SpecialSearch extends SpecialPage { $out->addHTML( "

{$prevnext}

\n" ); } - $out->addHtml( "
" ); + $out->addHTML( "
" ); Hooks::run( 'SpecialSearchResultsAppend', [ $this, $out, $term ] ); @@ -551,7 +551,7 @@ class SpecialSearch extends SpecialPage { ) { // invalid title // preserve the paragraph for margins etc... - $this->getOutput()->addHtml( '

' ); + $this->getOutput()->addHTML( '

' ); return; } @@ -580,7 +580,7 @@ class SpecialSearch extends SpecialPage { $this->getOutput()->wrapWikiMsg( "

\n$1

", $params ); } else { // preserve the paragraph for margins etc... - $this->getOutput()->addHtml( '

' ); + $this->getOutput()->addHTML( '

' ); } } diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php index 2ff21228c6..e79fd6ee0f 100644 --- a/includes/specials/SpecialTags.php +++ b/includes/specials/SpecialTags.php @@ -297,7 +297,7 @@ class SpecialTags extends SpecialPage { $headerText = $this->msg( 'tags-create-warnings-above', $tag, count( $status->getWarningsArray() ) )->parseAsBlock() . - $out->parse( $status->getWikitext() ) . + $out->parse( $status->getWikiText() ) . $this->msg( 'tags-create-warnings-below' )->parseAsBlock(); $subform = new HTMLForm( $fields, $this->getContext() ); @@ -311,7 +311,7 @@ class SpecialTags extends SpecialPage { $out->addBacklinkSubtitle( $this->getPageTitle() ); return true; } else { - $out->addWikiText( "
\n" . $status->getWikitext() . + $out->addWikiText( "
\n" . $status->getWikiText() . "\n
" ); return false; } diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php index d14e02f573..cff8bf463a 100644 --- a/includes/specials/SpecialUnblock.php +++ b/includes/specials/SpecialUnblock.php @@ -218,7 +218,7 @@ class SpecialUnblock extends SpecialPage { if ( $block->mHideName ) { # Something is deeply FUBAR if this is not a User object, but who knows? $id = $block->getTarget() instanceof User - ? $block->getTarget()->getID() + ? $block->getTarget()->getId() : User::idFromName( $block->getTarget() ); RevisionDeleteUser::unsuppressUserName( $block->getTarget(), $id ); @@ -229,7 +229,7 @@ class SpecialUnblock extends SpecialPage { $page = Title::makeTitle( NS_USER, '#' . $block->getId() ); } else { $page = $block->getTarget() instanceof User - ? $block->getTarget()->getUserpage() + ? $block->getTarget()->getUserPage() : Title::makeTitle( NS_USER, $block->getTarget() ); } @@ -238,7 +238,9 @@ class SpecialUnblock extends SpecialPage { $logEntry->setTarget( $page ); $logEntry->setComment( $data['Reason'] ); $logEntry->setPerformer( $performer ); - $logEntry->setTags( $data['Tags'] ); + if ( isset( $data['Tags'] ) ) { + $logEntry->setTags( $data['Tags'] ); + } $logId = $logEntry->insert(); $logEntry->publish( $logId ); diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index 52a3d17c27..c6d3f6e75e 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -698,6 +698,10 @@ class SpecialUndelete extends SpecialPage { parent::__construct( 'Undelete', 'deletedhistory' ); } + public function doesWrites() { + return true; + } + function loadRequest( $par ) { $request = $this->getRequest(); $user = $this->getUser(); diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php index 199eebd64f..555fe5ce14 100644 --- a/includes/specials/SpecialUploadStash.php +++ b/includes/specials/SpecialUploadStash.php @@ -392,17 +392,27 @@ class SpecialUploadStash extends UnlistedSpecialPage { sort( $files ); $fileListItemsHtml = ''; foreach ( $files as $file ) { - // TODO: Use Linker::link or even construct the list in plain wikitext - $fileListItemsHtml .= Html::rawElement( 'li', [], - Html::element( 'a', [ 'href' => - $this->getPageTitle( "file/$file" )->getLocalURL() ], $file ) - ); + $itemHtml = Linker::linkKnown( $this->getPageTitle( "file/$file" ), htmlspecialchars( $file ) ); + try { + $fileObj = $this->stash->getFile( $file ); + $thumb = $fileObj->generateThumbName( $file, [ 'width' => 220 ] ); + $itemHtml .= + $this->msg( 'word-separator' )->escaped() . + $this->msg( 'parentheses' )->rawParams( + Linker::linkKnown( + $this->getPageTitle( "thumb/$file/$thumb" ), + $this->msg( 'uploadstash-thumbnail' )->escaped() + ) + )->escaped(); + } catch ( Exception $e ) { + } + $fileListItemsHtml .= Html::rawElement( 'li', [], $itemHtml ); } - $this->getOutput()->addHtml( Html::rawElement( 'ul', [], $fileListItemsHtml ) ); + $this->getOutput()->addHTML( Html::rawElement( 'ul', [], $fileListItemsHtml ) ); $form->displayForm( $formResult ); - $this->getOutput()->addHtml( Html::rawElement( 'p', [], $refreshHtml ) ); + $this->getOutput()->addHTML( Html::rawElement( 'p', [], $refreshHtml ) ); } else { - $this->getOutput()->addHtml( Html::rawElement( 'p', [], + $this->getOutput()->addHTML( Html::rawElement( 'p', [], Html::element( 'span', [], $this->msg( 'uploadstash-nofiles' )->text() ) . ' ' . $refreshHtml diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php index 1ed8407019..49d3345802 100644 --- a/includes/specials/SpecialUserlogin.php +++ b/includes/specials/SpecialUserlogin.php @@ -792,7 +792,7 @@ class LoginForm extends SpecialPage { } $isAutoCreated = false; - if ( $u->getID() == 0 ) { + if ( $u->getId() == 0 ) { $status = $this->attemptAutoCreate( $u ); if ( $status !== self::SUCCESS ) { return $status; diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index 7901d3708e..1ccfc2f407 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -119,7 +119,7 @@ class UserrightsPage extends SpecialPage { } $fetchedStatus = $this->fetchUser( $this->mTarget ); - if ( $fetchedStatus->isOk() ) { + if ( $fetchedStatus->isOK() ) { $this->mFetchedUser = $fetchedStatus->value; if ( $this->mFetchedUser instanceof User ) { // Set the 'relevant user' in the skin, so it displays links like Contributions, @@ -610,7 +610,7 @@ class UserrightsPage extends SpecialPage { * @return string */ private static function buildGroupLink( $group ) { - return User::makeGroupLinkHtml( $group, User::getGroupName( $group ) ); + return User::makeGroupLinkHTML( $group, User::getGroupName( $group ) ); } /** @@ -620,7 +620,7 @@ class UserrightsPage extends SpecialPage { * @return string */ private static function buildGroupMemberLink( $group ) { - return User::makeGroupLinkHtml( $group, User::getGroupMember( $group ) ); + return User::makeGroupLinkHTML( $group, User::getGroupMember( $group ) ); } /** diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 5b452a682a..ce5cbeb56c 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -132,7 +132,7 @@ class SpecialVersion extends SpecialPage { $this->softwareInformation() . $this->getEntryPointInfo() ); - $out->addHtml( + $out->addHTML( $this->getSkinCredits() . $this->getExtensionCredits() . $this->getExternalLibraries() . diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 2dda093b13..27e5829560 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -382,7 +382,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { } if ( isset( $watchedItemStore ) ) { - $rcTitleValue = new TitleValue( $obj->rc_namespace, $obj->rc_title ); + $rcTitleValue = new TitleValue( (int)$obj->rc_namespace, $obj->rc_title ); $rc->numberofWatchingusers = $watchedItemStore->countWatchers( $rcTitleValue ); } else { $rc->numberofWatchingusers = 0; diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php index b1c3f16915..baa55f098a 100644 --- a/includes/specials/SpecialWhatlinkshere.php +++ b/includes/specials/SpecialWhatlinkshere.php @@ -160,7 +160,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { ]; $on['rd_namespace'] = $target->getNamespace(); // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces - $subQuery = $dbr->selectSqlText( + $subQuery = $dbr->selectSQLText( [ $table, 'redirect', 'page' ], [ $fromCol, 'rd_from' ], $conds[$table], diff --git a/includes/specials/pagers/ActiveUsersPager.php b/includes/specials/pagers/ActiveUsersPager.php new file mode 100644 index 0000000000..0d3bc9aeee --- /dev/null +++ b/includes/specials/pagers/ActiveUsersPager.php @@ -0,0 +1,254 @@ +RCMaxAge = $this->getConfig()->get( 'ActiveUserDays' ); + $un = $this->getRequest()->getText( 'username', $par ); + $this->requestedUser = ''; + if ( $un != '' ) { + $username = Title::makeTitleSafe( NS_USER, $un ); + if ( !is_null( $username ) ) { + $this->requestedUser = $username->getText(); + } + } + + $this->setupOptions(); + } + + public function setupOptions() { + $this->opts = new FormOptions(); + + $this->opts->add( 'hidebots', false, FormOptions::BOOL ); + $this->opts->add( 'hidesysops', false, FormOptions::BOOL ); + + $this->opts->fetchValuesFromRequest( $this->getRequest() ); + + if ( $this->opts->getValue( 'hidebots' ) == 1 ) { + $this->hideRights[] = 'bot'; + } + if ( $this->opts->getValue( 'hidesysops' ) == 1 ) { + $this->hideGroups[] = 'sysop'; + } + } + + function getIndexField() { + return 'qcc_title'; + } + + function getQueryInfo() { + $dbr = $this->getDatabase(); + + $activeUserSeconds = $this->getConfig()->get( 'ActiveUserDays' ) * 86400; + $timestamp = $dbr->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds ); + $conds = [ + 'qcc_type' => 'activeusers', + 'qcc_namespace' => NS_USER, + 'user_name = qcc_title', + 'rc_user_text = qcc_title', + 'rc_type != ' . $dbr->addQuotes( RC_EXTERNAL ), // Don't count wikidata. + 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE ), // Don't count categorization changes. + 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' ), + 'rc_timestamp >= ' . $dbr->addQuotes( $timestamp ), + ]; + if ( $this->requestedUser != '' ) { + $conds[] = 'qcc_title >= ' . $dbr->addQuotes( $this->requestedUser ); + } + if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { + $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText( + 'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ] + ) . ')'; + } + + if ( $dbr->implicitGroupby() ) { + $options = [ 'GROUP BY' => [ 'qcc_title' ] ]; + } else { + $options = [ 'GROUP BY' => [ 'user_name', 'user_id', 'qcc_title' ] ]; + } + + return [ + 'tables' => [ 'querycachetwo', 'user', 'recentchanges' ], + 'fields' => [ 'user_name', 'user_id', 'recentedits' => 'COUNT(*)', 'qcc_title' ], + 'options' => $options, + 'conds' => $conds + ]; + } + + function doBatchLookups() { + parent::doBatchLookups(); + + $uids = []; + foreach ( $this->mResult as $row ) { + $uids[] = $row->user_id; + } + // Fetch the block status of the user for showing "(blocked)" text and for + // striking out names of suppressed users when privileged user views the list. + // Although the first query already hits the block table for un-privileged, this + // is done in two queries to avoid huge quicksorts and to make COUNT(*) correct. + $dbr = $this->getDatabase(); + $res = $dbr->select( 'ipblocks', + [ 'ipb_user', 'MAX(ipb_deleted) AS block_status' ], + [ 'ipb_user' => $uids ], + __METHOD__, + [ 'GROUP BY' => [ 'ipb_user' ] ] + ); + $this->blockStatusByUid = []; + foreach ( $res as $row ) { + $this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1 + } + $this->mResult->seek( 0 ); + } + + function formatRow( $row ) { + $userName = $row->user_name; + + $ulinks = Linker::userLink( $row->user_id, $userName ); + $ulinks .= Linker::userToolLinks( $row->user_id, $userName ); + + $lang = $this->getLanguage(); + + $list = []; + $user = User::newFromId( $row->user_id ); + + // User right filter + foreach ( $this->hideRights as $right ) { + // Calling User::getRights() within the loop so that + // if the hideRights() filter is empty, we don't have to + // trigger the lazy-init of the big userrights array in the + // User object + if ( in_array( $right, $user->getRights() ) ) { + return ''; + } + } + + // User group filter + // Note: This is a different loop than for user rights, + // because we're reusing it to build the group links + // at the same time + $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache ); + foreach ( $groups_list as $group ) { + if ( in_array( $group, $this->hideGroups ) ) { + return ''; + } + $list[] = self::buildGroupLink( $group, $userName ); + } + + $groups = $lang->commaList( $list ); + + $item = $lang->specialList( $ulinks, $groups ); + + $isBlocked = isset( $this->blockStatusByUid[$row->user_id] ); + if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) { + $item = "$item"; + } + $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits ) + ->params( $userName )->numParams( $this->RCMaxAge )->escaped(); + $blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : ''; + + return Html::rawElement( 'li', [], "{$item} [{$count}]{$blocked}" ); + } + + function getPageHeader() { + $self = $this->getTitle(); + $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : ''; + + # Form tag + $out = Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ); + $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n"; + $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n"; + + # Username field (with autocompletion support) + $this->getOutput()->addModules( 'mediawiki.userSuggest' ); + $out .= Xml::inputLabel( + $this->msg( 'activeusers-from' )->text(), + 'username', + 'offset', + 20, + $this->requestedUser, + [ + 'class' => 'mw-ui-input-inline mw-autocomplete-user', + 'tabindex' => 1, + ] + ( + // Set autofocus on blank input + $this->requestedUser === '' ? [ 'autofocus' => '' ] : [] + ) + ) . '
'; + + $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(), + 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), [ 'tabindex' => 2 ] ); + + $out .= Xml::checkLabel( + $this->msg( 'activeusers-hidesysops' )->text(), + 'hidesysops', + 'hidesysops', + $this->opts->getValue( 'hidesysops' ), + [ 'tabindex' => 3 ] + ) . '
'; + + # Submit button and form bottom + $out .= Xml::submitButton( + $this->msg( 'activeusers-submit' )->text(), + [ 'tabindex' => 4 ] + ) . "\n"; + $out .= Xml::closeElement( 'fieldset' ); + $out .= Xml::closeElement( 'form' ); + + return $out; + } + +} diff --git a/includes/specials/pagers/AllMessagesTablePager.php b/includes/specials/pagers/AllMessagesTablePager.php new file mode 100644 index 0000000000..2f2cbc2be8 --- /dev/null +++ b/includes/specials/pagers/AllMessagesTablePager.php @@ -0,0 +1,424 @@ +getContext() ); + $this->mIndexField = 'am_title'; + $this->mPage = $page; + $this->mConds = $conds; + // FIXME: Why does this need to be set to DIR_DESCENDING to produce ascending ordering? + $this->mDefaultDirection = IndexPager::DIR_DESCENDING; + $this->mLimitsShown = [ 20, 50, 100, 250, 500, 5000 ]; + + global $wgContLang; + + $this->talk = $this->msg( 'talkpagelinktext' )->escaped(); + + $this->lang = ( $langObj ? $langObj : $wgContLang ); + $this->langcode = $this->lang->getCode(); + $this->foreign = $this->langcode !== $wgContLang->getCode(); + + $request = $this->getRequest(); + + $this->filter = $request->getVal( 'filter', 'all' ); + if ( $this->filter === 'all' ) { + $this->custom = null; // So won't match in either case + } else { + $this->custom = ( $this->filter === 'unmodified' ); + } + + $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) ); + $prefix = $prefix !== '' ? + Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : + null; + + if ( $prefix !== null ) { + $this->displayPrefix = $prefix->getDBkey(); + $this->prefix = '/^' . preg_quote( $this->displayPrefix, '/' ) . '/i'; + } else { + $this->displayPrefix = false; + $this->prefix = false; + } + + // The suffix that may be needed for message names if we're in a + // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr' + if ( $this->foreign ) { + $this->suffix = '/' . $this->langcode; + } else { + $this->suffix = ''; + } + } + + function buildForm() { + $attrs = [ 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' ]; + $msg = wfMessage( 'allmessages-language' ); + $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg ); + + $out = Xml::openElement( 'form', [ + 'method' => 'get', + 'action' => $this->getConfig()->get( 'Script' ), + 'id' => 'mw-allmessages-form' + ] ) . + Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) . + Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . + Xml::openElement( 'table', [ 'class' => 'mw-allmessages-table' ] ) . "\n" . + ' + ' . + Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) . + "\n + " . + Xml::input( + 'prefix', + 20, + str_replace( '_', ' ', $this->displayPrefix ), + [ 'id' => 'mw-allmessages-form-prefix' ] + ) . + "\n + + \n + " . + $this->msg( 'allmessages-filter' )->escaped() . + "\n + " . + Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(), + 'filter', + 'unmodified', + 'mw-allmessages-form-filter-unmodified', + ( $this->filter === 'unmodified' ) + ) . + Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(), + 'filter', + 'all', + 'mw-allmessages-form-filter-all', + ( $this->filter === 'all' ) + ) . + Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(), + 'filter', + 'modified', + 'mw-allmessages-form-filter-modified', + ( $this->filter === 'modified' ) + ) . + "\n + + \n + " . $langSelect[0] . "\n + " . $langSelect[1] . "\n + " . + + ' + ' . + Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) . + ' + ' . + $this->getLimitSelect( [ 'id' => 'mw-table_pager_limit_label' ] ) . + ' + + + ' . + Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) . + "\n + " . + + Xml::closeElement( 'table' ) . + $this->getHiddenFields( [ 'title', 'prefix', 'filter', 'lang', 'limit' ] ) . + Xml::closeElement( 'fieldset' ) . + Xml::closeElement( 'form' ); + + return $out; + } + + function getAllMessages( $descending ) { + $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' ); + + // Normalise message names so they look like page titles and sort correctly - T86139 + $messageNames = array_map( [ $this->lang, 'ucfirst' ], $messageNames ); + + if ( $descending ) { + rsort( $messageNames ); + } else { + asort( $messageNames ); + } + + return $messageNames; + } + + /** + * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist. + * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have + * an entry for each existing page, with the key being the message name and + * value arbitrary. + * + * @param array $messageNames + * @param string $langcode What language code + * @param bool $foreign Whether the $langcode is not the content language + * @return array A 'pages' and 'talks' array with the keys of existing pages + */ + public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) { + // FIXME: This function should be moved to Language:: or something. + + $dbr = wfGetDB( DB_SLAVE ); + $res = $dbr->select( 'page', + [ 'page_namespace', 'page_title' ], + [ 'page_namespace' => [ NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ] ], + __METHOD__, + [ 'USE INDEX' => 'name_title' ] + ); + $xNames = array_flip( $messageNames ); + + $pageFlags = $talkFlags = []; + + foreach ( $res as $s ) { + $exists = false; + + if ( $foreign ) { + $titleParts = explode( '/', $s->page_title ); + if ( count( $titleParts ) === 2 && + $langcode === $titleParts[1] && + isset( $xNames[$titleParts[0]] ) + ) { + $exists = $titleParts[0]; + } + } elseif ( isset( $xNames[$s->page_title] ) ) { + $exists = $s->page_title; + } + + $title = Title::newFromRow( $s ); + if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) { + $pageFlags[$exists] = true; + } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) { + $talkFlags[$exists] = true; + } + } + + return [ 'pages' => $pageFlags, 'talks' => $talkFlags ]; + } + + /** + * This function normally does a database query to get the results; we need + * to make a pretend result using a FakeResultWrapper. + * @param string $offset + * @param int $limit + * @param bool $descending + * @return FakeResultWrapper + */ + function reallyDoQuery( $offset, $limit, $descending ) { + $result = new FakeResultWrapper( [] ); + + $messageNames = $this->getAllMessages( $descending ); + $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign ); + + $count = 0; + foreach ( $messageNames as $key ) { + $customised = isset( $statuses['pages'][$key] ); + if ( $customised !== $this->custom && + ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) && + ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false ) + ) { + $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain(); + $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain(); + $result->result[] = [ + 'am_title' => $key, + 'am_actual' => $actual, + 'am_default' => $default, + 'am_customised' => $customised, + 'am_talk_exists' => isset( $statuses['talks'][$key] ) + ]; + $count++; + } + + if ( $count === $limit ) { + break; + } + } + + return $result; + } + + function getStartBody() { + $tableClass = $this->getTableClass(); + return Xml::openElement( 'table', [ + 'class' => "mw-datatable $tableClass", + 'id' => 'mw-allmessagestable' + ] ) . + "\n" . + " + " . + $this->msg( 'allmessagesname' )->escaped() . " + + " . + $this->msg( 'allmessagesdefault' )->escaped() . + " + \n + + " . + $this->msg( 'allmessagescurrent' )->escaped() . + " + \n"; + } + + function formatValue( $field, $value ) { + switch ( $field ) { + case 'am_title' : + $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix ); + $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix ); + $translation = Linker::makeExternalLink( + 'https://translatewiki.net/w/i.php?' . wfArrayToCgi( [ + 'title' => 'Special:SearchTranslations', + 'group' => 'mediawiki', + 'grouppath' => 'mediawiki', + 'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' . + 'messageid:"MediaWiki:' . $value . '"^10 "' . + $this->msg( $value )->inLanguage( 'en' )->plain() . '"' + ] ), + $this->msg( 'allmessages-filter-translate' )->text() + ); + + if ( $this->mCurrentRow->am_customised ) { + $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) ); + } else { + $title = Linker::link( + $title, + $this->getLanguage()->lcfirst( $value ), + [], + [], + [ 'broken' ] + ); + } + if ( $this->mCurrentRow->am_talk_exists ) { + $talk = Linker::linkKnown( $talk, $this->talk ); + } else { + $talk = Linker::link( + $talk, + $this->talk, + [], + [], + [ 'broken' ] + ); + } + + return $title . ' ' . + $this->msg( 'parentheses' )->rawParams( $talk )->escaped() . + ' ' . + $this->msg( 'parentheses' )->rawParams( $translation )->escaped(); + + case 'am_default' : + case 'am_actual' : + return Sanitizer::escapeHtmlAllowEntities( $value ); + } + + return ''; + } + + function formatRow( $row ) { + // Do all the normal stuff + $s = parent::formatRow( $row ); + + // But if there's a customised message, add that too. + if ( $row->am_customised ) { + $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) ); + $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) ); + + if ( $formatted === '' ) { + $formatted = ' '; + } + + $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted ) + . "\n"; + } + + return $s; + } + + function getRowAttrs( $row, $isSecond = false ) { + $arr = []; + + if ( $row->am_customised ) { + $arr['class'] = 'allmessages-customised'; + } + + if ( !$isSecond ) { + $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) ); + } + + return $arr; + } + + function getCellAttrs( $field, $value ) { + if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) { + return [ 'rowspan' => '2', 'class' => $field ]; + } elseif ( $field === 'am_title' ) { + return [ 'class' => $field ]; + } else { + return [ + 'lang' => $this->lang->getHtmlCode(), + 'dir' => $this->lang->getDir(), + 'class' => $field + ]; + } + } + + // This is not actually used, as getStartBody is overridden above + function getFieldNames() { + return [ + 'am_title' => $this->msg( 'allmessagesname' )->text(), + 'am_default' => $this->msg( 'allmessagesdefault' )->text() + ]; + } + + function getTitle() { + return SpecialPage::getTitleFor( 'Allmessages', false ); + } + + function isFieldSortable( $x ) { + return false; + } + + function getDefaultSort() { + return ''; + } + + function getQueryInfo() { + return ''; + } + +} diff --git a/includes/specials/pagers/BlockListPager.php b/includes/specials/pagers/BlockListPager.php new file mode 100644 index 0000000000..8857907712 --- /dev/null +++ b/includes/specials/pagers/BlockListPager.php @@ -0,0 +1,266 @@ +page = $page; + $this->conds = $conds; + $this->mDefaultDirection = IndexPager::DIR_DESCENDING; + parent::__construct( $page->getContext() ); + } + + function getFieldNames() { + static $headers = null; + + if ( $headers === null ) { + $headers = [ + 'ipb_timestamp' => 'blocklist-timestamp', + 'ipb_target' => 'blocklist-target', + 'ipb_expiry' => 'blocklist-expiry', + 'ipb_by' => 'blocklist-by', + 'ipb_params' => 'blocklist-params', + 'ipb_reason' => 'blocklist-reason', + ]; + foreach ( $headers as $key => $val ) { + $headers[$key] = $this->msg( $val )->text(); + } + } + + return $headers; + } + + function formatValue( $name, $value ) { + static $msg = null; + if ( $msg === null ) { + $keys = [ + 'anononlyblock', + 'createaccountblock', + 'noautoblockblock', + 'emailblock', + 'blocklist-nousertalk', + 'unblocklink', + 'change-blocklink', + ]; + + foreach ( $keys as $key ) { + $msg[$key] = $this->msg( $key )->escaped(); + } + } + + /** @var $row object */ + $row = $this->mCurrentRow; + + $language = $this->getLanguage(); + + $formatted = ''; + + switch ( $name ) { + case 'ipb_timestamp': + $formatted = htmlspecialchars( $language->userTimeAndDate( $value, $this->getUser() ) ); + break; + + case 'ipb_target': + if ( $row->ipb_auto ) { + $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse(); + } else { + list( $target, $type ) = Block::parseTarget( $row->ipb_address ); + switch ( $type ) { + case Block::TYPE_USER: + case Block::TYPE_IP: + $formatted = Linker::userLink( $target->getId(), $target ); + $formatted .= Linker::userToolLinks( + $target->getId(), + $target, + false, + Linker::TOOL_LINKS_NOBLOCK + ); + break; + case Block::TYPE_RANGE: + $formatted = htmlspecialchars( $target ); + } + } + break; + + case 'ipb_expiry': + $formatted = htmlspecialchars( $language->formatExpiry( + $value, + /* User preference timezone */true + ) ); + if ( $this->getUser()->isAllowed( 'block' ) ) { + if ( $row->ipb_auto ) { + $links[] = Linker::linkKnown( + SpecialPage::getTitleFor( 'Unblock' ), + $msg['unblocklink'], + [], + [ 'wpTarget' => "#{$row->ipb_id}" ] + ); + } else { + $links[] = Linker::linkKnown( + SpecialPage::getTitleFor( 'Unblock', $row->ipb_address ), + $msg['unblocklink'] + ); + $links[] = Linker::linkKnown( + SpecialPage::getTitleFor( 'Block', $row->ipb_address ), + $msg['change-blocklink'] + ); + } + $formatted .= ' ' . Html::rawElement( + 'span', + [ 'class' => 'mw-blocklist-actions' ], + $this->msg( 'parentheses' )->rawParams( + $language->pipeList( $links ) )->escaped() + ); + } + break; + + case 'ipb_by': + if ( isset( $row->by_user_name ) ) { + $formatted = Linker::userLink( $value, $row->by_user_name ); + $formatted .= Linker::userToolLinks( $value, $row->by_user_name ); + } else { + $formatted = htmlspecialchars( $row->ipb_by_text ); // foreign user? + } + break; + + case 'ipb_reason': + $formatted = Linker::formatComment( $value ); + break; + + case 'ipb_params': + $properties = []; + if ( $row->ipb_anon_only ) { + $properties[] = $msg['anononlyblock']; + } + if ( $row->ipb_create_account ) { + $properties[] = $msg['createaccountblock']; + } + if ( $row->ipb_user && !$row->ipb_enable_autoblock ) { + $properties[] = $msg['noautoblockblock']; + } + + if ( $row->ipb_block_email ) { + $properties[] = $msg['emailblock']; + } + + if ( !$row->ipb_allow_usertalk ) { + $properties[] = $msg['blocklist-nousertalk']; + } + + $formatted = $language->commaList( $properties ); + break; + + default: + $formatted = "Unable to format $name"; + break; + } + + return $formatted; + } + + function getQueryInfo() { + $info = [ + 'tables' => [ 'ipblocks', 'user' ], + 'fields' => [ + 'ipb_id', + 'ipb_address', + 'ipb_user', + 'ipb_by', + 'ipb_by_text', + 'by_user_name' => 'user_name', + 'ipb_reason', + 'ipb_timestamp', + 'ipb_auto', + 'ipb_anon_only', + 'ipb_create_account', + 'ipb_enable_autoblock', + 'ipb_expiry', + 'ipb_range_start', + 'ipb_range_end', + 'ipb_deleted', + 'ipb_block_email', + 'ipb_allow_usertalk', + ], + 'conds' => $this->conds, + 'join_conds' => [ 'user' => [ 'LEFT JOIN', 'user_id = ipb_by' ] ] + ]; + + # Filter out any expired blocks + $db = $this->getDatabase(); + $info['conds'][] = 'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ); + + # Is the user allowed to see hidden blocks? + if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { + $info['conds']['ipb_deleted'] = 0; + } + + return $info; + } + + public function getTableClass() { + return parent::getTableClass() . ' mw-blocklist'; + } + + function getIndexField() { + return 'ipb_timestamp'; + } + + function getDefaultSort() { + return 'ipb_timestamp'; + } + + function isFieldSortable( $name ) { + return false; + } + + /** + * Do a LinkBatch query to minimise database load when generating all these links + * @param ResultWrapper $result + */ + function preprocessResults( $result ) { + # Do a link batch query + $lb = new LinkBatch; + $lb->setCaller( __METHOD__ ); + + foreach ( $result as $row ) { + $lb->add( NS_USER, $row->ipb_address ); + $lb->add( NS_USER_TALK, $row->ipb_address ); + + if ( isset( $row->by_user_name ) ) { + $lb->add( NS_USER, $row->by_user_name ); + $lb->add( NS_USER_TALK, $row->by_user_name ); + } + } + + $lb->execute(); + } + +} diff --git a/includes/specials/pagers/CategoryPager.php b/includes/specials/pagers/CategoryPager.php new file mode 100644 index 0000000000..fd2ac1f75f --- /dev/null +++ b/includes/specials/pagers/CategoryPager.php @@ -0,0 +1,126 @@ +setOffset( $from ); + $this->setIncludeOffset( true ); + } + + $this->linkRenderer = $linkRenderer; + } + + function getQueryInfo() { + return [ + 'tables' => [ 'category' ], + 'fields' => [ 'cat_title', 'cat_pages' ], + 'conds' => [ 'cat_pages > 0' ], + 'options' => [ 'USE INDEX' => 'cat_title' ], + ]; + } + + function getIndexField() { +# return array( 'abc' => 'cat_title', 'count' => 'cat_pages' ); + return 'cat_title'; + } + + function getDefaultQuery() { + parent::getDefaultQuery(); + unset( $this->mDefaultQuery['from'] ); + + return $this->mDefaultQuery; + } + +# protected function getOrderTypeMessages() { +# return array( 'abc' => 'special-categories-sort-abc', +# 'count' => 'special-categories-sort-count' ); +# } + + protected function getDefaultDirections() { +# return array( 'abc' => false, 'count' => true ); + return false; + } + + /* Override getBody to apply LinksBatch on resultset before actually outputting anything. */ + public function getBody() { + $batch = new LinkBatch; + + $this->mResult->rewind(); + + foreach ( $this->mResult as $row ) { + $batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) ); + } + $batch->execute(); + $this->mResult->rewind(); + + return parent::getBody(); + } + + function formatRow( $result ) { + $title = new TitleValue( NS_CATEGORY, $result->cat_title ); + $text = $title->getText(); + $link = $this->linkRenderer->renderHtmlLink( $title, $text ); + + $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped(); + return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n"; + } + + public function getStartForm( $from ) { + return Xml::tags( + 'form', + [ 'method' => 'get', 'action' => wfScript() ], + Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . + Xml::fieldset( + $this->msg( 'categories' )->text(), + Xml::inputLabel( + $this->msg( 'categoriesfrom' )->text(), + 'from', 'from', 20, $from, [ 'class' => 'mw-ui-input-inline' ] ) . + ' ' . + Html::submitButton( + $this->msg( 'categories-submit' )->text(), + [], [ 'mw-ui-progressive' ] + ) + ) + ); + } +} diff --git a/includes/specials/pagers/ContribsPager.php b/includes/specials/pagers/ContribsPager.php new file mode 100644 index 0000000000..d90c37bab7 --- /dev/null +++ b/includes/specials/pagers/ContribsPager.php @@ -0,0 +1,526 @@ +messages[$msg] = $this->msg( $msg )->escaped(); + } + + $this->target = isset( $options['target'] ) ? $options['target'] : ''; + $this->contribs = isset( $options['contribs'] ) ? $options['contribs'] : 'users'; + $this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : ''; + $this->tagFilter = isset( $options['tagfilter'] ) ? $options['tagfilter'] : false; + $this->nsInvert = isset( $options['nsInvert'] ) ? $options['nsInvert'] : false; + $this->associated = isset( $options['associated'] ) ? $options['associated'] : false; + + $this->deletedOnly = !empty( $options['deletedOnly'] ); + $this->topOnly = !empty( $options['topOnly'] ); + $this->newOnly = !empty( $options['newOnly'] ); + + $year = isset( $options['year'] ) ? $options['year'] : false; + $month = isset( $options['month'] ) ? $options['month'] : false; + $this->getDateCond( $year, $month ); + + // Most of this code will use the 'contributions' group DB, which can map to slaves + // with extra user based indexes or partioning by user. The additional metadata + // queries should use a regular slave since the lookup pattern is not all by user. + $this->mDbSecondary = wfGetDB( DB_SLAVE ); // any random slave + $this->mDb = wfGetDB( DB_SLAVE, 'contributions' ); + } + + function getDefaultQuery() { + $query = parent::getDefaultQuery(); + $query['target'] = $this->target; + + return $query; + } + + /** + * This method basically executes the exact same code as the parent class, though with + * a hook added, to allow extensions to add additional queries. + * + * @param string $offset Index offset, inclusive + * @param int $limit Exact query limit + * @param bool $descending Query direction, false for ascending, true for descending + * @return ResultWrapper + */ + function reallyDoQuery( $offset, $limit, $descending ) { + list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( + $offset, + $limit, + $descending + ); + + /* + * This hook will allow extensions to add in additional queries, so they can get their data + * in My Contributions as well. Extensions should append their results to the $data array. + * + * Extension queries have to implement the navbar requirement as well. They should + * - have a column aliased as $pager->getIndexField() + * - have LIMIT set + * - have a WHERE-clause that compares the $pager->getIndexField()-equivalent column to the offset + * - have the ORDER BY specified based upon the details provided by the navbar + * + * See includes/Pager.php buildQueryInfo() method on how to build LIMIT, WHERE & ORDER BY + * + * &$data: an array of results of all contribs queries + * $pager: the ContribsPager object hooked into + * $offset: see phpdoc above + * $limit: see phpdoc above + * $descending: see phpdoc above + */ + $data = [ $this->mDb->select( + $tables, $fields, $conds, $fname, $options, $join_conds + ) ]; + Hooks::run( + 'ContribsPager::reallyDoQuery', + [ &$data, $this, $offset, $limit, $descending ] + ); + + $result = []; + + // loop all results and collect them in an array + foreach ( $data as $query ) { + foreach ( $query as $i => $row ) { + // use index column as key, allowing us to easily sort in PHP + $result[$row->{$this->getIndexField()} . "-$i"] = $row; + } + } + + // sort results + if ( $descending ) { + ksort( $result ); + } else { + krsort( $result ); + } + + // enforce limit + $result = array_slice( $result, 0, $limit ); + + // get rid of array keys + $result = array_values( $result ); + + return new FakeResultWrapper( $result ); + } + + function getQueryInfo() { + list( $tables, $index, $userCond, $join_cond ) = $this->getUserCond(); + + $user = $this->getUser(); + $conds = array_merge( $userCond, $this->getNamespaceCond() ); + + // Paranoia: avoid brute force searches (bug 17342) + if ( !$user->isAllowed( 'deletedhistory' ) ) { + $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0'; + } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { + $conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::SUPPRESSED_USER ) . + ' != ' . Revision::SUPPRESSED_USER; + } + + # Don't include orphaned revisions + $join_cond['page'] = Revision::pageJoinCond(); + # Get the current user name for accounts + $join_cond['user'] = Revision::userJoinCond(); + + $options = []; + if ( $index ) { + $options['USE INDEX'] = [ 'revision' => $index ]; + } + + $queryInfo = [ + 'tables' => $tables, + 'fields' => array_merge( + Revision::selectFields(), + Revision::selectUserFields(), + [ 'page_namespace', 'page_title', 'page_is_new', + 'page_latest', 'page_is_redirect', 'page_len' ] + ), + 'conds' => $conds, + 'options' => $options, + 'join_conds' => $join_cond + ]; + + ChangeTags::modifyDisplayQuery( + $queryInfo['tables'], + $queryInfo['fields'], + $queryInfo['conds'], + $queryInfo['join_conds'], + $queryInfo['options'], + $this->tagFilter + ); + + Hooks::run( 'ContribsPager::getQueryInfo', [ &$this, &$queryInfo ] ); + + return $queryInfo; + } + + function getUserCond() { + $condition = []; + $join_conds = []; + $tables = [ 'revision', 'page', 'user' ]; + $index = false; + if ( $this->contribs == 'newbie' ) { + $max = $this->mDb->selectField( 'user', 'max(user_id)', false, __METHOD__ ); + $condition[] = 'rev_user >' . (int)( $max - $max / 100 ); + # ignore local groups with the bot right + # @todo FIXME: Global groups may have 'bot' rights + $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' ); + if ( count( $groupsWithBotPermission ) ) { + $tables[] = 'user_groups'; + $condition[] = 'ug_group IS NULL'; + $join_conds['user_groups'] = [ + 'LEFT JOIN', [ + 'ug_user = rev_user', + 'ug_group' => $groupsWithBotPermission + ] + ]; + } + } else { + $uid = User::idFromName( $this->target ); + if ( $uid ) { + $condition['rev_user'] = $uid; + $index = 'user_timestamp'; + } else { + $condition['rev_user_text'] = $this->target; + $index = 'usertext_timestamp'; + } + } + + if ( $this->deletedOnly ) { + $condition[] = 'rev_deleted != 0'; + } + + if ( $this->topOnly ) { + $condition[] = 'rev_id = page_latest'; + } + + if ( $this->newOnly ) { + $condition[] = 'rev_parent_id = 0'; + } + + return [ $tables, $index, $condition, $join_conds ]; + } + + function getNamespaceCond() { + if ( $this->namespace !== '' ) { + $selectedNS = $this->mDb->addQuotes( $this->namespace ); + $eq_op = $this->nsInvert ? '!=' : '='; + $bool_op = $this->nsInvert ? 'AND' : 'OR'; + + if ( !$this->associated ) { + return [ "page_namespace $eq_op $selectedNS" ]; + } + + $associatedNS = $this->mDb->addQuotes( + MWNamespace::getAssociated( $this->namespace ) + ); + + return [ + "page_namespace $eq_op $selectedNS " . + $bool_op . + " page_namespace $eq_op $associatedNS" + ]; + } + + return []; + } + + function getIndexField() { + return 'rev_timestamp'; + } + + function doBatchLookups() { + # Do a link batch query + $this->mResult->seek( 0 ); + $parentRevIds = []; + $this->mParentLens = []; + $batch = new LinkBatch(); + # Give some pointers to make (last) links + foreach ( $this->mResult as $row ) { + if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) { + $parentRevIds[] = $row->rev_parent_id; + } + if ( isset( $row->rev_id ) ) { + $this->mParentLens[$row->rev_id] = $row->rev_len; + if ( $this->contribs === 'newbie' ) { // multiple users + $batch->add( NS_USER, $row->user_name ); + $batch->add( NS_USER_TALK, $row->user_name ); + } + $batch->add( $row->page_namespace, $row->page_title ); + } + } + # Fetch rev_len for revisions not already scanned above + $this->mParentLens += Revision::getParentLengths( + $this->mDbSecondary, + array_diff( $parentRevIds, array_keys( $this->mParentLens ) ) + ); + $batch->execute(); + $this->mResult->seek( 0 ); + } + + /** + * @return string + */ + function getStartBody() { + return "\n"; + } + + /** + * Generates each row in the contributions list. + * + * Contributions which are marked "top" are currently on top of the history. + * For these contributions, a [rollback] link is shown for users with roll- + * back privileges. The rollback link restores the most recent version that + * was not written by the target user. + * + * @todo This would probably look a lot nicer in a table. + * @param object $row + * @return string + */ + function formatRow( $row ) { + + $ret = ''; + $classes = []; + + /* + * There may be more than just revision rows. To make sure that we'll only be processing + * revisions here, let's _try_ to build a revision out of our row (without displaying + * notices though) and then trying to grab data from the built object. If we succeed, + * we're definitely dealing with revision data and we may proceed, if not, we'll leave it + * to extensions to subscribe to the hook to parse the row. + */ + MediaWiki\suppressWarnings(); + try { + $rev = new Revision( $row ); + $validRevision = (bool)$rev->getId(); + } catch ( Exception $e ) { + $validRevision = false; + } + MediaWiki\restoreWarnings(); + + if ( $validRevision ) { + $classes = []; + + $page = Title::newFromRow( $row ); + $link = Linker::link( + $page, + htmlspecialchars( $page->getPrefixedText() ), + [ 'class' => 'mw-contributions-title' ], + $page->isRedirect() ? [ 'redirect' => 'no' ] : [] + ); + # Mark current revisions + $topmarktext = ''; + $user = $this->getUser(); + if ( $row->rev_id == $row->page_latest ) { + $topmarktext .= '' . $this->messages['uctop'] . ''; + # Add rollback link + if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user ) + && $page->quickUserCan( 'edit', $user ) + ) { + $this->preventClickjacking(); + $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() ); + } + } + # Is there a visible previous revision? + if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) { + $difftext = Linker::linkKnown( + $page, + $this->messages['diff'], + [], + [ + 'diff' => 'prev', + 'oldid' => $row->rev_id + ] + ); + } else { + $difftext = $this->messages['diff']; + } + $histlink = Linker::linkKnown( + $page, + $this->messages['hist'], + [], + [ 'action' => 'history' ] + ); + + if ( $row->rev_parent_id === null ) { + // For some reason rev_parent_id isn't populated for this row. + // Its rumoured this is true on wikipedia for some revisions (bug 34922). + // Next best thing is to have the total number of bytes. + $chardiff = ' . . '; + $chardiff .= Linker::formatRevisionSize( $row->rev_len ); + $chardiff .= ' . . '; + } else { + $parentLen = 0; + if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) { + $parentLen = $this->mParentLens[$row->rev_parent_id]; + } + + $chardiff = ' . . '; + $chardiff .= ChangesList::showCharacterDifference( + $parentLen, + $row->rev_len, + $this->getContext() + ); + $chardiff .= ' . . '; + } + + $lang = $this->getLanguage(); + $comment = $lang->getDirMark() . Linker::revComment( $rev, false, true ); + $date = $lang->userTimeAndDate( $row->rev_timestamp, $user ); + if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) { + $d = Linker::linkKnown( + $page, + htmlspecialchars( $date ), + [ 'class' => 'mw-changeslist-date' ], + [ 'oldid' => intval( $row->rev_id ) ] + ); + } else { + $d = htmlspecialchars( $date ); + } + if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { + $d = '' . $d . ''; + } + + # Show user names for /newbies as there may be different users. + # Note that we already excluded rows with hidden user names. + if ( $this->contribs == 'newbie' ) { + $userlink = ' . . ' . $lang->getDirMark() + . Linker::userLink( $rev->getUser(), $rev->getUserText() ); + $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams( + Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; + } else { + $userlink = ''; + } + + if ( $rev->getParentId() === 0 ) { + $nflag = ChangesList::flag( 'newpage' ); + } else { + $nflag = ''; + } + + if ( $rev->isMinor() ) { + $mflag = ChangesList::flag( 'minor' ); + } else { + $mflag = ''; + } + + $del = Linker::getRevDeleteLink( $user, $rev, $page ); + if ( $del !== '' ) { + $del .= ' '; + } + + $diffHistLinks = $this->msg( 'parentheses' ) + ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink ) + ->escaped(); + $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} "; + $ret .= "{$link}{$userlink} {$comment} {$topmarktext}"; + + # Denote if username is redacted for this edit + if ( $rev->isDeleted( Revision::DELETED_USER ) ) { + $ret .= " " . + $this->msg( 'rev-deleted-user-contribs' )->escaped() . + ""; + } + + # Tags, if any. + list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( + $row->ts_tags, + 'contributions', + $this->getContext() + ); + $classes = array_merge( $classes, $newClasses ); + $ret .= " $tagSummary"; + } + + // Let extensions add data + Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); + + if ( $classes === [] && $ret === '' ) { + wfDebug( "Dropping Special:Contribution row that could not be formatted\n" ); + $ret = "\n"; + } else { + $ret = Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; + } + + return $ret; + } + + /** + * Overwrite Pager function and return a helpful comment + * @return string + */ + function getSqlComment() { + if ( $this->namespace || $this->deletedOnly ) { + // potentially slow, see CR r58153 + return 'contributions page filtered for namespace or RevisionDeleted edits'; + } else { + return 'contributions page unfiltered'; + } + } + + protected function preventClickjacking() { + $this->preventClickjacking = true; + } + + /** + * @return bool + */ + public function getPreventClickjacking() { + return $this->preventClickjacking; + } +} diff --git a/includes/specials/pagers/DeletedContribsPager.php b/includes/specials/pagers/DeletedContribsPager.php new file mode 100644 index 0000000000..f2421f871a --- /dev/null +++ b/includes/specials/pagers/DeletedContribsPager.php @@ -0,0 +1,355 @@ +messages[$msg] = $this->msg( $msg )->escaped(); + } + $this->target = $target; + $this->namespace = $namespace; + $this->mDb = wfGetDB( DB_SLAVE, 'contributions' ); + } + + function getDefaultQuery() { + $query = parent::getDefaultQuery(); + $query['target'] = $this->target; + + return $query; + } + + function getQueryInfo() { + list( $index, $userCond ) = $this->getUserCond(); + $conds = array_merge( $userCond, $this->getNamespaceCond() ); + $user = $this->getUser(); + // Paranoia: avoid brute force searches (bug 17792) + if ( !$user->isAllowed( 'deletedhistory' ) ) { + $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0'; + } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { + $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) . + ' != ' . Revision::SUPPRESSED_USER; + } + + return [ + 'tables' => [ 'archive' ], + 'fields' => [ + 'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', + 'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted' + ], + 'conds' => $conds, + 'options' => [ 'USE INDEX' => $index ] + ]; + } + + /** + * This method basically executes the exact same code as the parent class, though with + * a hook added, to allow extensions to add additional queries. + * + * @param string $offset Index offset, inclusive + * @param int $limit Exact query limit + * @param bool $descending Query direction, false for ascending, true for descending + * @return ResultWrapper + */ + function reallyDoQuery( $offset, $limit, $descending ) { + $data = [ parent::reallyDoQuery( $offset, $limit, $descending ) ]; + + // This hook will allow extensions to add in additional queries, nearly + // identical to ContribsPager::reallyDoQuery. + Hooks::run( + 'DeletedContribsPager::reallyDoQuery', + [ &$data, $this, $offset, $limit, $descending ] + ); + + $result = []; + + // loop all results and collect them in an array + foreach ( $data as $query ) { + foreach ( $query as $i => $row ) { + // use index column as key, allowing us to easily sort in PHP + $result[$row->{$this->getIndexField()} . "-$i"] = $row; + } + } + + // sort results + if ( $descending ) { + ksort( $result ); + } else { + krsort( $result ); + } + + // enforce limit + $result = array_slice( $result, 0, $limit ); + + // get rid of array keys + $result = array_values( $result ); + + return new FakeResultWrapper( $result ); + } + + function getUserCond() { + $condition = []; + + $condition['ar_user_text'] = $this->target; + $index = 'usertext_timestamp'; + + return [ $index, $condition ]; + } + + function getIndexField() { + return 'ar_timestamp'; + } + + function getStartBody() { + return "\n"; + } + + function getNavigationBar() { + if ( isset( $this->mNavigationBar ) ) { + return $this->mNavigationBar; + } + + $linkTexts = [ + 'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(), + 'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(), + 'first' => $this->msg( 'histlast' )->escaped(), + 'last' => $this->msg( 'histfirst' )->escaped() + ]; + + $pagingLinks = $this->getPagingLinks( $linkTexts ); + $limitLinks = $this->getLimitLinks(); + $lang = $this->getLanguage(); + $limits = $lang->pipeList( $limitLinks ); + + $firstLast = $lang->pipeList( [ $pagingLinks['first'], $pagingLinks['last'] ] ); + $firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped(); + $prevNext = $this->msg( 'viewprevnext' ) + ->rawParams( + $pagingLinks['prev'], + $pagingLinks['next'], + $limits + )->escaped(); + $separator = $this->msg( 'word-separator' )->escaped(); + $this->mNavigationBar = $firstLast . $separator . $prevNext; + + return $this->mNavigationBar; + } + + function getNamespaceCond() { + if ( $this->namespace !== '' ) { + return [ 'ar_namespace' => (int)$this->namespace ]; + } else { + return []; + } + } + + /** + * Generates each row in the contributions list. + * + * @todo This would probably look a lot nicer in a table. + * @param stdClass $row + * @return string + */ + function formatRow( $row ) { + $ret = ''; + $classes = []; + + /* + * There may be more than just revision rows. To make sure that we'll only be processing + * revisions here, let's _try_ to build a revision out of our row (without displaying + * notices though) and then trying to grab data from the built object. If we succeed, + * we're definitely dealing with revision data and we may proceed, if not, we'll leave it + * to extensions to subscribe to the hook to parse the row. + */ + MediaWiki\suppressWarnings(); + try { + $rev = Revision::newFromArchiveRow( $row ); + $validRevision = (bool)$rev->getId(); + } catch ( Exception $e ) { + $validRevision = false; + } + MediaWiki\restoreWarnings(); + + if ( $validRevision ) { + $ret = $this->formatRevisionRow( $row ); + } + + // Let extensions add data + Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes ] ); + + if ( $classes === [] && $ret === '' ) { + wfDebug( "Dropping Special:DeletedContribution row that could not be formatted\n" ); + $ret = "\n"; + } else { + $ret = Html::rawElement( 'li', [ 'class' => $classes ], $ret ) . "\n"; + } + + return $ret; + } + + /** + * Generates each row in the contributions list for archive entries. + * + * Contributions which are marked "top" are currently on top of the history. + * For these contributions, a [rollback] link is shown for users with sysop + * privileges. The rollback link restores the most recent version that was not + * written by the target user. + * + * @todo This would probably look a lot nicer in a table. + * @param stdClass $row + * @return string + */ + function formatRevisionRow( $row ) { + $page = Title::makeTitle( $row->ar_namespace, $row->ar_title ); + + $rev = new Revision( [ + 'title' => $page, + 'id' => $row->ar_rev_id, + 'comment' => $row->ar_comment, + 'user' => $row->ar_user, + 'user_text' => $row->ar_user_text, + 'timestamp' => $row->ar_timestamp, + 'minor_edit' => $row->ar_minor_edit, + 'deleted' => $row->ar_deleted, + ] ); + + $undelete = SpecialPage::getTitleFor( 'Undelete' ); + + $logs = SpecialPage::getTitleFor( 'Log' ); + $dellog = Linker::linkKnown( + $logs, + $this->messages['deletionlog'], + [], + [ + 'type' => 'delete', + 'page' => $page->getPrefixedText() + ] + ); + + $reviewlink = Linker::linkKnown( + SpecialPage::getTitleFor( 'Undelete', $page->getPrefixedDBkey() ), + $this->messages['undeleteviewlink'] + ); + + $user = $this->getUser(); + + if ( $user->isAllowed( 'deletedtext' ) ) { + $last = Linker::linkKnown( + $undelete, + $this->messages['diff'], + [], + [ + 'target' => $page->getPrefixedText(), + 'timestamp' => $rev->getTimestamp(), + 'diff' => 'prev' + ] + ); + } else { + $last = $this->messages['diff']; + } + + $comment = Linker::revComment( $rev ); + $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ); + $date = htmlspecialchars( $date ); + + if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) { + $link = $date; // unusable link + } else { + $link = Linker::linkKnown( + $undelete, + $date, + [ 'class' => 'mw-changeslist-date' ], + [ + 'target' => $page->getPrefixedText(), + 'timestamp' => $rev->getTimestamp() + ] + ); + } + // Style deleted items + if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) { + $link = '' . $link . ''; + } + + $pagelink = Linker::link( + $page, + null, + [ 'class' => 'mw-changeslist-title' ] + ); + + if ( $rev->isMinor() ) { + $mflag = ChangesList::flag( 'minor' ); + } else { + $mflag = ''; + } + + // Revision delete link + $del = Linker::getRevDeleteLink( $user, $rev, $page ); + if ( $del ) { + $del .= ' '; + } + + $tools = Html::rawElement( + 'span', + [ 'class' => 'mw-deletedcontribs-tools' ], + $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( + [ $last, $dellog, $reviewlink ] ) )->escaped() + ); + + $separator = '. .'; + $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}"; + + # Denote if username is redacted for this edit + if ( $rev->isDeleted( Revision::DELETED_USER ) ) { + $ret .= " " . $this->msg( 'rev-deleted-user-contribs' )->escaped() . ""; + } + + return $ret; + } + + /** + * Get the Database object in use + * + * @return IDatabase + */ + public function getDatabase() { + return $this->mDb; + } +} diff --git a/includes/specials/pagers/ImageListPager.php b/includes/specials/pagers/ImageListPager.php new file mode 100644 index 0000000000..48f60caf15 --- /dev/null +++ b/includes/specials/pagers/ImageListPager.php @@ -0,0 +1,602 @@ +setContext( $context ); + $this->mIncluding = $including; + $this->mShowAll = $showAll; + + if ( $userName !== null && $userName !== '' ) { + $nt = Title::newFromText( $userName, NS_USER ); + if ( is_null( $nt ) ) { + $this->outputUserDoesNotExist( $userName ); + } else { + $this->mUserName = $nt->getText(); + $user = User::newFromName( $this->mUserName, false ); + if ( $user ) { + $this->mUser = $user; + } + if ( !$user || ( $user->isAnon() && !User::isIP( $user->getName() ) ) ) { + $this->outputUserDoesNotExist( $userName ); + } + } + } + + if ( $search !== '' && !$this->getConfig()->get( 'MiserMode' ) ) { + $this->mSearch = $search; + $nt = Title::newFromText( $this->mSearch ); + + if ( $nt ) { + $dbr = wfGetDB( DB_SLAVE ); + $this->mQueryConds[] = 'LOWER(img_name)' . + $dbr->buildLike( $dbr->anyString(), + strtolower( $nt->getDBkey() ), $dbr->anyString() ); + } + } + + if ( !$including ) { + if ( $this->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) { + $this->mDefaultDirection = IndexPager::DIR_DESCENDING; + } else { + $this->mDefaultDirection = IndexPager::DIR_ASCENDING; + } + } else { + $this->mDefaultDirection = IndexPager::DIR_DESCENDING; + } + + parent::__construct( $context ); + } + + /** + * Get the user relevant to the ImageList + * + * @return User|null + */ + function getRelevantUser() { + return $this->mUser; + } + + /** + * Add a message to the output stating that the user doesn't exist + * + * @param string $userName Unescaped user name + */ + protected function outputUserDoesNotExist( $userName ) { + $this->getOutput()->wrapWikiMsg( + "
\n$1\n
", + [ + 'listfiles-userdoesnotexist', + wfEscapeWikiText( $userName ), + ] + ); + } + + /** + * Build the where clause of the query. + * + * Replaces the older mQueryConds member variable. + * @param string $table Either "image" or "oldimage" + * @return array The query conditions. + */ + protected function buildQueryConds( $table ) { + $prefix = $table === 'image' ? 'img' : 'oi'; + $conds = []; + + if ( !is_null( $this->mUserName ) ) { + $conds[$prefix . '_user_text'] = $this->mUserName; + } + + if ( $this->mSearch !== '' ) { + $nt = Title::newFromText( $this->mSearch ); + if ( $nt ) { + $dbr = wfGetDB( DB_SLAVE ); + $conds[] = 'LOWER(' . $prefix . '_name)' . + $dbr->buildLike( $dbr->anyString(), + strtolower( $nt->getDBkey() ), $dbr->anyString() ); + } + } + + if ( $table === 'oldimage' ) { + // Don't want to deal with revdel. + // Future fixme: Show partial information as appropriate. + // Would have to be careful about filtering by username when username is deleted. + $conds['oi_deleted'] = 0; + } + + // Add mQueryConds in case anyone was subclassing and using the old variable. + return $conds + $this->mQueryConds; + } + + /** + * @return array + */ + function getFieldNames() { + if ( !$this->mFieldNames ) { + $this->mFieldNames = [ + 'img_timestamp' => $this->msg( 'listfiles_date' )->text(), + 'img_name' => $this->msg( 'listfiles_name' )->text(), + 'thumb' => $this->msg( 'listfiles_thumb' )->text(), + 'img_size' => $this->msg( 'listfiles_size' )->text(), + ]; + if ( is_null( $this->mUserName ) ) { + // Do not show username if filtering by username + $this->mFieldNames['img_user_text'] = $this->msg( 'listfiles_user' )->text(); + } + // img_description down here, in order so that its still after the username field. + $this->mFieldNames['img_description'] = $this->msg( 'listfiles_description' )->text(); + + if ( !$this->getConfig()->get( 'MiserMode' ) && !$this->mShowAll ) { + $this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text(); + } + if ( $this->mShowAll ) { + $this->mFieldNames['top'] = $this->msg( 'listfiles-latestversion' )->text(); + } + } + + return $this->mFieldNames; + } + + function isFieldSortable( $field ) { + if ( $this->mIncluding ) { + return false; + } + $sortable = [ 'img_timestamp', 'img_name', 'img_size' ]; + /* For reference, the indicies we can use for sorting are: + * On the image table: img_usertext_timestamp, img_size, img_timestamp + * On oldimage: oi_usertext_timestamp, oi_name_timestamp + * + * In particular that means we cannot sort by timestamp when not filtering + * by user and including old images in the results. Which is sad. + */ + if ( $this->getConfig()->get( 'MiserMode' ) && !is_null( $this->mUserName ) ) { + // If we're sorting by user, the index only supports sorting by time. + if ( $field === 'img_timestamp' ) { + return true; + } else { + return false; + } + } elseif ( $this->getConfig()->get( 'MiserMode' ) + && $this->mShowAll /* && mUserName === null */ + ) { + // no oi_timestamp index, so only alphabetical sorting in this case. + if ( $field === 'img_name' ) { + return true; + } else { + return false; + } + } + + return in_array( $field, $sortable ); + } + + function getQueryInfo() { + // Hacky Hacky Hacky - I want to get query info + // for two different tables, without reimplementing + // the pager class. + $qi = $this->getQueryInfoReal( $this->mTableName ); + + return $qi; + } + + /** + * Actually get the query info. + * + * This is to allow displaying both stuff from image and oldimage table. + * + * This is a bit hacky. + * + * @param string $table Either 'image' or 'oldimage' + * @return array Query info + */ + protected function getQueryInfoReal( $table ) { + $prefix = $table === 'oldimage' ? 'oi' : 'img'; + + $tables = [ $table ]; + $fields = array_keys( $this->getFieldNames() ); + + if ( $table === 'oldimage' ) { + foreach ( $fields as $id => &$field ) { + if ( substr( $field, 0, 4 ) !== 'img_' ) { + continue; + } + $field = $prefix . substr( $field, 3 ) . ' AS ' . $field; + } + $fields[array_search( 'top', $fields )] = "'no' AS top"; + } else { + if ( $this->mShowAll ) { + $fields[array_search( 'top', $fields )] = "'yes' AS top"; + } + } + $fields[] = $prefix . '_user AS img_user'; + $fields[array_search( 'thumb', $fields )] = $prefix . '_name AS thumb'; + + $options = $join_conds = []; + + # Depends on $wgMiserMode + # Will also not happen if mShowAll is true. + if ( isset( $this->mFieldNames['count'] ) ) { + $tables[] = 'oldimage'; + + # Need to rewrite this one + foreach ( $fields as &$field ) { + if ( $field == 'count' ) { + $field = 'COUNT(oi_archive_name) AS count'; + } + } + unset( $field ); + + $dbr = wfGetDB( DB_SLAVE ); + if ( $dbr->implicitGroupby() ) { + $options = [ 'GROUP BY' => 'img_name' ]; + } else { + $columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) ); + $options = [ 'GROUP BY' => array_merge( [ 'img_user' ], $columnlist ) ]; + } + $join_conds = [ 'oldimage' => [ 'LEFT JOIN', 'oi_name = img_name' ] ]; + } + + return [ + 'tables' => $tables, + 'fields' => $fields, + 'conds' => $this->buildQueryConds( $table ), + 'options' => $options, + 'join_conds' => $join_conds + ]; + } + + /** + * Override reallyDoQuery to mix together two queries. + * + * @note $asc is named $descending in IndexPager base class. However + * it is true when the order is ascending, and false when the order + * is descending, so I renamed it to $asc here. + * @param int $offset + * @param int $limit + * @param bool $asc + * @return array + * @throws MWException + */ + function reallyDoQuery( $offset, $limit, $asc ) { + $prevTableName = $this->mTableName; + $this->mTableName = 'image'; + list( $tables, $fields, $conds, $fname, $options, $join_conds ) = + $this->buildQueryInfo( $offset, $limit, $asc ); + $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ); + $this->mTableName = $prevTableName; + + if ( !$this->mShowAll ) { + return $imageRes; + } + + $this->mTableName = 'oldimage'; + + # Hacky... + $oldIndex = $this->mIndexField; + if ( substr( $this->mIndexField, 0, 4 ) !== 'img_' ) { + throw new MWException( "Expected to be sorting on an image table field" ); + } + $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 ); + + list( $tables, $fields, $conds, $fname, $options, $join_conds ) = + $this->buildQueryInfo( $offset, $limit, $asc ); + $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ); + + $this->mTableName = $prevTableName; + $this->mIndexField = $oldIndex; + + return $this->combineResult( $imageRes, $oldimageRes, $limit, $asc ); + } + + /** + * Combine results from 2 tables. + * + * Note: This will throw away some results + * + * @param ResultWrapper $res1 + * @param ResultWrapper $res2 + * @param int $limit + * @param bool $ascending See note about $asc in $this->reallyDoQuery + * @return FakeResultWrapper $res1 and $res2 combined + */ + protected function combineResult( $res1, $res2, $limit, $ascending ) { + $res1->rewind(); + $res2->rewind(); + $topRes1 = $res1->next(); + $topRes2 = $res2->next(); + $resultArray = []; + for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) { + if ( strcmp( $topRes1->{$this->mIndexField}, $topRes2->{$this->mIndexField} ) > 0 ) { + if ( !$ascending ) { + $resultArray[] = $topRes1; + $topRes1 = $res1->next(); + } else { + $resultArray[] = $topRes2; + $topRes2 = $res2->next(); + } + } else { + if ( !$ascending ) { + $resultArray[] = $topRes2; + $topRes2 = $res2->next(); + } else { + $resultArray[] = $topRes1; + $topRes1 = $res1->next(); + } + } + } + + // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect + for ( ; $i < $limit && $topRes1; $i++ ) { + // @codingStandardsIgnoreEnd + $resultArray[] = $topRes1; + $topRes1 = $res1->next(); + } + + // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect + for ( ; $i < $limit && $topRes2; $i++ ) { + // @codingStandardsIgnoreEnd + $resultArray[] = $topRes2; + $topRes2 = $res2->next(); + } + + return new FakeResultWrapper( $resultArray ); + } + + function getDefaultSort() { + if ( $this->mShowAll && $this->getConfig()->get( 'MiserMode' ) && is_null( $this->mUserName ) ) { + // Unfortunately no index on oi_timestamp. + return 'img_name'; + } else { + return 'img_timestamp'; + } + } + + function doBatchLookups() { + $userIds = []; + $this->mResult->seek( 0 ); + foreach ( $this->mResult as $row ) { + $userIds[] = $row->img_user; + } + # Do a link batch query for names and userpages + UserCache::singleton()->doQuery( $userIds, [ 'userpage' ], __METHOD__ ); + } + + /** + * @param string $field + * @param string $value + * @return Message|string|int The return type depends on the value of $field: + * - thumb: string + * - img_timestamp: string + * - img_name: string + * - img_user_text: string + * - img_size: string + * - img_description: string + * - count: int + * - top: Message + * @throws MWException + */ + function formatValue( $field, $value ) { + switch ( $field ) { + case 'thumb': + $opt = [ 'time' => wfTimestamp( TS_MW, $this->mCurrentRow->img_timestamp ) ]; + $file = RepoGroup::singleton()->getLocalRepo()->findFile( $value, $opt ); + // If statement for paranoia + if ( $file ) { + $thumb = $file->transform( [ 'width' => 180, 'height' => 360 ] ); + + return $thumb->toHtml( [ 'desc-link' => true ] ); + } else { + return htmlspecialchars( $value ); + } + case 'img_timestamp': + // We may want to make this a link to the "old" version when displaying old files + return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) ); + case 'img_name': + static $imgfile = null; + if ( $imgfile === null ) { + $imgfile = $this->msg( 'imgfile' )->text(); + } + + // Weird files can maybe exist? Bug 22227 + $filePage = Title::makeTitleSafe( NS_FILE, $value ); + if ( $filePage ) { + $link = Linker::linkKnown( + $filePage, + htmlspecialchars( $filePage->getText() ) + ); + $download = Xml::element( 'a', + [ 'href' => wfLocalFile( $filePage )->getUrl() ], + $imgfile + ); + $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped(); + + // Add delete links if allowed + // From https://github.com/Wikia/app/pull/3859 + if ( $filePage->userCan( 'delete', $this->getUser() ) ) { + $deleteMsg = $this->msg( 'listfiles-delete' )->escaped(); + + $delete = Linker::linkKnown( + $filePage, $deleteMsg, [], [ 'action' => 'delete' ] + ); + $delete = $this->msg( 'parentheses' )->rawParams( $delete )->escaped(); + + return "$link $download $delete"; + } + + return "$link $download"; + } else { + return htmlspecialchars( $value ); + } + case 'img_user_text': + if ( $this->mCurrentRow->img_user ) { + $name = User::whoIs( $this->mCurrentRow->img_user ); + $link = Linker::link( + Title::makeTitle( NS_USER, $name ), + htmlspecialchars( $name ) + ); + } else { + $link = htmlspecialchars( $value ); + } + + return $link; + case 'img_size': + return htmlspecialchars( $this->getLanguage()->formatSize( $value ) ); + case 'img_description': + return Linker::formatComment( $value ); + case 'count': + return intval( $value ) + 1; + case 'top': + // Messages: listfiles-latestversion-yes, listfiles-latestversion-no + return $this->msg( 'listfiles-latestversion-' . $value ); + default: + throw new MWException( "Unknown field '$field'" ); + } + } + + function getForm() { + $fields = []; + $fields['limit'] = [ + 'type' => 'select', + 'name' => 'limit', + 'label-message' => 'table_pager_limit_label', + 'options' => $this->getLimitSelectList(), + 'default' => $this->mLimit, + ]; + + if ( !$this->getConfig()->get( 'MiserMode' ) ) { + $fields['ilsearch'] = [ + 'type' => 'text', + 'name' => 'ilsearch', + 'id' => 'mw-ilsearch', + 'label-message' => 'listfiles_search_for', + 'default' => $this->mSearch, + 'size' => '40', + 'maxlength' => '255', + ]; + } + + $this->getOutput()->addModules( 'mediawiki.userSuggest' ); + $fields['user'] = [ + 'type' => 'text', + 'name' => 'user', + 'id' => 'mw-listfiles-user', + 'label-message' => 'username', + 'default' => $this->mUserName, + 'size' => '40', + 'maxlength' => '255', + 'cssclass' => 'mw-autocomplete-user', // used by mediawiki.userSuggest + ]; + + $fields['ilshowall'] = [ + 'type' => 'check', + 'name' => 'ilshowall', + 'id' => 'mw-listfiles-show-all', + 'label-message' => 'listfiles-show-all', + 'default' => $this->mShowAll, + ]; + + $query = $this->getRequest()->getQueryValues(); + unset( $query['title'] ); + unset( $query['limit'] ); + unset( $query['ilsearch'] ); + unset( $query['ilshowall'] ); + unset( $query['user'] ); + + $form = new HTMLForm( $fields, $this->getContext() ); + + $form->setMethod( 'get' ); + $form->setTitle( $this->getTitle() ); + $form->setId( 'mw-listfiles-form' ); + $form->setWrapperLegendMsg( 'listfiles' ); + $form->setSubmitTextMsg( 'table_pager_limit_submit' ); + $form->addHiddenFields( $query ); + + $form->prepareForm(); + $form->displayForm( '' ); + } + + function getTableClass() { + return parent::getTableClass() . ' listfiles'; + } + + function getNavClass() { + return parent::getNavClass() . ' listfiles_nav'; + } + + function getSortHeaderClass() { + return parent::getSortHeaderClass() . ' listfiles_sort'; + } + + function getPagingQueries() { + $queries = parent::getPagingQueries(); + if ( !is_null( $this->mUserName ) ) { + # Append the username to the query string + foreach ( $queries as &$query ) { + if ( $query !== false ) { + $query['user'] = $this->mUserName; + } + } + } + + return $queries; + } + + function getDefaultQuery() { + $queries = parent::getDefaultQuery(); + if ( !isset( $queries['user'] ) && !is_null( $this->mUserName ) ) { + $queries['user'] = $this->mUserName; + } + + return $queries; + } + + function getTitle() { + return SpecialPage::getTitleFor( 'Listfiles' ); + } +} diff --git a/includes/specials/pagers/MergeHistoryPager.php b/includes/specials/pagers/MergeHistoryPager.php new file mode 100644 index 0000000000..0b9587c422 --- /dev/null +++ b/includes/specials/pagers/MergeHistoryPager.php @@ -0,0 +1,99 @@ +mForm = $form; + $this->mConds = $conds; + $this->title = $source; + $this->articleID = $source->getArticleID(); + + $dbr = wfGetDB( DB_SLAVE ); + $maxtimestamp = $dbr->selectField( + 'revision', + 'MIN(rev_timestamp)', + [ 'rev_page' => $dest->getArticleID() ], + __METHOD__ + ); + $this->maxTimestamp = $maxtimestamp; + + parent::__construct( $form->getContext() ); + } + + function getStartBody() { + # Do a link batch query + $this->mResult->seek( 0 ); + $batch = new LinkBatch(); + # Give some pointers to make (last) links + $this->mForm->prevId = []; + foreach ( $this->mResult as $row ) { + $batch->addObj( Title::makeTitleSafe( NS_USER, $row->user_name ) ); + $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) ); + + $rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id; + if ( $rev_id > $row->rev_id ) { + $this->mForm->prevId[$rev_id] = $row->rev_id; + } elseif ( $rev_id < $row->rev_id ) { + $this->mForm->prevId[$row->rev_id] = $rev_id; + } + + $rev_id = $row->rev_id; + } + + $batch->execute(); + $this->mResult->seek( 0 ); + + return ''; + } + + function formatRow( $row ) { + return $this->mForm->formatRevisionRow( $row ); + } + + function getQueryInfo() { + $conds = $this->mConds; + $conds['rev_page'] = $this->articleID; + $conds[] = "rev_timestamp < " . $this->mDb->addQuotes( $this->maxTimestamp ); + + return [ + 'tables' => [ 'revision', 'page', 'user' ], + 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ), + 'conds' => $conds, + 'join_conds' => [ + 'page' => Revision::pageJoinCond(), + 'user' => Revision::userJoinCond() ] + ]; + } + + function getIndexField() { + return 'rev_timestamp'; + } +} diff --git a/includes/specials/pagers/NewFilesPager.php b/includes/specials/pagers/NewFilesPager.php new file mode 100644 index 0000000000..ae5773617c --- /dev/null +++ b/includes/specials/pagers/NewFilesPager.php @@ -0,0 +1,207 @@ +like = $context->getRequest()->getText( 'like' ); + $this->showBots = $context->getRequest()->getBool( 'showbots', 0 ); + $this->hidePatrolled = $context->getRequest()->getBool( 'hidepatrolled', 0 ); + if ( is_numeric( $par ) ) { + $this->setLimit( $par ); + } + + parent::__construct( $context ); + } + + function getQueryInfo() { + $conds = $jconds = []; + $tables = [ 'image' ]; + $fields = [ 'img_name', 'img_user', 'img_timestamp' ]; + $options = []; + + if ( !$this->showBots ) { + $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' ); + + if ( count( $groupsWithBotPermission ) ) { + $tables[] = 'user_groups'; + $conds[] = 'ug_group IS NULL'; + $jconds['user_groups'] = [ + 'LEFT JOIN', + [ + 'ug_group' => $groupsWithBotPermission, + 'ug_user = img_user' + ] + ]; + } + } + + if ( $this->hidePatrolled ) { + $tables[] = 'recentchanges'; + $conds['rc_type'] = RC_LOG; + $conds['rc_log_type'] = 'upload'; + $conds['rc_patrolled'] = 0; + $conds['rc_namespace'] = NS_FILE; + $jconds['recentchanges'] = [ + 'INNER JOIN', + [ + 'rc_title = img_name', + 'rc_user = img_user', + 'rc_timestamp = img_timestamp' + ] + ]; + // We're ordering by img_timestamp, so we have to make sure MariaDB queries `image` first. + // It sometimes decides to query `recentchanges` first and filesort the result set later + // to get the right ordering. T124205 / https://mariadb.atlassian.net/browse/MDEV-8880 + $options[] = 'STRAIGHT_JOIN'; + } + + if ( !$this->getConfig()->get( 'MiserMode' ) && $this->like !== null ) { + $dbr = wfGetDB( DB_SLAVE ); + $likeObj = Title::newFromText( $this->like ); + if ( $likeObj instanceof Title ) { + $like = $dbr->buildLike( + $dbr->anyString(), + strtolower( $likeObj->getDBkey() ), + $dbr->anyString() + ); + $conds[] = "LOWER(img_name) $like"; + } + } + + $query = [ + 'tables' => $tables, + 'fields' => $fields, + 'join_conds' => $jconds, + 'conds' => $conds, + 'options' => $options, + ]; + + return $query; + } + + function getIndexField() { + return 'img_timestamp'; + } + + function getStartBody() { + if ( !$this->gallery ) { + // Note that null for mode is taken to mean use default. + $mode = $this->getRequest()->getVal( 'gallerymode', null ); + try { + $this->gallery = ImageGalleryBase::factory( $mode, $this->getContext() ); + } catch ( Exception $e ) { + // User specified something invalid, fallback to default. + $this->gallery = ImageGalleryBase::factory( false, $this->getContext() ); + } + } + + return ''; + } + + function getEndBody() { + return $this->gallery->toHTML(); + } + + function formatRow( $row ) { + $name = $row->img_name; + $user = User::newFromId( $row->img_user ); + + $title = Title::makeTitle( NS_FILE, $name ); + $ul = Linker::link( $user->getUserPage(), $user->getName() ); + $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() ); + + $this->gallery->add( + $title, + "$ul
\n" + . htmlspecialchars( $time ) + . "
\n" + ); + } + + function getForm() { + $fields = [ + 'like' => [ + 'type' => 'text', + 'label-message' => 'newimages-label', + 'name' => 'like', + ], + 'showbots' => [ + 'type' => 'check', + 'label-message' => 'newimages-showbots', + 'name' => 'showbots', + ], + 'hidepatrolled' => [ + 'type' => 'check', + 'label-message' => 'newimages-hidepatrolled', + 'name' => 'hidepatrolled', + ], + 'limit' => [ + 'type' => 'hidden', + 'default' => $this->mLimit, + 'name' => 'limit', + ], + 'offset' => [ + 'type' => 'hidden', + 'default' => $this->getRequest()->getText( 'offset' ), + 'name' => 'offset', + ], + ]; + + if ( $this->getConfig()->get( 'MiserMode' ) ) { + unset( $fields['like'] ); + } + + if ( !$this->getUser()->useFilePatrol() ) { + unset( $fields['hidepatrolled'] ); + } + + $context = new DerivativeContext( $this->getContext() ); + $context->setTitle( $this->getTitle() ); // Remove subpage + $form = new HTMLForm( $fields, $context ); + + $form->setSubmitTextMsg( 'ilsubmit' ); + $form->setSubmitProgressive(); + + $form->setMethod( 'get' ); + $form->setWrapperLegendMsg( 'newimages-legend' ); + + return $form; + } +} diff --git a/includes/specials/pagers/NewPagesPager.php b/includes/specials/pagers/NewPagesPager.php new file mode 100644 index 0000000000..2d39f99dc7 --- /dev/null +++ b/includes/specials/pagers/NewPagesPager.php @@ -0,0 +1,148 @@ +getContext() ); + $this->mForm = $form; + $this->opts = $opts; + } + + function getQueryInfo() { + $conds = []; + $conds['rc_new'] = 1; + + $namespace = $this->opts->getValue( 'namespace' ); + $namespace = ( $namespace === 'all' ) ? false : intval( $namespace ); + + $username = $this->opts->getValue( 'username' ); + $user = Title::makeTitleSafe( NS_USER, $username ); + + $rcIndexes = []; + + if ( $namespace !== false ) { + if ( $this->opts->getValue( 'invert' ) ) { + $conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace ); + } else { + $conds['rc_namespace'] = $namespace; + } + } + + if ( $user ) { + $conds['rc_user_text'] = $user->getText(); + $rcIndexes = 'rc_user_text'; + } elseif ( User::groupHasPermission( '*', 'createpage' ) && + $this->opts->getValue( 'hideliu' ) + ) { + # If anons cannot make new pages, don't "exclude logged in users"! + $conds['rc_user'] = 0; + } + + # If this user cannot see patrolled edits or they are off, don't do dumb queries! + if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) { + $conds['rc_patrolled'] = 0; + } + + if ( $this->opts->getValue( 'hidebots' ) ) { + $conds['rc_bot'] = 0; + } + + if ( $this->opts->getValue( 'hideredirs' ) ) { + $conds['page_is_redirect'] = 0; + } + + // Allow changes to the New Pages query + $tables = [ 'recentchanges', 'page' ]; + $fields = [ + 'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text', + 'rc_comment', 'rc_timestamp', 'rc_patrolled', 'rc_id', 'rc_deleted', + 'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid', + 'page_namespace', 'page_title' + ]; + $join_conds = [ 'page' => [ 'INNER JOIN', 'page_id=rc_cur_id' ] ]; + + Hooks::run( 'SpecialNewpagesConditions', + [ &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ] ); + + $options = []; + + if ( $rcIndexes ) { + $options = [ 'USE INDEX' => [ 'recentchanges' => $rcIndexes ] ]; + } + + $info = [ + 'tables' => $tables, + 'fields' => $fields, + 'conds' => $conds, + 'options' => $options, + 'join_conds' => $join_conds + ]; + + // Modify query for tags + ChangeTags::modifyDisplayQuery( + $info['tables'], + $info['fields'], + $info['conds'], + $info['join_conds'], + $info['options'], + $this->opts['tagfilter'] + ); + + return $info; + } + + function getIndexField() { + return 'rc_timestamp'; + } + + function formatRow( $row ) { + return $this->mForm->formatRow( $row ); + } + + function getStartBody() { + # Do a batch existence check on pages + $linkBatch = new LinkBatch(); + foreach ( $this->mResult as $row ) { + $linkBatch->add( NS_USER, $row->rc_user_text ); + $linkBatch->add( NS_USER_TALK, $row->rc_user_text ); + $linkBatch->add( $row->page_namespace, $row->page_title ); + } + $linkBatch->execute(); + + return ''; + } +} diff --git a/includes/specials/pagers/ProtectedTitlesPager.php b/includes/specials/pagers/ProtectedTitlesPager.php new file mode 100644 index 0000000000..8f172f8b55 --- /dev/null +++ b/includes/specials/pagers/ProtectedTitlesPager.php @@ -0,0 +1,91 @@ +mForm = $form; + $this->mConds = $conds; + $this->level = $level; + $this->namespace = $namespace; + $this->size = intval( $size ); + parent::__construct( $form->getContext() ); + } + + function getStartBody() { + # Do a link batch query + $this->mResult->seek( 0 ); + $lb = new LinkBatch; + + foreach ( $this->mResult as $row ) { + $lb->add( $row->pt_namespace, $row->pt_title ); + } + + $lb->execute(); + + return ''; + } + + /** + * @return Title + */ + function getTitle() { + return $this->mForm->getTitle(); + } + + function formatRow( $row ) { + return $this->mForm->formatRow( $row ); + } + + /** + * @return array + */ + function getQueryInfo() { + $conds = $this->mConds; + $conds[] = 'pt_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) . + ' OR pt_expiry IS NULL'; + if ( $this->level ) { + $conds['pt_create_perm'] = $this->level; + } + + if ( !is_null( $this->namespace ) ) { + $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace ); + } + + return [ + 'tables' => 'protected_titles', + 'fields' => [ 'pt_namespace', 'pt_title', 'pt_create_perm', + 'pt_expiry', 'pt_timestamp' ], + 'conds' => $conds + ]; + } + + function getIndexField() { + return 'pt_timestamp'; + } +} diff --git a/includes/specials/pagers/UsersPager.php b/includes/specials/pagers/UsersPager.php new file mode 100644 index 0000000000..7b058c19eb --- /dev/null +++ b/includes/specials/pagers/UsersPager.php @@ -0,0 +1,395 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup Pager + */ + +/** + * This class is used to get a list of user. The ones with specials + * rights (sysop, bureaucrat, developer) will have them displayed + * next to their names. + * + * @ingroup Pager + */ +class UsersPager extends AlphabeticPager { + + /** + * @var array A array with user ids as key and a array of groups as value + */ + protected $userGroupCache; + + /** + * @param IContextSource $context + * @param array $par (Default null) + * @param bool $including Whether this page is being transcluded in + * another page + */ + function __construct( IContextSource $context = null, $par = null, $including = null ) { + if ( $context ) { + $this->setContext( $context ); + } + + $request = $this->getRequest(); + $par = ( $par !== null ) ? $par : ''; + $parms = explode( '/', $par ); + $symsForAll = [ '*', 'user' ]; + + if ( $parms[0] != '' && + ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) + ) { + $this->requestedGroup = $par; + $un = $request->getText( 'username' ); + } elseif ( count( $parms ) == 2 ) { + $this->requestedGroup = $parms[0]; + $un = $parms[1]; + } else { + $this->requestedGroup = $request->getVal( 'group' ); + $un = ( $par != '' ) ? $par : $request->getText( 'username' ); + } + + if ( in_array( $this->requestedGroup, $symsForAll ) ) { + $this->requestedGroup = ''; + } + $this->editsOnly = $request->getBool( 'editsOnly' ); + $this->creationSort = $request->getBool( 'creationSort' ); + $this->including = $including; + $this->mDefaultDirection = $request->getBool( 'desc' ) + ? IndexPager::DIR_DESCENDING + : IndexPager::DIR_ASCENDING; + + $this->requestedUser = ''; + + if ( $un != '' ) { + $username = Title::makeTitleSafe( NS_USER, $un ); + + if ( !is_null( $username ) ) { + $this->requestedUser = $username->getText(); + } + } + + parent::__construct(); + } + + /** + * @return string + */ + function getIndexField() { + return $this->creationSort ? 'user_id' : 'user_name'; + } + + /** + * @return array + */ + function getQueryInfo() { + $dbr = wfGetDB( DB_SLAVE ); + $conds = []; + + // Don't show hidden names + if ( !$this->getUser()->isAllowed( 'hideuser' ) ) { + $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; + } + + $options = []; + + if ( $this->requestedGroup != '' ) { + $conds['ug_group'] = $this->requestedGroup; + } + + if ( $this->requestedUser != '' ) { + # Sorted either by account creation or name + if ( $this->creationSort ) { + $conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) ); + } else { + $conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser ); + } + } + + if ( $this->editsOnly ) { + $conds[] = 'user_editcount > 0'; + } + + $options['GROUP BY'] = $this->creationSort ? 'user_id' : 'user_name'; + + $query = [ + 'tables' => [ 'user', 'user_groups', 'ipblocks' ], + 'fields' => [ + 'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name', + 'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)', + 'edits' => 'MAX(user_editcount)', + 'creation' => 'MIN(user_registration)', + 'ipb_deleted' => 'MAX(ipb_deleted)' // block/hide status + ], + 'options' => $options, + 'join_conds' => [ + 'user_groups' => [ 'LEFT JOIN', 'user_id=ug_user' ], + 'ipblocks' => [ + 'LEFT JOIN', [ + 'user_id=ipb_user', + 'ipb_auto' => 0 + ] + ], + ], + 'conds' => $conds + ]; + + Hooks::run( 'SpecialListusersQueryInfo', [ $this, &$query ] ); + + return $query; + } + + /** + * @param stdClass $row + * @return string + */ + function formatRow( $row ) { + if ( $row->user_id == 0 ) { # Bug 16487 + return ''; + } + + $userName = $row->user_name; + + $ulinks = Linker::userLink( $row->user_id, $userName ); + $ulinks .= Linker::userToolLinksRedContribs( + $row->user_id, + $userName, + (int)$row->edits + ); + + $lang = $this->getLanguage(); + + $groups = ''; + $groups_list = self::getGroups( intval( $row->user_id ), $this->userGroupCache ); + + if ( !$this->including && count( $groups_list ) > 0 ) { + $list = []; + foreach ( $groups_list as $group ) { + $list[] = self::buildGroupLink( $group, $userName ); + } + $groups = $lang->commaList( $list ); + } + + $item = $lang->specialList( $ulinks, $groups ); + + if ( $row->ipb_deleted ) { + $item = "$item"; + } + + $edits = ''; + if ( !$this->including && $this->getConfig()->get( 'Edititis' ) ) { + $count = $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped(); + $edits = $this->msg( 'word-separator' )->escaped() . $this->msg( 'brackets', $count )->escaped(); + } + + $created = ''; + # Some rows may be null + if ( !$this->including && $row->creation ) { + $user = $this->getUser(); + $d = $lang->userDate( $row->creation, $user ); + $t = $lang->userTime( $row->creation, $user ); + $created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped(); + $created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped(); + } + $blocked = !is_null( $row->ipb_deleted ) ? + ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : + ''; + + Hooks::run( 'SpecialListusersFormatRow', [ &$item, $row ] ); + + return Html::rawElement( 'li', [], "{$item}{$edits}{$created}{$blocked}" ); + } + + function doBatchLookups() { + $batch = new LinkBatch(); + $userIds = []; + # Give some pointers to make user links + foreach ( $this->mResult as $row ) { + $batch->add( NS_USER, $row->user_name ); + $batch->add( NS_USER_TALK, $row->user_name ); + $userIds[] = $row->user_id; + } + + // Lookup groups for all the users + $dbr = wfGetDB( DB_SLAVE ); + $groupRes = $dbr->select( + 'user_groups', + [ 'ug_user', 'ug_group' ], + [ 'ug_user' => $userIds ], + __METHOD__ + ); + $cache = []; + $groups = []; + foreach ( $groupRes as $row ) { + $cache[intval( $row->ug_user )][] = $row->ug_group; + $groups[$row->ug_group] = true; + } + $this->userGroupCache = $cache; + + // Add page of groups to link batch + foreach ( $groups as $group => $unused ) { + $groupPage = User::getGroupPage( $group ); + if ( $groupPage ) { + $batch->addObj( $groupPage ); + } + } + + $batch->execute(); + $this->mResult->rewind(); + } + + /** + * @return string + */ + function getPageHeader() { + list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() ); + + $this->getOutput()->addModules( 'mediawiki.userSuggest' ); + + # Form tag + $out = Xml::openElement( + 'form', + [ 'method' => 'get', 'action' => wfScript(), 'id' => 'mw-listusers-form' ] + ) . + Xml::fieldset( $this->msg( 'listusers' )->text() ) . + Html::hidden( 'title', $self ); + + # Username field (with autocompletion support) + $out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' . + Html::input( + 'username', + $this->requestedUser, + 'text', + [ + 'class' => 'mw-autocomplete-user', + 'id' => 'offset', + 'size' => 20, + 'autofocus' => $this->requestedUser === '' + ] + ) . ' '; + + # Group drop-down list + $sel = new XmlSelect( 'group', 'group', $this->requestedGroup ); + $sel->addOption( $this->msg( 'group-all' )->text(), '' ); + foreach ( $this->getAllGroups() as $group => $groupText ) { + $sel->addOption( $groupText, $group ); + } + + $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' '; + $out .= $sel->getHTML() . '
'; + $out .= Xml::checkLabel( + $this->msg( 'listusers-editsonly' )->text(), + 'editsOnly', + 'editsOnly', + $this->editsOnly + ); + $out .= ' '; + $out .= Xml::checkLabel( + $this->msg( 'listusers-creationsort' )->text(), + 'creationSort', + 'creationSort', + $this->creationSort + ); + $out .= ' '; + $out .= Xml::checkLabel( + $this->msg( 'listusers-desc' )->text(), + 'desc', + 'desc', + $this->mDefaultDirection + ); + $out .= '
'; + + Hooks::run( 'SpecialListusersHeaderForm', [ $this, &$out ] ); + + # Submit button and form bottom + $out .= Html::hidden( 'limit', $this->mLimit ); + $out .= Xml::submitButton( $this->msg( 'listusers-submit' )->text() ); + Hooks::run( 'SpecialListusersHeader', [ $this, &$out ] ); + $out .= Xml::closeElement( 'fieldset' ) . + Xml::closeElement( 'form' ); + + return $out; + } + + /** + * Get a list of all explicit groups + * @return array + */ + function getAllGroups() { + $result = []; + foreach ( User::getAllGroups() as $group ) { + $result[$group] = User::getGroupName( $group ); + } + asort( $result ); + + return $result; + } + + /** + * Preserve group and username offset parameters when paging + * @return array + */ + function getDefaultQuery() { + $query = parent::getDefaultQuery(); + if ( $this->requestedGroup != '' ) { + $query['group'] = $this->requestedGroup; + } + if ( $this->requestedUser != '' ) { + $query['username'] = $this->requestedUser; + } + Hooks::run( 'SpecialListusersDefaultQuery', [ $this, &$query ] ); + + return $query; + } + + /** + * Get a list of groups the specified user belongs to + * + * @param int $uid User id + * @param array|null $cache + * @return array + */ + protected static function getGroups( $uid, $cache = null ) { + if ( $cache === null ) { + $user = User::newFromId( $uid ); + $effectiveGroups = $user->getEffectiveGroups(); + } else { + $effectiveGroups = isset( $cache[$uid] ) ? $cache[$uid] : []; + } + $groups = array_diff( $effectiveGroups, User::getImplicitGroups() ); + + return $groups; + } + + /** + * Format a link to a group description page + * + * @param string $group Group name + * @param string $username Username + * @return string + */ + protected static function buildGroupLink( $group, $username ) { + return User::makeGroupLinkHTML( + $group, + User::getGroupMember( $group, $username ) + ); + } + +} diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index fb25249bd3..1185c4da61 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -241,12 +241,14 @@ abstract class UploadBase { */ protected function setTempFile( $tempPath, $fileSize = null ) { $this->mTempPath = $tempPath; + $this->mFileSize = $fileSize ?: null; if ( strlen( $this->mTempPath ) && file_exists( $this->mTempPath ) ) { $this->tempFileObj = new TempFSFile( $this->mTempPath ); - $this->mFileSize = $fileSize ?: filesize( $this->mTempPath ); + if ( !$fileSize ) { + $this->mFileSize = filesize( $this->mTempPath ); + } } else { $this->tempFileObj = null; - $this->mFileSize = null; } } @@ -643,9 +645,6 @@ abstract class UploadBase { if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) { $warnings['badfilename'] = $filename; - // Debugging for bug 62241 - wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: " - . "'$this->mDesiredDestName', comparableName: '$comparableName'" ); } // Check whether the file extension is on the unwanted list @@ -664,7 +663,7 @@ abstract class UploadBase { } if ( $this->mFileSize == 0 ) { - $warnings['emptyfile'] = true; + $warnings['empty-file'] = true; } $exists = self::getExistsWarning( $localFile ); diff --git a/includes/upload/UploadFromChunks.php b/includes/upload/UploadFromChunks.php index ebb4ebb9e8..0323b685b8 100644 --- a/includes/upload/UploadFromChunks.php +++ b/includes/upload/UploadFromChunks.php @@ -142,7 +142,7 @@ class UploadFromChunks extends UploadFromFile { $tStart = microtime( true ); $status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE ); $tAmount = microtime( true ) - $tStart; - if ( !$status->isOk() ) { + if ( !$status->isOK() ) { return $status; } @@ -234,7 +234,7 @@ class UploadFromChunks extends UploadFromFile { wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" . $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); // Use a quick transaction since we will upload the full temp file into shared // storage, which takes time for large files. We don't want to hold locks then. $dbw->update( @@ -256,7 +256,7 @@ class UploadFromChunks extends UploadFromFile { private function getChunkStatus() { // get Master db to avoid race conditions. // Otherwise, if chunk upload time < replag there will be spurious errors - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $row = $dbw->selectRow( 'uploadstash', [ diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php index 342bd79ccb..6639c340ae 100644 --- a/includes/upload/UploadFromUrl.php +++ b/includes/upload/UploadFromUrl.php @@ -286,7 +286,7 @@ class UploadFromUrl extends UploadBase { } wfDebugLog( 'fileupload', $status ); - if ( $status->isOk() ) { + if ( $status->isOK() ) { wfDebugLog( 'fileupload', 'Download by URL completed successfuly.' ); } else { wfDebugLog( diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index d5e573b8b3..c171ded7da 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -276,7 +276,7 @@ class UploadStash { // insert the file metadata into the db. wfDebug( __METHOD__ . " inserting $stashPath under $key\n" ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $serializedFileProps = serialize( $fileProps ); if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) { @@ -336,7 +336,7 @@ class UploadStash { } wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $dbw->delete( 'uploadstash', [ 'us_user' => $this->userId ], @@ -364,7 +364,7 @@ class UploadStash { . ' No user is logged in, files must belong to users' ); } - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); // this is a cheap query. it runs on the master so that this function // still works when there's lag. It won't be called all that often. @@ -399,7 +399,7 @@ class UploadStash { // Ensure we have the UploadStashFile loaded for this key $this->getFile( $key, true ); - $dbw = $this->repo->getMasterDb(); + $dbw = $this->repo->getMasterDB(); $dbw->delete( 'uploadstash', @@ -430,7 +430,7 @@ class UploadStash { . ' No user is logged in, files must belong to users' ); } - $dbr = $this->repo->getSlaveDb(); + $dbr = $this->repo->getSlaveDB(); $res = $dbr->select( 'uploadstash', 'us_key', @@ -507,9 +507,9 @@ class UploadStash { $dbr = null; if ( $readFromDB === DB_MASTER ) { // sometimes reading from the master is necessary, if there's replication lag. - $dbr = $this->repo->getMasterDb(); + $dbr = $this->repo->getMasterDB(); } else { - $dbr = $this->repo->getSlaveDb(); + $dbr = $this->repo->getSlaveDB(); } $row = $dbr->selectRow( diff --git a/includes/user/BotPassword.php b/includes/user/BotPassword.php index c758f26193..49a71633c7 100644 --- a/includes/user/BotPassword.php +++ b/includes/user/BotPassword.php @@ -18,6 +18,8 @@ * http://www.gnu.org/copyleft/gpl.html */ +use MediaWiki\Session\BotPasswordSessionProvider; + /** * Utility class for bot passwords * @since 1.27 @@ -401,9 +403,7 @@ class BotPassword implements IDBAccessObject { } $manager = MediaWiki\Session\SessionManager::singleton(); - $provider = $manager->getProvider( - 'MediaWiki\\Session\\BotPasswordSessionProvider' - ); + $provider = $manager->getProvider( BotPasswordSessionProvider::class ); if ( !$provider ) { return Status::newFatal( 'botpasswords-no-provider' ); } @@ -429,7 +429,7 @@ class BotPassword implements IDBAccessObject { // Check restrictions $status = $bp->getRestrictions()->check( $request ); - if ( !$status->isOk() ) { + if ( !$status->isOK() ) { return Status::newFatal( 'botpasswords-restriction-failed' ); } diff --git a/includes/user/User.php b/includes/user/User.php index 831966e43c..a272b37d5f 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -200,6 +200,7 @@ class User implements IDBAccessObject { /** Cache variables */ // @{ + /** @var int */ public $mId; /** @var string */ public $mName; @@ -2052,7 +2053,8 @@ class User implements IDBAccessObject { // Don't load if this was initialized from an ID $this->load(); } - return $this->mId; + + return (int)$this->mId; } /** @@ -2162,7 +2164,7 @@ class User implements IDBAccessObject { // Get the "last viewed rev" timestamp from the oldest message notification $timestamp = $dbr->selectField( 'user_newtalk', 'MIN(user_last_timestamp)', - $this->isAnon() ? [ 'user_ip' => $this->getName() ] : [ 'user_id' => $this->getID() ], + $this->isAnon() ? [ 'user_ip' => $this->getName() ] : [ 'user_id' => $this->getId() ], __METHOD__ ); $rev = $timestamp ? Revision::loadFromTimestamp( $dbr, $utp, $timestamp ) : null; return [ [ 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ] ]; @@ -3268,7 +3270,7 @@ class User implements IDBAccessObject { if ( $this->getId() ) { $dbw->insert( 'user_groups', [ - 'ug_user' => $this->getID(), + 'ug_user' => $this->getId(), 'ug_group' => $group, ], __METHOD__, @@ -3306,14 +3308,14 @@ class User implements IDBAccessObject { $dbw = wfGetDB( DB_MASTER ); $dbw->delete( 'user_groups', [ - 'ug_user' => $this->getID(), + 'ug_user' => $this->getId(), 'ug_group' => $group, ], __METHOD__ ); // Remember that the user was in this group $dbw->insert( 'user_former_groups', [ - 'ufg_user' => $this->getID(), + 'ufg_user' => $this->getId(), 'ufg_group' => $group, ], __METHOD__, @@ -3338,7 +3340,7 @@ class User implements IDBAccessObject { * @return bool */ public function isLoggedIn() { - return $this->getID() != 0; + return $this->getId() != 0; } /** @@ -3465,10 +3467,9 @@ class User implements IDBAccessObject { */ public function addWatch( $title, $checkRights = self::CHECK_USER_RIGHTS ) { if ( !$checkRights || $this->isAllowed( 'editmywatchlist' ) ) { - WatchedItemStore::getDefaultInstance()->addWatchBatch( [ - [ $this, $title->getSubjectPage() ], - [ $this, $title->getTalkPage() ], - ] + WatchedItemStore::getDefaultInstance()->addWatchBatchForUser( + $this, + [ $title->getSubjectPage(), $title->getTalkPage() ] ); } $this->invalidateCache(); diff --git a/includes/utils/BatchRowIterator.php b/includes/utils/BatchRowIterator.php index 002fd06e82..3bd3a4c3ec 100644 --- a/includes/utils/BatchRowIterator.php +++ b/includes/utils/BatchRowIterator.php @@ -166,14 +166,14 @@ class BatchRowIterator implements RecursiveIterator { } /** - * @return boolean True when the iterator is in a valid state + * @return bool True when the iterator is in a valid state */ public function valid() { return (bool)$this->current; } /** - * @return boolean True when this result set has rows + * @return bool True when this result set has rows */ public function hasChildren() { return $this->current && count( $this->current ); diff --git a/includes/utils/MWCryptHash.php b/includes/utils/MWCryptHash.php index 75eaedee0f..11173573e7 100644 --- a/includes/utils/MWCryptHash.php +++ b/includes/utils/MWCryptHash.php @@ -70,7 +70,7 @@ class MWCryptHash { * Return the byte-length output of the hash algorithm we are * using in self::hash and self::hmac. * - * @param boolean $raw True to return the length for binary data, false to + * @param bool $raw True to return the length for binary data, false to * return for hex-encoded * @return int Number of bytes the hash outputs */ @@ -88,7 +88,7 @@ class MWCryptHash { * making use of the best hash algorithm that we have available. * * @param string $data - * @param boolean $raw True to return binary data, false to return it hex-encoded + * @param bool $raw True to return binary data, false to return it hex-encoded * @return string A hash of the data */ public static function hash( $data, $raw = true ) { @@ -101,10 +101,14 @@ class MWCryptHash { * * @param string $data * @param string $key - * @param boolean $raw True to return binary data, false to return it hex-encoded + * @param bool $raw True to return binary data, false to return it hex-encoded * @return string An hmac hash of the data + key */ public static function hmac( $data, $key, $raw = true ) { + if ( !is_string( $key ) ) { + // a fatal error in HHVM; an exception will at least give us a stack trace + throw new InvalidArgumentException( 'Invalid key type: ' . gettype( $key ) ); + } return hash_hmac( self::hashAlgo(), $data, $key, $raw ); } diff --git a/includes/utils/ZipDirectoryReader.php b/includes/utils/ZipDirectoryReader.php index 44815b4750..516e9aec4a 100644 --- a/includes/utils/ZipDirectoryReader.php +++ b/includes/utils/ZipDirectoryReader.php @@ -215,6 +215,10 @@ class ZipDirectoryReader { $startPos = 0; } + if ( $this->getFileLength() === 0 ) { + $this->error( 'zip-wrong-format', "The file is empty." ); + } + $block = $this->getBlock( $startPos ); $sigPos = strrpos( $block, "PK\x05\x06" ); if ( $sigPos === false ) { diff --git a/languages/Language.php b/languages/Language.php index a14a376a6a..f13f9d684b 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -443,7 +443,7 @@ class Language { * @return array * @since 1.19 */ - function getFallbackLanguages() { + public function getFallbackLanguages() { return self::getFallbacksFor( $this->mCode ); } @@ -451,7 +451,7 @@ class Language { * Exports $wgBookstoreListEn * @return array */ - function getBookstoreList() { + public function getBookstoreList() { return self::$dataCache->getItem( $this->mCode, 'bookstoreList' ); } @@ -520,7 +520,7 @@ class Language { * * @return array */ - function getFormattedNamespaces() { + public function getFormattedNamespaces() { $ns = $this->getNamespaces(); foreach ( $ns as $k => $v ) { $ns[$k] = strtr( $v, '_', ' ' ); @@ -539,7 +539,7 @@ class Language { * @param int $index The array key of the namespace to return * @return string|bool String if the namespace value exists, otherwise false */ - function getNsText( $index ) { + public function getNsText( $index ) { $ns = $this->getNamespaces(); return isset( $ns[$index] ) ? $ns[$index] : false; } @@ -557,7 +557,7 @@ class Language { * @param int $index The array key of the namespace to return * @return string Namespace name without underscores (empty string if namespace does not exist) */ - function getFormattedNsText( $index ) { + public function getFormattedNsText( $index ) { $ns = $this->getNsText( $index ); return strtr( $ns, '_', ' ' ); } @@ -570,7 +570,7 @@ class Language { * @return string * @since 1.18 */ - function getGenderNsText( $index, $gender ) { + public function getGenderNsText( $index, $gender ) { global $wgExtraGenderNamespaces; $ns = $wgExtraGenderNamespaces + @@ -585,7 +585,7 @@ class Language { * @return bool * @since 1.18 */ - function needsGenderDistinction() { + public function needsGenderDistinction() { global $wgExtraGenderNamespaces, $wgExtraNamespaces; if ( count( $wgExtraGenderNamespaces ) > 0 ) { // $wgExtraGenderNamespaces overrides everything @@ -618,7 +618,7 @@ class Language { /** * @return array */ - function getNamespaceAliases() { + public function getNamespaceAliases() { if ( is_null( $this->namespaceAliases ) ) { $aliases = self::$dataCache->getItem( $this->mCode, 'namespaceAliases' ); if ( !$aliases ) { @@ -662,7 +662,7 @@ class Language { /** * @return array */ - function getNamespaceIds() { + public function getNamespaceIds() { if ( is_null( $this->mNamespaceIds ) ) { global $wgNamespaceAliases; # Put namespace names and aliases into a hashtable. @@ -692,7 +692,7 @@ class Language { * @param string $text * @return int|bool An integer if $text is a valid value otherwise false */ - function getNsIndex( $text ) { + public function getNsIndex( $text ) { $lctext = $this->lc( $text ); $ns = MWNamespace::getCanonicalIndex( $lctext ); if ( $ns !== null ) { @@ -709,7 +709,7 @@ class Language { * @param bool $usemsg Use the "variantname-xyz" message if it exists * @return string */ - function getVariantname( $code, $usemsg = true ) { + public function getVariantname( $code, $usemsg = true ) { $msg = "variantname-$code"; if ( $usemsg && wfMessage( $msg )->exists() ) { return $this->getMessageFromDB( $msg ); @@ -726,7 +726,7 @@ class Language { /** * @return array */ - function getDatePreferences() { + public function getDatePreferences() { return self::$dataCache->getItem( $this->mCode, 'datePreferences' ); } @@ -740,7 +740,7 @@ class Language { /** * @return array|string */ - function getDefaultDateFormat() { + public function getDefaultDateFormat() { $df = self::$dataCache->getItem( $this->mCode, 'defaultDateFormat' ); if ( $df === 'dmy or mdy' ) { global $wgAmericanDates; @@ -753,7 +753,7 @@ class Language { /** * @return array */ - function getDatePreferenceMigrationMap() { + public function getDatePreferenceMigrationMap() { return self::$dataCache->getItem( $this->mCode, 'datePreferenceMigrationMap' ); } @@ -769,14 +769,14 @@ class Language { * @return array * @since 1.24 */ - function getImageFiles() { + public function getImageFiles() { return self::$dataCache->getItem( $this->mCode, 'imageFiles' ); } /** * @return array */ - function getExtraUserToggles() { + public function getExtraUserToggles() { return (array)self::$dataCache->getItem( $this->mCode, 'extraUserToggles' ); } @@ -899,7 +899,7 @@ class Language { * @param string $msg Message name * @return string */ - function getMessageFromDB( $msg ) { + public function getMessageFromDB( $msg ) { return $this->msg( $msg )->text(); } @@ -917,14 +917,14 @@ class Language { * @param string $key * @return string */ - function getMonthName( $key ) { + public function getMonthName( $key ) { return $this->getMessageFromDB( self::$mMonthMsgs[$key - 1] ); } /** * @return array */ - function getMonthNamesArray() { + public function getMonthNamesArray() { $monthNames = [ '' ]; for ( $i = 1; $i < 13; $i++ ) { $monthNames[] = $this->getMonthName( $i ); @@ -936,7 +936,7 @@ class Language { * @param string $key * @return string */ - function getMonthNameGen( $key ) { + public function getMonthNameGen( $key ) { return $this->getMessageFromDB( self::$mMonthGenMsgs[$key - 1] ); } @@ -4464,7 +4464,7 @@ class Language { * @return array Array of message keys (strings) */ public static function getMessageKeysFor( $code ) { - return self::getLocalisationCache()->getSubItemList( $code, 'messages' ); + return self::getLocalisationCache()->getSubitemList( $code, 'messages' ); } /** diff --git a/languages/data/Names.php b/languages/data/Names.php index 7a46aacd5a..6c49aa443a 100644 --- a/languages/data/Names.php +++ b/languages/data/Names.php @@ -180,7 +180,7 @@ class Names { 'gv' => 'Gaelg', # Manx 'ha' => 'Hausa', # Hausa 'hak' => '客家語/Hak-kâ-ngî', # Hakka - 'haw' => 'Hawai`i', # Hawaiian + 'haw' => 'Hawaiʻi', # Hawaiian 'he' => 'עברית', # Hebrew 'hi' => 'हिन्दी', # Hindi 'hif' => 'Fiji Hindi', # Fijian Hindi (multiple scripts - defaults to Latin) diff --git a/languages/i18n/af.json b/languages/i18n/af.json index 0c51902c2f..e03ef784e1 100644 --- a/languages/i18n/af.json +++ b/languages/i18n/af.json @@ -1163,7 +1163,7 @@ "recentchangeslinked-page": "Bladsynaam:", "recentchangeslinked-to": "Besigtig wysigings aan bladsye met skakels na die bladsy", "recentchanges-page-added-to-category": "[[:$1]] by kategorie gevoeg", - "recentchanges-page-added-to-category-bundled": "[[:$1]] en {{PLURAL:$2|een bladsy|$2 bladsye}} by kategorie gevoeg", + "recentchanges-page-added-to-category-bundled": "[[:$1]] en [[Special:WhatLinksHere/$1|{{PLURAL:$2|een bladsy|$2 bladsye}}]] by kategorie gevoeg", "recentchanges-page-removed-from-category": "[[:$1]] uit kategorie verwyder", "recentchanges-page-removed-from-category-bundled": "[[:$1]] en {{PLURAL:$2|een bladsy|$2 bladsye}} van kategorie verwyder", "autochange-username": "Outomatiese MediaWiki-wysiging", diff --git a/languages/i18n/an.json b/languages/i18n/an.json index a7d5d44a43..3aea3f90bc 100644 --- a/languages/i18n/an.json +++ b/languages/i18n/an.json @@ -147,7 +147,7 @@ "cancel": "Cancelar", "moredotdotdot": "Más...", "mypage": "Pachina", - "mytalk": "Pachina de discusión", + "mytalk": "Pachina de descusión", "anontalk": "Pachina de descusión d'ista IP", "navigation": "Navego", "and": " y", @@ -2450,7 +2450,7 @@ "watchlisttools-view": "Amostrar cambeos", "watchlisttools-edit": "Veyer y editar a lista de seguimiento", "watchlisttools-raw": "Editar a lista de seguimiento en formato texto", - "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discusión]])", + "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|descusión]])", "duplicate-defaultsort": "Pare cuenta: A clau d'ordenación por defecto «$2» anula l'anterior clau d'ordenación por defecto «$1».", "version": "Versión", "version-extensions": "Estensions instalatas", diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 358fa891fa..a4f71be65d 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -200,7 +200,6 @@ "moredotdotdot": "المزيد...", "morenotlisted": "هذه القائمة غير مكتملة.", "mypage": "صفحة", - "anonuserpage": "مستخدم غير معروف", "mytalk": "نقاش", "anontalk": "نقاش", "navigation": "تصفح", @@ -1496,6 +1495,7 @@ "uploadstash-badtoken": "لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.", "uploadstash-errclear": "فشلت عملية مسح الملفات.", "uploadstash-refresh": "تحديث قائمة الملفات", + "uploadstash-thumbnail": "اعرض صورة مصغرة", "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.", @@ -1746,6 +1746,7 @@ "apihelp-no-such-module": "الوحدة \"$1\" غير موجودة.", "apisandbox": "ملعب API", "apisandbox-jsonly": "الجافا سكريبت مطلوبة لاستخدام ملعب API", + "apisandbox-api-disabled": "واجهة برمجة التطبيق API معطلة في هذا الموقع.", "apisandbox-fullscreen": "وسع اللوحة", "apisandbox-unfullscreen": "أظهر الصفحة", "apisandbox-submit": "عمل الطلب", @@ -3638,5 +3639,21 @@ "sessionprovider-generic": "جلسات $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)", "sessionprovider-nocookies": "قد يتم تعطيل الكوكيز. تأكد من تمكين ملفات تعريف الأرتباط وأبد مرةأخرى.", - "randomrootpage": "صفحة جذر عشوائية" + "randomrootpage": "صفحة جذر عشوائية", + "log-action-filter-block": "نوع المنع:", + "log-action-filter-delete": "نوع الحذف:", + "log-action-filter-protect": "نوع الحماية:", + "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-delete-delete": "حذف الصفحات", + "log-action-filter-delete-event": "حذف السجلات", + "log-action-filter-delete-revision": "حذف المراجعات", + "log-action-filter-protect-protect": "حماية", + "log-action-filter-protect-modify": "تعديل الحماية", + "log-action-filter-protect-unprotect": "رفع الحماية", + "log-action-filter-upload-upload": "رفع جديد", + "log-action-filter-upload-overwrite": "إعادة الرفع" } diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index 876d22234a..f547a60284 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -450,7 +450,7 @@ "nocookieslogin": "{{SITENAME}} usa «cookies» pa identificar a los usuarios.\nTien les «cookies» desactivaes.\nPor favor activeles y vuelva a intentalo.", "nocookiesfornew": "La cuenta nun se creó porque nun pudimos confirmar l'orixe.\nComprueba que tienes activaes les «cookies», recarga esta páxina y vuelvi a intentalo.", "noname": "Nun conseñasti un nome d'usuariu válidu.", - "loginsuccesstitle": "Aniciu de sesión correutu", + "loginsuccesstitle": "Identificáu", "loginsuccess": "'''Aniciasti sesión en {{SITENAME}} como «$1».'''", "nosuchuser": "Nun hai nengún usuariu col nome «$1».\nLos nomes d'usuariu distinguen mayúscules y minúscules.\nMira que tea bien escritu o [[Special:UserLogin/signup|crea una cuenta nueva]].", "nosuchusershort": "Nun hai nengún usuariu col nome «$1».\nMira que tea bien escritu.", @@ -486,7 +486,7 @@ "createaccount-title": "Creación de cuenta pa {{SITENAME}}", "createaccount-text": "Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», y cola contraseña «$3».\nAgora tendríes d'aniciar sesión y camudar la contraseña.\n\nPues escaecer esti mensaxe si esta cuenta creóse por error.", "login-throttled": "Ficisti demasiaos intentos d'aniciu de sesión recientes.\nPor favor espera $1 enantes d'intentalo otra vuelta.", - "login-abort-generic": "Falló la identificación - Encaboxao", + "login-abort-generic": "Falló l'aniciu de sesión - Encaboxao", "login-migrated-generic": "La to cuenta migróse ya'l to nome d'usuariu yá nun esiste nesta wiki.", "loginlanguagelabel": "Llingua: $1", "suspicious-userlogout": "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.", @@ -506,7 +506,7 @@ "newpassword": "Contraseña nueva:", "retypenew": "Vuelvi a escribir la contraseña nueva:", "resetpass_submit": "Configurar la contraseña y aniciar sesión", - "changepassword-success": "¡Camudóse la contraseña correutamente!", + "changepassword-success": "Camudóse la contraseña.", "changepassword-throttled": "Ficisti demasiaos intentos d'aniciu de sesión recientes.\nPor favor espera $1 enantes d'intentalo otra vuelta.", "botpasswords": "Contraseñes de bots", "botpasswords-summary": "Les contraseñes de bot permiten l'accesu a una cuenta d'usuariu por aciu de la API sin usar les credenciales d'accesu de la cuenta principal. Los permisos d'usuariu disponibles al aniciar sesión con una contraseña de bot puen tar torgaos.\n\nSi nun sabes pa qué val esto, probablemente nun tendríes d'usalo. Naide tendría de pidite nunca que xeneres una d'estes y que-y la deas.", @@ -529,11 +529,11 @@ "botpasswords-insert-failed": "Nun pudo amestase'l nome de bot «$1». ¿Taba añadíu yá?", "botpasswords-update-failed": "Nun pudo anovase'l nome de bot «$1». ¿Desaniciaríase?", "botpasswords-created-title": "Creóse la contraseña de bot", - "botpasswords-created-body": "La contraseña de bot «$1» creóse correchamente.", + "botpasswords-created-body": "Creóse la contraseña del bot llamáu «$1» del usuariu «$2».", "botpasswords-updated-title": "Anovóse la contraseña de bot", - "botpasswords-updated-body": "La contraseña de bot «$1» anovóse correchamente.", + "botpasswords-updated-body": "Anovóse la contraseña del bot llamáu «$1» del usuariu «$2».", "botpasswords-deleted-title": "Desanicióse la contraseña de bot", - "botpasswords-deleted-body": "La contraseña de bot «$1» desanicióse.", + "botpasswords-deleted-body": "Desanicióse la contraseña del bot llamáu «$1» del usuariu «$2».", "botpasswords-newpassword": "La nueva contraseña p'aniciar sesión con strong>$1 ye $2. Por favor, rexistra esto pa referencies futures.", "botpasswords-no-provider": "BotPasswordsSessionProvider nun ta disponible.", "botpasswords-restriction-failed": "Hai torgues de contraseña de bot que torgaron esti aniciu de sesión.", @@ -543,7 +543,7 @@ "resetpass-no-info": "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.", "resetpass-submit-loggedin": "Camudar la contraseña", "resetpass-submit-cancel": "Encaboxar", - "resetpass-wrong-oldpass": "Contraseña temporal o actual inválida.\nSeique yá camudaras correutamente la contraseña o que pidieras una nueva contraseña temporal.", + "resetpass-wrong-oldpass": "Contraseña temporal o actual inválida.\nSeique yá camudaras la contraseña o que pidieras una nueva contraseña temporal.", "resetpass-recycled": "Por favor, cambie la so contraseña por otra distinta de la actual.", "resetpass-temp-emailed": "Anició sesión con un códigu temporal unviáu per corréu electrónicu.\nPa completar l'aniciu de sesión, tien de definir una nueva contraseña equí:", "resetpass-temp-password": "Contraseña temporal:", @@ -660,7 +660,7 @@ "previewnote": "'''Alcuerdate de qu'esto ye sólo una vista previa.'''\n¡Los cambios entá nun se guardaron!", "continue-editing": "Dir al área d'edición", "previewconflict": "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.", - "session_fail_preview": "'''¡Sentímoslo muncho! Nun pudimos procesar la to edición porque hebo una perda de datos de la sesión.'''\nPor favor, vuelvi a intentalo.\nSi inda nun funciona, intenta [[Special:UserLogout|colar]] y volver a aniciar sesión.", + "session_fail_preview": "¡Sentímoslo muncho! Nun pudimos procesar la edición porque hebo una perda de datos de la sesión.\n\nSeique zarróse la sesión. Comprueba si tienes abierta la sesión y vuelve a intentalo.\nSi inda nun funcionara, tenta [[Special:UserLogout|colar]] y volver a aniciar sesión y comprueba que'l restolador permite les cookies d'esti sitiu.", "session_fail_preview_html": "¡Sentímoslo! Nun pudo procesase la to edición por aciu d'una perda de datos de la sesión.\n\nComo {{SITENAME}} tien el HTML puru activáu, la vista previa ta tapecida como precaución escontra ataques en JavaScript.\n\nSi esti ye un intentu llexítimu d'edición, por favor vuelvi a intentalo.\nSi inda nun funciona, intenta [[Special:UserLogout|colar]] y volver a aniciar sesión, y comprueba que'l to restolador permite les cookies d'esti sitiu.", "token_suffix_mismatch": "'''La to edición nun s'aceutó porque'l to navegador mutiló los caráuteres de puntuación nel editor.'''\nLa edición nun foi aceutada pa prevenir corrupciones na páxina de testu.\nDacuando esto pasa por usar un serviciu proxy anónimu basáu en web que tenga fallos.", "edit_form_incomplete": "'''Delles partes del formulariu d'edición nun llegaron al sirvidor; comprueba que les ediciones tean intactes y vuelvi a tentalo.'''", @@ -827,9 +827,9 @@ "revdelete-unsuppress": "Desaniciar les torgues nes revisiones restauraes", "revdelete-log": "Motivu:", "revdelete-submit": "Aplicar a {{PLURAL:$1|la revisión seleicionada|les revisiones seleicionaes}}", - "revdelete-success": "'''Visibilidá de revisiones anovada correutamente.'''", + "revdelete-success": "Cambiada la visibilidá de revisiones.", "revdelete-failure": "'''La visibilida de revisiones nun se pudo anovar:'''\n$1", - "logdelete-success": "Configuróse correutamente la visibilidá del rexistru.", + "logdelete-success": "Configuróse la visibilidá del rexistru.", "logdelete-failure": "'''Nun se pudo configurar la visibilidá del rexistru:'''\n$1", "revdel-restore": "camudar visibilidá", "pagehist": "Historial de la páxina", @@ -861,6 +861,12 @@ "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisiones}} de $1 {{PLURAL:$3|fusionóse|fusionáronse}} en [[:$2]].", "mergehistory-fail": "Nun pudo facese la fusión d'historiales, por favor comprueba los parámetros de páxina y hora.", "mergehistory-fail-bad-timestamp": "La marca de tiempu ye inválida.", + "mergehistory-fail-invalid-source": "La páxina d'orixe ye inválida.", + "mergehistory-fail-invalid-dest": "La páxina de destín ye inválida.", + "mergehistory-fail-no-change": "La fusión d'historiales nun fusionó nenguna revisión. Por favor, comprueba los parámetros de páxina y tiempu.", + "mergehistory-fail-permission": "Permisos insuficientes pa fusionar los historiales.", + "mergehistory-fail-self-merge": "Les páxines d'orixe y destín son la mesma.", + "mergehistory-fail-timestamps-overlap": "Les revisiones de la fonte se sobreponen o vienen después de les revisiones del destín.", "mergehistory-fail-toobig": "Nun pudo fusionase l'historial porque moveríense más del máximu de $1 {{PLURAL:$1|revisión|revisiones}}.", "mergehistory-no-source": "La páxina d'orixe $1 nun esiste.", "mergehistory-no-destination": "La páxina de destín $1 nun esiste.", @@ -1066,7 +1072,7 @@ "userrights-changeable-col": "Grupos que pues camudar", "userrights-unchangeable-col": "Grupos que nun pues camudar", "userrights-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.", - "userrights-removed-self": "Retiró correutamente los sos propios drechos. Poro, yá nun tendrá accesu a esta páxina.", + "userrights-removed-self": "Desaniciasti los tos propios permisos. Poro, yá nun tienes accesu a esta páxina.", "group": "Grupu:", "group-user": "Usuarios", "group-autoconfirmed": "Usuarios autoconfirmaos", @@ -1305,9 +1311,9 @@ "recentchangeslinked-page": "Nome de la páxina:", "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada", "recentchanges-page-added-to-category": "[[:$1]] amestóse a la categoría", - "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} amestaes a la categoría", + "recentchanges-page-added-to-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|otra páxina|otres $2 páxines}}]] amestaes a la categoría", "recentchanges-page-removed-from-category": "[[:$1]] desanicióse de la categoría", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|otra páxina|otres $2 páxines}} desaniciaes de la categoría", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|otra páxina|otres $2 páxines}}]] desaniciaes de la categoría", "autochange-username": "Cambiu automáticu de MediaWiki", "upload": "Xubir ficheru", "uploadbtn": "Xubir ficheru", @@ -1457,7 +1463,7 @@ "backend-fail-read": "Nun se pudo lleer el ficheru $1.", "backend-fail-create": "Nun se pudo escribir el ficheru $1.", "backend-fail-maxsize": "Nun se pudo escribir el ficheru $1 porque ye mayor de {{PLURAL:$2|un byte|$2 bytes}}.", - "backend-fail-readonly": "Nesti momentu el motor d'almacenamientu \"$1\" ta en mou de sólo llectura. El motivu dau foi: \"$2\"", + "backend-fail-readonly": "Nesti momentu el motor d'almacenamientu \"$1\" ta en mou de sólo llectura. El motivu dau ye: $2", "backend-fail-synced": "El ficheru \"$1\" ta nún estáu inconsistente colos motores d'almacenamientu internos", "backend-fail-connect": "Nun se pudo coneutar col motor d'almacenamientu \"$1\".", "backend-fail-internal": "Hebo un fallu desconocíu nel motor d'almacenamientu \"$1\".", @@ -1484,8 +1490,8 @@ "uploadstash-summary": "Esta páxina ufre accesu a ficheros que tan xubíos (o en procesu de xubía), pero qu'entá nun s'espublizaron na wiki. Estos ficheros nun son visibles pa naide, sacante l'usuariu que los xubió.", "uploadstash-clear": "Desaniciar los ficheros de la reserva", "uploadstash-nofiles": "Nun tienes ficheros na reserva.", - "uploadstash-badtoken": "Nun se pudo facer esa operación, seique porque caducó la identificación pa editar. Vuelvi a intentalo.", - "uploadstash-errclear": "Nun se pudieron desaniciar los ficheros.", + "uploadstash-badtoken": "Nun pudo facese esa operación. Seique caducó la identificación pa editar. Vuelve a tentalo.", + "uploadstash-errclear": "Falló'l desaniciu de los ficheros.", "uploadstash-refresh": "Anovar la llista de ficheros", "invalid-chunk-offset": "Allugamientu inválidu del fragmentu", "img-auth-accessdenied": "Accesu denegáu", @@ -1735,15 +1741,39 @@ "apihelp": "Ayuda de la API", "apihelp-no-such-module": "Nun s'alcuentra'l módulu «$1».", "apisandbox": "Zona de pruebes API", + "apisandbox-jsonly": "Necesítase JavaScript pa usar la zona de pruebes de la API.", "apisandbox-api-disabled": "La API ta desactivada nesti sitiu.", "apisandbox-intro": "Usa esta páxina pa esperimentar cola API de serviciu web de MediaWiki.\nConsulta [[mw:API:Main page|la documentación de la API]] pa más detalles tocante al so usu. Exemplu: [//www.mediawiki.org/wiki/API#A_simple_example llamar al conteníu d'una Páxina principal]. Seleiciona una aición pa ver más exemplos.\n\nTen presente que, anque esto ye una zona de pruebes, les aiciones que faigas nesta páxina puen camudar la wiki.", "apisandbox-fullscreen": "Espander el panel", + "apisandbox-fullscreen-tooltip": "Espander el panel de la zona de pruebes pa llenar la pantalla del navegador.", + "apisandbox-unfullscreen": "Amosar la páxina", + "apisandbox-unfullscreen-tooltip": "Amenorgar el panel de la zona de pruebes pa que tean disponibles los enllaces de navegación de MediaWiki.", "apisandbox-submit": "Facer solicitú", "apisandbox-reset": "Llimpiar", + "apisandbox-retry": "Reintentar", + "apisandbox-loading": "Cargando la información pal módulu de la API «$1»...", + "apisandbox-load-error": "Asocedió un error al cargar la información del módulu de la API «$1»: $2", + "apisandbox-no-parameters": "Esti módulu de la API nun tien parámetros.", + "apisandbox-helpurls": "Enllaces d'ayuda", "apisandbox-examples": "Exemplos", + "apisandbox-dynamic-parameters": "Más parámetros", + "apisandbox-dynamic-parameters-add-label": "Amestar parámetru:", + "apisandbox-dynamic-parameters-add-placeholder": "Nome del parámetru", + "apisandbox-dynamic-error-exists": "Yá existe un parámetru llamáu «$1».", + "apisandbox-deprecated-parameters": "Parámetros anticuaos", + "apisandbox-fetch-token": "Rellenu automáticu del pase", + "apisandbox-submit-invalid-fields-title": "Dalgunos campos son inválidos", + "apisandbox-submit-invalid-fields-message": "Por favor, igua los campos señalaos y téntalo nuevamente.", "apisandbox-results": "Resultaos", + "apisandbox-sending-request": "Unviando solicitú a la API...", + "apisandbox-loading-results": "Recibiendo los resultaos de la API...", + "apisandbox-results-error": "Asocedió un error al cargar la respuesta de la consulta API: $1.", "apisandbox-request-url-label": "URL de la solicitú:", "apisandbox-request-time": "Duración de la solicitú: {{PLURAL:$1|$1 ms}}", + "apisandbox-results-fixtoken": "Igua'l token y vuelve a unviar", + "apisandbox-results-fixtoken-fail": "Nun pudo recuperase'l token «$1».", + "apisandbox-alert-page": "Los campos d'esta páxina nun son válidos.", + "apisandbox-alert-field": "El valor d'esti campu nun ye válidu.", "booksources": "Fontes de llibros", "booksources-search-legend": "Busca de fontes de llibros", "booksources-search": "Buscar", @@ -1951,7 +1981,7 @@ "delete-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nRestrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales de {{SITENAME}}.", "delete-warning-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nEsborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};\nobra con precaución.", "deleteprotected": "Nun pues desaniciar esta páxina porque ta protexida.", - "deleting-backlinks-warning": "'''Avisu:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otres páxines]] enllacen a, o trescluyen de, la páxina que ta a piques de desaniciar.", + "deleting-backlinks-warning": "Avisu: [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otres páxines]] enllacen a, o trescluyen de, la páxina que tas a piques de desaniciar.", "rollback": "Revertir ediciones", "rollbacklink": "revertir", "rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}", @@ -1970,12 +2000,14 @@ "changecontentmodel-title-label": "Títulu de la páxina", "changecontentmodel-model-label": "Nuevu modelu de conteníu", "changecontentmodel-reason-label": "Motivu:", + "changecontentmodel-submit": "Camudar", "changecontentmodel-success-title": "Cambióse'l modelu de conteníu", "changecontentmodel-success-text": "Cambióse'l tipu de conteníu de [[:$1]].", "changecontentmodel-cannot-convert": "El conteníu de [[:$1]] nun puede convertise a un tipu de $2.", "changecontentmodel-nodirectediting": "El modelu de conteníu $1 nun tien encontu pa edición direuta", "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu", "log-description-contentmodel": "Socesos rellacionaos colos modelos de conteníu d'una páxina", + "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la páxina $3 usando un modelu de conteníu non predetermináu «$5»", "logentry-contentmodel-change": "$1 {{GENDER:$2|cambió}}'l modelu de conteníu de la páxina $3 dende «$4» a «$5»", "logentry-contentmodel-change-revertlink": "revertir", "logentry-contentmodel-change-revert": "revertir", @@ -2382,7 +2414,7 @@ "import-nonewrevisions": "Nun s'importó denguna revision (o yá taben toes presentes, o se saltaron por errores).", "xml-error-string": "$1 na llinia $2, col $3 (byte $4): $5", "import-upload": "Xubir datos XML", - "import-token-mismatch": "Perdiéronse los datos de la sesión. Intentalo otra vuelta.", + "import-token-mismatch": "Perda de datos de la sesión.\n\nSeique zarróse la sesión. Comprueba si tienes abierta la sesión y vuelve a intentalo.\nSi inda nun funcionara, tenta [[Special:UserLogout|colar]] y volver a aniciar sesión y comprueba que'l restolador permite les cookies d'esti sitiu.", "import-invalid-interwiki": "Nun se puede importar d'esi wiki.", "import-error-edit": "La páxina «$1» nun s'importó porque nun tienes permisu pa editala.", "import-error-create": "La páxina «$1» nun s'importó porque nun tienes permisu pa creala.", @@ -3201,7 +3233,7 @@ "tags-delete-not-allowed": "Les etiquetes definíes por una estensión nun puen desaniciase mentanto la estensión nun lo permita específicamente.", "tags-delete-not-found": "La etiqueta «$1» nun esiste.", "tags-delete-too-many-uses": "La etiqueta «$1» aplícase a más {{PLURAL:$2|d'una revisión|de $2 revisiones}}, lo que quier dicir que nun pue desaniciase.", - "tags-delete-warnings-after-delete": "La etiqueta «$1» desanicióse correutamente, pero {{PLURAL:$2|alcontróse'l siguiente avisu|alcontráronse los siguientes avisos}}:", + "tags-delete-warnings-after-delete": "Desanicióse la etiqueta «$1», pero {{PLURAL:$2|alcontróse'l siguiente avisu|alcontráronse los siguientes avisos}}:", "tags-activate-title": "Activar etiqueta", "tags-activate-question": "Tas a piques d'activar la etiqueta «$1».", "tags-activate-reason": "Motivu:", @@ -3230,7 +3262,7 @@ "tags-edit-revision-legend": "Amestar o desaniciar etiquetes {{PLURAL:$1|d'esta revisión|de toles $1 revisiones}}", "tags-edit-logentry-legend": "Amestar o desaniciar etiquetes {{PLURAL:$1|d'esta entrada del rexistru|de les $1 entraes del rexistru}}", "tags-edit-existing-tags": "Etiquetes esistentes:", - "tags-edit-existing-tags-none": "''Nenguna''", + "tags-edit-existing-tags-none": "Nenguna", "tags-edit-new-tags": "Etiquetes nueves:", "tags-edit-add": "Amestar estes etiquetes:", "tags-edit-remove": "Desaniciar estes etiquetes:", @@ -3240,7 +3272,7 @@ "tags-edit-reason": "Motivu:", "tags-edit-revision-submit": "Aplicar los cambios a {{PLURAL:$1|esta revisión|$1 revisiones}}", "tags-edit-logentry-submit": "Aplicar los cambios a {{PLURAL:$1|esta entrada del rexistru|$1 entraes del rexistru}}", - "tags-edit-success": "Los cambios aplicáronse correutamente.", + "tags-edit-success": "Aplicáronse los cambios.", "tags-edit-failure": "Nun pudieron aplicase los cambios:\n$1", "tags-edit-nooldid-title": "Revisión de destín inválida", "tags-edit-nooldid-text": "O nun conseñasti una revisión sobre la qu'aplicar esta función, o la revisión conseñada nun esiste.", @@ -3459,7 +3491,7 @@ "expand_templates_generate_xml": "Amosar l'árbole d'análisis sintáuticu XML", "expand_templates_generate_rawhtml": "Ver el HTML en bruto", "expand_templates_preview": "Vista previa", - "expand_templates_preview_fail_html": "Como {{SITENAME}} tien activáu el códigu HTML puru y hebo una perda de datos de la sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.\n\nSi esti ye un intentu llexítimu d'accesu a la vista previa, vuelvi a intentalo.\nSi inda nun funciona, intenta [[Special:UserLogout|salir]] y volver a entrar na to cuenta.", + "expand_templates_preview_fail_html": "Como {{SITENAME}} tien activáu el códigu HTML puru y hebo una perda de datos de la sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.\n\nSi esti ye un intentu llexítimu d'accesu a la vista previa, vuelve a tentalo.\nSi inda nun funciona, tenta [[Special:UserLogout|salir]] y volver a entrar na to cuenta, y comprueba que'l to restolador permite les cookies d'esti sitiu.", "expand_templates_preview_fail_html_anon": "Como {{SITENAME}} tien activáu el códigu HTML puru y nun aniciasti sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.\n\nSi esti ye un intentu llexítimu d'accesu a la vista previa, intenta [[Special:UserLogin|entrar]] y vuelvi a intentalo.", "expand_templates_input_missing": "Fai falta dar daqué de testu d'entrada.", "pagelanguage": "Cambiar la llingua de la páxina", diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json index 156b95ffaf..579de23530 100644 --- a/languages/i18n/ba.json +++ b/languages/i18n/ba.json @@ -21,20 +21,23 @@ "Азат Хәлилов", "Айбикә", "З. ӘЙЛЕ", - "Янмурза Баки" + "Янмурза Баки", + "Айсар", + "Lizalizaufa", + "Кутлубаева Кунсулу Закиевна" ] }, "tog-underline": "Һылтанмалар аҫтына һыҙыу:", - "tog-hideminor": "Әһәмиәте ҙур булмаған төҙәтеүҙәрҙе һуңғы үҙгәртеүҙәр исемлегендә күрһәтмәҫкә", + "tog-hideminor": "Һуңғы үҙгәртеүҙәрҙең бәләкәй төҙәтеүҙәрен күрһәтмәҫкә", "tog-hidepatrolled": "Һуңғы үҙгәртеүҙәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер", - "tog-newpageshidepatrolled": "Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер", - "tog-hidecategorization": "Биттәр категоризацияһын йәшереү", + "tog-newpageshidepatrolled": "Тикшерелгән биттәрҙе яңы биттәр теҙмәһендә күрһәтмәҫкә", + "tog-hidecategorization": "Биттәрҙең категоризацияһын йәшерергә", "tog-extendwatchlist": "Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге", "tog-usenewrc": "Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә", - "tog-numberheadings": "Башисемдәрҙе автоматик рәүештә номерланһын", + "tog-numberheadings": "Атамалар автоматик рәүештә номерланһын", "tog-showtoolbar": "Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)", "tog-editondblclick": "Биттәрҙе ике сиртеү менән мөхәррирләргә", - "tog-editsectiononrightclick": "Бүлектәрҙе исемдәренә төрткөнөң уң яғына сиртеп үҙгәртергә", + "tog-editsectiononrightclick": "Бүлектәрҙе исемдәрен төрткөнөң уң яғына баҫып үҙгәртергә", "tog-watchcreations": "Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә", "tog-watchdefault": "Мин үҙгәрткән биттәр һәм файлдар аңлатмаһын күҙәтеү исемлегенә өҫтәргә", "tog-watchmoves": "Мин исемен үҙгәрткән биттәрҙе һәм файлдарҙы күҙәтеү исемлегенә өҫтәргә", @@ -162,7 +165,6 @@ "moredotdotdot": "Дауамы...", "morenotlisted": "Был исемлек тулы түгел", "mypage": "Бит", - "anonuserpage": "Билдәһеҙ ҡатнашыусы", "mytalk": "Әңгәмә", "anontalk": "Әңгәмә", "navigation": "Төп йүнәлештәр", @@ -416,7 +418,7 @@ "cannotloginnow-title": "Хәҙер үк инеп булмай", "cannotloginnow-text": "$1 файҙалланған ваҡытта инергә ярамай", "yourdomainname": "Һеҙҙең домен", - "password-change-forbidden": "Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.", + "password-change-forbidden": "Был викиҙа серһүҙегеҙҙе үҙгәртә алмайһығыҙ.", "externaldberror": "Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.", "login": "Танылыу", "nav-login-createaccount": "Танылыу йәки теркәлеү", @@ -721,16 +723,16 @@ "edit-already-exists": "Яңы бит яһап булмай.\nУл былай ҙа бар.", "defaultmessagetext": "Алдан билдәләнгән яҙма", "content-failed-to-parse": "$2 эстәлеге $1 төрөнә тура килмәй: $3.", - "invalid-content-data": "Ярамаған мәғлүмәт", + "invalid-content-data": "Тыйылған мәғлүмәт", "content-not-allowed-here": "\"$1\" эстәлеге [[$2]] бит өсөн ярамай", "editwarning-warning": "Икенсе биткә күсеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.\nӘгәр системала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең \"Мөхәррирләү\" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.", - "editpage-notsupportedcontentformat-title": "Ярамаған эстәлек форматы", + "editpage-notsupportedcontentformat-title": "Йөкмәтке форматы асылмай", "editpage-notsupportedcontentformat-text": "$1 эстәлеге форматы $2 моделе форматы менән тап килмәй.", - "content-model-wikitext": "викияҙма", + "content-model-wikitext": "викитекст", "content-model-text": "ғәҙәти яҙма", "content-model-javascript": "JavaScript", "content-model-css": "CSS", - "content-json-empty-object": "Буш нәмә", + "content-json-empty-object": "Буш объект", "content-json-empty-array": "Буш массив", "duplicate-args-warning": "Иғтибар: [[:$1]] берәүҙән артыҡ [[:$2]] параметры «$3» менән саҡыра. Һуңғы дәүмәл ҡулланыласаҡ.", "duplicate-args-category": "Ҡалыпты сығарғанда ҡабатланған аргументтарҙы ҡулланған биттәр", @@ -1021,11 +1023,11 @@ "prefs-common-css-js": "Бөтә күренештәр өсөн дөйөм CSS/JS:", "prefs-reset-intro": "Был битте, көйләүҙәрегеҙҙе ғәҙәттәге көйләүҙәргә ташлатыу өсөн ҡулланып була.\nРаҫлағандан һуң ғәмәлде кире ҡайтарып булмаясаҡ.", "prefs-emailconfirm-label": "Электрон почтаны раҫлау:", - "youremail": "Электрон почта *", + "youremail": "Электрон почта :", "username": "{{GENDER:$1|Ҡулланыусы исеме}}:", "prefs-memberingroups": "{{GENDER:$2|Ағза}} {{PLURAL:$1|төркөмө|төркөмдәре}}:", "prefs-registration": "Теркәлеү ваҡыты:", - "yourrealname": "Һеҙҙең ысын исемегеҙ (*)", + "yourrealname": "Һеҙҙең ысын исемегеҙ:", "yourlanguage": "Тышҡы күренештә ҡулланылған тел:", "yourvariant": "Эстәлектең тел варианты:", "prefs-help-variant": "Вики биттәренең эстәлеген күрһәтеү өсөн өҫтөнлөк бирелгән тел йәки орфография.", @@ -1318,9 +1320,9 @@ "recentchangeslinked-page": "Бит исеме:", "recentchangeslinked-to": "Киреһенсә, был биткә һылтанма яһаған биттәрҙәге үҙгәртеүҙәрҙе күрһәтергә", "recentchanges-page-added-to-category": "[[:$1]] категорияға өҫтәлгән", - "recentchanges-page-added-to-category-bundled": "[[:$1]] һәм {{PLURAL:$2|бер бит|$2 биттәр}} категорияға өҫтәлгән", + "recentchanges-page-added-to-category-bundled": "[[:$1]] һәм [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] категорияға өҫтәлгән", "recentchanges-page-removed-from-category": "[[:$1]] категориянан алынған", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] һәм {{PLURAL:$2|бер бит|$2 биттәр}} категориянан алынған", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] һәм [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] категориянан алынған", "autochange-username": "Автоматик рәүештә MediaWiki үҙгәртелә", "upload": "Файл тейәү", "uploadbtn": "Файлды тейәргә", @@ -1499,6 +1501,7 @@ "uploadstash-badtoken": "Был ғәмәлде башҡарып булманы, һеҙҙең төҙәтеү яҙмағыҙ ғәмәлдән сыҡҡан булыуы ихтимал. Яңынан ҡабатлап ҡарағыҙ.", "uploadstash-errclear": "Файлдарҙы таҙартып булманы.", "uploadstash-refresh": "Файлдар исемлеген яңыртырға", + "uploadstash-thumbnail": "һүрәттәрҙе ҡарау", "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", @@ -3233,7 +3236,7 @@ "tags-deactivate-reason": "Сәбәп:", "tags-deactivate-not-allowed": "«$1» тамғаһын һүндереп булмай.", "tags-deactivate-submit": "һүндерергә", - "tags-apply-no-permission": "Ҙәҙҙең үҙгәртеү тамғаһы ҡуйыу хоҡуғы юҡ.", + "tags-apply-no-permission": "Һеҙҙең үҙгәртеү тамғаһы ҡуйыу хоҡуғы юҡ.", "tags-apply-blocked": "Үҙгәртеүҙәргә тамға ҡуфырға һеҙҙең хоҡуҡ юҡ, һеҙ бикләнгән.", "tags-apply-not-allowed-one": " «$1» тамғаһын ҡулдан файҙаланып булмай", "tags-apply-not-allowed-multi": "Ҡулдан {{PLURAL:$2|түбәндәге тамғаны өҫтәп булмай}}: $1", @@ -3369,7 +3372,7 @@ "logentry-tag-update-remove-revision": "$1 {{GENDER:$2||}} {{PLURAL:$9|тамғаһын}} юйҙы $8 $4 өлгөһөнә $3 битенә", "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2||}} {{PLURAL:$9|тамғаһын}} юйҙы $8 $5 өлгөһөнә $3 битенә", "logentry-tag-update-revision": "$1 {{GENDER:$2||яңыртты}} $4 өлгөһөнөң тамғаларын $3 битендә ({{PLURAL:$7|өҫтәне}} $6; {{PLURAL:$9|юйылған}} $8)", - "logentry-tag-update-logentry": "$1 тамғаоарҙы {{GENDER:$2||яңыртты}} $5 битендә$3 ({{PLURAL:$7|өҫтәлгән}} $6; {{PLURAL:$9|юйылған}} $8)", + "logentry-tag-update-logentry": "$1 {{GENDER:$2||а}}журналда билдәләнгән яҙмаларҙы яңыртты $5 биттәр $3 (өҫтәлгән{{PLURAL:$7|а|ы}} $6; юйылған{{PLURAL:$9|а|ы}} $8)", "rightsnone": "(юҡ)", "revdelete-summary": "үҙгәртеүҙәр тасуирламаһы", "feedback-adding": "Биткә кире белдереү өҫтәлә", @@ -3386,7 +3389,7 @@ "feedback-error1": "Хата: API-нан беленмәгән хата", "feedback-error2": "Хата: Мөхәррирләү хатаһы", "feedback-error3": "Хата: API-нан яуап юҡ", - "feedback-error4": "Хаата: Баһаламала был башлыҡ аҫьындағы яҙманы урынлаштырап булмай.", + "feedback-error4": "Хата: Баһаламала был баш һүҙ аҫтындағы яҙманы урынлаштырап булмай.", "feedback-message": "Хәбәр:", "feedback-subject": "Тема:", "feedback-submit": "Ебәрергә", @@ -3434,7 +3437,7 @@ "api-error-stashzerolength": "Сервер файлды ваҡытлыса һаҡлағыста һаҡлау алмай, сөнкт оҙонлоғо 0.", "api-error-stashnotloggedin": "Файлды ваҡытлыса һаҡлағысҡа урынлаштырыу өсөн һеҙ системаҡа инергә тейешһегеҙ.", "api-error-stashwrongowner": "Ваҡытлыса һаҡлағыстағы файлда асырға теләнегеҙ, был файл һеҙҙеке түгел", - "api-error-stashnosuchfilekey": "Ваҡытлыса һаҡлағыста һеҙ асырға теләгән файлдың асҡыса юҡ.", + "api-error-stashnosuchfilekey": "Ваҡытлыса һаҡлағыста һеҙ асырға теләгән файлдың асҡысы юҡ.", "api-error-timeout": "Көтөлгән ваҡыт эсендә сервер яуып бирмәне.", "api-error-unclassified": "Билдәһеҙ хата барлыҡҡа килде.", "api-error-unknown-code": "Билдәһеҙ хата: «$1»", @@ -3448,7 +3451,7 @@ "duration-hours": "$1 {{PLURAL:$1|1=сәғәт|сәғәт}}", "duration-days": "$1 {{PLURAL:$1|көн}}", "duration-weeks": "$1 {{PLURAL:$1|аҙна}}", - "duration-years": "$1 {{PLURAL:$1|йыл|йылдар}}", + "duration-years": "$1 {{PLURAL:$1|йыл}}", "duration-decades": "$1 {{PLURAL:$1|1=ун йыллыҡ|ун йыллыҡтар}}", "duration-centuries": "$1 {{PLURAL:$1|1=быуат|быуаттар}}", "duration-millennia": "$1 {{PLURAL:$1|1=меңйыллыҡ|меңйыллыҡтар}}", @@ -3493,6 +3496,8 @@ "log-name-pagelang": "Телде үҙгәртеү дәфтәре", "log-description-pagelang": "Был бит телдәрендә үҙгәреүҙәр дәфтәре", "logentry-pagelang-pagelang": "$1 {{GENDER:$2|үҙгәртте}} язык страницы $3 биттең телен $4-тән $5-кә.", + "default-skin-not-found": "Уп-па! Викиҙы биҙәү темаһы рөхсәт ителмәгән $wgDefaultSkin, $1.\n\nҺеҙең ҡоролмала {{PLURAL:$4|түбәндәге}} биҙәү темалары бар. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] {{PLURAL:$4|Килешеү буйынса тема һайларға}}.\n\n$2\n\n; Әгәр яңы ғына MediaWiki урынлаштарған булһығыҙ:\n:Һеҙ быны Git-тан йәки сығанаҡ кодтан башға ысул ҡулланып эшләгәнһегеҙ. Ул ваҡытта был мөмкин. Ҡайһы бер темаларҙы урынлаштырып ҡарағыҙ[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] килешеү буйынса тема һайлау тарыһында мәғлүмәт.\n; MediaWiki-ны әле генә яңыртҡан булһағыҙ:\n: MediaWiki версиһында 1.24 автоматик яүыртыу булмаясаҡ. ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\n{{PLURAL:$5|Түбендәге юлды}} ҡуйығыҙ LocalSettings.php, {{PLURAL:$5|урынлаштырылған темаларҙы}} биҙәү өсөн: \n\n
$3
\n\n;Әгәр яңы ғына үҙгәрткән булһағыҙ LocalSettings.php:\n: Тема исемендә хата булмаһын, тикшерегеҙ.", + "default-skin-not-found-no-skins": "Уп-па! Викины биҙәү темаһы рөхсәт ителмәгән $wgDefaultSkin, $1.\n\nҺеҙең ҡоролмала түбәндәге биҙәү темалары бар. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] \n\n\n; Әгәр яңы ғына MediaWiki урынлаштарған булһығыҙ:\n:Һеҙ быны Git-тан йәки сығанаҡ кодтан башҡа ысул ҡулланып эшләгәнһегеҙ. Ул ваҡытта был мөмкин. Ҡайһы бер темаларҙы урынлаштырып ҡарағыҙ[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] килешеү буйынса тема һайлау тарыһында мәғлүмәт.\n; MediaWiki-ны әле генә яңыртҡан булһағыҙ:\n: MediaWiki версиһында 1.24 автоматик яүыртыу булмаясаҡ. ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\n \n\n\n;Әгәр яңы ғына үҙгәрткән булһағыҙ LocalSettings.php:\n: Тема исемендә хата булмаһын, тикшерегеҙ.", "default-skin-not-found-row-enabled": "* $1 / $2 (рөхсәт ителгән)", "default-skin-not-found-row-disabled": "* $1 / $2 (рөхсәт ителмәгән)", "mediastatistics": "Медиа-статистика", @@ -3556,5 +3561,25 @@ "sessionprovider-generic": "$1 сессия", "sessionprovider-mediawiki-session-cookiesessionprovider": "куки нигеҙендә сессиялар", "sessionprovider-nocookies": "Ярҙам кәрәкме?", - "randomrootpage": "Ярҙам кәрәкме?" + "randomrootpage": "Ярҙам кәрәкме?", + "log-action-filter-block": "Блоклау төрө:", + "log-action-filter-delete": "Юйҙырыу төрө:", + "log-action-filter-patrol": "Патруль төрө:", + "log-action-filter-protect": "Һаҡлау төрө:", + "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-delete-delete": "Битте юйыуҙар", + "log-action-filter-delete-restore": "Битте тергеҙеү", + "log-action-filter-delete-event": "Журналды юйыу", + "log-action-filter-delete-revision": "Версияны алып ташларға", + "log-action-filter-patrol-patrol": "Ҡулдан патруль яһау", + "log-action-filter-patrol-autopatrol": "Автоматик патруль", + "log-action-filter-protect-protect": "Һаҡлау", + "log-action-filter-protect-modify": "Яңынан тейәү", + "log-action-filter-protect-unprotect": "Һаҡты алып ташлау", + "log-action-filter-upload-upload": "Яңы күсереү", + "log-action-filter-upload-overwrite": "Ҡабаттан тейәү" } diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index bc07310027..887941ac7f 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -156,7 +156,6 @@ "moredotdotdot": "Далей…", "morenotlisted": "Гэта ня поўны сьпіс.", "mypage": "Старонка", - "anonuserpage": "Невядомы ўдзельнік", "mytalk": "Гутаркі", "anontalk": "Гутаркі", "navigation": "Навігацыя", @@ -884,7 +883,7 @@ "revertmerge": "Разьяднаць", "mergelogpagetext": "Ніжэй знаходзіцца сьпіс апошніх аб'яднаньняў гісторыяў старонак.", "history-title": "$1 — гісторыя зьменаў", - "difference-title": "$1: розьніца паміж вэрсіямі", + "difference-title": "Розьніца паміж вэрсіямі «$1»", "difference-title-multipage": "«$1» і «$2» — розьніца паміж старонкамі", "difference-multipage": "(Розьніца паміж старонкамі)", "lineno": "Радок $1:", @@ -1172,7 +1171,7 @@ "right-applychangetags": "дадаваць [[Special:Tags|меткі]] пры рэдагаваньні", "right-changetags": "дадаваць і выдаляць адвольныя [[Special:Tags|меткі]] да асобных вэрсіяў і запісаў у журнале падзеяў", "grant-generic": "Набор правоў «$1»", - "grant-group-page-interaction": "Узаемадзеньне з старонкамі", + "grant-group-page-interaction": "Узаемадзеяньне з старонкамі", "grant-group-file-interaction": "Узаемадзеяньне з мэдыяфайламі", "grant-group-watchlist-interaction": "Узаемадзеяньне з вашым сьпісам назіраньня", "grant-group-email": "Адпраўка лістоў электроннай пошты", @@ -1197,6 +1196,10 @@ "grant-rollback": "Адкат зьменаў старонак", "grant-sendemail": "Адпраўка лістоў электроннай пошты іншым удзельнікам", "grant-uploadeditmovefile": "Загрузка, замена і перайменаваньне файлаў", + "grant-uploadfile": "Загрузка новых файлаў", + "grant-basic": "Асноўныя правы", + "grant-viewdeleted": "Прагляд выдаленых файлаў і старонак", + "grant-viewmywatchlist": "Прагляд вашага сьпісу назіраньня", "newuserlogpage": "Журнал стварэньня рахункаў", "newuserlogpagetext": "Гэта журнал стварэньня рахункаў удзельнікаў і ўдзельніц.", "rightslog": "Журнал правоў удзельнікаў", @@ -1206,6 +1209,7 @@ "action-createpage": "стварэньне старонак", "action-createtalk": "стварэньне старонак абмеркаваньняў", "action-createaccount": "стварэньне гэтага рахунку ўдзельніка", + "action-autocreateaccount": "аўтаматычнае стварэньне гэтага рахунку вонкавага ўдзельніка", "action-history": "прагляд гісторыі гэтай старонкі", "action-minoredit": "пазначэньне гэтай праўкі як дробнай", "action-move": "перанос гэтай старонкі", @@ -1309,9 +1313,9 @@ "recentchangeslinked-page": "Назва старонкі:", "recentchangeslinked-to": "Замест гэтага паказваць зьмены на старонках, што спасылаюцца на гэтую старонку", "recentchanges-page-added-to-category": "[[:$1]] дададзеная да катэгорыі", - "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}} да катэгорыі", + "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ [[Special:WhatLinksHere/$1|{{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}}]] да катэгорыі", "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ $2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}} з катэгорыі", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}}]] з катэгорыі", "autochange-username": "Аўтаматычная зьмена MediaWiki", "upload": "Загрузіць файл", "uploadbtn": "Загрузіць файл", @@ -1384,6 +1388,7 @@ "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».", "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.", "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў $1=\"$2\" не дазволена для SVG-файлаў.", + "uploaded-href-attribute-svg": "href-атрыбутам у SVG-файлах дазволена весьці толькі на http:// ці https://, знойдзена <$1 $2=\"$3\">.", "uploaded-href-unsafe-target-svg": "У загружаным SVG-файле знойдзеная спасылка на небясьпечныя зьвесткі: URI-мэты <$1 $2=\"$3\">.", "uploaded-animate-svg": "У загружаным SVG-файле знойдзены тэг «animate», які можа зьмяняць спасылку з дапамогай атрыбуту «from» <$1 $2=\"$3\">.", "uploaded-setting-event-handler-svg": "Усталёўка атрыбутаў апрацоўкі падзеяў заблякаваная, у загружаным SVG-файле знойдзены код <$1 $2=\"$3\">.", @@ -1416,6 +1421,7 @@ "upload-too-many-redirects": "URL-адрас утрымлівае зашмат перанакіраваньняў", "upload-http-error": "Узьнікла памылка HTTP: $1", "upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.", + "upload-foreign-cant-upload": "Гэтая вікі не наладжаная для загрузкі файлаў у запытанае вонкавае сховішча файлаў.", "upload-dialog-title": "Загрузка файла", "upload-dialog-button-cancel": "Адмяніць", "upload-dialog-button-done": "Зроблена", @@ -1485,9 +1491,10 @@ "uploadstash-summary": "Гэтая старонка прадстаўляе доступ да файлаў, якія загружаныя (ці знаходзяцца ў працэсе загрузкі), але яшчэ не апублікаваныя ў {{GRAMMAR:месны|{{SITENAME}}}}. Гэтыя файлы нябачныя нікому, акрамя ўдзельнікаў, якія іх загрузілі.", "uploadstash-clear": "Ачысьціць схаваныя файлы", "uploadstash-nofiles": "Вы ня маеце схаваных файлаў.", - "uploadstash-badtoken": "Немагчыма выканаць гэтае дзеяньне, верагодна скончыўся тэрмін дзеяньня Вашага дазволу на рэдагаваньне. Паспрабуйце зноў.", - "uploadstash-errclear": "Немагчыма ачысьціць файлы.", + "uploadstash-badtoken": "Не атрымалася выканаць гэтае дзеяньне. Верагодна, скончыўся тэрмін дзеяньня вашых уліковых зьвестак. Калі ласка, паспрабуйце зноў.", + "uploadstash-errclear": "Не атрымалася ачысьціць файлы.", "uploadstash-refresh": "Абнавіць сьпіс файлаў.", + "uploadstash-thumbnail": "прагляд мініятуры", "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.", @@ -1736,8 +1743,13 @@ "apihelp": "Даведка API", "apihelp-no-such-module": "Модуль «$1» ня знойдзены.", "apisandbox": "Пясочніца API", + "apisandbox-jsonly": "Для выкарыстаньня API-пясочніцы патрэбны JavaScript.", "apisandbox-api-disabled": "API забаронены на гэтым сайце.", "apisandbox-intro": "Выкарыстоўвайце гэтую старонку для экспэрымэнтаў з API вэб-сэрвісу MediaWiki.\nЗьвяртайцеся да [[mw:API:Main page|дакумэнтацыі API]] для дадатковай інфармацыі па выкарыстаньні API. Напрыклад, [//www.mediawiki.org/wiki/API#A_simple_example як атрымаць зьмест галоўнай старонкі]. Абярыце дзеяньне, каб пабачыць болей узораў.\n\nЗьвярніце ўвагу, што нягледзячы на тое, што гэта пясочніца, вашыя дзеяньні могуць унесьці зьмены ў вікі.", + "apisandbox-fullscreen": "Разгарнуць панэль", + "apisandbox-fullscreen-tooltip": "Разгарнуць панэль пясочніцы, каб запоўніць акно браўзэра.", + "apisandbox-unfullscreen": "Паказаць старонку", + "apisandbox-unfullscreen-tooltip": "Паменшыць панэль пясочніцы, каб былі даступныя навігацыйныя спасылкі MediaWiki.", "apisandbox-submit": "Зрабіць запыт", "apisandbox-reset": "Ачысьціць", "apisandbox-examples": "Прыклады", @@ -1760,7 +1772,10 @@ "log-title-wildcard": "Шукаць назвы, якія пачынаюцца з гэтага тэксту", "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы ў журнале", "log-edit-tags": "Рэдагаваць меткі да абраных запісаў у журнале падзеяў", - "checkbox-all": "Усе", + "checkbox-select": "Выбраць: $1", + "checkbox-all": "усе", + "checkbox-none": "нічога", + "checkbox-invert": "адваротна", "allpages": "Усе старонкі", "nextpage": "Наступная старонка ($1)", "prevpage": "Папярэдняя старонка ($1)", @@ -3198,7 +3213,7 @@ "tags-delete-not-allowed": "Меткі, вызначаныя пашырэньнем, ня могуць быць выдаленыя, акрамя выпадку, калі пашырэньне дазваляе гэта.", "tags-delete-not-found": "Метка «$1» не існуе.", "tags-delete-too-many-uses": "Метка «$1» выкарыстаная ў больш чым $2 {{PLURAL:$2|вэрсіі|вэрсіях}}, адпаведна, яна ня можа быць выдаленая.", - "tags-delete-warnings-after-delete": "Метка «$1» была пасьпяхова выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:", + "tags-delete-warnings-after-delete": "Метка «$1» была выдаленая, але {{PLURAL:$2|1=атрыманае наступнае папярэджаньне|атрыманыя наступныя папярэджаньні}}:", "tags-activate-title": "Актываваць метку", "tags-activate-question": "Вы зьбіраецеся актываваць метку «$1».", "tags-activate-reason": "Прычына:", @@ -3237,7 +3252,7 @@ "tags-edit-reason": "Прычына:", "tags-edit-revision-submit": "Дастасаваць зьмены да {{PLURAL:$1|1=гэтай вэрсіі|$1 вэрсіяў}}", "tags-edit-logentry-submit": "Дастасаваць зьмены да {{PLURAL:$1|$1 журнальнага запісу|$1 журнальных запісаў}}", - "tags-edit-success": "Зьмены былі пасьпяхова дастасаваныя.", + "tags-edit-success": "Зьмены былі дастасаваныя.", "tags-edit-failure": "Гэтыя зьмены ня могуць быць дастасаваныя:\n$1", "tags-edit-nooldid-title": "Няслушная мэтавая вэрсія", "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую вэрсію для выкананьня гэтай функцыі, або пазначаная вэрсія не існуе.", diff --git a/languages/i18n/be.json b/languages/i18n/be.json index 2248b56b93..2ddea113da 100644 --- a/languages/i18n/be.json +++ b/languages/i18n/be.json @@ -25,7 +25,8 @@ "Artificial123", "Macofe", "Matma Rex", - "Goshaproject" + "Goshaproject", + "Nemo bis" ] }, "tog-underline": "Падкрэсліваць спасылкі:", @@ -166,7 +167,6 @@ "moredotdotdot": "Яшчэ...", "morenotlisted": "Гэты спіс не поўны.", "mypage": "Старонка", - "anonuserpage": "Нявызначаны ўдзельнік", "mytalk": "Размовы", "anontalk": "Размовы", "navigation": "Навігацыя", @@ -1324,7 +1324,7 @@ "recentchangeslinked-page": "Назва старонкі:", "recentchangeslinked-to": "Паказваць, замест гэтага, змяненні на старонках, што спасылаюцца сюды", "recentchanges-page-added-to-category": "[[:$1]] дададзена ў катэгорыю", - "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|адна старонка дададзена|$2 старонкі дададзены|$2 старонак дададзена}} ў катэгорыю", + "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ [[Special:WhatLinksHere/$1|{{PLURAL:$2|адна старонка дададзена|$2 старонкі дададзены|$2 старонак дададзена}}]] ў катэгорыю", "recentchanges-page-removed-from-category": "[[:$1]] выдалена з катэгорыі", "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|адна старонка выдалена|$2 старонкі выдалены|$2 старонак выдалена}} з катэгорыі", "autochange-username": "Аўтаматычная змена MediaWiki", @@ -1399,6 +1399,9 @@ "uploaded-script-svg": "У ўкладзеным SVG-файле знойдзены небяспечны элемент з падтрымкай скрыптаў \"$1\".", "uploaded-hostile-svg": "У ўкладзеным SVG файле знойдзены небяспечны CSS у элеменце стылю.", "uploaded-event-handler-on-svg": "Устаноўка атрыбутаў апрацоўшчыка падзей $1=\"$2\" у SVG файле не дазваляецца.", + "uploaded-href-attribute-svg": "у SVG файлах атрыбутам href дазволены толькі мэты віду http:// або https://, знойдзена <$1 $2=\"$3\">.", + "uploaded-href-unsafe-target-svg": "У ўкладзеным SVG файле знойдзена спасылка на небяспечныя звесткі: URI мэты <$1 $2=\"$3\">.", + "uploaded-animate-svg": "У ўкладзеным SVG файле знойдзены тэг \"animate\", здольны змяніць спасылку з дапамогай атрыбута \"from\" <$1 $2=\"$3\">.", "uploadscriptednamespace": "Гэты файл SVG утрымлівае недапушчальную прастору імёнаў \"$1\".", "uploadinvalidxml": "Немагчыма прааналізаваць XML ва ўкладзеным файле.", "uploadvirus": "Файл утрымлівае вірус! Падрабязнасці: $1", @@ -1412,6 +1415,7 @@ "upload-options": "Магчымасці ўкладання", "watchthisupload": "Назіраць за файлам", "filewasdeleted": "Файл з такою назвай быў раней укладзены сюды, а потым сцёрты. Варта паглядзець у $1 перад тым, як укладаць яго нанова.", + "filename-thumb-name": "Выглядае як назва мініяцюры. Калі ласка, не загружайце мініяцюры назад у тую ж вікі. Калі вам неабходны гэты файл, выпраўце назву на больш асэнсаваную, каб яна не ўтрымлівала прэфікс мініяцюры.", "filename-bad-prefix": "Назва файла, які вы ўкладаеце, пачынаецца з \"$1\", што падобна на аўтаматычныя, неінфарматыўныя назвы файлаў, якія робяць лічбавыя фотаапараты. Калі ласка, змяніце назву на больш зразумелую.", "upload-proto-error": "Няправільны пратакол", "upload-proto-error-text": "Укладанне файла зводдаль патрабуе URL, які пачынаецца з http:// або ftp://.", @@ -1422,6 +1426,7 @@ "upload-too-many-redirects": "Занадта шмат перасылак за гэтым адрасам (URL)", "upload-http-error": "Памылка HTTP: $1", "upload-copy-upload-invalid-domain": "Капіраванне загрузак не дазволенае ў гэтым дамене.", + "upload-foreign-cant-upload": "Гэта вікі не настроена для ўкладання файлаў у запытанае старонняе сховішча файлаў.", "upload-dialog-title": "Укласці файл", "upload-dialog-button-cancel": "Нічога", "upload-dialog-button-done": "Гатова", @@ -1429,6 +1434,7 @@ "upload-dialog-button-upload": "Укласці", "upload-form-label-infoform-title": "Падрабязнасці", "upload-form-label-infoform-name": "Назва", + "upload-form-label-infoform-name-tooltip": "Унікальны апісальны загаловак для файла, які будзе служыць яго назвай. Можаце выкарыстоўваць звычайную мову з прабеламі. Не дадавайце канчатак назвы файла.", "upload-form-label-infoform-description": "Апісанне", "upload-form-label-usage-title": "Выкарыстанне", "upload-form-label-usage-filename": "Назва файла", @@ -1515,6 +1521,7 @@ "listfiles-delete": "сцерці", "listfiles-summary": "Гэтая службовая старонка паказвае ўсе загружаныя файлы.", "listfiles_search_for": "Знайсці назву выявы:", + "listfiles-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.", "imgfile": "файл", "listfiles": "Усе файлы", "listfiles_thumb": "Драбніца", @@ -1728,8 +1735,10 @@ "apihelp": "Даведка па API", "apihelp-no-such-module": "Модуль \"$1\" не знойдзены.", "apisandbox": "Пясочніца API", + "apisandbox-jsonly": "Каб выкарыстоўваць пясочніцу API, патрэбен JavaScript.", "apisandbox-api-disabled": "API адключаны на гэтым сайце.", "apisandbox-fullscreen": "Разгарнуць панэль", + "apisandbox-fullscreen-tooltip": "Разгарнуць панэль пясочніцы, каб запоўніць акно браўзера.", "apisandbox-unfullscreen": "Паказаць старонку", "apisandbox-submit": "Зрабіць запыт", "apisandbox-reset": "Ачысціць", @@ -1743,6 +1752,7 @@ "apisandbox-dynamic-error-exists": "Параметр з назвай \"$1\" ужо існуе.", "apisandbox-deprecated-parameters": "Састарэлыя параметры", "apisandbox-results": "Вынікі", + "apisandbox-alert-page": "Палі на гэтай старонцы недапушчальныя.", "apisandbox-alert-field": "Значэнне гэтага поля недапушчальнае.", "booksources": "Кнігі", "booksources-search-legend": "Знайсці, дзе купіць кнігі", @@ -1758,6 +1768,8 @@ "logempty": "Нічога адпаведнага ў журнале не знойдзена.", "log-title-wildcard": "Знайсці назвы, якія пачынаюцца з гэтага тэксту", "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы журнала", + "log-edit-tags": "Правіць біркі да выбраных запісаў журнала", + "checkbox-select": "Выбраць: $1", "checkbox-all": "Усе", "allpages": "Усе старонкі", "nextpage": "Наступная старонка ($1)", @@ -1962,6 +1974,7 @@ "changecontentmodel-reason-label": "Прычына:", "changecontentmodel-submit": "Змяніць", "logentry-contentmodel-change-revertlink": "адкаціць", + "logentry-contentmodel-change-revert": "адкат", "protectlogpage": "Журнал аховы", "protectlogtext": "Ніжэй прыведзены журнал змен абароны старонкі.\nВы можаце таксама прагледзець [[Special:ProtectedPages|пералік старонак пад аховай]].", "protectedarticle": "пад аховай «[[$1]]»", @@ -1999,6 +2012,7 @@ "protect-othertime": "Іншы час:", "protect-othertime-op": "іншы час", "protect-existing-expiry": "Вызначаны час сканчэння: $3, $2", + "protect-existing-expiry-infinity": "Наяўны тэрмін дзеяння: бясконца", "protect-otherreason": "Іншая ці дадатковая прычына:", "protect-otherreason-op": "Іншая прычына", "protect-dropdown": "*Звычайныя прычыны пастаноўкі аховы\n** Празмерны ўзровень вандалізму\n** Празмерны ўзровень спаму\n** Шкодная вайна правак\n** Старонка з высокай наведвальнасцю", @@ -2191,6 +2205,7 @@ "block-log-flags-hiddenname": "схаванае імя ўдзельніка", "range_block_disabled": "Не дазволена адміністратарская магчымасць ставіць блокі на адрасныя дыяпазоны.", "ipb_expiry_invalid": "Некарэктны час сканчэння.", + "ipb_expiry_old": "Час сканчэння — у мінулым.", "ipb_expiry_temp": "Скрытыя блокі на імёны ўдзельнікаў мусяць быць сталымі.", "ipb_hide_invalid": "Немагчыма заглушыць гэты рахунак; для яго маецца больш за {{PLURAL:$1|адну праўку|$1 праўкі|$1 правак}}.", "ipb_already_blocked": "\"$1\" ужо знаходзіцца пад блокам", @@ -2333,6 +2348,8 @@ "import-interwiki-history": "Капіраваць усе гістарычныя версіі гэтай старонкі", "import-interwiki-templates": "Разам з усімі шаблонамі", "import-interwiki-submit": "Імпартаваць", + "import-mapping-namespace": "Імпартаваць у прастору назваў:", + "import-mapping-subpage": "Імпартаваць як падстаронкі наступнай старонкі:", "import-upload-filename": "Назва файла:", "import-comment": "Каментарый:", "importtext": "Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].\nЗахавайце яго на свой камп'ютар, а потым загрузіце сюды.", @@ -2374,6 +2391,7 @@ "javascripttest": "JavaScript-тэсты", "javascripttest-pagetext-noframework": "Гэта старонка зарэзервавана для запуску тэстаў JavaScript", "javascripttest-pagetext-unknownframework": "Невядомая бібліятэка тэставання «$1».", + "javascripttest-pagetext-unknownaction": "Невядомае дзеянне \"$1\".", "javascripttest-pagetext-frameworks": "Калі ласка, выберыце адну з прапанаваных бібліятэк тэставання: $1", "javascripttest-pagetext-skins": "Выберыце афармленне для тэставання:", "javascripttest-qunit-intro": "Глядзіце [$1 дакументацыю па тэставанні] на mediawiki.org.", @@ -2417,6 +2435,7 @@ "tooltip-feed-atom": "Струмень навін Atom для гэтай старонкі", "tooltip-t-contributions": "Пералік укладаў {{GENDER:$1|гэтага ўдзельніка|гэтай удзельніцы}}", "tooltip-t-emailuser": "Адаслаць {{GENDER:$1|удзельніку|удзельніцы}} ліст эл.пошты", + "tooltip-t-info": "Больш звестак пра гэту старонку", "tooltip-t-upload": "Укласці файлы", "tooltip-t-specialpages": "Пералік усіх адмысловых старонак", "tooltip-t-print": "Друкавальная версія гэтай старонкі", @@ -2481,7 +2500,9 @@ "pageinfo-robot-index": "Дазволена", "pageinfo-robot-noindex": "Не дазволена", "pageinfo-watchers": "Колькасць назіральнікаў старонкі", + "pageinfo-visiting-watchers": "Колькасць удзельнікаў, якія назіраюць за старонкай і бачылі апошнія змены", "pageinfo-few-watchers": "Менш чым $1 {{PLURAL:$1|назіральнік|назіральнікі|назіральнікаў}}", + "pageinfo-few-visiting-watchers": "Могуць быць, а можа і не быць удзельнікаў, якія назіраюць за старонкай і бачылі апошнія змены", "pageinfo-redirects-name": "Колькасць перасылак на гэту старонку", "pageinfo-subpages-name": "Колькасць падстаронак гэтай старонкі", "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перасылка|перасылкі|перасылак}}; $3 {{PLURAL:$3|прамая спасылка|прамыя спасылкі|прамых спасылак}})", @@ -2506,11 +2527,13 @@ "pageinfo-protect-cascading-yes": "Да", "pageinfo-protect-cascading-from": "Каскадная ахова ад", "pageinfo-category-info": "Звесткі аб катэгорыі", + "pageinfo-category-total": "Агульная колькасць членаў", "pageinfo-category-pages": "Колькасць старонак", "pageinfo-category-subcats": "Колькасць падкатэгорый", "pageinfo-category-files": "Колькасць файлаў", "markaspatrolleddiff": "Пазначыць як ухваленае", "markaspatrolledtext": "Пазначыць старонку як ухваленую", + "markaspatrolledtext-file": "Пазначыць версію файла як ухваленую", "markedaspatrolled": "Пазначана як ухваленае", "markedaspatrolledtext": "Азначаная версія [[:$1]] пазначана як ухваленая.", "rcpatroldisabled": "Не працуе Ухваленне Нядаўніх Правак", @@ -2523,6 +2546,7 @@ "patrol-log-page": "Журнал ухваленых", "patrol-log-header": "Журнал ухваленых версій", "log-show-hide-patrol": "$1 журнал ухваленняў", + "log-show-hide-tag": "$1 журнал бірак", "deletedrevision": "Сцёрта старая версія $1", "filedeleteerror-short": "Памылка пры сціранні файла: $1", "filedeleteerror-long": "Памылкі пры спробе сцірання файла:\n\n$1", @@ -2545,6 +2569,7 @@ "svg-long-error": "Няспраўны файл SVG: $1", "show-big-image": "Арыгінальны файл", "show-big-image-preview": "Памер пры папярэднім праглядзе: $1.", + "show-big-image-preview-differ": "Памер гэтага $3-прагляду для $2-файла: $1.", "show-big-image-other": "{{PLURAL:$2|Іншы дазвол|Іншыя дазволы}}: $1.", "show-big-image-size": "$1 × $2 піхеляў", "file-info-gif-looped": "закальцаваныя", @@ -2560,6 +2585,7 @@ "newimages-legend": "Фільтр", "newimages-label": "Назва файла (або яе частка):", "newimages-showbots": "Паказваць укладанні ботамі", + "newimages-hidepatrolled": "Без паказу ўхваленых ўкладанняў", "noimages": "Тут нічога няма.", "ilsubmit": "Знайсці", "bydate": "п. датаў", @@ -2773,6 +2799,7 @@ "exif-compression-4": "CCITT Group 4, факсавае кадзіраванне", "exif-copyrighted-true": "Ахоўваецца аўтарскім правам", "exif-copyrighted-false": "Статус аўтарства не ўстаноўлены", + "exif-photometricinterpretation-1": "Чорны і белы (чорны — 0)", "exif-unknowndate": "Невядомая дата", "exif-orientation-1": "Звычайна", "exif-orientation-2": "Адлюстравана злева ўправа", @@ -2954,7 +2981,7 @@ "scarytranscludefailed-httpstatus": "[Не ўдалося атрымаць шаблон для $1: HTTP $2]", "scarytranscludetoolong": "[Занадта доўгі URL]", "deletedwhileediting": "'''Увага''': гэтая старонка была сцёрта пасля таго, як вы пачалі з ёй працаваць!", - "confirmrecreate": "Удзельнік [[User:$1|$1]] ([[User talk:$1|размова]]) сцёр гэты артыкул пасля таго, як вы пачалі працу з ім, падаўшы прычыну:\n: ''$2''\nПацвердзіце свой намер аднавіць гэты артыкул.", + "confirmrecreate": "{{GENDER:$1|Удзельнік|Удзельніца}} [[User:$1|$1]] ([[User talk:$1|размова]]) {{GENDER:$1|сцёр|сцерла}} гэты артыкул пасля таго, як вы пачалі працу з ім, падаўшы прычыну:\n: $2\nПацвердзіце свой намер аднавіць гэты артыкул.", "confirmrecreate-noreason": "{{GENDER:$1|Удзельнік|Удзельніца}} [[User:$1|$1]] ([[User talk:$1|размовы]]) {{GENDER:$1|сцёр|сцёрла}} гэту старонку пасля таго, як вы пачалі яе рэдагаваць.\nКалі ласка, пацвердзіце, што вы сапраўды жадаеце аднавіць гэтую старонку.", "recreate": "Аднавіць", "unit-pixel": "крпк", @@ -3019,6 +3046,7 @@ "timezone-local": "Мясцовы", "duplicate-defaultsort": "Увага: прадвызначаная клавіша ўпарадкавання \"$2\" замяніла ранейшую такую клавішу \"$1\".", "duplicate-displaytitle": "Папярэджанне: Паказаная назва \"$2\" перасягае ранейшую назву \"$1\".", + "invalid-indicator-name": "Памылка: Атрыбут name індыкатараў статусу старонкі не можа быць пустым.", "version": "Версія", "version-extensions": "Устаноўленыя прыстаўкі", "version-skins": "Устаноўленыя вокладкі", @@ -3074,6 +3102,7 @@ "redirect-page": "Ідэнтыфікатар старонкі", "redirect-revision": "Версія старонкі", "redirect-file": "Назва файла", + "redirect-logid": "ID журнала", "redirect-not-exists": "Значэнне не знойдзена", "fileduplicatesearch": "Пошук дублікатных файлаў", "fileduplicatesearch-summary": "Пошук дублікатных файлах на падставе іх хэшаў.", @@ -3099,6 +3128,7 @@ "specialpages-group-wiki": "Вікізвесткі і прылады", "specialpages-group-redirects": "Адмысловыя старонкі-перасылкі", "specialpages-group-spam": "Прылады супраць спама", + "specialpages-group-developer": "Інструменты распрацоўшчыка", "blankpage": "Пустая старонка", "intentionallyblankpage": "Старонка наўмысна пакінута пустой, і ўжываецца для вымярэння хуткасці і падобнага.", "external_image_whitelist": " #Гэты радок пакіньце ў такім самым выглядзе
\n#Упішыце часткі рэгулярных выразаў (тое, што пішуць паміж знакамі //) ніжэй\n#Гэта будзе параўноўвацца з адрасамі URL вонкавых выяваў, на якія ёсць спасылкі\n#Тыя з іх, дзе атрымаецца адпаведнасць, будуць паказаныя як выявы, а іначай толькі як спасылкі\n#Радкі, якія пачынаюцца з знака #, лічацца каментарамі\n#Малыя і вялікія літары не адрозніваюцца\n\n#Усе часткі рэгулярных выразаў павінны быць над гэтым радком. Сам радок пакіньце ў такім самым выглядзе
", @@ -3123,9 +3153,40 @@ "tags-activate": "актываваць", "tags-deactivate": "адключыць", "tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}", + "tags-create-heading": "Стварыць новую бірку", + "tags-create-explanation": "Калі не ўказана іншае, новыя біркі будуць даступны для выкарыстання ўдзельнікам і робатам.", "tags-create-tag-name": "Назва біркі:", "tags-create-reason": "Прычына:", "tags-create-submit": "Стварыць", + "tags-create-no-name": "Вы мусіце ўказаць назву біркі.", + "tags-create-invalid-chars": "Назвы бірак не павінны ўтрымліваць коскі (,) або касыя рысы (/).", + "tags-create-invalid-title-chars": "Назвы бірак не павінны ўтрымліваць сімвалы, якія нельга выкарыстоўваць у назвах старонак.", + "tags-create-already-exists": "Бірка \"$1\" ужо ёсць.", + "tags-create-warnings-below": "Вы хочаце прадоўжыць стварэнне біркі?", + "tags-delete-title": "Сцерці бірку", + "tags-delete-explanation-initial": "Вы збіраецеся выдаліць бірку \"$1\" з базы звестак.", + "tags-delete-explanation-warning": "Гэта дзеянне незваротнае і не можа быць адкочана нават адміністратарамі базы звестак. Упэўніцеся, што гэта тая бірка, што вы хочаце выдаліць.", + "tags-delete-reason": "Прычына:", + "tags-delete-submit": "Незваротна сцерці гэту бірку", + "tags-delete-not-found": "Бірка \"$1\" не існуе.", + "tags-delete-too-many-uses": "Бірка \"$1\" прыменена ў больш чым $2 {{PLURAL:$2|версіі|версіях}}, а значыць, яна не можа быць сцёрта.", + "tags-delete-warnings-after-delete": "Бірка \"$1\" была сцёрта, але {{PLURAL:$2|1=атрымана наступнае папярэджанне|атрыманы наступныя папярэджанні}}:", + "tags-activate-title": "Актываваць бірку", + "tags-activate-question": "Вы збіраецеся актываваць бірку \"$1\".", + "tags-activate-reason": "Прычына:", + "tags-activate-not-allowed": "Немагчыма актываваць бірку \"$1\".", + "tags-activate-not-found": "Бірка \"$1\" не існуе.", + "tags-activate-submit": "Актываваць", + "tags-deactivate-title": "Дэактываваць бірку", + "tags-deactivate-question": "Вы збіраецеся дэактываваць бірку \"$1\".", + "tags-deactivate-reason": "Прычына:", + "tags-deactivate-not-allowed": "Немагчыма дэактываваць бірку \"$1\".", + "tags-deactivate-submit": "Дэактываваць", + "tags-edit-title": "Правіць біркі", + "tags-edit-existing-tags": "Наяўныя біркі:", + "tags-edit-new-tags": "Новыя біркі:", + "tags-edit-add": "Дадаць гэтыя біркі:", + "tags-edit-reason": "Прычына:", "comparepages": "Параўнанне старонак", "compare-page1": "Старонка 1", "compare-page2": "Старонка 2", diff --git a/languages/i18n/bgn.json b/languages/i18n/bgn.json index bae6d56025..d6c4533a4e 100644 --- a/languages/i18n/bgn.json +++ b/languages/i18n/bgn.json @@ -367,7 +367,7 @@ "filereadonlyerror": "«$1» ئی فایلئ تغیر داتین ممکن نه اینت چون ه «$2» ئی فایلي مخزن فقط بی وانتینی ئین حالت ئی تا قرار داریت.\n\nمدیری که آیرا قُلپ کورته ایرنگ توضیح داته: «$3».", "invalidtitle-knownnamespace": "نا موتبرین ئنوان گو نامئ فضای «$2» و متن ئی «$3»", "invalidtitle-unknownnamespace": "ناموتبرین ئنوان گو نا زاتین نامئ فضای شماره $1 و متن ئی «$2»", - "exception-nologin": "لاگین نه بوته ئیت", + "exception-nologin": "لاگین نه بوته‌ئیت", "exception-nologin-text": "مهربانی بئ [[Special:Userlogin|تا داخل بیئت]] تا بتوانیت بئ ای تاکدیما دسترسی داشته بئیت.", "exception-nologin-text-manual": "مهربانئ بکنیت $1 تا بتوانیت بئ ای تاکدیم یا عمل ئا دسترسی داشته بئیت .", "virus-badscanner": "بدین پیکربندی: نازانتین ویروس ئی سکن کورتین: ''$1''", @@ -399,7 +399,7 @@ "userloginnocreate": "داخل بوتین", "logout": "در بوتین", "userlogout": "در بوتین", - "notloggedin": "لاگین نه بوته ئیت", + "notloggedin": "لاگین نه بوته‌ئیت", "userlogin-noaccount": "شما کار زوروکین حسابئ نداریت؟", "userlogin-joinproject": "بی {{SITENAME}} تا نام‌نویسی کنیت!", "nologin": "شما کار زوروکین حسابئ نداریت ؟ $1.", @@ -2559,6 +2559,18 @@ "watchlisttools-view": "مربوتین تغیرانی دیستین", "watchlisttools-edit": "دیدارلیست ئی دیستین و ایڈیٹ کورتین", "watchlisttools-raw": "واچلیستئ آمگین لیستانی ایڈیٹ", + "iranian-calendar-m1": "مولمان", + "iranian-calendar-m2": "کرا", + "iranian-calendar-m3": "سوچکان", + "iranian-calendar-m4": "جلکان", + "iranian-calendar-m5": "جلکشان", + "iranian-calendar-m6": "سچان", + "iranian-calendar-m7": "تۆمشان", + "iranian-calendar-m8": "سرتان", + "iranian-calendar-m9": "گوبشان", + "iranian-calendar-m10": "تاکشان", + "iranian-calendar-m11": "بهاران", + "iranian-calendar-m12": "اوسته‌مان", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گپ و حبر]])", "version": "نخسه", "version-extensions": "لچیته گین اپزونه ئان", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index 570797afd5..69f663d9b7 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -168,7 +168,6 @@ "moredotdotdot": "আরও...", "morenotlisted": "এটি একটি অসম্পূর্ণ তালিকা।", "mypage": " পাতা", - "anonuserpage": "অজানা ব্যবহারকারী", "mytalk": "আলোচনা", "anontalk": "আলাপ", "navigation": "পরিভ্রমণ", @@ -466,8 +465,8 @@ "nocookieslogin": "ব্যবহারকারীদের প্রবেশ সম্পন্ন করতে {{SITENAME}} কুকি ব্যবহার করে। আপনার ব্রাউজারে কুকি নিষ্ক্রিয় করা আছে। কুকি চালু করে আবার চেষ্টা করুন।", "nocookiesfornew": "ব্যবহারকারীর অ্যাকাউন্ট তৈরি হয়নি, কারণ এর উৎস সম্পর্কে আমরা নিশ্চিত নই।\nনিশ্চিত করুন আপনার কুকি সক্রিয় রয়েছে, পাতাটি পুনরায় লোড করে আবার চেষ্টা করুন।", "noname": "আপনি সঠিক ব্যবহারকারী নাম নির্দিষ্ট করেননি।", - "loginsuccesstitle": "প্রবেশ সফল", - "loginsuccess": "'''আপনি এইমাত্র \"$1\" নামে {{SITENAME}}-তে প্রবেশ করেছেন।'''", + "loginsuccesstitle": "প্রবেশ করেছেন", + "loginsuccess": "আপনি এইমাত্র \"$1\" নামে {{SITENAME}}-তে প্রবেশ করেছেন।", "nosuchuser": "\"$1\" নামে কোন ব্যবহারকারী নেই।\nব্যবহারকারী নামের আকার সংবেদনশীল।\nআপনার বানান পরীক্ষা করে দেখুন, অথবা [[Special:UserLogin/signup|নতুন একটি অ্যাকাউন্ট খুলুন]]।", "nosuchusershort": "\"$1\" নামের কোন ব্যবহারকারী নেই। নামের বানান পরীক্ষা করুন।", "nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।", @@ -502,7 +501,7 @@ "createaccount-title": "{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি", "createaccount-text": "কেউ $2-এর জন্য {{SITENAME}}-এ একটি অ্যাকাউন্ট সৃষ্টি করেছেন ($4)। \"$2\"-এর জন্য পাসওয়ার্ড হল \"$3\"। আপনার এখন অ্যাকাউন্টে প্রবেশ করে পাসওয়ার্ড পরিবর্তন করা উচিত।\n\nযদি ভুল করে অ্যাকাউন্টটি সৃষ্টি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।", "login-throttled": "আপনি সাম্প্রতিক সময়ে পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।\nপুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।", - "login-abort-generic": "আপনার লগইন সফল ছিলো না - বাতিল করা হয়েছে", + "login-abort-generic": "আপনার প্রবেশ ব্যর্থ হয়েছে - বাতিল করা হয়েছে", "login-migrated-generic": "আপনার অ্যাকাউন্ট স্থানান্তরিত করা হয়েছে, এবং আপনার ব্যবহারকারী নাম আর এই উইকিতে বিদ্যমান নয়।", "loginlanguagelabel": "ভাষা: $1", "suspicious-userlogout": "আপনার প্রস্থানের অনুরোধ বাতিল হয়েছে কারণ অনুমিত যে আপনার ব্রাউজার অসম্পূর্ণ অথবা পূবর্বতী তথ্য প্রেরণ করেছে।", @@ -522,7 +521,7 @@ "newpassword": "নতুন পাসওয়ার্ড:", "retypenew": "নতুন পাসওয়ার্ড আবার লিখুন:", "resetpass_submit": "পাসওয়ার্ড দাও এবং লগ-ইন করো", - "changepassword-success": "আপনার পাসওয়ার্ড সাফলভাবে পরিবর্তীত হয়েছে।", + "changepassword-success": "আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছে!", "changepassword-throttled": "আপনি সম্প্রতি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।", "botpasswords": "বট পাসওয়ার্ড", "botpasswords-disabled": "বট পাসওয়ার্ড নিষ্ক্রিয় করা।", @@ -541,17 +540,17 @@ "botpasswords-insert-failed": "\"$1\" নামের বট যুক্ত করা যায়নি। আগে থেকেই তালিকায় রয়েছে?", "botpasswords-update-failed": "\"$1\" নামের বট যুক্ত করা যায়নি। আগে অপসারণ করা হয়েছিল?", "botpasswords-created-title": "বট পাসওয়ার্ড তৈরী করা হয়েছে", - "botpasswords-created-body": "\"$1\", বট পাসওয়ার্ড তৈরী করা হয়েছে।", + "botpasswords-created-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড তৈরী করা হয়েছে।", "botpasswords-updated-title": "বট পাসওয়ার্ড আপডেট করা হয়েছে", - "botpasswords-updated-body": "\"$1\" বট পাসওয়ার্ডটি সফলভাবে হালনাগাদ করা হয়েছে।", + "botpasswords-updated-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড হালনাগাদ করা হয়েছে।", "botpasswords-deleted-title": "বট পাসওয়ার্ড অপসারণ করা হয়েছে", - "botpasswords-deleted-body": "\"$1\" বটের পাসওয়ার্ড মুছে ফেলা হয়েছিল", + "botpasswords-deleted-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড মুছে ফেলা হয়েছিল।", "botpasswords-no-provider": "BotPasswordsSessionProvider উপলব্ধ নয়।", "resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়", "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।", "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন", "resetpass-submit-cancel": "বাতিল", - "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই সফলভাবে আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।", + "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।", "resetpass-recycled": "অনুগ্রহ করে বর্তমানে ব্যবহার করছেন এমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।", "resetpass-temp-emailed": "সাময়িকভাবে ব্যবহার করার কোড দিয়ে আপনি লগইন করেছেন।\nলগইন করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারন করতে হবে:", "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:", @@ -666,7 +665,7 @@ "previewnote": "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''\nআপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!", "continue-editing": "সম্পাদনা করুন", "previewconflict": "এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।", - "session_fail_preview": "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''", + "session_fail_preview": "দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি।\n\nআপনি সম্ভবত সংযোগ হারিয়েছন। দয়া করে যাচাই করুন যে আপনি এখনও প্রবেশরত রয়েছেন এবং আবার চেষ্টা করুন। যদি এটি এখনও কাজ না করে, তাহলে দয়া করে [[Special:UserLogout|অ্যাকাউন্ট থেকে প্রস্থান করুন]] এবং আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন এবং এবং পরীক্ষা করুন যে আপনার ব্রাউজার এই সাইটে কুকি ব্যবহারের অনুমতি দেয়।", "session_fail_preview_html": "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''\n\n''{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্টভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।''\n\n'''যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন। যদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার প্রবেশ করে চেষ্টা করুন।'''", "token_suffix_mismatch": "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''", "edit_form_incomplete": "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''", @@ -1295,9 +1294,9 @@ "recentchangeslinked-page": "পাতার নাম:", "recentchangeslinked-to": "প্রদত্ত পাতায় সংযুক্ত আছে এমন পাতাগুলোর পরিবর্তন দেখাও", "recentchanges-page-added-to-category": "বিষয়শ্রেণীতে [[:$1]] যোগ করা হয়েছে", - "recentchanges-page-added-to-category-bundled": "বিষয়শ্রেণীতে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} যোগ করা হয়েছে", + "recentchanges-page-added-to-category-bundled": "বিষয়শ্রেণীতে [[:$1]] ও [[Special:WhatLinksHere/$1|{{PLURAL:$2|একটি পাতা|$2টি পাতা}}]] যোগ করা হয়েছে", "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে", - "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণী থেকে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} সরানো হয়েছে", + "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণী থেকে [[:$1]] ও [[Special:WhatLinksHere/$1|{{PLURAL:$2|একটি পাতা|$2টি পাতা}}]] সরানো হয়েছে", "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন", "upload": "আপলোড", "uploadbtn": "ফাইল আপলোড করুন", @@ -3199,7 +3198,7 @@ "tags-edit-chosen-no-results": "কোন ট্যাগ মিল পাওয়া যায়নি", "tags-edit-reason": "কারণ:", "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|এই সংশোধনে|$1 সংশোধনসমূহে}} পরিবর্তন প্রয়োগ করুন", - "tags-edit-success": "পরিবর্তন সফলভাবে প্রয়োগ করা হয়েছে।", + "tags-edit-success": "পরিবর্তন প্রয়োগ করা হয়েছে।", "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1", "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ", "tags-edit-none-selected": "যোগ করতে অথবা অপসারণ করতে অন্ততপক্ষে একটি ট্যাগ দয়া করে নির্বাচন করুন।", @@ -3296,6 +3295,7 @@ "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}", "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ", "logentry-managetags-create": "$1 \"$4\" ট্যাগ {{GENDER:$2|তৈরি করেছে}}", + "logentry-managetags-delete": "$1 \"$4\" ট্যাগটি {{GENDER:$2|অপসারণ করেছেন}} ($5টি {{PLURAL:$5|সংস্করণ বা লগ ভুক্তি|সংস্করণ ও/বা লগ ভুক্তি}} সরানো হয়েছে)", "log-name-tag": "ট্যাগ লগ", "rightsnone": "(কিছু নাই)", "revdelete-summary": "সম্পাদনা সারাংশ", diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json index 21ba46b16f..83d271ebbe 100644 --- a/languages/i18n/bs.json +++ b/languages/i18n/bs.json @@ -58,6 +58,7 @@ "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka", "tog-watchlisthideminor": "Sakrij manje izmjene sa spiska praćenih članaka", "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa spiska praćenih članaka", + "tog-watchlistreloadautomatically": "Automatski osvježi spisak praćenja kad god se izmijeni filter (potreban JavaScript)", "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa spiska praćenih članaka", "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja", "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica", @@ -1035,7 +1036,7 @@ "userrights-changeable-col": "Grupe koje možete mijenjati", "userrights-unchangeable-col": "Grupe koje ne možete mijenjati", "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.", - "userrights-removed-self": "Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.", + "userrights-removed-self": "Uklonili ste vlastita prava. Zbog toga više ne možete pristupiti ovoj stranici.", "group": "Grupa:", "group-user": "Korisnici", "group-autoconfirmed": "Potvrđeni korisnici", @@ -1129,13 +1130,22 @@ "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka", "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene", "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika", + "grant-group-page-interaction": "Upravljanje stranicama", + "grant-group-watchlist-interaction": "Upravljanje Vašim spiskom praćenja", + "grant-group-high-volume": "Izvršavanje velikog broja radnji", + "grant-group-customization": "Prilagodbe i postavke", + "grant-group-other": "Raznovrsno djelovanje", "grant-createeditmovepage": "Pravljenje, uređivanje i premještanje stranica", + "grant-editmycssjs": "Uređivanje Vašeg korisničkog CSS-a ili JavaScripta", + "grant-editmyoptions": "Uređivanje Vaših postavki", "grant-editmywatchlist": "Uređivanje Vašeg spiska praćenja", "grant-editpage": "Uređivanje postojećih stranica", "grant-editprotected": "Uređivanje zaštićenih stranica", - "grant-highvolume": "Uređivanja velikog opsega", + "grant-highvolume": "Veliki broj izmjena", + "grant-patrol": "Patroliranje izmjena stranica", "grant-uploadeditmovefile": "Postavljanje, zamjena i premještanje datoteka", "grant-uploadfile": "Postavljanje novih datoteka", + "grant-basic": "Osnovna prava", "grant-viewmywatchlist": "Pregled Vašeg spiska praćenja", "newuserlogpage": "Zapisnik novih korisnika", "newuserlogpagetext": "Ovo je zapisnik o registraciji novih korisnika.", @@ -1249,7 +1259,7 @@ "recentchangeslinked-page": "Naslov stranice:", "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom", "recentchanges-page-added-to-category": "[[:$1]] dodana je u kategoriju", - "recentchanges-page-added-to-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su dodane u kategoriju", + "recentchanges-page-added-to-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}}]] su dodane u kategoriju", "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije", "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su uklonjene iz kategorije", "autochange-username": "Automatska promjena MediaWikija", @@ -1815,7 +1825,7 @@ "wlshowlast": "Prikaži posljednjih $1 sati $2 dana", "watchlist-hide": "Sakrij", "watchlist-submit": "Prikaži", - "wlshowtime": "Prikaži posljednjih:", + "wlshowtime": "Vremensko razdoblje za prikaz:", "wlshowhideminor": "manje izmjene", "wlshowhidebots": "botove", "wlshowhideliu": "registrovane korisnike", @@ -2359,7 +2369,7 @@ "tooltip-feed-rss": "RSS za ovu stranicu", "tooltip-feed-atom": "Atom za ovu stranicu", "tooltip-t-contributions": "Pogledajte spisak doprinosa {{GENDER:$1|ovog korisnika|ove korisnice|ove osobe}}", - "tooltip-t-emailuser": "Pošaljite pismo ovom korisniku", + "tooltip-t-emailuser": "Pošaljite e-poruku {{GENDER:$1|ovom korisniku}}", "tooltip-t-info": "Više informacija o ovoj stranici", "tooltip-t-upload": "Postavi slike i druge medije", "tooltip-t-specialpages": "Spisak svih posebnih stranica", @@ -3185,7 +3195,7 @@ "tags-edit-revision-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove verzije|svih $1 verzija}}", "tags-edit-logentry-legend": "Dodaj ili ukloni oznake sa {{PLURAL:$1|ove zapisničke stavke|svih $1 zapisničkih stavki}}", "tags-edit-existing-tags": "Postojeće oznake:", - "tags-edit-existing-tags-none": "\"Nema\"", + "tags-edit-existing-tags-none": "Nema", "tags-edit-new-tags": "Nove oznake:", "tags-edit-add": "Dodaj ove oznake:", "tags-edit-remove": "Ukloni ove oznake:", @@ -3195,7 +3205,7 @@ "tags-edit-reason": "Razlog:", "tags-edit-revision-submit": "Primijeni izmjene {{PLURAL:$1|ovoj verziji|svim $1 verzijama}}", "tags-edit-logentry-submit": "Primijeni izmjene {{PLURAL:$1|ovom zapisničkom unosu|svim $1 zapisničkim unosima}}", - "tags-edit-success": "Izmjene su uspješno primijenjene.", + "tags-edit-success": "Izmjene su primijenjene.", "tags-edit-failure": "Nije bilo moguće primijeniti izmjene:\n$1", "tags-edit-nooldid-title": "Neispravna odredišna verzija", "tags-edit-nooldid-text": "Niste izabrali odredišnu verziju na koju treba primijeniti ovu funkciju, ili odredišna verzija na postoji.", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index a3dd1b45dd..2689ce5e88 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -196,7 +196,6 @@ "moredotdotdot": "Més...", "morenotlisted": "Aquesta llista no és completa.", "mypage": "Pàgina", - "anonuserpage": "Usuari desconegut", "mytalk": "Discussió", "anontalk": "Discussió", "navigation": "Navegació", @@ -569,7 +568,9 @@ "botpasswords-label-cancel": "Cancel·la", "botpasswords-label-delete": "Suprimeix", "botpasswords-label-resetpassword": "Reinicia la contrasenya", + "botpasswords-label-grants": "Permisos aplicables:", "botpasswords-label-restrictions": "Restriccions d'ús:", + "botpasswords-label-grants-column": "Concedit", "botpasswords-bad-appid": "", "resetpass_forbidden": "No poden canviar-se les contrasenyes", "resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.", @@ -1206,15 +1207,23 @@ "grant-group-file-interaction": "Interacció amb fitxes multimèdia", "grant-group-watchlist-interaction": "Interacció amb la vostra llista de seguiment", "grant-group-email": "Enviament de correu", + "grant-group-customization": "Personalització i preferències", + "grant-group-administration": "Realitza accions administratives", + "grant-group-other": "Activitat miscel·lània", + "grant-blockusers": "Bloca i desbloca usuaris", "grant-createaccount": "Crea comptes", "grant-createeditmovepage": "Crea, modifica i reanomena pàgines", "grant-delete": "Suprimeix pàgines, revisions i entrades de registre", + "grant-editinterface": "Modifica l'espai de noms MediaWiki i els CSS/JavaScript d'usuari", "grant-editmywatchlist": "Modifica la llista de seguiment", "grant-editpage": "Modifica les pàgines existents", "grant-editprotected": "Modifica pàgines protegides", "grant-highvolume": "Edició d'alt volum", "grant-oversight": "Amaga usuaris i suprimeix revisions", "grant-uploadfile": "Carrega fitxers nous", + "grant-basic": "Permisos bàsics", + "grant-viewdeleted": "Mostra fitxers eliminats i pàgines", + "grant-viewmywatchlist": "Modifica la llista de seguiment", "newuserlogpage": "Registre de creació d'usuaris", "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.", "rightslog": "Registre dels permisos d'usuari", @@ -1224,6 +1233,7 @@ "action-createpage": "crear pàgines", "action-createtalk": "crear pàgines de discussió", "action-createaccount": "crear aquest compte d'usuari", + "action-autocreateaccount": "crea automàtica aquest compte d'usuari extern", "action-history": "mostra l'historial de la pàgina", "action-minoredit": "marcar aquesta modificació com a menor", "action-move": "moure aquesta pàgina", @@ -1330,7 +1340,7 @@ "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", - "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més afegides a la categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] i [[Special:WhatLinksHere/$1|{{PLURAL:$2|una pàgina|$2 pàgines}}]] més afegides a la categoria", "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria", "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més tretes de la categoria", "autochange-username": "Canvi automàtic del MediaWiki", @@ -1742,9 +1752,16 @@ "apisandbox": "Pàgina de proves de l'API", "apisandbox-api-disabled": "L'API està desactivada en aquest lloc.", "apisandbox-intro": "Utilitzeu aquesta pàgina per experimentar amb l''''API de web service de MediaWiki'''.\nVisiteu [//www.mediawiki.org/wiki/API:Main_page la documentació de l'API] per a més informació sobre l'ús de l'API. Exemple: [//www.mediawiki.org/wiki/API#A_simple_example recuperar el contingut d'una Pàgina Principal]. Seleccioneu una acció per veure més exemples.\n\nTingueu en compte que, encara que això és una pàgina de proves, les accions que feu en aquesta pàgina poden modificar la wiki.", + "apisandbox-unfullscreen": "Mostra la pàgina", "apisandbox-submit": "Fes sol·licitud", "apisandbox-reset": "Neteja", - "apisandbox-examples": "Exemple", + "apisandbox-retry": "Torna a provar", + "apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...", + "apisandbox-helpurls": "Enllaços d'ajuda", + "apisandbox-examples": "Exemples", + "apisandbox-dynamic-parameters": "Paràmetres adicionals", + "apisandbox-dynamic-parameters-add-label": "Afegeix un paràmetre:", + "apisandbox-dynamic-parameters-add-placeholder": "Nom del paràmetre", "apisandbox-results": "Resultats", "apisandbox-request-url-label": "Sol·licita URL:", "apisandbox-request-time": "Temps de sol·licitud: $1", @@ -1832,7 +1849,7 @@ "listgrouprights-namespaceprotection-namespace": "Espai de noms", "listgrouprights-namespaceprotection-restrictedto": "Permisos que permeten modificar a l'usuari", "listgrants": "Autoritzacions", - "listgrants-grant": "Autoritza", + "listgrants-grant": "Concedeix", "listgrants-rights": "Permisos", "trackingcategories": "Categories de seguiment", "trackingcategories-summary": "Aquesta pàgina llista les categories de seguiment que s'omplen automàticament pel programari MediaWiki. Es poden canviar els seus noms modificant els missatges del sistema corresponents en l'espai de noms {{ns:8}}.", @@ -3090,6 +3107,7 @@ "watchlisttools-edit": "Visualitza i edita la llista de seguiment", "watchlisttools-raw": "Edita la llista de seguiment sense format", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussió]])", + "timezone-local": "Local", "duplicate-defaultsort": "Atenció: La clau d'ordenació per defecte \"$2\" invalida l'anterior clau \"$1\".", "duplicate-displaytitle": "Avís: El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».", "invalid-indicator-name": "Error: No pot estar buit l'atribut name dels indicadors d'estat de la pàgina.", @@ -3247,7 +3265,7 @@ "tags-edit-revision-selected": "{{PLURAL:$1|Revisió seleccionada|Revisions seleccionades}} de [[:$2]]:", "tags-edit-logentry-legend": "Afegeix o suprimeix etiquetes {{PLURAL:$1|d'aquesta entrada del registre|de totes les entrades del registre}}", "tags-edit-existing-tags": "Etiquetes existents:", - "tags-edit-existing-tags-none": "''Cap''", + "tags-edit-existing-tags-none": "Cap", "tags-edit-new-tags": "Etiquetes noves:", "tags-edit-add": "Afegeix aquestes etiquetes:", "tags-edit-remove": "Treu aquestes etiquetes:", @@ -3257,7 +3275,7 @@ "tags-edit-reason": "Motiu:", "tags-edit-revision-submit": "Aplica els canvis a {{PLURAL:$1|a aquesta revisió|$1 revisions}}", "tags-edit-logentry-submit": "Aplica els canvis a {{PLURAL:$1|aquesta entrada de registre|$1 entrades de registre}}", - "tags-edit-success": "S’han aplicat els canvis correctament.", + "tags-edit-success": "S’han aplicat els canvis.", "tags-edit-failure": "No s’han pogut aplicar els canvis:\n$1", "tags-edit-nooldid-title": "Revisió de l'objectiu no vàlida", "tags-edit-none-selected": "Seleccioneu com a mínim una etiqueta per afegir o suprimir.", @@ -3464,6 +3482,7 @@ "expand_templates_preview": "Previsualitza", "expand_templates_preview_fail_html": "Atès que {{SITENAME}} té HTML cru i hi ha hagut una pèrdua de dades de la sessió, s'ha amagat la vista prèvia com a mesura de precaució contra atacs en JavaScript.\n\nSi això és un intent de previsualització legítim, torneu-ho a provar.\nSi encara no funciona, intenteu [[Special:UserLogout|finalitzar la sessió]] i iniciar-la de nou.", "expand_templates_preview_fail_html_anon": "Atès que {{SITENAME}} té l'HTML cru habilitat i no heu iniciat una sessió, s'ha amagat la previsualització com a prevenció d'atacs en JavaScript.\n\nSi això és un intent de previsualització legítim, [[Special:UserLogin|inicieu una sessió]] i torneu-ho a provar.", + "expand_templates_input_missing": "Cal que proporcioneu al menys algun text d'entrada.", "pagelanguage": "Canvia l'idioma de la pàgina", "pagelang-name": "Pàgina", "pagelang-language": "Idioma", @@ -3472,7 +3491,7 @@ "pagelang-submit": "Envia", "right-pagelang": "Canvia l'idioma de la pàgina", "action-pagelang": "canvia l'idioma de la pàgina", - "log-name-pagelang": "Canvia el registre de llengua", + "log-name-pagelang": "Registre de canvi de llengua", "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.", "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de la pàgina per a $3 de $4 a $5.", "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en $wgDefaultSkin com $1, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori skins/ des d'aquí.\n: * Clonar un dels repositoris mediawiki/skins/* a través de git en el directori skins/ de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en LocalSettings.php per permetre totes les aparences instal·lades actualment:\n\n
$3
\n\n; Si només heu modificat LocalSettings.php:\n: Reviseu els noms de l'aparença per errors tipogràfics.", diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json index e92e4165fa..4a69007334 100644 --- a/languages/i18n/ce.json +++ b/languages/i18n/ce.json @@ -10,7 +10,8 @@ "아라", "Kaganer", "Исмаил Садуев", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "КӀел сиз хьакха хьажорган:", @@ -1063,7 +1064,7 @@ "grant-createaccount": "Декъашхочун дӀаяздарш кхоллар", "grant-createeditmovepage": "АгӀонашна хийцам бар", "grant-delete": "АгӀонаш а, нисдарш а, декъашхойн дӀаяздар а дӀадахар", - "grant-editinterface": "MediaWiki цӀерийн ана а, долара CSS/JavaScript нисъяр", + "grant-editinterface": "MediaWiki цӀерийн меттиг а, долара CSS/JavaScript а нисъяр", "grant-editmycssjs": "Долара CSS/JavaScript нисъяр", "grant-editmyoptions": "Табе хьай гӀирс", "grant-editmywatchlist": "Хьан тергаме могӀам табар", @@ -1187,7 +1188,7 @@ "recentchangeslinked-page": "АгӀон цӀе:", "recentchangeslinked-to": "Кхечу агӀор, гайта хийцамаш агӀонашца, хӀоттийначу агӀонтӀе хьажорг йолуш", "recentchanges-page-added-to-category": "[[:$1]] категори чу тоьхна", - "recentchanges-page-added-to-category-bundled": "[[:$1]] а, {{PLURAL:$2|цхьа агӀо|$2 агӀо}} а категорин тӀетоьхна", + "recentchanges-page-added-to-category-bundled": "[[:$1]] а, [[Special:WhatLinksHere/$1|{{PLURAL:$2|цхьа агӀо|$2 агӀо}}]] а категорин тӀетоьхна", "recentchanges-page-removed-from-category": "[[:$1]] дӀаяьккхина категори чура", "recentchanges-page-removed-from-category-bundled": "[[:$1]] а, {{PLURAL:$2|цхьа агӀо|$2 агӀо}} а категорин чура дӀаяьккхина", "autochange-username": "MediaWiki авто-хийцамбар", @@ -1242,7 +1243,7 @@ "uploaddisabled": "Чуяккхар магийна дац", "copyuploaddisabled": "URL тӀера чуяккхар дӀадайина ду.", "uploaddisabledtext": "Файлаш чуяхар дӀадайина ду.", - "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн ана нийса яц '$1'", + "uploadscriptednamespace": "ХӀокху SVG-файлан цӀерийн меттиг нийса яц '$1'", "upload-source": "ДIайолалун файл", "sourcefilename": "ДIайолалун файл:", "sourceurl": "Хьостан URL-адрес:", @@ -1558,11 +1559,11 @@ "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:", "allpagesto": "Араяхар сацадé тӀе:", "allarticles": "Массо агӀонаш", - "allinnamespace": "Массо агӀонаш оцу цӀерийн анахь «$1»", + "allinnamespace": "Массо агӀонаш «$1» цӀерийн меттигехь", "allpagessubmit": "Кхочушдé", "allpagesprefix": "Лаха агӀонаш, дӀайолалуш йолу:", "allpagesbadtitle": "Цамагош йолу агӀон цӀе. Коьрта могӀан юкъах ю юкъарвики меттанийн юкъе тӀечӀагӀйина йолу хьаьрк я магийна доцу оцу коьрта моӀанца символаш я кхин.", - "allpages-bad-ns": "{{SITENAME}} кху чохь ана цӀерш яц «$1».", + "allpages-bad-ns": "{{SITENAME}} кху чохь цӀерийн меттиг яц «$1».", "allpages-hide-redirects": "Къайлаяха дӀасахьажийнарш", "cachedspecial-viewing-cached-ttl": "Хьо хьоьжу агӀона верси кэш чура ю, иза карлаяьккхина хила мега $1 хьалха.", "cachedspecial-refresh-now": "Хьажа тӀехьарчу версега.", @@ -1604,7 +1605,7 @@ "listgrouprights-addgroup-all": "массо тобанийн юкъатоха йиш ю", "listgrouprights-removegroup-all": "тобан чура дӀабаха ло", "listgrouprights-namespaceprotection-header": "ЦӀеран анан бехкам", - "listgrouprights-namespaceprotection-namespace": "ЦӀерийн ана", + "listgrouprights-namespaceprotection-namespace": "ЦӀерийн меттиг", "listgrouprights-namespaceprotection-restrictedto": "Декъашхочун хийцамаш бан таро хуьлуьйту бакъонаш", "listgrants": "Бакъо", "listgrants-grant": "Бакъо", @@ -1742,7 +1743,7 @@ "protect-title": "Ларъяр: «$1»", "protect-title-notallowed": "ГӀораллин бараме хьажар «$1»", "prot_1movedto2": "«[[$1]]» цӀе хийцина → «[[$2]]»", - "protect-badnamespace-title": "ГӀораладан цалуш йолу цӀерийн ана", + "protect-badnamespace-title": "Ларъян цалуш йолу цӀерийн меттиг", "protect-badnamespace-text": "ХӀокху цӀерийн меттигехь йолу агӀонашна гӀараладан цало.", "protect-norestrictiontypes-title": "ГӀараладан цалуш йолу агӀо", "protect-legend": "Бакъде агӀо ларъяр", @@ -1819,8 +1820,8 @@ "namespace": "ЦӀерийн меттигаш:", "invert": "Хаьржинарг къайлаяккха", "tooltip-invert": "ХӀоттае хӀара билгало, хаьржинчу цӀерийн анан агӀонийн хийцамаш къайлабаха (кхин дихкина цӀерийн анаш, гайтина елахь)", - "namespace_association": "Йихкина ана", - "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн ана юкъахь хилийта", + "namespace_association": "Йихкина меттиг", + "tooltip-namespace_association": "ХӀоттае хӀара билгало, иштта дийцарийн (я кхин) цӀерийн меттиг юкъахь хилийта", "blanknamespace": "(Коьрта)", "contributions": "{{GENDER:$1|Декъашхочун}} къинхьегам", "contributions-title": "{{GENDER:$1|Декъашхочун}} къинхьегам $1", @@ -1854,7 +1855,7 @@ "whatlinkshere-page": "АгӀо:", "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажоргца ю", "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.", - "nolinkshere-ns": "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш", + "nolinkshere-ns": "Хаьржинчу меттигехь яц '''[[:$1]]''' цӀе йолу агӀонаш", "isredirect": "агӀо-дӀасахьажорг", "istemplate": "юкъаялийнарш", "isimage": "Файлан хьажорг", @@ -2681,7 +2682,7 @@ "tags-hitcount-header": "Билгалдина нисдарш", "tags-actions-header": "Дийраш", "tags-active-yes": "ХӀаъ", - "tags-active-no": "ХӀахӀа", + "tags-active-no": "ХӀан-хӀа", "tags-source-extension": "Билгалйо шоралица", "tags-source-none": "Кхий лелош яц", "tags-edit": "нисъе", diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index 928a791493..80d65d6ff2 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -17,7 +17,8 @@ "Ebraminio", "Macofe", "Pirehelokan", - "Diyariq" + "Diyariq", + "Sarchia" ] }, "tog-underline": "ھێڵ ھێنان بەژێر بەستەرەکان:", @@ -412,7 +413,7 @@ "createacct-reason": "ھۆکار", "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی", "createacct-submit": "ھەژمارەکەت دروست بکە", - "createacct-another-submit": "ھەژمارێکی تر دروست بکە", + "createacct-another-submit": "ھەژمار دروست بکە", "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.", "createacct-benefit-body1": "{{PLURAL:$1|دەستکاری}}", "createacct-benefit-body2": "{{PLURAL:$1|پەڕە}}", @@ -426,7 +427,7 @@ "nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکی‌یەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکی‌یەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.", "nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.", "noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.", - "loginsuccesstitle": "سەرکەوتی بۆ چوونە ژوورەوە", + "loginsuccesstitle": "چوویە ناوەوە", "loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''", "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:UserLogin/signup|ھەژمارێکی نوێ دروست بکە]].", "nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.", @@ -1514,7 +1515,7 @@ "unwatchthispage": "ئیتر چاودێری مەکە", "notanarticle": "پەڕەی بێ ناوەڕۆک", "notvisiblerev": "پیاچوونەوە سڕاوەتەوە", - "watchlist-details": "{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.", + "watchlist-details": "بێجگە لە پەڕەکانی لێدوان، {{PLURAL:$1|$1 پەڕە}} لە پێرستی {{PLURAL:$1|چاودێرییەکەتدایە|چاودێرییەکەتدان}}.", "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.", "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دوایین سەردانت دەستکاری کراون بە ئەستوور نیشان دراون.", "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین $1 گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|$2 کاتژمێر}}دا ھەتا $4ی $3.", diff --git a/languages/i18n/crh-cyrl.json b/languages/i18n/crh-cyrl.json index 1bac2e1c56..089bfc3597 100644 --- a/languages/i18n/crh-cyrl.json +++ b/languages/i18n/crh-cyrl.json @@ -107,9 +107,9 @@ "nov": "ноя", "dec": "дек", "pagecategories": "{{PLURAL:$1|1=Саифенинъ категориясы|Саифенинъ категориялары}}", - "category_header": "\"$1\" категориясындаки саифелер", + "category_header": "«$1» категориясындаки саифелер", "subcategories": "Алт категориялар", - "category-media-header": "\"$1\" категориясындаки медиа файллары", + "category-media-header": "«$1» категориясындаки медиа файллары", "category-empty": "''Ишбу категорияда ич бир саифе я да медиа файл ёкъ.''", "hidden-categories": "Гизли {{PLURAL:$1|1=категория|категориялар}}", "hidden-category-category": "Гизли категориялар", @@ -298,7 +298,7 @@ "perfcachedts": "Ашагъыдаки малюмат кэштен алынды, кэшнинъ сонъки янъартылгъан вакъты: $1. Кэште энъ чокъ {{PLURAL:$1|1=бир нетидже|$1 нетидже}} сакъланып тура.", "querypage-no-updates": "Бу саифени денъиштирмеге шимди изин ёкъ. Бу малюмат аман янъартылмайджакъ.", "viewsource": "Менба кодуны косьтер", - "viewsource-title": "$1 саифесининъ менба коду", + "viewsource-title": "«$1» саифесининъ менба коду", "actionthrottled": "Арекет токъталды", "actionthrottledtext": "Спамгъа къаршы куреш себебинден бу арекетни аз вакъыт ичинде чокъ кере текрарлап оламайсынъыз. Мумкюн олгъан къарардан зияде арекет яптынъыз. Бир къач дакъкъадан сонъ текрарлап бакъынъыз.", "protectedpagetext": "Бу саифеде денъиштирме я да башкъа бир арекет япылмасын деп о блок этильди.", @@ -485,6 +485,7 @@ "updated": "(Янъарды)", "note": "'''Ихтар:'''", "previewnote": "'''Бу тек бакъып чыкъув, метин аля даа сакъланмагъан!'''", + "continue-editing": "Денъиштирюв пенджересине къайт", "previewconflict": "Бу бакъып чыкъув юкъары тарир пенджересиндеки метиннинъ сакъланувдан сонъ оладжакъ корюнишини акс эте.", "session_fail_preview": "''' Сервер сиз япкъан денъиштирмелерни сессия идентификаторы джоюлгъаны себебинден сакълап оламады.\nБу вакътынджа проблемадыр. Лютфен, текрар сакълап бакъынъыз.\nБундан да сонъ олып чыкъмаса, малюмат локаль файлгъа сакъланъыз да браузеринъизни бир къапатып ачынъыз.'''", "session_fail_preview_html": "'''Афу этинъиз! HTML сессиянынъ малюматлары гъайып олгъаны себебинден сизинъ денъиштирмелеринъизни къабул этмеге имкян ёкътыр.'''", @@ -492,7 +493,7 @@ "editing": "«$1» саифесини денъиштиреятасыз", "creating": "«$1» саифесини яратув", "editingsection": "«$1» саифесинде болюк денъиштиреятасыз", - "editingcomment": "$1 саифесини денъиштиреятасыз (янъы болюк)", + "editingcomment": "«$1» саифесини денъиштиреятасыз (янъы болюк)", "editconflict": "Денъиштирмелер чатышмасы: $1", "explainconflict": "Сиз саифени денъиштиргенде башкъа бири де денъиштирме япты.\nЮкъарыдаки язы саифенинъ шимдики алыны косьтере.\nСизинъ денъиштирмелеринъиз астында косьтерильди.\nШимди япкъан денъиштирмелеринъизни ашагъы пенджереден юкъары пенджереге авуштырмакъ керексинъиз.\n\"{{int:savearticle}}\"гъа баскъанда '''тек''' юкъарыдаки язы сакъланаджакъ.", "yourtext": "Сизинъ метнинъиз", @@ -917,7 +918,7 @@ "randompage": "Тесадюфий саифе", "randompage-nopages": "\"$1\" {{PLURAL:$2|1=исим фезасында|исим фезаларында}} ич бир саифе ёкъ.", "randomredirect": "Тесадюфий ёллама саифеси", - "randomredirect-nopages": "\"$1\" исим фезасында ич бир ёллама саифеси ёкъ.", + "randomredirect-nopages": "«$1» исим фезасында ич бир ёллама саифеси ёкъ.", "statistics": "Статистика", "statistics-header-pages": "Саифе статистикасы", "statistics-header-edits": "Денъиштирюв статистикасы", @@ -1081,7 +1082,7 @@ "protectlogtext": "Ашагъыдаки, къорчалавгъа алув/къорчалавдан чыкъарув иле багълы денъишмелер журналыдыр.\nКъорчалангъан саифелер [[Special:ProtectedPages|там джедвелини]] де коре билесинъиз.", "protectedarticle": "\"[[$1]]\" къорчалав алтына алынды", "modifiedarticleprotection": "«[[$1]]» ичюн къорчалав севиеси денъиштирильди", - "unprotectedarticle": "\"[[$1]]\" саифесинден къорчалав чыкъарлыды", + "unprotectedarticle": "«[[$1]]» саифесинден къорчалав чыкъарлыды", "prot_1movedto2": "[[$1]] саифесининъ ады [[$2]] деп денъиштирильди", "protect-legend": "Къорчалавны тасдыкъла", "protectcomment": "Себеп:", @@ -1141,7 +1142,7 @@ "sp-contributions-newonly": "Тек янъы саифе яраткъан денъиштирмелерни косьтер", "sp-contributions-submit": "Къыдыр", "whatlinkshere": "Бу саифеге багълантылар", - "whatlinkshere-title": "$1 саифесине багъланты олгъан саифелер", + "whatlinkshere-title": "«$1» саифесине багъланты олгъан саифелер", "whatlinkshere-page": "Саифе:", "linkshere": "'''[[:$1]]''' саифесине багъланты берген саифелер:", "nolinkshere": "'''[[:$1]]''' саифесине багъланты берген саифе ёкъ.", @@ -1190,7 +1191,7 @@ "ip_range_invalid": "Рухсетсиз IP аралыгъы.", "lockdb": "Малюмат базасы килитли", "lockbtn": "Малюмат базасы килитли", - "move-page": "$1 саифесининъ адыны денъиштиреятасыз", + "move-page": "«$1» саифесининъ адыны денъиштиреятасыз", "move-page-legend": "Саифенинъ адыны денъиштирюв", "movepagetext": "Ашагъыдаки форма къулланылып саифенинъ ады денъиштирилир. Бунынънен берабер денъиштирмелер журналы да янъы адгъа авуштырылыр.\nЭски ады янъы адына ёнетме олур. Эски серлевагъа ёнетип тургъан саифелерни автоматик оларакъ янъартып оласынъыз. Бу арекетни автоматик япмагъа истемесенъиз, бутюн [[Special:DoubleRedirects|чифт]] ве [[Special:BrokenRedirects|йыртыкъ]] ёнетме саифелерини озюнъиз тешкермеге меджбур олурсынъыз. Багълантылар эндиден берли догъру чалышмасындан эмин олмалысынъыз.\n\nЯнъы адда бир саифе энди бар олса, ад денъиштирилюви япылмайджакъ, анджакъ бар олгъан саифе ёнетме я да бош олса ад денъиштирилюви мумкюн оладжакъ. Бу демек ки, саифенинъ адыны янълыштан денъиштирген олсанъыз деминки адыны кери къайтарып оласынъыз, амма бар олгъан саифени тесадюфен ёкъ этамайсынъыз.\n\nТЕНБИ!\nАд денъиштирилюви популяр саифелер ичюн буюк ве бекленмеген денъишмелерге себеп ола билир. Лютфен, денъиштирме япмаздан эвель ола биледжеклерни козь огюне алынъыз.", "movepagetalktext": "Къошулгъан музакере саифесининъ де (бар олса)\nады автоматик тарзда денъиштириледжек. '''Мустесналар:'''\n\n* Айны бу адда бош олмагъан бир музакере саифеси энди бар;\n* Ашагъыдаки бошлукъкъа ишарет къоймадынъыз.\n\nБойле алларда, керек олса, саифелерни къолнен ташымагъа я да бирлештирмеге меджбур олурсынъыз.", diff --git a/languages/i18n/crh-latn.json b/languages/i18n/crh-latn.json index 9333f95404..ffdd83c117 100644 --- a/languages/i18n/crh-latn.json +++ b/languages/i18n/crh-latn.json @@ -104,9 +104,9 @@ "nov": "noy", "dec": "dek", "pagecategories": "{{PLURAL:$1|Saifeniñ kategoriyası|Saifeniñ kategoriyaları}}", - "category_header": "\"$1\" kategoriyasındaki saifeler", + "category_header": "“$1” kategoriyasındaki saifeler", "subcategories": "Alt kategoriyalar", - "category-media-header": "\"$1\" kategoriyasındaki media faylları", + "category-media-header": "“$1” kategoriyasındaki media faylları", "category-empty": "''İşbu kategoriyada iç bir saife ya da media fayl yoq.''", "hidden-categories": "Gizli {{PLURAL:$1|kategoriya|kategoriyalar}}", "hidden-category-category": "Gizli kategoriyalar", @@ -288,7 +288,7 @@ "formerror": "Hata: formanıñ malümatını yollamaqnıñ iç çaresi yoq", "badarticleerror": "Siz yapmağa istegen işlev bu saifede yapılıp olamay.", "cannotdelete": "\"$1\" saife ya da faylı yoq etilip olamadı. Başqa bir qullanıcı tarafından yoq etilgen ola bile.", - "cannotdelete-title": "\"$1\" saifesini yoq etmege olmaz", + "cannotdelete-title": "“$1” saifesini yoq etmege olmaz", "delete-hook-aborted": "Yoq etüv çengel protsedurasınen toqtatıldı.\nİç bir izaat berilmedi.", "badtitle": "Ruhsetsiz serleva", "badtitletext": "İstenilgen saife adı doğru degil, o boştır, yahut tillerara bağlantı ya da vikilerara bağlantı doğru yazılmağan. Belki saife adında yasaqlanğan işaretler bar.", @@ -296,7 +296,7 @@ "perfcachedts": "Aşağıdaki malümat keşten alındı, keşniñ soñki yañartılğan vaqtı: $1. Keşte eñ çoq {{PLURAL:$1|bir netice|$1 netice}} saqlanıp tura.", "querypage-no-updates": "Bu saifeni deñiştirmege şimdi izin yoq. Bu malümat aman yañartılmaycaq.", "viewsource": "Menba kodunı köster", - "viewsource-title": "$1 saifesiniñ menba kodu", + "viewsource-title": "“$1” saifesiniñ menba kodu", "actionthrottled": "Areket toqtaldı", "actionthrottledtext": "Spamğa qarşı küreş sebebinden bu areketni az vaqıt içinde çoq kere tekrarlap olamaysıñız. Mümkün olğan qarardan ziyade areket yaptıñız. Bir qaç daqqadan soñ tekrarlap baqıñız.", "protectedpagetext": "Bu saifede deñiştirme ya da başqa bir areket yapılmasın dep o blok etildi.", @@ -483,6 +483,7 @@ "updated": "(Yañardı)", "note": "'''İhtar:'''", "previewnote": "'''Bu tek baqıp çıquv, metin alâ daa saqlanmağan!'''", + "continue-editing": "Deñiştirüv penceresine qayt", "previewconflict": "Bu baqıp çıquv yuqarı tarir penceresindeki metinniñ saqlanuvdan soñ olacaq körünişini aks ete.", "session_fail_preview": "''' Server siz yapqan deñiştirmelerni sessiya identifikatorı\ncoyulğanı sebebinden saqlap olamadı. Bu vaqtınca problemadır. Lütfen, tekrar saqlap baqıñız.\nBundan da soñ olıp çıqmasa, malümat lokal faylğa saqlañız da brauzeriñizni bir qapatıp\naçıñız.'''", "session_fail_preview_html": "'''Afu etiñiz! HTML sessiyanıñ malümatları ğayıp olğanı sebebinden siziñ deñiştirmeleriñizni qabul etmege imkân yoqtır.'''", @@ -490,7 +491,7 @@ "editing": "“$1” saifesini deñiştireyatasız", "creating": "“$1” saifesini yaratuv", "editingsection": "“$1” saifesinde bölük deñiştireyatasız", - "editingcomment": "$1 saifesini deñiştireyatasız (yañı bölük)", + "editingcomment": "“$1” saifesini deñiştireyatasız (yañı bölük)", "editconflict": "Deñiştirmeler çatışması: $1", "explainconflict": "Siz saifeni deñiştirgende başqa biri de deñiştirme yaptı.\nYuqarıdaki yazı saifeniñ şimdiki alını köstere.\nSiziñ deñiştirmeleriñiz astında kösterildi. Şimdi yapqan deñiştirmeleriñizni aşağı pencereden yuqarı pencerege avuştırmaq kereksiñiz.\n\"{{int:savearticle}}\"ğa basqanda '''tek''' yuqarıdaki yazı saqlanacaq.", "yourtext": "Siziñ metniñiz", @@ -915,7 +916,7 @@ "randompage": "Tesadüfiy saife", "randompage-nopages": "\"$1\" {{PLURAL:$2|isim fezasında|isim fezalarında}} iç bir saife yoq.", "randomredirect": "Tesadüfiy yollama saifesi", - "randomredirect-nopages": "\"$1\" isim fezasında iç bir yollama saifesi yoq.", + "randomredirect-nopages": "“$1” isim fezasında iç bir yollama saifesi yoq.", "statistics": "Statistika", "statistics-header-pages": "Saife statistikası", "statistics-header-edits": "Deñiştirüv statistikası", @@ -1078,8 +1079,8 @@ "protectlogpage": "Qorçalav jurnalı", "protectlogtext": "Aşağıdaki, saifeni qorçalavğa aluv/qorçalavdan çıqaruv ile bağlı deñişmeler jurnalıdır.\nQorçalanğan saifeler [[Special:ProtectedPages|tam cedvelini]] de köre bilesiñiz.", "protectedarticle": "\"[[$1]]\" qorçalav altına alındı", - "modifiedarticleprotection": "\"[[$1]]\" içün qorçalav seviyesi deñiştirildi", - "unprotectedarticle": "\"[[$1]]\" saifesinden qorçalav çıqarlıdı", + "modifiedarticleprotection": "“[[$1]]” içün qorçalav seviyesi deñiştirildi", + "unprotectedarticle": "“[[$1]]” saifesinden qorçalav çıqarlıdı", "prot_1movedto2": "[[$1]] saifesiniñ adı [[$2]] dep deñiştirildi", "protect-legend": "Qorçalavnı tasdıqla", "protectcomment": "Sebep:", @@ -1139,7 +1140,7 @@ "sp-contributions-newonly": "Tek yañı saife yaratqan deñiştirmelerni köster", "sp-contributions-submit": "Qıdır", "whatlinkshere": "Bu saifege bağlantılar", - "whatlinkshere-title": "$1 saifesine bağlantı bergen saifeler", + "whatlinkshere-title": "“$1” saifesine bağlantı bergen saifeler", "whatlinkshere-page": "Saife:", "linkshere": "'''[[:$1]]''' saifesine bağlantı bergen saifeler:", "nolinkshere": "'''[[:$1]]''' saifesine bağlantı bergen saife yoq.", @@ -1188,7 +1189,7 @@ "ip_range_invalid": "Ruhsetsiz IP aralığı.", "lockdb": "Malümat bazası kilitli", "lockbtn": "Malümat bazası kilitli", - "move-page": "$1 saifesiniñ adını deñiştireyatasız", + "move-page": "“$1” saifesiniñ adını deñiştireyatasız", "move-page-legend": "Saifeniñ adını deñiştirüv", "movepagetext": "Aşağıdaki forma qullanılıp saifeniñ adı deñiştirilir. Bunıñnen beraber deñiştirmeler jurnalı da yañı adğa avuştırılır.\nEski adı yañı adına yönetme olur. Eski serlevağa yönetip turğan saifelerni avtomatik olaraq yañartıp olasıñız. Bu areketni avtomatik yapmağa istemeseñiz, bütün [[Special:DoubleRedirects|çift]] ve [[Special:BrokenRedirects|yırtıq]] yönetme saifelerini özüñiz teşkermege mecbur olursıñız. Bağlantılar endiden berli doğru çalışmasından emin olmalısıñız.\n\nYañı adda bir saife endi bar olsa, ad deñiştirilüvi yapılmaycaq, ancaq bar olğan saife yönetme ya da boş olsa ad deñiştirilüvi mümkün olacaq. Bu demek ki, saifeniñ adını yañlıştan deñiştirgen olsañız deminki adını keri qaytarıp olasıñız, amma bar olğan saifeni tesadüfen yoq etamaysıñız.\n\nTENBİ!\nAd deñiştirilüvi populâr saifeler içün büyük ve beklenmegen deñişmelerge sebep ola bilir. Lütfen, deñiştirme yapmazdan evel ola bileceklerni köz ögüne alıñız.", "movepagetalktext": "Qoşulğan muzakere saifesiniñ de (bar olsa) adı avtomatik tarzda deñiştirilecek. '''Müstesnalar:'''\n\n*Aynı bu isimde boş olmağan bir muzakere saifesi endi bar;\n*Aşağıdaki boşluqqa işaret qoymadıñız.\n\nBöyle allarda, kerek olsa, saifelerni qolnen taşımağa ya da birleştirmege mecbur olursıñız.", @@ -1199,7 +1200,7 @@ "move-watch": "Bu saifeni közet", "movepagebtn": "Adını deñiştir", "pagemovedsub": "Saifeniñ adı deñiştirildi", - "movepage-moved": "'''\"$1\" saifesiniñ adı \"$2\" olaraq deñiştirildi'''", + "movepage-moved": "'''“$1” saifesiniñ adı “$2” olaraq deñiştirildi'''", "movepage-moved-redirect": "Bir yollama yaratıldı.", "movepage-moved-noredirect": "Yollama yaratıluvı bastırıldı.", "articleexists": "Bu adda bir saife endi bar ya da siz yazğan ad yasaqlı.\nLütfen, başqa bir ad saylap yazıñız.", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index ab0092a15b..5847af6072 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -170,7 +170,6 @@ "moredotdotdot": "Další…", "morenotlisted": "Tento seznam není úplný.", "mypage": "Stránka", - "anonuserpage": "Neznámý uživatel", "mytalk": "Diskuse", "anontalk": "Diskuse", "navigation": "Navigace", @@ -1331,9 +1330,9 @@ "recentchangeslinked-page": "Název stránky:", "recentchangeslinked-to": "Zobrazit změny na stránkách odkazujících na zadanou stránku", "recentchanges-page-added-to-category": "Stránka [[:$1]] zařazena do kategorie", - "recentchanges-page-added-to-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další zařazeny|$2 další zařazeny|$2 dalších zařazeno}} do kategorie", + "recentchanges-page-added-to-category-bundled": "Stránka [[:$1]] a [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna další zařazeny|$2 další zařazeny|$2 dalších zařazeno}}]] do kategorie", "recentchanges-page-removed-from-category": "Stránka [[:$1]] vyřazena z kategorie", - "recentchanges-page-removed-from-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další vyřazeny|$2 další vyřazeny|$2 dalších vyřazeno}} z kategorie", + "recentchanges-page-removed-from-category-bundled": "Stránka [[:$1]] a [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna další vyřazeny|$2 další vyřazeny|$2 dalších vyřazeno}}]] z kategorie", "autochange-username": "Automatická změna MediaWiki", "upload": "Načíst soubor", "uploadbtn": "Načíst soubor", @@ -1513,6 +1512,7 @@ "uploadstash-badtoken": "Operace se nezdařila. Možná vypršela platnost vašeho oprávnění k editaci. Zkuste to znovu.", "uploadstash-errclear": "Soubory se nepodařilo vymazat.", "uploadstash-refresh": "Aktualizovat seznam souborů", + "uploadstash-thumbnail": "zobrazit náhled", "invalid-chunk-offset": "Neplatný posun bloku", "img-auth-accessdenied": "Přístup odepřen", "img-auth-nopathinfo": "Chybí PATH_INFO.\nVáš server není nastaven tak, aby tuto informaci poskytoval.\nMožná funguje pomocí CGI a img_auth na něm nemůže fungovat.\nVizte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -3646,5 +3646,25 @@ "sessionprovider-generic": "relace pomocí $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies", "sessionprovider-nocookies": "Možná jsou zakázány cookies. Ujistěte se, že máte cookies povoleny a zkuste to znovu.", - "randomrootpage": "Náhodná kořenová stránka" + "randomrootpage": "Náhodná kořenová stránka", + "log-action-filter-block": "Typ zablokování:", + "log-action-filter-delete": "Typ smazání:", + "log-action-filter-patrol": "Typ prověření:", + "log-action-filter-protect": "Typ zamčení:", + "log-action-filter-upload": "Typ nahrání:", + "log-action-filter-all": "Všechny", + "log-action-filter-block-block": "Zablokování", + "log-action-filter-block-reblock": "Změna zablokování", + "log-action-filter-block-unblock": "Odblokování", + "log-action-filter-delete-delete": "Smazání stránky", + "log-action-filter-delete-restore": "Obnovení stránky", + "log-action-filter-delete-event": "Smazání záznamu", + "log-action-filter-delete-revision": "Smazání revize", + "log-action-filter-patrol-patrol": "Manuální prověření", + "log-action-filter-patrol-autopatrol": "Automatické prověření", + "log-action-filter-protect-protect": "Zamknutí", + "log-action-filter-protect-modify": "Změna zámku", + "log-action-filter-protect-unprotect": "Odemknutí", + "log-action-filter-upload-upload": "Nové načtení", + "log-action-filter-upload-overwrite": "Znovunačtení" } diff --git a/languages/i18n/cy.json b/languages/i18n/cy.json index d76acadfff..3ff54a8823 100644 --- a/languages/i18n/cy.json +++ b/languages/i18n/cy.json @@ -15,7 +15,8 @@ "아라", "Macofe", "Matma Rex", - "Diafol" + "Diafol", + "Nemo bis" ] }, "tog-underline": "Tanlinellu cysylltiadau:", @@ -156,7 +157,6 @@ "moredotdotdot": "Rhagor...", "morenotlisted": "Nid yw'r rhestr hon yn llawn.", "mypage": "Tudalen defnyddiwr", - "anonuserpage": "Defnyddiwr anhysbys", "mytalk": "Sgwrs", "anontalk": "Sgwrs", "navigation": "Panel llywio", @@ -1206,7 +1206,7 @@ "recentchangeslinked-page": "Tudalen:", "recentchangeslinked-to": "Dangos newidiadau i'r tudalennau â chyswllt arnynt sy'n arwain at y dudalen a enwir", "recentchanges-page-added-to-category": "Ychwanegwyd [[:$1]] at y categori", - "recentchanges-page-added-to-category-bundled": "[[:$1]] ac {{PLURAL:$2|un ddalen|$2 dalen}} wedi'u hychwanegu at y categori", + "recentchanges-page-added-to-category-bundled": "[[:$1]] ac [[Special:WhatLinksHere/$1|{{PLURAL:$2|un ddalen|$2 dalen}}]] wedi'u hychwanegu at y categori", "recentchanges-page-removed-from-category": "Symudwyd [[:$1]] o'r categori", "upload": "Uwchlwytho ffeil", "uploadbtn": "Uwchlwytho ffeil", diff --git a/languages/i18n/da.json b/languages/i18n/da.json index 8263cf69e1..068164e854 100644 --- a/languages/i18n/da.json +++ b/languages/i18n/da.json @@ -56,7 +56,8 @@ "Mads Haupt", "Stefan2", "Ribewiki", - "Jens Jensen" + "Jens Jensen", + "Nemo bis" ] }, "tog-underline": "Understreg henvisninger:", @@ -1286,7 +1287,7 @@ "recentchangeslinked-page": "Sidenavn:", "recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet", "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori", - "recentchanges-page-added-to-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} tilføjet til kategori", + "recentchanges-page-added-to-category-bundled": "[[:$1]] og [[Special:WhatLinksHere/$1|{{PLURAL:$2|én side|$2 sider}}]] tilføjet til kategori", "upload": "Læg en fil op", "uploadbtn": "Læg en fil op", "reuploaddesc": "Tilbage til formularen til at lægge filer op.", diff --git a/languages/i18n/de.json b/languages/i18n/de.json index 5a33125866..408ebedac8 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -137,7 +137,7 @@ "editfont-style": "Schriftart für den Text im Bearbeitungsfenster:", "editfont-default": "Browserstandard", "editfont-monospace": "Schrift mit fester Zeichenbreite", - "editfont-sansserif": "Serifenlose Groteskschrift", + "editfont-sansserif": "Schrift ohne Serifen", "editfont-serif": "Schrift mit Serifen", "sunday": "Sonntag", "monday": "Montag", @@ -227,7 +227,6 @@ "moredotdotdot": "Mehr …", "morenotlisted": "Diese Liste ist nicht vollständig.", "mypage": "Eigene Seite", - "anonuserpage": "Unbekannter Benutzer", "mytalk": "Diskussion", "anontalk": "Diskussionsseite", "navigation": "Navigation", @@ -630,7 +629,7 @@ "resetpass-validity-soft": "Dein Passwort ist nicht gültig: $1\n\nBitte wähle jetzt ein neues Passwort oder klicke auf „{{int:resetpass-submit-cancel}}“, um es später zurückzusetzen.", "passwordreset": "Passwort zurücksetzen", "passwordreset-text-one": "Fülle dieses Formular aus, um ein temporäres Passwort per E-Mail zu erhalten.", - "passwordreset-text-many": "{{PLURAL:$1|Füll eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}", + "passwordreset-text-many": "{{PLURAL:$1|Fülle eines der Felder aus, um ein temporäres Passwort per E-Mail zugesandt zu bekommen.}}", "passwordreset-disabled": "Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.", "passwordreset-emaildisabled": "Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.", "passwordreset-username": "Benutzername:", @@ -1392,9 +1391,9 @@ "recentchangeslinked-page": "Seite:", "recentchangeslinked-to": "Zeige nur Änderungen an Seiten, die auf diese Seite verlinken", "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie hinzugefügt", - "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} zur Kategorie hinzugefügt", + "recentchanges-page-added-to-category-bundled": "[[:$1]] und [[Special:WhatLinksHere/$1|{{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}}]] zur Kategorie hinzugefügt", "recentchanges-page-removed-from-category": "[[:$1]] von der Kategorie entfernt", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}} von der Kategorie entfernt", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] und [[Special:WhatLinksHere/$1|{{PLURAL:$2|eine weitere Seite|$2 weitere Seiten}}]] von der Kategorie entfernt", "autochange-username": "Automatische MediaWiki-Änderung", "upload": "Datei hochladen", "uploadbtn": "Datei hochladen", @@ -1574,6 +1573,7 @@ "uploadstash-badtoken": "Das Entfernen der vorab gespeicherten Dateien ist fehlgeschlagen, da vielleicht deine Sitzungsdaten abgelaufen sind. Bitte versuche es erneut.", "uploadstash-errclear": "Das Entfernen der vorab gespeicherten Dateien ist fehlgeschlagen.", "uploadstash-refresh": "Liste der Dateien aktualisieren", + "uploadstash-thumbnail": "Vorschaubild ansehen", "invalid-chunk-offset": "Ungültiger Startpunkt", "img-auth-accessdenied": "Zugriff verweigert", "img-auth-nopathinfo": "Die Angabe PATH_INFO fehlt.\nDer Server ist nicht dafür eingerichtet, diese Information weiterzugeben.\nSie könnte CGI-gestützt sein und kann daher „img_auth“ (Authentifizierung des Dateiaufrufs) nicht unterstützen.\nSiehe auch https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (englisch).", @@ -3684,5 +3684,25 @@ "sessionprovider-generic": "$1-Sitzungen", "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen", "sessionprovider-nocookies": "Cookies sind eventuell deaktiviert. Stelle sicher, dass Cookies aktiviert sind und versuche es erneut.", - "randomrootpage": "Zufällige Stammseite" + "randomrootpage": "Zufällige Stammseite", + "log-action-filter-block": "Sperrtyp:", + "log-action-filter-delete": "Löschtyp:", + "log-action-filter-patrol": "Kontrolltyp:", + "log-action-filter-protect": "Schutztyp:", + "log-action-filter-upload": "Hochladetyp:", + "log-action-filter-all": "Alle", + "log-action-filter-block-block": "Sperren", + "log-action-filter-block-reblock": "Sperrveränderung", + "log-action-filter-block-unblock": "Freigaben", + "log-action-filter-delete-delete": "Seitenlöschung", + "log-action-filter-delete-restore": "Seitenwiederherstellung", + "log-action-filter-delete-event": "Logbucheintrag-Löschung", + "log-action-filter-delete-revision": "Versionslöschung", + "log-action-filter-patrol-patrol": "Manuelle Kontrolle", + "log-action-filter-patrol-autopatrol": "Automatische Kontrolle", + "log-action-filter-protect-protect": "Schutz", + "log-action-filter-protect-modify": "Schutzveränderung", + "log-action-filter-protect-unprotect": "Freigaben", + "log-action-filter-upload-upload": "Neue Hochladung", + "log-action-filter-upload-overwrite": "Wiederhochladung" } diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json index 4625c89ea3..059ce8b893 100644 --- a/languages/i18n/diq.json +++ b/languages/i18n/diq.json @@ -593,7 +593,7 @@ "newarticle": "(Newe)", "newarticletext": "To yew gıre tıkna be ra yew pela ke hewna çıniya.\nSeba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [$1 pela peşti] ke).\nEke be ğeletine ameya tiya, wa gocega peyseri programê xo de bıtıkne.", "anontalkpagetext": "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:UserLogin/signup|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''", - "noarticletext": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê ena pele cı geyre]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele bıvurne].", + "noarticletext": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê ena pele cı geyre]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele vıraze].", "noarticletext-nopermission": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê na pele cı geyre]], ya zi [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre], ema destur çıniyo ke na pele vırazê.", "missing-revision": "Rewizyonê name dê pela da #$1 \"{{FULLPAGENAME}}\" dı çıniyo.\n\nNo normal de tarix dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.", "userpage-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.\nKerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index 16d8c33aad..0141f08b22 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -45,7 +45,8 @@ "Stam.nikos", "Giorgos456", "SucreRouge", - "Gts-tg" + "Gts-tg", + "Nemo bis" ] }, "tog-underline": "Υπογράμμιση συνδέσμων:", @@ -1329,7 +1330,7 @@ "recentchangeslinked-page": "Όνομα σελίδας:", "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής", "recentchanges-page-added-to-category": "Η σελίδα [[:$1]] προστέθηκε στην κατηγορία", - "recentchanges-page-added-to-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} προστέθηκαν στην κατηγορία", + "recentchanges-page-added-to-category-bundled": "Η σελίδα [[:$1]] και [[Special:WhatLinksHere/$1|{{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}}]] προστέθηκαν στην κατηγορία", "recentchanges-page-removed-from-category": "Η σελίδα [[:$1]] αφαιρέθηκε από την κατηγορία", "recentchanges-page-removed-from-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} αφαιρέθηκαν από την κατηγορία", "autochange-username": "Αυτόματη αλλαγή MediaWiki", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index b27aee4c51..b7c0ac60c6 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -143,7 +143,6 @@ "moredotdotdot": "More...", "morenotlisted": "This list is not complete.", "mypage": "Page", - "anonuserpage": "Unknown user", "mytalk": "Talk", "anontalk": "Talk", "navigation": "Navigation", @@ -1565,6 +1564,7 @@ "uploadstash-badtoken": "Performing that action failed. Perhaps because your editing credentials expired. Please try again.", "uploadstash-errclear": "Clearing the files failed.", "uploadstash-refresh": "Refresh the list of files", + "uploadstash-thumbnail": "view thumbnail", "invalid-chunk-offset": "Invalid chunk offset", "img-auth-accessdenied": "Access denied", "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -4002,6 +4002,7 @@ "special-characters-group-ipa": "IPA", "special-characters-group-symbols": "Symbols", "special-characters-group-greek": "Greek", + "special-characters-group-greekextended": "Greek extended", "special-characters-group-cyrillic": "Cyrillic", "special-characters-group-arabic": "Arabic", "special-characters-group-arabicextended": "Arabic extended", @@ -4029,5 +4030,25 @@ "sessionprovider-generic": "$1 sessions", "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions", "sessionprovider-nocookies": "Cookies may be disabled. Ensure you have cookies enabled and start again.", - "randomrootpage": "Random root page" + "randomrootpage": "Random root page", + "log-action-filter-block": "Type of block:", + "log-action-filter-delete": "Type of deletion:", + "log-action-filter-patrol": "Type of patrol:", + "log-action-filter-protect": "Type of protection:", + "log-action-filter-upload": "Type of upload:", + "log-action-filter-all": "All", + "log-action-filter-block-block": "Block", + "log-action-filter-block-reblock": "Block modification", + "log-action-filter-block-unblock": "Unblock", + "log-action-filter-delete-delete": "Page deletion", + "log-action-filter-delete-restore": "Page undeletion", + "log-action-filter-delete-event": "Log deletion", + "log-action-filter-delete-revision": "Revision deletion", + "log-action-filter-patrol-patrol": "Manual patrol", + "log-action-filter-patrol-autopatrol": "Automatic patrol", + "log-action-filter-protect-protect": "Protection", + "log-action-filter-protect-modify": "Protection modification", + "log-action-filter-protect-unprotect": "Unprotection", + "log-action-filter-upload-upload": "New upload", + "log-action-filter-upload-overwrite": "Reupload" } diff --git a/languages/i18n/eo.json b/languages/i18n/eo.json index 57a3405fd6..c675544fcb 100644 --- a/languages/i18n/eo.json +++ b/languages/i18n/eo.json @@ -135,18 +135,18 @@ "october-gen": "oktobro", "november-gen": "novembro", "december-gen": "decembro", - "jan": "Jan", - "feb": "Feb", - "mar": "Mar", - "apr": "Apr", - "may": "Maj", - "jun": "Jun", - "jul": "Jul", - "aug": "Aŭg", - "sep": "Sep", - "oct": "Okt", - "nov": "Nov", - "dec": "Dec", + "jan": "jan", + "feb": "feb", + "mar": "mar", + "apr": "apr", + "may": "maj", + "jun": "jun", + "jul": "jul", + "aug": "aŭg", + "sep": "sep", + "oct": "okt", + "nov": "nov", + "dec": "dec", "january-date": "$1-a de januaro", "february-date": "$1-a de februaro", "march-date": "$1-a de marto", @@ -207,7 +207,7 @@ "search": "Serĉi", "searchbutton": "Serĉi", "go": "Ek!", - "searcharticle": "Ek!", + "searcharticle": "Ek", "history": "Historio de versioj", "history_short": "Historio", "updatedmarker": "ĝisdatigita de post mia lasta vizito", @@ -234,7 +234,7 @@ "unprotectthispage": "Ŝanĝi protektadon de ĉi tiu paĝo", "newpage": "Nova paĝo", "talkpage": "Diskuti la paĝon", - "talkpagelinktext": "Diskuto", + "talkpagelinktext": "diskuto", "specialpage": "Speciala Paĝo", "personaltools": "Personaj iloj", "articlepage": "Rigardi artikolon", @@ -272,7 +272,7 @@ "copyrightpage": "{{ns:project}}:Aŭtorrajto", "currentevents": "Aktualaĵoj", "currentevents-url": "Project:Aktualaĵoj", - "disclaimers": "Malgarantio", + "disclaimers": "Malgarantioj", "disclaimerpage": "Project:Malgarantia paĝo", "edithelp": "Helpo pri redaktado", "helppage-top-gethelp": "Helpo", @@ -448,7 +448,7 @@ "userlogin-joinproject": "Aliĝu al {{SITENAME}}", "nologin": "Ĉu vi ne havas konton? $1.", "nologinlink": "Krei konton", - "createaccount": "Krei novan konton", + "createaccount": "Krei konton", "gotaccount": "Ĉu vi jam havas konton? '''$1'''.", "gotaccountlink": "Ensaluti", "userlogin-resetlink": "Ĉu vi forgesis ensalutajn detalojn?", @@ -481,7 +481,7 @@ "nocookieslogin": "{{SITENAME}} uzas kuketojn por akcepti uzantojn. Kuketoj esta malaktivigitaj ĉe vi. Bonvolu aktivigi ilin kaj provu denove.", "nocookiesfornew": "La uzantokonto ne estis kreita, ĉar ne konfirmeblas ĝia fonto. Certiginte ke kuketoj estas ebligitaj, reŝargu tiun ĉi paĝon kaj reprovu.", "noname": "Vi ne tajpis validan salutnomon.", - "loginsuccesstitle": "Ensalutado sukcesis", + "loginsuccesstitle": "Ensalutis", "loginsuccess": "Vi ensalutis ĉe {{SITENAME}} kiel uzanto \"$1\".", "nosuchuser": "Neniu uzanto havas nomon \"$1\".\nNomoj por uzantoj estas usklecodistingaj.\nKontrolu vian literumadon, aŭ [[Special:UserLogin/signup|kreu novan konton]].", "nosuchusershort": "Ne ekzistas uzanto kun la nomo \"$1\". Bonvolu kontroli vian ortografion.", @@ -524,7 +524,7 @@ "createacct-another-realname-tip": "La vera nomo estas nenecesa.\nSe vi decidas indiki ĝin, ĝi estos uzata por montri atribuadon de viaj kontribuoj.", "pt-login": "Ensaluti", "pt-login-button": "Ensaluti", - "pt-createaccount": "Krei novan konton", + "pt-createaccount": "Krei konton", "pt-userlogout": "Elsaluti", "php-mail-error-unknown": "Nekonata eraro en la funkcio mail() de PHP", "user-mail-no-addy": "Provis sendi retpoŝton sen retpoŝtadreso.", @@ -554,12 +554,14 @@ "botpasswords-label-resetpassword": "Rekomencigi la pasvorton", "botpasswords-label-restrictions": "Limigoj de uzado:", "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.", + "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?", + "botpasswords-update-failed": "Ĝisdatigo de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi estis forigita?", "botpasswords-created-title": "Robota pasvorto kreita", - "botpasswords-created-body": "La robota pasvorto \"$1\" estis sukcese kreita.", + "botpasswords-created-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis kreita.", "botpasswords-updated-title": "Robota pasvorto ĝisdatigita", - "botpasswords-updated-body": "La robota pasvorto \"$1\" estis sukcese ĝisdatigita.", + "botpasswords-updated-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis ĝisdatigita.", "botpasswords-deleted-title": "Robota pasvorto forigita", - "botpasswords-deleted-body": "La robota pasvorto \"$1\" estis forigita.", + "botpasswords-deleted-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis forigita.", "resetpass_forbidden": "Pasvortoj ne estas ŝanĝeblaj", "resetpass-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.", "resetpass-submit-loggedin": "Ŝanĝi pasvorton", @@ -878,6 +880,9 @@ "mergehistory-empty": "Neniuj versioj estas kunigeblaj.", "mergehistory-done": "$3 {{PLURAL:$3|versio|versioj}} de $1 sukcese estis {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].", "mergehistory-fail": "Ne povis fari la historian kunigon; bonvolu konstati la paĝajn kaj tempajn parametrojn.", + "mergehistory-fail-bad-timestamp": "Tempomarko estas malvalida.", + "mergehistory-fail-invalid-source": "Fonta paĝo estas malvalida.", + "mergehistory-fail-invalid-dest": "Cela paĝo estas malvalida.", "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.", "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.", "mergehistory-no-destination": "Celpaĝo $1 ne ekzistas.", @@ -1174,6 +1179,8 @@ "right-managechangetags": "Kreado kaj forigado de [[Special:Tags|etikedoj]] de datumbazo", "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj", "right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj", + "grant-group-email": "Sendi retpoŝton", + "grant-createaccount": "Krei kontojn", "newuserlogpage": "Protokolo de uzanto-kreado", "newuserlogpagetext": "Jen protokolo de lastaj kreadoj de uzantoj.", "rightslog": "Protokolo de uzanto-rajtoj", @@ -1488,7 +1495,7 @@ "filehist-deleteone": "forigi", "filehist-revert": "restarigi", "filehist-current": "nuna", - "filehist-datetime": "Dato/Tempo", + "filehist-datetime": "Dato/tempo", "filehist-thumb": "Bildeto", "filehist-thumbtext": "Bildeto por versio ekde $1", "filehist-nothumb": "Neniu bildeto", @@ -1686,11 +1693,15 @@ "apisandbox-intro": "Uzu tiun ĉi paĝon por eksperimenti kun '''MediaWiki API'''.\nVidu [//www.mediawiki.org/wiki/API:Main_page la API-dokumentadon] por pli da detaloj pri la uzo de API. Ekz-e: [//www.mediawiki.org/wiki/API#A_simple_example atingi la enhavon de la Ĉefpaĝo]. Elektu agon por vidi pliajn ekzemplojn.\n\nNotu ke, kvankam ĉi tiu estas provejo, agoj kiun vi faros en ĉi tiu paĝo povas modifi la vikion.", "apisandbox-submit": "Fari mendon", "apisandbox-reset": "Nuligi", - "apisandbox-examples": "Ekzemplo", - "apisandbox-results": "Rezulto", + "apisandbox-examples": "Ekzemploj", + "apisandbox-dynamic-parameters": "Aldonaj parametroj", + "apisandbox-dynamic-parameters-add-label": "Aldoni parametron:", + "apisandbox-dynamic-parameters-add-placeholder": "Nomo de parametro", + "apisandbox-dynamic-error-exists": "Parametro nomata \"$1\" jam ekzistas.", + "apisandbox-results": "Rezultoj", "apisandbox-request-url-label": "Mendi URL-on.", "apisandbox-request-time": "Tempo de peto: $1", - "booksources": "Libroservoj", + "booksources": "Librofontoj", "booksources-search-legend": "Serĉi librofontojn", "booksources-search": "Serĉi", "booksources-text": "Jen ligilaro al aliaj TTT-ejoj, kiuj vendas librojn,\nkaj/aŭ informumos pri la libro ligita.\nLa {{SITENAME}} ne estas komerce ligita al tiuj vendejoj, kaj la listo ne estu\nkomprenata kiel rekomendo aŭ reklamo.", @@ -1705,6 +1716,10 @@ "log-title-wildcard": "Serĉi titolojn komencantajn kun ĉi tiu teksto", "showhideselectedlogentries": "Montri/kaŝi elektitajn protokolerojn", "log-edit-tags": "Redakti etikedojn ĉe elektitaj protokoleroj", + "checkbox-select": "Elektu: $1", + "checkbox-all": "Ĉiuj", + "checkbox-none": "Neniu", + "checkbox-invert": "Inversigi", "allpages": "Ĉiuj paĝoj", "nextpage": "Sekvanta paĝo ($1)", "prevpage": "Antaŭa paĝo ($1)", @@ -1902,6 +1917,7 @@ "sessionfailure": "Ŝajnas, ke estas problemo kun via ensalutado;\nĈi ago estis nuligita por malhelpi fiensalutadon.\nBonvolu alklaki la reirbutonon kaj reŝargi la paĝon el kiu vi venas, kaj provu denove.", "changecontentmodel-title-label": "Titolo de paĝo", "changecontentmodel-reason-label": "Kialo:", + "changecontentmodel-submit": "Ŝanĝi", "logentry-contentmodel-change-revertlink": "restarigi", "logentry-contentmodel-change-revert": "restarigi", "protectlogpage": "Protokolo pri protektoj", @@ -2368,7 +2384,7 @@ "tooltip-t-contributions": "Listo de kontribuoj de {{GENDER:$1|ĉi tiu uzanto}}", "tooltip-t-emailuser": "Sendi retmesaĝon al tiu ĉi uzanto", "tooltip-t-info": "Pli da informo pri ĉi tiu paĝo", - "tooltip-t-upload": "Alŝuti bildojn aŭ dosierojn", + "tooltip-t-upload": "Alŝuti dosierojn", "tooltip-t-specialpages": "Listo de ĉiuj specialaj paĝoj", "tooltip-t-print": "Printebla versio de ĉi tiu paĝo", "tooltip-t-permalink": "Konstanta ligilo al ĉi versio de la paĝo", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index ba5efa055c..e9ccda5bc6 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -137,7 +137,8 @@ "YoViajo", "Asierog", "Mgpena", - "Transonlohk" + "Transonlohk", + "Eloy" ] }, "tog-underline": "Subrayar los enlaces:", @@ -278,7 +279,6 @@ "moredotdotdot": "Más...", "morenotlisted": "Esta lista no está completa.", "mypage": "Página", - "anonuserpage": "Usuario desconocido", "mytalk": "Discusión", "anontalk": "Discusión", "navigation": "Navegación", @@ -366,7 +366,7 @@ "copyrightpage": "{{ns:project}}:Derechos de autor", "currentevents": "Actualidad", "currentevents-url": "Project:Actualidad", - "disclaimers": "Aviso legal", + "disclaimers": "Descargos", "disclaimerpage": "Project:Descargo general", "edithelp": "Ayuda de edición", "helppage-top-gethelp": "Ayuda", @@ -577,7 +577,7 @@ "nocookieslogin": "{{SITENAME}} utiliza cookies para la autenticación de usuarios. Las cookies están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.", "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.", "noname": "No se ha especificado un nombre de usuario válido.", - "loginsuccesstitle": "Has accedido correctamente", + "loginsuccesstitle": "Has accedido", "loginsuccess": "Has accedido a {{SITENAME}} como «$1».", "nosuchuser": "No existe ningún usuario llamado «$1».\nLos nombres de usuario son sensibles a las mayúsculas.\nRevisa tu ortografía, o [[Special:UserLogin/signup|crea una cuenta nueva]].", "nosuchusershort": "No existe ningún usuario llamado «$1». Comprueba que lo has escrito correctamente.", @@ -649,6 +649,7 @@ "botpasswords-label-delete": "Borrar", "botpasswords-label-resetpassword": "Restablecer la contraseña", "botpasswords-label-grants": "Permisos aplicables:", + "botpasswords-help-grants": "Cada concesión le da acceso a los permisos listados que el usuario ya posea. Véase la [[Special:ListGrants|lista de concesiones]] para más información.", "botpasswords-label-restrictions": "Restricciones de uso:", "botpasswords-label-grants-column": "Concedido", "botpasswords-bad-appid": "El nombre del bot \"$1\" no es válido.", @@ -786,7 +787,7 @@ "previewnote": "Recuerda que esto no es más que una previsualización.\nAún no se han guardado tus cambios.", "continue-editing": "Ir al área de edición", "previewconflict": "Esta previsualización muestra cómo aparecerá el texto en el área de edición superior una vez guardados los cambios.", - "session_fail_preview": "Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de los datos de sesión.\nPor favor, inténtalo de nuevo.\nSi el problema persiste, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder.", + "session_fail_preview": "Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de los datos de sesión.\n\nPuede que se haya cerrado tu sesión. Verifica que hayas accedido e inténtalo de nuevo.\nSi el problema persiste, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder. Y verifica que tu navegador permita las cookies de este sitio.", "session_fail_preview_html": "Lo sentimos, no hemos podido procesar tu edición debido a una pérdida de datos de sesión.\n\nLa previsualización está oculta como prevención frente a ataques JavaScript, puesto que este wiki tiene habilitado el HTML en bruto.\n\nSi se trata de un intento legítimo de modificación, inténtalo de nuevo.\nSi aún así no funcionase, prueba a [[Special:UserLogout|cerrar sesión]] y volver a acceder, y verifica que tu navegador acepte cookies de este sitio.", "token_suffix_mismatch": "Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en la clave de edición.\nSe rechazó la edición para evitar la corrupción del texto de la página.\nEsto sucede en ocasiones si se usa un servicio de proxy anónimo defectuoso.", "edit_form_incomplete": "Una parte del formulario de edición no ha llegado al servidor. Comprueba que tus cambios están intactos e inténtalo de nuevo.", @@ -986,8 +987,10 @@ "mergehistory-empty": "No hay revisiones fusionables.", "mergehistory-done": "Se {{PLURAL:$3|fusionó una revisión|fusionaron $3 revisiones}} de $1 en [[:$2]].", "mergehistory-fail": "No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.", + "mergehistory-fail-bad-timestamp": "La marca de tiempo no es válida.", "mergehistory-fail-invalid-source": "La página de origen no es válida.", "mergehistory-fail-invalid-dest": "La página de destino no es válida.", + "mergehistory-fail-no-change": "La fusión historiales no fusionó ninguna revisión. Vuelve a comprobar los parámetros de página y tiempo.", "mergehistory-fail-permission": "Permisos insuficientes para fusionar el historial.", "mergehistory-fail-self-merge": "Las páginas de origen y destino son la misma.", "mergehistory-fail-toobig": "No se puede fusionar el historial ya que más del límite de $1 {{PLURAL:$1|revisión|revisiones}} se moverían.", @@ -1290,7 +1293,7 @@ "right-managechangetags": "Crear y eliminar [[Special:Tags|etiquetas]] en la base de datos", "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios", "right-changetags": "Agregar y quitar [[Special:Tags|etiquetas]] arbitrarias a revisiones individuales y entradas del registro", - "grant-generic": "Paquete de derechos \"$1\"", + "grant-generic": "Paquete de permisos \"$1\"", "grant-group-page-interaction": "Interactuar con páginas", "grant-group-file-interaction": "Interactuar con multimedia", "grant-group-watchlist-interaction": "Interactuar con tu lista de seguimiento", @@ -1433,9 +1436,9 @@ "recentchangeslinked-page": "Nombre de la página:", "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada", "recentchanges-page-added-to-category": "[[:$1]] añadida a la categoría", - "recentchanges-page-added-to-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} añadidas a la categoría", + "recentchanges-page-added-to-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|una página añadida|$2 páginas añadidas}}]] a la categoría", "recentchanges-page-removed-from-category": "[[:$1]] eliminada de la categoría", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] y {{PLURAL:$2|una página|$2 páginas}} eliminadas de la categoría", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] y [[Special:WhatLinksHere/$1|{{PLURAL:$2|una página eliminada|$2 páginas eliminadas}}]] de la categoría", "autochange-username": "Cambio automático de MediaWiki", "upload": "Subir archivo", "uploadbtn": "Subir un archivo", @@ -1508,7 +1511,8 @@ "uploaded-script-svg": "Se encontró el elemento habilitado para secuencias de órdenes «$1» en el archivo SVG cargado.", "uploaded-hostile-svg": "Se encontró código CSS no seguro en el elemento de estilo del archivo SVG cargado.", "uploaded-event-handler-on-svg": "No está permitido configurar atributos controladores de eventos $1=\"$2\" en los archivos SVG.", - "uploaded-href-unsafe-target-svg": "Se encontró un \"href\" hacia un destino inseguro <$1 $2=\"$3\"> en el archivo SVG cargado.", + "uploaded-href-attribute-svg": "Los atributos href en archivos SVG sólo tienen permitido enlazar a objetivos http:// o https://, se encontró <$1 $2=\"$3\">.", + "uploaded-href-unsafe-target-svg": "Se encontró un href hacia un destino inseguro <$1 $2=\"$3\"> en el archivo SVG cargado.", "uploaded-animate-svg": "Se encontró un etiqueta \"animate\" que puede estar cambiando \"href\", mediante el atributo \"from\" <$1 $2=\"$3\"> en el archivo SVG cargado.", "uploaded-setting-event-handler-svg": "Está bloqueada la configuración de atributos controladores de eventos. Se encontró <$1 $2=\"$3\"> en el archivo SVG cargado.", "uploaded-setting-href-svg": "Está bloqueado el uso de la etiqueta \"set\" para añadir un atributo \"href\" al elemento padre.", @@ -1529,6 +1533,7 @@ "upload-options": "Opciones de subida", "watchthisupload": "Vigilar este archivo", "filewasdeleted": "Un archivo con este nombre se subió con anterioridad y posteriormente ha sido borrado. Deberías revisar el $1 antes de subirlo de nuevo.", + "filename-thumb-name": "Esto luce como el título de una miniatura. Por favor, no vuelva a subir miniaturas a la misma wiki. Si no es el caso, por favor corrija el nombre del archivo por uno que tenga más sentido, y no tenga el prefijo de miniatura.", "filename-bad-prefix": "El nombre del archivo que estás subiendo comienza por «$1», un nombre nada descriptivo de su contenido. Es un típico nombre de los que asignan automáticamente las cámaras digitales.\nElige un nombre más descriptivo para tu archivo.", "filename-prefix-blacklist": " #
\n# La sintaxis de esta página es la siguiente:\n#   * Todo texto que se encuentre después del carácter \"#\" hasta el final de la línea se tratará como un comentario y será ignorado\n#   * Cualquier línea que no esté en blanco será interpretada como un prefijo típico en nombres de archivo que suelen asignar automáticamente las cámaras digitales\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # algunos teléfonos móviles / celulares\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #
", "upload-proto-error": "Protocolo incorrecto", @@ -1612,6 +1617,7 @@ "uploadstash-badtoken": "No se pudo realizar la acción. Es posible que haya finalizado el tiempo de espera de la sesión. Inténtalo de nuevo.", "uploadstash-errclear": "Falló el borrado de los archivos.", "uploadstash-refresh": "Actualizar la lista de archivos", + "uploadstash-thumbnail": "ver miniatura", "invalid-chunk-offset": "Desplazamiento inválido del fragmento", "img-auth-accessdenied": "Acceso denegado", "img-auth-nopathinfo": "Falta PATH_INFO.\nEl servidor no está configurado para proporcionar esta información.\nEs posible que esté basado en CGI y que no sea compatible con img_auth.\nConsulte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1860,20 +1866,27 @@ "apihelp": "Ayuda de la API", "apihelp-no-such-module": "No se encontró el módulo \"$1\".", "apisandbox": "Zona de pruebas API", + "apisandbox-jsonly": "Se requiere JavaScript para utilizar la zona de pruebas de API.", "apisandbox-api-disabled": "La API está desactivada en este sitio.", - "apisandbox-intro": "Usa esta página para experimentar con la '''API de servicio web de MediaWiki'''.\nPara más detalles sobre el uso de la API, visita [//www.mediawiki.org/wiki/API:Main_page su documentación]. Ejemplo: [//www.mediawiki.org/wiki/API#A_simple_example obtener el contenido de una Página principal]. Selecciona una acción para ver más ejemplos.\n\nObserva que, aunque sea una página de pruebas, las acciones que realices en esta página pueden modificar el wiki.", + "apisandbox-intro": "Usa esta página para experimentar con la API de servicio web de MediaWiki.\nPara más detalles sobre el uso de la API, visita [[mw:API:Main page|su documentación]]. Ejemplo: [//www.mediawiki.org/wiki/API#A_simple_example obtener el contenido de una Página principal]. Selecciona una acción para ver más ejemplos.\n\nObserva que, aunque sea una página de pruebas, las acciones que realices en esta página pueden modificar el wiki.", "apisandbox-fullscreen": "Expandir panel", + "apisandbox-fullscreen-tooltip": "Expande el panel de la zona de pruebas hasta llenar la ventana del navegador.", "apisandbox-unfullscreen": "Mostrar página", + "apisandbox-unfullscreen-tooltip": "Reduce el panel de la zona de pruebas, para que los enlaces de navegación MediaWiki estén disponibles.", "apisandbox-submit": "Realizar solicitud", "apisandbox-reset": "Limpiar", "apisandbox-retry": "Reintentar", + "apisandbox-loading": "Cargando la información para el módulo API \"$1\"...", + "apisandbox-load-error": "Ocurrió un error al cargar la información para el módulo API \"$1\": $2", "apisandbox-no-parameters": "Este módulo API no tiene parámetros.", "apisandbox-helpurls": "Enlaces de ayuda", "apisandbox-examples": "Ejemplos", "apisandbox-dynamic-parameters": "Parámetros adicionales", "apisandbox-dynamic-parameters-add-label": "Añadir parámetro:", "apisandbox-dynamic-parameters-add-placeholder": "Nombre del parámetro", + "apisandbox-dynamic-error-exists": "Ya existe un parámetro llamado \"$1\".", "apisandbox-deprecated-parameters": "Parámetros desaconsejados", + "apisandbox-fetch-token": "Auto-llenar el token", "apisandbox-submit-invalid-fields-title": "Algunos campos no son válidos", "apisandbox-submit-invalid-fields-message": "Por favor, corrige los campos señalados e inténtalo de nuevo.", "apisandbox-results": "Resultados", @@ -1948,12 +1961,12 @@ "activeusers-hidesysops": "Ocultar administradores", "activeusers-noresult": "No se encontraron usuarios.", "activeusers-submit": "Mostrar usuarios activos", - "listgrouprights": "Permisos del grupo de usuarios", - "listgrouprights-summary": "La siguiente es una lista de los grupos de usuario definidos en esta wiki y de sus privilegios de acceso asociados.\nPuede haber información adicional sobre privilegios individuales en [[{{MediaWiki:Listgrouprights-helppage}}]]", + "listgrouprights": "Permisos de los grupos de usuarios", + "listgrouprights-summary": "La siguiente es una lista de los grupos de usuarios definidos en esta wiki y de sus permisos de acceso asociados.\nPuede haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] sobre permisos individuales.", "listgrouprights-key": "Leyenda:\n* Derecho concedido\n* Derecho revocado", "listgrouprights-group": "Grupo", "listgrouprights-rights": "Derechos", - "listgrouprights-helppage": "Help:Derechos de grupos", + "listgrouprights-helppage": "Help:Permisos de grupos", "listgrouprights-members": "(ver los miembros de este grupo)", "listgrouprights-addgroup": "Agregar {{PLURAL:$2|grupo|grupos}}: $1", "listgrouprights-removegroup": "Eliminar {{PLURAL:$2|grupo|grupos}}: $1", @@ -1966,7 +1979,8 @@ "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombres", "listgrouprights-namespaceprotection-namespace": "Espacio de nombres", "listgrouprights-namespaceprotection-restrictedto": "Derechos de usuario para editar", - "listgrants": "Subvenciones", + "listgrants": "Concesiones", + "listgrants-summary": "La siguiente es una lista de concesiones con sus permisos de usuario asociados. Los usuarios pueden autorizar aplicaciones para que usen sus cuentas, pero con permisos limitados basados en las concesiones que el usuario le dio a la aplicación. De todas formas, una aplicación actuando a nombre de un usuario no puede hacer uso de permisos que el usuario no posea.\nPuede haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] sobre permisos individuales.", "listgrants-grant": "Conceder", "listgrants-rights": "Derechos", "trackingcategories": "Categorías de seguimiento", @@ -2242,7 +2256,7 @@ "sp-contributions-uploads": "subidas", "sp-contributions-logs": "registros", "sp-contributions-talk": "discusión", - "sp-contributions-userrights": "gestión de permisos del usuario", + "sp-contributions-userrights": "gestión de permisos de usuario", "sp-contributions-blocked-notice": "Este usuario está actualmente bloqueado. La última entrada del registro de bloqueos es presentada debajo para mayor referencia:", "sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.", "sp-contributions-search": "Buscar contribuciones", @@ -2770,18 +2784,18 @@ "months": "{{PLURAL:$1|$1 mes|$1 meses}}", "years": "{{PLURAL:$1|$1 año|$1 años}}", "ago": "hace $1", - "just-now": "Ahora mismo", + "just-now": "ahora mismo", "hours-ago": "hace $1 {{PLURAL:$1|hora|horas}}", "minutes-ago": "hace {{PLURAL:$1|un minuto|$1 minutos}}", "seconds-ago": "hace $1 {{PLURAL:$1|segundo|segundos}}", - "monday-at": "El lunes a las $1", - "tuesday-at": "El martes a las $1", - "wednesday-at": "El miércoles a las $1", - "thursday-at": "El jueves a las $1", - "friday-at": "El viernes a las $1", - "saturday-at": "El sábado a las $1", - "sunday-at": "El domingo a las $1", - "yesterday-at": "Ayer a las $1", + "monday-at": "el lunes a las $1", + "tuesday-at": "el martes a las $1", + "wednesday-at": "el miércoles a las $1", + "thursday-at": "el jueves a las $1", + "friday-at": "el viernes a las $1", + "saturday-at": "el sábado a las $1", + "sunday-at": "el domingo a las $1", + "yesterday-at": "ayer a las $1", "bad_image_list": "El formato es el siguiente:\n\nSolo se reconocen elementos de lista (líneas que comienzan con «*»).\nEl primer enlace de cada línea debe ser un enlace al archivo que se quiere bloquear.\nTodos los demás enlaces en la misma línea se tomarán como excepciones (es decir, páginas donde sí se puede usar el archivo).", "metadata": "Metadatos", "metadata-help": "Este archivo contiene información adicional, probablemente añadida por la cámara digital o el escáner usado para crearlo o digitalizarlo.\nSi el archivo ha sido modificado desde su estado original, pueden haberse perdido algunos detalles.", @@ -3688,9 +3702,29 @@ "mw-widgets-titleinput-description-new-page": "la página aún no existe", "mw-widgets-titleinput-description-redirect": "redirigir a $1", "api-error-blacklisted": "Elige un título diferente, más descriptivo.", - "sessionmanager-tie": "No se pueden combinar múltiples tipos de autentificación de solicitudes: $1", + "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.", "sessionprovider-generic": "sesiones $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies", "sessionprovider-nocookies": "Puede que las cookies estén desactivadas. Actívalas y comienza de nuevo.", - "randomrootpage": "Página raíz aleatoria" + "randomrootpage": "Página raíz aleatoria", + "log-action-filter-block": "Tipo de bloqueo:", + "log-action-filter-delete": "Tipo de eliminación:", + "log-action-filter-patrol": "Tipo de verificación:", + "log-action-filter-protect": "Tipo de protección:", + "log-action-filter-upload": "Tipo de subida:", + "log-action-filter-all": "Todas", + "log-action-filter-block-block": "Bloquear", + "log-action-filter-block-reblock": "Modificación de bloqueo", + "log-action-filter-block-unblock": "Desbloquear", + "log-action-filter-delete-delete": "Eliminación de páginas", + "log-action-filter-delete-restore": "Restauración de páginas", + "log-action-filter-delete-event": "Eliminación de registros", + "log-action-filter-delete-revision": "Eliminación de revisión", + "log-action-filter-patrol-patrol": "Verificación manual", + "log-action-filter-patrol-autopatrol": "Verificación automática", + "log-action-filter-protect-protect": "Protección", + "log-action-filter-protect-modify": "Modificación de protección", + "log-action-filter-protect-unprotect": "Desprotección", + "log-action-filter-upload-upload": "Subida nueva", + "log-action-filter-upload-overwrite": "Volver a subir" } diff --git a/languages/i18n/et.json b/languages/i18n/et.json index 5ce19556b4..ad1541853d 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -1278,7 +1278,7 @@ "recentchangeslinked-page": "Lehekülje nimi:", "recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad", "recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"", - "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}", + "recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel [[Special:WhatLinksHere/$1|{{PLURAL:$2|üks lehekülg|$2 lehekülge}}]]", "recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"", "recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}", "autochange-username": "MediaWiki automaatne muudatus", diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json index 6b1e3e087f..e018dca242 100644 --- a/languages/i18n/fa.json +++ b/languages/i18n/fa.json @@ -192,7 +192,6 @@ "moredotdotdot": "بیشتر...", "morenotlisted": "این فهرست کامل نیست.", "mypage": "صفحه", - "anonuserpage": "کاربر ناشناس", "mytalk": "بحث", "anontalk": "بحث", "navigation": "ناوبری", @@ -1300,7 +1299,7 @@ "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.", "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.", "recentchanges-label-newpage": "این ویرایش صفحه‌ای تازه ایجاد کرد", - "recentchanges-label-minor": "این یک ویرایش جزئی‌است", + "recentchanges-label-minor": "این یک ویرایش جزئی است", "recentchanges-label-bot": "این ویرایش را یک ربات انجام داده است", "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده است", "recentchanges-label-plusminus": "حجم صفحه به اندازه این مقدار بایت تغییر یافته است", @@ -1355,9 +1354,9 @@ "recentchangeslinked-page": "نام صفحه:", "recentchangeslinked-to": "نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند", "recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد", - "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر به رده اضافه شدند", + "recentchanges-page-added-to-category-bundled": "[[:$1]] و [[Special:WhatLinksHere/$1|{{PLURAL:$2|یک صفحه|$2 صفحه}}]]دیگر به رده اضافه شدند", "recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر از رده حذف شدند", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] و [[Special:WhatLinksHere/$1|{{PLURAL:$2|یک صفحه|$2 صفحه}}]] دیگر از رده حذف شدند", "autochange-username": "تغییرات خودکار مدیاویکی", "upload": "بارگذاری پرونده", "uploadbtn": "بارگذاری پرونده", @@ -1536,6 +1535,7 @@ "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. لطفاً دوباره امتحان کنید.", "uploadstash-errclear": "پاک‌کردن پرونده‌ها ناموفق بود.", "uploadstash-refresh": "تازه کردن فهرست پرونده‌ها", + "uploadstash-thumbnail": "نمایش بندانگشتی", "invalid-chunk-offset": "جابجایی نامعتبر قطعه", "img-auth-accessdenied": "منع دسترسی", "img-auth-nopathinfo": "PATH_INFO موجود نیست.\nسرور شما برای ردکردن این مقدار تنظیم نشده‌است.\nممکن است مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization را ببینید.", @@ -3669,5 +3669,20 @@ "sessionprovider-generic": "$1 فصل", "sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور", "sessionprovider-nocookies": "کوکی‌ها ممکن است غیر فعال شده باشند. اطمینان کسب کنید که کوکی‌ها را فعال کرده‌اید و دوباره آغاز کنید.", - "randomrootpage": "صفحهٔ ریشهٔ تصادفی" + "randomrootpage": "صفحهٔ ریشهٔ تصادفی", + "log-action-filter-block": "نوع بسته شدن:", + "log-action-filter-delete": "نوع حذف:", + "log-action-filter-patrol": "نوع گشت:", + "log-action-filter-protect": "نوع محافظت", + "log-action-filter-upload": "نوع بارگذاری", + "log-action-filter-all": "همه", + "log-action-filter-block-block": "بستن", + "log-action-filter-block-unblock": "باز شدن", + "log-action-filter-delete-delete": "حذف صفحه", + "log-action-filter-delete-restore": "احیای صفحه", + "log-action-filter-delete-event": "حذف سیاهه", + "log-action-filter-patrol-autopatrol": "گشت خودکار", + "log-action-filter-protect-protect": "محافظت", + "log-action-filter-protect-unprotect": "خروج از محافظت", + "log-action-filter-upload-overwrite": "بارگذاری دوباره" } diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index d8a57295dd..7e301a8718 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -47,7 +47,8 @@ "Macofe", "Beluga", "Pyscowicz", - "Olimar" + "Olimar", + "Mikahama" ] }, "tog-underline": "Linkkien alleviivaus:", @@ -486,7 +487,7 @@ "nocookieslogin": "{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.", "nocookiesfornew": "Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.", "noname": "Et ole määritellyt kelvollista käyttäjänimeä.", - "loginsuccesstitle": "Sisäänkirjautuminen onnistui", + "loginsuccesstitle": "Olet kirjautunut sisään", "loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''", "nosuchuser": "Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:UserLogin/signup|luo uusi käyttäjätunnus]].", "nosuchusershort": "Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?", @@ -542,16 +543,18 @@ "newpassword": "Uusi salasana:", "retypenew": "Uusi salasana uudelleen:", "resetpass_submit": "Aseta salasana ja kirjaudu sisään", - "changepassword-success": "Salasanan vaihto onnistui.", + "changepassword-success": "Salasanasi on vaihdettu!", "changepassword-throttled": "Olet tehnyt liian monta äskettäistä kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.", "botpasswords": "Botin salasanat", "botpasswords-disabled": "Botin salasanat on poistettu käytöstä.", + "botpasswords-label-appid": "Botin nimi:", "botpasswords-label-create": "Luo", "botpasswords-label-update": "Päivitä", "botpasswords-label-cancel": "Peru", "botpasswords-label-delete": "Poista", "botpasswords-label-resetpassword": "Uudista salasana", "botpasswords-label-grants": "Valittavissa olevat toimintaoikeudet:", + "botpasswords-label-restrictions": "Käyttörajoitukset:", "resetpass_forbidden": "Salasanoja ei voi vaihtaa.", "resetpass-no-info": "Et voi nähdä tätä sivua kirjautumatta sisään.", "resetpass-submit-loggedin": "Muuta salasana", @@ -1321,9 +1324,9 @@ "recentchangeslinked-page": "Sivun nimi:", "recentchangeslinked-to": "Näytä sen sijaan muutokset sivuihin, joista on linkki tähän sivuun", "recentchanges-page-added-to-category": "[[:$1]] lisätty luokkaan", - "recentchanges-page-added-to-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} lisätty luokkaan", + "recentchanges-page-added-to-category-bundled": "[[:$1]] ja [[Special:WhatLinksHere/$1|{{PLURAL:$2|yksi sivu|$2 sivua}}]] lisätty luokkaan", "recentchanges-page-removed-from-category": "[[:$1]] poistettu luokasta", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] ja {{PLURAL:$2|one page|$2 pages}} poistettu luokasta", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] ja [[Special:WhatLinksHere/$1|{{PLURAL:$2|yksi sivu|$2 sivua}}]] poistettu luokasta", "autochange-username": "MediaWiki automaattinen muutos", "upload": "Tallenna tiedosto", "uploadbtn": "Tallenna tiedosto", @@ -1499,6 +1502,7 @@ "uploadstash-badtoken": "Toiminnon suoritus epäonnistui. Tähän voi olla syynä muokkausvaltuuksien vanhentuminen. Yritä uudelleen.", "uploadstash-errclear": "Muistin tyhjennys epäonnistui.", "uploadstash-refresh": "Päivitä tiedostoluettelo", + "uploadstash-thumbnail": "näytä pienoiskuva", "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.", @@ -1631,10 +1635,10 @@ "statistics-header-hooks": "Muut tilastot", "statistics-articles": "Sisältösivuja", "statistics-pages": "Sivuja", - "statistics-pages-desc": "Kaikki sivut, sisältäen keskustelusivut, ohjaukset ja muut.", + "statistics-pages-desc": "Kaikki wikissä olevat sivut, mukaan lukien keskustelusivut, ohjaussivut ynnä muut.", "statistics-files": "Tallennettuja tiedostoja", "statistics-edits": "Muokkauksia {{GRAMMAR:genitive|{{SITENAME}}}} perustamisen jälkeen", - "statistics-edits-average": "Keskimäärin yhtä sivua muokattu", + "statistics-edits-average": "Muokkausten keskiarvo yhdellä sivulla", "statistics-users": "Rekisteröityneitä [[Special:ListUsers|käyttäjiä]]", "statistics-users-active": "Aktiivisia käyttäjiä", "statistics-users-active-desc": "Käyttäjät, jotka ovat suorittaneet jonkin toiminnon {{PLURAL:$1|edellisen päivän|edellisten $1 päivän}} aikana.", @@ -1749,7 +1753,7 @@ "apisandbox-api-disabled": "API on poistettu käytöstä tällä sivustolla.", "apisandbox-intro": "Tämä on '''MediaWiki API:n''' hiekkalaatikko.\n[//www.mediawiki.org/wiki/API:Main_page API-dokumentaatio] kertoo lisää API:en käytöstä.", "apisandbox-fullscreen": "Laajenna paneeli", - "apisandbox-unfullscreen": "Näytä sivu", + "apisandbox-unfullscreen": "Palaa sivunäkymään", "apisandbox-submit": "Tee pyyntö", "apisandbox-reset": "Tyhjennä", "apisandbox-retry": "Yritä uudestaan", @@ -1978,7 +1982,7 @@ "delete-toobig": "Tällä sivulla on pitkä muokkaushistoria, yli $1 {{PLURAL:$1|versio|versiota}}. \nTämänkaltaisten sivujen poistamista on rajoitettu. Tällä ehkäistään sivuston {{SITENAME}} vaurioitumista tahattomasti.", "delete-warning-toobig": "Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.", "deleteprotected": "Et voi poistaa tätä sivua, koska se on suojattu.", - "deleting-backlinks-warning": "'''Varoitus:''' Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], tai sivu on sisällytetty muuhun sivuun.", + "deleting-backlinks-warning": "Varoitus: Sivulle, jota olet poistamassa, johtaa [[Special:WhatLinksHere/{{FULLPAGENAME}}|linkkejä muilta sivuilta]], taikka sivu on sisällytetty muuhun sivuun.", "rollback": "palauta aiempaan versioon", "rollbacklink": "palauta", "rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutos|muutosta}}", @@ -1997,12 +2001,14 @@ "changecontentmodel-title-label": "Sivun otsikko", "changecontentmodel-model-label": "Uusi sisältömalli", "changecontentmodel-reason-label": "Syy:", + "changecontentmodel-submit": "Tee muutos", "changecontentmodel-success-title": "Sisältömallia on muutettu", "changecontentmodel-success-text": "Sisältötyyppiä kohteessa [[:$1]] on muutettu.", "changecontentmodel-cannot-convert": "Sisältöä sivulla [[:$1]] ei voida muuntaa tyypiksi $2.", "changecontentmodel-nodirectediting": "Sisältömalli $1 ei tue suoraa muokkaamista", "log-name-contentmodel": "Sisältömallin muutosloki", "log-description-contentmodel": "Tapahtumat, jotka liittyvät sivun sisältömalleihin", + "logentry-contentmodel-new": "$1 {{GENDER:$2|loi}} sivun $3 käyttäen normaalista poikkeavaa sisältömallia \"$5\"", "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta \"$4\" muotoon \"$5\"", "logentry-contentmodel-change-revertlink": "kumoa", "logentry-contentmodel-change-revert": "kumottu", @@ -2595,7 +2601,7 @@ "patrol-log-page": "Muutostentarkastusloki", "patrol-log-header": "Tämä on loki tarkastetuista muutoksista.", "log-show-hide-patrol": "$1 muutostentarkastusloki", - "log-show-hide-tag": "$1 merkkausten loki", + "log-show-hide-tag": "$1 merkkausloki", "deletedrevision": "Poistettiin vanha versio $1", "filedeleteerror-short": "Tiedoston $1 poistaminen epäonnistui", "filedeleteerror-long": "Tiedoston poistaminen epäonnistui:\n\n$1", @@ -3245,7 +3251,7 @@ "tags-delete-not-allowed": "Sellaisia merkkauksia, jotka tulevat erityisestä ohjelmistolaajennuksesta, ei voi poistaa ennen kuin tämä laajennus erityisesti sallii sen.", "tags-delete-not-found": "Merkkausta \"$1\" ei ole olemassa.", "tags-delete-too-many-uses": "Tämä merkkaus \"$1\" on käytössä useammassa kuin $2 sivuversiossa, joten sitä ei voi poistaa.", - "tags-delete-warnings-after-delete": "Merkkaus \"$1\" poistettiin onnistuneesta, mutta {{PLURAL:$2|seuraava varoitus|seuraavat varoitukset}} ilmeni samalla:", + "tags-delete-warnings-after-delete": "Merkkaus \"$1\" poistettiin, mutta toimenpide sai aikaan {{PLURAL:$2|seuraavan varoituksen|seuraavat varoitukset}}:", "tags-activate-title": "Aktivoi merkkaus", "tags-activate-question": "Olet nyt aktivoimassa merkkausta \"$1\".", "tags-activate-reason": "Syy:", @@ -3284,7 +3290,7 @@ "tags-edit-reason": "Syy:", "tags-edit-revision-submit": "Toteuta muutokset {{PLURAL:$1|tähän versioon|$1 versioon}}", "tags-edit-logentry-submit": "Lähetä muutoksesi {{PLURAL:$1|tähän lokimerkintään|$1 lokimerkintään}}", - "tags-edit-success": "Muutokset on onnistuneesti toteutettu.", + "tags-edit-success": "Muutokset on tehty.", "tags-edit-failure": "Muutoksia ei voitu toteuttaa: $1", "tags-edit-nooldid-title": "Kohdeversio ei ole kelvollinen", "tags-edit-nooldid-text": "Et ole joko määrittänyt sitä kohdeversiota, johon tämä toimenpide kohdistuu, tai sitten määrättyä versiota ei ole olemassa.", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index cd0cfd0cf8..9859a05370 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -136,7 +136,8 @@ "Fredlefred", "Lbayle", "Cl3m3n7", - "C13m3n7" + "C13m3n7", + "Gnangbade" ] }, "tog-underline": "Soulignement des liens :", @@ -277,7 +278,6 @@ "moredotdotdot": "Plus...", "morenotlisted": "Cette liste n’est pas complète.", "mypage": "Page", - "anonuserpage": "Utilisateur inconnu", "mytalk": "Discussion", "anontalk": "Discussion", "navigation": "Navigation", @@ -489,7 +489,7 @@ "viewyourtext": "Vous pouvez voir et copier le contenu de vos modifications à cette page.", "protectedinterface": "Cette page fournit du texte d'interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.", "editinginterface": "Attention : vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.", - "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MédiaWiki.", + "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.", "cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2", "namespaceprotected": "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».", "customcssprotected": "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.", @@ -1106,7 +1106,7 @@ "rows": "Rangées :", "columns": "Colonnes :", "searchresultshead": "Filtrer avec cette valeur", - "stub-threshold": "Seuil pour le formatage des liens bouchons ($1) :", + "stub-threshold": "Seuil pour le formatage des liens d’ébauche ($1) :", "stub-threshold-sample-link": "exemple", "stub-threshold-disabled": "Désactivé", "recentchangesdays": "Nombre de jours à afficher dans les modifications récentes :", @@ -1309,7 +1309,7 @@ "grant-createaccount": "Créer des comptes", "grant-createeditmovepage": "Créer, modifier et déplacer des pages", "grant-delete": "Supprimer les pages, les révisions et les entrées du journal", - "grant-editinterface": "Modifier l’espace de noms MédiaWiki et le CSS/JavaScript utilisateur", + "grant-editinterface": "Modifier l’espace de noms MediaWiki et le CSS/JavaScript utilisateur", "grant-editmycssjs": "Modifier votre CSS/JavaScript utilisateur", "grant-editmyoptions": "Modifier vos préférences utilisateur", "grant-editmywatchlist": "Modifier votre liste de suivi", @@ -1440,10 +1440,10 @@ "recentchangeslinked-page": "Nom de la page :", "recentchangeslinked-to": "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse", "recentchanges-page-added-to-category": "[[:$1]] ajouté à la catégorie", - "recentchanges-page-added-to-category-bundled": "[[:$1]] et {{PLURAL:$2|une page ajoutée|$2 pages ajoutées}} à la catégorie", + "recentchanges-page-added-to-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|une page ajoutée|$2 pages ajoutées}}]] à la catégorie", "recentchanges-page-removed-from-category": "[[:$1]] supprimé de la catégorie", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] et {{PLURAL:$2|une page retirée|$2 pages retirées}} de la catégorie", - "autochange-username": "Modification automatique de MédiaWiki", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|une page|$2 pages}}]] {{PLURAL:$2|retirée|retirées}} de la catégorie", + "autochange-username": "Modification automatique de MediaWiki", "upload": "Importer un fichier", "uploadbtn": "Importer le fichier", "reuploaddesc": "Annuler et retourner au formulaire d'import", @@ -1552,7 +1552,7 @@ "upload-foreign-cant-upload": "Ce wiki n’est pas configuré pour télécharger des fichiers vers le dépôt de fichiers externe demandé.", "upload-dialog-title": "Téléverser un fichier", "upload-dialog-button-cancel": "Annuler", - "upload-dialog-button-done": "Fait", + "upload-dialog-button-done": "Terminé", "upload-dialog-button-save": "Enregistrer", "upload-dialog-button-upload": "Téléverser", "upload-form-label-infoform-title": "Détails", @@ -1622,6 +1622,7 @@ "uploadstash-badtoken": "L’exécution de cette action a échoué, peut-être parce que vos informations d’identification ont expiré. Veuillez réessayer.", "uploadstash-errclear": "La suppression des fichiers a échoué.", "uploadstash-refresh": "Actualiser la liste des fichiers", + "uploadstash-thumbnail": "afficher la vignette", "invalid-chunk-offset": "Offset de segment non valide", "img-auth-accessdenied": "Accès refusé", "img-auth-nopathinfo": "PATH_INFO manquant.\nVotre serveur n'est pas paramétré pour transmettre cette information.\nIl fonctionne peut-être en CGI et ne supporte pas img_auth.\nVoir : https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1877,7 +1878,7 @@ "apisandbox-fullscreen": "Développer le panneau", "apisandbox-fullscreen-tooltip": "Étendre le panneau du bac à sable pour remplir la fenêtre du navigateur.", "apisandbox-unfullscreen": "Afficher la page", - "apisandbox-unfullscreen-tooltip": "Réduire le panneau du bac à sable, pour que les liens de navigation de MédiaWiki soient disponibles.", + "apisandbox-unfullscreen-tooltip": "Réduire le panneau du bac à sable, pour que les liens de navigation de MediaWiki soient disponibles.", "apisandbox-submit": "Faire la demande", "apisandbox-reset": "Effacer", "apisandbox-retry": "Réessayer", @@ -3615,7 +3616,7 @@ "feedback-bugnew": "J'ai vérifié. Signaler un nouveau bogue", "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.", "feedback-cancel": "Annuler", - "feedback-close": "Fait", + "feedback-close": "Terminé", "feedback-external-bug-report-button": "Signaler un bogue technique", "feedback-dialog-title": "Soumettre un commentaire", "feedback-dialog-intro": "Vous pouvez utiliser le simple formulaire ci-dessous pour faire parvenir vos commentaires. Votre commentaire sera ajouté à la page « $1 », ainsi que votre nom d’utilisateur.", @@ -3797,5 +3798,25 @@ "sessionprovider-generic": "sessions $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les cookies", "sessionprovider-nocookies": "Les cookies peuvent être désactivés. Assurez-vous que vous avez activé les cookies et recommencez.", - "randomrootpage": "Page racine aléatoire" + "randomrootpage": "Page racine aléatoire", + "log-action-filter-block": "Type de blocage :", + "log-action-filter-delete": "Type de suppression :", + "log-action-filter-patrol": "Type de patrouille :", + "log-action-filter-protect": "Type de protection :", + "log-action-filter-upload": "Type de téléchargement:", + "log-action-filter-all": "Tout", + "log-action-filter-block-block": "Bloc", + "log-action-filter-block-reblock": "Modification de bloc", + "log-action-filter-block-unblock": "Débloquer", + "log-action-filter-delete-delete": "Suppression de pages", + "log-action-filter-delete-restore": "Restitution de page", + "log-action-filter-delete-event": "Suppression du journal", + "log-action-filter-delete-revision": "Supression de révison", + "log-action-filter-patrol-patrol": "Patrouille manuelle", + "log-action-filter-patrol-autopatrol": "Patrouille automatique", + "log-action-filter-protect-protect": "Protection", + "log-action-filter-protect-modify": "Modification de la protection", + "log-action-filter-protect-unprotect": "Levée de la protection", + "log-action-filter-upload-upload": "Nouveau téléversement", + "log-action-filter-upload-overwrite": "Reitérer le téléversement" } diff --git a/languages/i18n/frp.json b/languages/i18n/frp.json index e9a86b8373..41227b0ec9 100644 --- a/languages/i18n/frp.json +++ b/languages/i18n/frp.json @@ -16,7 +16,7 @@ "tog-hidepatrolled": "Cachiér los changements gouardâs dedens los dèrriérs changements", "tog-newpageshidepatrolled": "Cachiér les pâges gouardâyes dedens la lista de les pâges novèles", "tog-hidecategorization": "Cachiér la catègorisacion de les pâges", - "tog-extendwatchlist": "Èpatar la lista de gouârda por montrar tôs los changements et pas ren que los ples novéls", + "tog-extendwatchlist": "Èpatar la lista de gouârda por montrar tôs los changements et pas mas que los ples novéls", "tog-usenewrc": "Rassemblar los changements per pâge dedens los dèrriérs changements et la lista de gouârda", "tog-numberheadings": "Numerotar ôtomaticament los titros de sèccion", "tog-showtoolbar": "Montrar la bârra d’outils de changement", @@ -40,11 +40,11 @@ "tog-uselivepreview": "Empleyér l’apèrçu rapido", "tog-forceeditsummary": "Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement", "tog-watchlisthideown": "Cachiér mos changements dedens la lista de gouârda", - "tog-watchlisthidebots": "Cachiér los changements fêts per des robots dedens la lista de gouârda", + "tog-watchlisthidebots": "Cachiér los changements fêts per los robots dedens la lista de gouârda", "tog-watchlisthideminor": "Cachiér los petiôts changements dedens la lista de gouârda", - "tog-watchlisthideliu": "Cachiér los changements fêts per des utilisators branchiês dedens la lista de gouârda", + "tog-watchlisthideliu": "Cachiér los changements fêts per los utilisators branchiês dedens la lista de gouârda", "tog-watchlistreloadautomatically": "Rechargiér ôtomaticament la lista de gouârda quand los chouèx de filtrâjo sont changiês (JavaScript nècèssèro)", - "tog-watchlisthideanons": "Cachiér los changements fêts per des utilisators anonimos dedens la lista de gouârda", + "tog-watchlisthideanons": "Cachiér los changements fêts per los utilisators anonimos dedens la lista de gouârda", "tog-watchlisthidepatrolled": "Cachiér los changements gouardâs dedens la lista de gouârda", "tog-watchlisthidecategorization": "Cachiér la catègorisacion de les pâges", "tog-ccmeonemails": "Mè mandar na copia des mèssâjos que mando ux ôtros utilisators", @@ -52,7 +52,7 @@ "tog-showhiddencats": "Montrar les catègories cachiêes", "tog-norollbackdiff": "Pas fâre vêre la dif sur na rèvocacion", "tog-useeditwarning": "Mè balyér na semonce quand quito na pâge de changement sen encartar los changements", - "tog-prefershttps": "Empleyér tot lo temps un branchement sècurisâ en étent branchiê(e)", + "tog-prefershttps": "Empleyér tot lo temps un branchement sècurisâ en étent branchiê", "underline-always": "Tot lo temps", "underline-never": "Jamés", "underline-default": "Valor per dèfôt de l’habelyâjo du navegator", @@ -128,8 +128,8 @@ "pagecategories": "Catègori{{PLURAL:$1|a|es}}", "category_header": "Pâges dedens la catègoria « $1 »", "subcategories": "Sot-catègories", - "category-media-header": "Fichiérs multimèdiâ dedens la catègoria « $1 »", - "category-empty": "Ora cela catègoria contint gins de pâge de fichiér multimèdiâ.", + "category-media-header": "Mèdiâ dedens la catègoria « $1 »", + "category-empty": "Ora cela catègoria contint gins de pâge de mèdiâ.", "hidden-categories": "{{PLURAL:$1|Catègoria cachiêe|Catègories cachiêes}}", "hidden-category-category": "Catègories cachiêes", "category-subcat-count": "Cela catègoria at {{PLURAL:$2|mas que cela sot-catègoria-que.|{{PLURAL:$1|cela sot-catègoria|celes $1 sot-catègories}}-que, sur na soma de $2.}}", @@ -149,7 +149,6 @@ "moredotdotdot": "Més...", "morenotlisted": "Cela lista est pas complèta.", "mypage": "Pâge", - "anonuserpage": "Utilisator encognu", "mytalk": "Discussion", "anontalk": "Discussion", "navigation": "Navegacion", @@ -159,8 +158,8 @@ "qbedit": "Changiér", "qbpageoptions": "Cela pâge", "qbmyoptions": "Mes pâges", - "faq": "Quèstions sovent posâyes", - "faqpage": "Project:Quèstions sovent posâyes", + "faq": "Quèstions sovent pôses", + "faqpage": "Project:Quèstions sovent pôses", "actions": "Accions", "namespaces": "Èspâços de noms", "variants": "Vèrsions", @@ -279,7 +278,7 @@ "viewdeleted": "Vos voléd vêre $1 ?", "restorelink": "{{PLURAL:$1|un changement suprimâ|$1 changements suprimâs}}", "feedlinks": "Flux :", - "feed-invalid": "Tipo d’abonement du flux pas justo.", + "feed-invalid": "Tipo d’abonament du flux pas justo.", "feed-unavailable": "Los flux de sindicacion sont pas disponiblos", "site-rss-feed": "Flux RSS de $1", "site-atom-feed": "Flux Atom de $1", @@ -290,7 +289,7 @@ "sort-ascending": "Betar en ôrdre crèssent", "nstab-main": "Pâge", "nstab-user": "Pâge utilisator", - "nstab-media": "Fichiér multimèdiâ", + "nstab-media": "Pâge mèdiâ", "nstab-special": "Pâge spèciâla", "nstab-project": "Pâge projèt", "nstab-image": "Fichiér", @@ -448,7 +447,7 @@ "nocookieslogin": "{{SITENAME}} emplèye de raportiors (cookies) por lo branchement mas vos los éd dèsactivâs.\nSe vos plét, activâd-los et pués tornâd èprovar.", "nocookiesfornew": "Lo comptio utilisator est pas étâ fêt, nos ens pas possu confirmar son origina.\nControlâd que vos éd activâ los raportiors (cookies), rechargiéd la pâge et pués tornâd èprovar.", "noname": "Vos éd pas spècifiâ un nom d’utilisator justo.", - "loginsuccesstitle": "Branchiê(e)", + "loginsuccesstitle": "Branchiê", "loginsuccess": "Ora vos éte branchiê{{GENDER:$1||e}} a {{SITENAME}} coment « $1 ».", "nosuchuser": "Y at gins d’utilisator avouéc lo nom « $1 ».\nLos noms d’utilisator sont sensiblos a la câssa.\nSe vos plét, controlâd l’ortografia ou ben [[Special:UserLogin/signup|féte un comptio novél]].", "nosuchusershort": "Y at gins d’utilisator avouéc lo nom « $1 ».\nSe vos plét, controlâd l’ortografia.", @@ -469,7 +468,7 @@ "passwordsent": "Un contresegno novél est étâ mandâ a l’adrèce èlèctronica de l’utilisator « $1 ».\nSe vos plét, tornâd-vos branchiér aprés l’avêr reçu.", "blocked-mailpassword": "Voutron adrèce IP est blocâye en ècritura, la fonccion de sovegnence du contresegno est vêr dèsactivâye por èvitar los abus.", "eauthentsent": "Un mèssâjo de confirmacion est étâ mandâ a l’adrèce èlèctronica spècifiâye.\nDevant qu’un ôtro mèssâjo seye mandâ a cél comptio, vos devréd siuvre les enstruccions du mèssâjo et pués confirmar que lo comptio est franc lo voutro.", - "throttled-mailpassword": "Un mèssâjo de remês’a zérô de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.\nPor èvitar los abus, ren que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.", + "throttled-mailpassword": "Un mèssâjo de remês’a zérô de voutron contresegno est ja étâ mandâ pendent {{PLURAL:$1|l’hora passâye|les $1 hores passâyes}}.\nPor èvitar los abus, mas que yon serat mandâ per {{PLURAL:$1|hora|entèrvalo de $1 hores}}.", "mailerror": "Fôta pendent l’èxpèdicion du mèssâjo : $1", "acct_creation_throttle_hit": "Des vesitors de cél vouiqui qu’emplèyont voutron adrèce IP ant fêt $1 comptio{{PLURAL:$1||s}} pendent lo jorn passâ, cen qu’est lo més ôtorisâ dens ceti temps.\nDu côp los vesitors qu’emplèyont cel’adrèce IP pôvont fâre gins de comptio por lo moment.", "emailauthenticated": "Voutron adrèce èlèctronica est étâye confirmâye lo $2 a $3.", @@ -602,7 +601,7 @@ "image_sample": "Ègzemplo.jpg", "image_tip": "Fichiér apondu", "media_sample": "Ègzemplo.ogg", - "media_tip": "Lim de vers un fichiér multimèdiâ", + "media_tip": "Lim de vers un fichiér", "sig_tip": "Voutra signatura avouéc l’horodatâjo", "hr_tip": "Legne plana (pas nen abusar)", "summary": "Rèsumâ :", @@ -660,7 +659,7 @@ "previewconflict": "Cél apèrçu fât vêre lo tèxto de la zona de changement de d’amont coment aparêtrat se vos chouèsésséd de l’encartar.", "session_fail_preview": "Dèsolâ ! Nos povens pas encartar voutron changement a côsa d’una pèrda d’enformacions sur voutra sèssion.\n\nPôt-étre vos éte étâ dèbranchiê. Se vos plét, controlâd que vos éte adés branchiê et pués tornâd èprovar.\nSe cen tôrne pas reussir, èprovâd de vos [[Special:UserLogout|dèbranchiér]] et pués de vos tornar branchiér, et controlâd que voutron navegator accèpte los raportiors (cookies) de cél seto.", "session_fail_preview_html": "Dèsolâ ! Nos povens pas encartar voutron changement a côsa d’una pèrda d’enformacions sur voutra sèssion.\n\nPerce que {{SITENAME}} at activâ l’HTML bruto, l’apèrçu est étâ cachiê por prèvegnir les ataques per JavaScript.\n\nSe l’èprôva de changement est lèg·itima, se vos plét tornâd èprovar.\nSe cen tôrne pas reussir, èprovâd de vos [[Special:UserLogout|dèbranchiér]] et pués de vos tornar branchiér, et controlâd que voutron navegator accèpte los raportiors (cookies) de cél seto.", - "token_suffix_mismatch": "Voutron changement est pas étâ accèptâ, voutron cliant at mècllâ los caractèros de ponctuacion dedens lo jeton de changement.\nLo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.\nDes côps cél problèmo arreve quand vos empleyéd un sèrviço de sèrvior mandatèro (proxy) Vouèbe anonimo qu’est pas de sûr.", + "token_suffix_mismatch": "Voutron changement est pas étâ accèptâ, voutron cliant at mècllo los caractèros de ponctuacion dedens lo jeton de changement.\nLo changement est étâ refusâ por empachiér la corrupcion du tèxto de la pâge.\nDes côps cél problèmo arreve quand vos empleyéd un sèrviço de sèrvior mandatèro (proxy) Vouèbe anonimo qu’est pas de sûr.", "edit_form_incomplete": "Doux-três parties du formulèro de changement ant pas avengiê lo sèrvior ; controlâd que voutros changements sont entactos et pués tornâd èprovar.", "editing": "Changement de $1", "creating": "Crèacion de $1", @@ -676,7 +675,7 @@ "copyrightwarning": "Se vos plét, notâd que totes les contribucions a {{SITENAME}} sont considèrâyes coment publeyêes desot los tèrmos de la $2 (vêde $1 por més de dètalys).\nSe vos voléd pas que voutros ècrits seyont changiês sen pediêt et pués redistribuâs a volontât, adonc mandâd-los pas ique.
\nVos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico ou d’un’ôtra ressôrsa libra.\nEmpleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !", "copyrightwarning2": "Se vos plét, notâd que totes les contribucions a {{SITENAME}} pôvont étre changiêes enlevâyes per d’ôtros contributors.\nSe vos voléd pas que voutros ècrits seyont changiês sen pediêt, adonc mandâd-los pas ique.
\nVos nos assurâd asse-ben que vos éd cen ècrit vos-mémo ou ben que vos l’éd copiyê d’una sôrsa que vint du domêno publico ou d’un’ôtra ressôrsa libra (vêde $1 por més de dètalys).\nEmpleyéd gins d’ôvra desot drêt d’ôtor sen pèrmission èxprèssa !", "editpage-cannot-use-custom-model": "Lo modèlo de contegnu de cela pâge pôt pas étre changiê.", - "longpageerror": "Fôta : lo tèxto que vos éd mandâ fât {{PLURAL:$1|un Kio|$1 Kio}}, cen que dèpâsse la limita fixâye a {{PLURAL:$2|un Kio|$2 Kio}}.\nPôt pas étre encartâ.", + "longpageerror": "Fôta : lo tèxto que vos éd mandâ fât {{PLURAL:$1|un Kio|$1 Kio}}, cen que dèpâsse la limita fixa a {{PLURAL:$2|un Kio|$2 Kio}}.\nPôt pas étre encartâ.", "readonlywarning": "Atencion : la bâsa de balyês est étâye cotâye por na rotina d’entretin, cen fât que vos porréd vêr pas encartar voutros changements orendrêt.\nVos pouede copiyér et côlar voutron tèxto dedens un fichiér tèxto et pués l’encartar por ples târd.\n\nL’administrator sistèmo que l’at cotâ at balyê cel’èxplicacion : $1", "protectedpagewarning": "Atencion : cela pâge est étâye protègiêe por que solament los utilisators qu’ant los drêts d’administrator la pouessont changiér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :", "semiprotectedpagewarning": "Nota : cela pâge est étâye protègiêe por que solament los utilisators encartâs la pouessont changiér.\nLa dèrriére entrâ du jornâl est balyêe ce-desot coment rèference :", @@ -1107,7 +1106,7 @@ "right-upload": "Tèlèchargiér de fichiérs", "right-reupload": "Ècllafar un fichiér ègzistent", "right-reupload-own": "Ècllafar un fichiér ègzistent tèlèchargiê per sè-mémo", - "right-reupload-shared": "Ècllafar localament un fichiér present sur un dèpôt de fichiérs multimèdiâ partagiê", + "right-reupload-shared": "Ècllafar localament un fichiér present sur un dèpôt mèdiâ partagiê", "right-upload_by_url": "Tèlèchargiér un fichiér dês un’URL", "right-purge": "Purgiér lo cacho du seto d’una pâge sen confirmacion", "right-autoconfirmed": "Pas étre afèctâ per les limitacions de dèbit liyêes a les adrèces IP", @@ -1167,7 +1166,7 @@ "right-changetags": "Apondre et enlevar de façon arbitrèra de [[Special:Tags|balises]] sur des vèrsions endividuèles et des entrês de jornâl", "grant-generic": "Ensemblo de drêts « $1 »", "grant-group-page-interaction": "Entèrag·ir avouéc de pâges", - "grant-group-file-interaction": "Entèrag·ir avouéc de fichiérs multimèdiâ", + "grant-group-file-interaction": "Entèrag·ir avouéc de mèdiâs", "grant-group-watchlist-interaction": "Entèrag·ir avouéc voutra lista de gouârda", "grant-group-email": "Mandar un mèssâjo", "grant-group-high-volume": "Fâre un’activitât de grôs volumo", @@ -1308,18 +1307,18 @@ "recentchangeslinked-page": "Nom de la pâge :", "recentchangeslinked-to": "Montrar per contre los changements de les pâges qu’ant un lim de vers la pâge balyêe", "recentchanges-page-added-to-category": "[[:$1]] apondua a la catègoria", - "recentchanges-page-added-to-category-bundled": "[[:$1]] et {{PLURAL:$2|na pâge apondua|$2 pâges apondues}} a la catègoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|na pâge apondua|$2 pâges apondues}}]] a la catègoria", "recentchanges-page-removed-from-category": "[[:$1]] enlevâye de la catègoria", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] et {{PLURAL:$2|na pâge enlevâye|$2 pâges enlevâyes}} de la catègoria", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] et [[Special:WhatLinksHere/$1|{{PLURAL:$2|na pâge enlevâye|$2 pâges enlevâyes}}]] de la catègoria", "autochange-username": "Changement ôtomatico de MediaWiki", "upload": "Tèlèchargiér un fichiér", "uploadbtn": "Tèlèchargiér lo fichiér", "reuploaddesc": "Anular lo tèlèchargement et pués tornar u formulèro de tèlèchargement", "upload-tryagain": "Mandar la dèscripcion du fichiér changiê", - "uploadnologin": "Pas branchiê(ye)", + "uploadnologin": "Pas branchiê", "uploadnologintext": "Se vos plét, vos vos dête $1 por povêr tèlèchargiér de fichiérs.", "upload_directory_missing": "Lo rèpèrtouèro de tèlèchargement ($1) est entrovâblo et at pas possu étre fêt per lo sèrvior Vouèbe.", - "upload_directory_read_only": "Lo rèpèrtouèro de tèlèchargement ($1) est pas enscriptiblo dês lo sèrvior Vouèbe.", + "upload_directory_read_only": "Lo rèpèrtouèro de tèlèchargement ($1) est pas enscriptiblo per lo sèrvior Vouèbe.", "uploaderror": "Fôta pendent lo tèlèchargement", "upload-recreate-warning": "Atencion : un fichiér avouéc cél nom est étâ suprimâ dèplaciê.\n\nLo jornâl de les suprèssions et des dèplacements de cela pâge est balyê ique por comoditât :", "uploadtext": "Empleyéd lo formulèro ce-desot por tèlèchargiér de fichiérs.\nPor vêre rechèrchiér de fichiérs tèlèchargiês dês devant, vêde la [[Special:FileList|lista des fichiérs tèlèchargiês]]. Los (re-)tèlèchargements sont asse-ben encartâs dessus lo [[Special:Log/upload|jornâl des tèlèchargements]], et les suprèssions dessus lo [[Special:Log/delete|jornâl de les suprèssions]].\n\nPor rapondre un fichiér dedens na pâge, empleyéd un lim de yona de celes fôrmes-que :\n* [[{{ns:file}}:Fichiér.jpg]] por empleyér la vèrsion en plêna largior du fichiér\n* [[{{ns:file}}:Fichiér.png|200px|thumb|left|tèxto dèscriptif]] por empleyér na miniatura de 200 pixèls de lârjo dedens na bouèt’a gôche avouéc « tèxto dèscriptif » coment dèscripcion\n* [[{{ns:media}}:Fichiér.ogg]] por liyér tot drêt vers lo fichiér sen lo fâre vêre", @@ -1388,8 +1387,8 @@ "uploaded-animate-svg": "La balisa « animate » est étâye trovâye que porrêt changiér lo href en empleyent l’atribut « from » <$1 $2=\"$3\"> dedens lo fichiér SVG tèlèchargiê.", "uploaded-setting-event-handler-svg": "La dèfinicion d’atributs de maneyor d’èvènement est dèfendua, <$1 $2=\"$3\"> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", "uploaded-setting-href-svg": "L’usâjo de la balisa « set » por apondre un atribut « href » a la piéce parenta est dèfendu.", - "uploaded-wrong-setting-svg": "L’usâjo de la balisa « set » por apondre na ciba distanta/balyês/scripte a un atribut quint que seye est dèfendu. <set to=\"$1\"> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", - "uploaded-setting-handler-svg": "Los SVG que dèfenéssont l’atribut « handler » avouéc distant/balyês/scripte sont dèfendus. $1=\"$2\" est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", + "uploaded-wrong-setting-svg": "L’usâjo de la balisa « set » por apondre na ciba distanta / balyês / scripte a un atribut quint que seye est dèfendu. <set to=\"$1\"> est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", + "uploaded-setting-handler-svg": "Los SVG que dèfenéssont l’atribut « handler » avouéc distant / balyês / scripte sont dèfendus. $1=\"$2\" est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", "uploaded-remote-url-svg": "Los SVG que dèfenéssont un atribut de stilo quint que seye avouéc un’URL distanta sont dèfendus. $1=\"$2\" est étâ trovâ dedens lo fichiér SVG tèlèchargiê.", "uploaded-image-filter-svg": "Un filtro d’émâge avouéc URL est étâ trovâ : <$1 $2=\"$3\"> dedens lo fichiér SVG tèlèchargiê.", "uploadscriptednamespace": "Cél fichiér SVG contint un èspâço de noms « $1 » pas ôtorisâ.", @@ -1490,6 +1489,7 @@ "uploadstash-badtoken": "L’ègzécucion de cel’accion at pas reussi. Pôt-étre perce que voutros identifients de changement ant èxpirâ. Se vos plét, tornâd èprovar.", "uploadstash-errclear": "La vouegiê des fichiérs at pas reussi.", "uploadstash-refresh": "Rafrèchir la lista des fichiérs", + "uploadstash-thumbnail": "vêre la miniatura", "invalid-chunk-offset": "Dèplacement de bocon pas justo", "img-auth-accessdenied": "Accès refusâ", "img-auth-nopathinfo": "PATH_INFO entrovâblo.\nVoutron sèrvior est pas configurâ por passar cel’enformacion.\nPôt-étre que fonccione en CGI et recognêt vêr pas img_auth.\nVêde https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1521,7 +1521,7 @@ "upload_source_file": "(lo fichiér que vos éd chouèsi dês voutron ordenator)", "listfiles-delete": "suprimar", "listfiles-summary": "Cela pâge spèciâla montre tôs los fichiérs tèlèchargiês.", - "listfiles_search_for": "Rechèrchiér un nom de fichiér multimèdiâ :", + "listfiles_search_for": "Rechèrchiér un nom de mèdiâ :", "listfiles-userdoesnotexist": "Lo comptio utilisator « $1 » est pas encartâ.", "imgfile": "fichiér", "listfiles": "Lista de fichiérs", @@ -1710,7 +1710,7 @@ "protectedpages-unknown-timestamp": "Encognua", "protectedpages-unknown-performer": "Utilisator encognu", "protectedtitles": "Titros protègiês", - "protectedtitles-summary": "Cela pâge liste los titros que sont ora protègiês contre la crèacion. Por na lista de les pâges ègzistentes protègiêes, vêde [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", + "protectedtitles-summary": "Cela pâge liste los titros que sont ora protègiês contre la crèacion. Por na lista de les pâges ègzistentes que sont protègiêes, vêde [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", "protectedtitlesempty": "Ora nion titro est protègiê avouéc celos paramètros.", "protectedtitles-submit": "Fâre vêre los titros", "listusers": "Lista des utilisators", @@ -1808,7 +1808,7 @@ "cachedspecial-refresh-now": "Vêre la ples novèla.", "categories": "Catègories", "categories-submit": "Montrar", - "categoriespagetext": "{{PLURAL:$1|Cela catègoria-que contint|Celes catègories-que contegnont}} de pâges de fichiérs multimèdiâ.\nLes [[Special:UnusedCategories|catègories pas empleyêes]] sont pas montrâyes ique.\nVêde avouéc les [[Special:WantedCategories|catègories demandâyes]].", + "categoriespagetext": "{{PLURAL:$1|Cela catègoria-que contint|Celes catègories-que contegnont}} de pâges de mèdiâs.\nLes [[Special:UnusedCategories|catègories pas empleyêes]] sont pas montrâyes ique.\nVêde avouéc les [[Special:WantedCategories|catègories demandâyes]].", "categoriesfrom": "Fâre vêre les catègories dês :", "special-categories-sort-count": "chouèx per comptâjo", "special-categories-sort-abc": "chouèx alfabètico", @@ -2264,7 +2264,7 @@ "ipbnounblockself": "Vos éte pas ôtorisâ{{GENDER:||ye}} a vos dèblocar vos-mém{{GENDER:|o|a}}.", "lockdb": "Cotar la bâsa de balyês", "unlockdb": "Dècotar la bâsa de balyês", - "lockdbtext": "Lo vèrroly de la bâsa de balyês empachierat tôs los utilisators de changiér de pâges, d’encartar lors prèferences, de changiér lor lista de gouârda et pués de fâre totes les ôtres opèracions qu’ant fôta de changements dedens la bâsa de balyês.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre et que vos la dècoteréd setout que voutra rotina d’entretin serat chavonâye.", + "lockdbtext": "Lo vèrroly de la bâsa de balyês empachierat tôs los utilisators de changiér de pâges, d’encartar lors prèferences, de changiér lor lista de gouârda et pués de fâre totes les ôtres opèracions qu’ant fôta de changements dedens la bâsa de balyês.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre et que vos la dècoteréd setout que voutra rotina d’entretin serat chavona.", "unlockdbtext": "La fin du vèrroly de la bâsa de balyês tornerat pèrmetre a tôs los utilisators de changiér de pâges, d’encartar lors prèferences, de changiér lor lista de gouârda et pués de fâre totes les ôtres opèracions qu’ant fôta de changements dedens la bâsa de balyês.\nSe vos plét, confirmâd qu’o est franc cen que vos voléd fâre.", "lockconfirm": "Ouè, confirmo que vuel cotar la bâsa de balyês.", "unlockconfirm": "Ouè, confirmo que vuel dècotar la bâsa de balyês.", @@ -2273,9 +2273,9 @@ "locknoconfirm": "Vos éd pas pouentâ la câsa de confirmacion.", "lockdbsuccesssub": "Vèrroly de la bâsa de balyês reussi", "unlockdbsuccesssub": "Vèrroly de la bâsa de balyês enlevâ", - "lockdbsuccesstext": "La bâsa de balyês est étâye cotâye.
\nOubliâd pas de la [[Special:UnlockDB|dècotar]] quand vos aréd chavonâ voutra rotina d’entretin.", + "lockdbsuccesstext": "La bâsa de balyês est étâye cotâye.
\nOubliâd pas de la [[Special:UnlockDB|dècotar]] quand vos aréd chavono voutra rotina d’entretin.", "unlockdbsuccesstext": "La bâsa de balyês est étâye dècotâye.", - "lockfilenotwritable": "Lo fichiér de vèrroly de la bâsa de balyês est pas enscriptiblo.\nPor cotar dècotar la bâsa de balyês, dêt étre enscriptiblo dês lo sèrvior Vouèbe.", + "lockfilenotwritable": "Lo fichiér de vèrroly de la bâsa de balyês est pas enscriptiblo.\nPor cotar dècotar la bâsa de balyês, dêt étre enscriptiblo per lo sèrvior Vouèbe.", "databasenotlocked": "La bâsa de balyês est pas cotâye.", "lockedbyandtime": "(per {{GENDER:$1|$1}} lo $2 a $3)", "move-page": "Dèplaciér $1", @@ -2285,7 +2285,7 @@ "movepagetalktext": "Se vos pouentâd cela câsa, la pâge de discussion associyêe serat asse-ben dèplaciêe ôtomaticament, a muens qu’una pâge de discussion pas voueda ègzisteye ja desot lo novél nom.\n\nDens cél câs, vos devréd dèplaciér fusionar la pâge a la man se vos o voléd.", "moveuserpage-warning": "Atencion : vos éte prèst a dèplaciér na pâge utilisator. Se vos plét, notâd que solament la pâge serat dèplaciêe et que l’utilisator serat pas renomâ.", "movecategorypage-warning": "Atencion : vos éte prèst a dèplaciér na pâge de catègoria. Se vos plét, notâd que solament la pâge serat dèplaciêe et que pas yona de les pâges de la vielye catègoria serat betâye dedens la novèla.", - "movenologintext": "Vos dête étre un utilisator encartâ et [[Special:UserLogin|branchiê]] por povêr dèplaciér na pâge.", + "movenologintext": "Vos dête étre un utilisator encartâ et pués étre [[Special:UserLogin|branchiê]] por povêr dèplaciér na pâge.", "movenotallowed": "Vos éd pas la pèrmission de dèplaciér de pâges.", "movenotallowedfile": "Vos éd pas la pèrmission de dèplaciér de fichiérs.", "cant-move-user-page": "Vos éd pas la pèrmission de dèplaciér de pâges utilisator (en defôr de sot-pâges).", @@ -2483,7 +2483,7 @@ "tooltip-t-permalink": "Lim fixo de vers cela vèrsion de la pâge", "tooltip-ca-nstab-main": "Vêre la pâge de contegnu", "tooltip-ca-nstab-user": "Vêre la pâge utilisator", - "tooltip-ca-nstab-media": "Vêre la pâge du fichiér multimèdiâ", + "tooltip-ca-nstab-media": "Vêre la pâge mèdiâ", "tooltip-ca-nstab-special": "O est na pâge spèciâla que pôt pas étre changiêe", "tooltip-ca-nstab-project": "Vêre la pâge projèt", "tooltip-ca-nstab-image": "Vêre la pâge du fichiér", @@ -2597,27 +2597,30 @@ "patrol-log-page": "Jornâl de gouârda", "patrol-log-header": "Vê-que un jornâl de les vèrsions gouardâyes.", "log-show-hide-patrol": "$1 lo jornâl de gouârda", - "deletedrevision": "La vielye vèrsion $1 at étâ suprimâ.", - "filedeleteerror-short": "Èrror pendent la suprèssion du fichiér : $1", - "filedeleteerror-long": "Des èrrors ont étâ rencontrâs pendent la suprèssion du fichiér :\n\n$1", - "filedelete-missing": "Lo fichiér « $1 » pôt pas étre suprimâ perce qu’ègziste pas.", - "filedelete-old-unregistered": "La vèrsion du fichiér spècefiâ « $1 » est pas dens la bâsa de balyês.", - "filedelete-current-unregistered": "Lo fichiér spècefiâ « $1 » est pas dens la bâsa de balyês.", - "filedelete-archive-read-only": "Lo dossiér d’arch·ivâjo « $1 » pôt pas étre changiê per lo sèrvor.", + "log-show-hide-tag": "$1 lo jornâl de les balises", + "deletedrevision": "Vielye vèrsion $1 suprimâye", + "filedeleteerror-short": "Fôta pendent la suprèssion du fichiér : $1", + "filedeleteerror-long": "Des fôtes sont étâyes rencontrâyes pendent la suprèssion du fichiér :\n\n$1", + "filedelete-missing": "Lo fichiér « $1 » pôt pas étre suprimâ, ègziste pas.", + "filedelete-old-unregistered": "La vèrsion du fichiér spècifiâye « $1 » est pas dedens la bâsa de balyês.", + "filedelete-current-unregistered": "Lo fichiér spècifiâ « $1 » est pas dedens la bâsa de balyês.", + "filedelete-archive-read-only": "Lo rèpèrtouèro d’arch·ivâjo « $1 » est pas enscriptiblo per lo sèrvior Vouèbe.", "previousdiff": "← Changement devant", "nextdiff": "Changement aprés →", - "mediawarning": "'''Atencion :''' ceti tipo de fichiér pôt contegnir de code mâlvelyent.\nSe vos l’ègzécutâd, voutron sistèmo pôt étre compromês.", - "imagemaxsize": "Format lo ples grant de les émâges :
''(por les pâges de dèscripcion d’émâges)''", - "thumbsize": "Talye de la figura :", + "mediawarning": "Atencion : cél tipo de fichiér pôt contegnir de code mâlvelyent.\nSe vos l’ègzécutâd, voutron sistèmo pôt étre compromètu.", + "imagemaxsize": "Talye maximon de les émâges :
(por les pâges de dèscripcion de fichiérs)", + "thumbsize": "Talye de la miniatura :", "widthheightpage": "$1 × $2, $3 pâge{{PLURAL:$3||s}}", "file-info": "Talye du fichiér : $1, tipo MIME : $2", "file-info-size": "$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4", "file-info-size-pages": "$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4, $5 pâge{{PLURAL:$5||s}}", - "file-nohires": "Gins de rèsolucion ples hôta disponibla.", - "svg-long-desc": "Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3", - "svg-long-error": "Fichiér SVG envalido : $1", + "file-nohires": "Niona rèsolucion ples hôta disponibla.", + "svg-long-desc": "Fichiér SVG, nominalament $1 × $2 pixèls, talye du fichiér : $3", + "svg-long-desc-animated": "Fichiér SVG animâ, nominalament $1 × $2 pixèls, talye du fichiér : $3", + "svg-long-error": "Fichiér SVG pas justo : $1", "show-big-image": "Fichiér d’origina", - "show-big-image-preview": "Talye de ceti apèrçu : $1.", + "show-big-image-preview": "Talye de cél apèrçu : $1.", + "show-big-image-preview-differ": "Talye de cél apèrçu $3 du fichiér $2 : $1.", "show-big-image-other": "{{PLURAL:$2|Ôtra rèsolucion|Ôtres rèsolucions}} : $1.", "show-big-image-size": "$1 × $2 pixèls", "file-info-gif-looped": "en boclla", @@ -2625,12 +2628,16 @@ "file-info-png-looped": "en boclla", "file-info-png-repeat": "jouyê $1 côp{{PLURAL:$1||s}}", "file-info-png-frames": "$1 émâge{{PLURAL:$1||s}}", - "newimages": "Galerie des novéls fichiérs", - "imagelisttext": "Vê-que una lista de '''$1''' {{PLURAL:$1|fichiér rengiê|fichiérs rengiês}} $2.", - "newimages-summary": "Ceta pâge spèciâla montre los dèrriérs fichiérs tèlèchargiês.", - "newimages-legend": "Nom du fichiér", - "newimages-label": "Nom du fichiér (ou ben una partia de ceti) :", - "noimages": "Gins de fichiér a fâre vêre.", + "file-no-thumb-animation": "Nota : a côsa de limitacions tècniques, les miniatures de cél fichiér seront pas animâyes.", + "file-no-thumb-animation-gif": "Nota : a côsa de limitacions tècniques, les miniatures d’émâges GIF en hôta rèsolucion coment ceta seront pas animâyes.", + "newimages": "Galeria des novéls fichiérs", + "imagelisttext": "Vê-que na lista de $1 {{PLURAL:$1|fichiér rengiê|fichiérs rengiês}} $2.", + "newimages-summary": "Cela pâge spèciâla montre los dèrriérs fichiérs tèlèchargiês.", + "newimages-legend": "Filtro", + "newimages-label": "Nom du fichiér (ou ben na partia de ceti) :", + "newimages-showbots": "Montrar los tèlèchargements per los robots", + "newimages-hidepatrolled": "Cachiér los tèlèchargements gouardâs", + "noimages": "Ren a fâre vêre.", "ilsubmit": "Rechèrchiér", "bydate": "per dâta", "sp-newimages-showfrom": "Montrar los novéls fichiérs dês lo $1 a $2", @@ -2639,14 +2646,28 @@ "minutes": "$1 menut{{PLURAL:$1|a|es}}", "hours": "$1 hor{{PLURAL:$1|a|es}}", "days": "$1 jorn{{PLURAL:$1||s}}", + "weeks": "$1 seman{{PLURAL:$1|a|es}}", + "months": "{{PLURAL:$1|$1 mês}}", + "years": "$1 an{{PLURAL:$1||s}}", "ago": "cen fât $1", "just-now": "drêt-ora", - "bad_image_list": "Lo format est ceti :\n\nSolament les listes d’ènumèracion (que començont per *) sont considèrâs.\nLo premiér lim d’una legne dêt étre vers celi d’una crouye émâge.\nLos ôtros lims sur la méma legne sont considèrâs coment des èxcèpcions, per ègzemplo des pâges sur lesquintes l’émâge pôt aparêtre.", + "hours-ago": "cen fât $1 hor{{PLURAL:$1|a|es}}", + "minutes-ago": "cen fât $1 menut{{PLURAL:$1|a|es}}", + "seconds-ago": "cen fât $1 second{{PLURAL:$1|a|es}}", + "monday-at": "Delon a $1", + "tuesday-at": "Demârs a $1", + "wednesday-at": "Demécro a $1", + "thursday-at": "Dejô a $1", + "friday-at": "Devendro a $1", + "saturday-at": "Dessando a $1", + "sunday-at": "Demenge a $1", + "yesterday-at": "Hièr a $1", + "bad_image_list": "Lo format est ceti :\n\nSolament les piéces de lista (les legnes que començont per *) sont considèrâyes.\nLo premiér lim d’una legne dêt étre celi d’un crouyo fichiér.\nLos ôtros lims sur la méma legne sont considèrâs coment d’èxcèpcions, per ègzemplo des pâges que lo fichiér pôt aparêtre dessus.", "metadata": "Mètabalyês", - "metadata-help": "Ceti fichiér contint des enformacions de ples, probâblament apondues per l’aparèly-fotô numerico ou ben lo scanor utilisâ por lo fâre.\nSe lo fichiér at étâ changiê dês son ètat originâl, quârques dètalys pôvont pas reflètar a chavon l’émâge changiê.", - "metadata-expand": "Montrar los dètalys ètendus", - "metadata-collapse": "Cachiér los dètalys ètendus", - "metadata-fields": "Los champs de mètabalyês d’émâge listâs dens cél mèssâjo seront betâs dedens la pâge de dèscripcion de l’émâge quand la trâbla de mètabalyês serat rèduita.\nLos ôtros champs seront cachiês per dèfôt.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", + "metadata-help": "Cél fichiér contint d’enformacions de més, probâblament apondues per l’aparèly-fotô numerico lo scanor empleyê por lo fâre numerisar.\nSe lo fichiér est étâ changiê dês son ètat originâl, quârques dètalys pôvont pas remandar a chavon lo fichiér changiê.", + "metadata-expand": "Montrar los dètalys de més", + "metadata-collapse": "Cachiér los dètalys de més", + "metadata-fields": "Los champs de mètabalyês d’émâge listâs dens cél mèssâjo seront rapondus dedens la pâge de dèscripcion de l’émâge quand la trâbla de mètabalyês serat rèduita.\nLos ôtros champs seront cachiês per dèfôt.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", "metadata-langitem": "'''$2 :''' $1", "exif-imagewidth": "Largior", "exif-imagelength": "Hôtior", @@ -2657,207 +2678,208 @@ "exif-samplesperpixel": "Nombro de composentes", "exif-planarconfiguration": "Arrengement de les balyês", "exif-ycbcrsubsampling": "Quota de sot-èchantelyonâjo de Y a C", - "exif-ycbcrpositioning": "Posicionement Y et C", + "exif-ycbcrpositioning": "Posicionament Y et C", "exif-xresolution": "Rèsolucion plana", "exif-yresolution": "Rèsolucion drêta", - "exif-stripoffsets": "Emplacement de les balyês de l’émâge", + "exif-stripoffsets": "Endrêt de les balyês de l’émâge", "exif-rowsperstrip": "Nombro de legnes per benda", - "exif-stripbytecounts": "Talye en octèts per benda", + "exif-stripbytecounts": "Octèts per benda comprimâye", "exif-jpeginterchangeformat": "Posicion du SOI JPEG", - "exif-jpeginterchangeformatlength": "Talye en octèts de les balyês JPEG", + "exif-jpeginterchangeformatlength": "Octèts de les balyês JPEG", "exif-whitepoint": "Cromaticitât du pouent blanc", "exif-primarychromaticities": "Cromaticitât de les colors primères", "exif-ycbcrcoefficients": "Factors de la matrice de transformacion de l’èspâço colorimètrico", - "exif-referenceblackwhite": "Valors de refèrence nêr et blanc", + "exif-referenceblackwhite": "Cobla de valors de rèference nêr et blanc", "exif-datetime": "Dâta et hora de changement du fichiér", "exif-imagedescription": "Titro de l’émâge", "exif-make": "Fabrecant de l’aparèly-fotô", "exif-model": "Modèlo de l’aparèly-fotô", - "exif-software": "Programeria utilisâ", + "exif-software": "Programeria empleyêe", "exif-artist": "Ôtor", - "exif-copyright": "Dètentor du drêt d’ôtor", + "exif-copyright": "Dètentior des drêts d’ôtor", "exif-exifversion": "Vèrsion Exif", - "exif-flashpixversion": "Vèrsion FlashPix recognua", + "exif-flashpixversion": "Vèrsion Flashpix recognua", "exif-colorspace": "Èspâço colorimètrico", "exif-componentsconfiguration": "Significacion de châque composenta", "exif-compressedbitsperpixel": "Fôrma de comprèssion de l’émâge", "exif-pixelydimension": "Largior de l’émâge", "exif-pixelxdimension": "Hôtior de l’émâge", - "exif-usercomment": "Comentèros a l’usanciér", + "exif-usercomment": "Comentèros de l’utilisator", "exif-relatedsoundfile": "Fichiér ôdiô associyê", - "exif-datetimeoriginal": "Dâta et hora de la g·ènèracion de les balyês", + "exif-datetimeoriginal": "Dâta et hora de la prêsa originâla", "exif-datetimedigitized": "Dâta et hora de la numerisacion", - "exif-subsectime": "Dâta et hora en fraccions de secondes de changement du fichiér", - "exif-subsectimeoriginal": "Dâta et hora en fraccions de secondes de la g·ènèracion de les balyês", - "exif-subsectimedigitized": "Dâta et hora en fraccions de secondes de la numerisacion", + "exif-subsectime": "Dâta et hora en fraccions de seconda", + "exif-subsectimeoriginal": "Dâta et hora de la prêsa originâla en fraccions de seconda", + "exif-subsectimedigitized": "Dâta et hora de la numerisacion en fraccions de seconda", "exif-exposuretime": "Temps d’èxposicion", - "exif-exposuretime-format": "$1 s ($2)", - "exif-fnumber": "Nombro f", + "exif-exposuretime-format": "$1 s ($2 s)", + "exif-fnumber": "Uvèrtura", "exif-exposureprogram": "Programo d’èxposicion", "exif-spectralsensitivity": "Sensibilitât spèctrâla", "exif-isospeedratings": "Sensibilitât ISO", "exif-shutterspeedvalue": "Vitèsse d’ètopâ de l’APEX", "exif-aperturevalue": "Uvèrtura de l’APEX", - "exif-brightnessvalue": "Luminance APEX", - "exif-exposurebiasvalue": "Corrèccion d’èxposicion", - "exif-maxaperturevalue": "Uvèrtura la ples granta", - "exif-subjectdistance": "Distance du sujèt", + "exif-brightnessvalue": "Brilyent de l’APEX", + "exif-exposurebiasvalue": "Corrèccion d’èxposicion de l’APEX", + "exif-maxaperturevalue": "Uvèrtura maximon", + "exif-subjectdistance": "Distance de la chousa", "exif-meteringmode": "Fôrma de mesera", "exif-lightsource": "Sôrsa de lumiére", "exif-flash": "Èludo", "exif-focallength": "Longior focâla", - "exif-subjectarea": "Emplacement du sujèt", - "exif-flashenergy": "Nèrf de l’èludo", + "exif-subjectarea": "Sôl de la chousa", + "exif-flashenergy": "Ènèrg·ia de l’èludo", "exif-focalplanexresolution": "Rèsolucion plana de la vision focâla", "exif-focalplaneyresolution": "Rèsolucion drêta de la vision focâla", "exif-focalplaneresolutionunit": "Unitât de rèsolucion de la vision focâla", - "exif-subjectlocation": "Posicion du sujèt", - "exif-exposureindex": "Endèxe d’èxposicion", + "exif-subjectlocation": "Endrêt de la chousa", + "exif-exposureindex": "Endèx d’èxposicion", "exif-sensingmethod": "Tipo de captior", "exif-filesource": "Sôrsa du fichiér", "exif-scenetype": "Tipo de scèna", "exif-customrendered": "Rendu d’émâge pèrsonalisâ", "exif-exposuremode": "Fôrma d’èxposicion", "exif-whitebalance": "Balance des blancs", - "exif-digitalzoomratio": "Quota d’agrantissement numerico (''zoom'')", - "exif-focallengthin35mmfilm": "Longior focâla por un filme 35 mm", - "exif-scenecapturetype": "Tipo de prêsa de la scèna", - "exif-gaincontrol": "Contrôlo de scèna", - "exif-contrast": "Contraste", + "exif-digitalzoomratio": "Quota d’agrantissement numerico (zoom)", + "exif-focallengthin35mmfilm": "Longior focâla por un filmo 35 mm", + "exif-scenecapturetype": "Tipo de captura de la scèna", + "exif-gaincontrol": "Contrôlo de la scèna", + "exif-contrast": "Contrasto", "exif-saturation": "Saturacion", - "exif-sharpness": "Prècision", + "exif-sharpness": "Nètetât", "exif-devicesettingdescription": "Dèscripcion de la configuracion du dispositif", - "exif-subjectdistancerange": "Distance du sujèt", - "exif-imageuniqueid": "Numerô solèt de l’émâge", + "exif-subjectdistancerange": "Èchiéla de distance de la chousa", + "exif-imageuniqueid": "Identifient solèt de l’émâge", "exif-gpsversionid": "Vèrsion de la balisa GPS", - "exif-gpslatituderef": "Latituda bise (''nord'') ou mié-jorn (''sud'')", + "exif-gpslatituderef": "Latituda bise (nord) ou ben mié-jorn (sud)", "exif-gpslatitude": "Latituda", - "exif-gpslongituderef": "Longituda levant (''èst'') ou ponant (''ouèst'')", + "exif-gpslongituderef": "Longituda levant (èste) ou ben cuchient (ouèste)", "exif-gpslongitude": "Longituda", - "exif-gpsaltituderef": "Refèrence d’hôtior", + "exif-gpsaltituderef": "Rèference d’hôtior", "exif-gpsaltitude": "Hôtior", "exif-gpstimestamp": "Hora GPS (relojo atomico)", - "exif-gpssatellites": "Satèlites utilisâs por la mesera", + "exif-gpssatellites": "Satèlitos empleyês por la mesera", "exif-gpsstatus": "Ètat du recevior", "exif-gpsmeasuremode": "Fôrma de mesera", "exif-gpsdop": "Prècision de la mesera", - "exif-gpsspeedref": "Unitât de vitèsse du recevior GPS", + "exif-gpsspeedref": "Unitât de vitèsse", "exif-gpsspeed": "Vitèsse du recevior GPS", - "exif-gpstrackref": "Refèrence por la dirèccion du mouvement", + "exif-gpstrackref": "Rèference por la dirèccion du mouvement", "exif-gpstrack": "Dirèccion du mouvement", - "exif-gpsimgdirectionref": "Refèrence por la dirèccion de l’émâge", + "exif-gpsimgdirectionref": "Rèference por la dirèccion de l’émâge", "exif-gpsimgdirection": "Dirèccion de l’émâge", - "exif-gpsmapdatum": "Sistèmo g·eodèsico utilisâ", - "exif-gpsdestlatituderef": "Refèrence por la latituda de la dèstinacion", + "exif-gpsmapdatum": "Balyês de sondâjo g·eodèsico empleyêes", + "exif-gpsdestlatituderef": "Rèference por la latituda de la dèstinacion", "exif-gpsdestlatitude": "Latituda de la dèstinacion", - "exif-gpsdestlongituderef": "Refèrence por la longituda de la dèstinacion", + "exif-gpsdestlongituderef": "Rèference por la longituda de la dèstinacion", "exif-gpsdestlongitude": "Longituda de la dèstinacion", - "exif-gpsdestbearingref": "Refèrence por lo relèvament de la dèstinacion", + "exif-gpsdestbearingref": "Rèference por lo relèvament de la dèstinacion", "exif-gpsdestbearing": "Relèvament de la dèstinacion", - "exif-gpsdestdistanceref": "Refèrence por la distance a la dèstinacion", + "exif-gpsdestdistanceref": "Rèference por la distance a la dèstinacion", "exif-gpsdestdistance": "Distance a la dèstinacion", - "exif-gpsprocessingmethod": "Nom du tipo de trètament du GPS", - "exif-gpsareainformation": "Nom de la zona GPS", + "exif-gpsprocessingmethod": "Nom de la mètoda de trètament du GPS", + "exif-gpsareainformation": "Nom du sôl GPS", "exif-gpsdatestamp": "Dâta GPS", "exif-gpsdifferential": "Corrèccion difèrencièla GPS", "exif-jpegfilecomment": "Comentèro de fichiér JPEG", "exif-keywords": "Mots-cllâfs", - "exif-worldregioncreated": "Règ·ion du mondo que la fotô at étâ prêsa", - "exif-countrycreated": "Payis que la fotô at étâ prêsa", - "exif-countrycodecreated": "Code du payis que la fotô at étâ prêsa", - "exif-provinceorstatecreated": "Province ou ben ètat que la fotô at étâ prêsa", - "exif-citycreated": "Vela que la fotô at étâ prêsa", - "exif-sublocationcreated": "Partia de la vela que la fotô at étâ prêsa", - "exif-worldregiondest": "Règ·ion du mondo montrâ", + "exif-worldregioncreated": "Règ·ion du mondo yô que la fotô est étâye prêsa", + "exif-countrycreated": "Payis yô que la fotô est étâye prêsa", + "exif-countrycodecreated": "Code du payis yô que la fotô est étâye prêsa", + "exif-provinceorstatecreated": "Province Ètat yô que la fotô est étâye prêsa", + "exif-citycreated": "Vela yô que la fotô est étâye prêsa", + "exif-sublocationcreated": "Partia de la vela yô que la fotô est étâye prêsa", + "exif-worldregiondest": "Règ·ion du mondo montrâye", "exif-countrydest": "Payis montrâ", "exif-countrycodedest": "Code du payis montrâ", - "exif-provinceorstatedest": "Province ou ben ètat montrâ", - "exif-citydest": "Vela montrâ", - "exif-sublocationdest": "Partia de la vela montrâ", + "exif-provinceorstatedest": "Province Ètat montrâ(ye)", + "exif-citydest": "Vela montrâye", + "exif-sublocationdest": "Partia de la vela montrâye", "exif-objectname": "Titro côrt", "exif-specialinstructions": "Enstruccions spèciâles", "exif-headline": "Titro", "exif-credit": "Crèdit / fornissor", "exif-source": "Sôrsa", "exif-editstatus": "Statut èditoriâl de l’émâge", - "exif-urgency": "Urgence", - "exif-fixtureidentifier": "Nom de l’outil", + "exif-urgency": "Prèssa", + "exif-fixtureidentifier": "Nom de la colona", "exif-locationdest": "Endrêt fotografiâ", "exif-locationdestcode": "Code de l’endrêt fotografiâ", - "exif-objectcycle": "Moment de la jornâ que ceti mèdia est dèstinâ", - "exif-contact": "Enformacions de contacte", + "exif-objectcycle": "Temps de la jornâ que cél mèdiâ y est dèstinâ", + "exif-contact": "Enformacions de contacto", "exif-writer": "Ôtor", "exif-languagecode": "Lengoua", "exif-iimversion": "Vèrsion IIM", - "exif-iimcategory": "Catègorie", - "exif-iimsupplementalcategory": "Catègories de ples", - "exif-datetimeexpires": "Pas utilisar aprés", + "exif-iimcategory": "Catègoria", + "exif-iimsupplementalcategory": "Catègories de més", + "exif-datetimeexpires": "Pas empleyér aprés", "exif-datetimereleased": "Paru lo", - "exif-originaltransmissionref": "Code de l’endrêt de la transmission originâla", - "exif-identifier": "Numerô", - "exif-lens": "Lentelye utilisâ", + "exif-originaltransmissionref": "Code d’endrêt de la transmission originâla", + "exif-identifier": "Identifient", + "exif-lens": "Lentelye empleyêe", "exif-serialnumber": "Numerô de sèria de l’aparèly-fotô", "exif-cameraownername": "Propriètèro de l’aparèly-fotô", "exif-label": "Lambél", "exif-datetimemetadata": "Dâta du dèrriér changement de les mètabalyês", - "exif-nickname": "Nom enformèl de l’émâge", + "exif-nickname": "Nom famelyér de l’émâge", "exif-rating": "Nota (sur 5)", - "exif-rightscertificate": "Cèrtificat d’administracion des drêts", + "exif-rightscertificate": "Cèrtificat de maneyance des drêts", "exif-copyrighted": "Statut des drêts d’ôtor", - "exif-copyrightowner": "Propriètèro du drêt d’ôtor", + "exif-copyrightowner": "Dètentior des drêts d’ôtor", "exif-usageterms": "Condicions d’usâjo", - "exif-webstatement": "Dècllaracion des drêts d’ôtor en legne", - "exif-originaldocumentid": "Numerô solèt du document originâl", - "exif-licenseurl": "URL de la licence", + "exif-webstatement": "Dècllaracion de drêts d’ôtor en legne", + "exif-originaldocumentid": "Identifient solèt du document originâl", + "exif-licenseurl": "URL de la licence des drêts d’ôtor", "exif-morepermissionsurl": "Enformacions sur les licences altèrnatives", - "exif-attributionurl": "Pendent lo reusâjo de cela ôvra, volyéd liyér a", - "exif-preferredattributionname": "Pendent lo reusâjo de cela ôvra, volyéd crèditar", + "exif-attributionurl": "Pendent lo reusâjo de cel’ôvra, se vos plét liyéd a", + "exif-preferredattributionname": "Pendent lo reusâjo de cel’ôvra, se vos plét crèditâd", "exif-pngfilecomment": "Comentèro de fichiér PNG", - "exif-disclaimer": "Avèrtissement", - "exif-contentwarning": "Avèrtissement sur lo contegnu", + "exif-disclaimer": "Semonce de nan-rèsponsabilitât", + "exif-contentwarning": "Semonce sur lo contegnu", "exif-giffilecomment": "Comentèro de fichiér GIF", - "exif-intellectualgenre": "Tipo d’èlèment", - "exif-subjectnewscode": "Code du sujèt", + "exif-intellectualgenre": "Tipo de piéce", + "exif-subjectnewscode": "Code de la chousa", "exif-scenecode": "Code de scèna IPTC", "exif-event": "Èvènement fotografiâ", - "exif-organisationinimage": "Organisacion fotografiâ", - "exif-personinimage": "Pèrsona fotografiâ", - "exif-originalimageheight": "Hôtior de l’émâge devant qu’el èye étâ tornâ cadrar", - "exif-originalimagewidth": "Largior de l’émâge devant qu’el èye étâ tornâ cadrar", - "exif-compression-1": "Pas comprèssâ", - "exif-compression-2": "CCITT tropa 3 longior du codâjo Huffman changiê de dimension 1", - "exif-compression-3": "CCITT tropa 3 codâjo du faxe", - "exif-compression-4": "CCITT tropa 4 codâjo du faxe", + "exif-organisationinimage": "Organisacion fotografiâye", + "exif-personinimage": "Pèrsona fotografiâye", + "exif-originalimageheight": "Hôtior de l’émâge devant que seye étâye recadrâye", + "exif-originalimagewidth": "Largior de l’émâge devant que seye étâye recadrâye", + "exif-compression-1": "Pas damâ", + "exif-compression-2": "CCITT Groupo 3 Longior du codâjo Huffman changiê de dimension 1", + "exif-compression-3": "CCITT Groupo 3 codâjo du faxe", + "exif-compression-4": "CCITT Groupo 4 codâjo du faxe", "exif-compression-6": "JPEG (viely)", - "exif-copyrighted-true": "Somês a drêt d’ôtor", - "exif-copyrighted-false": "Domêno publico", + "exif-copyrighted-true": "Protègiê per los drêts d’ôtor", + "exif-copyrighted-false": "Ètat des drêts d’ôtor pas dèfeni", + "exif-photometricinterpretation-1": "Nêr et blanc (0 por lo nêr)", "exif-unknowndate": "Dâta encognua", "exif-orientation-1": "Normala", - "exif-orientation-2": "Envèrsâ d’aplan", - "exif-orientation-3": "Veriê de 180°", - "exif-orientation-4": "Envèrsâ d’aplomb", - "exif-orientation-5": "Veriê de 90° dens la dirèccion antihorèra et envèrsâ d’aplomb", - "exif-orientation-6": "Veriê de 90° dens la dirèccion antihorèra", - "exif-orientation-7": "Veriê de 90° dens la dirèccion horèra et envèrsâ d’aplomb", - "exif-orientation-8": "Veriê de 90° dens la dirèccion horèra", - "exif-planarconfiguration-1": "Balyês ategnentes", - "exif-planarconfiguration-2": "Balyês sèparâs", + "exif-orientation-2": "Envèrsâye d’aplan", + "exif-orientation-3": "Veriêe de 180°", + "exif-orientation-4": "Envèrsâye d’aplomb", + "exif-orientation-5": "Veriêe de 90° du fllanc antihorèro et envèrsâye d’aplomb", + "exif-orientation-6": "Veriêe de 90° du fllanc antihorèro", + "exif-orientation-7": "Veriêe de 90° du fllanc horèro et envèrsâye d’aplomb", + "exif-orientation-8": "Veriêe de 90° du fllanc horèro", + "exif-planarconfiguration-1": "format en bocons", + "exif-planarconfiguration-2": "format plan", "exif-colorspace-65535": "Pas calibrâ", - "exif-componentsconfiguration-0": "Ègziste pas", + "exif-componentsconfiguration-0": "ègziste pas", "exif-componentsconfiguration-5": "V", "exif-exposureprogram-0": "Pas dèfeni", - "exif-exposureprogram-1": "Manuèl", + "exif-exposureprogram-1": "Manuâl", "exif-exposureprogram-2": "Programo normal", "exif-exposureprogram-3": "Prioritât a l’uvèrtura", "exif-exposureprogram-4": "Prioritât a l’ètopior", "exif-exposureprogram-5": "Programo crèacion (prèference a la provondior de champ)", "exif-exposureprogram-6": "Programo accion (prèference a la vitèsse d’ètopâ)", - "exif-exposureprogram-7": "Fôrma portrèt (por clich·ês de prés avouéc fond pas nèt)", - "exif-exposureprogram-8": "Fôrma payisâjo (por des clich·ês de payisâjos nèts)", - "exif-subjectdistance-value": "$1 mètre{{PLURAL:$1||s}}", + "exif-exposureprogram-7": "Fôrma portrèt (por visions de prés avouéc dèrriér troblo)", + "exif-exposureprogram-8": "Fôrma payisâjo (por visions de payisâjos avouéc dèrriér nèt)", + "exif-subjectdistance-value": "$1 mètro{{PLURAL:$1||s}}", "exif-meteringmode-0": "Encognua", "exif-meteringmode-1": "Moyena", - "exif-meteringmode-2": "Moyena èquilibrâ u centro", + "exif-meteringmode-2": "Moyena d’aplomb u centro", "exif-meteringmode-3": "Pouent", "exif-meteringmode-4": "MultiPouent", "exif-meteringmode-5": "Modèlo", diff --git a/languages/i18n/frr.json b/languages/i18n/frr.json index 0306e65208..e5b41717b7 100644 --- a/languages/i18n/frr.json +++ b/languages/i18n/frr.json @@ -10,7 +10,8 @@ "아라", "Purodha", "Macofe", - "Matma Rex" + "Matma Rex", + "Nemo bis" ] }, "tog-underline": "Ferwisangen onerstrik:", @@ -1252,7 +1253,7 @@ "recentchangeslinked-page": "Sidjennööm:", "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.", "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat", - "recentchanges-page-added-to-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} tu kategorii saat", + "recentchanges-page-added-to-category-bundled": "[[:$1]] an [[Special:WhatLinksHere/$1|{{PLURAL:$2|ian sidj muar|$2 muar sidjen}}]] tu kategorii saat", "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen", "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen", "upload": "Datei huuchschüür", diff --git a/languages/i18n/ga.json b/languages/i18n/ga.json index fce0339619..170d19e1b7 100644 --- a/languages/i18n/ga.json +++ b/languages/i18n/ga.json @@ -151,6 +151,7 @@ "actions": "Gníomhartha", "namespaces": "Ainmspásanna", "variants": "Leaganacha Malartacha", + "navigation-heading": "Roghchlár nascleanúna", "errorpagetitle": "Earráid", "returnto": "Fill ar ais go $1.", "tagline": "Ó {{SITENAME}}.", @@ -268,6 +269,7 @@ "nstab-template": "Teimpléad", "nstab-help": "Cabhair", "nstab-category": "Catagóir", + "mainpage-nstab": "An príomhleathanach", "nosuchaction": "Níl a leithéid de ghníomh ann", "nosuchactiontext": "Níl aithníonn an vicí an gníomh atá ann san URL.\nAn ndearna tú botún san URL, no ar lean tú nasc mícheart?\nAn bhfuil fadhb sna bogearraí atá in usáid ar {{SITENAME}}?", "nosuchspecialpage": "Níl a leithéid de leathanach speisialta ann", @@ -313,9 +315,16 @@ "welcomecreation-msg": "Cruthaíodh do chuntas.", "yourname": "D'ainm úsáideora", "userlogin-yourname": "Ainm úsáideora", + "userlogin-yourname-ph": "Iontráil d'ainm úsáideora", "yourpassword": "D'fhocal faire", + "userlogin-yourpassword": "Pasfhocal", + "userlogin-yourpassword-ph": "Iontráil do phasfhocal", + "createacct-yourpassword-ph": "Iontráil pasfhocal", "yourpasswordagain": "Athiontráil d'fhocal faire", + "createacct-yourpasswordagain": "Deimhnigh an pasfhocal", + "createacct-yourpasswordagain-ph": "Iontráil an pasfhocal arís", "remembermypassword": "Cuimhnigh ar m'fhocal faire ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})", + "userlogin-remembermypassword": "Coinnigh logáilte isteach mé", "yourdomainname": "D'fhearann", "externaldberror": "Bhí earráid bhunachair sonraí ann maidir le fíordheimhniú seachtrach, nóThere was either an external authentication database error or you are not allowed to update your external account.", "login": "Logáil isteach", @@ -325,13 +334,18 @@ "logout": "Logáil amach", "userlogout": "Logáil amach", "notloggedin": "Níl tú logáilte isteach", + "userlogin-noaccount": "Níl cuntas agat?", + "userlogin-joinproject": "Cláraigh le {{SITENAME}}", "nologin": "Nach bhfuil logáil isteach agat? '''$1'''.", "nologinlink": "Cruthaigh cuntas", "createaccount": "Cruthaigh cuntas nua", "gotaccount": "An bhfuil cuntas agat cheana féin? '''$1'''.", "gotaccountlink": "Logáil isteach", "userlogin-resetlink": "Sonraí logála isteach dearmadta agat?", + "userlogin-resetpassword-link": "Pasfhocal dearmadta?", + "userlogin-helplink2": "Cabhair le logáil isteach", "createacct-emailrequired": "Seoladh ríomhphoist", + "createacct-emailoptional": "Seoladh ríomhphoist (roghnach)", "createacct-email-ph": "Iontráil do sheoladh ríomhphoist", "createacct-another-email-ph": "Iontráil seoladh ríomhphoist", "createaccountmail": "le ríomhphost", @@ -376,6 +390,10 @@ "createaccount-title": "Cuntas cruthú le {{SITENAME}}", "createaccount-text": "Chruthaigh duine éigin cuntas do do sheoladh ríomhphoist ar {{SITENAME}} ($4) leis an ainm \"$2\" agus pasfhocal \"$3\". Ba cheart duit logáil isteach agus do phasfhocal a athrú anois. Is féidir leat neamhaird a thabhairt don teachtaireacht seo má cruthaíodh trí earráid í.", "loginlanguagelabel": "Teanga: $1", + "pt-login": "Logáil isteach", + "pt-login-button": "Logáil isteach", + "pt-createaccount": "Cruthaigh cuntas", + "pt-userlogout": "Logáil amach", "php-mail-error-unknown": "Earráid anaithnid i bhfeidhm mail() de chuid PHP", "changepassword": "Athraigh d'fhocal faire", "resetpass_announce": "Tá tú logáilte isteach le cód sealadach a seoladh chugat i r-phost.\nChun d'iarratas logáil isteach a chríochnú, caithfidh tú focal faire nua a roghnú anseo:", @@ -663,21 +681,33 @@ "action-minoredit": "an athrú seo a mharcáil mar mionathrú", "action-upload": "uaslódáil an comhad", "nchanges": "{{PLURAL:$1|Athrú amháin|$1 athruithe}}", + "enhancedrc-history": "stair", "recentchanges": "Athruithe is déanaí", "recentchanges-legend": "Roghanna do na hathruithe is déanaí", "recentchanges-summary": "Déan faire ar na hathruithe is déanaí sa vicí ar an leathanach seo.", "recentchanges-feed-description": "Rianaigh na n-athruite vicí is déanaí sa fotha seo.", + "recentchanges-label-newpage": "Cruthaíodh lch nua leis an eagarthóireacht seo", "recentchanges-label-minor": "Mionathrú é seo", "recentchanges-label-bot": "Chomhlíon róbó an t-athrú seo", + "recentchanges-legend-heading": "Eochair:", "recentchanges-legend-newpage": "$1 - leathanach nua", "rcnotefrom": "Is iad seo a leanas na hathruithe ó $2 (go dti $1 taispeánaithe).", "rclistfrom": "Taispeáin athruithe nua ó $3 $2 anuas", "rcshowhideminor": "$1 mionathruithe", + "rcshowhideminor-show": "Taispeáin", + "rcshowhideminor-hide": "Folaigh", "rcshowhidebots": "$1 róbónna", - "rcshowhideliu": "$1 úsáideoirí atá logáilte isteach", + "rcshowhidebots-show": "Taispeáin", + "rcshowhidebots-hide": "Folaigh", + "rcshowhideliu": "$1 úsáideoir cláraithe", + "rcshowhideliu-hide": "Folaigh", "rcshowhideanons": "$1 úsáideoirí gan ainm", + "rcshowhideanons-show": "Taispeáin", + "rcshowhideanons-hide": "Folaigh", "rcshowhidepatr": "$1 athruithe faoi phatról", "rcshowhidemine": "$1 mo chuid athruithe", + "rcshowhidemine-show": "Taispeáin", + "rcshowhidemine-hide": "Folaigh", "rclinks": "Taispeáin an $1 athrú is déanaí sa $2 lá seo caite
$3", "diff": "difr", "hist": "stair", @@ -688,6 +718,7 @@ "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 (JavaScript riachtanach)", "rc-enhanced-hide": "Folaigh shonraí", @@ -838,6 +869,7 @@ "pager-older-n": "{{PLURAL:$1|1 níos sine|$1 níos sine}}", "booksources": "Leabharfhoinsí", "booksources-search-legend": "Cuardaigh le foinsí leabhar", + "booksources-search": "Cuardaigh", "specialloguserlabel": "Úsáideoir:", "speciallogtitlelabel": "Teideal:", "log": "Logaí", @@ -995,6 +1027,7 @@ "contributions": "Dréachtaí {{GENDER:$1|úsáideora}}", "contributions-title": "Dréachtaí úsáideora do $1", "mycontris": "Dréachtaí", + "anoncontribs": "Dréachtaí", "contribsub2": "Do $1 ($2)", "nocontribs": "Ní bhfuarthas aon athrú a bhí cosúil le na crítéir seo.", "uctop": " (barr)", @@ -1142,7 +1175,7 @@ "tooltip-pt-anonuserpage": "Leathanach úsáideora don IP ina dhéanann tú do chuid athruithe", "tooltip-pt-mytalk": "Do leathanach phlé", "tooltip-pt-anontalk": "Plé maidir le na hathruithe a dhéantar ón seoladh IP seo", - "tooltip-pt-preferences": "Mo chuid sainroghanna", + "tooltip-pt-preferences": "{{GENDER:|Do}} chuid sainroghanna", "tooltip-pt-watchlist": "Liosta de na leathanaigh a bhfuil tú á bhfaire ar athruithe", "tooltip-pt-mycontris": "Liosta do chuid dréachtaí", "tooltip-pt-login": "Moltar duit logáil isteach, ach níl sé riachtanach.", @@ -1231,6 +1264,7 @@ "file-nohires": "Níl aon taifeach is mó ar fáil.", "svg-long-desc": "Comhad SVG, ainmniúil $1 × $2 picteilíni, méid comhaid: $3", "show-big-image": "Taispeáin leagan ardtaifigh den íomhá", + "show-big-image-size": "$1 × $2 picteilín", "newimages": "Gailearaí na n-íomhánna nua", "imagelisttext": "Tá liosta thíos de {{PLURAL:$1|comhad amháin|$1 comhaid $2}}.", "newimages-label": "Comhadainm (nó cuid de):", @@ -1519,7 +1553,9 @@ "specialpages-group-wiki": "Sonraí vicí agus uirslí", "specialpages-group-spam": "Uirlisí turscar", "blankpage": "Leathanach bán", + "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|chlib amháin|clib}}]]: $2)", "htmlform-selectorother-other": "Eile", + "logentry-move-move": "{{GENDER:$2|Bhog}} $1 an leathanach $3 go $4", "feedback-cancel": "Cealaigh", "feedback-message": "Teachtaireacht:", "searchsuggest-search": "Cuardaigh", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index ddd17dd4a5..8312954346 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -163,7 +163,6 @@ "moredotdotdot": "Máis...", "morenotlisted": "Esta lista non está completa.", "mypage": "Páxina", - "anonuserpage": "Usuario descoñecido", "mytalk": "Conversa", "anontalk": "Conversa", "navigation": "Navegación", @@ -1323,9 +1322,9 @@ "recentchangeslinked-page": "Nome da páxina:", "recentchangeslinked-to": "Mostrar os cambios relacionados das páxinas que ligan coa dada", "recentchanges-page-added-to-category": "\"[[:$1]]\" engadiuse á categoría", - "recentchanges-page-added-to-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} engadíronse á categoría", + "recentchanges-page-added-to-category-bundled": "\"[[:$1]]\" e [[Special:WhatLinksHere/$1|{{PLURAL:$2|unha páxina|$2 páxinas}}]] engadíronse á categoría", "recentchanges-page-removed-from-category": "\"[[:$1]]\" eliminouse da categoría", - "recentchanges-page-removed-from-category-bundled": "\"[[:$1]]\" e {{PLURAL:$2|unha páxina|$2 páxinas}} elimináronse da categoría", + "recentchanges-page-removed-from-category-bundled": "\"[[:$1]]\" e [[Special:WhatLinksHere/$1|{{PLURAL:$2|unha páxina|$2 páxinas}}]] elimináronse da categoría", "autochange-username": "Cambio automático de MediaWiki", "upload": "Subir un ficheiro", "uploadbtn": "Subir un ficheiro", @@ -1505,6 +1504,7 @@ "uploadstash-badtoken": "A acción fallou, probablemente porque caducou a información de acceso. Por favor, inténteo de novo.", "uploadstash-errclear": "Fallou o borrado de ficheiros.", "uploadstash-refresh": "Actualizar a lista de ficheiros", + "uploadstash-thumbnail": "ver miniatura", "invalid-chunk-offset": "Desprazamento inválido do fragmento", "img-auth-accessdenied": "Acceso rexeitado", "img-auth-nopathinfo": "Falta a PATH_INFO.\nO seu servidor non está configurado para pasar esta información.\nPode ser que estea baseado en CGI e non soporte img_auth.\nVéxase https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -3586,5 +3586,25 @@ "sessionprovider-generic": "sesións $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies", "sessionprovider-nocookies": "As cookies poden estar desactivadas. Asegúrese de que ten activas as cookies e comece de novo.", - "randomrootpage": "Páxina raíz ao chou" + "randomrootpage": "Páxina raíz ao chou", + "log-action-filter-block": "Tipo de bloqueo:", + "log-action-filter-delete": "Tipo de borrado:", + "log-action-filter-patrol": "Tipo de vixilancia:", + "log-action-filter-protect": "Tipo de protección:", + "log-action-filter-upload": "Tipo de subida:", + "log-action-filter-all": "Todas", + "log-action-filter-block-block": "Bloquear", + "log-action-filter-block-reblock": "Modificación de bloqueo", + "log-action-filter-block-unblock": "Desbloquear", + "log-action-filter-delete-delete": "Borrado de páxinas", + "log-action-filter-delete-restore": "Restauración de páxinas", + "log-action-filter-delete-event": "Borrado de rexistros", + "log-action-filter-delete-revision": "Borrado de revisión", + "log-action-filter-patrol-patrol": "Verificación manual", + "log-action-filter-patrol-autopatrol": "Verificación automática", + "log-action-filter-protect-protect": "Protección", + "log-action-filter-protect-modify": "Modificación de protección", + "log-action-filter-protect-unprotect": "Desproteccion", + "log-action-filter-upload-upload": "Nova subida", + "log-action-filter-upload-overwrite": "Resubida" } diff --git a/languages/i18n/gom-latn.json b/languages/i18n/gom-latn.json index 5343a48124..d2611fe3b1 100644 --- a/languages/i18n/gom-latn.json +++ b/languages/i18n/gom-latn.json @@ -231,7 +231,7 @@ "sort-descending": "Devtea kromacher kromboddh kor", "sort-ascending": "Chodtea kromacher kromboddh kor", "nstab-main": "Pan", - "nstab-user": "Vapuddpeachem pan", + "nstab-user": "Vaporpeachem pan", "nstab-media": "Madheomachem pan", "nstab-special": "Vixex pan", "nstab-project": "Prokolpache pan", @@ -255,7 +255,7 @@ "badtitletext": "Tuven maglelem panache nanv chukichem, rintem, vo ek sarkem zodunk-naslelem bhase-modlem vo wiki-modlem nanv.\n\nTantun ek vo sabaar okxor asot jenka nanvanim uzar korunk zainan.", "viewsource": "Mull polloi", "welcomeuser": "Ievkar, $1!", - "yourname": "Vapuddpeachem nanv:", + "yourname": "Vaporpeachem nanv:", "userlogin-yourname": "Vangdiachem nanv", "userlogin-yourname-ph": "Tujem 'vangdeachem nanv' boroi", "createacct-another-username-ph": "Vapurpeachem nanv boroi", @@ -517,7 +517,7 @@ "rcshowhidebots": "$1 robot", "rcshowhidebots-show": "Dakhoi", "rcshowhidebots-hide": "Lipoi", - "rcshowhideliu": "$1 nond zalele vapuddpi", + "rcshowhideliu": "$1 nond zalele vaporpi", "rcshowhideliu-hide": "Lipoi", "rcshowhideanons": "$1 nanv-naslelim vapurpi", "rcshowhideanons-show": "Dakhoi", @@ -610,7 +610,7 @@ "linksearch-ok": "Sod", "linksearch-line": "$1 $2 savn zoddlelem asa", "listusers-submit": "Dakhoi", - "listgrouprights-members": "(vapuddpeanchi suchi)", + "listgrouprights-members": "(vaporpeanchi suchi)", "emailuser": "Email dhadd", "emailusername": "Vapurpeachem nanv:", "watchlist": "Sadurvolleri", @@ -650,8 +650,8 @@ "namespace_association": "Sombondhit nanvtholl", "tooltip-namespace_association": "Vinchlele nanvthollache sombondhit bhasabhas vo vixoiacho nanvthollakui gheupak hem boks khunnai", "blanknamespace": "(Mukhel)", - "contributions": "{{GENDER:$1|Vapuddpi}} yogdanam", - "contributions-title": "$1 hea vapuddpean kelelim yogdanam", + "contributions": "{{GENDER:$1|Vaporpi}} yogdanam", + "contributions-title": "$1 hea vaporpean kelelim yogdanam", "mycontris": "Yogdanam", "anoncontribs": "Yogdanam", "contribsub2": "{{GENDER:$3|$1}} hacheo ($2)", @@ -664,7 +664,7 @@ "sp-contributions-logs": "sotr", "sp-contributions-talk": "bhasabhas", "sp-contributions-search": "Yogdanam sod", - "sp-contributions-username": "Antorzall namo vo vapuddpeachem nanv:", + "sp-contributions-username": "Antorzall namo vo vaporpeachem nanv:", "sp-contributions-toponly": "Fokot halincheo uzollnneo dakhoi", "sp-contributions-submit": "Sod", "whatlinkshere": "Hanga kitem zoddta", @@ -684,7 +684,7 @@ "whatlinkshere-hideimages": "Failinchim zoddpam $1", "whatlinkshere-filters": "Challnio", "ipboptions": "2 voram:2 hours,1 dis:1 day,3 dis:3 days,1 satollo:1 week,2 satolle:2 weeks,1 mhoino:1 month,3 mhoine:3 months,6 mhoine:6 months,1 voros:1 year,sasnnank:infinite", - "ipblocklist": "Addhailele vapuddpi", + "ipblocklist": "Addhailele vaporpi", "blocklink": "addavnnni", "unblocklink": "Addavnni kadd", "change-blocklink": "Addavnnni bodol", @@ -702,7 +702,7 @@ "allmessagesdefault": "Falta sondex mozkur", "thumbnail-more": "Vhodlem kor", "thumbnail_error": "Lhan-imaz toiar kortana chuk zali. Karonn: $1", - "tooltip-pt-userpage": "{{GENDER:|Tujem vapuddpachem}} pan", + "tooltip-pt-userpage": "{{GENDER:|Tujem vaporpeachem}} pan", "tooltip-pt-mytalk": "{{GENDER:|Tumchem}} bhasabhasachem pan", "tooltip-pt-preferences": "{{GENDER:|Tumcheo}} avddi", "tooltip-pt-watchlist": "Bodlachea dekhrekh korpachea panachi volleri", @@ -734,14 +734,14 @@ "tooltip-t-whatlinkshere": "Hanga zoddlelea sogllea wiki pananchi volleri", "tooltip-t-recentchangeslinked": "Hea panak-sun zoddlelea panachim halinche bodol", "tooltip-feed-atom": "Hea panak Atom purovnni", - "tooltip-t-contributions": "{{GENDER:$1|Hea vapuddpeachea}} yogdanachi suchi", - "tooltip-t-emailuser": "{{GENDER:$1|Hea vapuddpeak}} email patthoi", + "tooltip-t-contributions": "{{GENDER:$1|Hea vaporpeachea}} yogdanachi suchi", + "tooltip-t-emailuser": "{{GENDER:$1|Hea vaporpeak}} email dhadd", "tooltip-t-upload": "Faili upload kor", "tooltip-t-specialpages": "Sogllea vixex pananchi volleri", "tooltip-t-print": "Hea panachem chap'pakyogya avrutti", "tooltip-t-permalink": "Hea panache hea uzollnnek togpi zoddni", "tooltip-ca-nstab-main": "Mozkur pan polloi", - "tooltip-ca-nstab-user": "Vapuddpeachem pan polloi", + "tooltip-ca-nstab-user": "Vaporpeachem pan polloi", "tooltip-ca-nstab-special": "Hem ek kherit pan, ani hem bodlunk zaina", "tooltip-ca-nstab-project": "Prokolpachem pan polloi", "tooltip-ca-nstab-image": "Failichem pan polloi", diff --git a/languages/i18n/gsw.json b/languages/i18n/gsw.json index 77cfb9e892..6a82cac1af 100644 --- a/languages/i18n/gsw.json +++ b/languages/i18n/gsw.json @@ -1237,7 +1237,7 @@ "recentchangeslinked-page": "Syte:", "recentchangeslinked-to": "Zeig Änderige uf Syte, wu uff die Syte verwyyse", "recentchanges-page-added-to-category": "[[:$1]] zur Kategorie derzue ta", - "recentchanges-page-added-to-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte zur Kategorie derzue ta", + "recentchanges-page-added-to-category-bundled": "[[:$1]] und [[Special:WhatLinksHere/$1|{{PLURAL:$2|ei|$2}}]] anderi Syte zur Kategorie derzue ta", "recentchanges-page-removed-from-category": "[[:$1]] vor Kategorie furtgnoh", "recentchanges-page-removed-from-category-bundled": "[[:$1]] und {{PLURAL:$2|ei|$2}} anderi Syte vor Kategorie furtgnoh", "autochange-username": "Automatischi MediaWiki-Änderig", diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json index 35bdcc0e72..804c4f9c14 100644 --- a/languages/i18n/gu.json +++ b/languages/i18n/gu.json @@ -164,7 +164,7 @@ "morenotlisted": "આ યાદી પૂર્ણ નથી.", "mypage": "પાનું", "mytalk": "ચર્ચા", - "anontalk": "આ IP માટેનું ચર્ચા પાનું", + "anontalk": "ચર્ચા", "navigation": "ભ્રમણ", "and": " અને", "qbfind": "શોધો", @@ -423,7 +423,7 @@ "createacct-reason": "કારણ", "createacct-reason-ph": "તમે કેમ બીજું ખાતું બનાવો છો", "createacct-submit": "તમારું ખાતું બનાવો", - "createacct-another-submit": "બીજું ખાતું બનાવો", + "createacct-another-submit": "ખાતું બનાવો", "createacct-benefit-heading": "{{SITENAME}} એ તમારા જેવા લોકોએ બનાવેલ છે.", "createacct-benefit-body1": "{{PLURAL:$1|ફેરફાર|ફેરફારો}}", "createacct-benefit-body2": "{{PLURAL:$1|પાનું|પાનાં}}", @@ -547,7 +547,7 @@ "sig_tip": "સમયછાપ સાથે તમારા હસ્તાક્ષર", "hr_tip": "આડી લીટી (શક્ય તેટલો ઓછો ઉપયોગ કરો)", "summary": "સારાંશ:", - "subject": "વિષય/શીર્ષક:", + "subject": "વિષય:", "minoredit": "આ એક નાનો સુધારો છે", "watchthis": "આ પાનાને ધ્યાનમાં રાખો", "savearticle": "પાનું સાચવો", @@ -1506,8 +1506,8 @@ "apihelp-no-such-module": "સાધન જૂથ \"$1\" ન મળ્યું.", "apisandbox-submit": "વિનંતી કરો", "apisandbox-reset": "સાફ કરો", - "apisandbox-examples": "ઉદાહરણ", - "apisandbox-results": "પરિણામ", + "apisandbox-examples": "ઉદાહરણો", + "apisandbox-results": "પરિણામો", "booksources": "પુસ્તક સ્રોત", "booksources-search-legend": "પુસ્તક સ્રોત શોધો", "booksources-isbn": "આઇએસબીએન:", @@ -1957,7 +1957,7 @@ "movenotallowedfile": "તમને ફાઈલ ખસેડવાની પરવાનગી નથી.", "cant-move-user-page": "તમને સભ્ય પાના હટાવવાની પરવાનગી નથી (ઉપપાના સિવાય).", "cant-move-to-user-page": "તમને કોઇ પાનાને સભ્ય પાનામાં ખસેડવાની પ્રવાનગી નથી (સિવાય કે સભ્ય ઉપપાના)", - "newtitle": "આ નવું નામ આપો:", + "newtitle": "નવું શીર્ષક:", "move-watch": "આ પાનું ધ્યાનમાં રાખો", "movepagebtn": "પાનું ખસેડો", "pagemovedsub": "પાનું સફળતા પૂર્વક ખસેડવામાં આવ્યું છે", @@ -2127,7 +2127,7 @@ "tooltip-feed-rss": "આ પાના માટે આર.એસ.એસ. ફીડ", "tooltip-feed-atom": "આ પાના માટે એટમ ફીડ", "tooltip-t-contributions": "{{GENDER:$1|આ સભ્ય}} વડે કરાયેલા યોગદાનોની યાદી", - "tooltip-t-emailuser": "આ સભ્યને ઇ-મેલ મોકલો", + "tooltip-t-emailuser": "{{GENDER:$1|આ સભ્ય}}ને ઇમેલ મોકલો", "tooltip-t-info": "આ પાનાં વિષે વધુ માહિતી", "tooltip-t-upload": "ફાઇલ ચડાવો", "tooltip-t-specialpages": "બધા ખાસ પાનાંઓની યાદી", @@ -2949,7 +2949,7 @@ "expand_templates_ok": "મંજૂર", "expand_templates_remove_comments": "ટીપ્પણીઓ દૂર કરો", "expand_templates_preview": "પૂર્વાવલોકન", - "pagelanguage": "પાનાની ભાષાનો ચયનકર્તા", + "pagelanguage": "પાનાની ભાષા બદલો", "pagelang-name": "પાનું", "pagelang-language": "ભાષા", "pagelang-use-default": "(મૂળભુત ભાષા)", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 49605f4faa..7c9e9621d8 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -174,7 +174,6 @@ "moredotdotdot": "עוד…", "morenotlisted": "רשימה זו אינה מלאה.", "mypage": "דף משתמש", - "anonuserpage": "משתמש לא ידוע", "mytalk": "שיחה", "anontalk": "שיחה", "navigation": "ניווט", @@ -494,7 +493,7 @@ "noemail": "לא רשומה כתובת דואר אלקטרוני עבור ה{{GENDER:$1|משתמש|משתמשת}} \"$1\".", "noemailcreate": "יש לספק כתובת דואר אלקטרוני תקינה.", "passwordsent": "סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור \"$1\".\nאנא היכנסו חזרה לאתר אחרי שתקבלו אותה.", - "blocked-mailpassword": "כתובת ה־IP שלך נחסמה מעריכה, ולפיכך אינך מורשה להשתמש באפשרות שחזור הסיסמה, וזאת כדי למנוע ניצול לרעה של התכונה.", + "blocked-mailpassword": "כתובת ה־IP שלך נחסמה מעריכה. אינך מורשה להשתמש באפשרות שחזור הסיסמה, וזאת כדי למנוע ניצול לרעה של התכונה.", "eauthentsent": "דוא\"ל אימות נשלח לכתובת הדוא\"ל שצוינה.\nלפני שדברי דוא\"ל אחרים יישלחו לחשבון הזה, יהיה עליכם לפעול לפי ההוראות בדוא\"ל, כדי לאשר שהחשבון אכן שייך לכם.", "throttled-mailpassword": "כבר נשלח דוא\"ל לאיפוס הסיסמה ב{{PLURAL:$1|שעה האחרונה|שעתיים האחרונות|Ö¾$1 השעות האחרונות}}.\nכדי למנוע ניצול לרעה, יכול להישלח רק דוא\"ל אחד כזה בכל {{PLURAL:$1|שעה|שעתיים|$1 שעות}}.", "mailerror": "שגיאה בשליחת דואר: $1", @@ -768,7 +767,7 @@ "parser-unstrip-loop-warning": "נמצאה לולאה בפריסה", "parser-unstrip-recursion-limit": "עומק הרקורסיה של הפריסה עבר את המגבלה ($1)", "converter-manual-rule-error": "התגלתה שגיאה בכלל המרת שפה ידני", - "undo-success": "ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.", + "undo-success": "ניתן לבטל את העריכה.\nאנא בִּדקו את השוואת הגרסאות למטה כדי לוודא שזה אכן מה שאתם רוצים לעשות, ואז שִׁמרו את השינויים למטה כדי לבצע את ביטול העריכה.", "undo-failure": "לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.", "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.", "undo-nochange": "נראה שהעריכה כבר בוטלה.", @@ -1334,9 +1333,9 @@ "recentchangeslinked-page": "שם הדף:", "recentchangeslinked-to": "הצגת השינויים בדפים המקשרים לדף הנתון במקום זאת", "recentchanges-page-added-to-category": "הדף [[:$1]] נוסף לקטגוריה", - "recentchanges-page-added-to-category-bundled": "הדף [[:$1]] {{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}} נוספו לקטגוריה", + "recentchanges-page-added-to-category-bundled": "הדף [[:$1]] [[Special:WhatLinksHere/$1|{{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}}]] נוספו לקטגוריה", "recentchanges-page-removed-from-category": "הדף [[:$1]] הוסר מקטגוריה", - "recentchanges-page-removed-from-category-bundled": "הדף [[:$1]] {{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}} הוסרו מקטגוריה", + "recentchanges-page-removed-from-category-bundled": "הדף [[:$1]] [[Special:WhatLinksHere/$1|{{PLURAL:$2|ועוד דף אחד|ועוד $2 דפים}}]] הוסרו מקטגוריה", "autochange-username": "שינוי אוטומטי של מדיה־ויקי", "upload": "העלאת קובץ לשרת", "uploadbtn": "העלאה", @@ -1516,6 +1515,7 @@ "uploadstash-badtoken": "ביצוע הפעולה נכשל, אולי בגלל פקיעת תוקפו של אסימון העריכה שלכם. נא לנסות שוב.", "uploadstash-errclear": "מחיקת הקבצים נכשלה.", "uploadstash-refresh": "רענון רשימת הקבצים", + "uploadstash-thumbnail": "הצגת תמונה ממוזערת", "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.", @@ -1816,15 +1816,15 @@ "log-edit-tags": "עריכת התגיות של רשומות היומן שנבחרו", "checkbox-select": "בחירה: $1", "checkbox-all": "הכול", - "checkbox-none": "לא כלום", - "checkbox-invert": "להפוך", + "checkbox-none": "כלום", + "checkbox-invert": "הפיכה", "allpages": "כל הדפים", "nextpage": "הדף הבא ($1)", "prevpage": "הדף הקודם ($1)", "allpagesfrom": "הצגת דפים החל מ:", "allpagesto": "הצגת דפים עד:", "allarticles": "כל הדפים", - "allinnamespace": "כל הדפים (מרחב שם $1)", + "allinnamespace": "כל הדפים (מרחב השם $1)", "allpagessubmit": "הצגה", "allpagesprefix": "הדפים ששמם מתחיל ב־:", "allpagesbadtitle": "כותרת הדף שניתנה הייתה בלתי־תקינה או שהייתה בה קידומת של קישור לשפה אחרת או לוויקי אחר.\nייתכן שהיא מכילה תו אחד או יותר האסורים לשימוש בכותרות.", @@ -2326,7 +2326,7 @@ "movepage-moved-redirect": "נוצרה הפניה.", "movepage-moved-noredirect": "יצירת ההפניה בוטלה.", "articleexists": "קיים כבר דף באותו שם, או שהשם שבחרת אינו תקין.\nנא לבחור שם אחר.", - "cantmove-titleprotected": "אינך מורשה להעביר את הדף לשם זה כיוון שהשם החדש מוגן מפני יצירה", + "cantmove-titleprotected": "אין באפשרותכם להעביר את הדף לשם זה משום שהשם החדש מוגן מפני יצירה.", "movetalk": "העברה גם של דף השיחה", "move-subpages": "העברת כל דפי המשנה (עד $1)", "move-talk-subpages": "העברת כל דפי המשנה של דף השיחה (עד $1)", @@ -2504,7 +2504,7 @@ "tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}", "tooltip-t-info": "מידע נוסף על דף זה", "tooltip-t-upload": "העלאת קבצים", - "tooltip-t-specialpages": "רשימת כל הדפים המיוחדים", + "tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים", "tooltip-t-print": "גרסה להדפסה של דף זה", "tooltip-t-permalink": "קישור קבוע לגרסה זו של הדף", "tooltip-ca-nstab-main": "צפייה בדף התוכן", @@ -3438,7 +3438,7 @@ "revdelete-uname-unhid": "הסתרת שם המשתמש בוטלה", "revdelete-restricted": "נוספו הגבלות למפעילי מערכת", "revdelete-unrestricted": "הוסרו הגבלות ממפעילי מערכת", - "logentry-block-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6", + "logentry-block-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} למשך $5 $6", "logentry-block-unblock": "$1 {{GENDER:$2|שחרר|שחררה}} את החסימה של {{GENDER:$4|$3}}", "logentry-block-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6", "logentry-suppress-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6", @@ -3446,9 +3446,9 @@ "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ", "logentry-import-upload-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})", "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מאתר ויקי אחר", - "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מ־$5 ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})", + "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מ־$5‏ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})‏", "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את $3 לתוך $4 (גרסאות עד $5)", - "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}", + "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}‏", "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה", "logentry-move-move_redir": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה", "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להשאיר הפניה", @@ -3461,8 +3461,8 @@ "logentry-newusers-autocreate": "חשבון המשתמש $1 {{GENDER:$2|נוצר}} אוטומטית", "logentry-protect-move_prot": "$1 {{GENDER:$2|העביר|העבירה}} את הגדרות ההגנה מהדף $4 אל הדף $3", "logentry-protect-unprotect": "$1 {{GENDER:$2|הסיר|הסירה}} את ההגנה מהדף $3", - "logentry-protect-protect": "$1 {{GENDER:$2|הגן|הגנה}} על הדף $3 $4", - "logentry-protect-protect-cascade": "$1 {{GENDER:$2|הגן|הגנה}} על הדף $3 $4 [מדורג]", + "logentry-protect-protect": "$1 {{GENDER:$2|הפעיל|הפעילה}} הגנה על הדף $3 $4", + "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|שינה|שינתה}} את ההרשאות של $3 מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}‏", @@ -3673,5 +3673,25 @@ "sessionprovider-generic": "התחברויות של $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות", "sessionprovider-nocookies": "ייתכן שאפשרות השימוש בעוגיות כבויה. יש לוודא שאפשרות השימוש בעוגיות מופעלת ולהתחיל מחדש.", - "randomrootpage": "דף שורש אקראי" + "randomrootpage": "דף שורש אקראי", + "log-action-filter-block": "סוג החסימות:", + "log-action-filter-delete": "סוג המחיקות:", + "log-action-filter-patrol": "סוג השינויים הבדוקים:", + "log-action-filter-protect": "סוג ההגנות:", + "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-delete-delete": "מחיקת דפים", + "log-action-filter-delete-restore": "שחזור דפים מחוקים", + "log-action-filter-delete-event": "מחיקת יומנים", + "log-action-filter-delete-revision": "מחיקת גרסאות", + "log-action-filter-patrol-patrol": "סימוניים ידניים כבדוק", + "log-action-filter-patrol-autopatrol": "סימונים אוטומטיים כבדוק", + "log-action-filter-protect-protect": "הגנות", + "log-action-filter-protect-modify": "שינויי הגנה", + "log-action-filter-protect-unprotect": "הסרות הגנה", + "log-action-filter-upload-upload": "העלאות חדשות", + "log-action-filter-upload-overwrite": "דריסת קבצים קיימים" } diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index e0df548499..3dfd4bb6e2 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -71,7 +71,9 @@ "Niharika29", "जनक राज भट्ट", "YmKavishwar", - "Upendradutt93" + "Upendradutt93", + "Nemo bis", + "Wassan.anmol" ] }, "tog-underline": "कड़ियाँ अधोरेखन:", @@ -212,7 +214,6 @@ "moredotdotdot": "और...", "morenotlisted": "यह सूची पूर्ण नहीं है।", "mypage": "पृष्ठ", - "anonuserpage": "अज्ञात सदस्य", "mytalk": "वार्ता", "anontalk": "वार्ता", "navigation": "भ्रमण", @@ -382,7 +383,7 @@ "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।", "readonly": "डाटाबेस लॉक किया हुआ है", "enterlockreason": "लॉक करने का कारण दीजिए, साथ ही लॉक खुलने के समय का लगभग आकलन दीजिये।", - "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1", + "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस कार्यकारी प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1", "missing-article": "डाटाबेस में $2 के अंदर कहीं भी \"$1\" नहीं मिला।\n\nआम तौर पर हटाए जा चुके पृष्ठ की इतिहास कड़ी का प्रयोग करने पर ऐसा होता है।\n\nअगर ऐसा नहीं है, तो शायद आपने सॉफ़्टवेयर में त्रुटि खोज ली है।\nकृपया यू॰आर॰एल पते समेत किसी [[Special:ListUsers/sysop|प्रबंधक]] को इसका ब्यौरा दें।", "missingarticle-rev": "(अवतरण#: $1)", "missingarticle-diff": "(अंतर: $1, $2)", @@ -439,7 +440,7 @@ "mypreferencesprotected": "आपके पास अपनी वरीयताएँ बदलने की अनुमति नहीं है।", "ns-specialprotected": "विशेष पृष्ठ सम्पादित नहीं किये जा सकते।", "titleprotected": "सदस्य [[User:$1|$1]] ने इस शीर्षक का पृष्ठ बनाने से सुरक्षित किया हुआ है।\nइसके लिये निम्न कारण दिया गया है: $2", - "filereadonlyerror": "\"$1\" फ़ाइल को बदलने में असक्षम क्योंकि भण्डार \"$2\" इस समय 'केवल पाठन हेतु' (रीड ओनली) है।\n\nजिस प्रबंधक ने ये प्रबंध लगाया है उन्होंने निम्न विवरण प्रदान किया है: \"$3\"।", + "filereadonlyerror": "\"$1\" फ़ाइल को बदलने में असक्षम क्योंकि भण्डार \"$2\" इस समय 'केवल पाठन हेतु' (रीड ओनली) है।\n\nजिस कार्यकारी प्रबंधक ने ये प्रबंध लगाया है उन्होंने निम्न विवरण प्रदान किया है: \"$3\"।", "invalidtitle-knownnamespace": "\"$2\" नामस्थान और \"$3\" नाम वाला गलत शीर्षक", "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 और नाम \"$2\" वाला गलत शीर्षक", "exception-nologin": "लॉग इन नहीं किया है", @@ -727,7 +728,7 @@ "continue-editing": "संपादन क्षेत्र को जाएँ", "previewconflict": "यह झलक ऊपरी पाठ सम्पादन क्षेत्र में हुए बदलाव दिखाती है, और यदि आप अभी संजोते हैं तो यही पाठ संजोया जाएगा।", "session_fail_preview": "'''क्षमा करें! सेशन डाटा के नष्ट होने के कारण आपके बदलाव संजोये नहीं जा सके।'''\nकृपया पुन: यत्न करें। अगर इसके बाद भी ऐसा ही होता है तो कृपया [[Special:UserLogout|लॉग आउट]] कर के पुनः लॉग इन करें।", - "session_fail_preview_html": "'''क्षमा करें! सेशन डाटा के नष्ट होने के कारण आपके बदलाव संजोये नहीं जा सके।'''\n\n''चूँकि {{SITENAME}} पर raw HTML सक्षम है, जावास्क्रिप्ट हमलों से बचाव के लिये झलक नहीं दिखाई गई है।''\n\n'''अगर यह आपका वैध संपादन यत्न था, तो कृपया पुनः यत्न करें।'''\nअगर इसके बाद भी ऐसा ही होता है तो कृपया [[Special:UserLogout|लॉग आउट]] कर के पुनः लॉग इन करें।", + "session_fail_preview_html": "क्षमा करें! सेशन डाटा के नष्ट होने के कारण आपके बदलाव संजोये नहीं जा सके।\n\nचूँकि {{SITENAME}} पर raw HTML सक्षम है, जावास्क्रिप्ट हमलों से बचाव के लिये झलक नहीं दिखाई गई है।\n\nअगर यह आपका वैध संपादन यत्न था, तो कृपया पुनः यत्न करें।\nअगर इसके बाद भी ऐसा ही होता है तो कृपया [[Special:UserLogout|लॉग आउट]] कर के पुनः लॉग इन करें तथा जांचिए यदि आपका ब्राउज़र इस साइट से कुकीज़ की अनुमति देता है।", "token_suffix_mismatch": "'''आपके द्वारा किये गये बदलाव रद्द कर दिये गये हैं क्योंकि आपके क्लायंट ने आपके संपादन टोकन में दिये हुए विरामचिन्हों में बदलाव किये हैं।'''\nलेख के पाठ में खराबी ना आये इसलिये आपके बदलाव रद्द कर दिये गये हैं।\nऐसा तब भी हो सकता है यदि आप कोई खराब वेब-आधारित अनामक प्रौक्सी प्रयोग कर रहे हों।", "edit_form_incomplete": "'''सम्पादन फ़ॉर्म के कुछ भाग सर्वर तक नहीं पहुँच पाए; जाँच लें कि आपके द्वारा किये बदलाव अक्षुण्ण हैं, और सहेजने का पुनः यत्न करें।'''", "editing": "$1 सम्पादन", @@ -745,7 +746,7 @@ "copyrightwarning2": "{{SITENAME}} पर किया कोई भी योगदान अन्य सदस्यों द्वारा बदला जा सकता है और हटाया भी जा सकता है।\nअगर आपको अपने लिखे हुए पाठ में संपादन होना नामंजूर है तो यहाँ पर न लिखें।
\nआप हमें यह भी वचन देतें हैं कि यह आपने स्वयं लिखा है अथवा सार्वजनिक क्षेत्र या किसी समान मुक्त स्रोत से प्रतिलिपित किया है (अधिक जानकारी के लिये $1 देखें)।\n'''कॉपीराइट सुरक्षित कार्यों को बिना अनुमति के यहाँ न डालें!'''", "editpage-cannot-use-custom-model": "इस पृष्ठ का मुख्य सामग्री परिवर्तित नहीं हुआ।", "longpageerror": "'''त्रुटि: आपका दिया हुआ पाठ {{PLURAL:|$1 किलोबाइट|$1 किलोबाइट}} लंबा है, जो {{PLURAL:|$2 किलोबाइट|$2 किलोबाइट}} की सीमा से बाहर है।\nइसे संजोया नहीं जा सकता।'''", - "readonlywarning": "'''सावधान: डाटाबेस को रख-रखाव के लिये बंद कर दिया गया है, इसलिये अभी आपके बदलाव संजोए नहीं जा सकते।\nअगर आप चाहें तो इस सामग्री को बाद के लिए कॉपी-पेस्ट कर के किसी टेक्स्ट फ़ाइल में रख सकते हैं।'''\n\nबंद करने वाले प्रबंधक ने बंद करने का यह कारण दिया है: $1", + "readonlywarning": "सावधान: डाटाबेस को रख-रखाव के लिये बंद कर दिया गया है, इसलिये अभी आपके बदलाव संजोए नहीं जा सकते।\nअगर आप चाहें तो इस सामग्री को बाद के लिए कॉपी-पेस्ट कर के किसी टेक्स्ट फ़ाइल में रख सकते हैं।\n\nबंद करने वाले कार्यकारी प्रबंधक ने बंद करने का यह कारण दिया है: $1", "protectedpagewarning": "'''चेतावनी: इस पृष्ठ को सुरक्षित कर दिया गया है और इसे केवल प्रबंधक ही सम्पादित कर सकते हैं।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:", "semiprotectedpagewarning": "'''सूचना:''' यह पृष्ठ सुरक्षित कर दिया गया है और इसे केवल पंजीकृत सदस्य ही सम्पादित कर सकते हैं।\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:", "cascadeprotectedwarning": "'''सावधान:''' यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल प्रबंधक ही इसमें बदलाव कर सकते हैं:", @@ -764,7 +765,7 @@ "permissionserrors": "अधिकार त्रुटि", "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणों}} से आपको ऐसा करने की अनुमति नहीं हैं:", "permissionserrorstext-withaction": "आपको $2 की अनुमति नहीं हैं, निम्नलिखित {{PLURAL:$1|कारण|कारणों}} की वजह से:", - "contentmodelediterror": "आप इस पृष्ठ का इतिहास में सम्पादन नहीं कर सकते हैं क्योंकि इसका सामग्री $1, और वर्तमान सामग्री $2 है।", + "contentmodelediterror": "आप इस पृष्ठ का इतिहास में सम्पादन नहीं कर सकते हैं क्योंकि इसका सामग्री $1, जो की वर्तमान सामग्री से $2 अलग है।", "recreate-moveddeleted-warn": "'''चेतावनी: आप एक पहले हटाए गए पृष्ठ को पुनर्निर्मित कर रहे हैं।'''\n\nआप को विचार करना चाहिये कि क्या इस पृष्ठ का संपादन जारी रखना उचित होगा।\nइस पृष्ट के हटाने व स्थानांतरण का लॉग सुविधा के लिये उपलब्ध है:", "moveddeleted-notice": "यह पृष्ठ हटाया जा चुका है।\nपृष्ठ के हटाने और स्थानांतरण का लॉग संदर्भ के लिए नीचे दिया गया है।", "moveddeleted-notice-recent": "क्षमा करें, यह पृष्ठ कुछ ही समय पहले हटाया गया है। (24 घण्टों के भीतर)\nइसके हटाये और स्थानांतरित करने का लोग नीचे दिया हुआ है।", @@ -894,7 +895,7 @@ "revdelete-unsuppress": "पुनर्स्थापित अवतरणों पर से प्रतिबन्ध हटाएँ", "revdelete-log": "कारण:", "revdelete-submit": "चयनित {{PLURAL:$1|अवतरण|अवतरणों}} पर लागू करें", - "revdelete-success": "'''अवतरण दृश्यता सफलतापूर्वक अद्यातानीत की गई।'''", + "revdelete-success": "अवतरण दृश्यता सफलतापूर्वक अद्यातानीत की गई।", "revdelete-failure": "'''अवतरण दृश्यता अद्यातानीत नहीं की जा सकी:'''\n$1", "logdelete-success": "लॉग दृष्यता बदली गई।", "logdelete-failure": "'''लॉग दृश्यता का जमाव नहीं किया जा सका:'''\n$1", @@ -1377,9 +1378,9 @@ "recentchangeslinked-page": "पृष्ठ नाम:", "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें", "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जुड़ा", - "recentchanges-page-added-to-category-bundled": "[[:$1]] और {{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}} श्रेणी में जुड़ा", + "recentchanges-page-added-to-category-bundled": "[[:$1]] और [[Special:WhatLinksHere/$1|{{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}}]] श्रेणी में जुड़ा", "recentchanges-page-removed-from-category": "[[:$1]] श्रेणी से हटा", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] और {{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}} श्रेणी से हटा", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] और [[Special:WhatLinksHere/$1|{{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}}]] श्रेणी से हटा", "autochange-username": "मीडियाविकि स्वतः परिवर्तन", "upload": "फ़ाइल अपलोड करें", "uploadbtn": "फ़ाइल अपलोड करें", @@ -1559,6 +1560,7 @@ "uploadstash-badtoken": "वह कार्य असफल रहा, सम्भवतः आपके सम्पादन प्रमाणपत्र की अवधि समाप्त हो गई है। पुनः प्रयास करें।", "uploadstash-errclear": "फ़ाइलों को साफ़ करना असफल रहा।", "uploadstash-refresh": "फ़ाइलों की सूची रिफ़्रेश करें", + "uploadstash-thumbnail": "छवि देखें", "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट", "img-auth-accessdenied": "अनुमति नहीं है", "img-auth-nopathinfo": "PATH_INFO मौजूद नहीं है।\nआपके सर्वर में इस जानकारी को भेजने के लिए जमाव नहीं है।\nयह सी॰जी॰आई-आधारित हो सकता है और img_auth को स्वीकार नहीं करता है।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखें।", @@ -1813,7 +1815,7 @@ "apisandbox-fullscreen": "विस्तार करें", "apisandbox-fullscreen-tooltip": "ब्राउज़र को पूरी तरह भरने हेतु विस्तार करें।", "apisandbox-unfullscreen": "पृष्ठ दिखाएँ", - "apisandbox-unfullscreen-tooltip": "प्रयोगपृष्ठ हिस्से को छोटा करें, जिससे मीडियाविकि के संचरण कड़ी उपलब्ध हो जाएगा। \\", + "apisandbox-unfullscreen-tooltip": "प्रयोगपृष्ठ हिस्से को छोटा करें, जिससे मीडियाविकि के संचरण कड़ी उपलब्ध हो जाएगा।", "apisandbox-submit": "अनुरोध करें", "apisandbox-reset": "स्पष्ट", "apisandbox-retry": "दुबारा प्रयास करें", @@ -1965,7 +1967,7 @@ "emailccsubject": "आपके ई-मेल की प्रति जो $1 को भेजा गया: $2", "emailsent": "ई-मेल भेज दिया गया है।", "emailsenttext": "आपका ई-मेल संदेश भेज दिया गया है।", - "emailuserfooter": "इस ई-मेल को $1 द्वारा $2 को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।", + "emailuserfooter": "इस ई-मेल को $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}} को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।", "usermessage-summary": "प्रणाली सन्देश छोड़ रहा है।", "usermessage-editor": "सिस्टम दूत", "watchlist": "ध्यानसूची", @@ -1975,7 +1977,7 @@ "watchlistanontext": "अपनी ध्यानसूची में मौजूद पृष्ठ देखने या फिर संपादित करने के लिये कॄपया लॉग इन करें।", "watchnologin": "लॉग इन नहीं किया है", "addwatch": "ध्यानसूची में जोड़ें", - "addedwatchtext": "आपकी [[Special:Watchlist|ध्यानसूची]] में \"[[:$1]]\" पृष्ठ जोड़ दिया गया है।\nभविष्य में इस पृष्ठ तथा इसके वार्ता पृष्ठ में होने वाले बदलाव आपकी ध्यानसूची में दिखेंगे।", + "addedwatchtext": "आपकी [[Special:Watchlist|ध्यानसूची]] में \"[[:$1]]\" और इसके चर्चा पृष्ठ जोड़ दिए गए हैं।", "addedwatchtext-short": "पृष्ठ \"$1\" को आपकी ध्यानसूची से जोड़ा गया है।", "removewatch": "ध्यानसूची से हटाएँ", "removedwatchtext": "\"[[:$1]]\" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index e6565237ee..3489cc957f 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -1332,7 +1332,7 @@ "recentchangeslinked-page": "Lap neve:", "recentchangeslinked-to": "Inkább az erre linkelő lapok változtatásait mutasd", "recentchanges-page-added-to-category": "[[:$1]] hozzáadva a kategóriához", - "recentchanges-page-added-to-category-bundled": "[[:$1]] és {{PLURAL:$2|egy oldal|$2 oldal}} hozzáadva a kategóriához", + "recentchanges-page-added-to-category-bundled": "[[:$1]] és [[Special:WhatLinksHere/$1|{{PLURAL:$2|egy oldal|$2 oldal}}]] hozzáadva a kategóriához", "recentchanges-page-removed-from-category": "[[:$1]] eltávolítva a kategóriából", "recentchanges-page-removed-from-category-bundled": "[[:$1]] és {{PLURAL:$2|egy oldal|$2 oldal}} eltávolítva a kategóriából", "upload": "Fájl feltöltése", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index 922803ae01..244c5aa099 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -129,6 +129,8 @@ "october-date": "$1 de octobre", "november-date": "$1 de novembre", "december-date": "$1 de decembre", + "period-am": "AM", + "period-pm": "PM", "pagecategories": "{{PLURAL:$1|Categoria|Categorias}}", "category_header": "Articulos in le categoria \"$1\"", "subcategories": "Subcategorias", @@ -153,7 +155,6 @@ "moredotdotdot": "Plus...", "morenotlisted": "Iste lista non es complete.", "mypage": "Pagina", - "anonuserpage": "Usator incognite", "mytalk": "Discussion", "anontalk": "Discussion", "navigation": "Navigation", @@ -385,6 +386,8 @@ "virus-scanfailed": "scannamento fallite (codice $1)", "virus-unknownscanner": "antivirus non cognoscite:", "logouttext": "'''Tu ha claudite le session.'''\n\nNota que alcun paginas pote continuar a apparer como si tu esserea ancora authenticate. Pro remediar isto, tu pote vacuar le cache de tu navigator.", + "cannotlogoutnow-title": "Impossibile clauder session ora", + "cannotlogoutnow-text": "Non es possibile clauder le session usante $1.", "welcomeuser": "Benvenite, $1!", "welcomecreation-msg": "Tu conto ha essite create.\nNon oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].", "yourname": "Nomine de usator:", @@ -401,6 +404,8 @@ "remembermypassword": "Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})", "userlogin-remembermypassword": "Mantener mi session aperte", "userlogin-signwithsecure": "Usar un connexion secur", + "cannotloginnow-title": "Impossibile aperir session ora", + "cannotloginnow-text": "Non es possibile aperir un session usante $1.", "yourdomainname": "Tu dominio:", "password-change-forbidden": "Non es possibile cambiar le contrasigno in iste wiki.", "externaldberror": "O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.", @@ -448,7 +453,7 @@ "nocookieslogin": "{{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.\nTu ha disactivate le functionalitate del ''cookies''.\nPer favor activa lo e reprova.", "nocookiesfornew": "Le conto de usator non esseva create, proque nos non poteva confirmar su origine.\nVerifica que tu ha activate le \"cookies\", recarga iste pagina e reproba.", "noname": "Tu non specificava un nomine de usator valide.", - "loginsuccesstitle": "Session aperite con successo", + "loginsuccesstitle": "Session aperite", "loginsuccess": "'''Tu es ora authenticate in {{SITENAME}} como \"$1\".'''", "nosuchuser": "Non existe un usator con le nomine \"$1\".\nIn le nomines de usator se distingue inter majusculas e minusculas.\nVerifica le orthographia, o [[Special:UserLogin/signup|crea un nove conto]].", "nosuchusershort": "Non existe un usator con le nomine \"$1\".\nVerifica le orthographia.", @@ -484,7 +489,7 @@ "createaccount-title": "Creation de un conto pro {{SITENAME}}", "createaccount-text": "Un persona ha create un conto in tu adresse de e-mail a {{SITENAME}} ($4) denominate \"$2\", con le contrasigno \"$3\".\nTu deberea aperir un session e cambiar tu contrasigno ora.\n\nTu pote ignorar iste message si iste conto ha essite create in error.", "login-throttled": "Tu ha facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.", - "login-abort-generic": "Apertura de session non succedite - Abortate", + "login-abort-generic": "Apertura de session fallite - Abortate", "login-migrated-generic": "Tu conto ha essite migrate, e tu nomine de usator non plus existe in iste wiki.", "loginlanguagelabel": "Lingua: $1", "suspicious-userlogout": "Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.", @@ -506,9 +511,36 @@ "resetpass_submit": "Definir contrasigno e aperir un session", "changepassword-success": "Tu contrasigno ha essite cambiate!", "changepassword-throttled": "Tu ha recentemente facite troppo de tentativas de aperir session.\nPer favor attende $1 ante de probar lo novemente.", + "botpasswords": "Contrasignos de robot", + "botpasswords-summary": "Le contrasignos de robot permitte acceder a un conto de usator via API sin usar le credentiales de authentication principal del conto. Le derectos de usator concedite per un contrasigno de robot pote esser limitate.\n\nSi tu non sape proque tu volerea facer isto, tu probabilemente non debe facer lo. Nemo deberea jammais demandar te a crear un tal contrasigno e dar lo a ille.", + "botpasswords-disabled": "Le contrasignos de robot es disactivate.", + "botpasswords-no-central-id": "Pro usar le contrasignos de robot, tu debe aperir session per medio de un conto centralisate.", + "botpasswords-existing": "Contrasignos de robot existente", + "botpasswords-createnew": "Crear un nove contrasigno de robot", + "botpasswords-editexisting": "Modificar un contrasigno de robot existente", + "botpasswords-label-appid": "Nomine del robot:", + "botpasswords-label-create": "Crear", + "botpasswords-label-update": "Actualisar", + "botpasswords-label-cancel": "Cancellar", + "botpasswords-label-delete": "Deler", + "botpasswords-label-resetpassword": "Reinitialisar le contrasigno", + "botpasswords-label-grants": "Concessiones applicabile:", + "botpasswords-help-grants": "Cata concession da accesso al derectos de usator listate que un conto de usator jam ha. Vide le [[Special:ListGrants|tabula de concessiones]] pro plus information.", + "botpasswords-label-restrictions": "Restrictiones de uso:", + "botpasswords-label-grants-column": "Concedite", + "botpasswords-bad-appid": "Le nomine del robot \"$1\" non es valide.", + "botpasswords-insert-failed": "Le addition del nomine de robot \"$1\" ha fallite. Esque illo ha jam essite addite?", + "botpasswords-update-failed": "Le actualisation del nomine de robot \"$1\" ha fallite. Esque illo ha essite delite?", + "botpasswords-created-title": "Contrasigno de robot create", "botpasswords-created-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite create.", + "botpasswords-updated-title": "Contrasigno de robot actualisate", "botpasswords-updated-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite actualisate.", + "botpasswords-deleted-title": "Contrasigno de robot delite", "botpasswords-deleted-body": "Le contrasigno pro le robot \"$1\" del usator \"$2\" ha essite delite.", + "botpasswords-newpassword": "Le nove contrasigno pro aperir session con $1 es $2. Per favor, conserva isto pro uso futur.", + "botpasswords-restriction-failed": "Session impedite per restrictiones de contrasigno de robot.", + "botpasswords-invalid-name": "Iste nomine de usator non contine le separator pro contrasigno de robot (\"$1\").", + "botpasswords-not-exist": "Le usator \"$1\" non ha un contrasigno de robot del nomine \"$2\".", "resetpass_forbidden": "Le contrasignos non pote esser cambiate", "resetpass-no-info": "Tu debe aperir un session pro poter acceder directemente a iste pagina.", "resetpass-submit-loggedin": "Cambiar contrasigno", @@ -535,8 +567,8 @@ "passwordreset-emailtext-ip": "Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu\ncontrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es\nassociate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.", "passwordreset-emailtext-user": "Le usator $1 in {{SITENAME}} requestava un reinitialisation de tu contrasigno in {{SITENAME}}\n($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es associate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.", "passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2", - "passwordreset-emailsentemail": "Si iste es un adresse de e-mail registrate pro tu conto, alora un message de e-mail pro le reinitialisation del contrasigno essera inviate.", - "passwordreset-emailsentusername": "Si il ha un correspondente adresse de e-mail registrate, alora un e-mail pro reinitialisar le contrasigno essera inviate.", + "passwordreset-emailsentemail": "Si iste adresse es associate a tu conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.", + "passwordreset-emailsentusername": "Si il ha un adresse de e-mail associate a iste conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.", "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.", "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1", "changeemail": "Cambiar o remover adresse de e-mail", @@ -630,8 +662,8 @@ "previewnote": "'''Isto es solmente un previsualisation.'''\nLe modificationes non ha ancora essite publicate!", "continue-editing": "Saltar al quadro de modification", "previewconflict": "Iste previsualisation reflecte le apparentia final del texto in le area de modification superior\nsi tu opta pro publicar lo.", - "session_fail_preview": "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.\nPer favor reprova.\nSi illo ancora non va, prova [[Special:UserLogout|clauder tu session]] e aperir un nove session.'''", - "session_fail_preview_html": "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.'''\n\n''Post que HTML crude es active in {{SITENAME}}, le previsualisation es celate como precaution contra attaccos via JavaScript.''\n\n'''Si isto es un tentativa de modification legitime, per favor reprova lo.\nSi illo ancora non va, prova [[Special:UserLogout|clauder tu session]] e aperir un nove session.'''", + "session_fail_preview": "Oh guai! Iste modification ha essite impedite per un perdita de datos del session.\n\nEs possibile que tu session ha essite claudite. Per favor, verifica que tu session es ancora aperte e tenta lo de novo.\nSi le problema persiste, proba a [[Special:UserLogout|clauder session]] e aperir un nove session, verificante que tu navigator accepta le cookies ab iste sito.", + "session_fail_preview_html": "Oh guai! Iste modification ha essite impedite per un perdita de datos del session.\n\nPost que HTML crude es active in {{SITENAME}}, le previsualisation es celate como precaution contra attaccos via JavaScript.\n\nSi iste tentativa de modification es legitime, per favor, tenta lo de novo.\nSi le problema persiste, proba a [[Special:UserLogout|clauder session]] e aperir un nove session, verificante que tu navigator accepta le cookies ab iste sito.", "token_suffix_mismatch": "'''Tu modification ha essite refusate proque tu cliente corrumpeva le characteres de punctuation in le indicio de modification.\nIste refusa es pro evitar le corruption del texto del pagina.\nIsto pote occurrer quando tu usa un servicio problematic de ''proxy'' anonyme a base de web.'''", "edit_form_incomplete": "'''Certe partes del formulario de modification non attingeva le servitor; re-verifica que tu modificationes es intacte e reproba.'''", "editing": "Modification de $1", @@ -797,7 +829,7 @@ "revdelete-unsuppress": "Eliminar restrictiones super versiones restaurate", "revdelete-log": "Motivo:", "revdelete-submit": "Applicar al {{PLURAL:$1|version|versiones}} seligite", - "revdelete-success": "'''Le visibilitate del version ha essite actualisate con successo.'''", + "revdelete-success": "Le visibilitate del version ha essite actualisate.", "revdelete-failure": "'''Le visibilitate del version non poteva esser actualisate:'''\n$1", "logdelete-success": "Le visibilitate del registro ha essite definite.", "logdelete-failure": "'''Le visibilitate del registro non poteva esser cambiate:'''\n$1", @@ -830,6 +862,13 @@ "mergehistory-empty": "Nulle versiones pote esser fusionate.", "mergehistory-done": "$3 {{PLURAL:$3|version|versiones}} de $1 fusionate in [[:$2]] con successo.", "mergehistory-fail": "Impossibile executar le fusion del historia. Per favor reverifica le parametros del pagina e del tempore.", + "mergehistory-fail-bad-timestamp": "Data e hora non valide.", + "mergehistory-fail-invalid-source": "Pagina de origine non valide.", + "mergehistory-fail-invalid-dest": "Pagina de destination non valide.", + "mergehistory-fail-no-change": "Nulle version de historia ha essite fusionate. Per favor, reverifica le parametros de pagina e de tempore.", + "mergehistory-fail-permission": "Permissiones insufficiente pro fusionar le historia.", + "mergehistory-fail-self-merge": "Le paginas de origine e de destination es identic.", + "mergehistory-fail-timestamps-overlap": "Le versiones de origine se superpone o seque le versiones de destination.", "mergehistory-fail-toobig": "Le historias de versiones non pote esser fusionate con plus de $1 {{PLURAL:$1|version|versiones}} a displaciar.", "mergehistory-no-source": "Le pagina de origine $1 non existe.", "mergehistory-no-destination": "Le pagina de destination $1 non existe.", @@ -1020,10 +1059,10 @@ "userrights": "Gestion de derectos de usator", "userrights-lookup-user": "Gerer gruppos de usatores", "userrights-user-editname": "Entra un nomine de usator:", - "editusergroup": "Modificar gruppos de usatores", + "editusergroup": "Modificar gruppos de {{GENDER:$1|usator}}", "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} [[User:$1|$1]] $2", "userrights-editusergroup": "Modificar gruppos de usatores", - "saveusergroups": "Salveguardar gruppos de usatores", + "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}", "userrights-groupsmember": "Membro de:", "userrights-groupsmember-auto": "Membro implicite de:", "userrights-groups-help": "Tu pote alterar le gruppos del quales iste usator es membro:\n* Un quadrato marcate significa que le usator es membro del gruppo in question.\n* Un non marcate significa que ille non es membro de illo.\n* Un * indica que tu non potera eliminar le gruppo quando tu lo ha addite, o vice versa.", @@ -1061,6 +1100,7 @@ "right-createpage": "Crear paginas (non discussion)", "right-createtalk": "Crear paginas de discussion", "right-createaccount": "Crear nove contos de usator", + "right-autocreateaccount": "Aperir session automaticamente con un conto de usator externe", "right-minoredit": "Marcar modificationes como minor", "right-move": "Renominar paginas", "right-move-subpages": "Renominar paginas con lor subpaginas", @@ -1129,25 +1169,35 @@ "right-managechangetags": "Crear e deler [[Special:Tags|etiquettas]] in le base de datos", "right-applychangetags": "Applicar [[Special:Tags|etiquettas]] al proprie modificationes", "right-changetags": "Adder e remover qualcunque [[Special:Tags|etiquettas]] sur individual versiones e entratas de registro", - "grant-generic": "gruppo de derectos \"$1\"", + "grant-generic": "Gruppo de derectos \"$1\"", + "grant-group-page-interaction": "Interager con paginas", + "grant-group-file-interaction": "Interager con multimedia", + "grant-group-watchlist-interaction": "Interager con tu observatorio", + "grant-group-email": "Inviar e-mail", + "grant-group-high-volume": "Exequer actiones in massa", + "grant-group-customization": "Personalisation e perferentias", "grant-group-administration": "Exequer actiones administrative", + "grant-group-other": "Activitates diverse", "grant-blockusers": "Blocar e disblocar usatores", + "grant-createaccount": "Crear contos", "grant-createeditmovepage": "Crear, modificar e renominar paginas", "grant-delete": "Deler paginas, versiones e entratas de registro", - "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le CSS/JS de usatores", - "grant-editmycssjs": "Modificar le CSS/JS del proprie usator", - "grant-editmywatchlist": "Modificar le proprie observatorio", + "grant-editinterface": "Modificar le spatio de nomines MediaWiki e le CSS/JavaScript de usatores", + "grant-editmycssjs": "Modificar le CSS/JavaScript del proprie usator", + "grant-editmyoptions": "Modificar tu preferentias de usator", + "grant-editmywatchlist": "Modificar tu observatorio", "grant-editpage": "Modificar paginas existente", "grant-editprotected": "Modificar paginas protegite", "grant-highvolume": "Modification in massa", "grant-oversight": "Celar usatores e supprimer versiones", - "grant-patrol": "Patruliar cambiamentos in paginas", + "grant-patrol": "Patruliar cambiamentos a paginas", "grant-protect": "Proteger e disproteger paginas", - "grant-rollback": "Revocar cambiamentos in paginas", + "grant-rollback": "Revocar cambiamentos a paginas", "grant-sendemail": "Inviar e-mail a altere usatores", "grant-uploadeditmovefile": "Actualisar, reimplaciar e renominar files", "grant-uploadfile": "Incargar nove files", - "grant-viewdeleted": "Vider information delite", + "grant-basic": "Derectos de base", + "grant-viewdeleted": "Vider files e paginas delite", "grant-viewmywatchlist": "Vider le proprie observatorio", "newuserlogpage": "Registro de creation de usatores", "newuserlogpagetext": "Isto es un registro de creation de usatores.", @@ -1158,6 +1208,7 @@ "action-createpage": "crear paginas", "action-createtalk": "crear paginas de discussion", "action-createaccount": "crear iste conto de usator", + "action-autocreateaccount": "crear automaticamente iste conto de usator externe", "action-history": "vider le historia de iste pagina", "action-minoredit": "marcar iste modification como minor", "action-move": "renominar iste pagina", @@ -1262,7 +1313,7 @@ "recentchangeslinked-page": "Nomine del pagina:", "recentchangeslinked-to": "Monstrar modificationes in paginas con ligamines al pagina specificate", "recentchanges-page-added-to-category": "[[:$1]] addite al categoria", - "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} addite al categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|un pagina|$2 paginas}}]] addite al categoria", "recentchanges-page-removed-from-category": "[[:$1]] removite del categoria", "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|un pagina|$2 paginas}} removite del categoria", "autochange-username": "Cambiamento automatic de MediaWiki", @@ -1440,6 +1491,7 @@ "uploadstash-badtoken": "Le execution de iste action ha fallite, forsan perque le datos del session ha expirate. Tenta lo de novo.", "uploadstash-errclear": "Le radimento del files ha fallite.", "uploadstash-refresh": "Refrescar le lista de files", + "uploadstash-thumbnail": "vider miniatura", "invalid-chunk-offset": "Position de segmento invalide", "img-auth-accessdenied": "Accesso refusate", "img-auth-nopathinfo": "PATH_INFO manca.\nLe servitor non ha essite configurate pro passar iste information.\nIllo pote esser basate super CGI e non pote supportar img_auth.\nVide https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -1637,6 +1689,7 @@ "mostrevisions": "Paginas le plus modificate", "prefixindex": "Tote le paginas con prefixo", "prefixindex-namespace": "Tote le paginas con prefixo (spatio de nomines $1)", + "prefixindex-submit": "Monstrar", "prefixindex-strip": "Remover prefixo in lista", "shortpages": "Paginas curte", "longpages": "Paginas longe", @@ -1654,11 +1707,13 @@ "protectedpages-performer": "Protegite per", "protectedpages-params": "Parametros de protection", "protectedpages-reason": "Motivo", + "protectedpages-submit": "Monstrar paginas", "protectedpages-unknown-timestamp": "Incognite", "protectedpages-unknown-performer": "Usator incognite", "protectedtitles": "Titulos protegite", "protectedtitles-summary": "Iste pagina lista titulos actualmente protegite contra creation. Pro un lista de paginas existente que ha essite protegite, vide [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].", "protectedtitlesempty": "Nulle titulos es actualmente protegite con iste parametros.", + "protectedtitles-submit": "Monstrar titulos", "listusers": "Lista de usatores", "listusers-editsonly": "Monstrar solmente usatores con modificationes", "listusers-creationsort": "Ordinar per data de creation", @@ -1666,6 +1721,7 @@ "usereditcount": "$1 {{PLURAL:$1|modification|modificationes}}", "usercreated": "{{GENDER:$3|Create}} le $1 a $2", "newpages": "Nove paginas", + "newpages-submit": "Monstrar", "newpages-username": "Nomine de usator:", "ancientpages": "Paginas le plus ancian", "move": "Renominar", @@ -1683,12 +1739,30 @@ "apihelp": "Adjuta con le API", "apihelp-no-such-module": "Modulo \"$1\" non trovate.", "apisandbox": "Cassa de sablo pro API", + "apisandbox-jsonly": "JavaScript es necessari pro usar le cassa a sablo del API.", "apisandbox-api-disabled": "Le API ha essite disactivate in iste sito.", - "apisandbox-intro": "Usa iste pagina pro experimentar con le '''API de servicio web de MediaWiki'''.\nConsulta [//www.mediawiki.org/wiki/API:Main_page le documentation del API] pro ulterior detalios concernente le uso del API. Per exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obtener le contento de un Pagina principal]. Selige un action pro vider altere exemplos.", + "apisandbox-intro": "Usa iste pagina pro experimentar con le API de servicio web de MediaWiki.\nConsulta [[mw:API:Main page|le documentation del API]] pro ulterior detalios concernente le uso del API. Per exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obtener le contento de un Pagina principal]. Selige un action pro vider altere exemplos.\n\nAttention: Ben que isto es un cassa a sablo, le actiones que tu exeque in iste pagina pote modificar tote le wiki.", + "apisandbox-fullscreen": "Expander pannello", + "apisandbox-fullscreen-tooltip": "Expander le pannello del cassa a sablo pro impler le fenestra del navigator.", + "apisandbox-unfullscreen": "Monstrar pagina", + "apisandbox-unfullscreen-tooltip": "Reducer le pannello del cassa a sablo de sorta que le ligamines de navigation de MediaWiki es disponibile.", "apisandbox-submit": "Facer requesta", "apisandbox-reset": "Rader", - "apisandbox-examples": "Exemplo", - "apisandbox-results": "Resultato", + "apisandbox-retry": "Reprobar", + "apisandbox-loading": "Carga information pro le modulo API \"$1\"...", + "apisandbox-load-error": "Un error ha occurrite durante le cargamento del information pro le modulo API \"$1\": $2", + "apisandbox-no-parameters": "Iste modulo API non ha parametros.", + "apisandbox-helpurls": "Ligamines de adjuta", + "apisandbox-examples": "Exemplos", + "apisandbox-dynamic-parameters": "Parametros additional", + "apisandbox-dynamic-parameters-add-label": "Adder parametro:", + "apisandbox-dynamic-parameters-add-placeholder": "Nomine del parametro", + "apisandbox-dynamic-error-exists": "Un parametro con le nomine \"$1\" jam existe.", + "apisandbox-deprecated-parameters": "Parametros obsolescente", + "apisandbox-fetch-token": "Auto-reimpler le indicio", + "apisandbox-submit-invalid-fields-title": "Alcun campos non es valide", + "apisandbox-submit-invalid-fields-message": "Per favor, corrige le campos marcate e reproba.", + "apisandbox-results": "Resultatos", "apisandbox-request-url-label": "URL de requesta:", "apisandbox-request-time": "Duration del requesta: $1", "booksources": "Fontes de libros", diff --git a/languages/i18n/id.json b/languages/i18n/id.json index be3b009ec9..c710172173 100644 --- a/languages/i18n/id.json +++ b/languages/i18n/id.json @@ -44,7 +44,8 @@ "Matma Rex", "WongKentir", "Rachmat.Wahidi", - "Arief" + "Arief", + "Nemo bis" ] }, "tog-underline": "Garis bawahi pranala:", @@ -1354,7 +1355,7 @@ "recentchangeslinked-page": "Nama halaman:", "recentchangeslinked-to": "Perlihatkan perubahan dari halaman-halaman yang terhubung dengan halaman yang disajikan", "recentchanges-page-added-to-category": "[[:$1]] ditambahkan pada kategori", - "recentchanges-page-added-to-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu halaman|$2 halaman-halaman}} lagi halaman ditambahkan pada kategori", + "recentchanges-page-added-to-category-bundled": "[[:$1]] dan [[Special:WhatLinksHere/$1|{{PLURAL:$2|satu halaman|$2 halaman-halaman}}]] lagi halaman ditambahkan pada kategori", "recentchanges-page-removed-from-category": "[[:$1]] dihapus dari kategori", "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu halaman|$2 halaman-halaman}} lagi halaman dihapus dari kategori", "autochange-username": "Perubahan otomatis MediaWiki", diff --git a/languages/i18n/ilo.json b/languages/i18n/ilo.json index 061a8eb84e..c39fece918 100644 --- a/languages/i18n/ilo.json +++ b/languages/i18n/ilo.json @@ -8,7 +8,8 @@ "Urhixidur", "לערי ריינהארט", "아라", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "Pinag-ugisan ti silpo:", @@ -149,7 +150,6 @@ "moredotdotdot": "Adu pay...", "morenotlisted": "Daytoy a listaan ket saan a kompleto.", "mypage": "Panid", - "anonuserpage": "Di ammo nga agar-aramat", "mytalk": "Tungtungan", "anontalk": "Tungtungan", "navigation": "Pagdaliasatan", @@ -1302,7 +1302,7 @@ "recentchangeslinked-page": "Nagan ti panid:", "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid", "recentchanges-page-added-to-category": "nainayon ti [[:$1]] iti kategoria", - "recentchanges-page-added-to-category-bundled": "nainayon ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} iti kategoria", + "recentchanges-page-added-to-category-bundled": "nainayon ti [[:$1]] ken [[Special:WhatLinksHere/$1|{{PLURAL:$2|maysa a panid|$2 a pampanid}}]] iti kategoria", "recentchanges-page-removed-from-category": "naikkat ti [[:$1]] manipud iti kategoria", "recentchanges-page-removed-from-category-bundled": "Naikkat ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} manipud iti kategoria", "autochange-username": "Automatiko a panagbaliw iti MediaWiki", diff --git a/languages/i18n/inh.json b/languages/i18n/inh.json index 9d706e3b9b..4279cce572 100644 --- a/languages/i18n/inh.json +++ b/languages/i18n/inh.json @@ -147,7 +147,6 @@ "moredotdotdot": "Д|ахо", "morenotlisted": "Ер |ояздар хьалдиззанз да.", "mypage": "Oаг|ув", - "anonuserpage": "Вовзаш воаца доакъашхо", "mytalk": "Дувцам", "anontalk": "Дувцар", "navigation": "Наькъатохкарг", @@ -166,20 +165,20 @@ "errorpagetitle": "Г|алат", "returnto": "цу $1 оаг|он т|а юхаг|о", "tagline": "Кечал укхазара я {{SITENAME}}", - "help": "Куцтохкам", + "help": "ГӀо", "search": "Лахаp", "searchbutton": "Лахар", "go": "Дехьа г|о", - "searcharticle": "Дехьа г|о", + "searcharticle": "Дехьавала", "history": "Истори", - "history_short": "Тархьар", + "history_short": "Истори", "updatedmarker": "Со ханача денца хувцамаш хиннaд", "printableversion": "Кепатохара нийсхьал", "permalink": "Даиман латташ йола хьожадерг", "print": "Кепатохар", "view": "Б|аргтассам", "view-foreign": "Мазаоаг|он чу $1 хьажа", - "edit": "Хувца", + "edit": "Нийсде", "edit-local": "Хувца локальни йоазонца сурт оттадар", "create": "Хьаде", "create-local": "ТIатоха локальни йоазонца сурт оттадар", @@ -201,7 +200,7 @@ "specialpage": "Г|улакхадара оаг|ув", "personaltools": "Са г|ирсаш", "articlepage": "Йоазон т|а б|аргтасса", - "talk": "Дувцам", + "talk": "Дувца оттадар", "views": "БӀаргтассамаш", "toolbox": "ГӀирсаш", "userpage": "Доакъошхочун оаг|он т|а б|аргтасса", @@ -209,7 +208,7 @@ "imagepage": "Лурдара оаг|oн т|а б|аргтасса", "mediawikipage": "Xоаман оаг|ув хьахьокха", "templatepage": "Ч|абала оаг|oн т|а б|аргтасса", - "viewhelppage": "Куцтохкам беха", + "viewhelppage": "ГӀо хьаэцар", "categorypage": "Катага оаг|oн т|а б|аргтасса", "viewtalkpage": "Дувцамага б|аргтасса", "otherlanguages": "Кхыча меттаех", @@ -234,8 +233,8 @@ "currentevents-url": "Project:ХӀанзара хоамаш", "disclaimers": "Бокъонах юхавалаp", "disclaimerpage": "Project:Бокъонах юхавалаp", - "edithelp": "Хувцама куцтохкам", - "helppage-top-gethelp": "Г|о", + "edithelp": "Хувцама гӀо", + "helppage-top-gethelp": "ГӀо", "mainpage": "Кертера оагӀув", "mainpage-description": "Кертера оагӀув", "policy-url": "Project:Бокъонаш", @@ -282,7 +281,7 @@ "nstab-image": "Паьл", "nstab-mediawiki": "Хоам", "nstab-template": "ЧIабал", - "nstab-help": "Куцтохкам", + "nstab-help": "ГӀо", "nstab-category": "Катаг", "mainpage-nstab": "Кертера оагӀув", "nosuchaction": "Цу тайпара дулархIам бац", @@ -335,7 +334,7 @@ "emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде", "loginlanguagelabel": "Мотт: $1", "pt-login": "Чувала/яла", - "pt-createaccount": "Дакъалаьцархо кхолла", + "pt-createaccount": "Учёта яздар кхолла", "changepassword": "КъайладIоaгIа дIахувцар", "oldpassword": "Къаьна къайладIоагӀа:", "newpassword": "Керда къайладIоагӀа:", @@ -450,7 +449,7 @@ "nextn": "{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}", "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}", "nextn-title": "{{PLURAL:$1|1=$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}", - "shown-title": "Укх оагIувни $1 {{PLURAL:$1|1=йоазув|йоазувнаш}} хьахьокха", + "shown-title": "Хьóкха $1 {{PLURAL:$1|даь йоазо|даь йоазонаш}} укх оáгIувна тIа", "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) хьажа", "searchmenu-exists": "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:$1]]\" я'''", "searchmenu-new": "'''Укх \"[[:$1]]\" масса-хьахоадайтамач оагIув хьае!'''", @@ -543,22 +542,28 @@ "action-read": "Укх оагIуви дешам", "action-edit": "Ер оагIув хувца", "nchanges": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}", + "enhancedrc-history": "истори", "recentchanges": "Керда хувцамаш", "recentchanges-legend": "Керда хувцамий оттамаш", "recentchanges-summary": "КIалхагIа лоарамий доаламе тIехьара оагIувний хувцамаш дIаязадаь да {{grammar:genitive|{{SITENAME}}}}.", "recentchanges-feed-description": "Укх ларамца тIехьара массахувцамашт теркам бе.", - "recentchanges-label-newpage": "Укх хувцамаца керда оагIув даь хиннад", + "recentchanges-label-newpage": "Укх хувцамаца керда оагIув яь хиннай", "recentchanges-label-minor": "ЗIамига хувцам я", "recentchanges-label-bot": "Ер хувцам бIатаца яь е", "recentchanges-label-unpatrolled": "Ер хувцам ший моттиге кхы дIадехьаяьккхаяц.", "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я $2 денза ($1 кхачалца).", "rclistfrom": "$3 $2 тIара хувцамаш хьахьокха", "rcshowhideminor": "$1 зIамига хувцамаш", + "rcshowhideminor-hide": "Къайлдаккха", "rcshowhidebots": "$1 боташ", + "rcshowhidebots-show": "Хьахьокха", "rcshowhideliu": "Чубаьнначара дакъалаьцархочий $1", + "rcshowhideliu-hide": "Къайлдаккха", "rcshowhideanons": "$1 цIияьккханза дакъалаьцархой", + "rcshowhideanons-hide": "Къайлдаккха", "rcshowhidepatr": "$1 теркам даь хувцамаш", "rcshowhidemine": "$1 сай хувцамаш", + "rcshowhidemine-hide": "Къайлдаккха", "rclinks": "$2 динах
$3 $1 хинна тIехьара хувцамаш хьахьокха", "diff": "кхы.", "hist": "истори", @@ -606,7 +611,7 @@ "filehist-filesize": "Паьла юстарал", "filehist-comment": "ХIамоалар", "imagelinks": "Паьлий пайда эца", - "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIа $1 оагIув Iинк ду|ТIехьайоагIа $1 оагIувнаш Iинкаш ду}} укх паьла тIа:", + "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIуво тIахьожаву|ТIехьайоагIача $1 оагIувнаша тIахьожаву}} укх файла тIа:", "nolinkstoimage": "Йола паьла тIа Iинк ю оагIувнаш дац", "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.", "sharedupload-desc-here": "Ер паьл $1чара я, кхыдола хьахьоадайтамача хайрамбе йийш йолаш да.\nЦун [$2 лоацама оагIувца] лоаца маIандар кIалхагIа латта.", @@ -701,7 +706,7 @@ "namespace": "ЦIерий аренаш", "invert": "Хьаржар юхадаккха", "blanknamespace": "(Корта)", - "contributions": "{{GENDER:$1|Дакъалаьцархочунна}} къахьегам", + "contributions": "{{GENDER:$1|Доакъашхочунна}} къахьегам", "contributions-title": "$1 дакъалаьцархочунна къахьегам", "mycontris": "Са къахьегам", "contribsub2": "{{GENDER:$3|$1}} ($2) баь болх", @@ -773,9 +778,9 @@ "tooltip-pt-mycontris": "Шун хувцамаш", "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма чуцаваьлача/ялача хIама а дац", "tooltip-pt-logout": "Аравала/яла", - "tooltip-pt-createaccount": "Хьа бокъо я лоархIама яздар кхелла система чу вала, амма декхар долаш дац из.", + "tooltip-pt-createaccount": "Хьа бокъо я учёта яздар кхелла система чу вала, амма декхар долаш дац из.", "tooltip-ca-talk": "ОагIувна чулоацаме дувцам", - "tooltip-ca-edit": "Хувца ер оагIув", + "tooltip-ca-edit": "Нийсъе ер оагIув", "tooltip-ca-addsection": "Керда декъам хьаде", "tooltip-ca-viewsource": "Ер оагIув хувцамах лораяь я, амма шун цунна гIувамага хьажа бокъо я.", "tooltip-ca-history": "Укх оагIувни хувцама таптар", @@ -794,12 +799,12 @@ "tooltip-n-currentevents": "ХIанзара хоаман дагарле", "tooltip-n-recentchanges": "ТӀехьара хувцамий дагарче", "tooltip-n-randompage": "Бе йоаца оагӀув ела", - "tooltip-n-help": "Новкъостала моттиг", + "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг", "tooltip-t-whatlinkshere": "Массайола оагIувий дагарле, укх оагIув тIа Iинкаш луш йола", "tooltip-t-recentchangeslinked": "ОагIувнаш тIа тIехьара хувцамаш, укх оагIувнера Iинк яь йола", "tooltip-feed-rss": "Укх оагIувна RSSчу гойтар", "tooltip-feed-atom": "Укх оаг|увна Atomчу гойтар", - "tooltip-t-contributions": "Укх дакъалаьцархочу хьийца йола оагIувнаш хьахьокха", + "tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIувнаш", "tooltip-t-emailuser": "Укх дакъалаьцархочоа зIы яхьийта", "tooltip-t-upload": "Паьлаш чуяьккха", "tooltip-t-specialpages": "ГIулакха оагIувний дагарчe", @@ -807,10 +812,11 @@ "tooltip-t-permalink": "Укх оагIув доржама даим латта Iинк", "tooltip-ca-nstab-main": "Йоазува чулоацам", "tooltip-ca-nstab-user": "Дакъалаьцархочунна ший оагIув", - "tooltip-ca-nstab-special": "Ер гIулакха оагIув я, из хувца хьо бокъо йолаш вац/яц.", + "tooltip-ca-nstab-special": "Ер гIулакха оагIув я, из хувца бокъо яц", "tooltip-ca-nstab-project": "Хьахьоадайтама оагIув", "tooltip-ca-nstab-image": "Паьла оагIув", "tooltip-ca-nstab-template": "ЧIабала оагIув", + "tooltip-ca-nstab-help": "ГӀон оагIув", "tooltip-ca-nstab-category": "Цатега оагIув", "tooltip-minoredit": "Ер хувцар башха доаца санна белгалде", "tooltip-save": "Хувцамаш кходе", @@ -839,11 +845,13 @@ "metadata-fields": "Укх дагарченгахь дагaрадаь метахIамаша суртий мугIаш, сурт оагIув тIа хьахьекха хургья, чуерзaяь метахIамашийца. Вож мугIанаш ха йоалаш къайла хургья.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude", "exif-imagewidth": "Шерал", "exif-imagelength": "Лакхал", + "exif-orientation": "Суртан белгало", "exif-imagedescription": "Сурта цIи", "exif-artist": "Яздархо", "exif-colorspace": "Басара аре", "exif-pixelydimension": "Сурта шерал", "exif-pixelxdimension": "Сурта лакхал", + "exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а", "exif-writer": "Яздама да", "exif-languagecode": "Мотт", "exif-iimcategory": "Цатег", @@ -875,7 +883,7 @@ "version-software-version": "Доржам", "fileduplicatesearch-filename": "ПаьлацIи:", "fileduplicatesearch-submit": "Лаха", - "specialpages": "ГIулакхий оагIувнаш", + "specialpages": "ЛаьрххIа йола оагIувнаш", "specialpages-group-users": "Дакъалаьцархой, цара бокъо", "specialpages-group-pages": "ОагIувний дагарченаш", "specialpages-group-pagetools": "ОагIувнаша гIирсаш", @@ -895,6 +903,7 @@ "htmlform-submit": "ДIадахьийта", "htmlform-reset": "Хувцамаш юхадаккха", "htmlform-selectorother-other": "Кхыдола", + "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо кхеллай}} учёта яздар $1", "rightsnone": "(а)", "revdelete-summary": "хувцамий лоацам", "searchsuggest-search": "Лаха", diff --git a/languages/i18n/is.json b/languages/i18n/is.json index a6bcb250f4..9e0fd9f82e 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -23,7 +23,8 @@ "Jonbg", "Matma Rex", "Xð", - "Sveinki" + "Sveinki", + "Nemo bis" ] }, "tog-underline": "Undirstrika tengla:", @@ -1256,7 +1257,7 @@ "recentchangeslinked-page": "Síðutitill:", "recentchangeslinked-to": "Sýna breytingar á síðum sem tengjast uppgefinni síðu í staðinn", "recentchanges-page-added-to-category": "[[:$1]] bætt við flokk", - "recentchanges-page-added-to-category-bundled": "[[:$1]] og $2 {{PLURAL:$2|síðu|síðum}} bætt við flokk", + "recentchanges-page-added-to-category-bundled": "[[:$1]] og $2 [[Special:WhatLinksHere/$1|{{PLURAL:$2|síðu|síðum}}]] bætt við flokk", "recentchanges-page-removed-from-category": "[[:$1]] fjarlægð úr flokki", "recentchanges-page-removed-from-category-bundled": "[[:$1]] og $2 {{PLURAL:$2|síðu|síðum}} fjarlægð úr flokki", "autochange-username": "Sjálfvirk MediaWiki-breyting", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 9c61c24a95..1b2b603ed9 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -236,7 +236,6 @@ "moredotdotdot": "Altro...", "morenotlisted": "Questo elenco non è completo.", "mypage": "Pagina", - "anonuserpage": "Utente sconosciuto", "mytalk": "discussioni", "anontalk": "discussioni", "navigation": "Navigazione", @@ -964,9 +963,9 @@ "mergelog": "Unioni", "revertmerge": "Annulla unioni", "mergelogpagetext": "Di seguito sono elencate le ultime operazioni di unione della cronologia di due pagine.", - "history-title": "$1: cronologia delle modifiche", - "difference-title": "$1: differenze tra le versioni", - "difference-title-multipage": "$1 e $2: differenze tra le pagine", + "history-title": "Cronologia delle modifiche di \"$1\"", + "difference-title": "Differenze tra le versioni di \"$1\"", + "difference-title-multipage": "Differenze tra le pagine \"$1\" e \"$2\"", "difference-multipage": "(Differenze fra le pagine)", "lineno": "Riga $1:", "compareselectedversions": "Confronta le versioni selezionate", @@ -1396,9 +1395,9 @@ "recentchangeslinked-page": "Nome della pagina:", "recentchangeslinked-to": "Mostra solo le modifiche alle pagine collegate a quella specificata", "recentchanges-page-added-to-category": "[[:$1]] aggiunta alla categoria", - "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è aggiunta|$2 pagine sono aggiunte}} alla categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|un'altra pagina|altre $2 pagine}}]] sono state aggiunte alla categoria", "recentchanges-page-removed-from-category": "[[:$1]] rimossa dalla categoria", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|un'altra pagina|altre $2 pagine}} rimosse dalla categoria", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|un'altra pagina|altre $2 pagine}}]] sono state rimosse dalla categoria", "autochange-username": "Modifica automatica MediaWiki", "upload": "Carica un file", "uploadbtn": "Carica", @@ -1578,6 +1577,7 @@ "uploadstash-badtoken": "Esecuzione dell'azione non riuscita, forse perché le tue credenziali di modifica sono scadute. Prova ancora.", "uploadstash-errclear": "La pulizia dei file non è riuscita.", "uploadstash-refresh": "Aggiorna l'elenco dei file", + "uploadstash-thumbnail": "vedi miniatura", "invalid-chunk-offset": "Offset della parte non valido.", "img-auth-accessdenied": "Accesso negato", "img-auth-nopathinfo": "PATH_INFO mancante.\nIl server non è impostato per passare questa informazione.\nPotrebbe essere basato su CGI e non può supportare img_auth.\nVedi https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", @@ -3674,5 +3674,25 @@ "sessionprovider-generic": "sessioni $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sessioni basate su cookie", "sessionprovider-nocookies": "I cookie possono essere disattivati. Assicurati di avere i cookie abilitati e ha inizia nuovamente.", - "randomrootpage": "Pagina radice casuale" + "randomrootpage": "Pagina radice casuale", + "log-action-filter-block": "Tipo di blocco:", + "log-action-filter-delete": "Tipo di cancellazione:", + "log-action-filter-patrol": "Tipo di verifica:", + "log-action-filter-protect": "Tipo di protezione:", + "log-action-filter-upload": "Tipo di caricamento:", + "log-action-filter-all": "Tutto", + "log-action-filter-block-block": "Blocco", + "log-action-filter-block-reblock": "Modifica blocco", + "log-action-filter-block-unblock": "Sblocco", + "log-action-filter-delete-delete": "Cancellazione pagina", + "log-action-filter-delete-restore": "Ripristino pagina", + "log-action-filter-delete-event": "Cancellazione registro", + "log-action-filter-delete-revision": "Cancellazione versione", + "log-action-filter-patrol-patrol": "Verifica manuale", + "log-action-filter-patrol-autopatrol": "Verifica automatica", + "log-action-filter-protect-protect": "Protezione", + "log-action-filter-protect-modify": "Modifica protezione", + "log-action-filter-protect-unprotect": "Sprotezione", + "log-action-filter-upload-upload": "Nuovo caricamento", + "log-action-filter-upload-overwrite": "Ricaricamento" } diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index d16ec68eca..32a4205a03 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -210,7 +210,6 @@ "moredotdotdot": "続き...", "morenotlisted": "この一覧は完全ではありません。", "mypage": "ページ", - "anonuserpage": "不明な利用者", "mytalk": "トーク", "anontalk": "トーク", "navigation": "案内", @@ -1370,9 +1369,9 @@ "recentchangeslinked-page": "ページ名:", "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え", "recentchanges-page-added-to-category": "[[:$1]]をカテゴリに追加", - "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加", + "recentchanges-page-added-to-category-bundled": "[[:$1]]と他[[Special:WhatLinksHere/$1|{{PLURAL:$2|1ページ|$2ページ}}]]をカテゴリに追加", "recentchanges-page-removed-from-category": "[[:$1]]をカテゴリから除外", - "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから除外", + "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他 [[Special:WhatLinksHere/$1|{{PLURAL:$2|1ページ|$2ページ}}]]をカテゴリから除外", "autochange-username": "メディアウィキ自動変更", "upload": "ファイルをアップロード", "uploadbtn": "ファイルをアップロード", @@ -2055,18 +2054,19 @@ "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。", "sessionfailure-title": "セッションの失敗", "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。", - "changecontentmodel": "ページのコンテント・モデルの変更", + "changecontentmodel": "ページのコンテンツ・モデルの変更", "changecontentmodel-legend": "コンテンツモデルを変更", "changecontentmodel-title-label": "ページ名", "changecontentmodel-model-label": "新しい コンテンツ モデル", "changecontentmodel-reason-label": "理由:", - "changecontentmodel-success-title": "コンテント・モデルは変更されました", - "changecontentmodel-success-text": "[[:$1]]のコンテント・タイプは変更されています。", + "changecontentmodel-submit": "変更", + "changecontentmodel-success-title": "コンテンツ・モデルは変更されました", + "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。", "changecontentmodel-cannot-convert": "[[:$1]]上のコンテントは$2の型には変換できません。", "changecontentmodel-nodirectediting": "$1 コンテント・モデルは、ダイレクト編集をサポートしていません。", "log-name-contentmodel": "コンテント・モデル変更記録", - "log-description-contentmodel": "ページのコンテント・モデルに関連するイベント", - "logentry-contentmodel-change": "$1 がページ $3 のコンテント・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}", + "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事", + "logentry-contentmodel-change": "$1 がページ $3 のコンテンツ・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}", "logentry-contentmodel-change-revertlink": "差し戻し", "logentry-contentmodel-change-revert": "差し戻し", "protectlogpage": "保護記録", diff --git a/languages/i18n/jut.json b/languages/i18n/jut.json index 264a219df3..a8fd1228b7 100644 --- a/languages/i18n/jut.json +++ b/languages/i18n/jut.json @@ -8,7 +8,8 @@ "Ælsån", "Midnight Gambler", "아라", - "Jyllanj" + "Jyllanj", + "Ghiutun" ] }, "tog-underline": "Unjestreg henwisnenge:", @@ -827,11 +828,11 @@ "thumbnail-more": "Forstör", "thumbnail_error": "Fejl we oprettels å thumbnail: $1", "importlogpage": "Importlogg", - "tooltip-pt-userpage": "Din brugesiid", - "tooltip-pt-mytalk": "Din diskusjonssiid", - "tooltip-pt-preferences": "Din instellenge", + "tooltip-pt-userpage": "{{GENDER:|Din brugesiid}}", + "tooltip-pt-mytalk": "{{GENDER:|Din}} diskusjonssiid", + "tooltip-pt-preferences": "{{GENDER:|Din}} instellenge", "tooltip-pt-watchlist": "Listen öwe side som du öwewåge for øndrenge", - "tooltip-pt-mycontris": "List öwe din bidraw", + "tooltip-pt-mycontris": "List öwe {{GENDER:|din}} bidraw", "tooltip-pt-login": "Du opfordas te å logg på, men dä ä ett obligatorisk.", "tooltip-pt-logout": "Logg å", "tooltip-pt-createaccount": "Du opfordas te å oprett e konto å logg på, men dä ä ett obligatorisk", @@ -859,7 +860,7 @@ "tooltip-t-whatlinkshere": "En list mä åll side som henwise hertil", "tooltip-t-recentchangeslinked": "Siensti øndrenge i side som denn siid henwise til", "tooltip-feed-atom": "Atom-feed for siden", - "tooltip-t-contributions": "Sie bidrawen te brugari", + "tooltip-t-contributions": "List öwe bidrawen te {{GENDER:$1|brugari}}", "tooltip-t-emailuser": "Senj i e-mail te brugari", "tooltip-t-upload": "Lägg e bilj elle i ånj mediafil op", "tooltip-t-specialpages": "List öwe åll specialside", diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json index 482b11e14c..234103cdc9 100644 --- a/languages/i18n/ka.json +++ b/languages/i18n/ka.json @@ -551,11 +551,11 @@ "botpasswords-insert-failed": "ბოტის სახელის $1\" დამატება შეუძლებელია. უკვე დამატებულია?", "botpasswords-update-failed": "ბოტის სახელის \"$1\" განახლება შეუძლებელია. წაშლილია?", "botpasswords-created-title": "ბოტის პაროლი შექმნილია", - "botpasswords-created-body": "ბოტის პაროლი \"$1\" შეიქმნა.", + "botpasswords-created-body": "ბოტის პაროლი მომხმარებელ \"$2\"-ის \"$1\" სახელისთვის შეიქმნა.", "botpasswords-updated-title": "ბოტის პაროლი განახლდა", - "botpasswords-updated-body": "ბოტის პაროლი \"$1\" განახლდა.", + "botpasswords-updated-body": "ბოტის პაროლი \"$2\" მომხმარებლის \"$1\"-ის სახელისთვის განახლდა.", "botpasswords-deleted-title": "ბოტის პაროლი წაშლილია", - "botpasswords-deleted-body": "ბოტის პაროლი \"$1\" წაიშალა.", + "botpasswords-deleted-body": "ბოტის პაროლი \"$2\" მომხმარებლის \"$1\"-ის სახელისთვის წაიშალა.", "botpasswords-newpassword": "ახალი პაროლი $1-ით შესასვლელად არის $2. გთხოვთ დაიმახსოვრეთ ან ჩაიწერეთ.", "botpasswords-no-provider": "BotPasswordsSessionProvider არ არის ხელმისაწვდომი.", "botpasswords-restriction-failed": "ბოტის პაროლის შეზღუდვები არ უშვებს ამ ავტორიზაციას.", @@ -1341,9 +1341,9 @@ "recentchangeslinked-page": "გვერდის დასახელება:", "recentchangeslinked-to": "საპირისპიროდ აჩვენეთ ამ გვერდზე ბმულის მქონე გვერდების ცვლილებები", "recentchanges-page-added-to-category": "[[:$1]] დამატებულია კატეგორიაში", - "recentchanges-page-added-to-category-bundled": "[[:$1]] და {{PLURAL:$2|ერთი გვერდი|$2 გვერდი}} დამატებულია კატეგორიაში", + "recentchanges-page-added-to-category-bundled": "[[:$1]] და [[Special:WhatLinksHere/$1|{{PLURAL:$2|ერთი გვერდი|$2 გვერდი}}]] დამატებულია კატეგორიაში", "recentchanges-page-removed-from-category": "[[:$1]] წაიშალა კატეგორიიდან", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] და {{PLURAL:$2|ერთი გვერდი|$2 გვერდი}} წაიშალა კატეგორიიდან", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] და [[Special:WhatLinksHere/$1|{{PLURAL:$2|ერთი გვერდი|$2 გვერდი}}]] წაიშალა კატეგორიიდან", "autochange-username": "მედიავიკის ავტომატური ცვლილება", "upload": "ფაილის დამატება", "uploadbtn": "ფაილის დამატება", @@ -2033,6 +2033,7 @@ "changecontentmodel-title-label": "გვერდის სათაური", "changecontentmodel-model-label": "შინაარსის ახალი მოდელი", "changecontentmodel-reason-label": "მიზეზი:", + "changecontentmodel-submit": "შეცვლა", "changecontentmodel-success-title": "შინაარსის მოდელი შეიცვალა", "changecontentmodel-success-text": "[[:$1]]-ის კონტენტის ტიპი შეიცვალა.", "changecontentmodel-cannot-convert": "[[:$1]]-ის შინაარსის $2-ის ტიპზე კონვერტაცია შეუძლებელია.", diff --git a/languages/i18n/kk-cyrl.json b/languages/i18n/kk-cyrl.json index a4a679f82f..bd1ee6544e 100644 --- a/languages/i18n/kk-cyrl.json +++ b/languages/i18n/kk-cyrl.json @@ -13,7 +13,8 @@ "아라", "Macofe", "Batyrbek.kz", - "Matma Rex" + "Matma Rex", + "Nemo bis" ] }, "tog-underline": "Сілтеменің астын сызу:", @@ -127,6 +128,8 @@ "october-date": "Қазан $1", "november-date": "Қараша $1", "december-date": "Желтоқсан $1", + "period-am": "Түстен бұрыңғы", + "period-pm": "Түстен кейінгі", "pagecategories": "{{PLURAL:$1|Санат|Санат}}", "category_header": "«$1» санатындағы беттер", "subcategories": "Санатшалар", @@ -315,7 +318,7 @@ "laggedslavemode": "Ескерту: Бетте жуықтағы жаңартулар болмауы мүмкін.", "readonly": "Дерекқоры құлыпталған", "enterlockreason": "Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.", - "readonlytext": "Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.\n\nҚұлыптаған әкімші бұны былай түсіндіреді: $1", + "readonlytext": "Мүмкін жоспарлы дерекқор текникалық қызмет көрсетуі үшін бұл дерекқор жаңа енгізілімдер және басқа өзгерістер жасаудан қазіргі уақытта құлыпталынған, бұны бітіргеннен соң қалыпты іске қайтарылады.\n\nҚұлыптаған жүйе әкімшісі мына түсіндірмені қалдырды: $1", "missing-article": "Бар болуы жөн былай аталған бет мәтіні дерекқорда табылмады: «$1» $2.\n\nБұл ескірген айырма сілтемесіне немесе жойылған бет тарихы сілтемесіне ергеннен бола береді.\n\nЕгер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.\nБұл туралы нақты URL жайына аңғартпа жасап, [[Special:ListUsers/sysop|әкімшіге]] баяндаңыз.", "missingarticle-rev": "(түзету нұсқасы#: $1)", "missingarticle-diff": "(Айырым: $1, $2)", @@ -371,7 +374,7 @@ "mypreferencesprotected": "Сізде баптауларыңызды өңдеуге рұқсатыңыз жоқ.", "ns-specialprotected": "Арнайы беттер өңдеуге келмейді.", "titleprotected": "Бұл атауды бастаудан [[User:$1|$1]] қорғаған.\nКелтірілген себебі: $2.", - "filereadonlyerror": "«$2» файл қоры тек қана оқу тәртіптемесінде тұрғасын «$1» файлын өзгерту мүмкін емес.\nБұл тәртіптемені қондырған әкімші келесі түсіндірмені қалдырды: «$3»", + "filereadonlyerror": "«$2» файл қоры тек қана оқу тәртіптемесінде тұрғасын «$1» файлын өзгерту мүмкін емес.\n\nЖүйе әкімшісі оны кім құлыптағанын бұл түсіндірмені ұсынды: «$3»", "invalidtitle-knownnamespace": "«$2» есім кеңістік түрі және «$3» мәтіні жарамсыз", "invalidtitle-unknownnamespace": "Нөмері $1 белгісіз есім кеңістік атауы және «$2» мәтіні жарамсыз", "exception-nologin": "Кірмегенсіз", @@ -381,6 +384,8 @@ "virus-scanfailed": "скайнерлеу орындалмады (коды: $1)", "virus-unknownscanner": "белгісіз антивирус:", "logouttext": "Жүйеден шықтыңыз.\n\nКейбір беттер браузеріңіздің кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкіндігін ескеріңіз.", + "cannotlogoutnow-title": "Қазір шығу мүмкін емес", + "cannotlogoutnow-text": "$1 қолданған кезде шығу мүмкін емес.", "welcomeuser": "Қош келдіңіз, $1!", "welcomecreation-msg": "Сіз тіркелдіңіз.\n{{SITENAME}} [[Special:Preferences|баптауларыңызды]] өзіңіз қалауыңыз бойынша өзгерте аласыз.", "yourname": "Қатысушы аты:", @@ -397,6 +402,8 @@ "remembermypassword": "Тіркелгімді осы браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})", "userlogin-remembermypassword": "Мені жүйеде сақтап қою", "userlogin-signwithsecure": "Қауіпсіз байланысуды қолдану", + "cannotloginnow-title": "Қазір шығу мүмкін емес", + "cannotloginnow-text": "$1 қолданған кезде шығу мүмкін емес.", "yourdomainname": "Үйшігіңіз:", "password-change-forbidden": "Сіз бұл уикиде құпия сөзіңізді өзгерте алмайсыз.", "externaldberror": "Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.", @@ -454,6 +461,7 @@ "wrongpasswordempty": "Құпия сөз бос болған.\nҚайта байқап көріңіз.", "passwordtooshort": "Құпиясөзде кем дегенде {{PLURAL:$1|1таңба|таңба}} болуы керек.", "passwordtoolong": "Құпиясөз {{PLURAL:$1|1таңбадан|таңбадан}} көп болмау керек.", + "passwordtoopopular": "Көп жағдайда таңдалатын құпиясөзді қолдана алмайсыз. Басқа бірегей құпиясөз таңдаңыз.", "password-name-match": "Құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.", "password-login-forbidden": "Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.", "mailmypassword": "Құпия сөзді қалпына кеттіру", @@ -479,7 +487,7 @@ "createaccount-title": "{{SITENAME}} жобасына тіркелу", "createaccount-text": "Әлдебіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» деген атау, «$3» деген құпия сөзбен тіркелгі жасаған.\nҚазір жүйеге кіріуіңіз және құпия сөзіңізді өзгертуіңіз керек.\n\nЕгер бұл тіркелгі қателікпен жасалса осы хабарламаны елемеуіңізге болады.", "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз.\nҚайта байқап көрмес бұрын $1 күте тұрыңыз.", - "login-abort-generic": "Жүйеге кіру сәтсіз болды - Доғарылды.", + "login-abort-generic": "Сіздің кіруіңіз орындалмады - Доғарылды.", "login-migrated-generic": "Тіркелгіңіздің тасымалданған болатын және сіздің қатысуыш есіміңіз бұдан былай осы уикиде болмайды.", "loginlanguagelabel": "Тіл: $1", "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені бұл бұзылған браузер немесе кэштеуші прокси арқылы жіберілгенге ұқсайды.", @@ -500,15 +508,31 @@ "resetpass_submit": "Құпия сөзді қойыңыз да кіріңіз", "changepassword-success": "Құпия сөзіңіз өзгертілді!", "changepassword-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.", + "botpasswords": "Бот құпиясөздері", + "botpasswords-disabled": "Бот құпиясөздері өшірілген.", + "botpasswords-no-central-id": "Бот құпиясөздерін қолдану үшін, орталықтандырылған тіркелгіңізбен кіруіңіз керек.", + "botpasswords-existing": "Бар бот құпиясөздері", + "botpasswords-createnew": "Жаңа бот құпиясөзін бастау", + "botpasswords-editexisting": "Бар бот құпиясөзін өңдеу", + "botpasswords-label-appid": "Бот атауы:", + "botpasswords-label-create": "Бастау", "botpasswords-label-update": "Жаңарту", "botpasswords-label-cancel": "Болдырмау", "botpasswords-label-delete": "Жою", "botpasswords-label-resetpassword": "Құпия сөзді қалпына кеттіру", + "botpasswords-label-grants": "Қолданылатын гранттар:", + "botpasswords-label-restrictions": "Пайдалану шектеулері:", + "botpasswords-bad-appid": "\"$1\" бот атауы жарамды емес.", + "botpasswords-insert-failed": "\"$1\" бот атауын қосу орындалмады. Ол әлдеқашан қосылған ба еді?", + "botpasswords-update-failed": "\"$1\" бот атауын жаңарту орындалмады. Ол әлдеқашан жойылған ба еді?", + "botpasswords-created-title": "Бот құпиясөзі құрылды", + "botpasswords-updated-title": "Бот құпиясөзі жаңартылды", + "botpasswords-deleted-title": "Бот құпиясөзі жойылды", "resetpass_forbidden": "Құпия сөз өзгертілмейді", "resetpass-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.", "resetpass-submit-loggedin": "Құпия сөзді өзгерту", "resetpass-submit-cancel": "Болдырмау", - "resetpass-wrong-oldpass": "Уақытша немесе қазіргі құпия сөзіңіз жарамсыз.\nМүмкін сіз құпия сөзді сәтті өзгерткенсіз немесе жаңа уақытша құпия сөзге сұраным жасағансыз.", + "resetpass-wrong-oldpass": "Уақытша немесе қазіргі құпия сөзіңіз жарамсыз.\nМүмкін сіз құпия сөзді өзгерткенсіз немесе жаңа уақытша құпия сөзге сұраным жасағансыз.", "resetpass-recycled": "Құпия сөзіңізді қазіргі құпия сөзіңізден өзгеше етіп өзгертіңіз.", "resetpass-temp-emailed": "Сіз уақытша email-ды кодпен кірдіңіз.\nКіруді аяқтау үшін жаңа құпия сөзді мында орнатуыңыз керек:", "resetpass-temp-password": "Уақытша құпия сөз:", @@ -530,7 +554,7 @@ "passwordreset-emailtext-ip": "Әлде кім (мүмкін сіз болуыңыз, $1 IP адресінен) {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунты|аккаунттары}} осы электронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз бұрынғы құпия сөзіңізді еске түсірсеңіз және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрынғы құпия сөзді қолдана беруіңізге болады.", "passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.", "passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2", - "passwordreset-emailsentemail": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді.", + "passwordreset-emailsentemail": "Бұл email мекенжайы тіркелгіңізге байланысқан, сол себепті құпия сөзді өзгерту электронды пошта арқылы жөнелтіледі.", "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.", "passwordreset-emailerror-capture": "Құпиясөзді өзгерту электрон хаты жасалды, ол төменде көрсетілген, бірақ ол {{GENDER:$2|қатысушыға}} жөнелтілмеді: $1", "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау", @@ -639,7 +663,7 @@ "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз
\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\nАвторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!", "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.
\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\nАвторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!", "longpageerror": "ҚАТЕЛІК: Сақтамақшы болған мәтініңіздің көлемі {{PLURAL:$1|бір килобайт|$1 килобайт}} ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.\nБұл сақталмайды.", - "readonlywarning": "ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алуңызға болады. \n\nАдминстратор оны құлыптау себебін келесідей түсіндіреді: $1", + "readonlywarning": "ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алуңызға болады. \n\nЖүйе админстраторы оны құлыптау себебін келесідей түсіндіреді: $1", "protectedpagewarning": "Ескерту: Бұл бет өңдеуден қорғалған сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады.\nТөменде соңғы журнал жазбасы көрсетілген:", "semiprotectedpagewarning": "Ескерту: Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:", "cascadeprotectedwarning": "Ескерту: Бұл бет қорғалған, сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:", @@ -1005,10 +1029,10 @@ "userrights": "Қатысушы құқықтарын реттеу", "userrights-lookup-user": "Қатысушы топтарын реттеу", "userrights-user-editname": "Қатысушы атын енгізіңіз:", - "editusergroup": "Қатысушы топтарын өңдеу", + "editusergroup": "{{GENDER:$1|Қатысушы}} топтарын өңдеу", "editinguser": "[[User:$1|$1]] $2 {{GENDER:$1|есімді қатысушының}} қатысушы құқықтарын өзгерту", "userrights-editusergroup": "Қатысушы топтарын өңдеу", - "saveusergroups": "Қатысушы топтарын сақтау", + "saveusergroups": "{{GENDER:$1|Қатысушы}} топтарын сақтау", "userrights-groupsmember": "Мүшелігі:", "userrights-groupsmember-auto": "Бұлтарасыз мүше:", "userrights-groups-help": "Бұл қатысушы кіретін топтарды реттей аласыз.\n* Құсбелгі қойылған көзі қатысушы бұл топқа кіргенін көрсетеді;\n* Құсбелгі алып тасталған көз қатысушы бұл топқа кірмегенін көрсетеді;\n* Келтірілген * топты бір үстегенінен кейін аластай алмайтындығын, не қарама-қарсысын көрсетеді.", @@ -1020,7 +1044,7 @@ "userrights-changeable-col": "Өзгерте алатын топтар", "userrights-unchangeable-col": "Өзгерте алмайтын топтар", "userrights-conflict": "Қатысушы құқықтарының қақтығысы! Өзгертулеріңізді қайта қарап шығыңыз және құптаңыз.", - "userrights-removed-self": "Өзіңіздің құқықтарыңызды сәтті алып тастадыңыз. As such, you are no longer able to access this page.", + "userrights-removed-self": "Өзіңіздің құқықтарыңызды алып тастадыңыз. Осылайша бұл бетке бұдан былай қатынай алмайсыз.", "group": "Топ:", "group-user": "Қатысушылар", "group-autoconfirmed": "Өздіктіқұпталған қатысушылар", @@ -1100,7 +1124,7 @@ "right-noratelimit": "Еселік шектелімдері ықпал етпейді", "right-import": "Басқа уикилерден беттерді сырттан алу", "right-importupload": "Файлдарды жүктеу арқылы беттерді сырттан алу", - "right-patrol": "Басқарардың өңдемелерін зерттелді деп белгілеу", + "right-patrol": "Басқарардың өңдемелерін тексерілді деп белгілеу", "right-autopatrol": "Өз өңдемелерін тексерілді деп өздіктік белгілеу", "right-patrolmarks": "Жуықтағы өзгерістердегі зерттеу белгілерін көру", "right-unwatchedpages": "Бақыланылмаған бет тізімін көру", @@ -1147,8 +1171,8 @@ "action-rollback": "жекелік беттегі соңғы өңдеген қатысушының соңғы өңдемелерін жылдам шегіндіру", "action-import": "беттерді басқа уикиден импортау", "action-importupload": "беттерді файл жүктеуінен импорттау", - "action-patrol": "басқалардың өңдеулерін зерттелді деп белгілеу", - "action-autopatrol": "өзіңіздің өңдемеңізді зерттелді деп белгілеу", + "action-patrol": "басқалардың өңдемелерін тексерілді деп белгілеу", + "action-autopatrol": "өзіңіздің өңдемеңізді тексерілді деп белгілеу", "action-unwatchedpages": "бақыланылмаған беттер тізімін қарау", "action-mergehistory": "Бұл беттің өзгеріс тарихын қосу", "action-userrights": "Қатысушылардың барлық құқықтарын өзгерту", @@ -1227,9 +1251,9 @@ "recentchangeslinked-page": "Бет атауы:", "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет", "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты", - "recentchanges-page-added-to-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санатқа қосылды", + "recentchanges-page-added-to-category-bundled": "[[:$1]] және [[Special:WhatLinksHere/$1|{{PLURAL:$2|бір бет|$2 бет}}]] санатқа қосылды", "recentchanges-page-removed-from-category": "[[:$1]] санаттан алынды", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санаттан алынды", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] және [[Special:WhatLinksHere/$1|{{PLURAL:$2|бір бет|$2 бет}}]] санаттан алынды", "autochange-username": "МедиаУики өздікті өзгерісі", "upload": "Файл жүктеу", "uploadbtn": "Файлды жүктеу", @@ -1355,7 +1379,7 @@ "backend-fail-read": "«$1» файлы оқылмайды.", "backend-fail-create": "«$1» файлы жазылмайды.", "backend-fail-maxsize": "\"$1\" файлы жазылмайды, себебі {{PLURAL:$2|1 байттан|$2 байттан}} үлкенірек.", - "backend-fail-readonly": "«$1» сақтау сервері қазіргі уақытта «тек оқу» режимінде орналасқан. Себебі: «$2»", + "backend-fail-readonly": "«$1» сақтау сервері қазіргі уақытта тек оқу режимінде орналасқан. Себебі: $2", "backend-fail-synced": "«$1» файлы ішкі сақтау серверінде келісімсіз жағдайда орналасқан", "backend-fail-connect": "«$1» сақтау серверіне байланыспады.", "backend-fail-internal": "«$1» сақтау серверінде белгісіз қате кездесті.", @@ -1758,7 +1782,7 @@ "emailccsubject": "$1 дегенге хатыңыздың көшірмесі: $2", "emailsent": "Хат жөнелтілді", "emailsenttext": "Е-пошта хатыңыз жөнелтілді.", - "emailuserfooter": "Бұл электронды хатты {{SITENAME}} сайтындағы «{{int:emailuser}}» функцияцы арқылы $1 деген $2 дегенге жіберген.", + "emailuserfooter": "Бұл электронды хатты {{SITENAME}} сайтындағы «{{int:emailuser}}» функцияцы арқылы $1 деген {{GENDER:$2|$2}} дегенге {{GENDER:$1|жіберген}}.", "usermessage-summary": "Жүйе хабарламасы қалдырылуда.", "usermessage-editor": "Жүйе мессенжері", "watchlist": "Бақылау тізімі", @@ -1768,10 +1792,10 @@ "watchlistanontext": "Бақылау тізіміңіздегі даналарды қарау не өңдеу үшін кіріңіз.", "watchnologin": "Кірмегенсіз", "addwatch": "Бақылау тізіміңізге қосу", - "addedwatchtext": "«[[:$1]]» беті [[Special:Watchlist|бақылау тізіміңізге]] қосылды.\nБұл беттің және байланысты талқылау бетінің келешектегі өзгерістері сонда тізімделеді.", + "addedwatchtext": "«[[:$1]]» және оның талқылау беті [[Special:Watchlist|бақылау тізіміңізге]] қосылды.", "addedwatchtext-short": "«$1» беті бақылау тізіміңізге қосылды.", "removewatch": "Бақылау тізіміңізден аластату", - "removedwatchtext": "«[[:$1]]» беті [[Special:Watchlist|бақылау тізіміңізден]] аласталды.", + "removedwatchtext": "«[[:$1]]» және оның талқылау беті [[Special:Watchlist|бақылау тізіміңізден]] аласталды.", "removedwatchtext-short": "«$1» беті бақылау тізіміңізден аласталды", "watch": "Бақылау", "watchthispage": "Бұл бетті бақылау", @@ -1841,7 +1865,7 @@ "delete-toobig": "Бұл бетте үлкен түзету тарихы бар, $1 {{PLURAL:$1|түзетуден|түзетуден}} астам.\nБұндай беттердің жоюы {{SITENAME}} торабын әлдеқалай үзіп тастауына бөгет салу үшін тиымдалған.", "delete-warning-toobig": "Бұл бетте үлкен өңдеу тарихы бар, $1 {{PLURAL:$1|түзетуден|түзетуден}} астам.\nБұның жоюы {{SITENAME}} торабындағы дерекқор әрекеттерді үзіп тастауын мүмкін;\nбұны абайлап өткізіңіз.", "deleteprotected": "Сіз бұл бетті жоя алмайсыз, себебі ол қорғалған.", - "deleting-backlinks-warning": "'''Ескерту:''' Сіз жоймақшы болған бетке [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерден]] сілтенген немесе [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерге]] кірістірілген.", + "deleting-backlinks-warning": "Ескерту: Сіз жоймақшы болған бетке [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерден]] сілтенген немесе [[Special:WhatLinksHere/{{FULLPAGENAME}}|басқа беттерге]] кірістірілген.", "rollback": "Өңдемелерді шегіндіру", "rollbacklink": "шегіндіру", "rollbacklinkcount": "$1 {{PLURAL:$1|өңдемені|өңдемені}} шегіндіру", @@ -2288,9 +2312,9 @@ "tooltip-pt-anonuserpage": "Бұл IP мекенжайдың жеке беті", "tooltip-pt-mytalk": "Талқылау бетіңіз", "tooltip-pt-anontalk": "Бұл IP мекенжай өңдемелерін талқылау", - "tooltip-pt-preferences": "Бапталымдарым", + "tooltip-pt-preferences": "{{GENDER:|Бапталымдарым}}", "tooltip-pt-watchlist": "Өзгерістерін бақылап тұрған беттер тізімім.", - "tooltip-pt-mycontris": "Өңдеулеріңіздің тізімі", + "tooltip-pt-mycontris": "{{GENDER:|Үлестеріңіздің}} тізімі", "tooltip-pt-anoncontribs": "Бұл IP мекенжаймен жасаған өңдемелер тізімі", "tooltip-pt-login": "Кіруіңізді ұсынамыз, ол міндетті емес.", "tooltip-pt-logout": "Шығу", @@ -2322,7 +2346,7 @@ "tooltip-t-recentchangeslinked": "Мыннан сілтенген беттердің жуықтағы өзгерістері", "tooltip-feed-rss": "Бұл беттің RSS арнасы", "tooltip-feed-atom": "Бұл беттің Atom арнасы", - "tooltip-t-contributions": "Осы қатысушының үлестерінің тізімі", + "tooltip-t-contributions": "{{GENDER:$1|Осы қатысушының}} үлестері тізімі", "tooltip-t-emailuser": "Осы қатысушыға хат жөнелту", "tooltip-t-info": "Бұл бет туралы көбірек мәлімет", "tooltip-t-upload": "Файлдарды жүктеу", @@ -2420,14 +2444,14 @@ "pageinfo-category-pages": "Беттер саны", "pageinfo-category-subcats": "Санатшалар саны", "pageinfo-category-files": "Файлдар саны", - "markaspatrolleddiff": "Зерттелді деп белгілеу", + "markaspatrolleddiff": "Тексерілді деп белгілеу", "markaspatrolledtext": "Бұл бетті тексерілді деп белгілеу", "markedaspatrolled": "Тексерілді деп белгіленді", "markedaspatrolledtext": "Бөлектенген нұсқа [[:$1]] тексерілді деп белгіленді.", "rcpatroldisabled": "Жуықтағы өзгерістерді зерттеуі өшірілген", "rcpatroldisabledtext": "Жуықтағы өзгерістерді зерттеу мүмкіндігі ағымда өшірілген.", "markedaspatrollederror": "Зерттелді деп белгіленбейді", - "markedaspatrollederrortext": "Зерттелді деп белгілеу үшін түзетуді келтіріңіз.", + "markedaspatrollederrortext": "Тексерілді деп белгілеу үшін түзетуді келтіріңіз.", "markedaspatrollederror-noautopatrol": "Өз жасаған өзгерістеріңізді зерттелді деп белгілей алмайсыз.", "markedaspatrollednotify": "$1 бетіндегі бұл өзгеріс тексерілді деп белгіленді.", "markedaspatrollederrornotify": "Тексерілді деп белгіленбеді.", @@ -2481,7 +2505,7 @@ "seconds-abbrev": "$1с", "minutes-abbrev": "$1мин", "hours-abbrev": "$1сағ", - "seconds": "{{PLURAL:$1|$1 секунт|$1 секунт}}", + "seconds": "{{PLURAL:$1|$1 секунд|$1 секунд}}", "minutes": "{{PLURAL:$1|$1 минут|$1 минут}}", "hours": "{{PLURAL:$1|$1 сағат|$1 сағат}}", "days": "{{PLURAL:$1|$1 күн|$1 күн}}", @@ -2870,7 +2894,7 @@ "scarytranscludefailed-httpstatus": "[$1: HTTP $2 үшін үлгі келтіруі сәтсіз болды]", "scarytranscludetoolong": "[URL тым ұзын]", "deletedwhileediting": "Ескету: Бұл бетті өңдеуіңізді бастағанда, осы бет жойылды!", - "confirmrecreate": "Бұл бетті өңдеуіңізді бастағанда [[User:$1|$1]] ([[User talk:$1|талқылауы]]) осы бетті жойды, келтірген себебі:\n: ''$2''\nОсы бетті қайта бастауын нақты тілегеніңізді құптаңыз.", + "confirmrecreate": "Бұл бетті өңдеуіңізді бастағанда [[User:$1|$1]] ([[User talk:$1|талқылауы]]) осы бетті жойды, келтірген себебі:\n: $2\nОсы бетті қайта бастауын нақты тілегеніңізді құптаңыз.", "confirmrecreate-noreason": "Бұл бетті өңдеп бастағаныңызда [[User:$1|$1]] ([[User talk:$1|талқылауы]]) жойды. \nОсы бетті қайта бастауын нақты тілегеніңізді құптаңыз.", "recreate": "Қайта бастау", "unit-pixel": " нүкте", @@ -3133,7 +3157,7 @@ "tags-edit-revision-legend": "{{PLURAL:$1|Бұл нұсқадан|Барлық $1 нұсқадан}} тегтерді аластау не қосу", "tags-edit-logentry-legend": "{{PLURAL:$1|Бұл журнал жазбасынан|Барлық $1 журнал жазбасынан}} тегтерді аластау не қосу", "tags-edit-existing-tags": "Бар тегтер:", - "tags-edit-existing-tags-none": "«Ештеңе»", + "tags-edit-existing-tags-none": "Ештеңе", "tags-edit-new-tags": "Жаңа тегтер:", "tags-edit-add": "Мына тегтерді қосу:", "tags-edit-remove": "Мына тегтерді аластау:", @@ -3143,7 +3167,7 @@ "tags-edit-reason": "Себебі:", "tags-edit-revision-submit": "{{PLURAL:$1|Бұл нұсқадағы|$1 нұсқадағы}} өзгерістерді қолдану", "tags-edit-logentry-submit": "{{PLURAL:$1|Бұл журнал жазбасындағы|$1 журнал жазбасындағы}} өзгерістерді қолдану", - "tags-edit-success": "Өзгерістер сәтті қолданылды.", + "tags-edit-success": "Өзгерістер қолданылды.", "tags-edit-failure": "Өзгерістер қолданылмады: $1", "tags-edit-nooldid-title": "Нысана түзету жарамсыз", "tags-edit-nooldid-text": "Бұл функцияны орындау үшін толық нұсқасын сұрамағансыз немесе көрсетілген нұсқа жоқ.", @@ -3278,7 +3302,7 @@ "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.", "api-error-badtoken": "Ішкі қате: Жаман байрақша", "api-error-copyuploaddisabled": "URL бойынша жүктеу бұл серверде өшірілген", - "api-error-duplicate": "{{PLURAL:$1|басқа файл|кейбір басқа файл}} әлеқашан сайтта басқа мазмұнда бар.", + "api-error-duplicate": "{{PLURAL:$1|басқа [$2 файл]|кейбір [$2 басқа файл]}} әлеқашан сайтта ,бірдей мазмұнда бар.", "api-error-empty-file": "Сіз жіберген файл бос.", "api-error-emptypage": "Бос бетті жаңадан бастау рұқсат етілмейді.", "api-error-fetchfileerror": "Ішкі қателік: Файлды алу барысында қате кетті.", @@ -3320,7 +3344,7 @@ "api-error-unknownerror": "Белгісіз қате: \"$1\".", "api-error-uploaddisabled": "Бұл уикиде жүктеп беру өшірілген.", "api-error-verification-error": "Бұл файл бүлінген болуы мүмкін немесе теріс кеңейтуі бар.", - "duration-seconds": "$1 {{PLURAL:$1|секунт|секунт}}", + "duration-seconds": "$1 {{PLURAL:$1|секунд|секунд}}", "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}", "duration-hours": "$1 {{PLURAL:$1|сағат|сағат}}", "duration-days": "$1 {{PLURAL:$1|күн|күн}}", @@ -3332,9 +3356,9 @@ "rotate-comment": "Сурет сағат бағытымен $1 {{PLURAL:$1|бұрыш|бұрыш}} айналды", "limitreport-title": "Деректер анализаторы:", "limitreport-cputime": "CPU уақытында қолданылуы", - "limitreport-cputime-value": "$1 {{PLURAL:$1|секунт|секунт}}", + "limitreport-cputime-value": "$1 {{PLURAL:$1|секунд|секунд}}", "limitreport-walltime": "Нақты уақытта қолданылуы", - "limitreport-walltime-value": "$1 {{PLURAL:$1|секунт|секунт}}", + "limitreport-walltime-value": "$1 {{PLURAL:$1|секунд|секунд}}", "limitreport-ppvisitednodes": "Аралаған түйіндер саны", "limitreport-ppgeneratednodes": "Препроцессордың жинақталатын түйіндерінің саны", "limitreport-postexpandincludesize": "Кірістірілген ашық мөлшері", @@ -3358,7 +3382,7 @@ "expand_templates_preview": "Қарап шығу", "expand_templates_preview_fail_html": "Мұнда сессия деректері жоғалған, себебі {{SITENAME}} жобасында HTML іске қосылған, JavaScript шабуылдарына қарсы сақтық шарасы үшін алдын ала қарап шығу жасырылған.\n\nЕгер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз. \nЕгер бұл әлі істемесе жүйеден [[Special:UserLogout|шығып]] қайта кіріп көріңіз.", "expand_templates_preview_fail_html_anon": "JavaScript шабуылдарына қарсы сақтық шарасы үшін алдын ала қарап шығу жасырылған, себебі {{SITENAME}} жобасында HTML іске қосылған және сіз жүйеге кірмегенсіз,.\n\nЕгер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз. \nЕгер бұл әлі істемесе, жүйеге [[Special:UserLogin|кіріп]] қайта байқап көріңіз.", - "pagelanguage": "Тіл таңдау беті", + "pagelanguage": "Бет тілін өзгерту", "pagelang-name": "Бет", "pagelang-language": "Тіл", "pagelang-use-default": "Әдепкі тілді қолдану", @@ -3366,7 +3390,7 @@ "pagelang-submit": "Жөнелту", "right-pagelang": "Бет тілін аудару", "action-pagelang": "бет тілін аудару", - "log-name-pagelang": "Тіл журналын өзгерту", + "log-name-pagelang": "Тіл өзгерту журналы", "log-description-pagelang": "Бұл бет тілдерін өзгерту журналы.", "logentry-pagelang-pagelang": "$1 $3 беті үшін $4 дегеннен $5 дегенге бет тілін {{GENDER:$2|өзгертті}}.", "default-skin-not-found-row-enabled": "* $1 / $2 (ендірілген)", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index c58ce561f1..8dcbb02a72 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -201,7 +201,6 @@ "moredotdotdot": "더 보기...", "morenotlisted": "이 목록은 완성되지 않았습니다.", "mypage": "문서", - "anonuserpage": "알 수 없는 사용자", "mytalk": "토론", "anontalk": "토론", "navigation": "둘러보기", @@ -1459,7 +1458,8 @@ "foreign-structured-upload-form-label-own-work": "자작입니다", "foreign-structured-upload-form-label-infoform-categories": "분류", "foreign-structured-upload-form-label-infoform-date": "날짜", - "foreign-structured-upload-form-label-not-own-work-message-shared": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.", + "foreign-structured-upload-form-label-own-work-message-shared": "나는 이 파일에 대한 저작권을 소유하고 있음을 입증하고, 영구히 위키미디어 공용에 이 파일을 [https://creativecommons.org/licenses/by-sa/4.0/ 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0]에 따라 배포하는 데 동의하며, [https://wikimediafoundation.org/wiki/Terms_of_Use 이용 약관]에 동의합니다.", + "foreign-structured-upload-form-label-not-own-work-message-shared": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 사용하는 것을 고려해보세요.", "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.", "backend-fail-backup": "\"$1\" 파일을 백업할 수 없습니다.", "backend-fail-notexists": "$1 파일이 존재하지 않습니다.", @@ -1492,7 +1492,7 @@ "lockmanager-fail-deletelock": "\"$1\"에 대한 잠금 파일을 삭제하지 못했습니다.", "lockmanager-fail-acquirelock": "\"$1\"에 대한 잠금이 실패했습니다.", "lockmanager-fail-openlock": "\"$1\"에 대한 잠금 파일을 열지 못했습니다.", - "lockmanager-fail-releaselock": "\"$1\"에 대한 잠금을 해제하지 못했습니다.", + "lockmanager-fail-releaselock": "\"$1\"에 대한 잠금을 풀지 못했습니다.", "lockmanager-fail-db-bucket": "데이터베이스의 버킷 $1의 잠금을 풀지 못했습니다.", "lockmanager-fail-db-release": "데이터베이스 $1의 잠금을 풀지 못했습니다.", "lockmanager-fail-svr-acquire": "서버 $1의 잠금을 걸지 못했습니다.", diff --git a/languages/i18n/ksh.json b/languages/i18n/ksh.json index 7ee99a68c9..01e2da7e10 100644 --- a/languages/i18n/ksh.json +++ b/languages/i18n/ksh.json @@ -9,7 +9,8 @@ "לערי ריינהארט", "아라", "TTO", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "Dun de Lengks ongerschtriische:", @@ -151,7 +152,6 @@ "moredotdotdot": "Mih â€¦", "morenotlisted": "Et jeiht noch wigger â€¦", "mypage": "Metmaachersigg", - "anonuserpage": "Onbikannte Metmaacher", "mytalk": "Klaafsigg", "anontalk": "Klaaf för ene nahmelohse Metmaacher", "navigation": "Jangk noh de", @@ -1299,7 +1299,7 @@ "recentchangeslinked-page": "Dä Sigg ier Övverschreff:", "recentchangeslinked-to": "Zeisch de Änderonge aan dä Sigge, woh Lengks op di aanjejovve Sigg drop sin", "recentchanges-page-added-to-category": "Di Sigg [[:$1]] wood en di Saachjrop jedonn", - "recentchanges-page-added-to-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg wood|$2 Sigge woodte|kein Sigg wood}} en di Saachjrop jedonn", + "recentchanges-page-added-to-category-bundled": "Di Sigg [[:$1]] un [[Special:WhatLinksHere/$1|{{PLURAL:$2|noch ein Sigg wood|$2 Sigge woodte|kein Sigg wood}}]] en di Saachjrop jedonn", "recentchanges-page-removed-from-category": "Di Sigg [[:$1]] wood uß dä Saachjrop jenumme", "recentchanges-page-removed-from-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg woodte|$2 Sigge woodte|kein Sigg wood}} uß dä Saachjrop jenumme", "autochange-username": "Automattesche Ännderong aam MediaWiki", @@ -3569,5 +3569,6 @@ "mw-widgets-titleinput-description-new-page": "di Sigg jidd_et noch nit", "mw-widgets-titleinput-description-redirect": "ömleijde op „$1“", "api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.", - "randomrootpage": "Zofällige Aanfangs-Sigg" + "randomrootpage": "Zofällige Aanfangs-Sigg", + "log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße" } diff --git a/languages/i18n/la.json b/languages/i18n/la.json index 6e69c27b9a..a9f3289b77 100644 --- a/languages/i18n/la.json +++ b/languages/i18n/la.json @@ -52,7 +52,7 @@ "tog-enotifminoredits": "Etiam de minoribus recensionibus certior fiam", "tog-enotifrevealaddr": "Ostendatur inscriptio mea electronica in nuntiis notificantibus", "tog-shownumberswatching": "Numerum usorum observantium monstrare", - "tog-oldsig": "Subscriptio, qua nunc uteris:", + "tog-oldsig": "Subscriptio, qua adhuc uteris:", "tog-fancysig": "Subscriptio vicitext (sine nexu automatico)", "tog-uselivepreview": "Prospectum viventem perhibere", "tog-forceeditsummary": "Cavere, ut recensionem summatim describam", @@ -363,6 +363,7 @@ "gotaccountlink": "Nomen da", "userlogin-resetlink": "Num tesserae tuae oblitus es?", "userlogin-resetpassword-link": "Num tesserae oblitus es?", + "userlogin-helplink2": "auxilium dandi nominis", "createacct-emailrequired": "Inscriptio electronica", "createacct-emailoptional": "Inscriptio electronica (non necesse)", "createacct-email-ph": "Inscriptionem electronicam tuam inscribe", @@ -422,6 +423,7 @@ "resetpass-submit-loggedin": "Tesseram mutare", "resetpass-submit-cancel": "Dimittere", "resetpass-temp-password": "Tessera temporaria:", + "passwordreset": "Tesseram restituere", "passwordreset-username": "Nomen usoris:", "passwordreset-email": "Inscriptio electronica:", "passwordreset-emailelement": "Nomen usoris: \n$1\n\nMomentarius Tessera: \n$2", @@ -474,7 +476,7 @@ "newarticle": "(Nova)", "newarticletext": "Per nexum progressus es ad paginam quae nondum exsistit.\nNovam paginam si vis creare, in capsam infra praebitam scribe.\n(Vide [$1 paginam auxilii] si plura cognoscere vis.)\nSi hic es propter errorem, solum '''Retrorsum''' in navigatro tuo preme.", "anontalkpagetext": "----\nHaec est pagina disputationis usoris anonymi vel potius loci IP cuiusdam.\nMemento locos IP interdum mutari et ab usoribus vel pluribus adhiberi.\nSi ipse sis usor ignotus et ex improviso invenias querulas aliquas, nomen tibi [[Special:UserLogin/signup|impone]] vel [[Special:UserLogin|nomen tuum da]], ut decetero confusionem effugias!", - "noarticletext": "Hac in pagina non sunt litterae.\nPotes [[Special:Search/{{PAGENAME}}|hanc rem in aliis paginis quaerere]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} acta huius paginae videre]\naut [{{fullurl:{{FULLPAGENAME}}|action=edit}} hanc paginam creare].", + "noarticletext": "Hac in pagina non sunt litterae.\nLicet [[Special:Search/{{PAGENAME}}|hanc rem in aliis paginis quaerere]] vel\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} acta huius paginae inspicere]\nvel [{{fullurl:{{FULLPAGENAME}}|action=edit}} hanc paginam creare].", "noarticletext-nopermission": "Hac in pagina non sunt litterae.\nPotes [[Special:Search/{{PAGENAME}}|hanc rem in aliis paginis quaerere]] aut [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} acta huius paginae videre], sed tibi non licet hanc paginam creare.", "userpage-userdoesnotexist": "Usor \"$1\" non est. Visne re vera hanc paginam creare vel recensere?", "updated": "(Novata)", @@ -586,6 +588,7 @@ "mergelog": "Acta confundendi", "revertmerge": "Inconfundere", "history-title": "Historia paginae \"$1\"", + "difference-title": "Quantum redactiones paginae \"$1\" differant", "lineno": "Linea $1:", "compareselectedversions": "Redactiones selectas conferre", "showhideselectedversions": "Redactiones selectas vel ostendi vel celari iubere", @@ -636,7 +639,7 @@ "preferences": "Modi", "mypreferences": "Modi", "prefs-edits": "Numerus recensionum:", - "prefs-skin": "Aspectum", + "prefs-skin": "Formae delectus", "skin-preview": "Prospectus", "datedefault": "Modus nondum delectus", "prefs-user-pages": "Paginae usoris", @@ -650,7 +653,7 @@ "prefs-misc": "Misc", "prefs-resetpass": "Tesseram mutare", "prefs-email": "Modi ad litteras electronicas spectantes", - "prefs-rendering": "Conspectus", + "prefs-rendering": "Aspectus", "saveprefs": "Hos modos servare", "restoreprefs": "Omnes (diversi) modi in integrum restituantur", "prefs-editing": "Recensere", @@ -662,7 +665,7 @@ "recentchangescount": "Quot mutationes index respiciat:", "prefs-help-recentchangescount": "Inclusis nuper mutatis, paginarum historiis, actis", "savedprefs": "Modi tui servati sunt.", - "timezonelegend": "Zona temporis:", + "timezonelegend": "Zona temporalis:", "localtime": "Hora indigena:", "timezoneuseoffset": "Alia (da dissimilitudinem cinguli horae)", "servertime": "Hora moderatri:", @@ -710,11 +713,13 @@ "prefs-info": "Generalia", "prefs-i18n": "Sermonis delectus", "prefs-signature": "Subscriptio", + "prefs-dateformat": "Forma temporalium", + "prefs-timeoffset": "Zona temporalis", "prefs-advancedediting": "Generalia", "prefs-editor": "Capsa editoria", "prefs-preview": "Prospectus", "prefs-advancedrc": "Modi speciales", - "prefs-advancedwatchlist": "Indicis modi speciales", + "prefs-advancedwatchlist": "Modi speciales", "prefs-displayrc": "Modi generales", "prefs-displaywatchlist": "Modi generales", "prefs-diffs": "Differentiae", @@ -1063,6 +1068,7 @@ "suppress": "Censura", "booksources": "Librorum fontes", "booksources-search-legend": "Fontes impressas quaerere", + "booksources-search": "Quaerere", "specialloguserlabel": "Usor:", "speciallogtitlelabel": "Destinatum (titulus aut usor):", "log": "Acta", @@ -1504,7 +1510,7 @@ "tooltip-t-permalink": "Nexus perpetuus ad hanc paginae redactionem", "tooltip-ca-nstab-main": "Videre paginam", "tooltip-ca-nstab-user": "Videre paginam usoris", - "tooltip-ca-nstab-special": "Haec est pagina specialis. Pagina ipsa recenseri non potest.", + "tooltip-ca-nstab-special": "Ea est pagina specialis, quin recenseatur.", "tooltip-ca-nstab-project": "Videre paginam inceptorum", "tooltip-ca-nstab-image": "Videre paginam fasciculi", "tooltip-ca-nstab-mediawiki": "Videre nuntium systematis", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 7986c9f8f9..d253742869 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -15,7 +15,8 @@ "VT98Fan", "Zinneke", "לערי ריינהארט", - "아라" + "아라", + "Nemo bis" ] }, "tog-underline": "Linken ënnersträichen:", @@ -155,7 +156,6 @@ "moredotdotdot": "Méi …", "morenotlisted": "Dës Lëscht ass net komplett.", "mypage": "Säit", - "anonuserpage": "Onbekannte Benotzer", "mytalk": "Diskussioun", "anontalk": "Diskussioun", "navigation": "Navigatioun", @@ -488,7 +488,7 @@ "createaccount-title": "Opmaache vun engem Benotzerkont op {{SITENAME}}", "createaccount-text": "Et gouf e Benotzerkont \"$2\" fir Iech op {{SITENAME}} ($4) ugeluecht mat dem Passwuert \"$3\".\nDir sollt Iech aloggen an Äert Passwuert elo änneren.\n\nWann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfach ignoréieren.", "login-throttled": "Dir hutt zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert.", - "login-abort-generic": "Dir sidd net ageloggt - Aloggen ofgebrach", + "login-abort-generic": "Äert Aloggen huet net funktionéiert - Ofgebrach", "login-migrated-generic": "Äre Benotzerkont gouf migréiert an Äre Benotzernumm gëtt et net méi op dëser Wiki.", "loginlanguagelabel": "Sprooch: $1", "suspicious-userlogout": "Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem futtise Browser oder Proxy-Tëschespäicher kënnt.", @@ -630,7 +630,7 @@ "newarticle": "(Nei)", "newarticletext": "Dir hutt op e Link vun enger Säit geklickt, déi et nach net gëtt. Fir déi Säit unzeleeën, gitt w.e.g. Ären Text an déi Këscht hei drënner an (kuckt d'[$1 Hëllef Säit] fir méi Informatiounen). Wann Dir duerch een Iertum heihi komm sidd, da klickt einfach op de Knäppchen '''Zréck''' vun Ärem Browser.", "anontalkpagetext": "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.\nSou eng IP Adress ka vun e puer Benotzer gedeelt ginn.\nWann Dir en anonyme Benotzer sidd an Dir irrelevant Bemierkunge krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''", - "noarticletext": "Dës Säit huet momentan keen Text.\nDir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} sou eng Säit uleeën].", + "noarticletext": "Dës Säit huet elo keen Text.\nDir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} dës Säit uleeën].", "noarticletext-nopermission": "Elo ass keen Text op dëser Säit.\nDir kënnt op anere Säiten [[Special:Search/{{PAGENAME}}|no dësem Säitentitel sichen]], oder [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an de Logbicher sichen], mä Dir hutt net déi néideg Rechter fir dës Säit unzeleeën.", "missing-revision": "D'Versioun #$1 vun der Säit mam Numm \"{{FULLPAGENAME}}\" gëtt et net.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].", "userpage-userdoesnotexist": "De Benotzerkont \"$1\" ass net registréiert.\nIwwerpréift w.e.g. op Dir dës Säit uleeën/ännere wëllt.", @@ -1145,14 +1145,14 @@ "grant-createaccount": "Benotzerkonten opmaachen", "grant-createeditmovepage": "Säiten uleeën, änneren a réckelen", "grant-delete": "Säiten, Versiounen a Rubriken a Logbicher läschen", - "grant-editinterface": "MediaWiki-Nummraum a Benotzer CSS/JS änneren", - "grant-editmycssjs": "Ären eegene Benotzer CSS/JavaScript änneren", + "grant-editinterface": "MediaWiki-Nummraum a Benotzer CSS/JavaScript änneren", + "grant-editmycssjs": "Äre Benotzer CSS/JavaScript änneren", "grant-editmyoptions": "Ännert Är Benotzerastellungen", "grant-editmywatchlist": "Ännert Är Iwwerwaachungslëscht", "grant-editpage": "Säiten déi et gëtt änneren", "grant-editprotected": "Gespaart Säiten änneren", "grant-oversight": "Benotzer verstoppen a Versioune läschen", - "grant-patrol": "Ännerungen op Säiten iwwerwaachen", + "grant-patrol": "Ännerungen op Säiten kontrolléieren", "grant-protect": "Säite spären an entspären", "grant-rollback": "Ännerungen op Säiten zrécksetzen", "grant-sendemail": "Anere Benotzer E-Maile schécken", @@ -1272,9 +1272,9 @@ "recentchangeslinked-page": "Säitennumm:", "recentchangeslinked-to": "Weis Ännerungen zu de verlinkte Säiten aplaz vun der gefroter Säit", "recentchanges-page-added-to-category": "[[:$1]] an d'Kategorie derbäigesat", - "recentchanges-page-added-to-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} an d'Kategorie derbäigesat", + "recentchanges-page-added-to-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) [[Special:WhatLinksHere/$1|{{PLURAL:$2|eng Säit|$2 Säiten}}]] an d'Kategorie derbäigesat", "recentchanges-page-removed-from-category": "[[:$1]] erausgeholl aus der Kategorie", - "recentchanges-page-removed-from-category-bundled": "{{PLURAL:$2|}}[[:$1]] a(n) {{PLURAL:$2|eng Säit|$2 Säiten}} aus der Kategorie erausgeholl", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] a(n) [[Special:WhatLinksHere/$1|{{PLURAL:$2|eng Säit|$2 Säiten}}]] aus der Kategorie erausgeholl", "autochange-username": "Automatesch MediaWiki-Ännerung", "upload": "Eroplueden", "uploadbtn": "Fichier eroplueden", @@ -1425,6 +1425,7 @@ "uploadstash-badtoken": "D'Ausféiere vun dëser Aktioun huet net funktionéiert, vläicht well d'Informatiounen iwwer Är Rechter ofgelaf sinn. Probéiert et w.e.g. nach emol.", "uploadstash-errclear": "D'Läsche vun de Fichieren huet net funktionéiert.", "uploadstash-refresh": "Lëscht vun de Fichieren aktualiséieren", + "uploadstash-thumbnail": "Miniaturbild weisen", "img-auth-accessdenied": "Zougang refuséiert", "img-auth-nopathinfo": "PATH_INFO feelt.\nÄre Server ass net agestallt fir déi Informatioun weiderzeginn.\nEt kann u CGI leien an datt imag_auth net ënnerstëtzt gëtt.\nKuckt https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization", "img-auth-notindir": "De gefrote Pad ass net am Upload-Repertoire agestallt.", @@ -3354,5 +3355,15 @@ "mw-widgets-titleinput-description-redirect": "viruleeden op $1", "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, dee méi iwwer de Sujet ausseet.", "sessionprovider-generic": "$1-Sessiounen", - "randomrootpage": "Zoufalls-Stammsäit" + "randomrootpage": "Zoufalls-Stammsäit", + "log-action-filter-block": "Typ vun der Spär:", + "log-action-filter-protect": "Typ vu Spär", + "log-action-filter-all": "All", + "log-action-filter-block-block": "Spären", + "log-action-filter-block-unblock": "Spär ophiewen", + "log-action-filter-delete-delete": "Säite läschen", + "log-action-filter-patrol-patrol": "Manuell Kontroll", + "log-action-filter-patrol-autopatrol": "Automatesch Kontroll", + "log-action-filter-protect-protect": "Spär", + "log-action-filter-protect-modify": "Spär-pÄnnerung" } diff --git a/languages/i18n/lij.json b/languages/i18n/lij.json index 483b3a757f..9ede18f258 100644 --- a/languages/i18n/lij.json +++ b/languages/i18n/lij.json @@ -11,7 +11,8 @@ "아라", "V6rg", "C.R.", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "Sottolineâ i collegamenti", @@ -1079,7 +1080,7 @@ "recentchangeslinked-page": "Nómme da pàgina:", "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ", "recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria", - "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|una paggina a l'è azonta|$2 paggine son azonte}} a-a categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|una paggina a l'è azonta|$2 paggine son azonte}}]] a-a categoria", "recentchanges-page-removed-from-category": "[[:$1]] rimosso da-a categoria", "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una paggina a l'è rimossa|$2 paggine son rimosse}} da-a categoria", "autochange-username": "Modiffica aotomattica MediaWiki", diff --git a/languages/i18n/lki.json b/languages/i18n/lki.json index 3026652a01..35c972437d 100644 --- a/languages/i18n/lki.json +++ b/languages/i18n/lki.json @@ -230,7 +230,7 @@ "copyright": " محتوایۀل هانإ ژئرنظر اجازه‌نامهٔ $1 مۀگۀر یۀگإ خلاف یۀ بوشرئ/ذکر بو", "copyrightpage": "{{ns:project}}:حق تکثیر", "currentevents": "پێش هەتێەل ایسگە", - "currentevents-url": "Project:رویدادةل ایسة", + "currentevents-url": "پێش هەتێەل ایسگە(ایسە)", "disclaimers": "دروو نامه -تکذیب نامه", "disclaimerpage": "Project:تکذیب‌نامهٔ عمومی", "edithelp": "راهنمای دۀسکاری کردن", diff --git a/languages/i18n/lrc.json b/languages/i18n/lrc.json index 1582bb3879..3fd7e2f0a5 100644 --- a/languages/i18n/lrc.json +++ b/languages/i18n/lrc.json @@ -7,7 +7,8 @@ "Macofe", "Mjbmr", "Matma Rex", - "Lakzon" + "Lakzon", + "Nemo bis" ] }, "tog-underline": "هوم پئیڤأند زیرخأط دار:", @@ -1893,7 +1894,7 @@ "protect-otherreason-op": "دألیل ھأنی", "protect-dropdown": "*دلیلیا جاافتائه سی پر و پیم کاری\n** خراوکاری Ú¯Ù¾ کلون\n** هرزه نیسی Ú¯Ù¾ کلون\n** جئن ویرایشتی وه درد نحور\n** بلگه فره تماشاکار دار", "protect-edit-reasonlist": "دلیلا پر و پیم بیین ویرایشت", - "protect-expiry-options": "Û± ساعأت:1 hour,Û± روٙز:1 day,Û± ھأفتە:1 week,Û² ھأفتە:2 weeks,Û± ما:1 month,Û³ ما:3 months,Û¶ ما:6 months,Û± سال:1 year,بی حئسۉ:infinite", + "protect-expiry-options": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite", "restriction-type": "دسرسی:", "restriction-level": "ریتراز محدودیت:", "minimum-size": "انازه کمترونه", @@ -2011,7 +2012,7 @@ "ipbenableautoblock": "بستن خودانجوم آخری تیرنشون آی پی وه کار گرته بیه وه دس کاریار و تیرنشونیا هنی که که د ونو سی ویرایشت وه سعی می کن.", "ipbsubmit": "نهاگری ای کاریار", "ipbother": "وخت هنی:", - "ipboptions": "Û± ساعأت:1 hour,Û± روٙز:1 day,Û± ھأفتە:1 week,Û² ھأفتە:2 weeks,Û± ما:1 month,Û³ ما:3 months,Û¶ ما:6 months,Û± سال:1 year,بی حئسۉ:infinite", + "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite", "ipbhidename": "نوم کاروری نه سی ویرایشت یا و نوم گه یا قام کو", "ipbwatchuser": "پی گری بلگه کاریاری و بلگه چک چنه ای کاریار", "ipb-disableusertalk": "نها ای کاریار نه اوسه که میها د بلگه چک چنه Ø´ ویرایشت بکه و وه قلف بیه بئر", diff --git a/languages/i18n/lt.json b/languages/i18n/lt.json index e72f563ed3..c0b33b8778 100644 --- a/languages/i18n/lt.json +++ b/languages/i18n/lt.json @@ -34,7 +34,8 @@ "Albertas", "Macofe", "Zygimantus", - "Matma Rex" + "Matma Rex", + "Nemo bis" ] }, "tog-underline": "Nuorodos pabraukimas:", @@ -175,7 +176,6 @@ "moredotdotdot": "Daugiau...", "morenotlisted": "Å is sąraÅ¡as nėra iÅ¡samus.", "mypage": "Puslapis", - "anonuserpage": "Nežinomas naudotojas", "mytalk": "Aptarimas", "anontalk": "Aptarimas", "navigation": "NarÅ¡ymas", @@ -1328,7 +1328,7 @@ "recentchangeslinked-page": "Puslapio pavadinimas:", "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus", "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos", - "recentchanges-page-added-to-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pridėti prie kategorijos", + "recentchanges-page-added-to-category-bundled": "[[:$1]] ir [[Special:WhatLinksHere/$1|{{PLURAL:$2|vienas puslapis|$2 puslapiai}}]] pridėti prie kategorijos", "recentchanges-page-removed-from-category": "[[:$1]] paÅ¡alinta iÅ¡ kategorijos", "recentchanges-page-removed-from-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} paÅ¡alinti iÅ¡ kategorijos", "autochange-username": "MediaWiki automatinis pakeitimas", @@ -1508,6 +1508,7 @@ "uploadstash-badtoken": "Scenos šį ieÅ¡kinį, buvo nesėkmingas, galbÅ«t todėl, kad jÅ«sų redagavimo įgaliojimai pasibaigė. Bandykite dar kartą.", "uploadstash-errclear": "Kliringo failai buvo nesėkmingas.", "uploadstash-refresh": "Atnaujinti failų sąrašą", + "uploadstash-thumbnail": "rodyti miniatiÅ«rą", "invalid-chunk-offset": "Neleistinas segmento poslinkis", "img-auth-accessdenied": "Prieiga uždrausta", "img-auth-nopathinfo": "TrÅ«ksta PATH_INFO.\nJÅ«sų serveris nenustatytas perduoti Å¡ią informaciją.\nTai gali bÅ«ti CGI paremta ir negali palaikyti img_auth.\nDaugiau informacijos https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization. žr.", diff --git a/languages/i18n/lzh.json b/languages/i18n/lzh.json index 5ca407ead1..f1a65618e7 100644 --- a/languages/i18n/lzh.json +++ b/languages/i18n/lzh.json @@ -156,7 +156,6 @@ "moredotdotdot": "見逾", "morenotlisted": "列未成。", "mypage": "寒舍", - "anonuserpage": "無名氏", "mytalk": "書房", "anontalk": "è­°", "navigation": "導", diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json index d4544dde40..7975cf99d3 100644 --- a/languages/i18n/mai.json +++ b/languages/i18n/mai.json @@ -1182,7 +1182,7 @@ "recentchanges-label-bot": "ई सम्पादन यांत्रिक छल।", "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।", "recentchanges-label-plusminus": "पन्नाके आकार इ बाइट संख्यासे बदलल गेल", - "recentchanges-legend-heading": "कुंजी:", + "recentchanges-legend-heading": "कुञ्जी:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पन्नसभके सूची]] सहो देखु)", "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।", "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू", diff --git a/languages/i18n/mg.json b/languages/i18n/mg.json index 9eb7f34067..7468ee40b2 100644 --- a/languages/i18n/mg.json +++ b/languages/i18n/mg.json @@ -149,7 +149,6 @@ "moredotdotdot": "Tohiny...", "morenotlisted": "Tsy feno ity lisitra ity.", "mypage": "Pejy", - "anonuserpage": "Mpikambana tsy fantatra", "mytalk": "Dinika", "anontalk": "Pejin-dresaka", "navigation": "Fikarohana", @@ -290,7 +289,7 @@ "sort-descending": "Fandaharana miiba", "sort-ascending": "Fandaharana miabo", "nstab-main": "Lahatsoratra", - "nstab-user": "Pejy ny mpikambana", + "nstab-user": "Pejim-pikambana", "nstab-media": "Pejy sary sy/na feo", "nstab-special": "Pejy Manokana", "nstab-project": "Tetikasa", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 421bb6204b..1d68d63684 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -16,7 +16,8 @@ "לערי ריינהארט", "아라", "Milicevic01", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "Потцртување на врски:", @@ -157,7 +158,6 @@ "moredotdotdot": "Повеќе...", "morenotlisted": "Овој список не е целосен.", "mypage": "Страница", - "anonuserpage": "Непознат корисник", "mytalk": "разговор", "anontalk": "Разговор", "navigation": "Навигација", @@ -1292,7 +1292,7 @@ "recentchangeslinked-page": "Име на страницата:", "recentchangeslinked-to": "Прикажи ги промените на страниците поврзани со дадената страница", "recentchanges-page-added-to-category": "[[:$1]] ставена во категорија", - "recentchanges-page-added-to-category-bundled": "[[:$1]] и уште {{PLURAL:$2|една страница ставена|$2 страници ставеи}} во категорија", + "recentchanges-page-added-to-category-bundled": "[[:$1]] и уште [[Special:WhatLinksHere/$1|{{PLURAL:$2|една страница ставена|$2 страници ставеи}}]] во категорија", "recentchanges-page-removed-from-category": "[[:$1]] отстранета од категорија", "recentchanges-page-removed-from-category-bundled": "[[:$1]] и уште {{PLURAL:$2|една страница отстранета|$2 страници отстранети}} од категорија", "autochange-username": "Автоматски промени на МедијаВики", diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json index e313abe782..0f9afb900d 100644 --- a/languages/i18n/ml.json +++ b/languages/i18n/ml.json @@ -1298,7 +1298,7 @@ "recentchangeslinked-page": "താളിന്റെ പേര്:", "recentchangeslinked-to": "തന്നിരിക്കുന്ന താളിലെ മാറ്റങ്ങൾക്കു പകരം ബന്ധപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക", "recentchanges-page-added-to-category": "[[:$1]] വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു", - "recentchanges-page-added-to-category-bundled": "[[:$1]] താളും ഒപ്പം {{PLURAL:$2|മറ്റൊരു താളും|$2 താളുകളും}} വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു", + "recentchanges-page-added-to-category-bundled": "[[:$1]] താളും ഒപ്പം [[Special:WhatLinksHere/$1|{{PLURAL:$2|മറ്റൊരു താളും|$2 താളുകളും}}]] വർഗ്ഗത്തിലേക്ക് ചേർത്തിരിക്കുന്നു", "recentchanges-page-removed-from-category": "[[:$1]] വർഗ്ഗത്തിൽ നിന്ന് നീക്കംചെയ്തു", "recentchanges-page-removed-from-category-bundled": "[[:$1]] താളും ഒപ്പം {{PLURAL:$2|മറ്റൊരു താളും|$2 താളുകളും}} വർഗ്ഗത്തിൽ നിന്ന് നീക്കംചെയ്തിരിക്കുന്നു", "autochange-username": "മീഡിയവിക്കി സ്വയംപ്രവർത്തിത മാറ്റം", diff --git a/languages/i18n/mr.json b/languages/i18n/mr.json index 1f7e833ec8..2ba3513789 100644 --- a/languages/i18n/mr.json +++ b/languages/i18n/mr.json @@ -1329,7 +1329,7 @@ "recentchangeslinked-page": "पृष्ठ नाव:", "recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा", "recentchanges-page-added-to-category": "[[:$1]] वर्गास जोडले", - "recentchanges-page-added-to-category-bundled": "[[:$1]] व {{PLURAL:$2|एक पान वर्गास जोडले|$2 पाने वर्गास जोडलीत}}", + "recentchanges-page-added-to-category-bundled": "[[:$1]] व [[Special:WhatLinksHere/$1|{{PLURAL:$2|एक पान वर्गास जोडले|$2 पाने वर्गास जोडलीत}}]]", "recentchanges-page-removed-from-category": "[[:$1]] ला वर्गातून हटविले", "recentchanges-page-removed-from-category-bundled": "[[:$1]] व {{PLURAL:$2|एक पान वर्गातून हटविले|$2 पाने वर्गातून हटविलीत}}", "autochange-username": "मिडियाविकि आपोआप बदल", diff --git a/languages/i18n/ms.json b/languages/i18n/ms.json index aa44e04cd7..d29a55d5f6 100644 --- a/languages/i18n/ms.json +++ b/languages/i18n/ms.json @@ -20,7 +20,8 @@ "아라", "Pizza1016", "Macofe", - "Matma Rex" + "Matma Rex", + "Nemo bis" ] }, "tog-underline": "Garis bawah pautan:", @@ -1252,7 +1253,7 @@ "recentchangeslinked-page": "Nama laman:", "recentchangeslinked-to": "Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan", "recentchanges-page-added-to-category": "[[:$1]] ditambahkan kepada kategori", - "recentchanges-page-added-to-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman ditambahkan kepada kategori", + "recentchanges-page-added-to-category-bundled": "[[:$1]] dan [[Special:WhatLinksHere/$1|{{PLURAL:$2|satu|$2}}]] lagi halaman ditambahkan kepada kategori", "recentchanges-page-removed-from-category": "[[:$1]] digugurkan dari kategori", "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman digugurkan dari kategori", "autochange-username": "Perubahan automatik MediaWiki", diff --git a/languages/i18n/my.json b/languages/i18n/my.json index 7e30340fe8..e465bdf590 100644 --- a/languages/i18n/my.json +++ b/languages/i18n/my.json @@ -22,7 +22,8 @@ "아라", "9.sinistra", "Ninjastrikers", - "Penguinlay" + "Penguinlay", + "Nemo bis" ] }, "tog-underline": "လင့်ကို မျဉ်းသားသည့် ပုံစံ -", @@ -561,6 +562,12 @@ "revdelete-nooldid-title": "တရားမဝင်သော မူအမည်", "revdelete-no-file": "ဖော်ပြထားသောဖိုင် မရှိပါ။", "revdelete-show-file-submit": "မှန်", + "revdelete-selected-file": "[[:$2]] ၏ ရွေးချယ်ထားသော {{PLURAL:$1|ဖိုင်ဗားရှင်း|ဖိုင်ဗားရှင်းများ}}:", + "revdelete-text-text": "ဖျက်လိုက်သည့် မူများသည် စာမျက်နှာရာဇဝင်တွင် ရှိနေဦးမည်ဖြစ်သော်လည်း ထိုပါဝင်အကြောင်းအရာသည် အများပြည်သူမှ မြင်ရတော့မည် မဟုတ်ပေ။", + "revdelete-text-file": "ဖျက်လိုက်သော ဖိုင်ဗားရှင်းများသည် ဖိုင်ရာဇဝင်ထဲတွင် ရှိနေဦးမည်ဖြစ်သော်လည်း ယင်းတို့ကို အများပြည်သူ ကြည့်ရှုနိုင်မည် မဟုတ်ပေ။", + "logdelete-text": "ဖျက်လိုက်သော မှတ်တမ်းသည် မှတ်တမ်းများထဲတွင် ပေါ်နေဦးမည်ဖြစ်သော်လည်း ပါဝင်အကြောင်းအရာကို အများပြည်သူများ မြင်ရတော့မည် မဟုတ်ပေ။", + "revdelete-text-others": "အပိုကန့်သတ်ချက်များကို မထည့်ထားပါက အခြားသော အက်ဒမင်များအနေဖြင့် ဝှက်ထားသော အကြောင်းအရာကို ကြည့်နိုင်ပြီး ဖျက်ထားခြင်းကို ပယ်ဖျက်နိုင်သည်။", + "revdelete-confirm": "ဤသို့ ဖျက်ပစ်ရန် သင် အမှန်တကယ် ရည်ရွယ်လျက် နောက်ဆက်တွဲ အကျိုးဆက်များကို သိရှိနားလည်ပြီး [[{{MediaWiki:Policy-url}}|မူဝါဒ]]အတိုင်း လုပ်ဆောင်နေခြင်းဖြစ်ကြောင်းကို ကျေးဇူးပြု၍ အတည်ပြုပေးပါ။", "revdelete-legend": "မြင်နိုင်စွမ်းရှိမှုတို့အား ကန့်သတ်ခြင်းကို သတ်မှတ်ရန်", "revdelete-hide-text": "တည်းဖြတ်မူမှ စာသား", "revdelete-hide-image": "ဖိုင်ပါ အေကြာင်းအရာများကို ဝှက်ရန်", @@ -873,7 +880,7 @@ "rcshowhideanons": "အမည်မသိ အသုံးပြုသူ $1ရန်", "rcshowhideanons-show": "ပြသရန်", "rcshowhideanons-hide": "ဝှက်", - "rcshowhidepatr": "စောင့်ြကပ်တည်းဖြတ်မှု $1ရန်", + "rcshowhidepatr": "စောင့်ကြပ်တည်းဖြတ်မှု $1ရန်", "rcshowhidepatr-show": "ပြသရန်", "rcshowhidepatr-hide": "ဝှက်ရန်", "rcshowhidemine": "ကျွန်ုပ်တည်းဖြတ်ထားသည်များ $1", @@ -905,7 +912,7 @@ "recentchangeslinked-page": "စာမျက်နှာ အမည် -", "recentchangeslinked-to": "ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများ၏ အပြောင်းအလဲများကို ပြရန်", "recentchanges-page-added-to-category": "ကဏ္ဍထဲသို့ [[:$1]] ကို ပေါင်းထည့်ခဲ့သည်", - "recentchanges-page-added-to-category-bundled": "[[:$1]] နှင့် {{PLURAL:$2|စာမျက်နှာ တစ်ခု|စာမျက်နှာ $2 ခု}}ကို ကဏ္ဍထဲသို့ ပေါင်းထည့်ခဲ့သည်", + "recentchanges-page-added-to-category-bundled": "[[:$1]] နှင့် [[Special:WhatLinksHere/$1|{{PLURAL:$2|စာမျက်နှာ တစ်ခု|စာမျက်နှာ $2 ခု}}]]ကို ကဏ္ဍထဲသို့ ပေါင်းထည့်ခဲ့သည်", "recentchanges-page-removed-from-category": "ကဏ္ဍထဲမှ [[:$1]] ကို ဖယ်ရှားခဲ့သည်", "recentchanges-page-removed-from-category-bundled": "[[:$1]] နှင့် {{PLURAL:$2|စာမျက်နှာ တစ်ခု|စာမျက်နှာ $2 ခု}}ကို ကဏ္ဍထဲမှ ဖယ်ရှားခဲ့သည်", "upload": "ဖိုင်​တင်​ရန်​", @@ -1173,12 +1180,15 @@ "notanarticle": "မာတိကာစာမျက်နှာတစ်ခု မဟုတ်", "watchlist-details": "{{PLURAL:$1|စာမျက်နှာ $1 ခု|စာမျက်နှာ $1 ခု}} သည် သင့်စောင့်ကြည့်စာရင်းတွင် ရှိပြီး ဆွေးနွေးချက်စာမျက်နှာများကို ထည့်တွက် မထားပါ။", "wlheader-showupdated": "သင် နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို စာလုံးမဲ ဖြင့် ပြသထားသည်", + "wlnote": "အောက်ပါတို့သည် $3၊ $4 အထိ နောက်ဆုံး {{PLURAL:$2|နာရီ|$2 နာရီ}}အတွင်း {{PLURAL:$1|နောက်ဆုံးပြောင်းလဲချက် တစ်ခု|နောက်ဆုံးပြောင်းလဲချက်များ $1 ခု}} ဖြစ်သည်။", "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက် ကိုပြရန်", "watchlist-hide": "ဝှက်", "watchlist-submit": "ပြသရန်", + "wlshowtime": "ပြသပေးရမည့် အချိန်ကာလ:", "wlshowhideminor": "အရေးမကြီးသော ပြင်ဆင်မှုများ", "wlshowhideliu": "မှတ်ပုံတင်ထားသော အသုံးပြုသူများ", "wlshowhideanons": "အမည်မသိ အသုံးပြုသူများ", + "wlshowhidemine": "ကျွန်ုပ်၏ တည်းဖြတ်မှုများ", "wlshowhidecategorization": "စာမျက်နှာ ကဏ္ဍထည့်သွင်းခြင်း", "watchlist-options": "စောင့်ကြည့်စာရင်းအတွက် ရွေးချယ်စရာများ", "watching": "စောင့်ကြည့်လျက်ရှိ...", @@ -1296,7 +1306,7 @@ "whatlinkshere-prev": "{{PLURAL:$1|နောက်သို့|နောက်သို့ $1}}", "whatlinkshere-next": "{{PLURAL:$1|ရှေ့သို့|ရှေ့သို့ $1}}", "whatlinkshere-links": "← လင့်များ", - "whatlinkshere-hideredirs": "redirect ပြန်ညွှန်း $1 ခု", + "whatlinkshere-hideredirs": "ပြန်ညွှန်းများ $1ရန်", "whatlinkshere-hidetrans": "ထည့်သွင်းကူးယူချက် $1 ခု", "whatlinkshere-hidelinks": "လင့် $1 ခု", "whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု", @@ -1569,7 +1579,9 @@ "autosumm-new": "\"$1\" အစချီသော စာလုံးတို့နှင့် စာမျက်နှာကို ဖန်တီးလိုက်သည်", "watchlistedit-normal-title": "စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်", "watchlistedit-normal-legend": "စောင့်ကြည့်စာရင်းမှ ခေါင်းစဉ်များကို ဖျက်ရန်", + "watchlistedit-normal-explain": "သင်၏ စောင့်ကြည့်စာရင်းရှိ ခေါင်းစဉ်များကို အောက်တွင် ပြသထားသည်။\nခေါင်းစဉ်တစ်ခုကို ဖယ်ရှားရန် ထိုခေါင်းစဉ်ဘေးရှိ အကွက်တွင် အမှန်ခြစ်ပြီး \"{{int:Watchlistedit-normal-submit}}\" ကိုနှိပ်ပါ။\n[[Special:EditWatchlist/raw|စောင့်ကြည့်စာရင်း အကြမ်း]]ကိုလည်း ကြည့်နိုင်ပါသည်။", "watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်", + "watchlistedit-normal-done": "{{PLURAL:$1|ခေါင်းစဉ်တစ်ခု|ခေါင်းစဉ် $1 ခုတို့}}ကို သင်၏ စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားပြီးပြီ:", "watchlistedit-raw-titles": "ခေါင်းစဉ်များ -", "watchlisttools-view": "ကိုက်ညီသော အပြောင်းအလဲများကို ကြည့်ရန်", "watchlisttools-edit": "စောင့်ကြည့်စာရင်းများကို ကြည့်ပြီး တည်းဖြတ်ပါ။", @@ -1621,12 +1633,15 @@ "htmlform-reset": "ပြောင်းလဲထားသည်များ မလုပ်တော့ရန်", "htmlform-selectorother-other": "အခြား", "logentry-delete-delete": "$3 စာမျက်နှာကို $1 က {{GENDER:$2|ဖျက်ပစ်ခဲ့သည်}}", + "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4", + "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း", "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်", "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်", "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}", "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားပဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}", "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}", "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}", + "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}", "rightsnone": "(ဘာမှမရှိ)", "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်", "searchsuggest-search": "ရှာဖွေရန်", diff --git a/languages/i18n/nan.json b/languages/i18n/nan.json index 69be88a6e4..8bcfce5770 100644 --- a/languages/i18n/nan.json +++ b/languages/i18n/nan.json @@ -14,6 +14,7 @@ "tog-hideminor": "Am chòe-kÄ«n ê sió kái-piàn", "tog-hidepatrolled": "Am chòe-kÄ«n sûn koè--ê kái-piàn", "tog-newpageshidepatrolled": "Sin-ia̍h ê chheng-toaⁿ am sûn koè--ê", + "tog-hidecategorization": "Kā ia̍h ê lÅ«i-pia̍t chhàng--khì-lâi", "tog-extendwatchlist": "thián-khui kàm-sÄ«-toaⁿ, khoàⁿ choân-pō͘ kái ê, m̄-nā choè-kÄ«n niā.", "tog-usenewrc": "共文章最近有改的佮監視列表囥做伙", "tog-numberheadings": "Phiau-tê chÅ«-tōng pian-hō", @@ -34,7 +35,7 @@ "tog-shownumberswatching": "Hián-sÄ« tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k", "tog-oldsig": "Chit-má ê chhiam-miâ:", "tog-fancysig": "共我的簽名當做文章文字,(無需要自動連結)", - "tog-uselivepreview": "Ēng sui khoàⁿ-māi (chhì-giām--ê)", + "tog-uselivepreview": "Ēng sui khoàⁿ-māi", "tog-forceeditsummary": "Pian-chi̍p khài-iàu bô thiⁿ ê sî-chÅ«n, kā goá thê-chhéⁿ", "tog-watchlisthideown": "Kàm-sÄ«-toaⁿ bián hián-sÄ« goá ê pian-chi̍p", "tog-watchlisthidebots": "Kàm-sÄ«-toaⁿ bián hián-sÄ« ki-khì pian-chi̍p", @@ -42,6 +43,7 @@ "tog-watchlisthideliu": "Kàm-sÄ«-toaⁿ bián hián-sÄ« iōng-chiá Å« teng-ji̍p ê pian-chi̍p", "tog-watchlisthideanons": "Kàm-sÄ«-toaⁿ bián hián-sÄ« bû-bêng-sÄ« ê pian-chi̍p", "tog-watchlisthidepatrolled": "Kàm-sÄ«-toaⁿ bián hián-sÄ« khoàⁿ-koè--ê pian-chi̍p", + "tog-watchlisthidecategorization": "Kā ia̍h ê lÅ«i-pia̍t chhàng--khì-lâi", "tog-ccmeonemails": "Kià hō͘ pa̍t-lâng ê email sÅ«n-soà kià copy hō͘ goá", "tog-diffonly": "Diff ē-pêng bián hián-sÄ« ia̍h ê loē-iông", "tog-showhiddencats": "Hián-sÄ« chhàng khí--lâi ê lÅ«i-pia̍t", @@ -118,6 +120,8 @@ "october-date": "10月$1", "november-date": "11月$1", "december-date": "12月$1", + "period-am": "AM", + "period-pm": "PM", "pagecategories": "{{PLURAL:$1|LÅ«i-pia̍t|LÅ«i-pia̍t}}", "category_header": "TÄ« \"$1\" chit ê lÅ«i-pia̍t ê bûn-chiuⁿ", "subcategories": "Ē-lÅ«i-pia̍t", @@ -143,7 +147,7 @@ "morenotlisted": "這毋是完整的表", "mypage": "Ia̍h", "mytalk": "Thó-lÅ«n", - "anontalk": "Chit ê IP ê thó-lÅ«n-ia̍h", + "anontalk": "Thó-lÅ«n", "navigation": "Se̍h chām", "and": " kap", "qbfind": "Chhōe", @@ -222,6 +226,7 @@ "pool-queuefull": "TÅ«i-lia̍t pâi moá ah", "pool-errorunknown": "M̄-chai siáⁿ chhò-gō͘", "pool-servererror": "無提供系統服務總數的統計。", + "poolcounter-usage-error": "Ēng-hoat chhò-gō͘: $1", "aboutsite": "Koan-hē {{SITENAME}}", "aboutpage": "Project:Koan-hē", "copyright": "Tû liáu Å« lēng-goā kóng, nā bô loē-iông sÄ« chiàu $1 tiâu-kiāⁿ tō thang sú-iōng.", @@ -464,6 +469,10 @@ "changeemail": "Kái tiān-chú-phoe ê tē-chí", "changeemail-oldemail": "Chit-má ê E-mail tē-chí:", "changeemail-newemail": "Sin E-mail ê chÅ«-chí:", + "changeemail-password": "Lí-ê {{SITENAME}} bi̍t-bé:", + "changeemail-submit": "Kái-piàn tiān-chu-phoe", + "changeemail-throttled": "Lí chi̍t-ê-á teng-ji̍p liáu siuⁿ chē kái.\nChiáⁿ tan-thāi $1 kòe-āu chài chhì chi̍t pái.", + "changeemail-nochange": "Chhiáⁿ su-ji̍p chi̍t-ê bô-kâng ê sin tiān-chú-phoe chÅ«-chí.", "bold_sample": "Chho·-thé bûn-jÄ«", "bold_tip": "Chho·-thé jÄ«", "italic_sample": "Chhú-thé ê bûn-jÄ«", @@ -530,6 +539,11 @@ "recreate-moveddeleted-warn": "'''Sè-jÄ«: Lí taⁿ chún-pÄ« beh khui ê ia̍h, chêng bat hō͘ lâng thâi tiāu koè.''' Lí tio̍h chim-chiok soà-chiap pian-chi̍p chit ia̍h ê pit-iàu-sèng. Chia Å« chit ia̍h ê san-tû kì-lo̍k (deletion log) hō͘ lí chham-khó:", "edit-conflict": "Siu-kái sio-chhiong", "defaultmessagetext": "Siat piān ê bûn-jÄ«", + "content-model-wikitext": "wikitext", + "content-model-text": "sûn bûn-pún", + "content-model-javascript": "JavaScript", + "content-json-empty-object": "Khang bu̍t-kiāⁿ", + "content-json-empty-array": "Khang tÄ«n-lia̍t", "post-expand-template-inclusion-warning": "'''Kéng-pò:'''Pau ji̍t lâi ê pán-bôo sioⁿ koè tsē ia̍h tuā.\nŪ chi̍t-koá-á ē bô pau ji̍t lâi.", "undo-success": "Pian-chi̍p í-keng chhú-siau. Chhiáⁿ khak-tēng, liáu-āu kā ē-kha ho̍k-goân ê kái-piàn pó-chûn--khí-lâi.", "undo-failure": "Pian-chi̍p bē-tàng chhú-siau, in-Å«i chhiong tio̍h kî-kan chhah-ji̍p ê pian-chi̍p.", @@ -606,9 +620,28 @@ "localtime": "Chāi-tē sî-kan sÄ«", "servertime": "Server sî-kan hiān-chāi sÄ«", "guesstimezone": "Tùi liû-lám-khì chhau--lâi", + "timezoneregion-africa": "Hui-chiu", + "timezoneregion-america": "Bí-chiu", + "timezoneregion-antarctica": "Lâm-ke̍k-chiu", + "timezoneregion-arctic": "Pak-ke̍k", + "timezoneregion-asia": "A-chiu", + "timezoneregion-atlantic": "Tāi-se-iûⁿ", + "timezoneregion-australia": "Australia", + "timezoneregion-europe": "Au-chiu", + "timezoneregion-indian": "Ìn-tō͘-iûⁿ", + "timezoneregion-pacific": "Thài-pêng-iûⁿ", "allowemail": "Ún-chún pa̍t-ê iōng-chiá kià email kòe-lâi", + "prefs-searchoptions": "Cha-sûn", + "prefs-namespaces": "Miâ-khong-kan", + "default": "kì-tēng", "prefs-files": "Tóng-àn", + "prefs-custom-css": "ChÅ«-siat CSS", + "prefs-custom-js": "ChÅ«-siat JavaScript", + "prefs-common-css-js": "Só͘-Å« gōa-phôe kong-ke ê CSS/JavaScript", + "prefs-reset-intro": "Lí ē-sài ēng pún ia̍h lâi chiong lí ê siat-tì têng-siat chò pún chām kì-tēng.\nChe bē hoat-tō͘ ho̍k-goân.", + "prefs-emailconfirm-label": "Tiān-chú-phoe khak-tēng:", "youremail": "Lí ê email:", + "username": "{{GENDER:$1|Ēng-chiá-miâ-hō}}:", "yourrealname": "Lí ê chin miâ:", "yourlanguage": "Kài-bÄ«n gú-giân:", "yournick": "Lí ê sió-miâ (chhiam-miâ iōng):", @@ -622,7 +655,12 @@ "group-bureaucrat-member": "{{GENDER:$1|Koaⁿ-liâu}}", "grouppage-sysop": "{{ns:project}}:Hêng-chèng jîn-oân", "grouppage-bureaucrat": "{{ns:project}}:Koaⁿ-liâu", + "right-move-categorypages": "Sóa tōng ia̍h-bÄ«n lÅ«i-lia̍t", + "right-movefile": "Sóa tóng-àn", + "right-upload": "Kā tóng-àn chiūⁿ-bāng", + "right-upload_by_url": "Tùi 1-ê URL thoân thóng-àn", "right-writeapi": "用API寫", + "right-delete": "Thâi ia̍h", "newuserlogpage": "khui kháu-chō ji̍t-chì", "rightslogtext": "Chit-ê log lia̍t-chhut kái-piàn iōng-chiá koân-lÄ« ê tōng-chok.", "action-edit": "Siu-kái chit ia̍h", @@ -724,14 +762,19 @@ "doubleredirects": "Siang-thâu choán-ia̍h", "brokenredirects": "Choán-ia̍h kò·-chiòng", "brokenredirectstext": "Í-hā ê choán-ia̍h liân kàu bô chûn-chāi ê ia̍h:", + "brokenredirects-edit": "siu-kái", + "brokenredirects-delete": "thâi", "withoutinterwiki": "Bô gí-giân liân-kiat ê ia̍h", "withoutinterwiki-summary": "Ē-kha ê ia̍h bô kî-thaⁿ gí-giân pán-pún ê liân-kiat:", + "withoutinterwiki-legend": "JÄ«-thâu", + "withoutinterwiki-submit": "Hían-sÄ«", "fewestrevisions": "Siōng bô siu-tēng ê bûn-chiuⁿ", "nbytes": "$1 {{PLURAL:$1|jÄ«-goân|jÄ«-goân}}", "ncategories": "$1 {{PLURAL:$1|ê lÅ«i-pia̍t |ê lÅ«i-pia̍t}}", - "nlinks": "$1 ê liân-kiat", + "nlinks": "$1 ê {{PLURAL:$1|liân-kiat}}", "nmembers": "$1{{PLURAL:$1|ê sêng-oân}}", - "nrevisions": "$1 ê siu-tēng-pún", + "nmemberschanged": "$1 → $2 ê {{PLURAL:$2|sêng-oân}}", + "nrevisions": "$1 ê {{PLURAL:$1|siu-tēng-pún}}", "lonelypages": "Ko·-ia̍h", "uncategorizedpages": "Bô lÅ«i-pia̍t ê ia̍h", "uncategorizedcategories": "Bô lÅ«i-pia̍t ê lÅ«i-pia̍t", @@ -752,6 +795,7 @@ "deadendpages": "Khu̍t-thâu-ia̍h", "deadendpagestext": "Ē-kha ê ia̍h bô liân kàu wiki lāi-té ê kî-thaⁿ ia̍h.", "protectedpages": "SiÅ« pó-hō͘ ê ia̍h", + "protectedpages-page": "Ia̍h", "listusers": "Iōng-chiá lia̍t-toaⁿ", "newpages": "Sin ia̍h", "newpages-username": "Iōng-chiá miâ-chheng:", @@ -895,9 +939,11 @@ "move-watch": "Kàm-sÄ« chit ia̍h", "movepagebtn": "Sóa ia̍h", "pagemovedsub": "Sóa-Å«i sêng-kong", + "movepage-moved": "\"$1\" í-keng hong sóa khì \"$2\"", "articleexists": "Kāng miâ ê ia̍h í-keng tÄ« leh, a̍h-sÄ« lí kéng ê miâ bô-hāu. Chhiáⁿ kéng pa̍t ê miâ.", "movetalk": "SÅ«n-sòa sóa thó-lÅ«n-ia̍h", "movepage-page-moved": "$1 í-keng sóa khì tÄ« $2.", + "movepage-page-unmoved": "$1 chit ia̍h hô hoat-tō͘ sóa khì $2.", "movelogpagetext": "Ē-kha lia̍t-chhut hông soá-Å«i ê ia̍h.", "movereason": "Lí-iû:", "revertmove": "hôe-tńg", diff --git a/languages/i18n/nap.json b/languages/i18n/nap.json index d1b54bd27d..c3276c32d2 100644 --- a/languages/i18n/nap.json +++ b/languages/i18n/nap.json @@ -12,7 +12,8 @@ "아라", "Candalua", "Macofe", - "V6rg" + "V6rg", + "Nemo bis" ] }, "tog-underline": "Sottolinia 'e jonte:", @@ -153,7 +154,6 @@ "moredotdotdot": "Cchiù...", "morenotlisted": "Chisto elenco nun è cumpreto.", "mypage": "Paggena", - "anonuserpage": "Utente scanusciuto", "mytalk": "'E chiàcchieriate mmie", "anontalk": "Chiacchierate", "navigation": "Navigazzione", @@ -1309,7 +1309,7 @@ "recentchangeslinked-page": "Nomme d' 'a paggena", "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata", "recentchanges-page-added-to-category": "[[:$1]] azzeccato â categurìa", - "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggene}} azzeccate â categurìa", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|na paggena|$2 paggene}}]] azzeccate â categurìa", "recentchanges-page-removed-from-category": "[[:$1]] luvato d' 'a categurìa", "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|na paggena|$2 paggena}} luvate d' 'a categurìa", "autochange-username": "Cagnamiento automateco MediaWiki", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index 4bdecee698..073fe88908 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -47,7 +47,8 @@ "Kingu", "Tarjeimo", "Matma Rex", - "SuperPotato" + "SuperPotato", + "Nemo bis" ] }, "tog-underline": "Strek under lenker:", @@ -1346,7 +1347,7 @@ "recentchangeslinked-page": "Sidenavn:", "recentchangeslinked-to": "Vis endringer pÃ¥ sider som lenker til den gitte siden istedet", "recentchanges-page-added-to-category": "[[:$1]] lagt til kategori", - "recentchanges-page-added-to-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} lagt til kategori", + "recentchanges-page-added-to-category-bundled": "[[:$1]] og [[Special:WhatLinksHere/$1|{{PLURAL:$2|én side|$2 sider}}]] lagt til kategori", "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori", "recentchanges-page-removed-from-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} fjernet fra kategori", "autochange-username": "Automatisk MediaWiki-endring", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index a3b815b393..acc2cd7012 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -73,7 +73,8 @@ "Matma Rex", "Robin van der Vliet", "Catrope", - "Edoderoo" + "Edoderoo", + "Nemo bis" ] }, "tog-underline": "Koppelingen onderstrepen:", @@ -214,7 +215,6 @@ "moredotdotdot": "Meer…", "morenotlisted": "Deze lijst is niet compleet.", "mypage": "Gebruikerspagina", - "anonuserpage": "Onbekende gebruiker", "mytalk": "Overleg", "anontalk": "Overleg", "navigation": "Navigatie", @@ -600,7 +600,7 @@ "botpasswords-newpassword": "Het nieuwe wachtwoord om aan te melden met $1 is nu $2. Bewaar dit goed voor toekomstig gebruik.", "botpasswords-no-provider": "BotPasswordsSessionProvider is niet beschikbaar.", "botpasswords-restriction-failed": "Botwachtwoordbeperkingen maken het aanmelden onmogelijk.", - "botpasswords-invalid-name": "De gebruikersnaam mag niet het scheidingsteken van het botwachtwoord (\"$1\") bevatten.", + "botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").", "botpasswords-not-exist": "Gebruiker \"$1\" heeft geen botwachtwoord genaamd \"$2\"", "resetpass_forbidden": "Wachtwoorden kunnen niet gewijzigd worden", "resetpass-no-info": "U dient aangemeld zijn voordat u deze pagina kunt gebruiken.", @@ -628,7 +628,7 @@ "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.", "passwordreset-emailtext-user": "Gebruiker $1 op de site {{SITENAME}} heeft een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.", "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2", - "passwordreset-emailsentemail": "Als dit een e-mailadres is dat gekoppeld is aan uw account, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.", + "passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.", "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.", "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.", "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1", @@ -1374,7 +1374,7 @@ "recentchangeslinked-page": "Paginanaam:", "recentchangeslinked-to": "Wijzigingen aan pagina's met koppelingen naar deze pagina bekijken", "recentchanges-page-added-to-category": "[[:$1]] aan categorie toegevoegd", - "recentchanges-page-added-to-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn toegevoegd aan categorie", + "recentchanges-page-added-to-category-bundled": "[[:$1]] en [[Special:WhatLinksHere/$1|{{PLURAL:$2|één pagina|$2 pagina's}}]] zijn toegevoegd aan categorie", "recentchanges-page-removed-from-category": "[[:$1]] is verwijderd uit categorie", "recentchanges-page-removed-from-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn verwijderd uit categorie", "autochange-username": "Automatische wijziging van MediaWiki", @@ -1809,7 +1809,7 @@ "apisandbox-api-disabled": "De API is uitgeschakeld op deze site.", "apisandbox-intro": "Gebruik deze pagina om te experimenteren met de MediaWiki-API.\nZie de [[mw:API:Main page|API-documentatie]] voor verdere details over het gebruik van de API. Voorbeeld: [//www.mediawiki.org/wiki/API#A_simple_example hoe de inhoud van een Hoofdpagina ophalen]. Selecteer een handeling om meer voorbeelden te zien.\n\nHoewel dit een testfunctie is, kunnen sommige handelingen toch wijzigingen in de wiki maken.", "apisandbox-fullscreen": "Paneel uitvouwen", - "apisandbox-fullscreen-tooltip": "Het zandbakvenster uitvoeren om het browservenster te vullen.", + "apisandbox-fullscreen-tooltip": "Het zandbakpaneel zo groot als het browservenster maken.", "apisandbox-unfullscreen": "Pagina weergeven", "apisandbox-unfullscreen-tooltip": "Het zandbakvenster samenvouwen zodat de navigatie voor MediaWiki weer beschikbaar is.", "apisandbox-submit": "Verzoek uitvoeren", diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json index d751514c13..f2dc823ae0 100644 --- a/languages/i18n/nn.json +++ b/languages/i18n/nn.json @@ -494,6 +494,7 @@ "resetpass-wrong-oldpass": "Feil mellombels eller noverande passord.\nDu kan allereie ha byta passordet, eller ha bede om Ã¥ fÃ¥ eit nytt mellombels passord.", "resetpass-temp-password": "Mellombels passord:", "resetpass-abort-generic": "Passordbytet vart stogga av ei utviding.", + "resetpass-validity-soft": "Passordet ditt er ikkje gyldig: $1\n\nGjer vel Ã¥ velja eit nytt passord no, eller klikk «{{int:resetpass-submit-cancel}}» for Ã¥ endra det seinare.", "passwordreset": "Attendestilling av passord", "passwordreset-text-one": "Fyll ut dette skjemaet for Ã¥ attendestilla passordet ditt.", "passwordreset-disabled": "↓Tilbakestilling av passord er ikkje aktivert pÃ¥ denne wikien", diff --git a/languages/i18n/or.json b/languages/i18n/or.json index b72829552d..854f847993 100644 --- a/languages/i18n/or.json +++ b/languages/i18n/or.json @@ -375,7 +375,7 @@ "virus-badscanner": "ମନ୍ଦ ସଂରଚନା: ଅଜଣା ଭାଇରସ ସ୍କାନର: ''$1''", "virus-scanfailed": "ସ୍କାନ କରିବା ବିଫଳ ହେଲା (କୋଡ଼ $1)", "virus-unknownscanner": "ଅଜଣା ଆଣ୍ଟିଭାଇରସ:", - "logouttext": "ଲଗ-ଆଉଟ ହୋଇଗଲା ।\n\nଆପଣ ନିଜର ବ୍ରାଉଜରର ଅସ୍ଥାୟୀ ସ୍ମତି (cache) ନ ଲିଭାଇବା ଯାଏ ହୁଏତ କିଛି ପୃଷ୍ଠାରେ ଲଗ-ଇନ ହୋଇ ରହିପାରେ ।", + "logouttext": "ଆପଣ ଲଗ-ଆଉଟ ହୋଇଗଲେ ।\n\nଆପଣ ନିଜର ବ୍ରାଉଜରର ଅସ୍ଥାୟୀ ସ୍ମୃତି (cache) ଖାଲି ନ'କରିବାଯାଏ, ହୁଏତ କିଛି ପୃଷ୍ଠାରେ ଲଗ-ଇନ ହୋଇଥିବା ପରି ଦେଖାଯାଇପାରେ ।", "cannotlogoutnow-title": "ଲଗ ଆଉଟ ହେଇପାରିଲା ନାହିଁ", "cannotlogoutnow-text": "$1ବ୍ୟବହାର କରୁଥିବା ବେଳେ ଲଗ ଆଉଟ ହେଇପାରିବ ନାହିଁ ।", "welcomeuser": "ସ୍ଵାଗତ, $1!", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index d15d3ac940..c695d8a24a 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -82,7 +82,9 @@ "PiotrAntosz", "The Polish", "Expert3222", - "Mateuszek045" + "Mateuszek045", + "Sethakill", + "Mateon1" ] }, "tog-underline": "Podkreślenie linków:", @@ -223,7 +225,6 @@ "moredotdotdot": "Więcej...", "morenotlisted": "Nie jest to kompletna lista.", "mypage": "Strona", - "anonuserpage": "Użytkownik anonimowy", "mytalk": "Dyskusja", "anontalk": "Dyskusja", "navigation": "Nawigacja", @@ -583,6 +584,12 @@ "changepassword-success": "Twoje hasło zostało zmienione!", "changepassword-throttled": "Ostatnio zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.", "botpasswords": "Hasła bota", + "botpasswords-summary": "Hasła bota pozwalają na dostęp do konta użytkownika za pośrednictwem interfejsu API bez korzystania z danych konta. Uprawnienia uczestnika przy użyciu hasła bota mogą być ograniczone.\n\nJeśli nie wiesz, dlaczego miałbyś je tworzyć, nie powinieneś tego robić. Nikt nie powinien prosić Cię o utworzyć i podanie tego hasła.", + "botpasswords-disabled": "Hasła robotów zostały wyłączone.", + "botpasswords-no-central-id": "Aby użyć hasła robotów, musisz być zalogowany na koncie uniwersalnym.", + "botpasswords-existing": "Istniejące hasło bota", + "botpasswords-createnew": "Stwórz nowe hasło bota", + "botpasswords-editexisting": "Edytuj istniejące hasło bota", "botpasswords-label-appid": "Nazwa bota:", "botpasswords-label-create": "Utwórz", "botpasswords-label-update": "Aktualizuj", @@ -590,6 +597,14 @@ "botpasswords-label-delete": "Usuń", "botpasswords-label-resetpassword": "Zresetuj hasło", "botpasswords-label-grants-column": "Przyznane", + "botpasswords-bad-appid": "Nazwa bota \"$1\" nie jest prawidłowa.", + "botpasswords-created-title": "Hasło bota stworzone", + "botpasswords-created-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało utworzone.", + "botpasswords-updated-title": "Hasło bota zaktualizowane", + "botpasswords-updated-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało zaktualizowane.", + "botpasswords-deleted-title": "Hasło bota usunięte", + "botpasswords-deleted-body": "Hasło bota \"$1\" użytkownika \"$2\" zostało usunięte.", + "botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".", "resetpass_forbidden": "Hasła nie mogą zostać zmienione", "resetpass-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.", "resetpass-submit-loggedin": "Zmień hasło", @@ -914,6 +929,7 @@ "mergehistory-fail-bad-timestamp": "Znacznik czasu jest nieprawidłowy.", "mergehistory-fail-invalid-source": "Strona źródłowa jest nieprawidłowa.", "mergehistory-fail-invalid-dest": "Strona docelowa jest nieprawidłowa.", + "mergehistory-fail-permission": "Brak uprawnień aby połączyć historię.", "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.", "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.", "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.", @@ -1356,9 +1372,9 @@ "recentchangeslinked-page": "Tytuł strony:", "recentchangeslinked-to": "Pokaż zmiany nie na stronach linkowanych, a na stronach linkujących do podanej strony", "recentchanges-page-added-to-category": "dodano [[:$1]] do kategorii", - "recentchanges-page-added-to-category-bundled": "dodano [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} do kategorii", + "recentchanges-page-added-to-category-bundled": "dodano [[:$1]] oraz [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedną stronę|$2 strony|$2 stron}}]] do kategorii", "recentchanges-page-removed-from-category": "usunięto [[:$1]] z kategorii", - "recentchanges-page-removed-from-category-bundled": "usunięto [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} z kategorii", + "recentchanges-page-removed-from-category-bundled": "usunięto [[:$1]] oraz [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedną stronę|$2 strony|$2 stron}}]] z kategorii", "autochange-username": "Automatyczna zmiana MediaWiki", "upload": "Prześlij plik", "uploadbtn": "Prześlij plik", @@ -1526,6 +1542,7 @@ "uploadstash-badtoken": "Operacja nie powiodła się. Być może Twoje upoważnienie do edytowania wygasło. Spróbuj ponownie.", "uploadstash-errclear": "Czyszczenie plików nie powiodło się.", "uploadstash-refresh": "Odśwież listę plików", + "uploadstash-thumbnail": "pokaż miniaturkę", "invalid-chunk-offset": "Nieprawidłowe przesunięcie fragmentu", "img-auth-accessdenied": "Odmowa dostępu", "img-auth-nopathinfo": "Brak PATH_INFO.\nSerwer nie został skonfigurowany, tak aby przekazywał tę informację.\nMożliwe, że jest oparty na CGI i nie może obsługiwać img_auth.\nWięcej o informacji o autoryzacji grafik na https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -3097,7 +3114,7 @@ "autoredircomment": "Przekierowanie do [[$1]]", "autosumm-new": "Utworzono nową stronę \"$1\"", "autosumm-newblank": "Utworzono pustą stronę", - "size-bytes": "$1 B", + "size-bytes": "$1 {{PLURAL:$1|bajt|bajty|bajtów}}", "size-kilobytes": "$1 KB", "size-megabytes": "$1 MB", "size-gigabytes": "$1 GB", @@ -3213,7 +3230,7 @@ "version-libraries-authors": "Autorzy", "redirect": "Przekierowanie z identyfikatora pliku, użytkownika, strony, wersji lub wpisu rejestru", "redirect-legend": "Przekieruj do pliku lub strony", - "redirect-summary": "Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji lub identyfikatorze strony) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/101]].", + "redirect-summary": "Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji lub identyfikatorze strony), do strony użytkownika (o podanym identyfikatorze numerycznym) albo do rejestru (o podanym numerze akcji). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] albo [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "Przejdź", "redirect-lookup": "Wyszukaj:", "redirect-value": "Wartość:", @@ -3625,5 +3642,22 @@ "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje", "mw-widgets-titleinput-description-redirect": "przekierowanie do $1", "api-error-blacklisted": "Wybierz inny, opisowy tytuł.", - "randomrootpage": "Losowa strona (bez podstron)" + "randomrootpage": "Losowa strona (bez podstron)", + "log-action-filter-block": "Rodzaj blokady:", + "log-action-filter-delete": "Rodzaj usunięcia:", + "log-action-filter-protect": "Rodzaj zabezpieczenia:", + "log-action-filter-upload": "Rodzaj przesłanych:", + "log-action-filter-all": "Wszystkie", + "log-action-filter-block-block": "Zablokowanie", + "log-action-filter-block-reblock": "Zmiana blokady", + "log-action-filter-block-unblock": "Odblokowanie", + "log-action-filter-delete-delete": "Usunięcie strony", + "log-action-filter-delete-restore": "Odtworzenie strony", + "log-action-filter-delete-event": "Usunięcie wpisu rejestru", + "log-action-filter-delete-revision": "Usunięcie wersji", + "log-action-filter-protect-protect": "Zabezpieczenie", + "log-action-filter-protect-modify": "Zmiana zabezpieczenia", + "log-action-filter-protect-unprotect": "Odbezpieczenie", + "log-action-filter-upload-upload": "Nowe przesłane", + "log-action-filter-upload-overwrite": "Przesłane ponownie" } diff --git a/languages/i18n/ps.json b/languages/i18n/ps.json index 9cd362ac81..80a23d842b 100644 --- a/languages/i18n/ps.json +++ b/languages/i18n/ps.json @@ -1569,6 +1569,7 @@ "editcomment": "د سمون لنډيز دا و: \"''$1''\".", "changecontentmodel-title-label": "مخ سرليک", "changecontentmodel-reason-label": "سبب:", + "changecontentmodel-submit": "بدلول", "logentry-contentmodel-change-revertlink": "په څټ گرځول", "logentry-contentmodel-change-revert": "په څټ گرځول", "protectlogpage": "د ژغورنې يادښت", @@ -2604,5 +2605,7 @@ "mw-widgets-dateinput-placeholder-month": "Ú©Ú©Ú©Ú©-م م", "mw-widgets-titleinput-description-new-page": "تر اوسه پورې دا مخ نشته", "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه", - "randomrootpage": "د ناټاکلې ريښې مخ" + "randomrootpage": "د ناټاکلې ريښې مخ", + "log-action-filter-all": "ټول", + "log-action-filter-block-block": "بنديز لگول" } diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index 398ef62539..a500393f8f 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -92,7 +92,10 @@ "Arthurteb303", "Rffontenelle", "HenriqueCrang", - "Caçador de Palavras" + "Caçador de Palavras", + "Luk3", + "Ryuu", + "Luan" ] }, "tog-underline": "Sublinhar links:", @@ -234,7 +237,6 @@ "moredotdotdot": "Mais...", "morenotlisted": "Esta lista não está completa.", "mypage": "Página", - "anonuserpage": "Usuário desconhecido", "mytalk": "Discussão", "anontalk": "Discussão", "navigation": "Navegação", @@ -614,11 +616,12 @@ "botpasswords-insert-failed": "Falha ao adicionar o nome de robô \"$1\". Ele já foi adicionado?", "botpasswords-update-failed": "Falha ao atualizar o nome do robô \"$1\". Elo já foi apagado?", "botpasswords-created-title": "Senha de robô criada", - "botpasswords-created-body": "A senha do robô \"$1\" foi criada com sucesso.", + "botpasswords-created-body": "A senha de robo para o robô de nome \"$1\" do usuário \"$2\" foi criada.", "botpasswords-updated-title": "Senha de robô atualizada", - "botpasswords-updated-body": "A senha de robô \"$1\" foi atualizada com sucesso.", + "botpasswords-updated-body": "A senha de robô para o robô de nome \"$1\" do usuário \"$2\" foi atualizada.", "botpasswords-deleted-title": "Senha de bot apagada", - "botpasswords-deleted-body": "A senha de bot \"$1\" foi apagada.", + "botpasswords-deleted-body": "A senha de robô para o robô de nome \"$1\" do usuário \"$2\" foi apagada.", + "botpasswords-newpassword": "A nova senha para se autenticar com $1 é $2. Por favor, guarde isto para referência futura.", "botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.", "botpasswords-restriction-failed": "Restrições de senha de robô evitam esta autenticação.", "botpasswords-invalid-name": "O nome de usuário especificado não contém o separador de senha de robô (\"$1\").", @@ -725,7 +728,7 @@ "newarticle": "(Nova)", "newarticletext": "Você seguiu um link para uma página que ainda não existe.\nPara criá-la, comece escrevendo na caixa abaixo (veja [$1 a página de ajuda] para mais informações).\nSe você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.", "anontalkpagetext": "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''", - "noarticletext": "No momento, não há conteúdo nesta página.\nVocê pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas, [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página].", + "noarticletext": "Não há conteúdo nesta página no momento.\nVocê pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas, [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página].", "noarticletext-nopermission": "No momento, não há conteúdo nesta página\nVocê pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,\nou [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] . Note que, no entanto, você não tem permissão para criar esta página.", "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].", "userpage-userdoesnotexist": "A conta \"$1\" não se encontra registrada.\nVerifique se deseja mesmo criar/editar esta página.", @@ -745,7 +748,7 @@ "continue-editing": "Ir para a área de edição", "previewconflict": "Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.", "session_fail_preview": "Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.\n'''Por favor, verifique se você ainda está autenticado e tente novamente.'''\nCaso continue não funcionando, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e cheque se seu navegador permite cookies desse site.", - "session_fail_preview_html": "'''Desculpe-nos! Não foi possível processar a sua edição devido a uma perda de dados de sessão.'''\n\n''Como o projeto {{SITENAME}} possui HTML bruto ativo, a previsão não será exibida, como uma precaução contra ataques por JavaScript.''\n\n'''Se esta é uma tentativa de edição legítima, por favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|desautenticar-se]] e voltar a entrar na sua conta.'''", + "session_fail_preview_html": "Desculpe! Não foi possível processar a sua edição devido a uma perda de dados de sessão.\n\nComo {{SITENAME}} possui HTML bruto ativo, a previsão não será exibida como uma precaução contra ataques por JavaScript.\n\nSe esta é uma tentativa de edição legítima, por favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|desautenticar-se]] e voltar a entrar na sua conta, e cheque se seu navegador permite cookies vindo deste site.", "token_suffix_mismatch": "'''A sua edição foi rejeitada uma vez que seu software de navegação mutilou os sinais de pontuação do sinal de edição. A edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''", "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''", "editing": "Editando $1", @@ -782,6 +785,7 @@ "permissionserrors": "Erro de permissão", "permissionserrorstext": "Você não possui permissão de fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:", "permissionserrorstext-withaction": "Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:", + "contentmodelediterror": "Você não pode editar essa revisão pois seu modelo de conteúdo é $1, que difere do modelo de conteúdo atual da página $2.", "recreate-moveddeleted-warn": "'''Atenção: Você está recriando uma página já eliminada em outra ocasião.'''\n\nConsidere se é realmente adequado continuar editando esta página.\nOs registros de eliminação e de movimentação desta página são exibidos a seguir, para sua comodidade:", "moveddeleted-notice": "Esta página foi eliminada.\nOs registros de eliminação e de movimentação para esta página estão disponibilizados abaixo, para referência.", "moveddeleted-notice-recent": "Desculpe, esta página foi eliminada recentemente (nos últimos 24 horas). A eliminação e se mover para a página de log são fornecidos abaixo para referência.", @@ -808,14 +812,14 @@ "content-json-empty-object": "Objeto vazio", "content-json-empty-array": "Array vazia", "duplicate-args-warning": " Aviso: [[:$1]] está chamando [[:$2]] com mais de um valor para o parâmetro \"$3\". Será utilizado apenas o último valor fornecido.", - "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições", + "duplicate-args-category": "Páginas com argumentos de predefinições duplicados", "duplicate-args-category-desc": "A pagina contem modelos que usam argumentos duplicados, como {{foo|bar=1|bar=2}} ou {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "Aviso: Esta página contém muitas chamadas a funções do analisador \"parser\".\n\nDeveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.", "expensive-parserfunction-category": "Páginas com muitas chamadas a funções do analisador \"parser\"", "post-expand-template-inclusion-warning": "'''Aviso''': a soma do tamanho de inclusão de predefinições é muito grande.\nAlgumas predefinições não serão processadas.", - "post-expand-template-inclusion-category": "Páginas onde a soma do tamanho de inclusão de predefinições é excedido", + "post-expand-template-inclusion-category": "Páginas com excesso de predefinições", "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.\nEstes argumentos foram omitidos.", - "post-expand-template-argument-category": "Páginas com omissões de argumentos em predefinições", + "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados", "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]", "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)", "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)", @@ -910,9 +914,9 @@ "revdelete-unsuppress": "Remover restrições das edições restauradas", "revdelete-log": "Motivo:", "revdelete-submit": "Aplicar {{PLURAL:$1|à revisão selecionada|às revisões selecionadas}}", - "revdelete-success": "'''A visibilidade da revisão foi atualizada.'''", + "revdelete-success": "Visibilidade da revisão atualizada.", "revdelete-failure": "'''A visibilidade da revisão não foi atualizada:'''\n$1", - "logdelete-success": "'''Visibilidade de evento definida com sucesso.'''", + "logdelete-success": "Visibilidade do registro definida.", "logdelete-failure": "'''A visibilidade do registro não pôde ser estabelecida:'''\n$1", "revdel-restore": "alterar visibilidade", "pagehist": "Histórico da página", @@ -943,6 +947,13 @@ "mergehistory-empty": "Não existem edições habilitadas a serem fundidas.", "mergehistory-done": "$3 {{PLURAL:$3|revisão|revisões}} de $1 fundidas em [[:$2]] com sucesso.", "mergehistory-fail": "Não foi possível fundir os históricos; por gentileza, verifique a página e os parâmetros de tempo.", + "mergehistory-fail-bad-timestamp": "Informação data/hora inválida.", + "mergehistory-fail-invalid-source": "Página de origem inválida.", + "mergehistory-fail-invalid-dest": "Página de destino é inválida.", + "mergehistory-fail-no-change": "A fusão de histórico não fundiu nenhuma revisão. Por favor reavalie os parâmetros página e tempo.", + "mergehistory-fail-permission": "Permissões insuficientes para fundir histórico.", + "mergehistory-fail-self-merge": "As páginas de origem e destino são as mesmas.", + "mergehistory-fail-timestamps-overlap": "As revisões fonte sobrescrevem ou vêm após as revisões de destino", "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.", "mergehistory-no-source": "A página de origem ($1) não existe.", "mergehistory-no-destination": "A página de destino ($1) não existe.", @@ -1148,7 +1159,7 @@ "userrights-changeable-col": "Grupos que pode alterar", "userrights-unchangeable-col": "Grupos que não pode alterar", "userrights-conflict": "Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.", - "userrights-removed-self": "Você removeu com sucesso seus direitos de usuário. Como tal, você agora está impossibilitado de acessar esta página.", + "userrights-removed-self": "Você removeu seus privilégios. Portanto, você agora não pode mais acessar esta página.", "group": "Grupo:", "group-user": "Usuários", "group-autoconfirmed": "Usuários autoconfirmados", @@ -1243,7 +1254,9 @@ "right-managechangetags": "Criar e apagar [[Special:Tags|tags]] na base de dados", "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações de alguém", "right-changetags": "Adicionar e remover [[Special:Tags|etiquetas]] arbitrárias em revisões e ''logs'' individuais", + "grant-generic": "conjunto de direitos \"$1\"", "grant-group-page-interaction": "Interagir com páginas", + "grant-group-file-interaction": "Interagir com multimídia", "grant-group-watchlist-interaction": "Interagir com sua lista de páginas vigiadas", "grant-group-email": "Enviar e-mail", "grant-group-high-volume": "Realizar grande volume de atividades", @@ -1254,6 +1267,8 @@ "grant-createaccount": "Criar contas", "grant-createeditmovepage": "Criar, editar e mover páginas", "grant-delete": "Excluir páginas, revisões e entradas de registro", + "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JavaScript do usuário", + "grant-editmycssjs": "Editar o seu CSS/JavaScript de usuário", "grant-editmyoptions": "Editar suas preferências de usuário", "grant-editmywatchlist": "Editar sua lista de páginas vigiadas", "grant-editpage": "Editar páginas existentes", @@ -1356,6 +1371,7 @@ "rcshowhidemine": "$1 minhas edições", "rcshowhidemine-show": "Exibir", "rcshowhidemine-hide": "Ocultar", + "rcshowhidecategorization": "$1 categorização de páginas", "rcshowhidecategorization-show": "Exibir", "rcshowhidecategorization-hide": "Esconder", "rclinks": "Exibir as $1 alterações recentes feitas nos últimos $2 dias
$3", @@ -1382,6 +1398,9 @@ "recentchangeslinked-page": "Nome da página:", "recentchangeslinked-to": "Inversamente, mostrar mudanças nas páginas que contêm ligações para esta", "recentchanges-page-added-to-category": "[[:$1]]adicionada à categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma página|$2 páginas}}]] adicionadas à categoria", + "recentchanges-page-removed-from-category": "[[:$1]] removida da categoria", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma página|$2 páginas}}]] removidas da categoria", "autochange-username": "Alteração automática do MediaWiki", "upload": "Enviar arquivo", "uploadbtn": "Enviar arquivo", @@ -1454,6 +1473,8 @@ "uploaded-script-svg": "Encontrado elemento de script \"$1\" no arquivo SVG carregado.", "uploaded-hostile-svg": "Encontrado CSS inseguro no elemento de estilo do arquivo SVG carregado.", "uploaded-event-handler-on-svg": "Não é permitido configurar atributos que manipulem eventos $1=\"$2\" em arquivos SVG.", + "uploaded-href-attribute-svg": "os atributos href nos ficheiros SVG só están autorizados a ligar a direccións http:// ou https://, atopado <$1 $2=\"$3\">.", + "uploaded-href-unsafe-target-svg": "Encontrado href para dados não seguros: alvo URI <$1 $2=\"$3\"> no arquivo SVG carregado.", "uploadscriptednamespace": "Este aruivo SVG contém um espaço nominal probido \"$1\"", "uploadinvalidxml": "O XML no arquivo enviado não pôde ser analisado.", "uploadvirus": "O arquivo contém vírus!\nDetalhes: $1", @@ -1540,6 +1561,7 @@ "uploadstash-badtoken": "Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.", "uploadstash-errclear": "Não foi possível apagar os arquivos.", "uploadstash-refresh": "Atualizar a lista de arquivos", + "uploadstash-thumbnail": "ver miniatura", "invalid-chunk-offset": "Deslocamento de fragmento inválido", "img-auth-accessdenied": "Acesso negado", "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Image Authorization].", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 84bd3ad9a9..6f189b5f01 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -68,7 +68,8 @@ "Jkb8", "Önni", "Diniscoelho", - "Josep Maria Roca Peña" + "Josep Maria Roca Peña", + "Luan" ] }, "tog-underline": "Sublinhar ligações:", @@ -209,7 +210,6 @@ "moredotdotdot": "Mais...", "morenotlisted": "Esta lista não está completa.", "mypage": "Página", - "anonuserpage": "Utilizador desconhecido", "mytalk": "Discussão", "anontalk": "Discussão", "navigation": "Navegação", @@ -776,14 +776,14 @@ "content-json-empty-object": "Objeto vazio", "content-json-empty-array": "Matriz vazia", "duplicate-args-warning": "Aviso: [[:$1]] chama [[:$2]] com mais de um valor para o parâmetro \"$3\". Somente o último valor fornecido será utilizado.", - "duplicate-args-category": "Páginas que utilizam argumentos duplicados ao chamar predefinições", + "duplicate-args-category": "Páginas com argumentos de predefinições duplicados", "duplicate-args-category-desc": "A página contém campos de predefinições que utilizam duplicatas de argumentos, tais como {{foo|bar=1|bar=2}} ou {{foo|bar|1=baz}}.", "expensive-parserfunction-warning": "'''Aviso:''' Esta página contém demasiadas chamadas de funções exigentes do analisador sintático.\n\nDevia ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento tem $1 {{PLURAL:$1|chamada|chamadas}}.", "expensive-parserfunction-category": "Páginas com demasiadas chamadas a funções exigentes", "post-expand-template-inclusion-warning": "Aviso: O tamanho de inclusão de predefinições é demasiado grande, algumas predefinições não serão incluídas.", "post-expand-template-inclusion-category": "Páginas onde o tamanho de inclusão de predefinições é excedido", "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho expandido demasiado grande.\nEstes argumentos foram omitidos.", - "post-expand-template-argument-category": "Páginas com omissão de argumentos para predefinições", + "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados", "parser-template-loop-warning": "Ciclo de predefinições detetado: [[$1]]", "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)", "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)", @@ -1360,9 +1360,9 @@ "recentchangeslinked-page": "Nome da página:", "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta", "recentchanges-page-added-to-category": "[[:$1]] foi adicionada à categoria", - "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram adicionadas à categoria", + "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma outra página|$2 outras páginas}}]] foram adicionadas à categoria", "recentchanges-page-removed-from-category": "[[:$1]] foi removida da categoria", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram removidas da categoria", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma outra página|$2 outras páginas}}]] foram removidas da categoria", "autochange-username": "Alteração automática do MediaWiki", "upload": "Carregar ficheiro", "uploadbtn": "Carregar ficheiro", @@ -1529,6 +1529,7 @@ "uploadstash-badtoken": "Não foi possível executar a operação. Talvez as suas credenciais de edição tenham expirado. Tente novamente.", "uploadstash-errclear": "Não foi possível apagar os ficheiros.", "uploadstash-refresh": "Atualizar a lista de ficheiros", + "uploadstash-thumbnail": "ver miniatura", "invalid-chunk-offset": "Deslocamento de fragmento inválido", "img-auth-accessdenied": "Acesso negado", "img-auth-nopathinfo": "PATH_INFO em falta.\nO seu servidor não está configurado para passar esta informação.\nPode ser baseado em CGI e não consegue suportar img_auth.\nConsulte a documentação em https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -3572,5 +3573,25 @@ "sessionprovider-generic": "Sessões $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie", "sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.", - "randomrootpage": "Página raiz aleatória" + "randomrootpage": "Página raiz aleatória", + "log-action-filter-block": "Tipo de bloqueio:", + "log-action-filter-delete": "Tipo de eliminação:", + "log-action-filter-patrol": "Tipo de patrulha:", + "log-action-filter-protect": "Tipo de proteção:", + "log-action-filter-upload": "Tipo de carregamento:", + "log-action-filter-all": "Todas", + "log-action-filter-block-block": "Bloquear", + "log-action-filter-block-reblock": "Alteração de bloqueio", + "log-action-filter-block-unblock": "Desbloquear", + "log-action-filter-delete-delete": "Eliminação de página", + "log-action-filter-delete-restore": "Restauro de página", + "log-action-filter-delete-event": "Eliminação de registo", + "log-action-filter-delete-revision": "Eliminação de revisão", + "log-action-filter-patrol-patrol": "Patrulha manual", + "log-action-filter-patrol-autopatrol": "Patrulha automática", + "log-action-filter-protect-protect": "Proteção", + "log-action-filter-protect-modify": "Alteração da proteção", + "log-action-filter-protect-unprotect": "Desproteção", + "log-action-filter-upload-upload": "Novo carregamento", + "log-action-filter-upload-overwrite": "Recarregar" } diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index ae2eca4d75..379fe797d6 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -319,7 +319,6 @@ "moredotdotdot": "Used as \"More...\" link for {{msg-mw|pageinfo-transclusions}} field, in the \"templates used on this page\" list.\n\nSimilar to {{msg-mw|morenotlisted}}.\n{{Identical|More...}}", "morenotlisted": "An indication that more of a templates list is not shown.\n\nUsed as \"More...\" link for {{msg-mw|pageinfo-templates}} field.\n\nSimilar to {{msg-mw|moredotdotdot}}.", "mypage": "A text for the link to the user's user page in the links at the top of the page.\n{{Identical|Page}}", - "anonuserpage": "Same as {{msg-mw|mypage}} but used for non-logged-in users.\nA text for the link to the IP user page in the links at the top of the page.\n\nSee also:\n* {{msg-mw|Accesskey-pt-anonuserpage}}\n* {{msg-mw|Tooltip-pt-anonuserpage}}", "mytalk": "In the personal URLs page section - right upper corner.\n\nUsed as link title in your personal toolbox.\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}\n{{Identical|Talk}}", "anontalk": "Same as {{msg-mw|mytalk}} but used for non-logged-in users.\n{{Identical|Talk}}\n\nSee also:\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}", "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}", @@ -1406,11 +1405,11 @@ "grant-group-page-interaction": "{{Related|grant-group}}", "grant-group-file-interaction": "{{Related|grant-group}}", "grant-group-watchlist-interaction": "{{Related|grant-group}}", - "grant-group-email": "{{Related|grant-group}}\n{{Identical|E-mail}}", - "grant-group-high-volume": "{{Related|grant-group}}", - "grant-group-customization": "{{Related|grant-group}}", - "grant-group-administration": "{{Related|grant-group}}", - "grant-group-other": "{{Related|grant-group}}", + "grant-group-email": "{{Related|Grant-group}}\n{{Identical|E-mail}}", + "grant-group-high-volume": "{{Related|Grant-group}}", + "grant-group-customization": "{{Related|Grant-group}}", + "grant-group-administration": "{{Related|Grant-group}}", + "grant-group-other": "{{Related|Grant-group}}", "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|grant}}", "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|grant}}", "grant-createeditmovepage": "Name for grant \"createeditmovepage\".\n{{Related|grant}}", @@ -1741,6 +1740,7 @@ "uploadstash-badtoken": "Used as error message in [[Special:UploadStash]].", "uploadstash-errclear": "Used as error message in [[Special:UploadStash]].", "uploadstash-refresh": "Used as link text in [[Special:UploadStash]].", + "uploadstash-thumbnail": "Used as link text in [[Special:UploadStash]].", "invalid-chunk-offset": "Error that can happen if chunks get uploaded out of order.\nAs a result of this error, clients can continue from an offset provided or restart the upload.\nUsed on [[Special:UploadWizard]].", "img-auth-accessdenied": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied\n{{Identical|Access denied}}", "img-auth-nopathinfo": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description\n{{Doc-important|This is plain text. Do not use any wiki syntax.}}", @@ -4178,6 +4178,7 @@ "special-characters-group-ipa": "IPA means a script: \"international phonetic alphabet\" here, and not \"international phonetic association\", the organization behind it.", "special-characters-group-symbols": "The section name for symbols\n\n{{Identical|Symbol}}", "special-characters-group-greek": "This is the name of a script, or alphabet, not a language.", + "special-characters-group-greekextended": "The name of the Greek Extended character set.", "special-characters-group-cyrillic": "This is the name of a script, or a group of alphabets, used mainly in Eastern Europe and North and Central Asia.\n{{related|Special-characters-group}}", "special-characters-group-arabic": "This is the name of a script, or alphabet, not a language.\n{{related|Special-characters-group}}", "special-characters-group-arabicextended": "This is a description of the additional group of Arabic script characters for languages such as a Persian, Urdu, Pashto and others. This message is supposed to be similar to {{msg-mw|special-characters-group-latinextended}}.\n{{related|Special-characters-group}}", @@ -4205,5 +4206,25 @@ "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.", "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.", "sessionprovider-nocookies": "Used to inform the user that sessions may be missing due to lack of cookies.", - "randomrootpage": "{{doc-special|RandomRootPage}}" + "randomrootpage": "{{doc-special|RandomRootPage}}", + "log-action-filter-block": "Which type of action to filter for in this log", + "log-action-filter-delete": "Which type of action to filter for in this log", + "log-action-filter-patrol": "Which type of action to filter for in this log", + "log-action-filter-protect": "Which type of action to filter for in this log", + "log-action-filter-upload": "Which type of action to filter for in this log", + "log-action-filter-all": "All types of action are allowed\n{{Identical|All}}", + "log-action-filter-block-block": "Action to filter for in this log\n{{Identical|Block}}", + "log-action-filter-block-reblock": "Action to filter for in this log", + "log-action-filter-block-unblock": "Action to filter for in this log\n{{Identical|Unblock}}", + "log-action-filter-delete-delete": "Action to filter for in this log", + "log-action-filter-delete-restore": "Action to filter for in this log", + "log-action-filter-delete-event": "Action to filter for in this log", + "log-action-filter-delete-revision": "Action to filter for in this log", + "log-action-filter-patrol-patrol": "Action to filter for in this log", + "log-action-filter-patrol-autopatrol": "Action to filter for in this log", + "log-action-filter-protect-protect": "Action to filter for in this log", + "log-action-filter-protect-modify": "Action to filter for in this log", + "log-action-filter-protect-unprotect": "Action to filter for in this log", + "log-action-filter-upload-upload": "Action to filter for in this log", + "log-action-filter-upload-overwrite": "Action to filter for in this log" } diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index c1137ba393..414123eb78 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -28,7 +28,8 @@ "Macofe", "ImGelu", "Wintereu", - "Rsocol" + "Rsocol", + "Nemo bis" ] }, "tog-underline": "Sublinierea legăturilor:", @@ -1278,7 +1279,7 @@ "recentchangeslinked-page": "Numele paginii:", "recentchangeslinked-to": "Arată în schimb modificările asupra paginilor care se leagă de pagina indicată", "recentchanges-page-added-to-category": "[[:$1]] a fost adăugată în categorii", - "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost adăugate în categorii", + "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă [[Special:WhatLinksHere/$1|{{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}}]] au fost adăugate în categorii", "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii", "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii", "autochange-username": "Modificare automată a MediaWiki", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index 95f4999561..aa6dd44eb5 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -229,7 +229,6 @@ "moredotdotdot": "Далее…", "morenotlisted": "Этот список неполон.", "mypage": "Страница", - "anonuserpage": "Неизвестный участник", "mytalk": "Обсуждение", "anontalk": "Обсуждение", "navigation": "Навигация", @@ -1389,9 +1388,9 @@ "recentchangeslinked-page": "Название страницы:", "recentchangeslinked-to": "Наоборот, показать изменения на страницах, которые ссылаются на указанную страницу", "recentchanges-page-added-to-category": "[[:$1]] добавлена в категорию", - "recentchanges-page-added-to-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} добавлены в категорию", + "recentchanges-page-added-to-category-bundled": "[[:$1]] и [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|страница|страниц|страницы}}]] добавлены в категорию", "recentchanges-page-removed-from-category": "[[:$1]] убрана из категории", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] и {{PLURAL:$2|одна страница|$2 страниц}} убраны из категории", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] и [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|страница|страниц|страницы}}]] удалены из категории", "autochange-username": "Автоматическое изменение MediaWiki", "upload": "Загрузить файл", "uploadbtn": "Загрузить файл", @@ -1571,6 +1570,7 @@ "uploadstash-badtoken": "Не удалось выполнить указанные действия. Возможно, истёк срок действия ваших учётных данных. Пожалуйста, пробуйте ещё раз.", "uploadstash-errclear": "Очистка файлов не удалась.", "uploadstash-refresh": "Обновить список файлов", + "uploadstash-thumbnail": "показать миниатюру", "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.", @@ -3727,5 +3727,25 @@ "sessionprovider-generic": "$1 сессий", "sessionprovider-mediawiki-session-cookiesessionprovider": "сессий на основе куки", "sessionprovider-nocookies": "Могут быть отключены куки. Убедитесь, что у вас включены куки и начните заново.", - "randomrootpage": "Случайная корневая страница" + "randomrootpage": "Случайная корневая страница", + "log-action-filter-block": "Тип блокировки:", + "log-action-filter-delete": "Тип удаления:", + "log-action-filter-patrol": "Тип патрулирования:", + "log-action-filter-protect": "Тип защиты:", + "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-delete-delete": "Удаления страницы", + "log-action-filter-delete-restore": "Восстановление страницы", + "log-action-filter-delete-event": "Удаление журнала", + "log-action-filter-delete-revision": "Удаление версии", + "log-action-filter-patrol-patrol": "Ручное патрулирование", + "log-action-filter-patrol-autopatrol": "Автоматическое патрулирование", + "log-action-filter-protect-protect": "Защита", + "log-action-filter-protect-modify": "Изменение защиты", + "log-action-filter-protect-unprotect": "Снятие защиты", + "log-action-filter-upload-upload": "Новая загрузка", + "log-action-filter-upload-overwrite": "Повторно загрузить" } diff --git a/languages/i18n/sa.json b/languages/i18n/sa.json index 1c1d53445d..9eae5d1f87 100644 --- a/languages/i18n/sa.json +++ b/languages/i18n/sa.json @@ -1394,7 +1394,7 @@ "listfiles-delete": "अपाक्रियताम्", "listfiles-summary": "एतद्विशेषपुटम् उत्तारितसञ्चिकाः प्रदर्शयति । \nयोजकेन शुद्धाः अतिनूतनं सञ्चिकाः केवलम् अत्र प्रदर्शयति ।", "listfiles_search_for": "माध्यमनामधेयार्थम् अन्विषतु ।", - "listfiles-userdoesnotexist": "\"$1\" इत्यषा सदस्यलेखा पञ्जीकृतं नास्ति ।", + "listfiles-userdoesnotexist": "\"$1\" इत्यषा सदस्यलेखा पञ्जीकृता नास्ति ।", "imgfile": "संचिका", "listfiles": "सञ्चिकावली ।", "listfiles_thumb": "अंगुष्ठनखाकारम् ।", @@ -1914,7 +1914,7 @@ "mycontris": "योगदानानि", "anoncontribs": "अंशदाता", "contribsub2": "($2) कृते {{GENDER:$3|$1}}", - "contributions-userdoesnotexist": "\"$1\" इत्यषा सदस्यलेखा पञ्जीकृतं नास्ति ।", + "contributions-userdoesnotexist": "\"$1\" इत्यषा सदस्यलेखा पञ्जीकृता नास्ति ।", "nocontribs": "एतादृशयोग्यताभिः समं परिवर्तनानि न दृष्टानि ।", "uctop": "वर्तमानः", "month": "अस्मात् मासात् (प्राक्तनानि च):", diff --git a/languages/i18n/sah.json b/languages/i18n/sah.json index ffbdea6726..98c4eb5ca9 100644 --- a/languages/i18n/sah.json +++ b/languages/i18n/sah.json @@ -1314,7 +1314,7 @@ "recentchangeslinked-page": "Сирэй аата:", "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр", "recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ", - "recentchanges-page-added-to-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияҕа эбилиннэ", + "recentchanges-page-added-to-category-bundled": "[[:$1]] уонна [[Special:WhatLinksHere/$1|{{PLURAL:$2|биир сирэй|$2 сирэй}}]] категорияҕа эбилиннэ", "recentchanges-page-removed-from-category": "[[:$1]] категорияттан сотулунна", "recentchanges-page-removed-from-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияттан сотулунна", "autochange-username": "MediaWiki аптамаатынан уларыйыыта", diff --git a/languages/i18n/sh.json b/languages/i18n/sh.json index 754df9718f..17ef18340b 100644 --- a/languages/i18n/sh.json +++ b/languages/i18n/sh.json @@ -1227,7 +1227,7 @@ "recentchangeslinked-page": "Naslov stranice:", "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom", "recentchanges-page-added-to-category": "[[:$1]] pridodano kategoriji", - "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}} kategoriji", + "recentchanges-page-added-to-category-bundled": "[[:$1]] i [[Special:WhatLinksHere/$1|{{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}}]] kategoriji", "recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije", "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|uklonjena|uklonjenne}} iz kategorije", "autochange-username": "MediaWiki automatska promjena", diff --git a/languages/i18n/sk.json b/languages/i18n/sk.json index 9b85e15cbe..0d812a0735 100644 --- a/languages/i18n/sk.json +++ b/languages/i18n/sk.json @@ -616,7 +616,7 @@ "newarticle": "(Nový)", "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do poľa nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo späť vo svojom prehliadači.", "anontalkpagetext": "----''Toto je diskusná stránka anonymného používateľa, ktorý nemá vytvorené svoje konto alebo ho nepoužíva.\nPreto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí používatelia.\nAk ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:UserLogin/signup|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.''", - "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} upravovať túto stránku].", + "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} vytvoriť túto stránku].", "noarticletext-nopermission": "Táto stránka momentálne neobsahuje žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok\nalebo [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch], ale nemáte oprávnenie túto stránku vytvoriť.", "missing-revision": "Revízia #$1 stránky s názvom „{{FULLPAGENAME}}“ neexistuje.\n\nPravdepodobne ste nasledovali zastaraný odkaz na historickú verziu stránky, ktorá bola medzičasom odstránená.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].", "userpage-userdoesnotexist": "Používateľský účet „$1“ nie je registrovaný. Prosím, skontrolujte, či naozaj chcete vytvoriť/upravovať túto stránku.", @@ -1237,7 +1237,7 @@ "recentchangeslinked-page": "Názov stránky:", "recentchangeslinked-to": "Zobraziť zmeny na stránkach, ''ktoré odkazujú na'' zadanú stránku", "recentchanges-page-added-to-category": "[[:$1]] zaradená do kategórie", - "recentchanges-page-added-to-category-bundled": "[[:$1]] a {{PLURAL:$2|jedna ďalšia zaradené|$2 ďalšie zaradené|$2 ďalších zaradených}} do kategórie", + "recentchanges-page-added-to-category-bundled": "[[:$1]] a [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna ďalšia zaradené|$2 ďalšie zaradené|$2 ďalších zaradených}}]] do kategórie", "recentchanges-page-removed-from-category": "[[:$1]] vyradená z kategórie", "recentchanges-page-removed-from-category-bundled": "[[:$1]] a {{PLURAL:$2|jedna ďalšia vyradené|$2 ďalšie vyradené|$2 ďalších vyradených}} z kategórie", "autochange-username": "Automatická úprava MediaWiki", @@ -1651,7 +1651,7 @@ "log-edit-tags": "Editovať značky zvolených položiek záznamu", "checkbox-select": "Zvoliť: $1", "checkbox-all": "Všetky", - "checkbox-none": "Ždiadne", + "checkbox-none": "Žiadne", "checkbox-invert": "Invertovať", "allpages": "Všetky stránky", "nextpage": "Ďalšia stránka ($1)", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 226ec886bb..63008eb9b7 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -152,7 +152,6 @@ "moredotdotdot": "Več ...", "morenotlisted": "Seznam ni popoln.", "mypage": "Stran", - "anonuserpage": "Neznani uporabnik", "mytalk": "Pogovor", "anontalk": "Pogovorna stran", "navigation": "Navigacija", @@ -1313,9 +1312,9 @@ "recentchangeslinked-page": "Naslov strani:", "recentchangeslinked-to": "Prikaži spremembe na določeno stran povezanih strani", "recentchanges-page-added-to-category": "[[:$1]] dodano v kategorijo", - "recentchanges-page-added-to-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran dodana|strani dodani|strani dodane|strani dodanih}} v kategorijo", + "recentchanges-page-added-to-category-bundled": "[[:$1]] in [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|stran|strani}}]] {{PLURAL:$2|dodana|dodani|dodane|dodanih}} v kategorijo", "recentchanges-page-removed-from-category": "[[:$1]] odstranjeno iz kategorije", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] in $2 {{PLURAL:$2|stran odstranjena|strani odstranjeni|strani odstranjene|strani odstranjenih}} iz kategorije", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] in [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|stran|strani}}]] {{PLURAL:$2|odstranjena|odstranjeni|odstranjene|odstranjenih}} iz kategorije", "autochange-username": "Samodejna sprememba MediaWiki", "upload": "Naloži datoteko", "uploadbtn": "Naloži datoteko", @@ -1495,6 +1494,7 @@ "uploadstash-badtoken": "Izvedba dejanja je spodletela. Morda zaradi izteklih poverilnic za urejanje. Prosimo, poskusite znova.", "uploadstash-errclear": "Čiščenje datotek je spodletelo.", "uploadstash-refresh": "Osveži seznam datotek", + "uploadstash-thumbnail": "ogled sličice", "invalid-chunk-offset": "Neveljaven odmik delčka", "img-auth-accessdenied": "Dostop zavrnjen", "img-auth-nopathinfo": "Manjka PATH_INFO.\nVaš strežnik ne poda te informacije.\nMorda temelji na CGI in ne more podpirati img_auth.\nOglejte si https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", @@ -2859,8 +2859,8 @@ "exif-orientation-8": "Zasukano za 90° v desno", "exif-planarconfiguration-1": "grudast format", "exif-planarconfiguration-2": "ravninski format", - "exif-xyresolution-i": "$1 dpi ({{PLURAL:$1|točka/palec|točki/palec|točke/palec|točk/palec|točk/palec}})", - "exif-xyresolution-c": "$1 dpc ({{PLURAL:$1|točka/centimeter|točki/centimeter|točke/centimeter|točk/centimeter|točk/centimeter}})", + "exif-xyresolution-i": "$1 dpi ({{PLURAL:$1|točka/palec|točki/palec|točke/palec|točk/palec}})", + "exif-xyresolution-c": "$1 dpc ({{PLURAL:$1|točka/centimeter|točki/centimeter|točke/centimeter|točk/centimeter}})", "exif-colorspace-65535": "Neumerjeno", "exif-componentsconfiguration-0": "ne obstaja", "exif-exposureprogram-0": "Ni določen", @@ -3570,5 +3570,25 @@ "sessionprovider-generic": "sej $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih", "sessionprovider-nocookies": "Piškotki so morda onemogočeni. Prepričaje se, da imate piškotke omogočene, in začnite znova.", - "randomrootpage": "Naključna korenska stran" + "randomrootpage": "Naključna korenska stran", + "log-action-filter-block": "Vrsta blokade:", + "log-action-filter-delete": "Vrsta izbrisa:", + "log-action-filter-patrol": "Vrsta nadzora:", + "log-action-filter-protect": "Vrsta zaščite:", + "log-action-filter-upload": "Vrsta nalaganja:", + "log-action-filter-all": "Vse", + "log-action-filter-block-block": "Blokada", + "log-action-filter-block-reblock": "Sprememba blokade", + "log-action-filter-block-unblock": "Odstranitev blokade", + "log-action-filter-delete-delete": "Izbris strani", + "log-action-filter-delete-restore": "Obnovitev strani", + "log-action-filter-delete-event": "Dnevnik brisanja", + "log-action-filter-delete-revision": "Izbris redakcije", + "log-action-filter-patrol-patrol": "Ročni nadzor", + "log-action-filter-patrol-autopatrol": "Samodejni nadzor", + "log-action-filter-protect-protect": "Zaščita", + "log-action-filter-protect-modify": "Sprememba zaščite", + "log-action-filter-protect-unprotect": "Odstranitev zaščite", + "log-action-filter-upload-upload": "Novo nalaganje", + "log-action-filter-upload-overwrite": "Ponovno nalaganje" } diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index 4596598297..9c8254acda 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -1153,15 +1153,22 @@ "grant-group-file-interaction": "Уређивање датотека", "grant-group-watchlist-interaction": "Уређивање вашег списка надгледања", "grant-group-email": "Пошаљи имејл", + "grant-blockusers": "Блокирање и деблокирање корисника", "grant-createaccount": "Отварање налога", "grant-createeditmovepage": "Прављење, уређивање и премештање страница", "grant-delete": "Брисање страница, измена и уноса у дневницима", "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JavaScript страница", + "grant-editmyoptions": "Уређивање ваших подешавања", "grant-editmywatchlist": "Уређивање вашег списка надгледања", "grant-editpage": "Уређивање постојећих страница", "grant-editprotected": "Уређивање заштићених страница", + "grant-protect": "Закључавање и откључавање страница", + "grant-rollback": "Враћање измена", "grant-uploadeditmovefile": "Отпремање, замена и премештање датотека", "grant-uploadfile": "Слање нових датотека", + "grant-basic": "Основна права", + "grant-viewdeleted": "Преглед обрисаних страница и датотека", + "grant-viewmywatchlist": "Преглед вашег списак надгледања", "newuserlogpage": "Дневник нових корисника", "newuserlogpagetext": "Ово је дневник нових корисника.", "rightslog": "Дневник корисничких права", @@ -1276,9 +1283,9 @@ "recentchangeslinked-page": "Назив странице:", "recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом", "recentchanges-page-added-to-category": "[[:$1]] је додата у категорију", - "recentchanges-page-added-to-category-bundled": "[[:$1]] и још {{PLURAL:$2|једна страница|$2 странице}} су додате у категорију", + "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију", "recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још {{PLURAL:$2|једна страница|$2 странице}} су уклоњене из категорије", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије", "autochange-username": "Медијавики аутоматска измена", "upload": "Пошаљи датотеку", "uploadbtn": "Пошаљи датотеку", @@ -1910,6 +1917,7 @@ "changecontentmodel-title-label": "Наслов странице", "changecontentmodel-model-label": "Нови модел садржаја", "changecontentmodel-reason-label": "Разлог:", + "changecontentmodel-submit": "Промени", "changecontentmodel-success-title": "Модел садржаја је промењен", "changecontentmodel-success-text": "Модел садржаја странице [[:$1]] је промењен.", "changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.", @@ -2579,7 +2587,7 @@ "variantname-gan": "gan", "variantname-sr-ec": "Ћирилица", "variantname-sr-el": "Latinica", - "variantname-sr": "sr", + "variantname-sr": "ћир/lat", "variantname-kk-kz": "kk-kz", "variantname-kk-tr": "kk-tr", "variantname-kk-cn": "kk-cn", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index 60e6c3a575..c189237047 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -1235,9 +1235,9 @@ "recentchangeslinked-page": "Naziv stranice:", "recentchangeslinked-to": "Prikaži izmene stranica koje su povezane s datom stranicom", "recentchanges-page-added-to-category": "[[:$1]] je dodata u kategoriju", - "recentchanges-page-added-to-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice}} su dodate u kategoriju", + "recentchanges-page-added-to-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice}}]] su dodate u kategoriju", "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice}} su uklonjene iz kategorije", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice}}]] su uklonjene iz kategorije", "autochange-username": "Medijaviki automatska izmena", "upload": "Pošalji datoteku", "uploadbtn": "Pošalji datoteku", @@ -2529,7 +2529,7 @@ "variantname-gan": "gan", "variantname-sr-ec": "Ćirilica", "variantname-sr-el": "Latinica", - "variantname-sr": "sr", + "variantname-sr": "ћир/lat", "variantname-kk-kz": "kk-kz", "variantname-kk-tr": "kk-tr", "variantname-kk-cn": "kk-cn", diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index e3a6a1ea58..dd4bb5d4a1 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -210,7 +210,6 @@ "moredotdotdot": "Mer...", "morenotlisted": "Denna lista är inte fullständig.", "mypage": "Sida", - "anonuserpage": "Okänd användare", "mytalk": "Diskussion", "anontalk": "Diskussion", "navigation": "Navigering", @@ -1371,9 +1370,9 @@ "recentchangeslinked-page": "Sidnamn:", "recentchangeslinked-to": "Visa ändringar på sidor med länkar till den givna sidan istället", "recentchanges-page-added-to-category": "[[:$1]] lades till i kategorin", - "recentchanges-page-added-to-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} lades till i kategorin", + "recentchanges-page-added-to-category-bundled": "[[:$1]] och [[Special:WhatLinksHere/$1|{{PLURAL:$2|en sida|$2 sidor}}]] lades till i kategorin", "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} togs bort från kategorin", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] och [[Special:WhatLinksHere/$1|{{PLURAL:$2|en sida|$2 sidor}}]] togs bort från kategorin", "autochange-username": "Automatisk MediaWiki-ändring", "upload": "Ladda upp fil", "uploadbtn": "Ladda upp fil", @@ -1553,6 +1552,7 @@ "uploadstash-badtoken": "Misslyckades att utföra åtgärden. Dina redigeringsrättigheter har kanske löpt ut. Försök igen.", "uploadstash-errclear": "Rensning av filerna misslyckades.", "uploadstash-refresh": "Uppdatera listan över filer", + "uploadstash-thumbnail": "visa miniatyr", "invalid-chunk-offset": "Ogiltig segmentsförskjutning", "img-auth-accessdenied": "Åtkomst nekad", "img-auth-nopathinfo": "PATH_INFO saknas.\nDin server är inte inställd för att ge denna information.\nDen kan vara CGI-baserad och stöder inte img_auth.\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Se bildbehörighet.]", @@ -3636,5 +3636,25 @@ "sessionprovider-generic": "$1-sessioner", "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner", "sessionprovider-nocookies": "Cookies kan vara inaktiverade. Se till att du har cookies aktiverat och försök igen.", - "randomrootpage": "Slumprotsida" + "randomrootpage": "Slumprotsida", + "log-action-filter-block": "Typ av blockering:", + "log-action-filter-delete": "Typ av radering:", + "log-action-filter-patrol": "Typ av patrullering:", + "log-action-filter-protect": "Typ av skydd:", + "log-action-filter-upload": "Typ av uppladdning:", + "log-action-filter-all": "Alla", + "log-action-filter-block-block": "Blockering", + "log-action-filter-block-reblock": "Blockeringsändring", + "log-action-filter-block-unblock": "Tog bort blockering", + "log-action-filter-delete-delete": "Radering av sida", + "log-action-filter-delete-restore": "Återställde sida", + "log-action-filter-delete-event": "Radering av logg", + "log-action-filter-delete-revision": "Radering av sidversion", + "log-action-filter-patrol-patrol": "Manuell patrullering", + "log-action-filter-patrol-autopatrol": "Automatisk patrullering", + "log-action-filter-protect-protect": "Skydd", + "log-action-filter-protect-modify": "Ändring av skydd", + "log-action-filter-protect-unprotect": "Tog bort skydd", + "log-action-filter-upload-upload": "Ny uppladdning", + "log-action-filter-upload-overwrite": "Återuppladdning" } diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json index 37ab024417..a87091ff0b 100644 --- a/languages/i18n/ta.json +++ b/languages/i18n/ta.json @@ -46,7 +46,8 @@ "Dineshkumar Ponnusamy", "Sharanrajindia", "Maathavan", - "தமிழ்க்குரிசில்" + "தமிழ்க்குரிசில்", + "Nemo bis" ] }, "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு", @@ -1330,7 +1331,7 @@ "recentchangeslinked-page": "பக்கப் பெயர்:", "recentchangeslinked-to": "இதற்குப் பதிலாக இப்பக்கத்தினை இணைத்த பக்கங்களின் மாற்றங்களைக் காட்டவும்", "recentchanges-page-added-to-category": "[[:$1]] பகுப்பில் சேர்க்கப்பட்டது", - "recentchanges-page-added-to-category-bundled": "[[:$1]] மற்றும் {{PLURAL:$2|ஒரு பக்கம்|$2 பக்கங்கள்}} பகுப்பில் சேர்க்கப்பட்டது", + "recentchanges-page-added-to-category-bundled": "[[:$1]] மற்றும் [[Special:WhatLinksHere/$1|{{PLURAL:$2|ஒரு பக்கம்|$2 பக்கங்கள்}}]] பகுப்பில் சேர்க்கப்பட்டது", "recentchanges-page-removed-from-category": "[[:$1]] பகுப்பில் இருந்து நீக்கப்பட்டது", "recentchanges-page-removed-from-category-bundled": "[[:$1]] மற்றும் {{PLURAL:$2|ஒரு பக்கம்|$2 பக்கங்கள்}} பகுப்பிலிருந்து நீக்கப்பட்டது", "autochange-username": "மீடியாவிக்கி தானியக்க மாற்றம்", diff --git a/languages/i18n/te.json b/languages/i18n/te.json index 5c3ad1c271..8f4ce43e94 100644 --- a/languages/i18n/te.json +++ b/languages/i18n/te.json @@ -1193,6 +1193,7 @@ "rcshowhidemine": "నా మార్పులను $1", "rcshowhidemine-show": "చూపించు", "rcshowhidemine-hide": "దాచు", + "rcshowhidecategorization": "పేజి వర్గీకరణ $1", "rcshowhidecategorization-show": "చూపించు", "rcshowhidecategorization-hide": "దాచు", "rclinks": "గత $2 రోజుల లోని చివరి $1 మార్పులను చూపించు
$3", @@ -1757,9 +1758,11 @@ "watchlist-submit": "చూపించు", "wlshowtime": "చూపించాల్సిన కాలం:", "wlshowhideminor": "చిన్న మార్పులు", + "wlshowhidebots": "బాట్లు", "wlshowhideliu": "నమోదైన వాడుకరులు", "wlshowhideanons": "అజ్ఞాత వాడుకరులు", "wlshowhidemine": "నా మార్పులు", + "wlshowhidecategorization": "పేజీ వర్గీకరణ", "watchlist-options": "వీక్షణ జాబితా ఎంపికలు", "watching": "గమనిస్తున్నారు...", "unwatching": "గమనించడం లేదు...", diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index f214131722..db06b86911 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -2175,10 +2175,10 @@ "blocklist-tempblocks": "Geçici engellemeleri gizle", "blocklist-addressblocks": "Tek IP engellemelerini gizle", "blocklist-rangeblocks": "Dizi bloklarını gizle", - "blocklist-timestamp": "Tarih damgası", + "blocklist-timestamp": "Tarih", "blocklist-target": "Hedef", "blocklist-expiry": "Bitiş tarihi", - "blocklist-by": "Engeli koyan hizmetli", + "blocklist-by": "Engeli veren hizmetli", "blocklist-params": "Engel parametreleri", "blocklist-reason": "Gerekçe", "ipblocklist-submit": "Ara", @@ -2190,7 +2190,7 @@ "noautoblockblock": "otomatik engelleme devre dışı bırakıldı", "createaccountblock": "hesap açımı engellendi", "emailblock": "e-posta engellendi", - "blocklist-nousertalk": "kendi tartışma sayfasını değiştiremez", + "blocklist-nousertalk": "kendi mesaj sayfasını değiştiremez", "ipblocklist-empty": "Engelleme listesi boş.", "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.", "blocklink": "engelle", @@ -2210,7 +2210,7 @@ "block-log-flags-nocreate": "hesap yaratımı engellendi", "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi", "block-log-flags-noemail": "e-posta engellendi", - "block-log-flags-nousertalk": "kendi tartışma sayfasını değiştiremez", + "block-log-flags-nousertalk": "kendi mesaj sayfasını değiştiremez", "block-log-flags-angry-autoblock": "gelişmiş oto-engelleme devrede", "block-log-flags-hiddenname": "kullanıcı adı gizli", "range_block_disabled": "Hizmetliler için aralık engellemesi oluşturma yeteneği devre dışı.", @@ -3310,7 +3310,7 @@ "revdelete-unrestricted": "hizmetliler için kaldırılmış kısıtlamalar", "logentry-block-block": "$1 {{GENDER:$2|engelledi}} {{GENDER:$4|$3}} engelleme süresi: $5 $6", "logentry-block-unblock": "$1 kullanıcısının {{GENDER:$2|engeli kaldırıldı}} {{GENDER:$4|$3}}", - "logentry-block-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6", + "logentry-block-reblock": "$1, {{GENDER:$4|$3}} kullanıcısının engellenme süresini $5 $6 olarak {{GENDER:$2|değiştirdi}}", "logentry-suppress-block": "{{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6", "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6", "logentry-import-upload": "$1 dosya yükleme ile {{GENDER:$2|içe aktardı}}: $3", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index 4d6231b208..de2a10dcf0 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -64,7 +64,8 @@ "Translatemyname", "Dars", "Mix Gerder", - "E.belykh" + "E.belykh", + "Visem" ] }, "tog-underline": "Підкреслювання посилань:", @@ -206,7 +207,6 @@ "moredotdotdot": "Більше…", "morenotlisted": "Цей список неповний.", "mypage": "Сторінка", - "anonuserpage": "Невідомий користувач", "mytalk": "Обговорення", "anontalk": "Обговорення", "navigation": "Навігація", @@ -1377,9 +1377,9 @@ "recentchangeslinked-page": "Назва сторінки:", "recentchangeslinked-to": "Показати зміни на сторінках, пов'язаних з даною", "recentchanges-page-added-to-category": "[[:$1]] Додано до категорії", - "recentchanges-page-added-to-category-bundled": "[[:$1]] та ще {{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було додано до категорії", + "recentchanges-page-added-to-category-bundled": "[[:$1]] та ще [[Special:WhatLinksHere/$1|{{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}}]] було додано до категорії", "recentchanges-page-removed-from-category": "[[:$1]] було вилучено з категорії", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] та ще {{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}} було вилучено з категорії", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] та ще [[Special:WhatLinksHere/$1|{{PLURAL:$2|$2 сторінку|$2 сторінки|$2 сторінок|1=одну сторінку}}]] було вилучено з категорії", "autochange-username": "Автоматичні редагування MediaWiki", "upload": "Завантажити файл", "uploadbtn": "Завантажити файл", @@ -1559,6 +1559,7 @@ "uploadstash-badtoken": "Не вдалося виконати вказану дію. Можливо, вичерпаний термін дії сесії редагування. Будь ласка, спробуйте ще раз.", "uploadstash-errclear": "Очищення файлів зазнало невдачі.", "uploadstash-refresh": "Оновити список файлів", + "uploadstash-thumbnail": "перегляд мініатюри", "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 Відкриття доступу до зображень]", @@ -3777,5 +3778,25 @@ "sessionprovider-generic": "сесій $1", "sessionprovider-mediawiki-session-cookiesessionprovider": "сесій на основі кук", "sessionprovider-nocookies": "Куки можуть бути відключені. Переконайтеся, що у Вас включені cookies і почніть знову.", - "randomrootpage": "Випадкова коренева сторінка" + "randomrootpage": "Випадкова коренева сторінка", + "log-action-filter-block": "Тип блокування:", + "log-action-filter-delete": "Тип вилучення:", + "log-action-filter-patrol": "Тип патрулювання:", + "log-action-filter-protect": "Тип захисту:", + "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-delete-delete": "Видалення сторінки", + "log-action-filter-delete-restore": "Відновлення сторінки", + "log-action-filter-delete-event": "Вилучення журналу", + "log-action-filter-delete-revision": "Вилучення версії", + "log-action-filter-patrol-patrol": "Ручне патрулювання", + "log-action-filter-patrol-autopatrol": "Автоматичне патрулювання", + "log-action-filter-protect-protect": "Захист", + "log-action-filter-protect-modify": "Зміна захисту", + "log-action-filter-protect-unprotect": "Зняття захисту", + "log-action-filter-upload-upload": "Нове завантаження", + "log-action-filter-upload-overwrite": "Повторне завантаження" } diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index 3815e1d74d..dc92a0124c 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -175,7 +175,6 @@ "moredotdotdot": "Thêm nữa…", "morenotlisted": "Danh sách này không có đầy đủ.", "mypage": "Trang cá nhân", - "anonuserpage": "Người dùng không rõ", "mytalk": "Tin nhắn", "anontalk": "Thảo luận", "navigation": "Xem nhanh", @@ -240,7 +239,7 @@ "viewhelppage": "Xem trang trợ giúp", "categorypage": "Xem trang thể loại", "viewtalkpage": "Xem trang thảo luận", - "otherlanguages": "Trong các ngôn ngữ khác", + "otherlanguages": "Trong ngôn ngữ khác", "redirectedfrom": "(đổi hướng từ $1)", "redirectpagesub": "Trang đổi hướng", "redirectto": "Đổi hướng đến:", @@ -534,6 +533,7 @@ "changepassword-success": "Mật khẩu của bạn đã được thay đổi.", "changepassword-throttled": "Bạn đã thử đăng nhập gần đây nhiều lần quá. Xin chờ $1 trước khi bạn thử lần nữa.", "botpasswords": "Mật khẩu Bot", + "botpasswords-summary": "Mật khẩu bot cho phép truy cập một tài khoản người dùng qua API mà không sử dụng thông tin chứng nhận chính của tài khoản. Các quyền người dùng có thể bị hạn chế khi đăng nhập dùng mật khẩu bot.\n\nNếu bạn không hiểu tại sao cần sử dụng mật khẩu bot, có lẽ bạn không nên sử dụng nó. Không ai bao giờ có lý do chính đáng để yêu cầu bạn tạo ra một mật khẩu bot và cung cấp nó cho họ.", "botpasswords-disabled": "Mật khẩu Bot bị vô hiệu hoá.", "botpasswords-no-central-id": "Để sử dụng mật khẩu bot, bạn phải đăng nhập vào một tài khoản tập trung.", "botpasswords-existing": "Mật khẩu bot hiện tại", @@ -546,17 +546,19 @@ "botpasswords-label-delete": "Xoá", "botpasswords-label-resetpassword": "Đặt lại mật khẩu", "botpasswords-label-grants": "Các quyền có liên quan:", + "botpasswords-help-grants": "Các lượt cấp phép cho phép truy cập các quyền người dùng mà một tài khoản đã có sẵn. Xem thêm thông tin trong [[Special:ListGrants|bảng cấp phép]].", "botpasswords-label-restrictions": "Hạn chế sử dụng:", "botpasswords-label-grants-column": "Cấp quyền", "botpasswords-bad-appid": "Bot có tên \"$1\" không hợp lệ.", "botpasswords-insert-failed": "Không thể thêm tên bot \"$1\". Nó đã được thêm vào chưa?", "botpasswords-update-failed": "Thất bại khi cập nhật bot có tên \"$1\". Có phải nó đã bị xóa?", "botpasswords-created-title": "Mật khẩu bot đã được tạo", - "botpasswords-created-body": "Mật khẩu bot \"$1\" đã được tạo thành công.", + "botpasswords-created-body": "Đã tạo mật khẩu cho bot “$1” của người dùng “$2”.", "botpasswords-updated-title": "Mật khẩu Bot đã được cập nhật", - "botpasswords-updated-body": "Mật khẩu bot \"$1\" đã được cập nhật thành công.", + "botpasswords-updated-body": "Đã cập nhật mật khẩu cho bot “$1” của người dùng “$2”.", "botpasswords-deleted-title": "Bot mật khẩu đã bị xóa", - "botpasswords-deleted-body": "Mật khẩu bot \"$1\" đã bị xóa.", + "botpasswords-deleted-body": "Đã xóa mật khẩu cho bot “$1” của người dùng “$2”.", + "botpasswords-newpassword": "Mật khẩu mới để đăng nhập như $1 là $2. Xin hãy ghi lại mật khẩu này để mai mốt tham khảo.", "botpasswords-no-provider": "BotPasswordsSessionProvider không có sẵn.", "botpasswords-restriction-failed": "Mật khẩu bot giới hạn ngăn chặn đăng nhập này.", "botpasswords-invalid-name": "Tên người dùng đã chỉ định không chứa dấu tách mật khẩu bot (\"$1\").", @@ -565,7 +567,7 @@ "resetpass-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.", "resetpass-submit-loggedin": "Thay đổi mật khẩu", "resetpass-submit-cancel": "Hủy bỏ", - "resetpass-wrong-oldpass": "Mật khẩu tạm hoặc mật khẩu hiện thời không hợp lệ.\nCó thể bạn đã thay đổi thành công mật khẩu của mình hoặc đã yêu cầu cung cấp một mật khẩu tạm mới.", + "resetpass-wrong-oldpass": "Mật khẩu tạm hoặc mật khẩu hiện thời không hợp lệ.\nCó thể bạn đã thay đổi mật khẩu của mình hoặc đã yêu cầu cung cấp một mật khẩu tạm mới.", "resetpass-recycled": "Xin vui lòng chọn một mật khẩu khác với mật khẩu hiện tại.", "resetpass-temp-emailed": "Bạn đã đăng nhập bằng mật khẩu tạm gửi qua thư điện tử. Để hoàn tất việc đăng nhập, bạn phải tạo lại mật khẩu mới tại đây:", "resetpass-temp-password": "Mật khẩu tạm:", @@ -851,7 +853,7 @@ "revdelete-submit": "Áp dụng vào {{PLURAL:$1|phiên bản|các phiên bản}} được chọn", "revdelete-success": "Phiên bản Hiển thị đã cập nhật.", "revdelete-failure": "'''Không thể cập nhật khả năng hiển thị của phiên bản:'''\n$1", - "logdelete-success": "'''Khả năng nhìn thấy của sự kiện đã được thiết lập thành công.'''", + "logdelete-success": "Đã thiết lập khả năng nhìn thấy của nhật trình.", "logdelete-failure": "'''Không thể thiết lập khả năng hiện thị của nhật trình:'''\n$1", "revdel-restore": "đổi mức khả kiến", "pagehist": "Lịch sử trang", @@ -882,11 +884,13 @@ "mergehistory-empty": "Không thể trộn được sửa đổi nào.", "mergehistory-done": "$3 phiên bản của $1 đã được trộn vào [[:$2]].", "mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.", + "mergehistory-fail-bad-timestamp": "Dấu thời gian không hợp lệ.", "mergehistory-fail-invalid-source": "Trang nguồn không hợp lệ.", "mergehistory-fail-invalid-dest": "Trang đích không hợp lệ.", "mergehistory-fail-no-change": "Kết hợp lịch sử đã không hợp nhất bất kỳ sửa đổi nào. Xin vui lòng kiểm tra lại trang và các thông số thời gian.", "mergehistory-fail-permission": "Không đủ quyền để hợp nhất lịch sử.", "mergehistory-fail-self-merge": "Trang nguồn và đích là giống nhau.", + "mergehistory-fail-timestamps-overlap": "Các phiên bản nguồn trùng với nhau hoặc dẫn sau các phiên bản đích.", "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.", "mergehistory-no-source": "Trang nguồn $1 không tồn tại.", "mergehistory-no-destination": "Trang đích $1 không tồn tại.", @@ -1331,9 +1335,9 @@ "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", - "recentchanges-page-added-to-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được xếp vào thể loại", + "recentchanges-page-added-to-category-bundled": "[[:$1]] và [[Special:WhatLinksHere/$1|{{PLURAL:$2|một trang|$2 trang}} nữa]] được xếp vào thể loại", "recentchanges-page-removed-from-category": "[[:$1]] được gỡ khỏi thể loại", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] và {{PLURAL:$2|một trang|$2 trang}} nữa được gỡ khỏi thể loại", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] và [[Special:WhatLinksHere/$1|{{PLURAL:$2|một trang|$2 trang}} nữa]] được gỡ khỏi thể loại", "autochange-username": "MediaWiki thay đổi tự động", "upload": "Tải tập tin lên", "uploadbtn": "Tải tập tin lên", @@ -1406,6 +1410,7 @@ "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.", "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.", "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện $1=\"$2\" trong tập tin SVG.", + "uploaded-href-attribute-svg": "Các đặc tính href trong tập tin SVG chỉ được phép dẫn đến các trang http:// hoặc https://, nhưng gặp phải <$1 $2=\"$3\">.", "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích URI data: không an toàn <$1 $2=\"$3\"> trong tập tin SVG được tải lên.", "uploaded-animate-svg": "Tìm thấy thẻ “animate” có thể thay đổi href qua thuộc tính “from” <$1 $2=\"$3\"> trong tập tin SVG được tải lên.", "uploaded-setting-event-handler-svg": "Đã ngăn cản việc đặt thuộc tính xử lý sự kiện khi tìm thấy <$1 $2=\"$3\"> trong tập tin SVG được tải lên.", @@ -1439,6 +1444,7 @@ "upload-too-many-redirects": "URL có quá nhiều đổi hướng", "upload-http-error": "Xảy ra lỗi HTTP: $1", "upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.", + "upload-foreign-cant-upload": "Wiki này không được thiết lập để tải tập tin lên kho tập tin chung bên ngoài được chỉ định.", "upload-dialog-title": "Tải tập tin lên", "upload-dialog-button-cancel": "Hủy bỏ", "upload-dialog-button-done": "Xong", @@ -1448,6 +1454,7 @@ "upload-form-label-infoform-name": "Tên", "upload-form-label-infoform-name-tooltip": "Một tiêu đề mô tả duy nhất cho tập tin, mà sẽ được dùng để làm một tên file. Bạn có thể sử dụng ngôn ngữ đơn giản với các dấu cách. Không bao gồm phần mở rộng của file.", "upload-form-label-infoform-description": "Miêu tả", + "upload-form-label-infoform-description-tooltip": "Miêu tả một cách ngắn gọn mỗi điều đáng kể về tác phẩm này.\nNếu là hình chụp, hãy nói đến những vật thể chính, cũng như tình hình, sự kiện, hay địa điểm của hình chụp.", "upload-form-label-usage-title": "Sử dụng", "upload-form-label-usage-filename": "Tên tập tin", "foreign-structured-upload-form-label-own-work": "Đây là tác phẩm của chính tôi", @@ -1510,6 +1517,7 @@ "uploadstash-badtoken": "Tác vụ bị thất bại, có lẽ vì thông tin đăng nhập của bạn đã hết hạn. Hãy thử lại.", "uploadstash-errclear": "Việc dọn sạch các tập tin bị thất bại.", "uploadstash-refresh": "Làm mới danh sách tập tin", + "uploadstash-thumbnail": "xem hình thu nhỏ", "invalid-chunk-offset": "Khúc lệch (chunk offset) không hợp lệ", "img-auth-accessdenied": "Không cho phép truy cập", "img-auth-nopathinfo": "Thiếu PATH_INFO.\nMáy chủ của bạn không được thiết lập để truyền thông tin này.\nCó thể do nó dựa trên CGI và không hỗ trợ img_auth.\nXem [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization hướng dẫn điều khiển truy cập hình ảnh].", @@ -1777,6 +1785,7 @@ "apisandbox-dynamic-parameters-add-label": "Thêm tham số:", "apisandbox-dynamic-parameters-add-placeholder": "Tên tham số", "apisandbox-dynamic-error-exists": "Một tham số có tên \"$1\" đã tồn tại.", + "apisandbox-deprecated-parameters": "Tham số bị phản đối", "apisandbox-fetch-token": "Tự động điền token này", "apisandbox-submit-invalid-fields-title": "Một số field là không hợp lệ", "apisandbox-submit-invalid-fields-message": "Xin vui lòng sửa các miền được đánh dấu và thử lại.", @@ -1786,6 +1795,8 @@ "apisandbox-results-error": "Một lỗi xuất hiện khi tải các đáp ứng truy vấn API: $1.", "apisandbox-request-url-label": "URL của yêu cầu:", "apisandbox-request-time": "Thời gian yêu cầu: $1 ms", + "apisandbox-results-fixtoken": "Sửa lại dấu hiệu và gửi lại", + "apisandbox-results-fixtoken-fail": "Thất bại khi lấy dấu hiệu “$1”.", "apisandbox-alert-page": "Các miền trên Trang này là không hợp lệ.", "apisandbox-alert-field": "Giá trị của miền này là không hợp lệ.", "booksources": "Nguồn sách", @@ -1868,6 +1879,8 @@ "listgrouprights-namespaceprotection-header": "Hạn chế không gian tên", "listgrouprights-namespaceprotection-namespace": "Không gian tên", "listgrouprights-namespaceprotection-restrictedto": "Quyền cho phép người dùng sửa đổi", + "listgrants": "Cấp phép", + "listgrants-summary": "Danh sách sau có các lượt cấp phép và thông tin về quyền truy cập quyền người dùng. Những người dùng có thể cho phép các ứng dụng sử dụng tài khoản của họ, các quyền được hạn chế tùy theo người dùng cấp phép cho ứng dụng. Một ứng dụng hoạt động nhân danh người dùng thực sự chỉ có thể sử dụng các quyền mà người dùng thật có.\nCó thể có [[{{MediaWiki:Listgrouprights-helppage}}|thêm thông tin]] về các quyền nói riêng.", "listgrants-grant": "Cấp phép", "listgrants-rights": "Quyền lợi", "trackingcategories": "Thể loại phần mềm", @@ -2019,6 +2032,7 @@ "changecontentmodel-nodirectediting": "Kiểu nội dung $1 không hỗ trợ sửa đổi trực tiếp", "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung", "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.", + "logentry-contentmodel-new": "$1 {{GENDER:$2}}đã tạo trang $3 với mô hình nội dung không mặc định “$5”", "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi kiểu nội dung của trang $3 từ “$4” thành “$5”", "logentry-contentmodel-change-revertlink": "lùi lại", "logentry-contentmodel-change-revert": "lùi lại", @@ -2425,7 +2439,7 @@ "import-nonewrevisions": "Không nhập phiên bản nào (tất cả các phiên bản đều đã có sẵn hoặc bị bỏ qua do lỗi).", "xml-error-string": "$1 tại dòng $2, cột $3 (byte $4): $5", "import-upload": "Tải lên dữ liệu XML", - "import-token-mismatch": "Mất dữ liệu phiên làm việc. Xin hãy thử lại lần nữa.", + "import-token-mismatch": "Mất dữ liệu phiên làm việc.\n\nCó thể bạn đã được đăng xuất. Xin hãy xác nhận rằng bạn vẫn được đăng nhập và thử lại.\nNếu vẫn không được, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại, và kiểm tra rằng trình duyệt của bạn cho phép các cookie của trang Web này.", "import-invalid-interwiki": "Không thể nhập trang từ wiki được chỉ định.", "import-error-edit": "Trang “$1” không được nhập tại vì bạn không được phép sửa đổi nó.", "import-error-create": "Trang “$1” không được nhập tại vì bạn không được phép tạo ra nó.", @@ -2653,6 +2667,7 @@ "newimages-legend": "Bộ lọc", "newimages-label": "Tên tập tin (hoặc một phần tên):", "newimages-showbots": "Xem các tập tin do bot tải lên", + "newimages-hidepatrolled": "Ẩn tập tin tải lên đã tuần tra", "noimages": "Chưa có hình.", "ilsubmit": "Tìm kiếm", "bydate": "theo ngày", @@ -2897,8 +2912,16 @@ "exif-compression-34712": "JPEG 2000", "exif-copyrighted-true": "Dưới bản quyền", "exif-copyrighted-false": "Cờ bản quyền không được đặt", + "exif-photometricinterpretation-0": "Trắng đen (trắng là 0)", "exif-photometricinterpretation-1": "Trắng đen (đen là 0)", "exif-photometricinterpretation-2": "RGB", + "exif-photometricinterpretation-3": "Bảng màu", + "exif-photometricinterpretation-4": "Mặt nạ trong suốt", + "exif-photometricinterpretation-5": "Riêng rẽ (có lẽ CMYK)", + "exif-photometricinterpretation-9": "CIE L*a*b* (mã hóa Hiệp hội Màu sắc Quốc tế)", + "exif-photometricinterpretation-10": "CIE L*a*b* (mã hóa Liên minh Viễn thông Quốc tế)", + "exif-photometricinterpretation-32803": "Dãy bộ lọc màu sắc", + "exif-photometricinterpretation-34892": "Thô tuyến", "exif-unknowndate": "Không biết ngày", "exif-orientation-1": "Thường", "exif-orientation-2": "Lộn ngược theo phương ngang", @@ -2910,6 +2933,8 @@ "exif-orientation-8": "Quay 90° bên phải", "exif-planarconfiguration-1": "định dạng thấp", "exif-planarconfiguration-2": "định dạng phẳng", + "exif-xyresolution-i": "$1 điểm/inch", + "exif-xyresolution-c": "$1 điểm/cm", "exif-colorspace-65535": "Chưa hiệu chỉnh", "exif-componentsconfiguration-0": "không tồn tại", "exif-exposureprogram-0": "Không chỉ định", @@ -3080,9 +3105,10 @@ "scarytranscludefailed-httpstatus": "[Truy xuất bản mẫu $1 bị thất bại: HTTP $2]", "scarytranscludetoolong": "[Địa chỉ URL quá dài]", "deletedwhileediting": "'''Cảnh báo''': Trang này đã bị xóa sau khi bắt đầu sửa đổi!", - "confirmrecreate": "Thành viên [[User:$1|$1]] ([[User talk:$1|thảo luận]]) đã xóa trang này sau khi bạn bắt đầu sửa đổi trang với lý do:\n: ''$2''\nXin hãy xác nhận bạn thực sự muốn tạo lại trang này.", + "confirmrecreate": "Thành viên [[User:$1|$1]] ([[User talk:$1|thảo luận]]) đã xóa trang này sau khi bạn bắt đầu sửa đổi trang với lý do:\n: $2\nXin hãy xác nhận bạn thực sự muốn tạo lại trang này.", "confirmrecreate-noreason": "Người dùng [[User:$1|$1]] ([[User talk:$1|talk]]) xóa trang này sau khi bạn bắt đầu sửa đổi nó. Bạn có chắc chắn muốn tạo lại trang này không?", "recreate": "Tạo ra lại", + "unit-pixel": "điểm ảnh", "confirm_purge_button": "Làm tươi", "confirm-purge-top": "Làm sạch vùng nhớ đệm của trang này?", "confirm-purge-bottom": "Làm mới một trang sẽ giúp xóa bộ đệm và buộc hiển thị phiên bản gần nhất.", @@ -3246,7 +3272,7 @@ "version-libraries-authors": "Tác giả", "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc ID đăng nhập", "redirect-legend": "Đổi hướng đến tập tin hoặc trang", - "redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].", + "redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), trang cá nhân (theo số thành viên), hoặc mục nhật trình (theo số mục nhật trình). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], hoặc [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "Đi", "redirect-lookup": "Tra cứu:", "redirect-value": "Giá trị:", @@ -3254,6 +3280,7 @@ "redirect-page": "Số trang", "redirect-revision": "Số phiên bản trang", "redirect-file": "Tên tập tin", + "redirect-logid": "Số mục nhật trình", "redirect-not-exists": "Không tìm thấy giá trị", "fileduplicatesearch": "Tìm kiếm các tập tin trùng lắp", "fileduplicatesearch-summary": "Tìm kiếm các bản sao y hệt với tập tin khác, theo giá trị băm của nó.", @@ -3587,8 +3614,9 @@ "expand_templates_generate_xml": "Xem cây phân tích XML", "expand_templates_generate_rawhtml": "Hiển thị HTML thô", "expand_templates_preview": "Xem trước", - "expand_templates_preview_fail_html": "{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.\n\nNếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.\nNếu vẫn không được, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.", + "expand_templates_preview_fail_html": "{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.\n\nNếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.\nNếu vẫn không được, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại, và kiểm tra rằng trình duyệt của bạn cho phép các cookie của trang Web này.", "expand_templates_preview_fail_html_anon": "{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.\n\nNếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.\nNếu vẫn không được, hãy [[Special:UserLogin|đăng nhập]] và thử lại lần nữa.", + "expand_templates_input_missing": "Bạn phải cung cấp văn bản nhập.", "pagelanguage": "Thay đổi ngôn ngữ của trang", "pagelang-name": "Trang", "pagelang-language": "Ngôn ngữ", @@ -3607,7 +3635,7 @@ "mediastatistics": "Thống kê phương tiện", "mediastatistics-summary": "Thống kê về các kiểu tập tin đã tải lên. Bảng này chỉ liệt kê phiên bản mới nhất của các tập tin. Các phiên bản cũ hoặc các phiên bản bị xóa được bỏ qua.", "mediastatistics-nbytes": "$1 byte ($2; $3%)", - "mediastatistics-bytespertype": "Tổng kích thước tập tin của phần này: $1 byte.", + "mediastatistics-bytespertype": "Tổng kích thước tập tin của phần này: $1 byte ($2; $3%).", "mediastatistics-allbytes": "Tổng kích thước của tất cả các tập tin: $1 byte ($2).", "mediastatistics-table-mimetype": "Kiểu MIME", "mediastatistics-table-extensions": "Phần mở rộng có thể", @@ -3664,6 +3692,8 @@ "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1", "api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ.", "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.", + "sessionprovider-generic": "phiên $1", + "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie", "sessionprovider-nocookies": "Cookie có thể bị vô hiệu hóa. Đảm bảo bạn đã bật cookie và bắt đầu một lần nữa.", "randomrootpage": "Trang gốc ngẫu nhiên" } diff --git a/languages/i18n/wa.json b/languages/i18n/wa.json index 20ee5aa000..898a3df063 100644 --- a/languages/i18n/wa.json +++ b/languages/i18n/wa.json @@ -14,6 +14,7 @@ "tog-hideminor": "Èn nén mostrer les dierins candjmints mineurs", "tog-hidepatrolled": "Èn nén mostrer les candjmints ddja patrouyîs", "tog-newpageshidepatrolled": "Èn nén mostrer el djivêye des novelès pådjes les cenes dedja patrouyeyes", + "tog-hidecategorization": "Èn nén mostrer les categorijhaedjes des pådjes", "tog-extendwatchlist": "Ragrandi l' djivêye po mostrer tos les candjmints, nén seulmint les dierins", "tog-usenewrc": "Relére par pådje dins les dierins candjmints et l' djivêye des shuvous (i fåt JavaScript)", "tog-numberheadings": "Limerotaedje otomatike des tites", @@ -34,7 +35,7 @@ "tog-shownumberswatching": "Mostrer l' nombe d' uzeus ki shuvèt l' pådje", "tog-oldsig": "Siné pol moumint:", "tog-fancysig": "Sinateure avou do tecse wiki (sins loyén otomatike)", - "tog-uselivepreview": "Eployî l' prévoeyaedje abeye (JavaScript) (Esperimintå)", + "tog-uselivepreview": "Eployî l' préveyaedje abeye", "tog-forceeditsummary": "M' advierti cwand dji lai vude on rascourti", "tog-watchlisthideown": "Èn nén mostrer les candjmints da minne", "tog-watchlisthidebots": "Èn nén mostrer les candjmints des robots", @@ -45,6 +46,7 @@ "tog-ccmeonemails": "M' evoyî ene copeye des emiles ki dj' evoye ås ôtes", "tog-diffonly": "Èn nén håyner l' contnou del pådje pa dzo l' pådje des diferinces", "tog-showhiddencats": "Mostrer les categoreyes mucheyes", + "tog-norollbackdiff": "Èn nén håyner les diferinces après on disfijhaedje", "tog-useeditwarning": "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés", "underline-always": "Tofer", "underline-never": "Måy", @@ -101,6 +103,18 @@ "oct": "oct", "nov": "nôv", "dec": "dec", + "january-date": "$1 di djanvî", + "february-date": "$1 di fevrî", + "march-date": "$1 di måss", + "april-date": "$1 d' avri", + "may-date": "$1 di may", + "june-date": "$1 di djun", + "july-date": "$1 di djulete", + "august-date": "$1 d' awousse", + "september-date": "$1 di setimbe", + "october-date": "$1 d' octôbe", + "november-date": "$1 di nôvimbe", + "december-date": "$1 di decimbe", "pagecategories": "{{PLURAL:$1|Categoreye|Categoreyes}}", "category_header": "Årtikes el categoreye «$1»", "subcategories": "Dizo-categoreyes", @@ -120,9 +134,9 @@ "newwindow": "(drovant en on novea purnea)", "cancel": "Rinoncî", "moredotdotdot": "Co dpus...", - "mypage": "Mi pådje", + "mypage": "Pådje", "mytalk": "Mi copinaedje", - "anontalk": "Pådje di copene po ciste adresse IP", + "anontalk": "Copinaedje", "navigation": "Naiviaedje", "and": " eyet", "qbfind": "Trover", @@ -133,6 +147,7 @@ "actions": "Accions", "namespaces": "Espåces di lomaedje", "variants": "Variantes", + "navigation-heading": "Menu d' naiviaedje", "errorpagetitle": "Aroke", "returnto": "Rivni al pådje «$1».", "tagline": "Èn årtike di {{SITENAME}}.", @@ -148,6 +163,7 @@ "permalink": "Hårdêye viè cisse modêye ci", "print": "Imprimer", "view": "Vey", + "view-foreign": "Vey so $1", "edit": "Candjî", "create": "Ahiver", "editthispage": "Candjî l' pådje", @@ -169,7 +185,7 @@ "articlepage": "Vey l' årtike", "talk": "Copene", "views": "Vuwes", - "toolbox": "Boesse ås usteyes", + "toolbox": "Usteyes", "userpage": "Vey li pådje di l' uzeu", "projectpage": "Vey li pådje do pordjet", "imagepage": "Vey li pådje do fitchî", @@ -187,21 +203,27 @@ "pool-errorunknown": "Aroke nén cnoxhowe", "aboutsite": "Åd fwait di {{SITENAME}}", "aboutpage": "Project:Åd fwait", - "copyright": "Li contnou est dizo l' $1.", + "copyright": "Li contnou est dzo l' licince $1 a moens k' ça soeye dit ôtrumint.", "copyrightpage": "{{ns:project}}:Abondroets", "currentevents": "Actouwålités", "currentevents-url": "Project:Actouwålités", "edithelp": "Aidance", + "helppage-top-gethelp": "Aidance", "mainpage": "Mwaisse pådje", "mainpage-description": "Mwaisse pådje", "portal": "Inte di nozôtes", "portal-url": "Project:Inte di nozôtes", "badaccess": "Åk n' a nén stî avou les permissions", + "badaccess-groups": "L' accion ki vos avoz dmandé est limitêye ås uzeus {{PLURAL:$2|do groupe|des groupes}}: $1.", "versionrequired": "I vs fåt l' modêye $1 di MediaWiki", "versionrequiredtext": "I vs fåt l' modêye $1 di MediaWiki po-z eployî cisse pådje ci. Loukîz [[Special:Version|al pådje des modêyes]]", "ok": "'l est bon", "retrievedfrom": "Prin del pådje «$1»", "youhavenewmessages": "Vos avoz des $1 ($2).", + "youhavenewmessagesfromusers": "{{PLURAL:$4|Vos avoz}} $1 {{PLURAL:$3|d' èn ôte uzeu|di $3 ôtes uzeus}} ($2).", + "youhavenewmessagesmanyusers": "Vous avoz $1 di bråmint d' uzeus ($2).", + "newmessageslinkplural": "{{PLURAL:$1|on novea messaedje|999=noveas messaedjes}}", + "newmessagesdifflinkplural": "{{PLURAL:$1|dierin candjmint|999=dierins candjmints}}", "youhavenewmessagesmulti": "Vos avoz des noveas messaedjes so $1", "editsection": "candjî", "editold": "candjî", @@ -214,6 +236,9 @@ "hidetoc": "catchî", "collapsible-collapse": "erôler", "collapsible-expand": "diswalper", + "confirmable-confirm": "Estoz vs {{GENDER:$1|seur|seure}}?", + "confirmable-yes": "Oyi", + "confirmable-no": "Neni", "thisisdeleted": "Vey ou rapexhî $1?", "viewdeleted": "Vey $1?", "restorelink": "{{PLURAL:$1|on candjmint disfacé|$1 candjmints disfacés}}", @@ -234,12 +259,14 @@ "nstab-template": "Modele", "nstab-help": "Aidance", "nstab-category": "Categoreye", + "mainpage-nstab": "Mwaisse pådje", "nosuchaction": "Nole sifwaite accion", "nosuchactiontext": "L' accion specifieye pal hårdêye n' est nén ricnoxhowe på wiki.\nMotoit ki vos avoz må scrît l' hårdêye ou shuvou on cron loyén.\nÇa pôreut eto esse on bug do programe eployî pa {{SITENAME}}.", "nosuchspecialpage": "Nole sifwaite pådje", "nospecialpagetext": "Vos avoz dmandé ene pådje sipeciåle nén valide, po ene djivêye des pådjes sipeciåles valides, loukîz a [[Special:SpecialPages]].", "error": "Aroke", "databaseerror": "Åk n' a nén stî avou l' båze di dnêyes", + "databaseerror-error": "Aroke: $1", "laggedslavemode": "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.", "readonly": "Li båze di dnêyes est aclawêye", "missing-article": "Li båze di dnêyes n' a nén trové l' tecse d' ene pådje k' åreut dvou esse trovêye, lomêye «$1» $2.\n\nÇoula arive cwand on shût on loyén po ene diferince k' est houte ou viè l' istwere d' ene pådej disfacêye.\n\nSi c' est nén çoula, motoit k' vos avoz trové on bug dins l' programe.\nAdon dijhoz l' a on [[Special:ListUsers/sysop|manaedjeu]], sins rovyî d' mete li hårdêye (URL) ki mostere l' aroke.", @@ -257,18 +284,22 @@ "cannotdelete": "Dji n' sai disfacer l' pådje ou l' fitchî «$1».\nÇa s' pôreut k' ene ôte sakî l' a ddja disfacé.", "cannotdelete-title": "Dji n' sai disfacer l' pådje «$1»", "badtitle": "Måva tite", - "badtitletext": "Li tite del pådje dimandêye n' esteut nén valide, il estet vude, oudonbén c' esteut on cron loyén eterlingaedje ou eterwiki. Ça s' pout k' il åye onk ou sacwants caracteres ki n' polèt nén esse eployîs dins les tites.", + "badtitletext": "Li tite del pådje dimandêye n' esteut nén valide, il esteut vude, oudonbén c' esteut on cron loyén eterlingaedje ou eterwiki.\nÇa s' pout k' il åye onk ou sacwants caracteres ki n' polèt nén esse eployîs dins les tites.", + "title-invalid-too-long": "Li tite di pådje dimandé est pår trop longou. Ça n' pout nén aveur pus di $1 {{PLURAL:$1|octet|octets}} e l' ecôdaedje UTF-8.", "perfcached": "Les dnêyes ki shuvèt c' est ene copeye e muchete, et ça s' pout ki ça n' soeye nén ttafwaitmint a djoû. Li muchete a-st on macsimom {{PLURAL:$1|d' on rzultat|di $1 rizultats}}.", "perfcachedts": "Les dnêyes ki shuvèt c' est ene copeye e muchete, ey elle ont stî metowes a djoû pol dierin côp li $1. Li muchete a-st on macsimom {{PLURAL:$4|d' on rzultat|di $4 rizultats}}.", "viewsource": "Vey côde sourdant", "viewsource-title": "Côde sourdant di «$1»", "viewsourcetext": "Loukîz li contnou d' l’ årtike, et s’ li rcopyî si vos vloz, por vos bouter dsu foû des fyis:", "protectedinterface": "Cisse pådje ci dene on tecse d' eterface pol programe, eyet elle a stî protedjeye po s' waeranti siconte des abus.", - "editinginterface": "'''Asteme:''' Vos estoz ki candje ene pådje eployeye po fé l' tecse po l' eterface do programe.\nLes candjmints ki vso frîz vont candjî l' rivnance di l' eterface po ds ôtes uzeus.\nPo des ratournaedjes, loukîz purade a [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], li pordjet di locålijhaedje da MediaWiki.", + "editinginterface": "Asteme: Vos estoz ki candje ene pådje eployeye po fé l' tecse po l' eterface do programe.\nLes candjmints ki vos frîz vont candjî l' rivnance di l' eterface po ls ôtes uzeus do wiki.", "cascadeprotected": "Cisse pådje ci a stî protedjeye siconte des candjmints, pask' ele est eploye ådvins {{PLURAL:$1|del pådje shuvante k' est protedjeye|des pådjes shuvantes ki sont protedjeyes}} avou l' tchuze «e cascåde» en alaedje:\n$2", - "logouttext": "'''Vos vs avoz dislodjî.'''\n\nVos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén [$1 vos relodjî], dizo l' minme uzeu ou dizo èn uzeu diferin.\nNotez ki des pådjes k' i gn a si pôrént continowuer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.", + "logouttext": "Vos vs avoz dislodjî.\n\nNotez ki des pådjes k' i gn a si pôrént continouwer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.", + "welcomeuser": "Bénvnowe, $1!", "yourname": "Vosse no d' elodjaedje:", + "userlogin-yourname": "No d' uzeu", "yourpassword": "Vosse sicret", + "userlogin-yourpassword": "Sicret", "yourpasswordagain": "Ritapez vosse sicret", "remembermypassword": "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})", "yourdomainname": "Vosse dominne", @@ -279,15 +310,20 @@ "logout": "Si dislodjî", "userlogout": "Si dislodjî", "notloggedin": "Nén elodjî", + "userlogin-joinproject": "S' edjîstrer so {{SITENAME}}", "nologin": "Vos n' avoz nén d' conte so ç' wiki ci? $1.", "nologinlink": "Ahivez on conte da vosse", "createaccount": "Ahiver on novea conte", "gotaccount": "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.", "gotaccountlink": "Elodjîz vs", "userlogin-resetlink": "Avoz rovyî les pondants et djondants po s' elodjî?", - "createaccountmail": "pa emile", + "createaccountmail": "Eployî on scret timporaire a l' astcheyance eyet l' evoyî so l' emile diné", + "createacct-realname": "Vraiy no (opcionel)", "createaccountreason": "Råjhon:", + "createacct-reason": "Råjhon", "createacct-another-submit": "Ahiver èn ôte conte", + "createacct-benefit-body1": "{{PLURAL:$1|candjmint|candjmints}}", + "createacct-benefit-body2": "{{PLURAL:$1|pådje|pådjes}}", "badretype": "Vos avoz dné deus screts diferins.", "userexists": "Li no d' uzeu ki vs avoz tchoezi est ddja eployî.\nTchoezixhoz è èn ôte s' i vs plait.", "loginerror": "Aroke d' elodjaedje", @@ -299,10 +335,12 @@ "nosuchuser": "I g na nou uzeu dizo l' no «$1».\nNotez k' les nos d' uzeu fjhèt l' diferince etur pitites et grandès letes.\nVerifyîz çou k' vos avoz tapé, oudonbén [[Special:UserLogin/signup|ahivez on novea conte]].", "nosuchusershort": "I g na nou uzeu dizo l' no «$1». Verifyîz çou k' vos avoz tapé.", "nouserspecified": "Vos dvoz dner on no d' elodjaedje.", + "login-userblocked": "{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}}. L' elodjaedje n' est nén possibe.", "wrongpassword": "Li scret ki vs avoz dné est måva. Rissayîz s' i vs plait.", "wrongpasswordempty": "Vos avoz dné on vude sicret. Rissayîz s' i vs plait.", "passwordtooshort": "Li scret doet esse di pol moens {{PLURAL:$1|1 caractere|$1 caracteres}}.", - "mailmypassword": "M' emiler on novea scret", + "passwordtoolong": "Les screts n' polèt nén aveur pus di {{PLURAL:$1|1 caractere|$1 caracteres}}.", + "mailmypassword": "Rifé l' sicret", "passwordremindertitle": "Novea scret timporaire po {{SITENAME}}", "passwordremindertext": "Ene sakî (probåblumint vos-minme, avou l' adresse IP $1) a dmandé \non novea scret po {{SITENAME}} ($4).\nOn scret timporare po l' uzeu «$2» a stî fwait, c' est «$3».\nSi c' est vos k' a fwait l' dimande, vos vs divoz elodjî eyet tchoezi on novea scret.\nLi scret timporaire ni srè pus valide après {{PLURAL:$5|on djoû|$5 djoûs}}.\n\nSi c' est ene ôte sakî k' a fwait l' dimande, ou si vos vs avoz rtrové l' vî scret eyet \nnel pus vleur candjî, vos ploz djusse ignorer ci messaedje ci eyet continouwer avou l' vî scret.", "noemail": "I n' a pont d' adresse emile di cnoxhowe po l' uzeu «$1».", @@ -318,20 +356,22 @@ "emailconfirmlink": "Acertinaedje di voste adresse emile", "invalidemailaddress": "L' adresse emile ni pout nén esse acceptêye la k' i shonnreut k' ele soeye dins ene cogne nén valide.\nTapez ene adresse emile sicrîte comifåt oudobén vudîz l' tchamp, s' i vs plait.", "accountcreated": "Conte ahivé", - "accountcreatedtext": "Li conte d' uzeu «$1» a stî ahivé.", + "accountcreatedtext": "Li conte d' uzeu «[[{{ns:User}}:$1|$1]]» ([[{{ns:User talk}}:$1|copene]]) a stî ahivé.", "loginlanguagelabel": "Lingaedje: $1", "pt-login": "S' elodjî", "pt-login-button": "S' elodjî", "pt-createaccount": "Ahiver on novea conte", "pt-userlogout": "\nSi dislodjî", "changepassword": "Candjî l' sicret", - "resetpass_announce": "Vos vs avoz elodjî avou on scret timporaire ki vos a stî emilé.\nPor vos fini l' elodjaedje, vos dvoz defini on novea scret:", + "resetpass_announce": "Por vos fini l' elodjaedje, vos dvoz defini on novea scret.", "resetpass_header": "Candjî l' sicret do conte", "oldpassword": "Vî scret:", "newpassword": "Noû scret:", "retypenew": "Ritapez l' noû scret:", "resetpass_submit": "Defini on scret et s' elodjî", - "changepassword-success": "Vosse sicret a stî candjî comifåt!\nAsteure l' elodjaedje...", + "changepassword-success": "Vosse sicret a stî candjî comifåt!", + "botpasswords-label-update": "Mete a djoû", + "botpasswords-label-delete": "Disfacer", "resetpass_forbidden": "Les screts n' polèt nén esse candjîs", "resetpass-no-info": "Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.", "resetpass-submit-loggedin": "Candjî l' sicret", @@ -346,8 +386,8 @@ "passwordreset-capture-help": "Si vos clitchîz cisse boesse ci, l' emile (eyet li scret timporaire) vos srè håyné e minme tins k' il est emilé.", "passwordreset-email": "Adresse emile:", "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}", - "changeemail": "Candjî l' emile", - "changeemail-header": "Candjî l' adresse emile do conte", + "changeemail": "Candjî ou disfacer l' adresse emile", + "changeemail-header": "Completez cisse pådje ci po candjî l' adresse emile do conte.\nSi vos vloz disfacer totes les adresses aloyeyes, leyîz l' tchamp vude å moumint d' evoyî.", "changeemail-no-info": "Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.", "changeemail-oldemail": "Adresse emile pol moumint:", "changeemail-newemail": "Novele adresse emile:", @@ -372,14 +412,14 @@ "sig_tip": "Li sinateure da vosse, avou l' date et l' eure", "hr_tip": "Roye di coûtchî (a n' nén eployî d' trop)", "summary": "Rascourti:", - "subject": "Sudjet/tiestire:", + "subject": "Sudjet:", "minoredit": "Ci n' est k' ene tchitcheye", "watchthis": "Shuve cist årtike", "savearticle": "Schaper l' pådje", "preview": "Vey divant", "showpreview": "Vey divant", "showdiff": "Vey les candjmints", - "anoneditwarning": "'''Asteme:''' Vos n' estoz nén elodjî.\nVoste adresse IP serè rashiowe dins l' istwere di cisse pådje ci.", + "anoneditwarning": "Asteme: Vos n' estoz nén elodjî.\nVoste adresse IP serè rashiowe dins l' istwere di cisse pådje ci eyet veyowe publicmint.\nSi vos vs [$1 elodjîz] ou [$2 ahivez on conte], les candjmints da vosse seront-st atribouwés a vosse no d' uzeu, et co ds ôtes advintaedjes.", "anonpreviewwarning": "''Vos n' estoz nén elodjî. Si vos schapez c' est voste adresse IP ki serè wårdêye dins l' istwere des candjmints.''", "missingsummary": "'''Asteme:''' Vos n' avoz nén dné on tecse di rascourti po vosse candjmint. Si vos rclitchîz sol boton «Schaper», li candjmint da vosse serè schapé sins nou tecse di rascourti po l' istwere del pådje.", "missingcommenttext": "Tapez on comintaire chal pa dzo s' i vs plait.", @@ -395,10 +435,10 @@ "accmailtitle": "Li scret a stî evoyî.", "accmailtext": "On scret costrût a l' astcheyance po [[User talk:$1|$1]] a stî evoyî a $2.\n\nLi scret po ci novea conte ci pout esse candjî sol pådje di ''[[Special:ChangePassword|candjmint di scret]]'' après l' elodjaedje.", "newarticle": "(Novea)", - "newarticletext": "Vos avoz clitchî so on loyén viè ene pådje ki n' egzistêye nén co.\nMins '''vos''' l' poloz askepyî! Po çoula, vos n' avoz k' a cmincî a taper vosse tecse dins l' boesse di tecse chal pa dzo (alez vey li [$1 pådje d' aidance] po pus d' infôrmåcion).\nSi vos n' voloz nén scrire cisse pådje chal, clitchîz simplumint sol boton '''En erî''' di vosse betchteu waibe po rivni al pådje di dvant.", - "anontalkpagetext": "---- ''Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén (co) fwait on conte por lu s' elodjî, ou ki n' l' eploye nén.\nÇa fwait k' on doet eployî si adresse IP limerike po l' idintifyî.\nCome ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos voeyoz chal des rmarkes et des messaedjes ki n' sont nén por vos.\nLoukîz s' i vs plait po [[Special:UserLogin/signup|fé on novea conte]] ou [[Special:UserLogin|s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.''", + "newarticletext": "Vos avoz clitchî so on loyén viè ene pådje ki n' egzistêye nén co.\nMins '''vos''' l' poloz askepyî! Po çoula, vos n' avoz k' a cmincî a taper vosse tecse dins l' boesse di tecse cial pa dzo (alez vey li [$1 pådje d' aidance] po pus d' infôrmåcion).\nSi vos estoz droci par accidint, clitchîz simplumint sol boton En erî di vosse betchteu waibe po rivni al pådje di dvant.", + "anontalkpagetext": "---- ''Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén (co) fwait on conte por lu s' elodjî, ou ki n' l' eploye nén.\nÇa fwait k' on doet eployî si adresse IP limerike po l' idintifyî.\nCome ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos veyoz chal des rmarkes et des messaedjes ki n' sont nén por vos.\nLoukîz s' i vs plait po [[Special:UserLogin/signup|fé on novea conte]] ou [[Special:UserLogin|s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.''", "noarticletext": "I gn a pol moumint nou tecse e cisse pådje chal.\nVos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes,\noudonbén [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås],\nou co [{{fullurl:{{FULLPAGENAME}}|action=edit}} ahiver l' pådje].", - "noarticletext-nopermission": "I gn a pol moumint nou tecse e cisse pådje chal.\nVos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes,\noudonbén [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås].", + "noarticletext-nopermission": "I gn a pol moumint nou tecse e cisse pådje chal.\nVos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes,\noudonbén [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås], mins vos n' avoz nén l' livea d' permission pol poleur ahiver.", "blocked-notice-logextract": "{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}} pol moumint.\nLi dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:", "clearyourcache": "'''Note:''' après aveur schapé l' pådje, vos l' divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe.\n* '''Firefox / Safari:''' tchôkîz so ''Shift'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' so on Mac)\n* '''Google Chrome:''' tchôkîz so ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)\n* '''Internet Explorer:''' tchôkîz so ''Ctrl'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5''\n* '''Konqueror:''' clitchîz so ''Rafrister'' ou tchôkîz so ''F5''\n* '''Opera:''' vudîz l' muchete dins ''Usteyes → Preferinces''.", "usercssyoucanpreview": "'''Racsegne:''' eployîz l' boton «{{int:showpreview}}» po sayî vosse novea CSS divant del schaper.", @@ -425,7 +465,7 @@ "editingold": "'''ASTEME: Vos estoz ki candje ene viye modêye del pådje.\nSi vos l' schapez, tos les candjmints k' ont stî fwaits\ndispoy adon si vont piede.'''", "yourdiff": "Diferinces", "copyrightwarning": "Notez ki tos les contribouwaedjes fwaits po {{SITENAME}} dvèt esse dizo l' licince $2 (loukîz $1 po pus di racsegnes).\nSi vos n' voloz nén ki vosse tecse poye esse candjî eyet spårdou pa tot l' minme kî, adon nel evoyîz nén chal.
\nVos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz copyî d' on sourdant libe (dominne publik ou on sourdant pareymint libe).\n'''N' EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION!'''", - "copyrightwarning2": "Notez ki tos les contribouwaedjes fwaits po {{SITENAME}} polèt esse esse candjîs ou disfacés pa des ôtes contribouweus.\nSi vos n' voloz nén scrire des årtikes ki polèt esse candjîs pa des ôtes, adon nels evoyîz nén chal.
\nVos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz copyî d' on sourdant libe (voeyoz $1 po pus di racsegnes).\n'''N' EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION!'''", + "copyrightwarning2": "Notez ki tos les contribouwaedjes fwaits po {{SITENAME}} polèt esse esse candjîs ou disfacés pa des ôtes contribouweus.\nSi vos n' voloz nén scrire des årtikes ki polèt esse candjîs pa des ôtes, adon nels evoyîz nén chal.
\nVos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz copyî d' on sourdant libe (veyoz $1 po pus di racsegnes).\n'''N' EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION!'''", "longpageerror": "'''AROKE: Li tecse ki vos avoz evoyî fwait di pus d' $1 kilo-octet{{PLURAL:$1||s}}, çou k' est pus ki l' macsimom di $2 kilo-octet{{PLURAL:$2||s}}.'''\nC' est nén possible del schaper sol sierveu.", "readonlywarning": "'''ASTEME: On-z overe sol båze di dnêyes pol moumint, ey elle a stî metowe e mode seulmint-lére.\nDo côp, vos n' såroz schaper vos candjmints asteure.'''\nMotoit vos dvrîz copyî et aclaper l' tecse dins on fitchî da vosse pol poleur rimete pus tård.\n\nLi manaedjeu k' a-st eclawé l' båze di dnêyes a dné cist esplicaedje ci: $1", "protectedpagewarning": "'''ASTEME: Cisse pådje chal a stî protedjeye, seulmint les uzeus avou èn accès di manaedjeu el polèt candjî.'''\nLi dierinne intrêye ezès djournås est håynêye chal pa dzo po referince:", @@ -454,7 +494,7 @@ "currentrev": "Modêye d' asteure", "currentrev-asof": "Dierinne modêye å $1", "revisionasof": "Modêye do $1", - "revision-info": "Modêye do $1 pa $2", + "revision-info": "Modêye do $1 pa $2$7", "previousrevision": "←Modêye di dvant", "nextrevision": "Modêye shuvante→", "currentrevisionlink": "Modêye d' asteure", @@ -479,10 +519,11 @@ "rev-deleted-text-permission": "Cisse modêye ci del pådje a stî '''disfacêye'''.\nVos ploz vey les ca et les ma sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].", "rev-deleted-text-view": "Cisse modêye ci del pådje a stî '''disfacêye'''.\nVos l' poloz co vey; i gn a des detays sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].", "rev-delundel": "mostrer/catchî", + "rev-showdeleted": "mostrer", "revisiondelete": "Disfacer/rapexhî des modêyes", "revdelete-show-file-submit": "Oyi", "logdelete-selected": "{{PLURAL:$1|Evenmint tchoezi|Evenmints tchoezis}} ezès djournås:", - "revdelete-legend": "Defini des restriccions sol voeyaedje", + "revdelete-legend": "Defini des restriccions sol veyaedje", "revdelete-hide-text": "Catchî l' tecse del modêye", "revdelete-hide-comment": "Catchî l' comintaire di candjmint", "revdelete-hide-user": "Catchî l' no d' uzeu/adresse IP do candjeu", @@ -514,7 +555,7 @@ "shown-title": "Mostrer $1 rizultat{{PLURAL:$1||s}} par pådje", "viewprevnext": "Vey ($1 {{int:pipe-separator}} $2) ($3).", "searchmenu-exists": "'''Gn a ddja ene pådje lomêye « [[:$1]] » so ç' wiki ci'''", - "searchmenu-new": "'''Ahiver l' pådje \"[[:$1]]\" so ç' wiki ci!'''", + "searchmenu-new": "Ahiver l' pådje \"[[:$1]]\" so ç' wiki ci!\n{{PLURAL:$2|0=|Loukîz eto l' pådje trovêye pa vosse cweraedje.|Loukîz eto li rzultat di vosse cweraedje.}}", "searchprofile-articles": "Pådjes di contnou", "searchprofile-images": "Multimedia", "searchprofile-everything": "Tote li waibe", @@ -539,6 +580,7 @@ "powersearch-togglelabel": "Tchoezi:", "powersearch-toggleall": "Totafwait", "powersearch-togglenone": "Disclitchî tot", + "powersearch-remember": "Rimimbrer l' tchuze po ls ôtes cweraedjes", "search-external": "Difoûtrin cweraedje", "searchdisabled": "Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou pol moumint, cåze ki l' sierveu est fortcherdjî. Tot ratindant, vos ploz eployî Google po fé les rcweraedjes so {{SITENAME}}, mins çoula pout esse ene miete vî.", "preferences": "Preferinces", @@ -554,6 +596,7 @@ "prefs-watchlist-days": "Nombe di djoûs a mostrer dins l' djivêye:", "prefs-watchlist-days-max": "Macsimom $1 djoû{{PLURAL:$1||s}}", "prefs-watchlist-edits": "Nombe di candjmints a mostrer dins l' djivêye:", + "prefs-watchlist-edits-max": "Nombe macsimom: 1000", "prefs-misc": "Totes sôres", "prefs-resetpass": "Candjî l' sicret", "prefs-changeemail": "Candjî l' emile", @@ -566,9 +609,13 @@ "rows": "Royes", "columns": "Colones", "searchresultshead": "Håynaedje des rzultats di cweraedje", + "stub-threshold": "Limite pol formataedje des loyéns djermons ($1):", + "stub-threshold-sample-link": "egzimpe", + "stub-threshold-disabled": "Dismetou", "recentchangesdays": "Nombe di djoûs po les dierins candjmints:", "recentchangesdays-max": "Macsimom $1 djoû{{PLURAL:$1||s}}", "recentchangescount": "Prémetou nombe di candjmintstites a håyner:", + "prefs-help-recentchangescount": "Çouchal inclût les dierins candjmints, l' istwere, eyet les djournås.", "savedprefs": "Vos preferinces ont stî schapêyes.", "timezonelegend": "Coisse d' eureye:", "localtime": "L' eure locåle", @@ -696,7 +743,7 @@ "right-deletedtext": "Vey les tecses disfacés eyet les candjmints etur disfacêyès modêyes", "right-browsearchive": "Loukî après les disfacêyès pådjes", "right-undelete": "Rapexhî ene pådje k' a stî disfacêye", - "right-suppressrevision": "Verifyî et rapexhî les modêyes catcheyes åzès manaedjeus", + "right-suppressrevision": "Vey, catchî et discatchî des dnés candjmints po tot l' minme kén uzeu", "right-suppressionlog": "Vey les djournås privés", "right-block": "Espaitchî d' ôtes uzeus di scrire", "right-blockemail": "Espaitchî èn uzeu d' evoyî des emiles", @@ -704,6 +751,7 @@ "right-ipblock-exempt": "Passer houte des blocaedjes pa adresse IP, pa fortchete d' adresses ou des blocaedjes otomatikes", "right-unblockself": "Si disbloker lu-minme", "right-protect": "Candjî les liveas d' protedjaedje eyet candjî les pådjes protedjeyes", + "right-rollback": "Disfijhaedje abeye des candjmints do dierin uzeu a-z aveur candjî ene pådje", "newuserlogpage": "Djournå des noveas uzeus", "newuserlogpagetext": "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.", "rightslog": "Djournå des droets des uzeus", @@ -741,14 +789,32 @@ "recentchanges-label-minor": "Ci n' est k' on ptit candjmint", "recentchanges-label-bot": "Ci candjmint la a stî fwait pa on robot", "recentchanges-label-unpatrolled": "Ci candjmint la n' a nén co stî patrouyî", + "recentchanges-label-plusminus": "Li grandeur del pådje a candjî d' ostant d' octets", + "recentchanges-legend-heading": "Ledjinde:", + "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vey eto l' [[Special:NewPages|djivêye des nouvès pådjes]])", + "recentchanges-submit": "Vey", "rcnotefrom": "Chal pa dzo les candjmints dispoy li '''$2''' (disk' a '''$1''' di mostrés).", "rclistfrom": "Mostrer les candjmints k' i gn a yeu a pårti do $3 $2", "rcshowhideminor": "$1 candjmints mineurs", + "rcshowhideminor-show": "Mostrer", + "rcshowhideminor-hide": "Catchî", "rcshowhidebots": "$1 robots", - "rcshowhideliu": "$1 uzeus eredjîstrés", + "rcshowhidebots-show": "Mostrer", + "rcshowhidebots-hide": "Catchî", + "rcshowhideliu": "$1 uzeus edjîstrés", + "rcshowhideliu-hide": "Catchî", "rcshowhideanons": "$1 uzeus anonimes", + "rcshowhideanons-show": "Mostrer", + "rcshowhideanons-hide": "Catchî", "rcshowhidepatr": "$1 candjmints rwaitîs", + "rcshowhidepatr-show": "Mostrer", + "rcshowhidepatr-hide": "Catchî", "rcshowhidemine": "$1 candjmints da minne", + "rcshowhidemine-show": "Mostrer", + "rcshowhidemine-hide": "Catchî", + "rcshowhidecategorization": "$1 li categorijhaedjes des pådjes", + "rcshowhidecategorization-show": "Mostrer", + "rcshowhidecategorization-hide": "Catchî", "rclinks": "Mostrer les $1 dierins candjmints des dierins $2 djoûs.
$3", "diff": "dif.", "hist": "ist.", @@ -762,7 +828,7 @@ "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 (i fåt JavaScript)", + "rc-enhanced-expand": "Mostrer les detays", "rc-enhanced-hide": "Catchî les detays", "recentchangeslinked": "Candjmints aloyîs", "recentchangeslinked-feed": "Candjmints aloyîs", @@ -844,8 +910,12 @@ "shared-repo-from": "vént d' $1", "shared-repo": "on depot pårtaedjî", "filerevert": "Rimete come divant $1", + "filerevert-legend": "Rapexhî l' fitchî", + "filerevert-intro": "Vos estoz k' alez rapexhî l' fitchî [[Media:$1|$1]] al [$4 modêye do $3, a $2].", "filerevert-comment": "Råjhon:", + "filerevert-defaultcomment": "Rimetou al modêye do $2, a $1 ($3)", "filerevert-submit": "Disfé", + "filerevert-success": "[[Media:$1|$1]] a stî rmetou al [$4 modêye do $3, a $2].", "filedelete": "Disfacer $1", "filedelete-legend": "Disfacer fitchî", "filedelete-comment": "Råjhon:", @@ -905,6 +975,7 @@ "mostimages": "Imådjes les pus loyeyes", "mostrevisions": "Årtikes avou l' pus di candjmints", "prefixindex": "Indecse pa betchete", + "prefixindex-submit": "Mostrer", "shortpages": "Coûtès pådjes", "longpages": "Longowès pådjes", "deadendpages": "Pådjes sins nou loyén wiki", @@ -912,6 +983,7 @@ "protectedpages": "Pådjes protedjeyes", "protectedpages-indef": "Seulmint les protedjaedje disk' a todi", "protectedpages-cascade": "Seulmint les protedjaedjes e cascåde", + "protectedpages-noredirect": "Catchî les redjiblaedjes", "protectedpagesempty": "I gn a pol moumint nole pådje sifwaitmint protedjeye.", "protectedtitles": "Tites protedjîs", "protectedtitlesempty": "I gn a pol moumint nou tite sifwaitmint protedjî.", @@ -919,6 +991,7 @@ "usereditcount": "$1 candjmint{{PLURAL:$1||s}}", "usercreated": "{{GENDER:$3|Edjîstré|Edjîstrêye}} li $1 a $2", "newpages": "Novelès pådjes", + "newpages-submit": "Mostrer", "newpages-username": "No d' elodjaedje:", "ancientpages": "Viyès pådjes", "move": "Displaecî", @@ -929,9 +1002,11 @@ "pager-older-n": "{{PLURAL:$1|$1 pus vî|$1 pus vîs}}", "booksources": "Sourdants po les lives", "booksources-search-legend": "Cweri des sourdants po des lives", + "booksources-search": "Cweri", "specialloguserlabel": "Fwait pa:", "speciallogtitlelabel": "Såme (tite ou uzeu):", "log": "Djournås", + "logeventslist-submit": "Mostrer", "all-logs-page": "Tos les djournås publiks", "alllogstext": "Håynaedje etercroejhlé di tos les djournås disponibes so {{SITENAME}}.
\nVos ploz defini l' håynaedje tot tchoezixhant ene sôre di djournå, on no d' uzeu, ou l' tite d' ene pådje (po ces deus dierins l' sitinme fwait l' diferince inte les grandes et les ptitès letes).", "logempty": "Rén n' corespond dins l' djournå.", @@ -945,7 +1020,9 @@ "allpagessubmit": "I va", "allpagesprefix": "Håyner les pådjes avou l' betchete:", "allpagesbadtitle": "Li tite di pådje diné n' est nén valide oudonbén il a-st ene betchete di loyén eterlingaedje ou eterwiki. Ça s' pout k' il åye onk ou d' pus d' caracteres ki n' si polèt nén eployî dins les tites.", + "allpages-hide-redirects": "Catchî les redjiblaedjes", "categories": "Categoreyes", + "categories-submit": "Mostrer", "categoriespagetext": "{{PLURAL:$1|Li categoreye shuvante est eployeye|Les categoreyes shuvantes sont-st eployeyes}} pa des pådjes ou des fitchîs.\n[[Special:UnusedCategories|Les categoreyes nén eployeyes]] èn sont nén håynêyes chal.\nLoukîz eto [[Special:WantedCategories|les categoreyes dimandêyes]].", "categoriesfrom": "Håyner les categoreyes a pårti di:", "special-categories-sort-count": "relére pa nombe di cayets", @@ -964,6 +1041,7 @@ "listusers-submit": "Vey", "listusers-noresult": "Nol uzeu di trové.", "listusers-blocked": "({{GENDER:$1|bloké|blokêye}})", + "activeusers-hidebots": "Catchî les robots", "listgrouprights-members": "(djivêye des mimbes)", "mailnologin": "Nole adresse d' evoyeu", "mailnologintext": "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].", @@ -996,13 +1074,15 @@ "notanarticle": "Nén èn årtike", "watchlist-details": "Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).", "wlheader-enotif": "Li notifiaedje pa emile est en alaedje.", - "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''", + "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e cråssès letes.", "wlnote": "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.", - "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs ou", + "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs", + "watchlist-hide": "Catchî", + "watchlist-submit": "Mostrer", "watchlist-options": "Tchuzes del djivêye des shuvous", "enotif_reset": "Mårker totes les pådjes come vizitêyes", "enotif_lastvisited": "Loukîz $1 po tos les candjmints dispoy vosse dierinne vizite.", - "enotif_body": "Binamé $WATCHINGUSERNAME,\n\nLi pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED li $PAGEEDITDATE pa $PAGEEDITOR,\nloukîz $PAGETITLE_URL pol modêye do moumint.\n\n$NEWPAGE\n\nComintaire do candjeu: $PAGESUMMARY $PAGEMINOREDIT\n\nContak do candjeu:\nemile: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nI n' årè nén d' ôtes notifiaedjes po ds ôtes candjmints di ç' minme pådje ci tant k' vos n' l' åroz nén vizitêye.\nVos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.\n\n\nVosse binamé sistinme di notifiaedje so {{SITENAME}}\n\n--\nPo candjî l' apontiaedje di vos notifiaedjes pa emile, loukîz\n{{canonicalurl:{{#special:Preferences}}}}\n\nPo candjî l' apontiaedje di vosse djivêye a shuve, loukîz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPo rsaetchî l' pådje di vosse djivêye a shuve, alez so\n$UNWATCHURL\n\nPo pus d' aidance:\n$HELPPAGE", + "enotif_body": "Binamé $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nComintaire do candjeu: $PAGESUMMARY $PAGEMINOREDIT\n\nContak do candjeu:\nemile: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nI n' årè nén d' ôtes notifiaedjes po ds ôtes candjmints di ç' minme pådje ci tant k' vos n' l' åroz nén vizitêye (tot estant elodjî).\nVos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.\n\n\nVosse binamé sistinme di notifiaedje so {{SITENAME}}\n\n--\nPo candjî l' apontiaedje di vos notifiaedjes pa emile, loukîz\n{{canonicalurl:{{#special:Preferences}}}}\n\nPo candjî l' apontiaedje di vosse djivêye a shuve, loukîz\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPo rsaetchî l' pådje di vosse djivêye a shuve, alez so\n$UNWATCHURL\n\nPo pus d' aidance:\n$HELPPAGE", "created": "ahivêye", "changed": "candjeye", "deletepage": "Disfacer l' pådje", @@ -1013,6 +1093,7 @@ "delete-confirm": "Disfacer «$1»", "delete-legend": "Disfacer", "historywarning": "'''Asteme:''' Li pådje ki vos alez disfacer a-st ene istwere avou a pô près $1 modêye{{PLURAL:$1||s}}:", + "historyaction-submit": "Mostrer", "confirmdeletetext": "Vos alez disfacer ene pådje avou tote si istwere.\nAcertinez s' i vs plait ki c' est bén çoula ki vos vloz fé,\nki vos comprindoz les consecwinces, et ki vos fjhoz çoula\ntot [[{{MediaWiki:Policy-url}}|shuvant les rîles]].", "actioncomplete": "Fwait", "actionfailed": "L' accion a fwait berwete", @@ -1028,11 +1109,15 @@ "delete-edit-reasonlist": "Candjî les råjhons do disfaçaedje", "delete-toobig": "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.\nLi disfaçaedje des sfwaitès pådjes a stî dismetou po-z espaitchî k' i gn åye des problinmes so {{SITENAME}}.", "delete-warning-toobig": "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.\nSi disfaçaedje pôreut fé des problinmes avou l' rotaedje del båze di dnêyes so {{SITENAME}}; \nnel fijhoz k' avou asteme.", + "rollback": "Disfé les candjmints", "rollbacklink": "netyî", + "rollbacklinkcount": "disfé $1 {{PLURAL:$1|candjmint|candjmints}}", + "rollbackfailed": "Li disfijhaedje a fwait berwete", "cantrollback": "Dji n' sai disfé les candjmints; li dierin contribouweu est li seu oteur po cist årtike ci.", "alreadyrolled": "Dji n' sai disfé li dierin candjmint di [[$1]] fwait pa [[User:$2|$2]] ([[User talk:$2|Copene]]);\nene sakî d' ôte a ddja candjî l' årtike ou ddja rmetou l' modêye di dvant.\n\nLi dierin candjmint a stî fwait pa [[User:$3|$3]] ([[User talk:$3|Copene]]).", "editcomment": "Li rascourti do candjmint esteut: $1.", "revertpage": "Disfwait les candjmints da [[Special:Contributions/$2|$2]] ([[User talk:$2|copene]]); li dierin candjmint est asteure da [[User:$1|$1]]", + "rollback-success": "Disfwait les candjmints da $1;\nli dierin candjmint est asteure da $2.", "protectlogpage": "Djournå des protedjaedjes", "protectlogtext": "Chal pa dzo c' est ene djivêye des protedjaedjes et disprotedjaedjes des pådjes.\nLoukîz al [[Special:ProtectedPages|djivêye des pådjes protedjeyes]] po vey les protedjaedjes ki sont en alaedje pol moumint.", "protectedarticle": "«[[$1]]» protedjî", @@ -1099,8 +1184,9 @@ "undelete-missing-filearchive": "Nén possibe d' aler rapexhî li fitchî avou l’ ID $1 pask' i n' est nén dins l' båze di dnêyes. Motoit k' il a ddja stî rapexhî dvant.", "namespace": "Espåce di lomaedje:", "invert": "Tchuze å rvier", + "namespace_association": "Espåce di lomaedje aloyî", "blanknamespace": "(Mwaisse)", - "contributions": "Ovraedjes di l' uzeu", + "contributions": "Ovraedjes di l' {{GENDER:$1|uzeu|uzeuse}}", "contributions-title": "Djivêye des ovraedjes di l' {{GENDER:$1|uzeu|uzeuse}} $1", "mycontris": "Mi ovraedje", "contribsub2": "Po l' uzeu $1 ($2)", @@ -1137,6 +1223,7 @@ "whatlinkshere-hidelinks": "$1 les loyaedjes", "whatlinkshere-hideimages": "$1 fitchîs k' eploynut cist imådje ci", "whatlinkshere-filters": "Passetes", + "whatlinkshere-submit": "Vey", "autoblockid": "Blocaedje otomatike #$1", "blockip": "Bloker èn uzeu", "blockiptext": "Rimplixhoz les tchamps chal pa dzo po bloker\nl' accès e scrijhaedje d' èn uzeu dné ou a pårt d' ene\nadresse IP dnêye. Çouci èn doet esse fwait ki po-z arester les\nvandales, et çoula doet esse fwait tot shuvant les\n[[{{MediaWiki:Policy-url}}|rîles]].\nDinez ene råjhon do blocaedje (eg: dijhoz les pådjes k' ont\nstî vandalijheyes).", @@ -1254,7 +1341,7 @@ "importlogpagetext": "Ristitchaedjes (import) administratifs di pådjes avou leus istorikes di candjmints, a pårti d' ôtes wikis.", "import-logentry-upload-detail": "$1 {{PLURAL:$1|modêye|modêyes}}", "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|modêye|modêyes}} foû di $2", - "tooltip-pt-userpage": "Pådje d' uzeu da minne", + "tooltip-pt-userpage": "Pådje d' {{GENDER:|uzeu|uzeuse}} da minne", "tooltip-pt-anonuserpage": "Li pådje d' uzeu po l' adresse IP ki vos eployîz pol moumint", "tooltip-pt-mytalk": "Pådje di copene da minne", "tooltip-pt-anontalk": "Pådje di copene po les candjmints fwaits a pårti di ciste adresse IP ci", @@ -1263,8 +1350,9 @@ "tooltip-pt-mycontris": "Djivêye des ovraedjes da minne", "tooltip-pt-login": "Vos estoz ecoraedjî d' vos elodjî, mins nerén, c' est nén oblidjî.", "tooltip-pt-logout": "Vos dislodjî", + "tooltip-pt-createaccount": "Nos vs ricomandans d' ahiver on conte et di vs elodjî; mins nerén, c' est nén oblidjî", "tooltip-ca-talk": "Copene åd fwait do contnou del pådje", - "tooltip-ca-edit": "Vos ploz candjî cisse pådje ci. S' i vs plait, eployîz l' boton «Vey divant» po vs acertiner k' tot est comifåt dvant d' schaper vos candjmints.", + "tooltip-ca-edit": "Candjî l' pådje", "tooltip-ca-addsection": "Radjouter ene novele seccion", "tooltip-ca-viewsource": "Cisse pådje ci est protedjeye.\nVos ploz seulmint vey li côde sourdant, mins nén l' candjî.", "tooltip-ca-history": "Viyès modêyes del pådje.", @@ -1290,7 +1378,7 @@ "tooltip-t-recentchangeslinked": "Dierins candjmints fwaits so des pådjes ki cisse pådje ci a des loyéns viè zeles", "tooltip-feed-rss": "Sindicåcion RSS po cisse pådje ci", "tooltip-feed-atom": "Sindicåcion Atom po cisse pådje ci", - "tooltip-t-contributions": "Vey li djivêye des ovraedjes fwait pa cist uzeu ci", + "tooltip-t-contributions": "Vey li djivêye des ovraedjes fwait pa {{GENDER:$1|cist uzeu|ciste uzeuse}} ci", "tooltip-t-emailuser": "Evoyî èn emile a cist uzeu ci", "tooltip-t-upload": "Eberweter sol sierveu des imådjes ou fitchîs media", "tooltip-t-specialpages": "Djivêye di totes les pådjes sipeciåles", @@ -1299,7 +1387,7 @@ "tooltip-ca-nstab-main": "Vey li pådje di contnou", "tooltip-ca-nstab-user": "Vey li pådje di l' uzeu", "tooltip-ca-nstab-media": "Vey li pådje di media", - "tooltip-ca-nstab-special": "Çouchal, c' est ene pådje sipeciåle, vos n' poloz nén candjî l' pådje leye-minme.", + "tooltip-ca-nstab-special": "Çouchal, c' est ene pådje sipeciåle, ele ni s' pout nén candjî.", "tooltip-ca-nstab-project": "Vey li pådje di pordjet", "tooltip-ca-nstab-image": "Vey li pådje do fitchî", "tooltip-ca-nstab-mediawiki": "Vey li messaedje ratournåve do sistinme", @@ -1327,10 +1415,12 @@ "anonusers": "$1, {{PLURAL:$2|uzeu anonime|uzeus anonimes}} di {{SITENAME}}", "creditspage": "Pådje di credits", "nocredits": "I n' a pont d' infôrmåcion di credits po cisse pådje ci.", + "spam_reverting": "Rimetaedje al dierinne modêye sins nou loyén viè $1", "pageinfo-title": "Infôrmåcion po «$1»", "pageinfo-watchers": "Nombe di shuveus", "pageinfo-edits": "Nombe di candjmints", "pageinfo-authors": "Nombe d' oteurs diferins", + "pageinfo-toolboxlink": "Infôrmåcion sol pådje", "markaspatrolleddiff": "Marké come ricoridjî", "markaspatrolledtext": "Marker cisse pådje ci come dedja patrouyeye", "patrol-log-page": "Djournå des patrouyaedjes", @@ -1342,13 +1432,16 @@ "previousdiff": "← Diferinces des candjmints di dvant", "nextdiff": "Diferinces des candjmints shuvants →", "mediawarning": "'''Asteme''': Ci fitchî chal pôreut esse evirussé.\nSi vos l' enondez vos pôrîz infecter l' sistinme da vosse.", - "imagemaxsize": "Limite pol grandeu des imådjes:
''(ezès pådjes d'i discrijhaedje di fitchîs)''", - "thumbsize": "Grandeu po les imådjetes (thumb):", + "imagemaxsize": "Limite pol grandeur des imådjes:
(ezès pådjes di discrijhaedje di fitchîs)", + "thumbsize": "Grandeur po les imådjetes (thumb):", "widthheightpage": "$1 × $2, $3 pådje{{PLURAL:$3||s}}", "file-info-size": "$1 × $2 picsels, groxheur do fitchî: $3, del sôre \"MIME\": $4", "file-nohires": "I n' a nén di pus grande finté.", "svg-long-desc": "Fitchî SVG, finté di $1 × $2 picsels, grandeu: $3", - "show-big-image": "Imådje a si grandeur d' oridjinne", + "show-big-image": "Fitchî d' oridjinne", + "show-big-image-preview": "Grandeur do préveyaedje: $1.", + "show-big-image-other": "{{PLURAL:$2|Ôte finté|Ôtès fintés}}: $1.", + "show-big-image-size": "$1 × $2 picsels", "newimages": "Galreye des nouvès imådjes", "imagelisttext": "Chal pa dzo c' est ene djivêye di '''$1''' {{PLURAL:$1|imådje relîte|imådjes relîtes}} $2.", "noimages": "I n' a rén a vey.", @@ -1506,6 +1599,7 @@ "fileduplicatesearch": "Cweraedje après les dobes fitchîs", "fileduplicatesearch-submit": "Cweri", "specialpages": "Pådjes sipeciåles", + "specialpages-note-top": "Ledjinde", "specialpages-group-maintenance": "Etertinance", "specialpages-group-other": "Ôtès pådjes especiåles", "specialpages-group-login": "S' elodjî / si rashire", @@ -1522,6 +1616,7 @@ "intentionallyblankpage": "Cisse pådje ci est vude en esprès.", "tag-filter": "Passete po ls [[Special:Tags|etiketes]]:", "tag-filter-submit": "Passete", + "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikete|Etiketes}}]]: $2)", "tags-edit": "candjî", "tags-hitcount": "$1 candjmint{{PLURAL:$1||s}}", "comparepages": "Comparer des pådjes", @@ -1556,9 +1651,10 @@ "logentry-patrol-patrol": "$1 a marké come patrouyî l' candjmint $4 del pådje $3", "logentry-patrol-patrol-auto": "$1 a marké otomaticmint come patrouyî l' candjmint $4 del pådje $3", "logentry-newusers-newusers": "$1 a-st ahivé on conte d' uzeu", - "logentry-newusers-create": "$1 a-st ahivé on conte d' uzeu", + "logentry-newusers-create": "Li conte d' uzeu $1 a stî ahivé", "logentry-newusers-create2": "$1 a-st ahivé on conte d' uzeu $3", "logentry-newusers-autocreate": "li conte $1 a stî ahivé otomaticmint", + "logentry-upload-upload": "$1 {{GENDER:$2|}}a-st eberweté $3", "rightsnone": "(nouk)", "feedback-adding": "Vosse messaedje a stî håyné sol pådje...", "feedback-cancel": "Rinoncî", diff --git a/languages/i18n/war.json b/languages/i18n/war.json index 61255566ae..6fb8443905 100644 --- a/languages/i18n/war.json +++ b/languages/i18n/war.json @@ -432,7 +432,7 @@ "createaccountreason": "Rason:", "createacct-reason": "Rason", "createacct-reason-ph": "Kay ano nahimo ka hin usa pa nga akawnt", - "createacct-submit": "Ighimo an im akawnt", + "createacct-submit": "Ighimo an im account", "createacct-another-submit": "Paghimo hin account", "createacct-benefit-heading": "{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.", "createacct-benefit-body1": "{{PLURAL:$1|pagliwat|mga pagliwat}}", diff --git a/languages/i18n/xmf.json b/languages/i18n/xmf.json index bc98445479..19b3bec6db 100644 --- a/languages/i18n/xmf.json +++ b/languages/i18n/xmf.json @@ -15,7 +15,8 @@ "아라", "Silovan", "David1010", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "რცხუეფიშ ათოღაზუა:", @@ -1180,7 +1181,7 @@ "recentchangeslinked-page": "ხასილაშ ჯოხო:", "recentchangeslinked-to": "მანგიერო ქაძირე ათე ხასილაშა მერცხილ ხასილეფშა მიშაღალირ თირაფეფ", "recentchanges-page-added-to-category": "[[:$1]] გეძინელჷ რე კატეგორიას", - "recentchanges-page-added-to-category-bundled": "[[:$1]] დო {{PLURAL:$2|ართ ხასჷლა|$2 ხასჷლა}} გეძინელ რე კატეგორიას", + "recentchanges-page-added-to-category-bundled": "[[:$1]] დო [[Special:WhatLinksHere/$1|{{PLURAL:$2|ართ ხასჷლა|$2 ხასჷლა}}]] გეძინელ რე კატეგორიას", "recentchanges-page-removed-from-category": "[[:$1]] ლასირი რე კატეგორიაშე", "recentchanges-page-removed-from-category-bundled": "[[:$1]] დო {{PLURAL:$2|ართ ხასჷლა|$2 ხასჷლა}} ლასირი რე კატეგორიაშე", "upload": "ფაილიშ ეხარგუა", diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json index d5f577682f..8a69603060 100644 --- a/languages/i18n/yi.json +++ b/languages/i18n/yi.json @@ -16,7 +16,8 @@ "Amire80", "පසිඳු කාවින්ද", "Matma Rex", - "Macofe" + "Macofe", + "Nemo bis" ] }, "tog-underline": "שטרייכט אונטער לינקען", @@ -1251,7 +1252,7 @@ "recentchangeslinked-page": "בלאַט נאָמען:", "recentchangeslinked-to": "צייג ענדערונגען צו בלעטער פארבינדן צו דעם בלאט אנשטאט", "recentchanges-page-added-to-category": "[[:$1]] צוגעלייגט צו קאטעגאריע", - "recentchanges-page-added-to-category-bundled": "[[:$1]] און {{PLURAL:$2|איין בלאט|$2 בלעטער}} צוגעלייגט צו קאטעגאריע", + "recentchanges-page-added-to-category-bundled": "[[:$1]] און [[Special:WhatLinksHere/$1|{{PLURAL:$2]]|איין בלאט|$2 בלעטער}} צוגעלייגט צו קאטעגאריע", "recentchanges-page-removed-from-category": "[[:$1]] אראפגענומען פון קאטעגאריע", "recentchanges-page-removed-from-category-bundled": "[[:$1]] און {{PLURAL:$2|איין בלאט|$2 בלעטער}} אראפגענומען פון קאטעגאריע", "autochange-username": "מעדיעוויקי אויטאמאטישער טויש", @@ -3123,5 +3124,9 @@ "special-characters-group-khmer": "כמער", "special-characters-title-endash": "ען טירע", "special-characters-title-emdash": "עם טירע", - "special-characters-title-minus": "מינוס" + "special-characters-title-minus": "מינוס", + "log-action-filter-upload": "טיפ ארויפֿלאד:", + "log-action-filter-all": "אַלע", + "log-action-filter-delete-delete": "אויסמעקן בלאט", + "log-action-filter-protect-unprotect": "אראפנעמען שיץ" } diff --git a/languages/i18n/yue.json b/languages/i18n/yue.json index 6d63e20cb0..8f01a1719d 100644 --- a/languages/i18n/yue.json +++ b/languages/i18n/yue.json @@ -1239,7 +1239,7 @@ "recentchangeslinked-page": "頁名:", "recentchangeslinked-to": "顯示連到所畀到嘅版", "recentchanges-page-added-to-category": "[[:$1]] 加咗落分類", - "recentchanges-page-added-to-category-bundled": "[[:$1]] 同另外 {{PLURAL:$2|1 版|$2 版}}加咗落分類", + "recentchanges-page-added-to-category-bundled": "[[:$1]] 同另外 [[Special:WhatLinksHere/$1|{{PLURAL:$2|1 版|$2 版}}]]加咗落分類", "recentchanges-page-removed-from-category": "[[:$1]] 拎走咗分類", "recentchanges-page-removed-from-category-bundled": "[[:$1]] 同另外 {{PLURAL:$2|1 版|$2 版}}拎走咗分類", "autochange-username": "MediaWiki 自動改動", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index 854580847f..7aa6dc8216 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -231,7 +231,6 @@ "moredotdotdot": "更多...", "morenotlisted": "本列表不完整。", "mypage": "页面", - "anonuserpage": "未知用户", "mytalk": "讨论", "anontalk": "讨论", "navigation": "导航", @@ -1392,9 +1391,9 @@ "recentchangeslinked-page": "页面名称:", "recentchangeslinked-to": "显示链到所给出的页面", "recentchanges-page-added-to-category": "[[:$1]]已添加至分类", - "recentchanges-page-added-to-category-bundled": "[[:$1]]及其他{{PLURAL:$2|$2个页面}}已添加至分类", + "recentchanges-page-added-to-category-bundled": "[[:$1]]及[[Special:WhatLinksHere/$1|其他{{PLURAL:$2|$2个页面}}]]已添加至分类", "recentchanges-page-removed-from-category": "[[:$1]]已从分类中移除", - "recentchanges-page-removed-from-category-bundled": "[[:$1]]及其他{{PLURAL:$2|$2个页面}}已从分类中移除", + "recentchanges-page-removed-from-category-bundled": "[[:$1]]及[[Special:WhatLinksHere/$1|其他{{PLURAL:$2|$2个页面}}]]已从分类中移除", "autochange-username": "MediaWiki自动化更改", "upload": "上传文件", "uploadbtn": "上传文件", @@ -1574,6 +1573,7 @@ "uploadstash-badtoken": "执行对应操作失败。可能是因为您的编辑凭证已过期。请重试。", "uploadstash-errclear": "清除文件失败。", "uploadstash-refresh": "更新文件列表", + "uploadstash-thumbnail": "显示缩略图", "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。", @@ -3679,5 +3679,25 @@ "sessionprovider-generic": "$1会话", "sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话", "sessionprovider-nocookies": "Cookie可能已被禁用。确保您已启用cookie,并重试。", - "randomrootpage": "随机根页面" + "randomrootpage": "随机根页面", + "log-action-filter-block": "封禁类型:", + "log-action-filter-delete": "删除类型:", + "log-action-filter-patrol": "巡查类型:", + "log-action-filter-protect": "保护类型:", + "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-delete-delete": "页面删除", + "log-action-filter-delete-restore": "页面还原", + "log-action-filter-delete-event": "日志删除", + "log-action-filter-delete-revision": "修订版本删除", + "log-action-filter-patrol-patrol": "手动巡查", + "log-action-filter-patrol-autopatrol": "自动巡查", + "log-action-filter-protect-protect": "保护", + "log-action-filter-protect-modify": "保护修改", + "log-action-filter-protect-unprotect": "解除保护", + "log-action-filter-upload-upload": "新上传", + "log-action-filter-upload-overwrite": "重新上传" } diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index 04a82d9de9..79e71afd00 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -69,7 +69,8 @@ "Jasonzhuocn", "Bowleerin", "飞舞回堂前", - "Bbslam" + "Bbslam", + "Zerng07" ] }, "tog-underline": "底線標示連結:", @@ -210,7 +211,6 @@ "moredotdotdot": "更多...", "morenotlisted": "此清單尚未讀取完畢。", "mypage": "頁面", - "anonuserpage": "不明使用者", "mytalk": "對話", "anontalk": "對話", "navigation": "導覽", @@ -342,10 +342,10 @@ "feedlinks": "訂閱:", "feed-invalid": "無效的訂閱 Feed 類型。", "feed-unavailable": "目前未提供 RSS 或 Atom", - "site-rss-feed": "$1 的 RSS 摘要", - "site-atom-feed": "$1 的 Atom 摘要", - "page-rss-feed": "\"$1\" 的 RSS 摘要", - "page-atom-feed": "\"$1\" 的 Atom 摘要", + "site-rss-feed": "$1 的 RSS 來源", + "site-atom-feed": "$1 的 Atom 來源", + "page-rss-feed": "\"$1\" 的 RSS 來源", + "page-atom-feed": "\"$1\" 的 Atom 來源", "red-link-title": "$1 (頁面不存在)", "sort-descending": "降冪排序", "sort-ascending": "昇冪排序", @@ -479,7 +479,7 @@ "createaccount": "建立帳號", "gotaccount": "您已經擁有帳號了嗎? $1。", "gotaccountlink": "登入", - "userlogin-resetlink": "您忘記了登入的詳細資料?", + "userlogin-resetlink": "忘了您登入的詳細資料?", "userlogin-resetpassword-link": "忘記密碼?", "userlogin-helplink2": "登入協助", "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單改登入另一位使用者。", @@ -694,7 +694,7 @@ "nosuchsectiontext": "您嘗試編輯的章節並不存在。\n可能在您檢視頁面時已經移動或刪除。", "loginreqtitle": "需要登入", "loginreqlink": "登入", - "loginreqpagetext": "您必須 $1 方可檢視其他頁面。", + "loginreqpagetext": "請先 $1 方可檢視其他頁面。", "accmailtitle": "密碼已寄出", "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 [[Special:ChangePassword|變更密碼]] 頁面更改。", "newarticle": "(新)", @@ -923,7 +923,9 @@ "mergehistory-fail-invalid-source": "來源頁面無效。", "mergehistory-fail-invalid-dest": "目標頁面無效。", "mergehistory-fail-no-change": "歷史合併尚未合併任何修訂歷史紀錄。請再次檢查頁面以及時間參數。", + "mergehistory-fail-permission": "權限不足,無法合併歷史。", "mergehistory-fail-self-merge": "來源頁面與目標頁面的名稱相同。", + "mergehistory-fail-timestamps-overlap": "來源修訂版本重複,或在目標修訂版本之後才出現。", "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。", "mergehistory-no-source": "來源頁面 $1 不存在。", "mergehistory-no-destination": "目標頁面 $1 不存在。", @@ -1317,7 +1319,7 @@ "recentchanges-label-bot": "該編輯由機器人執行", "recentchanges-label-unpatrolled": "該編輯尚未巡查", "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)", - "recentchanges-legend-heading": "說明:", + "recentchanges-legend-heading": "圖例:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])", "recentchanges-legend-plusminus": "(±123)", "recentchanges-submit": "顯示", @@ -1344,7 +1346,7 @@ "rcshowhidecategorization": "$1 頁面分類", "rcshowhidecategorization-show": "顯示", "rcshowhidecategorization-hide": "隱藏", - "rclinks": "顯示最近 $2 天內的 $1 次更改。
$3", + "rclinks": "顯示最近 $2 天內的 $1 次變更。
$3", "diff": "差異", "hist": "歷史", "hide": "隱藏", @@ -1368,9 +1370,9 @@ "recentchangeslinked-page": "頁面名稱:", "recentchangeslinked-to": "改顯示連結至指定頁面的變更", "recentchanges-page-added-to-category": "[[:$1]] 已加入至分類", - "recentchanges-page-added-to-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已加入至分類", + "recentchanges-page-added-to-category-bundled": "[[:$1]] 與[[Special:WhatLinksHere/$1|其他 {{PLURAL:$2|1 頁|$2 頁}}]]已加入至分類", "recentchanges-page-removed-from-category": "[[:$1]] 已自分類移除", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已自分類移除", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] 與[[Special:WhatLinksHere/$1|其他 {{PLURAL:$2|1 頁|$2 頁}}]]已自分類移除", "autochange-username": "MediaWiki 自動變更", "upload": "上傳檔案", "uploadbtn": "上傳檔案", @@ -1549,6 +1551,7 @@ "uploadstash-badtoken": "執行動作失敗。您的編輯資訊可能已經過期,請重新再試。", "uploadstash-errclear": "清除檔案失敗。", "uploadstash-refresh": "更新檔案清單", + "uploadstash-thumbnail": "檢視縮圖", "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。", @@ -1797,8 +1800,9 @@ "apihelp": "API 說明", "apihelp-no-such-module": "查無模組 \"$1\"。", "apisandbox": "API 沙盒", + "apisandbox-jsonly": "需要 JavaScript 才能使用 API 沙箱。", "apisandbox-api-disabled": "此網站已關閉 API。", - "apisandbox-intro": "使用此頁面可測試 '''MediaWiki Web Service API'''。\n請參考 [//www.mediawiki.org/wiki/API:Main_page API 說明文件] 以取得詳細資訊。例:[//www.mediawiki.org/wiki/API#A_simple_example 取得主頁的內容]。 請選擇動作以取得更多範例。\n\n請注意,雖然此為沙盒,您在此頁所執行的動作仍有可能會修改到 Wiki。", + "apisandbox-intro": "使用此頁面可測試 MediaWiki web service API。\n請參考 [[mw:API:Main page|API 說明文件]] 以取得詳細資訊。例:[//www.mediawiki.org/wiki/API#A_simple_example 取得主頁的內容]。 請選擇動作以取得更多範例。\n\n請注意,雖然此為沙盒,您在此頁所執行的動作仍有可能會修改到 Wiki。", "apisandbox-fullscreen": "展開面板", "apisandbox-fullscreen-tooltip": "展開沙盒面板來填滿瀏覽器視窗。", "apisandbox-unfullscreen": "顯示頁面", @@ -1822,9 +1826,13 @@ "apisandbox-results": "結果", "apisandbox-sending-request": "傳送 API 請求中...", "apisandbox-loading-results": "接收 API 結果中...", + "apisandbox-results-error": "讀取 API 查詢回應時發生錯誤:$1。", "apisandbox-request-url-label": "請求 URL:", "apisandbox-request-time": "請求時間:{{PLURAL:$1|$1 ms}}", "apisandbox-results-fixtoken": "更正密鑰並重新送出", + "apisandbox-results-fixtoken-fail": "取得 \"$1\" 密鑰失敗。", + "apisandbox-alert-page": "此頁面上的欄位無效。", + "apisandbox-alert-field": "此欄位的值無效。", "booksources": "圖書資源", "booksources-search-legend": "尋找圖書資源", "booksources-isbn": "國際標準書號:", @@ -2059,6 +2067,7 @@ "changecontentmodel-nodirectediting": "$1 的內容模型不支援直接編輯", "log-name-contentmodel": "內容模型變更日誌", "log-description-contentmodel": "與頁面內容模型相關的事件", + "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3", "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"", "logentry-contentmodel-change-revertlink": "還原", "logentry-contentmodel-change-revert": "還原", @@ -2296,6 +2305,7 @@ "block-log-flags-hiddenname": "隱藏使用者名稱", "range_block_disabled": "管理員可建立範圍封鎖的權限已被關閉。", "ipb_expiry_invalid": "無效的期限。", + "ipb_expiry_old": "到期時間已過。", "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。", "ipb_hide_invalid": "無法禁止顯示此帳號;它擁有超過 $1 次的編輯。", "ipb_already_blocked": "已經封鎖 \"$1\"。", @@ -2435,7 +2445,7 @@ "import": "匯入頁面", "importinterwiki": "從其他 wiki 匯入", "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。", - "import-interwiki-sourcewiki": "來源 Wiki:", + "import-interwiki-sourcewiki": "來源 wiki:", "import-interwiki-sourcepage": "來源頁面:", "import-interwiki-history": "複製此頁面的所有歷史修訂", "import-interwiki-templates": "包含所有模板", @@ -2465,7 +2475,7 @@ "import-nonewrevisions": "未匯入任何修訂 (修訂已存在,或因錯誤跳過)。", "xml-error-string": "$1 於行 $2,欄 $3 ($4 位元組):$5", "import-upload": "上傳 XML 資料", - "import-token-mismatch": "連線階段資料遺失。\n請再試一次。", + "import-token-mismatch": "連線階段資料遺失。\n\n您可能已被登出。請確認您是否仍在登入狀態並再試一次。\n若仍無法運作,請嘗試[[Special:UserLogout|登出]]再登入一次,並檢查您的瀏覽器是否允許本站使用 cookie。", "import-invalid-interwiki": "不能從指定的 Wiki 匯入。", "import-error-edit": "您沒有權限編輯頁面 \"$1\",無法匯入。", "import-error-create": "您沒有權限建立頁面 \"$1\",無法匯入。", @@ -2519,13 +2529,13 @@ "tooltip-n-mainpage-description": "前往首頁", "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到您需要的事物", "tooltip-n-currentevents": "於新聞事件中找到相關背景資料", - "tooltip-n-recentchanges": "列出此Wiki中的最近更改清單", + "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單", "tooltip-n-randompage": "隨機進入一個頁面", "tooltip-n-help": "尋求協助的地方", "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面", "tooltip-t-recentchangeslinked": "此頁面連結至其他頁面的最近變更", - "tooltip-feed-rss": "此頁面的 RSS 摘要", - "tooltip-feed-atom": "此頁面的 Atom 摘要", + "tooltip-feed-rss": "此頁面的 RSS 來源", + "tooltip-feed-atom": "此頁面的 Atom 來源", "tooltip-t-contributions": "{{GENDER:$1|此使用者}}的貢獻清單", "tooltip-t-emailuser": "傳送電子郵件聯絡{{GENDER:$1|這位使用者}}", "tooltip-t-info": "更多關於此頁面的資訊", @@ -3173,10 +3183,10 @@ "version-antispam": "垃圾訊息防止", "version-other": "其他", "version-mediahandlers": "媒體處理器", - "version-hooks": "鉤", + "version-hooks": "掛鉤", "version-parser-extensiontags": "解析器擴充標籤", - "version-parser-function-hooks": "剖析器函數鉤", - "version-hook-name": "鉤名", + "version-parser-function-hooks": "語法分析函數掛鉤", + "version-hook-name": "掛鉤名稱", "version-hook-subscribedby": "署名", "version-version": "($1)", "version-no-ext-name": "[未命名]", @@ -3275,6 +3285,7 @@ "tags-deactivate": "停用", "tags-hitcount": "$1 次變更", "tags-manage-no-permission": "您沒有權限管理變更標籤。", + "tags-manage-blocked": "您無法在被封鎖的情況下管理變更標籤。", "tags-create-heading": "建立新標籤", "tags-create-explanation": "在預設情況下,新建立的標籤可被使用者及機器人使用。", "tags-create-tag-name": "標籤名稱:", @@ -3309,9 +3320,11 @@ "tags-deactivate-not-allowed": "無法停用標籤 \"$1\"。", "tags-deactivate-submit": "停用", "tags-apply-no-permission": "您沒有權限連同您的變更一起套用標籤。", + "tags-apply-blocked": "您無法在被封鎖的情況下套用變更標籤為您的變更。", "tags-apply-not-allowed-one": "不允許手動套用標籤 \"$1\"。", "tags-apply-not-allowed-multi": "不允許手動套用以下{{PLURAL:$2|標籤|標籤}}:$1", "tags-update-no-permission": "您沒有權限加入與移除任何於各別修訂與日誌項目的標籤", + "tags-update-blocked": "您無法在被封鎖的情況下移除變更標籤。", "tags-update-add-not-allowed-one": "不允許手動加入標籤 \"$1\"。", "tags-update-add-not-allowed-multi": "不允許手動加入以下{{PLURAL:$2|標籤|標籤}}:$1", "tags-update-remove-not-allowed-one": "不允許手動移除標籤 \"$1\"。", @@ -3554,6 +3567,7 @@ "expand_templates_preview": "預覽", "expand_templates_preview_fail_html": "因連線階段的資料遺失且 {{SITENAME}} 已開啟顯示原始 HTML 功能,為預防 JavaScript 攻擊已隱藏預覽內容。\n\n若您目前的預覽動作並無非法,請再試一次。\n若仍然無效,請嘗試[[Special:UserLogout|登出]]並再登入一次。", "expand_templates_preview_fail_html_anon": "因您尚未登入且 {{SITENAME}} 已開啟顯示原始 HTML 功能,為預防 JavaScript 攻擊已隱藏預覽內容。\n\n若您目前的預覽動作並無非法,請[[Special:UserLogin|登入]]後再試一次。", + "expand_templates_input_missing": "您至少需要提供一些輸入文字。", "pagelanguage": "變更頁面語言", "pagelang-name": "頁面", "pagelang-language": "語言", @@ -3626,8 +3640,29 @@ "mw-widgets-titleinput-description-new-page": "頁面不存在", "mw-widgets-titleinput-description-redirect": "重新導向至 $1", "api-error-blacklisted": "請選擇另一個更具描述性的標題。", + "sessionmanager-tie": "無法合併多個請求認証類型:$1。", "sessionprovider-generic": "$1 連線階段", "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段", "sessionprovider-nocookies": "Cookie 功能可能已被關閉,請確認您改開啟 Cookie 功能並重新啟動。", - "randomrootpage": "隨機根頁面" + "randomrootpage": "隨機根頁面", + "log-action-filter-block": "封鎖類型:", + "log-action-filter-delete": "刪除類型:", + "log-action-filter-patrol": "巡查類型:", + "log-action-filter-protect": "保護類型:", + "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-delete-delete": "頁面刪除", + "log-action-filter-delete-restore": "頁面取消刪除", + "log-action-filter-delete-event": "日誌刪除", + "log-action-filter-delete-revision": "修訂刪除", + "log-action-filter-patrol-patrol": "手動巡查", + "log-action-filter-patrol-autopatrol": "自動巡查", + "log-action-filter-protect-protect": "保護", + "log-action-filter-protect-modify": "保護修改", + "log-action-filter-protect-unprotect": "解除保護", + "log-action-filter-upload-upload": "新上傳", + "log-action-filter-upload-overwrite": "重新上傳" } diff --git a/maintenance/archives/patch-add-cl_collation_ext_index.sql b/maintenance/archives/patch-add-cl_collation_ext_index.sql new file mode 100644 index 0000000000..8137dc6413 --- /dev/null +++ b/maintenance/archives/patch-add-cl_collation_ext_index.sql @@ -0,0 +1,2 @@ +-- @since 1.27 +CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from); diff --git a/maintenance/archives/patch-categorylinks-better-collation.sql b/maintenance/archives/patch-categorylinks-better-collation.sql index c1499c151c..f5ff1f1d1a 100644 --- a/maintenance/archives/patch-categorylinks-better-collation.sql +++ b/maintenance/archives/patch-categorylinks-better-collation.sql @@ -13,7 +13,7 @@ ALTER TABLE /*$wgDBprefix*/categorylinks ADD COLUMN cl_sortkey_prefix varchar(255) binary NOT NULL default '', ADD COLUMN cl_collation varbinary(32) NOT NULL default '', ADD COLUMN cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page', - ADD INDEX (cl_collation), +-- rm'd in 1.27 ADD INDEX (cl_collation), DROP INDEX cl_sortkey, ADD INDEX cl_sortkey (cl_to, cl_type, cl_sortkey, cl_from); INSERT IGNORE INTO /*$wgDBprefix*/updatelog (ul_key) VALUES ('cl_fields_update'); diff --git a/maintenance/archives/patch-kill-cl_collation_index.sql b/maintenance/archives/patch-kill-cl_collation_index.sql new file mode 100644 index 0000000000..7f75a62329 --- /dev/null +++ b/maintenance/archives/patch-kill-cl_collation_index.sql @@ -0,0 +1,7 @@ +-- +-- Kill cl_collation index. +-- @since 1.27 +-- + +DROP INDEX /*i*/cl_collation ON /*_*/categorylinks; + diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic index 6d5472e74f..914336f844 100644 --- a/maintenance/dictionary/mediawiki.dic +++ b/maintenance/dictionary/mediawiki.dic @@ -538,7 +538,6 @@ asctime asdf aspx assert -astriks asymp async at diff --git a/maintenance/language/digit2html.php b/maintenance/language/digit2html.php index eddfa261ae..46616db56b 100644 --- a/maintenance/language/digit2html.php +++ b/maintenance/language/digit2html.php @@ -32,12 +32,12 @@ class Digit2Html extends Maintenance { # A list of unicode numerals is available at: # http://www.fileformat.info/info/unicode/category/Nd/list.htm - private $mLangs = array( + private $mLangs = [ 'Ar', 'As', 'Bh', 'Bo', 'Dz', 'Fa', 'Gu', 'Hi', 'Km', 'Kn', 'Ks', 'Lo', 'Ml', 'Mr', 'Ne', 'New', 'Or', 'Pa', 'Pi', 'Sa' - ); + ]; public function __construct() { parent::__construct(); diff --git a/maintenance/language/zhtable/Makefile.py b/maintenance/language/zhtable/Makefile.py index 15a1cb9d0f..abe08e4bf3 100755 --- a/maintenance/language/zhtable/Makefile.py +++ b/maintenance/language/zhtable/Makefile.py @@ -248,7 +248,8 @@ def translate(text, conv_table): def manualWordsTable(path, conv_table, reconv_table): fp = open(path, 'r', encoding='U8') - reconv_table = {} + reconv_table = reconv_table.copy() + out_table = {} wordlist = [line.split('#')[0].strip() for line in fp] wordlist = list(set(wordlist)) wordlist.sort(key=lambda w: (len(w), w), reverse=True) @@ -257,9 +258,9 @@ def manualWordsTable(path, conv_table, reconv_table): new_word = translate(word, conv_table) rcv_word = translate(word, reconv_table) if word != rcv_word: - reconv_table[word] = word - reconv_table[new_word] = word - return reconv_table + reconv_table[word] = out_table[word] = word + reconv_table[new_word] = out_table[new_word] = word + return out_table def defaultWordsTable(src_wordlist, src_tomany, char_conv_table, diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php index 6d2a553f7e..55f361c941 100644 --- a/maintenance/namespaceDupes.php +++ b/maintenance/namespaceDupes.php @@ -583,7 +583,7 @@ class NamespaceConflictChecker extends Maintenance { $wikiPage = new WikiPage( $sourceTitle ); $wikiPage->loadPageData( 'fromdbmaster' ); - $destId = $newTitle->getArticleId(); + $destId = $newTitle->getArticleID(); $this->beginTransaction( $this->db, __METHOD__ ); $this->db->update( 'revision', // SET diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php index 88767de2d1..bdbb347899 100644 --- a/maintenance/refreshImageMetadata.php +++ b/maintenance/refreshImageMetadata.php @@ -68,9 +68,16 @@ class RefreshImageMetadata extends Maintenance { $this->addOption( 'start', 'Name of file to start with', false, true ); $this->addOption( 'end', 'Name of file to end with', false, true ); + $this->addOption( + 'mediatype', + 'Only refresh files with this media type, e.g. BITMAP, UNKNOWN etc.', + false, + true + ); $this->addOption( 'mime', - '(Inefficient!) Only refresh files with this MIME type. Can accept wild-card image/*', + "Only refresh files with this MIME type. Can accept wild-card 'image/*'. " + . "Potentially inefficient unless 'mediatype' is also specified", false, true ); @@ -197,6 +204,7 @@ class RefreshImageMetadata extends Maintenance { $end = $this->getOption( 'end', false ); $mime = $this->getOption( 'mime', false ); + $mediatype = $this->getOption( 'mediatype', false ); $like = $this->getOption( 'metadata-contains', false ); if ( $end !== false ) { @@ -209,6 +217,9 @@ class RefreshImageMetadata extends Maintenance { $conds['img_minor_mime'] = $minor; } } + if ( $mediatype !== false ) { + $conds['img_media_type'] = $mediatype; + } if ( $like ) { $conds[] = 'img_metadata ' . $dbw->buildLike( $dbw->anyString(), $like, $dbw->anyString() ); } diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php index 2d4e82abd6..454c506365 100644 --- a/maintenance/sqlite.php +++ b/maintenance/sqlite.php @@ -128,7 +128,7 @@ class SqliteMaintenance extends Maintenance { } private function checkSyntax() { - if ( !Sqlite::IsPresent() ) { + if ( !Sqlite::isPresent() ) { $this->error( "Error: SQLite support not found\n" ); } $files = [ $this->getOption( 'check-syntax' ) ]; diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php index 8ea5d58fc5..0ea52cab0f 100644 --- a/maintenance/storage/fixBug20757.php +++ b/maintenance/storage/fixBug20757.php @@ -319,7 +319,7 @@ class FixBug20757 extends Maintenance { if ( $path == "" ) { return false; } - $text = ExternalStore::fetchFromUrl( $url ); + $text = ExternalStore::fetchFromURL( $url ); } if ( !in_array( 'object', $flags ) ) { return false; diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 7942687579..89aeb9c91d 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -619,8 +619,8 @@ CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_ -- Used by the API (and some extensions) CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp); --- FIXME: Not used, delete this -CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation); +-- Used when updating collation (e.g. updateCollation.php) +CREATE INDEX /*i*/cl_collation_ext ON /*_*/categorylinks (cl_collation, cl_to, cl_type, cl_from); -- -- Track all existing categories. Something is a category if 1) it has an en- diff --git a/maintenance/update.php b/maintenance/update.php index ed8dfa9dfc..43b10c858b 100755 --- a/maintenance/update.php +++ b/maintenance/update.php @@ -127,7 +127,7 @@ class UpdateMediaWiki extends Maintenance { $this->compatChecks(); } else { $this->output( "Skipping compatibility checks, proceed at your own risk (Ctrl+C to abort)\n" ); - wfCountdown( 5 ); + wfCountDown( 5 ); } // Check external dependencies are up to date @@ -168,7 +168,7 @@ class UpdateMediaWiki extends Maintenance { $updates[] = 'stats'; } - $updater = DatabaseUpdater::newForDb( $db, $shared, $this ); + $updater = DatabaseUpdater::newForDB( $db, $shared, $this ); $updater->doUpdates( $updates ); foreach ( $updater->getPostDatabaseUpdateMaintenance() as $maint ) { diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index af666b06cf..186feb222f 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -33,7 +33,7 @@ require_once __DIR__ . '/Maintenance.php'; * @ingroup Maintenance */ class UpdateCollation extends Maintenance { - const BATCH_SIZE = 10000; // Number of rows to process in one batch + const BATCH_SIZE = 100; // Number of rows to process in one batch const SYNC_INTERVAL = 20; // Wait for slaves after this many batches public $sizeHistogram = []; @@ -85,10 +85,18 @@ TEXT // but this will raise an exception, breaking all category pages $collation->getFirstLetter( 'MediaWiki' ); + // Locally at least, (my local is a rather old version of mysql) + // mysql seems to filesort if there is both an equality + // (but not for an inequality) condition on cl_collation in the + // WHERE and it is also the first item in the ORDER BY. + if ( $this->hasOption( 'previous-collation' ) ) { + $orderBy = 'cl_to, cl_type, cl_from'; + } else { + $orderBy = 'cl_collation, cl_to, cl_type, cl_from'; + } $options = [ 'LIMIT' => self::BATCH_SIZE, - 'ORDER BY' => 'cl_from, cl_to', - 'STRAIGHT_JOIN', + 'ORDER BY' => $orderBy, ]; if ( $force || $dryRun ) { @@ -124,16 +132,24 @@ TEXT } $this->output( "Fixing collation for $count rows.\n" ); } - $count = 0; $batchCount = 0; $batchConds = []; do { $this->output( "Selecting next " . self::BATCH_SIZE . " rows..." ); + + // cl_type must be selected as a number for proper paging because + // enums suck. + if ( $dbw->getType() === 'mysql' ) { + $clType = 'cl_type+0 AS "cl_type_numeric"'; + } else { + $clType = 'cl_type'; + } $res = $dbw->select( [ 'categorylinks', 'page' ], [ 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation', - 'cl_sortkey', 'page_namespace', 'page_title' + 'cl_sortkey', $clType, + 'page_namespace', 'page_title' ], array_merge( $collationConds, $batchConds, [ 'cl_from = page_id' ] ), __METHOD__, @@ -217,18 +233,28 @@ TEXT /** * Return an SQL expression selecting rows which sort above the given row, - * assuming an ordering of cl_from, cl_to + * assuming an ordering of cl_collation, cl_to, cl_type, cl_from * @param stdClass $row * @param DatabaseBase $dbw * @return string */ function getBatchCondition( $row, $dbw ) { - $fields = [ 'cl_from', 'cl_to' ]; + if ( $this->hasOption( 'previous-collation' ) ) { + $fields = [ 'cl_to', 'cl_type', 'cl_from' ]; + } else { + $fields = [ 'cl_collation', 'cl_to', 'cl_type', 'cl_from' ]; + } $first = true; $cond = false; $prefix = false; foreach ( $fields as $field ) { - $encValue = $dbw->addQuotes( $row->$field ); + if ( $dbw->getType() === 'mysql' && $field === 'cl_type' ) { + // Range conditions with enums are weird in mysql + // This must be a numeric literal, or it won't work. + $encValue = intval( $row->cl_type_numeric ); + } else { + $encValue = $dbw->addQuotes( $row->$field ); + } $inequality = "$field > $encValue"; $equality = "$field = $encValue"; if ( $first ) { diff --git a/package.json b/package.json index 21a050bb3f..8bfb94d549 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,14 @@ "devDependencies": { "grunt": "0.4.5", "grunt-cli": "0.1.13", - "grunt-banana-checker": "0.4.0", - "grunt-contrib-copy": "0.8.2", + "grunt-banana-checker": "0.5.0", + "grunt-contrib-copy": "1.0.0", "grunt-contrib-jshint": "1.0.0", - "grunt-contrib-watch": "0.6.1", + "grunt-contrib-watch": "1.0.0", "grunt-jscs": "2.8.0", "grunt-jsonlint": "1.0.7", - "grunt-karma": "0.12.1", - "karma": "0.13.19", + "grunt-karma": "0.12.2", + "karma": "0.13.22", "karma-chrome-launcher": "0.2.2", "karma-firefox-launcher": "0.1.7", "karma-qunit": "0.1.9", diff --git a/resources/Resources.php b/resources/Resources.php index 07cd7b5328..0f3d70b480 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -482,8 +482,8 @@ return [ 'sk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js', 'sl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js', 'sq' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js', - 'sr-sr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js', - 'sr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js', + 'sr-ec' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js', + 'sr-el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js', 'sv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js', 'ta' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js', 'th' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js', @@ -797,8 +797,8 @@ return [ 'sk' => 'resources/lib/moment/locale/sk.js', 'sl' => 'resources/lib/moment/locale/sl.js', 'sq' => 'resources/lib/moment/locale/sq.js', - 'sr' => 'resources/lib/moment/locale/sr.js', 'sr-ec' => 'resources/lib/moment/locale/sr-cyrl.js', + 'sr-el' => 'resources/lib/moment/locale/sr.js', 'sv' => 'resources/lib/moment/locale/sv.js', 'ta' => 'resources/lib/moment/locale/ta.js', 'th' => 'resources/lib/moment/locale/th.js', @@ -811,6 +811,8 @@ return [ 'vi' => 'resources/lib/moment/locale/vi.js', 'zh-cn' => 'resources/lib/moment/locale/zh-cn.js', 'zh-tw' => 'resources/lib/moment/locale/zh-tw.js', + 'zh-hans' => 'resources/lib/moment/locale/zh-cn.js', + 'zh-hant' => 'resources/lib/moment/locale/zh-tw.js', ], 'targets' => [ 'desktop', 'mobile' ], ], diff --git a/resources/lib/oojs-ui/i18n/ba.json b/resources/lib/oojs-ui/i18n/ba.json index ff915b06e5..d8c99aafdf 100644 --- a/resources/lib/oojs-ui/i18n/ba.json +++ b/resources/lib/oojs-ui/i18n/ba.json @@ -6,9 +6,24 @@ "Assele", "Haqmar", "Sagan", - "Рустам Нурыев" + "Рустам Нурыев", + "Азат Хәлилов" ] }, - "ooui-outline-control-move-down": "Аҫҡа күсерергә", - "ooui-outline-control-move-up": "Өҫкә күсерергә" + "ooui-outline-control-move-down": "Элементты аҫҡа күсерергә", + "ooui-outline-control-move-up": "Элементты өҫкә күсерергә", + "ooui-outline-control-remove": "Биттәрҙе юйырға", + "ooui-toolbar-more": "Тағы", + "ooui-toolgroup-expand": "Күберәк", + "ooui-toolgroup-collapse": "Аҙыраҡ", + "ooui-dialog-message-accept": "Тамам", + "ooui-dialog-message-reject": "Кире алырға", + "ooui-dialog-process-error": "Нимәлер килеп сыҡманы.", + "ooui-dialog-process-dismiss": "Йәшерергә", + "ooui-dialog-process-retry": "Ҡабатлап ҡарарға.", + "ooui-dialog-process-continue": "Дауам итергә", + "ooui-selectfile-button-select": "Файлды һайлағыҙ", + "ooui-selectfile-not-supported": "Файл һайлау хупланмай.", + "ooui-selectfile-placeholder": "Файл һайланмаған", + "ooui-selectfile-dragdrop-placeholder": "Файлды бында күсерегеҙ" } diff --git a/resources/lib/oojs-ui/i18n/hi.json b/resources/lib/oojs-ui/i18n/hi.json index 573096f34c..ce007fc1d1 100644 --- a/resources/lib/oojs-ui/i18n/hi.json +++ b/resources/lib/oojs-ui/i18n/hi.json @@ -7,7 +7,8 @@ "Siddhartha Ghai", "Goelujjwal", "Ankita-ks", - "Param Mudgal" + "Param Mudgal", + "Sfic" ] }, "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ", @@ -22,6 +23,8 @@ "ooui-dialog-process-dismiss": "ख़ारिज करें", "ooui-dialog-process-retry": "पुनः प्रयास करें", "ooui-dialog-process-continue": "जारी रखें", + "ooui-selectfile-button-select": "फ़ाइल चुनें", "ooui-selectfile-not-supported": "फ़ाइल का चयन समर्थित नहीं है", - "ooui-selectfile-placeholder": "कोई फाइल चुनी नही गई हेै" + "ooui-selectfile-placeholder": "कोई फाइल चुनी नही गई हेै", + "ooui-selectfile-dragdrop-placeholder": "फ़ाइल यहाँ डालें" } diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js index f4ccc33d3f..211101edcd 100644 --- a/resources/lib/oojs-ui/oojs-ui-apex.js +++ b/resources/lib/oojs-ui/oojs-ui-apex.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { diff --git a/resources/lib/oojs-ui/oojs-ui-core-apex.css b/resources/lib/oojs-ui/oojs-ui-core-apex.css index 3b5acae1f6..865dda4651 100644 --- a/resources/lib/oojs-ui/oojs-ui-core-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-core-apex.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-element-hidden { display: none !important; diff --git a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css index 1c2abc8b86..9dd296c988 100644 --- a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css +++ b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-element-hidden { display: none !important; diff --git a/resources/lib/oojs-ui/oojs-ui-core.js b/resources/lib/oojs-ui/oojs-ui-core.js index 1b90db575c..add3f0a806 100644 --- a/resources/lib/oojs-ui/oojs-ui-core.js +++ b/resources/lib/oojs-ui/oojs-ui-core.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { @@ -2788,9 +2788,7 @@ OO.ui.mixin.LabelElement.prototype.setLabelElement = function ( $label ) { */ OO.ui.mixin.LabelElement.prototype.setLabel = function ( label ) { label = typeof label === 'function' ? OO.ui.resolveMsg( label ) : label; - label = ( ( typeof label === 'string' && label.length ) || label instanceof jQuery || label instanceof OO.ui.HtmlSnippet ) ? label : null; - - this.$element.toggleClass( 'oo-ui-labelElement', !!label ); + label = ( ( typeof label === 'string' || label instanceof jQuery ) && label.length ) || ( label instanceof OO.ui.HtmlSnippet && label.toString().length ) ? label : null; if ( this.label !== label ) { if ( this.$label ) { @@ -2800,6 +2798,8 @@ OO.ui.mixin.LabelElement.prototype.setLabel = function ( label ) { this.emit( 'labelChange' ); } + this.$element.toggleClass( 'oo-ui-labelElement', !!this.label ); + return this; }; diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.js b/resources/lib/oojs-ui/oojs-ui-mediawiki.js index 0dac2aaf6c..9715e66729 100644 --- a/resources/lib/oojs-ui/oojs-ui-mediawiki.js +++ b/resources/lib/oojs-ui/oojs-ui-mediawiki.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css b/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css index 5ff9407d3c..8e10ed5304 100644 --- a/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-popupTool .oo-ui-popupWidget-popup, .oo-ui-popupTool .oo-ui-popupWidget-anchor { diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css index 6b964fbd87..d89852dfad 100644 --- a/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css +++ b/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-popupTool .oo-ui-popupWidget-popup, .oo-ui-popupTool .oo-ui-popupWidget-anchor { diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars.js b/resources/lib/oojs-ui/oojs-ui-toolbars.js index ae4e38d1c0..3f88fa78ba 100644 --- a/resources/lib/oojs-ui/oojs-ui-toolbars.js +++ b/resources/lib/oojs-ui/oojs-ui-toolbars.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { diff --git a/resources/lib/oojs-ui/oojs-ui-widgets-apex.css b/resources/lib/oojs-ui/oojs-ui-widgets-apex.css index 725e1ba0b2..0ffeba3aaa 100644 --- a/resources/lib/oojs-ui/oojs-ui-widgets-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-widgets-apex.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-draggableElement-handle, .oo-ui-draggableElement-handle.oo-ui-widget { @@ -971,6 +971,6 @@ border-bottom-left-radius: 0; border-left-width: 0; } -.oo-ui-numberInputWidget .oo-ui-textInputWidget input { +.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input { border-radius: 0; } diff --git a/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css index 1f7b9bd940..9b981245c5 100644 --- a/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css +++ b/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-draggableElement-handle, .oo-ui-draggableElement-handle.oo-ui-widget { @@ -986,6 +986,6 @@ border-bottom-left-radius: 0; border-left-width: 0; } -.oo-ui-numberInputWidget .oo-ui-textInputWidget input { +.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input { border-radius: 0; } diff --git a/resources/lib/oojs-ui/oojs-ui-widgets.js b/resources/lib/oojs-ui/oojs-ui-widgets.js index c7a455574b..abb2b1b663 100644 --- a/resources/lib/oojs-ui/oojs-ui-widgets.js +++ b/resources/lib/oojs-ui/oojs-ui-widgets.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { @@ -5048,6 +5048,7 @@ OO.ui.SearchWidget.prototype.getResults = function () { * @cfg {number} [max=Infinity] Maximum allowed value * @cfg {number} [step=1] Delta when using the buttons or up/down arrow keys * @cfg {number|null} [pageStep] Delta when using the page-up/page-down keys. Defaults to 10 times #step. + * @cfg {boolean} [showButtons=true] Whether to show the plus and minus buttons. */ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) { // Configuration initialization @@ -5056,7 +5057,8 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) { min: -Infinity, max: Infinity, step: 1, - pageStep: null + pageStep: null, + showButtons: true }, config ); // Parent constructor @@ -5069,28 +5071,30 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) { }, config.input ) ); - this.minusButton = new OO.ui.ButtonWidget( $.extend( - { - disabled: this.isDisabled(), - tabIndex: -1 - }, - config.minusButton, - { - classes: [ 'oo-ui-numberInputWidget-minusButton' ], - label: '−' - } - ) ); - this.plusButton = new OO.ui.ButtonWidget( $.extend( - { - disabled: this.isDisabled(), - tabIndex: -1 - }, - config.plusButton, - { - classes: [ 'oo-ui-numberInputWidget-plusButton' ], - label: '+' - } - ) ); + if ( config.showButtons ) { + this.minusButton = new OO.ui.ButtonWidget( $.extend( + { + disabled: this.isDisabled(), + tabIndex: -1 + }, + config.minusButton, + { + classes: [ 'oo-ui-numberInputWidget-minusButton' ], + label: '−' + } + ) ); + this.plusButton = new OO.ui.ButtonWidget( $.extend( + { + disabled: this.isDisabled(), + tabIndex: -1 + }, + config.plusButton, + { + classes: [ 'oo-ui-numberInputWidget-plusButton' ], + label: '+' + } + ) ); + } // Events this.input.connect( this, { @@ -5101,12 +5105,14 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) { keydown: this.onKeyDown.bind( this ), 'wheel mousewheel DOMMouseScroll': this.onWheel.bind( this ) } ); - this.plusButton.connect( this, { - click: [ 'onButtonClick', +1 ] - } ); - this.minusButton.connect( this, { - click: [ 'onButtonClick', -1 ] - } ); + if ( config.showButtons ) { + this.plusButton.connect( this, { + click: [ 'onButtonClick', +1 ] + } ); + this.minusButton.connect( this, { + click: [ 'onButtonClick', -1 ] + } ); + } // Initialization this.setIsInteger( !!config.isInteger ); @@ -5114,12 +5120,14 @@ OO.ui.NumberInputWidget = function OoUiNumberInputWidget( config ) { this.setStep( config.step, config.pageStep ); this.$field = $( '
' ).addClass( 'oo-ui-numberInputWidget-field' ) - .append( - this.minusButton.$element, - this.input.$element, - this.plusButton.$element - ); + .append( this.input.$element ); this.$element.addClass( 'oo-ui-numberInputWidget' ).append( this.$field ); + if ( config.showButtons ) { + this.$field + .prepend( this.minusButton.$element ) + .append( this.plusButton.$element ); + this.$element.addClass( 'oo-ui-numberInputWidget-buttoned' ); + } this.input.setValidation( this.validateNumber.bind( this ) ); }; diff --git a/resources/lib/oojs-ui/oojs-ui-windows-apex.css b/resources/lib/oojs-ui/oojs-ui-windows-apex.css index dbb9455e1d..0f9c14559f 100644 --- a/resources/lib/oojs-ui/oojs-ui-windows-apex.css +++ b/resources/lib/oojs-ui/oojs-ui-windows-apex.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-actionWidget.oo-ui-pendingElement-pending { background-image: /* @embed */ url(themes/apex/images/textures/pending.gif); diff --git a/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css index de632682d6..4f93f53b99 100644 --- a/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css +++ b/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:26Z + * Date: 2016-03-22T22:48:25Z */ .oo-ui-window { background: transparent; diff --git a/resources/lib/oojs-ui/oojs-ui-windows.js b/resources/lib/oojs-ui/oojs-ui-windows.js index 56108da631..2a5aa64d10 100644 --- a/resources/lib/oojs-ui/oojs-ui-windows.js +++ b/resources/lib/oojs-ui/oojs-ui-windows.js @@ -1,12 +1,12 @@ /*! - * OOjs UI v0.16.3 + * OOjs UI v0.16.4 * https://www.mediawiki.org/wiki/OOjs_UI * * Copyright 2011–2016 OOjs UI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2016-03-16T19:20:22Z + * Date: 2016-03-22T22:48:21Z */ ( function ( OO ) { diff --git a/resources/src/jquery/jquery.suggestions.js b/resources/src/jquery/jquery.suggestions.js index 1f977bf910..38e5a1f6b4 100644 --- a/resources/src/jquery/jquery.suggestions.js +++ b/resources/src/jquery/jquery.suggestions.js @@ -14,7 +14,7 @@ * * $( '#textbox' ).suggestions(); * - * Uses jQuery.suggestions singleteon internally. + * Uses jQuery.suggestions singleton internally. * * @class jQuery.plugin.suggestions */ diff --git a/resources/src/mediawiki.language/specialcharacters.json b/resources/src/mediawiki.language/specialcharacters.json index d4446ab87a..0dffd7dd05 100644 --- a/resources/src/mediawiki.language/specialcharacters.json +++ b/resources/src/mediawiki.language/specialcharacters.json @@ -90,6 +90,9 @@ "greek": [ "Α", "Ά", "α", "ά", "Β", "β", "Γ", "γ", "Δ", "δ", "Ε", "Έ", "ε", "έ", "Ζ", "ζ", "Η", "Ή", "η", "ή", "Θ", "θ", "Ι", "Ί", "ι", "ί", "Κ", "κ", "Λ", "λ", "Μ", "μ", "Ν", "ν", "Ξ", "ξ", "Ο", "Ό", "ο", "ό", "Π", "π", "Ρ", "ρ", "Σ", "σ", "ς", "Τ", "τ", "Υ", "Ύ", "υ", "ύ", "Φ", "φ", "Χ", "χ", "Ψ", "ψ", "Ω", "Ώ", "ω", "ώ" ], + "greekextended": [ + "ἀ", "ἁ", "ἂ", "ἃ", "ἄ", "ἅ", "ἆ", "ἇ", "Ἀ", "Ἁ", "Ἂ", "Ἃ", "Ἄ", "Ἅ", "Ἆ", "Ἇ", "ἐ", "ἑ", "ἒ", "ἓ", "ἔ", "ἕ", "Ἐ", "Ἑ", "Ἒ", "Ἓ", "Ἔ", "Ἕ", "ἠ", "ἡ", "ἢ", "ἣ", "ἤ", "ἥ", "ἦ", "ἧ", "Ἠ", "Ἡ", "Ἢ", "Ἣ", "Ἤ", "Ἥ", "Ἦ", "Ἧ", "ἰ", "ἱ", "ἲ", "ἳ", "ἴ", "ἵ", "ἶ", "ἷ", "Ἰ", "Ἱ", "Ἲ", "Ἳ", "Ἴ", "Ἵ", "Ἶ", "Ἷ", "ὀ", "ὁ", "ὂ", "ὃ", "ὄ", "ὅ", "Ὀ", "Ὁ", "Ὂ", "Ὃ", "Ὄ", "Ὅ", "ὐ", "ὑ", "ὒ", "ὓ", "ὔ", "ὕ", "ὖ", "ὗ", "Ὑ", "Ὓ", "Ὕ", "Ὗ", "ὠ", "ὡ", "ὢ", "ὣ", "ὤ", "ὥ", "ὦ", "ὧ", "Ὠ", "Ὡ", "Ὢ", "Ὣ", "Ὤ", "Ὥ", "Ὦ", "Ὧ", "ὰ", "ά", "ὲ", "έ", "ὴ", "ή", "ὶ", "ί", "ὸ", "ό", "ὺ", "ύ", "ὼ", "ώ", "ᾀ", "ᾁ", "ᾂ", "ᾃ", "ᾄ", "ᾅ", "ᾆ", "ᾇ", "ᾈ", "ᾉ", "ᾊ", "ᾋ", "ᾌ", "ᾍ", "ᾎ", "ᾏ", "ᾐ", "ᾑ", "ᾒ", "ᾓ", "ᾔ", "ᾕ", "ᾖ", "ᾗ", "ᾘ", "ᾙ", "ᾚ", "ᾛ", "ᾜ", "ᾝ", "ᾞ", "ᾟ", "ᾠ", "ᾡ", "ᾢ", "ᾣ", "ᾤ", "ᾥ", "ᾦ", "ᾧ", "ᾨ", "ᾩ", "ᾪ", "ᾫ", "ᾬ", "ᾭ", "ᾮ", "ᾯ", "ᾰ", "ᾱ", "ᾲ", "ᾳ", "ᾴ", "ᾶ", "ᾷ", "Ᾰ", "Ᾱ", "Ὰ", "Ά", "ᾼ", "᾽", "ι", "᾿", "῀", "῁", "ῂ", "ῃ", "ῄ", "ῆ", "ῇ", "Ὲ", "Έ", "Ὴ", "Ή", "ῌ", "῍", "῎", "῏", "ῐ", "ῑ", "ῒ", "ΐ", "ῖ", "ῗ", "Ῐ", "Ῑ", "Ὶ", "Ί", "῝", "῞", "῟", "ῠ", "ῡ", "ῢ", "ΰ", "ῤ", "ῥ", "ῦ", "ῧ", "Ῠ", "Ῡ", "Ὺ", "Ύ", "Ῥ", "῭", "΅", "`", "ῲ", "ῳ", "ῴ", "ῶ", "ῷ", "Ὸ", "Ό", "Ὼ", "Ώ", "ῼ", "´", "῾" + ], "cyrillic": [ "А", "а", "Ӑ", "ӑ", "Ӓ", "ӓ", "Ә", "ә", "Ӛ", "ӛ", "Б", "б", "В", "в", "Г", "г", "Ґ", "ґ", "Ӷ", "ӷ", "Ѓ", "ѓ", "Ӻ", "ӻ", "Ғ", "ғ", "Ҕ", "ҕ", "Д", "д", "Ԁ", "ԁ", "Ԃ", "ԃ", "Ђ", "ђ", "Е", "е", "Ѐ", "ѐ", "Є", "є", "Ё", "ё", "Ӗ", "ӗ", "Ҽ", "ҽ", "Ҿ", "ҿ", "Ж", "ж", "Җ", "җ", "Ӂ", "ӂ", "Ӝ", "ӝ", "З", "з", "Ҙ", "ҙ", "Ӟ", "ӟ", "Ԑ", "ԑ", "Ӡ", "ӡ", "Ѕ", "ѕ", "Ԅ", "ԅ", "Ԇ", "ԇ", "И", "и", "І", "і", "Ї", "ї", [ diff --git a/resources/src/mediawiki.special/mediawiki.special.apisandbox.js b/resources/src/mediawiki.special/mediawiki.special.apisandbox.js index a2d106dec7..3cfc52c51b 100644 --- a/resources/src/mediawiki.special/mediawiki.special.apisandbox.js +++ b/resources/src/mediawiki.special/mediawiki.special.apisandbox.js @@ -906,6 +906,15 @@ return xhr; } } ) + .then( null, function ( code, data, result, jqXHR ) { + if ( code !== 'http' ) { + // Not really an error, work around mw.Api thinking it is. + return $.Deferred() + .resolve( result, jqXHR ) + .promise(); + } + return this; + } ) .fail( function ( code, data ) { var details = 'HTTP error: ' + data.exception; $result.empty() diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css index fd907ac252..9da6c83458 100644 --- a/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css +++ b/resources/src/mediawiki.special/mediawiki.special.userlogin.common.css @@ -1,5 +1,5 @@ -/* Styles for user login and signup forms */ -.mw-form-related-link-container { +/* User login and signup forms */ +.mw-ui-vform .mw-form-related-link-container { margin-bottom: 0.5em; text-align: center; } diff --git a/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css b/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css index 42d56936d2..620c83ab84 100644 --- a/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css +++ b/resources/src/mediawiki.special/mediawiki.special.userlogin.login.css @@ -5,4 +5,29 @@ background: url( images/glyph-people-large.png ) no-repeat 50%; margin: 0 auto; padding-top: 7.8em; + font-weight: bold; +} + +/* Login Button, following `ButtonWidget (progressive)‎` from OOjs UI */ +#mw-createaccount-join { + color: #347bff; +} +#mw-createaccount-join:hover { + background-color: #ebf2ff; /* rgba(52, 123, 255, 0.1); */ + border-color: #859ecc; + box-shadow: none; +} +#mw-createaccount-join:active { + background-color: #ebf2ff; + color: #1f4999; + border-color: #1f4999; +} +#mw-createaccount-join:focus { + background-color: #fff; + color: #1f4999; + border-color: #1f4999; + box-shadow: inset 0 0 0 1px #1f4999; +} +#mw-createaccount-join:active:focus { + background-color: #ebf2ff; } diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js index 29eaaad126..58115c3140 100644 --- a/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js +++ b/resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js @@ -25,23 +25,24 @@ * @private */ PageExistenceCache.prototype.processExistenceCheckQueue = function () { - var queue, titles; + var queue, titles, + cache = this; if ( this.currentRequest ) { // Don't fire off a million requests at the same time this.currentRequest.always( function () { - this.currentRequest = null; - this.processExistenceCheckQueueDebounced(); - }.bind( this ) ); + cache.currentRequest = null; + cache.processExistenceCheckQueueDebounced(); + } ); return; } queue = this.existenceCheckQueue; this.existenceCheckQueue = {}; titles = Object.keys( queue ).filter( function ( title ) { - if ( this.existenceCache.hasOwnProperty( title ) ) { - queue[ title ].resolve( this.existenceCache[ title ] ); + if ( cache.existenceCache.hasOwnProperty( title ) ) { + queue[ title ].resolve( cache.existenceCache[ title ] ); } - return !this.existenceCache.hasOwnProperty( title ); - }.bind( this ) ); + return !cache.existenceCache.hasOwnProperty( title ); + } ); if ( !titles.length ) { return; } @@ -53,10 +54,10 @@ } ).done( function ( response ) { $.each( response.query.pages, function ( index, page ) { var title = new ForeignTitle( page.title ).getPrefixedText(); - this.existenceCache[ title ] = !page.missing; - queue[ title ].resolve( this.existenceCache[ title ] ); + cache.existenceCache[ title ] = !page.missing; + queue[ title ].resolve( cache.existenceCache[ title ] ); } ); - }.bind( this ) ); + } ); }; /** @@ -107,6 +108,7 @@ * @cfg {string} [apiUrl] API URL, if not the current wiki's API */ mw.widgets.CategoryCapsuleItemWidget = function MWWCategoryCapsuleItemWidget( config ) { + var widget = this; // Parent constructor mw.widgets.CategoryCapsuleItemWidget.parent.call( this, $.extend( { data: config.title.getMainText(), @@ -137,8 +139,8 @@ this.constructor.static.pageExistenceCaches[ this.apiUrl ] .checkPageExistence( new ForeignTitle( this.title.getPrefixedText() ) ) .done( function ( exists ) { - this.setMissing( !exists ); - }.bind( this ) ); + widget.setMissing( !exists ); + } ); /*jshint +W024*/ }; diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js index b805e65516..3d9771116c 100644 --- a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js +++ b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js @@ -6,6 +6,16 @@ */ ( function ( $, mw ) { + var interwikiPrefixesPromise = new mw.Api().get( { + action: 'query', + meta: 'siteinfo', + siprop: 'interwikimap' + } ).then( function ( data ) { + return $.map( data.query.interwikimap, function ( interwiki ) { + return interwiki.prefix; + } ); + } ); + /** * Mixin for title widgets * @@ -28,8 +38,6 @@ * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument */ mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) { - var widget = this; - // Config initialization config = $.extend( { maxLength: 255, @@ -51,16 +59,6 @@ // Initialization this.$element.addClass( 'mw-widget-titleWidget' ); - this.interwikiPrefixes = []; - this.interwikiPrefixesPromise = new mw.Api().get( { - action: 'query', - meta: 'siteinfo', - siprop: 'interwikimap' - } ).done( function ( data ) { - $.each( data.query.interwikimap, function ( index, interwiki ) { - widget.interwikiPrefixes.push( interwiki.prefix ); - } ); - } ); }; /* Setup */ @@ -108,12 +106,12 @@ } }; if ( mw.Title.newFromText( query ) ) { - return this.interwikiPrefixesPromise.then( function () { + return interwikiPrefixesPromise.then( function ( interwikiPrefixes ) { var params, interwiki = query.substring( 0, query.indexOf( ':' ) ); if ( interwiki && interwiki !== '' && - widget.interwikiPrefixes.indexOf( interwiki ) !== -1 + interwikiPrefixes.indexOf( interwiki ) !== -1 ) { return $.Deferred().resolve( { query: { pages: [ { diff --git a/resources/src/mediawiki/api.js b/resources/src/mediawiki/api.js index 10e0c56387..64e5976c5c 100644 --- a/resources/src/mediawiki/api.js +++ b/resources/src/mediawiki/api.js @@ -239,11 +239,13 @@ .done( function ( result, textStatus, jqXHR ) { if ( result === undefined || result === null || result === '' ) { apiDeferred.reject( 'ok-but-empty', - 'OK response but empty result (check HTTP headers?)' + 'OK response but empty result (check HTTP headers?)', + result, + jqXHR ); } else if ( result.error ) { var code = result.error.code === undefined ? 'unknown' : result.error.code; - apiDeferred.reject( code, result ); + apiDeferred.reject( code, result, result, jqXHR ); } else { apiDeferred.resolve( result, jqXHR ); } diff --git a/resources/src/mediawiki/mediawiki.requestIdleCallback.js b/resources/src/mediawiki/mediawiki.requestIdleCallback.js index 796639f9bf..dfc98add44 100644 --- a/resources/src/mediawiki/mediawiki.requestIdleCallback.js +++ b/resources/src/mediawiki/mediawiki.requestIdleCallback.js @@ -3,37 +3,19 @@ * * Loosely based on https://w3c.github.io/requestidlecallback/ */ -( function ( mw, $ ) { - var tasks = [], - maxIdleDuration = 50, - timeout = null; - - function schedule( trigger ) { - clearTimeout( timeout ); - timeout = setTimeout( trigger, 700 ); - } - - function triggerIdle() { - var elapsed, - start = mw.now(); - - while ( tasks.length ) { - elapsed = mw.now() - start; - if ( elapsed < maxIdleDuration ) { - tasks.shift().callback(); - } else { - // Idle moment expired, try again later - schedule( triggerIdle ); - break; - } - } - } +( function ( mw ) { + var maxBusy = 50; mw.requestIdleCallbackInternal = function ( callback ) { - var task = { callback: callback }; - tasks.push( task ); - - $( function () { schedule( triggerIdle ); } ); + setTimeout( function () { + var start = mw.now(); + callback( { + didTimeout: false, + timeRemaining: function () { + return Math.max( 0, maxBusy - ( mw.now() - start ) ); + } + } ); + }, 1 ); }; /** @@ -43,8 +25,7 @@ * @param {Function} callback */ mw.requestIdleCallback = window.requestIdleCallback - ? function ( callback ) { - window.requestIdleCallback( callback ); - } + // Bind because it throws TypeError if context is not window + ? window.requestIdleCallback.bind( window ) : mw.requestIdleCallbackInternal; -}( mediaWiki, jQuery ) ); +}( mediaWiki ) ); diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php index 76a6335456..c8b466145d 100644 --- a/tests/TestsAutoLoader.php +++ b/tests/TestsAutoLoader.php @@ -105,6 +105,7 @@ $wgAutoloadClasses += [ # tests/phpunit/includes/specials 'SpecialPageTestBase' => "$testDir/phpunit/includes/specials/SpecialPageTestBase.php", + 'SpecialPageExecutor' => "$testDir/phpunit/includes/specials/SpecialPageExecutor.php", # tests/phpunit/languages 'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php", diff --git a/tests/parser/extraParserTests.txt b/tests/parser/extraParserTests.txt index bef8f506da..a48087e25d 100644 Binary files a/tests/parser/extraParserTests.txt and b/tests/parser/extraParserTests.txt differ diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc index c10d3f734c..56108c96e8 100644 --- a/tests/parser/parserTest.inc +++ b/tests/parser/parserTest.inc @@ -195,7 +195,7 @@ class ParserTest { 'transformVia404' => false, 'backend' => new FSFileBackend( [ 'name' => 'local-backend', - 'wikiId' => wfWikiId(), + 'wikiId' => wfWikiID(), 'containerPaths' => [ 'local-public' => $this->uploadDir . '/public', 'local-thumb' => $this->uploadDir . '/thumb', @@ -619,6 +619,7 @@ class ParserTest { $titleText = 'Parser test'; } + ObjectCache::getMainWANInstance()->clearProcessCache(); $local = isset( $opts['local'] ); $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null; $parser = $this->getParser( $preprocessor ); @@ -849,7 +850,7 @@ class ParserTest { 'transformVia404' => false, 'backend' => new FSFileBackend( [ 'name' => 'local-backend', - 'wikiId' => wfWikiId(), + 'wikiId' => wfWikiID(), 'containerPaths' => [ 'local-public' => $this->uploadDir, 'local-thumb' => $this->uploadDir . '/thumb', diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt index 356eed3f0e..c6eebe40cb 100644 --- a/tests/parser/parserTests.txt +++ b/tests/parser/parserTests.txt @@ -18,7 +18,6 @@ # ill add inter-language links # (ignored by Parsoid, since it emits s) # subpage enable subpages (disabled by default) -# noxml don't check for XML well-formedness # title=[[XXX]] run test using article title XXX # language=XXX set content language to XXX for this test # variant=XXX set the variant of language for this test (eg zh-tw) @@ -4773,7 +4772,7 @@ External image !! wikitext External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png !! html -

External image: Ncwikicol.png +

External image: Ncwikicol.png

!! end @@ -4782,7 +4781,7 @@ External image from https !! wikitext External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png !! html -

External image from https: Ncwikicol.png +

External image from https: Ncwikicol.png

!! end @@ -4856,7 +4855,7 @@ External links: Clickable images !! wikitext ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png] !! html/php -

ja-style clickable images: Ncwikicol.png +

ja-style clickable images: Ncwikicol.png

!! html/parsoid

ja-style clickable images: Ncwikicol.png

@@ -6567,6 +6566,8 @@ Table with empty line following the start tag !! test Table attributes with empty value +!! options +parsoid=wt2html,html2html !! wikitext {| | style=| hello @@ -6579,11 +6580,8 @@ Table attributes with empty value !! html/parsoid - - -
hello -
- + hello + !! end !! test @@ -10509,6 +10507,7 @@ Abort table cell attribute parsing on wikilink {| | testing [[one|two]] | three || four | testing one two | three || four +| testing="[[one|two]]" | three || four |} !! html/php @@ -10518,12 +10517,16 @@ Abort table cell attribute parsing on wikilink + +
three four + testing="two" | three four
!! html/parsoid - + +
testing two | three four three four
three four testing="two" | three four
!! end @@ -12163,7 +12166,7 @@ This template has in it. !! test pre-save transform: unclosed tag !! options -pst noxml +pst !! wikitext '''not wiki''' !! html/php @@ -12173,7 +12176,7 @@ pst noxml !! test pre-save transform: mixed tag case !! options -pst noxml +pst !! wikitext '''not wiki''' !! html/php @@ -12183,7 +12186,7 @@ pst noxml !! test pre-save transform: unclosed comment in !! options -pst noxml +pst !! wikitext wikinowiki", "<!-- Foo -->" ), - array( "", "<!-- Foo --><!-- Bar -->" ), - array( " ", "<!-- Foo --> <!-- Bar -->" ), - array( " \n ", "<!-- Foo --> \n <!-- Bar -->" ), - array( " \n \n", "<!-- Foo --> \n <!-- Bar -->\n" ), - array( " \n", "<!-- Foo --> <!-- Bar -->\n" ), - array( "Bar", "<!-->Bar" ), - array( "\n== Baz ==\n", "== Foo ==\n <!-- Bar -->\n== Baz ==\n" ), - array( "", "gallery" ), - array( "Foo Bar", "Foo gallery Bar" ), - array( "", "gallery</gallery>" ), - array( " ", "<foo> gallery</gallery>" ), - array( " ", "<foo> gallery<gallery></gallery>" ), - array( " Foo bar ", "<noinclude> Foo bar </noinclude>" ), - array( "\n{{Foo}}\n", "<noinclude>\n\n</noinclude>" ), - array( "\n{{Foo}}\n\n", "<noinclude>\n\n</noinclude>\n" ), - array( "foo bar", "galleryfoo bar" ), - array( "<{{foo}}>", "<>" ), - array( "<{{{foo}}}>", "<foo>" ), - array( "", "gallery</gallery</gallery>" ), - array( "=== Foo === ", "=== Foo === " ), - array( "=== Foo === ", "==<!-- -->= Foo === " ), - array( "=== Foo === ", "=== Foo ==<!-- -->= " ), - array( "=== Foo ===\n", "=== Foo ===<!-- -->\n" ), - array( "=== Foo === \n", "=== Foo ===<!-- --> <!-- -->\n" ), - array( "== Foo ==\n== Bar == \n", "== Foo ==\n== Bar == \n" ), - array( "===========", "===========" ), - array( "Foo\n=\n==\n=\n", "Foo\n=\n==\n=\n" ), - array( "{{Foo}}", "" ), - array( "\n{{Foo}}", "\n" ), - array( "{{Foo|bar}}", "" ), - array( "{{Foo|bar}}a", "a" ), - array( "{{Foo|bar|baz}}", "" ), - array( "{{Foo|1=bar}}", "" ), - array( "{{Foo|=bar}}", "" ), - array( "{{Foo|bar=baz}}", "" ), - array( "{{Foo|{{bar}}=baz}}", "" ), - array( "{{Foo|1=bar|baz}}", "" ), - array( "{{Foo|1=bar|2=baz}}", "" ), - array( "{{Foo|bar|foo=baz}}", "" ), - array( "{{{1}}}", "1" ), - array( "{{{1|}}}", "1" ), - array( "{{{Foo}}}", "Foo" ), - array( "{{{Foo|}}}", "Foo" ), - array( "{{{Foo|bar|baz}}}", "Foobarbaz" ), - array( "{{Foo}}", "{<!-- -->{Foo}}" ), - array( "{{{{Foobar}}}}", "{Foobar}" ), - array( "{{{ {{Foo}} }}}", " <template><title>Foo " ), - array( "{{ {{{Foo}}} }}", "" ), - array( "{{{{{Foo}}}}}", "" ), - array( "{{{{{Foo}} }}}", "<template><title>Foo " ), - array( "{{{{{{Foo}}}}}}", "<tplarg><title>Foo" ), - array( "{{{{{{Foo}}}}}", "{" ), - array( "[[[Foo]]", "[[[Foo]]" ), - array( "{{Foo|[[[[bar]]|baz]]}}", "" ), // This test is important, since it means the difference between having the [[ rule stacked or not - array( "{{Foo|[[[[bar]|baz]]}}", "{{Foo|[[[[bar]|baz]]}}" ), - array( "{{Foo|Foo [[[[bar]|baz]]}}", "{{Foo|Foo [[[[bar]|baz]]}}" ), - array( "Foo BarBaz", "Foo display mapBar</display map >Baz" ), - array( "Foo BarBaz", "Foo display map fooBar</display map >Baz" ), - array( "Foo ", "Foo gallery bar="baz" " ), - array( "Foo ", "Foo gallery bar="1" baz=2 " ), - array( "Foo", "/fooFoo<//foo>" ), # Worth blacklisting IMHO - array( "{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}", "" ), - array( "{{#if: {{{1|}}} | Foo | {{Bar}} }}", "" ), - array( "{{#if: {{{1|}}} | Foo | [[Bar]] }}", "" ), - array( "{{#if: {{{1|}}} | [[Foo]] | Bar }}", "" ), - array( "{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}", "" ), - array( "{{ {{Foo}}", "{{ " ), - array( "{{Foobar {{Foo}} {{Bar}} {{Baz}} ", "{{Foobar " ), - array( "[[Foo]] |", "[[Foo]] |" ), - array( "{{Foo|Bar|", "{{Foo|Bar|" ), - array( "[[Foo]", "[[Foo]" ), - array( "[[Foo|Bar]", "[[Foo|Bar]" ), - array( "{{Foo| [[Bar] }}", "{{Foo| [[Bar] }}" ), - array( "{{Foo| [[Bar|Baz] }}", "{{Foo| [[Bar|Baz] }}" ), - array( "{{Foo|bar=[[baz]}}", "{{Foo|bar=[[baz]}}" ), - array( "{{foo|", "{{foo|" ), - array( "{{foo|}", "{{foo|}" ), - array( "{{foo|} }}", "" ), - array( "{{foo|bar=|}", "{{foo|bar=|}" ), - array( "{{Foo|} Bar=", "{{Foo|} Bar=" ), - array( "{{Foo|} Bar=}}", "" ), - /* array( file_get_contents( __DIR__ . '/QuoteQuran.txt' ), file_get_contents( __DIR__ . '/QuoteQuranExpanded.txt' ) ), */ - ); + return [ + [ "Foo", "Foo" ], + [ "", "<!-- Foo -->" ], + [ "", "<!-- Foo --><!-- Bar -->" ], + [ " ", "<!-- Foo --> <!-- Bar -->" ], + [ " \n ", "<!-- Foo --> \n <!-- Bar -->" ], + [ " \n \n", "<!-- Foo --> \n <!-- Bar -->\n" ], + [ " \n", "<!-- Foo --> <!-- Bar -->\n" ], + [ "Bar", "<!-->Bar" ], + [ "\n== Baz ==\n", "== Foo ==\n <!-- Bar -->\n== Baz ==\n" ], + [ "", "gallery" ], + [ "Foo Bar", "Foo gallery Bar" ], + [ "", "gallery</gallery>" ], + [ " ", "<foo> gallery</gallery>" ], + [ " ", "<foo> gallery<gallery></gallery>" ], + [ " Foo bar ", "<noinclude> Foo bar </noinclude>" ], + [ "\n{{Foo}}\n", "<noinclude>\n\n</noinclude>" ], + [ "\n{{Foo}}\n\n", "<noinclude>\n\n</noinclude>\n" ], + [ "foo bar", "galleryfoo bar" ], + [ "<{{foo}}>", "<>" ], + [ "<{{{foo}}}>", "<foo>" ], + [ "", "gallery</gallery</gallery>" ], + [ "=== Foo === ", "=== Foo === " ], + [ "=== Foo === ", "==<!-- -->= Foo === " ], + [ "=== Foo === ", "=== Foo ==<!-- -->= " ], + [ "=== Foo ===\n", "=== Foo ===<!-- -->\n" ], + [ "=== Foo === \n", "=== Foo ===<!-- --> <!-- -->\n" ], + [ "== Foo ==\n== Bar == \n", "== Foo ==\n== Bar == \n" ], + [ "===========", "===========" ], + [ "Foo\n=\n==\n=\n", "Foo\n=\n==\n=\n" ], + [ "{{Foo}}", "" ], + [ "\n{{Foo}}", "\n" ], + [ "{{Foo|bar}}", "" ], + [ "{{Foo|bar}}a", "a" ], + [ "{{Foo|bar|baz}}", "" ], + [ "{{Foo|1=bar}}", "" ], + [ "{{Foo|=bar}}", "" ], + [ "{{Foo|bar=baz}}", "" ], + [ "{{Foo|{{bar}}=baz}}", "" ], + [ "{{Foo|1=bar|baz}}", "" ], + [ "{{Foo|1=bar|2=baz}}", "" ], + [ "{{Foo|bar|foo=baz}}", "" ], + [ "{{{1}}}", "1" ], + [ "{{{1|}}}", "1" ], + [ "{{{Foo}}}", "Foo" ], + [ "{{{Foo|}}}", "Foo" ], + [ "{{{Foo|bar|baz}}}", "Foobarbaz" ], + [ "{{Foo}}", "{<!-- -->{Foo}}" ], + [ "{{{{Foobar}}}}", "{Foobar}" ], + [ "{{{ {{Foo}} }}}", " <template><title>Foo " ], + [ "{{ {{{Foo}}} }}", "" ], + [ "{{{{{Foo}}}}}", "" ], + [ "{{{{{Foo}} }}}", "<template><title>Foo " ], + [ "{{{{{{Foo}}}}}}", "<tplarg><title>Foo" ], + [ "{{{{{{Foo}}}}}", "{" ], + [ "[[[Foo]]", "[[[Foo]]" ], + [ "{{Foo|[[[[bar]]|baz]]}}", "" ], // This test is important, since it means the difference between having the [[ rule stacked or not + [ "{{Foo|[[[[bar]|baz]]}}", "{{Foo|[[[[bar]|baz]]}}" ], + [ "{{Foo|Foo [[[[bar]|baz]]}}", "{{Foo|Foo [[[[bar]|baz]]}}" ], + [ "Foo BarBaz", "Foo display mapBar</display map >Baz" ], + [ "Foo BarBaz", "Foo display map fooBar</display map >Baz" ], + [ "Foo ", "Foo gallery bar="baz" " ], + [ "Foo ", "Foo gallery bar="1" baz=2 " ], + [ "Foo", "/fooFoo<//foo>" ], # Worth blacklisting IMHO + [ "{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}", "" ], + [ "{{#if: {{{1|}}} | Foo | {{Bar}} }}", "" ], + [ "{{#if: {{{1|}}} | Foo | [[Bar]] }}", "" ], + [ "{{#if: {{{1|}}} | [[Foo]] | Bar }}", "" ], + [ "{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}", "" ], + [ "{{ {{Foo}}", "{{ " ], + [ "{{Foobar {{Foo}} {{Bar}} {{Baz}} ", "{{Foobar " ], + [ "[[Foo]] |", "[[Foo]] |" ], + [ "{{Foo|Bar|", "{{Foo|Bar|" ], + [ "[[Foo]", "[[Foo]" ], + [ "[[Foo|Bar]", "[[Foo|Bar]" ], + [ "{{Foo| [[Bar] }}", "{{Foo| [[Bar] }}" ], + [ "{{Foo| [[Bar|Baz] }}", "{{Foo| [[Bar|Baz] }}" ], + [ "{{Foo|bar=[[baz]}}", "{{Foo|bar=[[baz]}}" ], + [ "{{foo|", "{{foo|" ], + [ "{{foo|}", "{{foo|}" ], + [ "{{foo|} }}", "" ], + [ "{{foo|bar=|}", "{{foo|bar=|}" ], + [ "{{Foo|} Bar=", "{{Foo|} Bar=" ], + [ "{{Foo|} Bar=}}", "" ], + /* [ file_get_contents( __DIR__ . '/QuoteQuran.txt' ], file_get_contents( __DIR__ . '/QuoteQuranExpanded.txt' ) ], */ + ]; // @codingStandardsIgnoreEnd } @@ -162,13 +162,13 @@ class PreprocessorTest extends MediaWikiTestCase { */ public static function provideFiles() { // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong - return array( - array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver - array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium - array( "All_system_messages" ), # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki - array( "Fundraising" ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor. - array( "NestedTemplates" ), # bug 27936 - ); + return [ + [ "QuoteQuran" ], # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver + [ "Factorial" ], # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium + [ "All_system_messages" ], # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki + [ "Fundraising" ], # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor. + [ "NestedTemplates" ], # bug 27936 + ]; // @codingStandardsIgnoreEnd } @@ -197,43 +197,43 @@ class PreprocessorTest extends MediaWikiTestCase { */ public static function provideHeadings() { // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong - return array( /* These should become headings: */ - array( "== h ==", "== h ==<!--c1-->" ), - array( "== h == ", "== h == <!--c1-->" ), - array( "== h == ", "== h ==<!--c1--> " ), - array( "== h == ", "== h == <!--c1--> " ), - array( "== h ==", "== h ==<!--c1--><!--c2-->" ), - array( "== h == ", "== h == <!--c1--><!--c2-->" ), - array( "== h == ", "== h ==<!--c1--><!--c2--> " ), - array( "== h == ", "== h == <!--c1--><!--c2--> " ), - array( "== h == ", "== h == <!--c1--> <!--c2-->" ), - array( "== h == ", "== h ==<!--c1--> <!--c2--> " ), - array( "== h == ", "== h == <!--c1--> <!--c2--> " ), - array( "== h ==", "== h ==<!--c1--><!--c2--><!--c3-->" ), - array( "== h == ", "== h ==<!--c1--> <!--c2--><!--c3-->" ), - array( "== h == ", "== h ==<!--c1--><!--c2--> <!--c3-->" ), - array( "== h == ", "== h ==<!--c1--> <!--c2--> <!--c3-->" ), - array( "== h == ", "== h == <!--c1--><!--c2--><!--c3-->" ), - array( "== h == ", "== h == <!--c1--> <!--c2--><!--c3-->" ), - array( "== h == ", "== h == <!--c1--><!--c2--> <!--c3-->" ), - array( "== h == ", "== h == <!--c1--> <!--c2--> <!--c3-->" ), - array( "== h == ", "== h ==<!--c1--><!--c2--><!--c3--> " ), - array( "== h == ", "== h ==<!--c1--> <!--c2--><!--c3--> " ), - array( "== h == ", "== h ==<!--c1--><!--c2--> <!--c3--> " ), - array( "== h == ", "== h ==<!--c1--> <!--c2--> <!--c3--> " ), - array( "== h == ", "== h == <!--c1--><!--c2--><!--c3--> " ), - array( "== h == ", "== h == <!--c1--> <!--c2--><!--c3--> " ), - array( "== h == ", "== h == <!--c1--><!--c2--> <!--c3--> " ), - array( "== h == ", "== h == <!--c1--> <!--c2--> <!--c3--> " ), - array( "== h == ", "== h ==<!--c1--> <!--c2-->" ), - array( "== h == ", "== h == <!--c1--> <!--c2-->" ), - array( "== h == ", "== h ==<!--c1--> <!--c2--> " ), + return [ /* These should become headings: */ + [ "== h ==", "== h ==<!--c1-->" ], + [ "== h == ", "== h == <!--c1-->" ], + [ "== h == ", "== h ==<!--c1--> " ], + [ "== h == ", "== h == <!--c1--> " ], + [ "== h ==", "== h ==<!--c1--><!--c2-->" ], + [ "== h == ", "== h == <!--c1--><!--c2-->" ], + [ "== h == ", "== h ==<!--c1--><!--c2--> " ], + [ "== h == ", "== h == <!--c1--><!--c2--> " ], + [ "== h == ", "== h == <!--c1--> <!--c2-->" ], + [ "== h == ", "== h ==<!--c1--> <!--c2--> " ], + [ "== h == ", "== h == <!--c1--> <!--c2--> " ], + [ "== h ==", "== h ==<!--c1--><!--c2--><!--c3-->" ], + [ "== h == ", "== h ==<!--c1--> <!--c2--><!--c3-->" ], + [ "== h == ", "== h ==<!--c1--><!--c2--> <!--c3-->" ], + [ "== h == ", "== h ==<!--c1--> <!--c2--> <!--c3-->" ], + [ "== h == ", "== h == <!--c1--><!--c2--><!--c3-->" ], + [ "== h == ", "== h == <!--c1--> <!--c2--><!--c3-->" ], + [ "== h == ", "== h == <!--c1--><!--c2--> <!--c3-->" ], + [ "== h == ", "== h == <!--c1--> <!--c2--> <!--c3-->" ], + [ "== h == ", "== h ==<!--c1--><!--c2--><!--c3--> " ], + [ "== h == ", "== h ==<!--c1--> <!--c2--><!--c3--> " ], + [ "== h == ", "== h ==<!--c1--><!--c2--> <!--c3--> " ], + [ "== h == ", "== h ==<!--c1--> <!--c2--> <!--c3--> " ], + [ "== h == ", "== h == <!--c1--><!--c2--><!--c3--> " ], + [ "== h == ", "== h == <!--c1--> <!--c2--><!--c3--> " ], + [ "== h == ", "== h == <!--c1--><!--c2--> <!--c3--> " ], + [ "== h == ", "== h == <!--c1--> <!--c2--> <!--c3--> " ], + [ "== h == ", "== h ==<!--c1--> <!--c2-->" ], + [ "== h == ", "== h == <!--c1--> <!--c2-->" ], + [ "== h == ", "== h ==<!--c1--> <!--c2--> " ], /* These are not working: */ - array( "== h == x ", "== h == x <!--c1--><!--c2--><!--c3--> " ), - array( "== h == x ", "== h ==<!--c1--> x <!--c2--><!--c3--> " ), - array( "== h == x ", "== h ==<!--c1--><!--c2--><!--c3--> x " ), - ); + [ "== h == x ", "== h == x <!--c1--><!--c2--><!--c3--> " ], + [ "== h == x ", "== h ==<!--c1--> x <!--c2--><!--c3--> " ], + [ "== h == x ", "== h ==<!--c1--><!--c2--><!--c3--> x " ], + ]; // @codingStandardsIgnoreEnd } diff --git a/tests/phpunit/includes/password/BcryptPasswordTest.php b/tests/phpunit/includes/password/BcryptPasswordTest.php index d6940b58f3..8f80362470 100644 --- a/tests/phpunit/includes/password/BcryptPasswordTest.php +++ b/tests/phpunit/includes/password/BcryptPasswordTest.php @@ -13,28 +13,28 @@ class BcryptPasswordTest extends PasswordTestCase { public static function providePasswordTests() { // @codingStandardsIgnoreStart Generic.Files.LineLength - return array( + return [ // Tests from glibc bcrypt implementation - array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "U*U" ), - array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$VGOzA784oUp/Z0DY336zx7pLYAy0lwK', "U*U*" ), - array( true, ':bcrypt:5$XXXXXXXXXXXXXXXXXXXXXO$AcXxm9kjPGEMsLznoKqmqw7tc8WCx4a', "U*U*U" ), - array( true, ':bcrypt:5$abcdefghijklmnopqrstuu$5s2v8.iXieOjg/.AySBTTZIIVFJeBui', "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "\xff\xa334\xff\xff\xff\xa3345" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6', "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaachars after 72 are ignored as usual" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy', "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" ), - array( true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe', "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" ), - array( true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy', "" ), + [ true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "U*U" ], + [ true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$VGOzA784oUp/Z0DY336zx7pLYAy0lwK', "U*U*" ], + [ true, ':bcrypt:5$XXXXXXXXXXXXXXXXXXXXXO$AcXxm9kjPGEMsLznoKqmqw7tc8WCx4a', "U*U*U" ], + [ true, ':bcrypt:5$abcdefghijklmnopqrstuu$5s2v8.iXieOjg/.AySBTTZIIVFJeBui', "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789chars after 72 are ignored" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$CE5elHaaO4EbggVDjb8P19RukzXSM3e', "\xff\xff\xa3" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$Sa7shbm4.OzKpvFnX1pQLmQW96oUlCq', "\xa3" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$o./n25XVfn6oAPaUvHe.Csk4zRfsYPi', "\xff\xa334\xff\xff\xff\xa3345" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$nRht2l/HRhr6zmCp9vYUvvsqynflf9e', "\xff\xa3345" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$6IflQkJytoRVc1yuaNtHfiuq.FRlSIS', "\xa3ab" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$swQOIzjOiJ9GHEPuhEkvqrUyvWhEMx6', "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaachars after 72 are ignored as usual" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$R9xrDjiycxMbQE2bp.vgqlYpW5wx2yy', "\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55\xaa\x55" ], + [ true, ':bcrypt:5$/OK.fbVrR/bpIqNJ5ianF.$9tQZzcJfm3uj2NvJ/n5xkhpqLrMpWCe', "\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff\x55\xaa\xff" ], + [ true, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$7uG0VCzI2bS7j6ymqJi9CdcdxiRTWNy', "" ], // One or two false sanity tests - array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "UXU" ), - array( false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "" ), - ); + [ false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "UXU" ], + [ false, ':bcrypt:5$CCCCCCCCCCCCCCCCCCCCC.$E5YPO9kmyuRGyh0XouQYb4YMJKvyOeW', "" ], + ]; // @codingStandardsIgnoreEnd } } diff --git a/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php b/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php index cccec5fb5c..773f033abb 100644 --- a/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php +++ b/tests/phpunit/includes/password/LayeredParameterizedPasswordTest.php @@ -28,9 +28,13 @@ class LayeredParameterizedPasswordTest extends PasswordTestCase { public static function providePasswordTests() { // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong - return array( - array( true, ':testLargeLayeredTop:sha512:1024:512!sha512:1024:512!sha512:1024:512!sha512:1024:512!5!vnRy+2SrSA0fHt3dwhTP5g==!AVnwfZsAQjn+gULv7FSGjA==!xvHUX3WcpkeSn1lvjWcvBg==!It+OC/N9tu+d3ByHhuB0BQ==!Tb.gqUOiD.aWktVwHM.Q/O!7CcyMfXUPky5ptyATJsR2nq3vUqtnBC', 'testPassword123' ), - ); + return [ + [ + true, + ':testLargeLayeredTop:sha512:1024:512!sha512:1024:512!sha512:1024:512!sha512:1024:512!5!vnRy+2SrSA0fHt3dwhTP5g==!AVnwfZsAQjn+gULv7FSGjA==!xvHUX3WcpkeSn1lvjWcvBg==!It+OC/N9tu+d3ByHhuB0BQ==!Tb.gqUOiD.aWktVwHM.Q/O!7CcyMfXUPky5ptyATJsR2nq3vUqtnBC', + 'testPassword123' + ], + ]; // @codingStandardsIgnoreEnd } diff --git a/tests/phpunit/includes/password/PasswordPolicyChecksTest.php b/tests/phpunit/includes/password/PasswordPolicyChecksTest.php index e28614e891..6357510f4f 100644 --- a/tests/phpunit/includes/password/PasswordPolicyChecksTest.php +++ b/tests/phpunit/includes/password/PasswordPolicyChecksTest.php @@ -130,7 +130,7 @@ class PasswordPolicyChecksTest extends MediaWikiTestCase { 'Passpass1' // password ); $this->assertFalse( $statusLong->isGood(), 'Password matches blacklist' ); - $this->assertTrue( $statusLong->isOk(), 'Password matches blacklist, not fatal' ); + $this->assertTrue( $statusLong->isOK(), 'Password matches blacklist, not fatal' ); } } diff --git a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php index 5126a42138..edab0dcf4a 100644 --- a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php +++ b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php @@ -33,8 +33,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { 'EnableBotPasswords' => true, 'BotPasswordsDatabase' => false, 'SessionProviders' => $wgSessionProviders + [ - 'MediaWiki\\Session\\BotPasswordSessionProvider' => [ - 'class' => 'MediaWiki\\Session\\BotPasswordSessionProvider', + BotPasswordSessionProvider::class => [ + 'class' => BotPasswordSessionProvider::class, 'args' => [ $params ], ] ], @@ -46,7 +46,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { 'store' => new TestBagOStuff, ] ); - return $manager->getProvider( 'MediaWiki\\Session\\BotPasswordSessionProvider' ); + return $manager->getProvider( BotPasswordSessionProvider::class ); } protected function setUp() { @@ -154,7 +154,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { public function testBasics() { $provider = $this->getProvider(); - $this->assertTrue( $provider->persistsSessionID() ); + $this->assertTrue( $provider->persistsSessionId() ); $this->assertFalse( $provider->canChangeUser() ); $this->assertNull( $provider->newSessionInfo() ); @@ -172,7 +172,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { } $info = $provider->provideSessionInfo( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\SessionInfo', $info ); + $this->assertInstanceOf( SessionInfo::class, $info ); $this->assertSame( 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', $info->getId() ); $this->config->set( 'EnableBotPasswords', false ); @@ -191,7 +191,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' ); $session = $provider->newSessionForRequest( $user, $bp, $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertEquals( $session->getId(), $request->getSession()->getId() ); $this->assertEquals( $user->getName(), $session->getUser()->getName() ); diff --git a/tests/phpunit/includes/session/CookieSessionProviderTest.php b/tests/phpunit/includes/session/CookieSessionProviderTest.php index a52aa4bbbe..70e89d4b0f 100644 --- a/tests/phpunit/includes/session/CookieSessionProviderTest.php +++ b/tests/phpunit/includes/session/CookieSessionProviderTest.php @@ -145,7 +145,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase { public function testBasics() { $provider = new CookieSessionProvider( [ 'priority' => 10 ] ); - $this->assertTrue( $provider->persistsSessionID() ); + $this->assertTrue( $provider->persistsSessionId() ); $this->assertTrue( $provider->canChangeUser() ); $msg = $provider->whyNoSession(); diff --git a/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php b/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php index 2412a3b68e..d705fc0191 100644 --- a/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php +++ b/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php @@ -24,7 +24,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase { $params['sessionCookieOptions']['prefix'] = $prefix; } - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' ) + $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class ) ->setConstructorArgs( [ $params ] ) ->getMockForAbstractClass(); $provider->setLogger( new \TestLogger() ); @@ -35,13 +35,13 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase { } public function testConstructor() { - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' ) + $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class ) ->getMockForAbstractClass(); $priv = \TestingAccessWrapper::newFromObject( $provider ); $this->assertNull( $priv->sessionCookieName ); $this->assertSame( [], $priv->sessionCookieOptions ); - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' ) + $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class ) ->setConstructorArgs( [ [ 'sessionCookieName' => 'Foo', 'sessionCookieOptions' => [ 'Bar' ], @@ -52,7 +52,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase { $this->assertSame( [ 'Bar' ], $priv->sessionCookieOptions ); try { - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' ) + $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class ) ->setConstructorArgs( [ [ 'sessionCookieName' => false, ] ] ) @@ -66,7 +66,7 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase { } try { - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' ) + $provider = $this->getMockBuilder( ImmutableSessionProviderWithCookie::class ) ->setConstructorArgs( [ [ 'sessionCookieOptions' => 'x', ] ] ) diff --git a/tests/phpunit/includes/session/PHPSessionHandlerTest.php b/tests/phpunit/includes/session/PHPSessionHandlerTest.php index 64b16db844..ce0f1b0611 100644 --- a/tests/phpunit/includes/session/PHPSessionHandlerTest.php +++ b/tests/phpunit/includes/session/PHPSessionHandlerTest.php @@ -23,7 +23,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { } ); $reset[] = new \ScopedCallback( 'restore_error_handler' ); - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); if ( $rProp->getValue() ) { $old = \TestingAccessWrapper::newFromObject( $rProp->getValue() ); @@ -31,7 +31,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { $oldStore = $old->store; $oldLogger = $old->logger; $reset[] = new \ScopedCallback( - [ 'MediaWiki\\Session\\PHPSessionHandler', 'install' ], + [ PHPSessionHandler::class, 'install' ], [ $oldManager, $oldStore, $oldLogger ] ); } @@ -41,13 +41,13 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { public function testEnableFlags() { $handler = \TestingAccessWrapper::newFromObject( - $this->getMockBuilder( 'MediaWiki\\Session\\PHPSessionHandler' ) + $this->getMockBuilder( PHPSessionHandler::class ) ->setMethods( null ) ->disableOriginalConstructor() ->getMock() ); - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); $reset = new \ScopedCallback( [ $rProp, 'setValue' ], [ $rProp->getValue() ] ); $rProp->setValue( $handler ); @@ -292,7 +292,9 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { // Test that write doesn't break if the session is invalid $session = $manager->getEmptySession(); $session->persist(); - session_id( $session->getId() ); + $id = $session->getId(); + unset( $session ); + session_id( $id ); session_start(); $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionCheckInfo' => [ function ( &$reason ) { @@ -300,12 +302,13 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { return false; } ], ] ); - $this->assertNull( $manager->getSessionById( $session->getId(), true ), 'sanity check' ); + $this->assertNull( $manager->getSessionById( $id, true ), 'sanity check' ); session_write_close(); + $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionCheckInfo' => [], ] ); - $this->assertNotNull( $manager->getSessionById( $session->getId(), true ), 'sanity check' ); + $this->assertNotNull( $manager->getSessionById( $id, true ), 'sanity check' ); } public static function provideHandlers() { @@ -322,9 +325,9 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { * @expectedExceptionMessage Attempt to use PHP session management */ public function testDisabled( $method, $args ) { - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); - $handler = $this->getMockBuilder( 'MediaWiki\\Session\\PHPSessionHandler' ) + $handler = $this->getMockBuilder( PHPSessionHandler::class ) ->setMethods( null ) ->disableOriginalConstructor() ->getMock(); @@ -351,7 +354,7 @@ class PHPSessionHandlerTest extends MediaWikiTestCase { * @expectedExceptionMessageRegExp /: Wrong instance called!$/ */ public function testWrongInstance( $method, $args ) { - $handler = $this->getMockBuilder( 'MediaWiki\\Session\\PHPSessionHandler' ) + $handler = $this->getMockBuilder( PHPSessionHandler::class ) ->setMethods( null ) ->disableOriginalConstructor() ->getMock(); diff --git a/tests/phpunit/includes/session/SessionBackendTest.php b/tests/phpunit/includes/session/SessionBackendTest.php index 61be8e07c1..0b5f4c2f8f 100644 --- a/tests/phpunit/includes/session/SessionBackendTest.php +++ b/tests/phpunit/includes/session/SessionBackendTest.php @@ -23,8 +23,9 @@ class SessionBackendTest extends MediaWikiTestCase { /** * Returns a non-persistent backend that thinks it has at least one session active * @param User|null $user + * @param string $id */ - protected function getBackend( User $user = null ) { + protected function getBackend( User $user = null, $id = null ) { if ( !$this->config ) { $this->config = new \HashConfig(); $this->manager = null; @@ -52,7 +53,7 @@ class SessionBackendTest extends MediaWikiTestCase { $info = new SessionInfo( SessionInfo::MIN_PRIORITY, [ 'provider' => $this->provider, - 'id' => self::SESSIONID, + 'id' => $id ?: self::SESSIONID, 'persisted' => true, 'userInfo' => UserInfo::newFromUser( $user ?: new User, true ), 'idIsSafe' => true, @@ -67,8 +68,8 @@ class SessionBackendTest extends MediaWikiTestCase { $priv->usePhpSessionHandling = false; $manager = \TestingAccessWrapper::newFromObject( $this->manager ); - $manager->allSessionBackends = [ $backend->getId() => $backend ]; - $manager->allSessionIds = [ $backend->getId() => $id ]; + $manager->allSessionBackends = [ $backend->getId() => $backend ] + $manager->allSessionBackends; + $manager->allSessionIds = [ $backend->getId() => $id ] + $manager->allSessionIds; $manager->sessionProviders = [ (string)$this->provider => $this->provider ]; return $backend; @@ -183,8 +184,8 @@ class SessionBackendTest extends MediaWikiTestCase { $request2 = new \FauxRequest(); $session2 = $backend->getSession( $request2 ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session1 ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session2 ); + $this->assertInstanceOf( Session::class, $session1 ); + $this->assertInstanceOf( Session::class, $session2 ); $this->assertSame( 2, count( $priv->requests ) ); $index = \TestingAccessWrapper::newFromObject( $session1 )->index; @@ -813,12 +814,52 @@ class SessionBackendTest extends MediaWikiTestCase { $metadata['???'] = '!!!'; } + public function testTakeOverGlobalSession() { + if ( !PHPSessionHandler::isInstalled() ) { + PHPSessionHandler::install( SessionManager::singleton() ); + } + if ( !PHPSessionHandler::isEnabled() ) { + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); + $rProp->setAccessible( true ); + $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() ); + $resetHandler = new \ScopedCallback( function () use ( $handler ) { + session_write_close(); + $handler->enable = false; + } ); + $handler->enable = true; + } + + $backend = $this->getBackend( User::newFromName( 'UTSysop' ) ); + \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true; + + $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager ); + + $manager = \TestingAccessWrapper::newFromObject( $this->manager ); + $request = \RequestContext::getMain()->getRequest(); + $manager->globalSession = $backend->getSession( $request ); + $manager->globalSessionRequest = $request; + + session_id( '' ); + \TestingAccessWrapper::newFromObject( $backend )->checkPHPSession(); + $this->assertSame( $backend->getId(), session_id() ); + session_write_close(); + + $backend2 = $this->getBackend( + User::newFromName( 'UTSysop' ), 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' + ); + \TestingAccessWrapper::newFromObject( $backend2 )->usePhpSessionHandling = true; + + session_id( '' ); + \TestingAccessWrapper::newFromObject( $backend2 )->checkPHPSession(); + $this->assertSame( '', session_id() ); + } + public function testResetIdOfGlobalSession() { if ( !PHPSessionHandler::isInstalled() ) { PHPSessionHandler::install( SessionManager::singleton() ); } if ( !PHPSessionHandler::isEnabled() ) { - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() ); $resetHandler = new \ScopedCallback( function () use ( $handler ) { @@ -831,7 +872,7 @@ class SessionBackendTest extends MediaWikiTestCase { $backend = $this->getBackend( User::newFromName( 'UTSysop' ) ); \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true; - TestUtils::setSessionManagerSingleton( $this->manager ); + $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager ); $manager = \TestingAccessWrapper::newFromObject( $this->manager ); $request = \RequestContext::getMain()->getRequest(); @@ -840,15 +881,12 @@ class SessionBackendTest extends MediaWikiTestCase { session_id( self::SESSIONID ); \MediaWiki\quietCall( 'session_start' ); + $_SESSION['foo'] = __METHOD__; $backend->resetId(); $this->assertNotEquals( self::SESSIONID, $backend->getId() ); $this->assertSame( $backend->getId(), session_id() ); - session_write_close(); - - session_id( '' ); - $this->assertNotSame( $backend->getId(), session_id(), 'sanity check' ); - $backend->persist(); - $this->assertSame( $backend->getId(), session_id() ); + $this->assertArrayHasKey( 'foo', $_SESSION ); + $this->assertSame( __METHOD__, $_SESSION['foo'] ); session_write_close(); } @@ -857,7 +895,7 @@ class SessionBackendTest extends MediaWikiTestCase { PHPSessionHandler::install( SessionManager::singleton() ); } if ( !PHPSessionHandler::isEnabled() ) { - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() ); $resetHandler = new \ScopedCallback( function () use ( $handler ) { @@ -872,7 +910,7 @@ class SessionBackendTest extends MediaWikiTestCase { $wrap->usePhpSessionHandling = true; $wrap->persist = true; - TestUtils::setSessionManagerSingleton( $this->manager ); + $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager ); $manager = \TestingAccessWrapper::newFromObject( $this->manager ); $request = \RequestContext::getMain()->getRequest(); diff --git a/tests/phpunit/includes/session/SessionInfoTest.php b/tests/phpunit/includes/session/SessionInfoTest.php index e7021257ba..ff22bfad42 100644 --- a/tests/phpunit/includes/session/SessionInfoTest.php +++ b/tests/phpunit/includes/session/SessionInfoTest.php @@ -61,7 +61,7 @@ class SessionInfoTest extends MediaWikiTestCase { } $manager = new SessionManager(); - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ 'persistsSessionId', 'canChangeUser', '__toString' ] ) ->getMockForAbstractClass(); $provider->setManager( $manager ); @@ -72,7 +72,7 @@ class SessionInfoTest extends MediaWikiTestCase { $provider->expects( $this->any() )->method( '__toString' ) ->will( $this->returnValue( 'Mock' ) ); - $provider2 = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider2 = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ 'persistsSessionId', 'canChangeUser', '__toString' ] ) ->getMockForAbstractClass(); $provider2->setManager( $manager ); diff --git a/tests/phpunit/includes/session/SessionManagerTest.php b/tests/phpunit/includes/session/SessionManagerTest.php index cd3177cf6b..6218f0a728 100644 --- a/tests/phpunit/includes/session/SessionManagerTest.php +++ b/tests/phpunit/includes/session/SessionManagerTest.php @@ -48,7 +48,7 @@ class SessionManagerTest extends MediaWikiTestCase { $reset = TestUtils::setSessionManagerSingleton( null ); $singleton = SessionManager::singleton(); - $this->assertInstanceOf( 'MediaWiki\\Session\\SessionManager', $singleton ); + $this->assertInstanceOf( SessionManager::class, $singleton ); $this->assertSame( $singleton, SessionManager::singleton() ); } @@ -58,7 +58,7 @@ class SessionManagerTest extends MediaWikiTestCase { if ( !PHPSessionHandler::isInstalled() ) { PHPSessionHandler::install( SessionManager::singleton() ); } - $rProp = new \ReflectionProperty( 'MediaWiki\\Session\\PHPSessionHandler', 'instance' ); + $rProp = new \ReflectionProperty( PHPSessionHandler::class, 'instance' ); $rProp->setAccessible( true ); $handler = \TestingAccessWrapper::newFromObject( $rProp->getValue() ); $oldEnable = $handler->enable; @@ -191,7 +191,7 @@ class SessionManagerTest extends MediaWikiTestCase { $request->info1 = null; $request->info2 = null; $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $idEmpty, $session->getId() ); $this->assertFalse( $request->unpersist1 ); $this->assertFalse( $request->unpersist2 ); @@ -210,7 +210,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id2, $session->getId() ); $this->assertFalse( $request->unpersist1 ); $this->assertFalse( $request->unpersist2 ); @@ -228,7 +228,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id1, $session->getId() ); $this->assertFalse( $request->unpersist1 ); $this->assertFalse( $request->unpersist2 ); @@ -299,7 +299,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id2, $session->getId() ); $this->logger->setCollect( false ); $this->assertTrue( $request->unpersist1 ); @@ -321,7 +321,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id1, $session->getId() ); $this->logger->setCollect( false ); $this->assertFalse( $request->unpersist1 ); @@ -338,7 +338,7 @@ class SessionManagerTest extends MediaWikiTestCase { ] ); $request->info2 = null; $session = $manager->getSessionForRequest( $request ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id1, $session->getId() ); $this->assertTrue( $request->unpersist1 ); // The saving of the session does it $this->assertFalse( $request->unpersist2 ); @@ -358,7 +358,7 @@ class SessionManagerTest extends MediaWikiTestCase { // Unknown session ID $id = $manager->generateSessionId(); $session = $manager->getSessionById( $id, true ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id, $session->getId() ); $id = $manager->generateSessionId(); @@ -379,8 +379,42 @@ class SessionManagerTest extends MediaWikiTestCase { // Known session ID $this->store->setSession( $id, [] ); $session = $manager->getSessionById( $id, false ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $id, $session->getId() ); + + // Store isn't checked if the session is already loaded + $this->store->setSession( $id, [ 'metadata' => [ + 'userId' => User::idFromName( 'UTSysop' ), + 'userToken' => 'bad', + ] ] ); + $session2 = $manager->getSessionById( $id, false ); + $this->assertInstanceOf( Session::class, $session2 ); + $this->assertSame( $id, $session2->getId() ); + unset( $session, $session2 ); + $this->logger->setCollect( true ); + $this->assertNull( $manager->getSessionById( $id, true ) ); + $this->logger->setCollect( false ); + + // Failure to create an empty session + $manager = $this->getManager(); + $provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'provideSessionInfo', 'newSessionInfo', '__toString' ] ) + ->getMock(); + $provider->expects( $this->any() )->method( 'provideSessionInfo' ) + ->will( $this->returnValue( null ) ); + $provider->expects( $this->any() )->method( 'newSessionInfo' ) + ->will( $this->returnValue( null ) ); + $provider->expects( $this->any() )->method( '__toString' ) + ->will( $this->returnValue( 'MockProvider' ) ); + $this->config->set( 'SessionProviders', [ + $this->objectCacheDef( $provider ), + ] ); + $this->logger->setCollect( true ); + $this->assertNull( $manager->getSessionById( $id, true ) ); + $this->logger->setCollect( false ); + $this->assertSame( [ + [ LogLevel::ERROR, 'Failed to create empty session: {exception}' ] + ], $this->logger->getBuffer() ); } public function testGetEmptySession() { @@ -450,7 +484,7 @@ class SessionManagerTest extends MediaWikiTestCase { ] ); $info2 = null; $session = $manager->getEmptySession(); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( 'empty---------------------------', $session->getId() ); // Info, explicitly @@ -463,7 +497,7 @@ class SessionManagerTest extends MediaWikiTestCase { ] ); $info2 = null; $session = $pmanager->getEmptySessionInternal( null, $expectId ); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( $expectId, $session->getId() ); // Wrong ID @@ -538,7 +572,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getEmptySession(); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( 'empty1--------------------------', $session->getId() ); $expectId = null; @@ -555,7 +589,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'idIsSafe' => true, ] ); $session = $manager->getEmptySession(); - $this->assertInstanceOf( 'MediaWiki\\Session\\Session', $session ); + $this->assertInstanceOf( Session::class, $session ); $this->assertSame( 'empty2--------------------------', $session->getId() ); // Tied priorities throw an exception @@ -809,7 +843,7 @@ class SessionManagerTest extends MediaWikiTestCase { \ObjectCache::$instances[__METHOD__] = new TestBagOStuff(); $this->setMwGlobals( [ 'wgMainCacheType' => __METHOD__ ] ); - $this->setMWGlobals( [ + $this->setMwGlobals( [ 'wgAuth' => new AuthPlugin, ] ); @@ -1143,7 +1177,7 @@ class SessionManagerTest extends MediaWikiTestCase { 'provider' => 'Mock', ]; - $builder = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $builder = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ '__toString', 'mergeMetadata', 'refreshSessionInfo' ] ); $provider = $builder->getMockForAbstractClass(); @@ -1258,7 +1292,7 @@ class SessionManagerTest extends MediaWikiTestCase { ] ); $this->assertFalse( $info->isIdSafe(), 'sanity check' ); $this->assertTrue( $loadSessionInfoFromStore( $info ) ); - $this->assertInstanceOf( 'MediaWiki\\Session\\UserInfo', $info->getUserInfo() ); + $this->assertInstanceOf( UserInfo::class, $info->getUserInfo() ); $this->assertTrue( $info->getUserInfo()->isVerified() ); $this->assertTrue( $info->getUserInfo()->isAnon() ); $this->assertFalse( $info->isIdSafe() ); diff --git a/tests/phpunit/includes/session/SessionProviderTest.php b/tests/phpunit/includes/session/SessionProviderTest.php index e92eb09d1f..18b1efd460 100644 --- a/tests/phpunit/includes/session/SessionProviderTest.php +++ b/tests/phpunit/includes/session/SessionProviderTest.php @@ -16,7 +16,7 @@ class SessionProviderTest extends MediaWikiTestCase { $logger = new \TestLogger(); $config = new \HashConfig(); - $provider = $this->getMockForAbstractClass( 'MediaWiki\\Session\\SessionProvider' ); + $provider = $this->getMockForAbstractClass( SessionProvider::class ); $priv = \TestingAccessWrapper::newFromObject( $provider ); $provider->setConfig( $config ); @@ -53,7 +53,7 @@ class SessionProviderTest extends MediaWikiTestCase { public function testNewSessionInfo( $persistId, $persistUser, $ok ) { $manager = new SessionManager(); - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ 'canChangeUser', 'persistsSessionId' ] ) ->getMockForAbstractClass(); $provider->expects( $this->any() )->method( 'persistsSessionId' ) @@ -80,7 +80,7 @@ class SessionProviderTest extends MediaWikiTestCase { } public function testMergeMetadata() { - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider = $this->getMockBuilder( SessionProvider::class ) ->getMockForAbstractClass(); try { @@ -112,14 +112,14 @@ class SessionProviderTest extends MediaWikiTestCase { } public function testImmutableSessions() { - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ 'canChangeUser', 'persistsSessionId' ] ) ->getMockForAbstractClass(); $provider->expects( $this->any() )->method( 'canChangeUser' ) ->will( $this->returnValue( true ) ); $provider->preventSessionsForUser( 'Foo' ); - $provider = $this->getMockBuilder( 'MediaWiki\\Session\\SessionProvider' ) + $provider = $this->getMockBuilder( SessionProvider::class ) ->setMethods( [ 'canChangeUser', 'persistsSessionId' ] ) ->getMockForAbstractClass(); $provider->expects( $this->any() )->method( 'canChangeUser' ) @@ -142,7 +142,7 @@ class SessionProviderTest extends MediaWikiTestCase { 'SecretKey' => 'Shhh!', ] ); - $provider = $this->getMockForAbstractClass( 'MediaWiki\\Session\\SessionProvider', + $provider = $this->getMockForAbstractClass( SessionProvider::class, [], 'MockSessionProvider' ); $provider->setConfig( $config ); $priv = \TestingAccessWrapper::newFromObject( $provider ); @@ -172,7 +172,7 @@ class SessionProviderTest extends MediaWikiTestCase { } public function testDescribe() { - $provider = $this->getMockForAbstractClass( 'MediaWiki\\Session\\SessionProvider', + $provider = $this->getMockForAbstractClass( SessionProvider::class, [], 'MockSessionProvider' ); $this->assertSame( @@ -182,7 +182,7 @@ class SessionProviderTest extends MediaWikiTestCase { } public function testGetAllowedUserRights() { - $provider = $this->getMockForAbstractClass( 'MediaWiki\\Session\\SessionProvider' ); + $provider = $this->getMockForAbstractClass( SessionProvider::class ); $backend = TestUtils::getDummySessionBackend(); try { diff --git a/tests/phpunit/includes/session/SessionTest.php b/tests/phpunit/includes/session/SessionTest.php index a4727c4364..e87f41d977 100644 --- a/tests/phpunit/includes/session/SessionTest.php +++ b/tests/phpunit/includes/session/SessionTest.php @@ -37,7 +37,7 @@ class SessionTest extends MediaWikiTestCase { * @param bool $ret Whether the method returns a value */ public function testMethods( $m, $args, $index, $ret ) { - $mock = $this->getMock( 'MediaWiki\\Session\\DummySessionBackend', + $mock = $this->getMock( DummySessionBackend::class, [ $m, 'deregisterSession' ] ); $mock->expects( $this->once() )->method( 'deregisterSession' ) ->with( $this->identicalTo( 42 ) ); @@ -224,7 +224,7 @@ class SessionTest extends MediaWikiTestCase { $priv = \TestingAccessWrapper::newFromObject( $session ); $backend = $this->getMock( - 'MediaWiki\\Session\\DummySessionBackend', [ 'canSetUser', 'setUser', 'save' ] + DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] ); $backend->expects( $this->once() )->method( 'canSetUser' ) ->will( $this->returnValue( true ) ); @@ -239,7 +239,7 @@ class SessionTest extends MediaWikiTestCase { $this->assertTrue( $backend->dirty ); $backend = $this->getMock( - 'MediaWiki\\Session\\DummySessionBackend', [ 'canSetUser', 'setUser', 'save' ] + DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] ); $backend->data = []; $backend->expects( $this->once() )->method( 'canSetUser' ) @@ -254,7 +254,7 @@ class SessionTest extends MediaWikiTestCase { $this->assertFalse( $backend->dirty ); $backend = $this->getMock( - 'MediaWiki\\Session\\DummySessionBackend', [ 'canSetUser', 'setUser', 'save' ] + DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] ); $backend->expects( $this->once() )->method( 'canSetUser' ) ->will( $this->returnValue( false ) ); @@ -267,7 +267,7 @@ class SessionTest extends MediaWikiTestCase { } public function testTokens() { - $rc = new \ReflectionClass( 'MediaWiki\\Session\\Session' ); + $rc = new \ReflectionClass( Session::class ); if ( !method_exists( $rc, 'newInstanceWithoutConstructor' ) ) { $this->markTestSkipped( 'ReflectionClass::newInstanceWithoutConstructor isn\'t available' diff --git a/tests/phpunit/includes/session/TestUtils.php b/tests/phpunit/includes/session/TestUtils.php index 36175af26f..f1dc9e994b 100644 --- a/tests/phpunit/includes/session/TestUtils.php +++ b/tests/phpunit/includes/session/TestUtils.php @@ -18,15 +18,15 @@ class TestUtils { session_write_close(); $rInstance = new \ReflectionProperty( - 'MediaWiki\\Session\\SessionManager', 'instance' + SessionManager::class, 'instance' ); $rInstance->setAccessible( true ); $rGlobalSession = new \ReflectionProperty( - 'MediaWiki\\Session\\SessionManager', 'globalSession' + SessionManager::class, 'globalSession' ); $rGlobalSession->setAccessible( true ); $rGlobalSessionRequest = new \ReflectionProperty( - 'MediaWiki\\Session\\SessionManager', 'globalSessionRequest' + SessionManager::class, 'globalSessionRequest' ); $rGlobalSessionRequest->setAccessible( true ); @@ -62,7 +62,7 @@ class TestUtils { * fields necessary. */ public static function getDummySessionBackend() { - $rc = new \ReflectionClass( 'MediaWiki\\Session\\SessionBackend' ); + $rc = new \ReflectionClass( SessionBackend::class ); if ( !method_exists( $rc, 'newInstanceWithoutConstructor' ) ) { \PHPUnit_Framework_Assert::markTestSkipped( 'ReflectionClass::newInstanceWithoutConstructor isn\'t available' @@ -83,7 +83,7 @@ class TestUtils { * @return Session */ public static function getDummySession( $backend = null, $index = -1, $logger = null ) { - $rc = new \ReflectionClass( 'MediaWiki\\Session\\Session' ); + $rc = new \ReflectionClass( Session::class ); if ( !method_exists( $rc, 'newInstanceWithoutConstructor' ) ) { \PHPUnit_Framework_Assert::markTestSkipped( 'ReflectionClass::newInstanceWithoutConstructor isn\'t available' diff --git a/tests/phpunit/includes/session/TokenTest.php b/tests/phpunit/includes/session/TokenTest.php index 47b70aff3c..ca001f3654 100644 --- a/tests/phpunit/includes/session/TokenTest.php +++ b/tests/phpunit/includes/session/TokenTest.php @@ -11,7 +11,7 @@ use MediaWikiTestCase; class TokenTest extends MediaWikiTestCase { public function testBasics() { - $token = $this->getMockBuilder( 'MediaWiki\\Session\\Token' ) + $token = $this->getMockBuilder( Token::class ) ->setMethods( [ 'toStringAtTimestamp' ] ) ->setConstructorArgs( [ 'sekret', 'salty', true ] ) ->getMock(); diff --git a/tests/phpunit/includes/specials/SpecialEditWatchlistTest.php b/tests/phpunit/includes/specials/SpecialEditWatchlistTest.php new file mode 100644 index 0000000000..cd84d7990f --- /dev/null +++ b/tests/phpunit/includes/specials/SpecialEditWatchlistTest.php @@ -0,0 +1,50 @@ +setExpectedException( 'UserNotLoggedIn' ); + $this->executeSpecialPage(); + } + + public function testRootPage_displaysExplanationMessage() { + $user = new TestUser( __METHOD__ ); + list( $html, ) = $this->executeSpecialPage( '', null, 'qqx', $user->getUser() ); + $this->assertContains( '(watchlistedit-normal-explain)', $html ); + } + + public function testClearPage_hasClearButtonForm() { + $user = new TestUser( __METHOD__ ); + list( $html, ) = $this->executeSpecialPage( 'clear', null, 'qqx', $user->getUser() ); + $this->assertRegExp( + '/
/', + $html + ); + } + + public function testEditRawPage_hasTitlesBox() { + $user = new TestUser( __METHOD__ ); + list( $html, ) = $this->executeSpecialPage( 'raw', null, 'qqx', $user->getUser() ); + $this->assertContains( + '