From: jenkins-bot Date: Fri, 22 Mar 2019 00:14:45 +0000 (+0000) Subject: Merge "Title: Test the ->equals() method more thoughroughly" X-Git-Tag: 1.34.0-rc.0~2418 X-Git-Url: http://git.cyclocoop.org/%22.%28%24lien.?a=commitdiff_plain;h=4ab8dc680e016d9b33c7f16188c14bf11c008e42;hp=76617a777176ac1109791929c90bc054c69bcfd1;p=lhc%2Fweb%2Fwiklou.git Merge "Title: Test the ->equals() method more thoughroughly" --- diff --git a/.travis.yml b/.travis.yml index 9dc2ef7789..e4a173dce6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,10 +13,6 @@ language: php # - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176). dist: trusty -git: - depth: 3 - quiet: true - # Cache NPM and Composer directories # cache: diff --git a/RELEASE-NOTES-1.33 b/RELEASE-NOTES-1.33 index 27b1c71a05..10b1eaa605 100644 --- a/RELEASE-NOTES-1.33 +++ b/RELEASE-NOTES-1.33 @@ -1,69 +1,114 @@ -== MediaWiki 1.33 == += MediaWiki 1.33 = + +== MediaWiki 1.33.0-PRERELEASE == THIS IS NOT A RELEASE YET MediaWiki 1.33 is an alpha-quality branch and is not recommended for use in production. -=== Configuration changes in 1.33 === +== Upgrading notes for 1.33 == +1.33 has several database changes since 1.32, and will not work without schema +updates. Note that due to changes to some very large tables like the revision +table, the schema update may take quite long (minutes on a medium sized site, +many hours on a large site). -==== New configuration ==== -* $wgEnablePartialBlocks – This enables the Partial Blocks feature, which gives - accounts with block permissions the ability to block users, IPs, and IP ranges - from editing specific pages, while allowing them to edit the rest of the wiki. +Don't forget to always back up your database before upgrading! + +See the file UPGRADE for more detailed upgrade instructions, including +important information when upgrading from versions prior to 1.11. + +Some specific notes for MediaWiki 1.33 upgrades are below: -==== Changed configuration ==== * Some external link searches will not work correctly until update.php (or refreshExternallinksIndex.php) is run. These include searches for links using IP addresses, internationalized domain names, and possibly mailto links. -* (T193868) $wgChangeTagsSchemaMigrationStage — This temporary setting, added in - MediaWiki 1.32, now defaults to MIGRATION_NEW instead of MIGRATION_WRITE_BOTH. -* Special:ActiveUsers will no longer filter out users who became inactive since - the last time the active users query cache was updated. * If you ran migrateActors.php using an older version of MediaWiki and want to run your wiki with $wgActorTableSchemaMigrationStage SCHEMA_COMPAT_READ_OLD, note that log_search rows needed to find revision deletions by target user were incorrectly deleted. See T215464 for details. +* If revision deletions were performed when the wiki was configured with + $wgActorTableSchemaMigrationStage SCHEMA_COMPAT_WRITE_BOTH and without + migrateActors.php having been run, the log_search table may contain rows with + empty values for "target_author_actor" which will prevent log searches for + revision deletions by target user from finding those log entries. These rows + may be corrected by (re-)running migrateActors.php. + +For notes on 1.32.x and older releases, see HISTORY. + +=== Configuration changes for system administrators in 1.33 === +==== New configuration ==== +* $wgEnablePartialBlocks – This enables the Partial Blocks feature, which gives + accounts with block permissions the ability to block users, IPs, and IP ranges + from editing specific pages, while allowing them to edit the rest of the wiki. + It is a temporary setting for gradual enablement, current default to `false`, + and will be set to `true` and then removed once initial development completes. + +==== Changed configuration ==== +* $wgChangeTagsSchemaMigrationStage (T193868) — This temporary setting, added in + MediaWiki 1.32, now defaults to MIGRATION_NEW instead of MIGRATION_WRITE_BOTH. +* $wgPasswordPolicy – There is a new password policy to check that the account's + password is not in the large blacklist. This is enabled by default for the + built-in user groups bureaucrat, sysop, interface-admin, and bot. To configure + this for other user groups, set the `PasswordNotInLargeBlacklist` flag `true`. +* wgPasswordDefault – There is a new password type configuration using Argon2 + password hashing (which requires PHP 7.2 and above). It's designed to resist + timing attacks, and (on systems with PHP 7.3+) GPU hacking; if you configure + argon2 to be used, by default, it will automatically choose the best available + algorithm depending on which version of PHP you have available. To use this, + you can set `$wgPasswordDefault = 'argon2';`. ==== Removed configuration ==== -* (T199334) $wgTagStatisticsNewTable — This temporary setting, added in +* $wgTagStatisticsNewTable (T199334) — This temporary setting, added in MediaWiki 1.32, has now been removed. When loading Special:Tags, MediaWiki will now always use the `change_tag_def` instead of the `change_tag` table. -* MediaWiki now always tidies user output, and most related - configuration has been removed. Thus $wgUseTidy, $wgTidyBin, - $wgTidyConf, $wgTidyOpts, $wgTidyInternal, and $wgDebugTidy, all - deprecated since 1.26, have now all been removed. The $wgTidyConfig - setting remains only for Remex experimental features or debugging. -* $wgEnableParserCache, deprecated since 1.26, was removed. - If disabling the parser cache is still desirable, - set `$wgParserCacheType = CACHE_NONE;` instead. -* $wgCommentTableSchemaMigrationStage has been removed. Extension code finding - it unset should treat it as being MIGRATION_NEW. +* $wgUseTidy, $wgTidyBin, $wgTidyConf, $wgTidyOpts, $wgTidyInternal, and + $wgDebugTidy – These options, all deprecated since 1.26, have now all been + removed, as MediaWiki now always tidies user output. The $wgTidyConfig setting + remains only for experimental features and debugging, and should not be used. +* $wgEnableParserCache – This setting has been deprecated since 1.26, has now + been removed. If you still desire to disable the parser cache, instead you can + set `$wgParserCacheType = CACHE_NONE;`. +* $wgCommentTableSchemaMigrationStage – This temporary migration setting has now + been removed. Code finding it unset should treat it as being MIGRATION_NEW. * $wgAuth – This old setting, deprecated in 1.27, has been removed as part of the removal of AuthPlugin. - -=== New features in 1.33 === +* $wgSitesCacheFile – This configuration was introduced in 1.25 with the intent + to allow sites to configure a file in which to cache the SiteStore database + table, but it was never used. SiteStore already caches its information by + default using BagOStuff (e.g. Memcached or APC). +* $wgClockSkewFudge – This setting was used by User.php to let sites adjust by + how much MediaWiki would fudge when trying to minimize the chances of a + user.user_touched database update to the "current" timestamp being before the + value already there (e.g. due to clock skew between different servers). This + is no longer a problem, because the code now ensures the timestamp is always + higher than the previous one. The writes are guarded with CAS logic (check + and set), which prevents updates that would overlap. + +=== New user-facing features in 1.33 === * (T96041) __EXPECTUNUSEDCATEGORY__ on a category page causes the category to be hidden on Special:UnusedCategories. -* Add PasswordPolicy to check the password isn't in the large blacklist. -* The AuthManagerLoginAuthenticateAudit hook has a new parameter for - additional information about the authentication event. -* TextContent::getText() was introduced as a replacement for - Content::getNativeData() for text-based content models. * (T210814) SVGs are now by default displayed in wiki language on image pages. -* (T214706) LinksUpdate::getAddedExternalLinks() and - LinksUpdate::getRemovedExternalLinks() were introduced. -* Argon2 password hashing is now available, can be enabled via - $wgPasswordDefault = 'argon2'. It's designed to resist timing attacks - (requires PHP 7.2+) and GPU hacking (7.3+). * Special:CreateAccount now warns the user if their chosen username has to be normalized. * (T205040) Multilingual images are now be displayed in the current parse language where available. +* Special:ActiveUsers will no longer filter out users who became inactive since + the last time the active users query cache was updated. +* (T215675) RecentChange and ManualLogEntry implement new Taggable interface. +* (T215675) Added a hook, ManualLogEntryBeforePublish, to allow extensions + to modify (example: add tags) log entries. -=== External library changes in 1.33 === +=== New developer features in 1.33 === +* The AuthManagerLoginAuthenticateAudit hook has a new parameter for + additional information about the authentication event. +* TextContent::getText() was introduced as a replacement for + Content::getNativeData() for text-based content models. +* (T214706) LinksUpdate::getAddedExternalLinks() and + LinksUpdate::getRemovedExternalLinks() were introduced. +=== External library changes in 1.33 === ==== New external libraries ==== * Added wikimedia/password-blacklist 0.1.4. * Added guzzlehttp/guzzle 6.3.3. @@ -87,10 +132,13 @@ production. * Updated wikimedia/php-session-serializer from 1.0.6 to 1.0.7. ==== Removed external libraries ==== +* … === Bug fixes in 1.33 === * (T164211) Special:UserRights could sometimes fail with a "conflict detected" error when there weren't any conflicts. +* (T216029) Chrome redirects to Special:BadTitle after editing a section with + a non-Latin name on a page with non-Latin characters in title. === Action API changes in 1.33 === * (T198913) Added 'ApiOptions' hook. @@ -289,6 +337,8 @@ because of Phabricator reports. Use ParserOutput::allCacheVaryingOptions instead. * CdnCacheUpdate::newSimplePurge, deprecated in 1.27, has been removed. Use CdnCacheUpdate::newFromTitles() instead. +* Handling of multiple arguments by the Block constructor, deprecated in 1.26, + has been removed. === Deprecations in 1.33 === * The configuration option $wgUseESI has been deprecated, and is expected @@ -347,6 +397,11 @@ because of Phabricator reports. check block behaviour. * The api-feature-usage log channel now has log context. The text message is deprecated and will be removed in the future. +* The FileBasedSiteLookup class has been deprecated. For a cacheable SiteLookup + implementation, use CachingSiteStore instead. +* ManualLogEntry::setTags() is deprecated, use ManualLogEntry::addTags() + instead. The setTags() method was overriding the tags, addTags() doesn't + override, only adds new tags. === Other changes in 1.33 === * (T201747) Html::openElement() warns if given an element name with a space @@ -373,19 +428,6 @@ The supported versions are: * Oracle 9.0.1 or later * Microsoft SQL Server 2005 (9.00.1399) -== Upgrading == -1.33 has several database changes since 1.32, and will not work without schema -updates. Note that due to changes to some very large tables like the revision -table, the schema update may take quite long (minutes on a medium sized site, -many hours on a large site). - -Don't forget to always back up your database before upgrading! - -See the file UPGRADE for more detailed upgrade instructions, including -important information when upgrading from versions prior to 1.11. - -For notes on 1.32.x and older releases, see HISTORY. - == Online documentation == Documentation for both end-users and site administrators is available on MediaWiki.org, and is covered under the GNU Free Documentation License (except diff --git a/autoload.php b/autoload.php index bb4de22cce..4172ed3d5a 100644 --- a/autoload.php +++ b/autoload.php @@ -870,6 +870,7 @@ $wgAutoloadLocalClasses = [ 'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php', 'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php', 'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php', + 'MediaWiki\\ChangeTags\\Taggable' => __DIR__ . '/includes/changetags/Taggable.php', 'MediaWiki\\Config\\ConfigRepository' => __DIR__ . '/includes/config/ConfigRepository.php', 'MediaWiki\\DB\\PatchFileLocation' => __DIR__ . '/includes/db/PatchFileLocation.php', 'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php', @@ -1197,7 +1198,6 @@ $wgAutoloadLocalClasses = [ 'RebuildLocalisationCache' => __DIR__ . '/maintenance/rebuildLocalisationCache.php', 'RebuildMessages' => __DIR__ . '/maintenance/rebuildmessages.php', 'RebuildRecentchanges' => __DIR__ . '/maintenance/rebuildrecentchanges.php', - 'RebuildSitesCache' => __DIR__ . '/maintenance/rebuildSitesCache.php', 'RebuildTextIndex' => __DIR__ . '/maintenance/rebuildtextindex.php', 'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php', 'RecentChangesUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/RecentChangesUpdateJob.php', @@ -1215,7 +1215,6 @@ $wgAutoloadLocalClasses = [ 'RefreshImageMetadata' => __DIR__ . '/maintenance/refreshImageMetadata.php', 'RefreshLinks' => __DIR__ . '/maintenance/refreshLinks.php', 'RefreshLinksJob' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob.php', - 'RefreshSecondaryDataUpdate' => __DIR__ . '/includes/deferred/RefreshSecondaryDataUpdate.php', 'RegexlikeReplacer' => __DIR__ . '/includes/libs/replacers/RegexlikeReplacer.php', 'RemexStripTagHandler' => __DIR__ . '/includes/parser/RemexStripTagHandler.php', 'RemoveInvalidEmails' => __DIR__ . '/maintenance/removeInvalidEmails.php', @@ -1335,7 +1334,6 @@ $wgAutoloadLocalClasses = [ 'SiteStatsInit' => __DIR__ . '/includes/SiteStatsInit.php', 'SiteStatsUpdate' => __DIR__ . '/includes/deferred/SiteStatsUpdate.php', 'SiteStore' => __DIR__ . '/includes/site/SiteStore.php', - 'SitesCacheFileBuilder' => __DIR__ . '/includes/site/SitesCacheFileBuilder.php', 'Skin' => __DIR__ . '/includes/skins/Skin.php', 'SkinApi' => __DIR__ . '/includes/skins/SkinApi.php', 'SkinApiTemplate' => __DIR__ . '/includes/skins/SkinApiTemplate.php', diff --git a/docs/export-0.10.xsd b/docs/export-0.10.xsd index 9d5d49e08e..6291bfcd28 100644 --- a/docs/export-0.10.xsd +++ b/docs/export-0.10.xsd @@ -224,7 +224,7 @@ - + diff --git a/docs/hooks.txt b/docs/hooks.txt index 9e6ed10fc9..4ef680ab0c 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -2210,6 +2210,10 @@ ResourceLoaderGetConfigVars instead. Skin::makeVariablesScript $out: The OutputPage which called the hook, can be used to get the real title. +'ManualLogEntryBeforePublish': Allows to access or modify log entry just before it is +published. +$logEntry: ManualLogEntry object + 'MarkPatrolled': Before an edit is marked patrolled. $rcid: ID of the revision to be marked patrolled &$user: the user (object) marking the revision as patrolled diff --git a/docs/sitescache.txt b/docs/sitescache.txt deleted file mode 100644 index 13bf371d20..0000000000 --- a/docs/sitescache.txt +++ /dev/null @@ -1,42 +0,0 @@ -MediaWiki's SiteStore can be cached and stored in a flat file, -in a json format. If the SiteStore is frequently accessed, the -file cache may provide a performance benefit over a database -store, even with memcached in front of it. - -Configuration: - -File-based caching can be enabled by setting $wgSitesCacheFile -to the file path of the cache file. - -The file can then be generated with the rebuildSitesCache.php -maintenance script. - -Format: - -In the sites cache file, sites are listed in a key-value -map, with the key being the site's global id (e.g. "enwiki") -and a key-value map as the value. The site list is wrapped -with in a "sites" key. - -Example: - -"sites": { - "aawiktionary": { - "globalid": "aawiktionary", - "type": "mediawiki", - "group": "wiktionary", - "source": "local", - "language": "aa", - "localids": [], - "config": [], - "data": { - "paths": { - "file_path": "http:\/\/aa.wiktionary.org\/w\/$1", - "page_path": "http:\/\/aa.wiktionary.org\/wiki\/$1" - } - }, - "forward": false, - "internalid": 2666, - "identifiers": [] - } -} diff --git a/includes/Block.php b/includes/Block.php index 65408f63a9..0693650238 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -148,14 +148,6 @@ class Block { 'sitewide' => true, ]; - if ( func_num_args() > 1 || !is_array( $options ) ) { - $options = array_combine( - array_slice( array_keys( $defaults ), 0, func_num_args() ), - func_get_args() - ); - wfDeprecated( __METHOD__ . ' with multiple arguments', '1.26' ); - } - $options += $defaults; $this->setTarget( $options['address'] ); diff --git a/includes/ContentSecurityPolicy.php b/includes/ContentSecurityPolicy.php index 62160461c9..be598eae83 100644 --- a/includes/ContentSecurityPolicy.php +++ b/includes/ContentSecurityPolicy.php @@ -98,11 +98,14 @@ class ContentSecurityPolicy { * * @param int $reportOnly Either self::REPORT_ONLY_MODE or self::FULL_MODE * @return string Name of http header + * @throws UnexpectedValueException */ private function getHeaderName( $reportOnly ) { if ( $reportOnly === self::REPORT_ONLY_MODE ) { return 'Content-Security-Policy-Report-Only'; - } elseif ( $reportOnly === self::FULL_MODE ) { + } + + if ( $reportOnly === self::FULL_MODE ) { return 'Content-Security-Policy'; } throw new UnexpectedValueException( $reportOnly ); @@ -111,7 +114,8 @@ class ContentSecurityPolicy { /** * Determine what CSP policies to set for this page * - * @param array|bool $config Policy configuration (Either $wgCSPHeader or $wgCSPReportOnlyHeader) + * @param array|bool $policyConfig Policy configuration + * (Either $wgCSPHeader or $wgCSPReportOnlyHeader) * @param int $mode self::REPORT_ONLY_MODE, self::FULL_MODE * @return string Policy directives, or empty string for no policy. */ @@ -152,8 +156,8 @@ class ContentSecurityPolicy { } } // Note: default on if unspecified. - if ( ( !isset( $policyConfig['unsafeFallback'] ) - || $policyConfig['unsafeFallback'] ) + if ( !isset( $policyConfig['unsafeFallback'] ) + || $policyConfig['unsafeFallback'] ) { // unsafe-inline should be ignored on browsers // that support 'nonce-foo' sources. diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 4ec82edaf2..3afa593254 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -2677,14 +2677,6 @@ $wgSidebarCacheExpiry = 86400; */ $wgUseGzip = false; -/** - * Clock skew or the one-second resolution of time() can occasionally cause cache - * problems when the user requests two pages within a short period of time. This - * variable adds a given number of seconds to vulnerable timestamps, thereby giving - * a grace period. - */ -$wgClockSkewFudge = 5; - /** * Invalidate various caches when LocalSettings.php changes. This is equivalent * to setting $wgCacheEpoch to the modification time of LocalSettings.php, as @@ -3992,18 +3984,6 @@ $wgInterwikiFallbackSite = 'wiki'; /** @} */ # end of Interwiki caching settings. -/** - * @name SiteStore caching settings. - * @{ - */ - -/** - * Specify the file location for the Sites json cache file. - */ -$wgSitesCacheFile = false; - -/** @} */ # end of SiteStore caching settings. - /** * If local interwikis are set up which allow redirects, * set this regexp to restrict URLs which will be displayed @@ -4897,6 +4877,7 @@ $wgDefaultUserOptions = [ 'rows' => 25, // @deprecated since 1.29 No longer used in core 'showhiddencats' => 0, 'shownumberswatching' => 1, + 'showrollbackconfirmation' => 0, 'skin' => false, 'stubthreshold' => 0, 'thumbsize' => 5, @@ -8996,6 +8977,12 @@ $wgInterwikiPrefixDisplayTypes = []; */ $wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW; +/** + * The schema to use per default when generating XML dumps. This allows sites to control + * explicitly when to make breaking changes to their export and dump format. + */ +$wgXmlDumpSchemaVersion = XML_DUMP_SCHEMA_VERSION_10; + /** * Actor table schema migration stage. * @@ -9024,15 +9011,6 @@ $wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_OLD; */ $wgEnablePartialBlocks = false; -/** - * Enable confirmation prompt for rollback actions to prevent accidental rollbacks. - * May be disabled to reduce number of clicks needed to perform rollbacks. - * - * @since 1.33 - * @var bool - */ -$wgEnableRollbackConfirmationPrompt = true; - /** * Enable stats monitoring when Block Notices are displayed in different places around core * and extensions. @@ -9061,6 +9039,26 @@ $wgOriginTrials = []; */ $wgPriorityHints = false; +/** + * Enable Element Timing. + * + * @warning EXPERIMENTAL! + * + * @since 1.34 + * @var bool + */ +$wgElementTiming = false; + +/** + * Temporary option to show rollback confirmation user settings + * without activating the feature itself + * @see T217039 + * @since 1.33 + * @deprecated 1.33 + * @var bool + */ +$wgDisableRollbackConfirmationFeature = false; + /** * For really cool vim folding this needs to be at the end: * vim: foldmarker=@{,@} foldmethod=marker diff --git a/includes/Defines.php b/includes/Defines.php index 720e8d018d..5f98b443c8 100644 --- a/includes/Defines.php +++ b/includes/Defines.php @@ -317,3 +317,13 @@ define( 'MIGRATION_WRITE_BOTH', 0x10000000 | SCHEMA_COMPAT_READ_BOTH | SCHEMA_CO define( 'MIGRATION_WRITE_NEW', 0x20000000 | SCHEMA_COMPAT_READ_BOTH | SCHEMA_COMPAT_WRITE_NEW ); define( 'MIGRATION_NEW', 0x30000000 | SCHEMA_COMPAT_NEW ); /**@}*/ + +/**@{ + * XML dump schema versions, for use with XmlDumpWriter. + * See also the corresponding export-nnnn.xsd files in the docs directory, + * which are also listed at . + * Note that not all old schema versions are represented here, as several + * were already unsupported at the time these constants were introduced. + */ +define( 'XML_DUMP_SCHEMA_VERSION_10', '0.10' ); +/**@}*/ diff --git a/includes/EditPage.php b/includes/EditPage.php index 41238dff60..23cdc3b911 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -4557,7 +4557,10 @@ ERROR; return $wgParser->guessLegacySectionNameFromWikiText( $text ); } // Meanwhile, real browsers get real anchors - return $wgParser->guessSectionNameFromWikiText( $text ); + $name = $wgParser->guessSectionNameFromWikiText( $text ); + // With one little caveat: per T216029, fragments in HTTP redirects need to be urlencoded, + // otherwise Chrome double-escapes the rest of the URL. + return '#' . urlencode( mb_substr( $name, 1 ) ); } /** diff --git a/includes/Linker.php b/includes/Linker.php index 3e50ac64d0..7dc6541c5f 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -1768,6 +1768,20 @@ class Linker { $inner = $context->msg( 'brackets' )->rawParams( $inner )->escaped(); } + /** + * FIXME + * Remove all references to DisableRollbackConfirmationFeature + * after release of rollback feature. See T199534 + */ + if ( !MediaWikiServices::getInstance() + ->getMainConfig()->get( 'DisableRollbackConfirmationFeature' ) && + $context->getUser()->getBoolOption( 'showrollbackconfirmation' ) + ) { + $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); + $stats->increment( 'rollbackconfirmation.event.load' ); + $context->getOutput()->addModules( 'mediawiki.page.rollback.confirmation' ); + } + return '' . $inner . ''; } @@ -1861,20 +1875,25 @@ class Linker { } $title = $rev->getTitle(); + $query = [ 'action' => 'rollback', 'from' => $rev->getUserText(), 'token' => $context->getUser()->getEditToken( 'rollback' ), ]; + $attrs = [ 'data-mw' => 'interface', 'title' => $context->msg( 'tooltip-rollback' )->text(), + 'data-rollback-count' => (int)$editCount ]; + $options = [ 'known', 'noclasses' ]; if ( $context->getRequest()->getBool( 'bot' ) ) { + //T17999 + $query['hidediff'] = '1'; $query['bot'] = '1'; - $query['hidediff'] = '1'; // T17999 } $disableRollbackEditCount = false; diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 732e363261..cb90ccf7b7 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1145,6 +1145,20 @@ class OutputPage extends ContextSource { } } + /** + * Return effective list of advertised feed types + * @see addFeedLink() + * + * @return array Array of feed type names ( 'rss', 'atom' ) + */ + protected function getAdvertisedFeedTypes() { + if ( $this->getConfig()->get( 'Feed' ) ) { + return $this->getConfig()->get( 'AdvertisedFeedTypes' ); + } else { + return []; + } + } + /** * Add default feeds to the page header * This is mainly kept for backward compatibility, see OutputPage::addFeedLink() @@ -1157,7 +1171,7 @@ class OutputPage extends ContextSource { public function setFeedAppendQuery( $val ) { $this->mFeedLinks = []; - foreach ( $this->getConfig()->get( 'AdvertisedFeedTypes' ) as $type ) { + foreach ( $this->getAdvertisedFeedTypes() as $type ) { $query = "feed=$type"; if ( is_string( $val ) ) { $query .= '&' . $val; @@ -1173,7 +1187,7 @@ class OutputPage extends ContextSource { * @param string $href URL */ public function addFeedLink( $format, $href ) { - if ( in_array( $format, $this->getConfig()->get( 'AdvertisedFeedTypes' ) ) ) { + if ( in_array( $format, $this->getAdvertisedFeedTypes() ) ) { $this->mFeedLinks[$format] = $href; } } @@ -3737,8 +3751,9 @@ class OutputPage extends ContextSource { # or "Breaking news" one). For this, we see if $wgOverrideSiteFeed is defined. # If so, use it instead. $sitename = $config->get( 'Sitename' ); - if ( $config->get( 'OverrideSiteFeed' ) ) { - foreach ( $config->get( 'OverrideSiteFeed' ) as $type => $feedUrl ) { + $overrideSiteFeed = $config->get( 'OverrideSiteFeed' ); + if ( $overrideSiteFeed ) { + foreach ( $overrideSiteFeed as $type => $feedUrl ) { // Note, this->feedLink escapes the url. $feedLinks[] = $this->feedLink( $type, @@ -3748,7 +3763,7 @@ class OutputPage extends ContextSource { } } elseif ( !$this->getTitle()->isSpecial( 'Recentchanges' ) ) { $rctitle = SpecialPage::getTitleFor( 'Recentchanges' ); - foreach ( $config->get( 'AdvertisedFeedTypes' ) as $format ) { + foreach ( $this->getAdvertisedFeedTypes() as $format ) { $feedLinks[] = $this->feedLink( $format, $rctitle->getLocalURL( [ 'feed' => $format ] ), diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php index 0e18e46a3b..7972a1ebe4 100644 --- a/includes/ProtectionForm.php +++ b/includes/ProtectionForm.php @@ -623,9 +623,8 @@ class ProtectionForm { * Show protection long extracts for this page * * @param OutputPage $out - * @private */ - function showLogExtract( OutputPage $out ) { + private function showLogExtract( OutputPage $out ) { # Show relevant lines from the protection log: $protectLogPage = new LogPage( 'protect' ); $out->addHTML( Xml::element( 'h2', null, $protectLogPage->getName()->text() ) ); diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index e5f891e312..12e782d34f 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -489,14 +489,10 @@ return [ }, 'SiteLookup' => function ( MediaWikiServices $services ) : SiteLookup { - $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' ); - - if ( $cacheFile !== false ) { - return new FileBasedSiteLookup( $cacheFile ); - } else { - // Use the default SiteStore as the SiteLookup implementation for now - return $services->getSiteStore(); - } + // Use SiteStore as the SiteLookup as well. This was originally separated + // to allow for a cacheable read-only interface (using FileBasedSiteLookup), + // but this was never used. SiteStore has caching (see below). + return $services->getSiteStore(); }, 'SiteStore' => function ( MediaWikiServices $services ) : SiteStore { diff --git a/includes/Storage/DerivedPageDataUpdater.php b/includes/Storage/DerivedPageDataUpdater.php index 8dedc70211..9ce12b4b13 100644 --- a/includes/Storage/DerivedPageDataUpdater.php +++ b/includes/Storage/DerivedPageDataUpdater.php @@ -24,7 +24,6 @@ namespace MediaWiki\Storage; use ApiStashEdit; use CategoryMembershipChangeJob; -use RefreshSecondaryDataUpdate; use Content; use ContentHandler; use DataUpdate; @@ -1591,31 +1590,14 @@ class DerivedPageDataUpdater implements IDBAccessObject { $update->setRevision( $legacyRevision ); $update->setTriggeringUser( $triggeringUser ); } - } - - if ( $options['defer'] === false ) { - foreach ( $updates as $update ) { - if ( $update instanceof DataUpdate && $options['transactionTicket'] !== null ) { + if ( $options['defer'] === false ) { + if ( $options['transactionTicket'] !== null ) { $update->setTransactionTicket( $options['transactionTicket'] ); } $update->doUpdate(); + } else { + DeferredUpdates::addUpdate( $update, $options['defer'] ); } - } else { - $cacheTime = $this->getCanonicalParserOutput()->getCacheTime(); - // Bundle all of the data updates into a single deferred update wrapper so that - // any failure will cause at most one refreshLinks job to be enqueued by - // DeferredUpdates::doUpdates(). This is hard to do when there are many separate - // updates that are not defined as being related. - $update = new RefreshSecondaryDataUpdate( - $this->wikiPage, - $updates, - $options, - $cacheTime, - $this->loadbalancerFactory->getLocalDomainID() - ); - $update->setRevision( $legacyRevision ); - $update->setTriggeringUser( $triggeringUser ); - DeferredUpdates::addUpdate( $update, $options['defer'] ); } } diff --git a/includes/Storage/NameTableStore.php b/includes/Storage/NameTableStore.php index 27194ab219..3016e992e7 100644 --- a/includes/Storage/NameTableStore.php +++ b/includes/Storage/NameTableStore.php @@ -345,10 +345,10 @@ class NameTableStore { /** * Reap the WANCache entry for this table. * - * @param callable $purgeCallback callback to 'purge' the WAN cache + * @param callable $purgeCallback Callback to 'purge' the WAN cache */ private function purgeWANCache( $purgeCallback ) { - // If the LB has no DB changes don't both with onTransactionPreCommitOrIdle + // If the LB has no DB changes don't bother with onTransactionPreCommitOrIdle if ( !$this->loadBalancer->hasOrMadeRecentMasterChanges() ) { $purgeCallback(); return; diff --git a/includes/Storage/SqlBlobStore.php b/includes/Storage/SqlBlobStore.php index a5c5985212..82410cc5b9 100644 --- a/includes/Storage/SqlBlobStore.php +++ b/includes/Storage/SqlBlobStore.php @@ -606,12 +606,14 @@ class SqlBlobStore implements IDBAccessObject, BlobStore { /** * Splits a blob address into three parts: the schema, the ID, and parameters/flags. * + * @since 1.33 + * * @param string $address * * @throws InvalidArgumentException * @return array [ $schema, $id, $parameters ], with $parameters being an assoc array. */ - private static function splitBlobAddress( $address ) { + public static function splitBlobAddress( $address ) { if ( !preg_match( '/^(\w+):(\w+)(\?(.*))?$/', $address, $m ) ) { throw new InvalidArgumentException( "Bad blob address: $address" ); } diff --git a/includes/Title.php b/includes/Title.php index 88a7efb8df..d8aeb6293c 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -3342,12 +3342,17 @@ class Title implements LinkTarget, IDBAccessObject { $cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); $rows = $cache->getWithSetCallback( // Page protections always leave a new null revision - $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ), + $cache->makeKey( 'page-restrictions', 'v1', $id, $this->getLatestRevID() ), $cache::TTL_DAY, function ( $curValue, &$ttl, array &$setOpts ) use ( $loadRestrictionsFromDb ) { $dbr = wfGetDB( DB_REPLICA ); $setOpts += Database::getCacheSetOptions( $dbr ); + $lb = MediaWikiServices::getInstance()->getDBLoadBalancer(); + if ( $lb->hasOrMadeRecentMasterChanges() ) { + // @TODO: cleanup Title cache and caller assumption mess in general + $ttl = WANObjectCache::TTL_UNCACHEABLE; + } return $loadRestrictionsFromDb( $dbr ); } diff --git a/includes/WebRequest.php b/includes/WebRequest.php index e5cdda65d4..d5b081e624 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -387,12 +387,10 @@ class WebRequest { $name = strtr( $name, '.', '_' ); if ( isset( $arr[$name] ) ) { $data = $arr[$name]; - if ( isset( $_GET[$name] ) && !is_array( $data ) ) { + if ( isset( $_GET[$name] ) && is_string( $data ) ) { # Check for alternate/legacy character encoding. $contLang = MediaWikiServices::getInstance()->getContentLanguage(); - if ( $contLang ) { - $data = $contLang->checkTitleEncoding( $data ); - } + $data = $contLang->checkTitleEncoding( $data ); } $data = $this->normalizeUnicode( $data ); return $data; diff --git a/includes/actions/RollbackAction.php b/includes/actions/RollbackAction.php index 03a5bc840a..0e86fda81a 100644 --- a/includes/actions/RollbackAction.php +++ b/includes/actions/RollbackAction.php @@ -25,7 +25,7 @@ * * @ingroup Actions */ -class RollbackAction extends FormlessAction { +class RollbackAction extends FormAction { public function getName() { return 'rollback'; @@ -35,21 +35,67 @@ class RollbackAction extends FormlessAction { return 'rollback'; } - /** - * Temporarily unused message keys due to T88044/T136375: - * - confirm-rollback-top - * - confirm-rollback-button - * - rollbackfailed - * - rollback-missingparam - * - rollback-success-notify - */ + protected function usesOOUI() { + return true; + } + + protected function getDescription() { + return ''; + } + + public function doesWrites() { + return true; + } + + public function onSuccess() { + return false; + } + + public function onSubmit( $data ) { + return false; + } + + protected function alterForm( HTMLForm $form ) { + $form->setWrapperLegendMsg( 'confirm-rollback-top' ); + $form->setSubmitTextMsg( 'confirm-rollback-button' ); + $form->setTokenSalt( 'rollback' ); + + $from = $this->getRequest()->getVal( 'from' ); + if ( $from === null ) { + throw new BadRequestError( 'rollbackfailed', 'rollback-missingparam' ); + } + foreach ( [ 'from', 'bot', 'hidediff', 'summary', 'token' ] as $param ) { + $val = $this->getRequest()->getVal( $param ); + if ( $val !== null ) { + $form->addHiddenField( $param, $val ); + } + } + } /** + * @throws ConfigException * @throws ErrorPageError + * @throws ReadOnlyError + * @throws ThrottledError */ - public function onView() { - // TODO: use $this->useTransactionalTimeLimit(); when POST only - wfTransactionalTimeLimit(); + public function show() { + /** + * FIXME + * Remove temporary check of DisableRollbackConfirmationFeature + * after release of rollback feature. See T199534 + */ + $config = \MediaWiki\MediaWikiServices::getInstance()->getMainConfig(); + if ( $config->get( 'DisableRollbackConfirmationFeature' ) == true || + $this->getUser()->getOption( 'showrollbackconfirmation' ) == false || + $this->getRequest()->wasPosted() ) { + $this->handleRollbackRequest(); + } else { + $this->showRollbackConfirmationForm(); + } + } + + public function handleRollbackRequest() { + $this->enableTransactionalTimelimit(); $request = $this->getRequest(); $user = $this->getUser(); @@ -69,15 +115,6 @@ class RollbackAction extends FormlessAction { ] ); } - // @TODO: remove this hack once rollback uses POST (T88044) - $fname = __METHOD__; - $trxLimits = $this->context->getConfig()->get( 'TrxProfilerLimits' ); - $trxProfiler = Profiler::instance()->getTransactionProfiler(); - $trxProfiler->redefineExpectations( $trxLimits['POST'], $fname ); - DeferredUpdates::addCallableUpdate( function () use ( $trxProfiler, $trxLimits, $fname ) { - $trxProfiler->redefineExpectations( $trxLimits['PostSend-POST'], $fname ); - } ); - $data = null; $errors = $this->page->doRollback( $from, @@ -92,9 +129,7 @@ class RollbackAction extends FormlessAction { throw new ThrottledError; } - if ( isset( $errors[0][0] ) && - ( $errors[0][0] == 'alreadyrolled' || $errors[0][0] == 'cantrollback' ) - ) { + if ( $this->hasRollbackRelatedErrors( $errors ) ) { $this->getOutput()->setPageTitle( $this->msg( 'rollbackfailed' ) ); $errArray = $errors[0]; $errMsg = array_shift( $errArray ); @@ -166,11 +201,51 @@ class RollbackAction extends FormlessAction { } } - protected function getDescription() { - return ''; + /** + * Enables transactional time limit for POST and GET requests to RollbackAction + * @throws ConfigException + */ + private function enableTransactionalTimelimit() { + // If Rollbacks are made POST-only, use $this->useTransactionalTimeLimit() + wfTransactionalTimeLimit(); + if ( !$this->getRequest()->wasPosted() ) { + /** + * We apply the higher POST limits on GET requests + * to prevent logstash.wikimedia.org from being spammed + */ + $fname = __METHOD__; + $trxLimits = $this->context->getConfig()->get( 'TrxProfilerLimits' ); + $trxProfiler = Profiler::instance()->getTransactionProfiler(); + $trxProfiler->redefineExpectations( $trxLimits['POST'], $fname ); + DeferredUpdates::addCallableUpdate( function () use ( $trxProfiler, $trxLimits, $fname + ) { + $trxProfiler->redefineExpectations( $trxLimits['PostSend-POST'], $fname ); + } ); + } } - public function doesWrites() { - return true; + private function showRollbackConfirmationForm() { + $form = $this->getForm(); + if ( $form->show() ) { + $this->onSuccess(); + } + } + + protected function getFormFields() { + return [ + 'intro' => [ + 'type' => 'info', + 'vertical-label' => true, + 'raw' => true, + 'default' => $this->msg( 'confirm-rollback-bottom' )->parse() + ] + ]; + } + + private function hasRollbackRelatedErrors( array $errors ) { + return isset( $errors[0][0] ) && + ( $errors[0][0] == 'alreadyrolled' || + $errors[0][0] == 'cantrollback' + ); } } diff --git a/includes/api/ApiQueryUserContribs.php b/includes/api/ApiQueryUserContribs.php index 7e548abce5..5b178b7478 100644 --- a/includes/api/ApiQueryUserContribs.php +++ b/includes/api/ApiQueryUserContribs.php @@ -525,7 +525,6 @@ class ApiQueryUserContribs extends ApiQueryBase { if ( $this->fld_ids ) { $vals['pageid'] = (int)$row->rev_page; $vals['revid'] = (int)$row->rev_id; - // $vals['textid'] = (int)$row->rev_text_id; // todo: Should this field be exposed? if ( !is_null( $row->rev_parent_id ) ) { $vals['parentid'] = (int)$row->rev_parent_id; diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php index c9ebfa88cc..ba4c6e8321 100644 --- a/includes/api/ApiSetNotificationTimestamp.php +++ b/includes/api/ApiSetNotificationTimestamp.php @@ -108,14 +108,7 @@ class ApiSetNotificationTimestamp extends ApiBase { $result = []; if ( $params['entirewatchlist'] ) { // Entire watchlist mode: Just update the thing and return a success indicator - if ( is_null( $timestamp ) ) { - $watchedItemStore->resetAllNotificationTimestampsForUser( $user ); - } else { - $watchedItemStore->setNotificationTimestampsForUser( - $user, - $timestamp - ); - } + $watchedItemStore->resetAllNotificationTimestampsForUser( $user, $timestamp ); $result['notificationtimestamp'] = is_null( $timestamp ) ? '' diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index 2c5b583f3b..12ecd7411c 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -542,7 +542,7 @@ class ApiUpload extends ApiBase { } // Check blocks - if ( $user->isBlocked() ) { + if ( $user->isBlockedFromUpload() ) { $this->dieBlocked( $user->getBlock() ); } diff --git a/includes/api/i18n/cs.json b/includes/api/i18n/cs.json index dd690049cf..91fecc125f 100644 --- a/includes/api/i18n/cs.json +++ b/includes/api/i18n/cs.json @@ -12,7 +12,8 @@ "LordMsz", "Dvorapa", "Matěj Suchánek", - "Ilimanaq29" + "Ilimanaq29", + "Patriccck" ] }, "apihelp-main-extended-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|Otázky a odpovědi]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
\nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n

Testování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].

", @@ -285,6 +286,7 @@ "apierror-blocked": "Byla vám zablokována možnost editace.", "apierror-mustbeloggedin": "Abyste mohli $1, musíte být přihlášeni.", "apierror-nosuchsection-what": "$2 neobsahuje sekci $1.", + "apierror-readonly": "Wiki je právě v módu pro čtení a nelze ji editovat.", "apierror-sectionsnotsupported-what": "$1 nepodporuje sekce.", "apierror-timeout": "Server neodpověděl v očekávaném čase.", "api-credits-header": "Zásluhy", diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index 4cad07ffcc..36fb60b360 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -307,7 +307,7 @@ "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.", "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.", "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.", - "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <head> der Seite zurück.", + "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten doctype, offenes <html>, das Element <head> und offenes <body> der Seite aus.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.", "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.", @@ -861,10 +861,13 @@ "apihelp-query+recentchanges-paramvalue-prop-title": "Ergänzt den Seitentitel der Bearbeitung.", "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "Markiert kontrollierbare Bearbeitungen als automatisch kontrolliert oder nicht.", "apihelp-query+recentchanges-paramvalue-prop-tags": "Listet Markierungen für den Eintrag auf.", + "apihelp-query+recentchanges-param-limit": "Wie viele Änderungen insgesamt zurückgegeben werden sollen.", + "apihelp-query+recentchanges-param-type": "Welche Typen von Änderungen angezeigt werden sollen.", "apihelp-query+recentchanges-example-simple": "Listet die letzten Änderungen auf.", "apihelp-query+redirects-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+redirects-paramvalue-prop-pageid": "Seitenkennung einer jeden Weiterleitung.", "apihelp-query+redirects-paramvalue-prop-title": "Titel einer jeden Weiterleitung.", + "apihelp-query+redirects-paramvalue-prop-fragment": "Teil einer jeden Weiterleitung, falls vorhanden.", "apihelp-query+redirects-param-namespace": "Schließt nur Seiten in diesen Namensräumen ein.", "apihelp-query+redirects-param-limit": "Wie viele Weiterleitungen zurückgegeben werden sollen.", "apihelp-query+revisions-summary": "Ruft Informationen zur Version ab.", @@ -881,6 +884,7 @@ "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-Prüfsumme (Basis 16) der Version.", "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (Basis 16) eines jeden Versionsschlitzes.", "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung eines jeden Versionsschlitzes.", + "apihelp-query+revisions+base-paramvalue-prop-comment": "Kommentar des Benutzers für die Version.", "apihelp-query+revisions+base-paramvalue-prop-content": "Inhalt eines jeden Versionsschlitzes.", "apihelp-query+revisions+base-paramvalue-prop-tags": "Markierungen für die Version.", "apihelp-query+revisions+base-paramvalue-prop-roles": "Die Liste enthält Schlitzregeln, die in der Version vorhanden sind.", @@ -891,6 +895,7 @@ "apihelp-query+search-param-qiprofile": "Zu verwendendes anfrageunabhängiges Profil (wirkt sich auf den Ranking-Algorithmus aus).", "apihelp-query+search-paramvalue-prop-wordcount": "Ergänzt den Wortzähler der Seite.", "apihelp-query+search-paramvalue-prop-extensiondata": "Ergänzt zusätzliche von Erweiterungen erzeugte Daten.", + "apihelp-query+search-paramvalue-prop-score": "Ignoriert.", "apihelp-query+search-paramvalue-prop-hasrelated": "Ignoriert.", "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.", "apihelp-query+search-param-sort": "Legt die Sortierreihenfolge der zurückgegebenen Ergebnisse fest.", @@ -914,6 +919,7 @@ "apihelp-query+tokens-param-type": "Typen der Token, die abgerufen werden sollen.", "apihelp-query+transcludedin-param-prop": "Zurückzugebende Eigenschaften:", "apihelp-query+transcludedin-paramvalue-prop-pageid": "Seitenkennung jeder Seite.", + "apihelp-query+transcludedin-paramvalue-prop-title": "Titel jeder Seite.", "apihelp-query+usercontribs-summary": "Alle Bearbeitungen von einem Benutzer abrufen.", "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.", "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.", @@ -986,6 +992,7 @@ "apihelp-setpagelanguage-param-tags": "Auf den Logbucheintrag anzuwendende Änderungsmarkierungen, die sich aus dieser Aktion ergeben.", "apihelp-setpagelanguage-example-language": "Ändert die Sprache von Hauptseite auf Baskisch.", "apihelp-setpagelanguage-example-default": "Ändert die Sprache der Seite mit der Kennung 123 auf die Standardinhaltssprache des Wikis.", + "apihelp-stashedit-param-title": "Titel der Seite, die bearbeitet werden soll.", "apihelp-stashedit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.", "apihelp-stashedit-param-text": "Seiteninhalt.", "apihelp-stashedit-param-stashedtexthash": "Stattdessen zu verwendende Prüfsumme des Seiteninhalts von einem vorherigen Speicher.", diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index 25df749465..f5cdddbb09 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -371,7 +371,7 @@ "apihelp-parse-paramvalue-prop-revid": "Adds the revision ID of the parsed page.", "apihelp-parse-paramvalue-prop-displaytitle": "Adds the title of the parsed wikitext.", "apihelp-parse-paramvalue-prop-headitems": "Gives items to put in the <head> of the page.", - "apihelp-parse-paramvalue-prop-headhtml": "Gives parsed <head> of the page.", + "apihelp-parse-paramvalue-prop-headhtml": "Gives parsed doctype, opening <html>, <head> element and opening <body> of the page.", "apihelp-parse-paramvalue-prop-modules": "Gives the ResourceLoader modules used on the page. To load, use mw.loader.using(). Either jsconfigvars or encodedjsconfigvars must be requested jointly with modules.", "apihelp-parse-paramvalue-prop-jsconfigvars": "Gives the JavaScript configuration variables specific to the page. To apply, use mw.config.set().", "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gives the JavaScript configuration variables specific to the page as a JSON string.", diff --git a/includes/api/i18n/et.json b/includes/api/i18n/et.json index 64107fc0e7..30c73cea18 100644 --- a/includes/api/i18n/et.json +++ b/includes/api/i18n/et.json @@ -4,6 +4,135 @@ "Pikne" ] }, + "apihelp-main-extended-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentatsioon]]\n* [[mw:Special:MyLanguage/API:FAQ|KKK]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Postiloend]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API teadaanded]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Vead ja taotlused]\n
\nOlek: MediaWiki API on kasutusküps ja stabiilne liides, millel on olemas tugi ja mida täiustatakse aktiivselt. Püüame seda küll vältida, aga mõnikord võib olla vajalik teha muudatusi, mille järel liides ei toimi enam varasemal kujul. Telli postiloend [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce], et saada teavitusi uuenduste kohta.\n\nVigased päringud: Kui API-le saadetakse vigane päring, saadetakse HTTP päis võtmega \"MediaWiki-API-Error\" ning päisele ja tagastatavale veakoodile määratakse sama väärtus. Täpsemalt loe dokumentatsioonist: [[mw:Special:MyLanguage/API:Errors_and_warnings|API: veateated ja hoiatused]].\n\n

Katsetamine: Et API päringuid lihtsamini katsetada, saad kasutada lehekülge [[Special:ApiSandbox]].

", + "apihelp-main-param-action": "Sooritatav toiming.", + "apihelp-main-param-format": "Väljundi vorming.", + "apihelp-compare-param-prop": "Millised teabe elemendid hankida.", + "apihelp-edit-param-bot": "Märgi see muudatus robotimuudatuseks.", + "apihelp-expandtemplates-param-prop": "Millised teabe elemendid hankida.\n\nPane tähele, et kui väärtusi pole valitud, siis sisaldab tulemus vikiteksti, aga väljund on ebasoovitatavas vormingus.", + "apihelp-feedcontributions-param-feedformat": "Voo väljund.", + "apihelp-feedcontributions-param-user": "Milliste kasutajate kaastöö hankida.", + "apihelp-feedcontributions-param-namespace": "Millise nimeruumi järgi kaastöö filtreerida.", + "apihelp-feedrecentchanges-param-feedformat": "Voo väljund.", + "apihelp-feedwatchlist-param-feedformat": "Voo väljund.", + "apihelp-help-param-helpformat": "Abiväljundi vorming.", + "apihelp-help-example-main": "Põhimooduli abi.", + "apihelp-opensearch-param-format": "Väljundi vorming.", + "apihelp-parse-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query-param-prop": "Millised atribuudid päritavate lehekülgede kohta hankida.", + "apihelp-query-param-list": "Millised loendid hankida.", + "apihelp-query-param-meta": "Millised metaandmed hankida.", + "apihelp-query+allcategories-summary": "Loetle kõik kategooriad.", + "apihelp-query+allcategories-param-from": "Kategooria, millest alates loetleda.", + "apihelp-query+allcategories-param-to": "Kategooria, milleni loetleda.", + "apihelp-query+allcategories-param-dir": "Järjestuse suund.", + "apihelp-query+allcategories-param-limit": "Kui palju kategooriaid tagastada.", + "apihelp-query+allcategories-param-prop": "Millised atribuudid hankida:", + "apihelp-query+alldeletedrevisions-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+alldeletedrevisions-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+alldeletedrevisions-param-tag": "Loetle ainult redaktsioonid, mille küljes on see märgis.", + "apihelp-query+alldeletedrevisions-param-excludeuser": "Ära loetle selle kasutaja redaktsioone.", + "apihelp-query+alldeletedrevisions-param-namespace": "Loetle ainult leheküljed selles nimeruumis.", + "apihelp-query+allfileusages-param-from": "Faili pealkiri, millest alates loetleda.", + "apihelp-query+allfileusages-param-to": "Faili pealkiri, milleni loetleda.", + "apihelp-query+allfileusages-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+allfileusages-param-limit": "Kui palju üksusi kokku tagastada.", + "apihelp-query+allfileusages-param-dir": "Järjestuse suund.", + "apihelp-query+allimages-summary": "Loetle kõik pildid järjestatult.", + "apihelp-query+allimages-param-dir": "Järjestuse suund.", + "apihelp-query+allimages-param-from": "Pildi pealkiri, millest alates loetleda. Saab kasutada ainult parameetriga $1sort=name.", + "apihelp-query+allimages-param-to": "Pildi pealkiri, milleni loetleda. Saab kasutada ainult parameetriga $1sort=name.", + "apihelp-query+allimages-param-start": "Ajatempel, millest alates loetleda. Saab kasutada ainult parameetriga $1sort=timestamp.", + "apihelp-query+allimages-param-end": "Ajatempel, milleni loetleda. Saab kasutada ainult parameetriga $1sort=timestamp.", + "apihelp-query+allimages-param-limit": "Kui palju pilte kokku tagastada.", + "apihelp-query+alllinks-summary": "Loetle kõik lingid, mis viitavad teatud nimeruumi.", + "apihelp-query+alllinks-param-from": "Lingi pealkiri, millest alates loetleda.", + "apihelp-query+alllinks-param-to": "Lingi pealkiri, milleni loetleda.", + "apihelp-query+alllinks-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+alllinks-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+alllinks-param-limit": "Kui palju üksusi kokku tagastada.", + "apihelp-query+alllinks-param-dir": "Järjestuse suund.", + "apihelp-query+allmessages-param-prop": "Millised atribuudid hankida.", + "apihelp-query+allpages-summary": "Loetle kõik leheküljed järjestatult teatud nimeruumis.", + "apihelp-query+allpages-param-from": "Lehekülje pealkiri, millest alates loetleda.", + "apihelp-query+allpages-param-to": "Lehekülje pealkiri, milleni loetleda.", + "apihelp-query+allpages-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+allpages-param-filterredir": "Millised leheküljed loetleda.", + "apihelp-query+allpages-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+allpages-param-dir": "Järjestuse suund.", + "apihelp-query+allredirects-param-from": "Ümbersuunamise pealkiri, millest alates loetleda.", + "apihelp-query+allredirects-param-to": "Ümbersuunamise pealkiri, milleni loetleda.", + "apihelp-query+allredirects-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+allredirects-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+allredirects-param-limit": "Kui palju üksusi kokku tagastada.", + "apihelp-query+allredirects-param-dir": "Järjestuse suund.", + "apihelp-query+allrevisions-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+allrevisions-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+allrevisions-param-user": "Loetle ainult selle kasutaja redaktsioonid.", + "apihelp-query+allrevisions-param-excludeuser": "Ära loetle selle kasutaja redaktsioone.", + "apihelp-query+allrevisions-param-namespace": "Loetle ainult leheküljed selles nimeruumis.", + "apihelp-query+mystashedfiles-param-prop": "Millised atribuudid failide kohta hankida.", + "apihelp-query+mystashedfiles-param-limit": "Kui palju faile hankida.", + "apihelp-query+alltransclusions-param-from": "Mallina kasutatava lehekülje pealkiri, millest alates loetleda.", + "apihelp-query+alltransclusions-param-to": "Mallina kasutatava lehekülje pealkiri, milleni loetleda.", + "apihelp-query+alltransclusions-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+alltransclusions-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+alltransclusions-param-limit": "Kui palju üksusi kokku tagastada.", + "apihelp-query+alltransclusions-param-dir": "Järjestuse suund.", + "apihelp-query+allusers-summary": "Loetle kõik registreeritud kasutajad.", + "apihelp-query+allusers-param-from": "Kasutajanimi, millest alates loetleda.", + "apihelp-query+allusers-param-to": "Kasutajanimi, milleni loetleda.", + "apihelp-query+allusers-param-dir": "Järjestuse suund.", + "apihelp-query+allusers-param-excludegroup": "Välja arvatud kasutajad, kes on neis rühmades.", + "apihelp-query+allusers-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+allusers-param-limit": "Kui palju kasutajanimesid kokku tagastada.", + "apihelp-query+allusers-param-witheditsonly": "Loetle ainult kasutajad, kes on teinud muudatusi.", + "apihelp-query+backlinks-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+backlinks-param-dir": "Järjestuse suund.", + "apihelp-query+backlinks-param-limit": "Kui palju lehekülgi kokku tagastada. Kui $1redirect on lubatud, siis rakendub piirang mõlemal tasemel eraldi (see tähendab, et tagastada võidakse kuni 2 × $1limit tulemust).", + "apihelp-query+blocks-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+blocks-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+blocks-param-prop": "Millised atribuudid hankida:", + "apihelp-query+blocks-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele.\nNäiteks, et näidata ainult IP-aadresside suhtes rakendatud tähtajatuid blokeeringuid, määra $1show=ip|!temp.", + "apihelp-query+categories-param-prop": "Millised lisaatribuudid iga kategooria kohta hankida:", + "apihelp-query+categories-param-show": "Milliseid kategooriaid näidata.", + "apihelp-query+categories-param-limit": "Kui palju kategooriaid tagastada.", + "apihelp-query+categories-param-categories": "Loetle ainult need kategooriad. Kasulik, kui vaja kontrollida, kas teatud lehekülg on teatud kategoorias.", + "apihelp-query+categories-param-dir": "Järjestuse suund.", + "apihelp-query+categorymembers-param-title": "Loetlemise kategooria (nõutav). Peab sisaldama eesliidet {{ns:category}}:. Ei saa kasutada parameetriga $1pageid.", + "apihelp-query+categorymembers-param-pageid": "Loetlemise kategooria lehekülje identifikaator. Ei saa kasutada parameetriga $1title.", + "apihelp-query+categorymembers-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+categorymembers-param-type": "Mis tüüpi liikmed kategooriatest hankida. Eiratakse, kui määratud on $1sort=timestamp.", + "apihelp-query+categorymembers-param-dir": "Järjestuse suund.", + "apihelp-query+contributors-param-limit": "Kui palju kaastöölisi tagastada.", + "apihelp-query+deletedrevisions-param-start": "Ajatempel, millest alates loetleda. Eiratakse, kui töötlusel on redaktsioonide identifikaatorite loend.", + "apihelp-query+deletedrevisions-param-end": "Ajatempel, milleni loetleda. Eiratakse, kui töötlusel on redaktsioonide identifikaatorite loend.", + "apihelp-query+deletedrevisions-param-tag": "Loetle ainult redaktsioonid, mille küljes on see märgis.", + "apihelp-query+deletedrevisions-param-excludeuser": "Ära loetle selle kasutaja redaktsioone.", + "apihelp-query+deletedrevs-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+deletedrevs-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+deletedrevs-param-tag": "Loetle ainult redaktsioonid, mille küljes on see märgis.", + "apihelp-query+deletedrevs-param-excludeuser": "Ära loetle selle kasutaja redaktsioone.", + "apihelp-query+deletedrevs-param-namespace": "Loetle ainult leheküljed selles nimeruumis.", + "apihelp-query+duplicatefiles-param-limit": "Kui palju duplikaatfaile tagastada.", + "apihelp-query+duplicatefiles-param-dir": "Järjestuse suund.", + "apihelp-query+embeddedin-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+embeddedin-param-dir": "Järjestuse suund.", + "apihelp-query+embeddedin-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+extlinks-param-limit": "Kui palju linke tagastada.", + "apihelp-query+exturlusage-summary": "Loetle leheküljed, mis sisaldavad teatud internetiaadressi.", + "apihelp-query+exturlusage-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+exturlusage-param-namespace": "Lehekülgede loetlemise nimeruumid.", + "apihelp-query+exturlusage-param-limit": "Kui palju lehekülgi tagastada.", + "apihelp-query+filearchive-summary": "Loetle kõik kustutatud failid järjestatult.", + "apihelp-query+filearchive-param-from": "Pildi pealkiri, millest alates loetleda.", + "apihelp-query+filearchive-param-to": "Pildi pealkiri, milleni loetleda.", + "apihelp-query+filearchive-param-limit": "Kui palju pilte kokku tagastada.", + "apihelp-query+filearchive-param-dir": "Järjestuse suund.", + "apihelp-query+filearchive-param-prop": "Milline pilditeave hankida:", + "apihelp-query+fileusage-param-prop": "Millised atribuudid hankida:", + "apihelp-query+fileusage-param-limit": "Kui palju tagastada.", + "apihelp-query+fileusage-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele:\n;redirect:Näita ainult ümbersuunamisi.\n;!redirect:Näita ainult üksusi, mis pole ümbersuunamised.", "apihelp-query+imageinfo-summary": "Tagastab failiteabe ja üleslaadimisajaloo.", "apihelp-query+imageinfo-param-prop": "Millist teavet faili kohta hankida:", "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Lisab üles laaditud versiooni ajatempli.", @@ -38,5 +167,117 @@ "apihelp-query+imageinfo-param-localonly": "Kaasa päringusse ainult kohaliku hoidla failid.", "apihelp-query+imageinfo-example-simple": "Faili [[:File:Albert Einstein Head.jpg|Albert Einstein Head.jpg]] praeguse versiooni teabe väljavõtt.", "apihelp-query+imageinfo-example-dated": "Faili [[:File:Test.jpg|Test.jpg]] teabe väljavõtt alates 2008. aasta versioonidest.", - "api-help-param-continue": "Kui saadaval on rohkem tulemusi, kasuta seda jätkamiseks." + "apihelp-query+images-param-limit": "Kui palju faile tagastada.", + "apihelp-query+images-param-images": "Loetle ainult need failid. Kasulik, kui vaja kontrollida, kas teatud leheküljel on teatud fail.", + "apihelp-query+images-param-dir": "Järjestuse suund.", + "apihelp-query+imageusage-param-namespace": "Loetlemise nimeruum.", + "apihelp-query+imageusage-param-dir": "Järjestuse suund.", + "apihelp-query+imageusage-param-limit": "Kui palju lehekülgi kokku tagastada. Kui $1redirect on lubatud, siis rakendub piirang mõlemal tasemel eraldi (see tähendab, et tagastada võidakse kuni 2 × $1limit tulemust).", + "apihelp-query+info-param-prop": "Millised lisaatribuudid hankida:", + "apihelp-query+iwbacklinks-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+iwbacklinks-param-prop": "Millised atribuudid hankida:", + "apihelp-query+iwbacklinks-param-dir": "Järjestuse suund.", + "apihelp-query+iwlinks-param-prop": "Millised lisaatribuudid iga intervikilingi kohta hankida:", + "apihelp-query+iwlinks-param-limit": "Kui palju intervikilinke tagastada.", + "apihelp-query+iwlinks-param-dir": "Järjestuse suund.", + "apihelp-query+langbacklinks-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+langbacklinks-param-prop": "Millised atribuudid hankida:", + "apihelp-query+langbacklinks-param-dir": "Järjestuse suund.", + "apihelp-query+langlinks-param-limit": "Kui palju keelelinke tagastada.", + "apihelp-query+langlinks-param-prop": "Millised lisaatribuudid iga intervikilingi kohta hankida:", + "apihelp-query+langlinks-param-dir": "Järjestuse suund.", + "apihelp-query+links-param-limit": "Kui palju linke tagastada.", + "apihelp-query+links-param-titles": "Loetle ainult lingid, mis viitavad neile pealkirjadele. Kasulik, kui vaja kontrollida, kas teatud lehekülg lingib teatud leheküljele.", + "apihelp-query+links-param-dir": "Järjestuse suund.", + "apihelp-query+linkshere-param-prop": "Millised atribuudid hankida:", + "apihelp-query+linkshere-param-limit": "Kui palju tagastada.", + "apihelp-query+linkshere-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele:\n;redirect:Näita ainult ümbersuunamisi.\n;!redirect:Näita ainult üksusi, mis pole ümbersuunamised.", + "apihelp-query+logevents-param-prop": "Millised atribuudid hankida:", + "apihelp-query+logevents-param-type": "Loetle ainult seda tüüpi logisündmused.", + "apihelp-query+logevents-param-action": "Loetle ainult logisündmused selle toimingu kohta. Kirjutab üle parameetri $1type. Väärtused, milles on võimalike väärtuste loetelus metamärk asterisk (toiming/*), võib kaldkriipsu (/) järel olla erinev sõne.", + "apihelp-query+logevents-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+logevents-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+logevents-param-user": "Loetle ainult selle kasutaja sissekanded.", + "apihelp-query+logevents-param-namespace": "Loetle ainult sissekanded, mis on selles nimeruumis.", + "apihelp-query+logevents-param-tag": "Loetle ainult logisündmused, mille küljes on see märgis.", + "apihelp-query+logevents-param-limit": "Kui palju logisündmusi kokku tagastada.", + "apihelp-query+pagepropnames-example-simple": "Hangi esimese 10 atribuudi nimi.", + "apihelp-query+pageprops-param-prop": "Loetle ainult need leheatribuudid ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] tagastab kasutatavate atribuutide nimed). Kasulik, kui vaja kontrollida, kas leheküljed kasutavad teatud leheatribuuti.", + "apihelp-query+pageswithprop-summary": "Loetle kõik leheküljed, mis kasutavad teatud leheatribuuti.", + "apihelp-query+pageswithprop-param-propname": "Leheatribuut, mille kohta lehekülgi loetleda ([[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]] tagastab kasutatavate atribuutide nimed).", + "apihelp-query+pageswithprop-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+pageswithprop-paramvalue-prop-value": "Lisab leheatribuudi väärtuse.", + "apihelp-query+pageswithprop-param-dir": "Järjestuse suund.", + "apihelp-query+protectedtitles-param-namespace": "Loetle ainult pealkirjad nendes nimeruumides.", + "apihelp-query+protectedtitles-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+protectedtitles-param-prop": "Millised atribuudid hankida:", + "apihelp-query+random-param-limit": "Kui palju juhuslikke lehekülgi tagastada.", + "apihelp-query+recentchanges-summary": "Loetle viimased muudatused.", + "apihelp-query+recentchanges-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+recentchanges-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+recentchanges-param-namespace": "Loetle muudatusi ainult neist nimeruumidest.", + "apihelp-query+recentchanges-param-user": "Loetle ainult selle kasutaja muudatused.", + "apihelp-query+recentchanges-param-excludeuser": "Ära loetle selle kasutaja muudatusi.", + "apihelp-query+recentchanges-param-tag": "Loetle ainult muudatused, mille küljes on see märgis.", + "apihelp-query+recentchanges-param-prop": "Hangi teabe lisaelemendid:", + "apihelp-query+recentchanges-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele. Näiteks, et näha ainult pisimuudatusi, mille on teinud sisseloginud kasutajad, määra $1show=minor|!anon.", + "apihelp-query+recentchanges-param-limit": "Kui palju muudatusi kokku tagastada.", + "apihelp-query+recentchanges-param-type": "Mis tüüpi muudatusi näidata.", + "apihelp-query+recentchanges-param-toponly": "Loetle ainult muudatused, millele vastab viimane redaktsioon.", + "apihelp-query+recentchanges-param-title": "Loetle ainult sissekanded, mis on seotud leheküljega.", + "apihelp-query+redirects-param-prop": "Millised atribuudid hankida:", + "apihelp-query+redirects-param-limit": "Kui palju ümbersuunamisi tagastada.", + "apihelp-query+redirects-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele:\n;redirect:Näita ainult fragmendiga ümbersuunamisi.\n;!redirect:Näita ainult ümbersuunamisi, millel pole fragmenti.", + "apihelp-query+revisions-param-startid": "Redaktsioon, mille ajatemplist alates loetleda. Redaktsioon peab olemas olema, aga ei pea kuuluma selle lehekülje juurde.", + "apihelp-query+revisions-param-endid": "Redaktsioon, mille ajatemplini loetleda. Redaktsioon peab olemas olema, aga ei pea kuuluma selle lehekülje juurde.", + "apihelp-query+revisions-param-start": "Redaktsiooni ajatempel, millest alates loetleda.", + "apihelp-query+revisions-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+revisions-param-tag": "Loetle ainult redaktsioonid, mille küljes on see märgis.", + "apihelp-query+revisions+base-param-prop": "Millised atribuudid iga redaktsiooni kohta hankida:", + "apihelp-query+revisions+base-param-limit": "Kui palju redaktsioone tagastada.", + "apihelp-query+search-summary": "Soorita täisteksti otsing.", + "apihelp-query+search-param-search": "Otsi lehekülgede pealkirju või sisu, mis vastab sellele väärtusele. Saad otsisõnes kasutada neid erifunktsioone, mida otsing selles vikis võimaldab.", + "apihelp-query+search-param-namespace": "Otsi ainult neist nimeruumidest.", + "apihelp-query+search-param-what": "Mis tüüpi otsing sooritada.", + "apihelp-query+search-param-info": "Millised metaandmed tagastada.", + "apihelp-query+search-param-prop": "Millised atribuudid hankida:", + "apihelp-query+search-param-limit": "Kui palju lehekülgi kokku tagastada.", + "apihelp-query+siteinfo-param-prop": "Milline teave hankida:", + "apihelp-query+tags-param-prop": "Millised atribuudid hankida:", + "apihelp-query+templates-param-limit": "Kui palju malle tagastada.", + "apihelp-query+templates-param-templates": "Loetle ainult need mallid. Kasulik, kui vaja kontrollida, kas teatud lehekülg kasutab teatud malli.", + "apihelp-query+templates-param-dir": "Järjestuse suund.", + "apihelp-query+transcludedin-param-prop": "Millised atribuudid hankida:", + "apihelp-query+transcludedin-param-limit": "Kui palju tagastada.", + "apihelp-query+transcludedin-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele:\n;redirect:Näita ainult ümbersuunamisi.\n;!redirect:Näita ainult üksusi, mis pole ümbersuunamised.", + "apihelp-query+usercontribs-param-namespace": "Loetle ainult kaastöö nendes nimeruumides.", + "apihelp-query+usercontribs-param-prop": "Hangi teabe lisaelemendid:", + "apihelp-query+usercontribs-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele. Näiteks ainult muudatused, mis pole pisimuudatused: $2show=!minor.\n\nKui määratud on $2show=patrolled või $2show=!patrolled, siis ei näidata muudatusi, mis on vanemad kui [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|sekund|sekundit}}).", + "apihelp-query+usercontribs-param-tag": "Loetle ainult redaktsioonid, mille küljes on see märgis.", + "apihelp-query+usercontribs-param-toponly": "Loetle ainult muudatused, millele vastab viimane redaktsioon.", + "apihelp-query+userinfo-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+users-param-prop": "Millised teabe elemendid hankida:", + "apihelp-query+watchlist-param-start": "Ajatempel, millest alates loetleda.", + "apihelp-query+watchlist-param-end": "Ajatempel, milleni loetleda.", + "apihelp-query+watchlist-param-namespace": "Loetle ainult muudatused neis nimeruumides.", + "apihelp-query+watchlist-param-user": "Loetle ainult selle kasutaja muudatused.", + "apihelp-query+watchlist-param-excludeuser": "Ära loetle selle kasutaja muudatusi.", + "apihelp-query+watchlist-param-limit": "Kui palju tulemusi päringu kohta kokku tagastada.", + "apihelp-query+watchlist-param-prop": "Millised lisaatribuudid hankida:", + "apihelp-query+watchlist-param-show": "Näita ainult üksusi, mis vastavad neile kriteeriumitele. Näiteks, et näha ainult pisimuudatusi, mille on teinud sisseloginud kasutajad, määra $1show=minor|!anon.", + "apihelp-query+watchlist-param-type": "Mis tüüpi muudatusi näidata:", + "apihelp-query+watchlistraw-param-namespace": "Loetle ainult leheküljed nendes nimeruumides.", + "apihelp-query+watchlistraw-param-limit": "Kui palju tulemusi päringu kohta kokku tagastada.", + "apihelp-query+watchlistraw-param-prop": "Millised lisaatribuudid hankida:", + "apihelp-query+watchlistraw-param-show": "Loetle ainult üksused, mis vastavad neile kriteeriumitele.", + "apihelp-query+watchlistraw-param-dir": "Järjestuse suund.", + "apihelp-query+watchlistraw-param-fromtitle": "Pealkiri (nimeruumi eesliitega), millest alates loetleda.", + "apihelp-query+watchlistraw-param-totitle": "Pealkiri (nimeruumi eesliitega), milleni loetleda.", + "api-help-main-header": "Põhimoodul.", + "api-help-param-limit": "Lubatud pole üle $1.", + "api-help-param-limit2": "Lubatud pole üle $1 (robotitele $2).", + "api-help-param-direction": "Loetlemise suund:\n;newer:Vanemad enne. Märkus: element $1start peab olema enne elementi $1end.\n;older:Uuemad enne (vaikimisi). Märkus: element $1start peab olema pärast elementi $1end.", + "api-help-param-continue": "Kui saadaval on rohkem tulemusi, kasuta seda jätkamiseks.", + "apierror-mustbeloggedin": "Pead olema sisse logitud, et $1.", + "apierror-timeout": "Server ei vastanud oodatud aja sees." } diff --git a/includes/api/i18n/ja.json b/includes/api/i18n/ja.json index 4e2240565a..6629309c92 100644 --- a/includes/api/i18n/ja.json +++ b/includes/api/i18n/ja.json @@ -38,7 +38,7 @@ "apihelp-block-param-anononly": "匿名利用者のみブロックします(つまり、このIPアドレスからの匿名での編集を不可能にします)。", "apihelp-block-param-nocreate": "アカウントの作成を禁止します。", "apihelp-block-param-autoblock": "その利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロックします。", - "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(blockemail 権限が必要です)", + "apihelp-block-param-noemail": "ウィキを通してメールを送信することを禁止します。(blockemail 権限が必要です)", "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(hideuser 権限が必要です)", "apihelp-block-param-allowusertalk": "自身のトークページの編集を許可する ([[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]] に依存)。", "apihelp-block-param-reblock": "その利用者がすでにブロックされている場合、ブロックを上書きします。", @@ -130,12 +130,12 @@ "apihelp-edit-example-edit": "ページを編集", "apihelp-edit-example-prepend": "__NOTOC__ をページの先頭に挿入する。", "apihelp-edit-example-undo": "版 13579 から 13585 まで要約を自動入力して取り消す。", - "apihelp-emailuser-summary": "利用者に電子メールを送信します。", + "apihelp-emailuser-summary": "利用者にメールを送信します。", "apihelp-emailuser-param-target": "送信先の利用者名。", "apihelp-emailuser-param-subject": "題名。", - "apihelp-emailuser-param-text": "電子メールの本文。", - "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。", - "apihelp-emailuser-example-email": "利用者 WikiSysop に Content という本文の電子メールを送信。", + "apihelp-emailuser-param-text": "メールの本文。", + "apihelp-emailuser-param-ccme": "メールの複製を自分にも送信します。", + "apihelp-emailuser-example-email": "利用者 WikiSysop に Content という本文のメールを送信。", "apihelp-expandtemplates-summary": "ウィキテキストに含まれるすべてのテンプレートを展開します。", "apihelp-expandtemplates-param-title": "ページの名前です。", "apihelp-expandtemplates-param-text": "変換するウィキテキストです。", @@ -596,7 +596,7 @@ "apihelp-query+embeddedin-param-filterredir": "転送ページを絞り込む方法。", "apihelp-query+embeddedin-param-limit": "返すページの総数。", "apihelp-query+embeddedin-example-simple": "Template:Stub を参照読み込みしているページを表示する。", - "apihelp-query+embeddedin-example-generator": "Template:Stub をトランスクルードしているページに関する情報を取得する。", + "apihelp-query+embeddedin-example-generator": "Template:Stub を参照読み込みしているページに関する情報を取得する。", "apihelp-query+extlinks-summary": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。", "apihelp-query+extlinks-param-limit": "返すリンクの数。", "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ$1query が設定されている場合, protocol は http となります。すべての外部リンクを一覧表示するためにはこのパラメータと $1query の両方を空にしてください。", @@ -869,7 +869,7 @@ "apihelp-query+transcludedin-param-namespace": "この名前空間に含まれるページのみを一覧表示します。", "apihelp-query+transcludedin-param-limit": "返す数。", "apihelp-query+transcludedin-example-simple": "Main Page をトランスクルードしているページの一覧を取得する。", - "apihelp-query+transcludedin-example-generator": "Main Page をトランスクルードしているページに関する情報を取得する。", + "apihelp-query+transcludedin-example-generator": "Main Page を参照読み込みしているページに関する情報を取得する。", "apihelp-query+usercontribs-summary": "利用者によるすべての編集を取得します。", "apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。", "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。$1userids または $1userprefix とは同時に使用できません。", @@ -916,7 +916,7 @@ "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:", "apihelp-query+watchlistraw-param-dir": "昇順・降順の別。", "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。", - "apihelp-resetpassword-example-user": "利用者 Example にパスワード再設定の電子メールを送信する。", + "apihelp-resetpassword-example-user": "利用者 Example にパスワード再設定のメールを送信する。", "apihelp-revisiondelete-summary": "版の削除および復元を行います。", "apihelp-revisiondelete-param-reason": "削除または復元の理由。", "apihelp-revisiondelete-example-revision": "Main Page の版 12345 の本文を隠す。", diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php index fb416f040a..c13f95e1ed 100644 --- a/includes/cache/LinkCache.php +++ b/includes/cache/LinkCache.php @@ -295,7 +295,16 @@ class LinkCache { } private function isCacheable( LinkTarget $title ) { - return ( $title->inNamespace( NS_TEMPLATE ) || $title->inNamespace( NS_FILE ) ); + $ns = $title->getNamespace(); + if ( in_array( $ns, [ NS_TEMPLATE, NS_FILE, NS_CATEGORY ] ) ) { + return true; + } + // Focus on transcluded pages more than the main content + if ( MWNamespace::isContent( $ns ) ) { + return false; + } + // Non-talk extension namespaces (e.g. NS_MODULE) + return ( $ns >= 100 && MWNamespace::isSubject( $ns ) ); } private function fetchPageRow( IDatabase $db, LinkTarget $nt ) { diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index b669fcd492..e78dfa16bb 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -48,7 +48,7 @@ class MessageCache { /** * Process cache of loaded messages that are defined in MediaWiki namespace * - * @var MapCacheLRU Map of (language code => key => " " or "!TOO BIG") + * @var MapCacheLRU Map of (language code => key => " " or "!TOO BIG" or "!ERROR") */ protected $cache; @@ -535,27 +535,30 @@ class MessageCache { } // Set the text for small software-defined messages in the main cache map + $revisionStore = MediaWikiServices::getInstance()->getRevisionStore(); + $revQuery = $revisionStore->getQueryInfo( [ 'page', 'user' ] ); $res = $dbr->select( - [ 'page', 'revision', 'text' ], - [ 'page_title', 'page_latest', 'old_id', 'old_text', 'old_flags' ], + $revQuery['tables'], + $revQuery['fields'], array_merge( $conds, [ 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ) ] ), __METHOD__ . "($code)-small", [], - [ - 'revision' => [ 'JOIN', 'page_latest=rev_id' ], - 'text' => [ 'JOIN', 'rev_text_id=old_id' ], - ] + $revQuery['joins'] ); foreach ( $res as $row ) { $name = $this->contLang->lcfirst( $row->page_title ); // Include entries/stubs for all keys in $mostused in adaptive mode if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) { - $text = Revision::getRevisionText( $row ); - if ( $text === false ) { - // Failed to fetch data; possible ES errors? - // Store a marker to fetch on-demand as a workaround... - // TODO Use a differnt marker - $entry = '!TOO BIG'; + try { + $rev = $revisionStore->newRevisionFromRow( $row ); + $content = $rev->getContent( MediaWiki\Revision\SlotRecord::MAIN ); + $text = $this->getMessageTextFromContent( $content ); + } catch ( Exception $ex ) { + $text = false; + } + + if ( !is_string( $text ) ) { + $entry = '!ERROR'; wfDebugLog( 'MessageCache', __METHOD__ @@ -1049,7 +1052,7 @@ class MessageCache { if ( $entry !== null ) { // Message page exists as an override of a software messages if ( substr( $entry, 0, 1 ) === ' ' ) { - // The message exists and is not '!TOO BIG' + // The message exists and is not '!TOO BIG' or '!ERROR' return (string)substr( $entry, 1 ); } elseif ( $entry === '!NONEXISTENT' ) { // The text might be '-' or missing due to some data loss diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php index 7f7d77d947..2d37eacdc0 100644 --- a/includes/changes/RecentChange.php +++ b/includes/changes/RecentChange.php @@ -19,6 +19,7 @@ * * @file */ +use MediaWiki\ChangeTags\Taggable; /** * Utility class for creating new RC entries @@ -65,7 +66,7 @@ * we're having to include both rc_comment and rc_comment_text/rc_comment_data * so random crap works right. */ -class RecentChange { +class RecentChange implements Taggable { // Constants for the rc_source field. Extensions may also have // their own source constants. const SRC_EDIT = 'mw.edit'; @@ -1198,7 +1199,7 @@ class RecentChange { * * @since 1.28 * - * @param string|array $tags + * @param string|string[] $tags */ public function addTags( $tags ) { if ( is_string( $tags ) ) { diff --git a/includes/changetags/Taggable.php b/includes/changetags/Taggable.php new file mode 100644 index 0000000000..f6245552fb --- /dev/null +++ b/includes/changetags/Taggable.php @@ -0,0 +1,42 @@ +config ) ) { - return $this->config; - } else { - return $this->getContext()->getConfig(); - } + return $this->config ?: $this->getContext()->getConfig(); } /** @@ -111,11 +107,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return Timing */ public function getTiming() { - if ( !is_null( $this->timing ) ) { - return $this->timing; - } else { - return $this->getContext()->getTiming(); - } + return $this->timing ?: $this->getContext()->getTiming(); } /** @@ -129,11 +121,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return WebRequest */ public function getRequest() { - if ( !is_null( $this->request ) ) { - return $this->request; - } else { - return $this->getContext()->getRequest(); - } + return $this->request ?: $this->getContext()->getRequest(); } /** @@ -147,11 +135,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return Title|null */ public function getTitle() { - if ( !is_null( $this->title ) ) { - return $this->title; - } else { - return $this->getContext()->getTitle(); - } + return $this->title ?: $this->getContext()->getTitle(); } /** @@ -165,11 +149,13 @@ class DerivativeContext extends ContextSource implements MutableContext { public function canUseWikiPage() { if ( $this->wikipage !== null ) { return true; - } elseif ( $this->title !== null ) { + } + + if ( $this->title !== null ) { return $this->title->canExist(); - } else { - return $this->getContext()->canUseWikiPage(); } + + return $this->getContext()->canUseWikiPage(); } /** @@ -190,11 +176,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return WikiPage */ public function getWikiPage() { - if ( !is_null( $this->wikipage ) ) { - return $this->wikipage; - } else { - return $this->getContext()->getWikiPage(); - } + return $this->wikipage ?: $this->getContext()->getWikiPage(); } /** @@ -208,11 +190,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return OutputPage */ public function getOutput() { - if ( !is_null( $this->output ) ) { - return $this->output; - } else { - return $this->getContext()->getOutput(); - } + return $this->output ?: $this->getContext()->getOutput(); } /** @@ -226,11 +204,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return User */ public function getUser() { - if ( !is_null( $this->user ) ) { - return $this->user; - } else { - return $this->getContext()->getUser(); - } + return $this->user ?: $this->getContext()->getUser(); } /** @@ -255,11 +229,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @since 1.19 */ public function getLanguage() { - if ( !is_null( $this->lang ) ) { - return $this->lang; - } else { - return $this->getContext()->getLanguage(); - } + return $this->lang ?: $this->getContext()->getLanguage(); } /** @@ -274,11 +244,7 @@ class DerivativeContext extends ContextSource implements MutableContext { * @return Skin */ public function getSkin() { - if ( !is_null( $this->skin ) ) { - return $this->skin; - } else { - return $this->getContext()->getSkin(); - } + return $this->skin ?: $this->getContext()->getSkin(); } /** diff --git a/includes/db/CloneDatabase.php b/includes/db/CloneDatabase.php index d4277245c1..cdf0f797df 100644 --- a/includes/db/CloneDatabase.php +++ b/includes/db/CloneDatabase.php @@ -25,16 +25,16 @@ use Wikimedia\Rdbms\IMaintainableDatabase; class CloneDatabase { /** @var string Table prefix for cloning */ - private $newTablePrefix = ''; + private $newTablePrefix; /** @var string Current table prefix */ - private $oldTablePrefix = ''; + private $oldTablePrefix; /** @var array List of tables to be cloned */ - private $tablesToClone = []; + private $tablesToClone; /** @var bool Should we DROP tables containing the new names? */ - private $dropCurrentTables = true; + private $dropCurrentTables; /** @var bool Whether to use temporary tables or not */ private $useTemporaryTables = true; @@ -128,7 +128,7 @@ class CloneDatabase { } /** - * Change the table prefix on all open DB connections/ + * Change the table prefix on all open DB connections * * @param string $prefix * @return void diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index a051d83aef..16bde4b959 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -116,7 +116,7 @@ class DatabaseOracle extends Database { $this->setFlag( DBO_PERSISTENT ); } - $session_mode = $this->flags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT; + $session_mode = ( $this->flags & DBO_SYSDBA ) ? OCI_SYSDBA : OCI_DEFAULT; Wikimedia\suppressWarnings(); if ( $this->flags & DBO_PERSISTENT ) { diff --git a/includes/deferred/LinksUpdate.php b/includes/deferred/LinksUpdate.php index 101a1e296b..7a31e26253 100644 --- a/includes/deferred/LinksUpdate.php +++ b/includes/deferred/LinksUpdate.php @@ -32,7 +32,7 @@ use Wikimedia\ScopedCallback; * * See docs/deferred.txt */ -class LinksUpdate extends DataUpdate { +class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate { // @todo make members protected, but make sure extensions don't break /** @var int Page ID of the article linked from */ @@ -1187,4 +1187,39 @@ class LinksUpdate extends DataUpdate { return $this->db; } + + public function getAsJobSpecification() { + if ( $this->user ) { + $userInfo = [ + 'userId' => $this->user->getId(), + 'userName' => $this->user->getName(), + ]; + } else { + $userInfo = false; + } + + if ( $this->mRevision ) { + $triggeringRevisionId = $this->mRevision->getId(); + } else { + $triggeringRevisionId = false; + } + + return [ + 'wiki' => WikiMap::getWikiIdFromDbDomain( $this->getDB()->getDomainID() ), + 'job' => new JobSpecification( + 'refreshLinksPrioritized', + [ + // Reuse the parser cache if it was saved + 'rootJobTimestamp' => $this->mParserOutput->getCacheTime(), + 'useRecursiveLinksUpdate' => $this->mRecursive, + 'triggeringUser' => $userInfo, + 'triggeringRevisionId' => $triggeringRevisionId, + 'causeAction' => $this->getCauseAction(), + 'causeAgent' => $this->getCauseAgent() + ], + [ 'removeDuplicates' => true ], + $this->getTitle() + ) + ]; + } } diff --git a/includes/deferred/RefreshSecondaryDataUpdate.php b/includes/deferred/RefreshSecondaryDataUpdate.php deleted file mode 100644 index 8086a7050d..0000000000 --- a/includes/deferred/RefreshSecondaryDataUpdate.php +++ /dev/null @@ -1,117 +0,0 @@ -page = $page; - $this->updates = $updates; - $this->causeAction = $options['causeAction'] ?? 'unknown'; - $this->causeAgent = $options['causeAgent'] ?? 'unknown'; - $this->recursive = !empty( $options['recursive'] ); - $this->cacheTimestamp = $cacheTime; - $this->domain = $domain; - } - - public function doUpdate() { - foreach ( $this->updates as $update ) { - $update->doUpdate(); - } - } - - /** - * Set the revision corresponding to this LinksUpdate - * @param Revision $revision - */ - public function setRevision( Revision $revision ) { - $this->revision = $revision; - } - - /** - * Set the User who triggered this LinksUpdate - * @param User $user - */ - public function setTriggeringUser( User $user ) { - $this->user = $user; - } - - public function getAsJobSpecification() { - return [ - 'wiki' => WikiMap::getWikiIdFromDomain( $this->domain ), - 'job' => new JobSpecification( - 'refreshLinksPrioritized', - [ - // Reuse the parser cache if it was saved - 'rootJobTimestamp' => $this->cacheTimestamp, - 'useRecursiveLinksUpdate' => $this->recursive, - 'triggeringUser' => $this->user - ? [ - 'userId' => $this->user->getId(), - 'userName' => $this->user->getName() - ] - : false, - 'triggeringRevisionId' => $this->revision ? $this->revision->getId() : false, - 'causeAction' => $this->getCauseAction(), - 'causeAgent' => $this->getCauseAgent() - ], - [ 'removeDuplicates' => true ], - $this->page->getTitle() - ) - ]; - } -} diff --git a/includes/export/WikiExporter.php b/includes/export/WikiExporter.php index 52e38a0e83..120632c365 100644 --- a/includes/export/WikiExporter.php +++ b/includes/export/WikiExporter.php @@ -63,12 +63,16 @@ class WikiExporter { /** @var DumpOutput */ public $sink; + /** @var XmlDumpWriter */ + private $writer; + /** - * Returns the export schema version. + * Returns the default export schema version, as defined by $wgXmlDumpSchemaVersion. * @return string */ public static function schemaVersion() { - return "0.10"; + global $wgXmlDumpSchemaVersion; + return $wgXmlDumpSchemaVersion; } /** @@ -83,11 +87,20 @@ class WikiExporter { function __construct( $db, $history = self::CURRENT, $text = self::TEXT ) { $this->db = $db; $this->history = $history; - $this->writer = new XmlDumpWriter(); + $this->writer = new XmlDumpWriter( $text, self::schemaVersion() ); $this->sink = new DumpOutput(); $this->text = $text; } + /** + * @param string $schemaVersion which schema version the generated XML should comply to. + * One of the values from self::$supportedSchemas, using the XML_DUMP_SCHEMA_VERSION_XX + * constants. + */ + public function setSchemaVersion( $schemaVersion ) { + $this->writer = new XmlDumpWriter( $this->text, $schemaVersion ); + } + /** * Set the DumpOutput or DumpFilter object which will receive * various row objects and XML output for filtering. Filters @@ -322,10 +335,7 @@ class WikiExporter { } $revOpts = [ 'page' ]; - if ( $this->text != self::STUB ) { - // TODO: remove the text and make XmlDumpWriter use a RevisionStore instead! (T198706) - $revOpts[] = 'text'; - } + $revQuery = Revision::getQueryInfo( $revOpts ); // We want page primary rather than revision @@ -335,8 +345,12 @@ class WikiExporter { ]; unset( $join['page'] ); - // TODO: remove rev_text_id and make XmlDumpWriter use a RevisionStore instead! (T198706) - $fields = array_merge( $revQuery['fields'], [ 'page_restrictions, rev_text_id' ] ); + $fields = $revQuery['fields']; + $fields[] = 'page_restrictions'; + + if ( $this->text != self::STUB ) { + $fields['_load_content'] = '1'; + } $conds = []; if ( $cond !== '' ) { diff --git a/includes/export/XmlDumpWriter.php b/includes/export/XmlDumpWriter.php index fae8b62999..3c0b569743 100644 --- a/includes/export/XmlDumpWriter.php +++ b/includes/export/XmlDumpWriter.php @@ -22,13 +22,29 @@ * * @file */ - use MediaWiki\MediaWikiServices; +use MediaWiki\Revision\RevisionStore; +use MediaWiki\Storage\SqlBlobStore; /** * @ingroup Dump */ class XmlDumpWriter { + /** + * @var string[] the schema versions supported for output + * @final + */ + public static $supportedSchemas = [ + XML_DUMP_SCHEMA_VERSION_10, + ]; + + /** + * Title of the currently processed page + * + * @var Title|null + */ + private $currentTitle = null; + /** * Opens the XML output stream's root "" element. * This does not include an xml directive, so is safe to include @@ -159,12 +175,13 @@ class XmlDumpWriter { */ public function openPage( $row ) { $out = " \n"; - $title = Title::makeTitle( $row->page_namespace, $row->page_title ); - $out .= ' ' . Xml::elementClean( 'title', [], self::canonicalTitle( $title ) ) . "\n"; + $this->currentTitle = Title::makeTitle( $row->page_namespace, $row->page_title ); + $canonicalTitle = self::canonicalTitle( $this->currentTitle ); + $out .= ' ' . Xml::elementClean( 'title', [], $canonicalTitle ) . "\n"; $out .= ' ' . Xml::element( 'ns', [], strval( $row->page_namespace ) ) . "\n"; $out .= ' ' . Xml::element( 'id', [], strval( $row->page_id ) ) . "\n"; if ( $row->page_is_redirect ) { - $page = WikiPage::factory( $title ); + $page = WikiPage::factory( $this->currentTitle ); $redirect = $page->getRedirectTarget(); if ( $redirect instanceof Title && $redirect->isValidRedirectTarget() ) { $out .= ' '; @@ -178,7 +195,7 @@ class XmlDumpWriter { strval( $row->page_restrictions ) ) . "\n"; } - Hooks::run( 'XmlDumpWriterOpenPage', [ $this, &$out, $row, $title ] ); + Hooks::run( 'XmlDumpWriterOpenPage', [ $this, &$out, $row, $this->currentTitle ] ); return $out; } @@ -193,6 +210,20 @@ class XmlDumpWriter { return " \n"; } + /** + * @return RevisionStore + */ + private function getRevisionStore() { + return MediaWikiServices::getInstance()->getRevisionStore(); + } + + /** + * @return SqlBlobStore + */ + private function getBlobStore() { + return MediaWikiServices::getInstance()->getBlobStore(); + } + /** * Dumps a "" section on the output stream, with * data filled in from the given database row. @@ -228,16 +259,17 @@ class XmlDumpWriter { } } + // TODO: rev_content_model no longer exists with MCR, see T174031 if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) { $content_model = strval( $row->rev_content_model ); } else { // probably using $wgContentHandlerUseDB = false; - $title = Title::makeTitle( $row->page_namespace, $row->page_title ); - $content_model = ContentHandler::getDefaultModelFor( $title ); + $content_model = ContentHandler::getDefaultModelFor( $this->currentTitle ); } $content_handler = ContentHandler::getForModelID( $content_model ); + // TODO: rev_content_format no longer exists with MCR, see T174031 if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) { $content_format = strval( $row->rev_content_format ); } else { @@ -258,11 +290,44 @@ class XmlDumpWriter { $out .= " " . Xml::elementClean( 'text', [ 'xml:space' => 'preserve', 'bytes' => intval( $row->rev_len ) ], strval( $text ) ) . "\n"; - } else { - // Stub output + } elseif ( isset( $row->_load_content ) ) { + // TODO: make this fully MCR aware, see T174031 + $rev = $this->getRevisionStore()->newRevisionFromRow( $row, 0, $this->currentTitle ); + $slot = $rev->getSlot( 'main' ); + $content = $slot->getContent(); + + if ( $content instanceof TextContent ) { + // HACK: For text based models, bypass the serialization step. + // This allows extensions (like Flow)that use incompatible combinations + // of serialization format and content model. + $text = $content->getNativeData(); + } else { + $text = $content->serialize( $content_format ); + } + + $text = $content_handler->exportTransform( $text, $content_format ); + $out .= " " . Xml::elementClean( 'text', + [ 'xml:space' => 'preserve', 'bytes' => intval( $slot->getSize() ) ], + strval( $text ) ) . "\n"; + } elseif ( isset( $row->rev_text_id ) ) { + // Stub output for pre-MCR schema + // TODO: MCR: rev_text_id only exists in the pre-MCR schema. Remove this when + // we drop support for the old schema. $out .= " " . Xml::element( 'text', [ 'id' => $row->rev_text_id, 'bytes' => intval( $row->rev_len ) ], "" ) . "\n"; + } else { + // Backwards-compatible stub output for MCR aware schema + // TODO: MCR: emit content addresses instead of text ids, see T174031, T199121 + $rev = $this->getRevisionStore()->newRevisionFromRow( $row, 0, $this->currentTitle ); + $slot = $rev->getSlot( 'main' ); + + // Note that this is currently the ONLY reason we have a BlobStore here at all. + // When removing this line, check whether the BlobStore has become unused. + $textId = $this->getBlobStore()->getTextIdFromAddress( $slot->getAddress() ); + $out .= " " . Xml::element( 'text', + [ 'id' => $textId, 'bytes' => intval( $slot->getSize() ) ], + "" ) . "\n"; } if ( isset( $row->rev_sha1 ) diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index a3d1624205..9b9e748c19 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -1838,8 +1838,13 @@ class LocalFile extends File { $this->lock(); - $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName(); - $archiveRel = $this->getArchiveRel( $archiveName ); + if ( $this->isOld() ) { + $archiveRel = $dstRel; + $archiveName = basename( $archiveRel ); + } else { + $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName(); + $archiveRel = $this->getArchiveRel( $archiveName ); + } if ( $repo->hasSha1Storage() ) { $sha1 = FileRepo::isVirtualUrl( $srcPath ) diff --git a/includes/import/WikiImporter.php b/includes/import/WikiImporter.php index 4d7210245f..bd19aa7513 100644 --- a/includes/import/WikiImporter.php +++ b/includes/import/WikiImporter.php @@ -893,6 +893,7 @@ class WikiImporter { ) . " exceeds the maximum allowable size ($wgMaxArticleSize KB)" ); } + // FIXME: process schema version 11! $revision = new WikiRevision( $this->config ); if ( isset( $revisionInfo['id'] ) ) { diff --git a/includes/installer/i18n/bg.json b/includes/installer/i18n/bg.json index 4e9ae3b90c..21d7cbb6b2 100644 --- a/includes/installer/i18n/bg.json +++ b/includes/installer/i18n/bg.json @@ -70,7 +70,7 @@ "config-mod-security": "Предупреждение: [https://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [https://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.", "config-diff3-bad": "Инструментът за сравняване на текст GNU diff3 не беше намерен. Можете да игнорирате това за сега, но конфликтите при редактиране може да бъдат по-чести.", "config-git": "Налична е системата за контрол на версиите Git: $1.", - "config-git-bad": "Не е намерен софтуер за контрол на версиите Git.", + "config-git-bad": "Не е намерен софтуер за контрол на версиите Git. Може да игнорирате това. Забележете, че Специални:Версия няма да покаже хешове на къмит.", "config-imagemagick": "Открит е ImageMagick: $1.\nПреоразмеряването на картинки ще бъде включено ако качването на файлове бъде разрешено.", "config-gd": "Открита е вградена графичната библиотека GD.\nАко качването на файлове бъде включено, ще бъде включена възможността за преоразмеряване на картинки.", "config-no-scaling": "Не са открити библиотеките GD или ImageMagick.\nПреоразмеряването на картинки ще бъде изключено.", @@ -85,7 +85,7 @@ "config-using-32bit": "Внимание: изглежда, че системата Ви работи с 32-битови числа. Това [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не се препоръчва].", "config-db-type": "Тип на базата от данни:", "config-db-host": "Сървър на базата от данни:", - "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.", + "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко се използва MySQL, използването на „localhost“ може да е неприемливо. В такива случаи се използва „127.0.0.1“ за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.", "config-db-host-oracle": "TNS на базата от данни:", "config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]. Файлът tnsnames.ora трябва да бъде видим за инсталацията.
Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].", "config-db-wiki-settings": "Идентифициране на това уики", @@ -133,7 +133,7 @@ "config-invalid-db-server-oracle": "Невалиден TNS на базата от данни „$1“.\nИзползвайте „TNS Name“ или „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи за именуване на Oracle])", "config-invalid-db-name": "Невалидно име на базата от данни „$1“.\nИзползват се само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", "config-invalid-db-prefix": "Невалидна представка за базата от данни „$1“.\nПозволени са само ASCII букви (a-z, A-Z), цифри (0-9), долни черти (_) и тирета (-).", - "config-connection-error": "$1.\n\nНеобходимо е да се проверят хостът, потребителското име и паролата, след което да се опита отново.", + "config-connection-error": "$1.\n\nНеобходимо е да се проверят хостът, потребителското име и паролата, след което да се опита отново. Ако използвате „localhost“ като хост на базата от данни, опитайте с „127.0.0.1“ вместо него (и обратно).", "config-invalid-schema": "Невалидна схема за МедияУики „$1“.\nДопустими са само ASCII букви (a-z, A-Z), цифри (0-9) и долни черти (_).", "config-db-sys-create-oracle": "Инсталаторът поддържа само сметка SYSDBA за създаване на нова сметка.", "config-db-sys-user-exists-oracle": "Потребителската сметка „$1“ вече съществува. SYSDBA може да се използва само за създаване на нова сметка!", diff --git a/includes/installer/i18n/fa.json b/includes/installer/i18n/fa.json index 3102bfbb7d..c7fe40597c 100644 --- a/includes/installer/i18n/fa.json +++ b/includes/installer/i18n/fa.json @@ -15,10 +15,11 @@ "درفش کاویانی", "Hamisun", "Alifakoor", - "Seb35" + "Seb35", + "Ahmad252" ] }, - "config-desc": "نصب کنندهٔ مدیاویکی", + "config-desc": "نصب‌کنندهٔ مدیاویکی", "config-title": "نصب مدیاویکی $1", "config-information": "اطلاعات", "config-localsettings-upgrade": "یک پرونده LocalSettings.php شناسایی شده‌است.\nبرای ارتقاء این نصب لطفاً مقدار $wgUpgradeKey در جعبه زیر وارد کنید.\nشما می‌توانید آن را در LocalSettings.php پیدا کنید.", @@ -76,9 +77,9 @@ "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] نصب شده‌است.", "config-no-cache-apcu": "هشدار: پیوند [https://secure.php.net/apcu APCu] یا [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] یافت نشد. ذخیره شی فعال نیست.", "config-mod-security": "'''هشدار:''' وب سرور شما [https://modsecurity.org/ mod_security] فعال است.اگر اشتباه پیکربندی شده‌‌ باشد،می تواند باعث ایجاد مشکلاتی برای مدیاویکی یا دیگر نرم‌افزاری شود که به کاربران اجازه می‌دهد پیام دلخواه ارسال کنند.\nبه [https://modsecurity.org/documentation/ mod_security documentation] مراجعه کنید یا اگر با خطاهای اتفاقی مواجه شدید با پشتیبانی میزبان خود در تماس باشید.", - "config-diff3-bad": "جی‌ان‌یو دیف۳ پیدا نشد.", + "config-diff3-bad": "ابزار مقایسه متن تفاوت۳ گنو پیدا نشد. می‌توانید فعلاً این پیام را نادیده بگیرید، اما ممکن است به دفعات بیشتری دچار تعارض ویرایشی شوید.", "config-git": "کنترل نسخهٔ نرم‌افزار گیت پیدا شد: $1.", - "config-git-bad": "کنترل نسخهٔ نرم‌افزار گیت پیدا نشد.", + "config-git-bad": "کنترل نسخهٔ نرم‌افزار گیت پیدا نشد. فعلاً می‌توانید این پیام را نادیده بگیرید. در نظر داشته باشید که ویژه:نسخه، توابع درهم‌سازی‌شده را نمایش نخواهد داد.", "config-imagemagick": "ایمیج‌مجیک پیدا شد: $1.\nاگر ارسال‌ها را فعال کنید،تصویر کوچک فعال خواهد‌شد.", "config-gd": "گرافیک‌های جی‌دی ساخته‌‌ شده در کتابخانه پیدا شد.\nاگر ارسال‌ها را فعال کنید تصویر کوچک فعال خواهد‌شد.", "config-no-scaling": "کتابخانهٔ جی‌دی یا ایمیج‌مجیک نتوانست پیدا شود.\nتصویر کوچک غیر‌فعال خواهد‌شد.", @@ -93,11 +94,11 @@ "config-using-32bit": "هشدار: سیستم شما به‌نظر می‌آید با اعداد صحیح ۳۲ بیت اجرا شده باشد. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit توصیه نمی‌شود].", "config-db-type": "نوع پایگاه اطلاعات:", "config-db-host": "میزبان پایگاه اطلاعات:", - "config-db-host-help": "اگر سرور پایگاه اطلاعاتی شما در سرور دیگری است، نام گروه و آدرس آی‌پی را اینجا وارد کنید.\nاگر از گروه شبکهٔ اشتراک گذاری استفاده می‌کنید، تهیه‌کنندهٔ گروه‌تان باید نام گروه صحیح در اسنادومدارک را به شما بدهد.\nاگر در حال نصب یک سرور ویندوز هستید و از مای‌اس‌کیو‌ال استفاده می‌کنید، ممکن است استفاده از \"گروه داخلی\" برای نام سرور کار نکند.اگر کار نکرد، \"۱۲۷.۰.۰.۱\" را برای آدرس آی‌پی داخلی امتحان کنید.\nاگر از پستگِرِاس‌کیوال استفاده می‌کنید،برای اتصال از طریق یک سوکت یونیکس این زمینه را خالی رها کنید.", + "config-db-host-help": "اگر سرور پایگاه اطلاعاتی شما در سرور دیگری است، نام گروه و آدرس آی‌پی را اینجا وارد کنید.\nاگر از میزبان شبکهٔ به اشتراک گذاشته‌شده استفاده می‌کنید، تهیه‌کنندهٔ خدمات میزبانی شما باید نام میزبان صحیح در اسناد و مدارک را به شما بدهد.\nاگر از مای‌اس‌کیو‌ال استفاده می‌کنید، ممکن است استفاده از «میزبان‌محلی» برای نام سرور کار نکند.اگر کار نکرد، «۱۲۷.۰.۰.۱» را برای آدرس آی‌پی محلی امتحان کنید.\nاگر از پستگرس‌کیوال استفاده می‌کنید، برای اتصال از طریق یک سوکت یونیکس این قسمت را خالی رها کنید.", "config-db-host-oracle": "پایگاه اطلاعاتی تی‌ان‌اس:", "config-db-host-oracle-help": "یک [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] معتبر وارد کنید؛ پوشهٔ tnsnames.ora باید برای این نصب نمایان باشد.
اگر از کتابخانه‌های پردازشگر ۱۰جی یا جدیدتر استفاده می‌کنید،همچنین می‌توانید از روش نامبردهٔ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] استفاده کنید.", "config-db-wiki-settings": "این ویکی را شناسایی کنید.", - "config-db-name": "نام پایگاه اطلاعاتی:", + "config-db-name": "نام پایگاه داده (بدون خط پیوند):", "config-db-name-help": "نامی را انتخاب کنید که ویکی شما را شناسایی کند.\nنباید شامل فاصله باشد.\nاگر از گروه شبکهٔ اشتراک‌گذاری استفاده می‌کنید، تهیه‌کنندهٔ گروهتان یا باید به شما نام یک پایگاه اطلاعاتی مشخص برای استفاده بدهد یا برای ایجاد پایگاه‌های اطلاعاتی از طریق یک کنترل پنل به شما اجازه بدهد.", "config-db-name-oracle": "طرح کلی پایگاه اطلاعاتی:", "config-db-account-oracle-warn": "برای نصب برنامهٔ اوراکل به عنوان پایگاه اطلاعاتی در بخش گذشته،سه سناریو پشتیبانی شده است:\nاگر مایل به ایجاد حساب پایگاه اطلاعاتی به عنوان بخشی از روند نصب هستید، لطفاً یک حساب با نقش اس‌وای‌اس‌دی‌بی‌ای به عنوان حساب پایگاه اطلاعاتی برای نصب تهیه کنید و اعتبارنامه‌های مطلوبی را برای حساب دردسترس شبکه تعیین کنید، به عبارتی دیگر یا می‌توانید حساب دردسترس شبکه را به طور دستی ایجاد کنید و تنها آن حساب را تهیه کنید (اگر مستلزم مجوزهایی برای ایجاد موضوعات طرح کلی باشد) یا دو حساب دیگر تهیه کنید،یکی با ایجاد مزایا و یک حساب محدود برای دسترسی شبکه.\nمتنی برای ایجاد یک حساب با مزایای لازم بنویسید که می‌تواند در فهرست\"نگهداری/برنامهٔ اوراکل\" این نصب یافت شود. به یاد داشته باشید که استفاده از یک حساب محدود،همهٔ قابلیت‌های نگهداری با حساب پیش‌فرض را غیرفعال خواهد کرد.", @@ -110,11 +111,11 @@ "config-db-account-lock": "در طی عملیات عادی از نام کاربری و رمز عبور یکسان استفاده کنید", "config-db-wiki-account": "حساب کاربری برای عملیات عادی", "config-db-wiki-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طی عملیات عادی ویکی استفاده خواهید‌کرد.\nاگر حساب وجود ندارد، و نصب حساب مزایای کافی را داراست، این حساب کاربر با حداقل مزایای مورد نیاز برای عمل کردن ویکی به‌وجود خواهد‌آمد.", - "config-db-prefix": "جدول پیشوند پایگاه اطلاعاتی", + "config-db-prefix": "جدول پیشوند پایگاه داده (بدون خط پیوند):", "config-db-prefix-help": "اگر نیاز دارید یک اطلاعات پایگاهی را بین چندین ویکی یا بین مدیاویکی و برنامهٔ کاربردی وب دیگری به اشتراک بگذارید،مجاز به انتخاب برای اضافه کردن یک پیشوند به همهٔ نام‌های جدول برای جلوگیری از اختلاف‌ها هستید.\nاز فاصله‌ها استفاده نکنید.\nاغلب این زمینه خالی مانده‌است.", "config-mysql-old": "مای‌اس‌کیو‌ال نسخهٔ $1 و یا بالاتر نیاز است، شما نسخهٔ $2 را دارید.", "config-db-port": "درگاه پایگاه‌داده:", - "config-db-schema": "طرح کلی برای مدیاویکی:", + "config-db-schema": "طرح کلی برای مدیاویکی (بدون خط پیوند):", "config-db-schema-help": "طرح کلی اغلب بی‌نقص خواهد بود.\nاگر می‌دانید نیاز دارید که تغییرش دهید،آن را تغییر دهید.", "config-pg-test-error": "نمی‌توان به پایگاه اطلاعاتی '''$1''' وصل شد: $2", "config-sqlite-dir": "فهرست اطلاعات اس‌کیو‌لایت:", @@ -141,7 +142,7 @@ "config-invalid-db-server-oracle": "تی‌ان‌اس پایگاه اطلاعاتی $1 نامعتبر.\nیا از \"نام تی‌ان‌اس\" یا یک سلسله \"ارتباط آسان\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]) استفاده کنید.", "config-invalid-db-name": "نام پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.", "config-invalid-db-prefix": "پیشوند پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.", - "config-connection-error": "$1.\n\nمیزبان، نام کاربری و گذرواژه را بررسی کنید و دوباره امتحان کنید.", + "config-connection-error": "$1.\n\nمیزبان، نام کاربری و گذرواژه را بررسی کرده و دوباره امتحان کنید. اگر از «میزبان محلی» به عنوان میزبان پایگاه داده استفاده می‌کنید، استفاده از «۱۲۷.۰.۰.۱» را امتحان کنید (یا برعکس).", "config-invalid-schema": "طرح‌کلی برای مدیاویکی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.", "config-db-sys-create-oracle": "نصب‌کننده تنها از استفادهٔ یک حساب اس‌وای‌اس‌دی‌بی‌اِی برای ایجاد یک حساب جدید حمایت می‌کند.", "config-db-sys-user-exists-oracle": "حساب کاربری \"$1\" در‌حال‌حاضر وجود دارد.تنها اس‌وای‌اس‌دی‌بی‌اِی می‌تواند برای ایجاد یک حساب جدید استفاده شود!", @@ -157,6 +158,7 @@ "config-sqlite-cant-create-db": "پوشه‌ٔ پایگاه اطلا‌عاتی $1نتوانست ایجاد شود.", "config-sqlite-fts3-downgrade": "پی‌اچ‌پی، پشتیبانی اف‌تی‌اس۳ کار نمی‌کند، کاهش جدول‌ها", "config-can-upgrade": "جدول‌های مدیاویکی در این پایگاه اطلاعاتی وجود دارند.\nبرای ارتقاء دادن آنها به مدیاویکی $1، '''ادامه''' را کلیک کنید.", + "config-upgrade-error": "در به‌روزرسانی جدول‌های مدیاویکی در پایگاه داده شما خطایی پیش آمد.\n\nبرای اطلاعات بیشتر به سیاهۀ بالا نگاه کنید. برای تلاش دوباره، روی ادامه کلیک کنید.", "config-upgrade-done": "تکمیل ارتقاء.\nاکنون شما می‌توانید [$1 start using your wiki].\nاگر می‌خواهید پوشهٔ LocalSettings.php را احیا کنید،دکمهٔ زیر را کلیک کنید.\nاین ''' توصیه نمی‌شود ''' مگر اینکه با ویکی خود مشکل داشته باشید.", "config-upgrade-done-no-regenerate": "ارتقاء کامل شد.\nاکنون شما می‌توانید [$1 start using your wiki].", "config-regenerate": "بازسازی LocalSettings.php ←", @@ -311,15 +313,17 @@ "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1", "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده LocalSettings.php را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.", "config-install-done-path": "تبریک!\nمدیاویکی با موفقیت نصب گردید.\nبرنامه نصب‌کننده یک پرونده LocalSettings.php ایجاد کرده است که شامل تمام تنظیمات می‌باشد.\n\nلازم است شما آن را دریافت کرده و در $4 قرار دهید. اِن دریافت می باِست به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشده بود و یا آن را لغو کرده اید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\nتوجه: اگر این کار را هم اکنون انجام ندهید و بدون دریافت آن از برنامه نصب خارج شويد، این پرونده تنظیمات تولیدشده در آینده در اختیار شما قرار نخواهد داشت.\n\nوقتی که آن کار را انجام داديد، می‌توانید [$2 وارد ويکی خودتان شويد].", - "config-install-success": "مدیاویکی به صورت موفقیت‌آمیز نصب شد. شما می‌توانید\nاز <$1$2> برای دیدن ویکی‌تان بازدید کنید.\nاگر پرسشی داشتید، فهرست سوال‌های متداول ما را مطالعه کنید:\n یا از یکی از انجمن‌های پشیبانی ما که در آن صفحه فهرست شده‌اند استفاده کنید.", + "config-install-success": "نصب مدیاویکی موفق بود. شما می‌توانید برای دیدن ویکی‌تان از <$1$2> بازدید کنید.\nاگر پرسشی داشتید، فهرست پرسش‌های متداول ما را مطالعه کنید:\n یا از یکی از انجمن‌های پشیبانی که در آن صفحه فهرست شده‌اند استفاده کنید.", "config-download-localsettings": "دریافت LocalSettings.php", "config-help": "راهنما", "config-help-tooltip": "برای گسترش کلیک کنید", "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟", - "config-extension-link": "آیا می‌دانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]", + "config-extension-link": "آیا می‌دانستید که ویکی شما از [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] پشتیبانی می‌کند؟\nمی‌توانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] را مرور کنید.", "config-skins-screenshots": "$1 (تصاویر: $2)", "config-extensions-requires": "$1 (نیازمند $2)", "config-screenshot": "تصویر", + "config-extension-not-found": "پرونده ثبت افزونه «$1» پیدا نشد.", + "config-extension-dependency": "خطای وابسته در حین نصب افزونه «$1» رخ داد: $2", "mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''", "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربری]\nبرای اطلاعات بیشتر در مورد به‌کارگیری نرم‌افزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخه‌های مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلی‌سازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روش‌های مقابله با هرزنگاری در ویکی]" } diff --git a/includes/installer/i18n/pms.json b/includes/installer/i18n/pms.json index 131e06f430..f928e20bae 100644 --- a/includes/installer/i18n/pms.json +++ b/includes/installer/i18n/pms.json @@ -7,7 +7,8 @@ "아라", "Amire80", "Macofe", - "Seb35" + "Seb35", + "MaxSem" ] }, "config-desc": "L'instalador për mediaWiki", @@ -76,7 +77,7 @@ "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié $1 a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.", "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion ($1) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.", "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bigat archivià con PHP]).\nAnstalassion abortìa.", - "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an php.ini, e amposté $wgResourceLoaderMaxQueryLength al midem valor an LocalSettings.php .", + "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_length a 1024 o pi àut an php.ini, e amposté $wgResourceLoaderMaxQueryLength al midem valor an LocalSettings.php .", "config-db-type": "Sòrt ëd base ëd dàit:", "config-db-host": "Ospitant ëd la base ëd dàit:", "config-db-host-help": "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anserissa ambelessì ël nòm dl'ospitant o l'adrëssa IP.\n\nS'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.\n\nSe a anstala su un servent Windows e a deuvra MySQL, dovré «localhost» a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva «127.0.0.1» com adrëssa IP local.\n\nS'a deuvra PostgresSQL, ch'a lassa sto camp bianch për coleghesse a travers un socket UNIX.", diff --git a/includes/installer/i18n/pt.json b/includes/installer/i18n/pt.json index e712fe5a20..f9fc84f835 100644 --- a/includes/installer/i18n/pt.json +++ b/includes/installer/i18n/pt.json @@ -20,7 +20,8 @@ "Ruila", "Seb35", "MokaAkashiyaPT", - "Athena in Wonderland" + "Athena in Wonderland", + "CaiusSPQR" ] }, "config-desc": "O instalador do MediaWiki", @@ -98,7 +99,7 @@ "config-using-32bit": "Aviso: o seu sistema parece estar a funcionar com inteiros de 32 bits. Isto [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit não é recomendado].", "config-db-type": "Tipo da base de dados:", "config-db-host": "Servidor da base de dados:", - "config-db-host-help": "Se a base de dados estiver num servidor separado, introduza aqui o nome ou o endereço IP desse servidor.\n\nSe estiver a usar um servidor partilhado, o fornecedor do alojamento deve fornecer o nome do servidor na documentação.\n\nSe está a fazer a instalação num servidor Windows com MySQL, usar como nome do servidor \"localhost\" poderá não funcionar. Se não funcionar, tente usar \"127.0.0.1\" como endereço IP local.\n\nSe estiver a usar PostgreSQL, deixe este campo em branco para fazer a ligação através de um socket Unix.", + "config-db-host-help": "Se seu servidor de base de dados estiver num servidor separado, introduza aqui o nome do host ou o endereço de IP.\n\nSe estiver a usar um web hosting partilhado, o provedor de hosting deve fornecer-lhe o nome de host correto em sua documentação.\n\nSe estiver a usar MySQL, usar «localhost» pode não funcionar como nome de servidor. Se não funcionar, tente usar «127.0.0.1» para endereço de IP local.\n\nSe estiver a usar PostgreSQL, deixe este campo em branco para conexão através de um socket Unix.", "config-db-host-oracle": "TNS (Transparent Network Substrate) da base de dados:", "config-db-host-oracle-help": "Introduza um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome Local de Ligação] válido; tem de estar visível para esta instalação um ficheiro tnsnames.ora.
Se está a usar bibliotecas cliente versão 10g ou posterior, também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Ligação Fácil] de atribuição do nome.", "config-db-wiki-settings": "Identifique esta wiki", @@ -149,7 +150,7 @@ "config-invalid-db-server-oracle": "O TNS da base de dados, \"$1\", é inválido.\nUse \"TNS Name\" ou o método \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de Configuração da Conectividade em Oracle])", "config-invalid-db-name": "O nome da base de dados, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.", "config-invalid-db-prefix": "O prefixo da base de dados, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.", - "config-connection-error": "$1.\n\nVerifique o servidor, o nome do utilizador e a palavra-passe e tente novamente.", + "config-connection-error": "$1.\n\nVerifique o host, o nome de utilizador e a password e tente novamente. Se usar «localhost» como o host da base de dados, tente usar «127.0.0.1» antes (ou vice versa).", "config-invalid-schema": "O esquema ''(schema)'' do MediaWiki, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASCII.", "config-db-sys-create-oracle": "O instalador só permite criar uma conta nova usando uma conta SYSDBA.", "config-db-sys-user-exists-oracle": "A conta \"$1\" já existe. A conta SYSDBA só pode criar uma conta nova!", diff --git a/includes/jobqueue/jobs/ClearWatchlistNotificationsJob.php b/includes/jobqueue/jobs/ClearWatchlistNotificationsJob.php index 94c1351a79..b71580a525 100644 --- a/includes/jobqueue/jobs/ClearWatchlistNotificationsJob.php +++ b/includes/jobqueue/jobs/ClearWatchlistNotificationsJob.php @@ -22,11 +22,13 @@ use MediaWiki\MediaWikiServices; /** - * Job for clearing all of the "last viewed" timestamps for a user's watchlist + * Job for clearing all of the "last viewed" timestamps for a user's watchlist, or setting them all + * to the same value. * * Job parameters include: * - userId: affected user ID [required] * - casTime: UNIX timestamp of the event that triggered this job [required] + * - timestamp: value to set all of the "last viewed" timestamps to [optional, defaults to null] * * @ingroup JobQueue * @since 1.31 @@ -38,7 +40,7 @@ class ClearWatchlistNotificationsJob extends Job { static $required = [ 'userId', 'casTime' ]; $missing = implode( ', ', array_diff( $required, array_keys( $this->params ) ) ); if ( $missing != '' ) { - throw new InvalidArgumentException( "Missing paramter(s) $missing" ); + throw new InvalidArgumentException( "Missing parameter(s) $missing" ); } $this->removeDuplicates = true; @@ -51,29 +53,48 @@ class ClearWatchlistNotificationsJob extends Job { $dbw = $lbFactory->getMainLB()->getConnection( DB_MASTER ); $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ ); + $timestamp = $this->params['timestamp'] ?? null; + if ( $timestamp === null ) { + $timestampCond = 'wl_notificationtimestamp IS NOT NULL'; + } else { + $timestamp = $dbw->timestamp( $timestamp ); + $timestampCond = 'wl_notificationtimestamp != ' . $dbw->addQuotes( $timestamp ) . + ' OR wl_notificationtimestamp IS NULL'; + } + // New notifications since the reset should not be cleared + $casTimeCond = 'wl_notificationtimestamp < ' . + $dbw->addQuotes( $dbw->timestamp( $this->params['casTime'] ) ) . + ' OR wl_notificationtimestamp IS NULL'; - $asOfTimes = array_unique( $dbw->selectFieldValues( - 'watchlist', - 'wl_notificationtimestamp', - [ 'wl_user' => $this->params['userId'], 'wl_notificationtimestamp IS NOT NULL' ], - __METHOD__, - [ 'ORDER BY' => 'wl_notificationtimestamp DESC' ] - ) ); - - foreach ( array_chunk( $asOfTimes, $rowsPerQuery ) as $asOfTimeBatch ) { - $dbw->update( + $firstBatch = true; + do { + $idsToUpdate = $dbw->selectFieldValues( 'watchlist', - [ 'wl_notificationtimestamp' => null ], + 'wl_id', [ 'wl_user' => $this->params['userId'], - 'wl_notificationtimestamp' => $asOfTimeBatch, - // New notifications since the reset should not be cleared - 'wl_notificationtimestamp < ' . - $dbw->addQuotes( $dbw->timestamp( $this->params['casTime'] ) ) + $timestampCond, + $casTimeCond, ], - __METHOD__ + __METHOD__, + [ 'LIMIT' => $rowsPerQuery ] ); - $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket ); - } + if ( $idsToUpdate ) { + $dbw->update( + 'watchlist', + [ 'wl_notificationtimestamp' => $timestamp ], + [ + 'wl_id' => $idsToUpdate, + // For paranoia, enforce the CAS time condition here too + $casTimeCond + ], + __METHOD__ + ); + if ( !$firstBatch ) { + $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket ); + } + $firstBatch = false; + } + } while ( $idsToUpdate ); } } diff --git a/includes/libs/objectcache/APCBagOStuff.php b/includes/libs/objectcache/APCBagOStuff.php index 847a1eb069..74dcddff02 100644 --- a/includes/libs/objectcache/APCBagOStuff.php +++ b/includes/libs/objectcache/APCBagOStuff.php @@ -73,24 +73,25 @@ class APCBagOStuff extends BagOStuff { } protected function doGet( $key, $flags = 0 ) { - return $this->getUnserialize( - apc_fetch( $key . self::KEY_SUFFIX ) - ); + return $this->unserialize( apc_fetch( $key . self::KEY_SUFFIX ) ); } - protected function getUnserialize( $value ) { - if ( is_string( $value ) && !$this->nativeSerialize ) { - $value = $this->isInteger( $value ) - ? intval( $value ) - : unserialize( $value ); + protected function getWithToken( $key, &$casToken, $flags = 0 ) { + $casToken = null; + + $blob = apc_fetch( $key . self::KEY_SUFFIX ); + $value = $this->unserialize( $blob ); + if ( $value !== false ) { + $casToken = $blob; // don't bother hashing this } + return $value; } public function set( $key, $value, $exptime = 0, $flags = 0 ) { apc_store( $key . self::KEY_SUFFIX, - $this->setSerialize( $value ), + $this->serialize( $value ), $exptime ); @@ -100,18 +101,11 @@ class APCBagOStuff extends BagOStuff { public function add( $key, $value, $exptime = 0, $flags = 0 ) { return apc_add( $key . self::KEY_SUFFIX, - $this->setSerialize( $value ), + $this->serialize( $value ), $exptime ); } - protected function setSerialize( $value ) { - if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) { - $value = serialize( $value ); - } - return $value; - } - public function delete( $key, $flags = 0 ) { apc_delete( $key . self::KEY_SUFFIX ); @@ -125,4 +119,24 @@ class APCBagOStuff extends BagOStuff { public function decr( $key, $value = 1 ) { return apc_dec( $key . self::KEY_SUFFIX, $value ); } + + public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { + return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags ); + } + + protected function serialize( $value ) { + if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) { + $value = serialize( $value ); + } + return $value; + } + + protected function unserialize( $value ) { + if ( is_string( $value ) && !$this->nativeSerialize ) { + $value = $this->isInteger( $value ) + ? intval( $value ) + : unserialize( $value ); + } + return $value; + } } diff --git a/includes/libs/objectcache/APCUBagOStuff.php b/includes/libs/objectcache/APCUBagOStuff.php index d5f1edc163..55e940503d 100644 --- a/includes/libs/objectcache/APCUBagOStuff.php +++ b/includes/libs/objectcache/APCUBagOStuff.php @@ -40,15 +40,25 @@ class APCUBagOStuff extends APCBagOStuff { } protected function doGet( $key, $flags = 0 ) { - return $this->getUnserialize( - apcu_fetch( $key . self::KEY_SUFFIX ) - ); + return $this->unserialize( apcu_fetch( $key . self::KEY_SUFFIX ) ); + } + + protected function getWithToken( $key, &$casToken, $flags = 0 ) { + $casToken = null; + + $blob = apcu_fetch( $key . self::KEY_SUFFIX ); + $value = $this->unserialize( $blob ); + if ( $value !== false ) { + $casToken = $blob; // don't bother hashing this + } + + return $value; } public function set( $key, $value, $exptime = 0, $flags = 0 ) { apcu_store( $key . self::KEY_SUFFIX, - $this->setSerialize( $value ), + $this->serialize( $value ), $exptime ); @@ -58,7 +68,7 @@ class APCUBagOStuff extends APCBagOStuff { public function add( $key, $value, $exptime = 0, $flags = 0 ) { return apcu_add( $key . self::KEY_SUFFIX, - $this->setSerialize( $value ), + $this->serialize( $value ), $exptime ); } @@ -94,4 +104,8 @@ class APCUBagOStuff extends APCBagOStuff { return false; } } + + public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { + return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags ); + } } diff --git a/includes/libs/objectcache/BagOStuff.php b/includes/libs/objectcache/BagOStuff.php index c439f9ba34..e2b021293a 100644 --- a/includes/libs/objectcache/BagOStuff.php +++ b/includes/libs/objectcache/BagOStuff.php @@ -139,7 +139,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { /** * Get an item with the given key, regenerating and setting it if not found * - * If the callback returns false, then nothing is stored. + * Nothing is stored nor deleted if the callback returns false * * @param string $key * @param int $ttl Time-to-live (seconds) @@ -176,7 +176,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * @param string $key * @param int $flags Bitfield of BagOStuff::READ_* constants [optional] * @param int|null $oldFlags [unused] - * @return mixed Returns false on failure and if the item does not exist + * @return mixed Returns false on failure or if the item does not exist */ public function get( $key, $flags = 0, $oldFlags = null ) { // B/C for ( $key, &$casToken = null, $flags = 0 ) @@ -223,7 +223,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { /** * @param string $key * @param int $flags Bitfield of BagOStuff::READ_* constants [optional] - * @return mixed Returns false on failure and if the item does not exist + * @return mixed Returns false on failure or if the item does not exist */ abstract protected function doGet( $key, $flags = 0 ); @@ -233,7 +233,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * @param string $key * @param mixed &$casToken * @param int $flags Bitfield of BagOStuff::READ_* constants [optional] - * @return mixed Returns false on failure and if the item does not exist + * @return mixed Returns false on failure or if the item does not exist * @throws Exception */ protected function getWithToken( $key, &$casToken, $flags = 0 ) { @@ -267,7 +267,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { * (which will be false if not present), and takes the arguments: * (this BagOStuff, cache key, current value, TTL). * The TTL parameter is reference set to $exptime. It can be overriden in the callback. - * If the callback returns false, then the current value will be unchanged (including TTL). + * Nothing is stored nor deleted if the callback returns false. * * @param string $key * @param callable $callback Callback method to be executed @@ -422,18 +422,32 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { } /** - * Reset the TTL on a key if it exists + * Change the expiration on a key if it exists + * + * If an expiry in the past is given then the key will immediately be expired * * @param string $key - * @param int $expiry + * @param int $expiry TTL or UNIX timestamp * @param int $flags Bitfield of BagOStuff::WRITE_* constants (since 1.33) - * @return bool Success Returns false if there is no key + * @return bool Success Returns false on failure or if the item does not exist * @since 1.28 */ public function changeTTL( $key, $expiry = 0, $flags = 0 ) { - $value = $this->get( $key ); + $found = false; + + $ok = $this->merge( + $key, + function ( $cache, $ttl, $currentValue ) use ( &$found ) { + $found = ( $currentValue !== false ); - return ( $value === false ) ? false : $this->set( $key, $value, $expiry, $flags ); + return $currentValue; // nothing is written if this is false + }, + $expiry, + 1, // 1 attempt + $flags + ); + + return ( $ok && $found ); } /** @@ -636,29 +650,15 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface { /** * Increase stored value of $key by $value while preserving its TTL * @param string $key Key to increase - * @param int $value Value to add to $key (Default 1) + * @param int $value Value to add to $key (default: 1) [optional] * @return int|bool New value or false on failure */ - public function incr( $key, $value = 1 ) { - if ( !$this->lock( $key, 1 ) ) { - return false; - } - $n = $this->get( $key, self::READ_LATEST ); - if ( $this->isInteger( $n ) ) { // key exists? - $n += intval( $value ); - $this->set( $key, max( 0, $n ) ); // exptime? - } else { - $n = false; - } - $this->unlock( $key ); - - return $n; - } + abstract public function incr( $key, $value = 1 ); /** * Decrease stored value of $key by $value while preserving its TTL * @param string $key - * @param int $value + * @param int $value Value to subtract from $key (default: 1) [optional] * @return int|bool New value or false on failure */ public function decr( $key, $value = 1 ) { diff --git a/includes/libs/objectcache/CachedBagOStuff.php b/includes/libs/objectcache/CachedBagOStuff.php index 95b12b4047..95dda71f2a 100644 --- a/includes/libs/objectcache/CachedBagOStuff.php +++ b/includes/libs/objectcache/CachedBagOStuff.php @@ -109,6 +109,13 @@ class CachedBagOStuff extends HashBagOStuff { return false; // key already set } + public function incr( $key, $value = 1 ) { + $n = $this->backend->incr( $key, $value ); + parent::delete( $key ); + + return $n; + } + public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) { return $this->backend->lock( $key, $timeout, $expiry, $rclass ); } diff --git a/includes/libs/objectcache/EmptyBagOStuff.php b/includes/libs/objectcache/EmptyBagOStuff.php index 9300dc274d..e0f4364228 100644 --- a/includes/libs/objectcache/EmptyBagOStuff.php +++ b/includes/libs/objectcache/EmptyBagOStuff.php @@ -43,6 +43,10 @@ class EmptyBagOStuff extends BagOStuff { return true; } + public function incr( $key, $value = 1 ) { + return false; + } + public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { return true; // faster } diff --git a/includes/libs/objectcache/HashBagOStuff.php b/includes/libs/objectcache/HashBagOStuff.php index f88f5671ad..3c6520e1b3 100644 --- a/includes/libs/objectcache/HashBagOStuff.php +++ b/includes/libs/objectcache/HashBagOStuff.php @@ -34,8 +34,15 @@ class HashBagOStuff extends BagOStuff { /** @var int Max entries allowed */ protected $maxCacheKeys; + /** @var string CAS token prefix for this instance */ + private $token; + + /** @var int CAS token counter */ + private static $casCounter = 0; + const KEY_VAL = 0; const KEY_EXP = 1; + const KEY_CAS = 2; /** * @param array $params Additional parameters include: @@ -44,34 +51,13 @@ class HashBagOStuff extends BagOStuff { function __construct( $params = [] ) { parent::__construct( $params ); + $this->token = microtime( true ) . ':' . mt_rand(); $this->maxCacheKeys = $params['maxKeys'] ?? INF; if ( $this->maxCacheKeys <= 0 ) { throw new InvalidArgumentException( '$maxKeys parameter must be above zero' ); } } - protected function expire( $key ) { - $et = $this->bag[$key][self::KEY_EXP]; - if ( $et == self::TTL_INDEFINITE || $et > $this->getCurrentTime() ) { - return false; - } - - $this->delete( $key ); - - return true; - } - - /** - * Does this bag have a non-null value for the given key? - * - * @param string $key - * @return bool - * @since 1.27 - */ - protected function hasKey( $key ) { - return isset( $this->bag[$key] ); - } - protected function doGet( $key, $flags = 0 ) { if ( !$this->hasKey( $key ) ) { return false; @@ -89,12 +75,24 @@ class HashBagOStuff extends BagOStuff { return $this->bag[$key][self::KEY_VAL]; } + protected function getWithToken( $key, &$casToken, $flags = 0 ) { + $casToken = null; + + $value = $this->doGet( $key ); + if ( $value !== false ) { + $casToken = $this->bag[$key][self::KEY_CAS]; + } + + return $value; + } + public function set( $key, $value, $exptime = 0, $flags = 0 ) { // Refresh key position for maxCacheKeys eviction unset( $this->bag[$key] ); $this->bag[$key] = [ self::KEY_VAL => $value, - self::KEY_EXP => $this->convertExpiry( $exptime ) + self::KEY_EXP => $this->convertExpiry( $exptime ), + self::KEY_CAS => $this->token . ':' . ++self::$casCounter ]; if ( count( $this->bag ) > $this->maxCacheKeys ) { @@ -120,7 +118,52 @@ class HashBagOStuff extends BagOStuff { return true; } + public function incr( $key, $value = 1 ) { + $n = $this->get( $key ); + if ( $this->isInteger( $n ) ) { + $n = max( $n + intval( $value ), 0 ); + $this->bag[$key][self::KEY_VAL] = $n; + + return $n; + } + + return false; + } + + public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { + return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags ); + } + + /** + * Clear all values in cache + */ public function clear() { $this->bag = []; } + + /** + * @param string $key + * @return bool + */ + protected function expire( $key ) { + $et = $this->bag[$key][self::KEY_EXP]; + if ( $et == self::TTL_INDEFINITE || $et > $this->getCurrentTime() ) { + return false; + } + + $this->delete( $key ); + + return true; + } + + /** + * Does this bag have a non-null value for the given key? + * + * @param string $key + * @return bool + * @since 1.27 + */ + protected function hasKey( $key ) { + return isset( $this->bag[$key] ); + } } diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php index 06e90a0b4e..5453862cf2 100644 --- a/includes/libs/objectcache/MemcachedBagOStuff.php +++ b/includes/libs/objectcache/MemcachedBagOStuff.php @@ -79,6 +79,18 @@ class MemcachedBagOStuff extends BagOStuff { $this->fixExpiry( $exptime ) ); } + public function incr( $key, $value = 1 ) { + $n = $this->client->incr( $this->validateKeyEncoding( $key ), $value ); + + return ( $n !== false && $n !== null ) ? $n : false; + } + + public function decr( $key, $value = 1 ) { + $n = $this->client->decr( $this->validateKeyEncoding( $key ), $value ); + + return ( $n !== false && $n !== null ) ? $n : false; + } + public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { return $this->mergeViaCas( $key, $callback, $exptime, $attempts ); } diff --git a/includes/libs/objectcache/MemcachedPhpBagOStuff.php b/includes/libs/objectcache/MemcachedPhpBagOStuff.php index 3ff390b813..8f190c3b76 100644 --- a/includes/libs/objectcache/MemcachedPhpBagOStuff.php +++ b/includes/libs/objectcache/MemcachedPhpBagOStuff.php @@ -58,16 +58,4 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff { return $this->client->get_multi( $keys ); } - - public function incr( $key, $value = 1 ) { - $this->validateKeyEncoding( $key ); - - return $this->client->incr( $key, $value ) ?? false; - } - - public function decr( $key, $value = 1 ) { - $this->validateKeyEncoding( $key ); - - return $this->client->decr( $key, $value ) ?? false; - } } diff --git a/includes/libs/objectcache/RESTBagOStuff.php b/includes/libs/objectcache/RESTBagOStuff.php index 135556adb5..c127ec6910 100644 --- a/includes/libs/objectcache/RESTBagOStuff.php +++ b/includes/libs/objectcache/RESTBagOStuff.php @@ -126,6 +126,7 @@ class RESTBagOStuff extends BagOStuff { public function set( $key, $value, $exptime = 0, $flags = 0 ) { // @TODO: respect WRITE_SYNC (e.g. EACH_QUORUM) + // @TODO: respect $exptime $req = [ 'method' => 'PUT', 'url' => $this->url . rawurlencode( $key ), @@ -139,6 +140,7 @@ class RESTBagOStuff extends BagOStuff { } public function add( $key, $value, $exptime = 0, $flags = 0 ) { + // @TODO: make this atomic if ( $this->get( $key ) === false ) { return $this->set( $key, $value, $exptime, $flags ); } @@ -158,4 +160,16 @@ class RESTBagOStuff extends BagOStuff { } return $this->handleError( "Failed to delete $key", $rcode, $rerr ); } + + public function incr( $key, $value = 1 ) { + // @TODO: make this atomic + $n = $this->get( $key, self::READ_LATEST ); + if ( $this->isInteger( $n ) ) { // key exists? + $n = max( $n + intval( $value ), 0 ); + // @TODO: respect $exptime + return $this->set( $key, $n ) ? $n : false; + } + + return false; + } } diff --git a/includes/libs/objectcache/WinCacheBagOStuff.php b/includes/libs/objectcache/WinCacheBagOStuff.php index cae0280128..0ca3e4a5f9 100644 --- a/includes/libs/objectcache/WinCacheBagOStuff.php +++ b/includes/libs/objectcache/WinCacheBagOStuff.php @@ -29,12 +29,50 @@ */ class WinCacheBagOStuff extends BagOStuff { protected function doGet( $key, $flags = 0 ) { - $val = wincache_ucache_get( $key ); - if ( is_string( $val ) ) { - $val = unserialize( $val ); + $blob = wincache_ucache_get( $key ); + + return is_string( $blob ) ? unserialize( $blob ) : false; + } + + protected function getWithToken( $key, &$casToken, $flags = 0 ) { + $casToken = null; + + $blob = wincache_ucache_get( $key ); + if ( !is_string( $blob ) ) { + return false; + } + + $value = unserialize( $blob ); + if ( $value === false ) { + return false; + } + + $casToken = $blob; // don't bother hashing this + + return $value; + } + + protected function cas( $casToken, $key, $value, $exptime = 0, $flags = 0 ) { + if ( !wincache_lock( $key ) ) { // optimize with FIFO lock + return false; + } + + $curCasToken = null; // passed by reference + $this->getWithToken( $key, $curCasToken, self::READ_LATEST ); + if ( $casToken === $curCasToken ) { + $success = $this->set( $key, $value, $exptime, $flags ); + } else { + $this->logger->info( + __METHOD__ . ' failed due to race condition for {key}.', + [ 'key' => $key ] + ); + + $success = false; // mismatched or failed } - return $val; + wincache_unlock( $key ); + + return $success; } public function set( $key, $value, $expire = 0, $flags = 0 ) { @@ -56,14 +94,7 @@ class WinCacheBagOStuff extends BagOStuff { } public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) { - if ( wincache_lock( $key ) ) { // optimize with FIFO lock - $ok = $this->mergeViaLock( $key, $callback, $exptime, $attempts, $flags ); - wincache_unlock( $key ); - } else { - $ok = false; - } - - return $ok; + return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags ); } /** @@ -109,18 +140,20 @@ class WinCacheBagOStuff extends BagOStuff { * @return int|bool New value or false on failure */ public function incr( $key, $value = 1 ) { - if ( !$this->lock( $key ) ) { + if ( !wincache_lock( $key ) ) { // optimize with FIFO lock return false; } - $n = $this->get( $key ); - if ( $this->isInteger( $n ) ) { // key exists? - $n += intval( $value ); + + $n = $this->doGet( $key ); + if ( $this->isInteger( $n ) ) { + $n = max( $n + (int)$value, 0 ); $oldTTL = wincache_ucache_info( false, $key )["ucache_entries"][1]["ttl_seconds"]; - $this->set( $key, max( 0, $n ), $oldTTL ); + $this->set( $key, $n, $oldTTL ); } else { $n = false; } - $this->unlock( $key ); + + wincache_unlock( $key ); return $n; } diff --git a/includes/libs/rdbms/database/DBConnRef.php b/includes/libs/rdbms/database/DBConnRef.php index 4fdac81e66..5d80f836fc 100644 --- a/includes/libs/rdbms/database/DBConnRef.php +++ b/includes/libs/rdbms/database/DBConnRef.php @@ -74,11 +74,13 @@ class DBConnRef implements IDatabase { } public function tablePrefix( $prefix = null ) { - return $this->__call( __FUNCTION__, func_get_args() ); + // Disallow things that might confuse the LoadBalancer tracking + throw new DBUnexpectedError( $this, "Database selection is disallowed to enable reuse." ); } public function dbSchema( $schema = null ) { - return $this->__call( __FUNCTION__, func_get_args() ); + // Disallow things that might confuse the LoadBalancer tracking + throw new DBUnexpectedError( $this, "Database selection is disallowed to enable reuse." ); } public function getLBInfo( $name = null ) { @@ -86,11 +88,13 @@ class DBConnRef implements IDatabase { } public function setLBInfo( $name, $value = null ) { - return $this->__call( __FUNCTION__, func_get_args() ); + // Disallow things that might confuse the LoadBalancer tracking + throw new DBUnexpectedError( $this, "Changing LB info is disallowed to enable reuse." ); } public function setLazyMasterHandle( IDatabase $conn ) { - return $this->__call( __FUNCTION__, func_get_args() ); + // Disallow things that might confuse the LoadBalancer tracking + throw new DBUnexpectedError( $this, "Database injection is disallowed to enable reuse." ); } public function implicitGroupby() { diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 224bcf29d0..9ce3086c38 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -926,6 +926,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware final public function close() { $exception = null; // error to throw after disconnecting + $wasOpen = $this->opened; + // This should mostly do nothing if the connection is already closed if ( $this->conn ) { // Roll back any dangling transaction first if ( $this->trxLevel ) { @@ -968,11 +970,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware // Close the actual connection in the binding handle $closed = $this->closeConnection(); - $this->conn = false; } else { $closed = true; // already closed; nothing to do } + $this->conn = false; $this->opened = false; // Throw any unexpected errors after having disconnected @@ -980,12 +982,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware throw $exception; } - // Sanity check that no callbacks are dangling - $fnames = $this->pendingWriteAndCallbackCallers(); - if ( $fnames ) { - throw new RuntimeException( - "Transaction callbacks are still pending:\n" . implode( ', ', $fnames ) - ); + // Note that various subclasses call close() at the start of open(), which itself is + // called by replaceLostConnection(). In that case, just because onTransactionResolution() + // callbacks are pending does not mean that an exception should be thrown. Rather, they + // will be executed after the reconnection step. + if ( $wasOpen ) { + // Sanity check that no callbacks are dangling + $fnames = $this->pendingWriteAndCallbackCallers(); + if ( $fnames ) { + throw new RuntimeException( + "Transaction callbacks are still pending:\n" . implode( ', ', $fnames ) + ); + } } return $closed; @@ -1444,9 +1452,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware } /** - * Clean things up after session (and thus transaction) loss + * Clean things up after session (and thus transaction) loss before reconnect */ - private function handleSessionLoss() { + private function handleSessionLossPreconnect() { // Clean up tracking of session-level things... // https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html // https://www.postgresql.org/docs/9.2/static/sql-createtable.html (ignoring ON COMMIT) @@ -1455,13 +1463,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware // https://www.postgresql.org/docs/9.4/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS $this->namedLocksHeld = []; // Session loss implies transaction loss - $this->handleTransactionLoss(); - } - - /** - * Clean things up after transaction loss - */ - private function handleTransactionLoss() { + $this->trxLevel = 0; + $this->trxAtomicCounter = 0; + $this->trxIdleCallbacks = []; // T67263; transaction already lost + $this->trxPreCommitCallbacks = []; // T67263; transaction already lost + // @note: leave trxRecurringCallbacks in place if ( $this->trxDoneWrites ) { $this->trxProfiler->transactionWritingOut( $this->server, @@ -1471,10 +1477,12 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->trxWriteAffectedRows ); } - $this->trxLevel = 0; - $this->trxAtomicCounter = 0; - $this->trxIdleCallbacks = []; // T67263; transaction already lost - $this->trxPreCommitCallbacks = []; // T67263; transaction already lost + } + + /** + * Clean things up after session (and thus transaction) loss after reconnect + */ + private function handleSessionLossPostconnect() { try { // Handle callbacks in trxEndCallbacks, e.g. onTransactionResolution(). // If callback suppression is set then the array will remain unhandled. @@ -4177,6 +4185,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->closeConnection(); $this->opened = false; $this->conn = false; + + $this->handleSessionLossPreconnect(); + try { $this->open( $this->server, @@ -4205,7 +4216,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware ); } - $this->handleSessionLoss(); + $this->handleSessionLossPostconnect(); return $ok; } @@ -4718,7 +4729,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware $this->opened = false; $this->conn = false; $this->trxEndCallbacks = []; // don't copy - $this->handleSessionLoss(); // no trx or locks anymore + $this->handleSessionLossPreconnect(); // no trx or locks anymore $this->open( $this->server, $this->user, diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index 7fbd34d02b..1a406cf9a1 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -1407,7 +1407,7 @@ abstract class DatabaseMysqlBase extends Database { } // See https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html - return in_array( $errno, [ 1022, 1216, 1217, 1137 ], true ); + return in_array( $errno, [ 1022, 1216, 1217, 1137, 1146, 1051, 1054 ], true ); } /** diff --git a/includes/libs/rdbms/database/DatabaseSqlite.php b/includes/libs/rdbms/database/DatabaseSqlite.php index 7049df5d3d..f2bc01d5b6 100644 --- a/includes/libs/rdbms/database/DatabaseSqlite.php +++ b/includes/libs/rdbms/database/DatabaseSqlite.php @@ -216,6 +216,11 @@ class DatabaseSqlite extends Database { # Enforce LIKE to be case sensitive, just like MySQL $this->query( 'PRAGMA case_sensitive_like = 1' ); + $sync = $this->sessionVars['synchronous'] ?? null; + if ( in_array( $sync, [ 'EXTRA', 'FULL', 'NORMAL' ], true ) ) { + $this->query( "PRAGMA synchronous = $sync" ); + } + return $this->conn; } diff --git a/includes/libs/rdbms/database/IDatabase.php b/includes/libs/rdbms/database/IDatabase.php index 3401541a17..6f58cc66a3 100644 --- a/includes/libs/rdbms/database/IDatabase.php +++ b/includes/libs/rdbms/database/IDatabase.php @@ -583,7 +583,7 @@ interface IDatabase { * @param string|array $options The query options. See IDatabase::select() for details. * @param string|array $join_conds The query join conditions. See IDatabase::select() for details. * - * @return array The values from the field + * @return array The values from the field in the order they were returned from the DB * @throws DBError * @since 1.25 */ diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php index a154f642e3..33dd69b8fd 100644 --- a/includes/logging/LogEntry.php +++ b/includes/logging/LogEntry.php @@ -28,9 +28,11 @@ * @since 1.19 */ +use MediaWiki\ChangeTags\Taggable; use MediaWiki\Linker\LinkTarget; use MediaWiki\User\UserIdentity; use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Assert\Assert; /** * Interface for log entries. Every log entry has these methods. @@ -436,7 +438,7 @@ class RCDatabaseLogEntry extends DatabaseLogEntry { * * @since 1.19 */ -class ManualLogEntry extends LogEntryBase { +class ManualLogEntry extends LogEntryBase implements Taggable { /** @var string Type of log entry */ protected $type; @@ -586,14 +588,30 @@ class ManualLogEntry extends LogEntryBase { * * @since 1.27 * @param string|string[]|null $tags + * @deprecated since 1.33 Please use addTags() instead */ public function setTags( $tags ) { - if ( $tags === null ) { - $tags = []; - } elseif ( is_string( $tags ) ) { + if ( $this->tags ) { + wfDebug( 'Overwriting existing ManualLogEntry tags' ); + } + $this->tags = []; + if ( $tags !== null ) { + $this->addTags( $tags ); + } + } + + /** + * Add change tags for the log entry + * + * @since 1.33 + * @param string|string[] $tags Tags to apply + */ + public function addTags( $tags ) { + if ( is_string( $tags ) ) { $tags = [ $tags ]; } - $this->tags = $tags; + Assert::parameterElementType( 'string', $tags, 'tags' ); + $this->tags = array_unique( array_merge( $this->tags, $tags ) ); } /** @@ -779,6 +797,7 @@ class ManualLogEntry extends LogEntryBase { function () use ( $newId, $to ) { $log = new LogPage( $this->getType() ); if ( !$log->isRestricted() ) { + Hooks::runWithoutAbort( 'ManualLogEntryBeforePublish', [ $this ] ); $rc = $this->getRecentChange( $newId ); if ( $to === 'rc' || $to === 'rcandudp' ) { diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php index 87b4be7803..48ea4a510f 100644 --- a/includes/media/MediaTransformOutput.php +++ b/includes/media/MediaTransformOutput.php @@ -358,7 +358,7 @@ class ThumbnailImage extends MediaTransformOutput { * @return string */ function toHtml( $options = [] ) { - global $wgPriorityHints; + global $wgPriorityHints, $wgElementTiming; if ( count( func_get_args() ) == 2 ) { throw new MWException( __METHOD__ . ' called in the old style' ); @@ -374,12 +374,19 @@ class ThumbnailImage extends MediaTransformOutput { 'decoding' => 'async', ]; + $elementTimingName = 'thumbnail'; + if ( $wgPriorityHints && !self::$firstNonIconImageRendered && $this->width * $this->height > 100 * 100 ) { self::$firstNonIconImageRendered = true; $attribs['importance'] = 'high'; + $elementTimingName = 'thumbnail-high'; + } + + if ( $wgElementTiming ) { + $attribs['elementtiming'] = $elementTimingName; } if ( !empty( $options['custom-url-link'] ) ) { diff --git a/includes/pager/TablePager.php b/includes/pager/TablePager.php index 71b1ad7246..d94104bda9 100644 --- a/includes/pager/TablePager.php +++ b/includes/pager/TablePager.php @@ -152,7 +152,7 @@ abstract class TablePager extends IndexPager { $tableClass = $this->getTableClass(); $ret = Html::openElement( 'table', [ - 'class' => "mw-datatable $tableClass" ] + 'class' => " $tableClass" ] ); $ret .= Html::rawElement( 'thead', [], Html::rawElement( 'tr', [], "\n" . $s . "\n" ) ); $ret .= Html::openElement( 'tbody' ) . "\n"; @@ -266,10 +266,11 @@ abstract class TablePager extends IndexPager { } /** + * TablePager relies on `mw-datatable` for styling, see T214208 * @return string */ protected function getTableClass() { - return 'TablePager'; + return 'mw-datatable'; } /** diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php index 288a52704e..f925038302 100644 --- a/includes/parser/BlockLevelPass.php +++ b/includes/parser/BlockLevelPass.php @@ -25,7 +25,7 @@ class BlockLevelPass { private $DTopen = false; private $inPre = false; - private $lastSection = ''; + private $lastParagraph = ''; private $lineStart; private $text; @@ -61,18 +61,29 @@ class BlockLevelPass { $this->lineStart = $lineStart; } + /** + * @return bool + */ + private function hasOpenParagraph() { + return $this->lastParagraph !== ''; + } + /** * If a pre or p is open, return the corresponding close tag and update * the state. If no tag is open, return an empty string. + * @param bool $atTheEnd Omit trailing newline if we've reached the end. * @return string */ - private function closeParagraph() { + private function closeParagraph( $atTheEnd = false ) { $result = ''; - if ( $this->lastSection !== '' ) { - $result = 'lastSection . ">\n"; + if ( $this->hasOpenParagraph() ) { + $result = 'lastParagraph . '>'; + if ( !$atTheEnd ) { + $result .= "\n"; + } } $this->inPre = false; - $this->lastSection = ''; + $this->lastParagraph = ''; return $result; } @@ -188,7 +199,11 @@ class BlockLevelPass { $pendingPTag = false; $inBlockquote = false; - foreach ( $textLines as $inputLine ) { + for ( $textLines->rewind(); $textLines->valid(); ) { + $inputLine = $textLines->current(); + $textLines->next(); + $notLastLine = $textLines->valid(); + # Fix up $lineStart if ( !$this->lineStart ) { $output .= $inputLine; @@ -341,14 +356,14 @@ class BlockLevelPass { $inBlockElem = !$closeMatch; } elseif ( !$inBlockElem && !$this->inPre ) { if ( substr( $t, 0, 1 ) == ' ' - && ( $this->lastSection === 'pre' || trim( $t ) != '' ) + && ( $this->lastParagraph === 'pre' || trim( $t ) != '' ) && !$inBlockquote ) { # pre - if ( $this->lastSection !== 'pre' ) { + if ( $this->lastParagraph !== 'pre' ) { $pendingPTag = false; $output .= $this->closeParagraph() . '
';
-							$this->lastSection = 'pre';
+							$this->lastParagraph = 'pre';
 						}
 						$t = substr( $t, 1 );
 					} elseif ( preg_match( '/^(?:]*>.*?<\\/style>\s*|]*>\s*)+$/iS', $t ) ) {
@@ -364,9 +379,9 @@ class BlockLevelPass {
 							if ( $pendingPTag ) {
 								$output .= $pendingPTag . '
'; $pendingPTag = false; - $this->lastSection = 'p'; + $this->lastParagraph = 'p'; } else { - if ( $this->lastSection !== 'p' ) { + if ( $this->lastParagraph !== 'p' ) { $output .= $this->closeParagraph(); $pendingPTag = '

'; } else { @@ -377,10 +392,10 @@ class BlockLevelPass { if ( $pendingPTag ) { $output .= $pendingPTag; $pendingPTag = false; - $this->lastSection = 'p'; - } elseif ( $this->lastSection !== 'p' ) { + $this->lastParagraph = 'p'; + } elseif ( $this->lastParagraph !== 'p' ) { $output .= $this->closeParagraph() . '

'; - $this->lastSection = 'p'; + $this->lastParagraph = 'p'; } } } @@ -393,7 +408,11 @@ class BlockLevelPass { if ( $pendingPTag === false ) { if ( $prefixLength === 0 ) { $output .= $t; - $output .= "\n"; + // Add a newline if there's an open paragraph + // or we've yet to reach the last line. + if ( $notLastLine || $this->hasOpenParagraph() ) { + $output .= "\n"; + } } else { // Trim whitespace in list items $output .= trim( $t ); @@ -403,15 +422,13 @@ class BlockLevelPass { while ( $prefixLength ) { $output .= $this->closeList( $prefix2[$prefixLength - 1] ); --$prefixLength; - if ( !$prefixLength ) { + // Note that a paragraph is only ever opened when `prefixLength` + // is zero, but we'll choose to be overly cautious. + if ( !$prefixLength && $this->hasOpenParagraph() ) { $output .= "\n"; } } - if ( $this->lastSection !== '' ) { - $output .= 'lastSection . '>'; - $this->lastSection = ''; - } - + $output .= $this->closeParagraph( true ); return $output; } diff --git a/includes/parser/RemexStripTagHandler.php b/includes/parser/RemexStripTagHandler.php index bf4c09876d..2d75c869ec 100644 --- a/includes/parser/RemexStripTagHandler.php +++ b/includes/parser/RemexStripTagHandler.php @@ -87,7 +87,10 @@ class RemexStripTagHandler implements TokenHandler { 'pre' => true, 'section' => true, 'table' => true, + 'td' => true, 'tfoot' => true, + 'th' => true, + 'tr' => true, 'ul' => true, 'video' => true, ]; diff --git a/includes/password/Password.php b/includes/password/Password.php index 8f6cb3e65a..4caff8ef5b 100644 --- a/includes/password/Password.php +++ b/includes/password/Password.php @@ -33,14 +33,6 @@ use Wikimedia\Assert\Assert; * to be fulfilled: * * If Password::toString() is called on an object, and the result is passed back in * to PasswordFactory::newFromCiphertext(), the result will be identical to the original. - * * The string representations of two Password objects are equal only if - * the original plaintext passwords match. In other words, if the toString() result of - * two objects match, the passwords are the same, and the user will be logged in. - * Since the string representation of a hash includes its type name (@see Password::toString), - * this property is preserved across all classes that inherit Password. - * If a hashing scheme does not fulfill this expectation, it must make sure to override the - * Password::equals() function and use custom comparison logic. However, this is not - * recommended unless absolutely required by the hashing mechanism. * With these two points in mind, when creating a new Password sub-class, there are some functions * you have to override (because they are abstract) and others that you may want to override. * @@ -56,8 +48,9 @@ use Wikimedia\Assert\Assert; * * Password::toString(), which can be useful if the hash was changed in the constructor and * needs to be re-assembled before being returned as a string. This function is expected to add * the type back on to the hash, so make sure to do that if you override the function. - * * Password::equals() - This function compares two Password objects to see if they are equal. - * The default is to just do a timing-safe string comparison on the $this->hash values. + * * Password::verify() - This function checks if $this->hash was generated with the given + * password. The default is to just hash the password and do a timing-safe string comparison with + * $this->hash. * * After creating a new password hash type, it can be registered using the static * Password::register() method. The default type is set using the Password::setDefaultType() type. diff --git a/includes/preferences/DefaultPreferencesFactory.php b/includes/preferences/DefaultPreferencesFactory.php index a42726f7b4..b2f5342ad2 100644 --- a/includes/preferences/DefaultPreferencesFactory.php +++ b/includes/preferences/DefaultPreferencesFactory.php @@ -870,6 +870,17 @@ class DefaultPreferencesFactory implements PreferencesFactory { 'section' => 'rendering/advancedrendering', 'label-message' => 'tog-showrollbackconfirmation', ]; + + /** + * FIXME + * Remove temporary help text and references to DisableRollbackConfirmationFeature + * after release of rollback feature. See T199534 + */ + if ( MediaWikiServices::getInstance() + ->getMainConfig()->get( 'DisableRollbackConfirmationFeature' ) ) { + $defaultPreferences['showrollbackconfirmation'] + ['help-message'] = 'tog-showrollbackconfirmation-prerelease-warning'; + } } } diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php index 7ddf587c9b..221359da27 100644 --- a/includes/revisiondelete/RevDelList.php +++ b/includes/revisiondelete/RevDelList.php @@ -224,8 +224,21 @@ abstract class RevDelList extends RevisionListBase { } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) { $authorIPs[] = $item->getAuthorName(); } - } - if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) { + if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) { + $actorId = $item->getAuthorActor(); + // During migration, the actor field might be empty. If so, populate + // it here. + if ( !$actorId ) { + if ( $item->getAuthorId() > 0 ) { + $user = User::newFromId( $item->getAuthorId() ); + } else { + $user = User::newFromName( $item->getAuthorName(), false ); + } + $actorId = $user->getActorId( $dbw ); + } + $authorActors[] = $actorId; + } + } elseif ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) { $authorActors[] = $item->getAuthorActor(); } diff --git a/includes/session/SessionProvider.php b/includes/session/SessionProvider.php index 1f015b52e6..781fc337a0 100644 --- a/includes/session/SessionProvider.php +++ b/includes/session/SessionProvider.php @@ -374,7 +374,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI public function preventSessionsForUser( $username ) { if ( !$this->canChangeUser() ) { throw new \BadMethodCallException( - __METHOD__ . ' must be implmented when canChangeUser() is false' + __METHOD__ . ' must be implemented when canChangeUser() is false' ); } } diff --git a/includes/site/FileBasedSiteLookup.php b/includes/site/FileBasedSiteLookup.php index c168a47ffb..174d667651 100644 --- a/includes/site/FileBasedSiteLookup.php +++ b/includes/site/FileBasedSiteLookup.php @@ -21,14 +21,10 @@ */ /** - * Provides a file-based cache of a SiteStore. The sites are stored in - * a json file. (see docs/sitescache.txt regarding format) - * - * The cache can be built with the rebuildSitesCache.php maintenance script, - * and a MediaWiki instance can be setup to use this by setting the - * 'wgSitesCacheFile' configuration to the cache file location. + * Provides a file-based cache of a SiteStore, using a json file. * * @since 1.25 + * @deprecated since 1.33 Use CachingSiteStore instead. */ class FileBasedSiteLookup implements SiteLookup { @@ -46,6 +42,7 @@ class FileBasedSiteLookup implements SiteLookup { * @param string $cacheFile */ public function __construct( $cacheFile ) { + wfDeprecated( __CLASS__, '1.33' ); $this->cacheFile = $cacheFile; } diff --git a/includes/site/SitesCacheFileBuilder.php b/includes/site/SitesCacheFileBuilder.php deleted file mode 100644 index f0d6ce1026..0000000000 --- a/includes/site/SitesCacheFileBuilder.php +++ /dev/null @@ -1,113 +0,0 @@ -siteLookup = $siteLookup; - $this->cacheFile = $cacheFile; - } - - public function build() { - $this->sites = $this->siteLookup->getSites(); - $this->cacheSites( $this->sites->getArrayCopy() ); - } - - /** - * @param Site[] $sites - * - * @throws MWException if in manualRecache mode - * @return bool - */ - private function cacheSites( array $sites ) { - $sitesArray = []; - - foreach ( $sites as $site ) { - $globalId = $site->getGlobalId(); - $sitesArray[$globalId] = $this->getSiteAsArray( $site ); - } - - $json = json_encode( [ - 'sites' => $sitesArray - ] ); - - $result = file_put_contents( $this->cacheFile, $json ); - - return $result !== false; - } - - /** - * @param Site $site - * - * @return array - */ - private function getSiteAsArray( Site $site ) { - $siteEntry = unserialize( $site->serialize() ); - $siteIdentifiers = $this->buildLocalIdentifiers( $site ); - $identifiersArray = []; - - foreach ( $siteIdentifiers as $identifier ) { - $identifiersArray[] = $identifier; - } - - $siteEntry['identifiers'] = $identifiersArray; - - return $siteEntry; - } - - /** - * @param Site $site - * - * @return array Site local identifiers - */ - private function buildLocalIdentifiers( Site $site ) { - $localIds = []; - - foreach ( $site->getLocalIds() as $idType => $ids ) { - foreach ( $ids as $id ) { - $localIds[] = [ - 'type' => $idType, - 'key' => $id - ]; - } - } - - return $localIds; - } - -} diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php index c29c9963bf..a9c0993e29 100644 --- a/includes/skins/SkinTemplate.php +++ b/includes/skins/SkinTemplate.php @@ -171,6 +171,9 @@ class SkinTemplate extends Skin { return $languageLinks; } + /** + * @return QuickTemplate + */ protected function setupTemplateForOutput() { $request = $this->getRequest(); $user = $this->getUser(); @@ -389,8 +392,11 @@ class SkinTemplate extends Skin { if ( $out->isArticle() ) { if ( $this->isRevisionCurrent() ) { if ( $wgMaxCredits != 0 ) { - $tpl->set( 'credits', Action::factory( 'credits', $this->getWikiPage(), - $this->getContext() )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); + /** @var CreditsAction $action */ + $action = Action::factory( + 'credits', $this->getWikiPage(), $this->getContext() ); + $tpl->set( 'credits', + $action->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); } else { $tpl->set( 'lastmod', $this->lastModified() ); } @@ -526,7 +532,9 @@ class SkinTemplate extends Skin { $html = ''; if ( $personalTools === null ) { - $personalTools = $tpl->getPersonalTools(); + $personalTools = ( $tpl instanceof BaseTemplate ) + ? $tpl->getPersonalTools() + : []; } foreach ( $personalTools as $key => $item ) { @@ -547,7 +555,7 @@ class SkinTemplate extends Skin { $tpl = $this->setupTemplateForOutput(); $tpl->set( 'personal_urls', $this->buildPersonalUrls() ); - return $tpl->getPersonalTools(); + return ( $tpl instanceof BaseTemplate ) ? $tpl->getPersonalTools() : []; } /** diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index 7330e7751e..02a8d009d4 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -308,6 +308,18 @@ class SpecialBlock extends FormSpecialPage { 'cssclass' => 'mw-block-confirm', ]; + // Block Id if a block already exists matching the target + $a['BlockId'] = [ + 'type' => 'hidden', + 'default' => '', + ]; + + // Has the form been submitted + $a['WasPosted'] = [ + 'type' => 'hidden', + 'default' => '', + ]; + $this->maybeAlterFormDefaults( $a ); // Allow extensions to add more fields @@ -383,10 +395,16 @@ class SpecialBlock extends FormSpecialPage { $fields['Expiry']['default'] = wfTimestamp( TS_RFC2822, $block->mExpiry ); } + $fields['BlockId']['default'] = $block->getId(); + $this->alreadyBlocked = true; $this->preErrors[] = [ 'ipb-needreblock', wfEscapeWikiText( (string)$block->getTarget() ) ]; } + if ( $this->getRequest()->wasPosted() ) { + $fields['WasPosted']['default'] = true; + } + # We always need confirmation to do HideUser if ( $this->requestedHideUser ) { $fields['Confirm']['type'] = 'check'; diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php index b51f92fa09..99e6dde7f0 100644 --- a/includes/specials/SpecialConfirmemail.php +++ b/includes/specials/SpecialConfirmemail.php @@ -148,7 +148,7 @@ class EmailConfirmation extends UnlistedSpecialPage { * @param string $code Confirmation code */ private function attemptConfirm( $code ) { - $user = User::newFromConfirmationCode( $code, User::READ_LATEST ); + $user = User::newFromConfirmationCode( $code, User::READ_EXCLUSIVE ); if ( !is_object( $user ) ) { $this->getOutput()->addWikiMsg( 'confirmemail_invalid' ); diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index 3e560ada45..529c33185e 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -199,7 +199,7 @@ class SpecialUndelete extends SpecialPage { } else { $this->showFile( $this->mFilename ); } - } elseif ( $this->mAction === "submit" ) { + } elseif ( $this->mAction === 'submit' ) { if ( $this->mRestore ) { $this->undelete(); } elseif ( $this->mRevdel ) { @@ -223,13 +223,14 @@ class SpecialUndelete extends SpecialPage { foreach ( $this->getRequest()->getValues() as $key => $val ) { $matches = []; if ( preg_match( "/^ts(\d{14})$/", $key, $matches ) ) { - $revisions[ $archive->getRevision( $matches[1] )->getId() ] = 1; + $revisions[$archive->getRevision( $matches[1] )->getId()] = 1; } } + $query = [ - "type" => "revision", - "ids" => $revisions, - "target" => $this->mTargetObj->getPrefixedText() + 'type' => 'revision', + 'ids' => $revisions, + 'target' => $this->mTargetObj->getPrefixedText() ]; $url = SpecialPage::getTitleFor( 'Revisiondelete' )->getFullURL( $query ); $this->getOutput()->redirect( $url ); diff --git a/includes/user/User.php b/includes/user/User.php index 277731a0e5..fe15034c4e 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -1414,10 +1414,6 @@ class User implements IDBAccessObject, UserIdentity { ] ); if ( $shouldSetCookie ) { $block->setCookie( $this->getRequest()->response() ); - - // temporary measure the use of cookies on ip blocks - $stats = MediaWikiServices::getInstance()->getStatsdDataFactory(); - $stats->increment( 'block.ipblock.setCookie.success' ); } } elseif ( $this->isLoggedIn() && $config->get( 'CookieSetOnAutoblock' ) ) { $shouldSetCookie = $block->getType() === Block::TYPE_USER && $block->isAutoblocking(); @@ -1829,7 +1825,7 @@ class User implements IDBAccessObject, UserIdentity { * Check when actually saving should be done against master. */ private function getBlockedStatus( $bFromReplica = true ) { - global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff, $wgSoftBlockRanges; + global $wgProxyWhitelist, $wgApplyIpBlocksToXff, $wgSoftBlockRanges; if ( $this->mBlockedby != -1 ) { return; @@ -1848,15 +1844,14 @@ class User implements IDBAccessObject, UserIdentity { # user is not immune to autoblocks/hardblocks, and they are the current user so we # know which IP address they're actually coming from $ip = null; - if ( !$this->isAllowed( 'ipblock-exempt' ) ) { - // $wgUser->getName() only works after the end of Setup.php. Until - // then, assume it's a logged-out user. - $globalUserName = $wgUser->isSafeToLoad() - ? $wgUser->getName() - : IP::sanitizeIP( $wgUser->getRequest()->getIP() ); - if ( $this->getName() === $globalUserName ) { - $ip = $this->getRequest()->getIP(); - } + $sessionUser = RequestContext::getMain()->getUser(); + // the session user is set up towards the end of Setup.php. Until then, + // assume it's a logged-out user. + $globalUserName = $sessionUser->isSafeToLoad() + ? $sessionUser->getName() + : IP::sanitizeIP( $sessionUser->getRequest()->getIP() ); + if ( $this->getName() === $globalUserName && !$this->isAllowed( 'ipblock-exempt' ) ) { + $ip = $this->getRequest()->getIP(); } // User/IP blocking @@ -1935,9 +1930,9 @@ class User implements IDBAccessObject, UserIdentity { } // Avoid PHP 7.1 warning of passing $this by reference - $user = $this; + $thisUser = $this; // Extensions - Hooks::run( 'GetBlockedStatus', [ &$user ] ); + Hooks::run( 'GetBlockedStatus', [ &$thisUser ] ); } /** @@ -2762,17 +2757,16 @@ class User implements IDBAccessObject, UserIdentity { /** * Generate a current or new-future timestamp to be stored in the * user_touched field when we update things. + * * @return string Timestamp in TS_MW format */ private function newTouchedTimestamp() { - global $wgClockSkewFudge; - - $time = wfTimestamp( TS_MW, time() + $wgClockSkewFudge ); - if ( $this->mTouched && $time <= $this->mTouched ) { - $time = wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $this->mTouched ) + 1 ); + $time = time(); + if ( $this->mTouched ) { + $time = max( $time, wfTimestamp( TS_UNIX, $this->mTouched ) + 1 ); } - return $time; + return wfTimestamp( TS_MW, $time ); } /** diff --git a/includes/watcheditem/WatchedItemStore.php b/includes/watcheditem/WatchedItemStore.php index e092859089..8aca689a24 100644 --- a/includes/watcheditem/WatchedItemStore.php +++ b/includes/watcheditem/WatchedItemStore.php @@ -211,6 +211,10 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac } } } + + $pageSeenKey = $this->getPageSeenTimestampsKey( $user ); + $this->latestUpdateCache->delete( $pageSeenKey ); + $this->stash->delete( $pageSeenKey ); } /** @@ -805,36 +809,64 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac } /** + * Set the "last viewed" timestamps for certain titles on a user's watchlist. + * + * If the $targets parameter is omitted or set to [], this method simply wraps + * resetAllNotificationTimestampsForUser(), and in that case you should instead call that method + * directly; support for omitting $targets is for backwards compatibility. + * + * If $targets is omitted or set to [], timestamps will be updated for every title on the user's + * watchlist, and this will be done through a DeferredUpdate. If $targets is a non-empty array, + * only the specified titles will be updated, and this will be done immediately (not deferred). + * * @since 1.27 * @param User $user - * @param string|int $timestamp - * @param LinkTarget[] $targets + * @param string|int $timestamp Value to set the "last viewed" timestamp to (null to clear) + * @param LinkTarget[] $targets Titles to set the timestamp for; [] means the entire watchlist * @return bool */ public function setNotificationTimestampsForUser( User $user, $timestamp, array $targets = [] ) { // Only loggedin user can have a watchlist - if ( $user->isAnon() ) { + if ( $user->isAnon() || $this->readOnlyMode->isReadOnly() ) { return false; } - $dbw = $this->getConnectionRef( DB_MASTER ); - - $conds = [ 'wl_user' => $user->getId() ]; - if ( $targets ) { - $batch = new LinkBatch( $targets ); - $conds[] = $batch->constructSet( 'wl', $dbw ); + if ( !$targets ) { + // Backwards compatibility + $this->resetAllNotificationTimestampsForUser( $user, $timestamp ); + return true; } + $rows = $this->getTitleDbKeysGroupedByNamespace( $targets ); + + $dbw = $this->getConnectionRef( DB_MASTER ); if ( $timestamp !== null ) { $timestamp = $dbw->timestamp( $timestamp ); } + $ticket = $this->lbFactory->getEmptyTransactionTicket( __METHOD__ ); + $affectedSinceWait = 0; - $dbw->update( - 'watchlist', - [ 'wl_notificationtimestamp' => $timestamp ], - $conds, - __METHOD__ - ); + // Batch update items per namespace + foreach ( $rows as $namespace => $namespaceTitles ) { + $rowBatches = array_chunk( $namespaceTitles, $this->updateRowsPerQuery ); + foreach ( $rowBatches as $toUpdate ) { + $dbw->update( + 'watchlist', + [ 'wl_notificationtimestamp' => $timestamp ], + [ + 'wl_user' => $user->getId(), + 'wl_namespace' => $namespace, + 'wl_title' => $toUpdate + ] + ); + $affectedSinceWait += $dbw->affectedRows(); + // Wait for replication every time we've touched updateRowsPerQuery rows + if ( $affectedSinceWait >= $this->updateRowsPerQuery ) { + $this->lbFactory->commitAndWaitForReplication( __METHOD__, $ticket ); + $affectedSinceWait = 0; + } + } + } $this->uncacheUser( $user ); @@ -859,7 +891,13 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac return $timestamp; } - public function resetAllNotificationTimestampsForUser( User $user ) { + /** + * Schedule a DeferredUpdate that sets all of the "last viewed" timestamps for a given user + * to the same value. + * @param User $user + * @param string|int|null $timestamp Value to set all timestamps to, null to clear them + */ + public function resetAllNotificationTimestampsForUser( User $user, $timestamp = null ) { // Only loggedin user can have a watchlist if ( $user->isAnon() ) { return; @@ -868,7 +906,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac // If the page is watched by the user (or may be watched), update the timestamp $job = new ClearWatchlistNotificationsJob( $user->getUserPage(), - [ 'userId' => $user->getId(), 'casTime' => time() ] + [ 'userId' => $user->getId(), 'timestamp' => $timestamp, 'casTime' => time() ] ); // Try to run this post-send @@ -1191,7 +1229,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac } /** - * @param TitleValue[] $titles + * @param LinkTarget[] $titles * @return array */ private function getTitleDbKeysGroupedByNamespace( array $titles ) { diff --git a/languages/Language.php b/languages/Language.php index aaaf2a206c..9eea7ab1b8 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -2838,11 +2838,14 @@ class Language { } /** + * TODO: $s is not always a string per T218883 * @param string $s * @return string */ function checkTitleEncoding( $s ) { - Assert::parameterType( 'string', $s, '$s' ); + if ( is_array( $s ) ) { + throw new MWException( 'Given array to checkTitleEncoding.' ); + } if ( StringUtils::isUtf8( $s ) ) { return $s; } diff --git a/languages/i18n/aeb-arab.json b/languages/i18n/aeb-arab.json index 7d2a59b378..0c06ebf611 100644 --- a/languages/i18n/aeb-arab.json +++ b/languages/i18n/aeb-arab.json @@ -223,8 +223,8 @@ "createacct-yourpasswordagain-ph": "دخّل كلمة السر مرة أخرى", "yourdomainname": "نطاقك:", "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.", - "login": "ادخل", - "logout": "اخرج", + "login": "دخول", + "logout": "خروج", "userlogout": "خروج", "notloggedin": "غير مسجل الدخول", "createaccount": "أنشئ حسابا", diff --git a/languages/i18n/ais.json b/languages/i18n/ais.json index ce464142a8..fb82b2ece7 100644 --- a/languages/i18n/ais.json +++ b/languages/i18n/ais.json @@ -2015,7 +2015,6 @@ "revertpage": "mapatiku tuway [[Special:Contributions/$2|$2]] ([[User talk:$2|sasukamu]]) a mikawaway-kalumyiti sazikuzay nay [[User:$1|$1]] amisumad nu ayaway a baziyong", "revertpage-nouser": "mapatiku tu midimut misaungayay ku mikawaway-kalumyiti malasazikuz {{GENDER:$1|[[User:$1|$1]]}} masumad nu ayaway a baziyong", "rollback-success": "mapatiku tuway {{GENDER:$3|$1}} mapasanga’ay a mikawaway-kalumyiti;\nmisumad tatiku nay {{GENDER:$4|$2}} masumad nu ayaway sazikuzay a baziyong.", - "rollback-success-notify": "mapatiku $1 nikawawan mikawaway-kalumyiti;\nmisumad patiku ta $2 masumad nu ayaway a sazikuz cacay baziyong. [$3 paazih ku masumaday]", "sessionfailure-title": "kasasiket mungangaw", "sessionfailure": "kisu patalabu kasasiketan mahiza simunday,\nsaka pataayaw-milangat kasasiketan maalaw atu madebung, tina saungay mapalawpes tuway.\npitatiku ayaway a kasabelih, miliyaw maasip kya kasabelih pitaneng aca.", "changecontentmodel": "misumad lacul tatudungen misanga’", diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index c0a0cd777d..e470bb809c 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -479,7 +479,7 @@ "login-security": "توكيد هويتك", "nav-login-createaccount": "دخول / إنشاء حساب", "logout": "تسجيل الخروج", - "userlogout": "اخرج", + "userlogout": "خروج", "notloggedin": "غير مسجل للدخول", "userlogin-noaccount": "ليس لديك حساب؟", "userlogin-joinproject": "انضم إلى {{SITENAME}}", @@ -2332,7 +2332,6 @@ "revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]", "revertpage-nouser": "استرجع تعديلات مستخدم مخفي حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "تم استرجاع تعديلات {{GENDER:$3|$1}}، حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.", - "rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]", "sessionfailure-title": "فشل في الجلسة", "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك أعد إرسال الاستمارة مرة أخرى.", "changecontentmodel": "تغيير نموذج المحتوى لصفحة", @@ -2500,8 +2499,8 @@ "whatlinkshere-next": "{{PLURAL:$1|التالية|ال$1 التالية}}", "whatlinkshere-links": "وصلات", "whatlinkshere-hideredirs": "$1 التحويلات", - "whatlinkshere-hidetrans": "$1 تضمينات", - "whatlinkshere-hidelinks": "$1 وصلات", + "whatlinkshere-hidetrans": "$1 التضمينات", + "whatlinkshere-hidelinks": "$1 الوصلات", "whatlinkshere-hideimages": "$1 وصلات الملفات", "whatlinkshere-filters": "مرشحات", "whatlinkshere-submit": "اذهب", diff --git a/languages/i18n/arq.json b/languages/i18n/arq.json index 23536d4188..dbb0288c71 100644 --- a/languages/i18n/arq.json +++ b/languages/i18n/arq.json @@ -480,7 +480,7 @@ "loginlanguagelabel": "اللوغه: $1", "suspicious-userlogout": "المطلب تاعك باش تسجّل خارج ما تسجّلش خاطر راه يبان مرسول من عند بحّار معطّل ولا خزّان تاع وسّاط (proxy cache).", "createacct-another-realname-tip": "السميّة الحقّانيّة ماشي ملزومة.\nيلا تستعملها غادي تصلاح باش تنسّب ليك الخدمة الّي غادي تديرها.", - "pt-login": "ادخل", + "pt-login": "دخول", "pt-login-button": "دخول", "pt-login-continue-button": "واصل الدخول", "pt-createaccount": "اصنع حساب", diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index 82d02142ce..b66914bb12 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -2251,7 +2251,6 @@ "revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]", "revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]", "sessionfailure-title": "Fallu de sesión", "sessionfailure": "Paez qu'hai un problema col aniciu de sesión;\natayóse esta aición por precaución escontra secuestru de sesiones.\nUnvia'l formulariu otra vegada.", "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina", diff --git a/languages/i18n/az.json b/languages/i18n/az.json index e608d9f822..b917b9de32 100644 --- a/languages/i18n/az.json +++ b/languages/i18n/az.json @@ -635,7 +635,7 @@ "editingold": "'''DİQQƏT! Siz bu səhifənin köhnə versiyasını redaktə edirsiniz. Məqaləni yaddaşda saxlayacağınız halda bu versiyadan sonra edilmiş hər bir dəyişiklik itiriləcək.'''", "yourdiff": "Fərqlər", "copyrightwarning": "Xahiş olunur diqqətə alasınız ki, {{SITENAME}}dakı bütün fəaliyyətləriniz $2 lisenziyasına tabe olduğu hesab edilir (təfərrüat üçün bax: $1). Əgər yazdıqlarınızın əsaslı şəkildə redaktə edilməsini və istənildiyi vaxt başqa yerə ötürülməsini istəmirsinizsə, yazılarınızı burada dərc etməyin.\n
\nSiz eyni zamanda söz verirsiniz ki, bu yazıları siz özünüz yazmısınız və ya onları hamıya açıq mühitdən ya da buna bənzər mənbədən köçürmüsünüz.\n\n----\n\n

MÜƏLLİF HÜQUQLARI İLƏ QORUNMUŞ HEÇ BİR İŞİ İCAZƏSİZ DƏRC ETMƏYİN!
", - "semiprotectedpagewarning": "'''Qeyd:''' Bu səhifə mühafizəli olduğu üçün yalnız qeydiyyatdan keçmiş istifadəçilər redaktə edə bilərlər.", + "semiprotectedpagewarning": "'''Qeyd:''' Bu səhifə mühafizəli olduğu üçün onu yalnız qeydiyyatdan keçmiş istifadəçilər redaktə edə bilərlər.", "titleprotectedwarning": "'''DİQQƏT! Bu səhifə mühafizəlidir, yalnız [[Special:ListGroupRights|icazəsi olan]] istifadəçilər onu redaktə edə bilərlər.'''", "templatesused": "Bu səhifədə istifadə edilmiş {{PLURAL:$1|şablon|şablonlar}}:", "templatesusedpreview": "Bu sınaq göstərişində istifadə edilmiş {{PLURAL:$1|şablon|şablonlar}}:", diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json index 8a7e4bcc54..5e9f93e06e 100644 --- a/languages/i18n/ba.json +++ b/languages/i18n/ba.json @@ -2161,7 +2161,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|фекер алышыу]]) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды", "revertpage-nouser": "(Ҡатнашыусының исеме йәшерелгән) үҙгәртеүҙәре {{GENDER:$1|[[User:$1|$1]]}}өлгөһөнә ҡайтарылды", "rollback-success": "{{GENDER:$3|$1}} үҙгәртеүҙәре кире алынды; {{GENDER:$4|$2}} версияһына ҡайтарылды.", - "rollback-success-notify": "Төҙәтеүҙәр кире тейәлгән $1; һуңғы $2 версияға кире ҡайтыу. [$3 Үҙгәрештәрҙе күрһәтеү]", "sessionfailure-title": "Сеанс хатаһы", "sessionfailure": "Хәҙерге сеанста хаталар килеп сыҡҡан, булырға тейеш;\n\"сеансты баҫып алыу\"ға юл ҡуймау өсөн был ғәмәл үтәлмәне.\nАлдағы биткә кире ҡайтығыҙ, битте яңыртығыҙ һәм яңынан ҡабатлап ҡарағыҙ.", "changecontentmodel": "Биттең контент моделен мөхәррирләү", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index a693179ddb..39b9597056 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -2270,7 +2270,6 @@ "revertpage": "Рэдагаваньні [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]]) скасаваныя да папярэдняй вэрсіі [[User:$1|$1]]", "revertpage-nouser": "Рэдагаваньні схаванага ўдзельніка скасаваныя да папярэдняй вэрсіі {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Адмененыя рэдагаваньні {{GENDER:$3|$1}};\nвернутая папярэдняя вэрсія {{GENDER:$4|$2}}.", - "rollback-success-notify": "Адмененыя праўкі $1;\nвернутая папярэдняя вэрсія $2. [$3 Паказаць зьмены]", "sessionfailure-title": "Памылка сэсіі", "sessionfailure": "Магчыма ўзьніклі праблемы ў вашым цяперашнім сэансе працы;\nгэтае дзеяньне было скасаванае для прадухіленьня перахопу сэансу.\nКалі ласка, падайце форму яшчэ раз.", "changecontentmodel": "Зьмена мадэлі зьместу старонкі", diff --git a/languages/i18n/be.json b/languages/i18n/be.json index 979e34dbbc..8f7bc9b74d 100644 --- a/languages/i18n/be.json +++ b/languages/i18n/be.json @@ -2209,7 +2209,6 @@ "revertpage": "Праўкі аўтарства [[Special:Contributions/$2|$2]] ([[User talk:$2|размова]]) адкочаныя; вернута апошняя версія аўтарства [[User:$1|$1]]", "revertpage-nouser": "Праўкі (імя ўдзельніка схавана) адкочаны да версіі {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Адкочаны праўкі {{GENDER:$3|$1}}; вернута апошняя версія {{GENDER:$4|$2}}.", - "rollback-success-notify": "Адкочаны праўкі $1;\nвернута апошняя версія $2. [$3 Паказаць змены]", "sessionfailure-title": "Памылка сеансу", "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.", "changecontentmodel": "Змяніць мадэль змесціва старонкі", diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json index ac164d1039..12ce570d11 100644 --- a/languages/i18n/bg.json +++ b/languages/i18n/bg.json @@ -1679,6 +1679,10 @@ "uploadstash-refresh": "Обновяване на списъка с файлове", "uploadstash-thumbnail": "преглед на миниатюра", "uploadstash-bad-path-unknown-type": "Неизвестен тип „$1“.", + "uploadstash-wrong-owner": "Файлът ($1) не принадлежи на текущия потребител.", + "uploadstash-no-such-key": "Няма такъв ключ ($1), не може да бъде премахнат.", + "uploadstash-no-extension": "Разширението е нулево.", + "uploadstash-zero-length": "Файлът е с нулева дължина.", "img-auth-accessdenied": "Достъпът е отказан", "img-auth-nopathinfo": "Липсва информация за пътя.\nВашият сървър трябва да бъде настроен да предава променливите REQUEST_URI и PATH_INFO .\nАко това е така, опитайте да активирате $wgUsePathInfo.\n\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.", @@ -1696,6 +1700,7 @@ "http-timed-out": "Пресрочено време за HTTP заявка.", "http-curl-error": "Грешка при извличането на URL: $1", "http-bad-status": "Настъпи проблем по време на HTTP заявката: $1 $2", + "http-internal-error": "Вътрешна грешка в HTTP.", "upload-curl-error6": "Не е възможно достигането на указания URL адрес", "upload-curl-error6-text": "Търсеният адрес не може да бъде достигнат.\nПроверете дали е написан вярно и дали сайтът не е паднал.", "upload-curl-error28": "Времето за качване изтече", @@ -1766,6 +1771,7 @@ "filerevert-submit": "Връщане", "filerevert-success": "Файлът [[Media:$1|$1]] беше възвърнат към [$4 версия от $3, $2].", "filerevert-badversion": "Не съществува предишна локална версия на файла със зададения времеви отпечатък.", + "filerevert-identical": "Текущата версия на файла е идентична с избраната.", "filedelete": "Изтриване на $1", "filedelete-legend": "Изтриване на файл", "filedelete-intro": "На път сте да изтриете файла [[Media:$1|$1]] заедно с цялата му редакционна история.", @@ -1862,7 +1868,9 @@ "wantedpages-badtitle": "Невалидно заглавие в резултатното множество: $1", "wantedfiles": "Желани файлове", "wantedfiletext-cat": "Следните файлове се използват, но не съществуват. Файлове от външни хранилища могат да бъдат показани. Всички подобни неверни положителни резултати ще бъдат зачеркнати. Също така, страниците, които включват файлове, които не съществуват са включени в [[:$1]].", + "wantedfiletext-cat-noforeign": "Следните файлове се използват, но не съществуват. Страниците с несъществуващи файлове са изброени в [[:$1]].", "wantedfiletext-nocat": "Следните файлове се използват, но не съществуват. Възможно е да са включени файлове от външни хранилища, въпреки че съществуват. Всички такива случаи на възможна фалшива тревога ще бъдат показвани зачеркнати.", + "wantedfiletext-nocat-noforeign": "Следните файлове се използват, но не съществуват.", "wantedtemplates": "Желани шаблони", "mostlinked": "Най-препращани страници", "mostlinkedcategories": "Най-препращани категории", @@ -1925,6 +1933,8 @@ "apihelp": "Помощ за API-то", "apihelp-no-such-module": "Модул „$1“ не беше намерен.", "apisandbox": "Пясъчник за API", + "apisandbox-jsonly": "Необходим е JavaScript, за да използвате API пясъчника.", + "apisandbox-api-disabled": "API е изключен за този сайт.", "apisandbox-submit": "Направи запитване", "apisandbox-reset": "Изчистване", "apisandbox-retry": "Повторен опит", @@ -1945,6 +1955,8 @@ "apisandbox-results": "Резултати", "apisandbox-sending-request": "Изпращане на API заявка...", "apisandbox-loading-results": "Получаване на API резултати...", + "apisandbox-request-selectformat-label": "Показване на заявката с данни като:", + "apisandbox-request-format-url-label": "URL-низ на заявката", "apisandbox-request-url-label": "URL-адрес на заявката:", "apisandbox-request-format-json-label": "JSON", "apisandbox-request-json-label": "JSON заявка:", @@ -2054,8 +2066,13 @@ "trackingcategories-desc": "Критерий за включване на категория", "restricted-displaytitle-ignored": "Страници с игнорирани заглавия за показване", "restricted-displaytitle-ignored-desc": "Страницата съдържа игнориран {{DISPLAYTITLE}}, защото той не съвпада с действителното заглавие на страницата.", + "noindex-category-desc": "Страницата не се индексира от роботи, защото съдържа вълшебната думичка __NOINDEX__ и е от именно пространство, в което такова отбелязване е позволено.", + "index-category-desc": "Страницата съдържа __INDEX__ (и е от именно пространство, в което такова отбелязване е позволено), поради което се индексира от роботи, където обикновено не би била индексирана.", + "post-expand-template-inclusion-category-desc": "Страницата е по-голяма от $wgMaxArticleSize след разгръщането на всички шаблони, поради което някои шаблони не са разгърнати.", + "post-expand-template-argument-category-desc": "Страницата е по-голяма от $wgMaxArticleSize след разгръщането на аргументите на шаблона (нещо в тройни фигурни скоби, например {{{Foo}}}).", "expensive-parserfunction-category-desc": "Страницата използва твърде много ресурсоемки анализиращи функции (като #ifexist). Вижте [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].", "broken-file-category-desc": "Страницата съдържа повредена препратка към файл (препратка за поставяне на файл, когато такъв не съществува).", + "hidden-category-category-desc": "Категорията съдържа __HIDDENCAT__, което предотвратява показването ѝ в страниците по подразбиране.", "trackingcategories-nodesc": "Няма налично описание.", "trackingcategories-disabled": "Категорията е деактивирана", "mailnologin": "Няма електронна поща", @@ -2177,6 +2194,7 @@ "rollbacklinkcount": "отмяна на $1 {{PLURAL:$1|редакция|редакции}}", "rollbacklinkcount-morethan": "отмяна на повече от $1 {{PLURAL:$1|редакция|редакции}}", "rollbackfailed": "Отмяната не сполучи", + "rollback-missingparam": "Липсващи задължителни параметри на заявката.", "rollback-missingrevision": "Данните за версията не могат да бъдат заредени.", "cantrollback": "Не може да се извърши отмяна на редакциите. Последният редактор е и единствен автор на страницата.", "alreadyrolled": "Редакцията на [[:$1]], направена от [[User:$2|$2]] ([[User talk:$2|Беседа]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), не може да бъде отменена. Някой друг вече е редактирал страницата или е отменил промените.\n\nПоследната редакция е на [[User:$3|$3]] ([[User talk:$3|Беседа]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", @@ -2304,6 +2322,7 @@ "namespace": "Именно пространство:", "invert": "Обръщане на избора", "tooltip-invert": "Поставянето на отметка ще скрие всички промени в страниците от избраното именно пространство (и свързаните именни пространства)", + "tooltip-whatlinkshere-invert": "Отбележете полето, за да скриете препратки от страници от избраното именно пространство.", "namespace_association": "Свързани именни пространства", "tooltip-namespace_association": "Поставянето на отметка ще включи и беседите и именните пространства, свързани с избраното именно пространство.", "blanknamespace": "(Основно)", @@ -2374,6 +2393,9 @@ "ipb-disableusertalk": "Редактиране на собствената дискусионна страница", "ipb-change-block": "Повторно блокиране на потребителя с тези настройки", "ipb-confirm": "Потвърждаване на блокирането", + "ipb-sitewide": "За всички уикита", + "ipb-partial": "Частично", + "ipb-partial-help": "Конкретни страници или именни пространства.", "ipb-pages-label": "Страници", "ipb-namespaces-label": "Именни пространства", "badipaddress": "Невалиден IP-адрес", @@ -2516,6 +2538,7 @@ "move-watch": "Наблюдаване на изходната и целевата страници", "movepagebtn": "Преместване", "pagemovedsub": "Преместването беше успешно", + "cannotmove": "Страницата не може да бъде преместена, поради {{PLURAL:следната причина|следните $1 причини}}:", "movepage-moved": "Страницата „$1“ беше преместена под името „$2“", "movepage-moved-redirect": "Беше създадено пренасочване.", "movepage-moved-noredirect": "Създаването на пренасочване беше спряно.", @@ -3337,6 +3360,7 @@ "expand_templates_input": "Входящ уикитекст:", "expand_templates_output": "Резултат", "expand_templates_xml_output": "Изход на XML", + "expand_templates_html_output": "Суров HTML изход", "expand_templates_ok": "ОК", "expand_templates_remove_comments": "Премахване на коментари", "expand_templates_remove_nowiki": "Потискане на елементите в резултата", @@ -3412,6 +3436,7 @@ "mw-widgets-titleinput-description-redirect": "пренасочване към $1", "mw-widgets-categoryselector-add-category-placeholder": "Добавяне на категория...", "mw-widgets-usersmultiselect-placeholder": "Добавяне на още...", + "mw-widgets-titlesmultiselect-placeholder": "Добавяне на още...", "date-range-from": "От дата:", "date-range-to": "До дата:", "sessionprovider-generic": "$1 сесии", diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index 20fb349618..f2c60166a1 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -360,8 +360,8 @@ "delete-scheduled": "\"$1\" পাতাটি মুছে ফেলার জন্য তালিকাভুক্ত হয়েছে।\nদয়া করে ধৈর্য ধরুন।", "delete-hook-aborted": "হুকের কারণে পাতা মোছার কাজটি পরিত্যক্ত হয়েছে।\nকোন ব্যাখ্যা দেয়া হয়নি।", "no-null-revision": "\"$1\" পাতার জন্য ফাঁকা সংস্করণ তৈরী করা যায়নি", - "badtitle": "ভুল শিরোনাম", - "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।", + "badtitle": "খারাপ শিরোনাম", + "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনামে সংযুক্ত ছিল। এটিতে সম্ভবত এক বা একাধিক অক্ষর আছে, যা শিরোনাম হিসেবে ব্যবহার করা যাবে না।", "title-invalid-empty": "অনুরোধকৃত পাতার শিরোনামটি খালি বা শুধুমাত্র একটি নামস্থানের নাম ধারণ করে।", "title-invalid-utf8": "অনুরোধকৃত পাতার শিরোনামটিতে একটি অবৈধ ইউটিএফ-৮ অনুক্রম রয়েছে।", "title-invalid-interwiki": "অনুরোধকৃত পাতার শিরোনামে একটি আন্তঃউইকি সংযোগ উপস্থিত রয়েছে যা শিরোনামে ব্যবহার করা যাবে না।", @@ -400,7 +400,7 @@ "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।", "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: $2।", "filereadonlyerror": "\"$1\" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারণ \"$2\" ফাইল সংগ্রহশালাটি শুধুমাত্র-পঠন মোডে আছে।\n\nসিস্টেম প্রশাসক যিনি ফাইলটি অবরুদ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।", - "invalidtitle": "ভুল শিরোনাম", + "invalidtitle": "অবৈধ শিরোনাম", "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"", "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"", "exception-nologin": "প্রবেশ করেন নি", @@ -683,7 +683,7 @@ "accmailtitle": "পাসওয়ার্ড পাঠানো হয়েছে", "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।", "newarticle": "(নতুন)", - "newarticletext": "আপনি এমন একটি পাতার সংযোগ অনুসরণ করছেন, যার অস্তিস্ত নেই।\nপাতাটি তৈরি করতে, নিচের বাক্সে তা টাইপ করা শুরু করুন (আরও তথ্য জানতে [$1 সহায়িকা পাতা] দেখুন)।\nআপনি যদি ভুল করে এখানে এসে থাকেন, তাহলে আপনার ব্রাউজারের পিছন বোতামে ক্লিক করুন।", + "newarticletext": "আপনি এমন একটি পাতার সংযোগ অনুসরণ করছেন, যার অস্তিত্ব নেই।\nপাতাটি তৈরি করতে, নিচের বাক্সে তা টাইপ করা শুরু করুন (আরও তথ্য জানতে [$1 সহায়িকা পাতা] দেখুন)।\nআপনি যদি ভুল করে এখানে এসে থাকেন, তাহলে আপনার ব্রাউজারের পিছন বোতামে ক্লিক করুন।", "anontalkpagetext": "----\nএটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁদের শনাক্ত করছি।\nএকাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।\nআপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:CreateAccount|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।", "noarticletext": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্যান্য পাতায় [[Special:Search/{{PAGENAME}}| এই শিরোনামটি অনুসন্ধান করতে পারেন]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} এ সম্পর্কিত লগ অনুসন্ধান করতে পারেন], \nকিংবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পাতাটি তৈরি করতে পারেন]।", "noarticletext-nopermission": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্য পাতায় [[Special:Search/{{PAGENAME}}| শিরোনামটি অনুসন্ধান করতে পারেন]], অথবা [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পর্কিত লগ অনুসন্ধান করতে পারেন], কিন্তু আপনার এই পাতাটি তৈরী করার অনুমতি নেই।", @@ -2281,7 +2281,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]]-এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে", "revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে", "rollback-success": "{{GENDER:$3|$1}}-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; {{GENDER:$4|$2}}-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।", - "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]", "sessionfailure-title": "সেশন পরিত্যক্ত", "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nদয়া করে ফরমটি পুনরায় জমা দিন।", "changecontentmodel": "একটি পাতার বিষয়বস্তুর রূপ পরিবর্তন", diff --git a/languages/i18n/bqi.json b/languages/i18n/bqi.json index e2a08b9ea6..a031eef5f4 100644 --- a/languages/i18n/bqi.json +++ b/languages/i18n/bqi.json @@ -95,7 +95,7 @@ "march-gen": "مارس", "april-gen": "آڤریل", "may-gen": "مئی", - "june-gen": "جۊٱن", + "june-gen": "جۊئٱن", "july-gen": "جۊئیٱ", "august-gen": "آگوست", "september-gen": "سپتامبر", @@ -132,7 +132,7 @@ "category_header": "بٱلگاْیٱل میٛن دٱسداْ \"$1\"", "subcategories": "زیر دٱسداْیٱل", "category-media-header": "ڤارسگر میٛن دٱسداْ \"$1\"", - "category-empty": " ای دٱسدٱ هیژ بٱلگاْ یا ڤارسگٱری مئن خوس ناراْ.", + "category-empty": " ای دٱسدٱ هیژ بٱلگاْ یا ڤارسگٱری میٛن خوس ناراْ.", "hidden-categories": "{{PLURAL:$1|دٱسداْ قام ڤابیڌٱ|دٱسداْیٱل قام ڤابیڌٱ}}", "hidden-category-category": "دٱسداْیٱل قام ڤابیڌٱ", "category-subcat-count": "{{PLURAL:$2|ای دٱسداْ فٱقٱت ز ڤٱرگرهڌاْ زیردٱسداْیٱل نیاییاْ.|ای دٱسداْ ز ڤٱرگرهڌاْ {{PLURAL:$1|زیردٱسداْ|$1 زیردٱسداْیٱل}}, بیشتر ز کول $2 .}}", @@ -159,12 +159,12 @@ "faq": "اْف اٛی کیۊ", "actions": "کونشتکارۊن", "namespaces": "نوم ڤارگٱیٱل", - "variants": "آلشدگٱرۊن", + "variants": "آلشدکارٱل", "navigation-heading": "نوم جاگٱ ناڤگٱردی", "errorpagetitle": "خٱتا", "returnto": "ڤورگٱشدن ب $1.", "tagline": "ز {{SITENAME}}", - "help": "رٱنمۊنی", + "help": "رٱنمونی", "help-mediawiki": "هومیاری سی مدیاڤیکی", "search": "پاٛی جۊری", "search-ignored-headings": "#
\n# سٱرتال ٱلؽ  که ڤا موڌی نیڌاْ اْڤۊهن\n# تٱسیر آلشڌ راتؽ ایاهاْ ڤارۊ کاْ بٱلٛگاْ هاڤی او سٱرتال، نماواْ ڤۊهاْ.\n# اؽسا تٱرین ڤا ٱنجوم یٱ آلشڌکاری پیک بٱلٛگاْ ناْ بؽرٱ ڤاْ دو کرات نماواْ ڤیڌن کونین\n# رڤشڌس چونوݩ هؽڌآ:\n#  *هٱر چاْ زاْ یٱ هؽلنیڌاْ «#» تا تٱهاْ هؽل ڤاهین، یٱ اشکافنیڌن هؽڌا.\n#  *هٱر هؽل بؽ تلاهاْ، دٱیخٱن اوڌڤانی  هؽڌا کاْ نیڌاْ گریڌاْ اْڤۊهاْ (ڤا رعایٱت گاپی ۉ ساوائی هٱرفٱل).\nکونڳگٱیٱل(مٱنابع)\nمؽنڌاری ڤا دٱر\nهٱم چونوݩ ڤنٱرین\n#
", @@ -175,12 +175,12 @@ "history_short": "ڤیرگار", "history_small": "ڤیرگار", "updatedmarker": "ڤانها(ڤ رۊز)آڤیڌاْ زاْ ٱخیرین کرٱتی کاْ سٱرؤر داماْ", - "printableversion": "نوسقاْ پاْلا ڤابیڌنی", + "printableversion": "نوسقاْ پیٛلا ڤابیڌنی", "permalink": "هومپاٛیڤٱند دایومی", "print": "چاپ گرهڌن", "view": "ديڌن", "view-foreign": "میٛن $1 ناْ باْنیٱر", - "edit": "آلشدکاری", + "edit": "آلشدکاری کردن", "edit-local": "آلشڌکاری اشکافنیڌیٱل بۊمی", "create": "راس كردن", "create-local": "یٱ تۉزی ڤولات نشینی اْزاف کونین", @@ -209,8 +209,8 @@ "otherlanguages": "میٛن زڤونا دیٱ", "redirectedfrom": "(ڤاگٱردۊنی سی $1)", "redirectpagesub": "بٱلگاْ ڤاگٱردۊنی", - "redirectto": "ڤاگٱردۊنی سی:", - "lastmodifiedat": "ای بٱلگٱ تازاٛییا ماٛن $1 و میٛن $2 آلشدکاری ڤابیڌاْ.", + "redirectto": "ڤاگٱردونی سی:", + "lastmodifiedat": "ای بٱلگاْ تازاٛییا میٛن $1 و میٛن $2 آلشدکاری ڤابیڌاْ.", "viewcount": "ای بٱلگاْ میٛن دٱسرساْ {{PLURAL:$1|یٱ کاْرٱت|$1 چٱن کاْرٱت}}.", "protectedpage": "بٱلگاْ پٱر و پیم ڤابیڌاْ", "jumpto": "پراٛستن سی:", @@ -259,7 +259,7 @@ "viewsourceold": "دیڌن سرچشمٱ", "editlink": "آلشدکاری کردن", "viewsourcelink": "ساٛیل سرچشماْ کونین", - "editsectionhint": "آلشدکاری بٱرجا: $1", + "editsectionhint": "آلشدکاری بٱئرجا: $1", "toc": "مینۊناْیٱل", "showtoc": "دیاری کردن", "hidetoc": "قام کردن", @@ -288,7 +288,7 @@ "nstab-project": "بٱلگاْ پوروجاْ", "nstab-image": "جانیا", "nstab-mediawiki": "پیغوم", - "nstab-template": "چۊاْ", + "nstab-template": "چۊئاْ", "nstab-help": "بٱلگاْ هومیاری", "nstab-category": "دٱسدٱ", "mainpage-nstab": "سرتال", @@ -331,7 +331,7 @@ "delete-hook-aborted": "پژار ڤا قولاڤ لٱق آڤیڌ\nاشکافنیڌنی سی هؽ داڌ نڤیڌ", "no-null-revision": "سی بٱلگاْ $1 ڤانیٱری خومسا ناْ راس کونین", "badtitle": "داسوݩ گٱن", - "badtitletext": "داسوݩ خاسدنی نادیار، هالی، یا داسۊنی کاْ میٛنجقا زڤونی یا میٛنجقا ڤیکی ڤا هومپاٛیڤٱند دوروسد ناراْ و یا گاشا چٱنتا کاراکتر داراْ کاْ ڤا میٛن داسۊن نۉ باْیوفتاْ ڤا کار.", + "badtitletext": "داسوݩ خاسدنی نادیار، هالی، یا داسۊنی کاْ میٛنجقا زڤونی یا میٛنجقا ڤیکی ڤا هومپاٛیڤٱند دوروسد ناراْ و یا گاشا چٱنتا کاراکتر داراْ کاْ ڤا میٛن داسوݩ نۉ باْیوفتاْ ڤا کار.", "title-invalid-empty": "اوڌڤان بٱلٛگاْ دٱرخاس آڤیڌاْ پٱتی هؽڌآ یا تاٛنا اوڌڤان مؽن نوم گوڌ آڤیڌاْ هؽڌآ", "title-invalid-utf8": "اوڌڤان بٱلٛگاْ دٱرخاس آڤیڌاْ هؽل ڤیڌاْ نادوروس یونیکوڌ هؽڌآ", "title-invalid-interwiki": "بٱلٛگاْ دٱرخاس آڤیڌاْ دارای پاٛڤٱن مؽن ڤیکی هؽڌآ کاْ نؽڤۊهاْ مؽن اوڌڤانٱل نهاڌاْ ڤۊهاْ", @@ -349,7 +349,7 @@ "actionthrottled": "نها کار اؽسا گریداٛ آڤیڌ", "actionthrottledtext": "ڤ سی نهاگری زاْ ؤولٱ ڤیڌن چۊلکاری،اْجازاٛ نارین کاْ چونوݩ کارؽ ناْ ڤؽشڌر زاْ چٱن کرٱت ڤ یٱ رات کول ٱنجوم ڤڌین\nلوتفٱن دیناتٱر زاْ چٱن دٱیخاْ سٱرزنۊ پلرڌ کونین", "protectedpagetext": "ای بٱلٛگاْ سی نهاگری راْ آلشڌکاری یا جومجیل دهرؽ پلڌاری آڤیڌاْ", - "viewsourcetext": "ایسا تاْرین سرچشماْ ای بلگاْ ناْ هٱم بنیٱرین و هم ڤوردارینس:", + "viewsourcetext": "ایسا تیٛرین سرچشماْ ای بلگاْ ناْ هٱم بنیٱرین و هم ڤوردارینس:", "viewyourtext": "ایسا تاْرین یٱ کوپی ز سرچشمٱآلشدکاریٱل خوتوݩ ڤوردارین سی ای بٱلگاْ", "protectedinterface": "ای بٱلگاْ سی نٱرم ٱفزاری کاْ سی ڤیکی نڤیسی هڌ آماڌاْ ڤابیڌاْ،و ز موزاهمٱت کاری پٱر و پیم ڤابیڌاْ سی اْزاف کردن یا آلشدکاری کردن میٛن هٱماْ ڤیکیٱل لوتف کونین [https://translatewiki.net/ translatewiki.net] ناْ ڤٱنین ڤا کار، پوروجاْ ڤولات نشین سازی ڤیکیمدیا.", "editinginterface": "هوشڌار: بٱلٛگاْ کاْآلشڌکاری اْکونین مٱتنؽ ڌاراْ کاْ مؽن ڤاست مؽنتور ای نٱرمٱفزار ڤ کار رٱئڌاْ\nآلشڌ ای بٱلٛگاْ ڤانی آلشڌ بارت ڤاست مؽنتور ای نٱرم‌ٱفزار سی مؽنتورٱل داٛری اْڤۊهاْ", @@ -395,7 +395,7 @@ "yourpasswordagain": "رازیناْ گوڌٱشدن خوتۊناْ ز نۉ بزنین:", "createacct-yourpasswordagain": "پوشت راسدکاری رازینٱ گوڌاْشتن", "createacct-yourpasswordagain-ph": "ز نۉ رازیناْ گوڌاْشتن نٱ بزٱ", - "userlogin-remembermypassword": "مۊناْ میٛن سامۊناْ ڤاڌار", + "userlogin-remembermypassword": "موناْ میٛن ساموناْ ڤاڌار", "userlogin-signwithsecure": "ز رٱڤشت ٱمن ڤٱسل ڤابۊین", "cannotlogin-title": "نٱترین بیایین ڤامیٛن", "cannotlogin-text": "نٱترین بیائین ڤامیٛن", @@ -415,14 +415,14 @@ "userlogin-noaccount": "یٱ هساو کاریاری دارین؟", "userlogin-joinproject": "ٱندوم دیارگٱ {{SITENAME}} ڤابۊین", "createaccount": "راسد کردن هساو کاریاری", - "userlogin-resetpassword-link": "رازیناْ گوڤٱرتنتۊ ز ڤیرتۊن رٱهڌاْ؟", + "userlogin-resetpassword-link": "رازیناْ گوڤٱرتنتۊ ز ڤیرتوݩ رٱهڌاْ؟", "userlogin-helplink2": "هومیاری کردن سی ڤامیٛن ٱڤوڌن", "userlogin-loggedin": "ایسا ایساْ چی {{GENDER:$1|$1}} ٱڤۊڌین ڤامیٛن. فورم داْڤۊنی ناْ ڤٱنین ڤا کار و چی یٱ کاریار دیٱ بیائین ڤا میٛن", "userlogin-reauth": "ایسا ڤا ز نۉ بیائین ڤامیٛن سی یو کاْ دیار ڤابۊ ایسا {{GENDER:$1|$1}} هڌین.", "userlogin-createanother": "یٱ هساو کاریاری دیٱ راسد کونین", "createacct-emailrequired": "تیرنشوݩ ٱنجومانامٱ", "createacct-emailoptional": "تیرنشوݩ ٱنجومانامٱ", - "createacct-email-ph": "تیرنشوݩ ٱنجوماناماْ تۊناْ بزنین.", + "createacct-email-ph": "تیرنشوݩ ٱنجوماناماْ توناْ بزنین.", "createacct-another-email-ph": "تیرنشوݩ ٱنجوماناماْ تۊناْ بزنین.", "createaccountmail": "یٱ رازیناْ گوڌٱشتن موڤٱقٱتی ناْ ڤاْنین ڤا کار و سی یٱ تیرنشوݩ ٱنجوماناماْ تیار ڤابیڌاْ باْسیس کونین.", "createaccountmail-help": "ایسا ترین یٱ هساو کاریاری سی یکی دیٱ راسد کونین بی یو کاْ رازیناْ گوڌٱشتنساْ ڤٱنین ڤا ڤیر.", @@ -491,7 +491,7 @@ "loginlanguagelabel": "زڤون:$1", "suspicious-userlogout": "خاستتوݩ سی رٱهڌن ب دٱر ز ساموناْ رٱڌ ڤابی چونو کاْ دیاراْ چونو خاستی ڤا یٱ یا یٱ پوروکسی میٛنجقاگر بیٛسی ڤابیڌاْ بۊ", "createacct-another-realname-tip": "نو راستٱکی دل ب خائیاْ.\nٱر بزنینس گات ڤورگٱشتن ب آریٛنگٱلتوݩ و ڤورگٱشت هونو ب ایسا نوم راستٱکی توݩ ناْ ڤٱناْ ڤا کار.", - "pt-login": "ڤامین ٱڤوڌن", + "pt-login": "ڤامیٛن ٱڤوڌن", "pt-login-button": "ڤامیٛن ٱڤوڌن", "pt-login-continue-button": "پوشت سریٱک بیائین ڤامیٛن", "pt-createaccount": "راسد کردن هساو کاریاری", @@ -606,7 +606,7 @@ "publishchanges-start": "تیژنیڌن آلشڌکاریٱل", "preview": "پيش ساٛیل", "showpreview": "نشوݩ دائن پیش ساٛیل", - "showdiff": "نشوݩ دائن آلشدا", + "showdiff": "نشوݩ دائن آلشدکاریٱل", "anoneditwarning": "ب ڤیرتوݩ بۊ: ایسا هاْنی نٱڤۊڌین ڤامین. تیرنشوݩ آی پی ایسا سی هر گاتی کاْ آلشدکاری کونین سی کول خٱلک دیاراْ. ٱر [$1 رۉین ڤامین] یا [$2 یٱ هساو کاریاری راسد کونین]، آلشدکاریٱل ایسا ڤا نوم کاریاری خوتوݩ دیاری اْبۊ و یو سی ایسا بیتراْ.", "missingcommenttext": "لوتفٱن یٱ کامنت بیٛنین.", "missingcommentheader": "ب ڤیر ڤٱن: ایسا هیٛنی یٱ داسوݩ سی ای کامنت کۊ نکردیناْ.\nٱر ایسا یٱ کرٱت دٱ ری \"$1\" بپۊرنین، ڤیرایشت کاریوݩ هالی کۊ اْبۊ.", @@ -622,7 +622,7 @@ "loginreqpagetext": "$1 لوتف کونین بٱلگاْیٱل دیٱر ناْ ساٛیل کونین.", "accmailtitle": "رازیناْ گوڌٱشتن باْسی ڤابیڌاْ", "newarticle": "(تازاْ)", - "newarticletext": "ایسا ز دین یٱ هومپاٛیڤٱندی هڌین کاْ نیڌس. سی رٱڤٱندیاری بٱلگاْ شورۊ کونین میٛن ای جٱڤاْ داٛڤۊنی بنڤیسین(سی دۊنسدن بیشدر سئیل [$1]کونین).\nیر ایسا سی اْشتڤاکارش ايچونین، دوگماْ رٱهڌن ڤاپوشد نٱ بپۊرنین.", + "newarticletext": "ایسا ز دین یٱ هومپاٛیڤٱندی هڌین کاْ نیڌس. سی رٱڤٱندیاری بٱلگاْ شورۊ کونین میٛن ای جٱڤاْ دیٛڤونی بنڤیسین(سی دۊنسدن بیشدر ساٛیل [$1]کونین).\nیر ایسا سی اْشتڤاکارش ايچونین، دوگماْ رٱهڌن ڤاپوشد نٱ بپۊرنین.", "noarticletext": " ایساْ ای بٱلگاْ نڤشداْیی ناراْ، ایسا تاْرین [[Special:Search/{{PAGENAME}}داسۊن ای بٱلگاْ نٱ میٛن بٱلگاْیٱل دیٱری پاٛی جۊری کونین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای بٱلگاْ نٱ آلشدکاری کونين].", "noarticletext-nopermission": " ایساْ ای بٱلگاْ نڤشداْیی ناراْ، ایسا تاْرین [[Special:Search/{{PAGENAME}}داسۊن ای بٱلگاْ نٱ میٛن بٱلگاْیٱل دیٱری پاٛی جۊری کونین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای بٱلگاْ نٱ آلشد کونين].", "userpage-userdoesnotexist-view": "هساو کاریاری \"$1\" سٱبت نٱڤابیڌاْ.", @@ -758,7 +758,7 @@ "editundo": "ٱنجومشیڤ کردن", "diff-empty": "(یٱ جۊر)", "diff-multi-sameuser": "({{PLURAL:$1|یٱ دۊناٛ نوسقاٛ مؽنجخایی|$1 نوسقاٛیٱل مؽنجخایی}} ب دٱسد{{PLURAL:$2|کاریاری ديٱ|$2 کاريارا}} نشۊن دیاری نٱکرداْ)", - "diff-multi-otherusers": "({{PLURAL:$1|یٱ نوسقاْ میٛنجقایی|$1 نوسقاْیٱل میٛنجایی}} ڤا دٱسد {{PLURAL:$2|کاریاری دیٱ|$2 کاریارٱل}} نشۊن داڌاْ نٱڤابیڌاْ)", + "diff-multi-otherusers": "({{PLURAL:$1|یٱ نوسقاْ میٛنجقایی|$1 نوسقاْیٱل میٛنجایی}} ڤا دٱسد {{PLURAL:$2|کاریاری دیٱ|$2 کاریارٱل}} نشوݩ داڌاْ نٱڤابیڌاْ)", "diff-paragraph-moved-tonew": "پاراگراف جا ب جا ڤابی، یٱ کاْرٱت بپۊرنین تا رۉین یٱ جا دیٱر.", "diff-paragraph-moved-toold": "پاراگراف جا ب جا ڤابی، یٱ کاْرٱت بپۊرنین تا رۉین ب جا نیایی.", "searchresults": "نتيجاْیٱل پاٛی جۊری", @@ -772,7 +772,7 @@ "nextn-title": "نیایی $1 {{PLURAL:$1|نتيجٱ|نتیجاْیٱل}}", "shown-title": "نشوݩ دائن $1 {{PLURAL:$1|نتیجاْ|نتیجاْیٱل}} سی هر بٱلگاْ", "viewprevnext": "دیڌن ($1 {{int:pipe-separator}} $2) ($3)", - "searchmenu-exists": "ایچو میٛن ای ڤیکی یٱ بٱلگاْ هڌ کاْاْسمس \"[[:$1]]\" اْ {{PLURAL:$2|0=|هٱمچونو ساٛیل نتیجاْیٱلی کاْ دیار کرداْ ناْ کونین.}}", + "searchmenu-exists": "ایچو میٛن ای ڤیکی یٱ بٱلگاْ هڌ کاْ اْسمس \"[[:$1]]\" اْ {{PLURAL:$2|0=|هٱمچونو ساٛیل نتیجاْیٱلی کاْ دیار کرداْ ناْ کونین.}}", "searchmenu-new": "اي بٱلگاْ نٱ میٛن \"[[:$1]]\" ای ڤیکی راسد کو! {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}", "searchprofile-articles": "بٱلگاْیٱل مینۊناْ دار", "searchprofile-images": "مۊلتی مدیا", @@ -913,7 +913,7 @@ "group-user": "کاریارٱل", "group-autoconfirmed": "کاریارٱل خودپوشت راسد ڤابیڌاْ.", "group-bot": "روڤاتٱل", - "group-sysop": "سٱردیڤۊنکارۊن", + "group-sysop": "سٱردیڤۊنکاروݩ", "group-bureaucrat": "بوروکراتٱل", "group-all": "(هٱماْ)", "group-user-member": "{{GENDER:$1|کاریار}}", @@ -996,7 +996,7 @@ "nchanges": "$1 {{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}", "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ز آخری دیڌن}}", "enhancedrc-history": "ڤیرگار", - "recentchanges": "آلشدکاریا ایسنی", + "recentchanges": "آلشدکاریٱل ایسنی", "recentchanges-legend": "گوزیناْیٱل آلشدکاریٱل ایسنی", "recentchanges-summary": "دو بیشتر آلشدٱل تازاْ باڤ ڤیکی ناْ ز ای بٱلگاْ پاٛیگری کو.", "recentchanges-noresult": "هیژ آلشدکاری میٛن گات ای چیا اْتفاق نٱڤٱسداْ", @@ -1091,12 +1091,12 @@ "rc-enhanced-hide": "قام کردن جوزئیات", "rc-old-title": "زاتٱ چی \"$1\" راس ڤابیڌاْ", "recentchangeslinked": "آلشدکاریٱل تاْ یٱک", - "recentchangeslinked-feed": "تغییرات مرتبط", - "recentchangeslinked-toolbox": "آلشدکاریٱل تاْ یٱک", - "recentchangeslinked-title": "آلشدکاریٱل تاٛ یکی سی $1", + "recentchangeslinked-feed": "آلشدکاریٱل تیٛ یٱک", + "recentchangeslinked-toolbox": "آلشدکاریٱل تیٛ یٱک", + "recentchangeslinked-title": "آلشدکاریٱل تیٛ یکی سی $1", "recentchangeslinked-summary": "نوم یٱ بٱلٛگاْ ناْ ڤامؽ کونین تا آلشڌکاری بٱلٛگیٱل کاْ ڤاْ هومؽنڌارکرڌیناْ یا زاْ هو مؽنڌاری گریڌین ناْ ڤڤینین(سی نیٱشڌن هوم ڤٱنوناْ یٱ بنکۊ چونوݩ چی ائی ناْ ڤزٱنین:نوم بونکۊ). \nآلشڌکاریٱل بلٛگیٱلؽ کاْ مؽن[[Special:Watchlist|نومگٱ دیناگریٱل اؽسا]] هؽڌن ؤٱرڌار نمای اْڤۊهاْ", "recentchangeslinked-page": "نوم بٱلگاْ:", - "recentchangeslinked-to": "آلشدکاریٱلی کاْ میٛن بٱلگاْیٱل هومپاٛیڤٱند بیناْ ب جا بٱلگاْ داڌاْ ڤابیڌاْ دیاریسۊن کو", + "recentchangeslinked-to": "آلشدکاریٱلی کاْ میٛن بٱلگاْیٱل هومپاٛیڤٱند بیناْ ب جا بٱلگاْ داڌاْ ڤابیڌاْ دیاریسوݩ کو", "recentchanges-page-added-to-category": "[[:$1]] اْزاف ڤابی ب دٱسداْ", "recentchanges-page-removed-from-category": "[[:$1]] ز دٱسداْ جوڌا ڤابی", "upload": "سوڤار کردن جانیا", @@ -1188,10 +1188,10 @@ "linkstoimage-redirect": "$1 (ڤاگٱردۊنی جانیا) $2", "sharedupload": "ای جانیا کاْ ز $1 گاشا میٛن پوروجاْیٱل دیٱ ڤٱسداْ بۊ ڤاکار", "sharedupload-desc-here": "جانیایی کاْ میٛن $1 گاشا میٛن پوروجٱیٱل هٱنی ٱم ب کار گرهڌاْ ڤابیڌاْ بۊ.\nتۉزی سی [$2 file description page] میٛن دڤۊن دیاراْ", - "filepage-nofile": "چونو جانیایی ڤا چونڤ اْسمی نیڌس.", + "filepage-nofile": "چونو جانیایی ڤا چونو اْسمی نیڌس.", "uploadnewversion-linktext": "یٱ نوسقاْ تازاْ زی جانیا سوڤار کونین", "shared-repo-from": "ز $1", - "upload-disallowed-here": "ايسا ناْترین ای جانیا نٱ ز نۉ سوڤار کونین", + "upload-disallowed-here": "ايسا نیٛترین ای جانیا نٱ ز نۉ سوڤار کونین", "filerevert": "ز سرگرهڌن سی $1", "filerevert-legend": "ز سرگرهڌن جانیا", "filerevert-comment": "دلیل:", @@ -1479,7 +1479,7 @@ "sp-contributions-logs": "پاْرستنۊماْیٱل", "sp-contributions-talk": "چٱک چناْ", "sp-contributions-search": "سی هومیاریٱل پاٛی جۊری ڤابۊ", - "sp-contributions-username": "نوم ناٛشۊن آی پی یا نوم کاریاری", + "sp-contributions-username": "نوم نشوݩ آی پی یا نوم کاریاری", "sp-contributions-toponly": "فقٱت آلشدکاریٱلی کاْ جۏزڤاْ آخریݩ دۉران دیاری کو", "sp-contributions-newonly": "فٱقٱت آلشدکاریٱلی نٱ کاْ میٛن گات راست کردن بٱلگاْ بیڌناْ دیاری کو.", "sp-contributions-submit": "پاٛی جۊری", @@ -1488,7 +1488,7 @@ "whatlinkshere-page": "بٱلگاْ", "linkshere": "چونو بٱلگاْیٱلی هومپاٛیڤٱند ڤابیناْ ب '''$2''':", "nolinkshere": "هیژ بٱلگاْ ب '''$2''' هوم پاٛیڤٱند ناراْ.", - "isredirect": "بٱلگاْ ڤاگٱردۊنی", + "isredirect": "بٱلگاْ ڤاگٱردونی", "istemplate": "ڤارو گونجایشدٱل", "isimage": "جانیا هومپاٛیڤٱند", "whatlinkshere-prev": "{{PLURAL:$1|دیندایی|دیندایی$1}}", @@ -1568,15 +1568,15 @@ "import-upload-filename": "نوم جانیا:", "import-comment": "ڤير و باڤٱر", "importlogpage": "پهرستنوماْ داڌن", - "tooltip-pt-userpage": "{{GENDER:|بٱلگاْ کاریاریتۊن}} بٱلگاْ", + "tooltip-pt-userpage": "{{GENDER:|بٱلگاْ کاریاریتوݩ}} بٱلگاْ", "tooltip-pt-mytalk": "{{GENDER:|بٱلگاْ چٱک چناْ کاریاریام}}", "tooltip-pt-preferences": "{{GENDER:|ایسا}} ٱسل کاریٱل", "tooltip-pt-watchlist": "نومگٱ بٱلگاْیٱلی کاْ ایسا آلشدکاریا خوتۊناْ دینداگٱردی اْکونین", "tooltip-pt-mycontris": "یٱ نومگٱ ز هومیاریٱل {{GENDER:|ایسا}}", - "tooltip-pt-login": "ایما اٛگۊیم کاْ رۉین ڤامین سامۊنگٱ: ڤاْلی چونو کاری اٛژباری نی", - "tooltip-pt-logout": "ز سامۊناْ درٱڤوڌن", - "tooltip-pt-createaccount": "ايسا پوشت گٱرم ڤابیڌیناْ کاْ یٱ هساو راسد کونین و بیائین ڤامین. ڤاْلی چونو کاری اٛژباری نی.", - "tooltip-ca-talk": "چٱک چناْ سی مینۊناْ بٱلگٱ", + "tooltip-pt-login": "ایما اْگۊیم کاْ رۉین ڤامیٛن سامونگٱ: ڤاْلی چونو کاری اْژباری نی", + "tooltip-pt-logout": "ز ساموناْ درٱڤوڌن", + "tooltip-pt-createaccount": "ايسا پوشت گٱرم ڤابیڌیناْ کاْ یٱ هساو راسد کونین و بیائین ڤامیٛن. ڤاْلی چونو کاری اْژباری نی.", + "tooltip-ca-talk": "چٱک چناْ سی میٛنوناْ بٱلگاْ", "tooltip-ca-edit": "ای بٱلگاْ نٱ آلشدکاری کو", "tooltip-ca-addsection": "شورۊ کردن یٱ بٱرجا دیٱ", "tooltip-ca-viewsource": "ای بٱلگاْ پٱر و پیم ڤابیڌاْ.\nایسا تاْرین سرچشماْساْ بڤنین", @@ -1584,11 +1584,11 @@ "tooltip-ca-protect": "ای بٱلگاْ ناْ پٱر و پیم کو", "tooltip-ca-delete": "ای بٱلگاْ ناْ پاکسا کو", "tooltip-ca-move": "جابجا کردن ای بٱلگاْ", - "tooltip-ca-watch": "اْزاف کردن ای بٱلگٱ ب سئیل بٱرگ خوتۊن", + "tooltip-ca-watch": "اْزاف کردن ای بٱلگاْ ب ساٛیل بٱرگ خوتوݩ", "tooltip-ca-unwatch": "ڤورداشتن بٱلگاْ ز ساٛیل بٱرگتۊن", "tooltip-search": "جوستن {{SITENAME}}", - "tooltip-search-go": "رۉ میٛن بٱلگاْیٱلی کاْ نوم راستٱکی داشتاْ بۊن", - "tooltip-search-fulltext": "بٱلگاْیٱل نٱ سی چونو نڤشداْیٱلی پاٛی جۊری کو", + "tooltip-search-go": "رۉ میٛن بٱلگاْیٱلی کاْ نوم راستٱکی داشتاْ بوݩ", + "tooltip-search-fulltext": "بٱلگاْیٱل ناْ سی چونو نڤشداْیٱلی پاٛی جۊری کو", "tooltip-p-logo": "بنیٱرین ب سرآسوناْ", "tooltip-n-mainpage": "بنیٱرین ب سرآسوناْ", "tooltip-n-mainpage-description": "بنیٱرین ب سرآسوناْ", @@ -1605,9 +1605,9 @@ "tooltip-t-emailuser": "فرشناڌن ب ٱنجوماناماْ {{GENDER:$1|ای کاریار}}", "tooltip-t-upload": "سوڤار کردن جانیایٱل", "tooltip-t-specialpages": "یٱ نومگٱ ز بٱلگاْیٱل ڤیجٱ", - "tooltip-t-print": "نوسقاْ پرینت گرهڌنی سی ای بٱلگٱ", - "tooltip-t-permalink": "هومپاٛیڤٱند دایومی سی ڤانیٱری بٱلگٱ", - "tooltip-ca-nstab-main": "دیڌن مینۊنٱ بٱلگٱ", + "tooltip-t-print": "نوسقاْ پرینت گرهڌنی سی ای بٱلگاْ", + "tooltip-t-permalink": "هومپاٛیڤٱند دایومی سی ڤانیٱری بٱلگاْ", + "tooltip-ca-nstab-main": "دیڌن میٛنوناْ بٱلگاْ", "tooltip-ca-nstab-user": "دیڌن بٱلگاْ کاریار", "tooltip-ca-nstab-media": "دیدن صفحه مدیا", "tooltip-ca-nstab-special": "ای بٱلگاْ یٱ بٱلگاْ ڤیجاْ، و نیبۊ آلشدکاریس کونین", @@ -1627,13 +1627,13 @@ "tooltip-recreate": "ز نۉ راسد کردن بٱلگاْیی کاْ دینداتر پاکسا ڤابیڌاْ.", "tooltip-upload": "شورۊ سوڤار کرد", "tooltip-rollback": "\"ڤورگٱنیئن\" لرنیڌن سی هال و بال ٱڤٱل ای بٱلگٱ سی یو کاْ هومیاری نیایی سی بیتٱر کردن بۊ ٱلڤٱت ڤا یٱ کرٱت پۊرنیڌن.", - "tooltip-undo": "ٱنجوم نٱگرهڌن ای آلشدکاری ناْ ڤورگٱن و هٱماْ فورمٱل ڤیرایشت کاریا نٱ جۊر هال و بال پیش سئیل کو. چونو کاری بتون سلا اْڌاْ کاْ ب چٱکستاْ خوتۊن یٱ دلیل اْزاف کونین.", + "tooltip-undo": "ٱنجوم نٱگرهڌن ای آلشدکاری ناْ ڤورگٱن و هٱماْ فورمٱل ڤیرایشت کاریا نٱ جۊر هال و بال پیش ساٛیل کو. چونو کاری بتون سلا اْڌاْ کاْ ب چٱکستاْ خوتۊن یٱ دلیل اْزاف کونین.", "tooltip-summary": "یٱ چکستاْ کۊچیر ناْ بیارین ڤامیٛن", "others": "دیٱروݩ", "simpleantispam-label": "Anti-spam check.\nپورنکنين ایچو ناْ!", "pageinfo-title": "ڌونائی زاْ «$1»", "pageinfo-header-basic": "ڌونائیٱل بٱلٛگاْ", - "pageinfo-header-edits": "ڤیرایشت ڤیرگار", + "pageinfo-header-edits": "آلدشکاری کردن ڤیرگار", "pageinfo-header-restrictions": "هناڌاری زاْ بٱلٛگاْ", "pageinfo-header-properties": "ؤیژگیٱل بٱلٛگاْ", "pageinfo-display-title": "نماونیڌن داسوݩ", @@ -1654,8 +1654,8 @@ "pageinfo-subpages-value": "1 ($2 {{PLURAL:$2|آلشڌتور|آلشڌ تور}}; $3 {{PLURAL:$3|خاٛراز آلشڌ تور|خاٛراز آلشڌ تور}})", "pageinfo-firstuser": "بٱلگاْ راس کون", "pageinfo-firsttime": "گات دروس ڤابیڌن بٱلگاْ", - "pageinfo-lastuser": "آخری ڤیرایشتکار", - "pageinfo-lasttime": "گات آخری ڤیرایشت", + "pageinfo-lastuser": "آخری آلشدکار", + "pageinfo-lasttime": "گات آخری آلشدکاری کردن", "pageinfo-edits": "کول آلشدکاریٱل", "pageinfo-authors": "شوماراْ کولی نڤیسیارٱل یٱکۊنٱ", "pageinfo-recent-edits": "شوماراْ آلشدکاریٱل ایسنی (د $1 دینداتر)", @@ -1695,7 +1695,7 @@ "metadata-help": "ای جانیا ز ڤٱرگرهڌاْ دۊنسمٱندیٱل اْزافیاْ کاْ هونو گاشا(شایڌ) ڤا دیربین دیجیتالی یا اْسکٱنر سی ڤا کار ڤٱندن یا راست کردنسۊن یا دیجیتالی کردنسۊن اْزاف ڤابیناْ. ٱر جانیا ز هال و بال ٱڤلی خو آلشد ڤابیڌاْ بۊ شایڌ تٱموم تۉزیات دۊنسمٱندیٱل ٱسگ نٱ دیاری نٱکوناْ.", "metadata-expand": "نشودادن جزئیات تفصیلی", "metadata-collapse": "قایم کردن جزئیات تفصیلی", - "metadata-fields": "رشناْیٱل گٱپ دۊنسمٱندیٱلی کاْ میٛن ای پاٛیغوم نومگٱ کاری ڤابیڌاْ ناْ ز ڤٱر گرهڌاْ بٱلگاْ ٱسگی کاْ گات ڤٱختی کاْ جٱدڤٱل گٱپ دۊنسمٱندیٱل ڤا اْبۊن دیاری کونن.\n*راست کو\n*مودل\n*مجال گات ٱسل\n*گات آشگار\n*اْف اْن شومارٱ\n*ایزو نرخ میٛن سورٱت\n*فوکالنس\n*هونٱرمٱند\n*کوپی رایت\n*هال و بال جی پی اْس \n*جی پی اْس گٱپ\n*جی پی اْس هٱماْ جۊرٱ", + "metadata-fields": "رشناْیٱل گٱپ دۊنسمٱندیٱلی کاْ میٛن ای پاٛیغوم نومگٱ کاری ڤابیڌاْ ناْ ز ڤٱر گرهڌاْ بٱلگاْ ٱسگی کاْ گات ڤٱختی کاْ جٱدڤٱل گٱپ دۊنسمٱندیٱل ڤا اْبۊن دیاری کونن.\n*راست کو\n*مودل\n*مجال گات ٱسل\n*گات آشگار\n*اْف اْن شوماراْ\n*ایزو نرخ میٛن سورٱت\n*فوکالنس\n*هونٱرمٱند\n*کوپی رایت\n*هال و بال جی پی اْس \n*جی پی اْس گٱپ\n*جی پی اْس هٱماْ جۊرٱ", "namespacesall": "هٱمٱ", "monthsall": "هٱمٱ", "confirm_purge_button": "خۊڤاْ", @@ -1800,7 +1800,7 @@ "logentry-delete-revision": "$1 دیاری {{PLURAL:$5|یٱ نوسخاْ|$5 نوسخاْ}} بٱلٛگاْ $3 ناْ{{GENDER:$2|آلشڌکرڌ}}: $4", "revdelete-content-hid": "هؽلنیڌناْ بؽڌیارکرڌ", "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کرداْ}} بٱلگاْ $3 نٱ سی $4", - "logentry-move-move-noredirect": "$1 {{GENDER:$2|جا ب جا کرد}} بٱلگاْ $3 نٱ سی $4 بی یو یٱ ڤاگٱردۊنی داشداْ بۊ", + "logentry-move-move-noredirect": "$1 {{GENDER:$2|جا ب جا کرد}} بٱلگاْ $3 نٱ سی $4 بی یو یٱ ڤاگٱردونی داشداْ بۊ", "logentry-move-move_redir": "$1 بٱلٛگاْ $3 ناْ ڤاْ $4 کاْ آلشڌ تور ڤیڌاْ {{GENDER:$2|کل کرڌ}}", "logentry-patrol-patrol-auto": "$1 نوسخهٔ $4 بٱلٛگاْ $3 ناْ خودکار ڤاْ عنڤان لرخوؤٱرداٛ {{GENDER:$2|دزاْ کونین}}", "logentry-newusers-create": "هساڤ کاریاری $1 {{GENDER:$2|راسد ڤابی}}", diff --git a/languages/i18n/br.json b/languages/i18n/br.json index 578152c522..5aaea0dd39 100644 --- a/languages/i18n/br.json +++ b/languages/i18n/br.json @@ -2160,7 +2160,6 @@ "revertpage": "Kemmoù distaolet gant [[Special:Contributions/$2|$2]] ([[User talk:$2|Kaozeal]]); adlakaet d'ar stumm diwezhañ a-gent gant [[User:$1|$1]]", "revertpage-nouser": "Disteuler kemmoù un implijer kuzhet ha distreiñ d'ar stumm diwezhañ gant an {{GENDER:$1|[[implijer :$1|$1]]}}", "rollback-success": "Nullet ar c'hemmoù gant {{GENDER:$3|$1}};\nadlakaet diouzh ar stumm diwezhañ gant {{GENDER:$4|$2}}.", - "rollback-success-notify": "Nullet ar c'hemmoù gant $1;\nadlakaet diouzh ar stumm diwezhañ gant $2. [$3 Diskouez ar c'hemmoù]", "sessionfailure-title": "Fazi dalc'h", "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.", "changecontentmodel": "Cheñch patrom danvez ur bajenn", diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json index f3591a5a26..28e3a77f0e 100644 --- a/languages/i18n/bs.json +++ b/languages/i18n/bs.json @@ -2179,7 +2179,6 @@ "revertpage": "Vraćene izmjene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]", "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]", "rollback-success": "Vraćene izmjene {{GENDER:$3|korisnika|korisnice}} $1 na posljednju verziju {{GENDER:$4|korisnika|korisnice}} $2.", - "rollback-success-notify": "Vraćenje izmjene korisnika $1;\nvraćeno na posljednju izmjenu korisnika $2. [$3 Prikaži izmjene]", "sessionfailure-title": "Greška u sesiji", "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.", "changecontentmodel": "Promijeni model sadržaja stranice", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 86bce967ab..4e760c88e7 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -324,7 +324,7 @@ "confirmable-no": "No", "thisisdeleted": "Voleu mostrar o restaurar $1?", "viewdeleted": "Voleu mostrar $1?", - "restorelink": "{{PLURAL:$1|una versió esborrada|$1 versions esborrades}}", + "restorelink": "{{PLURAL:$1|una versió suprimida|$1 versions suprimides}}", "feedlinks": "Sindicació:", "feed-invalid": "La subscripció no és vàlida pel tipus de sindicament.", "feed-unavailable": "Els canals de sindicació no estan disponibles", @@ -853,7 +853,7 @@ "page_last": "última", "histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor", "history-fieldset-title": "Cerca revisions", - "history-show-deleted": "Només revisions esborrades", + "history-show-deleted": "Només revisions suprimides", "histfirst": "les més antigues", "histlast": "les més noves", "historysize": "({{PLURAL:$1|1 octet|$1 octets}})", @@ -1233,8 +1233,8 @@ "right-deleterevision": "Esborrar i restaurar versions específiques de pàgines", "right-deletedhistory": "Veure els historials esborrats sense consultar-ne el text", "right-deletedtext": "Veure el text esborrat i els canvis entre revisions esborrades", - "right-browsearchive": "Cercar pàgines esborrades", - "right-undelete": "Restaurar pàgines esborrades", + "right-browsearchive": "Cercar pàgines suprimides", + "right-undelete": "Restaurar pàgines suprimides", "right-suppressrevision": "Mostra, amaga i revela revisions específiques de pàgines d'un usuari", "right-viewsuppressed": "Mostra les revisions amagades de qualsevol usuari", "right-suppressionlog": "Veure registres privats", @@ -1340,7 +1340,7 @@ "action-deletelogentry": "suprimeix les entrades de registre", "action-deletedhistory": "mostra l'historial esborrat d'una pàgina", "action-deletedtext": "mostra el text de la revisió eliminada", - "action-browsearchive": "cercar pàgines esborrades", + "action-browsearchive": "cercar pàgines suprimides", "action-undelete": "restaura les pàgines", "action-suppressrevision": "revisa i restaura les revisions ocultes", "action-suppressionlog": "visualitzar aquest registre privat", @@ -2101,8 +2101,8 @@ "categories-submit": "Mostra", "categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories sol·licitades]].", "categoriesfrom": "Mostra les categories que comencen a:", - "deletedcontributions": "Contribucions esborrades", - "deletedcontributions-title": "Contribucions esborrades", + "deletedcontributions": "Contribucions suprimides", + "deletedcontributions-title": "Contribucions suprimides", "sp-deletedcontributions-contribs": "contribucions", "linksearch": "Cerca d'enllaços externs", "linksearch-pat": "Patró de cerca:", @@ -2279,6 +2279,7 @@ "deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.", "deleting-backlinks-warning": "Atenció:\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen aquí o inclouen la pàgina que esteu a punt de suprimir.", "rollback": "Reverteix edicions", + "rollback-confirmation-no": "Cancel·la", "rollbacklink": "Reverteix", "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}", "rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}", @@ -2291,7 +2292,6 @@ "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]", "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]", "sessionfailure-title": "Error de sessió", "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.", "changecontentmodel": "Canvia el model de contingut d'una pàgina", @@ -2372,7 +2372,7 @@ "restriction-level-autoconfirmed": "semiprotegida", "restriction-level-all": "qualsevol nivell", "undelete": "Restaura una pàgina esborrada", - "undeletepage": "Mostra i restaura pàgines esborrades", + "undeletepage": "Mostra i restaura pàgines suprimides", "undeletepagetitle": "'''A continuació teniu revisions eliminades de [[:$1]]'''.", "viewdeletedpage": "Visualitza les pàgines eliminades", "undeletepagetext": "{{PLURAL:$1|S'ha eliminat la pàgina següent, però encara és a l'arxiu i pot ser restaurada|S'han eliminat les $1 pàgines següents, però encara són a l'arxiu i poden ser restaurades}}.\nL'arxiu pot ser netejat periòdicament.", @@ -2394,8 +2394,8 @@ "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1", "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.", "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.", - "undelete-search-title": "Cerca de pàgines esborrades", - "undelete-search-box": "Cerca pàgines esborrades", + "undelete-search-title": "Cerca de pàgines suprimides", + "undelete-search-box": "Cerca pàgines suprimides", "undelete-search-prefix": "Mostra pàgines que comencin:", "undelete-search-full": "Mostra títols de pàgines que continguin:", "undelete-search-submit": "Cerca", @@ -2431,7 +2431,7 @@ "sp-contributions-newbies-title": "Contribucions dels comptes d'usuari més nous", "sp-contributions-blocklog": "Registre de blocatges", "sp-contributions-suppresslog": "contribucions suprimides de {{GENDER:$1|l'usuari|la usuària}}", - "sp-contributions-deleted": "Contribucions de {{GENDER:$1|l'usuari|la usuària}} esborrades", + "sp-contributions-deleted": "contribucions de {{GENDER:$1|l’usuari|la usuària}} suprimides", "sp-contributions-uploads": "càrregues", "sp-contributions-logs": "registres", "sp-contributions-talk": "discussió", diff --git a/languages/i18n/ckb.json b/languages/i18n/ckb.json index bc596f20b2..f8e43e47ac 100644 --- a/languages/i18n/ckb.json +++ b/languages/i18n/ckb.json @@ -2774,6 +2774,7 @@ "logentry-suppress-block": "$1 $3ی بۆ ماوەی $5 $6 بەربەست کرد", "logentry-suppress-reblock": "$1 ھەڵبژاردەکانی بەربەستنی $3ی گۆڕی بە ماوەی بەسەرچوونی $5 $6", "logentry-import-upload": "$1 {{GENDER:$2|بارکرد}} $3 بە بەکارھێنانی [[special:Import|بارکەر]]", + "logentry-import-interwiki": "$1 $3ی لە ویکییەکی ترەوە ھاوردەکرد", "logentry-import-interwiki-details": "$1 $3ی لە $5ەوە ھەناردە کرد ($4 بەسەرداچوونەوە)", "logentry-move-move": "$1 پەڕەی $3ی {{GENDER:$2|گواستەوە}} بۆ $4", "logentry-move-move-noredirect": "$1 پەڕەی $3ی بە بێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4", @@ -2864,6 +2865,7 @@ "log-action-filter-block": "جۆری بلۆک:", "log-action-filter-contentmodel": "جۆری گۆڕینی مۆدێلی ناوەڕۆک:", "log-action-filter-delete": "جۆری سڕینەوە:", + "log-action-filter-import": "جۆری ھاوردن:", "log-action-filter-all": "ھەموو", "log-action-filter-block-block": "بەربەستن", "log-action-filter-block-unblock": "ھەڵگرتنی بەربەستن", diff --git a/languages/i18n/co.json b/languages/i18n/co.json index 157e9d5604..83ff3be5ac 100644 --- a/languages/i18n/co.json +++ b/languages/i18n/co.json @@ -456,7 +456,7 @@ "contributions-title": "Cuntribuzione di $1", "mycontris": "Cuntribuzioni", "contribsub2": "Per {{GENDER:$3|$1}} ($2)", - "uctop": "currente", + "uctop": "attuale", "month": "Da u mese (è nanzu):", "year": "Da l'annu (è nanzu):", "sp-contributions-newbies": "Mustrà solu e mudifiche di i novi cuntributori", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index e50786fddd..c747efb8cf 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -41,7 +41,8 @@ "Patriccck", "Ed g2s", "Radana", - "Jan Růžička" + "Jan Růžička", + "Jaroslav Cerny" ] }, "tog-underline": "Podtrhávat odkazy:", @@ -2263,7 +2264,7 @@ "confirmdeletetext": "Chystáte se smazat stránku s celou její historií. Prosím potvrďte, že to opravdu chcete učinit, že si uvědomujete důsledky a že je to v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].", "actioncomplete": "Provedeno", "actionfailed": "Operace se nezdařila", - "deletedtext": "„$1“ bylo smazáno.\n$2 zaznamenává poslední smazání.", + "deletedtext": "Stránka „$1“ byla smazána.\n$2 zaznamenává poslední smazání.", "dellogpage": "Kniha smazaných stránek", "dellogpagetext": "Zde je seznam posledních smazaných stránek.", "deletionlog": "Kniha smazaných stránek", @@ -2294,7 +2295,6 @@ "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“", "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“", "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.", - "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]", "sessionfailure-title": "Chyba relace", "sessionfailure": "Nastal problém s vaším přihlášením;\nvámi požadovaná činnost byla zrušena jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.", "changecontentmodel": "Změnit model obsahu stránky", @@ -2489,6 +2489,8 @@ "ipb-confirm": "Potvrdit zablokování", "ipb-sitewide": "Na celém projektu", "ipb-partial": "Částečný", + "ipb-sitewide-help": "Všechny stránky na wiki a všechny ostatní způsoby přispívání.", + "ipb-partial-help": "Konkrétní stránky nebo jmenné prostory.", "ipb-pages-label": "Stránky", "ipb-namespaces-label": "Jmenné prostory", "badipaddress": "Neplatná IP adresa", @@ -2577,6 +2579,7 @@ "ipb_expiry_old": "Čas vypršení je v minulosti.", "ipb_expiry_temp": "Blokování skrytých uživatelských jmen by měla být trvalá.", "ipb_hide_invalid": "Tento účet nelze utajit; má více než $1 {{PLURAL:$1|editaci|editace|editací}}.", + "ipb_hide_partial": "Zablokování se skrytím uživatelského jména musí platit na celém projektu.", "ipb_already_blocked": "„$1“ již je zablokován.", "ipb-needreblock": "$1 je již {{GENDER:$1|zablokován|zablokována|zablokován(a)}}. Chcete změnit nastavení bloku?", "ipb-otherblocks-header": "{{PLURAL:$1|Jiné zablokování|Jiná zablokování}}", @@ -3830,6 +3833,7 @@ "passwordpolicies-policy-passwordcannotbepopular": "Heslo nesmí být {{PLURAL:$1|dané oblíbené heslo|v seznamu $1 oblíbených hesel}}", "passwordpolicies-policy-passwordnotinlargeblacklist": "Heslo nesmí být v seznamu 100 000 nejčastěji používaných hesel.", "passwordpolicies-policyflag-forcechange": "nutné změnit při přihlášení", + "passwordpolicies-policyflag-suggestchangeonlogin": "navrhnout změnu při přihlášení", "easydeflate-invaliddeflate": "Poskytnutý obsah nebyl správně zkomprimován", "unprotected-js": "Z bezpečnostních důvodů nelze načítat JavaScript z nechráněných stran. Vyrábějte prosím JavaScriptové skripty jen ve jmenném prostoru MediaWiki: nebo jako uživatelskou podstránku" } diff --git a/languages/i18n/csb.json b/languages/i18n/csb.json index f4a37aefc5..d8b61ac60a 100644 --- a/languages/i18n/csb.json +++ b/languages/i18n/csb.json @@ -940,7 +940,6 @@ "alreadyrolled": "Ni mòże copnąc slédny edicëji starnë [[:$1]], chtërny ùsôdzcą je [[User:$2|$2]] ([[User talk:$2|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nchtos jiny ju zeditowôł starnã abò copnął zmianë.\n\nSlédnym ùsódzcą starnë bëł [[User:$3|$3]] ([[User talk:$3|Diskùsëjô]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", "revertpage": "Edicje brëkòwnika [[Special:Contributions/$2|$2]] ([[User talk:$2|diskùsjô]]) òstałë òdrzucóné. Aùtorã przëwrócóny wersji je [[User:$1|$1]].", "rollback-success": "Copniãto edicje {{GENDER:$3|brëkòwnika|brëkòwniczczi}} $1;\ndoprowadzóno nazôd slédną wersëjã ùsôdzcë {{GENDER:$4|$2}}.", - "rollback-success-notify": "Edicje brëkòwnika $1 òstałë òdrzucóné; \nòsta przëwrócónô òstatnô wersjô, aùtorã chtërny je $2. [$3 Pòkażë zjinaczi]", "protectlogpage": "Zazychrowóné", "protectedarticle": "zazychrowónô [[$1]]", "modifiedarticleprotection": "zmienionô léga zazychrowaniô [[$1]]", diff --git a/languages/i18n/cy.json b/languages/i18n/cy.json index 4b7e31cedc..4aa77b81bb 100644 --- a/languages/i18n/cy.json +++ b/languages/i18n/cy.json @@ -2028,7 +2028,6 @@ "revertpage": "Wedi gwrthdroi golygiadau gan [[Special:Contributions/$2|$2]] ([[User talk:$2|Sgwrs]]); wedi adfer y golygiad diweddaraf gan [[User:$1|$1]]", "revertpage-nouser": "Wedi gwrthdroi golygiadau gan ddefnyddiwr cudd; wedi adfer y golygiad diweddaraf gan {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Gwrthdrowyd y golygiadau gan {{GENDER:$3|$1}};\nailosodwyd y golygiad olaf gan {{GENDER:$4|$2}}.", - "rollback-success-notify": "Gwrthdrowyd y golygiadau gan $1;\nailosodwyd y golygiad olaf gan $2. [$3 Dangoser y gwahaniaeth]", "sessionfailure-title": "Sesiwn wedi methu", "sessionfailure": "Mae'n debyg fod yna broblem gyda'ch sesiwn mewngofnodi; diddymwyd y weithred er mwyn diogelu'r sustem rhag ddefnyddwyr maleisus. Gwasgwch botwm 'nôl' eich porwr ac ail-lwythwch y dudalen honno, yna ceisiwch eto.", "changecontentmodel-title-label": "Teitl y ddalen", diff --git a/languages/i18n/da.json b/languages/i18n/da.json index 81326c47a0..cd90f56391 100644 --- a/languages/i18n/da.json +++ b/languages/i18n/da.json @@ -2970,7 +2970,7 @@ "confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|diskussion]]) har {{GENDER:$1|slettet}} denne side, efter du begyndte at redigere. Bekræft venligst, at du gerne vil genoprette siden.", "recreate": "Genopret", "confirm-purge-title": "Fjern denne side", - "confirm_purge_button": "O.k.", + "confirm_purge_button": "OK", "confirm-purge-top": "Slet denne side fra serverens mellemlager (''cache'')?", "confirm-purge-bottom": "Rensning af en side sletter mellemlageret og fremtvinger den nyeste version.", "confirm-watch-button": "OK", diff --git a/languages/i18n/de.json b/languages/i18n/de.json index c71c147a13..f7c3806a60 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -122,7 +122,7 @@ "tog-enotifminoredits": "Auch bei kleinen Änderungen an Seiten und Dateien E-Mails senden", "tog-enotifrevealaddr": "Meine E-Mail-Adresse in Benachrichtigungs-E-Mails anzeigen", "tog-shownumberswatching": "Anzahl der beobachtenden Benutzer anzeigen", - "tog-oldsig": "Die vorhandene Signatur:", + "tog-oldsig": "Die genutzte Signatur:", "tog-fancysig": "Signatur als Wikitext behandeln (ohne automatische Verlinkung)", "tog-uselivepreview": "Vorschau ohne Neuladen der Seite anzeigen", "tog-forceeditsummary": "Warnen, sofern beim Speichern die Zusammenfassung fehlt", @@ -2342,6 +2342,9 @@ "deleting-backlinks-warning": "Warnung: Es verweisen noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere Seiten]] auf diese zu löschende Seite oder sie ist noch an anderer Stelle eingebunden.", "deleting-subpages-warning": "Warnung: Die Seite, die du löschen möchtest, hat [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|eine Unterseite|$1 Unterseiten|51=über 50 Unterseiten}}]].", "rollback": "Zurücksetzen der Änderungen", + "rollback-confirmation-confirm": "{{PLURAL:$1|0=Diese Bearbeitungen|Eine Bearbeitung|$1 Bearbeitungen}} zurücksetzen?", + "rollback-confirmation-yes": "Zurücksetzen", + "rollback-confirmation-no": "Abbrechen", "rollbacklink": "Zurücksetzen", "rollbacklinkcount": "{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen", "rollbacklinkcount-morethan": "Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen", @@ -2354,7 +2357,6 @@ "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt", "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt", "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.", - "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]", "sessionfailure-title": "Sitzungsfehler", "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte sende das Formular erneut ab.", "changecontentmodel": "Inhaltsmodell einer Seite ändern", @@ -3130,6 +3132,7 @@ "confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?", "confirm-rollback-button": "Okay", "confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?", + "confirm-rollback-bottom": "Diese Aktion wird sofort die ausgewählten Änderungen an dieser Seite zurücksetzen.", "confirm-mcrrestore-title": "Eine Version wiederherstellen", "confirm-mcrundo-title": "Eine Änderung rückgängig machen", "mcrundofailed": "Rückgängigmachung fehlgeschlagen", diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json index fe41bb3fe6..c17a6bbdee 100644 --- a/languages/i18n/diq.json +++ b/languages/i18n/diq.json @@ -1187,7 +1187,7 @@ "grant-group-watchlist-interaction": "Lista da xoya tesir", "grant-group-email": "e-poste bırışe", "grant-group-high-volume": "Performansa aktiviteya vengê berzi", - "grant-group-customization": "Şexsi kerdış u tercihi", + "grant-group-customization": "Xısusikerdış û tercihi", "grant-group-administration": "Performans hereketa idarey", "grant-group-private-information": "Melumatê xısusiyê ke heqa şıma derê, bıresê inan", "grant-group-other": "Enwayi babet aktivitey", @@ -1214,7 +1214,7 @@ "grant-basic": "Heqê basiti", "grant-viewdeleted": "Besteryaya peran u dosyaya bıasne", "grant-viewmywatchlist": "Lista serykerdışê xo bıvêne", - "newuserlogpage": "Roceka karberanê newa", + "newuserlogpage": "Qeydê karberanê neweyan", "newuserlogpagetext": "No yew qeydê afernayışanê karberio.", "rightslog": "Qeydê heqanê karberi", "rightslogtext": "Ena listeyê loganê ke heqqa karbaranî mucneno.", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index 160b2c2941..36d1847530 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -2232,7 +2232,6 @@ "revertpage": "Ανάκληση των αλλαγών [[Special:Contributions/$2|$2]] ([[User talk:$2|συζήτηση]]) επιστροφή στην προηγούμενη αναθεώρηση [[User:$1|$1]]", "revertpage-nouser": "Αναστράφηκαν οι επεξεργασίες από τον (όνομα χρήστη αφαιρέθηκε) στη τελευταία έκδοση από τον/την {{GENDER:$1|[[User:$1|$1]]}}φ", "rollback-success": "Αναστροφή επεξεργασιών από {{GENDER:$3|τον|την}} $1, επιστροφή στην προηγούμενη έκδοση από {{GENDER:$4|τον|την}} $2.", - "rollback-success-notify": "Αναίρεση επεξεργασιών από $1; επιστροφή στην τελευταία αναθεώρηση από $2.[$3 Εμφάνιση αλλαγών]", "sessionfailure-title": "Η συνεδρία απέτυχε", "sessionfailure": "Υπάρχει πρόβλημα με τη σύνδεσή σας -η ενέργεια αυτή ακυρώθηκε προληπτικά για την αντιμετώπιση τυχόν πειρατείας συνόδου (session hijacking). Παρακαλoύμε πατήστε \"Επιστροφή\", ξαναφορτώστε τη σελίδα από την οποία φθάσατε εδώ και προσπαθήστε ξανά.", "changecontentmodel": "Αλλαγή μοντέλου περιεχομένου της σελίδας", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 28e0b052a1..05bbf3cbfa 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -47,6 +47,7 @@ "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes", "tog-prefershttps": "Always use a secure connection while logged in", "tog-showrollbackconfirmation": "Show a confirmation prompt when clicking on a rollback link", + "tog-showrollbackconfirmation-prerelease-warning": "Please note: This feature is not available yet. If you set this preference now, your choice will be remembered [https://meta.wikimedia.org/wiki/WMDE_Technical_Wishes/Rollback#Status when the feature is released].", "underline-always": "Always", "underline-never": "Never", "underline-default": "Skin or browser default", @@ -2389,6 +2390,9 @@ "deleting-backlinks-warning": "Warning: [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.", "deleting-subpages-warning": "Warning: The page you are about to delete has [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]].", "rollback": "Roll back edits", + "rollback-confirmation-confirm": "Please confirm:", + "rollback-confirmation-yes": "Rollback", + "rollback-confirmation-no": "Cancel", "rollbacklink": "rollback", "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}", "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}", @@ -2401,7 +2405,6 @@ "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]", "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.", - "rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]", "sessionfailure-title": "Session failure", "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nPlease resubmit the form.", "changecontentmodel" : "Change content model of a page", @@ -3326,6 +3329,7 @@ "confirm-unwatch-top": "Remove this page from your watchlist?", "confirm-rollback-button": "OK", "confirm-rollback-top": "Revert edits to this page?", + "confirm-rollback-bottom": "This action will instantly rollback the selected changes to this page.", "confirm-mcrrestore-title": "Restore a revision", "confirm-mcrundo-title": "Undo a change", "mcrundofailed": "Undo failed", diff --git a/languages/i18n/eo.json b/languages/i18n/eo.json index 6c060c549b..21a3ef0de7 100644 --- a/languages/i18n/eo.json +++ b/languages/i18n/eo.json @@ -2224,7 +2224,6 @@ "revertpage": "Malfaris redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]) al la lasta versio de [[User:$1|$1]]", "revertpage-nouser": "Restarigis redaktojn de (salutnomo forigita) al lasta revizio de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Restaris redaktojn de {{GENDER:$3|$1}}; ŝanĝis al lasta versio de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Malfaritis redaktojn far $1;\nŝanĝis al la lasta reviziaĵo far $2. [$3 Prezenti ŝanĝojn]", "sessionfailure-title": "Seanco malsukcesis", "sessionfailure": "Ŝajnas, ke estas problemo kun via ensalutado;\nĈi ago estis nuligita por malhelpi fiensalutadon.\nBonvolu resendi la formularoj", "changecontentmodel": "Ŝanĝi la enhavomodelon de paĝo", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 6d30425b8c..100642db65 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -231,6 +231,7 @@ "tog-norollbackdiff": "No mostrar la lista de diferencias después de revertir", "tog-useeditwarning": "Avisarme cuando abandone una página en edición con cambios sin guardar", "tog-prefershttps": "Utilizar siempre conexiones seguras en mis sesiones", + "tog-showrollbackconfirmation": "Mostrar una pantalla de confirmación al hacer clic en un enlace de reversión", "underline-always": "Siempre", "underline-never": "Nunca", "underline-default": "Configuración predeterminada de la apariencia o el navegador", @@ -622,6 +623,7 @@ "badretype": "Las contraseñas no coinciden.", "usernameinprogress": "Ya está en marcha la creación de una cuenta para este nombre de usuario.\nEspera.", "userexists": "El nombre de usuario indicado ya está en uso.\nElige un nombre diferente.", + "createacct-normalization": "Tu nombre de usuario será \"$2\" debido a restricciones técnicas.", "loginerror": "Error de inicio de sesión", "createacct-error": "Error al crear la cuenta", "createaccounterror": "No se pudo crear la cuenta: $1", @@ -909,6 +911,7 @@ "edit-conflict": "Conflicto de edición.", "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.", "edit-slots-cannot-add": "{{PLURAL:$1|La siguiente ranura no es soportada|Las siguientes ranuras no son soportadas}} aquí: $2.", + "edit-slots-cannot-remove": "Se {{PLURAL:$1|requiere el siguiente espacio y no puede ser eliminado|requieren los siguientes espacios y no pueden ser eliminados}}: $2.", "edit-slots-missing": "{{PLURAL:$1|Falta el siguiente espacio|Faltan los siguientes espacios}}: $2", "postedit-confirmation-created": "Se ha creado la página.", "postedit-confirmation-restored": "Se ha restaurado la página.", @@ -2365,7 +2368,7 @@ "removedwatchtext-short": "La página \"$1\" ha sido eliminada de tu lista de seguimiento.", "watch": "Vigilar", "watchthispage": "Vigilar esta página", - "unwatch": "Desmarcar", + "unwatch": "Dejar de vigilar", "unwatchthispage": "Dejar de vigilar", "notanarticle": "No es una página de contenido", "notvisiblerev": "La última revisión de un usuario diferente ha sido borrada", @@ -2450,7 +2453,6 @@ "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]", "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]", "sessionfailure-title": "Error de sesión", "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nEnvía el formulario otra vez.", "changecontentmodel": "Cambiar el modelo de contenido de una página", @@ -2645,7 +2647,7 @@ "ipb-confirm": "Confirmar bloqueo", "ipb-sitewide": "En todo el sitio", "ipb-partial": "Parcial", - "ipb-sitewide-help": "Todas las páginas en la Wiki y todas las acciones de contribución.", + "ipb-sitewide-help": "Todas las páginas del wiki y el resto de las acciones de contribución.", "ipb-partial-help": "Páginas concretas o espacios de nombres.", "ipb-pages-label": "Páginas", "ipb-namespaces-label": "Espacios de nombres", diff --git a/languages/i18n/et.json b/languages/i18n/et.json index 97d256ccd7..6f32bc033e 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -2283,7 +2283,6 @@ "revertpage": "Tühistati kasutaja [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]]) tehtud muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].", "revertpage-nouser": "Tühistati peidetud kasutaja muudatused ja pöörduti tagasi viimasele muudatusele, mille tegi [[User:$1|$1]].", "rollback-success": "Tühistati muudatused, mille tegi {{GENDER:$3|$1}};\npöörduti tagasi viimasele muudatusele, mille tegi {{GENDER:$4|$2}}.", - "rollback-success-notify": "Tühistatud kasutaja $1 tehtud muudatused;\npöördutud tagasi kasutaja $2 viimase redaktsiooni juurde. [$3 Näita muudatusi]", "sessionfailure-title": "Seansiviga", "sessionfailure": "Näib, et sinu sisselogimisseanss on probleemne.\nSeansiärandamise vastase ettevaatusabinõuna on see toiming tühistatud.\nPalun saada vorm uuesti.", "changecontentmodel": "Lehekülje sisumudeli muutmine", diff --git a/languages/i18n/eu.json b/languages/i18n/eu.json index e8e435f860..437ed46993 100644 --- a/languages/i18n/eu.json +++ b/languages/i18n/eu.json @@ -2275,7 +2275,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) wikilariaren aldaketak deseginda, edukia [[User:$1|$1]] wikilariaren azken bertsiora itzuli da.", "revertpage-nouser": "{{GENDER:$1|[[User:$1|$1]]}}-n azken berrikuspena ezkutatutako erabiltzaile batek egindako leheneraketa aldaketak.", "rollback-success": "{{GENDER:$3|$1}}; wikilariaren aldaketak deseginda,\nedukia {{GENDER:$4|$2}} wikilariaren azken bertsiora itzuli da.", - "rollback-success-notify": "$1k leheneratutako aldaketal;\nazkenengo berrikusketara aldatu da berriz $2ren eskutik. [$3 Erakutsi aldaketak]", "sessionfailure-title": "Saio-akatsa", "sessionfailure": "Badirudi saioarekin arazoren bat dagoela; ekintza hau ezeztatua izan da, saio bahiketa saihesteko neurri bezala. Mesedez, nabigatzaileko \"atzera\" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.", "changecontentmodel": "Aldatu orri bateko eduki eredua", diff --git a/languages/i18n/exif/diq.json b/languages/i18n/exif/diq.json index c6c1906667..03fc793c32 100644 --- a/languages/i18n/exif/diq.json +++ b/languages/i18n/exif/diq.json @@ -375,9 +375,9 @@ "exif-iimcategory-hth": "Weşeyey", "exif-iimcategory-hum": "Elekey merduman", "exif-iimcategory-lab": "Gurweyayin", - "exif-iimcategory-lif": "Cıwiyayış u keyf kerdış", + "exif-iimcategory-lif": "Cıwiyayış û keyfkerdış", "exif-iimcategory-pol": "Siyaset", - "exif-iimcategory-rel": "Din u iman kerdış", + "exif-iimcategory-rel": "Din û baweriye", "exif-iimcategory-sci": "Zanış u teknoloci", "exif-iimcategory-soi": "Sosyal meseley", "exif-iimcategory-spo": "Spor", diff --git a/languages/i18n/exif/fa.json b/languages/i18n/exif/fa.json index 13454d1d89..9c4c0475ac 100644 --- a/languages/i18n/exif/fa.json +++ b/languages/i18n/exif/fa.json @@ -4,7 +4,8 @@ "Ebraminio", "Huji", "Meisam", - "ZxxZxxZ" + "ZxxZxxZ", + "Reza1615" ] }, "exif-imagewidth": "عرض", @@ -52,6 +53,7 @@ "exif-exposuretime": "زمان نوردهی", "exif-exposuretime-format": "$1 ثانیه ($2)", "exif-fnumber": "ضریب اف", + "exif-fnumber-format": "f/$1", "exif-exposureprogram": "برنامهٔ نوردهی", "exif-spectralsensitivity": "حساسیت طیفی", "exif-isospeedratings": "درجه‌بندی سرعت ایزو", @@ -190,7 +192,14 @@ "exif-compression-4": "رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۴", "exif-copyrighted-true": "دارای حق تکثیر", "exif-copyrighted-false": "وضعیت حق‌تکثیر تعیین نشده است", + "exif-photometricinterpretation-0": "سیاه و سفید (سفید ۰ است)", "exif-photometricinterpretation-1": "سیاه و سفید (سیاه ۰ است)", + "exif-photometricinterpretation-3": "پالت", + "exif-photometricinterpretation-4": "شفافیت پوشش", + "exif-photometricinterpretation-5": "جداشده (احتمالاُ CMYK)", + "exif-photometricinterpretation-8": "CIE L*a*b*", + "exif-photometricinterpretation-9": "CIE L*a*b* (رمزنگاری ICC)", + "exif-photometricinterpretation-10": "CIE L*a*b* (رمزنگاری ITU)", "exif-unknowndate": "تاریخ نامعلوم", "exif-orientation-1": "عادی", "exif-orientation-2": "افقی پشت و روشده", diff --git a/languages/i18n/exif/lrc.json b/languages/i18n/exif/lrc.json index 4c19e312cf..43c77e8913 100644 --- a/languages/i18n/exif/lrc.json +++ b/languages/i18n/exif/lrc.json @@ -149,7 +149,7 @@ "exif-writer": "نیسنه", "exif-languagecode": "زون", "exif-iimversion": "نسقه آی آی ام", - "exif-iimcategory": "دسه", + "exif-iimcategory": "دٱسٱ", "exif-iimsupplementalcategory": "دسه یا اضافی", "exif-datetimeexpires": "وا نها دش استفاده نبوئه", "exif-datetimereleased": "ول بیه د", diff --git a/languages/i18n/exif/tr.json b/languages/i18n/exif/tr.json index 405a3c19c5..f30c520e19 100644 --- a/languages/i18n/exif/tr.json +++ b/languages/i18n/exif/tr.json @@ -39,7 +39,7 @@ "exif-rowsperstrip": "Number of rows per strip", "exif-stripbytecounts": "Bytes per compressed strip", "exif-jpeginterchangeformat": "Offset to JPEG SOI", - "exif-jpeginterchangeformatlength": "Bytes of JPEG data", + "exif-jpeginterchangeformatlength": "JPEG verilerinin baytı", "exif-whitepoint": "Beyaz nokta kromatiği", "exif-primarychromaticities": "Chromaticities of primarities", "exif-ycbcrcoefficients": "Renk aralığı dönüştürme matris katsayısı", diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json index 9086e423ae..47a0c87029 100644 --- a/languages/i18n/fa.json +++ b/languages/i18n/fa.json @@ -71,7 +71,8 @@ "Amirsara", "Physicsch", "Nbi", - "Amjad Khan" + "Amjad Khan", + "Ahmad252" ] }, "tog-underline": "خط کشیدن زیر پیوندها:", @@ -700,6 +701,7 @@ "subject-preview": "پیش‌نمایش موضوع:", "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطایی رخ داد.", "blockedtitle": "کاربر بسته شده‌است", + "blockedtext-partial": "حساب کاربری یا آدرس آی‌پی شما از انجام تغییرات در این صفحه منع شده‌است. شما همچنان می‌توانید در دیگر صفحه‌های این ویکی ویرایش کنید. برای مشاهده جزئیات کامل قطع دسترسی به [[ویژه:مشارکت‌های من|مشارکت‌های حساب]] مراجعه کنید.\n\nاین قطع دسترسی توسط $1 انجام گرفته‌است.\n\nدلیل قطع دسترسی $2 است.\n\n* زمان آغاز قطع دسترسی: $8\n* زمان پایان قطع دسترسی: $6\n* موارد مورد نظر: $7\n* شناسه قطع دسترسی: #$5", "blockedtext": "دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: $2\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.", "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.", "systemblockedtext": "نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.\nدلیل ارائه‌شده:\n\n:$2\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسی‌شده مورد نظر: $7\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.", @@ -715,7 +717,7 @@ "accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.", "newarticle": "(تازه)", "newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.", - "anontalkpagetext": "----این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].", + "anontalkpagetext": "----این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم. \nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].", "noarticletext": "این صفحه هم‌اکنون دارای هیچ متنی نیست.\nشما می‌توانید در صفحه‌های دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ایجاد کنید].", "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید] ولی شما اجازه ایجاد این صفحه را ندارید.", "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nاین اتفاق معمولاً در اثر دنبال کردن پیوندی به تاریخچهٔ یک صفحهٔ حذف‌شده پیش می‌آید.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.", @@ -2317,7 +2319,6 @@ "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد", "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.", "rollback-success": "ویرایش‌های {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.", - "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]", "sessionfailure-title": "خطای نشست کاربری", "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً فرم را از نو بارگذاری کنید.", "changecontentmodel": "ویرایش نمونه محتوای یک صفحه", @@ -2509,7 +2510,10 @@ "ipb-disableusertalk": "ویرایش صفحهً بحث توسط خود کاربر", "ipb-change-block": "بستن دوبارهٔ کاربر با این تنظیم‌ها", "ipb-confirm": "تأیید بستن", - "ipb-partial": "جزئی", + "ipb-sitewide": "کلی", + "ipb-partial": "موردی", + "ipb-sitewide-help": "هر صفحه‌ای در ویکی و تمام فعالیت‌های مشارکتی دیگر", + "ipb-partial-help": "صفحات خاص یا فضاهای نامی", "ipb-pages-label": "صفحات", "ipb-namespaces-label": "فضاهای نام", "badipaddress": "نشانی آی‌پی نامعتبر", @@ -3729,6 +3733,7 @@ "log-action-filter-suppress-reblock": "مخفی‌سازی کاربر با بستن مجدد", "log-action-filter-upload-upload": "بارگذاری جدید", "log-action-filter-upload-overwrite": "بارگذاری دوباره", + "log-action-filter-upload-revert": "واگردانی", "authmanager-authn-not-in-progress": "ارزیابی ورود در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.", "authmanager-authn-no-primary": "اعتبارسنجی اطلاعات ارائه شده جهت ورود ميسر نيست", "authmanager-authn-no-local-user": "اطلاعات ورود ارائه شده با هيچ کاربری در اين ويکی مرتبط نيست", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index 34ef8c7e25..dd476da25f 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -2312,7 +2312,6 @@ "revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.", "revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon", "rollback-success": "Käyttäjän {{GENDER:$3|$1}} tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän {{GENDER:$4|$2}} versioon.", - "rollback-success-notify": "Kumottiin käyttäjän $1 muokkaukset; palautettiin viimeiseen käyttäjän $2 versioon. [$3 Näytä muutokset]", "sessionfailure-title": "Istuntovirhe", "sessionfailure": "Näyttää siltä, että tämänhetkisessä istunnossasi on jokin ongelma; \ntämä toiminto on peruutettu varotoimena istunnon kaappaamisen estämiseksi.\nLähetä lomake uudelleen.", "changecontentmodel": "Muuta sivun sisältömallia", @@ -2494,14 +2493,14 @@ "ipbreason-dropdown": "*Yleiset estosyyt\n** Väärän tiedon lisääminen\n** Sisällön poistaminen\n** Mainoslinkkien lisääminen\n** Sotkeminen tai roskan lisääminen\n** Häiriköinti\n** Useamman käyttäjätunnuksen väärinkäyttö\n** Sopimaton käyttäjätunnus", "ipb-hardblock": "Estä sisäänkirjautuneita käyttäjiä muokkaamasta tästä IP-osoitteesta", "ipbcreateaccount": "Tunnusten luominen", - "ipbemailban": "(Estä) sähköpostin lähettäminen", + "ipbemailban": "Sähköpostin lähettäminen", "ipbenableautoblock": "Estä automaattisesti viimeisin IP-osoite, josta käyttäjä on muokannut, sekä ne osoitteet, joista hän jatkossa yrittää muokata.", "ipbsubmit": "Estä tämä käyttäjä", "ipbother": "Muu aikamääre:", "ipboptions": "2 tuntia:2 hours,1 päivä:1 day,3 päivää:3 days,1 viikko:1 week,2 viikkoa:2 weeks,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year,ikuinen:infinite", "ipbhidename": "Piilota tunnus muokkauksista ja listauksista", "ipbwatchuser": "Tarkkaile tämän käyttäjän käyttäjä- ja keskustelusivua", - "ipb-disableusertalk": "(Estä) oman keskustelusivun muokkaaminen", + "ipb-disableusertalk": "Oman keskustelusivun muokkaaminen", "ipb-change-block": "Estä uudelleen näillä asetuksilla", "ipb-confirm": "Vahvista esto", "ipb-sitewide": "Sivuston laajuinen", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index f96984579f..e232795344 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -2444,7 +2444,6 @@ "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]", "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Révocation des modifications effectuées par {{GENDER:$3|$1}} ;\nrétablissement de la dernière version par {{GENDER:$4|$2}}.", - "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]", "sessionfailure-title": "Erreur de session", "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez soumettre le formulaire de nouveau.", "changecontentmodel": "Modifier le modèle de contenu d’une page", diff --git a/languages/i18n/fy.json b/languages/i18n/fy.json index 75836921d4..4211a20bb5 100644 --- a/languages/i18n/fy.json +++ b/languages/i18n/fy.json @@ -25,7 +25,7 @@ ] }, "tog-underline": "Keppelings ûnderstreekje:", - "tog-hideminor": "Tekstwizigings wei litte út 'Koartlyn feroare'", + "tog-hideminor": "Feroarings fan lytse betsjutting ferbergje yn Koartlyn feroare", "tog-hidepatrolled": "Markearre feroarings ferskûlje yn resinte feroarings", "tog-newpageshidepatrolled": "Markearre siden ferskûlje yn 'e list mei nije siden", "tog-extendwatchlist": "Wreidzje folchlist út om alle wizigings sjen te litten, net allinnich de lêste wizigings", @@ -37,12 +37,12 @@ "tog-watchdefault": "Sides dy't jo feroare hawwe folgje", "tog-watchmoves": "Siden dy't jo werneamd hawwe folgje", "tog-watchdeletion": "Siden dy't jo wiske hawwe folgje", - "tog-minordefault": "Feroarings yn it earst oanjaan as tekstwizigings.", + "tog-minordefault": "Markearje alle feroarings standert as fan lytse betsjutting", "tog-previewontop": "By it neisjen, bewurkingsfjild ûnderoan sette", "tog-previewonfirst": "Lit foarbyld sjen by earste wiziging", "tog-enotifwatchlistpages": "E-mail my as in side op myn folchlist feroare is.", "tog-enotifusertalkpages": "E-mail my as myn oerlisside feroare wurdt", - "tog-enotifminoredits": "E-mail my ek by lytse feroarings fan siden op myn folchlist", + "tog-enotifminoredits": "E-mail my ek by feroarings fan lytse betsjutting oan siden en bestannen", "tog-enotifrevealaddr": "Myn e-mailadres sjen litte yn e-mailberjochten", "tog-shownumberswatching": "It tal meidoggers sjen litte dat dizze side folget", "tog-oldsig": "Aktuele sinjatuerprintallyk:", @@ -51,7 +51,7 @@ "tog-forceeditsummary": "Warskôgje at ik de gearfetting leech lit.", "tog-watchlisthideown": "Eigen bewurkings op myn folchlist ferbergje", "tog-watchlisthidebots": "Lit gjin bot wizigings sjen yn de folchlist", - "tog-watchlisthideminor": "Lit gjin tekstwizigings sjen yn de folchlist", + "tog-watchlisthideminor": "Feroarings fan lytse betsjutting ferbergje yn de folchlist", "tog-watchlisthideliu": "Bewurkings fan oanmelde meidoggers op myn folchlist ferbergje", "tog-watchlisthideanons": "Bewurkings fa anonyme meidoggers op myn folchlist ferbergje", "tog-watchlisthidepatrolled": "Markearre feroarings op myn folchlist ferskûlje", @@ -132,7 +132,7 @@ "category_header": "Siden yn de kategory \"$1\"", "subcategories": "Subkategoryen", "category-media-header": "Media yn de kategory \"$1\"", - "category-empty": "Yn dizze kategory binne gjin siden of bestannen opnaam.", + "category-empty": "Dizze kategory befettet op it stuit gjin siden of media.", "hidden-categories": "Ferburgen {{PLURAL:$1|kategory|kategoryen}}", "hidden-category-category": "Ferburgen kategoryen", "category-subcat-count": "{{PLURAL:$2|Dizze kategory hat allinne de folgjende ûnderkategory.|Dizze kategory hat de folgjende {{PLURAL:$1|ûnderkategory|$1 ûnderkategoryen}}, fan yn totaal $2.}}", @@ -199,7 +199,7 @@ "categorypage": "Besjoch kategoryside", "viewtalkpage": "Oerlisside", "otherlanguages": "In oare talen", - "redirectedfrom": "(Trochwiisd fan \"$1\")", + "redirectedfrom": "(Trochwiisd fan $1)", "redirectpagesub": "Trochferwiis-side", "lastmodifiedat": "Dizze side is it lêst bewurke op $1 om $2.", "viewcount": "Disse side is {{PLURAL:$1|ienris|$1 kear}} iepenslein.", @@ -324,6 +324,7 @@ "ns-specialprotected": "Siden yn'e nammerûmte {{ns:special}} kinne net bewurke wurde.", "titleprotected": "It oanmeitsjen fan dizze side is befeilige troch [[User:$1|$1]].\nDe oanfierde reden is $2.", "exception-nologin": "Net oanmeld", + "exception-nologin-text-manual": "Jo moatte $1 om tagong ta dizze side of hanneling krije te kinnen.", "virus-badscanner": "Minne konfiguraasje: ûnbekende virusscanner: ''$1''", "virus-scanfailed": "scannen is mislearre (koade $1)", "virus-unknownscanner": "ûnbekend antivirus:", @@ -420,7 +421,7 @@ "resetpass_submit": "Wachtwurd ynstelle en oanmelde", "changepassword-success": "Jo wachtwurd is feroare.", "resetpass_forbidden": "Wachtwurden kinne net feroare wurde", - "resetpass-no-info": "Jo moatte oanmeld wêze foar't Jo dizze side brûke kinne.", + "resetpass-no-info": "Jo moatte oanmeld wêze om streekrjocht tagong ta dizze side te hawwen.", "resetpass-submit-loggedin": "Wachtwurd feroarje", "resetpass-submit-cancel": "Annulearje", "resetpass-wrong-oldpass": "It momintele of tydlike wachtwurd is ûnjildich.\nMûglik hawwe Jo Jo wachtwurd al feroare of in nij tydlik wachtwurd oanfrege.", @@ -433,6 +434,7 @@ "passwordreset-emailelement": "Meidochnamme: \n$1\n\nTydlik wachtwurd: \n$2", "changeemail": "Feroarje e-mailadres", "changeemail-header": "Feroarje akkount e-mailadres", + "changeemail-no-info": "Jo moatte oanmeld wêze om streekrjocht tagong ta dizze side te hawwen.", "changeemail-newemail": "Nij e-mailadres:", "changeemail-none": "(gjin)", "changeemail-password": "Jo wachtwurd foar {{SITENAME}}:", @@ -460,7 +462,7 @@ "hr_tip": "Horizontale line (mei ferdrach brûke)", "summary": "Gearfetting:", "subject": "Underwerp:", - "minoredit": "Dit is in tekstwiziging", + "minoredit": "Dit is fan lytse betsjutting", "watchthis": "Folgje dizze side", "savearticle": "Side bewarje", "publishpage": "Side fêstlizze", @@ -479,13 +481,13 @@ "autoblockedtext": "Jo ynternet-adres is automatysk útsletten, om't it brûkt is troch in oare meidogger dy't útsletten is troch $1.\nAs reden is opjûn:\n\n:$2\n\n* Begjin útsluting: $8\n* Ein útsluting: $6\n* Bedoeld út te sluten: $7\n\nAs jo wolle, meie jo kontakt opnimme mei $1 of ien fan 'e oare [[{{MediaWiki:Grouppage-sysop}}|behearders]] en besprekke de útsluting.\n\nTink derom dat jo de funksje \"{{int:emailuser}}\" net brûke kinne, of it moast wêze dat jo in jildich e-mailadres fêstlein hawwe yn jo [[Special:Preferences|ynstellings]] en net útsletten binne dat te brûken.\n\nJo hjoeddeisk ynternet-adres is $3, en it útslútnûmer is #$5.\nNim alle boppesteande gegevens op yn jo reäksjes.", "systemblockedtext": "Jo meidochnamme of ynternet-adres is automatysk útsletten troch MediaWiki.\nAs reden is opjûn:\n\n:$2\n\n* Begjin útsluting: $8\n* Ein útsluting: $6\n* Bedoeld út te sluten: $7\n\nJo hjoeddeisk ynternet-adres is $3.\nNim alle boppesteande gegevens op yn jo reäksjes.", "blockednoreason": "gjin reden opjûn", - "whitelistedittext": "Jo moatte $1 om siden te bewurkjen.", + "whitelistedittext": "Jo moatte $1 om siden bewurkje te kinnen.", "confirmedittext": "Jo moatte jo e-mailadres befêstichje foar't jo siden feroarje kinne.\nFier in e-mailadres yn by jo [[Special:Preferences|foarkarren]] en befêstichje it.", "nosuchsectiontitle": "Dizze subkop bestiet net", "nosuchsectiontext": "Jo besochten in subkop te bewurkjen dy't net bestiet.", "loginreqtitle": "Oanmelding frege", - "loginreqlink": "Oanmelde", - "loginreqpagetext": "Jo moatte jo $1 om oare siden besjen te kinnen.", + "loginreqlink": "jo oanmelde", + "loginreqpagetext": "Jo moatte $1 om oare siden besjen te kinnen.", "accmailtitle": "Wachtwurd ferstjoerd.", "accmailtext": "Samar in wachtwurd foar [[User talk:$1|$1]] is ferstjoerd nei $2. It kin wizige wurde op 'e side \n[[Special:ChangePassword|Wachtwurd feroarje]] nei oanmelden.", "newarticle": "(Nij)", @@ -493,6 +495,7 @@ "anontalkpagetext": "----\nDit is de oerlisside fan in ûnbekende meidogger; in meidogger dy't him/har net oanmeld hat.\nOm't der gjin namme bekend is, wurdt it ynternet-adres brûkt om oan te jaan om wa't it giet.\nMar faak is it sa dat sa'n adres net altyd troch deselde persoan brûkt wurdt.\nAs jo it idee hawwe dat jo as ûnbekende meidogger opmerkings foar in oar krije, dan kinne jo jo [[Special:CreateAccount|registrearje]], of jo [[Special:UserLogin|oanmelde]]. Fan in oanmelde meidogger is it ynternet-adres net sichtber, en as oanmelde meidogger krije jo allinnich opmerkings dy't foar josels bedoeld binne.", "noarticletext": "Der stjit noch gjin tekst op dizze side. Jo kinne\n[[Special:Search/{{PAGENAME}}|hjirboppe nei dy tekst sykje]], of [{{fullurl:{{FULLPAGENAME}}|action=edit}} de side skriuwe].", "userpage-userdoesnotexist": "Jo bewurkje in meidoggerside fan in meidogger dy't net bestiet (meidogger \"$1\").\nKontrolearje oft jo dizze side wol oanmeitsje/bewurkje wolle.", + "userpage-userdoesnotexist-view": "It meidochakkount \"$1\" bestiet net.", "clearyourcache": "Opmerking: Nei it fêstlizzen kin it nedich wêze de oerslach fan dyn blêder te leegjen foardat de wizigings te sjen binne.\n* Firefox / Safari: Hâld Shift yntreaun wylst jo op Dizze side fernije klikke, of typ Ctrl-F5 of Ctrl-R (⌘-R op in Mac)\n* Google Chrome: Typ CTRL-Shift-R (⌘-Shift-R op in Mac)\n* Internet Explorer: Hâld Ctrl yntreaun wylst jo Vernieuwen'' klikke of typ Ctrl-F5\n* Opera: Leegje jo cache yn Extra → Voorkeuren", "usercssyoucanpreview": "Tip: Brûk de knop \"{{int:showpreview}}\" om jo nije CSS te testen foar it fêstlizzen.", "userjsyoucanpreview": "Tip: Brûk de knop \"{{int:showpreview}}\" om jo nije JS te testen foar it fêstlizzen.", @@ -532,7 +535,7 @@ "hiddencategories": "Dizze side falt yn de folgjende ferburgen\n{{PLURAL:$1|kategory|kategoryen}}:", "edittools": "", "edittools-upload": "-", - "nocreatetext": "{{SITENAME}} hat de mûglikheid beheind om nije siden te meitsjen.\nJo kinne al besteande siden feroarje of jo kinne [[Special:UserLogin|jo oanmelde of in meidogger oanmeitsje]].", + "nocreatetext": "{{SITENAME}} hat de mûglikheid beheind om nije siden oan te meitsjen.\nJo kinne al weromgean en besteande siden bewurkje, [[Special:UserLogin|jo oanmelde of in akkount oanmeitsje]].", "nocreate-loggedin": "Jo meie gjin nije siden meitsje", "permissionserrors": "Flaters yn rjochten", "permissionserrorstext": "Jo hawwe gjin rjochtem dit te dwaan om de folgjende {{PLURAL:$1|reden|redenen}}:", @@ -580,7 +583,7 @@ "last": "foarige", "page_first": "earste", "page_last": "lêste", - "histlegend": "Utlis: (no) = ferskil mei de side sa't dy no is,\n(doe) = ferskill mei de side sa't er doe wie, foar de feroaring, T = Tekstwiziging", + "histlegend": "Ferskil oanjaan: Markearje de rûntsjes fan 'e te ferlykjen ferzjes, en druk op Enter of de knop ûnderoan.
\nLeginda: ({{int:cur}}) = ferskil mei de lêste ferzje, ({{int:last}}) = ferskil mei de eardere ferzje, {{int:minoreditletter}} = lytse feroaring.", "history-fieldset-title": "Troch skiednis blêdzje", "histfirst": "âldste", "histlast": "nijste", @@ -704,6 +707,7 @@ "preferences": "Foarkarren", "mypreferences": "Foarkarren", "prefs-edits": "Tal bewurkings:", + "prefsnologintext2": "Jo moatte jo oanmelde om jo ynstellings wizigje te kinnen.", "prefs-skin": "Side-oansjen", "skin-preview": "Proefbyld", "datedefault": "Gjin foarkar", @@ -722,7 +726,7 @@ "prefs-email": "E-mail", "prefs-rendering": "Uterlik", "saveprefs": "Bewarje", - "restoreprefs": "Tebek nei de standertynstellings", + "restoreprefs": "Alle standertynstellings weromsette (yn alle parten)", "prefs-editing": "Siden bewurkje", "searchresultshead": "Sykje", "stub-threshold": "Drompel foar markearring stobbe (bytes):", @@ -753,6 +757,7 @@ "default": "standert", "prefs-files": "Bestannen", "prefs-custom-js": "Persoanlik JS", + "prefs-reset-intro": "Jo kinne dizze side brûke, en set jo ynstellings werom nei de websteestandert.\nDat kin net ûngedien makke wurde.", "prefs-emailconfirm-label": "E-mailbefêstiging:", "youremail": "E-mail:", "username": "{{GENDER:$1|Meidochnamme}}:", @@ -771,7 +776,7 @@ "prefs-help-gender": "Kar: dit wurdt troch de programmatuer brûkt om de goeie oansprekfoarm te kiezen.\nDizze ynformaasje is foar oare meidoggers te sjen.", "email": "E-mail", "prefs-help-realname": "Echte namme is net ferplicht; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.", - "prefs-help-email": "In e-mailadres hoegt net, mar is al nedich foar it op 'e nij oanmeitsjen fan jo wachtwurd, at jo dat ferjitte.", + "prefs-help-email": "In e-mailadres hoecht net, mar is al nedich foar it op 'e nij oanmeitsjen fan jo wachtwurd, at jo dat ferjitte.", "prefs-help-email-required": "Hjir is in e-mailadres foar nedich.", "prefs-info": "Basisynformaasje", "prefs-i18n": "Taalynstellingen", @@ -830,7 +835,7 @@ "right-createpage": "Siden oanmeitsjen (net oerlissiden)", "right-createtalk": "Oerlissiden oanmeitsjen", "right-createaccount": "Nije meidoggers oanmeitsje", - "right-minoredit": "Bydragen markearje as tekstwiziging", + "right-minoredit": "Feroarings as fan lytse betsjutting markearje", "right-move": "Siden werneamen", "right-move-subpages": "Siden ynklusyf har subsiden ferpleatse.", "right-move-rootuserpages": "Meidoggersiden fan it heechste nivo in oare namme jaan", @@ -844,7 +849,7 @@ "right-purge": "De cache foar in side leegje sûnder befêstiging", "right-autoconfirmed": "Hat gjin op IP-adres basearre tiidsôfhinklike beheinings", "right-bot": "Behannele wurde as in automatisearre proses", - "right-nominornewtalk": "Lytse bewurkings oan in oerlisside liede net ta in melding 'nije berjochten'", + "right-nominornewtalk": "Feroarings fan lytse betsjutting oan in oerlisside liede net ta in melding 'nije berjochten'", "right-apihighlimits": "Hegere limiten yn API-sykopdrachten brûke", "right-writeapi": "Bewurkje fia API", "right-delete": "Siden wiskje", @@ -869,7 +874,7 @@ "right-markbotedits": "Tebekdraaide bewurkings markearje as botbewurkings", "right-noratelimit": "Hat gjin tiidsôfhinklike beheinings", "right-import": "Siden út oare wiki's ymportearje", - "right-importupload": "Ymportearje siden út opladen bestân", + "right-importupload": "Siden ymportearje út in opladen bestân", "right-patrol": "Bewurkings as kontrolearre markearje", "right-autopatrol": "Bewurkings wurde automatysk as kontrolearre markearre", "right-patrolmarks": "Kontroletekens yn resinte feroarings besjen", @@ -889,7 +894,7 @@ "action-createpage": "siden oan te meitsjen", "action-createtalk": "oerlissiden oan te meitsjen", "action-createaccount": "oanmeitsjen fan dit meidochakkount", - "action-minoredit": "dizze bewurking as lyts te markearjen", + "action-minoredit": "dizze feroaring as fan lytse betsjutting te markearjen", "action-move": "dizze side in oare namme te jaan", "action-move-subpages": "dizze side en de derby hearrende subsiden in oare namme te jaan", "action-move-rootuserpages": "meidoggersiden fan it heechste nivo in oare namme te jaan", @@ -911,7 +916,7 @@ "action-protect": "it befeiligingsnivo fan dizze side oanpasse", "action-rollback": "gau de bewurkings omdraaien fan 'e lêste meidogger dy't in beskate side bewurke", "action-import": "dizze side fan in oare wiki ymportearje", - "action-importupload": "dizze side ymportearje fan in bestânsoplading", + "action-importupload": "siden ymportearjen út in opladen bestân", "action-patrol": "bewurkings fan oaren as kontrolearre beskôgje", "action-autopatrol": "eigen bewurkings as kontrolearre markearje litte", "action-unwatchedpages": "de list mei siden dy't net op in folchlist steane besjen", @@ -929,7 +934,7 @@ "recentchanges-summary": "Folgje de lêste feroarings oan 'e wiki op dizze side.", "recentchanges-feed-description": "Mei dizze feed kinne jo de nijste feroarings yn dizze wiki besjen.", "recentchanges-label-newpage": "Mei dizze wiziging is in nije side makke", - "recentchanges-label-minor": "Dit is in tekstwiziging", + "recentchanges-label-minor": "Dizze feroaring is fan lytse betsjutting", "recentchanges-label-bot": "Dizze bewurking is troch in bot útfierd", "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn", "recentchanges-label-plusminus": "De sidegrutte is mei dit oantal bytes wizige", @@ -938,7 +943,7 @@ "rcfilters-legend-heading": "List fan ôfkoartings:", "rcnotefrom": "Dit binne de feroarings sûnt $2 (maksimaal $1).", "rclistfrom": "Jou nije feroarings, begjinnende mei $3 $2", - "rcshowhideminor": "$1 tekstwizigings", + "rcshowhideminor": "lytse feroarings $1", "rcshowhideminor-show": "werjaan", "rcshowhideminor-hide": "ferbergje", "rcshowhidebots": "bots $1", @@ -961,7 +966,7 @@ "hist": "skied.", "hide": "gjin", "show": "al", - "minoreditletter": "T", + "minoreditletter": "L", "newpageletter": "N", "boteditletter": "b", "unpatrolledletter": "!", @@ -982,16 +987,16 @@ "uploadbtn": "Bied bestân oan", "reuploaddesc": "Werom nei oanbied-side.", "uploadnologin": "Net oanmeld", - "uploadnologintext": "Jo moatte [[Special:UserLogin|oanmeld]] wêze om in bestân oanbiede te kinnen.", + "uploadnologintext": "Jo moatte $1 om bestannen oplade te kinnen.", "upload_directory_missing": "De heechlaadmap ($1) is der net en koe net oanmakke wurde troch de webserver.", "upload_directory_read_only": "De webserver kin net skriuwe yn de oanbiedpad ($1).", "uploaderror": "Oanbiedfout", - "uploadtext": "Om in nije bestannen oan te bieden, brûke jo de ûndersteande formulier. Earder oanbeane bestannen, kinne jo fine op de [[Special:FileList|list fan oanbeane ôfbylden]].\nWat oanbean en wat wiske wurdt, wurdt delskreaun yn it [[Special:Log/upload|lochboek]].\n\nOm it bestân yn in side op te nimmen, meitsje jo dêr sa'n keppeling:\n*'''[[{{ns:file}}:jo_foto.jpg]]''', foar grutte ferzje,\n*'''[[{{ns:file}}:jo_logo.png|omskriuwing]]''' foar 200 in piksel ferzje, mei 'alternative tekst' as beskriuwing, of\n*'''[[{{ns:media}}:jo_lûd.ogg]]''', foar direkt keppeling nei it bestân (sûnder byld).", + "uploadtext": "Brûk it formulier dat hjir folget om bestannen op te laden.\nGean nei de [[Special:FileList|bestânslist]], om earder opladen bestannen te besjen of op te sykjen. De (wer)opladen bestannen wurde ek opnommen yn it [[Special:Log/upload|oanbiedloch]], fuortsmiten bestannen yn it [[Special:Log/delete|wiskloch]].\n\nBrûk in keppeling yn ien fan 'e neikommende foarmen, en heakje in bestân oan in side ta:\n* [[{{ns:file}}:Bestân.jpg]] om de folsleine ferzje fan it bestân te brûken\n* [[{{ns:file}}:Bestân.png|200px|thumb|left|alt. tekst]] om in ôfbylding fan 200 pixel breed te brûken, yn in ramt oan de lofter kant mei \"alt. tekst\" as beskriuwing\n* [[{{ns:media}}:Bestân.ogg]] foar it sûnder werjefte, streekrjocht ferwizen nei it bestân", "upload-permitted": "Talitten bestânstypen: $1.", "upload-preferred": "Oanwiisde bestânstypen: $1.", "upload-prohibited": "Ferbeane bestânstypen: $1.", "uploadlogpage": "Oanbiedloch", - "uploadlogpagetext": "List fan de lêst oanbeane bestannen. (Tiid oanjûn as UTC).", + "uploadlogpagetext": "Hjirûnder stiet in list fan 'e meast resint opladen bestannen.\nSjoch de [[Special:NewFiles|galery mei nije bestannen]] foar in fisueler oersjoch.", "filename": "Bestânsnamme", "filedesc": "Omskriuwing", "fileuploadsummary": "Gearfetting:", @@ -1006,17 +1011,17 @@ "filetype-badmime": "Bestannen fan it MIME type \"$1\" meie net heechladen wurde.", "filetype-bad-ie-mime": "Dit bestân kin net tafoege wurde, om't Internet Explorer dy idintifisearje soe as \"$1\", in net talitten bestânstype dat potinsjeel skealik is.", "filetype-unwanted-type": "'''\".$1\"''' is in net winske bestânstype.\n{{PLURAL:$3|Oanwiisd bestânstype is|Oanwiisde bestânstypen binne}} $2.", - "filetype-banned-type": "'''\".$1\"''' is gjin talitten bestânstype.\n{{PLURAL:$3|Talitten bestânstype is|Talittene bestânstypen binne}} $2.", + "filetype-banned-type": "\".$1\" {{PLURAL:$4|is gjin talitten bestânstype|binne gjin talitten bestânstypen}}.\nTalitten {{PLURAL:$3|bestânstype is|bestânstypen binne}} $2.", "filetype-missing": "It bestân hat gjin taheaksel (lykas \".jpg\").", "large-file": "Oanbefelling: meitsje bestannen net grutter as $1; dit bestân is $2.", "largefileserver": "It bestân is grutter as dat de ynstelling fan de server talit.", "emptyfile": "It bestân dat jo heechladen hawwe liket leech te wêzen.\nDat soe komme kinne fan in typflater yn 'e bestânsnamme.\nGean nei oft jo dit bestân wier bedoelden heech te laden.", - "fileexists": "Der bestiet al in bestân mei dizze namme.\nKontrolearje [[:$1]] as jo net wis binne oft jo it besteande bestân oerskriuwe wolle.\n[[$1|thumb]]", + "fileexists": "In bestân mei dizze namme bestiet al; kontrolearje [[:$1]] at {{GENDER:|jo}} net wis binne oft jo it ferfange wolle.\n[[$1|thumb]]", "filepageexists": "De beskriuwingsside foar dit bestân bestiet al op [[:$1]], mar der bestiet gjin bestân mei dizze namme.\nDe gearfetting dy't jo opjûn hawwe sil net op 'e beskriuwingsside ferskine.\nBewurkje de side mei de hân om de beskriuwing dêr wer te jaan.", - "fileexists-extension": "In bestân mei deselde namme bestiet al: [[$2|thumb]]\n* Namme fan it heechladen bestân: [[:$1]]\n* Namme fan it besteande bestân: [[:$2]]\nKies in oare namme.", + "fileexists-extension": "In bestân mei in soartgelikense namme bestiet al: [[$2|thumb]]\n* Namme fan it opladen bestân: [[:$1]]\n* Namme fan it besteande bestân: [[:$2]]\nBrûk a.j.w. in wat oare namme.", "fileexists-thumbnail-yes": "It bestân liket in ferlytse ferzje te wêzen ''(miniatuerôfbylding)''. [[$1|thumb]]\nKontrolearje it bestân [[:$1]].\nAs it kontrolearre bestân deselde ôfbylding fan deselde grutte is, dan hoecht net in ekstra miniatuerôfbylding oanbean te wurden.", "file-thumbnail-no": "De bestânsnamme begjint mei $1.\nIt liket in ferlytse ôfbylding te wêzen ''(miniatuerôfbylding)''.\nAs jo dy ôfbylding yn folsleine resolúsje hawwe, bied him dan oan.\nFeroarje oars de bestânsnamme.", - "fileexists-forbidden": "Der bestiet al in bestân mei dizze namme.\nBied jo bestân ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]", + "fileexists-forbidden": "In bestân mei dizze namme bestiet al, en kin net oerskreaun wurde.\nAt jo jo bestân noch oplade wolle, gean dan werom en brûk in nije namme.\n[[File:$1|thumb|center|$1]]", "fileexists-shared-forbidden": "Der bestiet al in bestân mei dizze namme by de dielde bestannen.\nAs jo it bestân dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]", "file-exists-duplicate": "Dit bestân is idintyk oan {{PLURAL:$1|it folgjende bestân|de folgjende bestannen}}:", "file-deleted-duplicate": "In bestân idintyk oan dit bestân ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.", @@ -1033,7 +1038,7 @@ "destfilename": "Bestânsnamme om op te slaan:", "upload-maxfilesize": "Maksimale bestânsgrutte: $1", "upload-description": "Bestânsbeskriuwing", - "upload-options": "Uploadynstellingen", + "upload-options": "Oplaadynstellingen", "watchthisupload": "Folgje dit bestân", "filewasdeleted": "Der is earder in bestân mei dizze namme fuorthelle.\nRieplachtsje it $1 foar't jo him op'e nij tafoegje.", "filename-bad-prefix": "De namme fan it bestân dat jo oanbiede begjint mei '''\"$1\"''', dit wiist op in namme dy't automatysk troch in digitale kamera oanmakke wurdt. Feroarje de namme as jo wolle yn ien dy't in omskriuwing jout fan it bestân.", @@ -1053,11 +1058,12 @@ "license": "Lisinsje:", "license-header": "Lisinsje", "nolicense": "Neat keazen", + "licenses-edit": "Lisinsje-opsjes bewurkje", "license-nopreview": "(Foarfertoaning net beskikber)", - "upload_source_url": " (in jildige, publyk tagonklike URL)", - "upload_source_file": " (in bestân op jo kompjûter)", + "upload_source_url": "(it útkeazen bestân op in jildige, publyk tagonklike URL)", + "upload_source_file": "(it útkeazen bestân op jo kompjûter)", "listfiles-delete": "fuortsmite", - "listfiles-summary": "Op dizze spesjale side binne alle tafoege bestannen te besjen.\nStandert wurde de lêst tafoege bestannen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.", + "listfiles-summary": "Op dizze bysûndere side binne alle opladen bestannen te sjen.", "listfiles_search_for": "Sykje nei bestân:", "imgfile": "bestân", "listfiles": "Bestânslist", @@ -1077,7 +1083,7 @@ "filehist-deleteone": "fuortsmite", "filehist-revert": "werom sette", "filehist-current": "lêste", - "filehist-datetime": "Tiid", + "filehist-datetime": "Datum/tiid", "filehist-thumb": "Miniatuer", "filehist-thumbtext": "Miniatuer foar de ferzje sûnt $1", "filehist-nothumb": "Gjin miniatuerôfbylding", @@ -1090,8 +1096,9 @@ "linkstoimage-more": "Der {{PLURAL:$2|is|binne}} mear as $1 {{PLURAL:$1|ferwizing|ferwizings}} nei dit bestân.\nDe folgjende list jout allinne de earste {{PLURAL:$1|ferwizing|$1 ferwizings}} nei dit bestân wer.\nDer is ek in [[Special:WhatLinksHere/$2|folsleine list]].", "nolinkstoimage": "Der binne gjin siden oan dit ôfbyld keppele.", "morelinkstoimage": "[[Special:WhatLinksHere/$1|Mear ferwizings]] nei dit bestân besjen.", - "duplicatesoffile": "{{PLURAL:$1|It folgjende bestân is|De folgjende $1 bestannen binne}} idintyk oan dit bestân:", - "sharedupload": "Dit bestân is in dielde oanbieding en kin ek troch oare projekten brûkt wurde.", + "duplicatesoffile": "{{PLURAL:$1|It|De}} neikommend{{PLURAL:$1| bestân is|e $1 bestannen binne}} identyk oan dit bestân ([[Special:FileDuplicateSearch/$2|mear bysûnderheden]]):", + "sharedupload": "Dit bestân komt fan $1, en kin ek troch oare projekten brûkt wurde.", + "sharedupload-desc-here": "Dit bestân komt fan $1, en kin ek troch oare projekten brûkt wurde.\nDe beskriuwing op syn [$2 bestânsside] dêre wurdt hjirûnder werjûn.", "filepage-nofile": "Der bestiet gjin bestân mei sa'n namme.", "filepage-nofile-link": "Der bestiet gjin bestân mei sa'n namme [bied $1 oan].", "uploadnewversion-linktext": "Bied in nije ferzje fan dit bestân oan", @@ -1119,7 +1126,7 @@ "filedelete-reason-dropdown": "*Faak foarkommende redenen foar fuortheljen\n** Skeinen fan auteursrjochten\n** Duplikaatbestân", "filedelete-edit-reasonlist": "Redenen foar fuortheljen bewurkje", "mimesearch": "Sykje op MIME-type", - "mimesearch-summary": "Dizze side makket it filterjen mûglik fan bestannen foar it MIME-type.\nYnfier: contenttype/subtype, bygelyks image/jpeg.", + "mimesearch-summary": "Op dizze side kinne bestannen op har MIME-type filtere wurde.\nYnfier: ynhâldstype/subtype as ynhâldstype/*, bgl. image/jpeg.", "mimetype": "MIME-type:", "download": "oanbiede", "unwatchedpages": "Siden dy't net op in folchlist steane", @@ -1299,6 +1306,7 @@ "mywatchlist": "Folchlist", "watchlistfor2": "Foar $1 $2", "nowatchlist": "Jo hawwe gjin siden op jo folchlist.", + "watchlistanontext": "Jo moatte $1 om siden op jo folchlist besjen of bewurkje te kinnen.", "watchnologin": "Net oanmeld yn", "addwatch": "Oan folchlist tafoegje", "addedwatchtext": "\"[[:$1]]\" en de bybehearrende oerlisside binne tafoege oan jo [[Special:Watchlist|folchlist]].", @@ -1606,7 +1614,7 @@ "tooltip-ca-nstab-template": "Sjabloan sjen litte", "tooltip-ca-nstab-help": "Helpside sjen litte", "tooltip-ca-nstab-category": "Kategory-side sjen litte", - "tooltip-minoredit": "Markearje dit as in lytse feroaring", + "tooltip-minoredit": "Markearje dizze feroaring as fan lytse betsjutting", "tooltip-save": "Jo feroarings bewarje", "tooltip-preview": "Oerlêze foar't de side fêstlein is!", "tooltip-diff": "Sjen litte hokker feroarings jo yn'e tekst makke hawwe.", @@ -1615,7 +1623,7 @@ "tooltip-rollback": "\"Omdraaie\" keart de bewurking(s) fan 'e lêste bydrager oan dizze side yn ien klik om", "interlanguage-link-title": "$1 – $2", "interlanguage-link-title-nonlang": "$1 – $2", - "common.js": "/* Alles wat hjir oan JavaScript delset wurdt, wurdt foar alle brûkers laden foar eltse side! */", + "common.js": "/* Alles wat hjir oan JavaScript delset wurdt, wurdt foar alle meidoggers laden foar eltse side! */", "anonymous": "Anonime {{PLURAL:$1|meidogger|meidoggers}} fan {{SITENAME}}", "siteuser": "{{SITENAME}} meidogger $1", "anonuser": "{{SITENAME}} anonime meidogger $1", @@ -1659,7 +1667,7 @@ "markedaspatrollederror": "Kin net as kontrolearre markearre wurde", "markedaspatrollederrortext": "Jo moatte in ferzje oanjaan dy't jo as kontrolearre markearje.", "markedaspatrollederror-noautopatrol": "Jo meie jo eigen bewurkings net sels markearre.", - "previousdiff": "← Âldere feroaring", + "previousdiff": "← Eardere ferskillen", "nextdiff": "Neikommende ferskillen →", "imagemaxsize": "Behein ôfmjittings fan ôfbyld op beskriuwingsside ta:", "thumbsize": "Mjitte fan miniatueren:", @@ -1675,6 +1683,7 @@ "show-big-image-size": "$1 × $2 pixels", "newimages": "Nije ôfbylden", "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|bestân|bestannen}}, op $2.", + "newimages-summary": "Dizze bysûndere side lit de lêst opladen bestannen sjen.", "newimages-legend": "Filter", "noimages": "Neat te sjen.", "ilsubmit": "Sykje", @@ -1686,7 +1695,7 @@ "days-abbrev": "$1 d", "seconds": "{{PLURAL:$1|$1 sekonde|$1 sekonden}}", "minutes": "{{PLURAL:$1|$1 minút|$1 minuten}}", - "hours": "{{PLURAL:$1|$1 oere|$1 oere}}", + "hours": "{{PLURAL:$1|$1 oere|$1 oeren}}", "days": "{{PLURAL:$1|$1 dei|$1 dagen}}", "weeks": "{{PLURAL:$1|$1 wike|$1 wiken}}", "months": "{{PLURAL:$1|$1 moanne|$1 moannen}}", @@ -1719,6 +1728,7 @@ "confirmemail_sent": "Befêstiginskoade tastjoerd.", "confirmemail_sendfailed": "De befêstigingskoade koe net stjoerd wurde. Faaks stean der ferkearde tekens yn it e-postadres.\n\nBerjocht: $1", "confirmemail_invalid": "Dizze befêstiginskoade jildt net (mear).\nFaaks is de koade ferrûn.", + "confirmemail_needlogin": "Jo moatte $1 om jo e-mailadres befêstigje te kinnen.", "confirmemail_success": "Jo netpostadres is befêstige. Jo kinne jo no oanmelde en de wiki brûke.", "confirmemail_loggedin": "Jo netpostadres is no befêstige.", "confirmemail_subject": "Netpost-befêstigingskoade foar {{SITENAME}}", @@ -1874,6 +1884,10 @@ "htmlform-cloner-delete": "Fuortsmite", "revdelete-restricted": "hat beheinings oplein oan behearders", "revdelete-unrestricted": "hat beheinings foar behearders goedmakke", + "logentry-newusers-create": "It meidochakkount $1 is {{GENDER:$2|oanmakke}}", + "logentry-newusers-autocreate": "It meidochakkount $1 is automatysk {{GENDER:$2|oanmakke}}", + "logentry-upload-upload": "$1 hat $3 {{GENDER:$2|opladen}}", + "logentry-upload-overwrite": "$1 hat in nije ferzje fan $3 {{GENDER:$2|opladen}}", "rightsnone": "(gjin)", "feedback-back": "Foarige", "feedback-cancel": "Annulearje", diff --git a/languages/i18n/gcr.json b/languages/i18n/gcr.json index 5bdfdab7b8..c033735e56 100644 --- a/languages/i18n/gcr.json +++ b/languages/i18n/gcr.json @@ -412,7 +412,7 @@ "userlogin-noaccount": "Zòt pa gen roun kont ?", "userlogin-joinproject": "Roujwenn {{SITENAME}}", "createaccount": "Kréyé roun kont", - "userlogin-resetpassword-link": "Zòt bliyé zòt mo di pas ?", + "userlogin-resetpassword-link": "Zòt bliyé zòt modipas ?", "userlogin-helplink2": "Lèd pou konnègté so kò", "userlogin-loggedin": "Zòt déja konnègté an tan ki $1.\nItilizé fòrmilèr-a ki anba pou konnègté zòt kò ké rounòt kont itilizatò.", "userlogin-reauth": "Zòt divèt roukonèkté zòt kò pou vérifyé ki zòt sa {{GENDER:$1|$1}}.", @@ -461,7 +461,7 @@ "password-name-match": "Zòt mo di pas divèt fika diféran di zòt non d'itilizatò.", "password-login-forbidden": "Litilizasyon-an di sa non d'itilizatò oben di sa modipas sa entèrdi.", "mailmypassword": "Réynisyalizé modipas-a", - "passwordremindertitle": "Nouvèl mo di pas tanporèr pou {{SITENAME}}", + "passwordremindertitle": "Nouvèl modipas tanporèr pou {{SITENAME}}", "passwordremindertext": "Tchèk moun (dipi adrès IP-a $1) doumandé roun modipas nòv pou {{SITENAME}} ($4). Oun modipas tanporèr pou itilizatò-a\n« $2 » té kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konnègté zòt kò é chwézi roun modipas nòv.\nZòt modipas tanporèr ké èspiré annan $5 jou{{PLURAL:}}.\n\nSi zòt pa lotò di sa doumann, oben si zòt ka souvni zòt kò atchwèlman di zòt modipas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen modipas.", "noemail": "Pyès adrès di kourilèt fika anréjistré pou itilizatò-a « $1 ».", "noemailcreate": "Zòt divèt fourni roun adrès di kourilèt valid", @@ -499,20 +499,20 @@ "changepassword": "Chanjé di modipas", "resetpass_announce": "Pou tèrminé zòt enskripsyon, zòt divèt fourni roun mo di pas nòv.", "resetpass_text": "", - "resetpass_header": "Chanjé mo di pas di kont", + "resetpass_header": "Chanjé modipas-a di kont", "oldpassword": "Ansyen modipas :", "newpassword": "Nouvèl modipas :", "retypenew": "Konfirmen modipas nòv-a :", "resetpass_submit": "Chanjé modipas-a é konnègté so kò.", "changepassword-success": "Zòt modipas modifyé !", "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.", - "botpasswords": "Mo di pas di robo", + "botpasswords": "Modipas di robo", "botpasswords-summary": "Modipas-ya di robo ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò-ya ki disponnib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.", - "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.", + "botpasswords-disabled": "Modipas-ya di robo dézagtivé.", "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.", - "botpasswords-existing": "Mo di pas di robo ègzistan", + "botpasswords-existing": "Modipas di robo ki ka ègzisté", "botpasswords-createnew": "Kréyé roun mo di pas nòv di robo", - "botpasswords-editexisting": "Modifyé roun mo di pas di robo ègzistan", + "botpasswords-editexisting": "Modifyé roun modipas di robo ki ka ègzisté", "botpasswords-label-needsreset": "(Modipas-a divèt fika réynisyalizé)", "botpasswords-label-appid": "Non di robo :", "botpasswords-label-create": "Kréyé", @@ -526,9 +526,9 @@ "botpasswords-bad-appid": "Non-an di robo « $1 » pa valid.", "botpasswords-insert-failed": "Échèk di ajou-a di non di robo « $1 ». Ès i té ja ajouté ?", "botpasswords-update-failed": "Léchèk di mizajou di non di robo « $1 ». Ès i té ja siprimen ?", - "botpasswords-created-title": "Mo di pas di robo kréyé", + "botpasswords-created-title": "Modipas di robo kréyé", "botpasswords-created-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té kréyé.", - "botpasswords-updated-title": "Mo di pas di robo mizajou", + "botpasswords-updated-title": "Modipas di robo mizajou", "botpasswords-updated-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té mizajou.", "botpasswords-deleted-title": "Modipas di robo siprimen", "botpasswords-deleted-body": "Modipas-a pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té siprimen.", @@ -538,12 +538,12 @@ "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).", "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».", "botpasswords-needs-reset": "Modipas-a di robo di non « $2 » di itilizatò-a « $1 » divèt fika réynisyalizé.", - "resetpass_forbidden": "Mo di pas pa pouvé fika chanjé.", + "resetpass_forbidden": "Modipas-ya pa pouvé fika chanjé.", "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1", "resetpass-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.", "resetpass-submit-loggedin": "Chanjé di modipas", "resetpass-submit-cancel": "Annilé", - "resetpass-wrong-oldpass": "Mo di pas atchwèl oben tanporèr envalid.\nZòt pitèt ja chanjé zòt mo di pas oben doumandé roun mo di pas nòv tanporèr.", + "resetpass-wrong-oldpass": "Modipas atchwèl oben tanporèr envalid.\nZòt pitèt déja chanjé zòt modipas oben doumandé roun modipas nòv tanporèr.", "resetpass-recycled": "Souplé, modifyé zòt modipas ké ròt kichoz ki atchwèl-a.", "resetpass-temp-emailed": "Zòt konnègté ké roun kod tanporèr ki fourni pa kourilèt.\nPou tèrminen konnègsyon-an, zòt divèt fourni roun nouvèl modipas isi :", "resetpass-temp-password": "Modipas tanporèr :", @@ -556,7 +556,7 @@ "passwordreset-domain": "Domenn :", "passwordreset-email": "Adrès di kourilèt :", "passwordreset-emailtitle": "Détay di kont asou {{SITENAME}}", - "passwordreset-emailelement": "Non di itilizatò : \n$1\n\nMo di pas tanporèr : \n$2", + "passwordreset-emailelement": "Non di itilizatò : \n$1\n\nModipas tanporèr : \n$2", "passwordreset-nocaller": "Oun apélan divèt fika fourni", "passwordreset-nosuchcaller": "Apélan-an pa ka ègzisté : $1", "passwordreset-invalidemail": "Adrès di mésajri envalid", @@ -566,7 +566,7 @@ "changeemail-oldemail": "Adrès di kourilèt atchwèl :", "changeemail-newemail": "Nouvèl adrès di kourilèt :", "changeemail-none": "(pyès)", - "changeemail-password": "Zòt mo di pas asou {{SITENAME}} :", + "changeemail-password": "Zòt modipas asou {{SITENAME}} :", "changeemail-submit": "Chanjé adrès-a di kourilèt", "changeemail-throttled": "Zòt fè tròp tantativ di konnègsyon. \nSouplé, antann $1 anvan di réyéséyé.", "changeemail-nochange": "Souplé, sézi roun nouvèl adrès di kourilèt ki diféran di présédant-a.", @@ -721,7 +721,7 @@ "enhancedrc-history": "listorik", "recentchanges": "Modifikasyon résan", "recentchanges-legend": "Lòpsyon dé modifikasyon résan", - "recentchanges-summary": "Swiv chanjman-yan pli résan wiki asou sa paj.", + "recentchanges-summary": "Swiv chanjman-yan ki pli résan di wiki asou sa paj.", "recentchanges-noresult": "Pyès modifikasyon ka korèsponn à sa kritèr asou péryòd endiké.", "recentchanges-feed-description": "Swiv dannyé modifikasyon-yan di wiki annan sa fligs.", "recentchanges-label-newpage": "Sa modifikasyon té kréyé roun nouvèl paj", diff --git a/languages/i18n/gd.json b/languages/i18n/gd.json index 495fd47312..24ffad344c 100644 --- a/languages/i18n/gd.json +++ b/languages/i18n/gd.json @@ -1880,7 +1880,6 @@ "revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]", "revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]", "rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.", - "rollback-success-notify": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2. [$3 Seall na h-atharraichean]", "sessionfailure-title": "Trioblaid leis an t-seisean", "sessionfailure": "Tha duilgheadas ann leis an seisean logaidh a-steach agad a-rèir coltais;\nchaidh sgur dhen ghnìomh seo a chum dìon o session hijacking.\nTill dhan duilleag roimhpe, ath-luchdaich an duilleag ud 's feuch ris a-rithist an uairsin.", "logentry-contentmodel-change-revertlink": "till", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index 0cf2e459f2..5421c9a83e 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -2305,7 +2305,6 @@ "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]", "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.", - "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Amosar os cambios]", "sessionfailure-title": "Erro de sesión", "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPor favor, volva enviar o formulario.", "changecontentmodel": "Cambiar o modelo de contido dunha páxina", diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json index 5679c40bde..9ca872d4f7 100644 --- a/languages/i18n/gu.json +++ b/languages/i18n/gu.json @@ -596,7 +596,7 @@ "accmailtext": "[[User talk:$1|$1]] માટે રચેલ ગુપ્તસંજ્ઞા $2 ને મોકલાવી દેવાઇ છે. આ નવા ખાતાનીગુપ્તસંજ્ઞા પ્રવેશ કર્યા બાદ ''[[Special:ChangePassword|ગુપ્તસંજ્ઞા બદલો]]'' વાપરીને બદલી શકાશે.", "newarticle": "(નવીન)", "newarticletext": "તમે અસ્તિત્વ ન ધરાવતા પાનાંની કડી ખોલી છે.\nપાનું બનાવવા માટે, નીચેની જગ્યામાં લખવાનું શરૂ કરો (વધુ માહિતી માટે જુઓ [$1 મદદ પાનું]).\nજો તમે ભૂલથી અહીં આવી ગયા હોવ તો, તમારા બ્રાઉઝરનું પાછાં જાવ બટન ક્લિક કરી પાછાં જાવ.", - "anontalkpagetext": "----\nઆ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા [[Special:CreateAccount|create an account]] અથવા [[Special:UserLogin|log in]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.", + "anontalkpagetext": "----\nઆ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે, જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.\n\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\n\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે છે.\n\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા [[Special:CreateAccount|ખાતું ખોલો]] અથવા [[Special:UserLogin|પ્રવેશ કરો]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.", "noarticletext": "આ પાનામાં હાલમાં કોઇ લખાણ નથી.\nતમે બીજાં પાનાંમાં [[Special:Search/{{PAGENAME}}|આ પાનાંના શીર્ષક માટે શોધી શકો છો]], [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો],\nઅથવા [{{fullurl:{{FULLPAGENAME}}|action=edit}} આ પાનું બનાવી શકો છો].", "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.", "userpage-userdoesnotexist": "સભ્ય ખાતું \"$1\"ની નોંધણીનથી થઈ.\nશું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 8f8c6b994b..6f66416411 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -2296,7 +2296,6 @@ "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]", "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}}\nלעריכה האחרונה של {{GENDER:$4|$2}}.", - "rollback-success-notify": "שוחזר מעריכות של $1\nלעריכה האחרונה של $2. [$3 הצגת שינויים]", "sessionfailure-title": "בעיה בחיבור", "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לשלוח מחדש את הטופס.", "changecontentmodel": "שינוי מודל התוכן של דף", diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index cf7eb60cf2..17137afc72 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -96,7 +96,8 @@ "Tavleen", "Jayantanth", "Gopalindians", - "Prong$31" + "Prong$31", + "Eisheeta" ] }, "tog-underline": "कड़ी रेखांकित:", @@ -142,6 +143,7 @@ "tog-norollbackdiff": "सम्पादन वापस लेने के बाद अन्तर न दिखायें", "tog-useeditwarning": "जब मैं किसी सम्पादन पृष्ठ को बिना बदलावों को बिना सहेजे छोड़ूँ तो मुझे सूचित करें।", "tog-prefershttps": "सत्र आरम्भ करते समय सदैव सुरक्षित कनेक्शन का प्रयोग करें", + "tog-showrollbackconfirmation": "रोलबैक लिंक पर क्लिक करते समय एक पुष्टिकरण संकेत दिखाएं", "underline-always": "सदैव", "underline-never": "कभी नहीं", "underline-default": "त्वचा या प्राथमिक ब्राउज़र", @@ -531,6 +533,7 @@ "badretype": "आपने जो कूटशब्द दिये हैं वे एक दूसरे से नहीं मिलते। फिर से लिखें।", "usernameinprogress": "इस प्रयोक्ता का खाता निर्माण अभी चालू है।\nकृपया प्रतीक्षा करें।", "userexists": "आपका दिया सदस्यनाम पहले से प्रयोग में है।\nकृपया कोई अन्य सदस्यनाम चुनें।", + "createacct-normalization": "आपका उपयोगकर्ता नाम तकनीकी प्रतिबंधों के कारण \"$2\" में समायोजित किया जाएगा।", "loginerror": "लॉग इन त्रुटि", "createacct-error": "खाता निर्माण त्रुटि", "createaccounterror": "खाता नहीं बन पाया: $1", @@ -2353,7 +2356,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया", "revertpage-nouser": "(सदस्य नाम हटाया गया है) के संपादनों को हटाकर {{GENDER:$1|[[User:$1|$1]]}} के अन्तिम अवतरण को पूर्ववत किया।", "rollback-success": "{{GENDER:$3|$1}} के संपादन हटाए;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।", - "rollback-success-notify": "$1 के सम्पादन वापिस लौटाए;\n$2 द्वारा संपादित अंतिम संस्करण पुनर्स्थापित किया। [$3 बदलाव दिखाएँ]", "sessionfailure-title": "सत्र विफलता", "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया प्रपत्र दोबारा जमा करें।", "changecontentmodel": "पन्ने का सामग्री प्रारूप बदलें", @@ -3777,6 +3779,7 @@ "log-action-filter-suppress-reblock": "पुन: ब्लॉक द्वारा युजर अवरोध", "log-action-filter-upload-upload": "नया अपलोड", "log-action-filter-upload-overwrite": "फिर से अपलोड", + "log-action-filter-upload-revert": "पूर्ववत करें", "authmanager-authn-not-in-progress": "प्रमाणीकरण प्रगति में नहीं है या सत्र डेटा खो गया है। कृपया शुरुआत से फिर से शुरू करें", "authmanager-authn-no-primary": "आपूर्ति किए गए क्रेडेंशियल्स को प्रमाणित नहीं किया जा सका।", "authmanager-authn-no-local-user": "दिए गए क्रेडेंशियल इस विकी पर किसी भी उपयोगकर्ता से जुड़े नहीं हैं।", diff --git a/languages/i18n/hif-latn.json b/languages/i18n/hif-latn.json index 3590351106..6ccad2a746 100644 --- a/languages/i18n/hif-latn.json +++ b/languages/i18n/hif-latn.json @@ -2137,7 +2137,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.", "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.", - "rollback-success-notify": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadlao ke $2 ke aakhri version kar dewa gais hai.[$3 Show changes]", "sessionfailure-title": "Session fail hoe gais hae", "sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.", "changecontentmodel": "Panna ke content model ke badlo", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index c585e50c3a..238310800e 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -2111,7 +2111,6 @@ "revertpage": "uklonjena promjena {{GENDER:$2|suradnika|suradnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]), vraćeno na posljednju inačicu {{GENDER:$1|suradnika|suradnice}} [[User:$1|$1]]", "revertpage-nouser": "Vraćene izmjene suradnika (suradničko ime uklonjeno) na posljednju inačicu suradnika [[User:$1|$1]]", "rollback-success": "Uklonjeno uređivanje {{GENDER:$3|suradnika|suradnice}} $1; vraćeno na posljednju inačicu {{GENDER:$4|suradnika|suradnice}} $2.", - "rollback-success-notify": "Uklonili ste izmjene suradnika $1;\nvraćeno na posljednju izmjenu suradnika $2. [$3 Prikaži izmjene]", "sessionfailure-title": "Prekid sesije", "sessionfailure": "Izgleda da postoji problem s Vašom prijavom; ta radnja otkazana je kao način sprječavanja zlouporabe. Molimo ponovno pošaljite obrazac.", "changecontentmodel": "Promjena modela sadržaja stranice", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index 4915b7b9f6..929235c2cd 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -2298,7 +2298,6 @@ "revertpage": "Visszaállítottam a lap korábbi változatát [[Special:Contributions/$2|$2]] ([[User talk:$2|vita]]) szerkesztéséről [[User:$1|$1]] szerkesztésére", "revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére", "rollback-success": "{{GENDER:$3|$1}} szerkesztéseit visszaállítottam {{GENDER:$4|$2}} utolsó változatára.", - "rollback-success-notify": "$1 szerkesztései visszaállítva;\nhelyreállítva $2 utolsó változata. [$3 Változtatások megtekintése]", "sessionfailure-title": "Munkamenethiba", "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, küldd el újra az űrlapot.", "changecontentmodel": "A lap tartalommodelljének megváltoztatása", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index c1ca6592d3..f2739bebdc 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -2269,7 +2269,6 @@ "revertpage": "Reverteva modificationes per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) al ultime version per [[User:$1|$1]]", "revertpage-nouser": "Reverteva modificationes per un usator celate al ultime version per {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Revocava modificationes per {{GENDER:$3|$1}};\nretornava al version per {{GENDER:$4|$2}}.", - "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]", "sessionfailure-title": "Error de session", "sessionfailure": "Il pare haber un problema con tu session;\niste action ha essite cancellate como precaution contra le robamento de sessiones.\nPer favor, resubmitte le formulario.", "changecontentmodel": "Cambiar le modello de contento de un pagina", @@ -2401,7 +2400,7 @@ "contributions-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.", "negative-namespace-not-supported": "Le spatios de nomines con valores negative non es supportate.", "nocontribs": "Nulle modification correspondente a iste criterios ha essite trovate.", - "uctop": "ultime", + "uctop": "actual", "month": "A partir del mense (e anterior):", "year": "A partir del anno (e anterior):", "date": "A partir del data (e anterior):", diff --git a/languages/i18n/id.json b/languages/i18n/id.json index 7ad95e2cf6..33651e0f10 100644 --- a/languages/i18n/id.json +++ b/languages/i18n/id.json @@ -2331,7 +2331,6 @@ "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]", "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]", "rollback-success": "Pembatalan suntingan oleh {{GENDER:$3|$1}}; dibatalkan ke versi terakhir oleh {{GENDER:$4|$2}}.", - "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]", "sessionfailure-title": "Kegagalan sesi", "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan sebagai antisipasi untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.", "changecontentmodel": "Ubah model isi sebuah halaman", diff --git a/languages/i18n/ilo.json b/languages/i18n/ilo.json index fa3f46d9a8..e506555bd9 100644 --- a/languages/i18n/ilo.json +++ b/languages/i18n/ilo.json @@ -2179,7 +2179,6 @@ "revertpage": "Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli iti naudi a rebision babaen ni [[User:$1|$1]]", "revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a rebision babaen ni {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Naibabawi dagiti panagurnos babaen ni {{GENDER:$3|$1}};\nnaisubli manen ti naudi a rebision babaen ni {{GENDER:$4|$2}}.", - "rollback-success-notify": "Naibabawi dagiti panagurnos babaen ni $1;\nisubli ti naudi a rebision babaen ni $2. [$3 Ipakita dagiti binaliwan]", "sessionfailure-title": "Napaay ti sesion", "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nPangngaasi nga ited manen ti porma.", "changecontentmodel": "Baliwan ti modelo ti linaon ti panid", diff --git a/languages/i18n/inh.json b/languages/i18n/inh.json index 0c409a6557..301ba80293 100644 --- a/languages/i18n/inh.json +++ b/languages/i18n/inh.json @@ -78,9 +78,9 @@ "sat": "шоатта", "january": "АгIой ''(январь)''", "february": "Саь-кур ''(февраль)''", - "march": "Мутт-хьал ''(март)''", - "april": "Тушол ''(апрель)''", - "may_long": "Села ''(май)''", + "march": "Мутт-хьал", + "april": "Тушол", + "may_long": "села", "june": "Этинга ''(июнь)''", "july": "Баьцамеа", "august": "Мяцхали", @@ -90,9 +90,9 @@ "december": "Чан-тар", "january-gen": "АгIой ''(январь)'' бетта", "february-gen": "Саь-кур ''(февраль)'' бетта", - "march-gen": "Мутт-хьал ''(март)'' бетта", - "april-gen": "Тушол ''(апрель)'' бетта", - "may-gen": "Села ''(май)'' бетта", + "march-gen": "Мутт-хьал", + "april-gen": "Тушол", + "may-gen": "Села", "june-gen": "Этинга ''(июнь)'' бетта", "july-gen": "Баьцамеа", "august-gen": "Мяцхали", @@ -102,9 +102,9 @@ "december-gen": "Чан-тар", "jan": "АгIой ''(янв)''", "feb": "Саь-кур ''(фев)''", - "mar": "Мутт-хьал ''(мар)''", + "mar": "мутт-хьал", "apr": "Tушоли", - "may": "Села ''(май)''", + "may": "села", "jun": "Этинга ''(июн)''", "jul": "Баьцамеа", "aug": "Мяцхали", @@ -114,9 +114,9 @@ "dec": "Чан-тар", "january-date": "АгIой ''(Январь)'' $1", "february-date": "Саь-кур ''(февраль)'' $1", - "march-date": "Мутт-хьал ''(март)'' $1", - "april-date": "Тушол ''(апрель)'' $1", - "may-date": "Села ''(май)'' $1", + "march-date": "Мутт-хьал $1", + "april-date": "Тушол $1", + "may-date": "Села $1", "june-date": "Этинга ''(июнь)'' $1", "july-date": "Баьцамеа $1", "august-date": "Мяцхали $1", @@ -1229,7 +1229,7 @@ "namespacesall": "деррига", "monthsall": "деррига", "confirm-purge-title": "Укх оагIон кэш ӀоцIенъе", - "confirm_purge_button": "Мега", + "confirm_purge_button": "Мег", "confirm-purge-top": "Укх оагӀон кэш ӀоцIенъйой?", "confirm-purge-bottom": "Кэш ӀоцӀенъячул тӀехьагIа оагIон тӀехьара эрш хьахьокхаргья.", "imgmultipagenext": "тӀехьайоагӀа оагӀув →", diff --git a/languages/i18n/io.json b/languages/i18n/io.json index 70ed457a06..edeeb8a9a3 100644 --- a/languages/i18n/io.json +++ b/languages/i18n/io.json @@ -1686,6 +1686,7 @@ "ipblocklist-submit": "Serchar", "ipblocklist-otherblocks": "Altra {{PLURAL:$1|blokuso|blokusi}}", "infiniteblock": "nefinita", + "expiringblock": "finas ye $2 kloki, en $1", "emailblock": "e-posto blokusita", "blocklist-nousertalk": "ne povas redaktar lua propra diskuto-pagino", "blocklink": "blokusar", diff --git a/languages/i18n/is.json b/languages/i18n/is.json index 39d33358cf..d77ab4c240 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -2112,7 +2112,6 @@ "revertpage": "Tók aftur breytingar [[Special:Contributions/$2|$2]] ([[User talk:$2|spjall]]), breytt til síðustu útgáfu [[User:$1|$1]]", "revertpage-nouser": "Tók aftur breytingar falins notanda til síðustu útgáfu {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Tók til baka breytingar eftir {{GENDER:$3|$1}};\nsetti yfir á síðustu útgáfu eftir {{GENDER:$4|$2}}.", - "rollback-success-notify": "Tók aftur breytingar $1;\nbreytti í síðustu útgafu $2. [$3 Sýna breytingar]", "sessionfailure-title": "Mistök í setu", "sessionfailure": "Líklega er vandamál með innskráningarsetuna þína;\nhætt hefur verið við þessa aðgerð sem vörn gegn mögulegu samskiptaráni setunar.\nReyndu að senda upplýsingarnar aftur inn.", "changecontentmodel": "Breyta efnislíkani síðu", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 6eac855a1c..6dedc1e289 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -2337,7 +2337,6 @@ "revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]", "revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.", - "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]", "sessionfailure-title": "Sessione fallita", "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Invia nuovamente il modulo.", "changecontentmodel": "Modifica il modello di contenuto di una pagina", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index a3825a3453..f1ec639783 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -672,7 +672,7 @@ "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。", "changeemail-oldemail": "現在のメールアドレス:", "changeemail-newemail": "新しいメールアドレス:", - "changeemail-newemail-help": "あなたのメールアドレスを削除したい場合は、このフィールドを空白のままにする必要があります。あなたは忘れてしまったパスワードをリセットすることができず、また、電子メールアドレスが削除された場合は、このウィキからのメールを受信しません。", + "changeemail-newemail-help": "あなたのメールアドレスを削除したい場合は、このフィールドを空白のままにする必要があります。あなたは忘れてしまったパスワードをリセットすることができず、また、メールアドレスが削除された場合は、このウィキからのメールを受信しません。", "changeemail-none": "(なし)", "changeemail-password": "{{SITENAME}}のパスワード:", "changeemail-submit": "メールアドレスを変更", @@ -2369,7 +2369,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました", "revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました", "rollback-success": "{{GENDER:$3|$1}}による編集を差し戻しました。\n{{GENDER:$4|$2}}による直前の版へ変更されました。", - "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]", "sessionfailure-title": "セッションの失敗", "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\nフォームを再送信してください。", "changecontentmodel": "ページのコンテンツ・モデルの変更", @@ -3652,7 +3651,7 @@ "logentry-rights-autopromote": "$1 が $4 から $5 に自動的に{{GENDER:$2|昇格しました}}", "logentry-upload-upload": "$1 が $3 を {{GENDER:$2|アップロードしました}}", "logentry-upload-overwrite": "$1 が $3 の新しいバージョンを {{GENDER:$2|アップロードしました}}", - "logentry-upload-revert": "$1 が $3 を {{GENDER:$2|アップロードしました}}", + "logentry-upload-revert": "$1 が $3 を元の版に {{GENDER:$2|巻き戻しました}}", "log-name-managetags": "タグ管理記録", "log-description-managetags": "このページは[[Special:Tags|タグ]]に関係する管理タスクをリストアップしています。ログには管理者によって手動で実行された操作の記録しか記載されていません。ウィキ・ソフトウェアによって、ログを残さずにタグが作成・削除されている場合があります。", "logentry-managetags-create": "$1 がタグ「$4」を{{GENDER:$2|作成しました}}", diff --git a/languages/i18n/jv.json b/languages/i18n/jv.json index b33e3ef148..265bb3d672 100644 --- a/languages/i18n/jv.json +++ b/languages/i18n/jv.json @@ -189,9 +189,9 @@ "view": "Deleng", "view-foreign": "Deleng ing $1", "edit": "Besut", - "edit-local": "Besut andharan enggon-enggonan", + "edit-local": "Besut wedharan enggonan", "create": "Gawé", - "create-local": "Tambah panyadra enggon-enggonan", + "create-local": "Wuwuhi wedharan enggonan", "delete": "Busak", "undelete_short": "Wurung busak {{PLURAL:$1|sabesutan|$1 besutan}}", "viewdeleted_short": "Deleng {{PLURAL:$1|sabesutan kabusak|$1 besutan kabusak}}", diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json index 17906302b3..4bae0599a0 100644 --- a/languages/i18n/ka.json +++ b/languages/i18n/ka.json @@ -2222,7 +2222,6 @@ "revertpage": "[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია", "revertpage-nouser": "მომხმარებლის (მომხმარებლის სახელი დამალულია) ცვლილებები დაბრუნებულია ვერსიაზე {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "გაუქმდა რედაქტირება {{GENDER:$3|$1}}-ის მიერ;\nდაბრუნდა ვერსიაზე, რომელიც განახორციელა {{GENDER:$4|$2}}-მ.", - "rollback-success-notify": "გაუმქდა $1-ის მიერ განხორციელებული რედაქტირებები;\nდაბრუნდე ვერსიაზე, რომელიც განახორციელა $2-მ. [$3 ცვლილებების ნახვა]", "sessionfailure-title": "სეანსის შეცდომა", "sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.", "changecontentmodel": "გვერდის კონტენტური მოდელის შეცვლა", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index f6e8a3d420..ca465b773a 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -2327,7 +2327,6 @@ "revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림", "revertpage-nouser": "숨긴 사용자의 편집을 {{GENDER:$1|[[User:$1|$1]]}}의 마지막 판으로 되돌림", "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.", - "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]", "sessionfailure-title": "세션 실패", "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.", "changecontentmodel": "문서의 콘텐츠 모델을 변경", diff --git a/languages/i18n/ksh.json b/languages/i18n/ksh.json index a3792e8a49..da4f7ae9a6 100644 --- a/languages/i18n/ksh.json +++ b/languages/i18n/ksh.json @@ -1982,7 +1982,6 @@ "revertpage": "Änderunge vun däm Metmaacher „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|däm sing Klaafsigg]]) fottjeschmeße, un doför de lätzde Väsjohn vum „[[User:$1|$1]]“ widder zeröckjehollt", "revertpage-nouser": "Änderunge vun enem Metmaacher, däm singe Name vershtoche es, retuur jemaat op de letzte Version {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} [[User:$1|$1]]", "rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.", - "rollback-success-notify": "Änderonge {{GENDER:$1|vum|vum|vumm Metmaacher|vun dä|vum}} „$1“ sin zerök jenumme un di Sigg es op der Schtand vun doför {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} „$2“ jesaz. [$3 Belohr, wat derbeij veränndert wood]", "sessionfailure-title": "Fähler met dä Daate vum Enlogge", "sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.", "changecontentmodel": "Et Modäll vum Ennhald vun ene Sigg verändere", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index fd43962ae4..ec60a63581 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -991,7 +991,7 @@ "timezonelegend": "Zäitzon:", "localtime": "Lokalzäit:", "timezoneuseserverdefault": "De Standardwäert vun der Wiki ($1) benotzen", - "timezoneuseoffset": "Aner (Differenz uginn)", + "timezoneuseoffset": "Aner (Differenz hei drënner uginn)", "servertime": "Serverzäit:", "guesstimezone": "Vum Browser iwwerhuelen", "timezoneregion-africa": "Afrika", @@ -1189,9 +1189,9 @@ "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/JSON/JavaScript änneren", + "grant-editinterface": "De MediaWiki-Nummraum an de Benotzer CSS/JSON/JavaScript vum ganze wiki-Site änneren", "grant-editmycssjs": "Äre Benotzer CSS/JSON/JavaScript änneren", - "grant-editmyoptions": "Ännert Är Benotzerastellungen", + "grant-editmyoptions": "Ännert Är Benotzerastellungen an d'JSON-Konfiguratioun", "grant-editmywatchlist": "Ännert Är Iwwerwaachungslëscht", "grant-editpage": "Säiten déi et gëtt änneren", "grant-editprotected": "Gespaart Säiten änneren", @@ -1909,7 +1909,7 @@ "speciallogtitlelabel": "Zil (Titel oder {{ns:user}}:Benotzernumm fir e Benotzer):", "log": "Logbicher", "logeventslist-submit": "Weisen", - "logeventslist-more-filters": "Méi Filteren:", + "logeventslist-more-filters": "Méi Logbicher weisen:", "all-logs-page": "All ëffentlech Logbicher", "alllogstext": "Dëst ass eng kombinéiert Lëscht vu Logbicher op {{SITENAME}}.\nDir kënnt d'Siche limitéiere wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrot Säit (och case-senisitive) agitt.", "logempty": "Näischt fonnt.", @@ -2119,7 +2119,6 @@ "revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]", "revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.", - "rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]", "sessionfailure-title": "Setzungsfeeler", "sessionfailure": "Et schéngt e Problem mat Ärer Sessioun ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Sessioun piratéiert ka ginn.\nSchéckt de Formulaire w.e.g. nach eng Kéier.", "changecontentmodel": "De Modell vum Inhalt vun enger Säit änneren", @@ -2296,7 +2295,7 @@ "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedreet aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm", "ipb-hardblock": "Verhënneren datt ageloggt Benotzer vun dëser IP-Adress aus Ännerunge maache kënnen", "ipbcreateaccount": "Benotzerkont opmaachen", - "ipbemailban": "Verhënneren datt de Benotzer E-Maile verschéckt", + "ipbemailban": "E-Maile verschécken", "ipbenableautoblock": "Automatesch déi lescht IP-Adress spären déi vun dësem Benotzer benotzt gouf, an all IP-Adresse vun denen dëse Benotzer versicht Ännerunge virzehuelen", "ipbsubmit": "Dës IP-Adress resp dëse Benotzer spären", "ipbother": "Aner Dauer:", @@ -2750,7 +2749,7 @@ "previousdiff": "← Méi al Ännerung", "nextdiff": "Méi nei Ännerung →", "mediawarning": "Warnung: Dës Zort vu Fichier kann e béiswëllege Programmcode enthalen.\nDuerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.", - "imagemaxsize": "Maximal Gréisst fir Biller:
''(fir Billerbeschreiwungssäiten)''", + "imagemaxsize": "Maximal Gréisst fir Biller op Beschreiwungssäite fir Fichieren:", "thumbsize": "Gréisst vun der Miniatur:", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|Säit|Säiten}}", "file-info": "Fichiersgréisst: $1, MIME-Typ: $2", @@ -3174,7 +3173,7 @@ "logentry-rights-autopromote": "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert", "logentry-upload-upload": "$1 huet $3 {{GENDER:$2|eropgelueden}}", "logentry-upload-overwrite": "$1 huet eng nei Versioun vu(n) $3 {{GENDER:$2|eropgelueden}}", - "logentry-upload-revert": "$1 huet $3 {{GENDER:$2|eropgelueden}}", + "logentry-upload-revert": "$1 huet $3 {{GENDER:$2|zréckgesat}} op eng al Versioun", "logentry-tag-update-add-revision": "$1 {{GENDER:$2|huet}} d'{{PLURAL:$7|Markéierung|Markéierunge(n)}} $6 op d'Versioun $4 vun der Säit $3 dobäigesat", "rightsnone": "(keen)", "rightslogentry-temporary-group": "$1 (temporär, bis $2)", diff --git a/languages/i18n/lfn.json b/languages/i18n/lfn.json index 699f8d307f..23246414e6 100644 --- a/languages/i18n/lfn.json +++ b/languages/i18n/lfn.json @@ -2192,7 +2192,6 @@ "revertpage": "Editas par [[Special:Contributions/$2|$2]] ([[User talk:$2|discute]]) ia es reversada a la revisa la plu resente par [[User:$1|$1]]", "revertpage-nouser": "Editas par un usor ascondeda ia es reversada a la revisa la plu resente par [[User:$1|$1]]", "rollback-success": "Editas par {{GENDER:$3|$1}} ia es reversada e cambiada a la revisa la plu resente par {{GENDER:$4|$2}}", - "rollback-success-notify": "Editas par $1 ia es reversada e cambiada a la revisa la plu resente par $2. [$3 Mostra cambias]", "sessionfailure-title": "Fali de sesion", "sessionfailure": "Lo pare ce tua sesion de autentici ave un problem; esta ata ia es canselada per proteje contra saisis de sesion. Reenvia la formulario, per favore.", "changecontentmodel": "Cambia model de contenida de un paje", diff --git a/languages/i18n/li.json b/languages/i18n/li.json index e17578888e..8475cbd575 100644 --- a/languages/i18n/li.json +++ b/languages/i18n/li.json @@ -2213,7 +2213,6 @@ "revertpage": "Wieziginge door [[Special:Contributions/$2|$2]] ([[User talk:$2|Euverlik]]) trukgedriejd tot de lètste versie door [[User:$1|$1]]", "revertpage-nouser": "Verangeringe door 'ne verstaoke gebroeker trökgedrejd nao de litste versie van {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Verangeringe door {{GENDER:$3|$1}} trökgedrejd;\nlitste versie van {{GENDER:$4|$2}} herstèld.", - "rollback-success-notify": "De verangeringe door $1 zint trökgedrejd;\nde litste versie van $2 is herstèld. [$3 Tuin verangeringe]", "sessionfailure-title": "Sessiefout", "sessionfailure": "'t Liek op det se e perbleem höbs mit dien aanmeldingssessie;\ndees hanjeling is aafgebraoke oet veurzörg taenge 'nen hack.\nVersjik estebleef 't formeleer.", "changecontentmodel": "Bewirk inhawdsmodel van pagina", diff --git a/languages/i18n/lij.json b/languages/i18n/lij.json index 0e198146fd..e68770baf5 100644 --- a/languages/i18n/lij.json +++ b/languages/i18n/lij.json @@ -2128,7 +2128,6 @@ "revertpage": "Annullou e modiffiche de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]]), riportâ a-a verscion precedente de [[User:$1|$1]]", "revertpage-nouser": "Annullou e modiffiche de un utente ascoso, riportâ a-a verscion precedente de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Annullou e modiffiche de {{GENDER:$3|$1}}; paggina riportâ a l'urtima verscion de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Annullou e modiffiche de $1;\npaggina riportâ a l'urtima revixon de $2. [$3 Mostra e modiffiche]", "sessionfailure-title": "Sescion fallia", "sessionfailure": "S'è veificou un problema inta sescion ch'a l'identiffica l'accesso; o scistema o no l'ha eseguio o comando impartio pe precauçion. Torna a-a paggina precedente co-o tasto 'Inderê' do to browser, recarega a paggina e riproeuva.", "changecontentmodel": "Cangia o modello de contegnuo de 'na paggina", diff --git a/languages/i18n/lrc.json b/languages/i18n/lrc.json index d27e71ffdc..7458dea35a 100644 --- a/languages/i18n/lrc.json +++ b/languages/i18n/lrc.json @@ -193,7 +193,7 @@ "toolbox": "ٱڤزارؽا", "imagepage": "ديئن بألگە جانیا", "mediawikipage": "ديئن بألگە پئيغوم", - "templatepage": "دیئن بٱلگٱ چۊٱ", + "templatepage": "دیئن بٱلگٱ چۊئٱ", "viewhelppage": "ديئن بألگە هومیاری", "categorypage": "ديئن بألگە دأسە بأنی", "viewtalkpage": "دیئن چأک چئنە یا", @@ -283,7 +283,7 @@ "nstab-project": "بٱلگٱ پرۉژٱ", "nstab-image": "جانؽا", "nstab-mediawiki": "پاٛغوم", - "nstab-template": "چۊٱ", + "nstab-template": "چۊئٱ", "nstab-help": "بألگە هومیاری", "nstab-category": "دٱسٱ", "mainpage-nstab": "سرآسونٱ", @@ -360,7 +360,7 @@ "filereadonlyerror": "نأبوٙە جانیا \"$1\" نە آلئشت کاری بأکیت سی یە کئ ئمایە جا \"$2\" ئیسئ ها د حال و بال حأنئن.\n\nدیڤوٙنداری کئ ڤئ نە قولف کئردە ها د حال و بال گوتە دیاری \"$3\" .", "invalidtitle-knownnamespace": "داسوٙن نادیار سی نوم جا \"$2\" و نیسئسە \"$3\"", "invalidtitle-unknownnamespace": "داسوٙن نادیار سی شومارە نادیار نوم جا \"$2\" و نیسئسە \"$3\"", - "exception-nologin": "هٱنی نیومایتٱ ڤامیٛن", + "exception-nologin": "هنی نۏمایتٱ ڤامیٛن", "exception-nologin-text": "لوطف بأکیت بیایت ڤامین سی یە کئ د ئی بألگە یا کونئشتکاری دأسرئسی داشتوٙییت.", "exception-nologin-text-manual": "لوطف بأکیت ڤئ $1 صئلا بئیتوٙ کئ د ئی بألگە یا کونئشتکاری دأسرئسی داشتوٙە.", "virus-badscanner": "سازڤارە گأن:ڤیروٙس نادیار:$1", @@ -389,7 +389,7 @@ "nav-login-createaccount": " ڤامین ئوٙمائن/راس کئردئن حئساڤ", "logout": "د ساموٙنە دئرئوٙمائن", "userlogout": "د ساموٙنە دئرئوٙمائن", - "notloggedin": "هٱنی نیومایتٱ ڤامیٛن", + "notloggedin": "هنی نۏمایتٱ ڤامیٛن", "userlogin-noaccount": "یاٛ هساو نارؽت؟", "userlogin-joinproject": "ٱندوم دؽارگٱ {{SITENAME}} بۊئؽت", "createaccount": "هساو دۏرس بٱکؽت", @@ -617,9 +617,9 @@ "semiprotectedpagewarning": "د ڤیر داشتوٙئیت: ئی بألگە سی یە کئ فأقأط کاریاریا ثأڤتئنام کئردە تونئسوٙئن دئش ڤیراشتکار بأکأن پأر و پیم بییە.\nآخئری پئھرئستنوٙمە دأئە بییە سی سأرچئشمە ھاری نئھا ئمایە بییە:", "cascadeprotectedwarning": "زئنار: ئی بألگە ڤئ دأس کاریاریایی کئ صئلا سأردیڤوٙنکاری دارن می توٙنە ڤیرایئشت کاری بوٙە سی یە کئ ئی بألگە ڤئ رأڤئشت تاف نئمایی پأر و پیم کاری بییە {{PLURAL:$1|بألگە|بألگە یا}}:", "titleprotectedwarning": "زئنار:ئی بألگە پأر و پیم بییە سی یە کئ [[Special:نومگە حوقوٙق کاریاری جأرغە|حوقوٙق ڤیجە]] بایأد ڤئنە رأڤأندیاری بأکأن.\nآخئری پئھرئستنوٙمە دأ بییە سی سأرچئشمە دأئن نئھا ئمایە بییە:", - "templatesused": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} Ú¤ کار گرتٱ بیٱ د اؽ بٱلگٱ:", - "templatesusedpreview": "{{PLURAL:$1| چۊٱ|چۊٱ یا}} Ú¤ کار گرتٱ بیٱ د پیش ساٛلٛ :", - "templatesusedsection": "{{PLURAL:$1|چوٙأ|چوٙأ یا}} ڤئ کار گئرئتە بییە د ئی بأرجا:", + "templatesused": "{{PLURAL:$1|چۊئٱ|چۊئٱ یا}} Ú¤ کار گرتٱ بیٱ د اؽ بٱلگٱ:", + "templatesusedpreview": "{{PLURAL:$1| چۊئٱ|چۊئٱ یا}} Ú¤ کار گرتٱ بیٱ د پیش ساٛلٛ :", + "templatesusedsection": "{{PLURAL:$1|چۊئٱ|چۊئٱ یا}} Ú¤ کار گرتٱ بیٱ د اؽ بٱلگٱ:", "template-protected": "(پٱر ۉ پیم بیٱ)", "template-semiprotected": "(نسم ۉ نیمٱ پٱر ۉ پیم بیٱ)", "hiddencategories": "اؽ بٱلگٱ یٱکؽ د ٱندومؽا Ù± {{PLURAL:$1|1 hidden category|$1 hidden categories}} :", @@ -1204,7 +1204,7 @@ "uploadbtn": "سوڤار کئردئن جانیا", "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد", "upload-tryagain": "کل کردن توضیحیا آلشت دئیه بیه جانیا", - "uploadnologin": "هٱنی نیومایتٱ ڤامیٛن", + "uploadnologin": "هنی نۏمایتٱ ڤامیٛن", "uploadnologintext": "لطفن $1 سی سوارکرد جانیایا.", "upload_directory_missing": "نشونگه سوارکرد ($1) وجود ناره و نبوئه دروسش بکی.", "upload_directory_read_only": "نشونگه سوارکرد($1) د لا سرور قاول نیسنن نئ.", @@ -1715,7 +1715,7 @@ "watchlistfor2": "سی $1 $2", "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت", "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.", - "watchnologin": "هٱنی نیومایتٱ ڤامیٛن", + "watchnologin": "هنی نۏمایتٱ ڤامیٛن", "addwatch": "ئضاف کئردئن د سئیل بأرگ", "addedwatchtext": "بألگە «[[:$1]]» د [[Special:Watchlist|سئیل بأرگ]] شوما ئضاف بی.\nآلئشتیا ئی بألگە د بألگە چأک چئنە ری ڤئ ریشت د نئھاتئر د ئیچئ نومگە کاری با.", "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.", @@ -2277,7 +2277,7 @@ "tooltip-ca-nstab-project": "ديئن بٱلگٱ پرۉژٱ", "tooltip-ca-nstab-image": "دیئن بٱلگٱ جانؽا", "tooltip-ca-nstab-mediawiki": "دیئن پاٛغوم سامونٱ", - "tooltip-ca-nstab-template": "ديئن چۊٱ", + "tooltip-ca-nstab-template": "ديئن چۊئٱ", "tooltip-ca-nstab-help": "ديئن بلگه هومیاری", "tooltip-ca-nstab-category": "دیئن بٱلگٱ دٱسٱ بٱنی", "tooltip-minoredit": "یٱ ناْ Ú¤ عونڤان هیردٱ ڤیرایش سٱبت کو", @@ -2345,7 +2345,7 @@ "pageinfo-recent-authors": "شمارٱ کولٛی نڤیسٱیا یٱکونٱ", "pageinfo-magic-words": "جادۊیی{{PLURAL:$1|کلٱمٱ|کلٱمٱیا}} ($1)", "pageinfo-hidden-categories": "$1{{PLURAL:$1|دٱسٱ|دٱسٱيا}} قایم بیٱ", - "pageinfo-templates": "{{PLURAL:$1|چۊٱ|چۊٱ یا}} Ú¤ کار گرتٱ بیٱ ($1)", + "pageinfo-templates": "{{PLURAL:$1|چۊئٱ|چۊئٱ یا}} Ú¤ کار گرتٱ بیٱ ($1)", "pageinfo-transclusions": "{{PLURAL:$1|بلگه|بلگه یا}} وه کار گرته بیه د ($1)", "pageinfo-toolboxlink": "دونسمٱنیٛا بٱلگٱ", "pageinfo-redirectsto": "واگردونی سی", diff --git a/languages/i18n/lt.json b/languages/i18n/lt.json index cec48e7a2c..210ba2dbc1 100644 --- a/languages/i18n/lt.json +++ b/languages/i18n/lt.json @@ -2192,7 +2192,6 @@ "revertpage": "Atmestas [[Special:Contributions/$2|$2]] ([[User talk:$2|Aptarimas]]) pakeitimas; sugrąžinta [[User:$1|$1]] versija", "revertpage-nouser": "Atversti pakeitimai paslėpto vartotojo, grąžino prieÅ¡ tai buvusią versiją {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Atmesti {{GENDER:$3|$1}} pakeitimai;\ngrąžinta prieÅ¡ tai buvusi {{GENDER:$4|$2}} versija.", - "rollback-success-notify": "Atmesti $1 pakeitimai;\ngrąžinta prieÅ¡ tai buvusi $2 versija. [$3 Rodyti skirtumus]", "sessionfailure-title": "Sesijos klaida", "sessionfailure": "Atrodo yra problemų su jÅ«sų prisijungimo sesija; Å¡is veiksmas buvo atÅ¡auktas kaip atsargumo priemonė prieÅ¡ sesijos vogimą.\nPraÅ¡ome iÅ¡ naujo pateikti formą.", "changecontentmodel": "Keisti puslapio turinio modelį", @@ -3208,7 +3207,7 @@ "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|iÅ¡trynė}} buvusį nukreipimą $3", "logentry-delete-restore": "$1 atkÅ«rė puslapį $3 ($4)", "logentry-delete-restore-nocount": "$1 {{GENDER:$2|atkÅ«rė}} puslapį $3", - "restore-count-revisions": "{{PLURAL:$1|1 versija|versijų: $1}}", + "restore-count-revisions": "{{PLURAL:$1|$1 versija|$1 versijos|$1 versijų}}", "restore-count-files": "{{PLURAL:$1|1 failas|$1 failai}}", "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4", diff --git a/languages/i18n/lv.json b/languages/i18n/lv.json index 44c9fefcd5..aac9a3d740 100644 --- a/languages/i18n/lv.json +++ b/languages/i18n/lv.json @@ -161,6 +161,8 @@ "index-category": "Indeksētās lapas", "noindex-category": "Neindeksētās lapas", "broken-file-category": "Lapas, kurās ir bojātas failu saites", + "categoryviewer-pagedlinks": "($1) ($2)", + "category-header-numerals": "$1–$2", "about": "Par", "article": "Raksts", "newwindow": "(atveras jaunā logā)", @@ -262,6 +264,9 @@ "versionrequired": "NepiecieÅ¡amā ''MediaWiki'' versija: $1.", "versionrequiredtext": "Lai lietotu Å¡o lapu, nepiecieÅ¡ama ''MediaWiki'' versija $1. Sk. [[Special:Version|versija]].", "ok": "Labi", + "pagetitle": "$1 — {{SITENAME}}", + "pagetitle-view-mainpage": "{{SITENAME}}", + "backlinksubtitle": "← $1", "retrievedfrom": "Saturs iegÅ«ts no \"$1\"", "youhavenewmessages": "Tev ir $1 (skatÄ«t $2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|Jums ir}} $1 no {{PLURAL:$3|cita dalÄ«bnieka|$3 dalÄ«bniekiem}} ($2).", @@ -293,6 +298,8 @@ "site-atom-feed": "$1 Atom padeve", "page-rss-feed": "\"$1\" RSS barotne", "page-atom-feed": "\"$1\" Atom barotne", + "feed-atom": "Atom", + "feed-rss": "RSS", "red-link-title": "$1 (lapa nepastāv)", "sort-descending": "Kārtot dilstošā secÄ«bā", "sort-ascending": "Kārtot augošā secÄ«bā", @@ -444,6 +451,7 @@ "createaccounterror": "Neizdevās izveidot kontu: $1", "nocookiesnew": "Lietotājvārds tika izveidots, bet tu neesi iegājis iekšā. {{SITENAME}} izmanto sÄ«kdatnes (cookies), lai lietotāji varētu tajā ieiet. Tavs pārlÅ«ks nepieņem tās. LÅ«dzu, atļauj to pieņemÅ¡anu un tad nāc iekšā ar savu lietotājvārdu un paroli.", "nocookieslogin": "{{SITENAME}} izmanto sÄ«kdatnes (cookies), lai lietotāji varētu ieiet tajā. Diemžēl tavs pārlÅ«ks tos nepieņem. LÅ«dzu, atļauj to pieņemÅ¡anu un mēģini vēlreiz.", + "nocookiesforlogin": "{{int:nocookieslogin}}", "noname": "Tu neesi norādÄ«jis derÄ«gu lietotāja vārdu.", "loginsuccesstitle": "PieteikÅ¡anās veiksmÄ«ga", "loginsuccess": "Tu esi ienācis {{grammar:lokatÄ«vs|{{SITENAME}}}} kā \"$1\".", @@ -491,6 +499,7 @@ "user-mail-no-body": "Mēģināja sÅ«tÄ«t e-pastu ar tukÅ¡u vai nepamatoti Ä«su pamata daļu.", "changepassword": "MainÄ«t paroli", "resetpass_announce": "Lai pabeigtu pieslēgÅ¡anos, tev ir jāuzstāda jauna parole.", + "resetpass_text": "", "resetpass_header": "MainÄ«t konta paroli", "oldpassword": "Vecā parole", "newpassword": "Jaunā parole", @@ -992,7 +1001,7 @@ "group-autoconfirmed": "Automātiski apstiprinātie dalÄ«bnieki", "group-bot": "Boti", "group-sysop": "Administratori", - "group-interface-admin": "Interfeisa administrators", + "group-interface-admin": "Interfeisa administratori", "group-bureaucrat": "Birokrāti", "group-suppress": "Cenzētāji", "group-all": "(visi)", @@ -1862,6 +1871,7 @@ "delete-toobig": "Å ai lapai ir liela izmaiņu hronoloÄ£ija, vairāk nekā $1 {{PLURAL:$1|versijas|versija|versijas}}.\nŠādu lapu dzēšana ir atslēgta, lai novērstu nejauÅ¡us traucējumus {{grammar:lokatÄ«vs|{{SITENAME}}}}.", "deleting-backlinks-warning": "'''BrÄ«dinājums:''' uz lapu, ko grasies izdzēst, ved [[Special:WhatLinksHere/{{FULLPAGENAME}}|saites no citām lapām]].", "rollback": "Novērst labojumus", + "rollback-confirmation-no": "Atcelt", "rollbacklink": "novērst", "rollbacklinkcount": "atcelt $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}", "rollbacklinkcount-morethan": "atcelt vairāk kā $1 {{PLURAL:$1|labojumus|labojumu|labojumus}}", diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json index 5eafe6b1ba..5e8ff1a3dd 100644 --- a/languages/i18n/mai.json +++ b/languages/i18n/mai.json @@ -2024,7 +2024,6 @@ "revertpage": "सम्पादन आपस कएल गेल [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) सँ अन्तिम संशोधन धरि एकरा द्वारा [[User:$1|$1]]।", "revertpage-nouser": "(प्रयोक्ताक नाम हटा देल गेल अछि) द्वारा केल गेल संपादनकेँ फेरसँ पुरान स्थितिमे आनि कऽ एकर पहिलुक [[User:$1|$1]] सँ बनल संस्करणकेँ फेरसँ ताजा संस्करण बनाऊ।", "rollback-success": "{{GENDER:$3|$1}} क संपादन हटाबी;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण क पुनर्स्थापित करू।", - "rollback-success-notify": "$1द्वारा पूर्ववत सम्पादन;\n$2द्वारा केल अन्तिम अवतरण पर वापस। [$3 परिवर्तन देखाबी]", "sessionfailure-title": "सत्र विफल भ गेल", "sessionfailure": "एहन लागैत अछि जे अहां के लागिन सत्र में कोनो त्रुटि अछि. सत्र अपहरण से बचाबय सं सावधानीक लेल अहां के अहि क्रियाकलाप क रद्द क देल गेल. अहां पाछां के पृष्ठ पर जौउ आ पृष्ठ के फेर सं लोड क दोबारा कोशिश करू.", "changecontentmodel": "पृष्ठ सामग्री मोडल परिवर्तन करी", diff --git a/languages/i18n/map-bms.json b/languages/i18n/map-bms.json index 66dc8ab232..873ac47e9f 100644 --- a/languages/i18n/map-bms.json +++ b/languages/i18n/map-bms.json @@ -1207,7 +1207,6 @@ "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring versi pungkasan sekang [[User:$1|$1]]", "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]", "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.", - "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]", "sessionfailure-title": "Sèsi gagal", "sessionfailure": "Ketone lagi ana masalah karo sesi log-e Rika;\nloge Rika wis dibatalna nggo nyegah pambajakan.\nMonggo mbalik ming kaca sedurunge, dibaleni gole muatna kaca (reload) lan jajal diunggahna maning.", "protectlogpage": "Log pangreksan", diff --git a/languages/i18n/min.json b/languages/i18n/min.json index e7b687709c..1f0dc81a54 100644 --- a/languages/i18n/min.json +++ b/languages/i18n/min.json @@ -817,12 +817,32 @@ "revdel-restore": "ganti tampilan", "pagehist": "Riwayaik laman", "deletedhist": "Riwayaik pangapuihan", + "revdelete-hide-current": "Gagal manyambunyian parubahan tanggal $2, $1: iko adolah parubahan paliang baru.\nParubahan ko indak dapek disambunyian.", + "revdelete-show-no-access": "Gagal manampilan parubahan tanggal $2, $1: parubahan ko alah ditandoi ''tabateh''.\nSanak indak punyo akses ka parubahan ko.", + "revdelete-modify-no-access": "Gagal maubah parubahan tanggal $2, $1: parubahan ko alah ditandoi ''tabateh''.\nSanak indak punyo akses ka parubahan ko.", + "revdelete-modify-missing": "Gagal maubah parubahan ID $1: parubahan ko indak ado di basis data!", + "revdelete-no-change": "Paringatan:Parubahan tanggal $2, $1 alah punyo aturan panyambunyian.", + "revdelete-concurrent-change": "Gagal maubah parubahan tanggal $2, $1: statusnyo mungkin alah diubah pangguno lain basamoan jo Sanak.\nCubo pareso catatan log.", + "revdelete-only-restricted": "Ado yang salah wakatu manyambunyian item tanggal $2, $1: Sanak indak dapek manyambunyiannyo dari panguruih tanpa mamiliah salah satu opsi panyambunyian lainnyo.", "revdelete-reason-dropdown": "*Alasan pangapuihan umum\n** Palanggaran hak cipta\n** Komentar atau informasi paribadi nan indak patuik\n** Namo pangguno nan indak patuik\n** Bapotensi mancemarkan namo baiak", "revdelete-otherreason": "Alasan lain/tambahan:", "revdelete-reasonotherlist": "Alasan lain", "revdelete-edit-reasonlist": "Alasan mangapuih laman", "revdelete-offender": "Pambuek reviri:", "suppressionlog": "Log pambanaman", + "suppressionlogtext": "Dibawah ko adolah daftar panghapuihan jo pamblokiran, tamasuak isi yang disambunyian dari panguruih.\nCaliak [[Special:BlockList|block list]] untuak daftar yang paliang baru.", + "mergehistory": "Riwayaik panggabuangan sajarah halaman", + "mergehistory-box": "Gabuang parubahan-parubahan dari duo halaman:", + "mergehistory-from": "Halaman sumber:", + "mergehistory-into": "Halaman tujuan:", + "mergehistory-go": "Tampilan suntiangan yang dapek digabuang", + "mergehistory-submit": "Gabuang revisi", + "mergehistory-empty": "Indak ado parubahan yang dapek digabuang.", + "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} dari $1 {{PLURAL:$3|was|were}} berhasil digabuangan ka [[:$2]].", + "mergehistory-fail": "Indak dapek digabuang, mohon pareso baliak halaman jo parameter waktu.", + "mergehistory-fail-invalid-source": "Halaman asal indak sah.", + "mergehistory-fail-invalid-dest": "Halaman tujuan indak sah.", + "mergehistory-fail-self-merge": "Halaman sumber jo tujuannyo samo.", "mergehistory-reason": "Alasan:", "mergelog": "Log panggabuangan", "revertmerge": "Batal gabuang", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 5cf002e86f..2d3e88b638 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -699,7 +699,7 @@ "continue-editing": "Оди на полето за уредување", "previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.", "session_fail_preview": "За жал, не можев да го обработам уредувањето поради загуба на седнички податоци.\n\nМожеби сте биле одјавени. Проверете дали сè уште сте најавени и обидете се повторно.\nАко проблемот продолжи да се јавува, [[Special:UserLogout|одјавете се]] и повторно најавете се, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.", - "session_fail_preview_html": "'''Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.", + "session_fail_preview_html": "Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.\n\n{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.\n\nАко ова е разумен обид за уредување, тогаш обидете се повторно.\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.", "token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''", "edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''", "editing": "Уредување на $1", @@ -2276,6 +2276,9 @@ "deleting-backlinks-warning": "Предупредување: До страницата што сакате да ја избришете водат [[Special:WhatLinksHere/{{FULLPAGENAME}}|други страници]] или пак се превметнуваат во неа.", "deleting-subpages-warning": "Предупредување: Страницата што сакате да ја избришете има [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|потстраница|$1 потстраници|51=преку 50 потстраници}}]].", "rollback": "Отповикај промени", + "rollback-confirmation-confirm": "Да {{PLURAL:$1|0=ги отповикам овие уредувања|отповикам едно уредување|отповикам $1 уредувања}}?", + "rollback-confirmation-yes": "Отповикај", + "rollback-confirmation-no": "Откажи", "rollbacklink": "отповикај", "rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}", "rollbacklinkcount-morethan": "отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}", @@ -2288,7 +2291,6 @@ "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]", "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};\nвратено на последната верзија на {{GENDER:$4|$2}}.", - "rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]", "sessionfailure-title": "Седницата не успеа", "sessionfailure": "Се јави проблем со најавната седница;\nова дејство е откажано за да се спречи нејзина кражба.\nПоднесете го образецот повторно.", "changecontentmodel": "Промена на содржинскиот модел на страница", @@ -2728,7 +2730,7 @@ "import-interwiki-templates": "Вклучи ги сите шаблони", "import-interwiki-submit": "Увези", "import-mapping-default": "Увези во стандардните места", - "import-mapping-namespace": "Увези во именскиот простор:", + "import-mapping-namespace": "Увези во именски простор:", "import-mapping-subpage": "Увези како потстраници на следнава страница:", "import-upload-filename": "Податотека:", "import-upload-username-prefix": "Меѓувики-претставка:", @@ -3100,6 +3102,7 @@ "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?", "confirm-rollback-button": "ОК", "confirm-rollback-top": "Да ги отповикам уредувањата на страницава?", + "confirm-rollback-bottom": "Ова дејство веднаш ќе ги отповика избраните промени на страницава.", "confirm-mcrrestore-title": "Поврати преработка", "confirm-mcrundo-title": "Откажи промена", "mcrundofailed": "Откажувањето не успеа", @@ -3341,11 +3344,11 @@ "tag-mw-contentmodelchange": "измена на содржинскиот модел", "tag-mw-contentmodelchange-description": "Уредувања што го [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel менуваат содржинскиот модел] на една страница", "tag-mw-new-redirect": "Ново пренасочување", - "tag-mw-new-redirect-description": "Уредувањата што направат ново пренасочување или да сменат страница во пренасочување", + "tag-mw-new-redirect-description": "Уредувања што направат ново пренасочување или да сменат страница во пренасочување", "tag-mw-removed-redirect": "Отстрането пренасочување", "tag-mw-removed-redirect-description": "Уредувања што менуваат постоечко пренасочување во непренасочување", "tag-mw-changed-redirect-target": "Сменета целната страница на пренасочувањето", - "tag-mw-changed-redirect-target-description": "Уредувања што ја менуваат целната страница на пренасочувањето", + "tag-mw-changed-redirect-target-description": "Уредувања што ја менуваат целната страница на пренасочување", "tag-mw-blank": "Испразнување", "tag-mw-blank-description": "Уредувања што испразнуваат страница", "tag-mw-replace": "Заменето", @@ -3376,7 +3379,7 @@ "tags-manage-no-permission": "Немате дозвола за раководење со ознаки за промени.", "tags-manage-blocked": "Не можете да раководите со ознаки за промени додека {{GENDER:$1|сте}} блокирани.", "tags-create-heading": "Создај нова ознака", - "tags-create-explanation": "Новосоздадните ознаки по основно ќе се стават на располагање за употреба од корисници и ботови.", + "tags-create-explanation": "Новосоздадените ознаки по основно ќе се стават на располагање за употреба од корисници и ботови.", "tags-create-tag-name": "Име на ознаката:", "tags-create-reason": "Причина:", "tags-create-submit": "Создај", @@ -3434,7 +3437,7 @@ "tags-edit-chosen-placeholder": "Одберете некои ознаки", "tags-edit-chosen-no-results": "Не пронајдов одговарачки ознаки", "tags-edit-reason": "Причина:", - "tags-edit-revision-submit": "Примени измени врз {{PLURAL:$1|преработкава|$1 преработки}}", + "tags-edit-revision-submit": "Примени измени врз {{PLURAL:$1|оваа преработка|$1 преработки}}", "tags-edit-logentry-submit": "Примени измени врз {{PLURAL:$1|овој дневнички запис|$1 дневнички записи}}", "tags-edit-success": "Измените се применети.", "tags-edit-failure": "Не можев да ги применам измените:\n$1", @@ -3775,7 +3778,7 @@ "log-action-filter-move-move": "Преместување без запис врз пренасочувања", "log-action-filter-move-move_redir": "Преместување со запис врз пренасочувања", "log-action-filter-newusers-create": "Создавање од анонимен корисник", - "log-action-filter-newusers-create2": "Создавање од анонимен корисник", + "log-action-filter-newusers-create2": "Создавање од регистриран корисник", "log-action-filter-newusers-autocreate": "Автоматско создавање", "log-action-filter-newusers-byemail": "Создавање со лозинка испратена по е-пошта", "log-action-filter-patrol-patrol": "Рачна патрола", @@ -3876,7 +3879,7 @@ "gotointerwiki": "Го напуштате {{SITENAME}}", "gotointerwiki-invalid": "Укажаниот наслов е неважечки.", "gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n'''[$1 Продолжете кон $1]'''", - "undelete-cantedit": "Не можете да ја вратите избришаната страница бидејќи уредувањето на страницава не ви е дозволено.", + "undelete-cantedit": "Не можете да ја вратите оваа страница бидејќи уредувањето на страницава не ви е дозволено.", "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете.", "pagedata-title": "Податоци за страницата", "pagedata-text": "Страницава дава посредник за податоци за страниците. Укажете го насловот на страницата во URL-то, користејќи ја синтаксата за потстраници.\n* Префрлањето на содржината се заснова на заглавието Прифати на вашиот клиент. Ова значи дека податоците за страницата ќе бидат ставени во форматот кој го претпочита вашиот клиент.", diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json index 62c417232f..75b69a0f4f 100644 --- a/languages/i18n/ml.json +++ b/languages/i18n/ml.json @@ -78,7 +78,8 @@ "tog-norollbackdiff": "റോൾബാക്കിനു ശേഷം വ്യത്യാസം കാണിക്കാതിരിക്കുക", "tog-useeditwarning": "സേവ് ചെയ്യാത്ത മാറ്റങ്ങളോടു കൂടിയ തിരുത്തൽ താളിൽ നിന്നും പോകുമ്പോൾ എന്നെ അറിയിക്കുക", "tog-prefershttps": "പ്രവേശിച്ചിരിക്കുമ്പോൾ എപ്പോഴും സുരക്ഷിതമായ കണൿഷൻ ഉപയോഗിക്കുക", - "underline-always": "എല്ലായ്പ്പോഴും", + "tog-showrollbackconfirmation": "തിരിച്ചാക്കാനുള്ള കണ്ണി ഞെക്കുമ്പോൾ, അത് സ്ഥിരീകരിക്കാനുള്ള ചോദ്യം പ്രദർശിപ്പിക്കുക", + "underline-always": "എല്ലായ്‌പ്പോഴും", "underline-never": "ഒരിക്കലും അരുത്", "underline-default": "ദൃശ്യരൂപത്തിൽ അഥവാ ബ്രൗസറിൽ സ്വതേയുള്ള സ്വഭാവം", "editfont-style": "തിരുത്തൽ മേഖലയിലെ ഫോണ്ടിന്റെ ശൈലി:", @@ -745,9 +746,9 @@ "content-model-text": "വെറും എഴുത്ത്", "content-model-javascript": "ജാവാസ്ക്രിപ്റ്റ്", "content-model-css": "സി.എസ്.എസ്.", - "content-json-empty-object": "ശൂന്യമായ വസ്തു", + "content-json-empty-object": "ശൂന്യമായ ഒബ്‌ജെക്റ്റ്", "content-json-empty-array": "അറേ ശൂന്യമാണ്", - "deprecated-self-close-category": "Pages using invalid self-closed HTML tags", + "deprecated-self-close-category": "അസാധുവായ സ്വയം-അടയ്ക്കൽ എച്ച്.റ്റി.എം.എൽ. റ്റാഗുകൾ ഉപയോഗിക്കുന്ന താളുകൾ", "duplicate-args-warning": "മുന്നറിയിപ്പ്: [[:$1]], [[:$2]] എന്നതിനെ വിളിക്കുമ്പോൾ \"$3\" എന്ന ചരത്തിന് ഒന്നിലധികം വിലകൾ നൽകിയിട്ടുണ്ട്. നൽകിയ വിലകളിൽ അവസാനത്തേതുമാത്രം ഉപയോഗിക്കുന്നതാണ്.", "duplicate-args-category": "ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ ആവർത്തിച്ചുപയോഗിക്കുന്ന താളുകൾ", "duplicate-args-category-desc": "താളിൽ ഫലകങ്ങൾ വിളിക്കുമ്പോൾ ചരങ്ങൾ അതായത് {{foo|bar=1|bar=2}} അല്ലെങ്കിൽ {{foo|bar|1=baz}} എന്ന രീതിയിൽ.", @@ -1400,7 +1401,7 @@ "rcfilters-filter-humans-description": "മനുഷ്യലേഖകർ ചെയ്ത തിരുത്തുകൾ", "rcfilters-filtergroup-reviewstatus": "സംശോധന സ്ഥിതി", "rcfilters-filter-reviewstatus-unpatrolled-label": "റോന്ത് ചുറ്റപ്പെടാത്തവ", - "rcfilters-filter-reviewstatus-auto-label": "സ്വതേ റോന്തുചുറ്റുന്നവർ", + "rcfilters-filter-reviewstatus-auto-label": "സ്വതേ റോന്തുചുറ്റിയവ", "rcfilters-filtergroup-significance": "പ്രാധാന്യം", "rcfilters-filter-minor-label": "ചെറുതിരുത്തുകൾ", "rcfilters-filter-minor-description": "ലേഖകൻ ചെറുതെന്ന് അടയാളപ്പെടുത്തിയ തിരുത്തുകൾ.", @@ -1682,10 +1683,12 @@ "uploadstash-errclear": "പ്രമാണങ്ങൾ ശൂന്യമാക്കൽ പരാജയപ്പെട്ടു.", "uploadstash-refresh": "പ്രമാണങ്ങളുടെ പട്ടിക പുതുക്കുക", "uploadstash-thumbnail": "ലഘുചിത്രം കാണുക", + "uploadstash-bad-path-invalid": "പാത്ത് അസാധുവാണ്.", "uploadstash-bad-path-unknown-type": "അപരിചിതമായ തരം \"$1\".", "uploadstash-file-not-found-no-thumb": "ലഘുചിത്രം സംഘടിപ്പിക്കാൻ കഴിഞ്ഞില്ല.", "uploadstash-file-not-found-no-remote-thumb": "ലഘുചിത്രം എടുക്കൽ പരാജയപ്പെട്ടു: $1\nയു.ആർ.എൽ.= $2", "uploadstash-no-extension": "എക്സ്റ്റെൻഷൻ ശൂന്യമാണ്.", + "uploadstash-zero-length": "പ്രമാണത്തിന്റെ നീളം ശൂന്യമാണ്.", "img-auth-accessdenied": "പ്രവേശനമില്ല", "img-auth-nopathinfo": "പാത്ത് വിവരങ്ങൾ ലഭ്യമല്ല.\nതാങ്കളുടെ സെർവർ REQUEST_URI ഒപ്പം/അല്ലെങ്കിൽ PATH_INFO കൈമാറ്റം ചെയ്യാൻ കഴിയുന്നതായി സജ്ജീകരിച്ചിരിക്കേണ്ടതുണ്ട്.\nഅങ്ങനെ ചെയ്തിട്ടുണ്ടെങ്കിൽ $wgUsePathInfo സജ്ജമാക്കുക.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization കാണുക.", "img-auth-notindir": "ആവശ്യപ്പെട്ട പാത അപ്‌‌ലോഡ് ഡയറക്റ്ററിയിൽ സജ്ജീകരിച്ചു നൽകിയിട്ടില്ല.", @@ -1950,8 +1953,11 @@ "apisandbox-submit-invalid-fields-title": "ചില മണ്ഡലങ്ങൾ അസാധുവാണ്", "apisandbox-results": "ഫലങ്ങൾ", "apisandbox-request-url-label": "അഭ്യർത്ഥനാ യൂ.ആർ.എൽ.:", + "apisandbox-request-json-label": "ജെസൺ അപേക്ഷിക്കുക:", "apisandbox-request-time": "അഭ്യർത്ഥനയുടെ സമയം: {{PLURAL:$1|$1 മി.സെ.}}", "apisandbox-results-fixtoken": "ചീട്ട് ശരിയാക്കിയ ശേഷം വീണ്ടും സമർപ്പിക്കുക", + "apisandbox-results-fixtoken-fail": "\"$1\" ചീട്ട് എടുക്കുന്നത്‌ പരാജയപെട്ടു.", + "apisandbox-alert-page": "ഈ താളിലെ ഫീൽഡുകൾ അസാധുവാണ്.", "apisandbox-continue": "തുടരുക", "apisandbox-continue-clear": "ശൂന്യമാക്കുക", "apisandbox-multivalue-all-namespaces": "$1 (എല്ലാ നാമമേഖലകളും)", @@ -1962,6 +1968,9 @@ "booksources-search": "തിരയുക", "booksources-text": "പുതിയതും ഉപയോഗിച്ചതുമായ പുസ്തകങ്ങൾ വിൽക്കുന്ന സൈറ്റുകളിലേക്കുള്ള ലിങ്കുകളുടെ പട്ടിക ആണ്‌ താഴെ. താങ്കൾ തിരയുന്ന പുസ്തകത്തെ പറ്റിയുള്ള കൂടുതൽ വിവരങ്ങൾ ഈ പട്ടികയിൽ നിന്നു ലഭിച്ചേക്കാം:", "booksources-invalid-isbn": "തന്നിരിക്കുന്ന ഐ.എസ്.ബി.എൻ. സാധുവാണെന്നു തോന്നുന്നില്ല; യഥാർത്ഥ സ്രോതസ്സിൽ നിന്നും പകർത്തിയപ്പോൾ തെറ്റുപറ്റിയോ എന്നു പരിശോധിക്കുക", + "magiclink-tracking-rfc": "RFC മാജിക് കണ്ണികൾ ഉപയോഗിക്കുന്ന താളുകൾ", + "magiclink-tracking-pmid": "PMID മാജിക് കണ്ണികൾ ഉപയോഗിക്കുന്ന താളുകൾ", + "magiclink-tracking-isbn": "ISBN മാജിക് കണ്ണികൾ ഉപയോഗിക്കുന്ന താളുകൾ", "specialloguserlabel": "നടപ്പിലാക്കിയയാൾ:", "speciallogtitlelabel": "ലക്ഷ്യം (തലക്കെട്ട് അല്ലെങ്കിൽ ഉപയോക്താവിനെ തിരയാനുള്ള {{ns:user}}:ഉപയോക്തൃനാമം) :", "log": "പ്രവർത്തനരേഖകൾ", @@ -2182,7 +2191,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) നടത്തിയ തിരുത്തലുകൾ നീക്കം ചെയ്തിരിക്കുന്നു; നിലവിലുള്ള പതിപ്പ് [[User:$1|$1]] സൃഷ്ടിച്ചതാണ്", "revertpage-nouser": "മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് നടത്തിയ തിരുത്തലുകൾ {{GENDER:$1|[[User:$1|$1]]}} സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു", "rollback-success": "{{GENDER:$3|$1}} ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; {{GENDER:$4|$2}} ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.", - "rollback-success-notify": "$1 ചെയ്ത തിരുത്തുകൾ തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു. [$3 മാറ്റങ്ങൾ കാണിക്കുക]", "sessionfailure-title": "സെഷൻ പരാജയപ്പെട്ടിരിക്കുന്നു", "sessionfailure": "താങ്കളുടെ ലോഗിൻ സെഷനിൽ പ്രശ്നങ്ങളുള്ളതായി കാണുന്നു;\nസെഷൻ തട്ടിയെടുക്കൽ ഒഴിവാക്കാനുള്ള മുൻകരുതലായി ഈ പ്രവൃത്തി റദ്ദാക്കിയിരിക്കുന്നു.\nദയവായി ഫോം വീണ്ടും സമർപ്പിക്കുക.", "changecontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക", @@ -2369,6 +2377,7 @@ "ipb-confirm": "തടയൽ സ്ഥിരീകരിക്കുക", "ipb-sitewide": "സൈറ്റ്-വ്യാപകം", "ipb-partial": "ഭാഗികം", + "ipb-partial-help": "പ്രത്യേക താളുകൾ അല്ലെങ്കിൽ നാമമേഖലകൾ.", "ipb-pages-label": "താളുകൾ", "ipb-namespaces-label": "നാമമേഖലകൾ", "badipaddress": "അസാധുവായ ഐ.പി. വിലാസം.", @@ -3244,6 +3253,8 @@ "htmlform-date-invalid": "താങ്കൾ നൽകിയ വില തീയതിയായി കണക്കാക്കാനാകുന്നില്ല. വവവവ-മാമാ-തീതീ ഘടന ഉപയോഗിച്ചുനോക്കുക", "htmlform-time-invalid": "താങ്കൾ നൽകിയ വില സമയമായി കണക്കാക്കാനാകുന്നില്ല. മമ:മിമി:സെസെ ഘടന ഉപയോഗിച്ചുനോക്കുക", "htmlform-datetime-invalid": "താങ്കൾ നൽകിയ വില തീയതിയും സമയവുമായി കണക്കാക്കാനാകുന്നില്ല. വവവവ-മാമാ-തീതീ മമ:മിമി:സെസെ ഘടന ഉപയോഗിച്ചുനോക്കുക", + "htmlform-date-toohigh": "$1 എന്ന അനുവദനീയമായ തിയതിക്ക് ശേഷമുള്ളതാണ് താങ്കൾ കൊടുത്തിരിക്കുന്ന തീയതി.", + "htmlform-time-toolow": "$1 എന്ന അനുവദനീയമായ തിയതിക്ക് മുൻപുള്ള തീയതിയാണ് താങ്കൾ കൊടുത്തിരിക്കുന്നത്.", "htmlform-title-badnamespace": "[[:$1]] ഉള്ളത് \"{{ns:$2}}\" നാമമേഖലയിലല്ല.", "htmlform-title-not-creatable": "\"$1\" സൃഷ്ടിക്കാനാവുന്ന തലക്കെട്ടല്ല.", "htmlform-title-not-exists": "$1 നിലവിലില്ല.", @@ -3524,6 +3535,7 @@ "log-action-filter-suppress-delete": "താൾ ഒതുക്കൽ", "log-action-filter-upload-upload": "പുതിയ അപ്‌ലോഡ്", "log-action-filter-upload-overwrite": "പുനർ അപ്‌ലോഡ്", + "log-action-filter-upload-revert": "തിരിച്ചാക്കൽ", "authmanager-create-disabled": "അംഗത്വസൃഷ്ടി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.", "authmanager-create-from-login": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കാൻ, ദയവായി കളങ്ങൾ പൂരിപ്പിക്കുക.", "authmanager-create-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വസൃഷ്ടിയുടെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.", @@ -3543,7 +3555,11 @@ "authmanager-provider-password": "രഹസ്യവാക്ക്-അധിഷ്ഠിത സാധൂകരണം", "authmanager-provider-password-domain": "രഹസ്യവാക്ക്-ഡൊമൈൻ-അധിഷ്ഠിത സാധൂകരണം", "authmanager-provider-temporarypassword": "താത്കാലിക രഹസ്യവാക്ക്", + "authprovider-confirmlink-success-line": "$1: വിജയകരമായി കണ്ണി ചേർത്തു.", "authprovider-resetpass-skip-label": "മറികടക്കുക", + "authform-newtoken": "ചീട്ട് കാണുന്നില്ല. $1", + "authform-notoken": "ചീട്ട് കാണുന്നില്ല", + "authform-wrongtoken": "തെറ്റായ ചീട്ട്", "specialpage-securitylevel-not-allowed-title": "അനുവദിച്ചിട്ടില്ല", "specialpage-securitylevel-not-allowed": "താങ്കളുടെ വ്യക്തിത്വം പരിശോധിക്കാൻ കഴിയാഞ്ഞതിനാൽ ഈ താൾ ഉപയോഗിക്കാൻ താങ്കളെ അനുവദിക്കാനാവില്ല.", "authpage-cannot-login": "പ്രവേശനം തുടങ്ങാൻ സാധിക്കുന്നില്ല.", @@ -3574,6 +3590,7 @@ "edit-error-long": "പിഴവുകൾ:\n\n$1", "revid": "നാൾപ്പതിപ്പ് $1", "pageid": "താൾ ഐ.à´¡à´¿. $1", + "interfaceadmin-info": "$1\n\nസൈറ്റ്‌വ്യാപക സി.എസ്.എസ്./ജെ.എസ്./ജെസൺ പ്രമാണങ്ങൾ തിരുത്താനുള്ള അവകാശം സമീപകാലത്ത് editinterface അവകാശത്തിൽനിന്നും വേർപെടുത്തിയതാണ്. ഈ പിഴവ് എന്തുകൊണ്ടാണ് പ്രദർശിക്കപ്പെടുന്നതെന്ന് താങ്കൾക്ക് മനസ്സിലാകുന്നില്ലെങ്കിൽ [[mw:MediaWiki_1.32/interface-admin]] കാണുക.", "rawhtml-notallowed": "<html> ടാഗുകൾ സാധാരണ താളുകൾക്ക്പുറത്ത് ഉപയോഗിക്കാനാകില്ല.", "gotointerwiki": "{{SITENAME}} സംരംഭത്തിൽ നിന്നും പോകുകയാണ്", "gotointerwiki-invalid": "നൽകിയിരിക്കുന്ന തലക്കെട്ട് അസാധുവാണ്.", @@ -3592,5 +3609,9 @@ "passwordpolicies-policy-passwordcannotmatchusername": "ഉപയോക്തൃനാമം തന്നെ രഹസ്യവാക്ക് ആകാൻ പാടില്ല", "passwordpolicies-policy-passwordcannotmatchblacklist": "രഹസ്യവാക്ക് കരിമ്പട്ടികയിൽ ഉള്ള രഹസ്യവാക്കുകൾക്ക് സമാനമാകരുത്", "passwordpolicies-policy-maximalpasswordlength": "രഹസ്യവാക്കിന് കുറഞ്ഞത് $1 {{PLURAL:$1|അക്ഷരം|അക്ഷരങ്ങൾ}} നീളമുണ്ടാവണം", - "passwordpolicies-policy-passwordcannotbepopular": "രഹസ്യവാക്ക് {{PLURAL:$1|പ്രചുരപ്രചാരത്തിൽ ഉള്ളത്|പ്രചുരപ്രചാരത്തിലുള്ള $1 രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ ഉള്ളത്}} ആകരുത്." + "passwordpolicies-policy-passwordcannotbepopular": "രഹസ്യവാക്ക് {{PLURAL:$1|പ്രചുരപ്രചാരത്തിൽ ഉള്ളത്|പ്രചുരപ്രചാരത്തിലുള്ള $1 രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ ഉള്ളത്}} ആകരുത്.", + "passwordpolicies-policy-passwordnotinlargeblacklist": "രഹസ്യവാക്ക്, പരക്കെ ഉപയോഗിക്കപ്പെടുന്ന 1,00,000 രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ ഉള്ളതാവരുത്.", + "passwordpolicies-policyflag-forcechange": "ലോഗിൻ മാറ്റിയിരിക്കണം", + "passwordpolicies-policyflag-suggestchangeonlogin": "ലോഗിൻ മാറ്റാൻ നിർദ്ദേശിക്കുന്നു", + "unprotected-js": "സുരക്ഷാകാരണങ്ങളാൽ സംരക്ഷണമില്ലാത്ത താളുകളിൽ നിന്നും ജാവാസ്ക്രിപ്റ്റ് എടുത്തുപയോഗിക്കാൻ കഴിയില്ല. ജാവാസ്ക്രിപ്റ്റ് താളുകൾ മീഡിയവിക്കി: നാമമേഖലയിലോ ഉപയോക്തൃ ഉപതാളായോ മാത്രം സൃഷ്ടിക്കുക" } diff --git a/languages/i18n/nap.json b/languages/i18n/nap.json index 93402f30fd..8a393a9a16 100644 --- a/languages/i18n/nap.json +++ b/languages/i18n/nap.json @@ -2166,7 +2166,6 @@ "revertpage": "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e [[User:$1|$1]]", "revertpage-nouser": "Annullate 'e cagnamiente 'e n'utente annascunnuto, è stata ripigliata ll'urdema verzione 'e {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Cagnamiente annullate 'a {{GENDER:$3|$1}};\ns'è turnato arreto a l'urdema verzione 'e {{GENDER:$4|$2}}.", - "rollback-success-notify": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2. [$3 Fà vedé 'e cagnamiente]", "sessionfailure-title": "Sessione fallita", "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.", "changecontentmodel": "Cagna 'o mudello 'e cuntenute 'e na paggena", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index bf7c76adc0..e0afd43de9 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -99,6 +99,7 @@ "tog-norollbackdiff": "Ikke vis diff etter tilbakestilling", "tog-useeditwarning": "Si ifra dersom jeg forlater en side uten Ã¥ lagre den.", "tog-prefershttps": "Bruk alltid en trygg forbindelse nÃ¥r du er innlogget", + "tog-showrollbackconfirmation": "Be om bekreftelse nÃ¥r man klikker pÃ¥ en tilbakestillingslenke", "underline-always": "Alltid", "underline-never": "Aldri", "underline-default": "Drakta eller nettleserens standardinnstillinger", @@ -484,6 +485,7 @@ "badretype": "Passordene samsvarte ikke.", "usernameinprogress": "Opprettelsesprosessen for dette brukernavnet er igang.\nVennligst vent.", "userexists": "Brukernavnet er allerede i bruk.\nVelg et annet brukernavn.", + "createacct-normalization": "Brukernavnet ditt vil bli endret til «$2» pÃ¥ grunn av tekniske begrensninger.", "loginerror": "Innloggingsfeil", "createacct-error": "Feil med kontoppretting", "createaccounterror": "Kunne ikke opprette konto: $1", @@ -2306,7 +2308,6 @@ "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]", "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.", - "rollback-success-notify": "Tilbakestilte endringer av $1;\nendret tilbake til siste revisjon av $2. [$3 Vis endringer]", "sessionfailure-title": "Sesjonsfeil", "sessionfailure": "Det ser ut til Ã¥ være et problem med innloggingen din, og handlingen ble avbrutt av sikkerhetshensyn. Vennlgist prøv Ã¥ sende skjemaet en gang til.", "changecontentmodel": "Endre innholdsmodell for en side", @@ -2501,6 +2502,8 @@ "ipb-confirm": "Bekreft blokkering", "ipb-sitewide": "Hele nettstedet", "ipb-partial": "Delvis", + "ipb-sitewide-help": "Alle sider pÃ¥ wikien og alle andre bidragshandlinger.", + "ipb-partial-help": "Spesifikke sider eller navnerom.", "ipb-pages-label": "Sider", "ipb-namespaces-label": "Navnerom", "badipaddress": "Ugyldig IP-adresse.", @@ -3485,7 +3488,7 @@ "logentry-rights-autopromote": "$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5", "logentry-upload-upload": "$1 {{GENDER:$2|lastet opp}} $3", "logentry-upload-overwrite": "$1 {{GENDER:$2|lastet opp}} en ny versjon av $3", - "logentry-upload-revert": "$1 {{GENDER:$2|lastet opp}} $3", + "logentry-upload-revert": "$1 {{GENDER:$2|tilbakestilte}} $3 til en gammel versjon", "log-name-managetags": "Taggbehandlingslogg", "log-description-managetags": "Denne siden lister opp behandlingsoppgaver i forbindelse med [[Special:Tags|tagger]]. Loggen inneholder bare handlinger som er blitt gjort manuelt av en administrator; tagger kan opprettes eller slettes av programvaren uten at det kommer et oppslag i denne loggen.", "logentry-managetags-create": "$1 {{GENDER:$2|opprettet}} taggen «$4»", @@ -3721,6 +3724,7 @@ "log-action-filter-suppress-reblock": "Brukerundertrykking ved gjenblokkering", "log-action-filter-upload-upload": "Ny opplasting", "log-action-filter-upload-overwrite": "Gjenopplasting", + "log-action-filter-upload-revert": "Tilbakestilling", "authmanager-authn-not-in-progress": "Autentisering foregÃ¥r ikke eller sesjonsdata er tapt. Start igjen fra begynnelsen.", "authmanager-authn-no-primary": "De oppgitte akkreditivene kunne ikke autentiseres.", "authmanager-authn-no-local-user": "De oppgitte akkreditivene tilhører ingen bruker pÃ¥ denne wikien.", @@ -3821,6 +3825,8 @@ "passwordpolicies-policy-maximalpasswordlength": "Passordet kan maksimalt være pÃ¥ $1 {{PLURAL:$1|tegn}}", "passwordpolicies-policy-passwordcannotbepopular": "Passordet kan ikke være {{PLURAL:$1|det populære passordet|i lista over $1 populære passord}}", "passwordpolicies-policy-passwordnotinlargeblacklist": "Passord kan ikke være i listen over de vanligste 100 000 passordene.", + "passwordpolicies-policyflag-forcechange": "mÃ¥ endres ved innlogging", + "passwordpolicies-policyflag-suggestchangeonlogin": "foreslÃ¥ endring ved innlogging", "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert", "unprotected-js": "Av sikkerhetsÃ¥rsaker kan ikke JavaScript lastes fra ubeskyttede sider. Bare skap JavaScript i MediaWiki-navnerommet eller som en brukerunderside" } diff --git a/languages/i18n/nds-nl.json b/languages/i18n/nds-nl.json index 0af4704137..f1ec37d5dc 100644 --- a/languages/i18n/nds-nl.json +++ b/languages/i18n/nds-nl.json @@ -159,7 +159,7 @@ "and": " en", "faq": "Vragen die vake esteld wörden", "actions": "Haandeling", - "namespaces": "Naamruumtes", + "namespaces": "Naamrüümdes", "variants": "Variaanten", "navigation-heading": "Navigasiemenu", "errorpagetitle": "Foutmelding", @@ -1104,7 +1104,7 @@ "rcfilters-restore-default-filters": "Standardfilters weerummezetten", "rcfilters-clear-all-filters": "Alle filters vortdoon", "rcfilters-show-new-changes": "LÃ¥t nyste wysigingen seen", - "rcfilters-search-placeholder": "Filter wysigingen (gebruuk et menu of söök up filtername)", + "rcfilters-search-placeholder": "Filter wysigingen (gebrüük et menü of söök up filtername)", "rcfilters-filterlist-feedbacklink": "LÃ¥t uns weaten wat jy van disse (nye) filterhülpmiddels vinden", "rcfilters-highlightbutton-title": "ResultÃ¥ten markeren", "rcfilters-highlightmenu-title": "Kies n kleur", @@ -1840,7 +1840,7 @@ "undelete-error-long": "Fouten bie t herstellen van t bestaand:\n\n$1", "undelete-show-file-confirm": "Bi'j der wisse van da'j n vortedaone versie van t bestaand \"$1\" van $2 um $3 bekieken willen?", "undelete-show-file-submit": "Ja", - "namespace": "Naamruumte:", + "namespace": "Naamrüümde:", "invert": "Seleksie ummekeren", "tooltip-invert": "Vink dit vakjen an um wiezigingen an ziejen binnen de ekeuzen naamruumte te verbargen (en de biebeheurende naamruumte as dat an-evinkt is)", "namespace_association": "Naamruumte die hieran ekoppeld is", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index c2d7cc08da..befe0f4cf9 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -2347,7 +2347,6 @@ "revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]", "revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Wijzigingen door {{GENDER:$3|$1}} ongedaan gemaakt;\nlaatste versie van {{GENDER:$4|$2}} hersteld.", - "rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]", "sessionfailure-title": "Sessiefout", "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nProbeer het formulier opnieuw te versturen.", "changecontentmodel": "Inhoudsmodel van pagina bewerken", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index 0dc303ae23..1749737322 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -2355,7 +2355,6 @@ "revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].", "revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.", "rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.", - "rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]", "sessionfailure-title": "Błąd sesji", "sessionfailure": "Wydaje się, że wystąpił błąd z Twoją sesją zalogowania;\nto działanie zostało anulowane, aby uniknąć przechwycenia sesji.\nPrześlij formularz jeszcze raz.", "changecontentmodel": "Edycja modelu zawartości strony", @@ -3877,6 +3876,7 @@ "passwordpolicies-policy-passwordcannotbepopular": "Hasło nie może być {{PLURAL:$1|popularne|na liście $1 popularnych haseł}}", "passwordpolicies-policy-passwordnotinlargeblacklist": "Hasło nie może znajdować się na liście 100 000 najczęściej używanych haseł.", "passwordpolicies-policyflag-forcechange": "musi zmienić po zalogowaniu", + "passwordpolicies-policyflag-suggestchangeonlogin": "sugerowana zmiana po zalogowaniu", "easydeflate-invaliddeflate": "Dostarczona zawartość nie jest poprawnie skompresowana", "unprotected-js": "Ze względów bezpieczeństwa kod JavaScript nie może zostać załadowany z niezabezpieczonych stron. Prosimy dodawać JavaScript w przestrzeni MediaWiki lub jako podstronę strony użytkownika." } diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index 857cd834a0..933b98ac25 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -2349,7 +2349,7 @@ "enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.", "enotif_lastdiff": "Acesse $1 para ver esta alteração.", "enotif_anon_editor": "usuário anônimo $1", - "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio electrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE", + "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio eletrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE", "enotif_minoredit": "Esta é uma edição menor", "created": "criada", "changed": "alterada", @@ -2384,6 +2384,8 @@ "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|outras páginas]] ligam ou redirecionam para a página que você está prestes a eliminar.", "deleting-subpages-warning": "Aviso: A página que você está prestes a excluir tem [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|uma subpágina|$1 subpáginas|51=mais de 50 subpáginas}}]].", "rollback": "Reverter edições", + "rollback-confirmation-yes": "Reverter", + "rollback-confirmation-no": "Cancelar", "rollbacklink": "reverter", "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}", "rollbacklinkcount-morethan": "reverter mais de $1 {{PLURAL:$1|edição|edições}}", @@ -2396,7 +2398,6 @@ "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última versão por [[User:$1|$1]]", "revertpage-nouser": "Revertidas as edições de um usuário oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Edições revertidas por {{GENDER:$3|$1}};\nalterado para a última revisão por {{GENDER:$4|$2}}.", - "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]", "sessionfailure-title": "Erro de sessão", "sessionfailure": "Parece haver um problema com sua sessão de login;\nEsta ação foi cancelada como uma precaução contra o seqüestro de sessão.\nPor favor, reenvie o formulário.", "changecontentmodel": "Alterar o modelo de conteúdo de uma página", @@ -3219,6 +3220,7 @@ "confirm-unwatch-top": "Remover esta página das páginas vigiadas?", "confirm-rollback-button": "OK", "confirm-rollback-top": "Reverter edições nesta página?", + "confirm-rollback-bottom": "Essa ação reverterá instantaneamente as alterações selecionadas para esta página.", "confirm-mcrrestore-title": "Restaurar uma revisão", "confirm-mcrundo-title": "Desfazer uma mudança", "mcrundofailed": "A reversão falhou", diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json index 9c285d02e6..779d982c94 100644 --- a/languages/i18n/pt.json +++ b/languages/i18n/pt.json @@ -78,7 +78,8 @@ "MokaAkashiyaPT", "Athena in Wonderland", "Fitoschido", - "Ldacosta" + "Ldacosta", + "CaiusSPQR" ] }, "tog-underline": "Sublinhar hiperligações:", @@ -124,6 +125,7 @@ "tog-norollbackdiff": "Não mostrar diferenças depois de reverter edições em bloco", "tog-useeditwarning": "Avisar-me ao abandonar uma página editada sem gravar as alterações", "tog-prefershttps": "Usar sempre uma ligação segura enquanto tiver sessão iniciada", + "tog-showrollbackconfirmation": "Mostrar um pedido de confirmação ao clicar numa hiperligação de reversão", "underline-always": "Sempre", "underline-never": "Nunca", "underline-default": "Usar opção padrão do tema ou do navegador", @@ -2203,7 +2205,7 @@ "trackingcategories-summary": "Esta página lista as categorias de monitorização geradas automaticamente pelo software MediaWiki. Os nomes das categorias podem ser alterados modificando as mensagens de sistema relevantes no domínio {{ns:8}}.", "trackingcategories-msg": "Categoria monitorada", "trackingcategories-name": "Nome da mensagem", - "trackingcategories-desc": "Critérios de inclusão", + "trackingcategories-desc": "Critérios de inclusão de categoria", "restricted-displaytitle-ignored": "Páginas com títulos de apresentação ignorados", "restricted-displaytitle-ignored-desc": "Esta página tem um {{DISPLAYTITLE}} ignorado porque não é equivalente ao título verdadeiro da página.", "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica __NOINDEX__ e está num espaço nominal onde esta palavra mágica é permitida.", @@ -2345,7 +2347,6 @@ "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]", "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.", - "rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]", "sessionfailure-title": "Erro de sessão", "sessionfailure": "Foram detetados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a intercetação de sessões.\nReenvie o formulário, por favor.", "changecontentmodel": "Alterar modelo de conteúdo de uma página", @@ -2507,7 +2508,7 @@ "nolinkshere": "Não existem afluentes para $2 com as condições especificadas.", "nolinkshere-ns": "Não existem afluentes para $2 no espaço nominal selecionado.", "isredirect": "página de redirecionamento", - "istemplate": "inclusão", + "istemplate": "transclusão", "isimage": "hiperligação para ficheiro", "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}", "whatlinkshere-next": "{{PLURAL:$1|próximo|próximos $1}}", @@ -3836,6 +3837,7 @@ "passwordpolicies-policy-passwordcannotbepopular": "A palavra-passe não pode {{PLURAL:$1|ser a mais popular|estar na lista das $1 palavras-passe mais populares}}", "passwordpolicies-policy-passwordnotinlargeblacklist": "A palavra-passe não pode constar na lista das 100 000 palavras-passe usadas com mais frequência.", "passwordpolicies-policyflag-forcechange": "deve mudar ao iniciar sessão", + "passwordpolicies-policyflag-suggestchangeonlogin": "sugerir alteração ao iniciar sessão", "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido", "unprotected-js": "Por motivos de segurança o JavaScript de páginas desprotegidas não pode ser carregado. Crie javascript só no espaço nominal/domínio MediaWiki: ou numa subpágina do utilizador" } diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 54186b85e4..3438272be3 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -252,7 +252,8 @@ "tog-norollbackdiff": "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}\n{{Identical|Rollback}}", "tog-useeditwarning": "Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].", "tog-prefershttps": "Toggle option used in [[Special:Preferences]] that indicates if the user wants to use a secure connection when logged in", - "tog-showrollbackconfirmation": "Toggle option used in [[Special:Preferences]] to enable/disable rollback confirmation prompt. Should be visible only to users with rollback rights", + "tog-showrollbackconfirmation": "Toggle option used in [[Special:Preferences]] to enable/disable rollback confirmation prompt. Should be visible only to users with rollback rights.", + "tog-showrollbackconfirmation-prerelease-warning": "Notice for wikis where the option can be set before the feature is enabled.\n\nNote: This notice is temporary and will only appear before the rollback confirmation feature is released.", "underline-always": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"always underline links\", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-default}}.\n\n{{Gender}}\n{{Identical|Always}}", "underline-never": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"never underline links\", there are also options {{msg-mw|Underline-always}} and {{msg-mw|Underline-default}}.\n\n{{Gender}}\n{{Identical|Never}}", "underline-default": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"underline links as in your user skin or your browser\", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-always}}.\n\n{{Gender}}\n{{Identical|Browser default}}", @@ -483,9 +484,9 @@ "feed-invalid": "Result of check whether feed type is valid or not.", "feed-unavailable": "This message is displayed when a user tries to use an RSS or Atom feed on a wiki where such feeds have been disabled.", "site-rss-feed": "Used in the HTML header of a wiki's RSS feed.\nHTML markup cannot be used.\n\nParameters:\n* $1 - {{SITENAME}}\n{{Identical|S1 RSS/Atom feed}}", - "site-atom-feed": "Used in the HTML header of a wiki's Atom feed.\nHTML markup cannot be used.\n\nParameters:\n* $1 - {{SITENAME}}\n{{Identical|S1 RSS/Atom feed}}", + "site-atom-feed": "Used in the HTML header of a wiki's Atom feed. HTML markup cannot be used.\n\n\"Atom\" is a technology for automated updates. See [[w:en:Atom (standard)]].\n\nA \"feed\" refers to [[:w:en:Web feed|web feed]] - a technology that shows new information about a topic.\n\nParameters:\n* $1 - {{SITENAME}}\n{{Identical|S1 RSS/Atom feed}}", "page-rss-feed": "Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-atom-feed}}\n{{Identical|S1 RSS/Atom feed}}", - "page-atom-feed": "Used as the \"title\" attribute in the element of the HTML source of the page. Not rendered in the web page.\n\nParameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-rss-feed}}\n{{Identical|S1 RSS/Atom feed}}", + "page-atom-feed": "Used as the \"title\" attribute in the element of the HTML source of the page. Not rendered in the web page.\n\n\"Atom\" is a technology for automated updates. See [[w:en:Atom (standard)]].\n\nA \"feed\" refers to [[:w:en:Web feed|web feed]] - a technology that shows new information about a topic.\n\nParameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Page-rss-feed}}\n{{Identical|S1 RSS/Atom feed}}", "feed-atom": "{{optional}}\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}", "feed-rss": "{{optional}}\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}", "sitenotice": "{{Notranslate}}\n\nMediaWiki:Sitenotice is displayed above the page title for all users if it is defined, unless it is superseded by another notice. 'Defined' means it exists and has content other than the single character '-'.\n\nManual: [[mw:Manual:Interface/Sitenotice]]", @@ -1061,9 +1062,9 @@ "histlast": "This is part of the navigation message on the top and bottom of Page History pages which are lists of things in date order, e.g. [{{canonicalurl:Support|action=history}} Page History of Support].\n\nIt is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|Newest}}", "historysize": "Parameters:\n* $1 - byte count, for PLURAL support", "historyempty": "Text in page history for empty page revisions\n\n{{Identical|Empty}}", - "history-feed-title": "Used as title of the RSS/Atom feed for a page history. See [{{canonicalurl:Main_Page|feed=atom&action=history}} example].", - "history-feed-description": "Used as subtitle (description) of the RSS/Atom feed for a page history. See [{{canonicalurl:Main_Page|feed=atom&action=history}} example].", - "history-feed-item-nocomment": "Title for each revision when viewing the RSS/Atom feed for a page history.\n\nParameters:\n* $1 - username\n* $2 - date/time\n* $3 - (Optional) date\n* $4 - (Optional) time", + "history-feed-title": "Used as title of the RSS/Atom [[:w:en:web feed|feed]] for a page history. See [{{canonicalurl:Main_Page|feed=atom&action=history}} example].", + "history-feed-description": "Used as subtitle (description) of the RSS/Atom [[:w:en:web feed|feed]] for a page history. See [{{canonicalurl:Main_Page|feed=atom&action=history}} example].", + "history-feed-item-nocomment": "Title for each revision when viewing the RSS/Atom [[:w:en:web feed|feed]] for a page history.\n\nParameters:\n* $1 - username\n* $2 - date/time\n* $3 - (Optional) date\n* $4 - (Optional) time", "history-feed-empty": "Used as summary of the RSS/Atom feed for a page history when the feed is empty.\nSee [{{canonicalurl:x|feed=atom&action=history}} example].", "history-edit-tags": "Text of button used to access change tagging interface. For more information on tags see [[mw:Manual:Tags]].", "rev-deleted-comment": "Apparently this can also be about the reason of a log action, not only an edit summary. See also:\n*{{msg-mw|revdelete-hide-comment}}", @@ -1601,7 +1602,7 @@ "recentchanges-timeout": "Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when a query times out.", "recentchanges-network": "Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]] and [[Special:Watchlist]] when network error occurs.", "recentchanges-notargetpage": "Used in [[Special:RecentChangesLinked]] to explain why no results are shown when no target page is specified.", - "recentchanges-feed-description": "Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].", + "recentchanges-feed-description": "Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].\n\nA \"feed\" refers to [[:w:en:Web feed|web feed]] - a technology that shows new information about a topic.", "recentchanges-label-newpage": "# Used as tooltip for {{msg-mw|Newpageletter}}.\n# Also used as legend. Preceded by {{msg-mw|Newpageletter}} and followed by {{msg-mw|Recentchanges-legend-newpage}}.", "recentchanges-label-minor": "# Used as tooltip for {{msg-mw|Minoreditletter}}\n# Also used as legend. Preceded by {{msg-mw|Minoreditletter}}", "recentchanges-label-bot": "# Used as tooltip for {{msg-mw|Boteditletter}}\n# Also used as legend. Preceded by {{msg-mw|Boteditletter}}", @@ -1793,7 +1794,7 @@ "rc-enhanced-hide": "See also:\n* {{msg-mw|Rc-enhanced-expand}}\n{{Identical|Hide details}}", "rc-old-title": "Text that shows the original title of a page, $1 is the original title text", "recentchangeslinked": "{{doc-special|RecentChangesLinked}}\nSee also:\n* {{msg-mw|Recentchangeslinked}}\n* {{msg-mw|Accesskey-t-recentchangeslinked}}\n* {{msg-mw|Tooltip-t-recentchangeslinked}}", - "recentchangeslinked-feed": "Used in the feed object.\n\nThis message follows the message {{msg-mw|Recentchangeslinked-title}}.", + "recentchangeslinked-feed": "Used in the [[:w:en:web feed|feed]] object.\n\nThis message follows the message {{msg-mw|Recentchangeslinked-title}}.", "recentchangeslinked-toolbox": "Used as link text, and also used as link text in the common toolbox.\n\nThese links point to [[Special:RecentChangesLinked]].", "recentchangeslinked-title": "Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like \"/Main Page\").\n\nRelated changes are all recent change to pages that are linked from ''this page''.\n\nThis message is followed by {{msg-mw|Recentchangeslinked-feed}}.\n\nParameters:\n* $1 - the name of the page for which related changes are shown", "recentchangeslinked-summary": "Summary of [[Special:RecentChangesLinked]]. \"Pages on your watchlist\" refers to pages that ''also'' appear on the user's watchlist.", @@ -2595,6 +2596,9 @@ "deleting-backlinks-warning": "A warning shown when a page that is being deleted has at least one link to it or is transcluded in at least one page.", "deleting-subpages-warning": "A warning shown when a page that is being deleted has at least one subpage. $1 is the number of subpages of the page. For any number of subpages over 50, $1 will be 51.\nSee also:\n* {{msg-mw|Deleting-backlinks-warning}}", "rollback": "{{Identical|Rollback}}", + "rollback-confirmation-confirm": "Prompt which asks the user to confirm that they want to really perform the rollback action after clicking on the rollback button.", + "rollback-confirmation-yes": "Button text to confirm that a rollback should be executed.", + "rollback-confirmation-no": "Button text to cancel a rollback instead of executing it.", "rollbacklink": "{{Doc-actionlink}}\nThis link text appears on the recent changes page to users who have the \"rollback\" right.\nThis message has a tooltip {{msg-mw|tooltip-rollback}}\n{{Identical|Rollback}}", "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of $wgShowRollbackEditCount (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}", "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits", @@ -2607,7 +2611,6 @@ "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}", "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from", "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). Parameters:\n* $1 - user whose changes have been reverted\n* $2 - user who produced version, which replaces reverted version\n* $3 - the first user's name, can be used for GENDER\n* $4 - the second user's name, can be used for GENDER\n{{Identical|Revert}}\n{{Identical|Rollback}}", - "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{related|rollback-success}}\n{{Format|jquerymsg}}", "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.", "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.", "changecontentmodel": "Title of the change content model special page", @@ -3223,7 +3226,7 @@ "tooltip-t-whatlinkshere": "Tooltip shown when hovering over the {{msg-mw|whatlinkshere}} message in the toolbox.\n\nSee also:\n* {{msg-mw|Whatlinkshere}}\n* {{msg-mw|Accesskey-t-whatlinkshere}}\n* {{msg-mw|Tooltip-t-whatlinkshere}}", "tooltip-t-recentchangeslinked": "Used as tooltip for the link {{msg-mw|Recentchangeslinked}}.\n\nSee also:\n* {{msg-mw|Recentchangeslinked}}\n* {{msg-mw|Accesskey-t-recentchangeslinked}}\n* {{msg-mw|Tooltip-t-recentchangeslinked}}", "tooltip-feed-rss": "Used as tooltip for RSS feed link.\n\nSee also:\n* {{msg-mw|Feed-rss}}\n* {{msg-mw|Accesskey-feed-rss}}\n* {{msg-mw|Tooltip-feed-rss}}", - "tooltip-feed-atom": "Used as tooltip for Atom feed link.\n\n\"Atom\" is a technology for automated updates. See [[w:en:Atom (standard)]].\n\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}", + "tooltip-feed-atom": "Used as tooltip for Atom feed link.\n\n\"Atom\" is a technology for automated updates. See [[w:en:Atom (standard)]].\n\nA \"feed\" refers to [[:w:en:Web feed|web feed]] - a technology that shows new information about a topic.\n\nSee also:\n* {{msg-mw|Feed-atom}}\n* {{msg-mw|Accesskey-feed-atom}}\n* {{msg-mw|Tooltip-feed-atom}}", "tooltip-t-contributions": "Tooltip shown when hovering over {{msg-mw|Contributions}} in the toolbox.\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Contributions}}\n* {{msg-mw|Accesskey-t-contributions}}\n* {{msg-mw|Tooltip-t-contributions}}", "tooltip-t-emailuser": "Tooltip shown when hovering over the {{msg-mw|Emailuser}} link in the toolbox (sidebar, below).\n\nParameters:\n* $1 - Name of the user\n\nSee also:\n* {{msg-mw|Emailuser}}\n* {{msg-mw|Accesskey-t-emailuser}}\n* {{msg-mw|Tooltip-t-emailuser}}", "tooltip-t-info": "Tooltip shown when hovering over the {{msg-mw|pageinfo-toolboxlink}} link in the toolbox (sidebar, below).", @@ -3532,6 +3535,7 @@ "confirm-unwatch-top": "Used as confirmation message.", "confirm-rollback-button": "Used as Submit button text.\n{{Identical|OK}}", "confirm-rollback-top": "Used as confirmation message.", + "confirm-rollback-bottom": "Used to describe the rollback action to the user.", "confirm-mcrrestore-title": "Title for the editless restore form.", "confirm-mcrundo-title": "Title for the editless undo form.", "mcrundofailed": "Title of the error page when an editless undo fails.", diff --git a/languages/i18n/ro.json b/languages/i18n/ro.json index 980836d80a..28bfd42a91 100644 --- a/languages/i18n/ro.json +++ b/languages/i18n/ro.json @@ -2302,7 +2302,6 @@ "revertpage": "Anularea modificărilor efectuate de către [[Special:Contributions/$2|$2]] ([[User talk:$2|discuție]]) și revenire la ultima versiune de către [[User:$1|$1]]", "revertpage-nouser": "Anularea modificărilor efectuate de un utilizator ascuns și revenirea la ultima modificare de către {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Modificările făcute de {{GENDER:$3|$1}} au fost anulate;\nam revenit la ultima versiune de {{GENDER:$4|$2}}.", - "rollback-success-notify": "S-a revenit asupra schimbărilor făcute de $1;\nam revenit la ultima versiune de $2. [$3 Arată schimbările]", "sessionfailure-title": "Eroare de sesiune", "sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva furtului sesiunii. Vă rugăm să trimiteți formularul din nou.", "changecontentmodel": "Modificare model de conținut al unei pagini", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index 927448b251..7c541ed094 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -2402,7 +2402,6 @@ "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]", "revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возвращена последняя версия {{GENDER:$4|$2}}.", - "rollback-success-notify": "Откачены правки $1; возвращена последняя версия $2. [$3 Показать изменения]", "sessionfailure-title": "Ошибка сеанса", "sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, переотправьте форму.", "changecontentmodel": "Редактирование контентной модели страницы", diff --git a/languages/i18n/sah.json b/languages/i18n/sah.json index 3680088555..03b66bb545 100644 --- a/languages/i18n/sah.json +++ b/languages/i18n/sah.json @@ -2211,7 +2211,6 @@ "revertpage": "([[User talk:$2|Ырытыы]]) көннөрүүлэрэ: [[Special:Contributions/$2|$2]] бу торумҥа: [[User:$1|$1]] төннөрүлүннүлэр", "revertpage-nouser": "Аата кистэммит киһи уларытыылара суох оҥоһуллан, ыстатыйа бу киһи барылыгар төннөрүлүннэ: {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "{{GENDER:$3|$1}} көннөрүүтэ сотулунна; {{GENDER:$4|$2}} барылыгар төннөрүлүннэ.", - "rollback-success-notify": "$1 уларытыылара сотулуннулар; \n$2 тиһэх торумугар төннөрүлүннэ. [$3 Уларытыыны көрдөр]", "sessionfailure-title": "Сиэссийэ алҕаһа", "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.", "changecontentmodel": "Сирэй ис тутулун киэбин уларытыы", diff --git a/languages/i18n/sgs.json b/languages/i18n/sgs.json index c24b7796d4..24f947211d 100644 --- a/languages/i18n/sgs.json +++ b/languages/i18n/sgs.json @@ -1320,7 +1320,6 @@ "editcomment": "Padėrbėma paāškėnėms bova: $1.", "revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]]) pakeitėms; sogrōžints atmains, katron padėrba nauduotuos [[User:$1|$1]]", "rollback-success": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains.", - "rollback-success-notify": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains. [$3 ruodÄ«tė keitėmus]", "sessionfailure-title": "Sesėjės klaida", "sessionfailure": "Atruod ka Ä«r biedÅ« so Tamstas prėsėjongėmo; tas vēksmos bova grōžints kāp atsargoma prėimonė nu sesėjės vuogėma.\nPraÅ¡oum mÄ«gtė „atgal“ ėr parkrautė poslapi ėš katruo atiejėt, ė pamieginkėt apent.", "changecontentmodel-title-label": "Poslapė pavadėnėms", diff --git a/languages/i18n/sh.json b/languages/i18n/sh.json index 82504bcdfb..a272171fbd 100644 --- a/languages/i18n/sh.json +++ b/languages/i18n/sh.json @@ -469,7 +469,7 @@ "nosuchusershort": "Ne postoji korisnik sa imenom \"$1\".\nProvjerite da li ste dobro ukucali.", "nouserspecified": "Morate izabrati korisničko ime.", "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dozvoljena.", - "wrongpassword": "Å ifra koju ste uneli je neodgovarajuće. Molimo, upiÅ¡ite je ponovo.\n\nШифра коју сте унели је неодговарајућа. Молимо, упишите је поново.", + "wrongpassword": "Uneli ste pogreÅ¡no korisničko ime ili lozinku.\nPokuÅ¡ajte ponovo.", "wrongpasswordempty": "Unesena lozinka je bila prazna.\nPokuÅ¡ajte ponovno.", "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.", "passwordtoolong": "Å ifre/lozinke/zaporke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.", @@ -646,7 +646,7 @@ "newarticle": "(Novi)", "newarticletext": "Preko linka ste doÅ¡li na stranicu koja joÅ¡ uvijek ne postoji.\n* Ako želite stvoriti stranicu, počnite tipkati u okviru dolje (v. [$1 stranicu za pomoć] za viÅ¡e informacija).\n* Ukoliko ste doÅ¡li greÅ¡kom, pritisnike dugme '''Nazad''' ('''back''') na vaÅ¡em pregledniku.", "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji joÅ¡ nije napravio račun ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti viÅ¡e korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:CreateAccount|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''", - "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] u drugim stranicama,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretraživati srodne registre],\nili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu].", + "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] u drugim stranicama,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretraživati srodne registre],\nili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu].", "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane registre]. alio nemate dozvolu za stvaranje ove stranice.", "missing-revision": "Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{FULLPAGENAME}}“.\n\nOvo se obično deÅ¡ava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViÅ¡e informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].", "userpage-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.", @@ -681,6 +681,7 @@ "yourtext": "VaÅ¡ tekst / Ваш текст", "storedversion": "UskladiÅ¡tena verzija", "editingold": "'''PAŽNJA: Vi mijenjate stariju reviziju ove stranice.\nAko je snimite, sve promjene učinjene od ove revizije će biti izgubljene.'''", + "unicode-support-fail": "VaÅ¡ preglednik ne podržava Unicode. On je neophodan za uređivanje stranica, pa zato neću moći sačuvati izmjenu.", "yourdiff": "Razlike / Разлике", "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaÅ¡e pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.
\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''", "copyrightwarning2": "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.
\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''", @@ -704,7 +705,7 @@ "permissionserrors": "Greška pri odobrenju", "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:", "permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:", - "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je model sadržaja $1, a trenutni model sadržaja stranice je $2.", + "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen sadržajni model $1, što se razlikuje od trenutnog sadržajnog modela stranice $2.", "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden registar brisanja i premještanja s obrazloženjem:", "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja, zaštite i premještanja stranice je prikazan ispod.", "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno izbrisana (u prošla 24 sata). \nNiže je navedena evidencija brisanja, zaštite i premještanja.", @@ -938,7 +939,7 @@ "search-category": "(kategorija $1)", "search-file-match": "(odgovara sadržaju datoteke)", "search-suggest": "Da li ste mislili: $1", - "search-rewritten": "Ishod iz $1. Umjesto toga pretraži $2.", + "search-rewritten": "Ishod iz $1. Ili potražite ga $2.", "search-interwiki-caption": "Ishod s bratskih projekata", "search-interwiki-default": "Rezultati od $1:", "search-interwiki-more": "(više)", @@ -1438,8 +1439,16 @@ "rcfilters-watchlist-edit-watchlist-button": "Uredi nadgledane", "rcfilters-watchlist-showupdated": "Promjene na stranicama koje niste posjetili otkako su se izmjene dogodile su podebljanim slovima.", "rcfilters-preference-label": "Koristi posrednik bez JavaScript-a", + "rcfilters-preference-help": "Učitavanje nedavnih promjena bez filterske pretrage ili mogućnosti isticanja.", "rcfilters-watchlist-preference-label": "Koristi posrednik bez JavaScript-a", + "rcfilters-watchlist-preference-help": "Učitavanje praćenih bez filterske pretrage ili mogućnosti isticanja.", + "rcfilters-filter-showlinkedfrom-label": "Prikaži promjene na stranicama sa kojih dolaze veze", + "rcfilters-filter-showlinkedfrom-option-label": "Stranice sa kojih dolaze veze do izabrane stranice", + "rcfilters-filter-showlinkedto-label": "Prikaži promjene na stranicama ka kojima vode veze", + "rcfilters-filter-showlinkedto-option-label": "Stranice ka kojima vode veze sa izabrane stranice", + "rcfilters-target-page-placeholder": "Unesite ime stranice (ili kategorije)", "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od $3, $4 (do $1 prikazano).", + "rclistfromreset": "Resetiraj izbor datuma", "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2", "rcshowhideminor": "$1 male izmjene / мале измене", "rcshowhideminor-show": "Pokaži", @@ -1691,7 +1700,7 @@ "uploadstash-zero-length": "Datoteka ima nultu dužinu.", "invalid-chunk-offset": "Nevaljana točka nastavka snimanja", "img-auth-accessdenied": "Pristup onemogućen", - "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", + "img-auth-nopathinfo": "Nedostaje informacija o putanji.\nVaš server mora biti namjesten da prosleđuje varijable REQUEST_URI i/ili PATH_INFO.\nAko je već namjesten, omogućite $wgUsePathInfo.\nPogl. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.", "img-auth-notindir": "Zahtjevana putanja nije u direktorijumu podešenom za postavljanje.", "img-auth-badtitle": "Ne mogu napraviti valjani naslov iz \"$1\".", "img-auth-nologinnWL": "Niste prijavljeni i \"$1\" nije na spisku dozvoljenih.", @@ -1753,7 +1762,7 @@ "filehist-comment": "Komentar", "imagelinks": "Upotreba datoteke", "linkstoimage": "{{PLURAL:$1|Sljedeća stranica koristi|Sljedećih $1 stranica koriste}} ovu datoteku:", - "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSlijedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.", + "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranica koristi|stranice koriste|stranica koristi}} ovu datoteku.\nSlijedeći popis prikazuje {{PLURAL:$1|prvu stranicu koja koristi|prve $1 stranice koje koriste|prvih $1 stranica koje koriste}} datoteku.\nPotpuni popis naći ćete [[Special:WhatLinksHere/$2|ovdje]].", "nolinkstoimage": "Nema stranica koje koriste ovu datoteku.", "morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|ostale linkove]] prema ovoj datoteci.", "linkstoimage-redirect": "$1 (preusmjerenje datoteke) $2", @@ -1869,6 +1878,7 @@ "uncategorizedcategories": "Nekategorisane kategorije / Некатегорисане категорије", "uncategorizedimages": "Slike bez kategorije", "uncategorizedtemplates": "Šabloni bez kategorije", + "uncategorized-categories-exceptionlist": " # Sadrži popis kategorija koje se ne smiju spominjati u Special:UncategorizedCategories. Jedna u svakoj novoj liniji što počinje s \"*\". Redovi koji počinju drugim znakom (uključujući prazna mjesta) bit će zanemareni. Koristite \"#\" za pribjeleške.", "unusedcategories": "Neiskorištene kategorije", "unusedimages": "Neiskorišćene slike / Неискоришћене слике", "wantedcategories": "Tražene kategorije", @@ -2079,7 +2089,7 @@ "emailccsubject": "Kopiranje Vaše poruke za $1: $2", "emailsent": "E-mail poruka poslata", "emailsenttext": "Vaša poruka je poslata e-poštom.", - "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.", + "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" na projektu {{SITENAME}}. Ako {{GENDER:$2|odgovorite}} na ovu e-poruku, {{GENDER:$2|Vaša}} će se poruka poslati pravo {{GENDER:$1|originalnom pošiljaocu|originalnoj pošiljatejici}} i otkrit ćete {{GENDER:$1|mu|joj}} {{GENDER:$2|svoju}} adresu.", "usermessage-summary": "Ostavljanje sistemske poruke.", "usermessage-editor": "Sistem za poruke", "watchlist": "Lista praćenja", @@ -2090,9 +2100,11 @@ "watchnologin": "Niste logovani / Нисте логовани", "addwatch": "Dodaj u popis praćenja", "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].", + "addedwatchtext-talk": "\"[[:$1]]\" i njena pridružena stranica dodane su na vaš [[Special:Watchlist|spisak praćenja]].", "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.", "removewatch": "Ukloni sa spiska praćenja", "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].", + "removedwatchtext-talk": "\"[[:$1]]\" i njena pridružena stranica uklonjene su s vašeg [[Special:Watchlist|spiska praćenja]].", "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.", "watch": "Prati", "watchthispage": "Prati ovu stranicu", @@ -2100,7 +2112,7 @@ "unwatchthispage": "Prestani pratiti", "notanarticle": "Nije stranica sadržaja", "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana", - "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.", + "watchlist-details": "Na vaših praćenih imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} (ne računajući stranice za razgovor).", "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.", "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''", "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su $1 najskorije izmjene|$1 najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih $2 sata|u posljednjih $2 sati}}, od $3, $4.", @@ -2181,7 +2193,6 @@ "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]", "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]", "rollback-success": "Vraćene su izmjene korisnika {{GENDER:$3|$1}};\nvraćeno na posljednju verziju koju je snimio {{GENDER:$4|$2}}.", - "rollback-success-notify": "Vraćene izmjene korisnika $1;\nvraćeno na posljednju izmjenu korisnika $2. [$3 Pok. promjene]", "sessionfailure-title": "Greška u sesiji", "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.", "changecontentmodel": "Promijeni model sadržaja stranice", @@ -2363,17 +2374,23 @@ "ipbreason": "Razlog:", "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Unošenje netačnih informacija\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime", "ipb-hardblock": "Onemogući prijavljene korisnike da uređuju sa ove IP adrese", - "ipbcreateaccount": "Onemogući stvaranje računa", - "ipbemailban": "Onemogući korisnika da šalje e-mail", + "ipbcreateaccount": "Stvaranje računa", + "ipbemailban": "Slanje e-pošte", "ipbenableautoblock": "Automatski blokiraj zadnju IP adresu koju je koristio ovaj korisnik i sve druge IP adrese s kojih je on pokušao uređivati", "ipbsubmit": "Blokirajte ovog korisnika", "ipbother": "Ostali period:", "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,zauvijek:infinite", "ipbhidename": "Sakrij korisničko ime iz uređivanja i spiskova", "ipbwatchuser": "Prati korisničku stranicu i stranicu za razgovor ovog korisnika", - "ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju vlastitu stranicu za razgovor dok je blokiran", + "ipb-disableusertalk": "Uređivanje vlastite stranice za razgovor", "ipb-change-block": "Ponovno blokiraj korisnika sa ovim postavkama", "ipb-confirm": "Potvrdite blokiranje", + "ipb-sitewide": "Na celom sajtu", + "ipb-partial": "Delimično", + "ipb-sitewide-help": "Svaka stranica wikija i sve druge doprinosačke akcije.", + "ipb-partial-help": "Pojedinačne stranice ili imenski prostori.", + "ipb-pages-label": "Stranice", + "ipb-namespaces-label": "Imenski prostori", "badipaddress": "Neodgovarajuća IP adresa / Неодговарајућа IP адреса", "blockipsuccesssub": "Blokiranje je uspjelo", "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.
\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].", @@ -2385,7 +2402,13 @@ "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu", "ipb-blocklist": "Vidi postojeće blokade", "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}", + "ipb-blocklist-duration-left": "preostalo: $1", + "block-actions": "Radnje za blokiranje:", "block-expiry": "Ističe:", + "block-options": "Dodatne mogućnosti:", + "block-prevent-edit": "Uređivanje", + "block-reason": "Razlog:", + "block-target": "Korisničko ime ili IP adresa:", "unblockip": "Odblokiraj korisnika / Одблокирај корисника", "unblockiptext": "Upotrebite donji upitnik da bi ste vratili pravo pisanja ranije blokiranoj IP adresi ili korisničkom imenu.", "ipusubmit": "Ukloni ovu blokadu", @@ -2394,6 +2417,13 @@ "unblocked-id": "Blokada ID oznake $1 je uklonjena", "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.", "blocklist": "Blokirani korisnici", + "autoblocklist": "Autoblokovi", + "autoblocklist-submit": "Pretraži", + "autoblocklist-legend": "Ispis autoblokova", + "autoblocklist-localblocks": "{{PLURAL:$1|Mjesni autoblok|Mjesni autoblokovi}}", + "autoblocklist-total-autoblocks": "Ukupno autoblokova: $1", + "autoblocklist-empty": "Spisak autoblokova je prazan.", + "autoblocklist-otherblocks": "{{PLURAL:$1|Drugi autoblok|Drugi autoblokovi}}", "ipblocklist": "Blokirani korisnici", "ipblocklist-legend": "Traži blokiranog korisnika", "blocklist-userblocks": "Sakrij blokade računa", @@ -2416,6 +2446,10 @@ "createaccountblock": "blokirano stvaranje računa", "emailblock": "e-mail blokiran", "blocklist-nousertalk": "ne može uređivati vlastitu stranicu za razgovor", + "blocklist-editing": "uređivanje", + "blocklist-editing-sitewide": "uređivanje (na celom wikiju)", + "blocklist-editing-page": "stranice", + "blocklist-editing-ns": "imenski prostori", "ipblocklist-empty": "Spisak blokiranja je prazan.", "ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nisu blokirani.", "blocklink": "blokiraj", @@ -2440,8 +2474,10 @@ "block-log-flags-hiddenname": "korisničko ime sakriveno", "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.", "ipb_expiry_invalid": "Nevaljano vrijeme trajanja.", + "ipb_expiry_old": "Vrijeme isteka je u prošlosti.", "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.", "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.", + "ipb_hide_partial": "Skrivene zabrane korisničkih imena moraju biti valjane za cjelo wiki.", "ipb_already_blocked": "\"$1\" je već blokiran", "ipb-needreblock": "$1 je već blokiran. \nDa li želite promijeniti postavke?", "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}", @@ -2450,10 +2486,13 @@ "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može se deblokirati.\nMeđutim, možda je blokirana kao dio bloka $2, koji se može deblokirati.", "ip_range_invalid": "Netačan raspon IP adresa.", "ip_range_toolarge": "Grupne blokade veće od /$1 nisu dozvoljene.", + "ip_range_exceeded": "IP-opseg prekoračuje gornju granicu. Dozvoljeni opseg: /$1.", + "ip_range_toolow": "IP-opsezi nisu dozvoljeni.", "proxyblocker": "Bloker proksija", "proxyblockreason": "Vaša IP adresa je blokirana jer je ona otvoreni proksi. \nMolimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.", "sorbsreason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.", "sorbs_create_account_reason": "Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.\nNe možete napraviti račun", + "softblockrangesreason": "Anonimni doprinosi ne su dozvoljene iz vaše IP adrese ($1). Prijavite se.", "xffblockreason": "IP adresa koja postoji u zagljavlju X-Forwarded-For, ili Vaša ili od proxy servera koji koristite, je blokirana. Originalni razlog za blokiranje je bio: $1", "cant-see-hidden-user": "Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. \nPošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.", "ipbblocked": "Ne možete blokirati ili deblokirati druge korisnike, jer ste i sami blokirani", @@ -2472,6 +2511,7 @@ "lockdbsuccesstext": "Baza podataka je zaključana.
\nSjetite se da je [[Special:UnlockDB|otključate]] nakon što dovršite održavanje.", "unlockdbsuccesstext": "Baza podataka je otključana.", "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.", + "databaselocked": "Baza podataka već je zaključana.", "databasenotlocked": "Baza podataka nije zaključana.", "lockedbyandtime": "(od $1 dana $2 u $3)", "move-page": "Premještanje $1", @@ -2488,13 +2528,17 @@ "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).", "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.", "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.", + "cant-move-subpages": "Nemate dopuštenje da premještate podstranice.", + "namespace-nosubpages": "Imenski prostor \"$1\" ne dozvoljava podstranice.", "newtitle": "Novi naslov:", "move-watch": "Prati izvornu i ciljnu stranicu", "movepagebtn": "Premjesti stranicu", "pagemovedsub": "Premještanje uspjelo", + "cannotmove": "Stranica se ne može premjestiti s {{PLURAL:$1|sljedećeg razloga|sljedećih razloga}}:", "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''", "movepage-moved-redirect": "Preusmjerenje je napravljeno.", "movepage-moved-noredirect": "Pravljenje preusmjerenja je onemogućeno.", + "movepage-delete-first": "Ciljna stranica ima previše izmjena za brisanje kao dio premještanja stranice. Prvo ručno izbrišite stranicu, pa pokušajte ponovo.", "articleexists": "Stranica pod tim imenom već postoji, ili je ime koje ste izabrali neispravno.\nMolimo Vas da izaberete drugo ime.", "cantmove-titleprotected": "Ne možete premjestiti stranicu na ovu lokaciju, jer je novi naslov zaštićen od pravljenja", "movetalk": "Premjesti pridruženu stranicu za razgovor", @@ -2508,13 +2552,14 @@ "movelogpagetext": "Ispod je spisak stranica koje su premještene.", "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}", "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} prikazanih ispod.", + "movesubpagetalktext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu prikazanu|podstranice prikazane|podstranica prikazanih}} ispod.", "movenosubpage": "Ova stranica nema podstranica.", "movereason": "Razlog:", "revertmove": "vrati - врати", - "delete_and_move_text": "==Brisanje neophodno==\nOdredišna stranica \"[[:$1]]\" već postoji.\nDa li je želite obrisati kako bi ste mogli izvršiti premještanje?", + "delete_and_move_text": "Odredišna stranica \"[[:$1]]\" već postoji.\nŽelite li je obrisati da biste oslobodili mjesto za premještanje?", "delete_and_move_confirm": "Da, izbriši stranicu - Да, избриши страницу", "delete_and_move_reason": "Obrisano da se oslobodi mjesto za premještanje iz „[[$1]]“", - "selfmove": "Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.", + "selfmove": "Naslov je istovetan;\nne mogu ga premjestiti preko same sebe.", "immobile-source-namespace": "Ne mogu premjestiti stranice u imenski prostor \"$1\"", "immobile-target-namespace": "Ne mogu se premjestiti stranice u imenski prostor \"$1\"", "immobile-target-namespace-iw": "Međuwiki link nije valjano odredište premještanja stranice.", @@ -2528,8 +2573,8 @@ "fix-double-redirects": "Ažuriraj sva preusmjerenja koja vode na originalni naslov", "move-leave-redirect": "Ostavi preusmjerenje", "protectedpagemovewarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je mogu premještati samo korisnici sa ovlastima administratora.\nPosljednja stavka evidencije je prikazana ispod kao referenca:", - "semiprotectedpagemovewarning": "'''Napomena:''' Ova stranica je zaključana tako da je mogu uređivati samo registrovani korisnici.\nPosljednja stavka evidencije je prikazana ispod kao referenca:", - "move-over-sharedrepo": "== Datoteka postoji ==\n[[:$1]] postoji na dijeljenom repozitorijumu. Premještanje datoteke na ovaj naslov će prepisati dijeljenu datoteku.", + "semiprotectedpagemovewarning": "Napomena: Ova stranica je zaštićena, tako da je mogu premjestiti samo automatski potvrđeni korisnici.\nPosljednja stavka evidencije je prikazana ispod kao referenca:", + "move-over-sharedrepo": "[[:$1]] postoji na dijeljenom repozitorijumu. Ako datoteku premjestite na ovaj naslov, ona će spriječiti dijeljenu datoteku.", "file-exists-sharedrepo": "Ime datoteke koje ste odabrali je već korišteno u dijeljenom repozitorijumu.\nMolimo odaberite drugo ime.", "export": "Izvezite stranice", "exporttext": "Možete izvesti tekst i historiju jedne ili više stranica uklopljene u XML kod.\nOvo se može uvesti u drugi wiki koristeći MediaWiki preko [[Special:Import|stranice uvoza]].\n\nZa izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutnu verziju zajedno sa svim ranijim, ili samo trenutnu verziju sa informacijom o zadnjoj promjeni.\n\nU drugom slučaju možete koristiti i vezu, npr. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].", @@ -2545,6 +2590,7 @@ "export-download": "Spremi kao datoteku", "export-templates": "Uključi šablone", "export-pagelinks": "Uključi povezane stranice do dubine od:", + "export-manual": "Dodajte stranice ručno:", "allmessages": "Sistemske poruke / Системске поруке", "allmessagesname": "Naziv", "allmessagesdefault": "Uobičajeni tekst", @@ -2573,6 +2619,7 @@ "thumbnail_dest_directory": "Ne može se napraviti odredišni folder", "thumbnail_image-type": "Tip slike nije podržan", "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1", + "thumbnail_image-size-zero": "Veličina slike je nula.", "thumbnail_image-missing": "Čini se da datoteka nedostaje: $1", "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.", "import": "Uvoz stranica", @@ -2583,7 +2630,12 @@ "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu", "import-interwiki-templates": "Uključi sve šablone", "import-interwiki-submit": "Uvezi - Увези", + "import-mapping-default": "Uvezi u predodređena mjesta", + "import-mapping-namespace": "Uvezi u imenski prostor:", + "import-mapping-subpage": "Uvezi kao podstranice sljedeće stranice:", "import-upload-filename": "Naziv datoteke:", + "import-upload-username-prefix": "Međuwiki-prefiks:", + "import-assign-known-users": "Dodijeli izmjene mjesnim korisnicima gde imenovani korisnik postoji mjesno", "import-comment": "Komentar:", "importtext": "Molimo Vas da izvezete datoteku iz izvornog wikija koristeći [[Special:Export|alat za izvoz]].\nSnimite je na Vašem računaru i pošaljite ovdje.", "importstart": "Uvoženje stranica…", @@ -2592,35 +2644,38 @@ "imported-log-entries": "{{PLURAL:$1|Uvezena $1 stavka registra|Uvezene $1 stavke registra|Uvezeno $1 stavki registra}}.", "importfailed": "Uvoz nije uspio: $1", "importunknownsource": "Nepoznat izvorni tip uvoza", + "importnoprefix": "Nema ukazanog međuwiki-prefiksa", "importcantopen": "Ne može se otvoriti uvozna datoteka", "importbadinterwiki": "Loš interwiki link", "importsuccess": "Uvoz dovršen!", - "importnosources": "Nisu definirani izvori za transwiki uvoz i neposredna postavljanja historije su onemogućena.", + "importnosources": "Nije definiran izvor za uvoz i neposredna postavljanja historije su onemogućena.", "importnofile": "Uvozna datoteka nije postavljena.", "importuploaderrorsize": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je veća od dozvoljene veličine za postavljanje.", "importuploaderrorpartial": "Postavljanje uvozne datoteke nije uspjelo.\nDatoteka je samo djelomično postavljena.", "importuploaderrortemp": "Postavljanje uvozne datoteke nije uspjelo.\nNedostaje privremeni folder.", "import-parse-failure": "Greška pri parsiranju XML uvoza", "import-noarticle": "Nema stranice za uvoz!", - "import-nonewrevisions": "Sve revizije su prethodno uvežene.", + "import-nonewrevisions": "Nesam uvezio nijednu reviziju (sve su već prisutne ili izostavljene zbog grešaka)", "xml-error-string": "$1 na liniji $2, kolona $3 (bajt $4): $5", "import-upload": "Postavljanje XML podataka", - "import-token-mismatch": "Izgubljeni podaci sesije.\nMolimo pokušajte ponovno.", + "import-token-mismatch": "Izgubljeni podaci sesije.\n\nMožda ste odjavljeni. '''Molimo provjerite da li ste još uvijek prijavljeni i pokušajte ponovo'''.\nAko se problem i dalje pojavljuje, [[Special:UserLogout|odjavite se]] i ponovo prijavite se, i provjerite da li vaš pretraživač dozvoljava kolačiće sa ovog sajta.", "import-invalid-interwiki": "Ne može se uvesti iz navedenog wikija.", - "import-error-edit": "Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je uređujete.", - "import-error-create": "Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je napravite.", - "import-error-interwiki": "Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).", - "import-error-special": "Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.", - "import-error-invalid": "Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.", + "import-error-edit": "Stranica „$1“ nije uvezena jer vam nije dopušteno da je uređujete.", + "import-error-create": "Stranica „$1“ nije uvezena jer vam nije dopušteno da je napravite.", + "import-error-interwiki": "Stranica „$1“ nije uvezena jer je ime rezervirano za vanjske veze (međuprojektne).", + "import-error-special": "Stranica „$1” nije uvezena jer pripada posebnom imenskom prostoru koje ne prihvata stranice.", + "import-error-invalid": "Stranica „$1“ nije uvezena jer je ime nevažeće na ovom wikiju.", "import-error-unserialize": "Verzija $2 stranice \"$1\" ne može biti pročitana/uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.", + "import-error-bad-location": "Verzija $2 koja koristi sadržajni model $3 ne može se skladirati na \"$1\" ovog wikija, jer taj model nije podržan na toj stranici.", "import-options-wrong": "{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: $1", "import-rootpage-invalid": "Navedena osnovna stranica ima neispravan naslov.", "import-rootpage-nosubpage": "Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.", "importlogpage": "Evidencija uvoza stranica", "importlogpagetext": "Administrativni uvozi stranica s historijom izmjena sa drugih wikija.", - "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}}", - "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizija|revizije|revizija}} sa $2", + "import-logentry-upload-detail": "{{PLURAL:$1|Uvezena je jedna revizija|Uvezene su $1 revizije|Uvezeno su $1 revizija}}", + "import-logentry-interwiki-detail": "{{PLURAL:$1|Uvezena je jedna revizija|Uvezene su $1 revizije|Uvezeno su $1 revizija}} sa $2", "javascripttest": "Javaskript test", + "javascripttest-pagetext-unknownaction": "Nepoznata radnja „$1“.", "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.", "tooltip-pt-userpage": "{{GENDER:|Vaša korisnička}} stranica", "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao", @@ -2631,6 +2686,7 @@ "tooltip-pt-mycontris": "Lista {{GENDER:|vaših}} doprinosa", "tooltip-pt-anoncontribs": "Lista uređenja napravljenih s ove IP adrese", "tooltip-pt-login": "Predlažem da se prijavite; međutim, to nije obavezno", + "tooltip-pt-login-private": "Morate se prijaviti da biste koristili wiki", "tooltip-pt-logout": "Odjavite se", "tooltip-pt-createaccount": "Predlažemo vam da izradite račun i prijavite se, iako to nije obavezno", "tooltip-ca-talk": "Diskusija o stranici sadržaja", @@ -2661,7 +2717,8 @@ "tooltip-feed-rss": "RSS feed za ovu stranicu", "tooltip-feed-atom": "Atom feed za ovu stranicu", "tooltip-t-contributions": "Lista doprinosa {{GENDER:$1|ovog korisnika}}", - "tooltip-t-emailuser": "Pošaljite e-mail ovom korisniku", + "tooltip-t-emailuser": "Pošalji e-mail {{GENDER:$1|ovom korisniku|ovoj korisnici}}", + "tooltip-t-info": "Više informacija o ovoj stranici", "tooltip-t-upload": "Postavi datoteke", "tooltip-t-specialpages": "Lista svih posebnih stranica", "tooltip-t-print": "Verzija ove stranice za ispis", @@ -2691,13 +2748,14 @@ "tooltip-undo": "Vraća ovu izmjenu i otvara formu uređivanja u modu pretpregleda.\nDozvoljava unošenje razloga za to u sažetku.", "tooltip-preferences-save": "Snimi postavke", "tooltip-summary": "Unesite kratki sažetak", + "common.json": "/* JSON postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */", "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}", "siteuser": "{{SITENAME}} korisnik $1", "anonuser": "{{SITENAME}} anonimni korisnik $1", "lastmodifiedatby": "Ovu stranicu je posljednji put promjenio $3, u $2, $1", "othercontribs": "Bazirano na radu od strane korisnika $1.", "others": "ostali", - "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1", + "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|korisnik}}|korisnika}} $1", "anonusers": "{{SITENAME}} {{PLURAL:$2|anonimni korisnik|anonimni korisnici}} $1", "creditspage": "Autori stranice", "nocredits": "Autori ove stranice nisu navedeni.", @@ -2718,13 +2776,19 @@ "pageinfo-display-title": "Prikaži naslov", "pageinfo-default-sort": "Podrazumijevani ključ sortiranja", "pageinfo-length": "Dužina stranice (u bajtovima)", + "pageinfo-namespace": "Imenski prostor", "pageinfo-article-id": "ID stranice", "pageinfo-language": "Jezik sadržaja stranice", - "pageinfo-robot-policy": "Status tražilice", - "pageinfo-robot-index": "Stranicu je moguće indeksirati", - "pageinfo-robot-noindex": "Ne može se indeksirati", + "pageinfo-language-change": "smijeni", + "pageinfo-content-model": "Model sadržaja stranice", + "pageinfo-content-model-change": "smijeni", + "pageinfo-robot-policy": "Indeksiranje od strane robota", + "pageinfo-robot-index": "Dozvoljeno", + "pageinfo-robot-noindex": "Nije dozvoljeno", "pageinfo-watchers": "Broj pratitelja stranice", + "pageinfo-visiting-watchers": "Broj pratilaca stranice što su posjetili nedavne izmjene", "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}", + "pageinfo-few-visiting-watchers": "Ne znaje se je li promatrač posjećivao nedavne izmjene", "pageinfo-redirects-name": "Preusmjeravanja na ovu stranicu", "pageinfo-subpages-name": "Podstranice ove stranice", "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja|nepreusmjerenja}})", @@ -2749,11 +2813,16 @@ "pageinfo-protect-cascading-yes": "Da", "pageinfo-protect-cascading-from": "Stranice sa prenosivom zaštitom od", "pageinfo-category-info": "Informacije o kategoriji", + "pageinfo-category-total": "Ukupan broj članova", "pageinfo-category-pages": "Broj stranica", "pageinfo-category-subcats": "Broj potkategorija", "pageinfo-category-files": "Broj datoteka", + "pageinfo-user-id": "Korisnička naznaka", + "pageinfo-file-hash": "Tarabna vrijednost", + "pageinfo-view-protect-log": "Pogl. evidenciju zaštite ove stranice.", "markaspatrolleddiff": "Označi kao patrolirano", "markaspatrolledtext": "Označi ovu stranicu kao patroliranu", + "markaspatrolledtext-file": "Označi ovu verziju kao ispatroliranu", "markedaspatrolled": "Označeno kao patrolirano", "markedaspatrolledtext": "Izabrana revizija [[:$1]] je bila označena kao patrolirana.", "rcpatroldisabled": "Patroliranje nedavnih izmjena onemogućeno", @@ -2765,6 +2834,8 @@ "markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.", "patrol-log-page": "Evidencija patroliranja", "patrol-log-header": "Ovdje se nalazi evidencija patroliranih revizija.", + "confirm-markpatrolled-button": "U redu", + "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 ispatroliranom?", "deletedrevision": "Obrisana stara revizija $1", "filedeleteerror-short": "Greška pri brisanju datoteke: $1", "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1", @@ -2775,7 +2846,7 @@ "previousdiff": "← Starija izmjena", "nextdiff": "Novija izmjena →", "mediawarning": "'''Upozorenje''': Ova datoteka sadrži loš kod.\nNjegovim izvršavanjem možete da ugrozite Vaš sistem.", - "imagemaxsize": "Ograničenje veličine slike:
''(za stranice opisa datoteke)''", + "imagemaxsize": "Ograničenje veličine slika na njihovim opisnim stranicama:", "thumbsize": "Veličina umanjenog prikaza:", "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|stranica|stranice|stranica}}", "file-info": "veličina datoteke: $1, MIME tip: $2", @@ -2787,6 +2858,7 @@ "svg-long-error": "Nevaljana SVG datoteka: $1", "show-big-image": "Izvorna datoteka", "show-big-image-preview": "Veličina ovog prikaza: $1.", + "show-big-image-preview-differ": "Veličina ovog $3-pregleda ove $2-datoteke: $1.", "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.", "show-big-image-size": "$1 × $2 piksela", "file-info-gif-looped": "stalno iznova", @@ -2801,7 +2873,13 @@ "newimages-summary": "Ova posebna stranica prikazuje posljednje postavljene datoteke.", "newimages-legend": "Filter", "newimages-label": "Ime datoteke (ili dio imena):", + "newimages-user": "IP adresa ili korisničko ime", + "newimages-newbies": "Prikaži samo doprinose novih računa", + "newimages-showbots": "Prikaži otpremanja botova", + "newimages-hidepatrolled": "Sakrij ispatrolirana otpremanja", + "newimages-mediatype": "Tip medija:", "noimages": "Ništa za prikazati.", + "gallery-slideshow-toggle": "Prijelaz na minijature", "ilsubmit": "Traži / Тражи", "bydate": "po datumu", "sp-newimages-showfrom": "Prikaz novih datoteka počev od $2, $1", @@ -2851,14 +2929,19 @@ "confirmemail_body_set": "Netko, vjerovatno Vi, sa IP adrese $1,\nje postavio e-mail adresu za račun \"$2\" na ovoj adresi za {{SITENAME}}.\n\nDa potvrdite kako ovaj račun uistinu pripada Vama i reaktivirate\ne-mail postavke na {{SITENAME}}, otvoriti ovaj link u vašem pregledniku:\n\n$3\n\nAko račun *ne* pripada Vama, pratite ovaj link\nkako bi poništili potvrdu e-mail adrese:\n\n$5\n\nOvaj kod za potvrdu će isteći u $4.", "confirmemail_invalidated": "Potvrda e-mail adrese otkazana", "invalidateemail": "Odustani od e-mail potvrde", + "notificationemail_subject_changed": "Registrirana adresa e-pošte na projektu {{SITENAME}} je smijenjena", + "notificationemail_subject_removed": "Registrirana adresa e-pošte na projektu {{SITENAME}} je uklonjena", + "notificationemail_body_changed": "Neko, vjerovatno Vi, s IP-adrese $1,\nsmijenio je adresu e-pošte računa \"$2\" na projektu {{SITENAME}} u \"$3\".\n\nAko ovo niste bili Vi, odmah se obratite administratoru sajta.", + "notificationemail_body_removed": "Neko, vjerovatno Vi, s IP-adrese $1,\nuklonio je adresu e-pošte računa \"$2\" na projektu {{SITENAME}}.\n\nAko ovo niste bili Vi, odmah se obratite administratoru sajta.", "scarytranscludedisabled": "[Međuwiki umetanje je isključeno]", "scarytranscludefailed": "[Neuspješno preusmjerenje šablona na $1]", "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]", "scarytranscludetoolong": "[URL je predugačak]", "deletedwhileediting": "'''Upozorenje''': Ova stranica je obrisana prije nego što ste počeli uređivati!", - "confirmrecreate": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovaj članak pošto ste počeli uređivanje sa razlogom:\n: ''$2''\n\nMolimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj članak.", - "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovaj članak pošto ste ga počeli uređivati. Molimo Vas da potvrdite da stvarno želite da ponovo napravite ovaj članak.", + "confirmrecreate": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao je|obrisala je}} ovu stranicu pošto ste počeli uređivanje, sa razlogom:\n: ''$2''\n\nPotvrdite da stvarno želite da ponovo napravite stranicu.", + "confirmrecreate-noreason": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|obrisao je|obrisala je}} ovu stranicu pošto ste je počeli uređivati. Potvrdite da stvarno želite da ponovo napravite stranicu.", "recreate": "Ponovno napravi", + "confirm-purge-title": "Preučitaj ovu stranicu", "confirm_purge_button": "U redu", "confirm-purge-top": "Da li želite obrisati keš (''cache'') ove stranice?", "confirm-purge-bottom": "Ispražnjava keš stranice i prikazuje najsvježiju verziju.", @@ -2866,10 +2949,22 @@ "confirm-watch-top": "Dodati ovu stranicu na Vaš spisak praćenja?", "confirm-unwatch-button": "U redu", "confirm-unwatch-top": "Izbrisati ovu stranicu sa Vašeg spiska praćenja?", + "confirm-rollback-button": "U redu", + "confirm-rollback-top": "Ukloniti uređivanja na ovoj stranici?", + "confirm-mcrrestore-title": "Povrati reviziju", + "confirm-mcrundo-title": "Otkaži promjenu", + "mcrundofailed": "Otkazivanje nije uspjelo", + "mcrundo-missingparam": "Nedostaje potreban parametar za zahtjev.", + "mcrundo-changed": "Stranica je izmijenjena dok ste gledali razlike. Pregledajte novu promenu.", + "mcrundo-parse-failed": "Nisam uspio raščlaniti novu izmjenu: $1", + "quotation-marks": "\"$1\"", "imgmultipageprev": "← prethodna stranica", "imgmultipagenext": "sljedeća stranica →", "imgmultigo": "Idi!", "imgmultigoto": "Idi na stranicu $1", + "img-lang-default": "(podrazumijevani jezik)", + "img-lang-info": "Ispiši sliku na $1. $2", + "img-lang-go": "Prikaži", "ascending_abbrev": "rast", "descending_abbrev": "opad", "table_pager_next": "Sljedeća stranica", @@ -2883,7 +2978,10 @@ "autosumm-blank": "Uklanjanje svog sadržaja stranice", "autosumm-replace": "Zamjena stranice sa '$1'", "autoredircomment": "Preusmjereno na [[$1]]", + "autosumm-removed-redirect": "Uklonjeno preusmjerenje na [[$1]]", + "autosumm-changed-redirect-target": "Smijenjeno odredište preusmjerenja sa [[$1]] na [[$2]]", "autosumm-new": "Napravljena stranica sa '$1'", + "autosumm-newblank": "Napravljena prazna stranica", "lag-warn-normal": "Promjene načinjene prije manje od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.", "lag-warn-high": "Zbog dužeg zastoja baze podataka na serveru, izmjene novije od $1 {{PLURAL:$1|sekunde|sekunde|sekundi}} možda neće biti prikazane na ovom spisku.", "watchlistedit-normal-title": "Uredi spisak praćenja", @@ -2899,19 +2997,32 @@ "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.", "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:", "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:", + "watchlistedit-clear-title": "Očisti praćene", "watchlistedit-clear-legend": "Obriši spisak praćenja", + "watchlistedit-clear-explain": "Svi naslovi će biti uklonjeni iz praćenih", + "watchlistedit-clear-titles": "Naslovi:", + "watchlistedit-clear-submit": "Očisti praćene (Ovo je nepovratno!)", "watchlistedit-clear-done": "Vaš spisak praćenja je obrisan. Svi naslovi su uklonjeni.", + "watchlistedit-clear-jobqueue": "Vaša praćenja će biti očišćena. Ovo može potrajati!", + "watchlistedit-clear-removed": "{{PLURAL:$1|Obrisan je jedan naslov|Obrisano je $1 naslova}}:", + "watchlistedit-too-many": "Ima previše stranica tako da se mogu ovdje prikazati.", + "watchlisttools-clear": "Očisti praćene", "watchlisttools-view": "Vidi relevantne promjene", "watchlisttools-edit": "Vidi i uredi listu praćenja", "watchlisttools-raw": "Uredi grubu listu praćenja", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])", + "timezone-local": "Lokalno", "duplicate-defaultsort": "'''Upozorenje''': Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".", + "duplicate-displaytitle": "Upozorenje: Prikazni naslov \"$2\" zameniće prethodnito prikazan naslov \"$1\".", + "restricted-displaytitle": "Upozorenje: Naslov za prikaz \"$1\" zanemaren je jer nije istovetan stvarnom naslovu stranice.", + "invalid-indicator-name": "Greška: Atribut name što prikazuje status stranice ne može biti prazna.", "version": "Verzija / Верзија", "version-extensions": "Instalirana proširenja (ekstenzije)", - "version-skins": "Izgledi (skinovi)", + "version-skins": "Uspostavljeni izgledi", "version-specialpages": "Posebne stranice", "version-parserhooks": "Kuke parsera", "version-variables": "Promjenjive", + "version-editors": "Urednici", "version-antispam": "Sprečavanje spama", "version-api": "Prilozi", "version-other": "Ostalo", @@ -2922,9 +3033,22 @@ "version-hook-name": "Naziv kuke", "version-hook-subscribedby": "Pretplaćeno od", "version-version": "($1)", - "version-license": "Licenca", + "version-no-ext-name": "[nema imena]", + "version-license": "MediaWiki licenca", + "version-ext-license": "Licenca", + "version-ext-colheader-name": "Dodatak", + "version-skin-colheader-name": "Izgled", + "version-ext-colheader-version": "Verzija", + "version-ext-colheader-license": "Licenca", + "version-ext-colheader-description": "Opis", + "version-ext-colheader-credits": "Autori", + "version-license-title": "Licenca za $1", + "version-license-not-found": "Za ovaj dodatak nisam našao detaljne informacije o licenci.", + "version-credits-title": "Zasluge za $1", + "version-credits-not-found": "Za ovaj dodatak nisam našao detaljne informacije o zaslugama.", "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.", "version-poweredby-others": "ostali", + "version-poweredby-translators": "translatewiki.net prevodioci", "version-credits-summary": "Htjeli bismo da zahvalimo sljedećim osobama na njihovom doprinosu [[Special:Version|MediaWiki]].", "version-license-info": "Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.\n\nMediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte GNU opću javnu licencu za više detalja.\n\nTrebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] zajedno s ovim programom, ako niste, pišite Fondaciji Slobodnog Softvera na adresu Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ili je pročitajte [//www.gnu.org/licenses/old-licenses/gpl-2.0.html online].", "version-software": "Instalirani softver", @@ -2933,15 +3057,24 @@ "version-entrypoints": "URL adresa instalacije", "version-entrypoints-header-entrypoint": "Ulazna tačka", "version-entrypoints-header-url": "URL", - "redirect": "Preusmjeravanje preko datoteke, korisnika ili ID-a izmjene", - "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (ako je navedeno ime datoteke), stranicu (ako postoji ID revizije) ili korisničku stranicu (ako postoji brojčani ID korisnika).", + "version-libraries": "Uspostavljene biblioteke", + "version-libraries-library": "Biblioteka", + "version-libraries-version": "Verzija", + "version-libraries-license": "Licenca", + "version-libraries-description": "Opis", + "version-libraries-authors": "Autori", + "redirect": "Preusmjerenje na naznaku datoteke, korisnika, stranice, izmjene ili dnevnika", + "redirect-summary": "Ova posebna stranica preusmjerava na datoteku (datog imena), stranicu (date oznake izmjene), korisničku strancu (datog numeričkog identifikatora korisnika) ili dnevnički unos (datog identifikatora zapisa). Upotreba: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] ili [[{{#Special:Redirect}}/logid/186]].", "redirect-submit": "Idi", "redirect-lookup": "Pregled:", "redirect-value": "Vrijednost:", "redirect-user": "Korisnički ID", + "redirect-page": "Naznaka stranice", "redirect-revision": "Izmjena stranice", "redirect-file": "Naziv datoteke", + "redirect-logid": "Naznaka dnevnika", "redirect-not-exists": "Vrijednost nije pronađena", + "redirect-not-numeric": "Vrijednost nije numerička", "fileduplicatesearch": "Potraga za duplim datotekama", "fileduplicatesearch-summary": "Pretraga duplih datoteka na bazi njihove haš vrijednosti.", "fileduplicatesearch-filename": "Ime datoteke:", @@ -2951,7 +3084,8 @@ "fileduplicatesearch-result-n": "Datoteka \"$1\" ima {{PLURAL:$2|1 identičnog|$2 identična|$2 identičnih}} dvojnika.", "fileduplicatesearch-noresults": "Nije pronađena datoteka sa imenom \"$1\".", "specialpages": "Posebne stranice", - "specialpages-note-restricted": "* Normalne posebne stranice.\n* Ograničene posebne stranice.\n* Keširane posebne stranice (mogu biti zastarjele).", + "specialpages-note-top": "Legenda", + "specialpages-note-restricted": "* Normalne posebne stranice.\n* Ograničene posebne stranice.", "specialpages-group-maintenance": "Izvještaji o održavanju / Извјештаји о одржавању", "specialpages-group-other": "Ostale posebne stranice - Остале посебне странице", "specialpages-group-login": "Prijava / Пријава", @@ -2964,21 +3098,60 @@ "specialpages-group-wiki": "Wiki podaci i alati - Вики подаци и алати", "specialpages-group-redirects": "Posebne stranice za preusmjeravanje / Посебне стране за преусмеравање", "specialpages-group-spam": "Spam alati", + "specialpages-group-developer": "Razvojni alati", "blankpage": "Prazna stranica", "intentionallyblankpage": "Ova je stranica namjerno ostavljena praznom.", + "disabledspecialpage-disabled": "Ovu stranicu onemogućio je sistemski administrator.", "external_image_whitelist": " #Ostavite ovu liniju onakva kakva je
\n#Stavite obične fragmente opisa (samo dio koji ide između //) ispod\n#Ovi će biti spojeni sa URLovima sa vanjskih (eksternih) slika\n#One koji se spoje biće prikazane kao slike, u suprotnom će se prikazati samo link\n#Linije koje počinju sa # se tretiraju kao komentari\n#Ovo ne razlikuje velika i mala slova\n\n#Stavite sve regex fragmente iznad ove linije. Ostavite ovu liniju onakvu kakva je
", "tags": "Oznake valjane izmjene", "tag-filter": "Filter [[Special:Tags|oznaka]]:", "tag-filter-submit": "Filter", "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|tag|tagova}}]]: $2", + "tag-mw-contentmodelchange": "izmjena sadržajnog modela", + "tag-mw-contentmodelchange-description": "Uređivanja što [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjaju sadržajni model] jedne stranice", + "tag-mw-new-redirect": "novo preusmjerenje", + "tag-mw-new-redirect-description": "Izmene kojima se stvara novo preusmjeravanje ili mijenja stranica u preusmjerenje", + "tag-mw-removed-redirect": "uklonjeno preusmjerenje", + "tag-mw-removed-redirect-description": "Izmene što menjaju postojeće preusmerenje u nepreusmerenje", + "tag-mw-changed-redirect-target": "izmijenjena odredišna stranica preusmjerenja", + "tag-mw-changed-redirect-target-description": "Uređivanja koja mijenjaju odredište preusmjerenja", + "tag-mw-blank": "pražnjenje", + "tag-mw-replace": "zamijenjeno", + "tag-mw-replace-description": "Uređivanja što uklanjaju preko 90 % sadržaja jedne stranice", + "tag-mw-rollback": "vraćanje", + "tag-mw-rollback-description": "Uređivanja što vraćaju prethodne izmjene pomoću odgovarajuće veze", + "tag-mw-undo": "poništenje", + "tag-mw-undo-description": "Uređivanja što vraćaju prethodne izmjene koristeći vezu za tu svrhu", "tags-title": "Oznake", "tags-intro": "Ova stranica prikazuje spisak oznaka (tagova) koje softver može staviti na svaku izmjenu i njihovo značenje.", "tags-tag": "Naziv oznake", "tags-display-header": "Vidljivost na spisku izmjena", "tags-description-header": "Puni opis značenja", + "tags-source-header": "Izvor", + "tags-active-header": "Aktivno?", "tags-hitcount-header": "Označene izmjene", + "tags-actions-header": "Radnje", + "tags-active-yes": "Da", + "tags-active-no": "Ne", + "tags-source-extension": "Definirano softverom", + "tags-source-manual": "Ručno je dodaju korisnici i botovi", + "tags-source-none": "Van upotrebe", "tags-edit": "uređivanje", + "tags-delete": "obriši", + "tags-activate": "aktiviraj", + "tags-deactivate": "deaktiviraj", "tags-hitcount": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}", + "tags-manage-no-permission": "Nemate dopuštenje upravljati promjenama oznaka.", + "tags-manage-blocked": "Ne možete mijenjati oznake za promjenu dok {{GENDER:$1|ste}} blokirani.", + "tags-create-heading": "Napravi novu oznaku", + "tags-create-explanation": "Novonapravljene oznake predoređeno bit će dostupne korisnicima i robotima.", + "tags-create-tag-name": "Ime oznake:", + "tags-create-reason": "Razlog:", + "tags-create-submit": "Napravi", + "tags-create-no-name": "Morate navesti ime oznake.", + "tags-create-invalid-chars": "Nazivi oznaka ne smiju sadržavati zareze (,), uspravne (|) ni kose crte (/).", + "tags-create-invalid-title-chars": "Imena oznaka ne smiju sadržavati znakove što se ne mogu koristiti u naslovima stranica.", + "tags-create-already-exists": "Oznaka \"$1\" već postoji.", "comparepages": "Usporedi stranice", "compare-page1": "Stranica 1", "compare-page2": "Stranica 2", @@ -2988,9 +3161,17 @@ "compare-invalid-title": "Naslov koji ste unijeli je nevaljan.", "compare-title-not-exists": "Navedeni naslov ne postoji.", "compare-revision-not-exists": "Navedena revizija ne postoji.", + "diff-form": "Razlike / Разлике", + "diff-form-oldid": "Naznaka stare izmjene (neobav.)", + "diff-form-revid": "Naznaka izmjene", + "diff-form-submit": "Prik. razlike", + "permanentlink": "Trajni link", + "permanentlink-revid": "Naznaka izmjene", + "permanentlink-submit": "Idi na izmjenu", "dberr-problems": "Žao nam je! Ova stranica ima tehničke poteškoće.", "dberr-again": "Pokušajte pričekati nekoliko minuta i ponovno učitati.", - "dberr-info": "(Ne može se spojiti server baze podataka: $1)", + "dberr-info": "(Ne mogu pristupiti bazi podataka: $1)", + "dberr-info-hidden": "(Ne mogu pristupiti bazi podataka)", "htmlform-invalid-input": "Postoje određeni problemi sa Vašim unosom", "htmlform-select-badoption": "Vrijednost koju ste unijeli nije valjana opcija.", "htmlform-int-invalid": "Vrijednost koju ste unijeli nije cijeli broj.", @@ -3004,8 +3185,32 @@ "htmlform-no": "Ne", "htmlform-yes": "Da", "htmlform-chosen-placeholder": "Odaberi opciju", + "htmlform-cloner-create": "Dodaj još", + "htmlform-cloner-delete": "Ukloni", + "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.", + "htmlform-date-placeholder": "GGGG-MM-DD", + "htmlform-time-placeholder": "HH:MM:SS", + "htmlform-datetime-placeholder": "GGGG-MM-DD HH:MM:SS", + "htmlform-date-invalid": "Ne mogu prepoznati unesenu vrijednost. Koristite format GGGG-MM-DD.", + "htmlform-time-invalid": "Ne mogu prepoznati unesenu vrijednost vremena. Koristite format HH:MM:SS.", + "htmlform-datetime-invalid": "Ne mogu prepoznati unesenu vrijednost za datum i vrijeme. Koristite format GGGG-MM-DD HH:MM:SS.", + "htmlform-date-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma – $1.", + "htmlform-date-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma – $1.", + "htmlform-time-toolow": "Navedena vrijednost je prije najranijeg dopuštenog vremena – $1.", + "htmlform-time-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog vremena – $1.", + "htmlform-datetime-toolow": "Navedena vrijednost je prije najranijeg dopuštenog datuma i vremena – $1.", + "htmlform-datetime-toohigh": "Navedena vrijednost je poslije krajnjeg dopuštenog datuma i vremena – $1.", + "htmlform-title-badnamespace": "[[:$1]] ne nalazi se imenskom prostoru \"{{ns:$2}}\".", + "htmlform-title-not-creatable": "Naslov \"$1\" se ne može napraviti", + "htmlform-title-not-exists": "$1 ne postoji.", + "htmlform-user-not-exists": "$1 ne postoji.", + "htmlform-user-not-valid": "$1 ne predstavlja validno korisničko ime.", "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3", - "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3", + "logentry-delete-delete_redir": "$1 {{GENDER:$2|obrisao|obrisala}} je preusmjerenje $3 presnimavanjem", + "logentry-delete-restore": "$1 {{GENDER:$2|vratio je|vratila je}} stranicu $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|vratio je|vratila je}} stranicu $3", + "restore-count-revisions": "{{PLURAL:$1|1 izmjena|$1 izmjene|$1 izmjena}}", + "restore-count-files": "{{PLURAL:$1|1 datoteka|$1 datoteke|$1 datoteka}}", "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4", "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4", "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3", @@ -3023,6 +3228,22 @@ "revdelete-uname-unhid": "korisničko ime je otkriveno", "revdelete-restricted": "primijenjena ograničenja za administratore", "revdelete-unrestricted": "uklonjena ograničenja za administratore", + "logentry-block-block": "$1 {{GENDER:$2|blokirao je|blokirala je}} {{GENDER:$4|$3}} u trajanju od $5 $6", + "logentry-block-unblock": "$1 {{GENDER:$2|deblokirao je|deblokirala je}} {{GENDER:$4|$3}}", + "logentry-block-reblock": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} blok {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6", + "logentry-partialblock-block-page": "{{PLURAL:$1|stranica|stranice}} $2", + "logentry-partialblock-block-ns": "{{PLURAL:$1|imenski prostor|imenski prostori}} $2", + "logentry-partialblock-block": "$1 {{GENDER:$2|blokirao je|blokirala je}} {{GENDER:$4|$3}} od uređivanja $7 u trajanju od $5 $6", + "logentry-partialblock-reblock": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} blokovske postavke za {{GENDER:$4|$3}}, sprečavanje uređivanja $7 u trajanju od $5 $6", + "logentry-non-editing-block-block": "$1 {{GENDER:$2|blokirao je|blokirala je}} {{GENDER:$4|$3}} od navedenih neuređivačkih radnji u trajanju od $5 $6", + "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} blokovske postavke za {{GENDER:$4|$3}} za navedene neuređivačke radnje u trajanju od $5 $6", + "logentry-suppress-block": "$1 {{GENDER:$2|blokirao je|blokirala je}} {{GENDER:$4|$3}} u trajanju od $5 $6", + "logentry-suppress-reblock": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} blok {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6", + "logentry-import-upload": "$1 {{GENDER:$2|je uvezao|je uvezla}} $3 otpremanjem datoteke", + "logentry-import-upload-details": "$1 {{GENDER:$2|je uvezao|je uvezla}} $3 otpremanjem datoteke ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})", + "logentry-import-interwiki": "$1 {{GENDER:$2|je uvezao|je uvezla}} $3 s drugog wikija", + "logentry-import-interwiki-details": "$1 {{GENDER:$2|je uvezao|je uvezla}} $3 sa $5 ($4 {{PLURAL:$4|izmjena|izmjene|izmjena}})", + "logentry-merge-merge": "$1 {{GENDER:$2|je pripojio|je pripojila}} $3 u $4 (sve do izmjene $5)", "logentry-move-move": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4", "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez ostavljanja preusmjerenja", "logentry-move-move_redir": "$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja", @@ -3034,31 +3255,61 @@ "logentry-newusers-create2": "Korisnički račun $3 {{GENDER:$2|je napravio|je napravila|je napravio}} $1", "logentry-newusers-byemail": "Korisnički račun $3 je {{GENDER:$2|napravio|napravila}} $1 i lozinka/šifra je poslana putem e-maila", "logentry-newusers-autocreate": "Korisnički račun $1 je automatski {{GENDER:$2|napravljen}}", - "logentry-rights-rights": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5", + "logentry-protect-move_prot": "$1 {{GENDER:$2|premjestio|premjestila}} je zaštitne postavke sa $4 na $3", + "logentry-protect-unprotect": "$1 {{GENDER:$2|uklonio je|uklonila je}} zaštitu sa stranice $3", + "logentry-protect-protect": "$1 {{GENDER:$2|stavio zaštitu|stavila zaštitu}} $3 $4", + "logentry-protect-protect-cascade": "$1 {{GENDER:$2|stavio zaštitu|stavila zaštitu}} $3 $4 [prenosiva zaštita]", + "logentry-protect-modify": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} stepen zaštite za $3 $4", + "logentry-protect-modify-cascade": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} stepen zaštite za $3 $4 [prenosiva zaštita]", + "logentry-rights-rights": "$1 {{GENDER:$2|izmijenio je|izmijenila je}} grupno članstvo {{GENDER:$6|korisnika|korisnice}} $3 iz $4 u $5", "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3", "logentry-rights-autopromote": "$1 {{GENDER:$2|je automatski unaprijeđen|je automatski unaprijeđena}} iz $4 u $5", "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3", + "logentry-upload-overwrite": "$1 {{GENDER:$2|postavio|postavila}} је novu verziju $3", + "logentry-upload-revert": "$1 {{GENDER:$2|je postavio|je postavila}} $3 na stariju inačicu", + "log-name-managetags": "Evidencija upravljanja oznakama", + "log-description-managetags": "Na ovoj stranici nalaze se upraviteljski zadaci što se odnose na [[Special:Tags|oznake]]. Evidencija sadrži samo radnje koje je ručno izvršili administratori; oznake se mogu stvoriti i izbrisati iz wikiprograma i ne nalaze se u evidenciju.", + "logentry-managetags-create": "$1 {{GENDER:$2|napravio je|napravila je}} oznaku \"$4\"", + "logentry-managetags-delete": "$1 {{GENDER:$2|obrisao je|obrisala je}} oznaku \"$4\" (uklonjena iz {{PLURAL:$5|jedne izmjene ili zapisničkog unosa|$5 izmjena i/ili zapisničkih unosa}})", + "logentry-managetags-activate": "$1 {{GENDER:$2|aktivirao je|aktivirala je}} oznaku \"$4\" za upotrebu od strane korisnika i botova", + "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktivirao je|deaktivirala je}} oznaku \"$4\" za upotrebu od strane korisnika i botova", + "log-name-tag": "Evidencija oznaka", + "log-description-tag": "Ova stranica prikazuje dodavanja i brisanja [[Special:Tags|oznake]] iz pojedinačnih verzija ili zapisničkih unosa. Time se ne bilježe oznake napravljene kao dio uređivanja, brisanja i sličnih radnji.", + "logentry-tag-update-add-revision": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 u verziji $4 stranice $3", + "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|dodao|dodala}} je {{PLURAL:$7|oznaku|oznaka}} $6 u zapisničkom unosu $5 stranice $3", + "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznaka}} $8 sa verzije $4 stranice $3", + "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|uklonio|uklonila}} je {{PLURAL:$9|oznaku|oznake}} $8 sa zapisničkog unosa $5 stranice $3", + "logentry-tag-update-revision": "$1 {{GENDER:$2|obnovio|obnovila}} je oznake u verziji $4 strane $3 ({{PLURAL:$7|dodana|dodanih}} $6; {{PLURAL:$9|uklonjena|uklonjenih}} $8)", + "logentry-tag-update-logentry": "$1 {{GENDER:$2|obnovio|obnovila}} je oznake u zapisničkom unosu $5 strane $3 ({{PLURAL:$7|dodana|dodanih}} $6; {{PLURAL:$9|uklonjena|uklonjenih}} $8)", "rightsnone": "(nema)", + "rightslogentry-temporary-group": "$1 (privremeno, do $2)", "feedback-adding": "Dodajem povratne informacije na stranicu...", + "feedback-back": "Nazad", "feedback-bugcheck": "Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom \"bugu\"].", "feedback-bugnew": "Provereno. Prijavi novu grešku", "feedback-bugornote": "Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].\nU suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajati na stranici „[$3 $2]“, zajedno s korisničkim imenom i pregledačem koji koristite.", "feedback-cancel": "Otkaži", "feedback-close": "Gotovo", + "feedback-external-bug-report-button": "Podnesi tehnički zadatak", + "feedback-dialog-title": "Podnesi povratne informacije", + "feedback-dialog-intro": "Poslužite se s jednostavnim obrazcom ispod da biste poslali svoje mišljenje. Komentar će biti dodan na stranicu \"$1\", zajedno s vašim korisničkim imenom.", "feedback-error1": "Greška: neprepoznat rezultat od API-ja", "feedback-error2": "Greška: Uređivanje nije uspjelo", "feedback-error3": "Greška: nema odgovora od API-ja", + "feedback-error4": "Greška: Nije moguće objaviti na dati naslov", "feedback-message": "Poruka:", "feedback-subject": "Tema:", "feedback-submit": "Unesi", "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.", + "feedback-thanks-title": "Hvala vam!", + "feedback-useragent": "Korisnički vršitelj:", "searchsuggest-search": "Traži {{GRAMMAR:akuzativ|{{SITENAME}}}}", "searchsuggest-containing": "sadrži...", "api-error-badtoken": "Unutrašnja greška: token nije ispravan.", "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.", "api-error-publishfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.", "api-error-stashfailed": "Unutrašnja greška: server nije mogao da spremi privremenu datoteku.", - "api-error-unknown-warning": "Nepoznato upozorenje: $1", + "api-error-unknown-warning": "Nepoznato upozorenje: \"$1\".", "api-error-unknownerror": "Nepoznata greška: \"$1\"", "duration-seconds": "$1 {{PLURAL:$1|sekunda|sekunde}}", "duration-minutes": "$1 {{PLURAL:$1|minuta|minuta}}", @@ -3070,10 +3321,227 @@ "duration-centuries": "$1 {{PLURAL:$1|vijek|vijekova}}", "duration-millennia": "$1 {{PLURAL:$1|milenijum|milenijuma}}", "rotate-comment": "Slika rotirana za $1 {{PLURAL:$1|stepeni}} u smjeru kazaljke na satu", - "expand_templates_input": "Unos - Унос", + "limitreport-title": "Profilni raščlanjivački podaci:", + "limitreport-cputime": "Uporaba procesorskog vremena", + "limitreport-cputime-value": "{{PLURAL:$1|jedan sekund|$1 sekunde|$1 sekundi}}", + "limitreport-walltime": "Uporaba u realnom vremenu", + "limitreport-walltime-value": "{{PLURAL:$1|jedan sekund|$1 sekunde|$1 sekundi}}", + "limitreport-ppvisitednodes": "Br. posjećenih čvorova iz pretprocesora", + "limitreport-ppgeneratednodes": "Br. stvorenih čvorova iz pretprocesora", + "limitreport-postexpandincludesize": "Veličina uključenoga nakon proširenja", + "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}", + "limitreport-templateargumentsize": "Veličina argumenta u šablonu", + "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}", + "limitreport-expansiondepth": "Najveća dubina proširenja", + "limitreport-expensivefunctioncount": "Br. složenih raščlanjivačkih funkcija", + "limitreport-unstrip-depth": "Unstrip dubina povratljivosti", + "limitreport-unstrip-size": "Unstrip veličina nakon proširenja", + "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}", + "expandtemplates": "Proširi šablone", + "expand_templates_title": "Naslov konteksta, za {{FULLPAGENAME}} itd.:", + "expand_templates_input": "Ulazni wikitekst:", + "expand_templates_output": "Izvod", + "expand_templates_xml_output": "XML izlaz", + "expand_templates_html_output": "Sirov HTML-izlaz", + "expand_templates_ok": "U redu", + "expand_templates_remove_comments": "Ukloni komentare", + "expand_templates_remove_nowiki": "Pritaji oznake u ishodu", + "expand_templates_generate_xml": "Prikaži XML stablo za raščlanjivanje", + "expand_templates_generate_rawhtml": "Prikazivaj neobrađeni HTML", "expand_templates_preview": "Pregled", - "mw-widgets-abandonedit": "Da li ste sigurni da želite napustiti mod uređivanja prije nego što snimite?", - "mw-widgets-abandonedit-discard": "Odbaci izmjene", + "expand_templates_input_missing": "Morate unjeti neki wikitekst.", + "pagelanguage": "Promena jezika stranice", + "pagelang-name": "Stranica", + "pagelang-language": "Jezik", + "pagelang-use-default": "Koristi podrazumijevani jezik", + "pagelang-select-lang": "Odaberite jezik", + "pagelang-reason": "Razlog", + "pagelang-submit": "Pošalji", + "pagelang-nonexistent-page": "Stranica $1 ne postoji.", + "pagelang-unchanged-language": "Stranica $1 već je namjestena na jezik $2.", + "pagelang-unchanged-language-default": "Stranica $1 već je namjestena na matični sadržajni jezik wikija.", + "pagelang-db-failed": "Baza podataka nije uspjela smijeniti sadržajni jezik.", + "right-pagelang": "Mijenjanje jezika stranice", + "action-pagelang": "mijenjanje jezika stranice", + "log-name-pagelang": "Evidencija mijenjanja jezika", + "log-description-pagelang": "Ovo je evidencija promjena jezika stranica.", + "logentry-pagelang-pagelang": "$1 {{GENDER:$2|smijenio je|smijenila je}} jezik stranice $3 iz $4 u $5.", + "default-skin-not-found": "Nažalost, predodređena tema vašeg wikija ddefinirana u $wgDefaultSkin kao $1 nije dostupna.\n\nVaša uspostava sadrži {{PLURAL:$4|sljedeću temu|sljedeće teme}}. Pogledajte [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priručnik: Podešavanje tema] da biste saznali kako ih uključiti i kako odabrati osnovnu.\n\n$2\n\n; Ako ste upravo uspostavili MediaWiki:\n: Vjerovatno ste je uspostavili sa gita, ili pak neposredno sa izvornog koda koristeći se nekom drugom metodom. Ovo je za očekivati. Pokušajte uspostaviti neku temu sa [https://www.mediawiki.org/wiki/Category:All_skins kataloga tema] tako što ćete:\n:* Sa preuzimanjem [https://www.mediawiki.org/wiki/Download tarball-uspostavljača], koji sami sadrži nekoliko tema i proširenja. Možete prekopirati folder skins/ iz njega.\n:* Preuzimanje tarball-i za teme sa [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]. \n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Koristeći Git kako biste preuzeli teme].\n: Ovo ne bi trebalo utjecati na vaše git skladište ako ste MediaWiki razvijatelj.\n\n; Ako ste upravo nadogradili MediaWiki:\n: MediaWiki 1.24 i više verzije više ne automatski uključuju uspostavljene teme (pogl. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priručni: Samoistraživanje tema]). Možete prekopirati {{PLURAL:$5|sljedeći red kǒda|sljedeće redove kǒda}} u LocalSettings.php kako biste uključili {{PLURAL:$5|uspostavljenu temu|sve uspostavljene teme}}:\n\n
$3
\n\n; Ako ste upravo izmijenili datoteku LocalSettings.php:\n: Provjerite je li ispravno napisani nazivi tema.", + "default-skin-not-found-row-enabled": "* $1 / $2 (uključena)", + "default-skin-not-found-row-disabled": "* $1 / $2 (isključena)", + "mediastatistics": "Statistike za slike i snimke", + "mediastatistics-summary": "Statistike o poslanih tipovima datoteka. Ovdje su uračunate samo najnovije verzije datoteka. Stare i obrisane verzije nisu uračunate.", + "mediastatistics-nbytes": "{{PLURAL:$1|Jedan bajt|$1 bajta|$1 bajtova}} ($2; $3%)", + "mediastatistics-bytespertype": "Ukupni obuhvat pasusa: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).", + "mediastatistics-allbytes": "Ukupni obuhvat svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).", + "mediastatistics-table-mimetype": "MIME tip", + "mediastatistics-table-extensions": "Mogući dodaci", + "mediastatistics-table-count": "Broj datoteka", + "mediastatistics-table-totalbytes": "Ukupna veličina", + "mediastatistics-header-unknown": "Nepoznato", + "mediastatistics-header-bitmap": "Bitmap-slika", + "mediastatistics-header-drawing": "Crteži (vektorske slike)", + "mediastatistics-header-audio": "Zvuk", + "mediastatistics-header-video": "Videa", + "mediastatistics-header-multimedia": "Obogaćeni snimci", + "mediastatistics-header-office": "Birotehničke", + "mediastatistics-header-text": "Tekstualne", + "mediastatistics-header-executable": "Izvršne", + "mediastatistics-header-archive": "Zbijeni formati", + "mediastatistics-header-total": "Sve datoteke", + "json-warn-trailing-comma": "{{PLURAL:$1|Uklonjena je jedna prateća tačka|Uklonjene su $1 prateća tačka|Uklonjeno je $1 pratećih tački}} iz JSON-a", + "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1", + "json-error-depth": "Prekoračena je najveća dozvoljena dubina plasta", + "json-error-state-mismatch": "Nevažeći ili pokvareni JSON", + "json-error-ctrl-char": "Greška u kontrolnom simbolu. Moguće je da je neispravno enkodiran", + "json-error-syntax": "Sintaksna greška", + "json-error-utf8": "Pokvareni UTF-8 znaci. Moguće je da su neispravno enkodirani", + "json-error-recursion": "Postoji jedna ili više povtorljivih referenci u vrijednosti koju treba enkodirati", + "json-error-inf-or-nan": "Postoji jedna ili više NAN- ili INF-vrijednosti što treba enkodirati", + "json-error-unsupported-type": "Data je vrijednost tipa što se ne može enkodirati", + "headline-anchor-title": "Veza do ovog podnaslova", + "special-characters-group-latin": "Latinica", + "special-characters-group-latinextended": "Proširena latinica", + "special-characters-group-ipa": "IPA", + "special-characters-group-symbols": "Simboli", + "special-characters-group-greek": "Grčki", + "special-characters-group-greekextended": "Prošireni grčki", + "special-characters-group-cyrillic": "Ćirilica", + "special-characters-group-arabic": "Arapski", + "special-characters-group-arabicextended": "Prošireni arapski", + "special-characters-group-persian": "Perzijski", + "special-characters-group-hebrew": "Hebrejski", + "special-characters-group-bangla": "Bengalski", + "special-characters-group-tamil": "Tamilski", + "special-characters-group-telugu": "Telugu", + "special-characters-group-sinhala": "Sinhalski", + "special-characters-group-gujarati": "Gudžarati", + "special-characters-group-devanagari": "Devanagari", + "special-characters-group-thai": "Tajlandski", + "special-characters-group-lao": "Laoski", + "special-characters-group-khmer": "Kmerski", + "special-characters-group-canadianaboriginal": "Kanadski domorodni", + "special-characters-title-endash": "crtica", + "special-characters-title-emdash": "duga crta", + "special-characters-title-minus": "minus", + "mw-widgets-abandonedit": "Da li ste sigurni da želite napustiti mod uređivanja bez snimanja izmjena?", + "mw-widgets-abandonedit-discard": "Odbaci uređivanja", "mw-widgets-abandonedit-keep": "Nastavi s uređivanjem", - "mw-widgets-abandonedit-title": "Da li ste sigurni?" + "mw-widgets-abandonedit-title": "Da li ste sigurni?", + "mw-widgets-dateinput-no-date": "Datum nije izabran", + "mw-widgets-mediasearch-input-placeholder": "Pretražite slike/snimke", + "mw-widgets-mediasearch-noresults": "Nisam pronašao ništa.", + "mw-widgets-titleinput-description-new-page": "stranica još ne postoji", + "mw-widgets-titleinput-description-redirect": "preusmjerava na $1", + "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...", + "mw-widgets-usersmultiselect-placeholder": "Dodaj još...", + "mw-widgets-titlesmultiselect-placeholder": "Dodaj još...", + "date-range-from": "Od datuma:", + "date-range-to": "Do datuma:", + "sessionmanager-tie": "Ne možete istovremeno koristiti nekoliko vrsta provjera autentičnosti: $1.", + "sessionprovider-generic": "$1 sesije", + "sessionprovider-mediawiki-session-cookiesessionprovider": "sesije s kolačićima", + "sessionprovider-nocookies": "Kolačići su možda onemogućeni. Ako je tako, uključite ih, i počnite ponovo.", + "randomrootpage": "Slučajna korijenska stranica", + "log-action-filter-block": "Tip bloka:", + "log-action-filter-contentmodel": "Tip promjene sadržajnog modela:", + "log-action-filter-delete": "Tip brisanja:", + "log-action-filter-import": "Tip uvoza:", + "log-action-filter-managetags": "Tip radnje upravljanja oznakama:", + "log-action-filter-move": "Tip premještanja:", + "log-action-filter-newusers": "Tip stvaranja računa:", + "log-action-filter-patrol": "Tip patroliranja:", + "log-action-filter-protect": "Tip zaštite:", + "log-action-filter-rights": "Tip promjene u pravima:", + "log-action-filter-suppress": "Tip skrivanja:", + "log-action-filter-upload": "Tip postavljanja:", + "log-action-filter-all": "Sve", + "log-action-filter-block-block": "blokiranje", + "log-action-filter-block-reblock": "Izmjena bloka", + "log-action-filter-block-unblock": "Deblokiranje", + "log-action-filter-contentmodel-change": "Promjena sadržajnog modela", + "log-action-filter-contentmodel-new": "Pravljenje stranice s nestandardnim sadržajnim modelom", + "log-action-filter-delete-delete": "Brisanje stranice", + "log-action-filter-delete-delete_redir": "Presnimavanje preusmjerenja", + "log-action-filter-delete-restore": "Povratak stranice", + "log-action-filter-delete-event": "Brisanje evidencije", + "log-action-filter-delete-revision": "Brisanje izmjene", + "log-action-filter-import-interwiki": "Prekowiki-uvoz", + "log-action-filter-import-upload": "Uvoz postavljanjem XML-a", + "log-action-filter-managetags-create": "Stvaranje oznake", + "log-action-filter-managetags-delete": "Brisanje oznake", + "log-action-filter-managetags-activate": "Aktiviranje oznake", + "log-action-filter-managetags-deactivate": "Deaktiviranje oznake", + "log-action-filter-move-move": "Premještanje bez presnimavanja preusmjerenja", + "log-action-filter-move-move_redir": "Premještanje s presnimavanjem preusmjerenja", + "log-action-filter-newusers-create": "Stvorio anonimni korisnik", + "log-action-filter-newusers-create2": "Stvorio registrirani korisnik", + "log-action-filter-newusers-autocreate": "Automatski stvoren", + "log-action-filter-newusers-byemail": "Stvoren lozinkom poslanom na adresu e-pošte", + "log-action-filter-patrol-patrol": "Ručno patrolirano", + "log-action-filter-patrol-autopatrol": "Automatski patrolirano", + "log-action-filter-protect-protect": "Zaštita", + "log-action-filter-protect-modify": "Izmjena zaštite", + "log-action-filter-protect-unprotect": "Odzaštita", + "log-action-filter-protect-move_prot": "Premještanje zaštite", + "log-action-filter-rights-rights": "Ručna promjena", + "log-action-filter-rights-autopromote": "Automatska promjena", + "log-action-filter-suppress-event": "Skrivanje zapisa u evidenciji", + "log-action-filter-suppress-revision": "Skrivanje izmjene", + "log-action-filter-suppress-delete": "Skrivanje stranice", + "log-action-filter-suppress-block": "Skrivanje korisnikota preko blokiranja", + "log-action-filter-suppress-reblock": "Skrivanje korisnikota preko preblokiranja", + "log-action-filter-upload-upload": "Novo postavljanje", + "log-action-filter-upload-overwrite": "Prepostavljanje", + "log-action-filter-upload-revert": "Vrati", + "authmanager-authn-not-in-progress": "Verifikacija nije u toku, ili ima gubitak podataka o sesiji. Počnite ispočetka.", + "authmanager-authn-no-primary": "Pruženi akreditivi ne mogu se verificirati.", + "authmanager-authn-no-local-user": "Pruženi akreditivi nisu povezani ni s jednim korisnikom na ovom wikiju.", + "authmanager-authn-no-local-user-link": "Pruženi akreditivi su važeći, ali nisu povezani ni s jednim korisnikom na ovom wikiju. Prijavite se na drugačiji način, ili napravite novi korisnički račun, što će vam dati mogućnost da svežete prethodne akreditive na novi račun.", + "authmanager-authn-autocreate-failed": "Automatsko stvaranje mjesnog računa nije uspjelo: $1", + "authmanager-change-not-supported": "Pružene akreditive ne mogu se mijenjati, jer ih ništa ne bi koristilo.", + "authmanager-create-disabled": "Onemogućeno pravljenje računa.", + "authmanager-create-from-login": "Popunite polja da biste napravili račun.", + "authmanager-create-not-in-progress": "Pravljenje računa nije u toku, ili ima gubitak podataka o sesiji. Počnite ispočetka.", + "authmanager-create-no-primary": "Pružene akreditive ne mogu se uporabiti za otvaranje naloga.", + "authmanager-link-no-primary": "Pružene akreditive ne mogu se uporabiti u povezivanju naloga.", + "authmanager-link-not-in-progress": "Spajanje naloga nije u toku, ili ima gubitak podataka o sesiji. Počnite ispočetka.", + "authmanager-autocreate-noperm": "Automatsko pravljenje računa nije dozvoljeno.", + "authmanager-autocreate-exception": "Automatsko pravljenje računa privremeno je onemogućeno zbog prijašnjih greški.", + "authmanager-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.", + "userjsispublic": "Napomena: podstranice s JavaScriptom ne bi trebale sadržavati povjerljive podatke budući da ih drugi korisnici mogu vidjeti.", + "userjsonispublic": "Imajte na umu: Podstranice s JSONom ne bi trebale sadržavati povjerljive podatke budući da su vidljive drugim korisnicima.", + "usercssispublic": "Napomena: podstranice s CSS-om ne bi trebale sadržavati povjerljive podatke budući da ih drugi korisnici mogu vidjeti.", + "restrictionsfield-badip": "Nevažeća IP adresa ili opseg: $1", + "restrictionsfield-label": "Dozvoljeni IP-opsezi:", + "restrictionsfield-help": "Jedna IP-adresa ili CIDR-opseg po redu. Da omogućite sve, koristite
0.0.0.0/0
::/0", + "edit-error-short": "Greška: $1", + "edit-error-long": "Greške:\n\n$1", + "revid": "izmjena $1", + "pageid": "ID stranice $1", + "gotointerwiki": "Napuštate projekt {{SITENAME}}", + "gotointerwiki-invalid": "Navedeni naslov je nevalidan.", + "gotointerwiki-external": "Napuštate projekt {{SITENAME}} da biste posjetili zasebno mrežno mjesto [[$2]].\n\n[$1 Nastavljate na $1]", + "undelete-cantedit": "Ne možete vratiti ovu stranicu jer Vam nije dozvoljeno da je uređujete.", + "undelete-cantcreate": "Ne možete vratiti stranicu jer ne postoji stranica s tim nazivom i nije Vam dozvoljeno da je napravite.", + "pagedata-title": "Podaci o stranici", + "pagedata-text": "Stranica pruža posrednik za podaci za stranice. Navedite naslov stranice u URL-u pomoću sintakse podstranice.\n* Prebacivanje sadržaja temelji se na zaglavlju Prihvati vašeg klijenta. To znači da će podaci stranice biti stavljeni u formatu koji preferira vaš klijent.", + "pagedata-not-acceptable": "Nisam našao odgovarajući format. Podržane MIME-vrste: $1", + "pagedata-bad-title": "Nevalidan naslov: $1.", + "unregistered-user-config": "Iz bezbednosnih razloga JavaScript, CSS i JSON korisničke podstranice ne mogu biti učitane za neregistrovane korisnike.", + "passwordpolicies": "Pravila za lozinke", + "passwordpolicies-summary": "Ovo je popis djelotvornih pravila za zaporke za korisničke grupe određene na ovom wikiju.", + "passwordpolicies-group": "Grupa", + "passwordpolicies-policies": "Pravila", + "passwordpolicies-policy-minimalpasswordlength": "Lozinka mora da ima najmanje $1 {{PLURAL:$1|znak|znaka|znakova}}", + "passwordpolicies-policy-minimumpasswordlengthtologin": "Lozinka mora da ima najmanje $1 {{PLURAL:$1|znak|znaka|znakova}} da bi ste mogli da se prijavite", + "passwordpolicies-policy-passwordcannotmatchusername": "Lozinka ne može biti ista što i korisničko ime", + "passwordpolicies-policy-passwordcannotmatchblacklist": "Lozinka ne smije biti iz onih na crnom spisku", + "passwordpolicies-policy-maximalpasswordlength": "Lozinka ne mora biti više od $1 {{PLURAL:$1|znaka|znakova}}", + "passwordpolicies-policy-passwordcannotbepopular": "Lozinka ne može da bude {{PLURAL:$1|popularna|iz spiska $1 popularnih lozinki}}", + "passwordpolicies-policy-passwordnotinlargeblacklist": "Lozinka ne može biti na listi 100.000 najčešće korišćenih lozinki.", + "passwordpolicies-policyflag-forcechange": "mora se promjeniti pri prijavi", + "passwordpolicies-policyflag-suggestchangeonlogin": "predloži izmjenu pri prijavi", + "easydeflate-invaliddeflate": "Sadržaj nije ispravno pročišćen", + "unprotected-js": "JavaScript ne može da se učita sa nezaštićenih stranica iz bezbednosnih razloga. Samo napravite JavaScript u imenskom prostoru MediaWiki: ili kao korisničku podstranicu" } diff --git a/languages/i18n/sk.json b/languages/i18n/sk.json index e825d4b778..ae38bab099 100644 --- a/languages/i18n/sk.json +++ b/languages/i18n/sk.json @@ -2112,7 +2112,6 @@ "revertpage": "Posledné úpravy používateľa [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusia]]) vrátené; bola obnovená posledná úprava $1", "revertpage-nouser": "Vrátené úpravy od skrytého používateľa na poslednú revíziu od {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Úpravy $1 vrátené; obnovená posledná verzia od $2.", - "rollback-success-notify": "Úpravy používateľa $1 boli vrátené;\nobnovená posledná revízia od používateľa $2. [$3 Zobraziť zmeny]", "sessionfailure-title": "Chyba relácie", "sessionfailure": "Zdá sa, že je problém s vašou prihlasovacou reláciou;\ntáto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).\nProsím, stlačte \"naspäť\", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.", "changecontentmodel": "Zmeniť model obsahu stránky", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index d93d7d28d8..adf869b2ec 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -2271,7 +2271,6 @@ "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]", "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.", - "rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]", "sessionfailure-title": "Neuspeh seje", "sessionfailure": "Zdi se, da z vašo sejo prijave obstaja težava;\nto dejanje smo preklicali, da bi preprečili morebitno ugrabitev seje. Prosimo, ponovno potrdite obrazec.", "changecontentmodel": "Spremeni model vsebine strani", diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index 2bfc929158..b015010a2d 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -2268,7 +2268,6 @@ "revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", "revertpage-nouser": "Враћене измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]", "rollback-success": "Враћене измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.", - "rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу измену корисника $2. [$3 Прикажи промене]", "sessionfailure-title": "Сесија је окончана", "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.", "changecontentmodel": "Промена модела садржаја странице", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index f089ca0157..889c449da3 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -2261,7 +2261,6 @@ "revertpage": "Vraćene izmene {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]", "revertpage-nouser": "Vraćene izmene skrivenog korisnika na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]", "rollback-success": "Vraćene izmene {{GENDER:$1|korisnika|korisnice}} {{GENDER:$3|$1}} na poslednju izmenu {{GENDER:$2|korisnika|korisnice}} {{GENDER:$4|$2}}.", - "rollback-success-notify": "Vraćene izmene korisnika $1;\nvraćeno na poslednju izmenu korisnika $2. [$3 Prikaži promene]", "sessionfailure-title": "Sesija je okončana", "sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nMolimo, ponovo pošaljite obrazac.", "changecontentmodel": "Promena modela sadržaja stranice", diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index aca767d019..e87f2ea58e 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -127,6 +127,7 @@ "tog-norollbackdiff": "Visa inte diff efter tillbakarullning", "tog-useeditwarning": "Varna mig om jag lämnar en redigeringssida med osparade ändringar", "tog-prefershttps": "Använd alltid en säker anslutning medan jag är inloggad", + "tog-showrollbackconfirmation": "Visa en bekräftelsedialog när man klickar på en tillbakarullningslänk", "underline-always": "Alltid", "underline-never": "Aldrig", "underline-default": "Webbläsarens eller utseendets standardinställning", @@ -2335,7 +2336,6 @@ "revertpage": "Återställde redigeringar av [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]", "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.", - "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]", "sessionfailure-title": "Sessionsfel", "sessionfailure": "Någonting med din inloggningssession är på tok;\ndin begärda åtgärd har avbrutits för att förhindra att någon kapar din session.\nSkicka formuläret igen.", "changecontentmodel": "Ändra innehållsmodell för en sida", diff --git a/languages/i18n/te.json b/languages/i18n/te.json index c79eead299..57097131f3 100644 --- a/languages/i18n/te.json +++ b/languages/i18n/te.json @@ -2142,7 +2142,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|చర్చ]]) చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు.", "revertpage-nouser": "దాగి ఉన్న వాడుకరి చేసిన మార్పులను [[User:$1|$1]] చివరి కూర్పు వరకు తిప్పికొట్టారు", "rollback-success": "{{GENDER:$3|$1}} చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళారు; తిరిగి {{GENDER:$4|$2}} చేసిన చివరి కూర్పుకు మార్చారు.", - "rollback-success-notify": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళారు;\nతిరిగి $2 చేసిన చివరి కూర్పుకు మార్చారు. [$3 మార్పులు చూపించు]", "sessionfailure-title": "సెషను వైఫల్యం", "sessionfailure": "మీ లాగిన్ సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\nఫారమును తిరిగి సమర్పించండి.", "changecontentmodel": "పేజీ కంటెంటు మోడలును మార్చు", diff --git a/languages/i18n/tg-cyrl.json b/languages/i18n/tg-cyrl.json index d58e1e065d..04421499de 100644 --- a/languages/i18n/tg-cyrl.json +++ b/languages/i18n/tg-cyrl.json @@ -1300,7 +1300,6 @@ "editcomment": "Хулосаи вироиш ин буд: $1.", "revertpage": "Вироиши [[Special:Contributions/$2|$2]] ([[User talk:$2|Баҳс]]) вогардонида шуд ба охирин тағйире, ки [[User:$1|$1]] анҷом дода буд", "rollback-success": "Вироишҳои $1 вогардонӣ шуд; саҳифа ба вироиши $2 баргардонида шуд.", - "rollback-success-notify": "Вироишоти $1 вогардонида шуд ба охирин вироише, ки $2 анҷом дода буд. [$3 Намоиши тавофут]", "sessionfailure": "Ба назар мерасад, мушкилие дар мавриди нишасти корбарии шумо вуҷуд дорад; амали дархостшуда ба унвони иқдоми пешгирона дар баробари рабуда шудани иттилооти нишасти корбарӣ, лағв шуд. Лутфан тугмаи \"бозгашт\"-ро дар мурургари худ пахш кунед ва саҳифае, ки аз он инҷо расидаед муҷаддадан фарохонӣ кунед, сипас муҷаддадан боз саъй кунед.", "protectlogpage": "Гузориши муҳофизат", "protectlogtext": "Дар зер феҳристи қуфл карданҳо ва аз қуфл озод шуданҳо омада аст. Барои иттилооти бештар ба [[Special:ProtectedPages|феҳристи саҳифаҳои муҳофизатшуда]] нигаред.", diff --git a/languages/i18n/th.json b/languages/i18n/th.json index 70ef7bf171..252f7f52b8 100644 --- a/languages/i18n/th.json +++ b/languages/i18n/th.json @@ -2202,7 +2202,6 @@ "revertpage": "ย้อนการแก้ไขโดย [[Special:Contributions/$2|$2]] ([[User talk:$2|คุย]]) ไปยังรุ่นแก้ไขล่าสุดโดย [[User:$1|$1]]", "revertpage-nouser": "ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "ย้อนการแก้ไขโดย $1; \nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2", - "rollback-success-notify": "ย้อนการแก้ไขโดย $1;\nเปลี่ยนกลับไปรุ่นล่าสุดโดย $2 [$3 แสดงการเปลี่ยนแปลง]", "sessionfailure-title": "เซสชันล้มเหลว", "sessionfailure": "ดูเหมือนมีปัญหากับเซสชันการเข้าสู่ระบบของคุณ\nการกระทำนี้ถูกยกเลิกเพื่อเป็นการป้องกันการลักลอบเซสชันไว้ก่อน \nกรุณากรอกแบบฟอร์มใหม่อีกครั้ง", "changecontentmodel-title-label": "ชื่อหน้า:", diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index 59b3b39f31..2ad49150b6 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -147,6 +147,7 @@ "tog-norollbackdiff": "Eski hâline getirdikten sonra farkı gösterme", "tog-useeditwarning": "Bir düzenleme sayfasından değişiklikleri kaydetmeden ayrılırken beni uyar", "tog-prefershttps": "Oturum açıkken her zaman güvenli bir bağlantı kullan", + "tog-showrollbackconfirmation": "Geri alma bağlantısına tıkladığınızda bir onay istemi gösterin", "underline-always": "Her zaman", "underline-never": "Hiçbir zaman", "underline-default": "Görünüm ya da tarayıcı varsayılanı", @@ -2476,6 +2477,7 @@ "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar", "ipb-blocklist-duration-left": "$1 ayrıldı", "block-expiry": "Bitiş süresi", + "block-target": "Kullanıcı adı veya IP adresi:", "unblockip": "Kullanıcının engellemesini kaldır", "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.", "ipusubmit": "Bu engellemeyi kaldır", @@ -2512,6 +2514,8 @@ "emailblock": "e-posta engellendi", "blocklist-nousertalk": "kendi mesaj sayfasını değiştiremez", "blocklist-editing-sitewide": "düzenleme (site geneli)", + "blocklist-editing-page": "sayfalar", + "blocklist-editing-ns": "ad alanı", "ipblocklist-empty": "Engelleme listesi boş.", "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.", "blocklink": "engelle", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index 0b2909c3bb..fad362d280 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -77,7 +77,8 @@ "Fitoschido", "Movses", "Esk78", - "Vlad5250" + "Vlad5250", + "Олександр М." ] }, "tog-underline": "Підкреслювання посилань:", @@ -236,7 +237,7 @@ "help-mediawiki": "Допомога про MediaWiki", "search": "Пошук", "search-ignored-headings": " #
\n# Заголовки, які будуть ігноруватися при пошуці.\n# Зміни, які набирають сили при індексуванні сторінки з заголовком.\n# Ви можете примусити переіндексувати сторінку з нульовим редагуванням.\n# Синтаксис наступний:\n#   * Усе, що починається з символу \"#\" до кінця рядка, є коментарем\n#   * Кожний непорожній рядок є точним заголовком для ігнорування\nПримітки\nПосилання\nДив. також\n #
", - "searchbutton": "Пошук", + "searchbutton": "Знайти", "go": "Перейти", "searcharticle": "Перейти", "history": "Історія сторінки", @@ -2347,7 +2348,6 @@ "revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]", "revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}", "rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.", - "rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]", "sessionfailure-title": "Помилка сеансу", "sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nцю дію скасовано, щоб запобігти «захопленню сеансу».\nБудь ласка, надішліть форму ще раз.", "changecontentmodel": "Змінити модель вмісту сторінки", diff --git a/languages/i18n/ur.json b/languages/i18n/ur.json index 81bbff4dd9..611501fad5 100644 --- a/languages/i18n/ur.json +++ b/languages/i18n/ur.json @@ -2201,7 +2201,6 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|تبادلۂ خیال]]) کی ترامیم [[User:$1|$1]] کی گذشتہ ترمیم کی جانب واپس پھیر دی گئیں۔", "revertpage-nouser": "(حذف شدہ صارف نام) کی ترامیم {{GENDER:$1|[[User:$1|$1]]}} کی گذشتہ ترمیم کی جانب واپس پھیر دی گئیں", "rollback-success": "{{GENDER:$3|$1}} کی ترامیم واپس پھیر دی گئیں؛\nصفحہ واپس {{GENDER:$4|$2}} کی آخری ترمیم کی جانب منتقل کر دیا گیا۔", - "rollback-success-notify": "$1 کی ترامیم واپس پھیر دی گئیں؛\nصفحہ واپس $2 کی آخری ترمیم کی جانب منتقل کر دیا گیا۔ [$3 تبدیلیاں دکھائیں]", "sessionfailure-title": "نشست میں خامی", "sessionfailure": "معلوم ہوتا ہے کہ آپ کی لاگ ان نشست میں کوئی مسئلہ درپیش ہے؛\nاس صورت میں نشست کے اغوا کا خدشہ ہوتا ہے، چنانچہ پیش بندی کے طور پر آپ کے اقدام کو مسترد کر دیا گیا ہے۔\nبراہ کرم دوبارہ کوشش کریں۔", "changecontentmodel": "صفحہ کے مواد کے ماڈل میں تبدیلی کریں", diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index 823f589f5f..81920347f1 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -2298,7 +2298,6 @@ "revertpage": "Đã lùi lại sửa đổi của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]]) quay về phiên bản cuối của [[User:$1|$1]]", "revertpage-nouser": "Đã lùi lại sửa đổi của người dùng ẩn quay về phiên bản cuối của {{GENDER:$1}}[[User:$1|$1]]", "rollback-success": "Đã hủy sửa đổi của {{GENDER:$3}}$1;\nquay về phiên bản cuối của {{GENDER:$4}}$2.", - "rollback-success-notify": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2. [$3 Xem thay đổi]", "sessionfailure-title": "Phiên thất bại", "sessionfailure": "Dường như có trục trặc với phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cướp quyền đăng nhập. Xin hãy gửi lại biểu mẫu.", "changecontentmodel": "Thay đổi kiểu nội dung của một trang", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index bb144ad5da..2f15b07477 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -2367,7 +2367,6 @@ "revertpage": "恢复[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的编辑至[[User:$1|$1]]的最后版本", "revertpage-nouser": "恢复隐藏用户的编辑至{{GENDER:$1|[[User:$1|$1]]}}的最后版本", "rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。", - "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]", "sessionfailure-title": "会话无效", "sessionfailure": "似乎您的登录会话有问题;为了防止会话劫持,这个操作已经被取消。请重新提交表单。", "changecontentmodel": "更改一个页面的内容模型", diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index 79b07c1692..5e2cb469a9 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -2343,6 +2343,9 @@ "deleting-backlinks-warning": "警告:您正要刪除的頁面有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他頁面]]連結或引用。", "deleting-subpages-warning": "警告:您要刪除的頁面有[[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1個子頁面|51=超過50個子頁面}}]]。", "rollback": "復原編輯", + "rollback-confirmation-confirm": "回退{{PLURAL:$1|0=這些編輯|1個編輯|$1個編輯}}?", + "rollback-confirmation-yes": "回退", + "rollback-confirmation-no": "取消", "rollbacklink": "回退", "rollbacklinkcount": "還原 $1 次編輯", "rollbacklinkcount-morethan": "回退超過 $1 次{{PLURAL:$1|編輯}}", @@ -2355,7 +2358,6 @@ "revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯為最後由[[User:$1|$1]]所修訂的版本", "revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本", "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。", - "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]", "sessionfailure-title": "連線階段失敗", "sessionfailure": "您的登入連線階段似乎有問題,為了預防連線階段受到劫持攻擊,此動作已經被取消。請重新提交表單。", "changecontentmodel": "變更頁面的內容模型", @@ -3136,6 +3138,7 @@ "confirm-unwatch-top": "從您的監視清單中移除此頁面?", "confirm-rollback-button": "確定", "confirm-rollback-top": "還原編輯到此頁面?", + "confirm-rollback-bottom": "此操作會立即回退對於此頁面的所選更改。", "confirm-mcrrestore-title": "還原修訂", "confirm-mcrundo-title": "還原變更", "mcrundofailed": "還原失敗", diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index b638b42dff..3403e82a06 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -1281,27 +1281,45 @@ abstract class Maintenance { * @author Rob Church */ public function purgeRedundantText( $delete = true ) { + global $wgMultiContentRevisionSchemaMigrationStage; + # Data should come off the master, wrapped in a transaction $dbw = $this->getDB( DB_MASTER ); $this->beginTransaction( $dbw, __METHOD__ ); - # Get "active" text records from the revisions table - $cur = []; - $this->output( 'Searching for active text records in revisions table...' ); - $res = $dbw->select( 'revision', 'rev_text_id', [], __METHOD__, [ 'DISTINCT' ] ); - foreach ( $res as $row ) { - $cur[] = $row->rev_text_id; - } - $this->output( "done.\n" ); + if ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_READ_OLD ) { + # Get "active" text records from the revisions table + $cur = []; + $this->output( 'Searching for active text records in revisions table...' ); + $res = $dbw->select( 'revision', 'rev_text_id', [], __METHOD__, [ 'DISTINCT' ] ); + foreach ( $res as $row ) { + $cur[] = $row->rev_text_id; + } + $this->output( "done.\n" ); - # Get "active" text records from the archive table - $this->output( 'Searching for active text records in archive table...' ); - $res = $dbw->select( 'archive', 'ar_text_id', [], __METHOD__, [ 'DISTINCT' ] ); - foreach ( $res as $row ) { - # old pre-MW 1.5 records can have null ar_text_id's. - if ( $row->ar_text_id !== null ) { - $cur[] = $row->ar_text_id; + # Get "active" text records from the archive table + $this->output( 'Searching for active text records in archive table...' ); + $res = $dbw->select( 'archive', 'ar_text_id', [], __METHOD__, [ 'DISTINCT' ] ); + foreach ( $res as $row ) { + # old pre-MW 1.5 records can have null ar_text_id's. + if ( $row->ar_text_id !== null ) { + $cur[] = $row->ar_text_id; + } + } + $this->output( "done.\n" ); + } else { + # Get "active" text records via the content table + $cur = []; + $this->output( 'Searching for active text records via contents table...' ); + $res = $dbw->select( 'content', 'content_address', [], __METHOD__, [ 'DISTINCT' ] ); + $blobStore = MediaWikiServices::getInstance()->getBlobStore(); + foreach ( $res as $row ) { + $textId = $blobStore->getTextIdFromAddress( $row->content_address ); + if ( $textId ) { + $cur[] = $textId; + } } + $this->output( "done.\n" ); } $this->output( "done.\n" ); @@ -1427,7 +1445,7 @@ abstract class Maintenance { 'user', 'page_restrictions' ]; - $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ ); + $db->lockTables( $read, $write, __CLASS__ . '-searchIndexLock' ); } /** @@ -1435,7 +1453,7 @@ abstract class Maintenance { * @param IMaintainableDatabase &$db */ private function unlockSearchindex( $db ) { - $db->unlockTables( __CLASS__ . '::' . __METHOD__ ); + $db->unlockTables( __CLASS__ . '-searchIndexLock' ); } /** diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php index 512910c49b..f515df70f4 100644 --- a/maintenance/dumpTextPass.php +++ b/maintenance/dumpTextPass.php @@ -29,6 +29,8 @@ require_once __DIR__ . '/7zip.inc'; require_once __DIR__ . '/../includes/export/WikiExporter.php'; use MediaWiki\MediaWikiServices; +use MediaWiki\Storage\BlobAccessException; +use MediaWiki\Storage\SqlBlobStore; use Wikimedia\Rdbms\IMaintainableDatabase; /** @@ -139,6 +141,13 @@ TEXT } } + /** + * @return SqlBlobStore + */ + private function getBlobStore() { + return MediaWikiServices::getInstance()->getBlobStore(); + } + function execute() { $this->processOptions(); $this->dump( true ); @@ -520,17 +529,17 @@ TEXT } /** - * Tries to get the revision text for a revision id. - * Export transformations are applied if the content model can is given or can be + * Tries to load revision text. + * Export transformations are applied if the content model is given or can be * determined from the database. * * Upon errors, retries (Up to $this->maxFailures tries each call). - * If still no good revision get could be found even after this retrying, "" is returned. + * If still no good revision could be found even after this retrying, "" is returned. * If no good revision text could be returned for * $this->maxConsecutiveFailedTextRetrievals consecutive calls to getText, MWException * is thrown. * - * @param string $id The revision id to get the text for + * @param int|string $id Content address, or text row ID. * @param string|bool|null $model The content model used to determine * applicable export transformations. * If $model is null, it will be determined from the database. @@ -558,6 +567,7 @@ TEXT $consecutiveFailedTextRetrievals = 0; if ( $model === null && $wgContentHandlerUseDB ) { + // TODO: MCR: use content table $row = $this->db->selectRow( 'revision', [ 'rev_content_model', 'rev_content_format' ], @@ -700,37 +710,42 @@ TEXT } /** - * May throw a database error if, say, the server dies during query. - * @param int $id + * Loads the serialized content from storage. + * + * @param int|string $id Content address, or text row ID. * @return bool|string - * @throws MWException */ private function getTextDb( $id ) { - if ( !isset( $this->db ) ) { - throw new MWException( __METHOD__ . "No database available" ); - } - $row = $this->db->selectRow( 'text', - [ 'old_text', 'old_flags' ], - [ 'old_id' => $id ], - __METHOD__ ); - $text = Revision::getRevisionText( $row ); - if ( $text === false ) { + $store = $this->getBlobStore(); + $address = ( is_int( $id ) || strpos( $id, ':' ) === false ) + ? SqlBlobStore::makeAddressFromTextId( (int)$id ) + : $id; + + try { + $text = $store->getBlob( $address ); + + $stripped = str_replace( "\r", "", $text ); + $normalized = MediaWikiServices::getInstance()->getContentLanguage() + ->normalize( $stripped ); + + return $normalized; + } catch ( BlobAccessException $ex ) { + // XXX: log a warning? return false; } - $stripped = str_replace( "\r", "", $text ); - $normalized = MediaWikiServices::getInstance()->getContentLanguage()-> - normalize( $stripped ); - - return $normalized; } - private function getTextSpawned( $id ) { + /** + * @param int|string $address Content address, or text row ID. + * @return bool|string + */ + private function getTextSpawned( $address ) { Wikimedia\suppressWarnings(); if ( !$this->spawnProc ) { // First time? $this->openSpawn(); } - $text = $this->getTextSpawnedOnce( $id ); + $text = $this->getTextSpawnedOnce( $address ); Wikimedia\restoreWarnings(); return $text; @@ -797,8 +812,16 @@ TEXT Wikimedia\restoreWarnings(); } - private function getTextSpawnedOnce( $id ) { - $ok = fwrite( $this->spawnWrite, "$id\n" ); + /** + * @param int|string $address Content address, or text row ID. + * @return bool|string + */ + private function getTextSpawnedOnce( $address ) { + if ( is_int( $address ) || intval( $address ) ) { + $address = SqlBlobStore::makeAddressFromTextId( (int)$address ); + } + + $ok = fwrite( $this->spawnWrite, "$address\n" ); // $this->progress( ">> $id" ); if ( !$ok ) { return false; @@ -810,13 +833,17 @@ TEXT return false; } - // check that the text id they are sending is the one we asked for + // check that the text address they are sending is the one we asked for // this avoids out of sync revision text errors we have encountered in the past - $newId = fgets( $this->spawnRead ); - if ( $newId === false ) { + $newAddress = fgets( $this->spawnRead ); + if ( $newAddress === false ) { return false; } - if ( $id != intval( $newId ) ) { + if ( strpos( $newAddress, ':' ) === false ) { + $newAddress = SqlBlobStore::makeAddressFromTextId( intval( $newAddress ) ); + } + + if ( $newAddress !== $address ) { return false; } diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php index bc4fa31f10..8d04adc668 100644 --- a/maintenance/fetchText.php +++ b/maintenance/fetchText.php @@ -24,7 +24,9 @@ require_once __DIR__ . '/Maintenance.php'; -use Wikimedia\Rdbms\IDatabase; +use MediaWiki\MediaWikiServices; +use MediaWiki\Storage\BlobAccessException; +use MediaWiki\Storage\SqlBlobStore; /** * Maintenance script used to fetch page text in a subprocess. @@ -32,14 +34,24 @@ use Wikimedia\Rdbms\IDatabase; * @ingroup Maintenance */ class FetchText extends Maintenance { + public function __construct() { parent::__construct(); - $this->addDescription( "Fetch the raw revision blob from an old_id.\n" . + + $this->addDescription( "Fetch the raw revision blob from a blob address.\n" . + "Integer IDs are interpreted as referring to text.old_id for backwards compatibility.\n" . "NOTE: Export transformations are NOT applied. " . - "This is left to backupTextPass.php" + "This is left to dumpTextPass.php" ); } + /** + * @return SqlBlobStore + */ + private function getBlobStore() { + return MediaWikiServices::getInstance()->getBlobStore(); + } + /** * returns a string containing the following in order: * textid @@ -51,7 +63,6 @@ class FetchText extends Maintenance { * note that the text string itself is *not* followed by newline */ public function execute() { - $db = $this->getDB( DB_REPLICA ); $stdin = $this->getStdin(); while ( !feof( $stdin ) ) { $line = fgets( $stdin ); @@ -59,37 +70,30 @@ class FetchText extends Maintenance { // We appear to have lost contact... break; } - $textId = intval( $line ); - $text = $this->doGetText( $db, $textId ); - if ( $text === false ) { - # actual error, not zero-length text - $textLen = "-1"; - } else { + $blobAddress = trim( $line ); + + // Plain integers are supported for backwards compatibility with pre-MCR dumps. + if ( strpos( $blobAddress, ':' ) === false && is_numeric( $blobAddress ) ) { + $blobAddress = SqlBlobStore::makeAddressFromTextId( intval( $blobAddress ) ); + } + + try { + $text = $this->getBlobStore()->getBlob( $blobAddress ); $textLen = strlen( $text ); + } catch ( BlobAccessException $ex ) { + // XXX: log $ex to stderr? + $textLen = '-1'; + $text = ''; + } catch ( InvalidArgumentException $ex ) { + // XXX: log $ex to stderr? + $textLen = '-1'; + $text = ''; } - $this->output( $textId . "\n" . $textLen . "\n" . $text ); - } - } - /** - * May throw a database error if, say, the server dies during query. - * @param IDatabase $db - * @param int $id The old_id - * @return string - */ - private function doGetText( $db, $id ) { - $id = intval( $id ); - $row = $db->selectRow( 'text', - [ 'old_text', 'old_flags' ], - [ 'old_id' => $id ], - __METHOD__ ); - $text = Revision::getRevisionText( $row ); - if ( $text === false ) { - return false; + $this->output( $blobAddress . "\n" . $textLen . "\n" . $text ); } - - return $text; } + } $maintClass = FetchText::class; diff --git a/maintenance/includes/BackupDumper.php b/maintenance/includes/BackupDumper.php index 45786d8da0..a9e757e7b4 100644 --- a/maintenance/includes/BackupDumper.php +++ b/maintenance/includes/BackupDumper.php @@ -51,6 +51,7 @@ abstract class BackupDumper extends Maintenance { protected $reportingInterval = 100; protected $pageCount = 0; protected $revCount = 0; + protected $schemaVersion = null; // use default protected $server = null; // use default protected $sink = null; // Output filters protected $lastTime = 0; @@ -101,6 +102,8 @@ abstract class BackupDumper extends Maintenance { '[:]. s: latest, notalk, namespace', false, true, false, true ); $this->addOption( 'report', 'Report position and speed after every n pages processed. ' . 'Default: 100.', false, true ); + $this->addOption( 'schema-version', 'Schema version to use for output. ' . + 'Default: ' . WikiExporter::schemaVersion(), false, true ); $this->addOption( 'server', 'Force reading from MySQL server', false, true ); $this->addOption( '7ziplevel', '7zip compression level for all 7zip outputs. Used for ' . '-mx option to 7za command.', false, true ); @@ -155,6 +158,8 @@ abstract class BackupDumper extends Maintenance { $sink = null; $sinks = []; + $this->schemaVersion = WikiExporter::schemaVersion(); + $options = $this->orderedOptions; foreach ( $options as $arg ) { $opt = $arg[0]; @@ -215,6 +220,15 @@ abstract class BackupDumper extends Maintenance { unset( $sink ); $sink = $filter; + break; + case 'schema-version': + if ( !in_array( $param, XmlDumpWriter::$supportedSchemas ) ) { + $this->fatalError( + "Unsupported schema version $param. Supported versions: " . + implode( ', ', XmlDumpWriter::$supportedSchemas ) + ); + } + $this->schemaVersion = $param; break; } } @@ -250,6 +264,7 @@ abstract class BackupDumper extends Maintenance { $db = $this->backupDb(); $exporter = new WikiExporter( $db, $history, $text ); + $exporter->setSchemaVersion( $this->schemaVersion ); $exporter->dumpUploads = $this->dumpUploads; $exporter->dumpUploadFileContents = $this->dumpUploadFileContents; diff --git a/maintenance/includes/MigrateActors.php b/maintenance/includes/MigrateActors.php index ba6c375aa7..d9c207241f 100644 --- a/maintenance/includes/MigrateActors.php +++ b/maintenance/includes/MigrateActors.php @@ -32,9 +32,13 @@ require_once __DIR__ . '/../Maintenance.php'; * @ingroup Maintenance */ class MigrateActors extends LoggedUpdateMaintenance { + + protected $tables = null; + public function __construct() { parent::__construct(); $this->addDescription( 'Migrates actors from pre-1.31 columns to the \'actor\' table' ); + $this->addOption( 'tables', 'List of tables to process, comma-separated', false, true ); $this->setBatchSize( 100 ); } @@ -42,6 +46,10 @@ class MigrateActors extends LoggedUpdateMaintenance { return __CLASS__; } + protected function doTable( $table ) { + return $this->tables === null || in_array( $table, $this->tables, true ); + } + protected function doDBUpdates() { global $wgActorTableSchemaMigrationStage; @@ -52,28 +60,51 @@ class MigrateActors extends LoggedUpdateMaintenance { return false; } - $this->output( "Creating actor entries for all registered users\n" ); - $end = 0; - $dbw = $this->getDB( DB_MASTER ); - $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ ); - $count = 0; - while ( $end < $max ) { - $start = $end + 1; - $end = min( $start + $this->mBatchSize, $max ); - $this->output( "... $start - $end\n" ); - $dbw->insertSelect( - 'actor', - 'user', - [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ], - [ "user_id >= $start", "user_id <= $end" ], + $tables = $this->getOption( 'tables' ); + if ( $tables !== null ) { + $this->tables = explode( ',', $tables ); + } + + if ( $this->doTable( 'user' ) ) { + $this->output( "Creating actor entries for all registered users\n" ); + $end = 0; + $dbw = $this->getDB( DB_MASTER ); + $max = $dbw->selectField( 'user', 'MAX(user_id)', '', __METHOD__ ); + $count = 0; + while ( $end < $max ) { + $start = $end + 1; + $end = min( $start + $this->mBatchSize, $max ); + $this->output( "... $start - $end\n" ); + $dbw->insertSelect( + 'actor', + 'user', + [ 'actor_user' => 'user_id', 'actor_name' => 'user_name' ], + [ "user_id >= $start", "user_id <= $end" ], + __METHOD__, + [ 'IGNORE' ], + [ 'ORDER BY' => [ 'user_id' ] ] + ); + $count += $dbw->affectedRows(); + wfWaitForSlaves(); + } + $this->output( "Completed actor creation, added $count new actor(s)\n" ); + } else { + $this->output( "Checking that actors exist for all registered users\n" ); + $dbr = $this->getDB( DB_REPLICA, [ 'vslow' ] ); + $anyMissing = $dbr->selectField( + [ 'user', 'actor' ], + '1', + [ 'actor_id' => null ], __METHOD__, - [ 'IGNORE' ], - [ 'ORDER BY' => [ 'user_id' ] ] + [ 'LIMIT 1' ], + [ 'actor' => [ 'LEFT JOIN', 'actor_user = user_id' ] ] ); - $count += $dbw->affectedRows(); - wfWaitForSlaves(); + if ( $anyMissing ) { + $this->error( 'Some users lack actors; run without --tables or include `user` in --tables.' ); + return false; + } + $this->output( "Ok, continuing.\n" ); } - $this->output( "Completed actor creation, added $count new actor(s)\n" ); $errors = 0; $errors += $this->migrateToTemp( @@ -144,6 +175,8 @@ class MigrateActors extends LoggedUpdateMaintenance { /** * Add actors for anons in a set of rows + * + * @suppress SecurityCheck-SQLInjection The array_keys/array_map is too much for static analysis * @param IDatabase $dbw * @param string $nameField * @param object[] &$rows @@ -227,6 +260,11 @@ class MigrateActors extends LoggedUpdateMaintenance { * @return int Number of errors */ protected function migrate( $table, $primaryKey, $userField, $nameField, $actorField ) { + if ( !$this->doTable( $table ) ) { + $this->output( "Skipping $table, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $primaryKey = (array)$primaryKey; @@ -323,6 +361,11 @@ class MigrateActors extends LoggedUpdateMaintenance { protected function migrateToTemp( $table, $primaryKey, $extra, $userField, $nameField, $newPrimaryKey, $actorField ) { + if ( !$this->doTable( $table ) ) { + $this->output( "Skipping $table, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $newTable = $table . '_actor_temp'; @@ -411,6 +454,11 @@ class MigrateActors extends LoggedUpdateMaintenance { * @return int Number of errors */ protected function migrateLogSearch() { + if ( !$this->doTable( 'log_search' ) ) { + $this->output( "Skipping log_search, not included in --tables\n" ); + return 0; + } + $complainedAboutUsers = []; $primaryKey = [ 'ls_value', 'ls_log_id' ]; @@ -422,6 +470,25 @@ class MigrateActors extends LoggedUpdateMaintenance { $countActors = 0; $countErrors = 0; + $anyBad = $dbw->selectField( + 'log_search', + 1, + [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ], + __METHOD__, + [ 'LIMIT' => 1 ] + ); + if ( $anyBad ) { + $this->output( "... Deleting bogus rows due to T21552\n" ); + $dbw->delete( + 'log_search', + [ 'ls_field' => 'target_author_actor', 'ls_value' => '' ], + __METHOD__ + ); + $ct = $dbw->affectedRows(); + $this->output( "... Deleted $ct bogus row(s) from T21552\n" ); + wfWaitForSlaves(); + } + $next = '1=1'; while ( true ) { // Fetch the rows needing update diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php index f07bc5526f..ce1506ca49 100644 --- a/maintenance/populateCategory.php +++ b/maintenance/populateCategory.php @@ -93,9 +93,9 @@ TEXT $throttle = intval( $throttle ); if ( $begin !== '' ) { - $where = 'cl_to > ' . $dbw->addQuotes( $begin ); + $where = [ 'cl_to > ' . $dbw->addQuotes( $begin ) ]; } else { - $where = null; + $where = [ '1 = 1' ]; } $i = 0; diff --git a/maintenance/populateContentTables.php b/maintenance/populateContentTables.php index 644ff87ee8..a264545e7f 100644 --- a/maintenance/populateContentTables.php +++ b/maintenance/populateContentTables.php @@ -188,6 +188,11 @@ class PopulateContentTables extends Maintenance { $startOption = 'start-archive'; } + if ( !$this->dbw->fieldExists( $table, $fields['text_id'], __METHOD__ ) ) { + $this->writeln( "No need to populate, $table.{$fields['text_id']} field does not exist" ); + return; + } + $minmax = $this->dbw->selectRow( $table, [ 'min' => "MIN( $idField )", 'max' => "MAX( $idField )" ], diff --git a/maintenance/rebuildSitesCache.php b/maintenance/rebuildSitesCache.php deleted file mode 100644 index 41fd863661..0000000000 --- a/maintenance/rebuildSitesCache.php +++ /dev/null @@ -1,68 +0,0 @@ -addDescription( 'Cache sites as json for file-based lookup.' ); - $this->addOption( 'file', 'File to output the json to', false, true ); - } - - public function execute() { - $sitesCacheFileBuilder = new SitesCacheFileBuilder( - \MediaWiki\MediaWikiServices::getInstance()->getSiteLookup(), - $this->getCacheFile() - ); - - $sitesCacheFileBuilder->build(); - } - - /** - * @return string - */ - private function getCacheFile() { - if ( $this->hasOption( 'file' ) ) { - $jsonFile = $this->getOption( 'file' ); - } else { - $jsonFile = $this->getConfig()->get( 'SitesCacheFile' ); - - if ( $jsonFile === false ) { - $this->fatalError( 'Error: No file set in configuration for SitesCacheFile.' ); - } - } - - return $jsonFile; - } - -} - -$maintClass = RebuildSitesCache::class; -require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php index 900a52a570..2e4cc88058 100644 --- a/maintenance/rebuildtextindex.php +++ b/maintenance/rebuildtextindex.php @@ -93,7 +93,7 @@ class RebuildTextIndex extends Maintenance { $this->output( "Rebuilding index fields for {$count} pages...\n" ); $n = 0; - $revQuery = Revision::getQueryInfo( [ 'page', 'text' ] ); + $revQuery = Revision::getQueryInfo( [ 'page' ] ); while ( $n < $count ) { if ( $n ) { @@ -104,7 +104,7 @@ class RebuildTextIndex extends Maintenance { $res = $this->db->select( $revQuery['tables'], $revQuery['fields'], - [ "page_id BETWEEN $n AND $end", 'page_latest = rev_id', 'rev_text_id = old_id' ], + [ "page_id BETWEEN $n AND $end", 'page_latest = rev_id' ], __METHOD__, [], $revQuery['joins'] diff --git a/maintenance/renameDbPrefix.php b/maintenance/renameDbPrefix.php index 73bc4d9fea..e5aa23ec4d 100644 --- a/maintenance/renameDbPrefix.php +++ b/maintenance/renameDbPrefix.php @@ -82,7 +82,9 @@ class RenameDbPrefix extends Maintenance { // $old should be regexp safe ([a-zA-Z_]) $newTable = preg_replace( '/^' . $old . '/', $new, $table ); $this->output( "Renaming table $table to $newTable\n" ); - $dbw->query( "RENAME TABLE $table TO $newTable" ); + $oldTableEnc = $dbw->addIdentifierQuotes( $table ); + $newTableEnc = $dbw->addIdentifierQuotes( $newTable ); + $dbw->query( "RENAME TABLE $oldTableEnc TO $newTableEnc" ); } $count++; } diff --git a/maintenance/resources/foreign-resources.yaml b/maintenance/resources/foreign-resources.yaml index 37768cce39..3ecd12e8a3 100644 --- a/maintenance/resources/foreign-resources.yaml +++ b/maintenance/resources/foreign-resources.yaml @@ -90,6 +90,36 @@ jquery.cookie: src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/CHANGELOG.md integrity: sha384-SQOHhLc7PHxHDQpGE/zv9XfXKL0A7OBu8kuyVDnHVp+zSoWyRw4xUJ+LSm5ql4kS +jquery.form: + type: file + src: https://raw.githubusercontent.com/jquery-form/form/ff80d9ddf4/jquery.form.js + integrity: sha384-h4G2CrcSbixzMvrrK259cNBYaL/vS1D4+KdUN9NJDzQnTU1bQ6Avluget+Id13M7 + dest: jquery.form.js + +jquery.fullscreen: + type: file + src: https://raw.githubusercontent.com/theopolisme/jquery-fullscreen/v2.1.0/jquery.fullscreen.js + integrity: sha384-G4KPs2d99tgcsyUnJ3eeZ1r2hEKDwZfc4+/xowL/LIemq2VVwEE8HpVAWt4WYNLR + dest: jquery.fullscreen.js + +jquery.hoverIntent: + type: file + src: https://raw.githubusercontent.com/briancherne/jquery-hoverIntent/823603fdac/jquery.hoverIntent.js + integrity: sha384-lca0haN0hqFGGh2aYUhtAgX9dhVHfQnTADH4svDeM6gcXnL7aFGeAi1NYwipDMyS + dest: jquery.hoverIntent.js + +jquery.jStorage: + type: file + src: https://raw.githubusercontent.com/andris9/jStorage/v0.4.12/jstorage.js + integrity: sha384-geMeN8k803kPp6cqRL4VNfuSM1L8DcbKRk0St/KHJzxgpX9S0y9FA6HxA/JgucrJ + dest: jstorage.js + +jquery.throttle-debounce: + type: file + src: https://raw.githubusercontent.com/cowboy/jquery-throttle-debounce/v1.1/jquery.ba-throttle-debounce.js + integrity: sha384-ULOy4DbAghrCqRcrTJLXOY9e4gDpWh0BeEf6xMSL0VtNudXWggcb6AmrVrl4KDAP + dest: jquery.ba-throttle-debounce.js + moment: type: tar src: https://codeload.github.com/moment/moment/tar.gz/2.24.0 diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php index 51c52be619..9f5f1afd23 100644 --- a/maintenance/runJobs.php +++ b/maintenance/runJobs.php @@ -99,6 +99,10 @@ class RunJobs extends Maintenance { $response['reached'] === 'job-limit' || $response['reached'] === 'memory-limit' ) { + // If job queue is empty, output it + if ( $response['jobs'] === [] ) { + $this->output( "Job queue is empty.\n" ); + } break; } diff --git a/resources/Resources.php b/resources/Resources.php index 86bca6c6c0..5e5f3087f3 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -223,10 +223,10 @@ return [ 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.form' => [ - 'scripts' => 'resources/lib/jquery.form.js', + 'scripts' => 'resources/lib/jquery.form/jquery.form.js', ], 'jquery.fullscreen' => [ - 'scripts' => 'resources/lib/jquery.fullscreen.js', + 'scripts' => 'resources/lib/jquery.fullscreen/jquery.fullscreen.js', ], 'jquery.getAttrs' => [ 'scripts' => 'resources/src/jquery/jquery.getAttrs.js', @@ -240,7 +240,7 @@ return [ 'targets' => [ 'desktop', 'mobile' ], ], 'jquery.hoverIntent' => [ - 'scripts' => 'resources/lib/jquery.hoverIntent.js', + 'scripts' => 'resources/lib/jquery.hoverIntent/jquery.hoverIntent.js', ], 'jquery.i18n' => [ 'scripts' => [ @@ -299,7 +299,7 @@ return [ ], 'jquery.jStorage' => [ 'deprecated' => 'Please use "mediawiki.storage" instead.', - 'scripts' => 'resources/lib/jquery.jStorage.js', + 'scripts' => 'resources/lib/jquery.jStorage/jstorage.js', ], 'jquery.suggestions' => [ 'targets' => [ 'desktop', 'mobile' ], @@ -332,7 +332,7 @@ return [ 'jquery.throttle-debounce' => [ 'deprecated' => 'Please use OO.ui.throttle/debounce instead. See ' . 'https://phabricator.wikimedia.org/T213426', - 'scripts' => 'resources/lib/jquery.ba-throttle-debounce.js', + 'scripts' => 'resources/lib/jquery.throttle-debounce/jquery.ba-throttle-debounce.js', 'targets' => [ 'desktop', 'mobile' ], ], @@ -1776,6 +1776,17 @@ return [ 'actioncomplete', ], ], + 'mediawiki.page.rollback.confirmation' => [ + 'scripts' => 'resources/src/mediawiki.rollback.confirmation.js', + 'dependencies' => [ + 'jquery.confirmable' + ], + 'messages' => [ + 'rollback-confirmation-confirm', + 'rollback-confirmation-yes', + 'rollback-confirmation-no', + ], + ], 'mediawiki.page.image.pagination' => [ 'scripts' => 'resources/src/mediawiki.page.image.pagination.js', 'dependencies' => [ diff --git a/resources/lib/jquery.ba-throttle-debounce.js b/resources/lib/jquery.ba-throttle-debounce.js deleted file mode 100644 index fa30bdfffe..0000000000 --- a/resources/lib/jquery.ba-throttle-debounce.js +++ /dev/null @@ -1,252 +0,0 @@ -/*! - * jQuery throttle / debounce - v1.1 - 3/7/2010 - * http://benalman.com/projects/jquery-throttle-debounce-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ - -// Script: jQuery throttle / debounce: Sometimes, less is more! -// -// *Version: 1.1, Last updated: 3/7/2010* -// -// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/ -// GitHub - http://github.com/cowboy/jquery-throttle-debounce/ -// Source - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js -// (Minified) - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb) -// -// About: License -// -// Copyright (c) 2010 "Cowboy" Ben Alman, -// Dual licensed under the MIT and GPL licenses. -// http://benalman.com/about/license/ -// -// About: Examples -// -// These working examples, complete with fully commented code, illustrate a few -// ways in which this plugin can be used. -// -// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/ -// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ -// -// About: Support and Testing -// -// Information about what version or versions of jQuery this plugin has been -// tested with, what browsers it has been tested in, and where the unit tests -// reside (so you can test it yourself). -// -// jQuery Versions - none, 1.3.2, 1.4.2 -// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1. -// Unit Tests - http://benalman.com/code/projects/jquery-throttle-debounce/unit/ -// -// About: Release History -// -// 1.1 - (3/7/2010) Fixed a bug in where trailing callbacks -// executed later than they should. Reworked a fair amount of internal -// logic as well. -// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over -// from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the -// no_trailing throttle parameter and debounce functionality. -// -// Topic: Note for non-jQuery users -// -// jQuery isn't actually required for this plugin, because nothing internal -// uses any jQuery methods or properties. jQuery is just used as a namespace -// under which these methods can exist. -// -// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist -// when this plugin is loaded, the method described below will be created in -// the `Cowboy` namespace. Usage will be exactly the same, but instead of -// $.method() or jQuery.method(), you'll need to use Cowboy.method(). - -(function(window,undefined){ - '$:nomunge'; // Used by YUI compressor. - - // Since jQuery really isn't required for this plugin, use `jQuery` as the - // namespace only if it already exists, otherwise use the `Cowboy` namespace, - // creating it if necessary. - var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ), - - // Internal method reference. - jq_throttle; - - // Method: jQuery.throttle - // - // Throttle execution of a function. Especially useful for rate limiting - // execution of handlers on events like resize and scroll. If you want to - // rate-limit execution of a function to a single time, see the - // method. - // - // In this visualization, | is a throttled-function call and X is the actual - // callback execution: - // - // > Throttled with `no_trailing` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X X X - // > - // > Throttled with `no_trailing` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X - // - // Usage: - // - // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', throttled ); - // > jQuery('selector').unbind( 'someevent', throttled ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // no_trailing - (Boolean) Optional, defaults to false. If no_trailing is - // true, callback will only execute every `delay` milliseconds while the - // throttled-function is being called. If no_trailing is false or - // unspecified, callback will be executed one final time after the last - // throttled-function call. (After the throttled-function has not been - // called for `delay` milliseconds, the internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the throttled-function is executed. - // - // Returns: - // - // (Function) A new, throttled, function. - - $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) { - // After wrapper has stopped being called, this timeout ensures that - // `callback` is executed at the proper times in `throttle` and `end` - // debounce modes. - var timeout_id, - - // Keep track of the last time `callback` was executed. - last_exec = 0; - - // `no_trailing` defaults to falsy. - if ( typeof no_trailing !== 'boolean' ) { - debounce_mode = callback; - callback = no_trailing; - no_trailing = undefined; - } - - // The `wrapper` function encapsulates all of the throttling / debouncing - // functionality and when executed will limit the rate at which `callback` - // is executed. - function wrapper() { - var that = this, - elapsed = +new Date() - last_exec, - args = arguments; - - // Execute `callback` and update the `last_exec` timestamp. - function exec() { - last_exec = +new Date(); - callback.apply( that, args ); - }; - - // If `debounce_mode` is true (at_begin) this is used to clear the flag - // to allow future `callback` executions. - function clear() { - timeout_id = undefined; - }; - - if ( debounce_mode && !timeout_id ) { - // Since `wrapper` is being called for the first time and - // `debounce_mode` is true (at_begin), execute `callback`. - exec(); - } - - // Clear any existing timeout. - timeout_id && clearTimeout( timeout_id ); - - if ( debounce_mode === undefined && elapsed > delay ) { - // In throttle mode, if `delay` time has been exceeded, execute - // `callback`. - exec(); - - } else if ( no_trailing !== true ) { - // In trailing throttle mode, since `delay` time has not been - // exceeded, schedule `callback` to execute `delay` ms after most - // recent execution. - // - // If `debounce_mode` is true (at_begin), schedule `clear` to execute - // after `delay` ms. - // - // If `debounce_mode` is false (at end), schedule `callback` to - // execute after `delay` ms. - timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay ); - } - }; - - // Set the guid of `wrapper` function to the same of original callback, so - // it can be removed in jQuery 1.4+ .unbind or .die by using the original - // callback as a reference. - if ( $.guid ) { - wrapper.guid = callback.guid = callback.guid || $.guid++; - } - - // Return the wrapper function. - return wrapper; - }; - - // Method: jQuery.debounce - // - // Debounce execution of a function. Debouncing, unlike throttling, - // guarantees that a function is only executed a single time, either at the - // very beginning of a series of calls, or at the very end. If you want to - // simply rate-limit execution of a function, see the - // method. - // - // In this visualization, | is a debounced-function call and X is the actual - // callback execution: - // - // > Debounced with `at_begin` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // > - // > Debounced with `at_begin` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // - // Usage: - // - // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', debounced ); - // > jQuery('selector').unbind( 'someevent', debounced ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // at_begin - (Boolean) Optional, defaults to false. If at_begin is false or - // unspecified, callback will only be executed `delay` milliseconds after - // the last debounced-function call. If at_begin is true, callback will be - // executed only at the first debounced-function call. (After the - // throttled-function has not been called for `delay` milliseconds, the - // internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the debounced-function is executed. - // - // Returns: - // - // (Function) A new, debounced, function. - - $.debounce = function( delay, at_begin, callback ) { - return callback === undefined - ? jq_throttle( delay, at_begin, false ) - : jq_throttle( delay, callback, at_begin !== false ); - }; - -})(this); diff --git a/resources/lib/jquery.form.js b/resources/lib/jquery.form.js deleted file mode 100644 index 13e9a55c58..0000000000 --- a/resources/lib/jquery.form.js +++ /dev/null @@ -1,1089 +0,0 @@ -/*! - * jQuery Form Plugin - * version: 3.14 (30-JUL-2012) - * @requires jQuery v1.3.2 or later - * - * Examples and documentation at: http://malsup.com/jquery/form/ - * Project repository: https://github.com/malsup/form - * Dual licensed under the MIT and GPL licenses: - * http://malsup.github.com/mit-license.txt - * http://malsup.github.com/gpl-license-v2.txt - */ -/*global ActiveXObject alert */ -;(function($) { -"use strict"; - -/* - Usage Note: - ----------- - Do not use both ajaxSubmit and ajaxForm on the same form. These - functions are mutually exclusive. Use ajaxSubmit if you want - to bind your own submit handler to the form. For example, - - $(document).ready(function() { - $('#myForm').on('submit', function(e) { - e.preventDefault(); // <-- important - $(this).ajaxSubmit({ - target: '#output' - }); - }); - }); - - Use ajaxForm when you want the plugin to manage all the event binding - for you. For example, - - $(document).ready(function() { - $('#myForm').ajaxForm({ - target: '#output' - }); - }); - - You can also use ajaxForm with delegation (requires jQuery v1.7+), so the - form does not have to exist when you invoke ajaxForm: - - $('#myForm').ajaxForm({ - delegation: true, - target: '#output' - }); - - When using ajaxForm, the ajaxSubmit function will be invoked for you - at the appropriate time. -*/ - -/** - * Feature detection - */ -var feature = {}; -feature.fileapi = $("").get(0).files !== undefined; -feature.formdata = window.FormData !== undefined; - -/** - * ajaxSubmit() provides a mechanism for immediately submitting - * an HTML form using AJAX. - */ -$.fn.ajaxSubmit = function(options) { - /*jshint scripturl:true */ - - // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) - if (!this.length) { - log('ajaxSubmit: skipping submit process - no element selected'); - return this; - } - - var method, action, url, $form = this; - - if (typeof options == 'function') { - options = { success: options }; - } - - method = this.attr('method'); - action = this.attr('action'); - url = (typeof action === 'string') ? $.trim(action) : ''; - url = url || window.location.href || ''; - if (url) { - // clean url (don't include hash vaue) - url = (url.match(/^([^#]+)/)||[])[1]; - } - - options = $.extend(true, { - url: url, - success: $.ajaxSettings.success, - type: method || 'GET', - iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' - }, options); - - // hook for manipulating the form data before it is extracted; - // convenient for use with rich editors like tinyMCE or FCKEditor - var veto = {}; - this.trigger('form-pre-serialize', [this, options, veto]); - if (veto.veto) { - log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); - return this; - } - - // provide opportunity to alter form data before it is serialized - if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { - log('ajaxSubmit: submit aborted via beforeSerialize callback'); - return this; - } - - var traditional = options.traditional; - if ( traditional === undefined ) { - traditional = $.ajaxSettings.traditional; - } - - var elements = []; - var qx, a = this.formToArray(options.semantic, elements); - if (options.data) { - options.extraData = options.data; - qx = $.param(options.data, traditional); - } - - // give pre-submit callback an opportunity to abort the submit - if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { - log('ajaxSubmit: submit aborted via beforeSubmit callback'); - return this; - } - - // fire vetoable 'validate' event - this.trigger('form-submit-validate', [a, this, options, veto]); - if (veto.veto) { - log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); - return this; - } - - var q = $.param(a, traditional); - if (qx) { - q = ( q ? (q + '&' + qx) : qx ); - } - if (options.type.toUpperCase() == 'GET') { - options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; - options.data = null; // data is null for 'get' - } - else { - options.data = q; // data is the query string for 'post' - } - - var callbacks = []; - if (options.resetForm) { - callbacks.push(function() { $form.resetForm(); }); - } - if (options.clearForm) { - callbacks.push(function() { $form.clearForm(options.includeHidden); }); - } - - // perform a load on the target only if dataType is not provided - if (!options.dataType && options.target) { - var oldSuccess = options.success || function(){}; - callbacks.push(function(data) { - var fn = options.replaceTarget ? 'replaceWith' : 'html'; - $(options.target)[fn](data).each(oldSuccess, arguments); - }); - } - else if (options.success) { - callbacks.push(options.success); - } - - options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg - var context = options.context || this ; // jQuery 1.4+ supports scope context - for (var i=0, max=callbacks.length; i < max; i++) { - callbacks[i].apply(context, [data, status, xhr || $form, $form]); - } - }; - - // are there files to upload? - var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113) - var hasFileInputs = fileInputs.length > 0; - var mp = 'multipart/form-data'; - var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); - - var fileAPI = feature.fileapi && feature.formdata; - log("fileAPI :" + fileAPI); - var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; - - // options.iframe allows user to force iframe mode - // 06-NOV-09: now defaulting to iframe mode if file input is detected - if (options.iframe !== false && (options.iframe || shouldUseFrame)) { - // hack to fix Safari hang (thanks to Tim Molendijk for this) - // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d - if (options.closeKeepAlive) { - $.get(options.closeKeepAlive, function() { - fileUploadIframe(a); - }); - } - else { - fileUploadIframe(a); - } - } - else if ((hasFileInputs || multipart) && fileAPI) { - fileUploadXhr(a); - } - else { - $.ajax(options); - } - - // clear element array - for (var k=0; k < elements.length; k++) - elements[k] = null; - - // fire 'notify' event - this.trigger('form-submit-notify', [this, options]); - return this; - - // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) - function fileUploadXhr(a) { - var formdata = new FormData(); - - for (var i=0; i < a.length; i++) { - formdata.append(a[i].name, a[i].value); - } - - if (options.extraData) { - for (var p in options.extraData) - if (options.extraData.hasOwnProperty(p)) - formdata.append(p, options.extraData[p]); - } - - options.data = null; - - var s = $.extend(true, {}, $.ajaxSettings, options, { - contentType: false, - processData: false, - cache: false, - type: 'POST' - }); - - if (options.uploadProgress) { - // workaround because jqXHR does not expose upload property - s.xhr = function() { - var xhr = jQuery.ajaxSettings.xhr(); - if (xhr.upload) { - xhr.upload.onprogress = function(event) { - var percent = 0; - var position = event.loaded || event.position; /*event.position is deprecated*/ - var total = event.total; - if (event.lengthComputable) { - percent = Math.ceil(position / total * 100); - } - options.uploadProgress(event, position, total, percent); - }; - } - return xhr; - }; - } - - s.data = null; - var beforeSend = s.beforeSend; - s.beforeSend = function(xhr, o) { - o.data = formdata; - if(beforeSend) - beforeSend.call(this, xhr, o); - }; - $.ajax(s); - } - - // private function for handling file uploads (hat tip to YAHOO!) - function fileUploadIframe(a) { - var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; - var useProp = !!$.fn.prop; - - if ($(':input[name=submit],:input[id=submit]', form).length) { - // if there is an input with a name or id of 'submit' then we won't be - // able to invoke the submit fn on the form (at least not x-browser) - alert('Error: Form elements must not have name or id of "submit".'); - return; - } - - if (a) { - // ensure that every serialized input is still enabled - for (i=0; i < elements.length; i++) { - el = $(elements[i]); - if ( useProp ) - el.prop('disabled', false); - else - el.removeAttr('disabled'); - } - } - - s = $.extend(true, {}, $.ajaxSettings, options); - s.context = s.context || s; - id = 'jqFormIO' + (new Date().getTime()); - if (s.iframeTarget) { - $io = $(s.iframeTarget); - n = $io.attr('name'); - if (!n) - $io.attr('name', id); - else - id = n; - } - else { - $io = $('