From: jenkins-bot Date: Tue, 29 Oct 2013 22:42:17 +0000 (+0000) Subject: Merge "Improve logging for wfShellExec() and ignore missing cgroup" X-Git-Tag: 1.31.0-rc.0~18349 X-Git-Url: https://git.cyclocoop.org/%242?a=commitdiff_plain;h=51f2a693af7523bc055e31e4c1b3ddd766a3e9de;hp=e53af95c9301ca092ffa1f7de022beb24d60ea52;p=lhc%2Fweb%2Fwiklou.git Merge "Improve logging for wfShellExec() and ignore missing cgroup" --- diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22 index 0015d2944a..958da48c62 100644 --- a/RELEASE-NOTES-1.22 +++ b/RELEASE-NOTES-1.22 @@ -61,6 +61,10 @@ production. * The precise format of metric datagrams produced by the UDP profiler and stats counter may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString, respectively. +* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and + $wgProxyMemcExpiry have been removed, along with the open proxy scanner + script they were added for. +* Default value of $wgMaxShellMemory has been tripled (it's now 300 MB). === New features in 1.22 === * (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes. @@ -73,6 +77,8 @@ production. version of the Vector extension as this feature may conflict. * New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a compact vertical form layout. +* HTMLForm supports a new display format 'vform' which applies this compact vertical + layout and button styling. Special:PasswordReset uses this format. * New versions of login (Special:UserLogin) and create account (Special:UserLogin/signup) forms using the "vform" compact vertical form layout. These forms use new messages that assume a "Help logging in" link, see @@ -242,6 +248,20 @@ production. * Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php. * Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify the output of the API query meta=siteinfo&siprop=statistics +* Primary keys have been added to both the archive table and the externallinks + tables. +* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is + output in a HTML comment. +* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object + instead of just a boolean return value to abort the hook. +* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions + with custom recentchanges entries to hook into the Watchlist without + clobbering each other. +* A hidden, empty input field was added to the edit form, and any edit that fills + it in will be rejected. This prevents against the simplest form of spambots. + Previously in the "SimpleAntiSpam" extension by Ryan Schmidt. +* populateRevisionLength.php maintenance script updated to also populate + archive.ar_len field. === Bug fixes in 1.22 === * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one @@ -326,6 +346,9 @@ production. database is created. * (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index" MySQL error when installing using the binary character set option. +* (bug 45288) Support mysqli PHP extension +* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug. + This resolves an infinite loop when using $wgDebugFunctionEntry = true. === API changes in 1.22 === * (bug 25553) The JSON output formatter now leaves forward slashes unescaped @@ -364,7 +387,7 @@ production. user blocks. * (bug 48201) action=parse&text=foo now assumes wikitext if no title is given, rather than using the content model of the page "API". -* action=watch may now return errors. +* action=watch no longer silently ignores hook abort. * (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks jobs in the job queue for link table updates of pages that use the given page as a template. Instead, forcerecursivelinkupdate=1 is introduced and should @@ -502,6 +525,10 @@ changes to languages because of Bugzilla reports. to the Vector skin in core. * SpecialRecentChanges::addRecentChangesJS() function has been renamed to addModules() and made protected. +* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status + object instead of a boolean. +* Information boxes (CSS classes errorbox, warningbox, successbox) have been + made more subtle. == Compatibility == diff --git a/RELEASE-NOTES-1.23 b/RELEASE-NOTES-1.23 new file mode 100644 index 0000000000..6c7825388b --- /dev/null +++ b/RELEASE-NOTES-1.23 @@ -0,0 +1,100 @@ +Security reminder: MediaWiki does not require PHP's register_globals. If you +have it on, turn it '''off''' if you can. + +== MediaWiki 1.23 == + +THIS IS NOT A RELEASE YET + +MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in +production. + +=== Configuration changes in 1.23 === + +=== New features in 1.23 === +* ResourceLoader can utilize the Web Storage API to cache modules client-side. + Compared to the browser cache, caching in Web Storage allows ResourceLoader + to be more granular about evicting stale modules from the cache while + retaining the ability to retrieve multiple modules in a single HTTP request. + This capability can be enabled by setting $wgResourceLoaderStorageEnabled to + true. This feature is currently considered experimental and should only be + enabled with care. + +=== Bug fixes in 1.23 === +* (bug 41759) The "updated since last visit" markers (on history pages, recent + changes and watchlist) and the talk page message indicator are now correctly + updated when the user is viewing old revisions of pages, instead of always + acting as if the latest revision was being viewed. + +=== API changes in 1.23 === + +=== Languages updated in 1.23=== + +MediaWiki supports over 350 languages. Many localisations are updated +regularly. Below only new and removed languages are listed, as well as +changes to languages because of Bugzilla reports. + +=== Other changes in 1.23 === + +== Compatibility == + +MediaWiki 1.23 requires PHP 5.3.2 or later. + +MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but +support for them is somewhat less mature. There is experimental support for +Oracle. + +The supported versions are: + +* MySQL 5.0.2 or later +* PostgreSQL 8.3 or later +* SQLite 3.3.7 or later +* Oracle 9.0.1 or later + +== Upgrading == + +1.23 has several database changes since 1.22, 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). + +If upgrading from before 1.11, and you are using a wiki as a commons +repository, make sure that it is updated as well. Otherwise, errors may arise +due to database schema changes. + +If upgrading from before 1.7, you may want to run refreshLinks.php to ensure +new database fields are filled with data. + +If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to +1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed +with MediaWiki 1.21. + +Don't forget to always back up your database before upgrading! + +See the file UPGRADE for more detailed upgrade instructions. + +For notes on 1.21.x and older releases, see HISTORY. + +== Online documentation == + +Documentation for both end-users and site administrators is available on +MediaWiki.org, and is covered under the GNU Free Documentation License (except +for pages that explicitly state that their contents are in the public domain): + + https://www.mediawiki.org/wiki/Documentation + +== Mailing list == + +A mailing list is available for MediaWiki user support and discussion: + + https://lists.wikimedia.org/mailman/listinfo/mediawiki-l + +A low-traffic announcements-only list is also available: + + https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce + +It's highly recommended that you sign up for one of these lists if you're +going to run a public MediaWiki, so you can be notified of security fixes. + +== IRC help == + +There's usually someone online in #mediawiki on irc.freenode.net. diff --git a/docs/hooks.txt b/docs/hooks.txt index 53993de162..84888d2756 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -866,10 +866,6 @@ etc. 'DatabaseOraclePostInit': Called after initialising an Oracle database &$db: the DatabaseOracle object -'Debug': Called when outputting a debug log line via wfDebug() or wfDebugLog() -$text: plaintext string to be output -$group: null or a string naming a logging group (as defined in $wgDebugLogGroups) - 'NewDifferenceEngine': Called when a new DifferenceEngine object is made $title: the diff page title (nullable) &$oldId: the actual old Id to use in the diff @@ -1161,6 +1157,16 @@ $title: Title object that we need to get a sortkey for underscore) magic words. Called by MagicWord. &$doubleUnderscoreIDs: array of strings +'GetExtendedMetadata': Get extended file metadata for the API +&$combinedMeta: Array of the form: 'MetadataPropName' => array( +'value' => prop value, 'source' => 'name of hook' ). +$file: File object of file in question +$context: RequestContext (including language to use) +$single: Only extract the current language; if false, the prop value should +be in the metadata multi-language array format: +mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format +&$maxCacheTime: how long the results can be cached + 'GetFullURL': Modify fully-qualified URLs used in redirects/export/offsite data. $title: Title object of page $url: string value as output (out parameter, can modify) @@ -2369,6 +2375,11 @@ $special: the special page object &$fields: array of query fields $values: array of variables with watchlist options +'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for +SpecialWatchlist. Allows extensions to register custom values they have +inserted to rc_type so they can be returned as part of the watchlist. +&$nonRevisionTypes: array of values in the rc_type field of recentchanges table + 'TestCanonicalRedirect': Called when about to force a redirect to a canonical URL for a title when we have no other parameters on the URL. Gives a chance for extensions that alter page view behavior radically to abort that redirect or @@ -2578,6 +2589,7 @@ $user: User (object) whose permission is being checked 'UserClearNewTalkNotification': Called when clearing the "You have new messages!" message, return false to not delete it. $user: User (object) that will clear the message +$oldid: ID of the talk page revision being viewed (0 means the most recent one) 'UserComparePasswords': Called when checking passwords, return false to override the default password checks. @@ -2742,6 +2754,12 @@ $userId: User id of the current user $userText: User name of the current user &$items: Array of user tool links as HTML fragments +'ValidateExtendedMetadataCache': Called to validate the cached metadata in +FormatMetadata::getExtendedMeta (return false means cache will be +invalidated and GetExtendedMetadata hook called again). +$timestamp: The timestamp metadata was generated +$file: The file the metadata is for + 'WantedPages::getQueryInfo': Called in WantedPagesPage::getQueryInfo(), can be used to alter the SQL query which gets the list of wanted pages. &$wantedPages: WantedPagesPage object diff --git a/includes/Article.php b/includes/Article.php index 0b18221a0a..928fda0a98 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -586,7 +586,7 @@ class Article implements Page { wfDebug( __METHOD__ . ": done file cache\n" ); # tell wgOut that output is taken care of $outputPage->disable(); - $this->mPage->doViewUpdates( $user ); + $this->mPage->doViewUpdates( $user, $oldid ); wfProfileOut( __METHOD__ ); return; @@ -765,7 +765,7 @@ class Article implements Page { $outputPage->setFollowPolicy( $policy['follow'] ); $this->showViewFooter(); - $this->mPage->doViewUpdates( $user ); + $this->mPage->doViewUpdates( $user, $oldid ); $outputPage->addModules( 'mediawiki.action.view.postEdit' ); @@ -815,10 +815,10 @@ class Article implements Page { $this->mRevIdFetched = $de->mNewid; $de->showDiffPage( $diffOnly ); - if ( $diff == 0 || $diff == $this->mPage->getLatest() ) { - # Run view updates for current revision only - $this->mPage->doViewUpdates( $user ); - } + // Run view updates for the newer revision being diffed (and shown below the diff if not $diffOnly) + list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff ); + // New can be false, convert it to 0 - this conveniently means the latest revision + $this->mPage->doViewUpdates( $user, (int)$new ); } /** diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 8d571ad023..dbba50007c 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -55,7 +55,6 @@ $wgAutoloadLocalClasses = array( 'CdbWriter_DBA' => 'includes/Cdb.php', 'CdbWriter_PHP' => 'includes/Cdb_PHP.php', 'ChangesFeed' => 'includes/ChangesFeed.php', - 'ChangesList' => 'includes/ChangesList.php', 'ChangeTags' => 'includes/ChangeTags.php', 'ChannelFeed' => 'includes/Feed.php', 'Collation' => 'includes/Collation.php', @@ -87,7 +86,6 @@ $wgAutoloadLocalClasses = array( 'DumpPipeOutput' => 'includes/Export.php', 'EditPage' => 'includes/EditPage.php', 'EmailNotification' => 'includes/UserMailer.php', - 'EnhancedChangesList' => 'includes/ChangesList.php', 'ErrorPageError' => 'includes/Exception.php', 'ExplodeIterator' => 'includes/StringUtils.php', 'FakeTitle' => 'includes/FakeTitle.php', @@ -178,7 +176,6 @@ $wgAutoloadLocalClasses = array( 'MWHttpRequest' => 'includes/HttpFunctions.php', 'MWInit' => 'includes/Init.php', 'MWNamespace' => 'includes/Namespace.php', - 'OldChangesList' => 'includes/ChangesList.php', 'OutputPage' => 'includes/OutputPage.php', 'Page' => 'includes/WikiPage.php', 'PageQueryPage' => 'includes/PageQueryPage.php', @@ -200,10 +197,8 @@ $wgAutoloadLocalClasses = array( 'QueryPage' => 'includes/QueryPage.php', 'QuickTemplate' => 'includes/SkinTemplate.php', 'RawMessage' => 'includes/Message.php', - 'RCCacheEntry' => 'includes/ChangesList.php', 'RdfMetaData' => 'includes/Metadata.php', 'ReadOnlyError' => 'includes/Exception.php', - 'RecentChange' => 'includes/RecentChange.php', 'RedirectSpecialArticle' => 'includes/SpecialPage.php', 'RedirectSpecialPage' => 'includes/SpecialPage.php', 'RegexlikeReplacer' => 'includes/StringUtils.php', @@ -457,6 +452,13 @@ $wgAutoloadLocalClasses = array( 'TitleDependency' => 'includes/cache/CacheDependency.php', 'TitleListDependency' => 'includes/cache/CacheDependency.php', + # includes/changes + 'ChangesList' => 'includes/changes/ChangesList.php', + 'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php', + 'OldChangesList' => 'includes/changes/OldChangesList.php', + 'RCCacheEntry' => 'includes/changes/RCCacheEntry.php', + 'RecentChange' => 'includes/changes/RecentChange.php', + # includes/clientpool 'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php', 'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php', @@ -479,6 +481,7 @@ $wgAutoloadLocalClasses = array( 'DatabaseMssql' => 'includes/db/DatabaseMssql.php', 'DatabaseMysql' => 'includes/db/DatabaseMysql.php', 'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php', + 'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php', 'DatabaseOracle' => 'includes/db/DatabaseOracle.php', 'DatabasePostgres' => 'includes/db/DatabasePostgres.php', 'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php', @@ -848,6 +851,7 @@ $wgAutoloadLocalClasses = array( # includes/rcfeed 'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php', + 'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php', 'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php', 'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php', 'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php', @@ -970,7 +974,6 @@ $wgAutoloadLocalClasses = array( 'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php', 'SpecialBlock' => 'includes/specials/SpecialBlock.php', 'SpecialBlockList' => 'includes/specials/SpecialBlockList.php', - 'SpecialBlockme' => 'includes/specials/SpecialBlockme.php', 'SpecialBookSources' => 'includes/specials/SpecialBooksources.php', 'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php', 'SpecialCategories' => 'includes/specials/SpecialCategories.php', @@ -1133,6 +1136,8 @@ $wgAutoloadLocalClasses = array( ); class AutoLoader { + static $autoloadLocalClassesLower = null; + /** * autoload - take a class name and attempt to load it * @@ -1142,7 +1147,8 @@ class AutoLoader { * as well. */ static function autoload( $className ) { - global $wgAutoloadClasses, $wgAutoloadLocalClasses; + global $wgAutoloadClasses, $wgAutoloadLocalClasses, + $wgAutoloadAttemptLowercase; // Workaround for PHP bug (5.3.2. is broken, it's // fixed in 5.3.6). Strip leading backslashes from class names. When namespaces are used, @@ -1157,26 +1163,37 @@ class AutoLoader { $filename = $wgAutoloadLocalClasses[$className]; } elseif ( isset( $wgAutoloadClasses[$className] ) ) { $filename = $wgAutoloadClasses[$className]; - } else { - # Try a different capitalisation - # The case can sometimes be wrong when unserializing PHP 4 objects + } elseif ( $wgAutoloadAttemptLowercase ) { + /* + * Try a different capitalisation. + * + * PHP 4 objects are always serialized with the classname coerced to lowercase, + * and we are plagued with several legacy uses created by MediaWiki < 1.5, see + * https://wikitech.wikimedia.org/wiki/Text_storage_data + */ $filename = false; $lowerClass = strtolower( $className ); - foreach ( $wgAutoloadLocalClasses as $class2 => $file2 ) { - if ( strtolower( $class2 ) == $lowerClass ) { - $filename = $file2; - } + if ( self::$autoloadLocalClassesLower === null ) { + self::$autoloadLocalClassesLower = array_change_key_case( $wgAutoloadLocalClasses, CASE_LOWER ); } - if ( !$filename ) { + if ( isset( self::$autoloadLocalClassesLower[$lowerClass] ) ) { if ( function_exists( 'wfDebug' ) ) { - wfDebug( "Class {$className} not found; skipped loading\n" ); + wfDebug( "Class {$className} was loaded using incorrect case.\n" ); } + $filename = self::$autoloadLocalClassesLower[$lowerClass]; + } + } - # Give up - return false; + if ( !$filename ) { + if ( function_exists( 'wfDebug' ) ) { + # FIXME: This is not very polite. Assume we do not manage the class. + wfDebug( "Class {$className} not found; skipped loading\n" ); } + + # Give up + return false; } # Make an absolute path, this improves performance by avoiding some stat calls diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php index 3fc27f9a22..7ec641d9d6 100644 --- a/includes/ChangeTags.php +++ b/includes/ChangeTags.php @@ -232,7 +232,7 @@ class ChangeTags { } $data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMessage( 'tag-filter' )->parse() ), - Xml::input( 'tagfilter', 20, $selected, array( 'class' => 'mw-tagfilter-input' ) ) ); + Xml::input( 'tagfilter', 20, $selected, array( 'class' => 'mw-tagfilter-input', 'id' => 'tagfilter' ) ) ); if ( !$fullForm ) { return $data; diff --git a/includes/ChangesList.php b/includes/ChangesList.php deleted file mode 100644 index 9c441afaaf..0000000000 --- a/includes/ChangesList.php +++ /dev/null @@ -1,1334 +0,0 @@ -mAttribs = $rc->mAttribs; - $rc2->mExtra = $rc->mExtra; - return $rc2; - } -} - -/** - * Base class for all changes lists - */ -class ChangesList extends ContextSource { - - /** - * @var Skin - */ - public $skin; - - protected $watchlist = false; - - protected $message; - - /** - * Changeslist constructor - * - * @param $obj Skin or IContextSource - */ - public function __construct( $obj ) { - if ( $obj instanceof IContextSource ) { - $this->setContext( $obj ); - $this->skin = $obj->getSkin(); - } else { - $this->setContext( $obj->getContext() ); - $this->skin = $obj; - } - $this->preCacheMessages(); - } - - /** - * Fetch an appropriate changes list class for the main context - * This first argument used to be an User object. - * - * @deprecated in 1.18; use newFromContext() instead - * @param string|User $unused Unused - * @return ChangesList|EnhancedChangesList|OldChangesList derivative - */ - public static function newFromUser( $unused ) { - wfDeprecated( __METHOD__, '1.18' ); - return self::newFromContext( RequestContext::getMain() ); - } - - /** - * Fetch an appropriate changes list class for the specified context - * Some users might want to use an enhanced list format, for instance - * - * @param $context IContextSource to use - * @return ChangesList|EnhancedChangesList|OldChangesList derivative - */ - public static function newFromContext( IContextSource $context ) { - $user = $context->getUser(); - $sk = $context->getSkin(); - $list = null; - if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) { - $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) ); - return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context ); - } else { - return $list; - } - } - - /** - * Sets the list to use a "
  • " tag - * @param $value Boolean - */ - public function setWatchlistDivs( $value = true ) { - $this->watchlist = $value; - } - - /** - * As we use the same small set of messages in various methods and that - * they are called often, we call them once and save them in $this->message - */ - private function preCacheMessages() { - if ( !isset( $this->message ) ) { - foreach ( array( - 'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history', - 'semicolon-separator', 'pipe-separator' ) as $msg - ) { - $this->message[$msg] = $this->msg( $msg )->escaped(); - } - } - } - - /** - * Returns the appropriate flags for new page, minor change and patrolling - * @param array $flags Associative array of 'flag' => Bool - * @param string $nothing to use for empty space - * @return String - */ - public function recentChangesFlags( $flags, $nothing = ' ' ) { - global $wgRecentChangesFlags; - $f = ''; - foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) { - $f .= isset( $flags[$flag] ) && $flags[$flag] - ? self::flag( $flag ) - : $nothing; - } - return $f; - } - - /** - * Provide the "" element appropriate to a given abbreviated flag, - * namely the flag indicating a new page, a minor edit, a bot edit, or an - * unpatrolled edit. By default in English it will contain "N", "m", "b", - * "!" respectively, plus it will have an appropriate title and class. - * - * @param string $flag One key of $wgRecentChangesFlags - * @return String: Raw HTML - */ - public static function flag( $flag ) { - static $flagInfos = null; - if ( is_null( $flagInfos ) ) { - global $wgRecentChangesFlags; - $flagInfos = array(); - foreach ( $wgRecentChangesFlags as $key => $value ) { - $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped(); - $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped(); - // Allow customized class name, fall back to flag name - $flagInfos[$key]['class'] = Sanitizer::escapeClass( - isset( $value['class'] ) ? $value['class'] : $key ); - } - } - - // Inconsistent naming, bleh, kepted for b/c - $map = array( - 'minoredit' => 'minor', - 'botedit' => 'bot', - ); - if ( isset( $map[$flag] ) ) { - $flag = $map[$flag]; - } - - return "" . - $flagInfos[$flag]['letter'] . - ''; - } - - /** - * Returns text for the start of the tabular part of RC - * @return String - */ - public function beginRecentChangesList() { - $this->rc_cache = array(); - $this->rcMoveIndex = 0; - $this->rcCacheIndex = 0; - $this->lastdate = ''; - $this->rclistOpen = false; - $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' ); - return ''; - } - - /** - * Show formatted char difference - * @param $old Integer: bytes - * @param $new Integer: bytes - * @param $context IContextSource context to use - * @return String - */ - public static function showCharacterDifference( $old, $new, IContextSource $context = null ) { - global $wgRCChangedSizeThreshold, $wgMiserMode; - - if ( !$context ) { - $context = RequestContext::getMain(); - } - - $new = (int)$new; - $old = (int)$old; - $szdiff = $new - $old; - - $lang = $context->getLanguage(); - $code = $lang->getCode(); - static $fastCharDiff = array(); - if ( !isset( $fastCharDiff[$code] ) ) { - $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1'; - } - - $formattedSize = $lang->formatNum( $szdiff ); - - if ( !$fastCharDiff[$code] ) { - $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text(); - } - - if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) { - $tag = 'strong'; - } else { - $tag = 'span'; - } - - if ( $szdiff === 0 ) { - $formattedSizeClass = 'mw-plusminus-null'; - } - if ( $szdiff > 0 ) { - $formattedSize = '+' . $formattedSize; - $formattedSizeClass = 'mw-plusminus-pos'; - } - if ( $szdiff < 0 ) { - $formattedSizeClass = 'mw-plusminus-neg'; - } - - $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text(); - - return Html::element( $tag, - array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ), - $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark(); - } - - /** - * Format the character difference of one or several changes. - * - * @param $old RecentChange - * @param $new RecentChange last change to use, if not provided, $old will be used - * @return string HTML fragment - */ - public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) { - $oldlen = $old->mAttribs['rc_old_len']; - - if ( $new ) { - $newlen = $new->mAttribs['rc_new_len']; - } else { - $newlen = $old->mAttribs['rc_new_len']; - } - - if ( $oldlen === null || $newlen === null ) { - return ''; - } - - return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() ); - } - - /** - * Returns text for the end of RC - * @return String - */ - public function endRecentChangesList() { - if ( $this->rclistOpen ) { - return "\n"; - } else { - return ''; - } - } - - /** - * @param string $s HTML to update - * @param $rc_timestamp mixed - */ - public function insertDateHeader( &$s, $rc_timestamp ) { - # Make date header if necessary - $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() ); - if ( $date != $this->lastdate ) { - if ( $this->lastdate != '' ) { - $s .= "\n"; - } - $s .= Xml::element( 'h4', null, $date ) . "\n
      "; - $this->lastdate = $date; - $this->rclistOpen = true; - } - } - - /** - * @param string $s HTML to update - * @param $title Title - * @param $logtype string - */ - public function insertLog( &$s, $title, $logtype ) { - $page = new LogPage( $logtype ); - $logname = $page->getName()->escaped(); - $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped(); - } - - /** - * @param string $s HTML to update - * @param $rc RecentChange - * @param $unpatrolled - */ - public function insertDiffHist( &$s, &$rc, $unpatrolled ) { - # Diff link - if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) { - $diffLink = $this->message['diff']; - } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) { - $diffLink = $this->message['diff']; - } else { - $query = array( - 'curid' => $rc->mAttribs['rc_cur_id'], - 'diff' => $rc->mAttribs['rc_this_oldid'], - 'oldid' => $rc->mAttribs['rc_last_oldid'] - ); - - $diffLink = Linker::linkKnown( - $rc->getTitle(), - $this->message['diff'], - array( 'tabindex' => $rc->counter ), - $query - ); - } - $diffhist = $diffLink . $this->message['pipe-separator']; - # History link - $diffhist .= Linker::linkKnown( - $rc->getTitle(), - $this->message['hist'], - array(), - array( - 'curid' => $rc->mAttribs['rc_cur_id'], - 'action' => 'history' - ) - ); - $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' . . '; - } - - /** - * @param string $s HTML to update - * @param $rc RecentChange - * @param $unpatrolled - * @param $watched - */ - public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) { - $params = array(); - - $articlelink = Linker::linkKnown( - $rc->getTitle(), - null, - array( 'class' => 'mw-changeslist-title' ), - $params - ); - if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) { - $articlelink = '' . $articlelink . ''; - } - # To allow for boldening pages watched by this user - $articlelink = "{$articlelink}"; - # RTL/LTR marker - $articlelink .= $this->getLanguage()->getDirMark(); - - wfRunHooks( 'ChangesListInsertArticleLink', - array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) ); - - $s .= " $articlelink"; - } - - /** - * Get the timestamp from $rc formatted with current user's settings - * and a separator - * - * @param $rc RecentChange - * @return string HTML fragment - */ - public function getTimestamp( $rc ) { - return $this->message['semicolon-separator'] . '' . - $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . '; - } - - /** - * Insert time timestamp string from $rc into $s - * - * @param string $s HTML to update - * @param $rc RecentChange - */ - public function insertTimestamp( &$s, $rc ) { - $s .= $this->getTimestamp( $rc ); - } - - /** - * Insert links to user page, user talk page and eventually a blocking link - * - * @param &$s String HTML to update - * @param &$rc RecentChange - */ - public function insertUserRelatedLinks( &$s, &$rc ) { - if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) { - $s .= ' ' . $this->msg( 'rev-deleted-user' )->escaped() . ''; - } else { - $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'], - $rc->mAttribs['rc_user_text'] ); - $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); - } - } - - /** - * Insert a formatted action - * - * @param $rc RecentChange - * @return string - */ - public function insertLogEntry( $rc ) { - $formatter = LogFormatter::newFromRow( $rc->mAttribs ); - $formatter->setContext( $this->getContext() ); - $formatter->setShowUserToolLinks( true ); - $mark = $this->getLanguage()->getDirMark(); - return $formatter->getActionText() . " $mark" . $formatter->getComment(); - } - - /** - * Insert a formatted comment - * @param $rc RecentChange - * @return string - */ - public function insertComment( $rc ) { - if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) { - if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) { - return ' ' . $this->msg( 'rev-deleted-comment' )->escaped() . ''; - } else { - return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() ); - } - } - return ''; - } - - /** - * Check whether to enable recent changes patrol features - * - * @deprecated since 1.22 - * @return Boolean - */ - public static function usePatrol() { - global $wgUser; - - wfDeprecated( __METHOD__, '1.22' ); - - return $wgUser->useRCPatrol(); - } - - /** - * Returns the string which indicates the number of watching users - * @return string - */ - protected function numberofWatchingusers( $count ) { - static $cache = array(); - if ( $count > 0 ) { - if ( !isset( $cache[$count] ) ) { - $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped(); - } - return $cache[$count]; - } else { - return ''; - } - } - - /** - * Determine if said field of a revision is hidden - * @param $rc RCCacheEntry - * @param $field Integer: one of DELETED_* bitfield constants - * @return Boolean - */ - public static function isDeleted( $rc, $field ) { - return ( $rc->mAttribs['rc_deleted'] & $field ) == $field; - } - - /** - * Determine if the current user is allowed to view a particular - * field of this revision, if it's marked as deleted. - * @param $rc RCCacheEntry - * @param $field Integer - * @param $user User object to check, or null to use $wgUser - * @return Boolean - */ - public static function userCan( $rc, $field, User $user = null ) { - if ( $rc->mAttribs['rc_type'] == RC_LOG ) { - return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user ); - } else { - return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user ); - } - } - - /** - * @param $link string - * @param $watched bool - * @return string - */ - protected function maybeWatchedLink( $link, $watched = false ) { - if ( $watched ) { - return '' . $link . ''; - } else { - return '' . $link . ''; - } - } - - /** Inserts a rollback link - * - * @param $s string - * @param $rc RecentChange - */ - public function insertRollback( &$s, &$rc ) { - if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) { - $page = $rc->getTitle(); - /** Check for rollback and edit permissions, disallow special pages, and only - * show a link on the top-most revision */ - if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] ) - { - $rev = new Revision( array( - 'title' => $page, - 'id' => $rc->mAttribs['rc_this_oldid'], - 'user' => $rc->mAttribs['rc_user'], - 'user_text' => $rc->mAttribs['rc_user_text'], - 'deleted' => $rc->mAttribs['rc_deleted'] - ) ); - $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() ); - } - } - } - - /** - * @param $s string - * @param $rc RecentChange - * @param $classes - */ - public function insertTags( &$s, &$rc, &$classes ) { - if ( empty( $rc->mAttribs['ts_tags'] ) ) { - return; - } - - list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' ); - $classes = array_merge( $classes, $newClasses ); - $s .= ' ' . $tagSummary; - } - - public function insertExtra( &$s, &$rc, &$classes ) { - // Empty, used for subclasses to add anything special. - } - - protected function showAsUnpatrolled( RecentChange $rc ) { - $unpatrolled = false; - if ( !$rc->mAttribs['rc_patrolled'] ) { - if ( $this->getUser()->useRCPatrol() ) { - $unpatrolled = true; - } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) { - $unpatrolled = true; - } - } - return $unpatrolled; - } -} - -/** - * Generate a list of changes using the good old system (no javascript) - */ -class OldChangesList extends ChangesList { - /** - * Format a line using the old system (aka without any javascript). - * - * @param $rc RecentChange, passed by reference - * @param bool $watched (default false) - * @param int $linenumber (default null) - * - * @return string|bool - */ - public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) { - global $wgRCShowChangedSize; - wfProfileIn( __METHOD__ ); - - # Should patrol-related stuff be shown? - $unpatrolled = $this->showAsUnpatrolled( $rc ); - - $dateheader = ''; // $s now contains only
    • ...
    • , for hooks' convenience. - $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] ); - - $s = ''; - $classes = array(); - // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468) - if ( $linenumber ) { - if ( $linenumber & 1 ) { - $classes[] = 'mw-line-odd'; - } else { - $classes[] = 'mw-line-even'; - } - } - - // Indicate watched status on the line to allow for more - // comprehensive styling. - $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched - ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; - - // Moved pages (very very old, not supported anymore) - if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) { - // Log entries - } elseif ( $rc->mAttribs['rc_log_type'] ) { - $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] ); - $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] ); - // Log entries (old format) or log targets, and special pages - } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) { - list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] ); - if ( $name == 'Log' ) { - $this->insertLog( $s, $rc->getTitle(), $subpage ); - } - // Regular entries - } else { - $this->insertDiffHist( $s, $rc, $unpatrolled ); - # M, N, b and ! (minor, new, bot and unpatrolled) - $s .= $this->recentChangesFlags( - array( - 'newpage' => $rc->mAttribs['rc_type'] == RC_NEW, - 'minor' => $rc->mAttribs['rc_minor'], - 'unpatrolled' => $unpatrolled, - 'bot' => $rc->mAttribs['rc_bot'] - ), - '' - ); - $this->insertArticleLink( $s, $rc, $unpatrolled, $watched ); - } - # Edit/log timestamp - $this->insertTimestamp( $s, $rc ); - # Bytes added or removed - if ( $wgRCShowChangedSize ) { - $cd = $this->formatCharacterDifference( $rc ); - if ( $cd !== '' ) { - $s .= $cd . ' . . '; - } - } - - if ( $rc->mAttribs['rc_type'] == RC_LOG ) { - $s .= $this->insertLogEntry( $rc ); - } else { - # User tool links - $this->insertUserRelatedLinks( $s, $rc ); - # LTR/RTL direction mark - $s .= $this->getLanguage()->getDirMark(); - $s .= $this->insertComment( $rc ); - } - - # Tags - $this->insertTags( $s, $rc, $classes ); - # Rollback - $this->insertRollback( $s, $rc ); - # For subclasses - $this->insertExtra( $s, $rc, $classes ); - - # How many users watch this page - if ( $rc->numberofWatchingusers > 0 ) { - $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers ); - } - - if ( $this->watchlist ) { - $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] ); - } - - if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) { - wfProfileOut( __METHOD__ ); - return false; - } - - wfProfileOut( __METHOD__ ); - return "$dateheader
    • " . $s . "
    • \n"; - } -} - -/** - * Generate a list of changes using an Enhanced system (uses javascript). - */ -class EnhancedChangesList extends ChangesList { - - protected $rc_cache; - - /** - * Add the JavaScript file for enhanced changeslist - * @return String - */ - public function beginRecentChangesList() { - $this->rc_cache = array(); - $this->rcMoveIndex = 0; - $this->rcCacheIndex = 0; - $this->lastdate = ''; - $this->rclistOpen = false; - $this->getOutput()->addModuleStyles( array( - 'mediawiki.special.changeslist', - 'mediawiki.special.changeslist.enhanced', - ) ); - $this->getOutput()->addModules( array( - 'jquery.makeCollapsible', - 'mediawiki.icon', - ) ); - return ''; - } - /** - * Format a line for enhanced recentchange (aka with javascript and block of lines). - * - * @param $baseRC RecentChange - * @param $watched bool - * - * @return string - */ - public function recentChangesLine( &$baseRC, $watched = false ) { - wfProfileIn( __METHOD__ ); - - # Create a specialised object - $rc = RCCacheEntry::newFromParent( $baseRC ); - - $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] ); - - # If it's a new day, add the headline and flush the cache - $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() ); - $ret = ''; - if ( $date != $this->lastdate ) { - # Process current cache - $ret = $this->recentChangesBlock(); - $this->rc_cache = array(); - $ret .= Xml::element( 'h4', null, $date ) . "\n"; - $this->lastdate = $date; - } - - # Should patrol-related stuff be shown? - $rc->unpatrolled = $this->showAsUnpatrolled( $rc ); - - $showdifflinks = true; - # Make article link - $type = $rc->mAttribs['rc_type']; - $logType = $rc->mAttribs['rc_log_type']; - // Page moves, very old style, not supported anymore - if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { - // New unpatrolled pages - } elseif ( $rc->unpatrolled && $type == RC_NEW ) { - $clink = Linker::linkKnown( $rc->getTitle() ); - // Log entries - } elseif ( $type == RC_LOG ) { - if ( $logType ) { - $logtitle = SpecialPage::getTitleFor( 'Log', $logType ); - $logpage = new LogPage( $logType ); - $logname = $logpage->getName()->escaped(); - $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped(); - } else { - $clink = Linker::link( $rc->getTitle() ); - } - $watched = false; - // Log entries (old format) and special pages - } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) { - wfDebug( "Unexpected special page in recentchanges\n" ); - $clink = ''; - // Edits - } else { - $clink = Linker::linkKnown( $rc->getTitle() ); - } - - # Don't show unusable diff links - if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) { - $showdifflinks = false; - } - - $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ); - $rc->watched = $watched; - $rc->link = $clink; - $rc->timestamp = $time; - $rc->numberofWatchingusers = $baseRC->numberofWatchingusers; - - # Make "cur" and "diff" links. Do not use link(), it is too slow if - # called too many times (50% of CPU time on RecentChanges!). - $thisOldid = $rc->mAttribs['rc_this_oldid']; - $lastOldid = $rc->mAttribs['rc_last_oldid']; - - $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid ); - $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ); - - if ( !$showdifflinks ) { - $curLink = $this->message['cur']; - $diffLink = $this->message['diff']; - } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) { - if ( $type != RC_NEW ) { - $curLink = $this->message['cur']; - } else { - $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) ); - $curLink = "counter}\">{$this->message['cur']}"; - } - $diffLink = $this->message['diff']; - } else { - $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) ); - $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) ); - $diffLink = "counter}\">{$this->message['diff']}"; - $curLink = "counter}\">{$this->message['cur']}"; - } - - # Make "last" link - if ( !$showdifflinks || !$lastOldid ) { - $lastLink = $this->message['last']; - } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) { - $lastLink = $this->message['last']; - } else { - $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'], - array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) ); - } - - # Make user links - if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) { - $rc->userlink = ' ' . $this->msg( 'rev-deleted-user' )->escaped() . ''; - } else { - $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); - $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); - } - - $rc->lastlink = $lastLink; - $rc->curlink = $curLink; - $rc->difflink = $diffLink; - - # Put accumulated information into the cache, for later display - # Page moves go on their own line - $title = $rc->getTitle(); - $secureName = $title->getPrefixedDBkey(); - if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { - # Use an @ character to prevent collision with page names - $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc ); - } else { - # Logs are grouped by type - if ( $type == RC_LOG ) { - $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey(); - } - if ( !isset( $this->rc_cache[$secureName] ) ) { - $this->rc_cache[$secureName] = array(); - } - - array_push( $this->rc_cache[$secureName], $rc ); - } - - wfProfileOut( __METHOD__ ); - - return $ret; - } - - /** - * Enhanced RC group - * @return string - */ - protected function recentChangesBlockGroup( $block ) { - global $wgRCShowChangedSize; - - wfProfileIn( __METHOD__ ); - - # Add the namespace and title of the block as part of the class - $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' ); - if ( $block[0]->mAttribs['rc_log_type'] ) { - # Log entry - $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' - . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] ); - } else { - $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' - . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] ); - } - $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched - ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; - $r = Html::openElement( 'table', array( 'class' => $classes ) ) . - Html::openElement( 'tr' ); - - # Collate list of users - $userlinks = array(); - # Other properties - $unpatrolled = false; - $isnew = false; - $allBots = true; - $allMinors = true; - $curId = $currentRevision = 0; - # Some catalyst variables... - $namehidden = true; - $allLogs = true; - foreach ( $block as $rcObj ) { - $oldid = $rcObj->mAttribs['rc_last_oldid']; - if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) { - $isnew = true; - } - // If all log actions to this page were hidden, then don't - // give the name of the affected page for this block! - if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) { - $namehidden = false; - } - $u = $rcObj->userlink; - if ( !isset( $userlinks[$u] ) ) { - $userlinks[$u] = 0; - } - if ( $rcObj->unpatrolled ) { - $unpatrolled = true; - } - if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) { - $allLogs = false; - } - # Get the latest entry with a page_id and oldid - # since logs may not have these. - if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) { - $curId = $rcObj->mAttribs['rc_cur_id']; - } - if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) { - $currentRevision = $rcObj->mAttribs['rc_this_oldid']; - } - - if ( !$rcObj->mAttribs['rc_bot'] ) { - $allBots = false; - } - if ( !$rcObj->mAttribs['rc_minor'] ) { - $allMinors = false; - } - - $userlinks[$u]++; - } - - # Sort the list and convert to text - krsort( $userlinks ); - asort( $userlinks ); - $users = array(); - foreach ( $userlinks as $userlink => $count ) { - $text = $userlink; - $text .= $this->getLanguage()->getDirMark(); - if ( $count > 1 ) { - $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped(); - } - array_push( $users, $text ); - } - - $users = ' ' - . $this->msg( 'brackets' )->rawParams( - implode( $this->message['semicolon-separator'], $users ) - )->escaped() . ''; - - $tl = ''; - $r .= "$tl"; - - # Main line - $r .= '' . $this->recentChangesFlags( array( - 'newpage' => $isnew, # show, when one have this flag - 'minor' => $allMinors, # show only, when all have this flag - 'unpatrolled' => $unpatrolled, # show, when one have this flag - 'bot' => $allBots, # show only, when all have this flag - ) ); - - # Timestamp - $r .= ' ' . $block[0]->timestamp . ' '; - - # Article link - if ( $namehidden ) { - $r .= ' ' . $this->msg( 'rev-deleted-event' )->escaped() . ''; - } elseif ( $allLogs ) { - $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched ); - } else { - $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched ); - } - - $r .= $this->getLanguage()->getDirMark(); - - $queryParams['curid'] = $curId; - - # Changes message - static $nchanges = array(); - static $sinceLastVisitMsg = array(); - - $n = count( $block ); - if ( !isset( $nchanges[$n] ) ) { - $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped(); - } - - $sinceLast = 0; - $unvisitedOldid = null; - foreach ( $block as $rcObj ) { - // Same logic as below inside main foreach - if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) { - $sinceLast++; - $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid']; - } - } - if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) { - $sinceLastVisitMsg[$sinceLast] = - $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped(); - } - - # Total change link - $r .= ' '; - $logtext = ''; - if ( !$allLogs ) { - if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { - $logtext .= $nchanges[$n]; - } elseif ( $isnew ) { - $logtext .= $nchanges[$n]; - } else { - $logtext .= Linker::link( - $block[0]->getTitle(), - $nchanges[$n], - array(), - $queryParams + array( - 'diff' => $currentRevision, - 'oldid' => $oldid, - ), - array( 'known', 'noclasses' ) - ); - if ( $sinceLast > 0 && $sinceLast < $n ) { - $logtext .= $this->message['pipe-separator'] . Linker::link( - $block[0]->getTitle(), - $sinceLastVisitMsg[$sinceLast], - array(), - $queryParams + array( - 'diff' => $currentRevision, - 'oldid' => $unvisitedOldid, - ), - array( 'known', 'noclasses' ) - ); - } - } - } - - # History - if ( $allLogs ) { - // don't show history link for logs - } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) { - $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history']; - } else { - $params = $queryParams; - $params['action'] = 'history'; - - $logtext .= $this->message['pipe-separator'] . - Linker::linkKnown( - $block[0]->getTitle(), - $this->message['enhancedrc-history'], - array(), - $params - ); - } - - if ( $logtext !== '' ) { - $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped(); - } - - $r .= ' . . '; - - # Character difference (does not apply if only log items) - if ( $wgRCShowChangedSize && !$allLogs ) { - $last = 0; - $first = count( $block ) - 1; - # Some events (like logs) have an "empty" size, so we need to skip those... - while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) { - $last++; - } - while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) { - $first--; - } - # Get net change - $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] ); - - if ( $chardiff == '' ) { - $r .= ' '; - } else { - $r .= ' ' . $chardiff . ' . . '; - } - } - - $r .= $users; - $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers ); - - # Sub-entries - foreach ( $block as $rcObj ) { - # Classes to apply -- TODO implement - $classes = array(); - $type = $rcObj->mAttribs['rc_type']; - - $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched - ? ' class="mw-enhanced-watched"' : ''; - - $r .= ''; - $r .= $this->recentChangesFlags( array( - 'newpage' => $type == RC_NEW, - 'minor' => $rcObj->mAttribs['rc_minor'], - 'unpatrolled' => $rcObj->unpatrolled, - 'bot' => $rcObj->mAttribs['rc_bot'], - ) ); - $r .= ' '; - - $params = $queryParams; - - if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) { - $params['oldid'] = $rcObj->mAttribs['rc_this_oldid']; - } - - # Log timestamp - if ( $type == RC_LOG ) { - $link = $rcObj->timestamp; - # Revision link - } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { - $link = '' . $rcObj->timestamp . ' '; - } else { - - $link = Linker::linkKnown( - $rcObj->getTitle(), - $rcObj->timestamp, - array(), - $params - ); - if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) { - $link = '' . $link . ' '; - } - } - $r .= $link . ''; - - if ( !$type == RC_LOG || $type == RC_NEW ) { - $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped(); - } - $r .= ' . . '; - - # Character diff - if ( $wgRCShowChangedSize ) { - $cd = $this->formatCharacterDifference( $rcObj ); - if ( $cd !== '' ) { - $r .= $cd . ' . . '; - } - } - - if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) { - $r .= $this->insertLogEntry( $rcObj ); - } else { - # User links - $r .= $rcObj->userlink; - $r .= $rcObj->usertalklink; - $r .= $this->insertComment( $rcObj ); - } - - # Rollback - $this->insertRollback( $r, $rcObj ); - # Tags - $this->insertTags( $r, $rcObj, $classes ); - - $r .= "\n"; - } - $r .= "\n"; - - $this->rcCacheIndex++; - - wfProfileOut( __METHOD__ ); - - return $r; - } - - /** - * Generate HTML for an arrow or placeholder graphic - * @param string $dir one of '', 'd', 'l', 'r' - * @param string $alt text - * @param string $title text - * @return String: HTML "" tag - */ - protected function arrow( $dir, $alt = '', $title = '' ) { - global $wgStylePath; - $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' ); - $encAlt = htmlspecialchars( $alt ); - $encTitle = htmlspecialchars( $title ); - return "\"$encAlt\""; - } - - /** - * Generate HTML for a right- or left-facing arrow, - * depending on language direction. - * @return String: HTML "" tag - */ - protected function sideArrow() { - $dir = $this->getLanguage()->isRTL() ? 'l' : 'r'; - return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() ); - } - - /** - * Generate HTML for a down-facing arrow - * depending on language direction. - * @return String: HTML "" tag - */ - protected function downArrow() { - return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() ); - } - - /** - * Generate HTML for a spacer image - * @return String: HTML "" tag - */ - protected function spacerArrow() { - return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space - } - - /** - * Enhanced RC ungrouped line. - * - * @param $rcObj RecentChange - * @return String: a HTML formatted line (generated using $r) - */ - protected function recentChangesBlockLine( $rcObj ) { - global $wgRCShowChangedSize; - - wfProfileIn( __METHOD__ ); - $query['curid'] = $rcObj->mAttribs['rc_cur_id']; - - $type = $rcObj->mAttribs['rc_type']; - $logType = $rcObj->mAttribs['rc_log_type']; - $classes = array( 'mw-enhanced-rc' ); - if ( $logType ) { - # Log entry - $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' - . $logType . '-' . $rcObj->mAttribs['rc_title'] ); - } else { - $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' . - $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] ); - } - $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched - ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; - $r = Html::openElement( 'table', array( 'class' => $classes ) ) . - Html::openElement( 'tr' ); - - $r .= ''; - # Flag and Timestamp - if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { - $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders - } else { - $r .= $this->recentChangesFlags( array( - 'newpage' => $type == RC_NEW, - 'minor' => $rcObj->mAttribs['rc_minor'], - 'unpatrolled' => $rcObj->unpatrolled, - 'bot' => $rcObj->mAttribs['rc_bot'], - ) ); - } - $r .= ' ' . $rcObj->timestamp . ' '; - # Article or log link - if ( $logType ) { - $logPage = new LogPage( $logType ); - $logTitle = SpecialPage::getTitleFor( 'Log', $logType ); - $logName = $logPage->getName()->escaped(); - $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped(); - } else { - $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched ); - } - # Diff and hist links - if ( $type != RC_LOG ) { - $query['action'] = 'history'; - $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown( - $rcObj->getTitle(), - $this->message['hist'], - array(), - $query - ) )->escaped(); - } - $r .= ' . . '; - # Character diff - if ( $wgRCShowChangedSize ) { - $cd = $this->formatCharacterDifference( $rcObj ); - if ( $cd !== '' ) { - $r .= $cd . ' . . '; - } - } - - if ( $type == RC_LOG ) { - $r .= $this->insertLogEntry( $rcObj ); - } else { - $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink; - $r .= $this->insertComment( $rcObj ); - $this->insertRollback( $r, $rcObj ); - } - - # Tags - $this->insertTags( $r, $rcObj, $classes ); - # Show how many people are watching this if enabled - $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers ); - - $r .= "\n"; - - wfProfileOut( __METHOD__ ); - - return $r; - } - - /** - * If enhanced RC is in use, this function takes the previously cached - * RC lines, arranges them, and outputs the HTML - * - * @return string - */ - protected function recentChangesBlock() { - if ( count ( $this->rc_cache ) == 0 ) { - return ''; - } - - wfProfileIn( __METHOD__ ); - - $blockOut = ''; - foreach ( $this->rc_cache as $block ) { - if ( count( $block ) < 2 ) { - $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) ); - } else { - $blockOut .= $this->recentChangesBlockGroup( $block ); - } - } - - wfProfileOut( __METHOD__ ); - - return '
      ' . $blockOut . '
      '; - } - - /** - * Returns text for the end of RC - * If enhanced RC is in use, returns pretty much all the text - * @return string - */ - public function endRecentChangesList() { - return $this->recentChangesBlock() . parent::endRecentChangesList(); - } - -} diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index ab03be32a0..d3c7b5f7b4 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration; * MediaWiki version number * @since 1.2 */ -$wgVersion = '1.22alpha'; +$wgVersion = '1.23alpha'; /** * Name of the site. It must be changed in LocalSettings.php @@ -3322,6 +3322,22 @@ $wgResourceLoaderLESSImportPaths = array( "$IP/resources/mediawiki.less/", ); +/** + * Whether ResourceLoader should attempt to persist modules in localStorage on + * browsers that support the Web Storage API. + * + * @since 1.23 - Client-side module persistence is experimental. Exercise care. + */ +$wgResourceLoaderStorageEnabled = false; + +/** + * Cache version for client-side ResourceLoader module storage. You can trigger + * invalidation of the contents of the module store by incrementing this value. + * + * @since 1.23 + */ +$wgResourceLoaderStorageVersion = 1; + /** @} */ # End of resource loader settings } /*************************************************************************//** @@ -3936,7 +3952,7 @@ $wgReservedUsernames = array( 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php 'msg:double-redirect-fixer', // Automatic double redirect fix 'msg:usermessage-editor', // Default user for leaving user messages - 'msg:proxyblocker', // For Special:Blockme + 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22) ); /** @@ -4365,6 +4381,20 @@ $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ); */ $wgCascadingRestrictionLevels = array( 'sysop' ); +/** + * Restriction levels that should be considered "semiprotected" + * + * Certain places in the interface recognize a dichotomy between "protected" + * and "semiprotected", without further distinguishing the specific levels. In + * general, if anyone can be eligible to edit a protection level merely by + * reaching some condition in $wgAutopromote, it should probably be considered + * "semiprotected". + * + * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility. + * 'sysop' is not changed, since it really shouldn't be here. + */ +$wgSemiprotectedRestrictionLevels = array( 'autoconfirmed' ); + /** * Set the minimum permissions required to edit pages in each * namespace. If you list more than one permission, a user must @@ -4695,31 +4725,6 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 ); * @{ */ -/** - * If you enable this, every editor's IP address will be scanned for open HTTP - * proxies. - * - * @warning Don't enable this. Many sysops will report "hostile TCP port scans" - * to your ISP and ask for your server to be shut down. - * You have been warned. - */ -$wgBlockOpenProxies = false; - -/** - * Port we want to scan for a proxy - */ -$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 ); - -/** - * Script used to scan - */ -$wgProxyScriptPath = "$IP/maintenance/proxyCheck.php"; - -/** - * Expiration time for cached proxy IPs - */ -$wgProxyMemcExpiry = 86400; - /** * This should always be customised in LocalSettings.php */ @@ -5584,6 +5589,7 @@ $wgRCFeeds = array(); * Keys are scheme names, values are names of engine classes. */ $wgRCEngines = array( + 'redis' => 'RedisPubSubFeedEngine', 'udp' => 'UDPRCFeedEngine', ); @@ -5936,6 +5942,11 @@ $wgExtensionEntryPointListFiles = array(); */ $wgParserOutputHooks = array(); +/** + * Whether to include the NewPP limit report as a HTML comment + */ +$wgEnableParserLimitReporting = true; + /** * List of valid skin names. * The key should be the name in all lower case, the value should be a properly @@ -5958,6 +5969,13 @@ $wgSpecialPages = array(); */ $wgAutoloadClasses = array(); +/** + * Switch controlling legacy case-insensitive classloading. + * Do not disable if your wiki must support data created by PHP4, or by + * MediaWiki 1.4 or earlier. + */ +$wgAutoloadAttemptLowercase = true; + /** * An array of extension types and inside that their names, versions, authors, * urls, descriptions and pointers to localized description msgs. Note that @@ -6634,7 +6652,7 @@ $wgCrossSiteAJAXdomainExceptions = array(); /** * Maximum amount of virtual memory available to shell processes under linux, in KB. */ -$wgMaxShellMemory = 102400; +$wgMaxShellMemory = 307200; /** * Maximum file size created by shell processes under linux, in KB diff --git a/includes/EditPage.php b/includes/EditPage.php index 12cd4b3d83..530e267453 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -840,7 +840,6 @@ class EditPage { if ( $this->textbox1 === false ) { return false; } - wfProxyCheck(); return true; } @@ -1382,6 +1381,24 @@ class EditPage { return $status; } + $spam = $wgRequest->getText( 'wpAntispam' ); + if ( $spam !== '' ) { + wfDebugLog( + 'SimpleAntiSpam', + $wgUser->getName() . + ' editing "' . + $this->mTitle->getPrefixedText() . + '" submitted bogus field "' . + $spam . + '"' + ); + $status->fatal( 'spamprotectionmatch', false ); + $status->value = self::AS_SPAM_ERROR; + wfProfileOut( __METHOD__ . '-checks' ); + wfProfileOut( __METHOD__ ); + return $status; + } + try { # Construct Content object $textbox_content = $this->toEditContent( $this->textbox1 ); @@ -2191,6 +2208,14 @@ class EditPage { call_user_func_array( $formCallback, array( &$wgOut ) ); } + // Add an empty field to trip up spambots + $wgOut->addHTML( + Xml::openElement( 'div', array( 'id' => 'antispam-container', 'style' => 'display: none;' ) ) + . Html::rawElement( 'label', array( 'for' => 'wpAntiSpam' ), wfMessage( 'simpleantispam-label' )->parse() ) + . Xml::element( 'input', array( 'type' => 'text', 'name' => 'wpAntispam', 'id' => 'wpAntispam', 'value' => '' ) ) + . Xml::closeElement( 'div' ) + ); + wfRunHooks( 'EditPage::showEditForm:fields', array( &$this, &$wgOut ) ); // Put these up at the top to ensure they aren't lost on early form submission @@ -2859,7 +2884,15 @@ HTML return self::getCopyrightWarning( $this->mTitle ); } - public static function getCopyrightWarning( $title ) { + /** + * Get the copyright warning, by default returns wikitext + * + * @param Title $title + * @param string $format output format, valid values are any function of + * a Message object + * @return string + */ + public static function getCopyrightWarning( $title, $format = 'plain' ) { global $wgRightsText; if ( $wgRightsText ) { $copywarnMsg = array( 'copyrightwarning', @@ -2873,7 +2906,7 @@ HTML wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) ); return "
      \n" . - call_user_func_array( 'wfMessage', $copywarnMsg )->plain() . "\n
      "; + call_user_func_array( 'wfMessage', $copywarnMsg )->$format() . "\n"; } /** diff --git a/includes/Exception.php b/includes/Exception.php index fba857f90d..a91f8657a0 100644 --- a/includes/Exception.php +++ b/includes/Exception.php @@ -686,6 +686,9 @@ class MWExceptionHandler { global $wgRedactedFunctionArguments; $finalExceptionText = ''; + // Unique value to indicate redacted parameters + $redacted = new stdClass(); + foreach ( $e->getTrace() as $i => $call ) { $checkFor = array(); if ( isset( $call['class'] ) ) { @@ -700,7 +703,7 @@ class MWExceptionHandler { foreach ( $checkFor as $check ) { if ( isset( $wgRedactedFunctionArguments[$check] ) ) { foreach ( (array)$wgRedactedFunctionArguments[$check] as $argNo ) { - $call['args'][$argNo] = 'REDACTED'; + $call['args'][$argNo] = $redacted; } } } @@ -722,7 +725,9 @@ class MWExceptionHandler { $args = array(); if ( isset( $call['args'] ) ) { foreach ( $call['args'] as $arg ) { - if ( is_object( $arg ) ) { + if ( $arg === $redacted ) { + $args[] = 'REDACTED'; + } elseif ( is_object( $arg ) ) { $args[] = 'Object(' . get_class( $arg ) . ')'; } elseif( is_array( $arg ) ) { $args[] = 'Array'; diff --git a/includes/FormOptions.php b/includes/FormOptions.php index eff175649c..54822e3271 100644 --- a/includes/FormOptions.php +++ b/includes/FormOptions.php @@ -144,10 +144,10 @@ class FormOptions implements ArrayAccess { /** * Use to set the value of an option. * - * @param string $name option name - * @param mixed $value value for the option - * @param bool $force Whether to set the value when it is equivalent to - * the default value for this option (default false). + * @param string $name Option name + * @param mixed $value Value for the option + * @param bool $force Whether to set the value when it is equivalent to the default value for this + * option (default false). */ public function setValue( $name, $value, $force = false ) { $this->validateName( $name, true ); @@ -161,10 +161,9 @@ class FormOptions implements ArrayAccess { } /** - * Get the value for the given option name. - * Internally use getValueReal() + * Get the value for the given option name. Uses getValueReal() internally. * - * @param string $name option name + * @param string $name Option name * @return mixed */ public function getValue( $name ) { @@ -174,9 +173,10 @@ class FormOptions implements ArrayAccess { } /** - * @todo Document - * @param array $option array structure describing the option - * @return mixed Value or the default value if it is null + * Return current option value, based on a structure taken from $options. + * + * @param array $option Array structure describing the option + * @return mixed Value, or the default value if it is null */ protected function getValueReal( $option ) { if ( $option['value'] !== null ) { diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index de1ebcdc52..7547d74194 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -931,14 +931,12 @@ function wfDebug( $text, $logonly = false ) { MWDebug::debugMsg( $text ); } - if ( wfRunHooks( 'Debug', array( $text, null /* no log group */ ) ) ) { - if ( $wgDebugLogFile != '' && !$wgProfileOnly ) { - # Strip unprintables; they can switch terminal modes when binary data - # gets dumped, which is pretty annoying. - $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text ); - $text = $wgDebugLogPrefix . $text; - wfErrorLog( $text, $wgDebugLogFile ); - } + if ( $wgDebugLogFile != '' && !$wgProfileOnly ) { + # Strip unprintables; they can switch terminal modes when binary data + # gets dumped, which is pretty annoying. + $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text ); + $text = $wgDebugLogPrefix . $text; + wfErrorLog( $text, $wgDebugLogFile ); } } @@ -1013,9 +1011,7 @@ function wfDebugLog( $logGroup, $text, $public = true ) { $time = wfTimestamp( TS_DB ); $wiki = wfWikiID(); $host = wfHostname(); - if ( wfRunHooks( 'Debug', array( $text, $logGroup ) ) ) { - wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] ); - } + wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] ); } elseif ( $public === true ) { wfDebug( "[$logGroup] $text", false ); } diff --git a/includes/HashRing.php b/includes/HashRing.php index cd39ad8185..930f8c0aa1 100644 --- a/includes/HashRing.php +++ b/includes/HashRing.php @@ -27,6 +27,8 @@ * @since 1.22 */ class HashRing { + /** @var Array (location => weight) */ + protected $sourceMap = array(); /** @var Array (location => (start, end)) */ protected $ring = array(); @@ -40,6 +42,7 @@ class HashRing { if ( !count( $map ) ) { throw new MWException( "Ring is empty or all weights are zero." ); } + $this->sourceMap = $map; // Sort the locations based on the hash of their names $hashes = array(); foreach ( $map as $location => $weight ) { @@ -112,4 +115,28 @@ class HashRing { } return $locations; } + + /** + * Get the map of locations to weight (ignores 0-weight items) + * + * @return array + */ + public function getLocationWeights() { + return $this->sourceMap; + } + + /** + * Get a new hash ring with a location removed from the ring + * + * @param string $location + * @return HashRing|bool Returns false if no non-zero weighted spots are left + */ + public function newWithoutLocation( $location ) { + $map = $this->sourceMap; + unset( $map[$location] ); + if ( count( $map ) ) { + return new self( $map ); + } + return false; + } } diff --git a/includes/ImagePage.php b/includes/ImagePage.php index 7ea06b0e85..cf05ee2585 100644 --- a/includes/ImagePage.php +++ b/includes/ImagePage.php @@ -128,7 +128,7 @@ class ImagePage extends Article { $out->setPageTitle( $this->getTitle()->getPrefixedText() ); $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ), /* $appendSubtitle */ true, /* $forceKnown */ true ) ); - $this->mPage->doViewUpdates( $this->getContext()->getUser() ); + $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() ); return; } } @@ -165,7 +165,7 @@ class ImagePage extends Article { # Just need to set the right headers $out->setArticleFlag( true ); $out->setPageTitle( $this->getTitle()->getPrefixedText() ); - $this->mPage->doViewUpdates( $this->getContext()->getUser() ); + $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() ); } # Show shared description, if needed @@ -600,7 +600,7 @@ EOT $this->loadFile(); $descUrl = $this->mPage->getFile()->getDescriptionUrl(); - $descText = $this->mPage->getFile()->getDescriptionText(); + $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() ); /* Add canonical to head if there is no local page for this shared file */ if ( $descUrl && $this->mPage->getID() == 0 ) { diff --git a/includes/Linker.php b/includes/Linker.php index 5bb92308ff..4dcdfd5510 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -1960,6 +1960,7 @@ class Linker { * @return String: HTML output */ public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) { + global $wgLang; wfProfileIn( __METHOD__ ); $outText = ''; @@ -1987,13 +1988,28 @@ class Linker { usort( $templates, 'Title::compare' ); foreach ( $templates as $titleObj ) { - $r = $titleObj->getRestrictions( 'edit' ); - if ( in_array( 'sysop', $r ) ) { - $protected = wfMessage( 'template-protected' )->parse(); - } elseif ( in_array( 'autoconfirmed', $r ) ) { - $protected = wfMessage( 'template-semiprotected' )->parse(); - } else { - $protected = ''; + $protected = ''; + $restrictions = $titleObj->getRestrictions( 'edit' ); + if ( $restrictions ) { + // Check backwards-compatible messages + $msg = null; + if ( $restrictions === array( 'sysop' ) ) { + $msg = wfMessage( 'template-protected' ); + } elseif ( $restrictions === array( 'autoconfirmed' ) ) { + $msg = wfMessage( 'template-semiprotected' ); + } + if ( $msg && !$msg->isDisabled() ) { + $protected = $msg->parse(); + } else { + // Construct the message from restriction-level-* + // e.g. restriction-level-sysop, restriction-level-autoconfirmed + $msgs = array(); + foreach ( $restrictions as $r ) { + $msgs[] = wfMessage( "restriction-level-$r" )->parse(); + } + $protected = wfMessage( 'parentheses' ) + ->rawParams( $wgLang->commaList( $msgs ) )->escaped(); + } } if ( $titleObj->quickUserCan( 'edit' ) ) { $editLink = self::link( @@ -2100,9 +2116,10 @@ class Linker { $accesskey = self::accesskey( $name ); if ( $accesskey !== false ) { if ( $tooltip === false || $tooltip === '' ) { - $tooltip = "[$accesskey]"; + $tooltip = wfMessage( 'brackets', $accesskey )->escaped(); } else { - $tooltip .= " [$accesskey]"; + $tooltip .= wfMessage( 'word-separator' )->escaped(); + $tooltip .= wfMessage( 'brackets', $accesskey )->escaped(); } } } diff --git a/includes/Message.php b/includes/Message.php index 73e0af20c4..57c6264dfa 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -356,6 +356,96 @@ class Message { return $this; } + /** + * Add parameters that are durations of time and will be passed through + * Language::formatDuration before substitution + * @since 1.22 + * @param Varargs: numeric parameters (or single argument that is array of numeric parameters) + * @return Message: $this + */ + public function durationParams( /*...*/ ) { + $params = func_get_args(); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + foreach ( $params as $param ) { + $this->parameters[] = self::durationParam( $param ); + } + return $this; + } + + /** + * Add parameters that are expiration times and will be passed through + * Language::formatExpiry before substitution + * @since 1.22 + * @param Varargs: numeric parameters (or single argument that is array of numeric parameters) + * @return Message: $this + */ + public function expiryParams( /*...*/ ) { + $params = func_get_args(); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + foreach ( $params as $param ) { + $this->parameters[] = self::expiryParam( $param ); + } + return $this; + } + + /** + * Add parameters that are time periods and will be passed through + * Language::formatTimePeriod before substitution + * @since 1.22 + * @param Varargs: numeric parameters (or single argument that is array of numeric parameters) + * @return Message: $this + */ + public function timeperiodParams( /*...*/ ) { + $params = func_get_args(); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + foreach ( $params as $param ) { + $this->parameters[] = self::timeperiodParam( $param ); + } + return $this; + } + + /** + * Add parameters that are file sizes and will be passed through + * Language::formatSize before substitution + * @since 1.22 + * @param Varargs: numeric parameters (or single argument that is array of numeric parameters) + * @return Message: $this + */ + public function sizeParams( /*...*/ ) { + $params = func_get_args(); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + foreach ( $params as $param ) { + $this->parameters[] = self::sizeParam( $param ); + } + return $this; + } + + /** + * Add parameters that are bitrates and will be passed through + * Language::formatBitrate before substitution + * @since 1.22 + * @param Varargs: numeric parameters (or single argument that is array of numeric parameters) + * @return Message: $this + */ + public function bitrateParams( /*...*/ ) { + $params = func_get_args(); + if ( isset( $params[0] ) && is_array( $params[0] ) ) { + $params = $params[0]; + } + foreach ( $params as $param ) { + $this->parameters[] = self::bitrateParam( $param ); + } + return $this; + } + /** * Set the language and the title from a context object * @since 1.19 @@ -638,6 +728,51 @@ class Message { return array( 'num' => $value ); } + /** + * @since 1.22 + * @param $value + * @return array + */ + public static function durationParam( $value ) { + return array( 'duration' => $value ); + } + + /** + * @since 1.22 + * @param $value + * @return array + */ + public static function expiryParam( $value ) { + return array( 'expiry' => $value ); + } + + /** + * @since 1.22 + * @param $value + * @return array + */ + public static function timeperiodParam( $value ) { + return array( 'period' => $value ); + } + + /** + * @since 1.22 + * @param $value + * @return array + */ + public static function sizeParam( $value ) { + return array( 'size' => $value ); + } + + /** + * @since 1.22 + * @param $value + * @return array + */ + public static function bitrateParam( $value ) { + return array( 'bitrate' => $value ); + } + /** * Substitutes any parameters into the message text. * @since 1.17 @@ -664,20 +799,37 @@ class Message { * @return Tuple(type, value) */ protected function extractParam( $param ) { - if ( is_array( $param ) && isset( $param['raw'] ) ) { - return array( 'after', $param['raw'] ); - } elseif ( is_array( $param ) && isset( $param['num'] ) ) { - // Replace number params always in before step for now. - // No support for combined raw and num params - return array( 'before', $this->language->formatNum( $param['num'] ) ); - } elseif ( !is_array( $param ) ) { - return array( 'before', $param ); + if ( is_array( $param ) ) { + if ( isset( $param['raw'] ) ) { + return array( 'after', $param['raw'] ); + } elseif ( isset( $param['num'] ) ) { + // Replace number params always in before step for now. + // No support for combined raw and num params + return array( 'before', $this->language->formatNum( $param['num'] ) ); + } elseif ( isset( $param['duration'] ) ) { + return array( 'before', $this->language->formatDuration( $param['duration'] ) ); + } elseif ( isset( $param['expiry'] ) ) { + return array( 'before', $this->language->formatExpiry( $param['expiry'] ) ); + } elseif ( isset( $param['period'] ) ) { + return array( 'before', $this->language->formatTimePeriod( $param['period'] ) ); + } elseif ( isset( $param['size'] ) ) { + return array( 'before', $this->language->formatSize( $param['size'] ) ); + } elseif ( isset( $param['bitrate'] ) ) { + return array( 'before', $this->language->formatBitrate( $param['bitrate'] ) ); + } else { + trigger_error( + "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ), + E_USER_WARNING + ); + return array( 'before', '[INVALID]' ); + } + } elseif ( $param instanceof Message ) { + // Message objects should not be before parameters because + // then they'll get double escaped. If the message needs to be + // escaped, it'll happen right here when we call toString(). + return array( 'after', $param->toString() ); } else { - trigger_error( - "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ), - E_USER_WARNING - ); - return array( 'before', '[INVALID]' ); + return array( 'before', $param ); } } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index cc3f9b3689..7f0454f6bf 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -255,6 +255,11 @@ class OutputPage extends ContextSource { */ private $mTarget = null; + /** + * @var bool: Whether output should contain table of contents + */ + private $mEnableTOC = true; + /** * Constructor for OutputPage. This should not be called directly. * Instead a new RequestContext should be created and it will implicitly create @@ -669,7 +674,7 @@ class OutputPage extends ContextSource { * * @param $timestamp string * - * @return Boolean: true iff cache-ok headers was sent. + * @return Boolean: true if cache-ok headers was sent. */ public function checkLastModified( $timestamp ) { global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage; @@ -1606,6 +1611,7 @@ class OutputPage extends ContextSource { */ function addParserOutput( &$parserOutput ) { $this->addParserOutputNoText( $parserOutput ); + $parserOutput->setTOCEnabled( $this->mEnableTOC ); $text = $parserOutput->getText(); wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) ); $this->addHTML( $text ); @@ -3648,4 +3654,20 @@ $templates return array(); } + /** + * Enables/disables TOC, doesn't override __NOTOC__ + * @param bool $flag + * @since 1.22 + */ + public function enableTOC( $flag = true ) { + $this->mEnableTOC = $flag; + } + + /** + * @return bool + * @since 1.22 + */ + public function isTOCEnabled() { + return $this->mEnableTOC; + } } diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php index b54a9a3570..bf1c4059d4 100644 --- a/includes/ProxyTools.php +++ b/includes/ProxyTools.php @@ -84,43 +84,3 @@ function wfIsConfiguredProxy( $ip ) { in_array( $ip, $wgSquidServersNoPurge ); return $trusted; } - -/** - * Forks processes to scan the originating IP for an open proxy server - * MemCached can be used to skip IPs that have already been scanned - */ -function wfProxyCheck() { - global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath; - global $wgMemc, $wgProxyMemcExpiry, $wgRequest; - global $wgProxyKey; - - if ( !$wgBlockOpenProxies ) { - return; - } - - $ip = $wgRequest->getIP(); - - # Get MemCached key - $mcKey = wfMemcKey( 'proxy', 'ip', $ip ); - $mcValue = $wgMemc->get( $mcKey ); - $skip = (bool)$mcValue; - - # Fork the processes - if ( !$skip ) { - $title = SpecialPage::getTitleFor( 'Blockme' ); - $iphash = md5( $ip . $wgProxyKey ); - $url = wfExpandUrl( $title->getFullURL( 'ip=' . $iphash ), PROTO_HTTP ); - - foreach ( $wgProxyPorts as $port ) { - $params = implode( ' ', array( - escapeshellarg( $wgProxyScriptPath ), - escapeshellarg( $ip ), - escapeshellarg( $port ), - escapeshellarg( $url ) - )); - exec( "php $params >" . wfGetNull() . " 2>&1 &" ); - } - # Set MemCached key - $wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry ); - } -} diff --git a/includes/RecentChange.php b/includes/RecentChange.php deleted file mode 100644 index 282890f726..0000000000 --- a/includes/RecentChange.php +++ /dev/null @@ -1,860 +0,0 @@ -loadFromRow( $row ); - return $rc; - } - - /** - * @deprecated in 1.22 - * @param $row - * @return RecentChange - */ - public static function newFromCurRow( $row ) { - wfDeprecated( __METHOD__, '1.22' ); - $rc = new RecentChange; - $rc->loadFromCurRow( $row ); - $rc->notificationtimestamp = false; - $rc->numberofWatchingusers = false; - return $rc; - } - - /** - * Obtain the recent change with a given rc_id value - * - * @param int $rcid rc_id value to retrieve - * @return RecentChange - */ - public static function newFromId( $rcid ) { - return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ ); - } - - /** - * Find the first recent change matching some specific conditions - * - * @param array $conds of conditions - * @param $fname Mixed: override the method name in profiling/logs - * @param $options Array Query options - * @return RecentChange - */ - public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) { - $dbr = wfGetDB( DB_SLAVE ); - $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options ); - if ( $row !== false ) { - return self::newFromRow( $row ); - } else { - return null; - } - } - - /** - * Return the list of recentchanges fields that should be selected to create - * a new recentchanges object. - * @return array - */ - public static function selectFields() { - return array( - 'rc_id', - 'rc_timestamp', - 'rc_cur_time', - 'rc_user', - 'rc_user_text', - 'rc_namespace', - 'rc_title', - 'rc_comment', - 'rc_minor', - 'rc_bot', - 'rc_new', - 'rc_cur_id', - 'rc_this_oldid', - 'rc_last_oldid', - 'rc_type', - 'rc_source', - 'rc_patrolled', - 'rc_ip', - 'rc_old_len', - 'rc_new_len', - 'rc_deleted', - 'rc_logid', - 'rc_log_type', - 'rc_log_action', - 'rc_params', - ); - } - - # Accessors - - /** - * @param $attribs array - */ - public function setAttribs( $attribs ) { - $this->mAttribs = $attribs; - } - - /** - * @param $extra array - */ - public function setExtra( $extra ) { - $this->mExtra = $extra; - } - - /** - * - * @return Title - */ - public function &getTitle() { - if ( $this->mTitle === false ) { - $this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] ); - } - return $this->mTitle; - } - - /** - * Get the User object of the person who performed this change. - * - * @return User - */ - public function getPerformer() { - if ( $this->mPerformer === false ) { - if ( $this->mAttribs['rc_user'] ) { - $this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] ); - } else { - $this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false ); - } - } - return $this->mPerformer; - } - - /** - * Writes the data in this object to the database - * @param $noudp bool - */ - public function save( $noudp = false ) { - global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang; - - $dbw = wfGetDB( DB_MASTER ); - if ( !is_array( $this->mExtra ) ) { - $this->mExtra = array(); - } - $this->mExtra['lang'] = $wgLocalInterwiki; - - if ( !$wgPutIPinRC ) { - $this->mAttribs['rc_ip'] = ''; - } - - # If our database is strict about IP addresses, use NULL instead of an empty string - if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) { - unset( $this->mAttribs['rc_ip'] ); - } - - # Trim spaces on user supplied text - $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] ); - - # Make sure summary is truncated (whole multibyte characters) - $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 ); - - # Fixup database timestamps - $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] ); - $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] ); - $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' ); - - ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL - if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) { - unset( $this->mAttribs['rc_cur_id'] ); - } - - # Insert new row - $dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ ); - - # Set the ID - $this->mAttribs['rc_id'] = $dbw->insertId(); - - # Notify extensions - wfRunHooks( 'RecentChange_save', array( &$this ) ); - - # Notify external application via UDP - if ( !$noudp ) { - $this->notifyRCFeeds(); - } - - # E-mail notifications - if ( $wgUseEnotif || $wgShowUpdatedMarker ) { - $editor = $this->getPerformer(); - $title = $this->getTitle(); - - if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) { - # @todo FIXME: This would be better as an extension hook - $enotif = new EmailNotification(); - $enotif->notifyOnPageChange( $editor, $title, - $this->mAttribs['rc_timestamp'], - $this->mAttribs['rc_comment'], - $this->mAttribs['rc_minor'], - $this->mAttribs['rc_last_oldid'], - $this->mExtra['pageStatus'] ); - } - } - } - - /** - * @deprecated since 1.22, use notifyRCFeeds instead. - */ - public function notifyRC2UDP() { - wfDeprecated( __METHOD__, '1.22' ); - $this->notifyRCFeeds(); - } - - /** - * Send some text to UDP. - * @deprecated since 1.22 - */ - public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) { - global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix; - - wfDeprecated( __METHOD__, '1.22' ); - - # Assume default for standard RC case - $address = $address ? $address : $wgRC2UDPAddress; - $prefix = $prefix ? $prefix : $wgRC2UDPPrefix; - $port = $port ? $port : $wgRC2UDPPort; - - $engine = new UDPRCFeedEngine(); - $feed = array( - 'uri' => "udp://$address:$port/$prefix", - 'formatter' => 'IRCColourfulRCFeedFormatter', - 'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix, - ); - - return $engine->send( $feed, $line ); - } - - /** - * Notify all the feeds about the change. - */ - public function notifyRCFeeds() { - global $wgRCFeeds; - - foreach ( $wgRCFeeds as $feed ) { - $engine = self::getEngine( $feed['uri'] ); - - if ( isset( $this->mExtra['actionCommentIRC'] ) ) { - $actionComment = $this->mExtra['actionCommentIRC']; - } else { - $actionComment = null; - } - - $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false; - - if ( - ( $omitBots && $this->mAttribs['rc_bot'] ) || - $this->mAttribs['rc_type'] == RC_EXTERNAL - ) { - continue; - } - - $formatter = new $feed['formatter'](); - $line = $formatter->getLine( $feed, $this, $actionComment ); - - $engine->send( $feed, $line ); - } - } - - /** - * Gets the stream engine object for a given URI from $wgRCEngines - * - * @param $uri string URI to get the engine object for - * @return object The engine object - */ - private static function getEngine( $uri ) { - global $wgRCEngines; - - $scheme = parse_url( $uri, PHP_URL_SCHEME ); - if ( !$scheme ) { - throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" ); - } - - if ( !isset( $wgRCEngines[$scheme] ) ) { - throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" ); - } - - return new $wgRCEngines[$scheme]; - } - - /** - * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter - */ - public static function cleanupForIRC( $text ) { - wfDeprecated( __METHOD__, '1.22' ); - return IRCColourfulRCFeedFormatter::cleanupForIRC( $text ); - } - - /** - * Mark a given change as patrolled - * - * @param $change Mixed: RecentChange or corresponding rc_id - * @param $auto Boolean: for automatic patrol - * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id - */ - public static function markPatrolled( $change, $auto = false ) { - global $wgUser; - - $change = $change instanceof RecentChange - ? $change - : RecentChange::newFromId( $change ); - - if ( !$change instanceof RecentChange ) { - return null; - } - return $change->doMarkPatrolled( $wgUser, $auto ); - } - - /** - * Mark this RecentChange as patrolled - * - * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors - * @param $user User object doing the action - * @param $auto Boolean: for automatic patrol - * @return array of permissions errors, see Title::getUserPermissionsErrors() - */ - public function doMarkPatrolled( User $user, $auto = false ) { - global $wgUseRCPatrol, $wgUseNPPatrol; - $errors = array(); - // If recentchanges patrol is disabled, only new pages - // can be patrolled - if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) { - $errors[] = array( 'rcpatroldisabled' ); - } - // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol" - $right = $auto ? 'autopatrol' : 'patrol'; - $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) ); - if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) { - $errors[] = array( 'hookaborted' ); - } - // Users without the 'autopatrol' right can't patrol their - // own revisions - if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) { - $errors[] = array( 'markedaspatrollederror-noautopatrol' ); - } - if ( $errors ) { - return $errors; - } - // If the change was patrolled already, do nothing - if ( $this->getAttribute( 'rc_patrolled' ) ) { - return array(); - } - // Actually set the 'patrolled' flag in RC - $this->reallyMarkPatrolled(); - // Log this patrol event - PatrolLog::record( $this, $auto, $user ); - wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) ); - return array(); - } - - /** - * Mark this RecentChange patrolled, without error checking - * @return Integer: number of affected rows - */ - public function reallyMarkPatrolled() { - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( - 'recentchanges', - array( - 'rc_patrolled' => 1 - ), - array( - 'rc_id' => $this->getAttribute( 'rc_id' ) - ), - __METHOD__ - ); - // Invalidate the page cache after the page has been patrolled - // to make sure that the Patrol link isn't visible any longer! - $this->getTitle()->invalidateCache(); - return $dbw->affectedRows(); - } - - /** - * Makes an entry in the database corresponding to an edit - * - * @param $timestamp - * @param $title Title - * @param $minor - * @param $user User - * @param $comment - * @param $oldId - * @param $lastTimestamp - * @param $bot - * @param $ip string - * @param $oldSize int - * @param $newSize int - * @param $newId int - * @param $patrol int - * @return RecentChange - */ - public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId, - $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) { - $rc = new RecentChange; - $rc->mTitle = $title; - $rc->mPerformer = $user; - $rc->mAttribs = array( - 'rc_timestamp' => $timestamp, - 'rc_cur_time' => $timestamp, - 'rc_namespace' => $title->getNamespace(), - 'rc_title' => $title->getDBkey(), - 'rc_type' => RC_EDIT, - 'rc_source' => self::SRC_EDIT, - 'rc_minor' => $minor ? 1 : 0, - 'rc_cur_id' => $title->getArticleID(), - 'rc_user' => $user->getId(), - 'rc_user_text' => $user->getName(), - 'rc_comment' => $comment, - 'rc_this_oldid' => $newId, - 'rc_last_oldid' => $oldId, - 'rc_bot' => $bot ? 1 : 0, - 'rc_ip' => self::checkIPAddress( $ip ), - 'rc_patrolled' => intval( $patrol ), - 'rc_new' => 0, # obsolete - 'rc_old_len' => $oldSize, - 'rc_new_len' => $newSize, - 'rc_deleted' => 0, - 'rc_logid' => 0, - 'rc_log_type' => null, - 'rc_log_action' => '', - 'rc_params' => '' - ); - - $rc->mExtra = array( - 'prefixedDBkey' => $title->getPrefixedDBkey(), - 'lastTimestamp' => $lastTimestamp, - 'oldSize' => $oldSize, - 'newSize' => $newSize, - 'pageStatus' => 'changed' - ); - $rc->save(); - return $rc; - } - - /** - * Makes an entry in the database corresponding to page creation - * Note: the title object must be loaded with the new id using resetArticleID() - * @todo Document parameters and return - * - * @param $timestamp - * @param $title Title - * @param $minor - * @param $user User - * @param $comment - * @param $bot - * @param $ip string - * @param $size int - * @param $newId int - * @param $patrol int - * @return RecentChange - */ - public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot, - $ip = '', $size = 0, $newId = 0, $patrol = 0 ) { - $rc = new RecentChange; - $rc->mTitle = $title; - $rc->mPerformer = $user; - $rc->mAttribs = array( - 'rc_timestamp' => $timestamp, - 'rc_cur_time' => $timestamp, - 'rc_namespace' => $title->getNamespace(), - 'rc_title' => $title->getDBkey(), - 'rc_type' => RC_NEW, - 'rc_source' => self::SRC_NEW, - 'rc_minor' => $minor ? 1 : 0, - 'rc_cur_id' => $title->getArticleID(), - 'rc_user' => $user->getId(), - 'rc_user_text' => $user->getName(), - 'rc_comment' => $comment, - 'rc_this_oldid' => $newId, - 'rc_last_oldid' => 0, - 'rc_bot' => $bot ? 1 : 0, - 'rc_ip' => self::checkIPAddress( $ip ), - 'rc_patrolled' => intval( $patrol ), - 'rc_new' => 1, # obsolete - 'rc_old_len' => 0, - 'rc_new_len' => $size, - 'rc_deleted' => 0, - 'rc_logid' => 0, - 'rc_log_type' => null, - 'rc_log_action' => '', - 'rc_params' => '' - ); - - $rc->mExtra = array( - 'prefixedDBkey' => $title->getPrefixedDBkey(), - 'lastTimestamp' => 0, - 'oldSize' => 0, - 'newSize' => $size, - 'pageStatus' => 'created' - ); - $rc->save(); - return $rc; - } - - /** - * @param $timestamp - * @param $title - * @param $user - * @param $actionComment - * @param $ip string - * @param $type - * @param $action - * @param $target - * @param $logComment - * @param $params - * @param $newId int - * @param $actionCommentIRC string - * @return bool - */ - public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type, - $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) - { - global $wgLogRestrictions; - # Don't add private logs to RC! - if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) { - return false; - } - $rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action, - $target, $logComment, $params, $newId, $actionCommentIRC ); - $rc->save(); - return true; - } - - /** - * @param $timestamp - * @param $title Title - * @param $user User - * @param $actionComment - * @param $ip string - * @param $type - * @param $action - * @param $target Title - * @param $logComment - * @param $params - * @param $newId int - * @param $actionCommentIRC string - * @return RecentChange - */ - public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip, - $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) { - global $wgRequest; - - ## Get pageStatus for email notification - switch ( $type . '-' . $action ) { - case 'delete-delete': - $pageStatus = 'deleted'; - break; - case 'move-move': - case 'move-move_redir': - $pageStatus = 'moved'; - break; - case 'delete-restore': - $pageStatus = 'restored'; - break; - case 'upload-upload': - $pageStatus = 'created'; - break; - case 'upload-overwrite': - default: - $pageStatus = 'changed'; - break; - } - - $rc = new RecentChange; - $rc->mTitle = $target; - $rc->mPerformer = $user; - $rc->mAttribs = array( - 'rc_timestamp' => $timestamp, - 'rc_cur_time' => $timestamp, - 'rc_namespace' => $target->getNamespace(), - 'rc_title' => $target->getDBkey(), - 'rc_type' => RC_LOG, - 'rc_source' => self::SRC_LOG, - 'rc_minor' => 0, - 'rc_cur_id' => $target->getArticleID(), - 'rc_user' => $user->getId(), - 'rc_user_text' => $user->getName(), - 'rc_comment' => $logComment, - 'rc_this_oldid' => 0, - 'rc_last_oldid' => 0, - 'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0, - 'rc_ip' => self::checkIPAddress( $ip ), - 'rc_patrolled' => 1, - 'rc_new' => 0, # obsolete - 'rc_old_len' => null, - 'rc_new_len' => null, - 'rc_deleted' => 0, - 'rc_logid' => $newId, - 'rc_log_type' => $type, - 'rc_log_action' => $action, - 'rc_params' => $params - ); - - $rc->mExtra = array( - 'prefixedDBkey' => $title->getPrefixedDBkey(), - 'lastTimestamp' => 0, - 'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage - 'pageStatus' => $pageStatus, - 'actionCommentIRC' => $actionCommentIRC - ); - return $rc; - } - - /** - * Initialises the members of this object from a mysql row object - * - * @param $row - */ - public function loadFromRow( $row ) { - $this->mAttribs = get_object_vars( $row ); - $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] ); - $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set - } - - /** - * Makes a pseudo-RC entry from a cur row - * - * @deprected in 1.22 - * @param $row - */ - public function loadFromCurRow( $row ) { - wfDeprecated( __METHOD__, '1.22' ); - $this->mAttribs = array( - 'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ), - 'rc_cur_time' => $row->rev_timestamp, - 'rc_user' => $row->rev_user, - 'rc_user_text' => $row->rev_user_text, - 'rc_namespace' => $row->page_namespace, - 'rc_title' => $row->page_title, - 'rc_comment' => $row->rev_comment, - 'rc_minor' => $row->rev_minor_edit ? 1 : 0, - 'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT, - 'rc_source' => $row->page_is_new ? self::SRC_NEW : self::SRC_EDIT, - 'rc_cur_id' => $row->page_id, - 'rc_this_oldid' => $row->rev_id, - 'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0, - 'rc_bot' => 0, - 'rc_ip' => '', - 'rc_id' => $row->rc_id, - 'rc_patrolled' => $row->rc_patrolled, - 'rc_new' => $row->page_is_new, # obsolete - 'rc_old_len' => $row->rc_old_len, - 'rc_new_len' => $row->rc_new_len, - 'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '', - 'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null, - 'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null, - 'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0, - 'rc_deleted' => $row->rc_deleted // MUST be set - ); - } - - /** - * Get an attribute value - * - * @param string $name Attribute name - * @return mixed - */ - public function getAttribute( $name ) { - return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null; - } - - /** - * @return array - */ - public function getAttributes() { - return $this->mAttribs; - } - - /** - * Gets the end part of the diff URL associated with this object - * Blank if no diff link should be displayed - * @param $forceCur - * @return string - */ - public function diffLinkTrail( $forceCur ) { - if ( $this->mAttribs['rc_type'] == RC_EDIT ) { - $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) . - "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] ); - if ( $forceCur ) { - $trail .= '&diff=0'; - } else { - $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] ); - } - } else { - $trail = ''; - } - return $trail; - } - - /** - * Returns the change size (HTML). - * The lengths can be given optionally. - * @param $old int - * @param $new int - * @return string - */ - public function getCharacterDifference( $old = 0, $new = 0 ) { - if ( $old === 0 ) { - $old = $this->mAttribs['rc_old_len']; - } - if ( $new === 0 ) { - $new = $this->mAttribs['rc_new_len']; - } - if ( $old === null || $new === null ) { - return ''; - } - return ChangesList::showCharacterDifference( $old, $new ); - } - - /** - * Purge expired changes from the recentchanges table - * @since 1.22 - */ - public static function purgeExpiredChanges() { - if ( wfReadOnly() ) { - return; - } - - $method = __METHOD__; - $dbw = wfGetDB( DB_MASTER ); - $dbw->onTransactionIdle( function() use ( $dbw, $method ) { - global $wgRCMaxAge; - - $cutoff = $dbw->timestamp( time() - $wgRCMaxAge ); - $dbw->delete( - 'recentchanges', - array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ), - $method - ); - } ); - } - - private static function checkIPAddress( $ip ) { - global $wgRequest; - if ( $ip ) { - if ( !IP::isIPAddress( $ip ) ) { - throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" ); - } - } else { - $ip = $wgRequest->getIP(); - if ( !$ip ) { - $ip = ''; - } - } - return $ip; - } - - /** - * Check whether the given timestamp is new enough to have a RC row with a given tolerance - * as the recentchanges table might not be cleared out regularly (so older entries might exist) - * or rows which will be deleted soon shouldn't be included. - * - * @param $timestamp mixed MWTimestamp compatible timestamp - * @param $tolerance integer Tolerance in seconds - * @return bool - */ - public static function isInRCLifespan( $timestamp, $tolerance = 0 ) { - global $wgRCMaxAge; - return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge; - } -} diff --git a/includes/Revision.php b/includes/Revision.php index 305c8ffa87..444617339c 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -116,11 +116,13 @@ class Revision implements IDBAccessObject { if ( $id ) { // Use the specified ID $conds['rev_id'] = $id; + return self::newFromConds( $conds, (int)$flags ); } else { // Use a join to get the latest revision $conds[] = 'rev_id=page_latest'; + $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE ); + return self::loadFromConds( $db, $conds, $flags ); } - return self::newFromConds( $conds, (int)$flags ); } /** @@ -431,6 +433,36 @@ class Revision implements IDBAccessObject { return $fields; } + /** + * Return the list of revision fields that should be selected to create + * a new revision from an archive row. + * @return array + */ + public static function selectArchiveFields() { + global $wgContentHandlerUseDB; + $fields = array( + 'ar_id', + 'ar_page_id', + 'ar_rev_id', + 'ar_text_id', + 'ar_timestamp', + 'ar_comment', + 'ar_user_text', + 'ar_user', + 'ar_minor_edit', + 'ar_deleted', + 'ar_len', + 'ar_parent_id', + 'ar_sha1', + ); + + if ( $wgContentHandlerUseDB ) { + $fields[] = 'ar_content_format'; + $fields[] = 'ar_content_model'; + } + return $fields; + } + /** * Return the list of text fields that should be selected to read the * revision text diff --git a/includes/Skin.php b/includes/Skin.php index 5801806c9a..170e96fc19 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -1379,61 +1379,58 @@ abstract class Skin extends ContextSource { if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) { $uTalkTitle = $user->getTalkPage(); - - if ( !$uTalkTitle->equals( $out->getTitle() ) ) { - $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null; - $nofAuthors = 0; - if ( $lastSeenRev !== null ) { - $plural = true; // Default if we have a last seen revision: if unknown, use plural - $latestRev = Revision::newFromTitle( $uTalkTitle, false, Revision::READ_NORMAL ); - if ( $latestRev !== null ) { - // Singular if only 1 unseen revision, plural if several unseen revisions. - $plural = $latestRev->getParentId() !== $lastSeenRev->getId(); - $nofAuthors = $uTalkTitle->countAuthorsBetween( - $lastSeenRev, $latestRev, 10, 'include_new' ); - } - } else { - // Singular if no revision -> diff link will show latest change only in any case - $plural = false; + $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null; + $nofAuthors = 0; + if ( $lastSeenRev !== null ) { + $plural = true; // Default if we have a last seen revision: if unknown, use plural + $latestRev = Revision::newFromTitle( $uTalkTitle, false, Revision::READ_NORMAL ); + if ( $latestRev !== null ) { + // Singular if only 1 unseen revision, plural if several unseen revisions. + $plural = $latestRev->getParentId() !== $lastSeenRev->getId(); + $nofAuthors = $uTalkTitle->countAuthorsBetween( + $lastSeenRev, $latestRev, 10, 'include_new' ); } - $plural = $plural ? 2 : 1; - // 2 signifies "more than one revision". We don't know how many, and even if we did, - // the number of revisions or authors is not necessarily the same as the number of - // "messages". - $newMessagesLink = Linker::linkKnown( - $uTalkTitle, - $this->msg( 'newmessageslinkplural' )->params( $plural )->escaped(), - array(), - array( 'redirect' => 'no' ) - ); + } else { + // Singular if no revision -> diff link will show latest change only in any case + $plural = false; + } + $plural = $plural ? 2 : 1; + // 2 signifies "more than one revision". We don't know how many, and even if we did, + // the number of revisions or authors is not necessarily the same as the number of + // "messages". + $newMessagesLink = Linker::linkKnown( + $uTalkTitle, + $this->msg( 'newmessageslinkplural' )->params( $plural )->escaped(), + array(), + array( 'redirect' => 'no' ) + ); - $newMessagesDiffLink = Linker::linkKnown( - $uTalkTitle, - $this->msg( 'newmessagesdifflinkplural' )->params( $plural )->escaped(), - array(), - $lastSeenRev !== null - ? array( 'oldid' => $lastSeenRev->getId(), 'diff' => 'cur' ) - : array( 'diff' => 'cur' ) - ); + $newMessagesDiffLink = Linker::linkKnown( + $uTalkTitle, + $this->msg( 'newmessagesdifflinkplural' )->params( $plural )->escaped(), + array(), + $lastSeenRev !== null + ? array( 'oldid' => $lastSeenRev->getId(), 'diff' => 'cur' ) + : array( 'diff' => 'cur' ) + ); - if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) { - $newMessagesAlert = $this->msg( - 'youhavenewmessagesfromusers', - $newMessagesLink, - $newMessagesDiffLink - )->numParams( $nofAuthors ); - } else { - // $nofAuthors === 11 signifies "11 or more" ("more than 10") - $newMessagesAlert = $this->msg( - $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages', - $newMessagesLink, - $newMessagesDiffLink - ); - } - $newMessagesAlert = $newMessagesAlert->text(); - # Disable Squid cache - $out->setSquidMaxage( 0 ); + if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) { + $newMessagesAlert = $this->msg( + 'youhavenewmessagesfromusers', + $newMessagesLink, + $newMessagesDiffLink + )->numParams( $nofAuthors ); + } else { + // $nofAuthors === 11 signifies "11 or more" ("more than 10") + $newMessagesAlert = $this->msg( + $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages', + $newMessagesLink, + $newMessagesDiffLink + ); } + $newMessagesAlert = $newMessagesAlert->text(); + # Disable Squid cache + $out->setSquidMaxage( 0 ); } elseif ( count( $newtalks ) ) { $sep = $this->msg( 'newtalkseparator' )->escaped(); $msgs = array(); diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index 44cafe9ebf..e5b8872c8a 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -1717,6 +1717,10 @@ abstract class BaseTemplate extends QuickTemplate { * on the link) is present it will be used to generate a tooltip and * accesskey for the link. * + * The keys "context" and "primary" are ignored; these keys are used + * internally by skins and are not supposed to be included in the HTML + * output. + * * If you don't want an accesskey, set $item['tooltiponly'] = true; * * @param array $options can be used to affect the output of a link. @@ -1757,7 +1761,7 @@ abstract class BaseTemplate extends QuickTemplate { if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) { $attrs = $item; - foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly' ) as $k ) { + foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) { unset( $attrs[$k] ); } diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php index c03f1ba5db..11edc8ac84 100644 --- a/includes/SpecialPageFactory.php +++ b/includes/SpecialPageFactory.php @@ -155,7 +155,6 @@ class SpecialPageFactory { // Unlisted / redirects 'Blankpage' => 'SpecialBlankpage', - 'Blockme' => 'SpecialBlockme', 'Emailuser' => 'SpecialEmailUser', 'Movepage' => 'MovePageForm', 'Mycontributions' => 'SpecialMycontributions', diff --git a/includes/Status.php b/includes/Status.php index 7a84fed109..928f8ebd61 100644 --- a/includes/Status.php +++ b/includes/Status.php @@ -188,15 +188,18 @@ class Status { } } if ( count( $this->errors ) == 1 ) { - $s = $this->getErrorMessage( $this->errors[0] ); + $s = $this->getErrorMessage( $this->errors[0] )->plain(); if ( $shortContext ) { $s = wfMessage( $shortContext, $s )->plain(); } elseif ( $longContext ) { $s = wfMessage( $longContext, "* $s\n" )->plain(); } } else { - $s = '* ' . implode( "\n* ", - $this->getErrorMessageArray( $this->errors ) ) . "\n"; + $errors = $this->getErrorMessageArray( $this->errors ); + foreach ( $errors as &$error ) { + $error = $error->plain(); + } + $s = '* ' . implode( "\n* ", $errors ) . "\n"; if ( $longContext ) { $s = wfMessage( $longContext, $s )->plain(); } elseif ( $shortContext ) { @@ -206,6 +209,56 @@ class Status { return $s; } + /** + * Get the error list as a Message object + * + * @param string $shortContext a short enclosing context message name, to + * be used when there is a single error + * @param string $longContext a long enclosing context message name, for a list + * @return Message + */ + function getMessage( $shortContext = false, $longContext = false ) { + if ( count( $this->errors ) == 0 ) { + if ( $this->ok ) { + $this->fatal( 'internalerror_info', + __METHOD__ . " called for a good result, this is incorrect\n" ); + } else { + $this->fatal( 'internalerror_info', + __METHOD__ . ": Invalid result object: no error text but not OK\n" ); + } + } + if ( count( $this->errors ) == 1 ) { + $s = $this->getErrorMessage( $this->errors[0] ); + if ( $shortContext ) { + $s = wfMessage( $shortContext, $s ); + } elseif ( $longContext ) { + $wrapper = new RawMessage( "* \$1\n" ); + $wrapper->params( $s )->parse(); + $s = wfMessage( $longContext, $wrapper ); + } + } else { + $msgs = $this->getErrorMessageArray( $this->errors ); + $msgCount = count( $msgs ); + + if ( $shortContext ) { + $msgCount++; + } + + $wrapper = new RawMessage( '* $' . implode( "\n* \$", range( 1, $msgCount ) ) ); + $s = $wrapper->params( $msgs )->parse(); + + if ( $longContext ) { + $s = wfMessage( $longContext, $wrapper ); + } elseif ( $shortContext ) { + $wrapper = new RawMessage( "\n\$1\n", $wrapper ); + $wrapper->parse(); + $s = wfMessage( $shortContext, $wrapper ); + } + } + + return $s; + } + /** * Return the message for a single error. * @param $error Mixed With an array & two values keyed by @@ -230,7 +283,7 @@ class Status { } else { $msg = wfMessage( $error ); } - return $msg->plain(); + return $msg; } /** @@ -371,15 +424,6 @@ class Status { return $replaced; } - /** - * Backward compatibility function for WikiError -> Status migration - * - * @return String - */ - public function getMessage() { - return $this->getWikiText(); - } - /** * @return mixed */ diff --git a/includes/Title.php b/includes/Title.php index 56e9b44cc5..21872e45b6 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -2458,31 +2458,31 @@ class Title { } /** - * Is this page "semi-protected" - the *only* protection is autoconfirm? + * Is this page "semi-protected" - the *only* protection levels are listed + * in $wgSemiprotectedRestrictionLevels? * * @param string $action Action to check (default: edit) * @return Bool */ public function isSemiProtected( $action = 'edit' ) { - if ( $this->exists() ) { - $restrictions = $this->getRestrictions( $action ); - if ( count( $restrictions ) > 0 ) { - foreach ( $restrictions as $restriction ) { - if ( strtolower( $restriction ) != 'editsemiprotected' && - strtolower( $restriction ) != 'autoconfirmed' // BC - ) { - return false; - } - } - } else { - # Not protected - return false; - } - return true; - } else { - # If it doesn't exist, it can't be protected + global $wgSemiprotectedRestrictionLevels; + + $restrictions = $this->getRestrictions( $action ); + $semi = $wgSemiprotectedRestrictionLevels; + if ( !$restrictions || !$semi ) { + // Not protected, or all protection is full protection return false; } + + // Remap autoconfirmed to editsemiprotected for BC + foreach ( array_keys( $semi, 'autoconfirmed' ) as $key ) { + $semi[$key] = 'editsemiprotected'; + } + foreach ( array_keys( $restrictions, 'autoconfirmed' ) as $key ) { + $restrictions[$key] = 'editsemiprotected'; + } + + return !array_diff( $restrictions, $semi ); } /** @@ -3903,7 +3903,12 @@ class Title { __METHOD__ ); - $this->resetArticleID( 0 ); + // clean up the old title before reset article id - bug 45348 + if ( !$redirectContent ) { + WikiPage::onArticleDelete( $this ); + } + + $this->resetArticleID( 0 ); // 0 == non existing $nt->resetArticleID( $oldid ); $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397 @@ -3919,13 +3924,12 @@ class Title { } # Recreate the redirect, this time in the other direction. - if ( !$redirectContent ) { - WikiPage::onArticleDelete( $this ); - } else { + if ( $redirectContent ) { $redirectArticle = WikiPage::factory( $this ); $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397 $newid = $redirectArticle->insertOn( $dbw ); if ( $newid ) { // sanity + $this->resetArticleID( $newid ); $redirectRevision = new Revision( array( 'title' => $this, // for determining the default content model 'page' => $newid, diff --git a/includes/User.php b/includes/User.php index 12912e1c0a..c86b966ffe 100644 --- a/includes/User.php +++ b/includes/User.php @@ -3021,8 +3021,9 @@ class User { * the next change of the page if it's watched etc. * @note If the user doesn't have 'editmywatchlist', this will do nothing. * @param $title Title of the article to look at + * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed. */ - public function clearNotification( &$title ) { + public function clearNotification( &$title, $oldid = 0 ) { global $wgUseEnotif, $wgShowUpdatedMarker; // Do nothing if the database is locked to writes @@ -3035,12 +3036,25 @@ class User { return; } - if ( $title->getNamespace() == NS_USER_TALK && - $title->getText() == $this->getName() ) { - if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) ) { + // If we're working on user's talk page, we should update the talk page message indicator + if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) { + if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this, $oldid ) ) ) { return; } - $this->setNewtalk( false ); + + $nextid = $oldid ? $title->getNextRevisionID( $oldid ) : null; + + if ( !$oldid || !$nextid ) { + // If we're looking at the latest revision, we should definitely clear it + $this->setNewtalk( false ); + } else { + // Otherwise we should update its revision, if it's present + if ( $this->getNewtalk() ) { + // Naturally the other one won't clear by itself + $this->setNewtalk( false ); + $this->setNewtalk( true, Revision::newFromId( $nextid ) ); + } + } } if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) { @@ -3063,7 +3077,7 @@ class User { $force = 'force'; } - $this->getWatchedItem( $title )->resetNotificationTimestamp( $force ); + $this->getWatchedItem( $title )->resetNotificationTimestamp( $force, $oldid ); } /** @@ -3091,14 +3105,12 @@ class User { if ( $id != 0 ) { $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'watchlist', - array( /* SET */ - 'wl_notificationtimestamp' => null - ), array( /* WHERE */ - 'wl_user' => $id - ), __METHOD__ + array( /* SET */ 'wl_notificationtimestamp' => null ), + array( /* WHERE */ 'wl_user' => $id ), + __METHOD__ ); - # We also need to clear here the "you have new message" notification for the own user_talk page - # This is cleared one page view later in Article::viewUpdates(); + // We also need to clear here the "you have new message" notification for the own user_talk page; + // it's cleared one page view later in WikiPage::doViewUpdates(). } } diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php index 1e07e7c795..d2fb468335 100644 --- a/includes/WatchedItem.php +++ b/includes/WatchedItem.php @@ -173,8 +173,9 @@ class WatchedItem { * * @param $force Whether to force the write query to be executed even if the * page is not watched or the notification timestamp is already NULL. + * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed. */ - public function resetNotificationTimestamp( $force = '' ) { + public function resetNotificationTimestamp( $force = '', $oldid = 0 ) { // Only loggedin user can have a watchlist if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) { return; @@ -187,10 +188,50 @@ class WatchedItem { } } + $title = $this->getTitle(); + if ( !$oldid ) { + // No oldid given, assuming latest revision; clear the timestamp. + $notificationTimestamp = null; + } elseif ( !$title->getNextRevisionID( $oldid ) ) { + // Oldid given and is the latest revision for this title; clear the timestamp. + $notificationTimestamp = null; + } else { + // See if the version marked as read is more recent than the one we're viewing. + // Call load() if it wasn't called before due to $force. + $this->load(); + + if ( $this->timestamp === null ) { + // This can only happen if $force is enabled. + $notificationTimestamp = null; + } else { + // Oldid given and isn't the latest; update the timestamp. + // This will result in no further notification emails being sent! + $dbr = wfGetDB( DB_SLAVE ); + $notificationTimestamp = $dbr->selectField( + 'revision', 'rev_timestamp', + array( 'rev_page' => $title->getArticleID(), 'rev_id' => $oldid ) + ); + // We need to go one second to the future because of various strict comparisons + // throughout the codebase + $ts = new MWTimestamp( $notificationTimestamp ); + $ts->timestamp->add( new DateInterval( 'PT1S' ) ); + $notificationTimestamp = $ts->getTimestamp( TS_MW ); + + if ( $notificationTimestamp < $this->timestamp ) { + if ( $force != 'force' ) { + return; + } else { + // This is a little silly… + $notificationTimestamp = $this->timestamp; + } + } + } + } + // If the page is watched by the user (or may be watched), update the timestamp on any // any matching rows $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => null ), + $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $notificationTimestamp ), $this->dbCond(), __METHOD__ ); $this->timestamp = null; } diff --git a/includes/Wiki.php b/includes/Wiki.php index edfbba2d28..403ef110c6 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -588,6 +588,7 @@ class MediaWiki { $cache->loadFromFileCache( $this->context ); } // Do any stats increment/watchlist stuff + // Assume we're viewing the latest revision (this should always be the case with file cache) $this->context->getWikiPage()->doViewUpdates( $this->context->getUser() ); // Tell OutputPage that output is taken care of $this->context->getOutput()->disable(); diff --git a/includes/WikiPage.php b/includes/WikiPage.php index 1965982f1e..6d2d80c6bf 100644 --- a/includes/WikiPage.php +++ b/includes/WikiPage.php @@ -1134,9 +1134,10 @@ class WikiPage implements Page, IDBAccessObject { /** * Do standard deferred updates after page view - * @param $user User The relevant user + * @param User $user The relevant user + * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed. */ - public function doViewUpdates( User $user ) { + public function doViewUpdates( User $user, $oldid = 0 ) { global $wgDisableCounters; if ( wfReadOnly() ) { return; @@ -1149,7 +1150,7 @@ class WikiPage implements Page, IDBAccessObject { } // Update newtalk / watchlist notification status - $user->clearNotification( $this->mTitle ); + $user->clearNotification( $this->mTitle, $oldid ); } /** @@ -1457,7 +1458,7 @@ class WikiPage implements Page, IDBAccessObject { } /** - * Returns true iff this page's content model supports sections. + * Returns true if this page's content model supports sections. * * @return boolean whether sections are supported. * diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php index b51d441db9..13e58b8950 100644 --- a/includes/api/ApiLogin.php +++ b/includes/api/ApiLogin.php @@ -254,9 +254,9 @@ class ApiLogin extends ApiBase { public function getDescription() { return array( - 'Log in and get the authentication tokens. ', + 'Log in and get the authentication tokens.', 'In the event of a successful log-in, a cookie will be attached', - 'to your session. In the event of a failed log-in, you will not ', + 'to your session. In the event of a failed log-in, you will not', 'be able to attempt another log-in through this method for 5 seconds.', 'This is to prevent password guessing by automated password crackers' ); @@ -267,10 +267,10 @@ class ApiLogin extends ApiBase { array( 'code' => 'NeedToken', 'info' => 'You need to resubmit your login with the specified token. See https://bugzilla.wikimedia.org/show_bug.cgi?id=23076' ), array( 'code' => 'WrongToken', 'info' => 'You specified an invalid token' ), array( 'code' => 'NoName', 'info' => 'You didn\'t set the lgname parameter' ), - array( 'code' => 'Illegal', 'info' => ' You provided an illegal username' ), - array( 'code' => 'NotExists', 'info' => ' The username you provided doesn\'t exist' ), - array( 'code' => 'EmptyPass', 'info' => ' You didn\'t set the lgpassword parameter or you left it empty' ), - array( 'code' => 'WrongPass', 'info' => ' The password you provided is incorrect' ), + array( 'code' => 'Illegal', 'info' => 'You provided an illegal username' ), + array( 'code' => 'NotExists', 'info' => 'The username you provided doesn\'t exist' ), + array( 'code' => 'EmptyPass', 'info' => 'You didn\'t set the lgpassword parameter or you left it empty' ), + array( 'code' => 'WrongPass', 'info' => 'The password you provided is incorrect' ), array( 'code' => 'WrongPluginPass', 'info' => 'Same as "WrongPass", returned when an authentication plugin rather than MediaWiki itself rejected the password' ), array( 'code' => 'CreateBlocked', 'info' => 'The wiki tried to automatically create a new account for you, but your IP address has been blocked from account creation' ), array( 'code' => 'Throttled', 'info' => 'You\'ve logged in too many times in a short time' ), diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php old mode 100644 new mode 100755 index 0ea286847b..81c9faf0c8 --- a/includes/api/ApiQueryImageInfo.php +++ b/includes/api/ApiQueryImageInfo.php @@ -49,6 +49,12 @@ class ApiQueryImageInfo extends ApiQueryBase { $scale = $this->getScale( $params ); + $metadataOpts = array( + 'version' => $params['metadataversion'], + 'language' => $params['extmetadatalanguage'], + 'multilang' => $params['extmetadatamultilang'], + ); + $pageIds = $this->getPageSet()->getAllTitlesByNamespace(); if ( !empty( $pageIds[NS_FILE] ) ) { $titles = array_keys( $pageIds[NS_FILE] ); @@ -146,7 +152,9 @@ class ApiQueryImageInfo extends ApiQueryBase { $fit = $this->addPageSubItem( $pageId, self::getInfo( $img, $prop, $result, - $finalThumbParams, $params['metadataversion'] ) ); + $finalThumbParams, $metadataOpts + ) + ); if ( !$fit ) { if ( count( $pageIds[NS_FILE] ) == 1 ) { // See the 'the user is screwed' comment above @@ -178,7 +186,7 @@ class ApiQueryImageInfo extends ApiQueryBase { $fit = self::getTransformCount() < self::TRANSFORM_LIMIT && $this->addPageSubItem( $pageId, self::getInfo( $oldie, $prop, $result, - $finalThumbParams, $params['metadataversion'] + $finalThumbParams, $metadataOpts ) ); if ( !$fit ) { @@ -296,10 +304,24 @@ class ApiQueryImageInfo extends ApiQueryBase { * @param array $prop of properties to get (in the keys) * @param $result ApiResult object * @param array $thumbParams containing 'width' and 'height' items, or null - * @param string $version Version of image metadata (for things like jpeg which have different versions). + * @param string|array $metadataOpts Options for metadata fetching. + * This is an array consisting of the keys: + * 'version': The metadata version for the metadata option + * 'language': The language for extmetadata property + * 'multilang': Return all translations in extmetadata property * @return Array: result array */ - static function getInfo( $file, $prop, $result, $thumbParams = null, $version = 'latest' ) { + static function getInfo( $file, $prop, $result, $thumbParams = null, $metadataOpts = false ) { + global $wgContLang; + + if ( !$metadataOpts || is_string( $metadataOpts ) ) { + $metadataOpts = array( + 'version' => $metadataOpts ?: 'latest', + 'language' => $wgContLang, + 'multilang' => false, + ); + } + $version = $metadataOpts['version']; $vals = array(); // Timestamp is shown even if the file is revdelete'd in interface // so do same here. @@ -359,6 +381,7 @@ class ApiQueryImageInfo extends ApiQueryBase { $url = isset( $prop['url'] ); $sha1 = isset( $prop['sha1'] ); $meta = isset( $prop['metadata'] ); + $extmetadata = isset( $prop['extmetadata'] ); $mime = isset( $prop['mime'] ); $mediatype = isset( $prop['mediatype'] ); $archive = isset( $prop['archivename'] ); @@ -417,6 +440,17 @@ class ApiQueryImageInfo extends ApiQueryBase { $vals['metadata'] = $metadata ? self::processMetaData( $metadata, $result ) : null; } + if ( $extmetadata ) { + // Note, this should return an array where all the keys + // start with a letter, and all the values are strings. + // Thus there should be no issue with format=xml. + $format = new FormatMetadata; + $format->setSingleLanguage( !$metadataOpts['multilang'] ); + $format->getContext()->setLanguage( $metadataOpts['language'] ); + $extmetaArray = $format->fetchExtendedMetadata( $file ); + $vals['extmetadata'] = $extmetaArray; + } + if ( $mime ) { $vals['mime'] = $file->getMimeType(); } @@ -491,6 +525,7 @@ class ApiQueryImageInfo extends ApiQueryBase { } public function getAllowedParams() { + global $wgContLang; return array( 'prop' => array( ApiBase::PARAM_ISMULTI => true, @@ -522,6 +557,14 @@ class ApiQueryImageInfo extends ApiQueryBase { ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_DFLT => '1', ), + 'extmetadatalanguage' => array( + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => $wgContLang->getCode(), + ), + 'extmetadatamultilang' => array( + ApiBase::PARAM_TYPE => 'boolean', + ApiBase::PARAM_DFLT => false, + ), 'urlparam' => array( ApiBase::PARAM_DFLT => '', ApiBase::PARAM_TYPE => 'string', @@ -564,6 +607,7 @@ class ApiQueryImageInfo extends ApiQueryBase { ' (requires url and param ' . $modulePrefix . 'urlwidth)', 'mediatype' => ' mediatype - Adds the media type of the image', 'metadata' => ' metadata - Lists Exif metadata for the version of the image', + 'extmetadata' => ' extmetadata - Lists formatted metadata combined from multiple sources. Results are HTML formatted.', 'archivename' => ' archivename - Adds the file name of the archive version for non-latest versions', 'bitdepth' => ' bitdepth - Adds the bit depth of the version', 'uploadwarning' => ' uploadwarning - Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core', @@ -603,6 +647,10 @@ class ApiQueryImageInfo extends ApiQueryBase { 'end' => 'Timestamp to stop listing at', 'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.", "Defaults to '1' for backwards compatibility" ), + 'extmetadatalanguage' => array( 'What language to fetch extmetadata in. This affects both which', + 'translation to fetch, if multiple are available, as well as how things', + 'like numbers and various values are formatted.' ), + 'extmetadatamultilang' => 'If translations for extmetadata property are available, fetch all of them.', 'continue' => 'If the query response includes a continue value, use it here to get another page of results', 'localonly' => 'Look only for files in the local repository', ); diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php index 2754bdae73..fae33772f2 100644 --- a/includes/api/ApiQueryRandom.php +++ b/includes/api/ApiQueryRandom.php @@ -176,7 +176,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase { public function getDescription() { return array( 'Get a set of random pages', - 'NOTE: Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, "Main Page" is the first ', + 'NOTE: Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, "Main Page" is the first', ' random page on your list, "List of fictional monkeys" will *always* be second, "List of people on stamps of Vanuatu" third, etc', 'NOTE: If the number of pages in the namespace is lower than rnlimit, you will get fewer pages. You will not get the same page twice' ); diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 6ab10127cd..a92c87f481 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -865,7 +865,7 @@ class MessageCache { * * @param string $title Message cache key with initial uppercase letter. * @param string $code Code denoting the language to try. - * @return string|bool The message, or false iff it does not exist or on error + * @return string|bool The message, or false if it does not exist or on error */ function getMsgFromNamespace( $title, $code ) { $this->load( $code ); diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php new file mode 100644 index 0000000000..bf800c4645 --- /dev/null +++ b/includes/changes/ChangesList.php @@ -0,0 +1,552 @@ +setContext( $obj ); + $this->skin = $obj->getSkin(); + } else { + $this->setContext( $obj->getContext() ); + $this->skin = $obj; + } + $this->preCacheMessages(); + } + + /** + * Fetch an appropriate changes list class for the main context + * This first argument used to be an User object. + * + * @deprecated in 1.18; use newFromContext() instead + * @param string|User $unused Unused + * @return ChangesList|EnhancedChangesList|OldChangesList derivative + */ + public static function newFromUser( $unused ) { + wfDeprecated( __METHOD__, '1.18' ); + return self::newFromContext( RequestContext::getMain() ); + } + + /** + * Fetch an appropriate changes list class for the specified context + * Some users might want to use an enhanced list format, for instance + * + * @param $context IContextSource to use + * @return ChangesList|EnhancedChangesList|OldChangesList derivative + */ + public static function newFromContext( IContextSource $context ) { + $user = $context->getUser(); + $sk = $context->getSkin(); + $list = null; + if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) { + $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) ); + return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context ); + } else { + return $list; + } + } + + /** + * Sets the list to use a "
    • " tag + * @param $value Boolean + */ + public function setWatchlistDivs( $value = true ) { + $this->watchlist = $value; + } + + /** + * As we use the same small set of messages in various methods and that + * they are called often, we call them once and save them in $this->message + */ + private function preCacheMessages() { + if ( !isset( $this->message ) ) { + foreach ( array( + 'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history', + 'semicolon-separator', 'pipe-separator' ) as $msg + ) { + $this->message[$msg] = $this->msg( $msg )->escaped(); + } + } + } + + /** + * Returns the appropriate flags for new page, minor change and patrolling + * @param array $flags Associative array of 'flag' => Bool + * @param string $nothing to use for empty space + * @return String + */ + public function recentChangesFlags( $flags, $nothing = ' ' ) { + global $wgRecentChangesFlags; + $f = ''; + foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) { + $f .= isset( $flags[$flag] ) && $flags[$flag] + ? self::flag( $flag ) + : $nothing; + } + return $f; + } + + /** + * Provide the "" element appropriate to a given abbreviated flag, + * namely the flag indicating a new page, a minor edit, a bot edit, or an + * unpatrolled edit. By default in English it will contain "N", "m", "b", + * "!" respectively, plus it will have an appropriate title and class. + * + * @param string $flag One key of $wgRecentChangesFlags + * @return String: Raw HTML + */ + public static function flag( $flag ) { + static $flagInfos = null; + if ( is_null( $flagInfos ) ) { + global $wgRecentChangesFlags; + $flagInfos = array(); + foreach ( $wgRecentChangesFlags as $key => $value ) { + $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped(); + $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped(); + // Allow customized class name, fall back to flag name + $flagInfos[$key]['class'] = Sanitizer::escapeClass( + isset( $value['class'] ) ? $value['class'] : $key ); + } + } + + // Inconsistent naming, bleh, kepted for b/c + $map = array( + 'minoredit' => 'minor', + 'botedit' => 'bot', + ); + if ( isset( $map[$flag] ) ) { + $flag = $map[$flag]; + } + + return "" . + $flagInfos[$flag]['letter'] . + ''; + } + + /** + * Returns text for the start of the tabular part of RC + * @return String + */ + public function beginRecentChangesList() { + $this->rc_cache = array(); + $this->rcMoveIndex = 0; + $this->rcCacheIndex = 0; + $this->lastdate = ''; + $this->rclistOpen = false; + $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' ); + return ''; + } + + /** + * Show formatted char difference + * @param $old Integer: bytes + * @param $new Integer: bytes + * @param $context IContextSource context to use + * @return String + */ + public static function showCharacterDifference( $old, $new, IContextSource $context = null ) { + global $wgRCChangedSizeThreshold, $wgMiserMode; + + if ( !$context ) { + $context = RequestContext::getMain(); + } + + $new = (int)$new; + $old = (int)$old; + $szdiff = $new - $old; + + $lang = $context->getLanguage(); + $code = $lang->getCode(); + static $fastCharDiff = array(); + if ( !isset( $fastCharDiff[$code] ) ) { + $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1'; + } + + $formattedSize = $lang->formatNum( $szdiff ); + + if ( !$fastCharDiff[$code] ) { + $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text(); + } + + if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) { + $tag = 'strong'; + } else { + $tag = 'span'; + } + + if ( $szdiff === 0 ) { + $formattedSizeClass = 'mw-plusminus-null'; + } + if ( $szdiff > 0 ) { + $formattedSize = '+' . $formattedSize; + $formattedSizeClass = 'mw-plusminus-pos'; + } + if ( $szdiff < 0 ) { + $formattedSizeClass = 'mw-plusminus-neg'; + } + + $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text(); + + return Html::element( $tag, + array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ), + $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark(); + } + + /** + * Format the character difference of one or several changes. + * + * @param $old RecentChange + * @param $new RecentChange last change to use, if not provided, $old will be used + * @return string HTML fragment + */ + public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) { + $oldlen = $old->mAttribs['rc_old_len']; + + if ( $new ) { + $newlen = $new->mAttribs['rc_new_len']; + } else { + $newlen = $old->mAttribs['rc_new_len']; + } + + if ( $oldlen === null || $newlen === null ) { + return ''; + } + + return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() ); + } + + /** + * Returns text for the end of RC + * @return String + */ + public function endRecentChangesList() { + if ( $this->rclistOpen ) { + return "
    \n"; + } else { + return ''; + } + } + + /** + * @param string $s HTML to update + * @param $rc_timestamp mixed + */ + public function insertDateHeader( &$s, $rc_timestamp ) { + # Make date header if necessary + $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() ); + if ( $date != $this->lastdate ) { + if ( $this->lastdate != '' ) { + $s .= "\n"; + } + $s .= Xml::element( 'h4', null, $date ) . "\n
      "; + $this->lastdate = $date; + $this->rclistOpen = true; + } + } + + /** + * @param string $s HTML to update + * @param $title Title + * @param $logtype string + */ + public function insertLog( &$s, $title, $logtype ) { + $page = new LogPage( $logtype ); + $logname = $page->getName()->escaped(); + $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped(); + } + + /** + * @param string $s HTML to update + * @param $rc RecentChange + * @param $unpatrolled + */ + public function insertDiffHist( &$s, &$rc, $unpatrolled ) { + # Diff link + if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) { + $diffLink = $this->message['diff']; + } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) { + $diffLink = $this->message['diff']; + } else { + $query = array( + 'curid' => $rc->mAttribs['rc_cur_id'], + 'diff' => $rc->mAttribs['rc_this_oldid'], + 'oldid' => $rc->mAttribs['rc_last_oldid'] + ); + + $diffLink = Linker::linkKnown( + $rc->getTitle(), + $this->message['diff'], + array( 'tabindex' => $rc->counter ), + $query + ); + } + $diffhist = $diffLink . $this->message['pipe-separator']; + # History link + $diffhist .= Linker::linkKnown( + $rc->getTitle(), + $this->message['hist'], + array(), + array( + 'curid' => $rc->mAttribs['rc_cur_id'], + 'action' => 'history' + ) + ); + $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' . . '; + } + + /** + * @param string $s HTML to update + * @param $rc RecentChange + * @param $unpatrolled + * @param $watched + */ + public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) { + $params = array(); + + $articlelink = Linker::linkKnown( + $rc->getTitle(), + null, + array( 'class' => 'mw-changeslist-title' ), + $params + ); + if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) { + $articlelink = '' . $articlelink . ''; + } + # To allow for boldening pages watched by this user + $articlelink = "{$articlelink}"; + # RTL/LTR marker + $articlelink .= $this->getLanguage()->getDirMark(); + + wfRunHooks( 'ChangesListInsertArticleLink', + array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) ); + + $s .= " $articlelink"; + } + + /** + * Get the timestamp from $rc formatted with current user's settings + * and a separator + * + * @param $rc RecentChange + * @return string HTML fragment + */ + public function getTimestamp( $rc ) { + return $this->message['semicolon-separator'] . '' . + $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . '; + } + + /** + * Insert time timestamp string from $rc into $s + * + * @param string $s HTML to update + * @param $rc RecentChange + */ + public function insertTimestamp( &$s, $rc ) { + $s .= $this->getTimestamp( $rc ); + } + + /** + * Insert links to user page, user talk page and eventually a blocking link + * + * @param &$s String HTML to update + * @param &$rc RecentChange + */ + public function insertUserRelatedLinks( &$s, &$rc ) { + if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) { + $s .= ' ' . $this->msg( 'rev-deleted-user' )->escaped() . ''; + } else { + $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'], + $rc->mAttribs['rc_user_text'] ); + $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); + } + } + + /** + * Insert a formatted action + * + * @param $rc RecentChange + * @return string + */ + public function insertLogEntry( $rc ) { + $formatter = LogFormatter::newFromRow( $rc->mAttribs ); + $formatter->setContext( $this->getContext() ); + $formatter->setShowUserToolLinks( true ); + $mark = $this->getLanguage()->getDirMark(); + return $formatter->getActionText() . " $mark" . $formatter->getComment(); + } + + /** + * Insert a formatted comment + * @param $rc RecentChange + * @return string + */ + public function insertComment( $rc ) { + if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) { + if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) { + return ' ' . $this->msg( 'rev-deleted-comment' )->escaped() . ''; + } else { + return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() ); + } + } + return ''; + } + + /** + * Check whether to enable recent changes patrol features + * + * @deprecated since 1.22 + * @return Boolean + */ + public static function usePatrol() { + global $wgUser; + + wfDeprecated( __METHOD__, '1.22' ); + + return $wgUser->useRCPatrol(); + } + + /** + * Returns the string which indicates the number of watching users + * @return string + */ + protected function numberofWatchingusers( $count ) { + static $cache = array(); + if ( $count > 0 ) { + if ( !isset( $cache[$count] ) ) { + $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped(); + } + return $cache[$count]; + } else { + return ''; + } + } + + /** + * Determine if said field of a revision is hidden + * @param $rc RCCacheEntry + * @param $field Integer: one of DELETED_* bitfield constants + * @return Boolean + */ + public static function isDeleted( $rc, $field ) { + return ( $rc->mAttribs['rc_deleted'] & $field ) == $field; + } + + /** + * Determine if the current user is allowed to view a particular + * field of this revision, if it's marked as deleted. + * @param $rc RCCacheEntry + * @param $field Integer + * @param $user User object to check, or null to use $wgUser + * @return Boolean + */ + public static function userCan( $rc, $field, User $user = null ) { + if ( $rc->mAttribs['rc_type'] == RC_LOG ) { + return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user ); + } else { + return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user ); + } + } + + /** + * @param $link string + * @param $watched bool + * @return string + */ + protected function maybeWatchedLink( $link, $watched = false ) { + if ( $watched ) { + return '' . $link . ''; + } else { + return '' . $link . ''; + } + } + + /** Inserts a rollback link + * + * @param $s string + * @param $rc RecentChange + */ + public function insertRollback( &$s, &$rc ) { + if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) { + $page = $rc->getTitle(); + /** Check for rollback and edit permissions, disallow special pages, and only + * show a link on the top-most revision */ + if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] ) + { + $rev = new Revision( array( + 'title' => $page, + 'id' => $rc->mAttribs['rc_this_oldid'], + 'user' => $rc->mAttribs['rc_user'], + 'user_text' => $rc->mAttribs['rc_user_text'], + 'deleted' => $rc->mAttribs['rc_deleted'] + ) ); + $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() ); + } + } + } + + /** + * @param $s string + * @param $rc RecentChange + * @param $classes + */ + public function insertTags( &$s, &$rc, &$classes ) { + if ( empty( $rc->mAttribs['ts_tags'] ) ) { + return; + } + + list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' ); + $classes = array_merge( $classes, $newClasses ); + $s .= ' ' . $tagSummary; + } + + public function insertExtra( &$s, &$rc, &$classes ) { + // Empty, used for subclasses to add anything special. + } + + protected function showAsUnpatrolled( RecentChange $rc ) { + $unpatrolled = false; + if ( !$rc->mAttribs['rc_patrolled'] ) { + if ( $this->getUser()->useRCPatrol() ) { + $unpatrolled = true; + } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) { + $unpatrolled = true; + } + } + return $unpatrolled; + } +} diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php new file mode 100644 index 0000000000..433adb375c --- /dev/null +++ b/includes/changes/EnhancedChangesList.php @@ -0,0 +1,662 @@ +rc_cache = array(); + $this->rcMoveIndex = 0; + $this->rcCacheIndex = 0; + $this->lastdate = ''; + $this->rclistOpen = false; + $this->getOutput()->addModuleStyles( array( + 'mediawiki.special.changeslist', + 'mediawiki.special.changeslist.enhanced', + ) ); + $this->getOutput()->addModules( array( + 'jquery.makeCollapsible', + 'mediawiki.icon', + ) ); + return ''; + } + /** + * Format a line for enhanced recentchange (aka with javascript and block of lines). + * + * @param $baseRC RecentChange + * @param $watched bool + * + * @return string + */ + public function recentChangesLine( &$baseRC, $watched = false ) { + wfProfileIn( __METHOD__ ); + + # Create a specialised object + $rc = RCCacheEntry::newFromParent( $baseRC ); + + $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] ); + + # If it's a new day, add the headline and flush the cache + $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() ); + $ret = ''; + if ( $date != $this->lastdate ) { + # Process current cache + $ret = $this->recentChangesBlock(); + $this->rc_cache = array(); + $ret .= Xml::element( 'h4', null, $date ) . "\n"; + $this->lastdate = $date; + } + + # Should patrol-related stuff be shown? + $rc->unpatrolled = $this->showAsUnpatrolled( $rc ); + + $showdifflinks = true; + # Make article link + $type = $rc->mAttribs['rc_type']; + $logType = $rc->mAttribs['rc_log_type']; + // Page moves, very old style, not supported anymore + if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { + // New unpatrolled pages + } elseif ( $rc->unpatrolled && $type == RC_NEW ) { + $clink = Linker::linkKnown( $rc->getTitle() ); + // Log entries + } elseif ( $type == RC_LOG ) { + if ( $logType ) { + $logtitle = SpecialPage::getTitleFor( 'Log', $logType ); + $logpage = new LogPage( $logType ); + $logname = $logpage->getName()->escaped(); + $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped(); + } else { + $clink = Linker::link( $rc->getTitle() ); + } + $watched = false; + // Log entries (old format) and special pages + } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) { + wfDebug( "Unexpected special page in recentchanges\n" ); + $clink = ''; + // Edits + } else { + $clink = Linker::linkKnown( $rc->getTitle() ); + } + + # Don't show unusable diff links + if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) { + $showdifflinks = false; + } + + $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ); + $rc->watched = $watched; + $rc->link = $clink; + $rc->timestamp = $time; + $rc->numberofWatchingusers = $baseRC->numberofWatchingusers; + + # Make "cur" and "diff" links. Do not use link(), it is too slow if + # called too many times (50% of CPU time on RecentChanges!). + $thisOldid = $rc->mAttribs['rc_this_oldid']; + $lastOldid = $rc->mAttribs['rc_last_oldid']; + + $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid ); + $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ); + + if ( !$showdifflinks ) { + $curLink = $this->message['cur']; + $diffLink = $this->message['diff']; + } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) { + if ( $type != RC_NEW ) { + $curLink = $this->message['cur']; + } else { + $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) ); + $curLink = "counter}\">{$this->message['cur']}"; + } + $diffLink = $this->message['diff']; + } else { + $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) ); + $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) ); + $diffLink = "counter}\">{$this->message['diff']}"; + $curLink = "counter}\">{$this->message['cur']}"; + } + + # Make "last" link + if ( !$showdifflinks || !$lastOldid ) { + $lastLink = $this->message['last']; + } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) { + $lastLink = $this->message['last']; + } else { + $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'], + array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) ); + } + + # Make user links + if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) { + $rc->userlink = ' ' . $this->msg( 'rev-deleted-user' )->escaped() . ''; + } else { + $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); + $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] ); + } + + $rc->lastlink = $lastLink; + $rc->curlink = $curLink; + $rc->difflink = $diffLink; + + # Put accumulated information into the cache, for later display + # Page moves go on their own line + $title = $rc->getTitle(); + $secureName = $title->getPrefixedDBkey(); + if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { + # Use an @ character to prevent collision with page names + $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc ); + } else { + # Logs are grouped by type + if ( $type == RC_LOG ) { + $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey(); + } + if ( !isset( $this->rc_cache[$secureName] ) ) { + $this->rc_cache[$secureName] = array(); + } + + array_push( $this->rc_cache[$secureName], $rc ); + } + + wfProfileOut( __METHOD__ ); + + return $ret; + } + + /** + * Enhanced RC group + * @return string + */ + protected function recentChangesBlockGroup( $block ) { + global $wgRCShowChangedSize; + + wfProfileIn( __METHOD__ ); + + # Add the namespace and title of the block as part of the class + $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' ); + if ( $block[0]->mAttribs['rc_log_type'] ) { + # Log entry + $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' + . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] ); + } else { + $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' + . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] ); + } + $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched + ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; + $r = Html::openElement( 'table', array( 'class' => $classes ) ) . + Html::openElement( 'tr' ); + + # Collate list of users + $userlinks = array(); + # Other properties + $unpatrolled = false; + $isnew = false; + $allBots = true; + $allMinors = true; + $curId = $currentRevision = 0; + # Some catalyst variables... + $namehidden = true; + $allLogs = true; + foreach ( $block as $rcObj ) { + $oldid = $rcObj->mAttribs['rc_last_oldid']; + if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) { + $isnew = true; + } + // If all log actions to this page were hidden, then don't + // give the name of the affected page for this block! + if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) { + $namehidden = false; + } + $u = $rcObj->userlink; + if ( !isset( $userlinks[$u] ) ) { + $userlinks[$u] = 0; + } + if ( $rcObj->unpatrolled ) { + $unpatrolled = true; + } + if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) { + $allLogs = false; + } + # Get the latest entry with a page_id and oldid + # since logs may not have these. + if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) { + $curId = $rcObj->mAttribs['rc_cur_id']; + } + if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) { + $currentRevision = $rcObj->mAttribs['rc_this_oldid']; + } + + if ( !$rcObj->mAttribs['rc_bot'] ) { + $allBots = false; + } + if ( !$rcObj->mAttribs['rc_minor'] ) { + $allMinors = false; + } + + $userlinks[$u]++; + } + + # Sort the list and convert to text + krsort( $userlinks ); + asort( $userlinks ); + $users = array(); + foreach ( $userlinks as $userlink => $count ) { + $text = $userlink; + $text .= $this->getLanguage()->getDirMark(); + if ( $count > 1 ) { + $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped(); + } + array_push( $users, $text ); + } + + $users = ' ' + . $this->msg( 'brackets' )->rawParams( + implode( $this->message['semicolon-separator'], $users ) + )->escaped() . ''; + + $tl = ''; + $r .= "$tl"; + + # Main line + $r .= '' . $this->recentChangesFlags( array( + 'newpage' => $isnew, # show, when one have this flag + 'minor' => $allMinors, # show only, when all have this flag + 'unpatrolled' => $unpatrolled, # show, when one have this flag + 'bot' => $allBots, # show only, when all have this flag + ) ); + + # Timestamp + $r .= ' ' . $block[0]->timestamp . ' '; + + # Article link + if ( $namehidden ) { + $r .= ' ' . $this->msg( 'rev-deleted-event' )->escaped() . ''; + } elseif ( $allLogs ) { + $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched ); + } else { + $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched ); + } + + $r .= $this->getLanguage()->getDirMark(); + + $queryParams['curid'] = $curId; + + # Changes message + static $nchanges = array(); + static $sinceLastVisitMsg = array(); + + $n = count( $block ); + if ( !isset( $nchanges[$n] ) ) { + $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped(); + } + + $sinceLast = 0; + $unvisitedOldid = null; + foreach ( $block as $rcObj ) { + // Same logic as below inside main foreach + if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) { + $sinceLast++; + $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid']; + } + } + if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) { + $sinceLastVisitMsg[$sinceLast] = + $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped(); + } + + # Total change link + $r .= ' '; + $logtext = ''; + if ( !$allLogs ) { + if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { + $logtext .= $nchanges[$n]; + } elseif ( $isnew ) { + $logtext .= $nchanges[$n]; + } else { + $logtext .= Linker::link( + $block[0]->getTitle(), + $nchanges[$n], + array(), + $queryParams + array( + 'diff' => $currentRevision, + 'oldid' => $oldid, + ), + array( 'known', 'noclasses' ) + ); + if ( $sinceLast > 0 && $sinceLast < $n ) { + $logtext .= $this->message['pipe-separator'] . Linker::link( + $block[0]->getTitle(), + $sinceLastVisitMsg[$sinceLast], + array(), + $queryParams + array( + 'diff' => $currentRevision, + 'oldid' => $unvisitedOldid, + ), + array( 'known', 'noclasses' ) + ); + } + } + } + + # History + if ( $allLogs ) { + // don't show history link for logs + } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) { + $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history']; + } else { + $params = $queryParams; + $params['action'] = 'history'; + + $logtext .= $this->message['pipe-separator'] . + Linker::linkKnown( + $block[0]->getTitle(), + $this->message['enhancedrc-history'], + array(), + $params + ); + } + + if ( $logtext !== '' ) { + $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped(); + } + + $r .= ' . . '; + + # Character difference (does not apply if only log items) + if ( $wgRCShowChangedSize && !$allLogs ) { + $last = 0; + $first = count( $block ) - 1; + # Some events (like logs) have an "empty" size, so we need to skip those... + while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) { + $last++; + } + while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) { + $first--; + } + # Get net change + $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] ); + + if ( $chardiff == '' ) { + $r .= ' '; + } else { + $r .= ' ' . $chardiff . ' . . '; + } + } + + $r .= $users; + $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers ); + + # Sub-entries + foreach ( $block as $rcObj ) { + # Classes to apply -- TODO implement + $classes = array(); + $type = $rcObj->mAttribs['rc_type']; + + $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched + ? ' class="mw-enhanced-watched"' : ''; + + $r .= ''; + $r .= $this->recentChangesFlags( array( + 'newpage' => $type == RC_NEW, + 'minor' => $rcObj->mAttribs['rc_minor'], + 'unpatrolled' => $rcObj->unpatrolled, + 'bot' => $rcObj->mAttribs['rc_bot'], + ) ); + $r .= ' '; + + $params = $queryParams; + + if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) { + $params['oldid'] = $rcObj->mAttribs['rc_this_oldid']; + } + + # Log timestamp + if ( $type == RC_LOG ) { + $link = $rcObj->timestamp; + # Revision link + } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) { + $link = '' . $rcObj->timestamp . ' '; + } else { + + $link = Linker::linkKnown( + $rcObj->getTitle(), + $rcObj->timestamp, + array(), + $params + ); + if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) { + $link = '' . $link . ' '; + } + } + $r .= $link . ''; + + if ( !$type == RC_LOG || $type == RC_NEW ) { + $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped(); + } + $r .= ' . . '; + + # Character diff + if ( $wgRCShowChangedSize ) { + $cd = $this->formatCharacterDifference( $rcObj ); + if ( $cd !== '' ) { + $r .= $cd . ' . . '; + } + } + + if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) { + $r .= $this->insertLogEntry( $rcObj ); + } else { + # User links + $r .= $rcObj->userlink; + $r .= $rcObj->usertalklink; + $r .= $this->insertComment( $rcObj ); + } + + # Rollback + $this->insertRollback( $r, $rcObj ); + # Tags + $this->insertTags( $r, $rcObj, $classes ); + + $r .= "\n"; + } + $r .= "\n"; + + $this->rcCacheIndex++; + + wfProfileOut( __METHOD__ ); + + return $r; + } + + /** + * Generate HTML for an arrow or placeholder graphic + * @param string $dir one of '', 'd', 'l', 'r' + * @param string $alt text + * @param string $title text + * @return String: HTML "" tag + */ + protected function arrow( $dir, $alt = '', $title = '' ) { + global $wgStylePath; + $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' ); + $encAlt = htmlspecialchars( $alt ); + $encTitle = htmlspecialchars( $title ); + return "\"$encAlt\""; + } + + /** + * Generate HTML for a right- or left-facing arrow, + * depending on language direction. + * @return String: HTML "" tag + */ + protected function sideArrow() { + $dir = $this->getLanguage()->isRTL() ? 'l' : 'r'; + return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() ); + } + + /** + * Generate HTML for a down-facing arrow + * depending on language direction. + * @return String: HTML "" tag + */ + protected function downArrow() { + return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() ); + } + + /** + * Generate HTML for a spacer image + * @return String: HTML "" tag + */ + protected function spacerArrow() { + return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space + } + + /** + * Enhanced RC ungrouped line. + * + * @param $rcObj RecentChange + * @return String: a HTML formatted line (generated using $r) + */ + protected function recentChangesBlockLine( $rcObj ) { + global $wgRCShowChangedSize; + + wfProfileIn( __METHOD__ ); + $query['curid'] = $rcObj->mAttribs['rc_cur_id']; + + $type = $rcObj->mAttribs['rc_type']; + $logType = $rcObj->mAttribs['rc_log_type']; + $classes = array( 'mw-enhanced-rc' ); + if ( $logType ) { + # Log entry + $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-' + . $logType . '-' . $rcObj->mAttribs['rc_title'] ); + } else { + $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' . + $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] ); + } + $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched + ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; + $r = Html::openElement( 'table', array( 'class' => $classes ) ) . + Html::openElement( 'tr' ); + + $r .= ''; + # Flag and Timestamp + if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) { + $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders + } else { + $r .= $this->recentChangesFlags( array( + 'newpage' => $type == RC_NEW, + 'minor' => $rcObj->mAttribs['rc_minor'], + 'unpatrolled' => $rcObj->unpatrolled, + 'bot' => $rcObj->mAttribs['rc_bot'], + ) ); + } + $r .= ' ' . $rcObj->timestamp . ' '; + # Article or log link + if ( $logType ) { + $logPage = new LogPage( $logType ); + $logTitle = SpecialPage::getTitleFor( 'Log', $logType ); + $logName = $logPage->getName()->escaped(); + $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped(); + } else { + $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched ); + } + # Diff and hist links + if ( $type != RC_LOG ) { + $query['action'] = 'history'; + $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown( + $rcObj->getTitle(), + $this->message['hist'], + array(), + $query + ) )->escaped(); + } + $r .= ' . . '; + # Character diff + if ( $wgRCShowChangedSize ) { + $cd = $this->formatCharacterDifference( $rcObj ); + if ( $cd !== '' ) { + $r .= $cd . ' . . '; + } + } + + if ( $type == RC_LOG ) { + $r .= $this->insertLogEntry( $rcObj ); + } else { + $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink; + $r .= $this->insertComment( $rcObj ); + $this->insertRollback( $r, $rcObj ); + } + + # Tags + $this->insertTags( $r, $rcObj, $classes ); + # Show how many people are watching this if enabled + $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers ); + + $r .= "\n"; + + wfProfileOut( __METHOD__ ); + + return $r; + } + + /** + * If enhanced RC is in use, this function takes the previously cached + * RC lines, arranges them, and outputs the HTML + * + * @return string + */ + protected function recentChangesBlock() { + if ( count ( $this->rc_cache ) == 0 ) { + return ''; + } + + wfProfileIn( __METHOD__ ); + + $blockOut = ''; + foreach ( $this->rc_cache as $block ) { + if ( count( $block ) < 2 ) { + $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) ); + } else { + $blockOut .= $this->recentChangesBlockGroup( $block ); + } + } + + wfProfileOut( __METHOD__ ); + + return '
      ' . $blockOut . '
      '; + } + + /** + * Returns text for the end of RC + * If enhanced RC is in use, returns pretty much all the text + * @return string + */ + public function endRecentChangesList() { + return $this->recentChangesBlock() . parent::endRecentChangesList(); + } + +} diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php new file mode 100644 index 0000000000..a7fe9342ef --- /dev/null +++ b/includes/changes/OldChangesList.php @@ -0,0 +1,130 @@ +showAsUnpatrolled( $rc ); + + $dateheader = ''; // $s now contains only
    • ...
    • , for hooks' convenience. + $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] ); + + $s = ''; + $classes = array(); + // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468) + if ( $linenumber ) { + if ( $linenumber & 1 ) { + $classes[] = 'mw-line-odd'; + } else { + $classes[] = 'mw-line-even'; + } + } + + // Indicate watched status on the line to allow for more + // comprehensive styling. + $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched + ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched'; + + // Moved pages (very very old, not supported anymore) + if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) { + // Log entries + } elseif ( $rc->mAttribs['rc_log_type'] ) { + $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] ); + $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] ); + // Log entries (old format) or log targets, and special pages + } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) { + list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] ); + if ( $name == 'Log' ) { + $this->insertLog( $s, $rc->getTitle(), $subpage ); + } + // Regular entries + } else { + $this->insertDiffHist( $s, $rc, $unpatrolled ); + # M, N, b and ! (minor, new, bot and unpatrolled) + $s .= $this->recentChangesFlags( + array( + 'newpage' => $rc->mAttribs['rc_type'] == RC_NEW, + 'minor' => $rc->mAttribs['rc_minor'], + 'unpatrolled' => $unpatrolled, + 'bot' => $rc->mAttribs['rc_bot'] + ), + '' + ); + $this->insertArticleLink( $s, $rc, $unpatrolled, $watched ); + } + # Edit/log timestamp + $this->insertTimestamp( $s, $rc ); + # Bytes added or removed + if ( $wgRCShowChangedSize ) { + $cd = $this->formatCharacterDifference( $rc ); + if ( $cd !== '' ) { + $s .= $cd . ' . . '; + } + } + + if ( $rc->mAttribs['rc_type'] == RC_LOG ) { + $s .= $this->insertLogEntry( $rc ); + } else { + # User tool links + $this->insertUserRelatedLinks( $s, $rc ); + # LTR/RTL direction mark + $s .= $this->getLanguage()->getDirMark(); + $s .= $this->insertComment( $rc ); + } + + # Tags + $this->insertTags( $s, $rc, $classes ); + # Rollback + $this->insertRollback( $s, $rc ); + # For subclasses + $this->insertExtra( $s, $rc, $classes ); + + # How many users watch this page + if ( $rc->numberofWatchingusers > 0 ) { + $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers ); + } + + if ( $this->watchlist ) { + $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] ); + } + + if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) { + wfProfileOut( __METHOD__ ); + return false; + } + + wfProfileOut( __METHOD__ ); + return "$dateheader
    • " . $s . "
    • \n"; + } +} diff --git a/includes/changes/RCCacheEntry.php b/includes/changes/RCCacheEntry.php new file mode 100644 index 0000000000..9aef3d30e2 --- /dev/null +++ b/includes/changes/RCCacheEntry.php @@ -0,0 +1,35 @@ +mAttribs = $rc->mAttribs; + $rc2->mExtra = $rc->mExtra; + return $rc2; + } +} diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php new file mode 100644 index 0000000000..282890f726 --- /dev/null +++ b/includes/changes/RecentChange.php @@ -0,0 +1,860 @@ +loadFromRow( $row ); + return $rc; + } + + /** + * @deprecated in 1.22 + * @param $row + * @return RecentChange + */ + public static function newFromCurRow( $row ) { + wfDeprecated( __METHOD__, '1.22' ); + $rc = new RecentChange; + $rc->loadFromCurRow( $row ); + $rc->notificationtimestamp = false; + $rc->numberofWatchingusers = false; + return $rc; + } + + /** + * Obtain the recent change with a given rc_id value + * + * @param int $rcid rc_id value to retrieve + * @return RecentChange + */ + public static function newFromId( $rcid ) { + return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ ); + } + + /** + * Find the first recent change matching some specific conditions + * + * @param array $conds of conditions + * @param $fname Mixed: override the method name in profiling/logs + * @param $options Array Query options + * @return RecentChange + */ + public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) { + $dbr = wfGetDB( DB_SLAVE ); + $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options ); + if ( $row !== false ) { + return self::newFromRow( $row ); + } else { + return null; + } + } + + /** + * Return the list of recentchanges fields that should be selected to create + * a new recentchanges object. + * @return array + */ + public static function selectFields() { + return array( + 'rc_id', + 'rc_timestamp', + 'rc_cur_time', + 'rc_user', + 'rc_user_text', + 'rc_namespace', + 'rc_title', + 'rc_comment', + 'rc_minor', + 'rc_bot', + 'rc_new', + 'rc_cur_id', + 'rc_this_oldid', + 'rc_last_oldid', + 'rc_type', + 'rc_source', + 'rc_patrolled', + 'rc_ip', + 'rc_old_len', + 'rc_new_len', + 'rc_deleted', + 'rc_logid', + 'rc_log_type', + 'rc_log_action', + 'rc_params', + ); + } + + # Accessors + + /** + * @param $attribs array + */ + public function setAttribs( $attribs ) { + $this->mAttribs = $attribs; + } + + /** + * @param $extra array + */ + public function setExtra( $extra ) { + $this->mExtra = $extra; + } + + /** + * + * @return Title + */ + public function &getTitle() { + if ( $this->mTitle === false ) { + $this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] ); + } + return $this->mTitle; + } + + /** + * Get the User object of the person who performed this change. + * + * @return User + */ + public function getPerformer() { + if ( $this->mPerformer === false ) { + if ( $this->mAttribs['rc_user'] ) { + $this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] ); + } else { + $this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false ); + } + } + return $this->mPerformer; + } + + /** + * Writes the data in this object to the database + * @param $noudp bool + */ + public function save( $noudp = false ) { + global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang; + + $dbw = wfGetDB( DB_MASTER ); + if ( !is_array( $this->mExtra ) ) { + $this->mExtra = array(); + } + $this->mExtra['lang'] = $wgLocalInterwiki; + + if ( !$wgPutIPinRC ) { + $this->mAttribs['rc_ip'] = ''; + } + + # If our database is strict about IP addresses, use NULL instead of an empty string + if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) { + unset( $this->mAttribs['rc_ip'] ); + } + + # Trim spaces on user supplied text + $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] ); + + # Make sure summary is truncated (whole multibyte characters) + $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 ); + + # Fixup database timestamps + $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] ); + $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] ); + $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' ); + + ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL + if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) { + unset( $this->mAttribs['rc_cur_id'] ); + } + + # Insert new row + $dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ ); + + # Set the ID + $this->mAttribs['rc_id'] = $dbw->insertId(); + + # Notify extensions + wfRunHooks( 'RecentChange_save', array( &$this ) ); + + # Notify external application via UDP + if ( !$noudp ) { + $this->notifyRCFeeds(); + } + + # E-mail notifications + if ( $wgUseEnotif || $wgShowUpdatedMarker ) { + $editor = $this->getPerformer(); + $title = $this->getTitle(); + + if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) { + # @todo FIXME: This would be better as an extension hook + $enotif = new EmailNotification(); + $enotif->notifyOnPageChange( $editor, $title, + $this->mAttribs['rc_timestamp'], + $this->mAttribs['rc_comment'], + $this->mAttribs['rc_minor'], + $this->mAttribs['rc_last_oldid'], + $this->mExtra['pageStatus'] ); + } + } + } + + /** + * @deprecated since 1.22, use notifyRCFeeds instead. + */ + public function notifyRC2UDP() { + wfDeprecated( __METHOD__, '1.22' ); + $this->notifyRCFeeds(); + } + + /** + * Send some text to UDP. + * @deprecated since 1.22 + */ + public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) { + global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix; + + wfDeprecated( __METHOD__, '1.22' ); + + # Assume default for standard RC case + $address = $address ? $address : $wgRC2UDPAddress; + $prefix = $prefix ? $prefix : $wgRC2UDPPrefix; + $port = $port ? $port : $wgRC2UDPPort; + + $engine = new UDPRCFeedEngine(); + $feed = array( + 'uri' => "udp://$address:$port/$prefix", + 'formatter' => 'IRCColourfulRCFeedFormatter', + 'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix, + ); + + return $engine->send( $feed, $line ); + } + + /** + * Notify all the feeds about the change. + */ + public function notifyRCFeeds() { + global $wgRCFeeds; + + foreach ( $wgRCFeeds as $feed ) { + $engine = self::getEngine( $feed['uri'] ); + + if ( isset( $this->mExtra['actionCommentIRC'] ) ) { + $actionComment = $this->mExtra['actionCommentIRC']; + } else { + $actionComment = null; + } + + $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false; + + if ( + ( $omitBots && $this->mAttribs['rc_bot'] ) || + $this->mAttribs['rc_type'] == RC_EXTERNAL + ) { + continue; + } + + $formatter = new $feed['formatter'](); + $line = $formatter->getLine( $feed, $this, $actionComment ); + + $engine->send( $feed, $line ); + } + } + + /** + * Gets the stream engine object for a given URI from $wgRCEngines + * + * @param $uri string URI to get the engine object for + * @return object The engine object + */ + private static function getEngine( $uri ) { + global $wgRCEngines; + + $scheme = parse_url( $uri, PHP_URL_SCHEME ); + if ( !$scheme ) { + throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" ); + } + + if ( !isset( $wgRCEngines[$scheme] ) ) { + throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" ); + } + + return new $wgRCEngines[$scheme]; + } + + /** + * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter + */ + public static function cleanupForIRC( $text ) { + wfDeprecated( __METHOD__, '1.22' ); + return IRCColourfulRCFeedFormatter::cleanupForIRC( $text ); + } + + /** + * Mark a given change as patrolled + * + * @param $change Mixed: RecentChange or corresponding rc_id + * @param $auto Boolean: for automatic patrol + * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id + */ + public static function markPatrolled( $change, $auto = false ) { + global $wgUser; + + $change = $change instanceof RecentChange + ? $change + : RecentChange::newFromId( $change ); + + if ( !$change instanceof RecentChange ) { + return null; + } + return $change->doMarkPatrolled( $wgUser, $auto ); + } + + /** + * Mark this RecentChange as patrolled + * + * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors + * @param $user User object doing the action + * @param $auto Boolean: for automatic patrol + * @return array of permissions errors, see Title::getUserPermissionsErrors() + */ + public function doMarkPatrolled( User $user, $auto = false ) { + global $wgUseRCPatrol, $wgUseNPPatrol; + $errors = array(); + // If recentchanges patrol is disabled, only new pages + // can be patrolled + if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) { + $errors[] = array( 'rcpatroldisabled' ); + } + // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol" + $right = $auto ? 'autopatrol' : 'patrol'; + $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) ); + if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) { + $errors[] = array( 'hookaborted' ); + } + // Users without the 'autopatrol' right can't patrol their + // own revisions + if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) { + $errors[] = array( 'markedaspatrollederror-noautopatrol' ); + } + if ( $errors ) { + return $errors; + } + // If the change was patrolled already, do nothing + if ( $this->getAttribute( 'rc_patrolled' ) ) { + return array(); + } + // Actually set the 'patrolled' flag in RC + $this->reallyMarkPatrolled(); + // Log this patrol event + PatrolLog::record( $this, $auto, $user ); + wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) ); + return array(); + } + + /** + * Mark this RecentChange patrolled, without error checking + * @return Integer: number of affected rows + */ + public function reallyMarkPatrolled() { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( + 'recentchanges', + array( + 'rc_patrolled' => 1 + ), + array( + 'rc_id' => $this->getAttribute( 'rc_id' ) + ), + __METHOD__ + ); + // Invalidate the page cache after the page has been patrolled + // to make sure that the Patrol link isn't visible any longer! + $this->getTitle()->invalidateCache(); + return $dbw->affectedRows(); + } + + /** + * Makes an entry in the database corresponding to an edit + * + * @param $timestamp + * @param $title Title + * @param $minor + * @param $user User + * @param $comment + * @param $oldId + * @param $lastTimestamp + * @param $bot + * @param $ip string + * @param $oldSize int + * @param $newSize int + * @param $newId int + * @param $patrol int + * @return RecentChange + */ + public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId, + $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) { + $rc = new RecentChange; + $rc->mTitle = $title; + $rc->mPerformer = $user; + $rc->mAttribs = array( + 'rc_timestamp' => $timestamp, + 'rc_cur_time' => $timestamp, + 'rc_namespace' => $title->getNamespace(), + 'rc_title' => $title->getDBkey(), + 'rc_type' => RC_EDIT, + 'rc_source' => self::SRC_EDIT, + 'rc_minor' => $minor ? 1 : 0, + 'rc_cur_id' => $title->getArticleID(), + 'rc_user' => $user->getId(), + 'rc_user_text' => $user->getName(), + 'rc_comment' => $comment, + 'rc_this_oldid' => $newId, + 'rc_last_oldid' => $oldId, + 'rc_bot' => $bot ? 1 : 0, + 'rc_ip' => self::checkIPAddress( $ip ), + 'rc_patrolled' => intval( $patrol ), + 'rc_new' => 0, # obsolete + 'rc_old_len' => $oldSize, + 'rc_new_len' => $newSize, + 'rc_deleted' => 0, + 'rc_logid' => 0, + 'rc_log_type' => null, + 'rc_log_action' => '', + 'rc_params' => '' + ); + + $rc->mExtra = array( + 'prefixedDBkey' => $title->getPrefixedDBkey(), + 'lastTimestamp' => $lastTimestamp, + 'oldSize' => $oldSize, + 'newSize' => $newSize, + 'pageStatus' => 'changed' + ); + $rc->save(); + return $rc; + } + + /** + * Makes an entry in the database corresponding to page creation + * Note: the title object must be loaded with the new id using resetArticleID() + * @todo Document parameters and return + * + * @param $timestamp + * @param $title Title + * @param $minor + * @param $user User + * @param $comment + * @param $bot + * @param $ip string + * @param $size int + * @param $newId int + * @param $patrol int + * @return RecentChange + */ + public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot, + $ip = '', $size = 0, $newId = 0, $patrol = 0 ) { + $rc = new RecentChange; + $rc->mTitle = $title; + $rc->mPerformer = $user; + $rc->mAttribs = array( + 'rc_timestamp' => $timestamp, + 'rc_cur_time' => $timestamp, + 'rc_namespace' => $title->getNamespace(), + 'rc_title' => $title->getDBkey(), + 'rc_type' => RC_NEW, + 'rc_source' => self::SRC_NEW, + 'rc_minor' => $minor ? 1 : 0, + 'rc_cur_id' => $title->getArticleID(), + 'rc_user' => $user->getId(), + 'rc_user_text' => $user->getName(), + 'rc_comment' => $comment, + 'rc_this_oldid' => $newId, + 'rc_last_oldid' => 0, + 'rc_bot' => $bot ? 1 : 0, + 'rc_ip' => self::checkIPAddress( $ip ), + 'rc_patrolled' => intval( $patrol ), + 'rc_new' => 1, # obsolete + 'rc_old_len' => 0, + 'rc_new_len' => $size, + 'rc_deleted' => 0, + 'rc_logid' => 0, + 'rc_log_type' => null, + 'rc_log_action' => '', + 'rc_params' => '' + ); + + $rc->mExtra = array( + 'prefixedDBkey' => $title->getPrefixedDBkey(), + 'lastTimestamp' => 0, + 'oldSize' => 0, + 'newSize' => $size, + 'pageStatus' => 'created' + ); + $rc->save(); + return $rc; + } + + /** + * @param $timestamp + * @param $title + * @param $user + * @param $actionComment + * @param $ip string + * @param $type + * @param $action + * @param $target + * @param $logComment + * @param $params + * @param $newId int + * @param $actionCommentIRC string + * @return bool + */ + public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type, + $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) + { + global $wgLogRestrictions; + # Don't add private logs to RC! + if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) { + return false; + } + $rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action, + $target, $logComment, $params, $newId, $actionCommentIRC ); + $rc->save(); + return true; + } + + /** + * @param $timestamp + * @param $title Title + * @param $user User + * @param $actionComment + * @param $ip string + * @param $type + * @param $action + * @param $target Title + * @param $logComment + * @param $params + * @param $newId int + * @param $actionCommentIRC string + * @return RecentChange + */ + public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip, + $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) { + global $wgRequest; + + ## Get pageStatus for email notification + switch ( $type . '-' . $action ) { + case 'delete-delete': + $pageStatus = 'deleted'; + break; + case 'move-move': + case 'move-move_redir': + $pageStatus = 'moved'; + break; + case 'delete-restore': + $pageStatus = 'restored'; + break; + case 'upload-upload': + $pageStatus = 'created'; + break; + case 'upload-overwrite': + default: + $pageStatus = 'changed'; + break; + } + + $rc = new RecentChange; + $rc->mTitle = $target; + $rc->mPerformer = $user; + $rc->mAttribs = array( + 'rc_timestamp' => $timestamp, + 'rc_cur_time' => $timestamp, + 'rc_namespace' => $target->getNamespace(), + 'rc_title' => $target->getDBkey(), + 'rc_type' => RC_LOG, + 'rc_source' => self::SRC_LOG, + 'rc_minor' => 0, + 'rc_cur_id' => $target->getArticleID(), + 'rc_user' => $user->getId(), + 'rc_user_text' => $user->getName(), + 'rc_comment' => $logComment, + 'rc_this_oldid' => 0, + 'rc_last_oldid' => 0, + 'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0, + 'rc_ip' => self::checkIPAddress( $ip ), + 'rc_patrolled' => 1, + 'rc_new' => 0, # obsolete + 'rc_old_len' => null, + 'rc_new_len' => null, + 'rc_deleted' => 0, + 'rc_logid' => $newId, + 'rc_log_type' => $type, + 'rc_log_action' => $action, + 'rc_params' => $params + ); + + $rc->mExtra = array( + 'prefixedDBkey' => $title->getPrefixedDBkey(), + 'lastTimestamp' => 0, + 'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage + 'pageStatus' => $pageStatus, + 'actionCommentIRC' => $actionCommentIRC + ); + return $rc; + } + + /** + * Initialises the members of this object from a mysql row object + * + * @param $row + */ + public function loadFromRow( $row ) { + $this->mAttribs = get_object_vars( $row ); + $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] ); + $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set + } + + /** + * Makes a pseudo-RC entry from a cur row + * + * @deprected in 1.22 + * @param $row + */ + public function loadFromCurRow( $row ) { + wfDeprecated( __METHOD__, '1.22' ); + $this->mAttribs = array( + 'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ), + 'rc_cur_time' => $row->rev_timestamp, + 'rc_user' => $row->rev_user, + 'rc_user_text' => $row->rev_user_text, + 'rc_namespace' => $row->page_namespace, + 'rc_title' => $row->page_title, + 'rc_comment' => $row->rev_comment, + 'rc_minor' => $row->rev_minor_edit ? 1 : 0, + 'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT, + 'rc_source' => $row->page_is_new ? self::SRC_NEW : self::SRC_EDIT, + 'rc_cur_id' => $row->page_id, + 'rc_this_oldid' => $row->rev_id, + 'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0, + 'rc_bot' => 0, + 'rc_ip' => '', + 'rc_id' => $row->rc_id, + 'rc_patrolled' => $row->rc_patrolled, + 'rc_new' => $row->page_is_new, # obsolete + 'rc_old_len' => $row->rc_old_len, + 'rc_new_len' => $row->rc_new_len, + 'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '', + 'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null, + 'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null, + 'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0, + 'rc_deleted' => $row->rc_deleted // MUST be set + ); + } + + /** + * Get an attribute value + * + * @param string $name Attribute name + * @return mixed + */ + public function getAttribute( $name ) { + return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null; + } + + /** + * @return array + */ + public function getAttributes() { + return $this->mAttribs; + } + + /** + * Gets the end part of the diff URL associated with this object + * Blank if no diff link should be displayed + * @param $forceCur + * @return string + */ + public function diffLinkTrail( $forceCur ) { + if ( $this->mAttribs['rc_type'] == RC_EDIT ) { + $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) . + "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] ); + if ( $forceCur ) { + $trail .= '&diff=0'; + } else { + $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] ); + } + } else { + $trail = ''; + } + return $trail; + } + + /** + * Returns the change size (HTML). + * The lengths can be given optionally. + * @param $old int + * @param $new int + * @return string + */ + public function getCharacterDifference( $old = 0, $new = 0 ) { + if ( $old === 0 ) { + $old = $this->mAttribs['rc_old_len']; + } + if ( $new === 0 ) { + $new = $this->mAttribs['rc_new_len']; + } + if ( $old === null || $new === null ) { + return ''; + } + return ChangesList::showCharacterDifference( $old, $new ); + } + + /** + * Purge expired changes from the recentchanges table + * @since 1.22 + */ + public static function purgeExpiredChanges() { + if ( wfReadOnly() ) { + return; + } + + $method = __METHOD__; + $dbw = wfGetDB( DB_MASTER ); + $dbw->onTransactionIdle( function() use ( $dbw, $method ) { + global $wgRCMaxAge; + + $cutoff = $dbw->timestamp( time() - $wgRCMaxAge ); + $dbw->delete( + 'recentchanges', + array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ), + $method + ); + } ); + } + + private static function checkIPAddress( $ip ) { + global $wgRequest; + if ( $ip ) { + if ( !IP::isIPAddress( $ip ) ) { + throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" ); + } + } else { + $ip = $wgRequest->getIP(); + if ( !$ip ) { + $ip = ''; + } + } + return $ip; + } + + /** + * Check whether the given timestamp is new enough to have a RC row with a given tolerance + * as the recentchanges table might not be cleared out regularly (so older entries might exist) + * or rows which will be deleted soon shouldn't be included. + * + * @param $timestamp mixed MWTimestamp compatible timestamp + * @param $tolerance integer Tolerance in seconds + * @return bool + */ + public static function isInRCLifespan( $timestamp, $tolerance = 0 ) { + global $wgRCMaxAge; + return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge; + } +} diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index a8fa9ed4dd..2a92e23389 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -938,7 +938,7 @@ abstract class ContentHandler { * @return ParserOptions */ public function makeParserOptions( $context ) { - global $wgContLang; + global $wgContLang, $wgEnableParserLimitReporting; if ( $context instanceof IContextSource ) { $options = ParserOptions::newFromContext( $context ); @@ -950,7 +950,7 @@ abstract class ContentHandler { throw new MWException( "Bad context for parser options: $context" ); } - $options->enableLimitReport(); // show inclusion/loop reports + $options->enableLimitReport( $wgEnableParserLimitReporting ); // show inclusion/loop reports $options->setTidy( true ); // fix bad HTML return $options; diff --git a/includes/db/Database.php b/includes/db/Database.php index df2877ff03..9ffe6656d6 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -662,6 +662,18 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { /** * Constructor. + * + * FIXME: It is possible to construct a Database object with no associated + * connection object, by specifying no parameters to __construct(). This + * feature is deprecated and should be removed. + * + * FIXME: The long list of formal parameters here is not really appropriate + * for MySQL, and not at all appropriate for any other DBMS. It should be + * replaced by named parameters as in DatabaseBase::factory(). + * + * DatabaseBase subclasses should not be constructed directly in external + * code. DatabaseBase::factory() should be used instead. + * * @param string $server database server host * @param string $user database user name * @param string $password database user password @@ -717,7 +729,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { /** * Given a DB type, construct the name of the appropriate child class of * DatabaseBase. This is designed to replace all of the manual stuff like: - * $class = 'Database' . ucfirst( strtolower( $type ) ); + * $class = 'Database' . ucfirst( strtolower( $dbType ) ); * as well as validate against the canonical list of DB types we have * * This factory function is mostly useful for when you need to connect to a @@ -732,17 +744,47 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { * * @param string $dbType A possible DB type * @param array $p An array of options to pass to the constructor. - * Valid options are: host, user, password, dbname, flags, tablePrefix + * Valid options are: host, user, password, dbname, flags, tablePrefix, driver * @return DatabaseBase subclass or null */ final public static function factory( $dbType, $p = array() ) { $canonicalDBTypes = array( - 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql' + 'mysql' => array( 'mysqli', 'mysql' ), + 'postgres' => array(), + 'sqlite' => array(), + 'oracle' => array(), + 'mssql' => array(), ); + + $driver = false; $dbType = strtolower( $dbType ); - $class = 'Database' . ucfirst( $dbType ); + if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) { + $possibleDrivers = $canonicalDBTypes[$dbType]; + if ( !empty( $p['driver'] ) ) { + if ( in_array( $p['driver'], $possibleDrivers ) ) { + $driver = $p['driver']; + } else { + throw new MWException( __METHOD__ . + " cannot construct Database with type '$dbType' and driver '{$p['driver']}'" ); + } + } else { + foreach ( $possibleDrivers as $posDriver ) { + if ( extension_loaded( $posDriver ) ) { + $driver = $posDriver; + break; + } + } + } + } else { + $driver = $dbType; + } + if ( $driver === false ) { + throw new MWException( __METHOD__ . + " no viable database extension found for type '$dbType'" ); + } - if ( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) { + $class = 'Database' . ucfirst( $driver ); + if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) { return new $class( isset( $p['host'] ) ? $p['host'] : false, isset( $p['user'] ) ? $p['user'] : false, @@ -3069,7 +3111,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { * @since 1.20 */ final public function onTransactionIdle( $callback ) { - $this->mTrxIdleCallbacks[] = $callback; + $this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() ); if ( !$this->mTrxLevel ) { $this->runOnTransactionIdleCallbacks(); } @@ -3088,7 +3130,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { */ final public function onTransactionPreCommitOrIdle( $callback ) { if ( $this->mTrxLevel ) { - $this->mTrxPreCommitCallbacks[] = $callback; + $this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() ); } else { $this->onTransactionIdle( $callback ); // this will trigger immediately } @@ -3108,8 +3150,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { $this->mTrxIdleCallbacks = array(); // recursion guard foreach ( $callbacks as $callback ) { try { + list( $phpCallback ) = $callback; $this->clearFlag( DBO_TRX ); // make each query its own transaction - call_user_func( $callback ); + call_user_func( $phpCallback ); $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin() } catch ( Exception $e ) {} } @@ -3132,7 +3175,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { $this->mTrxPreCommitCallbacks = array(); // recursion guard foreach ( $callbacks as $callback ) { try { - call_user_func( $callback ); + list( $phpCallback ) = $callback; + call_user_func( $phpCallback ); } catch ( Exception $e ) {} } } while ( count( $this->mTrxPreCommitCallbacks ) ); @@ -3232,6 +3276,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { if ( $this->mTrxDoneWrites ) { Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname ); } + $this->mTrxDoneWrites = false; $this->runOnTransactionIdleCallbacks(); } @@ -3266,6 +3311,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { if ( $this->mTrxDoneWrites ) { Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname ); } + $this->mTrxDoneWrites = false; } /** @@ -3850,9 +3896,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType { return (string)$this->mConn; } + /** + * Run a few simple sanity checks + */ public function __destruct() { + if ( $this->mTrxLevel && $this->mTrxDoneWrites ) { + trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." ); + } if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) { - trigger_error( "Transaction idle or pre-commit callbacks still pending." ); // sanity + $callers = array(); + foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) { + $callers[] = $callbackInfo[1]; + + } + $callers = implode( ', ', $callers ); + trigger_error( "DB transaction callbacks still pending (from $callers)." ); } } } diff --git a/includes/db/DatabaseMysqlBase.php b/includes/db/DatabaseMysqlBase.php index d33d7c71be..49579b6a97 100644 --- a/includes/db/DatabaseMysqlBase.php +++ b/includes/db/DatabaseMysqlBase.php @@ -1006,7 +1006,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase { */ class MySQLField implements Field { private $name, $tablename, $default, $max_length, $nullable, - $is_pk, $is_unique, $is_multiple, $is_key, $type; + $is_pk, $is_unique, $is_multiple, $is_key, $type, $binary; function __construct( $info ) { $this->name = $info->name; @@ -1019,6 +1019,7 @@ class MySQLField implements Field { $this->is_multiple = $info->multiple_key; $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple ); $this->type = $info->type; + $this->binary = isset( $info->binary ) ? $info->binary : false; } /** @@ -1066,6 +1067,10 @@ class MySQLField implements Field { function isMultipleKey() { return $this->is_multiple; } + + function isBinary() { + return $this->binary; + } } class MySQLMasterPos implements DBMasterPos { diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php new file mode 100644 index 0000000000..7761abe923 --- /dev/null +++ b/includes/db/DatabaseMysqli.php @@ -0,0 +1,194 @@ +bufferResults() ) { + $ret = $this->mConn->query( $sql ); + } else { + $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT ); + } + return $ret; + } + + protected function mysqlConnect( $realServer ) { + # Fail now + # Otherwise we get a suppressed fatal error, which is very hard to track down + if ( !function_exists( 'mysqli_init' ) ) { + throw new DBConnectionError( $this, "MySQLi functions missing," + . " have you compiled PHP with the --with-mysqli option?\n" ); + } + + $connFlags = 0; + if ( $this->mFlags & DBO_SSL ) { + $connFlags |= MYSQLI_CLIENT_SSL; + } + if ( $this->mFlags & DBO_COMPRESS ) { + $connFlags |= MYSQLI_CLIENT_COMPRESS; + } + if ( $this->mFlags & DBO_PERSISTENT ) { + $realServer = 'p:' . $realServer; + } + + $mysqli = mysqli_init(); + $numAttempts = 2; + + for ( $i = 0; $i < $numAttempts; $i++ ) { + if ( $i > 1 ) { + usleep( 1000 ); + } + if ( $mysqli->real_connect( $realServer, $this->mUser, + $this->mPassword, $this->mDBname, null, null, $connFlags ) ) + { + return $mysqli; + } + } + + return false; + } + + /** + * @return bool + */ + protected function closeConnection() { + return $this->mConn->close(); + } + + /** + * @return int + */ + function insertId() { + return $this->mConn->insert_id; + } + + /** + * @return int + */ + function lastErrno() { + if ( $this->mConn ) { + return $this->mConn->errno; + } else { + return mysqli_connect_errno(); + } + } + + /** + * @return int + */ + function affectedRows() { + return $this->mConn->affected_rows; + } + + /** + * @param $db + * @return bool + */ + function selectDB( $db ) { + $this->mDBname = $db; + return $this->mConn->select_db( $db ); + } + + /** + * @return string + */ + function getServerVersion() { + return $this->mConn->server_info; + } + + protected function mysqlFreeResult( $res ) { + $res->free_result(); + return true; + } + + protected function mysqlFetchObject( $res ) { + $object = $res->fetch_object(); + if ( $object === null ) { + return false; + } + return $object; + } + + protected function mysqlFetchArray( $res ) { + $array = $res->fetch_array(); + if ( $array === null ) { + return false; + } + return $array; + } + + protected function mysqlNumRows( $res ) { + return $res->num_rows; + } + + protected function mysqlNumFields( $res ) { + return $res->field_count; + } + + protected function mysqlFetchField( $res, $n ) { + $field = $res->fetch_field_direct( $n ); + $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG; + $field->primary_key = $field->flags & MYSQLI_PRI_KEY_FLAG; + $field->unique_key = $field->flags & MYSQLI_UNIQUE_KEY_FLAG; + $field->multiple_key = $field->flags & MYSQLI_MULTIPLE_KEY_FLAG; + $field->binary = $field->flags & MYSQLI_BINARY_FLAG; + return $field; + } + + protected function mysqlFieldName( $res, $n ) { + $field = $res->fetch_field_direct( $n ); + return $field->name; + } + + protected function mysqlDataSeek( $res, $row ) { + return $res->data_seek( $row ); + } + + protected function mysqlError( $conn = null ) { + if ($conn === null) { + return mysqli_connect_error(); + } else { + return $conn->error; + } + } + + protected function mysqlRealEscapeString( $s ) { + return $this->mConn->real_escape_string( $s ); + } + + protected function mysqlPing() { + return $this->mConn->ping(); + } + +} diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php index a8270bf4b3..4a51226fb5 100644 --- a/includes/db/DatabaseSqlite.php +++ b/includes/db/DatabaseSqlite.php @@ -52,7 +52,7 @@ class DatabaseSqlite extends DatabaseBase { $this->mName = $dbName; parent::__construct( $server, $user, $password, $dbName, $flags ); // parent doesn't open when $user is false, but we can work with $dbName - if ( $dbName ) { + if ( $dbName && !$this->isOpen() ) { global $wgSharedDB; if ( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) { $this->attachDatabase( $wgSharedDB ); @@ -90,6 +90,7 @@ class DatabaseSqlite extends DatabaseBase { function open( $server, $user, $pass, $dbName ) { global $wgSQLiteDataDir; + $this->close(); $fileName = self::generateFileName( $wgSQLiteDataDir, $dbName ); if ( !is_readable( $fileName ) ) { $this->mConn = false; @@ -655,7 +656,11 @@ class DatabaseSqlite extends DatabaseBase { if ( $this->mTrxLevel == 1 ) { $this->commit( __METHOD__ ); } - $this->mConn->beginTransaction(); + try { + $this->mConn->beginTransaction(); + } catch ( PDOException $e ) { + throw new DBUnexpectedError( $this, 'Error in BEGIN query: ' . $e->getMessage() ); + } $this->mTrxLevel = 1; } @@ -663,7 +668,11 @@ class DatabaseSqlite extends DatabaseBase { if ( $this->mTrxLevel == 0 ) { return; } - $this->mConn->commit(); + try { + $this->mConn->commit(); + } catch ( PDOException $e ) { + throw new DBUnexpectedError( $this, 'Error in COMMIT query: ' . $e->getMessage() ); + } $this->mTrxLevel = 0; } diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php index 174c1d6566..298d724091 100644 --- a/includes/diff/DairikiDiff.php +++ b/includes/diff/DairikiDiff.php @@ -692,7 +692,7 @@ class Diff { /** * Check for empty diff. * - * @return bool True iff two sequences were identical. + * @return bool True if two sequences were identical. */ function isEmpty() { foreach ( $this->edits as $edit ) { diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index e436f58d30..ea741641b4 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -1041,6 +1041,33 @@ class DifferenceEngine extends ContextSource { $this->mDiffLang = wfGetLangObj( $lang ); } + /** + * Maps a revision pair definition as accepted by DifferenceEngine constructor + * to a pair of actual integers representing revision ids. + * + * @param int $old Revision id, e.g. from URL parameter 'oldid' + * @param int|string $new Revision id or strings 'next' or 'prev', e.g. from URL parameter 'diff' + * @return array Array of two revision ids, older first, later second. + * Zero signifies invalid argument passed. + * false signifies that there is no previous/next revision ($old is the oldest/newest one). + */ + public function mapDiffPrevNext( $old, $new ) { + if ( $new === 'prev' ) { + // Show diff between revision $old and the previous one. Get previous one from DB. + $newid = intval( $old ); + $oldid = $this->getTitle()->getPreviousRevisionID( $newid ); + } elseif ( $new === 'next' ) { + // Show diff between revision $old and the next one. Get next one from DB. + $oldid = intval( $old ); + $newid = $this->getTitle()->getNextRevisionID( $oldid ); + } else { + $oldid = intval( $old ); + $newid = intval( $new ); + } + + return array( $oldid, $newid ); + } + /** * Load revision IDs */ @@ -1054,26 +1081,14 @@ class DifferenceEngine extends ContextSource { $old = $this->mOldid; $new = $this->mNewid; - if ( $new === 'prev' ) { - # Show diff between revision $old and the previous one. - # Get previous one from DB. - $this->mNewid = intval( $old ); - $this->mOldid = $this->getTitle()->getPreviousRevisionID( $this->mNewid ); - } elseif ( $new === 'next' ) { - # Show diff between revision $old and the next one. - # Get next one from DB. - $this->mOldid = intval( $old ); - $this->mNewid = $this->getTitle()->getNextRevisionID( $this->mOldid ); - if ( $this->mNewid === false ) { - # if no result, NewId points to the newest old revision. The only newer - # revision is cur, which is "0". - $this->mNewid = 0; - } - } else { - $this->mOldid = intval( $old ); - $this->mNewid = intval( $new ); - wfRunHooks( 'NewDifferenceEngine', array( $this->getTitle(), &$this->mOldid, &$this->mNewid, $old, $new ) ); + list( $this->mOldid, $this->mNewid ) = self::mapDiffPrevNext( $old, $new ); + if ( $new === 'next' && $this->mNewid === false ) { + # if no result, NewId points to the newest old revision. The only newer + # revision is cur, which is "0". + $this->mNewid = 0; } + + wfRunHooks( 'NewDifferenceEngine', array( $this->getTitle(), &$this->mOldid, &$this->mNewid, $old, $new ) ); } /** diff --git a/includes/filebackend/FileBackend.php b/includes/filebackend/FileBackend.php index bdeb578eff..4bcaa7f840 100644 --- a/includes/filebackend/FileBackend.php +++ b/includes/filebackend/FileBackend.php @@ -807,7 +807,7 @@ abstract class FileBackend { * @return ScopedCallback|null */ final protected function getScopedPHPBehaviorForOps() { - if ( php_sapi_name() != 'cli' ) { // http://bugs.php.net/bug.php?id=47540 + if ( PHP_SAPI != 'cli' ) { // http://bugs.php.net/bug.php?id=47540 $old = ignore_user_abort( true ); // avoid half-finished operations return new ScopedCallback( function() use ( $old ) { ignore_user_abort( $old ); @@ -1183,8 +1183,10 @@ abstract class FileBackend { * Once the return value goes out scope, the locks will be released and * the status updated. Unlock fatals will not change the status "OK" value. * - * @param array $paths Storage paths - * @param integer $type LockManager::LOCK_* constant + * @see ScopedLock::factory() + * + * @param array $paths List of storage paths or map of lock types to path lists + * @param integer|string $type LockManager::LOCK_* constant or "mixed" * @param Status $status Status to update on lock/unlock * @return ScopedLock|null Returns null on failure */ diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php index 7d354870d7..97584a7169 100644 --- a/includes/filebackend/FileBackendMultiWrite.php +++ b/includes/filebackend/FileBackendMultiWrite.php @@ -141,17 +141,10 @@ class FileBackendMultiWrite extends FileBackend { $mbe = $this->backends[$this->masterIndex]; // convenience - // Get the paths to lock from the master backend - $realOps = $this->substOpBatchPaths( $ops, $mbe ); - $paths = $mbe->getPathsToLockForOpsInternal( $mbe->getOperationsInternal( $realOps ) ); - // Get the paths under the proxy backend's name - $paths['sh'] = $this->unsubstPaths( $paths['sh'] ); - $paths['ex'] = $this->unsubstPaths( $paths['ex'] ); // Try to lock those files for the scope of this function... if ( empty( $opts['nonLocking'] ) ) { // Try to lock those files for the scope of this function... - $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ); - $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status ); + $scopeLock = $this->getScopedLocksForOps( $ops, $status ); if ( !$status->isOK() ) { return $status; // abort } @@ -178,6 +171,7 @@ class FileBackendMultiWrite extends FileBackend { } } // Actually attempt the operation batch on the master backend... + $realOps = $this->substOpBatchPaths( $ops, $mbe ); $masterStatus = $mbe->doOperations( $realOps, $opts ); $status->merge( $masterStatus ); // Propagate the operations to the clone backends if there were no unexpected errors @@ -624,15 +618,16 @@ class FileBackendMultiWrite extends FileBackend { } public function getScopedLocksForOps( array $ops, Status $status ) { - $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops ); + $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] ); + $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $realOps ); // Get the paths to lock from the master backend $paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps ); // Get the paths under the proxy backend's name - $paths['sh'] = $this->unsubstPaths( $paths['sh'] ); - $paths['ex'] = $this->unsubstPaths( $paths['ex'] ); - return array( - $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ), - $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status ) + $pbPaths = array( + LockManager::LOCK_UW => $this->unsubstPaths( $paths[LockManager::LOCK_UW] ), + LockManager::LOCK_EX => $this->unsubstPaths( $paths[LockManager::LOCK_EX] ) ); + // Actually acquire the locks + return array( $this->getScopedFileLocks( $pbPaths, 'mixed', $status ) ); } } diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php index 8ff383bd21..29089c9eb7 100644 --- a/includes/filebackend/FileBackendStore.php +++ b/includes/filebackend/FileBackendStore.php @@ -953,12 +953,13 @@ abstract class FileBackendStore extends FileBackend { /** * Get a list of storage paths to lock for a list of operations - * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys, - * each corresponding to a list of storage paths to be locked. - * All returned paths are normalized. + * Returns an array with LockManager::LOCK_UW (shared locks) and + * LockManager::LOCK_EX (exclusive locks) keys, each corresponding + * to a list of storage paths to be locked. All returned paths are + * normalized. * * @param array $performOps List of FileOp objects - * @return Array ('sh' => list of paths, 'ex' => list of paths) + * @return Array (LockManager::LOCK_UW => path list, LockManager::LOCK_EX => path list) */ final public function getPathsToLockForOpsInternal( array $performOps ) { // Build up a list of files to lock... @@ -972,15 +973,15 @@ abstract class FileBackendStore extends FileBackend { // Get a shared lock on the parent directory of each path changed $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) ); - return $paths; + return array( + LockManager::LOCK_UW => $paths['sh'], + LockManager::LOCK_EX => $paths['ex'] + ); } public function getScopedLocksForOps( array $ops, Status $status ) { $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) ); - return array( - $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ), - $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status ) - ); + return array( $this->getScopedFileLocks( $paths, 'mixed', $status ) ); } final protected function doOperationsInternal( array $ops, array $opts ) { @@ -998,8 +999,7 @@ abstract class FileBackendStore extends FileBackend { // Build up a list of files to lock... $paths = $this->getPathsToLockForOpsInternal( $performOps ); // Try to lock those files for the scope of this function... - $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ); - $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status ); + $scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status ); if ( !$status->isOK() ) { return $status; // abort } @@ -1035,7 +1035,7 @@ abstract class FileBackendStore extends FileBackend { // Clear any file cache entries $this->clearCache(); - $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' ); + $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'describe', 'null' ); $async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 ); $maxConcurrency = $this->concurrency; // throttle diff --git a/includes/filebackend/FileOp.php b/includes/filebackend/FileOp.php index 33a5c9e583..fe8330846d 100644 --- a/includes/filebackend/FileOp.php +++ b/includes/filebackend/FileOp.php @@ -384,7 +384,7 @@ abstract class FileOp { /** * precheckDestExistence() helper function to get the source file SHA-1. - * Subclasses should overwride this iff the source is not in storage. + * Subclasses should overwride this if the source is not in storage. * * @return string|bool Returns false on failure */ diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php index a620f883b9..db090a98ed 100644 --- a/includes/filebackend/SwiftFileBackend.php +++ b/includes/filebackend/SwiftFileBackend.php @@ -24,7 +24,7 @@ */ /** - * @brief Class for an OpenStack Swift based file backend. + * @brief Class for an OpenStack Swift (or Ceph RGW) based file backend. * * This requires the SwiftCloudFiles MediaWiki extension, which includes * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles). diff --git a/includes/filebackend/lockmanager/DBLockManager.php b/includes/filebackend/lockmanager/DBLockManager.php index e081987851..3e934ba502 100644 --- a/includes/filebackend/lockmanager/DBLockManager.php +++ b/includes/filebackend/lockmanager/DBLockManager.php @@ -110,6 +110,19 @@ abstract class DBLockManager extends QuorumLockManager { $this->session = wfRandomString( 31 ); } + // @TODO: change this code to work in one batch + protected function getLocksOnServer( $lockSrv, array $pathsByType ) { + $status = Status::newGood(); + foreach ( $pathsByType as $type => $paths ) { + $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) ); + } + return $status; + } + + protected function freeLocksOnServer( $lockSrv, array $pathsByType ) { + return Status::newGood(); + } + /** * @see QuorumLockManager::isServerUp() * @return bool @@ -252,7 +265,7 @@ class MySqlLockManager extends DBLockManager { * @see DBLockManager::getLocksOnServer() * @return Status */ - protected function getLocksOnServer( $lockSrv, array $paths, $type ) { + protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); $db = $this->getConnection( $lockSrv ); // checked in isServerUp() @@ -318,14 +331,6 @@ class MySqlLockManager extends DBLockManager { return $status; } - /** - * @see QuorumLockManager::freeLocksOnServer() - * @return Status - */ - protected function freeLocksOnServer( $lockSrv, array $paths, $type ) { - return Status::newGood(); // not supported - } - /** * @see QuorumLockManager::releaseAllLocks() * @return Status @@ -361,7 +366,7 @@ class PostgreSqlLockManager extends DBLockManager { self::LOCK_EX => self::LOCK_EX ); - protected function getLocksOnServer( $lockSrv, array $paths, $type ) { + protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); if ( !count( $paths ) ) { return $status; // nothing to lock @@ -407,14 +412,6 @@ class PostgreSqlLockManager extends DBLockManager { return $status; } - /** - * @see QuorumLockManager::freeLocksOnServer() - * @return Status - */ - protected function freeLocksOnServer( $lockSrv, array $paths, $type ) { - return Status::newGood(); // not supported - } - /** * @see QuorumLockManager::releaseAllLocks() * @return Status diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php index f0e54ec22f..dad8a62468 100644 --- a/includes/filebackend/lockmanager/LockManager.php +++ b/includes/filebackend/lockmanager/LockManager.php @@ -98,7 +98,7 @@ abstract class LockManager { /** * Lock the resources at the given abstract paths * - * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21) * @return Status * @since 1.22 @@ -125,7 +125,7 @@ abstract class LockManager { /** * Unlock the resources at the given abstract paths * - * @param array $paths List of storage paths + * @param array $paths List of paths * @param $type integer LockManager::LOCK_* constant * @return Status */ @@ -136,7 +136,7 @@ abstract class LockManager { /** * Unlock the resources at the given abstract paths * - * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @return Status * @since 1.22 */ @@ -176,7 +176,7 @@ abstract class LockManager { * Normalize the $paths array by converting LOCK_UW locks into the * appropriate type and removing any duplicated paths for each lock type. * - * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths + * @param array $paths Map of LockManager::LOCK_* constants to lists of paths * @return Array * @since 1.22 */ @@ -190,7 +190,7 @@ abstract class LockManager { /** * @see LockManager::lockByType() - * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths + * @param array $paths Map of LockManager::LOCK_* constants to lists of paths * @return Status * @since 1.22 */ @@ -215,7 +215,7 @@ abstract class LockManager { /** * Lock resources with the given keys and lock type * - * @param array $paths List of storage paths + * @param array $paths List of paths * @param $type integer LockManager::LOCK_* constant * @return Status */ @@ -223,7 +223,7 @@ abstract class LockManager { /** * @see LockManager::unlockByType() - * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths + * @param array $paths Map of LockManager::LOCK_* constants to lists of paths * @return Status * @since 1.22 */ @@ -238,7 +238,7 @@ abstract class LockManager { /** * Unlock resources with the given keys and lock type * - * @param array $paths List of storage paths + * @param array $paths List of paths * @param $type integer LockManager::LOCK_* constant * @return Status */ @@ -250,22 +250,10 @@ abstract class LockManager { * @since 1.19 */ class NullLockManager extends LockManager { - /** - * @see LockManager::doLock() - * @param $paths array - * @param $type int - * @return Status - */ protected function doLock( array $paths, $type ) { return Status::newGood(); } - /** - * @see LockManager::doUnlock() - * @param $paths array - * @param $type int - * @return Status - */ protected function doUnlock( array $paths, $type ) { return Status::newGood(); } diff --git a/includes/filebackend/lockmanager/MemcLockManager.php b/includes/filebackend/lockmanager/MemcLockManager.php index 757aeee1fa..5eab03eef0 100644 --- a/includes/filebackend/lockmanager/MemcLockManager.php +++ b/includes/filebackend/lockmanager/MemcLockManager.php @@ -88,11 +88,44 @@ class MemcLockManager extends QuorumLockManager { $this->session = wfRandomString( 32 ); } + // @TODO: change this code to work in one batch + protected function getLocksOnServer( $lockSrv, array $pathsByType ) { + $status = Status::newGood(); + + $lockedPaths = array(); + foreach ( $pathsByType as $type => $paths ) { + $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) ); + if ( $status->isOK() ) { + $lockedPaths[$type] = isset( $lockedPaths[$type] ) + ? array_merge( $lockedPaths[$type], $paths ) + : $paths; + } else { + foreach ( $lockedPaths as $type => $paths ) { + $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) ); + } + break; + } + } + + return $status; + } + + // @TODO: change this code to work in one batch + protected function freeLocksOnServer( $lockSrv, array $pathsByType ) { + $status = Status::newGood(); + + foreach ( $pathsByType as $type => $paths ) { + $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) ); + } + + return $status; + } + /** * @see QuorumLockManager::getLocksOnServer() * @return Status */ - protected function getLocksOnServer( $lockSrv, array $paths, $type ) { + protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); $memc = $this->getCache( $lockSrv ); @@ -164,7 +197,7 @@ class MemcLockManager extends QuorumLockManager { * @see QuorumLockManager::freeLocksOnServer() * @return Status */ - protected function freeLocksOnServer( $lockSrv, array $paths, $type ) { + protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); $memc = $this->getCache( $lockSrv ); diff --git a/includes/filebackend/lockmanager/QuorumLockManager.php b/includes/filebackend/lockmanager/QuorumLockManager.php index 3b96ad6906..8356d32a64 100644 --- a/includes/filebackend/lockmanager/QuorumLockManager.php +++ b/includes/filebackend/lockmanager/QuorumLockManager.php @@ -31,81 +31,86 @@ abstract class QuorumLockManager extends LockManager { /** @var Array Map of bucket indexes to peer server lists */ protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...)) + /** @var Array Map of degraded buckets */ + protected $degradedBuckets = array(); // (buckey index => UNIX timestamp) - /** - * @see LockManager::doLock() - * @param $paths array - * @param $type int - * @return Status - */ final protected function doLock( array $paths, $type ) { + return $this->doLockByType( array( $type => $paths ) ); + } + + final protected function doUnlock( array $paths, $type ) { + return $this->doUnlockByType( array( $type => $paths ) ); + } + + protected function doLockByType( array $pathsByType ) { $status = Status::newGood(); - $pathsToLock = array(); // (bucket => paths) + $pathsToLock = array(); // (bucket => type => paths) // Get locks that need to be acquired (buckets => locks)... - foreach ( $paths as $path ) { - if ( isset( $this->locksHeld[$path][$type] ) ) { - ++$this->locksHeld[$path][$type]; - } else { - $bucket = $this->getBucketFromPath( $path ); - $pathsToLock[$bucket][] = $path; + foreach ( $pathsByType as $type => $paths ) { + foreach ( $paths as $path ) { + if ( isset( $this->locksHeld[$path][$type] ) ) { + ++$this->locksHeld[$path][$type]; + } else { + $bucket = $this->getBucketFromPath( $path ); + $pathsToLock[$bucket][$type][] = $path; + } } } - $lockedPaths = array(); // files locked in this attempt + $lockedPaths = array(); // files locked in this attempt (type => paths) // Attempt to acquire these locks... - foreach ( $pathsToLock as $bucket => $paths ) { + foreach ( $pathsToLock as $bucket => $pathsToLockByType ) { // Try to acquire the locks for this bucket - $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) ); + $status->merge( $this->doLockingRequestBucket( $bucket, $pathsToLockByType ) ); if ( !$status->isOK() ) { - $status->merge( $this->doUnlock( $lockedPaths, $type ) ); + $status->merge( $this->doUnlockByType( $lockedPaths ) ); return $status; } // Record these locks as active - foreach ( $paths as $path ) { - $this->locksHeld[$path][$type] = 1; // locked + foreach ( $pathsToLockByType as $type => $paths ) { + foreach ( $paths as $path ) { + $this->locksHeld[$path][$type] = 1; // locked + // Keep track of what locks were made in this attempt + $lockedPaths[$type][] = $path; + } } - // Keep track of what locks were made in this attempt - $lockedPaths = array_merge( $lockedPaths, $paths ); } return $status; } - /** - * @see LockManager::doUnlock() - * @param $paths array - * @param $type int - * @return Status - */ - final protected function doUnlock( array $paths, $type ) { + protected function doUnlockByType( array $pathsByType ) { $status = Status::newGood(); - $pathsToUnlock = array(); - foreach ( $paths as $path ) { - if ( !isset( $this->locksHeld[$path][$type] ) ) { - $status->warning( 'lockmanager-notlocked', $path ); - } else { - --$this->locksHeld[$path][$type]; - // Reference count the locks held and release locks when zero - if ( $this->locksHeld[$path][$type] <= 0 ) { - unset( $this->locksHeld[$path][$type] ); - $bucket = $this->getBucketFromPath( $path ); - $pathsToUnlock[$bucket][] = $path; - } - if ( !count( $this->locksHeld[$path] ) ) { - unset( $this->locksHeld[$path] ); // no SH or EX locks left for key + $pathsToUnlock = array(); // (bucket => type => paths) + foreach ( $pathsByType as $type => $paths ) { + foreach ( $paths as $path ) { + if ( !isset( $this->locksHeld[$path][$type] ) ) { + $status->warning( 'lockmanager-notlocked', $path ); + } else { + --$this->locksHeld[$path][$type]; + // Reference count the locks held and release locks when zero + if ( $this->locksHeld[$path][$type] <= 0 ) { + unset( $this->locksHeld[$path][$type] ); + $bucket = $this->getBucketFromPath( $path ); + $pathsToUnlock[$bucket][$type][] = $path; + } + if ( !count( $this->locksHeld[$path] ) ) { + unset( $this->locksHeld[$path] ); // no SH or EX locks left for key + } } } } // Remove these specific locks if possible, or at least release // all locks once this process is currently not holding any locks. - foreach ( $pathsToUnlock as $bucket => $paths ) { - $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) ); + foreach ( $pathsToUnlock as $bucket => $pathsToUnlockByType ) { + $status->merge( $this->doUnlockingRequestBucket( $bucket, $pathsToUnlockByType ) ); } if ( !count( $this->locksHeld ) ) { $status->merge( $this->releaseAllLocks() ); + $this->degradedBuckets = array(); // safe to retry the normal quorum } return $status; @@ -116,11 +121,10 @@ abstract class QuorumLockManager extends LockManager { * This is all or nothing; if any key is locked then this totally fails. * * @param $bucket integer - * @param array $paths List of resource keys to lock - * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @return Status */ - final protected function doLockingRequestBucket( $bucket, array $paths, $type ) { + final protected function doLockingRequestBucket( $bucket, array $pathsByType ) { $status = Status::newGood(); $yesVotes = 0; // locks made on trustable servers @@ -131,10 +135,11 @@ abstract class QuorumLockManager extends LockManager { if ( !$this->isServerUp( $lockSrv ) ) { --$votesLeft; $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv ); + $this->degradedBuckets[$bucket] = time(); continue; // server down? } // Attempt to acquire the lock on this peer - $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) ); + $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) ); if ( !$status->isOK() ) { return $status; // vetoed; resource locked } @@ -158,21 +163,33 @@ abstract class QuorumLockManager extends LockManager { * Attempt to release locks with the peers for a bucket * * @param $bucket integer - * @param array $paths List of resource keys to lock - * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @return Status */ - final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) { + final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) { $status = Status::newGood(); + $yesVotes = 0; // locks freed on trustable servers + $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers + $quorum = floor( $votesLeft / 2 + 1 ); // simple majority + $isDegraded = isset( $this->degradedBuckets[$bucket] ); // not the normal quorum? foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) { if ( !$this->isServerUp( $lockSrv ) ) { - $status->fatal( 'lockmanager-fail-svr-release', $lockSrv ); + $status->warning( 'lockmanager-fail-svr-release', $lockSrv ); // Attempt to release the lock on this peer } else { - $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) ); + $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) ); + ++$yesVotes; // success for this peer + // Normally the first peers form the quorum, and the others are ignored. + // Ignore them in this case, but not when an alternative quorum was used. + if ( $yesVotes >= $quorum && !$isDegraded ) { + break; // lock released + } } } + // Set a bad status if the quorum was not met. + // Assumes the same "up" servers as during the acquire step. + $status->setResult( $yesVotes >= $quorum ); return $status; } @@ -190,7 +207,8 @@ abstract class QuorumLockManager extends LockManager { } /** - * Check if a lock server is up + * Check if a lock server is up. + * This should process cache results to reduce RTT. * * @param $lockSrv string * @return bool @@ -198,14 +216,13 @@ abstract class QuorumLockManager extends LockManager { abstract protected function isServerUp( $lockSrv ); /** - * Get a connection to a lock server and acquire locks on $paths + * Get a connection to a lock server and acquire locks * * @param $lockSrv string - * @param $paths array - * @param $type integer + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @return Status */ - abstract protected function getLocksOnServer( $lockSrv, array $paths, $type ); + abstract protected function getLocksOnServer( $lockSrv, array $pathsByType ); /** * Get a connection to a lock server and release locks on $paths. @@ -213,11 +230,10 @@ abstract class QuorumLockManager extends LockManager { * Subclasses must effectively implement this or releaseAllLocks(). * * @param $lockSrv string - * @param $paths array - * @param $type integer + * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @return Status */ - abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type ); + abstract protected function freeLocksOnServer( $lockSrv, array $pathsByType ); /** * Release all locks that this session is holding. diff --git a/includes/filebackend/lockmanager/RedisLockManager.php b/includes/filebackend/lockmanager/RedisLockManager.php index e8e5996692..43b0198a68 100644 --- a/includes/filebackend/lockmanager/RedisLockManager.php +++ b/includes/filebackend/lockmanager/RedisLockManager.php @@ -78,7 +78,40 @@ class RedisLockManager extends QuorumLockManager { $this->session = wfRandomString( 32 ); } - protected function getLocksOnServer( $lockSrv, array $paths, $type ) { + // @TODO: change this code to work in one batch + protected function getLocksOnServer( $lockSrv, array $pathsByType ) { + $status = Status::newGood(); + + $lockedPaths = array(); + foreach ( $pathsByType as $type => $paths ) { + $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) ); + if ( $status->isOK() ) { + $lockedPaths[$type] = isset( $lockedPaths[$type] ) + ? array_merge( $lockedPaths[$type], $paths ) + : $paths; + } else { + foreach ( $lockedPaths as $type => $paths ) { + $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) ); + } + break; + } + } + + return $status; + } + + // @TODO: change this code to work in one batch + protected function freeLocksOnServer( $lockSrv, array $pathsByType ) { + $status = Status::newGood(); + + foreach ( $pathsByType as $type => $paths ) { + $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) ); + } + + return $status; + } + + protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); $server = $this->lockServers[$lockSrv]; @@ -162,7 +195,7 @@ LUA; return $status; } - protected function freeLocksOnServer( $lockSrv, array $paths, $type ) { + protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) { $status = Status::newGood(); $server = $this->lockServers[$lockSrv]; diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php old mode 100644 new mode 100755 index 5eec9a500b..07cc03ba5f --- a/includes/filerepo/ForeignAPIRepo.php +++ b/includes/filerepo/ForeignAPIRepo.php @@ -42,6 +42,16 @@ class ForeignAPIRepo extends FileRepo { * Update the version every time you make breaking or significant changes. */ const VERSION = "2.1"; + /** + * List of iiprop values for the thumbnail fetch queries. + * @since 1.23 + */ + protected static $imageInfoProps = array( + 'url', + 'thumbnail', + 'timestamp', + ); + var $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' ); /* Check back with Commons after a day */ var $apiThumbCacheExpiry = 86400; /* 24*60*60 */ @@ -238,7 +248,7 @@ class ForeignAPIRepo extends FileRepo { function getThumbUrl( $name, $width = -1, $height = -1, &$result = null, $otherParams = '' ) { $data = $this->fetchImageQuery( array( 'titles' => 'File:' . $name, - 'iiprop' => 'url|timestamp', + 'iiprop' => self::getIIProps(), 'iiurlwidth' => $width, 'iiurlheight' => $height, 'iiurlparam' => $otherParams, @@ -265,7 +275,7 @@ class ForeignAPIRepo extends FileRepo { function getThumbError( $name, $width = -1, $height = -1, $otherParams = '', $lang = null ) { $data = $this->fetchImageQuery( array( 'titles' => 'File:' . $name, - 'iiprop' => 'url|timestamp', + 'iiprop' => self::getIIProps(), 'iiurlwidth' => $width, 'iiurlheight' => $height, 'iiurlparam' => $otherParams, @@ -485,6 +495,14 @@ class ForeignAPIRepo extends FileRepo { } } + /** + * @return string + * @since 1.23 + */ + protected static function getIIProps() { + return join( '|', self::$imageInfoProps ); + } + /** * HTTP GET request to a mediawiki API (with caching) * @param $target string Used in cache key creation, mostly diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php index ec5f927b16..5a5221f9bc 100644 --- a/includes/filerepo/file/File.php +++ b/includes/filerepo/file/File.php @@ -512,6 +512,17 @@ abstract class File { return false; } + /** + * Like getMetadata but returns a handler independent array of common values. + * @see MediaHandler::getCommonMetaArray() + * @return Array or false if not supported + * @since 1.23 + */ + public function getCommonMetaArray() { + $handler = $this->getHandler(); + return $handler->getCommonMetaArray( $this ); + } + /** * get versioned metadata * diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php old mode 100644 new mode 100755 index ed96d446d5..0b3d5dfdb0 --- a/includes/filerepo/file/ForeignAPIFile.php +++ b/includes/filerepo/file/ForeignAPIFile.php @@ -57,7 +57,10 @@ class ForeignAPIFile extends File { 'titles' => 'File:' . $title->getDBkey(), 'iiprop' => self::getProps(), 'prop' => 'imageinfo', - 'iimetadataversion' => MediaHandler::getMetadataVersion() + 'iimetadataversion' => MediaHandler::getMetadataVersion(), + // extmetadata is language-dependant, accessing the current language here + // would be problematic, so we just get them all + 'iiextmetadatamultilang' => 1, ) ); $info = $repo->getImageInfo( $data ); @@ -86,7 +89,7 @@ class ForeignAPIFile extends File { * @return string */ static function getProps() { - return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype'; + return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype|extmetadata'; } // Dummy functions... @@ -169,6 +172,16 @@ class ForeignAPIFile extends File { return null; } + /** + * @return array|null extended metadata (see imageinfo API for format) or null on error + */ + public function getExtendedMetadata() { + if ( isset( $this->mInfo['extmetadata'] ) ) { + return $this->mInfo['extmetadata']; + } + return null; + } + /** * @param $metadata array * @return array diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index 0c34f3e4f7..fe769be28c 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -1507,18 +1507,27 @@ class LocalFile extends File { wfDebugLog( 'imagemove', "Finished moving {$this->name}" ); - $this->purgeEverything(); - foreach ( $archiveNames as $archiveName ) { - $this->purgeOldThumbnails( $archiveName ); - } + // Purge the source and target files... + $oldTitleFile = wfLocalFile( $this->title ); + $newTitleFile = wfLocalFile( $target ); + // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not + // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside. + $this->getRepo()->getMasterDB()->onTransactionIdle( + function() use ( $oldTitleFile, $newTitleFile, $archiveNames ) { + $oldTitleFile->purgeEverything(); + foreach ( $archiveNames as $archiveName ) { + $oldTitleFile->purgeOldThumbnails( $archiveName ); + } + $newTitleFile->purgeEverything(); + } + ); + if ( $status->isOK() ) { // Now switch the object $this->title = $target; // Force regeneration of the name and hashpath unset( $this->name ); unset( $this->hashPath ); - // Purge the new image - $this->purgeEverything(); } return $status; diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php index 8bb782615d..0110ac52f6 100644 --- a/includes/installer/DatabaseInstaller.php +++ b/includes/installer/DatabaseInstaller.php @@ -32,7 +32,7 @@ abstract class DatabaseInstaller { /** * The Installer object. * - * TODO: naming this parent is confusing, 'installer' would be clearer. + * @todo Naming this parent is confusing, 'installer' would be clearer. * * @var WebInstaller */ @@ -505,7 +505,8 @@ abstract class DatabaseInstaller { return false; } - return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ ); + return $this->db->tableExists( 'cur', __METHOD__ ) || + $this->db->tableExists( 'revision', __METHOD__ ); } /** @@ -516,8 +517,18 @@ abstract class DatabaseInstaller { public function getInstallUserBox() { return Html::openElement( 'fieldset' ) . Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) . - $this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) . - $this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) . + $this->getTextBox( + '_InstallUser', + 'config-db-username', + array( 'dir' => 'ltr' ), + $this->parent->getHelpBox( 'config-db-install-username' ) + ) . + $this->getPasswordBox( + '_InstallPassword', + 'config-db-password', + array( 'dir' => 'ltr' ), + $this->parent->getHelpBox( 'config-db-install-password' ) + ) . Html::closeElement( 'fieldset' ); } diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php index fdd34d49e3..267b6c5a2c 100644 --- a/includes/installer/DatabaseUpdater.php +++ b/includes/installer/DatabaseUpdater.php @@ -130,7 +130,8 @@ abstract class DatabaseUpdater { } /** - * Loads LocalSettings.php, if needed, and initialises everything needed for LoadExtensionSchemaUpdates hook + * Loads LocalSettings.php, if needed, and initialises everything needed for + * LoadExtensionSchemaUpdates hook. */ private function loadExtensions() { if ( !defined( 'MEDIAWIKI_INSTALL' ) ) { @@ -289,11 +290,22 @@ abstract class DatabaseUpdater { * @param string $tableName The table name * @param string $oldIndexName The old index name * @param string $newIndexName The new index name - * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. [facultative; by default, false] + * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old + * and the new indexes exist. [facultative; by default, false] * @param string $sqlPath The path to the SQL change path */ - public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) { - $this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true ); + public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, + $sqlPath, $skipBothIndexExistWarning = false + ) { + $this->extensionUpdates[] = array( + 'renameIndex', + $tableName, + $oldIndexName, + $newIndexName, + $skipBothIndexExistWarning, + $sqlPath, + true + ); } /** @@ -758,12 +770,15 @@ abstract class DatabaseUpdater { * @param string $table Name of the table to modify * @param string $oldIndex Old name of the index * @param string $newIndex New name of the index - * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. + * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the + * old and the new indexes exist. * @param string $patch Path to the patch file * @param $fullpath Boolean: Whether to treat $patch path as a relative or not * @return Boolean false if this was skipped because schema changes are skipped */ - protected function renameIndex( $table, $oldIndex, $newIndex, $skipBothIndexExistWarning, $patch, $fullpath = false ) { + protected function renameIndex( $table, $oldIndex, $newIndex, + $skipBothIndexExistWarning, $patch, $fullpath = false + ) { if ( !$this->doTable( $table ) ) { return true; } @@ -778,8 +793,11 @@ abstract class DatabaseUpdater { // Second requirement: the new index must be missing if ( $this->db->indexExists( $table, $newIndex, __METHOD__ ) ) { $this->output( "...index $newIndex already set on $table table.\n" ); - if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) { - $this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" . + if ( !$skipBothIndexExistWarning && + $this->db->indexExists( $table, $oldIndex, __METHOD__ ) + ) { + $this->output( "...WARNING: $oldIndex still exists, despite it has " . + "been renamed into $newIndex (which also exists).\n" . " $oldIndex should be manually removed if not needed anymore.\n" ); } @@ -794,7 +812,11 @@ abstract class DatabaseUpdater { } // Requirements have been satisfied, patch can be applied - return $this->applyPatch( $patch, $fullpath, "Renaming index $oldIndex into $newIndex to table $table" ); + return $this->applyPatch( + $patch, + $fullpath, + "Renaming index $oldIndex into $newIndex to table $table" + ); } /** @@ -848,7 +870,8 @@ abstract class DatabaseUpdater { if ( !$this->db->tableExists( $table, __METHOD__ ) ) { $this->output( "...$table table does not exist, skipping modify field patch.\n" ); } elseif ( !$this->db->fieldExists( $table, $field, __METHOD__ ) ) { - $this->output( "...$field field does not exist in $table table, skipping modify field patch.\n" ); + $this->output( "...$field field does not exist in $table table, " . + "skipping modify field patch.\n" ); } elseif ( $this->updateRowExists( $updateKey ) ) { $this->output( "...$field in table $table already modified by patch $patch.\n" ); } else { diff --git a/includes/installer/InstallDocFormatter.php b/includes/installer/InstallDocFormatter.php index 0042089a8d..6d3819cd42 100644 --- a/includes/installer/InstallDocFormatter.php +++ b/includes/installer/InstallDocFormatter.php @@ -47,7 +47,11 @@ class InstallDocFormatter { // turn (bug nnnn) into links $text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text ); // add links to manual to every global variable mentioned - $text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text ); + $text = preg_replace_callback( + '/(\$wg[a-z0-9_]+)/i', + array( $this, 'replaceConfigLinks' ), + $text + ); return $text; } diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index 5eaacf85cc..2f45005608 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -302,7 +302,8 @@ abstract class Installer { /** * URL to mediawiki-announce subscription */ - protected $mediaWikiAnnounceUrl = 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce'; + protected $mediaWikiAnnounceUrl = + 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce'; /** * Supported language codes for Mailman @@ -983,6 +984,7 @@ abstract class Installer { $this->showMessage( 'config-using-server', $server ); $this->setVar( 'wgServer', $server ); } + return true; } @@ -1001,7 +1003,11 @@ abstract class Installer { $IP = dirname( dirname( __DIR__ ) ); $this->setVar( 'IP', $IP ); - $this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) ); + $this->showMessage( + 'config-using-uri', + $this->getVar( 'wgServer' ), + $this->getVar( 'wgScriptPath' ) + ); return true; } @@ -1195,7 +1201,8 @@ abstract class Installer { } } - // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl' + // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', + // 'config-unicode-using-intl' if ( $useNormalizer === 'php' ) { $this->showMessage( 'config-unicode-pure-php-warning' ); } else { @@ -1730,6 +1737,11 @@ abstract class Installer { // Some of the environment checks make shell requests, remove limits $GLOBALS['wgMaxShellMemory'] = 0; + + // Don't bother embedding images into generated CSS, which is not cached + $GLOBALS['wgResourceLoaderLESSFunctions']['embeddable'] = function( $frame, $less ) { + return $less->toBool( false ); + }; } /** diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php index 858fbeef8e..56d8353758 100644 --- a/includes/installer/LocalSettingsGenerator.php +++ b/includes/installer/LocalSettingsGenerator.php @@ -202,7 +202,7 @@ class LocalSettingsGenerator { $locale = ''; } - //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused! + //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // @todo FIXME: I'm unused! $hashedUploads = $this->safeMode ? '' : '#'; $metaNamespace = ''; if ( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) { diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php index 16ec21c9ff..5f76972c05 100644 --- a/includes/installer/MysqlInstaller.php +++ b/includes/installer/MysqlInstaller.php @@ -64,15 +64,11 @@ class MysqlInstaller extends DatabaseInstaller { return 'mysql'; } - public function __construct( $parent ) { - parent::__construct( $parent ); - } - /** * @return Bool */ public function isCompiled() { - return self::checkExtension( 'mysql' ); + return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' ); } /** @@ -86,7 +82,12 @@ class MysqlInstaller extends DatabaseInstaller { * @return string */ public function getConnectForm() { - return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) . + return $this->getTextBox( + 'wgDBserver', + 'config-db-host', + array(), + $this->parent->getHelpBox( 'config-db-host-help' ) + ) . Html::openElement( 'fieldset' ) . Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) . $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), @@ -149,14 +150,13 @@ class MysqlInstaller extends DatabaseInstaller { public function openConnection() { $status = Status::newGood(); try { - $db = new DatabaseMysql( - $this->getVar( 'wgDBserver' ), - $this->getVar( '_InstallUser' ), - $this->getVar( '_InstallPassword' ), - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $this->getVar( 'wgDBserver' ), + 'user' => $this->getVar( '_InstallUser' ), + 'password' => $this->getVar( '_InstallPassword' ), + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); $status->value = $db; } catch ( DBConnectionError $e ) { $status->fatal( 'config-connection-error', $e->getMessage() ); @@ -436,14 +436,13 @@ class MysqlInstaller extends DatabaseInstaller { if ( !$create ) { // Test the web account try { - new DatabaseMysql( - $this->getVar( 'wgDBserver' ), - $this->getVar( 'wgDBuser' ), - $this->getVar( 'wgDBpassword' ), - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $this->getVar( 'wgDBserver' ), + 'user' => $this->getVar( 'wgDBuser' ), + 'password' => $this->getVar( 'wgDBpassword' ), + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); } catch ( DBConnectionError $e ) { return Status::newFatal( 'config-connection-error', $e->getMessage() ); } @@ -483,7 +482,10 @@ class MysqlInstaller extends DatabaseInstaller { $conn = $status->value; $dbName = $this->getVar( 'wgDBname' ); if ( !$conn->selectDB( $dbName ) ) { - $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8", __METHOD__ ); + $conn->query( + "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8", + __METHOD__ + ); $conn->selectDB( $dbName ); } $this->setupSchemaVars(); @@ -514,14 +516,13 @@ class MysqlInstaller extends DatabaseInstaller { if ( $this->getVar( '_CreateDBAccount' ) ) { // Before we blindly try to create a user that already has access, try { // first attempt to connect to the database - new DatabaseMysql( - $server, - $dbUser, - $password, - false, - 0, - $this->getVar( 'wgDBprefix' ) - ); + $db = DatabaseBase::factory( 'mysql', array( + 'host' => $server, + 'user' => $dbUser, + 'password' => $password, + 'dbname' => false, + 'flags' => 0, + 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) ); $grantableNames[] = $this->buildFullUserName( $dbUser, $server ); $tryToCreate = false; } catch ( DBConnectionError $e ) { diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index 1d2c8a5f96..059407348c 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -32,205 +32,213 @@ class MysqlUpdater extends DatabaseUpdater { protected function getCoreUpdateList() { return array( // 1.2 - array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ), - array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ), + array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ), + array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ), array( 'doInterwikiUpdate' ), array( 'doIndexUpdate' ), - array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ), - array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ), + array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ), + array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ), // 1.3 - array( 'addField', 'user', 'user_real_name', 'patch-user-realname.sql' ), - array( 'addTable', 'querycache', 'patch-querycache.sql' ), - array( 'addTable', 'objectcache', 'patch-objectcache.sql' ), - array( 'addTable', 'categorylinks', 'patch-categorylinks.sql' ), + array( 'addField', 'user', 'user_real_name', 'patch-user-realname.sql' ), + array( 'addTable', 'querycache', 'patch-querycache.sql' ), + array( 'addTable', 'objectcache', 'patch-objectcache.sql' ), + array( 'addTable', 'categorylinks', 'patch-categorylinks.sql' ), array( 'doOldLinksUpdate' ), array( 'doFixAncientImagelinks' ), - array( 'addField', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ), + array( 'addField', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ), // 1.4 - array( 'addIndex', 'image', 'PRIMARY', 'patch-image_name_primary.sql' ), - array( 'addField', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ), - array( 'addField', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ), - array( 'addTable', 'logging', 'patch-logging.sql' ), - array( 'addField', 'user', 'user_token', 'patch-user_token.sql' ), - array( 'addField', 'watchlist', 'wl_notificationtimestamp', 'patch-email-notification.sql' ), + array( 'addIndex', 'image', 'PRIMARY', 'patch-image_name_primary.sql' ), + array( 'addField', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ), + array( 'addField', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ), + array( 'addTable', 'logging', 'patch-logging.sql' ), + array( 'addField', 'user', 'user_token', 'patch-user_token.sql' ), + array( 'addField', 'watchlist', 'wl_notificationtimestamp', 'patch-email-notification.sql' ), array( 'doWatchlistUpdate' ), - array( 'dropField', 'user', 'user_emailauthenticationtimestamp', 'patch-email-authentication.sql' ), + array( 'dropField', 'user', 'user_emailauthenticationtimestamp', + 'patch-email-authentication.sql' ), // 1.5 array( 'doSchemaRestructuring' ), - array( 'addField', 'logging', 'log_params', 'patch-log_params.sql' ), - array( 'checkBin', 'logging', 'log_title', 'patch-logging-title.sql', ), - array( 'addField', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ), - array( 'addField', 'page', 'page_len', 'patch-page_len.sql' ), - array( 'dropField', 'revision', 'inverse_timestamp', 'patch-inverse_timestamp.sql' ), - array( 'addField', 'revision', 'rev_text_id', 'patch-rev_text_id.sql' ), - array( 'addField', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ), - array( 'addField', 'image', 'img_width', 'patch-img_width.sql' ), - array( 'addField', 'image', 'img_metadata', 'patch-img_metadata.sql' ), - array( 'addField', 'user', 'user_email_token', 'patch-user_email_token.sql' ), - array( 'addField', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ), + array( 'addField', 'logging', 'log_params', 'patch-log_params.sql' ), + array( 'checkBin', 'logging', 'log_title', 'patch-logging-title.sql', ), + array( 'addField', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ), + array( 'addField', 'page', 'page_len', 'patch-page_len.sql' ), + array( 'dropField', 'revision', 'inverse_timestamp', 'patch-inverse_timestamp.sql' ), + array( 'addField', 'revision', 'rev_text_id', 'patch-rev_text_id.sql' ), + array( 'addField', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ), + array( 'addField', 'image', 'img_width', 'patch-img_width.sql' ), + array( 'addField', 'image', 'img_metadata', 'patch-img_metadata.sql' ), + array( 'addField', 'user', 'user_email_token', 'patch-user_email_token.sql' ), + array( 'addField', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ), array( 'doNamespaceSize' ), - array( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ), + array( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ), array( 'doPagelinksUpdate' ), - array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ), + array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ), array( 'doUserUniqueUpdate' ), array( 'doUserGroupsUpdate' ), - array( 'addField', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ), - array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ), - array( 'addTable', 'transcache', 'patch-transcache.sql' ), - array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ), + array( 'addField', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ), + array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ), + array( 'addTable', 'transcache', 'patch-transcache.sql' ), + array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ), // 1.6 array( 'doWatchlistNull' ), - array( 'addIndex', 'logging', 'times', 'patch-logging-times-index.sql' ), - array( 'addField', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ), + array( 'addIndex', 'logging', 'times', 'patch-logging-times-index.sql' ), + array( 'addField', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ), array( 'doPageRandomUpdate' ), - array( 'addField', 'user', 'user_registration', 'patch-user_registration.sql' ), + array( 'addField', 'user', 'user_registration', 'patch-user_registration.sql' ), array( 'doTemplatelinksUpdate' ), - array( 'addTable', 'externallinks', 'patch-externallinks.sql' ), - array( 'addTable', 'job', 'patch-job.sql' ), - array( 'addField', 'site_stats', 'ss_images', 'patch-ss_images.sql' ), - array( 'addTable', 'langlinks', 'patch-langlinks.sql' ), - array( 'addTable', 'querycache_info', 'patch-querycacheinfo.sql' ), - array( 'addTable', 'filearchive', 'patch-filearchive.sql' ), - array( 'addField', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ), - array( 'addIndex', 'recentchanges', 'rc_ns_usertext', 'patch-recentchanges-utindex.sql' ), - array( 'addIndex', 'recentchanges', 'rc_user_text', 'patch-rc_user_text-index.sql' ), + array( 'addTable', 'externallinks', 'patch-externallinks.sql' ), + array( 'addTable', 'job', 'patch-job.sql' ), + array( 'addField', 'site_stats', 'ss_images', 'patch-ss_images.sql' ), + array( 'addTable', 'langlinks', 'patch-langlinks.sql' ), + array( 'addTable', 'querycache_info', 'patch-querycacheinfo.sql' ), + array( 'addTable', 'filearchive', 'patch-filearchive.sql' ), + array( 'addField', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ), + array( 'addIndex', 'recentchanges', 'rc_ns_usertext', 'patch-recentchanges-utindex.sql' ), + array( 'addIndex', 'recentchanges', 'rc_user_text', 'patch-rc_user_text-index.sql' ), // 1.9 - array( 'addField', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ), - array( 'addTable', 'redirect', 'patch-redirect.sql' ), - array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ), - array( 'addField', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ), + array( 'addField', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ), + array( 'addTable', 'redirect', 'patch-redirect.sql' ), + array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ), + array( 'addField', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ), array( 'doBacklinkingIndicesUpdate' ), - array( 'addField', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ), - array( 'addField', 'user', 'user_editcount', 'patch-user_editcount.sql' ), + array( 'addField', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ), + array( 'addField', 'user', 'user_editcount', 'patch-user_editcount.sql' ), // 1.10 array( 'doRestrictionsUpdate' ), - array( 'addField', 'logging', 'log_id', 'patch-log_id.sql' ), - array( 'addField', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ), - array( 'addField', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ), - array( 'addField', 'revision', 'rev_len', 'patch-rev_len.sql' ), - array( 'addField', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ), - array( 'addField', 'logging', 'log_deleted', 'patch-log_deleted.sql' ), - array( 'addField', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ), - array( 'addField', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ), - array( 'addField', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ), - array( 'addField', 'archive', 'ar_len', 'patch-ar_len.sql' ), + array( 'addField', 'logging', 'log_id', 'patch-log_id.sql' ), + array( 'addField', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ), + array( 'addField', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ), + array( 'addField', 'revision', 'rev_len', 'patch-rev_len.sql' ), + array( 'addField', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ), + array( 'addField', 'logging', 'log_deleted', 'patch-log_deleted.sql' ), + array( 'addField', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ), + array( 'addField', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ), + array( 'addField', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ), + array( 'addField', 'archive', 'ar_len', 'patch-ar_len.sql' ), // 1.11 - array( 'addField', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ), + array( 'addField', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ), array( 'doCategorylinksIndicesUpdate' ), - array( 'addField', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql' ), - array( 'addIndex', 'archive', 'usertext_timestamp', 'patch-archive-user-index.sql' ), - array( 'addIndex', 'image', 'img_usertext_timestamp', 'patch-image-user-index.sql' ), - array( 'addIndex', 'oldimage', 'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ), - array( 'addField', 'archive', 'ar_page_id', 'patch-archive-page_id.sql' ), - array( 'addField', 'image', 'img_sha1', 'patch-img_sha1.sql' ), + array( 'addField', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql' ), + array( 'addIndex', 'archive', 'usertext_timestamp', 'patch-archive-user-index.sql' ), + array( 'addIndex', 'image', 'img_usertext_timestamp', 'patch-image-user-index.sql' ), + array( 'addIndex', 'oldimage', 'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ), + array( 'addField', 'archive', 'ar_page_id', 'patch-archive-page_id.sql' ), + array( 'addField', 'image', 'img_sha1', 'patch-img_sha1.sql' ), // 1.12 - array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ), + array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ), // 1.13 - array( 'addField', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ), - array( 'addTable', 'page_props', 'patch-page_props.sql' ), - array( 'addTable', 'updatelog', 'patch-updatelog.sql' ), - array( 'addTable', 'category', 'patch-category.sql' ), + array( 'addField', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ), + array( 'addTable', 'page_props', 'patch-page_props.sql' ), + array( 'addTable', 'updatelog', 'patch-updatelog.sql' ), + array( 'addTable', 'category', 'patch-category.sql' ), array( 'doCategoryPopulation' ), - array( 'addField', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql' ), - array( 'addField', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql' ), + array( 'addField', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql' ), + array( 'addField', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql' ), array( 'doPopulateParentId' ), - array( 'checkBin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ), + array( 'checkBin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ), array( 'doMaybeProfilingMemoryUpdate' ), array( 'doFilearchiveIndicesUpdate' ), // 1.14 - array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), + array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), array( 'doActiveUsersInit' ), - array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ), + array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ), // 1.15 array( 'doUniquePlTlIl' ), - array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), - /* array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ), */ - /* array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ), */ + array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), + array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ), + array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ), // 1.16 - array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), - array( 'addTable', 'log_search', 'patch-log_search.sql' ), - array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ), - array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update + array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), + array( 'addTable', 'log_search', 'patch-log_search.sql' ), + array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ), + # listed separately from the previous update because 1.16 was released without this update + array( 'doLogUsertextPopulation' ), array( 'doLogSearchPopulation' ), - array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), - array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ), - array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ), - array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ), + array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), + array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ), + array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ), + array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ), array( 'doUpdateTranscacheField' ), array( 'doUpdateMimeMinorField' ), // 1.17 - array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), - array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ), - array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ), - array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ), - array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ), - array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ), + array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), + array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ), + array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ), + array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ), + array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ), + array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ), array( 'doClFieldsUpdate' ), array( 'doCollationUpdate' ), - array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), - array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), - array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ), - array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ), + array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), + array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), + array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ), + array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ), array( 'doLangLinksLengthUpdate' ), // 1.18 array( 'doUserNewTalkTimestampNotNull' ), - array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ), + array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ), array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ), - array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), - array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'), + array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), + array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ), // 1.19 - array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'), - array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ), + array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ), + array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ), array( 'doMigrateUserOptions' ), - array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ), - array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ), - array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ), - array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ), - array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ), + array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ), + array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ), + array( 'addIndex', 'page', 'page_redirect_namespace_len', + 'patch-page_redirect_namespace_len.sql' ), + array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ), + array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ), // 1.20 array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ), - array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ), - array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ), - array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ), + array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ), + array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ), + array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ), // 1.21 - array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ), - array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ), - array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), - array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), - array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), - array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ), - array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ), - array( 'addTable', 'sites', 'patch-sites.sql' ), - array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), - array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), - array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), + array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ), + array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ), + array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), + array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), + array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), + array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ), + array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ), + array( 'addTable', 'sites', 'patch-sites.sql' ), + array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), + array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), + array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), array( 'doEnableProfiling' ), - array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), + array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ), - array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ), - array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ), + array( 'modifyField', 'user_former_groups', 'ufg_group', + 'patch-ufg_group-length-increase-255.sql' ), + array( 'addIndex', 'page_props', 'pp_propname_page', + 'patch-page_props-propname-page-index.sql' ), array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ), // 1.22 array( 'doIwlinksIndexNonUnique' ), - array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ), + array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', + 'patch-iwlinks-from-title-index.sql' ), + array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ), + array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ), array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ), ); } @@ -248,11 +256,8 @@ class MysqlUpdater extends DatabaseUpdater { return true; } - $tableName = $this->db->tableName( $table ); - $res = $this->db->query( "SELECT $field FROM $tableName LIMIT 0", __METHOD__ ); - $flags = explode( ' ', mysql_field_flags( $res->result, 0 ) ); - - if ( in_array( 'binary', $flags ) ) { + $fieldInfo = $this->db->fieldInfo( $table, $field ); + if ( $fieldInfo->isBinary() ) { $this->output( "...$table table has correct $field encoding.\n" ); } else { $this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" ); @@ -304,7 +309,11 @@ class MysqlUpdater extends DatabaseUpdater { } $this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' ); - $this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' ); + $this->applyPatch( + "$IP/maintenance/interwiki.sql", + true, + 'Adding default interwiki definitions' + ); } /** @@ -337,7 +346,13 @@ class MysqlUpdater extends DatabaseUpdater { return; } - if ( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) { + $applied = $this->applyPatch( + 'patch-fix-il_from.sql', + false, + 'Fixing ancient broken imagelinks table.' + ); + + if ( $applied ) { $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." ); } } @@ -347,7 +362,12 @@ class MysqlUpdater extends DatabaseUpdater { */ function doWatchlistUpdate() { $talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ ); - $nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ ); + $nontalk = $this->db->selectField( + 'watchlist', + 'count(*)', + 'NOT (wl_namespace & 1)', + __METHOD__ + ); if ( $talk == $nontalk ) { $this->output( "...watchlist talk page rows already present.\n" ); @@ -376,10 +396,21 @@ class MysqlUpdater extends DatabaseUpdater { $this->output( wfTimestamp( TS_DB ) ); $this->output( "......checking for duplicate entries.\n" ); - list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' ); + list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( + 'cur', + 'old', + 'page', + 'revision', + 'text' + ); - $rows = $this->db->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c - FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", __METHOD__ ); + $rows = $this->db->query( " + SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c + FROM $cur + GROUP BY cur_title, cur_namespace + HAVING c>1", + __METHOD__ + ); if ( $rows->numRows() > 0 ) { $this->output( wfTimestamp( TS_DB ) ); @@ -390,8 +421,13 @@ class MysqlUpdater extends DatabaseUpdater { if ( !isset( $duplicate[$row->cur_namespace] ) ) { $duplicate[$row->cur_namespace] = array(); } + $duplicate[$row->cur_namespace][] = $row->cur_title; - $this->output( sprintf( " %-60s %3s %5s\n", $row->cur_title, $row->cur_namespace, $row->c ) ); + $this->output( sprintf( + " %-60s %3s %5s\n", + $row->cur_title, $row->cur_namespace, + $row->c + ) ); } $sql = "SELECT cur_title, cur_namespace, cur_id, cur_timestamp FROM $cur WHERE "; $firstCond = true; @@ -476,7 +512,10 @@ class MysqlUpdater extends DatabaseUpdater { $this->output( wfTimestamp( TS_DB ) ); $this->output( "......Locking tables.\n" ); - $this->db->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", __METHOD__ ); + $this->db->query( + "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", + __METHOD__ + ); $maxold = intval( $this->db->selectField( 'old', 'max(old_id)', '', __METHOD__ ) ); $this->output( wfTimestamp( TS_DB ) ); @@ -497,27 +536,38 @@ class MysqlUpdater extends DatabaseUpdater { $cur_text = 'cur_text'; $cur_flags = "''"; } - $this->db->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text, - old_timestamp, old_minor_edit, old_flags) - SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags - FROM $cur", __METHOD__ ); + $this->db->query( + "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, + old_user_text, old_timestamp, old_minor_edit, old_flags) + SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, + cur_timestamp, cur_minor_edit, $cur_flags + FROM $cur", + __METHOD__ + ); $this->output( wfTimestamp( TS_DB ) ); $this->output( "......Setting up revision table.\n" ); - $this->db->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp, - rev_minor_edit) + $this->db->query( + "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, + rev_user_text, rev_timestamp, rev_minor_edit) SELECT old_id, cur_id, old_comment, old_user, old_user_text, old_timestamp, old_minor_edit - FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", __METHOD__ ); + FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", + __METHOD__ + ); $this->output( wfTimestamp( TS_DB ) ); $this->output( "......Setting up page table.\n" ); - $this->db->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter, - page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len) - SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new, - cur_random, cur_touched, rev_id, LENGTH(cur_text) + $this->db->query( + "INSERT INTO $page (page_id, page_namespace, page_title, + page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, + page_touched, page_latest, page_len) + SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, + cur_is_redirect, cur_is_new, cur_random, cur_touched, rev_id, LENGTH(cur_text) FROM $cur,$revision - WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", __METHOD__ ); + WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", + __METHOD__ + ); $this->output( wfTimestamp( TS_DB ) ); $this->output( "......Unlocking tables.\n" ); @@ -564,7 +614,11 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" ); + $this->applyPatch( + 'patch-pagelinks.sql', + false, + 'Converting links and brokenlinks tables to pagelinks' + ); global $wgContLang; foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) { @@ -618,14 +672,16 @@ class MysqlUpdater extends DatabaseUpdater { if ( $info->type() == 'int' ) { $oldug = $this->db->tableName( 'user_groups' ); $newug = $this->db->tableName( 'user_groups_bogus' ); - $this->output( "user_groups table exists but is in bogus intermediate format. Renaming to $newug... " ); + $this->output( "user_groups table exists but is in bogus intermediate " . + "format. Renaming to $newug... " ); $this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ ); $this->output( "done.\n" ); $this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" ); $this->output( "***\n" ); - $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" ); + $this->output( "*** WARNING: You will need to manually fix up user " . + "permissions in the user_groups\n" ); $this->output( "*** table. Old 1.5 alpha versions did some pretty funky stuff...\n" ); $this->output( "***\n" ); } else { @@ -639,7 +695,11 @@ class MysqlUpdater extends DatabaseUpdater { if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) { if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) { - $this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" ); + $this->db->applyPatch( + 'patch-user_rights.sql', + false, + 'Upgrading from a 1.3 or older database? Breaking out user_rights for conversion' + ); } else { $this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" ); $this->output( "*** You may need to manually configure some sysops by manipulating\n" ); @@ -686,7 +746,11 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" ); + $this->applyPatch( + 'patch-watchlist-null.sql', + false, + 'Making wl_notificationtimestamp nullable' + ); } /** @@ -746,7 +810,8 @@ class MysqlUpdater extends DatabaseUpdater { ), __METHOD__ ); } - $this->output( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" ); + $this->output( "Done. Please run maintenance/refreshLinks.php for a more " . + "thorough templatelinks update.\n" ); } protected function doBacklinkingIndicesUpdate() { @@ -770,8 +835,16 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" ); - $this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" ); + $this->applyPatch( + 'patch-page_restrictions.sql', + false, + 'Creating page_restrictions table (1/2)' + ); + $this->applyPatch( + 'patch-page_restrictions_sortkey.sql', + false, + 'Creating page_restrictions table (2/2)' + ); $this->output( "done.\n" ); $this->output( "Migrating old restrictions to new table...\n" ); @@ -840,7 +913,11 @@ class MysqlUpdater extends DatabaseUpdater { return true; } - return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" ); + return $this->applyPatch( + 'patch-profiling-memory.sql', + false, + 'Adding pf_memory field to table profiling' + ); } protected function doFilearchiveIndicesUpdate() { @@ -860,12 +937,17 @@ class MysqlUpdater extends DatabaseUpdater { return true; } if ( $this->skipSchema ) { - $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" ); + $this->output( "...skipping schema change (making pl_namespace, tl_namespace " . + "and il_to indices UNIQUE).\n" ); return false; } - return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" ); + return $this->applyPatch( + 'patch-pl-tl-il-unique.sql', + false, + 'Making pl_namespace, tl_namespace and il_to indices UNIQUE' + ); } protected function doUpdateMimeMinorField() { @@ -875,7 +957,11 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" ); + $this->applyPatch( + 'patch-mime_minor_length.sql', + false, + 'Altering all *_mime_minor fields to 100 bytes in size' + ); } protected function doClFieldsUpdate() { @@ -885,7 +971,11 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' ); + $this->applyPatch( + 'patch-categorylinks-better-collation2.sql', + false, + 'Updating categorylinks (again)' + ); } protected function doLangLinksLengthUpdate() { @@ -894,7 +984,11 @@ class MysqlUpdater extends DatabaseUpdater { $row = $this->db->fetchObject( $res ); if ( $row && $row->Type == "varbinary(10)" ) { - $this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' ); + $this->applyPatch( + 'patch-langlinks-ll_lang-20.sql', + false, + 'Updating length of ll_lang in langlinks' + ); } else { $this->output( "...ll_lang is up-to-date.\n" ); } @@ -915,7 +1009,11 @@ class MysqlUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" ); + $this->applyPatch( + 'patch-user-newtalk-timestamp-null.sql', + false, + 'Making user_last_timestamp nullable' + ); } protected function doIwlinksIndexNonUnique() { @@ -931,6 +1029,10 @@ class MysqlUpdater extends DatabaseUpdater { return false; } - return $this->applyPatch( 'patch-iwl_prefix_title_from-non-unique.sql', false, "Making iwl_prefix_title_from index non-UNIQUE" ); + return $this->applyPatch( + 'patch-iwl_prefix_title_from-non-unique.sql', + false, + 'Making iwl_prefix_title_from index non-UNIQUE' + ); } } diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php index efa8d007b8..77575100c7 100644 --- a/includes/installer/OracleInstaller.php +++ b/includes/installer/OracleInstaller.php @@ -60,12 +60,22 @@ class OracleInstaller extends DatabaseInstaller { $this->parent->setVar( 'wgDBserver', '' ); } - return $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) . + return $this->getTextBox( + 'wgDBserver', + 'config-db-host-oracle', + array(), + $this->parent->getHelpBox( 'config-db-host-oracle-help' ) + ) . Html::openElement( 'fieldset' ) . Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) . $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) . $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) . - $this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) . + $this->getTextBox( + '_OracleTempTS', + 'config-oracle-temp-ts', + array(), + $this->parent->getHelpBox( 'config-db-oracle-help' ) + ) . Html::closeElement( 'fieldset' ) . $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) . $this->getInstallUserBox() . @@ -81,7 +91,12 @@ class OracleInstaller extends DatabaseInstaller { public function submitConnectForm() { // Get variables from the request - $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBprefix', 'wgDBuser', 'wgDBpassword' ) ); + $newValues = $this->setVarsFromRequest( + 'wgDBserver', + 'wgDBprefix', + 'wgDBuser', + 'wgDBpassword' + ); $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) ); // Validate them @@ -318,8 +333,11 @@ class OracleInstaller extends DatabaseInstaller { * @return bool Whether the connection string is valid. */ public static function checkConnectStringFormat( $connect_string ) { + // @@codingStandardsIgnoreStart Long lines with regular expressions. + // @todo Very long regular expression. Make more readable? $isValid = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect + // @@codingStandardsIgnoreEnd return (bool)$isValid; } } diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php index f3f86ebcf3..ec91e57b2f 100644 --- a/includes/installer/OracleUpdater.php +++ b/includes/installer/OracleUpdater.php @@ -48,13 +48,13 @@ class OracleUpdater extends DatabaseUpdater { array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ), //1.18 - array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ), + array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ), array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ), array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), array( 'doRecentchangesFK2Cascade' ), //1.19 - array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql'), + array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ), array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ), array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ), array( 'doRemoveNotNullEmptyDefaults2' ), @@ -70,20 +70,25 @@ class OracleUpdater extends DatabaseUpdater { array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ), //1.21 - array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ), - array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ), - array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), - array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), - array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), - array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ), + array( 'addField', 'revision', 'rev_content_format', + 'patch-revision-rev_content_format.sql' ), + array( 'addField', 'revision', 'rev_content_model', + 'patch-revision-rev_content_model.sql' ), + array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), + array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), + array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ), + array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ), + array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), + array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ), array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ), - array( 'addTable', 'sites', 'patch-sites.sql' ), - array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), - array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), - array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), - array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), + array( 'addTable', 'sites', 'patch-sites.sql' ), + array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), + array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), + array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), + array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ), - array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ), + array( 'modifyField', 'user_former_groups', 'ufg_group', + 'patch-ufg_group-length-increase-255.sql' ), // KEEP THIS AT THE BOTTOM!! array( 'doRebuildDuplicateFunction' ), @@ -102,14 +107,22 @@ class OracleUpdater extends DatabaseUpdater { return; } - $this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" ); + $this->applyPatch( + 'patch_namespace_defaults.sql', + false, + 'Altering namespace fields with default value' + ); } /** * Uniform FK names + deferrable state */ protected function doFKRenameDeferr() { - $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' ); + $meta = $this->db->query( ' + SELECT COUNT(*) cnt + FROM user_constraints + WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' + ); $row = $meta->fetchRow(); if ( $row && $row['cnt'] > 0 ) { return; @@ -167,7 +180,11 @@ class OracleUpdater extends DatabaseUpdater { if ( $meta->isNullable() ) { return; } - $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" ); + $this->applyPatch( + 'patch_remove_not_null_empty_defs.sql', + false, + 'Removing not null empty constraints' + ); } protected function doRemoveNotNullEmptyDefaults2() { @@ -175,7 +192,11 @@ class OracleUpdater extends DatabaseUpdater { if ( $meta->isNullable() ) { return; } - $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" ); + $this->applyPatch( + 'patch_remove_not_null_empty_defs2.sql', + false, + 'Removing not null empty constraints' + ); } /** diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php index a7e84629db..2cf41564f0 100644 --- a/includes/installer/PostgresInstaller.php +++ b/includes/installer/PostgresInstaller.php @@ -42,8 +42,8 @@ class PostgresInstaller extends DatabaseInstaller { '_InstallUser' => 'postgres', ); - var $minimumVersion = '8.3'; - var $maxRoleSearchDepth = 5; + public $minimumVersion = '8.3'; + public $maxRoleSearchDepth = 5; protected $pgConns = array(); @@ -56,12 +56,27 @@ class PostgresInstaller extends DatabaseInstaller { } function getConnectForm() { - return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) . + return $this->getTextBox( + 'wgDBserver', + 'config-db-host', + array(), + $this->parent->getHelpBox( 'config-db-host-help' ) + ) . $this->getTextBox( 'wgDBport', 'config-db-port' ) . Html::openElement( 'fieldset' ) . Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) . - $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) . - $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) . + $this->getTextBox( + 'wgDBname', + 'config-db-name', + array(), + $this->parent->getHelpBox( 'config-db-name-help' ) + ) . + $this->getTextBox( + 'wgDBmwschema', + 'config-db-schema', + array(), + $this->parent->getHelpBox( 'config-db-schema-help' ) + ) . Html::closeElement( 'fieldset' ) . $this->getInstallUserBox(); } diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php index 40c8126ad4..32e75108ec 100644 --- a/includes/installer/PostgresUpdater.php +++ b/includes/installer/PostgresUpdater.php @@ -51,16 +51,16 @@ class PostgresUpdater extends DatabaseUpdater { array( 'renameIndex', 'pagecontent', 'text_pkey', 'pagecontent_pkey' ), # renamed sequences - array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ), - array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ), - array( 'renameSequence', 'text_old_id_val', 'text_old_id_seq' ), - array( 'renameSequence', 'rc_rc_id_seq', 'recentchanges_rc_id_seq' ), - array( 'renameSequence', 'log_log_id_seq', 'logging_log_id_seq' ), - array( 'renameSequence', 'pr_id_val', 'page_restrictions_pr_id_seq' ), - array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ), + array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ), + array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ), + array( 'renameSequence', 'text_old_id_val', 'text_old_id_seq' ), + array( 'renameSequence', 'rc_rc_id_seq', 'recentchanges_rc_id_seq' ), + array( 'renameSequence', 'log_log_id_seq', 'logging_log_id_seq' ), + array( 'renameSequence', 'pr_id_val', 'page_restrictions_pr_id_seq' ), + array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ), # since r58263 - array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq'), + array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq' ), # new sequences if not renamed above array( 'addSequence', 'logging', false, 'logging_log_id_seq' ), @@ -68,197 +68,216 @@ class PostgresUpdater extends DatabaseUpdater { array( 'addSequence', 'filearchive', 'fa_id', 'filearchive_fa_id_seq' ), # new tables - array( 'addTable', 'category', 'patch-category.sql' ), - array( 'addTable', 'page', 'patch-page.sql' ), - array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ), - array( 'addTable', 'page_props', 'patch-page_props.sql' ), + array( 'addTable', 'category', 'patch-category.sql' ), + array( 'addTable', 'page', 'patch-page.sql' ), + array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ), + array( 'addTable', 'page_props', 'patch-page_props.sql' ), array( 'addTable', 'page_restrictions', 'patch-page_restrictions.sql' ), - array( 'addTable', 'profiling', 'patch-profiling.sql' ), - array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ), - array( 'addTable', 'redirect', 'patch-redirect.sql' ), - array( 'addTable', 'updatelog', 'patch-updatelog.sql' ), - array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), - array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ), - array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ), - array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), - array( 'addTable', 'log_search', 'patch-log_search.sql' ), - array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), - array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), - array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), - array( 'addTable', 'msg_resource_links','patch-msg_resource_links.sql' ), - array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), - array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), - array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ), - array( 'addTable', 'sites', 'patch-sites.sql' ), + array( 'addTable', 'profiling', 'patch-profiling.sql' ), + array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ), + array( 'addTable', 'redirect', 'patch-redirect.sql' ), + array( 'addTable', 'updatelog', 'patch-updatelog.sql' ), + array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), + array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ), + array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ), + array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), + array( 'addTable', 'log_search', 'patch-log_search.sql' ), + array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), + array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), + array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), + array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ), + array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), + array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), + array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ), + array( 'addTable', 'sites', 'patch-sites.sql' ), # Needed before new field array( 'convertArchive2' ), # new fields - array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ), - array( 'addPgField', 'archive', 'ar_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ), - array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ), - array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ), - array( 'addPgField', 'archive', 'ar_content_model', 'TEXT' ), - array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ), - array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''"), - array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0"), - array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'"), - array( 'addPgField', 'image', 'img_sha1', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'ipblocks', 'ipb_allow_usertalk', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'ipblocks', 'ipb_anon_only', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'ipblocks', 'ipb_by_text', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'ipblocks', 'ipb_block_email', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ), - array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ), - array( 'addPgField', 'ipblocks', 'ipb_parent_block_id', 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ), - array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'logging', 'log_id', "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ), - array( 'addPgField', 'logging', 'log_params', 'TEXT' ), - array( 'addPgField', 'mwuser', 'user_editcount', 'INTEGER' ), - array( 'addPgField', 'mwuser', 'user_newpass_time', 'TIMESTAMPTZ' ), - array( 'addPgField', 'oldimage', 'oi_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'oldimage', 'oi_major_mime', "TEXT NOT NULL DEFAULT 'unknown'" ), - array( 'addPgField', 'oldimage', 'oi_media_type', 'TEXT' ), - array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ), - array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ), - array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'page', 'page_content_model', 'TEXT' ), - array( 'addPgField', 'page_restrictions', 'pr_id', "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ), - array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ), - array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'recentchanges', 'rc_log_action', 'TEXT' ), - array( 'addPgField', 'recentchanges', 'rc_log_type', 'TEXT' ), - array( 'addPgField', 'recentchanges', 'rc_logid', 'INTEGER NOT NULL DEFAULT 0' ), - array( 'addPgField', 'recentchanges', 'rc_new_len', 'INTEGER' ), - array( 'addPgField', 'recentchanges', 'rc_old_len', 'INTEGER' ), - array( 'addPgField', 'recentchanges', 'rc_params', 'TEXT' ), - array( 'addPgField', 'redirect', 'rd_interwiki', 'TEXT NULL' ), - array( 'addPgField', 'redirect', 'rd_fragment', 'TEXT NULL' ), - array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), - array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ), - array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ), - array( 'addPgField', 'revision', 'rev_content_model', 'TEXT' ), - array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ), - array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ), - array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ), - array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'logging', 'log_page', 'INTEGER' ), - array( 'addPgField', 'interwiki', 'iw_api', "TEXT NOT NULL DEFAULT ''"), - array( 'addPgField', 'interwiki', 'iw_wikiid', "TEXT NOT NULL DEFAULT ''"), - array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ), - array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ), - array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ), - array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ), - array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ), - array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ), - array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ), + array( 'addPgField', 'archive', 'ar_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ), + array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ), + array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ), + array( 'addPgField', 'archive', 'ar_content_model', 'TEXT' ), + array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ), + array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0" ), + array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'" ), + array( 'addPgField', 'image', 'img_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'ipblocks', 'ipb_allow_usertalk', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'ipblocks', 'ipb_anon_only', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'ipblocks', 'ipb_by_text', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'ipblocks', 'ipb_block_email', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ), + array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ), + array( 'addPgField', 'ipblocks', 'ipb_parent_block_id', + 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ' . + 'ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ), + array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'logging', 'log_id', + "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ), + array( 'addPgField', 'logging', 'log_params', 'TEXT' ), + array( 'addPgField', 'mwuser', 'user_editcount', 'INTEGER' ), + array( 'addPgField', 'mwuser', 'user_newpass_time', 'TIMESTAMPTZ' ), + array( 'addPgField', 'oldimage', 'oi_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'oldimage', 'oi_major_mime', "TEXT NOT NULL DEFAULT 'unknown'" ), + array( 'addPgField', 'oldimage', 'oi_media_type', 'TEXT' ), + array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ), + array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ), + array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'page', 'page_content_model', 'TEXT' ), + array( 'addPgField', 'page_restrictions', 'pr_id', + "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ), + array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ), + array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'recentchanges', 'rc_log_action', 'TEXT' ), + array( 'addPgField', 'recentchanges', 'rc_log_type', 'TEXT' ), + array( 'addPgField', 'recentchanges', 'rc_logid', 'INTEGER NOT NULL DEFAULT 0' ), + array( 'addPgField', 'recentchanges', 'rc_new_len', 'INTEGER' ), + array( 'addPgField', 'recentchanges', 'rc_old_len', 'INTEGER' ), + array( 'addPgField', 'recentchanges', 'rc_params', 'TEXT' ), + array( 'addPgField', 'redirect', 'rd_interwiki', 'TEXT NULL' ), + array( 'addPgField', 'redirect', 'rd_fragment', 'TEXT NULL' ), + array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ), + array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ), + array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ), + array( 'addPgField', 'revision', 'rev_content_model', 'TEXT' ), + array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ), + array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ), + array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ), + array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'logging', 'log_page', 'INTEGER' ), + array( 'addPgField', 'interwiki', 'iw_api', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'interwiki', 'iw_wikiid', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ), + array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ), + array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ), + array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ), + array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ), + array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ), + array( 'addPgField', 'archive', 'ar_id', + "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ), + array( 'addPgField', 'externallinks', 'el_id', + "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ), # type changes - array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ), - array( 'changeField', 'archive', 'ar_minor_edit', 'smallint', 'ar_minor_edit::smallint DEFAULT 0' ), - array( 'changeField', 'filearchive', 'fa_deleted', 'smallint', '' ), - array( 'changeField', 'filearchive', 'fa_height', 'integer', '' ), - array( 'changeField', 'filearchive', 'fa_metadata', 'bytea', "decode(fa_metadata,'escape')" ), - array( 'changeField', 'filearchive', 'fa_size', 'integer', '' ), - array( 'changeField', 'filearchive', 'fa_width', 'integer', '' ), - array( 'changeField', 'filearchive', 'fa_storage_group', 'text', '' ), - array( 'changeField', 'filearchive', 'fa_storage_key', 'text', '' ), - array( 'changeField', 'image', 'img_metadata', 'bytea', "decode(img_metadata,'escape')" ), - array( 'changeField', 'image', 'img_size', 'integer', '' ), - array( 'changeField', 'image', 'img_width', 'integer', '' ), - array( 'changeField', 'image', 'img_height', 'integer', '' ), - array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint' ), - array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ), - array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ), - array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint', "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ), - array( 'changeField', 'ipblocks', 'ipb_create_account', 'smallint', "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ), - array( 'changeField', 'ipblocks', 'ipb_enable_autoblock', 'smallint', "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ), - array( 'changeField', 'ipblocks', 'ipb_block_email', 'smallint', "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ), - array( 'changeField', 'ipblocks', 'ipb_address', 'text', 'ipb_address::text' ), - array( 'changeField', 'ipblocks', 'ipb_deleted', 'smallint', 'ipb_deleted::smallint DEFAULT 0' ), - array( 'changeField', 'mwuser', 'user_token', 'text', '' ), - array( 'changeField', 'mwuser', 'user_email_token', 'text', '' ), - array( 'changeField', 'objectcache', 'keyname', 'text', '' ), - array( 'changeField', 'oldimage', 'oi_height', 'integer', '' ), - array( 'changeField', 'oldimage', 'oi_metadata', 'bytea', "decode(img_metadata,'escape')" ), - array( 'changeField', 'oldimage', 'oi_size', 'integer', '' ), - array( 'changeField', 'oldimage', 'oi_width', 'integer', '' ), - array( 'changeField', 'page', 'page_is_redirect', 'smallint', 'page_is_redirect::smallint DEFAULT 0' ), - array( 'changeField', 'page', 'page_is_new', 'smallint', 'page_is_new::smallint DEFAULT 0' ), - array( 'changeField', 'querycache', 'qc_value', 'integer', '' ), - array( 'changeField', 'querycachetwo', 'qcc_value', 'integer', '' ), - array( 'changeField', 'recentchanges', 'rc_bot', 'smallint', 'rc_bot::smallint DEFAULT 0' ), - array( 'changeField', 'recentchanges', 'rc_deleted', 'smallint', '' ), - array( 'changeField', 'recentchanges', 'rc_minor', 'smallint', 'rc_minor::smallint DEFAULT 0' ), - array( 'changeField', 'recentchanges', 'rc_new', 'smallint', 'rc_new::smallint DEFAULT 0' ), - array( 'changeField', 'recentchanges', 'rc_type', 'smallint', 'rc_type::smallint DEFAULT 0' ), - array( 'changeField', 'recentchanges', 'rc_patrolled', 'smallint', 'rc_patrolled::smallint DEFAULT 0' ), - array( 'changeField', 'revision', 'rev_deleted', 'smallint', 'rev_deleted::smallint DEFAULT 0' ), - array( 'changeField', 'revision', 'rev_minor_edit', 'smallint', 'rev_minor_edit::smallint DEFAULT 0' ), - array( 'changeField', 'templatelinks', 'tl_namespace', 'smallint', 'tl_namespace::smallint' ), - array( 'changeField', 'user_newtalk', 'user_ip', 'text', 'host(user_ip)' ), - array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ), - array( 'changeField', 'profiling', 'pf_time', 'float', '' ), - array( 'changeField', 'profiling', 'pf_memory', 'float', '' ), + array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ), + array( 'changeField', 'archive', 'ar_minor_edit', 'smallint', + 'ar_minor_edit::smallint DEFAULT 0' ), + array( 'changeField', 'filearchive', 'fa_deleted', 'smallint', '' ), + array( 'changeField', 'filearchive', 'fa_height', 'integer', '' ), + array( 'changeField', 'filearchive', 'fa_metadata', 'bytea', "decode(fa_metadata,'escape')" ), + array( 'changeField', 'filearchive', 'fa_size', 'integer', '' ), + array( 'changeField', 'filearchive', 'fa_width', 'integer', '' ), + array( 'changeField', 'filearchive', 'fa_storage_group', 'text', '' ), + array( 'changeField', 'filearchive', 'fa_storage_key', 'text', '' ), + array( 'changeField', 'image', 'img_metadata', 'bytea', "decode(img_metadata,'escape')" ), + array( 'changeField', 'image', 'img_size', 'integer', '' ), + array( 'changeField', 'image', 'img_width', 'integer', '' ), + array( 'changeField', 'image', 'img_height', 'integer', '' ), + array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint' ), + array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ), + array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ), + array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint', + "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ), + array( 'changeField', 'ipblocks', 'ipb_create_account', 'smallint', + "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ), + array( 'changeField', 'ipblocks', 'ipb_enable_autoblock', 'smallint', + "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ), + array( 'changeField', 'ipblocks', 'ipb_block_email', 'smallint', + "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ), + array( 'changeField', 'ipblocks', 'ipb_address', 'text', 'ipb_address::text' ), + array( 'changeField', 'ipblocks', 'ipb_deleted', 'smallint', 'ipb_deleted::smallint DEFAULT 0' ), + array( 'changeField', 'mwuser', 'user_token', 'text', '' ), + array( 'changeField', 'mwuser', 'user_email_token', 'text', '' ), + array( 'changeField', 'objectcache', 'keyname', 'text', '' ), + array( 'changeField', 'oldimage', 'oi_height', 'integer', '' ), + array( 'changeField', 'oldimage', 'oi_metadata', 'bytea', "decode(img_metadata,'escape')" ), + array( 'changeField', 'oldimage', 'oi_size', 'integer', '' ), + array( 'changeField', 'oldimage', 'oi_width', 'integer', '' ), + array( 'changeField', 'page', 'page_is_redirect', 'smallint', + 'page_is_redirect::smallint DEFAULT 0' ), + array( 'changeField', 'page', 'page_is_new', 'smallint', 'page_is_new::smallint DEFAULT 0' ), + array( 'changeField', 'querycache', 'qc_value', 'integer', '' ), + array( 'changeField', 'querycachetwo', 'qcc_value', 'integer', '' ), + array( 'changeField', 'recentchanges', 'rc_bot', 'smallint', 'rc_bot::smallint DEFAULT 0' ), + array( 'changeField', 'recentchanges', 'rc_deleted', 'smallint', '' ), + array( 'changeField', 'recentchanges', 'rc_minor', 'smallint', 'rc_minor::smallint DEFAULT 0' ), + array( 'changeField', 'recentchanges', 'rc_new', 'smallint', 'rc_new::smallint DEFAULT 0' ), + array( 'changeField', 'recentchanges', 'rc_type', 'smallint', 'rc_type::smallint DEFAULT 0' ), + array( 'changeField', 'recentchanges', 'rc_patrolled', 'smallint', + 'rc_patrolled::smallint DEFAULT 0' ), + array( 'changeField', 'revision', 'rev_deleted', 'smallint', 'rev_deleted::smallint DEFAULT 0' ), + array( 'changeField', 'revision', 'rev_minor_edit', 'smallint', + 'rev_minor_edit::smallint DEFAULT 0' ), + array( 'changeField', 'templatelinks', 'tl_namespace', 'smallint', 'tl_namespace::smallint' ), + array( 'changeField', 'user_newtalk', 'user_ip', 'text', 'host(user_ip)' ), + array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ), + array( 'changeField', 'profiling', 'pf_time', 'float', '' ), + array( 'changeField', 'profiling', 'pf_memory', 'float', '' ), # null changes - array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ), - array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ), + array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ), + array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ), array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ), array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ), - array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'), - array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'), + array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL' ), + array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL' ), array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ), array( 'checkOiDeleted' ), # New indexes - array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ), - array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ), - array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ), - array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ), - array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ), - array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ), - array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ), - array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ), - array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ), - array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ), - array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ), - array( 'addPgIndex', 'logging', 'logging_user_type_time', '(log_user, log_type, log_timestamp)' ), - array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ), - array( 'addPgIndex', 'iwlinks', 'iwl_prefix_from_title', '(iwl_prefix, iwl_from, iwl_title)' ), - array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ), - array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ), - array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ), - array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ), - array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ), - array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ), + array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ), + array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ), + array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ), + array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ), + array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ), + array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ), + array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ), + array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ), + array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ), + array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ), + array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ), + array( 'addPgIndex', 'logging', 'logging_user_type_time', + '(log_user, log_type, log_timestamp)' ), + array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ), + array( 'addPgIndex', 'iwlinks', 'iwl_prefix_from_title', '(iwl_prefix, iwl_from, iwl_title)' ), + array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ), + array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ), + array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ), + array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ), + array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ), + array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ), array( 'checkIndex', 'pagelink_unique', array( array( 'pl_from', 'int4_ops', 'btree', 0 ), array( 'pl_namespace', 'int2_ops', 'btree', 0 ), array( 'pl_title', 'text_ops', 'btree', 0 ), ), - 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ), + 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ), array( 'checkIndex', 'cl_sortkey', array( array( 'cl_to', 'text_ops', 'btree', 0 ), array( 'cl_sortkey', 'text_ops', 'btree', 0 ), array( 'cl_from', 'int4_ops', 'btree', 0 ), ), - 'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ), + 'CREATE INDEX cl_sortkey ON "categorylinks" ' . + 'USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ), array( 'checkIndex', 'iwl_prefix_title_from', array( array( 'iwl_prefix', 'text_ops', 'btree', 0 ), array( 'iwl_title', 'text_ops', 'btree', 0 ), array( 'iwl_from', 'int4_ops', 'btree', 0 ), ), - 'CREATE INDEX iwl_prefix_title_from ON "iwlinks" USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ), + 'CREATE INDEX iwl_prefix_title_from ON "iwlinks" ' . + 'USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ), array( 'checkIndex', 'logging_times', array( array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ), ), @@ -268,36 +287,48 @@ class PostgresUpdater extends DatabaseUpdater { array( 'oi_name', 'text_ops', 'btree', 0 ), array( 'oi_archive_name', 'text_ops', 'btree', 0 ), ), - 'CREATE INDEX "oi_name_archive_name" ON "oldimage" USING "btree" ("oi_name", "oi_archive_name")' ), + 'CREATE INDEX "oi_name_archive_name" ON "oldimage" ' . + 'USING "btree" ("oi_name", "oi_archive_name")' ), array( 'checkIndex', 'oi_name_timestamp', array( array( 'oi_name', 'text_ops', 'btree', 0 ), array( 'oi_timestamp', 'timestamptz_ops', 'btree', 0 ), ), - 'CREATE INDEX "oi_name_timestamp" ON "oldimage" USING "btree" ("oi_name", "oi_timestamp")' ), + 'CREATE INDEX "oi_name_timestamp" ON "oldimage" ' . + 'USING "btree" ("oi_name", "oi_timestamp")' ), array( 'checkIndex', 'page_main_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_main_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ), + 'CREATE INDEX "page_main_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ), array( 'checkIndex', 'page_mediawiki_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_mediawiki_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ), + 'CREATE INDEX "page_mediawiki_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ), array( 'checkIndex', 'page_project_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_project_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 4)' ), + 'CREATE INDEX "page_project_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") ' . + 'WHERE ("page_namespace" = 4)' ), array( 'checkIndex', 'page_talk_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_talk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 1)' ), + 'CREATE INDEX "page_talk_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") ' . + 'WHERE ("page_namespace" = 1)' ), array( 'checkIndex', 'page_user_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_user_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 2)' ), + 'CREATE INDEX "page_user_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") WHERE ' . + '("page_namespace" = 2)' ), array( 'checkIndex', 'page_utalk_title', array( array( 'page_title', 'text_pattern_ops', 'btree', 0 ), ), - 'CREATE INDEX "page_utalk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 3)' ), + 'CREATE INDEX "page_utalk_title" ON "page" ' . + 'USING "btree" ("page_title" "text_pattern_ops") ' . + 'WHERE ("page_namespace" = 3)' ), array( 'checkIndex', 'ts2_page_text', array( array( 'textvector', 'tsvector_ops', 'gist', 0 ), ), @@ -317,39 +348,48 @@ class PostgresUpdater extends DatabaseUpdater { array( 'ipb_auto', 'int2_ops', 'btree', 0 ), array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ), ), - 'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ), + 'CREATE UNIQUE INDEX ipb_address_unique ' . + 'ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ), array( 'checkIwlPrefix' ), # All FK columns should be deferred - array( 'changeFkeyDeferrable', 'archive', 'ar_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'categorylinks', 'cl_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'externallinks', 'el_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'filearchive', 'fa_deleted_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'filearchive', 'fa_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'image', 'img_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id', 'ipblocks(ipb_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'oldimage', 'oi_name', 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ), - array( 'changeFkeyDeferrable', 'oldimage', 'oi_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'pagelinks', 'pl_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'page_props', 'pp_page', 'page (page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id', 'page(page_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user', 'mwuser(user_id) ON DELETE SET NULL' ), - array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ), - array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'user_properties', 'up_user', 'mwuser(user_id) ON DELETE CASCADE' ), - array( 'changeFkeyDeferrable', 'watchlist', 'wl_user', 'mwuser(user_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'archive', 'ar_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'categorylinks', 'cl_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'externallinks', 'el_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'filearchive', 'fa_deleted_user', + 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'filearchive', 'fa_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'image', 'img_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id', + 'ipblocks(ipb_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'oldimage', 'oi_name', + 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ), + array( 'changeFkeyDeferrable', 'oldimage', 'oi_user', 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'pagelinks', 'pl_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'page_props', 'pp_page', 'page (page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page', + 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user', + 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id', + 'page(page_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user', + 'mwuser(user_id) ON DELETE SET NULL' ), + array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ), + array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'user_properties', 'up_user', + 'mwuser(user_id) ON DELETE CASCADE' ), + array( 'changeFkeyDeferrable', 'watchlist', 'wl_user', 'mwuser(user_id) ON DELETE CASCADE' ), # r81574 array( 'addInterwikiType' ), @@ -569,7 +609,8 @@ END; if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $old, __METHOD__ ) ) { - $this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" . + $this->output( "...WARNING: $old still exists, despite it has been " . + "renamed into $new (which also exists).\n" . " $old should be manually removed if not needed anymore.\n" ); } @@ -682,7 +723,8 @@ END; protected function changeFkeyDeferrable( $table, $field, $clause ) { $fi = $this->db->fieldInfo( $table, $field ); if ( is_null( $fi ) ) { - $this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" ); + $this->output( "WARNING! Column '$table.$field' does not exist but it should! " . + "Please report this.\n" ); return; } @@ -696,10 +738,13 @@ END; $command = "ALTER TABLE $table DROP CONSTRAINT $conname"; $this->db->query( $command ); } else { - $this->output( "Column '$table.$field' does not have a foreign key constraint, will be added\n" ); + $this->output( "Column '$table.$field' does not have a foreign key " . + "constraint, will be added\n" ); $conclause = ""; } - $command = "ALTER TABLE $table ADD $conclause FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED"; + $command = + "ALTER TABLE $table ADD $conclause " . + "FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED"; $this->db->query( $command ); } @@ -713,7 +758,11 @@ END; $this->output( "Dropping rule 'archive_delete'\n" ); $this->db->query( 'DROP RULE archive_delete ON archive' ); } - $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" ); + $this->applyPatch( + 'patch-remove-archive2.sql', + false, + "Converting 'archive2' back to normal archive table" + ); } else { $this->output( "...obsolete table 'archive2' does not exist\n" ); } @@ -723,7 +772,8 @@ END; if ( $this->db->fieldInfo( 'oldimage', 'oi_deleted' )->type() !== 'smallint' ) { $this->output( "Changing 'oldimage.oi_deleted' to type 'smallint'\n" ); $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" ); - $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" ); + $this->db->query( + "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" ); $this->db->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" ); } else { $this->output( "...column 'oldimage.oi_deleted' is already of type 'smallint'\n" ); @@ -732,23 +782,32 @@ END; protected function checkOiNameConstraint() { if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascaded" ) ) { - $this->output( "...table 'oldimage' has correct cascading delete/update foreign key to image\n" ); + $this->output( "...table 'oldimage' has correct cascading delete/update " . + "foreign key to image\n" ); } else { if ( $this->db->hasConstraint( "oldimage_oi_name_fkey" ) ) { - $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" ); + $this->db->query( + "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" ); } if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascade" ) ) { - $this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" ); + $this->db->query( + "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" ); } $this->output( "Making foreign key on table 'oldimage' (to image) a cascade delete/update\n" ); - $this->db->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " . - "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" ); + $this->db->query( + "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " . + "FOREIGN KEY (oi_name) REFERENCES image(img_name) " . + "ON DELETE CASCADE ON UPDATE CASCADE" ); } } protected function checkPageDeletedTrigger() { if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) { - $this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" ); + $this->applyPatch( + 'patch-page_deleted.sql', + false, + "Adding function and trigger 'page_deleted' to table 'page'" + ); } else { $this->output( "...table 'page' has 'page_deleted' trigger\n" ); } @@ -783,13 +842,21 @@ END; if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) { $this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" ); } else { - $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" ); + $this->applyPatch( + 'patch-revision_rev_user_fkey.sql', + false, + "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" + ); } } protected function checkIwlPrefix() { if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) { - $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'" ); + $this->applyPatch( + 'patch-rename-iwl_prefix.sql', + false, + "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'" + ); } } diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php index 136ca4b560..19218c60a6 100644 --- a/includes/installer/SqliteInstaller.php +++ b/includes/installer/SqliteInstaller.php @@ -82,8 +82,17 @@ class SqliteInstaller extends DatabaseInstaller { } public function getConnectForm() { - return $this->getTextBox( 'wgSQLiteDataDir', 'config-sqlite-dir', array(), $this->parent->getHelpBox( 'config-sqlite-dir-help' ) ) . - $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-sqlite-name-help' ) ); + return $this->getTextBox( + 'wgSQLiteDataDir', + 'config-sqlite-dir', array(), + $this->parent->getHelpBox( 'config-sqlite-dir-help' ) + ) . + $this->getTextBox( + 'wgDBname', + 'config-db-name', + array(), + $this->parent->getHelpBox( 'config-sqlite-name-help' ) + ); } /** @@ -132,9 +141,16 @@ class SqliteInstaller extends DatabaseInstaller { if ( !is_writable( dirname( $dir ) ) ) { $webserverGroup = Installer::maybeGetWebserverPrimaryGroup(); if ( $webserverGroup !== null ) { - return Status::newFatal( 'config-sqlite-parent-unwritable-group', $dir, dirname( $dir ), basename( $dir ), $webserverGroup ); + return Status::newFatal( + 'config-sqlite-parent-unwritable-group', + $dir, dirname( $dir ), basename( $dir ), + $webserverGroup + ); } else { - return Status::newFatal( 'config-sqlite-parent-unwritable-nogroup', $dir, dirname( $dir ), basename( $dir ) ); + return Status::newFatal( + 'config-sqlite-parent-unwritable-nogroup', + $dir, dirname( $dir ), basename( $dir ) + ); } } diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php index 978a78445a..020993a2a2 100644 --- a/includes/installer/SqliteUpdater.php +++ b/includes/installer/SqliteUpdater.php @@ -32,83 +32,88 @@ class SqliteUpdater extends DatabaseUpdater { protected function getCoreUpdateList() { return array( // 1.14 - array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), + array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ), array( 'doActiveUsersInit' ), - array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ), + array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ), array( 'sqliteInitialIndexes' ), // 1.15 - array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), - array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ), - array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ), + array( 'addTable', 'change_tag', 'patch-change_tag.sql' ), + array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ), + array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ), // 1.16 - array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), - array( 'addTable', 'log_search', 'patch-log_search.sql' ), - array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ), - array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update + array( 'addTable', 'user_properties', 'patch-user_properties.sql' ), + array( 'addTable', 'log_search', 'patch-log_search.sql' ), + array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ), + # listed separately from the previous update because 1.16 was released without this update + array( 'doLogUsertextPopulation' ), array( 'doLogSearchPopulation' ), - array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), - array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ), - array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ), - array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ), + array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ), + array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ), + array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ), + array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ), array( 'doUpdateTranscacheField' ), array( 'sqliteSetupSearchindex' ), // 1.17 - array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), - array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ), - array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ), - array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ), - array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ), - array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ), + array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ), + array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ), + array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ), + array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ), + array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ), + array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ), array( 'doCollationUpdate' ), - array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), - array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), - array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ), - array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ), + array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ), + array( 'addTable', 'module_deps', 'patch-module_deps.sql' ), + array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ), + array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ), // 1.18 - array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ), - array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), - array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'), + array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ), + array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ), + array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ), // 1.19 - array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'), + array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ), array( 'doMigrateUserOptions' ), - array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ), - array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ), - array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ), - array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ), - array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ), - array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ), + array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ), + array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ), + array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ), + array( 'addIndex', 'page', 'page_redirect_namespace_len', + 'patch-page_redirect_namespace_len.sql' ), + array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ), + array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ), // 1.20 array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ), array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ), array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ), - array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ), + array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ), // 1.21 array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ), - array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ), - array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), - array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), - array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), - - array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ), + array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ), + array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ), + array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ), + array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ), + array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ), array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ), - array( 'addTable', 'sites', 'patch-sites.sql' ), - array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), - array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), - array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), + array( 'addTable', 'sites', 'patch-sites.sql' ), + array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ), + array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ), + array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ), array( 'doEnableProfiling' ), - array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), + array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ), array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ), - array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ), - array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ), + array( 'modifyField', 'user_former_groups', 'ufg_group', + 'patch-ufg_group-length-increase-255.sql' ), + array( 'addIndex', 'page_props', 'pp_propname_page', + 'patch-page_props-propname-page-index.sql' ), array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ), - array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ), + array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ), + array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ), + array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ), // 1.22 array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ), @@ -116,8 +121,11 @@ class SqliteUpdater extends DatabaseUpdater { } protected function sqliteInitialIndexes() { - // initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer. - if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) { + // initial-indexes.sql fails if the indexes are already present, + // so we perform a quick check if our database is newer. + if ( $this->updateRowExists( 'initial_indexes' ) || + $this->db->indexExists( 'user', 'user_name', __METHOD__ ) + ) { $this->output( "...have initial indexes\n" ); return; @@ -129,7 +137,11 @@ class SqliteUpdater extends DatabaseUpdater { $module = DatabaseSqlite::getFulltextSearchModule(); $fts3tTable = $this->updateRowExists( 'fts3' ); if ( $fts3tTable && !$module ) { - $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' ); + $this->applyPatch( + 'searchindex-no-fts.sql', + false, + 'PHP is missing FTS3 support, downgrading tables' + ); } elseif ( !$fts3tTable && $module == 'FTS3' ) { $this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" ); } else { diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php index cbceed6e10..e23edf5ebf 100644 --- a/includes/installer/WebInstaller.php +++ b/includes/installer/WebInstaller.php @@ -660,7 +660,9 @@ class WebInstaller extends Installer { */ public function getInfoBox( $text, $icon = false, $class = false ) { $text = $this->parse( $text, true ); - $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/' . $icon; + $icon = ( $icon == false ) ? + '../skins/common/images/info-32.png' : + '../skins/common/images/' . $icon; $alt = wfMessage( 'config-information' )->text(); return Html::infoBox( $text, $icon, $alt, $class, false ); diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php index 1df8f05095..f2dc37fe91 100644 --- a/includes/installer/WebInstallerOutput.php +++ b/includes/installer/WebInstallerOutput.php @@ -104,47 +104,83 @@ class WebInstallerOutput { /** * Get the raw vector CSS, flipping if needed + * + * @todo Possibly get rid of this function and use ResourceLoader in the manner it was + * designed to be used in, rather than just grabbing a list of filenames from it, + * and not properly handling such details as media types in module definitions. + * * @param string $dir 'ltr' or 'rtl' * @return String */ public function getCSS( $dir ) { - $skinDir = dirname( dirname( __DIR__ ) ) . '/skins'; - - // All these files will be concatenated in sequence and loaded - // as one file. - // The string 'images/' in the files' contents will be replaced - // by '../skins/$skinName/images/', where $skinName is what appears - // before the last '/' in each of the strings. - $cssFileNames = array( - - // Basically the "skins.vector" ResourceLoader module styles - 'common/shared.css', - 'common/commonElements.css', - 'common/commonContent.css', - 'common/commonInterface.css', - 'vector/screen.css', - - // mw-config specific - 'common/config.css', + // All CSS files these modules reference will be concatenated in sequence + // and loaded as one file. + $moduleNames = array( + 'mediawiki.legacy.shared', + 'skins.vector', + 'mediawiki.legacy.config', ); + $prepend = ''; $css = ''; - wfSuppressWarnings(); - foreach ( $cssFileNames as $cssFileName ) { - $fullCssFileName = "$skinDir/$cssFileName"; - $cssFileContents = file_get_contents( $fullCssFileName ); - if ( $cssFileContents ) { - preg_match( "/^(\w+)\//", $cssFileName, $match ); - $skinName = $match[1]; - $css .= str_replace( 'images/', "../skins/$skinName/images/", $cssFileContents ); - } else { - $css .= "/** Your webserver cannot read $fullCssFileName. Please check file permissions. */"; + $cssFileNames = array(); + $resourceLoader = new ResourceLoader(); + foreach ( $moduleNames as $moduleName ) { + $module = $resourceLoader->getModule( $moduleName ); + $cssFileNames = $module->getAllStyleFiles(); + + wfSuppressWarnings(); + foreach ( $cssFileNames as $cssFileName ) { + if ( !file_exists( $cssFileName ) ) { + $prepend .= ResourceLoader::makeComment( "Unable to find $cssFileName." ); + continue; + } + + if ( !is_readable( $cssFileName ) ) { + $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName. Please check file permissions." ); + continue; + } + + try { + + if ( preg_match( '/\.less$/', $cssFileName ) ) { + // Run the LESS compiler for *.less files (bug 55589) + $compiler = ResourceLoader::getLessCompiler(); + $cssFileContents = $compiler->compileFile( $cssFileName ); + } else { + // Regular CSS file + $cssFileContents = file_get_contents( $cssFileName ); + } + + if ( $cssFileContents ) { + // Rewrite URLs, though don't bother embedding images. While static image + // files may be cached, CSS returned by this function is definitely not. + $cssDirName = dirname( $cssFileName ); + $css .= CSSMin::remap( + /* source */ $cssFileContents, + /* local */ $cssDirName, + /* remote */ '..' . str_replace( + array( $GLOBALS['IP'], DIRECTORY_SEPARATOR ), + array( '', '/' ), + $cssDirName + ), + /* embedData */ false + ); + } else { + $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName." ); + } + + } catch ( Exception $e ) { + $prepend .= ResourceLoader::formatException( $e ); + } + + $css .= "\n"; } - - $css .= "\n"; + wfRestoreWarnings(); } - wfRestoreWarnings(); + + $css = $prepend . $css; if ( $dir == 'rtl' ) { $css = CSSJanus::transform( $css, true ); diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php index 11c0a8ee68..e30373e019 100644 --- a/includes/installer/WebInstallerPage.php +++ b/includes/installer/WebInstallerPage.php @@ -704,9 +704,8 @@ class WebInstaller_Name extends WebInstallerPage { ) ) . $this->parent->getTextBox( array( 'var' => 'wgMetaNamespace', - 'label' => '', //TODO: Needs a label? - 'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ), - + 'label' => '', // @todo Needs a label? + 'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ) ) ) . $this->getFieldSetStart( 'config-admin-box' ) . $this->parent->getTextBox( array( @@ -865,7 +864,6 @@ class WebInstaller_Name extends WebInstallerPage { } class WebInstaller_Options extends WebInstallerPage { - public function execute() { if ( $this->getVar( '_SkipOptional' ) == 'skip' ) { return 'skip'; @@ -1255,7 +1253,9 @@ class WebInstaller_Install extends WebInstallerPage { public function startStage( $step ) { // Messages: config-install-database, config-install-tables, config-install-interwiki, // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage - $this->addHTML( "
    • " . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis' )->escaped() ); + $this->addHTML( "
    • " . wfMessage( "config-install-$step" )->escaped() . + wfMessage( 'ellipsis' )->escaped() ); + if ( $step == 'extension-tables' ) { $this->startLiveBox(); } @@ -1282,7 +1282,6 @@ class WebInstaller_Install extends WebInstallerPage { } class WebInstaller_Complete extends WebInstallerPage { - public function execute() { // Pop up a dialog box, to make it difficult for the user to forget // to download the file diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php index 10f2c971c4..6556ee85c7 100644 --- a/includes/job/JobQueue.php +++ b/includes/job/JobQueue.php @@ -40,7 +40,6 @@ abstract class JobQueue { protected $dupCache; const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions - const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions (b/c) const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days) diff --git a/includes/job/JobQueueFederated.php b/includes/job/JobQueueFederated.php index d788c98b42..d3ce164af9 100644 --- a/includes/job/JobQueueFederated.php +++ b/includes/job/JobQueueFederated.php @@ -40,25 +40,19 @@ * * If used for performance, then $wgMainCacheType should be set to memcached/redis. * Note that "fifo" cannot be used for the ordering, since the data is distributed. - * One can still use "timestamp" instead, as in "roughly timestamp ordered". + * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also, + * queue classes used by this should ignore down servers (with TTL) to avoid slowness. * * @ingroup JobQueue * @since 1.22 */ class JobQueueFederated extends JobQueue { - /** @var Array (wiki ID => section name) */ - protected $sectionsByWiki = array(); - /** @var Array (section name => (partition name => weight)) */ - protected $partitionsBySection = array(); - /** @var Array (section name => config array) */ - protected $configByPartition = array(); - /** @var Array (partition names => integer) */ - protected $partitionsNoPush = array(); - - /** @var HashRing */ - protected $partitionRing; - /** @var Array (partition name => JobQueue) */ + /** @var Array (partition name => weight) reverse sorted by weight */ + protected $partitionMap = array(); + /** @var Array (partition name => JobQueue) reverse sorted by weight */ protected $partitionQueues = array(); + /** @var HashRing */ + protected $partitionPushRing; /** @var BagOStuff */ protected $cache; @@ -82,36 +76,41 @@ class JobQueueFederated extends JobQueue { */ protected function __construct( array $params ) { parent::__construct( $params ); - $this->sectionsByWiki = isset( $params['sectionsByWiki'] ) - ? $params['sectionsByWiki'] - : array(); // all in "default" section - $this->partitionsBySection = $params['partitionsBySection']; - $this->configByPartition = $params['configByPartition']; + $section = isset( $params['sectionsByWiki'][$this->wiki] ) + ? $params['sectionsByWiki'][$this->wiki] + : 'default'; + if ( !isset( $params['partitionsBySection'][$section] ) ) { + throw new MWException( "No configuration for section '$section'." ); + } + // Get the full partition map + $this->partitionMap = $params['partitionsBySection'][$section]; + arsort( $this->partitionMap, SORT_NUMERIC ); + // Get the partitions jobs can actually be pushed to + $partitionPushMap = $this->partitionMap; if ( isset( $params['partitionsNoPush'] ) ) { - $this->partitionsNoPush = array_flip( $params['partitionsNoPush'] ); + foreach ( $params['partitionsNoPush'] as $partition ) { + unset( $partitionPushMap[$partition] ); + } } + // Get the config to pass to merge into each partition queue config $baseConfig = $params; foreach ( array( 'class', 'sectionsByWiki', 'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o ) { unset( $baseConfig[$o] ); } - foreach ( $this->getPartitionMap() as $partition => $w ) { - if ( !isset( $this->configByPartition[$partition] ) ) { + // Get the partition queue objects + foreach ( $this->partitionMap as $partition => $w ) { + if ( !isset( $params['configByPartition'][$partition] ) ) { throw new MWException( "No configuration for partition '$partition'." ); } $this->partitionQueues[$partition] = JobQueue::factory( - $baseConfig + $this->configByPartition[$partition] - ); + $baseConfig + $params['configByPartition'][$partition] ); } - // Get the ring of partitions to push job de-duplication information into - $partitionsTry = array_diff_key( - $this->getPartitionMap(), - $this->partitionsNoPush - ); // (partition => weight) - $this->partitionRing = new HashRing( $partitionsTry ); + // Get the ring of partitions to push jobs into + $this->partitionPushRing = new HashRing( $partitionPushMap ); // Aggregate cache some per-queue values if there are multiple partition queues - $this->cache = $this->isFederated() ? wfGetMainCache() : new EmptyBagOStuff(); + $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff(); } protected function supportedOrders() { @@ -144,7 +143,7 @@ class JobQueueFederated extends JobQueue { return false; } } catch ( JobQueueError $e ) { - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } } @@ -186,7 +185,7 @@ class JobQueueFederated extends JobQueue { try { $count += $queue->$method(); } catch ( JobQueueError $e ) { - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } } @@ -198,36 +197,26 @@ class JobQueueFederated extends JobQueue { if ( !count( $jobs ) ) { return true; // nothing to do } - - $partitionsTry = array_diff_key( - $this->getPartitionMap(), - $this->partitionsNoPush - ); // (partition => weight) - + // Local ring variable that may be changed to point to a new ring on failure + $partitionRing = $this->partitionPushRing; // Try to insert the jobs and update $partitionsTry on any failures - $jobsLeft = $this->tryJobInsertions( $jobs, $partitionsTry, $flags ); + $jobsLeft = $this->tryJobInsertions( $jobs, $partitionRing, $flags ); if ( count( $jobsLeft ) ) { // some jobs failed to insert? // Try to insert the remaning jobs once more, ignoring the bad partitions - return !count( $this->tryJobInsertions( $jobsLeft, $partitionsTry, $flags ) ); - } else { - return true; + return !count( $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags ) ); } + return true; } /** * @param array $jobs - * @param array $partitionsTry + * @param HashRing $partitionRing * @param integer $flags * @return array List of Job object that could not be inserted */ - protected function tryJobInsertions( array $jobs, array &$partitionsTry, $flags ) { - if ( !count( $partitionsTry ) ) { - return $jobs; // can't insert anything - } - + protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) { $jobsLeft = array(); - $partitionRing = new HashRing( $partitionsTry ); // Because jobs are spread across partitions, per-job de-duplication needs // to use a consistent hash to avoid allowing duplicate jobs per partition. // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded. @@ -253,39 +242,42 @@ class JobQueueFederated extends JobQueue { foreach ( $uJobsByPartition as $partition => $jobBatch ) { $queue = $this->partitionQueues[$partition]; try { - $ok = $queue->doBatchPush( $jobBatch, $flags ); + $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC ); } catch ( JobQueueError $e ) { $ok = false; - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } if ( $ok ) { $key = $this->getCacheKey( 'empty' ); $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG ); } else { - unset( $partitionsTry[$partition] ); // blacklist partition + $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist + if ( !$partitionRing ) { + throw new JobQueueError( "Could not insert job(s), all partitions are down." ); + } $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted } } + // Insert the jobs that are not de-duplicated into the queues... foreach ( $nuJobBatches as $jobBatch ) { - $partition = ArrayUtils::pickRandom( $partitionsTry ); - if ( $partition === false ) { // all partitions at 0 weight? - $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted + $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() ); + $queue = $this->partitionQueues[$partition]; + try { + $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC ); + } catch ( JobQueueError $e ) { + $ok = false; + MWExceptionHandler::logException( $e ); + } + if ( $ok ) { + $key = $this->getCacheKey( 'empty' ); + $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG ); } else { - $queue = $this->partitionQueues[$partition]; - try { - $ok = $queue->doBatchPush( $jobBatch, $flags ); - } catch ( JobQueueError $e ) { - $ok = false; - wfDebugLog( 'exception', $e->getLogMessage() ); - } - if ( $ok ) { - $key = $this->getCacheKey( 'empty' ); - $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG ); - } else { - unset( $partitionsTry[$partition] ); // blacklist partition - $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted + $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist + if ( !$partitionRing ) { + throw new JobQueueError( "Could not insert job(s), all partitions are down." ); } + $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted } } @@ -300,7 +292,7 @@ class JobQueueFederated extends JobQueue { return false; } - $partitionsTry = $this->getPartitionMap(); // (partition => weight) + $partitionsTry = $this->partitionMap; // (partition => weight) while ( count( $partitionsTry ) ) { $partition = ArrayUtils::pickRandom( $partitionsTry ); @@ -312,7 +304,7 @@ class JobQueueFederated extends JobQueue { $job = $queue->pop(); } catch ( JobQueueError $e ) { $job = false; - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } if ( $job ) { $job->metadata['QueuePartition'] = $partition; @@ -335,10 +327,10 @@ class JobQueueFederated extends JobQueue { protected function doIsRootJobOldDuplicate( Job $job ) { $params = $job->getRootJobParams(); - $partitions = $this->partitionRing->getLocations( $params['rootJobSignature'], 2 ); + $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 ); try { return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job ); - } catch ( MWException $e ) { + } catch ( JobQueueError $e ) { if ( isset( $partitions[1] ) ) { // check fallback partition return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job ); } @@ -348,10 +340,10 @@ class JobQueueFederated extends JobQueue { protected function doDeduplicateRootJob( Job $job ) { $params = $job->getRootJobParams(); - $partitions = $this->partitionRing->getLocations( $params['rootJobSignature'], 2 ); + $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 ); try { return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job ); - } catch ( MWException $e ) { + } catch ( JobQueueError $e ) { if ( isset( $partitions[1] ) ) { // check fallback partition return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job ); } @@ -364,7 +356,7 @@ class JobQueueFederated extends JobQueue { try { $queue->doDelete(); } catch ( JobQueueError $e ) { - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } } } @@ -374,7 +366,7 @@ class JobQueueFederated extends JobQueue { try { $queue->waitForBackups(); } catch ( JobQueueError $e ) { - wfDebugLog( 'exception', $e->getLogMessage() ); + MWExceptionHandler::logException( $e ); } } } @@ -422,32 +414,44 @@ class JobQueueFederated extends JobQueue { } public function getCoalesceLocationInternal() { - return "JobQueueFederated:wiki:" . $this->wiki; + return "JobQueueFederated:wiki:{$this->wiki}" . + sha1( serialize( array_keys( $this->partitionMap ) ) ); } protected function doGetSiblingQueuesWithJobs( array $types ) { $result = array(); foreach ( $this->partitionQueues as $queue ) { - $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types ); - if ( is_array( $nonEmpty ) ) { - $result = array_merge( $result, $nonEmpty ); - } else { - return null; // not supported on all partitions; bail + try { + $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types ); + if ( is_array( $nonEmpty ) ) { + $result = array_unique( array_merge( $result, $nonEmpty ) ); + } else { + return null; // not supported on all partitions; bail + } + if ( count( $result ) == count( $types ) ) { + break; // short-circuit + } + } catch ( JobQueueError $e ) { + MWExceptionHandler::logException( $e ); } } - return array_values( array_unique( $result ) ); + return array_values( $result ); } protected function doGetSiblingQueueSizes( array $types ) { $result = array(); foreach ( $this->partitionQueues as $queue ) { - $sizes = $queue->doGetSiblingQueueSizes( $types ); - if ( is_array( $sizes ) ) { - foreach ( $sizes as $type => $size ) { - $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size; + try { + $sizes = $queue->doGetSiblingQueueSizes( $types ); + if ( is_array( $sizes ) ) { + foreach ( $sizes as $type => $size ) { + $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size; + } + } else { + return null; // not supported on all partitions; bail } - } else { - return null; // not supported on all partitions; bail + } catch ( JobQueueError $e ) { + MWExceptionHandler::logException( $e ); } } return $result; @@ -459,26 +463,6 @@ class JobQueueFederated extends JobQueue { } } - /** - * @return Array Map of (partition name => weight) - */ - protected function getPartitionMap() { - $section = isset( $this->sectionsByWiki[$this->wiki] ) - ? $this->sectionsByWiki[$this->wiki] - : 'default'; - if ( !isset( $this->partitionsBySection[$section] ) ) { - throw new MWException( "No configuration for section '$section'." ); - } - return $this->partitionsBySection[$section]; - } - - /** - * @return bool The queue is actually split up across multiple queue partitions - */ - protected function isFederated() { - return ( count( $this->getPartitionMap() ) > 1 ); - } - /** * @return string */ diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php index bc2fff10c5..d61165120e 100644 --- a/includes/json/FormatJson.php +++ b/includes/json/FormatJson.php @@ -55,6 +55,17 @@ class FormatJson { */ const ALL_OK = 3; + /** + * Regex that matches whitespace inside empty arrays and objects. + * + * This doesn't affect regular strings inside the JSON because those can't + * have a real line break (\n) in them, at this point they are already escaped + * as the string "\n" which this doesn't match. + * + * @private + */ + const WS_CLEANUP_REGEX = '/(?<=[\[{])\n\s*+(?=[\]}])/'; + /** * Characters problematic in JavaScript. * @@ -130,6 +141,12 @@ class FormatJson { if ( $json === false ) { return false; } + + if ( $pretty ) { + // Remove whitespace inside empty arrays/objects; different JSON encoders + // vary on this, and we want our output to be consistent across implementations. + $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json ); + } if ( $escaping & self::UTF8_OK ) { $json = str_replace( self::$badChars, self::$badCharsEscaped, $json ); } @@ -213,6 +230,7 @@ class FormatJson { $buf .= substr( $json, $i, $skip ); } } - return str_replace( "\x01", '\"', preg_replace( '/ +$/m', '', $buf ) ); + $buf = preg_replace( self::WS_CLEANUP_REGEX, '', $buf ); + return str_replace( "\x01", '\"', $buf ); } } diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php index d8d0bede44..d3fa36dddc 100644 --- a/includes/media/ExifBitmap.php +++ b/includes/media/ExifBitmap.php @@ -61,16 +61,18 @@ class ExifBitmapHandler extends BitmapHandler { . $metadata['Software'][0][1] . ')'; } + $formatter = new FormatMetadata; + // ContactInfo also has to be dealt with specially if ( isset( $metadata['Contact'] ) ) { $metadata['Contact'] = - FormatMetadata::collapseContactInfo( + $formatter->collapseContactInfo( $metadata['Contact'] ); } foreach ( $metadata as &$val ) { if ( is_array( $val ) ) { - $val = FormatMetadata::flattenArray( $val, 'ul', $avoidHtml ); + $val = $formatter->flattenArrayReal( $val, 'ul', $avoidHtml ); } } $metadata['MEDIAWIKI_EXIF_VERSION'] = 1; @@ -117,25 +119,32 @@ class ExifBitmapHandler extends BitmapHandler { * @return array|bool */ function formatMetadata( $image ) { - $metadata = $image->getMetadata(); + $meta = $this->getCommonMetaArray( $image ); + if ( count( $meta ) === 0 ) { + return false; + } + + return $this->formatMetadataHelper( $meta ); + } + + public function getCommonMetaArray( File $file ) { + $metadata = $file->getMetadata(); if ( $metadata === self::OLD_BROKEN_FILE || $metadata === self::BROKEN_FILE || - $this->isMetadataValid( $image, $metadata ) === self::METADATA_BAD ) + $this->isMetadataValid( $file, $metadata ) === self::METADATA_BAD ) { // So we don't try and display metadata from PagedTiffHandler // for example when using InstantCommons. - return false; + return array(); } $exif = unserialize( $metadata ); if ( !$exif ) { - return false; + return array(); } unset( $exif['MEDIAWIKI_EXIF_VERSION'] ); - if ( count( $exif ) == 0 ) { - return false; - } - return $this->formatMetadataHelper( $exif ); + + return $exif; } function getMetadataType( $image ) { diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php old mode 100644 new mode 100755 index 1c5136f5a8..b34ad650c0 --- a/includes/media/FormatMetadata.php +++ b/includes/media/FormatMetadata.php @@ -43,8 +43,26 @@ * is already a large number of messages using the 'exif' prefix. * * @ingroup Media + * @since 1.23 the class extends ContextSource and various formerly-public internal methods are private */ -class FormatMetadata { +class FormatMetadata extends ContextSource { + + /** + * Only output a single language for multi-language fields + * @var boolean + * @since 1.23 + */ + protected $singleLang = false; + + /** + * Trigger only outputting single language for multilanguage fields + * + * @param Boolean $val + * @since 1.23 + */ + public function setSingleLanguage( $val ) { + $this->singleLang = $val; + } /** * Numbers given by Exif user agents are often magical, that is they @@ -52,13 +70,33 @@ class FormatMetadata { * value which most of the time are plain integers. This function * formats Exif (and other metadata) values into human readable form. * + * This is the usual entry point for this class. + * * @param array $tags the Exif data to format ( as returned by * Exif::getFilteredData() or BitmapMetadataHandler ) + * @param IContextSource $context Context to use (optional) * @return array */ - public static function getFormattedData( $tags ) { - global $wgLang; + public static function getFormattedData( $tags, $context = false ) { + $obj = new FormatMetadata; + if ( $context ) { + $obj->setContext( $context ); + } + return $obj->makeFormattedData( $tags ); + } + /** + * Numbers given by Exif user agents are often magical, that is they + * should be replaced by a detailed explanation depending on their + * value which most of the time are plain integers. This function + * formats Exif (and other metadata) values into human readable form. + * + * @param array $tags the Exif data to format ( as returned by + * Exif::getFilteredData() or BitmapMetadataHandler ) + * @return array + * @since 1.23 + */ + public function makeFormattedData( $tags ) { $resolutionunit = !isset( $tags['ResolutionUnit'] ) || $tags['ResolutionUnit'] == 2 ? 2 : 3; unset( $tags['ResolutionUnit'] ); @@ -107,7 +145,7 @@ class FormatMetadata { $time = wfTimestamp( TS_MW, '1971:01:01 ' . $tags[$tag] ); // the 1971:01:01 is just a placeholder, and not shown to user. if ( $time && intval( $time ) > 0 ) { - $tags[$tag] = $wgLang->time( $time ); + $tags[$tag] = $this->getLanguage()->time( $time ); } } catch ( TimestampException $e ) { // This shouldn't happen, but we've seen bad formats @@ -121,7 +159,7 @@ class FormatMetadata { // instead of the other props which are single // valued (mostly) so handle as a special case. if ( $tag === 'Contact' ) { - $vals = self::collapseContactInfo( $vals ); + $vals = $this->collapseContactInfo( $vals ); continue; } @@ -133,7 +171,7 @@ class FormatMetadata { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 32773: case 32946: case 34712: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -144,7 +182,7 @@ class FormatMetadata { case 'PhotometricInterpretation': switch ( $val ) { case 2: case 6: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -155,7 +193,7 @@ class FormatMetadata { case 'Orientation': switch ( $val ) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -166,7 +204,7 @@ class FormatMetadata { case 'PlanarConfiguration': switch ( $val ) { case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -179,7 +217,7 @@ class FormatMetadata { switch ( $val ) { case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -191,10 +229,10 @@ class FormatMetadata { case 'YResolution': switch ( $resolutionunit ) { case 2: - $val = self::msg( 'XYResolution', 'i', self::formatNum( $val ) ); + $val = $this->exifMsg( 'XYResolution', 'i', $this->formatNum( $val ) ); break; case 3: - $val = self::msg( 'XYResolution', 'c', self::formatNum( $val ) ); + $val = $this->exifMsg( 'XYResolution', 'c', $this->formatNum( $val ) ); break; default: /* If not recognized, display as is. */ @@ -210,7 +248,7 @@ class FormatMetadata { case 'ColorSpace': switch ( $val ) { case 1: case 65535: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -221,7 +259,7 @@ class FormatMetadata { case 'ComponentsConfiguration': switch ( $val ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -238,12 +276,12 @@ class FormatMetadata { case 'dc-date': case 'DateTimeMetadata': if ( $val == '0000:00:00 00:00:00' || $val == ' : : : : ' ) { - $val = wfMessage( 'exif-unknowndate' )->text(); + $val = $this->msg( 'exif-unknowndate' )->text(); } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d):(?:\d\d)$/D', $val ) ) { // Full date. $time = wfTimestamp( TS_MW, $val ); if ( $time && intval( $time ) > 0 ) { - $val = $wgLang->timeanddate( $time ); + $val = $this->getLanguage()->timeanddate( $time ); } } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d)$/D', $val ) ) { // No second field. Still format the same @@ -251,7 +289,7 @@ class FormatMetadata { // but second still available in api $time = wfTimestamp( TS_MW, $val . ':00' ); if ( $time && intval( $time ) > 0 ) { - $val = $wgLang->timeanddate( $time ); + $val = $this->getLanguage()->timeanddate( $time ); } } elseif ( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d)$/D', $val ) ) { // If only the date but not the time is filled in. @@ -260,7 +298,7 @@ class FormatMetadata { . substr( $val, 8, 2 ) . '000000' ); if ( $time && intval( $time ) > 0 ) { - $val = $wgLang->date( $time ); + $val = $this->getLanguage()->date( $time ); } } // else it will just output $val without formatting it. @@ -269,7 +307,7 @@ class FormatMetadata { case 'ExposureProgram': switch ( $val ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -278,13 +316,13 @@ class FormatMetadata { break; case 'SubjectDistance': - $val = self::msg( $tag, '', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, '', $this->formatNum( $val ) ); break; case 'MeteringMode': switch ( $val ) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 255: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -297,7 +335,7 @@ class FormatMetadata { case 0: case 1: case 2: case 3: case 4: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 255: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -322,15 +360,15 @@ class FormatMetadata { continue; } $fullTag = $tag . '-' . $subTag; - $flashMsgs[] = self::msg( $fullTag, $subValue ); + $flashMsgs[] = $this->exifMsg( $fullTag, $subValue ); } - $val = $wgLang->commaList( $flashMsgs ); + $val = $this->getLanguage()->commaList( $flashMsgs ); break; case 'FocalPlaneResolutionUnit': switch ( $val ) { case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -341,7 +379,7 @@ class FormatMetadata { case 'SensingMethod': switch ( $val ) { case 1: case 2: case 3: case 4: case 5: case 7: case 8: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -352,7 +390,7 @@ class FormatMetadata { case 'FileSource': switch ( $val ) { case 3: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -363,7 +401,7 @@ class FormatMetadata { case 'SceneType': switch ( $val ) { case 1: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -374,7 +412,7 @@ class FormatMetadata { case 'CustomRendered': switch ( $val ) { case 0: case 1: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -385,7 +423,7 @@ class FormatMetadata { case 'ExposureMode': switch ( $val ) { case 0: case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -396,7 +434,7 @@ class FormatMetadata { case 'WhiteBalance': switch ( $val ) { case 0: case 1: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -407,7 +445,7 @@ class FormatMetadata { case 'SceneCaptureType': switch ( $val ) { case 0: case 1: case 2: case 3: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -418,7 +456,7 @@ class FormatMetadata { case 'GainControl': switch ( $val ) { case 0: case 1: case 2: case 3: case 4: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -429,7 +467,7 @@ class FormatMetadata { case 'Contrast': switch ( $val ) { case 0: case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -440,7 +478,7 @@ class FormatMetadata { case 'Saturation': switch ( $val ) { case 0: case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -451,7 +489,7 @@ class FormatMetadata { case 'Sharpness': switch ( $val ) { case 0: case 1: case 2: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -462,7 +500,7 @@ class FormatMetadata { case 'SubjectDistanceRange': switch ( $val ) { case 0: case 1: case 2: case 3: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -475,7 +513,7 @@ class FormatMetadata { case 'GPSDestLatitudeRef': switch ( $val ) { case 'N': case 'S': - $val = self::msg( 'GPSLatitude', $val ); + $val = $this->exifMsg( 'GPSLatitude', $val ); break; default: /* If not recognized, display as is. */ @@ -487,7 +525,7 @@ class FormatMetadata { case 'GPSDestLongitudeRef': switch ( $val ) { case 'E': case 'W': - $val = self::msg( 'GPSLongitude', $val ); + $val = $this->exifMsg( 'GPSLongitude', $val ); break; default: /* If not recognized, display as is. */ @@ -497,16 +535,16 @@ class FormatMetadata { case 'GPSAltitude': if ( $val < 0 ) { - $val = self::msg( 'GPSAltitude', 'below-sealevel', self::formatNum( -$val, 3 ) ); + $val = $this->exifMsg( 'GPSAltitude', 'below-sealevel', $this->formatNum( -$val, 3 ) ); } else { - $val = self::msg( 'GPSAltitude', 'above-sealevel', self::formatNum( $val, 3 ) ); + $val = $this->exifMsg( 'GPSAltitude', 'above-sealevel', $this->formatNum( $val, 3 ) ); } break; case 'GPSStatus': switch ( $val ) { case 'A': case 'V': - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -517,7 +555,7 @@ class FormatMetadata { case 'GPSMeasureMode': switch ( $val ) { case 2: case 3: - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: /* If not recognized, display as is. */ @@ -530,7 +568,7 @@ class FormatMetadata { case 'GPSDestBearingRef': switch ( $val ) { case 'T': case 'M': - $val = self::msg( 'GPSDirection', $val ); + $val = $this->exifMsg( 'GPSDirection', $val ); break; default: /* If not recognized, display as is. */ @@ -540,17 +578,17 @@ class FormatMetadata { case 'GPSLatitude': case 'GPSDestLatitude': - $val = self::formatCoords( $val, 'latitude' ); + $val = $this->formatCoords( $val, 'latitude' ); break; case 'GPSLongitude': case 'GPSDestLongitude': - $val = self::formatCoords( $val, 'longitude' ); + $val = $this->formatCoords( $val, 'longitude' ); break; case 'GPSSpeedRef': switch ( $val ) { case 'K': case 'M': case 'N': - $val = self::msg( 'GPSSpeed', $val ); + $val = $this->exifMsg( 'GPSSpeed', $val ); break; default: /* If not recognized, display as is. */ @@ -561,7 +599,7 @@ class FormatMetadata { case 'GPSDestDistanceRef': switch ( $val ) { case 'K': case 'M': case 'N': - $val = self::msg( 'GPSDestDistance', $val ); + $val = $this->exifMsg( 'GPSDestDistance', $val ); break; default: /* If not recognized, display as is. */ @@ -572,15 +610,15 @@ class FormatMetadata { case 'GPSDOP': // See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS) if ( $val <= 2 ) { - $val = self::msg( $tag, 'excellent', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, 'excellent', $this->formatNum( $val ) ); } elseif ( $val <= 5 ) { - $val = self::msg( $tag, 'good', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, 'good', $this->formatNum( $val ) ); } elseif ( $val <= 10 ) { - $val = self::msg( $tag, 'moderate', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, 'moderate', $this->formatNum( $val ) ); } elseif ( $val <= 20 ) { - $val = self::msg( $tag, 'fair', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, 'fair', $this->formatNum( $val ) ); } else { - $val = self::msg( $tag, 'poor', self::formatNum( $val ) ); + $val = $this->exifMsg( $tag, 'poor', $this->formatNum( $val ) ); } break; @@ -589,41 +627,41 @@ class FormatMetadata { // the make, model and software name to link to their articles. case 'Make': case 'Model': - $val = self::msg( $tag, '', $val ); + $val = $this->exifMsg( $tag, '', $val ); break; case 'Software': if ( is_array( $val ) ) { //if its a software, version array. - $val = wfMessage( 'exif-software-version-value', $val[0], $val[1] )->text(); + $val = $this->msg( 'exif-software-version-value', $val[0], $val[1] )->text(); } else { - $val = self::msg( $tag, '', $val ); + $val = $this->exifMsg( $tag, '', $val ); } break; case 'ExposureTime': // Show the pretty fraction as well as decimal version - $val = wfMessage( 'exif-exposuretime-format', - self::formatFraction( $val ), self::formatNum( $val ) )->text(); + $val = $this->msg( 'exif-exposuretime-format', + $this->formatFraction( $val ), $this->formatNum( $val ) )->text(); break; case 'ISOSpeedRatings': // If its = 65535 that means its at the // limit of the size of Exif::short and // is really higher. if ( $val == '65535' ) { - $val = self::msg( $tag, 'overflow' ); + $val = $this->exifMsg( $tag, 'overflow' ); } else { - $val = self::formatNum( $val ); + $val = $this->formatNum( $val ); } break; case 'FNumber': - $val = wfMessage( 'exif-fnumber-format', - self::formatNum( $val ) )->text(); + $val = $this->msg( 'exif-fnumber-format', + $this->formatNum( $val ) )->text(); break; case 'FocalLength': case 'FocalLengthIn35mmFilm': - $val = wfMessage( 'exif-focallength-format', - self::formatNum( $val ) )->text(); + $val = $this->msg( 'exif-focallength-format', + $this->formatNum( $val ) )->text(); break; case 'MaxApertureValue': @@ -637,9 +675,9 @@ class FormatMetadata { if ( is_numeric( $val ) ) { $fNumber = pow( 2, $val / 2 ); if ( $fNumber !== false ) { - $val = wfMessage( 'exif-maxaperturevalue-value', - self::formatNum( $val ), - self::formatNum( $fNumber, 2 ) + $val = $this->msg( 'exif-maxaperturevalue-value', + $this->formatNum( $val ), + $this->formatNum( $fNumber, 2 ) )->text(); } } @@ -658,7 +696,7 @@ class FormatMetadata { case 'sci': case 'soi': case 'spo': case 'war': case 'wea': - $val = self::msg( + $val = $this->exifMsg( 'iimcategory', $val ); @@ -670,7 +708,7 @@ class FormatMetadata { // classification. We decode the // first 2 digits, which provide // a broad category. - $val = self::convertNewsCode( $val ); + $val = $this->convertNewsCode( $val ); break; case 'Urgency': // 1-8 with 1 being highest, 5 normal @@ -687,7 +725,7 @@ class FormatMetadata { } if ( $urgency !== '' ) { - $val = self::msg( 'urgency', + $val = $this->exifMsg( 'urgency', $urgency, $val ); } @@ -700,7 +738,7 @@ class FormatMetadata { case 'PixelYDimension': case 'ImageWidth': case 'ImageLength': - $val = self::formatNum( $val ) . ' ' . wfMessage( 'unit-pixel' )->text(); + $val = $this->formatNum( $val ) . ' ' . $this->msg( 'unit-pixel' )->text(); break; // Do not transform fields with pure text. @@ -783,7 +821,7 @@ class FormatMetadata { case 'ObjectCycle': switch ( $val ) { case 'a': case 'p': case 'b': - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; default: $val = htmlspecialchars( $val ); @@ -793,20 +831,20 @@ class FormatMetadata { case 'Copyrighted': switch ( $val ) { case 'True': case 'False': - $val = self::msg( $tag, $val ); + $val = $this->exifMsg( $tag, $val ); break; } break; case 'Rating': if ( $val == '-1' ) { - $val = self::msg( $tag, 'rejected' ); + $val = $this->exifMsg( $tag, 'rejected' ); } else { - $val = self::formatNum( $val ); + $val = $this->formatNum( $val ); } break; case 'LanguageCode': - $lang = Language::fetchLanguageName( strtolower( $val ), $wgLang->getCode() ); + $lang = Language::fetchLanguageName( strtolower( $val ), $this->getLanguage()->getCode() ); if ( $lang ) { $val = htmlspecialchars( $lang ); } else { @@ -815,17 +853,64 @@ class FormatMetadata { break; default: - $val = self::formatNum( $val ); + $val = $this->formatNum( $val ); break; } } // End formatting values, start flattening arrays. - $vals = self::flattenArray( $vals, $type ); + $vals = $this->flattenArrayReal( $vals, $type ); } return $tags; } + /** + * Flatten an array, using the content language for any messages. + * + * @param array $vals array of values + * @param string $type Type of array (either lang, ul, ol). + * lang = language assoc array with keys being the lang code + * ul = unordered list, ol = ordered list + * type can also come from the '_type' member of $vals. + * @param $noHtml Boolean If to avoid returning anything resembling + * html. (Ugly hack for backwards compatibility with old mediawiki). + * @param IContextSource $context + * @return String single value (in wiki-syntax). + * @since 1.23 + */ + public static function flattenArrayContentLang( $vals, $type = 'ul', $noHtml = false, $context = false ) { + global $wgContLang; + $obj = new FormatMetadata; + if ( $context ) { + $obj->setContext( $context ); + } + $context = new DerivativeContext( $obj->getContext() ); + $context->setLanguage( $wgContLang ); + $obj->setContext( $context ); + return $obj->flattenArrayReal( $vals, $type, $noHtml ); + } + + /** + * Flatten an array, using the user language for any messages. + * + * @param array $vals array of values + * @param string $type Type of array (either lang, ul, ol). + * lang = language assoc array with keys being the lang code + * ul = unordered list, ol = ordered list + * type can also come from the '_type' member of $vals. + * @param $noHtml Boolean If to avoid returning anything resembling + * html. (Ugly hack for backwards compatibility with old mediawiki). + * @param IContextSource $context + * @return String single value (in wiki-syntax). + */ + public static function flattenArray( $vals, $type = 'ul', $noHtml = false, $context = false ) { + $obj = new FormatMetadata; + if ( $context ) { + $obj->setContext( $context ); + } + return $obj->flattenArrayReal( $vals, $type, $noHtml ); + } + /** * A function to collapse multivalued tags into a single value. * This turns an array of (for example) authors into a bulleted list. @@ -834,14 +919,19 @@ class FormatMetadata { * * @param array $vals array of values * @param string $type Type of array (either lang, ul, ol). - * lang = language assoc array with keys being the lang code - * ul = unordered list, ol = ordered list - * type can also come from the '_type' member of $vals. + * lang = language assoc array with keys being the lang code + * ul = unordered list, ol = ordered list + * type can also come from the '_type' member of $vals. * @param $noHtml Boolean If to avoid returning anything resembling - * html. (Ugly hack for backwards compatibility with old mediawiki). + * html. (Ugly hack for backwards compatibility with old mediawiki). * @return String single value (in wiki-syntax). + * @since 1.23 */ - public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) { + public function flattenArrayReal( $vals, $type = 'ul', $noHtml = false ) { + if ( !is_array( $vals ) ) { + return $vals; // do nothing if not an array; + } + if ( isset( $vals['_type'] ) ) { $type = $vals['_type']; unset( $vals['_type'] ); @@ -862,7 +952,6 @@ class FormatMetadata { * languages, we don't want to show them all by default */ else { - global $wgContLang; switch ( $type ) { case 'lang': // Display default, followed by ContLang, @@ -873,7 +962,7 @@ class FormatMetadata { $content = ''; - $cLang = $wgContLang->getCode(); + $priorityLanguages = $this->getPriorityLanguages(); $defaultItem = false; $defaultLang = false; @@ -888,18 +977,24 @@ class FormatMetadata { $defaultItem = $vals['x-default']; unset( $vals['x-default'] ); } - // Do contentLanguage. - if ( isset( $vals[$cLang] ) ) { - $isDefault = false; - if ( $vals[$cLang] === $defaultItem ) { - $defaultItem = false; - $isDefault = true; - } - $content .= self::langItem( - $vals[$cLang], $cLang, - $isDefault, $noHtml ); + foreach( $priorityLanguages as $pLang ) { + if ( isset( $vals[$pLang] ) ) { + $isDefault = false; + if ( $vals[$pLang] === $defaultItem ) { + $defaultItem = false; + $isDefault = true; + } + $content .= $this->langItem( + $vals[$pLang], $pLang, + $isDefault, $noHtml ); + + unset( $vals[$pLang] ); - unset( $vals[$cLang] ); + if ( $this->singleLang ) { + return Html::rawElement( 'span', + array( 'lang' => $pLang ), $vals[$pLang] ); + } + } } // Now do the rest. @@ -908,13 +1003,20 @@ class FormatMetadata { $defaultLang = $lang; continue; } - $content .= self::langItem( $item, + $content .= $this->langItem( $item, $lang, false, $noHtml ); + if ( $this->singleLang ) { + return Html::rawElement( 'span', + array( 'lang' => $lang ), $item ); + } } if ( $defaultItem !== false ) { - $content = self::langItem( $defaultItem, + $content = $this->langItem( $defaultItem, $defaultLang, true, $noHtml ) . $content; + if ( $this->singleLang ) { + return $defaultItem; + } } if ( $noHtml ) { return $content; @@ -947,7 +1049,7 @@ class FormatMetadata { * @return string language item (Note: despite how this looks, * this is treated as wikitext not html). */ - private static function langItem( $value, $lang, $default = false, $noHtml = false ) { + private function langItem( $value, $lang, $default = false, $noHtml = false ) { if ( $lang === false && $default === false ) { throw new MWException( '$lang and $default cannot both ' . 'be false.' ); @@ -961,13 +1063,12 @@ class FormatMetadata { } if ( $lang === false ) { + $msg = $this->msg( 'metadata-langitem-default', $wrappedValue ); if ( $noHtml ) { - return wfMessage( 'metadata-langitem-default', - $wrappedValue )->text() . "\n\n"; + return $msg->text() . "\n\n"; } /* else */ return '
    • \n"; } @@ -984,9 +1085,9 @@ class FormatMetadata { } // else we have a language specified + $msg = $this->msg( 'metadata-langitem', $wrappedValue, $langName, $lang ); if ( $noHtml ) { - return '*' . wfMessage( 'metadata-langitem', - $wrappedValue, $langName, $lang )->text(); + return '*' . $msg->text(); } /* else: */ $item = '\n"; return $item; } @@ -1010,15 +1110,15 @@ class FormatMetadata { * @param string $val the value of the tag * @param string $arg an argument to pass ($1) * @param string $arg2 a 2nd argument to pass ($2) - * @return string A wfMessage of "exif-$tag-$val" in lower case + * @return string The text content of "exif-$tag-$val" message in lower case */ - static function msg( $tag, $val, $arg = null, $arg2 = null ) { + private function exifMsg( $tag, $val, $arg = null, $arg2 = null ) { global $wgContLang; if ( $val === '' ) { $val = 'value'; } - return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text(); + return $this->msg( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text(); } /** @@ -1029,15 +1129,14 @@ class FormatMetadata { * @param $round float|int|bool digits to round to or false. * @return mixed A floating point number or whatever we were fed */ - static function formatNum( $num, $round = false ) { - global $wgLang; + private function formatNum( $num, $round = false ) { $m = array(); if ( is_array( $num ) ) { $out = array(); foreach ( $num as $number ) { - $out[] = self::formatNum( $number ); + $out[] = $this->formatNum( $number ); } - return $wgLang->commaList( $out ); + return $this->getLanguage()->commaList( $out ); } if ( preg_match( '/^(-?\d+)\/(\d+)$/', $num, $m ) ) { if ( $m[2] != 0 ) { @@ -1049,12 +1148,12 @@ class FormatMetadata { $newNum = $num; } - return $wgLang->formatNum( $newNum ); + return $this->getLanguage()->formatNum( $newNum ); } else { if ( is_numeric( $num ) && $round !== false ) { $num = round( $num, $round ); } - return $wgLang->formatNum( $num ); + return $this->getLanguage()->formatNum( $num ); } } @@ -1066,18 +1165,18 @@ class FormatMetadata { * @param $num Mixed: the value to format * @return mixed A floating point number or whatever we were fed */ - static function formatFraction( $num ) { + private function formatFraction( $num ) { $m = array(); if ( preg_match( '/^(-?\d+)\/(\d+)$/', $num, $m ) ) { $numerator = intval( $m[1] ); $denominator = intval( $m[2] ); - $gcd = self::gcd( abs( $numerator ), $denominator ); + $gcd = $this->gcd( abs( $numerator ), $denominator ); if ( $gcd != 0 ) { // 0 shouldn't happen! ;) - return self::formatNum( $numerator / $gcd ) . '/' . self::formatNum( $denominator / $gcd ); + return $this->formatNum( $numerator / $gcd ) . '/' . $this->formatNum( $denominator / $gcd ); } } - return self::formatNum( $num ); + return $this->formatNum( $num ); } /** @@ -1088,7 +1187,7 @@ class FormatMetadata { * @return int * @private */ - static function gcd( $a, $b ) { + private function gcd( $a, $b ) { /* // http://en.wikipedia.org/wiki/Euclidean_algorithm // Recursive form would be: @@ -1119,7 +1218,7 @@ class FormatMetadata { * @param string $val The 8 digit news code. * @return string The human readable form */ - private static function convertNewsCode( $val ) { + private function convertNewsCode( $val ) { if ( !preg_match( '/^\d{8}$/D', $val ) ) { // Not a valid news code. return $val; @@ -1179,8 +1278,8 @@ class FormatMetadata { break; } if ( $cat !== '' ) { - $catMsg = self::msg( 'iimcategory', $cat ); - $val = self::msg( 'subjectnewscode', '', $val, $catMsg ); + $catMsg = $this->exifMsg( 'iimcategory', $cat ); + $val = $this->exifMsg( 'subjectnewscode', '', $val, $catMsg ); } return $val; } @@ -1193,7 +1292,7 @@ class FormatMetadata { * @param string $type latitude or longitude (for if its a NWS or E) * @return mixed A floating point number or whatever we were fed */ - static function formatCoords( $coord, $type ) { + private function formatCoords( $coord, $type ) { $ref = ''; if ( $coord < 0 ) { $nCoord = -$coord; @@ -1215,11 +1314,11 @@ class FormatMetadata { $min = floor( ( $nCoord - $deg ) * 60.0 ); $sec = round( ( ( $nCoord - $deg ) - $min / 60 ) * 3600, 2 ); - $deg = self::formatNum( $deg ); - $min = self::formatNum( $min ); - $sec = self::formatNum( $sec ); + $deg = $this->formatNum( $deg ); + $min = $this->formatNum( $min ); + $sec = $this->formatNum( $sec ); - return wfMessage( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord )->text(); + return $this->msg( 'exif-coordinate-format', $deg, $min, $sec, $ref, $coord )->text(); } /** @@ -1235,8 +1334,9 @@ class FormatMetadata { * public. * * @return String of html-ish looking wikitext + * @since 1.23 no longer static */ - public static function collapseContactInfo( $vals ) { + public function collapseContactInfo( $vals ) { if ( !( isset( $vals['CiAdrExtadr'] ) || isset( $vals['CiAdrCity'] ) || isset( $vals['CiAdrCtry'] ) @@ -1258,7 +1358,7 @@ class FormatMetadata { foreach ( $vals as &$val ) { $val = htmlspecialchars( $val ); } - return self::flattenArray( $vals ); + return $this->flattenArrayReal( $vals ); } else { // We have a real ContactInfo field. // Its unclear if all these fields have to be @@ -1340,11 +1440,301 @@ class FormatMetadata { . htmlspecialchars( $vals['CiUrlWork'] ) . ''; } - return wfMessage( 'exif-contact-value', $email, $url, + return $this->msg( 'exif-contact-value', $email, $url, $street, $city, $region, $postal, $country, $tel )->text(); } } + + /** + * Get a list of fields that are visible by default. + * + * @return array + * @since 1.23 + */ + public static function getVisibleFields() { + $fields = array(); + $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() ); + foreach ( $lines as $line ) { + $matches = array(); + if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) { + $fields[] = $matches[1]; + } + } + $fields = array_map( 'strtolower', $fields ); + return $fields; + } + + /** + * Get an array of extended metadata. (See the imageinfo API for format.) + * + * @param File $file File to use + * @return array [ => ['value' => ]], or [] on error + * @since 1.23 + */ + public function fetchExtendedMetadata( File $file ) { + global $wgMemc; + + wfProfileIn( __METHOD__ ); + + // If revision deleted, exit immediately + if ( $file->isDeleted( File::DELETED_FILE ) ) { + return array(); + } + + $cacheKey = wfMemcKey( + 'getExtendedMetadata', + $this->getLanguage()->getCode(), + (int) $this->singleLang, + $file->getSha1() + ); + + $cachedValue = $wgMemc->get( $cacheKey ); + if ( + $cachedValue + && wfRunHooks( 'ValidateExtendedMetadataCache', array( $cachedValue['timestamp'], $file ) ) + ) { + $extendedMetadata = $cachedValue['data']; + } else { + $maxCacheTime = ( $file instanceof ForeignAPIFile ) ? 60 * 60 * 12 : 60 * 60 * 24 * 30; + $fileMetadata = $this->getExtendedMetadataFromFile( $file ); + $extendedMetadata = $this->getExtendedMetadataFromHook( $file, $fileMetadata, $maxCacheTime ); + if ( $this->singleLang ) { + $this->resolveMultilangMetadata( $extendedMetadata ); + } + // Make sure the metadata won't break the API when an XML format is used. + // This is an API-specific function so it would be cleaner to call it from + // outside fetchExtendedMetadata, but this way we don't need to redo the + // computation on a cache hit. + $this->sanitizeArrayForXml($extendedMetadata); + $valueToCache = array( 'data' => $extendedMetadata, 'timestamp' => wfTimestampNow() ); + $wgMemc->set( $cacheKey, $valueToCache, $maxCacheTime ); + } + + wfProfileOut( __METHOD__ ); + return $extendedMetadata; + } + + /** + * Get file-based metadata in standardized format. + * + * Note that for a remote file, this might return metadata supplied by extensions. + * + * @param File $file File to use + * @return array [ => ['value' => ]], or [] on error + * @since 1.23 + */ + protected function getExtendedMetadataFromFile( File $file ) { + // If this is a remote file accessed via an API request, we already + // have remote metadata so we just ignore any local one + if ( $file instanceof ForeignAPIFile ) { + // in case of error we pretend no metadata - this will get cached. Might or might not be a good idea. + return $file->getExtendedMetadata() ?: array(); + } + + wfProfileIn( __METHOD__ ); + + $uploadDate = wfTimestamp( TS_ISO_8601, $file->getTimestamp() ); + + $fileMetadata = array( + // This is modification time, which is close to "upload" time. + 'DateTime' => array( + 'value' => $uploadDate, + 'source' => 'mediawiki-metadata', + ), + ); + + $title = $file->getTitle(); + if ( $title ) { + $text = $title->getText(); + $pos = strrpos( $text, '.' ); + + if ( $pos ) { + $name = substr( $text, 0, $pos ); + } else { + $name = $text; + } + + $fileMetadata[ 'ObjectName' ] = array( + 'value' => $name, + 'source' => 'mediawiki-metadata', + ); + } + + $common = $file->getCommonMetaArray(); + + foreach ( $common as $key => $value ) { + $fileMetadata[$key] = array( + 'value' => $value, + 'source' => 'file-metadata', + ); + } + + wfProfileOut( __METHOD__ ); + return $fileMetadata; + } + + /** + * Get additional metadata from hooks in standardized format. + * + * @param File $file File to use + * @param array $extendedMetadata + * @param int $maxCacheTime hook handlers might use this parameter to override cache time + * + * @return array [ => ['value' => ]], or [] on error + * @since 1.23 + */ + protected function getExtendedMetadataFromHook( File $file, array $extendedMetadata, &$maxCacheTime ) { + wfProfileIn( __METHOD__ ); + + wfRunHooks( 'GetExtendedMetadata', array( + &$extendedMetadata, + $file, + $this->getContext(), + $this->singleLang, + &$maxCacheTime + ) ); + + $visible = array_flip( self::getVisibleFields() ); + foreach ( $extendedMetadata as $key => $value ) { + if ( !isset( $visible[ strtolower( $key ) ] ) ) { + $extendedMetadata[$key]['hidden'] = ''; + } + } + + wfProfileOut( __METHOD__ ); + return $extendedMetadata; + } + + /** + * Turns an XMP-style multilang array into a single value. + * If the value is not a multilang array, it is returned unchanged. + * See mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format + * @param mixed $value + * @return mixed value in best language, null if there were no languages at all + * @since 1.23 + */ + protected function resolveMultilangValue( $value ) + { + if ( + !is_array( $value ) + || !isset( $value['_type'] ) + || $value['_type'] != 'lang' + ) { + return $value; // do nothing if not a multilang array + } + + // choose the language best matching user or site settings + $priorityLanguages = $this->getPriorityLanguages(); + foreach( $priorityLanguages as $lang ) { + if ( isset( $value[$lang] ) ) { + return $value[$lang]; + } + } + + // otherwise go with the default language, if set + if ( isset( $value['x-default'] ) ) { + return $value['x-default']; + } + + // otherwise just return any one language + unset($value['_type']); + if (!empty($value)) { + return reset($value); + } + + // this should not happen; signal error + return null; + } + + /** + * Takes an array returned by the getExtendedMetadata* functions, + * and resolves multi-language values in it. + * @param array $metadata + * @since 1.23 + */ + protected function resolveMultilangMetadata( &$metadata ) { + if ( !is_array( $metadata ) ) { + return; + } + foreach ( $metadata as &$field ) { + if ( isset( $field['value'] ) ) { + $field['value'] = $this->resolveMultilangValue( $field['value'] ); + } + } + } + + /** + * Makes sure the given array is a valid API response fragment + * (can be transformed into XML) + * @param array $arr + */ + protected function sanitizeArrayForXml( &$arr ) { + if ( !is_array( $arr ) ) { + return; + } + + $counter = 1; + foreach ( $arr as $key => &$value ) { + $sanitizedKey = $this->sanitizeKeyForXml( $key ); + if ( $sanitizedKey !== $key ) { + if ( isset( $arr[$sanitizedKey] ) ) { + // Make the sanitized keys hopefully unique. + // To make it definitely unique would be too much effort, given that + // sanitizing is only needed for misformatted metadata anyway, but + // this at least covers the case when $arr is numeric. + $sanitizedKey .= $counter; + ++$counter; + } + $arr[$sanitizedKey] = $arr[$key]; + unset( $arr[$key] ); + } + if ( is_array( $value ) ) { + $this->sanitizeArrayForXml( $value ); + } + } + } + + /** + * Turns a string into a valid XML identifier. + * Used to ensure that keys of an associative array in the + * API response do not break the XML formatter. + * @param string $key + * @return string + * @since 1.23 + */ + protected function sanitizeKeyForXml( $key ) { + // drop all characters which are not valid in an XML tag name + // a bunch of non-ASCII letters would be valid but probably won't + // be used so we take the easy way + $key = preg_replace( '/[^a-zA-z0-9_:.-]/', '', $key ); + // drop characters which are invalid at the first position + $key = preg_replace( '/^[\d-.]+/', '', $key ); + + if ( $key == '' ) { + $key = '_'; + } + + // special case for an internal keyword + if ( $key == '_element' ) { + $key = 'element'; + } + + return $key; + } + + /** + * Returns a list of languages (first is best) to use when formatting multilang fields, + * based on user and site preferences. + * @return array + * @since 1.23 + */ + protected function getPriorityLanguages() + { + $priorityLanguages = Language::getFallbacksIncludingSiteLanguage( $this->getLanguage()->getCode() ); + $priorityLanguages = array_merge( (array) $this->getLanguage()->getCode(), $priorityLanguages[0], $priorityLanguages[1] ); + return $priorityLanguages; + } } /** For compatability with old FormatExif class diff --git a/includes/media/GIF.php b/includes/media/GIF.php index 608fb257f2..19635dacbd 100644 --- a/includes/media/GIF.php +++ b/includes/media/GIF.php @@ -47,20 +47,31 @@ class GIFHandler extends BitmapHandler { * @return array|bool */ function formatMetadata( $image ) { + $meta = $this->getCommonMetaArray( $image ); + if ( count( $meta ) === 0 ) { + return false; + } + + return $this->formatMetadataHelper( $meta ); + } + + /** + * Return the standard metadata elements for #filemetadata parser func. + * @param File $image + * @return array|bool + */ + public function getCommonMetaArray( File $image ) { $meta = $image->getMetadata(); if ( !$meta ) { - return false; + return array(); } $meta = unserialize( $meta ); - if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) { - return false; - } - - if ( isset( $meta['metadata']['_MW_GIF_VERSION'] ) ) { - unset( $meta['metadata']['_MW_GIF_VERSION'] ); + if ( !isset( $meta['metadata'] ) ) { + return array(); } - return $this->formatMetadataHelper( $meta['metadata'] ); + unset( $meta['metadata']['_MW_GIF_VERSION'] ); + return $meta['metadata']; } /** diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php old mode 100644 new mode 100755 index 779e23c9c7..ddb8efd7d1 --- a/includes/media/MediaHandler.php +++ b/includes/media/MediaHandler.php @@ -187,6 +187,43 @@ abstract class MediaHandler { return self::METADATA_GOOD; } + /** + * Get an array of standard (FormatMetadata type) metadata values. + * + * The returned data is largely the same as that from getMetadata(), + * but formatted in a standard, stable, handler-independent way. + * The idea being that some values like ImageDescription or Artist + * are universal and should be retrievable in a handler generic way. + * + * The specific properties are the type of properties that can be + * handled by the FormatMetadata class. These values are exposed to the + * user via the filemetadata parser function. + * + * Details of the response format of this function can be found at + * https://www.mediawiki.org/wiki/Manual:File_metadata_handling + * tl/dr: the response is an associative array of + * properties keyed by name, but the value can be complex. You probably + * want to call one of the FormatMetadata::flatten* functions on the + * property values before using them, or call + * FormatMetadata::getFormattedData() on the full response array, which + * transforms all values into prettified, human-readable text. + * + * Subclasses overriding this function must return a value which is a + * valid API response fragment (all associative array keys are valid + * XML tagnames). + * + * Note, if the file simply has no metadata, but the handler supports + * this interface, it should return an empty array, not false. + * + * @param File $file + * + * @return Array or false if interface not supported + * @since 1.23 + */ + public function getCommonMetaArray( File $file ) { + return false; + } + /** * Get a MediaTransformOutput object representing an alternate of the transformed * output which will call an intermediary thumbnail assist script. @@ -436,16 +473,7 @@ abstract class MediaHandler { * @access protected */ function visibleMetadataFields() { - $fields = array(); - $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() ); - foreach ( $lines as $line ) { - $matches = array(); - if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) { - $fields[] = $matches[1]; - } - } - $fields = array_map( 'strtolower', $fields ); - return $fields; + return FormatMetadata::getVisibleFields(); } /** diff --git a/includes/media/PNG.php b/includes/media/PNG.php index 98f138616d..d2c17efd4f 100644 --- a/includes/media/PNG.php +++ b/includes/media/PNG.php @@ -52,20 +52,32 @@ class PNGHandler extends BitmapHandler { * @return array|bool */ function formatMetadata( $image ) { + $meta = $this->getCommonMetaArray( $image ); + if ( count( $meta ) === 0 ) { + return false; + } + + return $this->formatMetadataHelper( $meta ); + } + + /** + * Get a file type independent array of metadata. + * + * @param $image File + * @return array The metadata array + */ + public function getCommonMetaArray( File $image ) { $meta = $image->getMetadata(); if ( !$meta ) { - return false; + return array(); } $meta = unserialize( $meta ); - if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) { - return false; - } - - if ( isset( $meta['metadata']['_MW_PNG_VERSION'] ) ) { - unset( $meta['metadata']['_MW_PNG_VERSION'] ); + if ( !isset( $meta['metadata'] ) ) { + return array(); } - return $this->formatMetadataHelper( $meta['metadata'] ); + unset( $meta['metadata']['_MW_PNG_VERSION'] ); + return $meta['metadata']; } /** diff --git a/includes/media/SVG.php b/includes/media/SVG.php index 72a9696c29..d6f8483eb7 100644 --- a/includes/media/SVG.php +++ b/includes/media/SVG.php @@ -29,6 +29,18 @@ class SvgHandler extends ImageHandler { const SVG_METADATA_VERSION = 2; + /** + * A list of metadata tags that can be converted + * to the commonly used exif tags. This allows messages + * to be reused, and consistent tag names for {{#formatmetadata:..}} + */ + private static $metaConversion = array( + 'originalwidth' => 'ImageWidth', + 'originalheight' => 'ImageLength', + 'description' => 'ImageDescription', + 'title' => 'ObjectName', + ); + function isEnabled() { global $wgSVGConverters, $wgSVGConverter; if ( !isset( $wgSVGConverters[$wgSVGConverter] ) ) { @@ -340,19 +352,11 @@ class SvgHandler extends ImageHandler { // Sort fields into visible and collapsed $visibleFields = $this->visibleMetadataFields(); - // Rename fields to be compatible with exif, so that - // the labels for these fields work and reuse existing messages. - $conversion = array( - 'originalwidth' => 'imagewidth', - 'originalheight' => 'imagelength', - 'description' => 'imagedescription', - 'title' => 'objectname', - ); $showMeta = false; foreach ( $metadata as $name => $value ) { $tag = strtolower( $name ); - if ( isset( $conversion[$tag] ) ) { - $tag = $conversion[$tag]; + if ( isset( self::$metaConversion[$tag] ) ) { + $tag = strtolower( self::$metaConversion[$tag] ); } else { // Do not output other metadata not in list continue; @@ -368,7 +372,6 @@ class SvgHandler extends ImageHandler { return $showMeta ? $result : false; } - /** * @param string $name Parameter name * @param $string $value Parameter value @@ -431,4 +434,29 @@ class SvgHandler extends ImageHandler { 'lang' => $params['lang'], ); } + + public function getCommonMetaArray( File $file ) { + $metadata = $file->getMetadata(); + if ( !$metadata ) { + return array(); + } + $metadata = $this->unpackMetadata( $metadata ); + if ( !$metadata || isset( $metadata['error'] ) ) { + return array(); + } + $stdMetadata = array(); + foreach ( $metadata as $name => $value ) { + $tag = strtolower( $name ); + if ( $tag === 'originalwidth' || $tag === 'originalheight' ) { + // Skip these. In the exif metadata stuff, it is assumed these + // are measured in px, which is not the case here. + continue; + } + if ( isset( self::$metaConversion[$tag] ) ) { + $tag = self::$metaConversion[$tag]; + $stdMetadata[$tag] = $value; + } + } + return $stdMetadata; + } } diff --git a/includes/objectcache/RedisBagOStuff.php b/includes/objectcache/RedisBagOStuff.php index e1dc42e15b..135e0e8302 100644 --- a/includes/objectcache/RedisBagOStuff.php +++ b/includes/objectcache/RedisBagOStuff.php @@ -273,38 +273,6 @@ class RedisBagOStuff extends BagOStuff { return $result; } - /** - * Non-atomic implementation of incr(). - * - * Probably all callers actually want incr() to atomically initialise - * values to zero if they don't exist, as provided by the Redis INCR - * command. But we are constrained by the memcached-like interface to - * return null in that case. Once the key exists, further increments are - * atomic. - */ - public function incr( $key, $value = 1 ) { - wfProfileIn( __METHOD__ ); - list( $server, $conn ) = $this->getConnection( $key ); - if ( !$conn ) { - wfProfileOut( __METHOD__ ); - return false; - } - if ( !$conn->exists( $key ) ) { - wfProfileOut( __METHOD__ ); - return null; - } - try { - $result = $conn->incrBy( $key, $value ); - } catch ( RedisException $e ) { - $result = false; - $this->handleException( $server, $conn, $e ); - } - - $this->logRequest( 'incr', $key, $server, $result ); - wfProfileOut( __METHOD__ ); - return $result; - } - /** * Get a Redis object with a connection suitable for fetching the specified key * @return Array (server, RedisConnRef) or (false, false) diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php index 70a94fe5c1..4b6eeca2fe 100644 --- a/includes/parser/CoreParserFunctions.php +++ b/includes/parser/CoreParserFunctions.php @@ -139,7 +139,7 @@ class CoreParserFunctions { $pref = $parser->getOptions()->getDateFormat(); // Specify a different default date format other than the the normal default - // iff the user has 'default' for their setting + // if the user has 'default' for their setting if ( $pref == 'default' && $defaultPref ) { $pref = $defaultPref; } diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php index 6fc457d741..b629776dd2 100644 --- a/includes/parser/LinkHolderArray.php +++ b/includes/parser/LinkHolderArray.php @@ -251,9 +251,8 @@ class LinkHolderArray { } /** - * @todo FIXME: Update documentation. makeLinkObj() is deprecated. * Replace link placeholders with actual links, in the buffer - * Placeholders created in Skin::makeLinkObj() + * * @return array of link CSS classes, indexed by PDBK. */ function replace( &$text ) { @@ -377,6 +376,10 @@ class LinkHolderArray { $key = "$ns:$index"; $searchkey = ""; $displayText = $entry['text']; + if ( isset( $entry['selflink'] ) ) { + $replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query ); + continue; + } if ( $displayText === '' ) { $displayText = null; } @@ -455,20 +458,17 @@ class LinkHolderArray { // single string to all variants. This would improve parser's performance // significantly. foreach ( $this->internals as $ns => $entries ) { + if ( $ns == NS_SPECIAL ) { + continue; + } foreach ( $entries as $index => $entry ) { $pdbk = $entry['pdbk']; // we only deal with new links (in its first query) if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) { - $title = $entry['title']; - $titleText = $title->getText(); - $titlesAttrs[] = array( - 'ns' => $ns, - 'key' => "$ns:$index", - 'titleText' => $titleText, - ); + $titlesAttrs[] = array( $index, $entry['title'] ); // separate titles with \0 because it would never appears // in a valid title - $titlesToBeConverted .= $titleText . "\0"; + $titlesToBeConverted .= $entry['title']->getText() . "\0"; } } } @@ -479,19 +479,35 @@ class LinkHolderArray { foreach ( $titlesAllVariants as &$titlesVariant ) { $titlesVariant = explode( "\0", $titlesVariant ); } - $l = count( $titlesAttrs ); + // Then add variants of links to link batch - for ( $i = 0; $i < $l; $i ++ ) { + $parentTitle = $this->parent->getTitle(); + foreach ( $titlesAttrs as $i => $attrs ) { + list( $index, $title ) = $attrs; + $ns = $title->getNamespace(); + $text = $title->getText(); + foreach ( $allVariantsName as $variantName ) { $textVariant = $titlesAllVariants[$variantName][$i]; - if ( $textVariant != $titlesAttrs[$i]['titleText'] ) { - $variantTitle = Title::makeTitle( $titlesAttrs[$i]['ns'], $textVariant ); - if ( is_null( $variantTitle ) ) { - continue; - } - $linkBatch->addObj( $variantTitle ); - $variantMap[$variantTitle->getPrefixedDBkey()][] = $titlesAttrs[$i]['key']; + if ( $textVariant === $text ) { + continue; + } + + $variantTitle = Title::makeTitle( $ns, $textVariant ); + if ( is_null( $variantTitle ) ) { + continue; + } + + // Self-link checking for mixed/different variant titles. At this point, we + // already know the exact title does not exist, so the link cannot be to a + // variant of the current title that exists as a separate page. + if ( $variantTitle->equals( $parentTitle ) && $title->getFragment() === '' ) { + $this->internals[$ns][$index]['selflink'] = true; + continue 2; } + + $linkBatch->addObj( $variantTitle ); + $variantMap[$variantTitle->getPrefixedDBkey()][] = "$ns:$index"; } } diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 0603a9bc77..1f14223d69 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -115,6 +115,10 @@ class Parser { # Marker Suffix needs to be accessible staticly. const MARKER_SUFFIX = "-QINU\x7f"; + # Markers used for wrapping the table of contents + const TOC_START = ''; + const TOC_END = ''; + # Persistent: var $mTagHooks = array(); var $mTransparentTagHooks = array(); @@ -355,7 +359,7 @@ class Parser { * to internalParse() which does all the real work. */ - global $wgUseTidy, $wgAlwaysUseTidy; + global $wgUseTidy, $wgAlwaysUseTidy, $wgShowHostnames; $fname = __METHOD__ . '-' . wfGetCaller(); wfProfileIn( __METHOD__ ); wfProfileIn( $fname ); @@ -532,6 +536,9 @@ class Parser { wfRunHooks( 'ParserLimitReportPrepare', array( $this, $this->mOutput ) ); $limitReport = "NewPP limit report\n"; + if ( $wgShowHostnames ) { + $limitReport .= 'Parsed by ' . wfHostname() . "\n"; + } foreach ( $this->mOutput->getLimitReportData() as $key => $value ) { if ( wfRunHooks( 'ParserLimitReportFormat', array( $key, $value, &$limitReport, false, false ) @@ -2110,16 +2117,12 @@ class Parser { } } - # Self-link checking - if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) { - if ( $nt->equals( $this->mTitle ) || ( !$nt->isKnown() && in_array( - $this->mTitle->getPrefixedText(), - $this->getConverterLanguage()->autoConvertToAllVariants( $nt->getPrefixedText() ), - true - ) ) ) { - $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail ); - continue; - } + # Self-link checking. For some languages, variants of the title are checked in + # LinkHolderArray::doVariants() to allow batching the existence checks necessary + # for linking to a different variant. + if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && $nt->getFragment() === '' ) { + $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail ); + continue; } # NS_MEDIA is a pseudo-namespace for linking directly to a file @@ -2278,13 +2281,13 @@ class Parser { $result = $this->closeParagraph(); if ( '*' === $char ) { - $result .= '
      • '; + $result .= "
          \n
        • "; } elseif ( '#' === $char ) { - $result .= '
          1. '; + $result .= "
              \n
            1. "; } elseif ( ':' === $char ) { - $result .= '
              '; + $result .= "
              \n
              "; } elseif ( ';' === $char ) { - $result .= '
              '; + $result .= "
              \n
              "; $this->mDTopen = true; } else { $result = ''; @@ -2302,11 +2305,11 @@ class Parser { */ function nextItem( $char ) { if ( '*' === $char || '#' === $char ) { - return '
            2. '; + return "
            3. \n
            4. "; } elseif ( ':' === $char || ';' === $char ) { - $close = ''; + $close = "\n"; if ( $this->mDTopen ) { - $close = ''; + $close = "\n"; } if ( ';' === $char ) { $this->mDTopen = true; @@ -2328,15 +2331,15 @@ class Parser { */ function closeList( $char ) { if ( '*' === $char ) { - $text = '
        '; + $text = "
      • \n
      "; } elseif ( '#' === $char ) { - $text = ''; + $text = "\n"; } elseif ( ':' === $char ) { if ( $this->mDTopen ) { $this->mDTopen = false; - $text = ''; + $text = "\n"; } else { - $text = ''; + $text = "\n"; } } else { return ''; @@ -2463,7 +2466,7 @@ class Parser { $openmatch = preg_match( '/(?:mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t ); + 'mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t ); if ( $openmatch or $closematch ) { $paragraphStack = false; # TODO bug 5718: paragraph closed @@ -4517,6 +4520,7 @@ class Parser { } $toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() ); $this->mOutput->setTOCHTML( $toc ); + $toc = self::TOC_START . $toc . self::TOC_END; } if ( $isMain ) { diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index 9519de9aed..502f0fd186 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -47,7 +47,8 @@ class ParserOutput extends CacheTime { $mEditSectionTokens = false, # prefix/suffix markers if edit sections were output as tokens $mProperties = array(), # Name/value pairs to be cached in the DB $mTOCHTML = '', # HTML of the TOC - $mTimestamp; # Timestamp of the revision + $mTimestamp, # Timestamp of the revision + $mTOCEnabled = true; # Whether TOC should be shown, can't override __NOTOC__ private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change. private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys) private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else. @@ -68,11 +69,27 @@ class ParserOutput extends CacheTime { } function getText() { + wfProfileIn( __METHOD__ ); + $text = $this->mText; if ( $this->mEditSectionTokens ) { - return preg_replace_callback( ParserOutput::EDITSECTION_REGEX, - array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText ); + $text = preg_replace_callback( ParserOutput::EDITSECTION_REGEX, + array( &$this, 'replaceEditSectionLinksCallback' ), $text ); + } else { + $text = preg_replace( ParserOutput::EDITSECTION_REGEX, '', $text ); + } + + // If you have an old cached version of this class - sorry, you can't disable the TOC + if ( isset( $this->mTOCEnabled ) && $this->mTOCEnabled ) { + $text = str_replace( array( Parser::TOC_START, Parser::TOC_END ), '', $text ); + } else { + $text = preg_replace( + '#'. preg_quote( Parser::TOC_START ) . '.*?' . preg_quote( Parser::TOC_END ) . '#s', + '', + $text + ); } - return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText ); + wfProfileOut( __METHOD__ ); + return $text; } /** @@ -123,6 +140,7 @@ class ParserOutput extends CacheTime { function getTOCHTML() { return $this->mTOCHTML; } function getTimestamp() { return $this->mTimestamp; } function getLimitReportData() { return $this->mLimitReportData; } + function getTOCEnabled() { return $this->mTOCEnabled; } function setText( $text ) { return wfSetVar( $this->mText, $text ); } function setLanguageLinks( $ll ) { return wfSetVar( $this->mLanguageLinks, $ll ); } @@ -134,6 +152,7 @@ class ParserOutput extends CacheTime { function setIndexPolicy( $policy ) { return wfSetVar( $this->mIndexPolicy, $policy ); } function setTOCHTML( $tochtml ) { return wfSetVar( $this->mTOCHTML, $tochtml ); } function setTimestamp( $timestamp ) { return wfSetVar( $this->mTimestamp, $timestamp ); } + function setTOCEnabled( $flag ) { return wfSetVar( $this->mTOCEnabled, $flag ); } function addCategory( $c, $sort ) { $this->mCategories[$c] = $sort; } function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; } diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php index 06251402dd..32b16aafa8 100644 --- a/includes/parser/Tidy.php +++ b/includes/parser/Tidy.php @@ -61,7 +61,10 @@ class MWTidyWrapper { // Replace elements with placeholders $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX, - array( &$this, 'replaceEditSectionLinksCallback' ), $text ); + array( &$this, 'replaceCallback' ), $text ); + // ...and markers + $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/', + array( &$this, 'replaceCallback' ), $wrappedtext ); // Modify inline Microdata and elements so they say and so // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config @@ -80,7 +83,7 @@ class MWTidyWrapper { * * @return string */ - function replaceEditSectionLinksCallback( $m ) { + function replaceCallback( $m ) { $marker = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX; $this->mMarkerIndex++; $this->mTokens->setPair( $marker, $m[0] ); diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php new file mode 100644 index 0000000000..4bcc13375b --- /dev/null +++ b/includes/rcfeed/RedisPubSubFeedEngine.php @@ -0,0 +1,41 @@ + 'JSONRCFeedFormatter', + * 'uri' => "redis://127.0.0.1:6379/rc.$wgDBname", + * ); + * + * @since 1.22 + */ + public function send( array $feed, $line ) { + $parsed = parse_url( $feed['uri'] ); + $server = $parsed['host']; + $options = array( 'serializer' => 'none' ); + $channel = 'rc'; + + if ( isset( $parsed['port'] ) ) { + $server .= ":{$parsed['port']}"; + } + if ( isset( $parsed['query'] ) ) { + parse_str( $parsed['query'], $options ); + } + if ( isset( $parsed['pass'] ) ) { + $options['password'] = $parsed['pass']; + } + if ( isset( $parsed['path'] ) ) { + $channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) ); + } + $pool = RedisConnectionPool::singleton( $options ); + $conn = $pool->getConnection( $server ); + $conn->publish( $channel, $line ); + } +} diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 19d019d329..6380efcf95 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -592,7 +592,7 @@ class ResourceLoader { * and clear out the output buffer. If the client cache is too old then do nothing. * @param $context ResourceLoaderContext * @param string $mtime The TS_MW timestamp to check the header against - * @return bool True iff 304 header sent and output handled + * @return bool True if 304 header sent and output handled */ protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) { // If there's an If-Modified-Since header, respond with a 304 appropriately @@ -1223,6 +1223,13 @@ class ResourceLoader { public static function getLessCompiler() { global $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; + // When called from the installer, it is possible that a required PHP extension + // is missing (at least for now; see bug 47564). If this is the case, throw an + // exception (caught by the installer) to prevent a fatal error later on. + if ( !function_exists( 'ctype_digit' ) ) { + throw new MWException( 'lessc requires the Ctype extension' ); + } + $less = new lessc(); $less->setPreserveComments( true ); $less->setVariables( self::getLESSVars() ); diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 20f6e0ba8f..b38f4481e0 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -41,7 +41,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { $wgVariantArticlePath, $wgActionPaths, $wgVersion, $wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath, - $wgCookiePrefix, $wgResourceLoaderMaxQueryLength; + $wgCookiePrefix, $wgResourceLoaderMaxQueryLength, + $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion; $mainPage = Title::newMainPage(); @@ -96,6 +97,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength, 'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces, 'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ), + 'wgResourceLoaderStorageVersion' => $wgResourceLoaderStorageVersion, + 'wgResourceLoaderStorageEnabled' => $wgResourceLoaderStorageEnabled, ); wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) ); diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php deleted file mode 100644 index c3d6080c22..0000000000 --- a/includes/specials/SpecialBlockme.php +++ /dev/null @@ -1,67 +0,0 @@ -setHeaders(); - $this->outputHeader(); - - $ip = $this->getRequest()->getIP(); - if ( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) { - $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' ); - - return; - } - - $user = User::newFromName( $this->msg( 'proxyblocker' )->inContentLanguage()->text() ); - # FIXME: newFromName could return false on a badly configured wiki. - if ( !$user->isLoggedIn() ) { - $user->addToDatabase(); - } - - $block = new Block(); - $block->setTarget( $ip ); - $block->setBlocker( $user ); - $block->mReason = $this->msg( 'proxyblockreason' )->inContentLanguage()->text(); - - $block->insert(); - - $this->getOutput()->addWikiMsg( 'proxyblocksuccess' ); - } - - protected function getGroupName() { - return 'other'; - } -} diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php index 129e9193c1..7fcab1939c 100644 --- a/includes/specials/SpecialChangePassword.php +++ b/includes/specials/SpecialChangePassword.php @@ -85,7 +85,7 @@ class SpecialChangePassword extends UnlistedSpecialPage { if ( $user->isLoggedIn() ) { $this->getOutput()->wrapWikiMsg( - "
      \n$1\n
      ", + "
      \n$1\n
      ", 'changepassword-success' ); $this->getOutput()->returnToMain(); diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index 65aa07e28c..1fe98190f0 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -227,7 +227,8 @@ class SpecialContributions extends SpecialPage { * Generates the subheading with links * @param $userObj User object for the target * @return String: appropriately-escaped HTML to be output literally - * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php. Could be combined. + * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php. + * Could be combined. */ protected function contributionsSub( $userObj ) { if ( $userObj->isAnon() ) { @@ -594,9 +595,11 @@ class SpecialContributions extends SpecialPage { */ class ContribsPager extends ReverseChronologicalPager { public $mDefaultDirection = true; - var $messages, $target; - var $namespace = '', $mDb; - var $preventClickjacking = false; + public $messages; + public $target; + public $namespace = ''; + public $mDb; + public $preventClickjacking = false; /** * @var array @@ -679,8 +682,13 @@ class ContribsPager extends ReverseChronologicalPager { * $limit: see phpdoc above * $descending: see phpdoc above */ - $data = array( $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ) ); - wfRunHooks( 'ContribsPager::reallyDoQuery', array( &$data, $pager, $offset, $limit, $descending ) ); + $data = array( $this->mDb->select( + $tables, $fields, $conds, $fname, $options, $join_conds + ) ); + wfRunHooks( + 'ContribsPager::reallyDoQuery', + array( &$data, $pager, $offset, $limit, $descending ) + ); $result = array(); @@ -944,7 +952,11 @@ class ContribsPager extends ReverseChronologicalPager { $chardiff .= Linker::formatRevisionSize( $row->rev_len ); $chardiff .= ' . . '; } else { - $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0; + $parentLen = 0; + if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) { + $parentLen = $this->mParentLens[$row->rev_parent_id]; + } + $chardiff = ' . . '; $chardiff .= ChangesList::showCharacterDifference( $parentLen, @@ -974,7 +986,7 @@ class ContribsPager extends ReverseChronologicalPager { # Show user names for /newbies as there may be different users. # Note that we already excluded rows with hidden user names. if ( $this->contribs == 'newbie' ) { - $userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() ); + $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() ); $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams( Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' '; } else { @@ -1001,11 +1013,14 @@ class ContribsPager extends ReverseChronologicalPager { $diffHistLinks = $this->msg( 'parentheses' ) ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink ) ->escaped(); - $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}"; + $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} "; + $ret .= "{$link}{$userlink} {$comment} {$topmarktext}"; # Denote if username is redacted for this edit if ( $rev->isDeleted( Revision::DELETED_USER ) ) { - $ret .= " " . $this->msg( 'rev-deleted-user-contribs' )->escaped() . ""; + $ret .= " " . + $this->msg( 'rev-deleted-user-contribs' )->escaped() . + ""; } # Tags, if any. diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php index 2cf1730dbe..9b9888adf3 100644 --- a/includes/specials/SpecialDeletedContributions.php +++ b/includes/specials/SpecialDeletedContributions.php @@ -27,8 +27,10 @@ */ class DeletedContribsPager extends IndexPager { public $mDefaultDirection = true; - var $messages, $target; - var $namespace = '', $mDb; + public $messages; + public $target; + public $namespace = ''; + public $mDb; /** * @var string Navigation bar with paging links. @@ -358,9 +360,9 @@ class DeletedContributionsPage extends SpecialPage { # If there were contributions, and it was a valid user or IP, show # the appropriate "footer" message - WHOIS tools, etc. if ( $target != 'newbies' ) { - $message = IP::isIPAddress( $target ) - ? 'sp-contributions-footer-anon' - : 'sp-contributions-footer'; + $message = IP::isIPAddress( $target ) ? + 'sp-contributions-footer-anon' : + 'sp-contributions-footer'; if ( !$this->msg( $message )->isDisabled() ) { $out->wrapWikiMsg( diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php index ce7a45b334..ecee0bb79f 100644 --- a/includes/specials/SpecialPreferences.php +++ b/includes/specials/SpecialPreferences.php @@ -57,7 +57,7 @@ class SpecialPreferences extends SpecialPage { if ( $this->getRequest()->getCheck( 'success' ) ) { $out->wrapWikiMsg( - "
      \n$1\n
      ", + "
      \n$1\n
      ", 'savedprefs' ); } diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php index ca93b6d1fa..fbc8e91636 100644 --- a/includes/specials/SpecialUnblock.php +++ b/includes/specials/SpecialUnblock.php @@ -42,6 +42,11 @@ class SpecialUnblock extends SpecialPage { list( $this->target, $this->type ) = SpecialBlock::getTargetAndType( $par, $this->getRequest() ); $this->block = Block::newFromTarget( $this->target ); + if ( $this->target instanceof User ) { + # Set the 'relevant user' in the skin, so it displays links like Contributions, + # User logs, UserRights, etc. + $this->getSkin()->setRelevantUser( $this->target ); + } $this->setHeaders(); $this->outputHeader(); diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php index 90c4c35841..5ac3e6546e 100644 --- a/includes/specials/SpecialUserlogin.php +++ b/includes/specials/SpecialUserlogin.php @@ -221,8 +221,8 @@ class LoginForm extends SpecialPage { $status = $this->addNewaccountInternal(); if ( !$status->isGood() ) { - $error = $this->getOutput()->parse( $status->getWikiText() ); - $this->mainLoginForm( $error ); + $error = $status->getMessage(); + $this->mainLoginForm( $error->toString() ); return; } @@ -257,8 +257,8 @@ class LoginForm extends SpecialPage { # Create the account and abort if there's a problem doing so $status = $this->addNewAccountInternal(); if ( !$status->isGood() ) { - $error = $this->getOutput()->parse( $status->getWikiText() ); - $this->mainLoginForm( $error ); + $error = $status->getMessage(); + $this->mainLoginForm( $error->toString() ); return false; } @@ -447,7 +447,9 @@ class LoginForm extends SpecialPage { if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) { // Hook point to add extra creation throttles and blocks wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" ); - return Status::newFatal( new RawMessage( $abortError ) ); + $abortError = new RawMessage( $abortError ); + $abortError->text(); + return Status::newFatal( $abortError ); } // Hook point to check for exempt from account creation throttle diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 11632a38cf..4afa279e7d 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -208,7 +208,21 @@ class SpecialWatchlist extends SpecialPage { $usePage = false; } else { # Top log Ids for a page are not stored - $conds[] = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG; + $nonRevisionTypes = array( RC_LOG ); + wfRunHooks( 'SpecialWatchlistGetNonRevisionTypes', array( &$nonRevisionTypes ) ); + if ( $nonRevisionTypes ) { + if ( count( $nonRevisionTypes ) === 1 ) { + // if only one use an equality instead of IN condition + $nonRevisionTypes = reset( $nonRevisionTypes ); + } + $conds[] = $dbr->makeList( + array( + 'rc_this_oldid=page_latest', + 'rc_type' => $nonRevisionTypes, + ), + LIST_OR + ); + } $limitWatchlist = 0; $usePage = true; } diff --git a/includes/templates/Usercreate.php b/includes/templates/Usercreate.php index 7a4b9f20c2..4750af95e5 100644 --- a/includes/templates/Usercreate.php +++ b/includes/templates/Usercreate.php @@ -158,9 +158,10 @@ class UsercreateTemplate extends BaseTemplate { 'id' => 'wpEmail', 'tabindex' => '6', 'size' => '20', + 'required' => $this->data['emailrequired'], 'placeholder' => $this->getMsg( $this->data['loggedin'] ? 'createacct-another-email-ph' : 'createacct-email-ph' )->text() - ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) ); + ) ); ?> diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php index f5ae3539bf..5eb609487e 100644 --- a/includes/templates/Userlogin.php +++ b/includes/templates/Userlogin.php @@ -69,10 +69,6 @@ class UserloginTemplate extends BaseTemplate { data['name'] ) { - $extraAttrs['autofocus'] = ''; - } echo Html::input( 'wpName', $this->data['name'], 'text', array( 'class' => 'loginText', 'id' => 'wpName1', @@ -80,9 +76,11 @@ class UserloginTemplate extends BaseTemplate { 'size' => '20', // 'required' is blacklisted for now in Html.php due to browser issues. // Keeping here in case that changes. - 'required', + 'required' => true, + // Set focus to this field if it's blank. + 'autofocus' => !$this->data['name'], 'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text() - ) + $extraAttrs ); + ) ); ?> @@ -101,18 +99,15 @@ class UserloginTemplate extends BaseTemplate { ?> data['name'] ) { - $extraAttrs['autofocus'] = ''; - } echo Html::input( 'wpPassword', null, 'password', array( 'class' => 'loginPassword', 'id' => 'wpPassword1', 'tabindex' => '2', 'size' => '20', + // Set focus to this field if username is filled in. + 'autofocus' => (bool)$this->data['name'], 'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text() - ) + $extraAttrs ); + ) ); ?> diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php index ebeb9c188d..7db6c64b36 100644 --- a/includes/upload/UploadStash.php +++ b/includes/upload/UploadStash.php @@ -358,7 +358,7 @@ class UploadStash { wfDebug( __METHOD__ . " clearing row $key\n" ); // Ensure we have the UploadStashFile loaded for this key - $this->getFile( $key ); + $this->getFile( $key, true ); $dbw = $this->repo->getMasterDb(); diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 79ddb6ac86..ccf9b1e06a 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -1263,7 +1263,10 @@ class ConverterRule { $variants = $this->mConverter->mVariants; $varsep_pattern = $this->mConverter->getVarSeparatorPattern(); + // Split according to $varsep_pattern, but ignore semicolons from HTML entities + $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules ); $choice = preg_split( $varsep_pattern, $rules ); + $choice = str_replace( "\x01", ';', $choice ); foreach ( $choice as $c ) { $v = explode( ':', $c, 2 ); diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php index 06c9e6089b..c087891090 100644 --- a/languages/messages/MessagesAce.php +++ b/languages/messages/MessagesAce.php @@ -164,12 +164,12 @@ $messages = array( 'tog-hidepatrolled' => 'Peusom neuandam teupatroli bak neuubah paléng barô', 'tog-newpageshidepatrolled' => 'Peusom ôn teupatroli nibak dapeuta ôn barô', 'tog-extendwatchlist' => 'Peuhah dapeuta keunalön keu peuleumah ban dum neuubah, kon nyang paléng barô mantöng', -'tog-usenewrc' => 'Nguy neuleumah neuubah barô tingkat lanjut (peureulèë JavaScript)', +'tog-usenewrc' => 'Peusaho neuandam bak neuleumah neuubah barô ngon dapeuta keunalon meunurot ôn', 'tog-numberheadings' => 'Bôh numbô nan keudroë', -'tog-showtoolbar' => 'Peuleumah toolbar (bateuëng alat) andam', +'tog-showtoolbar' => 'Peuleumah bateuëng alat andam', 'tog-editondblclick' => 'Andam ôn ngon duwa go teugon', 'tog-editsection' => 'Peujeuet andam bideueng rot hubong [andam]', -'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng (peureulee JavaScript)', +'tog-editsectiononrightclick' => 'Peujeuet andam bideueng ngon teugon blah uneun bak nan bideueng', 'tog-showtoc' => 'Peuleumah dapeuta asoe (keu on-on nyang na leubeh nibak 3 boh aneuk ulee)', 'tog-rememberpassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})', 'tog-watchcreations' => 'Tamah halaman nyang lonpeugot u dapeuta keunalon', @@ -187,7 +187,7 @@ $messages = array( 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon', 'tog-oldsig' => 'Tanda jaroe jinoe:', 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)', -'tog-uselivepreview' => 'Nguy peuleumah hase langsong (JavaScript) (baci)', +'tog-uselivepreview' => 'Nguy peuleumah hase langsong (baci)', 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh', 'tog-watchlisthideown' => 'Peusöm nyang lôn andam nibak dapeuta keunalön', 'tog-watchlisthidebots' => 'Peusöm nyang teu andam nibak sagoö nyang bak dapeuta keunalön', @@ -264,9 +264,18 @@ $messages = array( 'oct' => 'Siplôh', 'nov' => 'Siblaih', 'dec' => 'Duwa Blaih', -'january-date' => 'Buleuën Sa', -'february-date' => 'Buleuën Duwa', -'march-date' => 'Buleuën Lhèë', +'january-date' => '$1 Buleuën Sa', +'february-date' => '$1 Buleuën Duwa', +'march-date' => '$1 Buleuën Lhèë', +'april-date' => '$1 Buleuën Peuët', +'may-date' => '$1 Buleuën Limong', +'june-date' => '$1 Buleuën Nam', +'july-date' => '$1 Buleuën Tujôh', +'august-date' => '$1 Buleuën Lapan', +'september-date' => '$1 Buleuën Sikureuëng', +'october-date' => '$1 Buleuën Siplôh', +'november-date' => '$1 Buleuën Siblaih', +'december-date' => '$1 Buleuën Duwa Blaih', # Categories related messages 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}', @@ -292,7 +301,7 @@ $messages = array( 'newwindow' => '(peuhah bak tingkap barô)', 'cancel' => 'Peubateuë', 'moredotdotdot' => 'Lom...', -'morenotlisted' => 'Lom...', +'morenotlisted' => 'Dapeuta nyoe hana leungkap', 'mypage' => 'Ôn', 'mytalk' => 'Marit', 'anontalk' => 'Peugah haba IP nyoë.', @@ -395,7 +404,7 @@ $1", # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'Bhaih {{SITENAME}}', 'aboutpage' => 'Project:Bhaih', -'copyright' => 'Asoë nyang na saban ngön', +'copyright' => "Asoë na meunurot $1 keucuali meunyo na hay la'en nyang geupeugah", 'copyrightpage' => '{{ns:project}}:Hak karang', 'currentevents' => 'Haba barô', 'currentevents-url' => 'Project:Haba barô', @@ -476,6 +485,10 @@ Dapeuta on kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:specia 'error' => 'Seunalah', 'databaseerror' => 'Kesalahan basis data', 'databaseerror-text' => 'Saboh salah bak nè data ka teujadi. Nyoë meuhat na nyang han paih bak peukakaih droëneuh', +'databaseerror-textcl' => 'Teunanyong basis data teungoh kacho', +'databaseerror-query' => 'Teunanyong: $1', +'databaseerror-function' => 'Guna: $1', +'databaseerror-error' => 'Salah: $1', 'laggedslavemode' => 'Peuneugah: On nyoe kadang hana neuubah baro', 'readonly' => 'Basis data geurok', 'enterlockreason' => 'Pasoe daleh neurok ngon pajan jeuet geupeuhah', @@ -508,10 +521,11 @@ Kadang ka na soe sampoh.', 'cannotdelete-title' => 'H\'an jeuet sampoh on "$1"', 'delete-hook-aborted' => "Seunampoh geupeubateue le kaw'et parser. Hana jeuneulaih.", +'no-null-revision' => 'H\'an jeuet peugot revisi null baro keu halaman "$1"', 'badtitle' => 'Nan hana sah', 'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.', -'perfcached' => 'Data di yup nyoe geucok nibak peuniyoh ngon kadang kon data baro. {{PLURAL:$1||}}$1 hase maksimum na bak beuen.', -'perfcachedts' => 'Data di yup nyoe geupeusom, ngon geupeubaro keuneulheueh bak $1. {{PLURAL:$1||}}$1 hase maksimal na lam beuen.', +'perfcached' => 'Data di yup nyoe geupeusom ngon kadang kon data baro. {{PLURAL:$1|saboh hase|$1 hase}} maksimum na lam beujana.', +'perfcachedts' => 'Data di yup nyoe geupeusom, ngon geupeubaro seuneulheueh bak $1. {{PLURAL:$4|saboh hase|$4 hase}} paleng le na lam beujana.', 'querypage-no-updates' => "Beunaro keu on nyoe hat nyoe teungoh h'an jeuet. Data sinoe h'an geupasoe ulang.", 'wrong_wfQuery_params' => 'Parameter salah u wfQuery()
      @@ -522,8 +536,11 @@ Neulakee: $2', 'actionthrottled' => 'Buet geupeubataih', 'actionthrottledtext' => 'Sibagoe saboh seunipat lawan-spam, droeneuh geupeubataih nibak neupeulaku buet nyoe le that go lam watee paneuk, ngon droeneuh ka leubeh nibak bataih. Neuci lom lam padum minet.', +'protectedpagetext' => 'Laman nyoe ka geupeulindong mangat bek jeuet geuandam', 'viewsourcetext' => 'Droëneuh jeuët neu’eu', 'viewyourtext' => 'Droëneuh meuidzin kalon ngon neucok nè andam droëneuh u ôn nyoë', +'protectedinterface' => 'Halaman nyoe na teks muka keu muka keu peukakaih leumiek ngon geupeulindong mangat bek jeuet jipeureuloh. +Keu neuk tamah atawa ubah teujeumah keu ban dum wiki, neungui [//translatewiki.net/ translatewiki.net], proyek lokalisasi MediaWiki.', 'ns-specialprotected' => 'Ôn khusuih bèk neuandam', 'exception-nologin' => 'Hana tamong lom', diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php index 14285d3647..271ba5c3db 100644 --- a/languages/messages/MessagesAf.php +++ b/languages/messages/MessagesAf.php @@ -219,8 +219,8 @@ $messages = array( 'tog-extendwatchlist' => 'Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie', 'tog-usenewrc' => 'Groepeer wysigings per bladsy in onlangse wysigings en dophoulys (benodig JavaScript)', 'tog-numberheadings' => 'Nommer opskrifte outomaties', -'tog-showtoolbar' => 'Wys redigeergereedskap (benodig JavaScript)', -'tog-editondblclick' => 'Dubbelkliek om blaaie te wysig (benodig JavaScript)', +'tog-showtoolbar' => 'Wys redigeergereedskap', +'tog-editondblclick' => 'Dubbelkliek om te wysig', 'tog-editsection' => 'Wys [wysig]-skakels vir elke afdeling', 'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)', 'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)', @@ -666,6 +666,7 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n 'userlogin-resetpassword-link' => 'Herstel u wagwoord', 'helplogin-url' => 'Help:Aanmelding', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp met aanmelding]]', +'userlogin-createanother' => "Skep nog 'n rekening", 'createacct-join' => 'Verskaf u gegewens hieronder.', 'createacct-another-join' => 'Sleutel die nuwe rekening se inligting hier onder in:', 'createacct-emailrequired' => 'E-posadres', @@ -2563,7 +2564,7 @@ $1', 'contributions' => '{{GENDER:$1|Gebruikersbydraes}}', 'contributions-title' => '$1 se bydraes', 'mycontris' => 'Bydraes', -'contribsub2' => 'Vir $1 ($2)', +'contribsub2' => 'Vir {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Geen veranderinge wat by hierdie kriteria pas, is gevind nie.', 'uctop' => '(laaste wysiging)', 'month' => 'Vanaf maand (en vroeër):', @@ -2722,12 +2723,9 @@ Die blokkade is moontlik reeds opgehef.', Die blokkade is 'n onderdeel van die reeks $2, waarvan die blokkade wel opgehef kan word.", 'ip_range_invalid' => 'Ongeldige IP waardegebied.', 'ip_range_toolarge' => 'Reeks-blokkades groter as /$1 word nie toegelaat nie.', -'blockme' => 'Versper my', 'proxyblocker' => 'Proxyblokker', -'proxyblocker-disabled' => 'Die funksie is gedeaktiveer.', 'proxyblockreason' => "U IP-adres is geblokkeer omdat dit van 'n oop instaanbediener (proxy) gebruik maak. Kontak asseblief u internet-diensverskaffer of tegniese ondersteuning en lig hulle van hierdie ernstige sekuriteitsprobleem in.", -'proxyblocksuccess' => 'Voltooi.', 'sorbsreason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.", 'sorbs_create_account_reason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word. U kan nie 'n rekening skep nie.", @@ -3072,6 +3070,8 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons 'spam_reverting' => 'Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie', 'spam_blanking' => "Alle weergawes met 'n skakel na $1 word verwyder", 'spam_deleting' => 'Alle weergawes bevat verwysings na $1. Bladsy verwyder', +'simpleantispam-label' => "Anti-spam kontrole. +'''Moenie''' die veld invul nie!", # Info page 'pageinfo-title' => 'Inligting oor "$1"', @@ -3904,7 +3904,10 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van 'tags-tag' => 'Etiketnaam', 'tags-display-header' => 'Weergawe in wysigingslyste', 'tags-description-header' => 'Volledige beskrywing van betekenis', +'tags-active-header' => 'Aktief?', 'tags-hitcount-header' => 'Geëtiketteerde veranderings', +'tags-active-yes' => 'Ja', +'tags-active-no' => 'Nee', 'tags-edit' => 'wysig', 'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}', @@ -4070,8 +4073,8 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad 'limitreport-ppvisitednodes' => 'Aantal nodes besoek tydens voorverwerking:', 'limitreport-ppgeneratednodes' => 'Aantal nodes geskep tydens voorverwerking:', 'limitreport-postexpandincludesize' => 'Inklusiegrootte na uitbreiding', -'limitreport-postexpandincludesize-value' => '$1/$2 grepe', -'limitreport-templateargumentsize-value' => '$1/$2 grepe', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}', 'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte', ); diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php index c5c19e2d48..332eda3fb1 100644 --- a/languages/messages/MessagesAln.php +++ b/languages/messages/MessagesAln.php @@ -1504,6 +1504,9 @@ Lejon dhânien e arsyes në përmbledhje.', 'siteusers' => '{{SITENAME}} {{PLURAL:$2|përdorues|përdorues}} $1', 'creditspage' => 'Kreditat e faqes', +# Spam protection +'simpleantispam-label' => "Anti-spam kontrolloni. A'''''NUK' plotësoni këtë!", + # Browsing diffs 'previousdiff' => '← Redaktim mâ i vjetër', 'nextdiff' => 'Redaktim ma i ri →', diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php index 730af88f4c..da80c4f176 100644 --- a/languages/messages/MessagesAm.php +++ b/languages/messages/MessagesAm.php @@ -1848,9 +1848,6 @@ $1', 'ipb_expiry_invalid' => 'የሚያልቅበት ግዜ አይሆንም።', 'ipb_already_blocked' => '«$1» ገና ከዚህ በፊት ታግዶ ነው።', 'ipb-needreblock' => '$1 አሁን ገና ታግዷል። ዝርዝሩን ማስተካከል ፈለጉ?', -'blockme' => 'ልታገድ', -'proxyblocker-disabled' => 'ይህ ተግባር እንደማይሠራ ተደርጓል።', -'proxyblocksuccess' => 'ተደርጓል።', 'cant-block-while-blocked' => 'እርስዎ እየታገዱ ሌላ ተጠቃሚ ለማገድ አይችሉም።', # Developer tools diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php index 10330ed5cf..71ddec75e9 100644 --- a/languages/messages/MessagesAn.php +++ b/languages/messages/MessagesAn.php @@ -2371,11 +2371,8 @@ Ta más detalles, debaixo s'amuestra o rechistro de supresions:", 'ipb_blocked_as_range' => "Error: L'adreza IP $1 no s'ha bloqueyato dreitament y por ixo no se puede desbloqueyar. Manimenos, ye bloqueyata por estar parte d'o rango $2, que sí puede desbloqueyar-se de conchunta.", 'ip_range_invalid' => "O rango d'adrezas IP no ye conforme.", 'ip_range_toolarge' => 'No se permiten os bloqueyos de rangos más grans que /$1.', -'blockme' => 'bloqueyar-me', 'proxyblocker' => 'bloqueyador de proxies', -'proxyblocker-disabled' => 'Ista función ye desactivata.', 'proxyblockreason' => "S'ha bloqueyato a suya adreza IP porque ye un proxy ubierto. Por favor, contaute on o suyo furnidor de servicios d'Internet u con o suyo servicio d'asistencia tecnica e informe-les d'iste grau problema de seguridat.", -'proxyblocksuccess' => 'Feito.', 'sorbsreason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}.', 'sorbs_create_account_reason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}. No puede creyar una cuenta', 'cant-block-while-blocked' => 'No puet bloqueyar a atros usuarios en o tiempo que ye bloqueyato.', @@ -2721,6 +2718,8 @@ Puede veyer-ne, manimenos, o codigo fuent.', 'spambot_username' => 'Esporga de spam de MediaWiki', 'spam_reverting' => "Tornando t'a zaguera versión sin de vinclos ta $1", 'spam_blanking' => 'Todas as versions teneban vinclos ta $1, se deixa en blanco', +'simpleantispam-label' => "Preba anti-spam. +'''NO''' replene esto!", # Info page 'pageinfo-title' => 'Información ta «$1»', diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php index 3c723b78b4..322dd28651 100644 --- a/languages/messages/MessagesAng.php +++ b/languages/messages/MessagesAng.php @@ -370,8 +370,8 @@ Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm 'cascadeprotected' => 'Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre "cascading": $2', # Virus scanner -'virus-badscanner' => "Јастыра конфигурация: Јарты јок сканер ''$1''", -'virus-unknownscanner' => 'Јарты јок антивирус:', +'virus-badscanner' => 'Bad configuration: Unknown virus scanner: $1', +'virus-unknownscanner' => 'unknown antivirus:', # Login and logout pages 'logouttext' => "'''Þū eart nū ūtmeldod.''' @@ -401,8 +401,8 @@ Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmel 'logout' => 'Ūtmeldian', 'userlogout' => 'Ūtmeldian', 'notloggedin' => 'Nā ingemeldod', -'userlogin-noaccount' => 'Слерде аккаунт јок по?', -'userlogin-joinproject' => '{{SITENAME}} кирер', +'userlogin-noaccount' => "Don't have an account?", +'userlogin-joinproject' => 'Join {{SITENAME}}', 'nologin' => 'Næfst þū reccinge? $1', 'nologinlink' => 'Scieppan reccinge', 'createaccount' => 'Scieppan reccinge', @@ -497,12 +497,12 @@ Gif þū hider be misfēnge cōme, cnoca þīnes webbsēcendes '''on bæc''' cn 'editingold' => "'''WARNUNG: Þū adihtest ealde fadunge þisses trametes.''' Gif þū hine hordie, ǣnga andwendunga þā wǣron gedōn æfter þisse fadunge bēoþ sōðes forloren.", 'yourdiff' => 'Fǣgnessa', -'copyrightwarning2' => "Bidde behielde þæt man mæȝ ealla forðunga tō {{SITENAME}} -ādihtan, hƿeorfan, oþþe forniman. -Ȝif þū ne ƿille man þīn ȝeƿrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.
      -Þū behǣtst ēac þæt þū selfa þis ƿrite, oþþe efenlǣhtest of sumre -folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum). -'''Ne forþsend efenlǣhtscielded ƿeorc būtan þafunge!'''", +'copyrightwarning2' => "Bidde behielde þæt man mæg ealla forðunga tō {{SITENAME}} +ādihtan, hweorfan, oþþe forniman. +Gif þū ne wille man þīn gewrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.
      +Þū behǣtst ēac þæt þū selfa þis write, oþþe efenlǣhtest of sumre +folclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum). +'''Ne forþsend efenlǣhtscielded weorc būtan þafunge!'''", 'templatesused' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þissum tramete:', 'templatesusedpreview' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre fōrebysene:', 'template-protected' => '(geborgen)', @@ -1024,7 +1024,6 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc 'contribslink' => 'forðunga', 'unblocklogentry' => 'unfortȳnde $1', 'block-log-flags-nocreate' => 'Forbēad tō scieppenne reccinge', -'proxyblocksuccess' => 'Gedōn.', # Move page 'movearticle' => 'Wegan tramet:', @@ -1168,7 +1167,7 @@ Cēos ōðerne naman lā.', 'exif-sharpness' => 'Scearpnes', 'exif-gpslatituderef' => 'Norþ oþþe sūþ brǣdu', 'exif-gpslatitude' => 'Brǣdu', -'exif-gpslongituderef' => 'Ēast oþþe ƿest lengu', +'exif-gpslongituderef' => 'Ēast oþþe west lengu', 'exif-gpslongitude' => 'Lengu', 'exif-gpsmeasuremode' => 'Mētungmōd', 'exif-gpsimgdirection' => 'Rihtung þæs biliðes', @@ -1177,7 +1176,7 @@ Cēos ōðerne naman lā.', 'exif-compression-1' => 'Unȝeþrycced', 'exif-meteringmode-0' => 'Uncūþ', -'exif-meteringmode-1' => 'Ȝeþēaƿisc', +'exif-meteringmode-1' => 'Geþēawisc', 'exif-meteringmode-6' => 'Sām', 'exif-meteringmode-255' => 'Ōðer', @@ -1212,7 +1211,7 @@ Cēos ōðerne naman lā.', # Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef 'exif-gpslongitude-e' => 'Ēast lengu', -'exif-gpslongitude-w' => 'Ƿest lengu', +'exif-gpslongitude-w' => 'West lengu', # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef 'exif-gpsdirection-t' => 'Sōþ rihtung', diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php index 16cc385d62..4505ae6c79 100644 --- a/languages/messages/MessagesAr.php +++ b/languages/messages/MessagesAr.php @@ -693,7 +693,7 @@ $messages = array( 'articlepage' => 'اعرض صفحة المحتوى', 'talk' => 'نقاش', 'views' => 'معاينة', -'toolbox' => 'صندوق الأدوات', +'toolbox' => 'الأدوات', 'userpage' => 'طالع صفحة المستخدم', 'projectpage' => 'طالع صفحة المشروع', 'imagepage' => 'طالع صفحة الملف', @@ -1744,7 +1744,7 @@ $1", 'email-address-validity-invalid' => 'أدخل عنوان بريد إلكتروني صالح', # User rights -'userrights' => 'إدارة صلاحيات المستخدم', +'userrights' => 'صلاحيات المستخدم', 'userrights-lookup-user' => 'أدِر مجموعات المستخدم', 'userrights-user-editname' => 'أدخل اسم مستخدم:', 'editusergroup' => 'عدل مجموعات المستخدم', @@ -1894,8 +1894,8 @@ $1", 'action-block' => 'منع هذا المستخدم من التعديل', 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة', 'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا', -'action-import' => 'استيراد هذه الصفحة من ويكي آخر', -'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع', +'action-import' => 'استيراد صفحات من ويكي آخر', +'action-importupload' => 'استيراد صفحات من ملف مرفوع', 'action-patrol' => 'تعليم تعديلات الآخرين بعلامة المراجعة', 'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع', 'action-unwatchedpages' => 'رؤية قائمة الصفحات غير المراقبة', @@ -2438,8 +2438,9 @@ $1', 'protectedtitlestext' => 'العناوين التالية محمية ضد الإنشاء', 'protectedtitlesempty' => 'لا توجد عناوين محمية حاليا بهذه المحددات.', 'listusers' => 'قائمة الأعضاء', -'listusers-editsonly' => 'اعرض المستخدمين الذين قاموا بتعديلات فقط', +'listusers-editsonly' => 'اعرض المستخدمين الذين أجروا تعديلات فقط', 'listusers-creationsort' => 'رتب حسب تاريخ الإنشاء', +'listusers-desc' => 'رتب تنازليا', 'usereditcount' => '{{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}', 'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2', 'newpages' => 'صفحات جديدة', @@ -2564,7 +2565,7 @@ $1', # Email user 'mailnologin' => 'لا يوجد عنوان للإرسال', 'mailnologintext' => 'يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.', -'emailuser' => 'إرسال رسالة لهذا المستخدم', +'emailuser' => 'مراسلة المستخدم', 'emailuser-title-target' => 'راسل بالبريد الإلكتروني هذا {{GENDER:$1| المستخدم}}', 'emailuser-title-notarget' => 'مراسلة المستخدم', 'emailpage' => 'إرسال رسالة للمستخدم', @@ -2746,8 +2747,8 @@ $UNWATCHURL 'modifiedarticleprotection' => 'غير مستوى حماية "[[$1]]"', 'unprotectedarticle' => 'أزال الحماية من "[[$1]]"', 'movedarticleprotection' => 'نقل إعدادات الحماية من "[[$2]]" إلى "[[$1]]"', -'protect-title' => 'ضبط مستوى الحماية ل"$1"', -'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"', +'protect-title' => 'ضبط مستوى حماية "$1"', +'protect-title-notallowed' => 'عرض مستوى حماية "$1"', 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]', 'protect-badnamespace-title' => 'نطاق لا يحمى', 'protect-badnamespace-text' => 'صفحات هذا النطاق لا يمكن حمايتها', @@ -2888,7 +2889,7 @@ $1', 'sp-contributions-uploads' => 'مرفوعات', 'sp-contributions-logs' => 'سجلات', 'sp-contributions-talk' => 'نقاش', -'sp-contributions-userrights' => 'إدارة صلاحيات المستخدم', +'sp-contributions-userrights' => 'صلاحيات المستخدم', 'sp-contributions-blocked-notice' => 'هذا المستخدم ممنوع حاليا. إن آخر مدخلة في سجل المنع موجودة أدناه كمرجع:', 'sp-contributions-blocked-notice-anon' => 'عنوان الأيبي هذا ممنوع حاليا. @@ -2921,7 +2922,7 @@ $1', 'autoblockid' => 'منع تلقائي #$1', 'block' => 'امنع المستخدم', 'unblock' => 'إلغاء منع مستخدم', -'blockip' => 'منع مستخدم', +'blockip' => 'منع المستخدم', 'blockip-title' => 'منع مستخدم', 'blockip-legend' => 'منع المستخدم', 'blockiptext' => 'استخدم النموذج التالي لمنع مستخدم، أو عنوان آيبي، معين من التعديل أو إنشاء حسابات جديدة. تُستخدم هذه العملية لمنع التخريب فقط، ويجب أن تتماشى مع [[{{MediaWiki:Policy-url}}|سياسة المنع]]. أدخل تعليلاً واضحًا لسبب المنع في الخانة المخصصة لذلك (مثلاً: ذكر صفحات محددة تمّ تخريبها من قبل المستخدم).', @@ -3032,12 +3033,9 @@ $1', لكنه ممنوع كجزء من النطاق $2، والذي يمكن رفع المنع عنه.', 'ip_range_invalid' => 'نطاق عناوين الأيبي المدخل غير صحيح.', 'ip_range_toolarge' => 'لا يسمح بنطاقات المنع الأكبر من /$1', -'blockme' => 'امنعني', 'proxyblocker' => 'مانع البروكسي', -'proxyblocker-disabled' => 'هذه الخاصية معطلة.', 'proxyblockreason' => 'تم منع عنوان الأيبي الخاص بك لكونه بروكسي مفتوح. من فضلك اتصل بمزود خدمة الإنترنت الخاص بك أو الدعم الفني وأعلمهم بهذه المشكلة الأمنية الخطيرة.', -'proxyblocksuccess' => 'تم.', 'sorbs' => 'دي إن إس بي إل', 'sorbsreason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.', 'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}. @@ -3409,6 +3407,8 @@ $2', 'spam_reverting' => 'استرجاع آخر نسخة ليس بها وصلات إلى $1', 'spam_blanking' => 'كل النسخ احتوت على وصلات ل $1، إفراغ', 'spam_deleting' => 'جميع النسخ تحوي رابطا إلى $1، يتم الحذف', +'simpleantispam-label' => "اختبار ضد السبام. +'''لا''' تملأ هذا!", # Info page 'pageinfo-title' => 'المعلومات عن «$1»', @@ -4372,7 +4372,10 @@ $5 'tags-tag' => 'اسم الوسم', 'tags-display-header' => 'الظهور في قوائم التغييرات', 'tags-description-header' => 'وصف كامل للمعنى', +'tags-active-header' => 'نشط؟', 'tags-hitcount-header' => 'تغييرات موسومة', +'tags-active-yes' => 'نعم', +'tags-active-no' => 'لا', 'tags-edit' => 'عدل', 'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}', diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php index a6b49d264b..33b463c652 100644 --- a/languages/messages/MessagesArc.php +++ b/languages/messages/MessagesArc.php @@ -1461,8 +1461,6 @@ $1', 'ipb_already_blocked' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ', 'ipb-needreblock' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ Do you want to change the settings?', -'blockme' => 'ܚܪܘܡ ܠܝ', -'proxyblocksuccess' => 'ܒܪܐ', # Move page 'move-page' => 'ܫܢܝ $1', diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php index 028166237e..fe0312a643 100644 --- a/languages/messages/MessagesArn.php +++ b/languages/messages/MessagesArn.php @@ -752,7 +752,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.', 'blocklogentry' => 'Katrüntukufi [[$1]] $2 antü/ora mew, $3', 'block-log-flags-nocreate' => 'Pepi dewmangelay konün', 'block-log-flags-hiddenname' => 'Üy kellufe ellkan', -'proxyblocksuccess' => 'Dewmangey.', # Move page 'move-page' => 'Nengümün $1', diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php index 15557491c3..9f1b3364d6 100644 --- a/languages/messages/MessagesAry.php +++ b/languages/messages/MessagesAry.php @@ -1873,10 +1873,7 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e 'ipb_expiry_temp' => 'L-Blokaj dyal s-smiyyaṫ dyal l-mosṫeĥdimin l-mĥebbyin ĥaṣṣo ybqa dima.', 'ipb_already_blocked' => '"$1" rah fayeṫ mbloki', 'ipb-otherblocks-header' => 'Blokaj {{PLURAL:$1|weḫdaĥor|weḫdaĥrin}}', -'blockme' => 'blokini', 'proxyblocker' => 'blokør dl-proksi', -'proxyblocker-disabled' => 'had l-ĥaṣṣiyya ma mtloqa-ċ', -'proxyblocksuccess' => 'ṣafi.', 'sorbs' => 'DNSBL', # Developer tools diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php index 5d4a3533be..a7d03e9785 100644 --- a/languages/messages/MessagesArz.php +++ b/languages/messages/MessagesArz.php @@ -2423,12 +2423,9 @@ $1', بس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2، و اللى ممكن رفع المنع عنه.', 'ip_range_invalid' => 'نطاق عناوين الأيبى مش صحيح.', 'ip_range_toolarge' => 'حدود المنع اللى اكبر من /$1 مش مسموح بيها.', -'blockme' => 'امنعنى', 'proxyblocker' => 'مانع البروكسي', -'proxyblocker-disabled' => 'الخاصية دى متعطلة.', 'proxyblockreason' => 'عنوان الأيبى بتاعك اتمنع لانه بروكسى مفتوح. لو سمحت تتصل بمزود خدمة الإنترنت بتاعك أو الدعم الفنى و قولهم على المشكلة الامنية الخطيرة دي.', -'proxyblocksuccess' => 'خلاص.', 'sorbs' => 'دى إن إس بى إل', 'sorbsreason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى DNSBL اللى بيستعمله{{SITENAME}}.', 'sorbs_create_account_reason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى ال DNSBL اللى بيستعمله {{SITENAME}}. @@ -2739,6 +2736,8 @@ $1', 'spambot_username' => 'تنظيف سبام ميدياويكى', 'spam_reverting' => 'ترجيع آخر نسخة مافيهاش لينكات لـ $1', 'spam_blanking' => 'كل النسخ فيها لينكات ل $1، فضيها', +'simpleantispam-label' => "اختبار انتي-سبام. +'''ماتعبيش''' دا!", # Skin names 'skinname-cologneblue' => 'كولون بلو', diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php index 2c044f991f..b56ee1af8c 100644 --- a/languages/messages/MessagesAs.php +++ b/languages/messages/MessagesAs.php @@ -2676,12 +2676,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"', কিন্তু এইটো $2 পৰিসীমাৰ অন্তৰ্গত যাৰ বাধা আঁতৰাব পাৰি ।', 'ip_range_invalid' => 'অবৈধ আই.পি. পৰিসৰ ।', 'ip_range_toolarge' => '/$1তকৈ ডাঙৰ প্ৰতিবন্ধক পৰিসৰ অনুমোদিত নহয় ।', -'blockme' => 'মোক বাৰণ কৰক', 'proxyblocker' => 'প্ৰক্সী অৱৰোধকাৰী', -'proxyblocker-disabled' => 'এই ফাংচনটো নিষ্ক্ৰিয়', 'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ এইটো এটা মুক্ত প্ৰক্সী । অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সেৱা প্ৰদানকাৰী বা কাৰিকৰী সহায়কৰ্তাৰ লগত যোগাযোগ কৰক আৰু এই গুৰুতৰ সুৰক্ষা সমস্যাৰ বিষয়ে জনাওক ।', -'proxyblocksuccess' => 'সম্পন্ন কৰা হ’ল ।', 'sorbsreason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।', 'sorbs_create_account_reason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে । আপুনি একাউণ্ট সৃষ্টি কৰিব নোৱাৰে', @@ -3028,6 +3025,8 @@ $2', 'spam_reverting' => '$1লৈ সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতাই নিয়া হৈছে', 'spam_blanking' => 'সকলো পুনৰীক্ষনৰ $1লৈ সংযোগ আছিল, ৰিক্ত কৰা হৈছে', 'spam_deleting' => 'সকলো পুনৰীক্ষণৰ $1লৈ সংযোগ আছিল, বিলোপ কৰা হৈছে', +'simpleantispam-label' => "এণ্টি-স্পাম পৰীক্ষা। +এইখন পূৰণ '''নকৰিব'''!", # Info page 'pageinfo-title' => '"$1" ৰ তথ্য', diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php index b2782dbb8a..442d64ed4a 100644 --- a/languages/messages/MessagesAst.php +++ b/languages/messages/MessagesAst.php @@ -2616,11 +2616,8 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl 'ipb_blocked_as_range' => 'Error: La IP $1 nun ta bloquiada direutamente, polo que nun pue ser desloquiada. Sicasí, foi bloquiada como parte del intervalu $2, que pue ser desbloquiáu.', 'ip_range_invalid' => 'Rangu IP non válidu.', 'ip_range_toolarge' => 'Nun se permiten bloqueos mayores de /$1.', -'blockme' => 'Blóquiame', 'proxyblocker' => 'Bloquiador de proxys', -'proxyblocker-disabled' => 'Esta función ta desactivada.', 'proxyblockreason' => "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.", -'proxyblocksuccess' => 'Fecho.', 'sorbsreason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.', 'sorbs_create_account_reason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta', 'xffblockreason' => "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1", @@ -2984,6 +2981,8 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.', 'spam_reverting' => 'Revirtiendo a la cabera versión que nun contién enllaces a $1', 'spam_blanking' => 'Toles revisiones teníen enllaces a $1; dexando en blanco', 'spam_deleting' => 'Toles revisiones teníen enllaces a $1, desaniciando', +'simpleantispam-label' => "Control anti-spam. +¡'''NUN''' rellenes esto!", # Info page 'pageinfo-title' => 'Información sobro "$1"', diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php index 2a7fc88f7d..325911554b 100644 --- a/languages/messages/MessagesAvk.php +++ b/languages/messages/MessagesAvk.php @@ -1716,11 +1716,8 @@ male abdion elekayane IP mane.', 'ipb_expiry_invalid' => "temps d'expiration invalide.", 'ipb_already_blocked' => '"$1" ixam tir elekan', 'ip_range_invalid' => 'IP elega mewadafa.', -'blockme' => 'Zo eleká !', 'proxyblocker' => 'Elekasiki va proxy', -'proxyblocker-disabled' => 'Bati fli tir metegirafi.', 'proxyblockreason' => "Votre ip a été bloquée car c'est un proxy ouvert. Merci de contacter votre fournisseur d'accès internet ou votre support technique et de l'informer de ce problème de sécurité.", -'proxyblocksuccess' => 'Tenuweyes.', 'sorbsreason' => "Rinafe IP mane wetce fenkunafi 'proxy' koe DNSBL faveni gan {{SITENAME}} zo vexalar.", # Developer tools diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php index e393e7d261..7b345b3496 100644 --- a/languages/messages/MessagesAz.php +++ b/languages/messages/MessagesAz.php @@ -2028,10 +2028,7 @@ Bloklama şərtlərini dəyişmək istəyirsiniz?', 'unblock-hideuser' => 'İstifadəçi adı gizli olduğu üçün, bi bloku götürə bilməzsiniz.', 'ipb_cant_unblock' => 'Xəta: Bloklama IDsi $1 tapılmadı. Bloklamanın götürülməsi mümkündür.', 'ip_range_invalid' => 'Yanlış IP', -'blockme' => 'Məni blokla', 'proxyblocker' => 'Proksi bloklayıcı', -'proxyblocker-disabled' => 'Bu funksiya əngəlləndi.', -'proxyblocksuccess' => 'Oldu.', 'sorbs' => 'DNSBL', # Developer tools diff --git a/languages/messages/MessagesAzb.php b/languages/messages/MessagesAzb.php index b845a5973e..e9423fb2d0 100644 --- a/languages/messages/MessagesAzb.php +++ b/languages/messages/MessagesAzb.php @@ -2542,12 +2542,9 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"', آنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.', 'ip_range_invalid' => 'یانلیش ای پی', 'ip_range_toolarge' => '/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.', -'blockme' => 'منی باغلا', 'proxyblocker' => 'پروکسی باغلییان', -'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.', 'proxyblockreason' => 'ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی. خاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.', -'proxyblocksuccess' => 'اولدو.', 'sorbsreason' => 'ای پی عنوانینیز، {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.', 'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش. حساب میدانا گتیره بیلمز', diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php index 3197a42baf..dd61d09968 100644 --- a/languages/messages/MessagesBa.php +++ b/languages/messages/MessagesBa.php @@ -8,6 +8,7 @@ * @file * * @author AiseluRB + * @author Alfiya55 * @author Assele * @author Comp1089 * @author Haqmar @@ -155,12 +156,12 @@ $messages = array( 'tog-hidepatrolled' => 'Һуңғы үҙгәртеүҙәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер', 'tog-newpageshidepatrolled' => 'Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер', 'tog-extendwatchlist' => 'Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге', -'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештерҙе төркөмдәргә булергә (JavaScript)', -'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерландыр', -'tog-showtoolbar' => 'Мөхәррирләү ваҡытында өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәкле)', -'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә (JavaScript кәрәкле)', +'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә', +'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерлаe', +'tog-showtoolbar' => 'Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)', +'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә', 'tog-editsection' => 'Һәр бүлек өсөн «үҙгәртеү» һылтанмаһын күрһәтергә', -'tog-editsectiononrightclick' => 'Бүлектәрҙе исемдәренә сысҡан менән сиртеп үҙгәртергә (JavaScript кәрәкле)', +'tog-editsectiononrightclick' => 'Бүлектәрҙе исемдәренә төрткөнөң уң яғына сиртеп үҙгәртергә', 'tog-showtoc' => 'Эстәлек күрһәтелһен (3-тән күп башлығы булған биттәрҙә)', 'tog-rememberpassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен', 'tog-watchcreations' => 'Мин төҙөгән биттәрҙе һәм күсергән файлдарҙы күҙәтеү исемлегенә өҫтәргә', @@ -191,6 +192,7 @@ $messages = array( 'tog-showhiddencats' => 'Йәшерен категорияларҙы күрһәтергә', 'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң версия айырмалары күрһәтелмәһен', 'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә', +'tog-prefershttps' => 'Системаға танытылғандан һуң һәр ваҡыт һаҡланыулы тоташыу ҡулланырға', 'underline-always' => 'Һәр ваҡыт', 'underline-never' => 'Бер ҡасан да', @@ -291,7 +293,7 @@ $messages = array( 'newwindow' => '(яңы биттә)', 'cancel' => 'Бөтөрөргә', 'moredotdotdot' => 'Дауамы...', -'morenotlisted' => 'Башҡа бер нимә лә юҡ...', +'morenotlisted' => 'Был исемлек тулы түгел', 'mypage' => 'Бит', 'mytalk' => 'Әңгәмә', 'anontalk' => 'Был IP-адресының фекер алышыу бите', @@ -347,6 +349,7 @@ $messages = array( 'create-this-page' => 'Был битте яһарға', 'delete' => 'Юҡ итергә', 'deletethispage' => 'Был битте юйырға', +'undeletethispage' => 'Юйылған был битте ҡабат тергеҙеү', 'undelete_short' => '$1 {{PLURAL:$1|үҙгәртеүҙе}} тергеҙергә', 'viewdeleted_short' => '{{PLURAL:$1|1 юйылған үҙгәртеүҙе|$1 юйылған үҙгәртеүҙе}} ҡарау', 'protect' => 'Һаҡларға', @@ -393,7 +396,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => '{{SITENAME}} тураһында', 'aboutpage' => 'Project:Тасуирлама', -'copyright' => '$1 ярашлы эстәлеге менән һәр кем файҙалана ала.', +'copyright' => '$1 лицензияһына ярашлы, эстәлеге менән һәр кем файҙалана ала (башҡаһы күрһәтелмәһә)', 'copyrightpage' => '{{ns:project}}:Авторлыҡ хоҡуҡтары', 'currentevents' => 'Ағымдағы ваҡиғалар', 'currentevents-url' => 'Project:Ағымдағы ваҡиғалар', @@ -477,6 +480,12 @@ $1', # General errors 'error' => 'Хата', 'databaseerror' => 'Мәғлүмәттәр базаһы хатаһы', +'databaseerror-text' => 'Бирелмәләр базаһында хата киткән. +Был программа тәьминәтендә хата барлығы күрһәткесе булырға мөмкин.', +'databaseerror-textcl' => 'Бирелмәләр базаһында хата бар.', +'databaseerror-query' => 'Һоратыу: $1', +'databaseerror-function' => 'Функция:$1', +'databaseerror-error' => 'Хата: $1', 'laggedslavemode' => "'''Иғтибар:''' биттә һуңғы үҙгәртеүҙәр күрһәтелмәгән булырға мөмкин.", 'readonly' => 'Мәғлүмәттәр базаһы бикләнгән', 'enterlockreason' => 'Ябылыу сәбәбен һәм ваҡытын белдерегеҙ.', @@ -511,6 +520,7 @@ $1', 'cannotdelete-title' => '"$1" битен юйып булмай', 'delete-hook-aborted' => 'Үҙгәртеүҙе махсус-процедура кире ҡаҡты. Өҫтәмә аңлатма килтерелмәй.', +'no-null-revision' => '«$1» бите өсөн яңы нулле төҙәтеү яһап булманы', 'badtitle' => 'Ярамаған исем', 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.', 'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.', @@ -537,6 +547,10 @@ $2', 'namespaceprotected' => '«$1» исем арауығындағы биттәрҙе мөхәррирләү өсөн хоҡуҡтарығыҙ юҡ.', 'customcssprotected' => 'Был CSS-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.', 'customjsprotected' => 'Был JavaScript-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.', +'mycustomcssprotected' => 'Биттең был CSS-ын мөхәррирләргә хоҡуғығыҙ юҡ.', +'mycustomjsprotected' => 'Был биттәге JavaScript-ты мөхәррирләргә хоҡуғығыҙ юҡ.', +'myprivateinfoprotected' => 'Һеҙгә шәхси мәғлүмәттәрегеҙҙе үҙгәртергә рөхсәт юҡ', +'mypreferencesprotected' => 'Һеҙҙең көйләүҙәрегеҙҙе мөхәррирләргә хоҡуғығыҙ юҡ.', 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.', 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған. Белдерелгән сәбәп: ''$2''.", @@ -554,21 +568,26 @@ $2', 'virus-unknownscanner' => 'беленмәгән антивирус:', # Login and logout pages -'logouttext' => "'''Һеҙ иҫәп яҙыуығыҙҙан сыҡтығыҙ.''' +'logouttext' => "'''Һеҙ эш сеансын тамамланығыҙ.''' -Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки [$1 яңынан таныла] алаһығыҙ (үҙ йәки башҡа исем менән). -Ҡайһы бер биттәр һеҙ системала танылған һымаҡ күренергә мөмкин, уны бөтөрөү өсөн браузер кэшын таҙартығыҙ.", +Ҡайһы бер биттәр һеҙ системаға танылмаған кеүек күренеүен дауам итер. Быны бөтөрөү өсөн браузер кэшын таҙартығыҙ.", 'welcomeuser' => 'Рәхим итегеҙ $1!', 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды. Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.', 'yourname' => 'Ҡатнашыусы исеме', 'userlogin-yourname' => 'Ҡулланыусы исеме', +'userlogin-yourname-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ', +'createacct-another-username-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ', 'yourpassword' => 'Серһүҙ', 'userlogin-yourpassword' => 'Серһүҙ', 'userlogin-yourpassword-ph' => 'Яңы серһүҙҙе яҙығыҙ', +'createacct-yourpassword-ph' => 'Серһүҙҙе яҙығыҙ', 'yourpasswordagain' => 'Серһүҙҙе ҡабаттан яҙыу', -'remembermypassword' => 'Был компьютерҙа серһүҙемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)', +'createacct-yourpasswordagain' => 'Серһүҙҙе раҫлағыҙ', +'createacct-yourpasswordagain-ph' => 'Серһүҙҙе тағы бер тапҡыр яҙығыҙ', +'remembermypassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен', 'userlogin-remembermypassword' => 'Системала ҡалырға', +'userlogin-signwithsecure' => 'Һаҡланыулы тоташыу', 'yourdomainname' => 'Һеҙҙең домен', 'password-change-forbidden' => 'Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.', 'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.', @@ -580,19 +599,43 @@ $2', 'logout' => 'Тамамлау', 'userlogout' => 'Тамамлау', 'notloggedin' => 'Танылмағанһығыҙ', +'userlogin-noaccount' => 'Иҫәп яҙмағыҙ юҡмы?', +'userlogin-joinproject' => 'Проектҡа ҡушылырға', 'nologin' => "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.", 'nologinlink' => 'Иҫәп яҙыуын булдырырға', 'createaccount' => 'Яңы ҡатнашыусыны теркәү', 'gotaccount' => "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.", 'gotaccountlink' => 'Үҙегеҙ менән таныштырығыҙ', 'userlogin-resetlink' => 'Танылыу мәғлүмәттәрен оноттоғоҙмо?', -'createaccountmail' => 'эл. почта буйынса', +'userlogin-resetpassword-link' => 'Серһүҙҙе ҡабул итмәү', +'helplogin-url' => 'Help:Системаға танылыу', +'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]Системаға инеүҙә ярҙам', +'userlogin-loggedin' => ' Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.', +'userlogin-createanother' => 'Башҡа иҫәп яҙмаһын булдырырға', +'createacct-join' => 'Аҫта мәғлүмәттәрегеҙҙе яҙығыҙ.', +'createacct-another-join' => 'Аҫта яңы иҫәп яҙмағыҙҙың мәғлүмәттәрен яҙығыҙ.', +'createacct-emailrequired' => 'Электрон почта адресы', +'createacct-emailoptional' => 'Электрон почта адресы (мотлаҡ түгел)', +'createacct-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ', +'createacct-another-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ', +'createaccountmail' => 'Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә', +'createacct-realname' => 'Ысын исемегеҙ (мотлаҡ түгел)', 'createaccountreason' => 'Сәбәп:', +'createacct-reason' => 'Сәбәп', +'createacct-reason-ph' => 'Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?', 'createacct-captcha' => 'Һаҡлылыҡты тикшереү', +'createacct-imgcaptcha-ph' => 'Өҫтәге тексты индерегеҙ', +'createacct-submit' => 'Иҫәп яҙмаһын булдырырға', +'createacct-another-submit' => 'Тағы бер иҫәп яҙмаһын булдырырға', +'createacct-benefit-heading' => '{{SITENAME}} һеҙҙең кеүек үк кешеләр тарафынан булдырылған', +'createacct-benefit-body1' => '{{PLURAL:$1|үҙгәртеү}}', +'createacct-benefit-body2' => '{{PLURAL:$1|мәҡәлә|мәҡәлә|мәҡәләнең}}', +'createacct-benefit-body3' => 'һуңғы ваҡытта {{PLURAL:$1|ҡатнашыусы|}}', 'badretype' => 'Һеҙ кереткән серһүҙҙәр тап килмәй.', 'userexists' => 'Керетелгән исем ҡулланыла инде. Зинһар, башҡа исем һайлағыҙ.', 'loginerror' => 'Танылыу хатаһы', +'createacct-error' => 'Иҫәп яҙмаһын булдырғандағы хата', 'createaccounterror' => 'Иҫәп яҙыуын яһап булмай: $1', 'nocookiesnew' => 'Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.', 'nocookieslogin' => '{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.', @@ -637,21 +680,24 @@ $2', 'cannotchangeemail' => 'Иҫәп яҙыуы электрон почта адрестарын был викила үҙгәртеп булмай.', 'emaildisabled' => 'Был сайт электрон почта хәберҙәрен ебәрә алмай', 'accountcreated' => 'Иҫәп яҙыуы яһалды', -'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.', +'accountcreatedtext' => '[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|msj]]) өсөн иҫәп яҙмаһы булдырылды.', 'createaccount-title' => '{{SITENAME}}: теркәлеү', 'createaccount-text' => 'Кемдер, электрон почта адресығыҙҙы күрһәтеп, {{SITENAME}} ($4) проектында «$3» пароле менән «$2» исемле иҫәп яҙыуы теркәне. Һеҙҙең кереүегеҙ һәм серһүҙегеҙҙе алмаштырыуығыҙ кәрәк. Иҫәп яҙыуы яңылыш яһалһа, был хатҡа иғтибар итмәгеҙ.', 'usernamehasherror' => 'Ҡулланыусы исемендә "#" символы була алмай', -'login-throttled' => 'Һеҙ системала артыҡ күп танылырға тырыштығыҙ. -Зинһар, ҡабатламаҫтан алда бераҙ көтөгөҙ.', +'login-throttled' => 'Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ. +Тағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.', 'login-abort-generic' => 'Танылыу уңышһыҙ тамамланды', 'loginlanguagelabel' => 'Тел: $1', 'suspicious-userlogout' => 'Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.', +'createacct-another-realname-tip' => 'Ысын исемегеҙ (мотлаҡ түгел). +Уны яҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү өсөн ҡулланыласаҡ.', # Email sending 'php-mail-error-unknown' => 'PHP-ның mail() функцияһында билдәһеҙ хата', 'user-mail-no-addy' => 'Электрон почта адресы булмайынса электрон хәбәр ебәреп ҡараны', +'user-mail-no-body' => 'Буш йә мәғәнәһеҙ йөкмәткеле ҡыҫҡа электрон хат ебәрергә тырышҡан.', # Change password dialog 'resetpass' => 'Серһүҙҙе үҙгәртеү', @@ -661,7 +707,7 @@ $2', 'newpassword' => 'Яңы серһүҙ:', 'retypenew' => 'Серһүҙҙе яңынан керетегеҙ:', 'resetpass_submit' => 'Серһүҙ ҡуйырға һәм танышырға', -'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде! Системала танышыу бара...', +'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!', 'resetpass_forbidden' => 'Серһүҙҙе үҙгәртеп булмай', 'resetpass-no-info' => 'Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.', 'resetpass-submit-loggedin' => 'Серһүҙҙе үҙгәртергә', @@ -669,11 +715,15 @@ $2', 'resetpass-wrong-oldpass' => 'Хаталы ваҡытлыса йәки ағымдағы серһүҙ. Һеҙ, бәлки, серһүҙегеҙҙе алмаштырғанһығыҙ йәки яңы серһүҙ һоратҡанһығыҙ.', 'resetpass-temp-password' => 'Ваҡытлыса серһүҙ', +'resetpass-abort-generic' => 'Серһүҙҙе үҙгәртеү киңәйеү тарафынан өҙөлдө.', # Special:PasswordReset 'passwordreset' => 'Серһүҙҙе ташлатыу', +'passwordreset-text-one' => 'Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.', +'passwordreset-text-many' => '{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}', 'passwordreset-legend' => 'Серһүҙҙе ташлатыу', 'passwordreset-disabled' => 'Был викила серһүҙҙе ташлатыу ғәмәлдә түгел', +'passwordreset-emaildisabled' => 'Был викиҙа электрон почта функцияһы һүндерелгән.', 'passwordreset-username' => 'Ҡулланыусы исеме:', 'passwordreset-domain' => 'Домен:', 'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?', @@ -697,9 +747,9 @@ $2 Әгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙеҙҙе ҡулланыуҙы дауам итегеҙ.', 'passwordreset-emailelement' => 'Ҡулланыусы исеме: $1 Ваҡытлыса серһүҙ: $2', -'passwordreset-emailsent' => 'Электрон почта аша иҫләтеү хаты ебәрелде.', -'passwordreset-emailsent-capture' => 'Ебәрелгән хәтерләтеү хәбәре түбәндә күрһәлгән.', -'passwordreset-emailerror-capture' => 'Килеп сыҡҡан хәтерләтеү хәбәре түбәндә күрһәтелгән, тик уны ебәреү уңышһыҙ тамамланды. Сәбәбе:$1', +'passwordreset-emailsent' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.', +'passwordreset-emailsent-capture' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:', +'passwordreset-emailerror-capture' => 'Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1', # Special:ChangeEmail 'changeemail' => 'Электрон почта адресын үҙгәртергә', @@ -713,6 +763,19 @@ $2 'changeemail-submit' => 'Адресты үҙгәртергә', 'changeemail-cancel' => 'Кире алырға', +# Special:ResetTokens +'resettokens' => 'Токендарҙы ташларға', +'resettokens-text' => 'Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ. + +Яңылыштан уларҙы берәйһе менән уртаҡлашҡан йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.', +'resettokens-no-tokens' => 'Ташлар өсөн токендар юҡ.', +'resettokens-legend' => 'Токендарҙы ташларға', +'resettokens-tokens' => 'Токендар:', +'resettokens-token-label' => '$1 (ағымдағы мәғәнә: $2)', +'resettokens-watchlist-token' => ' [[Special:Watchlist|күҙәтеүҙәрегеҙ исемлегендә биттәрҙең үҙгәрештәре]] веб-каналы өсөн токен(Atom/RSS)', +'resettokens-done' => 'Токендар ташланды.', +'resettokens-resetbutton' => 'Һайланған токендарҙы ташларға', + # Edit page toolbar 'bold_sample' => 'Ҡалын яҙылыш', 'bold_tip' => 'Ҡалын яҙылыш', @@ -789,9 +852,9 @@ $2 'loginreqlink' => 'танылыу', 'loginreqpagetext' => 'Башҡа биттәрҙе ҡарау өсөн $1 кәрәк.', 'accmailtitle' => 'Серһүҙ ебәрелде.', -'accmailtext' => "[[User talk:$1|$1]] ҡулланыусыһы өсөн яһалған серһүҙ $2 адресына ебәрелде. +'accmailtext' => "[[User talk:$1|$1]] өсөн осраҡлы яһалған серһүҙ $2 адресына ебәрелде. -Системала танылғандан һуң ''[[Special:ChangePassword|серһүҙегеҙҙе үҙгәртә алаһығыҙ]]''.", +Танылғандан һуң был иҫәп яҙмаһы өсөн серһүҙҙе ''[[Special:ChangePassword|серһүҙҙе үҙгәртеү өсөн махсус биттә үҙгәртә алаһығыҙ]]''.", 'newarticle' => '(Яңы)', 'newarticletext' => "Һеҙ һылтанма буйынса әлегә яһалмаған биткә күстегеҙ. Яңы бит яһар өсөн аҫтағы тәҙрәгә текст керетегеҙ (тулыраҡ мәғлүмәт өсөн [[{{MediaWiki:Helppage}}|ярҙам битен]] ҡарағыҙ). @@ -891,7 +954,7 @@ $2 'nocreate-loggedin' => 'Яңы биттәр яһау хоҡуғығыҙ юҡ.', 'sectioneditnotsupported-title' => 'Бүлектәрҙә мөхәррирләү терәкләнмәй', 'sectioneditnotsupported-text' => 'Был биттә бүлектәрҙе мөхәррирләү терәкләнмәй.', -'permissionserrors' => 'Ирешеү хоҡуҡтары хаталары', +'permissionserrors' => 'Инеү хоҡуғы хатаһы', 'permissionserrorstext' => 'Түбәндәге {{PLURAL:$1|сәбәп|сәбәптәр}} буйынса һеҙҙең был ғәмәлде үтәү хоҡуғығыҙ юҡ:', 'permissionserrorstext-withaction' => "«'''$2'''» ғәмәлен башҡара алмайһығыҙ. {{PLURAL:$1|Сәбәбе|Сәбәптәре}}:", 'recreate-moveddeleted-warn' => "'''Иғтибар: Һеҙ, элек юйылған битте яңынан яһарға теләйһегеҙ.''' @@ -907,6 +970,7 @@ $2 Бәлки ул юйылғандыр.', 'edit-conflict' => 'Төҙәтеүҙәр конфликты', 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.', +'postedit-confirmation' => 'Үҙгәртеүегеҙ һаҡланды.', 'edit-already-exists' => 'Яңы бит яһап булмай. Ул былай ҙа бар.', 'defaultmessagetext' => 'Алдан билдәләнгән яҙма', @@ -949,6 +1013,7 @@ $2 'undo-failure' => 'Ара үҙгәртеүҙәр тура килмәү сәбәпле төҙәтеүҙе кире алып булмай.', 'undo-norev' => 'Үҙгәртеүҙе кире алып булмай, сөнки юҡ йәки юйылған.', 'undo-summary' => '[[Special:Contributions/$2|$2]] ҡулланыусыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу', +'undo-summary-username-hidden' => 'Исеме йәшерелгән ҡатнашыусының төҙәтеүен $1 кире ҡағыу', # Account creation failure 'cantcreateaccounttitle' => 'Иҫәп яҙыуын яһап булмай', @@ -975,8 +1040,8 @@ $3 белдергән сәбәп: ''$2''", Аңлатмалар: '''({{int:cur}})''' — хәҙерге версиянан айырма, '''({{int:last}})''' — алдағы версиянан айырма, '''{{int:minoreditletter}}''' — әҙ үҙгәреш яһалған.", 'history-fieldset-title' => 'Тарихты ҡарарға', 'history-show-deleted' => 'Юйылғандар ғына', -'histfirst' => 'Иң иҫке', -'histlast' => 'Һуңғы', +'histfirst' => 'Иң иҫкеләр', +'histlast' => 'Иң һуңғылар', 'historysize' => '($1 {{PLURAL:$1|байт}})', 'historyempty' => '(буш)', @@ -1128,6 +1193,7 @@ $1", 'compareselectedversions' => 'Һайланған версияларҙы сағыштырыу', 'showhideselectedversions' => 'Һайланған версияларҙы күрһәтергә/йәшерергә', 'editundo' => 'кире алыу', +'diff-empty' => '(айырмалар юҡ)', 'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)', 'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)', 'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|бер өлгөһө|$2 өлгөһө}} табылманы. @@ -1176,7 +1242,7 @@ $1", 'search-interwiki-default' => '$1 һөҙөмтә:', 'search-interwiki-more' => '(тағы)', 'search-relatedarticle' => 'Ҡағылышлы', -'mwsuggest-disable' => 'AJAX-тәҡдимдәрен ябырға', +'mwsuggest-disable' => 'Эҙләү өйрәтмәләрен һүндерергә', 'searcheverything-enable' => 'Бар исем арауыҡтарында эҙләргә', 'searchrelated' => 'ҡағылышлы', 'searchall' => 'барыһы', @@ -1197,6 +1263,7 @@ $1", 'searchdisabled' => '{{SITENAME}} эҙләүе ябыҡ. Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ. Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.', +'search-error' => 'Эҙләүҙә хата китте: $1', # Preferences page 'preferences' => 'Көйләүҙәр', @@ -1228,7 +1295,7 @@ $1", 'prefs-rendering' => 'Күренеш', 'saveprefs' => 'Һаҡларға', 'resetprefs' => 'Һаҡланмаған үҙгәрештерҙе таҙартырға', -'restoreprefs' => 'Ғәҙәттәге бар көйләүҙәргә ҡайтырға', +'restoreprefs' => 'Алдан ҡуйылған көйләүҙәрҙе тергеҙергә', 'prefs-editing' => 'Мөхәррирләү', 'rows' => 'Юлдар:', 'columns' => 'Бағаналар:', @@ -1240,6 +1307,8 @@ $1", 'recentchangesdays-max' => 'Иң күбендә $1 {{PLURAL:$1|көн}}', 'recentchangescount' => 'Ғәҙәттә күрһәтелгән үҙгәртеүҙәр һаны:', 'prefs-help-recentchangescount' => 'Һуңғы үҙгәртеүҙәрҙе, биттәр тарихын, журналдарҙы үҙ эсенә ала.', +'prefs-help-watchlist-token2' => 'Был - күҙәтеүҙәрегеҙ исемлегенең веб-каналы өсөн йәшерен асҡыс. +Уны белеүселәр күҙәтеүҙәрегеҙ исемлеген уҡый аласаҡ, шуға уны бер кемгә лә әйтмәгеҙ. [[Special:ResetTokens|Уны ташларға теләһәгеҙ, ошонда баҫығыҙ]].', 'savedprefs' => 'Һеҙҙең көйләүҙәрегеҙ һаҡланды.', 'timezonelegend' => 'Ваҡыт бүлкәте:', 'localtime' => 'Урындағы ваҡыт:', @@ -1283,12 +1352,13 @@ $1", 'prefs-help-signature' => 'Әңгәмә биттәрендәге хәбәрҙәрегеҙ һеҙҙең имзағыҙға һәм ваҡытҡа әйләнәсәк "~~~~" тамғаларын өҫтәү юлы менән имзаланырға тейеш.', 'badsig' => 'Хаталы имза. HTML-тегдарҙың дөрөҫлөгөн тикшерегеҙ.', 'badsiglength' => 'Бигерәк оҙон имза. Имза оҙонлоғо $1 {{PLURAL:$1|символдан}} артыҡ булмаҫҡа тейеш.', -'yourgender' => 'Зат:', -'gender-unknown' => 'күрһәтелмәгән', -'gender-male' => 'Ир-егет', -'gender-female' => 'Ҡатын-ҡыҙ', -'prefs-help-gender' => 'Теләк буйынса: ҡатнашыусының затына бәйле ҡайһы бер программа хәбәрҙәрендә ҡулланыла. -Был дөйөм мәғлүмәт буласаҡ.', +'yourgender' => 'Ҡайһы тасуирлама һеҙгә ҡулайыраҡ?', +'gender-unknown' => 'Күрһәткем килмәй', +'gender-male' => 'Ул вики биттәрен мөхәррирләй', +'gender-female' => 'Ул вики биттәрен мөхәррирләй', +'prefs-help-gender' => 'Был көйләүҙе ҡуйыу мотлаҡ түгел. +Программа тәьминәте был мәғлүмәтте һеҙгә грамматика йәһәтенән дөрөҫ мөрәжәғәт итеү өсөн ҡулланасаҡ. +Был мәғлүмәт бөтәһенә лә күренәсәк.', 'email' => 'Электрон почта', 'prefs-help-realname' => 'Ысын исемегеҙ (теләк буйынса). Әгәр уны күрһәтһәгеҙ, битте кемдең төҙәткәнен күрһәткәндә ҡулланыласаҡ.', @@ -1302,7 +1372,9 @@ $1", 'prefs-signature' => 'Имза', 'prefs-dateformat' => 'Ваҡыт форматы', 'prefs-timeoffset' => 'Ваҡыт күсереү:', -'prefs-advancedediting' => 'Киңәйтелгән көйләүҙәр', +'prefs-advancedediting' => 'Дөйөм көйләүҙәр', +'prefs-editor' => 'мөхәррир', +'prefs-preview' => 'алдан байҡау', 'prefs-advancedrc' => 'Киңәйтелгән көйләүҙәр', 'prefs-advancedrendering' => 'Киңәйтелгән көйләүҙәр', 'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүҙәр', @@ -1311,6 +1383,7 @@ $1", 'prefs-displaysearchoptions' => 'Күренеш көйләүҙәре', 'prefs-displaywatchlist' => 'Күренеш көйләүҙәре', 'prefs-diffs' => 'Айырмалар', +'prefs-help-prefershttps' => 'Был көйләү системаға киләһе танылыуҙан һуң ҡулланыласаҡ.', # User preference: email validation using jQuery 'email-address-validity-valid' => 'E-mail адрес дөрөҫ булғанға оҡшаған', @@ -1334,9 +1407,11 @@ $1", 'userrights-no-interwiki' => 'Һеҙҙең башҡа вики-проекттарҙа ҡатнашыусыларҙың хоҡуҡтарын үҙгәртергә хоҡуҡтарығыҙ юҡ.', 'userrights-nodatabase' => '$1 базаһы юҡ йәки урындағы (локаль) база түгел.', 'userrights-nologin' => 'Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хаким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.', -'userrights-notallowed' => 'Һеҙҙең иҫәп яҙыуығыҙҙан ҡатнашыусыларҙың хоҡуҡтарын өҫтәү йәки алыу рөхсәт ителмәгән.', +'userrights-notallowed' => 'Һеҙгә ҡатнашыусыларҙың хоҡуҡтарын өҫтәргә йәки юҡ итергә рөхсәт ителмәгән.', 'userrights-changeable-col' => 'Һеҙ үҙгәртә алған төркөмдәр', 'userrights-unchangeable-col' => 'Һеҙ үҙгәртә алмаған төркөмдәр', +'userrights-conflict' => 'Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.', +'userrights-removed-self' => 'Һеҙ үҙ хоҡуҡтарығыҙҙы уңышлы юҡ иттегеҙ. Шулай итеп, был биткә башҡаса инә алмаясаҡһығыҙ.', # Groups 'group' => 'Төркөм:', @@ -1380,7 +1455,7 @@ $1", 'right-reupload-shared' => 'Дөйөм һаҡлағыстағы файлды урындағы (локаль) файл менән алыштырыу', 'right-upload_by_url' => 'Файлдарҙы URL адрестан күсереү', 'right-purge' => 'Биттәрҙең кэшын раҫлауһыҙ юйыу', -'right-autoconfirmed' => 'Үҙгәртеүҙән ярым-һаҡланған биттәрҙе мөхәррирләү', +'right-autoconfirmed' => 'IP-адресҡа тиҙлек сикләүе юҡ', 'right-bot' => 'Үҙенән-үҙе башҡарыла торған эш тип иҫәпләнеү', 'right-nominornewtalk' => 'Фекер алышыу битендә кереткән әҙ үҙгәрештәр яңы хәбәр тураһында белдереү булдырмай', 'right-apihighlimits' => 'API-һорауҙарҙы башҡарыуға сикләүҙәр аҙыраҡ', @@ -1400,13 +1475,22 @@ $1", 'right-hideuser' => 'Ҡатнашыусы исемен тыйыу һәм йәшереү', 'right-ipblock-exempt' => 'IP адрестарҙы бикләүҙе, авто-бикләүҙәрҙе, арауыҡтарҙы бикләүҙе урап үтеү', 'right-proxyunbannable' => 'Прокси серверҙарҙы авто-бикләүҙе урап үтеү', -'right-unblockself' => 'Үҙҙәренең биген асыу', -'right-protect' => 'Биттәрҙең һаҡланыу дәрәжәһен үҙгәртеү һәм һаҡланған биттәрҙе мөхәррирләү', -'right-editprotected' => 'Һаҡланған биттәрҙе мөхәррирләү(эҙмә-эҙлекле һаҡлауһыҙ)', +'right-unblockself' => 'Үҙ бигеңде асырға', +'right-protect' => 'Биттәрҙең һаҡланыу кимәлен үҙгәртеү һәм баҫҡыслап һаҡланған биттәрҙе төҙәтеү', +'right-editprotected' => '"{{int:protect-level-sysop}}" булараҡ һаҡланған биттәрҙе төҙәтеү', +'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" булараҡ һаҡланған биттәрҙе төҙәтеү', 'right-editinterface' => 'Ҡулланыусы интерфейсын үҙгәртеү', 'right-editusercssjs' => 'Башҡа ҡатнашыусыларҙың CSS һәм JS файлдарын мөхәррирләү', 'right-editusercss' => 'Башҡа ҡатнашыусыларҙың CSS файлдарын мөхәррирләү', 'right-edituserjs' => 'Башҡа ҡатнашыусыларҙың JS файлдарын мөхәррирләү', +'right-editmyusercss' => 'Файҙаланыусының CSS файлдарын мөхәррирләү', +'right-editmyuserjs' => 'Үҙеңдең файҙаланыуҙағы JavaScript-файлдарын мөхәррирләргә', +'right-viewmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген ҡарарға', +'right-editmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген мөхәррирләргә. +Ҡайһы бер ғәмәлдәрҙең, быға хоҡуғы булмаһа ла, биттәр өҫтәүенә иғтибар итегеҙ.', +'right-viewmyprivateinfo' => 'Үҙеңдең шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) байҡау', +'right-editmyprivateinfo' => 'Үҙ шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) төҙәтеү', +'right-editmyoptions' => 'Үҙ өҫтөнлөктәреңде мөхәррирләргә', 'right-rollback' => 'Ниндәйҙер битте мөхәррирләгән һуңғы ҡатнашыусының үҙгәртеүҙәрен тиҙ кире алыу', 'right-markbotedits' => 'Кире алынған үҙгәртеүҙәрҙе бот үҙгәртеүе тип билдәләү', 'right-noratelimit' => 'Тиҙлек сикләнмәгән', @@ -1458,8 +1542,8 @@ $1", 'action-block' => 'Был ҡатнашыусыға мөхәррирләүҙе тыйыу', 'action-protect' => 'Был биттең һаҡланыу дәрәжәһен үҙгәртеү', 'action-rollback' => 'битте мөхәррирләгән һуңғы ҡатнашыусының үҙгәртеүҙәрен тиҙ кире алыу', -'action-import' => 'Был битте башҡа вики-проекттан күсереү', -'action-importupload' => 'Был битте файл күсереү аша тейәү', +'action-import' => 'башҡа вики-проекттан биттәрҙе күсереү', +'action-importupload' => 'тейәлгән файлдан биттәрҙе күсереү', 'action-patrol' => 'Башҡаларҙың үҙгәртеүҙәрен тикшерелгән тип билдәләү', 'action-autopatrol' => 'Үҙ үҙгәртеүҙәрен тикшерелгән тип билдәләү', 'action-unwatchedpages' => 'Күҙәтелмәгән биттәр исемлеген ҡарау', @@ -1468,12 +1552,19 @@ $1", 'action-userrights-interwiki' => 'Ҡатнашыусыларҙың башҡа Викиларҙағы хоҡуҡтарын үҙгәртеү', 'action-siteadmin' => 'Мәғлүмәттәр базаһын асыу һәм ябыу', 'action-sendemail' => 'электрон хат ебәреү', +'action-editmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемелеген мөхәррирләү', +'action-viewmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемлеген байҡау', +'action-viewmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте байҡау', +'action-editmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте мөхәррирләү', # Recent changes 'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}', +'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}', +'enhancedrc-history' => 'тарих', 'recentchanges' => 'Һуңғы үҙгәртеүҙәр', 'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре', 'recentchanges-summary' => 'Төрлө биттәрҙә эшләнгән һуңғы үҙгәртеүҙәр исемлеге', +'recentchanges-noresult' => 'Был осорҙа тейешле шарттарға тап килгән үҙгәрештәр юҡ.', 'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға', 'recentchanges-label-newpage' => 'Был үҙгәртеү яңы бит яһаны', 'recentchanges-label-minor' => 'Был әҙ үҙгәреш', @@ -1501,7 +1592,7 @@ $1", 'rc_categories_any' => 'Һәр', 'rc-change-size-new' => 'Үҙгәртештән һуң $1 {{PLURAL:$1|байт|байт}}', 'newsectionsummary' => '/* $1 */ яңы бүлек', -'rc-enhanced-expand' => 'Ваҡлыҡтарҙы күрһәтергә (JavaScript кәрәкле)', +'rc-enhanced-expand' => 'Ваҡ-төйәгенә тиклем күрһәтергә', 'rc-enhanced-hide' => 'Ваҡлыҡтарҙы йәшерергә', 'rc-old-title' => 'төп нөхсә исеме "$1"', @@ -1521,7 +1612,7 @@ $1", 'reuploaddesc' => 'Тейәү формаһына кире ҡайтырға', 'upload-tryagain' => 'Файлдың үҙгәртелгән тасуирламаһын ебәрергә', 'uploadnologin' => 'Танылмағанһығыҙ', -'uploadnologintext' => 'Файлдар тейәү өсөн, һеҙгә [[Special:UserLogin|танылырға]] кәрәк.', +'uploadnologintext' => 'Серверға файлдар тейәү өсөн һеҙ тейешһегеҙ $1', 'upload_directory_missing' => 'Тейәү өсөн директория ($1) юҡ йәки веб-сервер уны булдыра алмай.', 'upload_directory_read_only' => 'Тейәү өсөн директорияға ($1) веб-сервер яҙҙыра алмай.', 'uploaderror' => 'Тейәү хатаһы', @@ -1760,8 +1851,7 @@ $1', 'upload_source_file' => '(һеҙҙең компьютерҙағы файл)', # Special:ListFiles -'listfiles-summary' => 'Был махсус бит бөтә тейәлгән файлдарҙы күрһәтә. -Ҡулланыусыға күрә һайланһа, был ҡулланыусының һуңғы файл өҫтәүҙәре генә күрһәтелә.', +'listfiles-summary' => 'Был ярҙамсы бит бөтә тейәлгән файлдарҙы күрһәтә.', 'listfiles_search_for' => 'Файл исеме буйынса эҙләү:', 'imgfile' => 'файл', 'listfiles' => 'Файлдар исемлеге', @@ -1772,6 +1862,10 @@ $1', 'listfiles_size' => 'Күләм', 'listfiles_description' => 'Тасуирлау', 'listfiles_count' => 'Версиялар', +'listfiles-show-all' => 'Рәсемдәрҙең иҫке версияларын индерергә', +'listfiles-latestversion' => 'Ағымдағы версия', +'listfiles-latestversion-yes' => 'Эйе', +'listfiles-latestversion-no' => 'Юҡ', # File description page 'file-anchor-link' => 'Файл', @@ -1868,6 +1962,13 @@ $1', 'randompage' => 'Осраҡлы мәҡәлә', 'randompage-nopages' => 'Түбәндәге {{PLURAL:$2|исемдәр арауығында|исемдәр арауыҡтарында}} биттәр юҡ: $1.', +# Random page in category +'randomincategory' => 'Категориялағы осраҡлы бит', +'randomincategory-invalidcategory' => '$1 тигән категория юҡ.', +'randomincategory-nopages' => '[[:Category:$1|$1]] категорияһында биттәр юҡ.', +'randomincategory-selectcategory' => '$1 $2 категорияһынан осраҡлы биткә күсергә.', +'randomincategory-selectcategory-submit' => 'Күсергә', + # Random redirect 'randomredirect' => 'Осраҡлы биткә күсеү', 'randomredirect-nopages' => '"$1" исемдәр арауығында йүнәлтеүҙәр юҡ.', @@ -1893,6 +1994,14 @@ $1', 'statistics-users-active-desc' => 'Һуңғы {{PLURAL:$1|көндә|$1 көндә}} ниндәйҙер эшмәкәрлек башҡарған ҡатнашыусылар', 'statistics-mostpopular' => 'Иң күп ҡаралған биттәр', +'pageswithprop' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр', +'pageswithprop-legend' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр', +'pageswithprop-text' => 'Бында айырым үҙенсәлектәре ҡулдан яңыртып билдәләнгән биттәр һанала.', +'pageswithprop-prop' => 'Үҙенсәлектең атамаһы:', +'pageswithprop-submit' => 'Табырға', +'pageswithprop-prophidden-long' => 'Текст үҙенсәлегенең оҙон мәғәнәһе йәшерелгән ($1)', +'pageswithprop-prophidden-binary' => 'ике тармаҡлы үҙенсәлектең мәғәнәһе йәшерелгән ($1)', + 'doubleredirects' => 'Икеле йүнәлтеүҙәр', 'doubleredirectstext' => 'Был биттә икенсе йүнәлтеү биттәренә йүнәлткән биттәр исемлеге килтерелгән. Һәр юл беренсе һәм икенсе йүнәлтеүгә һылтанманан, шулай уҡ икенсе һылтанма йүнәлткән һәм беренсе йүнәлтмә һылтанма яһарға тейеш булған биттән тора. @@ -1950,6 +2059,7 @@ $1', 'mostrevisions' => 'Иң күп үҙгәртеү яһалған биттәр', 'prefixindex' => 'Исемдәре башында ҡушымта торған биттәр', 'prefixindex-namespace' => 'Префикслы бар биттәр ( $1 исемдәр арауығы)', +'prefixindex-strip' => 'Һөҙөмтәләр исемлегендә префиксты йәшерергә', 'shortpages' => 'Ҡыҫҡа биттәр', 'longpages' => 'Оҙон биттәр', 'deadendpages' => 'Көрсөк биттәр', @@ -1965,6 +2075,7 @@ $1', 'listusers' => 'Ҡатнашыусылар исемлеге', 'listusers-editsonly' => 'Кәмендә бер үҙгәртеү индергән ҡатнашыусыларҙы ғына күрһәтергә', 'listusers-creationsort' => 'Булдырыу көнө буйынса тәртипкә килтерергә', +'listusers-desc' => 'Кәмеү буйынса айырырға', 'usereditcount' => '$1 {{PLURAL:$1|үҙгәртеү}}', 'usercreated' => '$3 ҡулланыусыһының теркәлеү ваҡыты: $1 $2', 'newpages' => 'Яңы биттәр', @@ -2045,8 +2156,8 @@ $1', 'linksearch-ns' => 'Исемдәр арауығы:', 'linksearch-ok' => 'Эҙләү', 'linksearch-text' => '*.wikipedia.org һымаҡ төркөм билдәләрен ҡулланырға була. -Кәмендә, өҫкө кимәл домен кәрәк. Мәҫәлән, *.org
      -Мөмкин булған протоколдар: $1 (бер протокол да күрһәтелмәһә, http:// ҡулланыла)', +Кәмендә өҫкө кимәл домен кәрәк, мәҫәлән, *.org
      +Мөмкин булған{{PLURAL:$2|протокол|протоколдар}}: $1 (башҡа протокол өҫтәлмәһә, алдан бирелгәне индерелә http://).', 'linksearch-line' => '$1 адресына $2 битенән һылтанма яһалған', 'linksearch-error' => 'Төркөм билдәләре URL адрестың башында ғына ҡулланыла ала.', @@ -2059,7 +2170,7 @@ $1', # Special:ActiveUsers 'activeusers' => 'Әүҙем ҡатнашыусылар исемлеге', 'activeusers-intro' => 'Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.', -'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендә $1 {{PLURAL:$1|үҙгәртеү}}', +'activeusers-count' => 'һуңғы $3 {{PLURAL:$3|көн}} эсендәге һуңғы көндә $1 {{PLURAL:$1|үҙгәртеү}}', 'activeusers-from' => 'Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:', 'activeusers-hidebots' => 'Боттарҙы йәшерергә', 'activeusers-hidesysops' => 'Хакимдәрҙе йәшерергә', @@ -2069,7 +2180,8 @@ $1', 'listgrouprights' => 'Ҡатнашыусылар төркөмө хоҡуҡтары', 'listgrouprights-summary' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыусы төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән. Шәхси хоҡуҡтар тураһында [[{{MediaWiki:Listgrouprights-helppage}}|өҫтәмә мәғлүмәт]] булыуы мөмкин.', -'listgrouprights-key' => '* Бирелгән хоҡуҡтар +'listgrouprights-key' => 'Легенда: +* Бирелгән хоҡуҡтар * Алынған хоҡуҡтар', 'listgrouprights-group' => 'Төркөм', 'listgrouprights-rights' => 'Хоҡуҡтар', @@ -2140,8 +2252,8 @@ $1', 'unwatchthispage' => 'Күҙәтеүҙе туҡтатырға', 'notanarticle' => 'Мәҡәлә түгел', 'notvisiblerev' => 'Башҡа ҡатнашыусы тарафынан керетелгән һуңғы өлгө юйылған', -'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит|$1 бит}} бар.', -'wlheader-enotif' => 'Электрон почта аша белдереү һайланған', +'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит}} бар.', +'wlheader-enotif' => 'Электрон почта аша белдереү индерелгән.', 'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.", 'watchmethod-recent' => 'күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау', 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау', @@ -2226,9 +2338,11 @@ $UNWATCHURL 'deleteotherreason' => 'Башҡа/өҫтәмә сәбәп:', 'deletereasonotherlist' => 'Башҡа сәбәп', 'deletereason-dropdown' => '* Ғәҙәттәге юйыу сәбәптәре -** Автор һорауы буйынса -** Авторлыҡ хоҡуҡтарын боҙоу -** Вандаллыҡ', +**спам +**емереү +**авторлыҡ хоҡуҡтарын боҙоу +**автор үтенесе буйынса +**эшләмәгән ҡайтанан йүнәлтеү', 'delete-edit-reasonlist' => 'Сәбәптәр исемлеген мөхәррирләргә', 'delete-toobig' => 'Был биттең үҙгәртеүҙәр тарихы бик оҙон, $1 {{PLURAL:$1|өлгөнән}} күберәк. {{SITENAME}} проектының эшмәкәрлеге боҙолмауы маҡсатында бындай биттәрҙе юйыу тыйылған.', @@ -2248,7 +2362,7 @@ $UNWATCHURL Һуңғы үҙгәртеүҙәрҙе [[User:$3|$3]] ([[User talk:$3| фекер алышыу]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) кереткән.', 'editcomment' => "Үҙгәртеүҙең тасуирламаһы \"''\$1''\" ине.", 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|фекер алышыу]]) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды', -'revertpage-nouser' => '(Ҡатнашыусының исеме юйылған) уҙгәртеүҙәре [[User:$1|$1]] өлгөһөнә ҡайтарылды', +'revertpage-nouser' => '(Ҡатнашыусының исеме йәшерелгән) үҙгәртеүҙәре {{GENDER:$1|[[User:$1|$1]]}}өлгөһөнә ҡайтарылды', 'rollback-success' => '$1 уҙгәртеүҙәре кире алдынды; $2 өлгөһөнә ҡайтыу.', @@ -2271,6 +2385,8 @@ $2 өлгөһөнә ҡайтыу.', 'prot_1movedto2' => '[[$1]] битенең исемен [[$2]] тип үҙгәрткән', 'protect-badnamespace-title' => 'Һаҡланмаған исемдәр арауығы', 'protect-badnamespace-text' => 'Был исемдәр арауығындағы биттәрҙе һаҡлап булмай.', +'protect-norestrictiontypes-text' => 'Был бит һаҡлана алмай, сөнки уға сикләүҙәрҙең рөхсәт ителгән төрҙәре юҡ.', +'protect-norestrictiontypes-title' => 'Һаҡланмаған бит', 'protect-legend' => 'Битте һаҡлауҙы раҫлау', 'protectcomment' => 'Сәбәп:', 'protectexpiry' => 'Тамамлана:', @@ -2285,8 +2401,8 @@ $2 өлгөһөнә ҡайтыу.', 'protect-locked-access' => "Биттең һаҡлау дәрәжеһен үҙгәртер өсөн иҫәп яҙыуығыҙҙың хоҡуҡтары етәрле түгел. '''$1''' битенең хәҙерге һаҡлау көйләүҙәре:", 'protect-cascadeon' => 'Был бит һаҡланған, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|биткә|биттәргә}} керә. Һеҙ был биттең һаҡлау дәрәжәһен үҙгәртә алаһығыҙ, ләкин был эҙмә-эҙлекле һаҡлауға йоғонто яһамаясаҡ.', 'protect-default' => 'Бар ҡулланыусыларға рөхсәт бирергә', -'protect-fallback' => '«$1» рөхсәте кәрәк', -'protect-level-autoconfirmed' => 'Яңы һәм теркәлмәгән ҡулланыусыларҙан һаҡларға', +'protect-fallback' => '«$1» хоҡуҡлы ҡатнашыусыларға ғына рөхсәте ителгән', +'protect-level-autoconfirmed' => 'Үҙенән-үҙе раҫланған ҡатнашыусыларға ғына рөхсәт ителгән', 'protect-level-sysop' => 'Хакимдәр генә', 'protect-summary-cascade' => 'эҙмә-эҙлекле', 'protect-expiring' => '$1 бөтә (UTC)', @@ -2390,9 +2506,9 @@ $1', 'contributions' => '{{GENDER:$1|Ҡатнашыусы}} өлөшө', 'contributions-title' => '$1 исемле ҡулланыусының кереткән өлөшө', 'mycontris' => 'Өлөш', -'contribsub2' => '$1 ($2) өсөн', +'contribsub2' => '{{GENDER:$3|$1}} өлөшө ($2)', 'nocontribs' => 'Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.', -'uctop' => '(аҙаҡҡы)', +'uctop' => '(ағымдағы)', 'month' => 'Айҙан башлап (һәм элегерәк):', 'year' => 'Йылдан башлап (һәм элегерәк):', @@ -2551,15 +2667,13 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"', Әммә ул $2 бикләү арауығына керә һәм был арауыҡтың биге алына ала.', 'ip_range_invalid' => 'IP адрестар арауығы дөрөҫ түгел.', 'ip_range_toolarge' => '/$1 арауығынан ҙурыраҡ адрестар арауығын бикләү рөхсәт ителмәй.', -'blockme' => 'Мине биклә', 'proxyblocker' => 'Проксины бикләү', -'proxyblocker-disabled' => 'Был мөмкинлек һүндерелгән.', 'proxyblockreason' => 'Һеҙҙең IP адресығыҙ бикләнгән, сөнки ул — асыҡ прокси. Зинһар, Интернет менән тәъмин итеүсегеҙгә йәки ярҙам хеҙмәтенә мөрәжәғәт итегеҙ һәм уларға был едти хәүефһеҙлек хатаһы тураһында хәбәр итегеҙ.', -'proxyblocksuccess' => 'Үтәлде', 'sorbsreason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә.', 'sorbs_create_account_reason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә. Һеҙ иҫәп яҙмаһы булдыра алмайһығыҙ.', +'xffblockreason' => 'X-Forwarded-For атамаһы эсенә ингән һәм һеҙҙекеме, һеҙ ҡулланған прокси-серверҙыҡымы булған IP-адрес бикләнде. Бикләүҙең тәүсәбәбе ошо ине: $1', 'cant-block-while-blocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыусыларҙы бикләй алмайһығыҙ.', 'cant-see-hidden-user' => 'Һеҙ бикләргә тырышҡан ҡатнашыусы әлеге ваҡытта бикләнгән һәм йәшерелгән. Ҡатнашыусыларҙы йәшереү хоҡуғығыҙ булмағанға күрә, һеҙ был бикләүҙе ҡарай йәки үҙгәртә алмайһығыҙ.', @@ -2591,18 +2705,18 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"', # Move page 'move-page' => '$1 — исемен үҙгәртеү', 'move-page-legend' => 'Биттең исемен үҙгәртеү', -'movepagetext' => "Аҫтағы форманы ҡулланыу биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр яҙмаһын яңы урынға күсерә. +'movepagetext' => "Аҫтағы ҡалыпты ҡулланып, биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр журналын яңы урынға күсерә алаһығыҙ. Биттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ. -Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыз. -Әгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәрҙе]] тикшерегеҙ. -Һылтанмаларҙың кәрәкле урынға күрһәтеүҙәренең дауам итеүе өсөн һеҙ яуаплы. +Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыҙ. +Әгәр быны эшләмәһәгеҙ, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өҙөлгән йүнәлтеүҙәр]] барлығын тикшерегеҙ. +Һылтанмаларҙың кәрәкле урынға күрһәтеүен дауам итеүе өсөн һеҙ яуаплы. -Иғтибар итегеҙ, әгәр яңы исемле бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; элекке бит йүнәлтеү, буш һәм үҙгәртеү тарихына эйә булмаған осраҡтарҙан башҡа. -Был шуны аңлата: бит исемен яңылыш үҙгәртһәгеҙ, битте кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ. +Иғтибар итегеҙ: әгәр яңы һайланған исемдәге тағы бер бит бар икән, биттең исеме '''үҙгәртелмәйәсәк'''; ул бит йүнәлтеүсе йәки буш булһа һәм төҙәтеүҙәр тарихына эйә булмаһа ғына, был мөмкин. +Тимәк, биттең исемен яңылыш үҙгәртһәгеҙ, битте элекке исеменә кире ҡайтара алаһығыҙ, ләкин булған битте юя алмайһығыҙ. -'''Иғтибар!''' -Популяр биттәрҙең исемен үҙгәртеү көтмәгән һөҙөмтәләргә килтерергә мөмкин. -Дауам итерҙән алда, бөтә буласаҡ һөҙөмтәләрҙе аңлауығыҙҙы уйлағыҙ.", +'''Иҫкәртеү!''' +\"Популяр\" биттәрҙең исемен үҙгәртеү күләмле һәм көтөлмәгән һөҙөмтәләргә килтерергә мөмкин. +Дауам итерҙән алда, ихтимал булған һөҙөмтәләрҙе аңлауығыҙға ышанығыҙ.", 'movepagetext-noredirectfixer' => "Аҫтағы форманы ҡулланыу биттең исемен үҙгәртә һәм уның үҙгәртеүҙәр яҙмаһын яңы урынға күсерә. Биттең элекке исеме яңы биткә йүнәлтеү булып ҡаласаҡ. Һеҙ элекке исемгә булған йүнәлтеүҙәрҙе автоматик рәүештә яңы исемгә күсерә алаһығыз. @@ -2721,6 +2835,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"', 'thumbnail-more' => 'Ҙурайтырға', 'filemissing' => 'Файл юҡ', 'thumbnail_error' => 'Шартлы рәсем булдырыу хатаһы: $1', +'thumbnail_error_remote' => '$1 хата тураһында хәбәр итә: +$2', 'djvu_page_error' => 'DjVu битенең һаны биттәр һанынан ашҡан', 'djvu_no_xml' => 'DjVu файлы өсөн XML сығарып булмай', 'thumbnail-temp-create' => 'Эскиздың ваҡытлыса файлын яһап булмай', @@ -2897,6 +3013,8 @@ The wiki server cannot provide data in a format your client can read.', 'spam_reverting' => '$1 һылтанмаһыҙ һуңғы өлгөгә ҡайтарыу', 'spam_blanking' => 'Бөтә өлгөләрҙә лә $1 һылтанмаһы бар, таҙартыу', 'spam_deleting' => 'Бөтә өлгөләрҙә лә $1 һылтанма бар, таҙартыу бара', +'simpleantispam-label' => "Спамға ҡаршы тикшереү. +Быны '''ТУЛТЫРМАҒЫҘ'''!", # Info page 'pageinfo-title' => '«$1» буйынса мәғлүмәт', @@ -2910,12 +3028,13 @@ The wiki server cannot provide data in a format your client can read.', 'pageinfo-length' => 'Бит оҙонлоғо (байттарҙа)', 'pageinfo-article-id' => 'Бит идентификаторы', 'pageinfo-language' => 'Бит эстәлегенең теле', -'pageinfo-robot-policy' => 'Эҙләү хеҙмәттәре статусы', -'pageinfo-robot-index' => 'Индекслана', -'pageinfo-robot-noindex' => 'Индексланмай', +'pageinfo-robot-policy' => 'Эҙләү роботтары тарафынан индексацияланыу', +'pageinfo-robot-index' => 'Рөхсәт ителгән', +'pageinfo-robot-noindex' => 'Рөхсәт ителмәй', 'pageinfo-views' => 'Ҡарау һаны', 'pageinfo-watchers' => 'Битте күҙәтеүселәр һаны', -'pageinfo-redirects-name' => 'Был биткә йүнәлтеүҙәр', +'pageinfo-few-watchers' => 'Күп тигәндә $1 {{PLURAL:$1|күҙәтеүсе}}', +'pageinfo-redirects-name' => 'Был биткә йүнәлтеүҙәр һаны', 'pageinfo-subpages-name' => 'Был биттең эске биттәре', 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|йүнәлтеү}}; $3 {{PLURAL:$3|ябай}})', 'pageinfo-firstuser' => 'Битте яһаусы', @@ -2929,6 +3048,7 @@ The wiki server cannot provide data in a format your client can read.', 'pageinfo-magic-words' => 'Тылсымлы {{PLURAL:$1|һүҙ|һүҙҙәр}} ($1)', 'pageinfo-hidden-categories' => 'Йәшерен {{PLURAL:$1|категория|категориялар}} ($1)', 'pageinfo-templates' => 'Ҡулланылған {{PLURAL:$1|ҡалып|ҡалыптар}} ($1)', +'pageinfo-transclusions' => '{{PLURAL:$1|Индерелгән биттәр}} ($1)', 'pageinfo-toolboxlink' => 'Бит мәғлүмәттәре', 'pageinfo-redirectsto' => 'Йүнәлтеү', 'pageinfo-redirectsto-info' => 'мәғлүмәт', @@ -2937,6 +3057,10 @@ The wiki server cannot provide data in a format your client can read.', 'pageinfo-protect-cascading' => 'Бынан башлап һикәлтәле һаҡлау', 'pageinfo-protect-cascading-yes' => 'Эйе', 'pageinfo-protect-cascading-from' => 'Бынан башлап һикәлтәле һаҡлау', +'pageinfo-category-info' => 'Категория тураһында мәғлүмәт', +'pageinfo-category-pages' => 'Биттәр һаны', +'pageinfo-category-subcats' => 'Категория бүлемдәре һаны', +'pageinfo-category-files' => 'Файлдар һаны', # Skin names 'skinname-cologneblue' => 'Кёльн һағышы', @@ -3019,9 +3143,25 @@ $1', 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}', 'hours' => '{{PLURAL:$1|$1 сәғәт|$1 сәғәт}}', 'days' => '{{PLURAL:$1|$1 көн|$1 көн}}', +'weeks' => '{{PLURAL:$1|$1 аҙна|$1 аҙна|}}', +'months' => '{{PLURAL:$1|$1 ай}}', +'years' => '{{PLURAL:$1|$1 йыл}}', 'ago' => '$1 элек', 'just-now' => 'яңы ғына', +# Human-readable timestamps +'hours-ago' => '$1 {{PLURAL:$1|сәғәт}} элек', +'minutes-ago' => '$1 {{PLURAL:$1|минут}} элек', +'seconds-ago' => '$1 {{PLURAL:$1|секунд}} элек', +'monday-at' => 'дүшәмбе $1', +'tuesday-at' => 'шишәмбе $1', +'wednesday-at' => 'шаршамбы $1', +'thursday-at' => 'кесе йома $1', +'friday-at' => 'йома $1', +'saturday-at' => 'шәмбе $1', +'sunday-at' => 'йәкшәмбе $1', +'yesterday-at' => 'Кисә $1', + # Bad image list 'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш: @@ -3234,7 +3374,7 @@ $1', 'exif-compression-4' => 'CCITT Group 4, факслы кодлау', 'exif-copyrighted-true' => 'Авторлыҡ хоҡуҡтары менән һаҡлана', -'exif-copyrighted-false' => 'Дөйөм милек', +'exif-copyrighted-false' => 'Авторлыҡ-хоҡуҡи статус индерелмәгән', 'exif-unknowndate' => 'Билдәһеҙ көн', @@ -3498,11 +3638,10 @@ $3 $5 Был раҫлау коды $4 ғәмәлдән сыға.', -'confirmemail_body_set' => 'Кемдер, бәлки һеҙҙер, $1 IP адресынан -{{SITENAME}} проектында "$2" иҫәп яҙмаһының электрон почта адресын ошо адрес итеп билдәләгән. +'confirmemail_body_set' => 'Кемдер (бәлки, һеҙҙер) $1 IP-адресынан +{{SITENAME}} проектында "$2" иҫәп яҙмаһының электрон почта адресы итеп ошо адресты күрһәткән. -Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм -{{SITENAME}} проектында электрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ: +Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау һәм {{SITENAME}} сайтынан хат ебәреү мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ: $3 @@ -3628,6 +3767,7 @@ $5 'version-license' => 'Рөхсәтнамә', 'version-poweredby-credits' => "Был вики проект '''[//www.mediawiki.org/ MediaWiki]''' нигеҙендә эшләй, copyright © 2001-$1 $2.", 'version-poweredby-others' => 'башҡалар', +'version-poweredby-translators' => 'translatewiki.net тәржемәселәре', 'version-credits-summary' => '[[Special:Version|MediaWiki]] үҫешенә өлөш индергәндәре өсөн киләһе ҡатнашыусыларға рәхмәт әйтәбеҙ.', 'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License рөхсәтнамәһенә ярашлы тарата һәм/йәки үҙгәртә алаһығыҙ (рөхсәтнамәнең йә исенсе өлгөһө, йә унан һуңғы өлгөләре). @@ -3641,6 +3781,18 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'version-entrypoints-header-entrypoint' => 'Инеш урыны', 'version-entrypoints-header-url' => 'URL', +# Special:Redirect +'redirect' => 'Файлдан, файҙаланыусынан йә версияның тиңләштереүсеһенән артабан йүнәлтеү', +'redirect-legend' => 'Файлға йәки биткә йүнәлтеү', +'redirect-summary' => 'Был махсус бит файлға (файлдың исеменән), биткә (версияның тиңләштереүсеһенән) йәки ҡатнашыусының битенә (ҡатнашыусының һанлы тиңләштереүсеһенән) йүнәлтә.', +'redirect-submit' => 'Күсергә', +'redirect-lookup' => 'Эҙләү', +'redirect-value' => 'Мәғәнәһе:', +'redirect-user' => 'Ҡатнашыусының тиңләштереүсеһе', +'redirect-revision' => 'Биттең версияһы', +'redirect-file' => 'Файлдың исеме', +'redirect-not-exists' => 'Мәғәнәһе табылманы', + # Special:FileDuplicateSearch 'fileduplicatesearch' => 'Бер иш файлдарҙы эҙләү', 'fileduplicatesearch-summary' => 'Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.', @@ -3667,7 +3819,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'specialpages-group-highuse' => 'Йыш ҡулланылған биттәр', 'specialpages-group-pages' => 'Биттәр исемлеге', 'specialpages-group-pagetools' => 'Биттәр өсөн ҡоралдар', -'specialpages-group-wiki' => 'Вики мәғлүмәт һәм ҡоралдар', +'specialpages-group-wiki' => 'Мәғлүмәттәр һәм ҡоралдар', 'specialpages-group-redirects' => 'Йүнәлтеүсе махсус биттәр', 'specialpages-group-spam' => 'Спамға ҡаршы ҡоралдар', @@ -3689,12 +3841,16 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'tags' => 'Ҡулланылған үҙгәртеү билдәләре', 'tag-filter' => '[[Special:Tags|Билдәләрҙе]] һайлау:', 'tag-filter-submit' => 'Һайлау', +'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тамғалар}}]]: $2)', 'tags-title' => 'Билдәләр', 'tags-intro' => 'Был биттә программа үҙгәртеүҙәрҙе билдәләү өсөн ҡулланған билдәләр һәм уларҙың мәғәнәләре исемлеге килтерелгән.', 'tags-tag' => 'Билдә исеме', 'tags-display-header' => 'Үҙгәртеүҙәр исемлегендә күрһәтеү', 'tags-description-header' => 'Мәғәнәһенең тулы тасуирламаһы', +'tags-active-header' => 'Әүҙемме?', 'tags-hitcount-header' => 'Билдәләнгән үҙгәртеүҙәр', +'tags-active-yes' => 'Эйе', +'tags-active-no' => 'Юҡ', 'tags-edit' => 'үҙгәртергә', 'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}', @@ -3715,6 +3871,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'dberr-problems' => 'Ғәфү итегеҙ! Был сайтта техник ҡыйынлыҡтар тыуҙы.', 'dberr-again' => 'Битте бер нисә минуттан яңыртып ҡарағыҙ.', 'dberr-info' => '(Мәғлүмәттәр базаһы серверы менән тоташтырылып булмай: $1)', +'dberr-info-hidden' => '(Мәғлүмәт базаларының серверына тоташып булмай)', 'dberr-usegoogle' => 'Әлегә һеҙ Google ярҙамында эҙләп ҡарай алһығыҙ.', 'dberr-outofdate' => 'Әммә уның индекстары иҫекргән булыуы мөмкинлеген күҙ уңында тотоғоҙ.', 'dberr-cachederror' => 'Түбәндә һоралған биттең кэшта һаҡланған өлгөһө күрһәтелгән, унда аҙаҡҡы үҙгәртеүҙәр булмауы мөмкин.', @@ -3730,23 +3887,26 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'htmlform-submit' => 'Ебәрергә', 'htmlform-reset' => 'Үҙгәртеүҙәрҙе кире алырға', 'htmlform-selectorother-other' => 'Башҡа', +'htmlform-no' => 'Юҡ', +'htmlform-yes' => 'Эйе', +'htmlform-chosen-placeholder' => 'Вариант һайлағыҙ', # SQLite database support 'sqlite-has-fts' => '$1, тулы текст буйынса эҙләү мөмкинлеге менән', 'sqlite-no-fts' => '$1, тулы текст буйынса эҙләү мөмкинлекһеҙ', # New logging system -'logentry-delete-delete' => '$1 $3 битен юйҙы', -'logentry-delete-restore' => '$1 $3 битен тергеҙҙе', -'logentry-delete-event' => '$1 {{PLURAL:$5|$5 журнал яҙмаһының|$5 журнал яҙмаһының}} күренеүсәнлеген $3 битендә үҙгәртте: $4', -'logentry-delete-revision' => '$1 {{PLURAL:$5|$5 версияның|$5 версияның}} күренеүсәнлеген $3 битендә үҙгәртте: $4', -'logentry-delete-event-legacy' => '$1 $3 журнал яҙмаһының күренеүсәнлеген үҙгәртте', -'logentry-delete-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген үҙгәртте', -'logentry-suppress-delete' => '$1 $3 битен йәшерҙе', -'logentry-suppress-event' => '$1 {{PLURAL:$5|$5 журнал яҙмаһының|$5 журнал яҙмаһының}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4', -'logentry-suppress-revision' => '$1 {{PLURAL:$5|$5 версияның|$5 версияның}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4', -'logentry-suppress-event-legacy' => '$1 $3 журнал яҙмаһының күренеүсәнлеген йәшерен үҙгәртте', -'logentry-suppress-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген йәшерен үҙгәртте', +'logentry-delete-delete' => '$1 $3 битен {{GENDER:$2|юйҙы}}', +'logentry-delete-restore' => '$1 $3 битен {{GENDER:$2|тергеҙҙе}}', +'logentry-delete-event' => '$1 журналдағы {{PLURAL:$5|яҙманы}} $3: $4 {{GENDER:$2|үҙгәртте}}', +'logentry-delete-revision' => '$1 {{PLURAL:$5|$5 версияның}} күренеүсәнлеген $3: $4 битендә {{GENDER:$2|үҙгәртте}}', +'logentry-delete-event-legacy' => '$1 $3 журналы яҙмаларының күренеүсәнлеген {{GENDER:$2|үҙгәртте}}', +'logentry-delete-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген {{GENDER:$2|үҙгәртте}}', +'logentry-suppress-delete' => '$1 $3 битен {{GENDER:$2|баҫырылдырҙы}}', +'logentry-suppress-event' => '$1 журналдағы {{PLURAL:$5|$5 яҙманың}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4', +'logentry-suppress-revision' => '$1 {{PLURAL:$5|$5 версияның}} күренеүсәнлеген $3 битендә йәшерен үҙгәртте: $4', +'logentry-suppress-event-legacy' => '$1 журнал яҙмаларының күренеүсәнлеген йәшерен {{GENDER:$2|үҙгәртте}}$3', +'logentry-suppress-revision-legacy' => '$1 $3 битендә версияларҙың күренеүсәнлеген йәшерен {{GENDER:$2|}}', 'revdelete-content-hid' => 'эстәлек йәшерелгән', 'revdelete-summary-hid' => 'төҙәтеү аңлатмаһы йәшерелде', 'revdelete-uname-hid' => 'ҡатнашыусы исеме йәшерелгән', @@ -3755,19 +3915,20 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'revdelete-uname-unhid' => 'ҡатнашыусы исеме күрһәтелде', 'revdelete-restricted' => 'хакимдәргә ҡаршы ҡулланылған сикләүҙәр', 'revdelete-unrestricted' => 'хакимдәрҙән алынған сикләүҙәр', -'logentry-move-move' => '$1 $3 битенең исемен үҙгәртте. Яңы исеме: $4', -'logentry-move-move-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса үҙгәртте. Яңы исеме: $4', -'logentry-move-move_redir' => '$1 $3 битенең исемен йүнәлтеү өҫтөнән үҙгәртте. Яңы исеме: $4', -'logentry-move-move_redir-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса һәм йүнәлтеү өҫтөнән үҙгәртте. Яңы исеме: $4', -'logentry-patrol-patrol' => '$1 $3 битенең $4 версияһын билдәләне.', -'logentry-patrol-patrol-auto' => '$1 $3 битенең $4 версияһын автоматик рәүештә билдәләне.', -'logentry-newusers-newusers' => '$1 ҡатнашыусыһының иҫәп яҙмаһы булдырылды', -'logentry-newusers-create' => '$1 ҡатнашыусыһының иҫәп яҙмаһы булдырылды', -'logentry-newusers-create2' => '$3 ҡатнашыусыһының иҫәп яҙмаһы $1 тарафынан булдырылды', -'logentry-newusers-autocreate' => 'Автоматик рәүештә $1 иҫәп яҙыуы яһалды', -'logentry-rights-rights' => '$1 $3 ҡулланыусыһының төркөмдәрҙәге ағзалығын $4 икән, $5 тип үҙгәртте', -'logentry-rights-rights-legacy' => '$1 $3 ҡулланыусыһының төркөм ағзалығын үҙгәртте', -'logentry-rights-autopromote' => '$1 автоматик рәүештә $2 икән, $3 ителде.', +'logentry-move-move' => '$1 $3 битенең исемен {{GENDER:$2| үҙгәртте}}. Яңы исеме: $4', +'logentry-move-move-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4', +'logentry-move-move_redir' => '$1 $3 битенең исемен йүнәлтеү өҫтөнән {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4', +'logentry-move-move_redir-noredirect' => '$1 $3 битенең исемен йүнәлтеү ҡуймайынса һәм йүнәлтеү өҫтөнән {{GENDER:$2|үҙгәртте}}. Яңы исеме: $4', +'logentry-patrol-patrol' => '$1 $3 битенең $4 версияһын {{GENDER:$2|тикшерҙе}}.', +'logentry-patrol-patrol-auto' => '$1 $3 битенең $4 версияһын автоматик рәүештә {{GENDER:$2|тикшерҙе}}.', +'logentry-newusers-newusers' => ' {{GENDER:$2|ҡатнашыусы}} $1 иҫәп яҙмаһы булдырҙы', +'logentry-newusers-create' => '{{GENDER:$2|ҡатнашыусы}} $1 иҫәп яҙмаһы булдырҙы.', +'logentry-newusers-create2' => '$1 {{GENDER:$2|ҡатнашыусы}} $3 иҫәп яҙмаһын булдырҙы', +'logentry-newusers-byemail' => '$1 {{GENDER:$2|}} $3 иҫәп яҙмаһын булдырҙы һәм серһүҙ электрон почта аша ебәрелде', +'logentry-newusers-autocreate' => 'Автоматик рәүештә {{GENDER:$2| ҡатнашыусының}} $1 иҫәп яҙмаһы яһалды', +'logentry-rights-rights' => '$1 $3 файҙаланыусының төркөмдәрҙәге ағзалығын $4 урынына $5 тип {{GENDER:$2|үҙгәртте}}', +'logentry-rights-rights-legacy' => '$1 $3 өсөн төркөмдәрҙәге ағзалыҡты {{GENDER:$2|үҙгәртте}}', +'logentry-rights-autopromote' => '$1 {{GENDER:$2|}} автоматик рәүештә {{GENDER:$2|}} $4 урынына $5 ителде.', 'rightsnone' => '(юҡ)', # Feedback @@ -3822,6 +3983,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'api-error-ok-but-empty' => 'Эске хата: серверҙан яуап юҡ.', 'api-error-overwrite' => 'Булған файлды алыштырыу рөхсәт ителмәй.', 'api-error-stashfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.', +'api-error-publishfailed' => 'Эске хата: сервер ваҡытлыса файлды һаҡлай алманы.', 'api-error-timeout' => 'Көтөлгән ваҡыт эсендә сервер яуып бирмәне.', 'api-error-unclassified' => 'Билдәһеҙ хата барлыҡҡа килде.', 'api-error-unknown-code' => 'Билдәһеҙ хата: «$1»', @@ -3842,4 +4004,22 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР 'duration-centuries' => '$1 {{PLURAL:$1|быуат|быуаттар}}', 'duration-millennia' => '$1 {{PLURAL:$1|меңйыллыҡ|меңйыллыҡтар}}', +# Image rotation +'rotate-comment' => 'Рәсем сәғәт йөрөшө буйынса $1{{PLURAL:$1|}} градусҡа боролдо', + +# Limit report +'limitreport-title' => 'Анализатор мәғлүмәттәре:', +'limitreport-cputime' => 'Процессорҙың ваҡытын ҡулланыу', +'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунд}}', +'limitreport-walltime' => 'Ғәмәлдәге ваҡыт режимында ҡулланыу', +'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунд}}', +'limitreport-ppvisitednodes' => 'Процессор инеп ҡараған төйөндәр һаны', +'limitreport-ppgeneratednodes' => 'Процессор эшләп сығарған төйөндәр һаны', +'limitreport-postexpandincludesize' => 'Асылған өлөштәр һаны', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}', +'limitreport-templateargumentsize' => 'Ҡалып аргументының үлсәмдәре', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}', +'limitreport-expansiondepth' => 'Киңәйеүҙең иң ҙур тәрәнлеге', +'limitreport-expensivefunctioncount' => 'Анализаторҙың "ҡиммәтле" функцияларының һаны', + ); diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php index 7a7c0de941..22094fb335 100644 --- a/languages/messages/MessagesBcc.php +++ b/languages/messages/MessagesBcc.php @@ -7,6 +7,7 @@ * @ingroup Language * @file * + * @author Ebraminio * @author Huji * @author Kaganer * @author Mostafadaneshvar @@ -2079,12 +2080,9 @@ $1', 'ipb_blocked_as_range' => 'حطا: ای پی $1 مستقیما محدود نهنت و نه تونیت رفع محدودیت بیت. بله آی جزی چه محدوده $2 محدود بوتت که تونیت رفع محدودیت بیت.', 'ip_range_invalid' => 'نامعتبر محدوده آی پی', -'blockme' => 'مناء محدود کن', 'proxyblocker' => 'محدود کننده ی پروکسی', -'proxyblocker-disabled' => 'ای عمگر غیرفعالنت.', 'proxyblockreason' => 'شمی آدرس آی پی محدود بوتت په چی که ایء یک پچین پروکسی ات. لطفا گون وتی اینترنتی شرکت تماس گریت یا حمایت تکنیکی و آیانا چی ای مشکل امنیتی شدید سهی کنیت.', -'proxyblocksuccess' => 'انجام بوت.', 'sorbs' => 'دی ان اس بی ال', 'sorbsreason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته DNSBL که استفاده بیت گون {{SITENAME}}.', 'sorbs_create_account_reason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته دی ان ای بی ال که استفاده بیت گون {{SITENAME}}. @@ -2372,6 +2370,8 @@ $1', 'spambot_username' => 'اسپم پاک کنوک مدیا وی کی', 'spam_reverting' => 'عوض کتن په آهری نسحه که شامل لینکان می بیت په $1', 'spam_blanking' => 'کل بازبینی آن شامل لینکان په $1, بوتت هالیکی', +'simpleantispam-label' => "کنترل ضد اسپم. +ای شیء پر ''مکن''", # Skin names 'skinname-cologneblue' => 'نیلی کولاجن', diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php index d76944c1f0..1575605aed 100644 --- a/languages/messages/MessagesBcl.php +++ b/languages/messages/MessagesBcl.php @@ -2611,11 +2611,8 @@ Hilngon sa [[Special:BlockList|listahan nin kubkob]] para sa listahan kan presen Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.', 'ip_range_invalid' => 'Dai pwede ining serye nin IP.', 'ip_range_toolarge' => 'An hidwas kan mga kubkob dakulaon kesa /$1 dae pinagtutugutan.', -'blockme' => 'Kubkuba ako', 'proxyblocker' => 'Parabagát na karibay', -'proxyblocker-disabled' => 'Ining punksyon pinag-untok.', 'proxyblockreason' => 'Binagat an saimong direccion nin IP ta ini sarong bukas na proxy. Apodon tabi an saimong Internet service provider o tech support asin ipaaram sainda ining seriosong problema nin seguridad.', -'proxyblocksuccess' => 'Tapos.', 'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.', 'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}. Ika dae makakamukna nin sarong panindog.', @@ -2963,6 +2960,8 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan 'spam_reverting' => 'Mabalik sa huring bersion na mayong takod sa $1', 'spam_blanking' => 'An gabos na mga pahirá na may takod sa $1, pigblablanko', 'spam_deleting' => 'An gabos na mga rebisyon na igwang mga kasugpunan sa $1, pinupura', +'simpleantispam-label' => 'Narikisa kan anti-espam. +"Dae" ka magkaag nin laman digde!', # Info page 'pageinfo-title' => 'Impormasyon para sa "$1"', diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php index 1f49571290..85dab072bb 100644 --- a/languages/messages/MessagesBe.php +++ b/languages/messages/MessagesBe.php @@ -2363,12 +2363,9 @@ $1', 'ipb_blocked_as_range' => 'Нельга зняць блок з IP-адрасу $1, таму што ён заблакаваны не наўпрост, але як частка абсягу $2; той абсяг, у сваю чаргу, можна разблакоўваць.', 'ip_range_invalid' => 'Няправільны абсяг IP.', 'ip_range_toolarge' => 'Блакіроўкі дыяпазонаў звыш /$1 забаронены.', -'blockme' => 'Заблакаваць сябе', 'proxyblocker' => 'Блакіратар проксі', -'proxyblocker-disabled' => 'Гэта функцыя выключаная.', 'proxyblockreason' => "Ваш адрас IP заблакаваны, таму што ён належыць да ліку адкрытых проксі. Гэта сур'ёзная праблема бяспекі; паведамце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.", -'proxyblocksuccess' => 'Зроблена.', 'sorbsreason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.', 'sorbs_create_account_reason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}. Вы не можаце рэгістравацца', diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php index fdf9f84c33..00fb4deeba 100644 --- a/languages/messages/MessagesBe_tarask.php +++ b/languages/messages/MessagesBe_tarask.php @@ -2450,9 +2450,11 @@ $UNWATCHURL 'deleteotherreason' => 'Іншая/дадатковая прычына:', 'deletereasonotherlist' => 'Іншая прычына', 'deletereason-dropdown' => '* Агульныя прычыны выдаленьня -** Запыт аўтара/аўтаркі +** Спам +** Вандалізм ** Парушэньне аўтарскіх правоў -** Вандалізм', +** Запыт аўтара +** Кепскае перанакіраваньне', 'delete-edit-reasonlist' => 'Рэдагаваць прычыны выдаленьня', 'delete-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, болей за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}. Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.', @@ -2771,12 +2773,9 @@ $1', Тым ня менш, ён належыць да дыяпазону $2, які можа быць разблякаваны.', 'ip_range_invalid' => 'Некарэктны дыяпазон IP-адрасоў.', 'ip_range_toolarge' => 'Блякаваньні дыяпазонаў, большых за /$1, не дазволеныя.', -'blockme' => 'Заблякуйце мяне', 'proxyblocker' => 'Блякаваньне проксі', -'proxyblocker-disabled' => 'Гэта функцыя выключаная.', 'proxyblockreason' => "Ваш IP-адрас быў заблякаваны таму што ён належыць адкрытаму проксі. Калі ласка, зьвяжыцеся з Вашым Інтэрнэт-правайдарам альбо са службай тэхнічнай падтрымкі і паведаміце ім пра гэтую сур'ёзную праблему бясьпекі.", -'proxyblocksuccess' => 'Зроблена.', 'sorbsreason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.', 'sorbs_create_account_reason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}. Вы ня зможаце стварыць рахунак', @@ -3121,6 +3120,8 @@ $2', 'spam_reverting' => 'Адкат да апошняй вэрсіі без спасылак на $1', 'spam_blanking' => 'Усе вэрсіі ўтрымліваюць спасылкі на $1, чыстка', 'spam_deleting' => 'Усе вэрсіі ўтрымлівалі спасылкі на $1, выдаляем', +'simpleantispam-label' => "Праверка анты-спаму. +'''НЕ''' запаўняйце тут нічога!", # Info page 'pageinfo-title' => 'Інфармацыя пра «$1»', diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php index 05b763df11..f25f0671f3 100644 --- a/languages/messages/MessagesBg.php +++ b/languages/messages/MessagesBg.php @@ -246,7 +246,7 @@ $messages = array( 'tog-hidepatrolled' => 'Скриване на патрулираните редакции от списъка с последните промени', 'tog-newpageshidepatrolled' => 'Скриване на патрулираните редакции от списъка на новите страници', 'tog-extendwatchlist' => 'Разширяване на списъка, така че да показва всички промени, не само най-скорошните', -'tog-usenewrc' => 'Групиране на последните промени и списъка за наблюдение по страници (изисква Джаваскрипт)', +'tog-usenewrc' => 'Групиране по страници на промените и списъка за наблюдение', 'tog-numberheadings' => 'Номериране на заглавията', 'tog-showtoolbar' => 'Показване на инструментите за редактиране', 'tog-editondblclick' => 'Редактиране на страниците чрез двойно щракване', @@ -486,7 +486,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'За {{SITENAME}}', 'aboutpage' => 'Project:За {{SITENAME}}', -'copyright' => 'Съдържанието е достъпно при условията на $1.', +'copyright' => 'Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.', 'copyrightpage' => '{{ns:project}}:Авторски права', 'currentevents' => 'Текущи събития', 'currentevents-url' => 'Project:Текущи събития', @@ -570,6 +570,9 @@ $1', # General errors 'error' => 'Грешка', 'databaseerror' => 'Грешка при работа с базата от данни', +'databaseerror-text' => 'Възникна грешка при заявката за базата данни. +Това може да означава бъг в софтуера.', +'databaseerror-textcl' => 'Възникна грешка при заявка за базата данни.', 'databaseerror-query' => 'Заявка: $1', 'databaseerror-function' => 'Функция: $1', 'databaseerror-error' => 'Грешка: $1', @@ -603,6 +606,7 @@ $1', 'badarticleerror' => 'Действието не може да се изпълни върху страницата.', 'cannotdelete' => 'Указаната страница или файл "$1" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.', 'cannotdelete-title' => 'Страницата „$1“ не може да бъде изтрита', +'no-null-revision' => 'Не може да бъде създадена празна версия на страницата „$1“', 'badtitle' => 'Невалидно заглавие', 'badtitletext' => 'Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.', 'perfcached' => 'Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.', @@ -629,6 +633,8 @@ $2', 'customjsprotected' => 'Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.', 'mycustomcssprotected' => 'Нямате права за редактиране на тази CSS страница.', 'mycustomjsprotected' => 'Нямате права за редактиране на тази JavaScript страница.', +'myprivateinfoprotected' => 'Нямате права да редактирате личната си информация.', +'mypreferencesprotected' => 'Нямате права да редактирате настройките си.', 'ns-specialprotected' => 'Специалните страници не могат да бъдат редактирани.', 'titleprotected' => "Тази страница е била защитена срещу създаване от [[User:$1|$1]]. Посочената причина е ''$2''.", @@ -653,13 +659,14 @@ $2', 'yourname' => 'Потребителско име:', 'userlogin-yourname' => 'Потребителско име', 'userlogin-yourname-ph' => 'Въведете вашето потребителско име', +'createacct-another-username-ph' => 'Въвежда се потребителското име', 'yourpassword' => 'Парола:', 'userlogin-yourpassword' => 'Парола', 'userlogin-yourpassword-ph' => 'Въведете вашата парола', 'createacct-yourpassword-ph' => 'Въведете парола', 'yourpasswordagain' => 'Парола (повторно):', 'createacct-yourpasswordagain' => 'Потвърждаване на паролата', -'createacct-yourpasswordagain-ph' => 'Въведете паролата отново', +'createacct-yourpasswordagain-ph' => 'Въвежда се паролата (повторно)', 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})', 'userlogin-signwithsecure' => 'Използване на защитена връзка', 'yourdomainname' => 'Домейн:', @@ -686,14 +693,20 @@ $2', 'userlogin-resetpassword-link' => 'Възстановяване на паролата', 'helplogin-url' => 'Help:Влизане', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощ за влизане]] в системата', +'userlogin-loggedin' => 'Вече сте влезли в системата като {{GENDER:$1|$1}}. +Чрез формуляра по-долу можете да влезете като друг потребител.', 'userlogin-createanother' => 'Създаване на друга сметка', 'createacct-join' => 'Въведете своите данни по-долу.', +'createacct-another-join' => 'Попълване на информацията за новата сметка', 'createacct-emailrequired' => 'Адрес за електронна поща', 'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)', -'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу', +'createacct-another-email-ph' => 'Въвежда се електронна поща', +'createaccountmail' => 'Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу', 'createacct-realname' => 'Истинско име (незадължително)', 'createaccountreason' => 'Причина:', 'createacct-reason' => 'Причина', +'createacct-reason-ph' => 'Защо създавате друга сметка', +'createacct-captcha' => 'Проверка за сигурност', 'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе', 'createacct-submit' => 'Създаване на сметката', 'createacct-another-submit' => 'Създаване на друга сметка', @@ -776,7 +789,7 @@ $2', 'newpassword' => 'Нова парола:', 'retypenew' => 'Нова парола повторно:', 'resetpass_submit' => 'Избиране на парола и влизане', -'changepassword-success' => 'Паролата ви беше сменена! Сега влизате…', +'changepassword-success' => 'Паролата ви беше променена успешно!', 'resetpass_forbidden' => 'Не е разрешена смяна на паролата', 'resetpass-no-info' => 'За да достъпвате тази страница директно, необходимо е да влезете в системата.', 'resetpass-submit-loggedin' => 'Промяна на паролата', @@ -784,11 +797,15 @@ $2', 'resetpass-wrong-oldpass' => 'Невалидна временна или текуща парола. Възможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.', 'resetpass-temp-password' => 'Временна парола:', +'resetpass-abort-generic' => 'Промяната на паролата беше прекъсната от използвано разширение.', # Special:PasswordReset 'passwordreset' => 'Възстановяване на парола', +'passwordreset-text-one' => 'Попълването на формуляра ще доведе до възстановяване на паролата.', +'passwordreset-text-many' => '{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}', 'passwordreset-legend' => 'Възстановяване на парола', 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.', +'passwordreset-emaildisabled' => 'Функционалността за електронна поща е изключена в това уики.', 'passwordreset-username' => 'Потребителско име:', 'passwordreset-domain' => 'Домейн:', 'passwordreset-capture' => 'Преглеждане на електронното писмо?', @@ -815,7 +832,7 @@ $2 Временна парола: $2', 'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.', 'passwordreset-emailsent-capture' => 'По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.', -'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на потребителя: $1', +'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1', # Special:ChangeEmail 'changeemail' => 'Промяна на адреса за е-поща', @@ -908,9 +925,7 @@ $2 'loginreqlink' => 'влизане', 'loginreqpagetext' => 'Необходимо е $1, за да можете да разглеждате други страници.', 'accmailtitle' => 'Паролата беше изпратена.', -'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2. - -Паролата за тази нова потребителска сметка може да бъде променена от специалната страница ''[[Special:ChangePassword|„Промяна на парола“]]'' след влизане в системата.", +'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2. Паролата може да бъде променена от страницата ''[[Special:ChangePassword|„Промяна на паролата“]]'' след влизане в системата.", 'newarticle' => '(нова)', 'newarticletext' => 'Последвахте препратка към страница, която все още не съществува. За да я създадете, просто започнете да пишете в долната текстова кутия @@ -1008,7 +1023,7 @@ $2 'nocreate-loggedin' => 'Нямате необходимите права да създавате нови страници.', 'sectioneditnotsupported-title' => 'Не се поддържа редактиране на раздели', 'sectioneditnotsupported-text' => 'Не се поддържа редактиране на раздели на тази страница.', -'permissionserrors' => 'Грешки при правата на достъп', +'permissionserrors' => 'Грешка при правата на достъп', 'permissionserrorstext' => 'Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:', 'permissionserrorstext-withaction' => 'Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:', 'recreate-moveddeleted-warn' => "'''Внимание: Създавате страница, която по-рано вече е била изтрита.''' @@ -1338,7 +1353,7 @@ $1", 'prefs-rendering' => 'Облик', 'saveprefs' => 'Съхраняване', 'resetprefs' => 'Отмяна на текущите промени', -'restoreprefs' => 'Възстановяване на всички настройки по подразбиране', +'restoreprefs' => 'Възстановяване на всички настройки по подразбиране (за всички раздели)', 'prefs-editing' => 'Редактиране', 'rows' => 'Редове:', 'columns' => 'Колони:', @@ -1578,9 +1593,10 @@ $1", # Recent changes 'nchanges' => '$1 {{PLURAL:$1|промяна|промени}}', +'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|от последното посещение}}', 'enhancedrc-history' => 'история', 'recentchanges' => 'Последни промени', -'recentchanges-legend' => 'Опции на списъка с последни промени', +'recentchanges-legend' => 'Настройки на списъка с последни промени', 'recentchanges-summary' => "Проследяване на последните промени в {{SITENAME}}. Легенда: '''тек''' = разлика на текущата версия, @@ -2582,11 +2598,8 @@ $1', 'ipb_blocked_as_range' => 'Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.', 'ip_range_invalid' => 'Невалиден интервал за IP-адреси.', 'ip_range_toolarge' => 'Забранено е блокиране на диапазони от IP адреси по-големи от /$1.', -'blockme' => 'Самоблокиране', 'proxyblocker' => 'Блокировач на проксита', -'proxyblocker-disabled' => 'Тази функция е деактивирана.', 'proxyblockreason' => 'IP-адресът ви беше блокиран, тъй като е анонимно достъпен междинен сървър. Свържете се с доставчика ви на интернет и го информирайте за този сериозен проблем в сигурността.', -'proxyblocksuccess' => 'Готово.', 'sorbsreason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}.', 'sorbs_create_account_reason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}. Не може да създадете сметка.', 'cant-block-while-blocked' => 'Не можете да блокирате други потребители, докато сам(а) сте блокиран(а).', @@ -2745,6 +2758,8 @@ $1', 'thumbnail-more' => 'Увеличаване', 'filemissing' => 'Липсващ файл', 'thumbnail_error' => 'Грешка при създаване на миникартинка: $1', +'thumbnail_error_remote' => 'Съобщение за грешка от $1: +$2', 'djvu_page_error' => 'Номерът на DjVu-страницата е извън обхвата', 'djvu_no_xml' => 'Не е възможно вземането на XML за DjVu-файла', 'thumbnail-temp-create' => 'Временния файл с миникартинка не може да бъде създаден.', @@ -2913,9 +2928,12 @@ $1', 'spam_reverting' => 'Връщане на последната версия, несъдържаща препратки към $1', 'spam_blanking' => 'Всички версии, съдържащи препратки към $1, изчистване', 'spam_deleting' => 'Всички версии съдържат препратки към $1, изтриване', +'simpleantispam-label' => "Проверка за спам. +Необходимо е да '''НЕ''' попълвате това поле!", # Info page 'pageinfo-title' => 'Информация за "$1"', +'pageinfo-not-current' => 'За съжаление тази информация не може да бъде предоставена за стари версии.', 'pageinfo-header-basic' => 'Основна информация', 'pageinfo-header-edits' => 'История на редакциите', 'pageinfo-header-restrictions' => 'Защита на страницата', @@ -3663,6 +3681,7 @@ MediaWiki се разпространява с надеждата, че ще б 'tags' => 'Валидни етикети за промени', 'tag-filter' => 'Филтър на [[Special:Tags|етикета]]:', 'tag-filter-submit' => 'Филтриране', +'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Етикет|Етикети}}]]: $2)', 'tags-title' => 'Етикети', 'tags-intro' => 'Тук са изброени всички етикети, които могат да се ползват за отбелязване на редакциите, както и тяхното значение.', 'tags-tag' => 'Име на етикета', @@ -3691,6 +3710,7 @@ MediaWiki се разпространява с надеждата, че ще б 'dberr-problems' => 'Съжаляваме! Сайтът изпитва технически затруднения.', 'dberr-again' => 'Изчакайте няколко минути и опитайте да презаредите.', 'dberr-info' => '(Няма достъп до сървъра с базата данни: $1)', +'dberr-info-hidden' => '(Няма връска със сървъра на базата данни)', 'dberr-usegoogle' => 'Междувременно опитайте да потърсите в Google.', 'dberr-outofdate' => 'Имайте предвид, че индексираното от Гугъл наше съдържание може вече да е неактуално.', 'dberr-cachederror' => 'Следва складирано копие на поисканата страница. Възможно е складираното копие да не е актуално.', diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php index 420b898eb0..fe44b3a766 100644 --- a/languages/messages/MessagesBjn.php +++ b/languages/messages/MessagesBjn.php @@ -2509,12 +2509,9 @@ Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pam Ngini, kayapa pun, diblukir sawagai palihan wilayah $2, nang kawa-ai dilapas-blukirnya.', 'ip_range_invalid' => 'Jarak IP kada sah.', 'ip_range_toolarge' => 'Jarak blukir taganal pada /$1 kada dibulihakan.', -'blockme' => 'Blokir ulun', 'proxyblocker' => 'Pamblukir pruksi', -'proxyblocker-disabled' => 'Pungsi ngini dipajahakan.', 'proxyblockreason' => 'Alamat IP Pian diblukir karana ngini sabuah pruksi tabuka. Muhun hubungi Panyadia Layan Internet Pian atawa sukungan tiknik wan padahi sidin pasal masalah ka-amanan sarius ngini.', -'proxyblocksuccess' => 'Sudah.', 'sorbsreason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.', 'sorbs_create_account_reason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}. Pian kada kawa maulah sabuah akun', diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php index 70d1bedf93..f62a5484ae 100644 --- a/languages/messages/MessagesBn.php +++ b/languages/messages/MessagesBn.php @@ -113,7 +113,7 @@ $messages = array( 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক', 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও', 'tog-norollbackdiff' => 'রোলব্যাকের পরে পার্থক্য দেখিও না', -'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তন সহ কোনো পাতা ত্যাগের সময় সাবধান করো', +'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তনসহ কোনো পাতা ত্যাগের সময় সাবধান করো', 'tog-prefershttps' => 'যখনই প্রবেশ করবেন সবসময় নিরাপদ সংযোগ ব্যবহার করুন', 'underline-always' => 'সব সময়', @@ -271,7 +271,7 @@ $messages = array( 'create-this-page' => 'পাতাটি তৈরি করো', 'delete' => 'অপসারণ', 'deletethispage' => 'এই পাতাটি মুছে ফেলুন', -'undeletethispage' => 'এই পাতাটি মুছো না', +'undeletethispage' => 'পাতাটি পুনরুদ্ধার করো', 'undelete_short' => 'পুনঃস্থাপন {{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনাসমূহ}}', 'viewdeleted_short' => '{{PLURAL:$1| টি অপসারিত সম্পাদনা|$1 টি অপসারিত সম্পাদনা}} দেখাও', 'protect' => 'সুরক্ষা', @@ -318,7 +318,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => '{{SITENAME}} বৃত্তান্ত', 'aboutpage' => 'Project:বৃত্তান্ত', -'copyright' => '$1 এর আওতায় প্রাপ্য।', +'copyright' => '$1 এর আওতায় প্রকাশিত যদি অন্য কিছু নির্ধারিত না থাকে।', 'copyrightpage' => '{{ns:project}}:কপিরাইট', 'currentevents' => 'সমসাময়িক ঘটনা', 'currentevents-url' => 'Project:সমসাময়িক ঘটনাসমূহ', @@ -335,7 +335,7 @@ $1', 'privacypage' => 'Project:গোপনীয়তার নীতি', 'badaccess' => 'অনুমোদন ত্রুটি', -'badaccess-group0' => 'আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই', +'badaccess-group0' => 'আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই।', 'badaccess-groups' => 'আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন সদস্য ব্যবহারকারী সম্পাদন করতে পারেন: $1।', 'versionrequired' => 'মিডিয়াউইকির $1 সংস্করণ প্রয়োজন', @@ -529,6 +529,8 @@ $2', 'userlogin-resetpassword-link' => 'শব্দচাবি পুনরায় ধার্য করুন', 'helplogin-url' => 'Help:প্রবেশ', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]', +'userlogin-loggedin' => 'আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন। +অন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।', 'userlogin-createanother' => 'আরেকটি অ্যাকাউন্ট তৈরি করুন', 'createacct-join' => 'আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।', 'createacct-another-join' => 'নিচে আপনার নতুন অ্যাকাউন্টের তথ্য দিন।', @@ -1150,7 +1152,7 @@ $1", 'searchprofile-images-tooltip' => 'ফাইলের জন্য অনুসন্ধান', 'searchprofile-everything-tooltip' => 'সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)', 'searchprofile-advanced-tooltip' => 'স্বনির্ধারিত নামস্থানে অনুসন্ধান করো', -'search-result-size' => '$1 ({{PLURAL:$2|1 শব্দ|$2 শব্দসমূহ}})', +'search-result-size' => '$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})', 'search-result-category-size' => '{{PLURAL: $1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL: $2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL: $3 | 1 ফাইল | $3 ফাইল}})', 'search-result-score' => 'মিলেছে: $1%', 'search-redirect' => '(পুনর্নিদেশনা $1)', @@ -1456,8 +1458,8 @@ $1", 'action-block' => 'এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দাও', 'action-protect' => 'এই পাতার সুরক্ষার মাত্রা পরিবর্তন করো', 'action-rollback' => 'একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন', -'action-import' => 'অন্য উইকি থেকে এই পাতাটি আমদানী করো', -'action-importupload' => 'ফাইল আপলোড থেকে এই পাতাটি আমদানী করো', +'action-import' => 'অন্য উইকি থেকে পাতা আমদানী করো', +'action-importupload' => 'ফাইল আপলোড থেকে পাতা আমদানী করো', 'action-patrol' => 'অন্যদের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো', 'action-autopatrol' => 'পরীক্ষিত বলে চিহ্নিত কি আপনি সম্পাদনা করেছেন', 'action-unwatchedpages' => 'নজরতালিকা বহির্ভূত পাতাগুলির তালিকা দেখাও', @@ -1980,6 +1982,7 @@ Maybe you want to edit the description on its [$2 file description page] there.' 'listusers' => 'ব্যবহারকারীর তালিকা', 'listusers-editsonly' => 'শুধুমাত্র এমন ব্যবহারকারীদের দেখাও যাদের অবদান আছে', 'listusers-creationsort' => 'তৈরির তারিখ অনুসারে সাজাও', +'listusers-desc' => 'বড় থেকে ছোট ক্রম অনুযায়ী সাজাও', 'usereditcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}', 'usercreated' => '{{GENDER:$3|তৈরি হয়েছে}} $1 তারিখ, সময়: $2', 'newpages' => 'নতুন পাতাসমূহ', @@ -2075,7 +2078,7 @@ Maybe you want to edit the description on its [$2 file description page] there.' # Special:ActiveUsers 'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা', 'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।', -'activeusers-count' => 'গত {{PLURAL:$3|দিনে}} সর্বমোট {{PLURAL:$1|পদ}} সংখ্যা $1', +'activeusers-count' => 'গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি', 'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:', 'activeusers-hidebots' => 'বট লুকাও', 'activeusers-hidesysops' => 'প্রশাসক লুকাও', @@ -2241,9 +2244,11 @@ $UNWATCHURL 'deleteotherreason' => 'অন্য/অতিরিক্ত কারণ:', 'deletereasonotherlist' => 'অন্য কারণ', 'deletereason-dropdown' => '*মুছে ফেলার সাধারণ কারণগুলি -** লেখকের অনুরোধ +** স্প্যাম +** ধ্বংসপ্রবণতা ** কপিরাইট ভঙ্গ -** ধ্বংসপ্রবণতা', +** লেখকের অনুরোধ +** অকার্যকর পুনঃনির্দেশ', 'delete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা', 'delete-toobig' => 'এই পাতার সম্পাদনার ইতিহাস অনেক বড়, যা $1টি {{PLURAL:$1|সংস্করণের|সংস্করণের}} বেশি। {{SITENAME}}-এর দূর্ঘটনাজনিত সমস্যা এড়াতে এই ধরনের পাতা মুছার ব্যপারে সীমাবদ্ধতা আরোপিত হয়েছে।', @@ -2560,11 +2565,8 @@ $1', 'ipb_blocked_as_range' => 'ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।', 'ip_range_invalid' => 'অবৈধ আইপি শ্রেণী', 'ip_range_toolarge' => '/$1 এর বড় রেঞ্জব্লক ব্যবহার অনুমদিত নয়।', -'blockme' => 'আমাকে বাধা দেওয়া হোক', 'proxyblocker' => 'প্রক্সি বাধাদানকারী', -'proxyblocker-disabled' => 'এই ফাংশনটি নিষ্ক্রিয়।', 'proxyblockreason' => 'আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ এটি একটি উন্মুক্ত প্রক্সি। অনুগ্রহ করে আপনার ইন্টারনেট সেবা প্রদানকারী কোম্পানির সাথে কারিগরি সহায়তার ব্যাপারে যোগাযোগ করুন এবং এই গুরুত্বপূর্ণ নিরাপত্তা সমস্যার ব্যাপারে তাদেরকে অবহিত করুন।', -'proxyblocksuccess' => 'নিষ্পন্ন হয়েছে।', 'sorbsreason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।', 'sorbs_create_account_reason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।', 'xffblockreason' => 'X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1', @@ -2899,6 +2901,8 @@ $2', 'spam_reverting' => '$1-এর প্রতি কোন সংযোগ নেই, এমন সর্বশেষ সংস্করণে ফেরত নেওয়া হচ্ছে।', 'spam_blanking' => '$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন খালি করা হচ্ছে', 'spam_deleting' => '$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন অপসারণ করা হচ্ছে', +'simpleantispam-label' => "এন্টি-স্প্যাম যাচাই। +এটা পূরণ করবেন '''না'''!", # Info page 'pageinfo-title' => '"$1" এর তথ্য', diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php index 1dd3e15cf3..9191af57b0 100644 --- a/languages/messages/MessagesBr.php +++ b/languages/messages/MessagesBr.php @@ -2647,7 +2647,7 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"', 'blocklogpage' => 'Roll ar stankadennoù', 'blocklog-showlog' => "Stanket eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar stankadennoù, d'ho titouriñ :", 'blocklog-showsuppresslog' => "Stanket ha kuzhet eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar diverkadennoù, d'ho titouriñ :", -'blocklogentry' => 'en/he deus stanket [[$1]] betek an $2 $3', +'blocklogentry' => 'en/he deus stanket [[$1]] gant ur pad termen a $2 $3', 'reblock-logentry' => "en deus kemmet an arventennoù stankañ evit [[$1]] gant un termen d'an $2 $3", 'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.", 'unblocklogentry' => 'distanket "$1"', @@ -2670,11 +2670,8 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"', 'ipb_blocked_as_range' => "Fazi : N'eo ket bet stanket ar chomlec'h IP $1 war-eeun, setu n'hall ket bezañ distanket. Stanket eo bet dre al live $2 avat, hag a c'hall bezañ distanket.", 'ip_range_invalid' => 'Stankañ IP direizh.', 'ip_range_toolarge' => "N'eo ket aotreet stankañ pajennoù brasoc'h evit /$1.", -'blockme' => "Stankit ac'hanon", 'proxyblocker' => 'Stanker proksi', -'proxyblocker-disabled' => "Diweredekaet eo an arc'hwel-mañ.", 'proxyblockreason' => "Stanket eo bet hoc'h IP rak ur proksi digor eo. Trugarez da gelaouiñ ho pourvezer moned ouzh ar Genrouedad pe ho skoazell deknikel eus ar gudenn surentez-mañ.", -'proxyblocksuccess' => 'Echu.', 'sorbsreason' => "Rollet eo ho chomlec'h IP evel ur proksi digor en DNSBL implijet gant {{SITENAME}}.", 'sorbs_create_account_reason' => "Rollet eo ho chomlec'h IP evel ur proksi digor war an DNSBL implijet gant {{SITENAME}}. N'hallit ket krouiñ ur gont", 'cant-block-while-blocked' => "N'hallit ket stankañ implijerien all ma'z oc'h stanket c'hwi hoc'h-unan.", @@ -3030,6 +3027,8 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.", 'spam_reverting' => "Distreiñ d'ar stumm diwezhañ hep liamm davet $1", 'spam_blanking' => 'Diverkañ an holl stummoù enno liammoù davet $1', 'spam_deleting' => 'An holl stummoù enno liammoù war-zu $1, o tiverkañ', +'simpleantispam-label' => "Taol gwiriañ eneb-strob. +'''Arabat''' merkañ tra pe dra amañ !", # Info page 'pageinfo-title' => 'Titouroù evit "$1"', diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php index a5d49ac2d6..2c356225ff 100644 --- a/languages/messages/MessagesBs.php +++ b/languages/messages/MessagesBs.php @@ -498,7 +498,7 @@ $messages = array( 'articlepage' => 'Pogledaj članak', 'talk' => 'Razgovor', 'views' => 'Pregledi', -'toolbox' => 'Traka sa alatima', +'toolbox' => 'Alati', 'userpage' => 'Pogledaj korisničku stranicu', 'projectpage' => 'Pogledaj stranicu projekta', 'imagepage' => 'Pogledajte stranicu datoteke', @@ -733,6 +733,7 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode 'userlogin-resetpassword-link' => 'Resetirajte svoju šifru/lozinku', 'helplogin-url' => 'Help:Prijavljivanje', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]', +'userlogin-createanother' => 'Napravi još jedan račun', 'createacct-join' => 'Unesite svoje podatke ispod.', 'createacct-another-join' => 'Unesite informacije o novom računu ispod.', 'createacct-emailrequired' => 'Adresa e-pošte', @@ -2610,7 +2611,7 @@ $1', 'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}', 'contributions-title' => 'Doprinosi korisnika $1', 'mycontris' => 'Doprinos', -'contribsub2' => 'Za $1 ($2)', +'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.', 'uctop' => '(trenutno)', 'month' => 'Od mjeseca (i ranije):', @@ -2767,11 +2768,8 @@ Možda je već deblokirana.', Međutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.', 'ip_range_invalid' => 'Netačan raspon IP adresa.', 'ip_range_toolarge' => 'Nisu dopuštene blokade veće od /$1.', -'blockme' => 'Blokiraj me', 'proxyblocker' => 'Bloker proksija', -'proxyblocker-disabled' => 'Ova funkcija je onemogućena.', 'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi. Molimo 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.', -'proxyblocksuccess' => 'Proksi uspješno blokiran.', '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}}. Ne možete napraviti račun', @@ -3130,6 +3128,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.', 'spam_reverting' => 'Vraćanje na zadnju verziju koja ne sadrži linkove ka $1', 'spam_blanking' => 'Sve revizije koje sadrže linkove ka $1, očisti', 'spam_deleting' => 'Sve revizije koje sadrže linkove na $1, brišem', +'simpleantispam-label' => "Provjera protiv spama. +'''NE''' popunjavaj ovo!", # Info page 'pageinfo-title' => 'Informacije za "$1"', diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php index ee209f95ae..f95bbe638d 100644 --- a/languages/messages/MessagesCa.php +++ b/languages/messages/MessagesCa.php @@ -2687,11 +2687,8 @@ Per més detalls, a sota es mostra el registre de supressions:', 'ipb_blocked_as_range' => "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.", 'ip_range_invalid' => 'Rang de IP no vàlid.', 'ip_range_toolarge' => 'No estan permesos el bloquejos de rangs més grans que /$1.', -'blockme' => "Bloca'm", 'proxyblocker' => 'Bloqueig de proxy', -'proxyblocker-disabled' => "S'ha inhabilitat la funció.", 'proxyblockreason' => "La vostra adreça IP ha estat bloquejada perquè és un proxy obert. Si us plau contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.", -'proxyblocksuccess' => 'Fet.', 'sorbsreason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.", 'sorbs_create_account_reason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte", 'xffblockreason' => "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1", @@ -3039,6 +3036,8 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.', 'spam_reverting' => 'Es reverteix a la darrera versió que no conté enllaços a $1', 'spam_blanking' => "Totes les revisions contenien enllaços $1, s'està deixant en blanc", 'spam_deleting' => "S'estan suprimint totes les revisions que contenien enllaços a $1", +'simpleantispam-label' => "Comprovació anti-spam. +'''NO''' ho ompliu!", # Info page 'pageinfo-title' => 'Informació de «$1»', diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php index a85c937fae..2c1d5851e1 100644 --- a/languages/messages/MessagesCe.php +++ b/languages/messages/MessagesCe.php @@ -329,7 +329,7 @@ $messages = array( 'tog-numberheadings' => 'Ша шех хlитто терахь корташна', 'tog-showtoolbar' => 'Гайта лакхара гlирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)', 'tog-editondblclick' => 'Нисйе агlонаш шозза тlетаlийча (JavaScript)', -'tog-editsection' => 'Гайта хьажориг «нисйе» аьлла хlора агlона', +'tog-editsection' => 'Гайта хьажораг «нисйе» аьлла хӀора агӀона', 'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тlетаlийча оцу кортан (JavaScript)', 'tog-showtoc' => 'Гойти коьртнаш (оцу агlонашна лаххара 3 коьртнашца)', 'tog-rememberpassword' => 'Даглаца сан дӀаяздар хӀокху браузеран тӀяхь (цхьан $1 {{PLURAL:$1|де|ден|динахь}})', @@ -347,7 +347,7 @@ $messages = array( 'tog-enotifrevealaddr' => 'Гайта сан зlе оцу хаамаш барехь', 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа', 'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:', -'tog-fancysig' => 'Шен вики-къастаман куьгтаlдар (ша шех хьажориг йоцуш)', +'tog-fancysig' => 'Шен вики-къастаман куьгтаӀдар (ша шех хьажораг йоцуш)', 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)', 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язйина яцахь', 'tog-watchlisthideown' => 'Къайлаяха ас нисйинарш оцу тергаме могlам чура', @@ -359,9 +359,10 @@ $messages = array( 'tog-ccmeonemails' => 'Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.', 'tog-diffonly' => 'Ма гайта агlон чулацам шина башхонца цхьатерра йолуш', 'tog-showhiddencats' => 'Гайта къайлаха йолу категореш', -'tog-noconvertlink' => 'Хааман хьажориг кхуллу гlирс дlабайа', +'tog-noconvertlink' => 'Хааман хьажораг кхуллу гӀирс дӀабайа', 'tog-norollbackdiff' => 'Юха яккхиначул тӀаьхьа ма гайта версешан башхо', 'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь', +'tog-prefershttps' => 'Даима лела йе лардина системин чудалар', 'underline-always' => 'Даимна', 'underline-never' => 'Цкъа а', @@ -456,7 +457,7 @@ $messages = array( 'index-category' => 'Меттигтерахьйо агlонаш', 'noindex-category' => 'ДӀахьушйоцу агӀонаш', 'broken-file-category' => '{{#switch:{{NAMESPACE}} - |{{ns:0}}=Болх цабеш файланши хьажоригаш йолу агӀонаш}}', + |{{ns:0}}=Болх цабеш файлийн хьажорагаш йолу агӀонаш}}', 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', @@ -506,13 +507,13 @@ $messages = array( 'help' => 'ГӀо', 'search' => 'Лаха', 'searchbutton' => 'Лаха', -'go' => 'Дехьа хьажа', -'searcharticle' => 'Дехьа хьажа', +'go' => 'Дехьа гӀо', +'searcharticle' => 'Дехьа гӀо', 'history' => 'Истори', 'history_short' => 'Истори', 'updatedmarker' => 'Керла яккхина сона гинчултӀаьхьа', 'printableversion' => 'Зорба туху верси', -'permalink' => 'Даиман йолу хьажориг', +'permalink' => 'Даиман йолу хьажораг', 'print' => 'Зорба тоха', 'view' => 'Хьажа', 'edit' => 'Нисйé', @@ -553,7 +554,7 @@ $messages = array( 'lastmodifiedat' => 'ХӀокху агӀон тӀаьххьаралера хийцам: $2, $1.', 'viewcount' => 'ХӀокху агӀонга хьойсина $1 {{PLURAL:$1|за|за|за}}.', 'protectedpage' => 'ГӀароллийца йолу агӀо', -'jumpto' => 'ДехьагӀо оцу:', +'jumpto' => 'Дехьа гӀо:', 'jumptonavigation' => 'Навигаци', 'jumptosearch' => 'лаха', 'view-pool-error' => 'Бехк цабиллар доьха, хӀинц гӀулкхдириг йоьттина ю. @@ -655,11 +656,11 @@ $1', 'laggedslavemode' => 'Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.', 'readonly' => 'Блоктоьхна дӀайаздар хаамийн бухе', 'enterlockreason' => 'Билгал де блоктохаран бахьна а и чекх йолу хан а.', -'missing-article' => 'Хlокху чохь кароезаш йолу хьан дехарца йозан агlонаш цакарийна «$1» $2. +'missing-article' => 'ХӀокху чохь кароезаш йолу хьан дехарца йозан агӀонаш цакарийна «$1» $2. -Иштнарг наггахь хуьлу хьажориг дlайаьккхина йалхь йа хийцам бина тиша хьажоригца дехьа вала гlоьртича. +Иштнарг наггахь хуьлу хьажораг дӀаяьккхина елахь я хийцам бина тиша хьажорагца дехьа гӀо гӀоьртича. -Нагахьсан гlулкх цуьнах доьзна дацахь, хьуна карийна гlирс латточехь гlалат. +Нагахьсан гӀулкх цуьнах доьзна дацахь, хьуна карийна гӀирс латточехь гӀалат. Дехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|куьйгалхога]], гойтуш URL.', 'missingarticle-rev' => '(верси № $1)', 'missingarticle-diff' => '(тейп тайпнара: $1, $2)', @@ -684,6 +685,8 @@ $1', 'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.', 'perfcached' => 'Лахара хаам схьаэца кэша чура цундела тӀехьарлаьра хийцамаш гойтуш бац. Кэша чохь латтаё оцул $1 кӀезиг {{PLURAL:$1|дӀаяздар|дӀаяздарш}}.', 'perfcachedts' => 'Лахара хаам схьаэца кэша чура иза тӀаьхьара карла ялла $1. Кэша чохь латта до оцул $4 кӀезиг {{PLURAL:$4|дӀаяздар|дӀаяздарш}}.', +'querypage-no-updates' => 'ХӀинца хӀара агӀо карлаякхар дӀадайина ду. +Кхузахь гайтина болу хаамаш карла боккхур бац.', 'wrong_wfQuery_params' => 'Хилийта йиш йоцу параметраш хӀокху функцин wfQuery()
      Функци: $1
      Жоп дехар: $2', @@ -693,6 +696,9 @@ $1', 'protectedpagetext' => 'ХӀара агӀо дӀакъойлина йу рé цадаккхийта.', 'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:', 'protectedinterface' => 'ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо ю. Куьйгалхошна бен иза хийца цало.', +'editinginterface' => "'''Тергам бе:''' Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан. +Цуна бина хийцам хьокху википедин кхечу декъашхошна гур бу. +Хьокху хаамийн гочдар тӀетоха я хийца лела йе сайт MediaWiki [//translatewiki.net/ translatewiki.net].", 'namespaceprotected' => 'ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».', 'customcssprotected' => 'Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.', 'customjsprotected' => 'Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.', @@ -812,20 +818,37 @@ $1', # Special:ChangeEmail 'changeemail' => 'Хийца электрони почт', +'changeemail-header' => 'Электрони почтан адрес хийцар', +'changeemail-text' => 'Юза хӀара форма хьайн электрони почтан адрес хуьйцуш. Ахьа хийцар бакъдан язъян еза пароль.', 'changeemail-no-info' => 'ХӀара агӀо лело системин чугӀо.', +'changeemail-oldemail' => 'Карара электронни почтан адрес:', +'changeemail-newemail' => 'Электрони почтан керла адрес:', 'changeemail-none' => '(яц)', +'changeemail-password' => 'Хьан пароль «{{SITENAME}}» проектан:', 'changeemail-submit' => 'Хийца email', 'changeemail-cancel' => 'Цаоьшу', +# Special:ResetTokens +'resettokens' => 'Токенаш кхоссар', +'resettokens-text' => 'Хьан йиш ю токенаш кхосса, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ю хьан дӀаяздар ца вовшахтесна. + +Хьона иза оьшу, ахьа хьай токенаш цхьам гучу яьхна елахь я хьан аккаунт йохийна елахь.', +'resettokens-legend' => 'Токенаш кхоссар', +'resettokens-tokens' => 'Токенаш:', +'resettokens-token-label' => '$1 (карара маьӀна: $2)', +'resettokens-watchlist-token' => 'Веб-каналан (Atom/RSS) токен [[Special:Watchlist|хьан тергаме могӀам чура агӀонашна хийцамаш бар]]', +'resettokens-done' => 'Токенаш кхиссина.', +'resettokens-resetbutton' => 'Къастина токенаш кхоссар', + # Edit page toolbar 'bold_sample' => 'Дерстино до йоза', 'bold_tip' => 'Дерстино до йоза', 'italic_sample' => 'Сеттан до йоза', 'italic_tip' => 'Сеттан до йоза', 'link_sample' => 'Хьажориган коьрта могlа', -'link_tip' => 'Чоьхьа хьажориг', -'extlink_sample' => 'http://www.example.com хьажориг корта', -'extlink_tip' => 'Арахьа хьажориг (йиц ма йе хlотталушерг http://)', +'link_tip' => 'Чоьхьа хьажораг', +'extlink_sample' => 'http://www.example.com хьажораг корта', +'extlink_tip' => 'Арахьара хьажораг (йиц ма йе хӀотталушерг http://)', 'headline_sample' => 'Йозан корта', 'headline_tip' => 'Корта 2-гlа локхаллийца', 'nowiki_sample' => 'Чудиллийша кхузе барамхlоттонза йоза.', @@ -833,7 +856,7 @@ $1', 'image_sample' => 'Example.jpg', 'image_tip' => 'Чохь йолу файл', 'media_sample' => 'Example.ogg', -'media_tip' => 'Хьажориг медиа-файлан тӀе', +'media_tip' => 'Хьажораг медиа-файлан тӀе', 'sig_tip' => 'Хьан куьгтаlор аъ хlоттина хан', 'hr_tip' => 'Ана сиз (сих сиха ма леладайша)', @@ -850,6 +873,8 @@ $1', 'summary-preview' => 'Цуьнах лаьцна хирду:', 'blockedtitle' => 'Декъашхочун блоктоьхана', 'nosuchsectiontitle' => 'Дакъа каро йиш яц.', +'nosuchsectiontext' => 'Хьо гӀерта дуцу дакъа тадан. +Хьо хӀокху агӀоне хьоьжучу хенахь иза кхечухьа деккхина я дӀадаьккхина хела тарло.', 'loginreqtitle' => 'Хьай цӀарца чугӀо', 'loginreqlink' => 'Логин', 'accmailtitle' => 'Пароль дlаяхьийтина.', @@ -1011,6 +1036,7 @@ $1', # History merging 'mergehistory-from' => 'Дуьххьарлера агӀоно', +'mergehistory-fail' => 'АгӀонийн истореш вовшахтоха цаделира, дехар до агӀона параметаршка а хене а хьажа.', 'mergehistory-invalid-source' => 'Хьостан нийса корта хила еза.', 'mergehistory-invalid-destination' => 'Юзийна агӀона нийса корта хила еза.', 'mergehistory-reason' => 'Бахьан:', @@ -1109,17 +1135,20 @@ $1', 'prefs-email' => 'Электронан почтан параметраш', 'prefs-rendering' => 'Арахьара хатl', 'saveprefs' => 'lалашдан', +'resetprefs' => 'Кхоссар', 'restoreprefs' => 'МеттахӀоттабе гӀирс Iад битарца', 'prefs-editing' => 'Тадар', 'rows' => 'МогӀанаш:', 'columns' => 'БӀогӀамаш:', 'searchresultshead' => 'Лаха', 'resultsperpage' => 'Карийначу дӀаяздаршан дукхалла:', -'stub-threshold' => 'Кеч яран доза коьртамогӀамна хьажоригаш (байташках):', +'stub-threshold' => 'Кеч яран доза коьртамогӀамна хьажорагаш (байташках):', 'recentchangesdays' => 'Керла нисдар гайта динахь:', 'recentchangesdays-max' => 'Къезиг $1 {{PLURAL:$1|дена}}', 'recentchangescount' => 'Iад йитарца гойтуш долу нисдаршан дукхалла', 'prefs-help-recentchangescount' => 'Гойту керла нисдарш, агӀонашан истори, тептарш.', +'prefs-help-watchlist-token2' => 'Иза хьан тергаме могӀан къайла догӀа ду. +Муьлха и хуучунна йиш ю хьан тергаме могӀам беша, цундела ма хаийта иза кхечаьрга. [[Special:ResetTokens|ТӀетаӀа йе кхуза и хьайга кхосса лууш делахь]].', 'savedprefs' => 'Хьан гӀирс Ӏалашбина.', 'timezonelegend' => 'Сахьатан аса:', 'localtime' => 'Меттигера хан:', @@ -1222,21 +1251,73 @@ $1', 'grouppage-suppress' => '{{ns:project}}:Ревизораш', # Rights +'right-read' => 'агӀонашка хьажар', 'right-edit' => 'АгӀоаш нисяр', 'right-createpage' => 'АгӀонаш кхоллар (дийцарш дац)', 'right-createtalk' => 'Дийцаре агӀонаш кхоллар', 'right-createaccount' => 'декъашхошна керла дӀаяздарш кхоллар', +'right-minoredit' => '«къезиг хийцам» аьлла билгало хӀоттор', 'right-move' => 'АгӀонашан цӀераш хийцар', 'right-move-subpages' => 'АгӀонашан цӀераш хийцар цера бухара агӀонашцан', +'right-move-rootuserpages' => 'декъашхочун ораман агӀонийн цӀераш хийцар', 'right-movefile' => 'Файланши цӀе хийцар', +'right-suppressredirect' => 'агӀона цӀе хуьйцуш ширчу цӀарах ма кхолла дӀасахьажаяр', 'right-upload' => 'Файлаш чуйаьхар', +'right-reupload' => 'йолуш йолу чера тӀехула файлаш дӀаязъяр', +'right-reupload-own' => 'тохарлеррачу декъашхочо файлаш юху дӀаязъяр', +'right-reupload-shared' => 'юкъахь йолу проекташкара файлаш чоьхьарачу файлашца хийцар', +'right-upload_by_url' => 'URL адресца файлаш чуяхар', +'right-purge' => 'бакъдеш йолу агӀо йиссалц, агӀонийн кэш цӀанъян', +'right-autoconfirmed' => 'IP-адресан чехкалин доза дац', +'right-bot' => 'автоматически процес сана лара', +'right-nominornewtalk' => 'агӀонашкахь къезиг нисдарш цахиларо хуьлуьйту керла хаамийн хӀоттам', +'right-apihighlimits' => 'API-дехарш кхочушдан кӀезиг дихкар', +'right-writeapi' => 'дӀаяздеш лелойо API', 'right-delete' => 'агӀош дӀаяхар', 'right-bigdelete' => 'еха хийцаман истори йолу агӀонаш дӀаяхар', +'right-deletelogentry' => 'тептар чура билгала дӀаяздарш дӀадахар а меттахӀиттадар а.', +'right-deleterevision' => 'агӀонийн билгала версеш дӀаяхар а меттахӀиттаяр а', +'right-deletedhistory' => 'дӀаяхна агӀонийн исторега хьажар дӀадаьккхина йоза тӀекхочехь доцуш', +'right-deletedtext' => 'дӀадаьккхина йозане а хийцамашка а хьажар агӀонийн дӀаяхна версин юккъахь', 'right-browsearchive' => 'ДӀаяхна агӀонаш лахар', 'right-undelete' => 'АгӀонаш меттахӀоттор', +'right-suppressrevision' => 'куьйгалхойх хьулйина йолу агӀонийн версеш меттахӀиттаяр а хьажар а', +'right-suppressionlog' => 'долара тептаршка хьажар', +'right-block' => 'кхечу декъашхошка тадарш ца дайта дехкар хӀоттор', 'right-blockemail' => 'Цамагдо декъашхошка хааман кехаташ кхехьийта', +'right-hideuser' => 'декъашхочун цӀе а и лечкъо а цамагор', +'right-ipblock-exempt' => 'IP блоктохаршна чекхбовлар, диапазонийн шаблоктохаршна а блоктохаршна а', +'right-proxyunbannable' => 'проксен автоматически блоктохаран чекхбовлар', 'right-unblockself' => 'ша шин блокдӀаяккхар', 'right-protect' => 'АгӀона гӀоралла хийцар а гӀоралла дина агӀо нисяр а', +'right-editprotected' => '«{{int:protect-level-sysop}}» бахьанца гӀоралла дина агӀонаш нисяр', +'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» бахьанца гӀоралла дина агӀонаш нисяр', +'right-editinterface' => 'лелош йолу интерфейсан хийцам бар', +'right-editusercssjs' => 'кхечу декъашхойн CSS- а JS- а файлаш нисяр', +'right-editusercss' => 'кхечу декъашхойн CSS-файлаш нсяр', +'right-edituserjs' => 'кхечу декъашхойн JavaScript-файлаш нисяр', +'right-editmyusercss' => 'Декъашхочун CSS файлаш таяр', +'right-editmyuserjs' => 'Лелош йолу шен JavaScript-файлаш таяр', +'right-viewmywatchlist' => 'Шен тергаме могӀане хьажар', +'right-editmywatchlist' => 'Хьайн тергаме могӀам табар. Тидам бе, цхьадолу динарш могӀам юкъа шаш кхетар ду.', +'right-viewmyprivateinfo' => 'Хьан долара хаамашка хьажар (масала, электронан адрес, бакъ цӀе)', +'right-editmyprivateinfo' => 'Хьан долара хаамаш нисбар (масала, электронан адрес, бакъ цӀе)', +'right-editmyoptions' => 'Тае хьайн гӀоли хетарг', +'right-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина нисдарш сиха юхадахар', +'right-markbotedits' => 'юхудохучу нисдаршан шаболх бечунна нисдарш аьлла билгало ян', +'right-noratelimit' => 'чехкалин доза дац', +'right-import' => 'кхечу википедешкара агӀонаш импорт ян', +'right-importupload' => 'файлаш чуяхарца агӀонаш импорт ян', +'right-patrol' => 'нисдарш хьаьжна сана билгалдар', +'right-patrolmarks' => 'керла нисдарийн хьаьжна билгалонашка хьажар', +'right-unwatchedpages' => 'тергамехь йоцу агӀонийн могӀане хьажар', +'right-mergehistory' => 'агӀонаш вовшахтохар', +'right-userrights' => 'декъашхойн массо бакъонаш хийцар', +'right-userrights-interwiki' => 'кхечу вики сайташкара декъашхойн бакъонаш хийцар', +'right-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а', +'right-override-export-depth' => 'агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан', +'right-sendemail' => 'кхечу декъашхошка электронан хаамаш кхехьийта', +'right-passwordreset' => 'пароль хийцарца электроннан хаамашка хьажар', # Special:Log/newusers 'newuserlogpage' => 'Декъашхой дlабазбина тептар', @@ -1248,9 +1329,13 @@ $1', 'action-read' => 'хӀара агӀо ешар', 'action-edit' => 'нисйа хlара агlо', 'action-move' => 'хӀокху агӀон цӀе хийца', +'action-move-rootuserpages' => 'декъашхочун ораман агӀонийн цӀераш хийцар', 'action-delete' => 'дӀаяккха хӀара агӀо', 'action-deletedhistory' => 'хӀокху агӀона дӀаяккхинцу исторега хьажар', 'action-undelete' => 'хӀара агӀо меттахӀоттор', +'action-patrol' => 'кхечера нисдарш хьаьжна сана билгалдар', +'action-autopatrol' => 'шен нисдарш хьаьжна сана билгалдар', +'action-siteadmin' => 'хаамийн гуламан блоктохар а блокдӀаяккхар а', # Recent changes 'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}', @@ -1294,7 +1379,7 @@ $1', 'recentchangeslinked-summary' => "Хlара хийцам биначу агlонашан могlам бу, тlетовжар долуш хьагучу агlон (йа хьагойтуш йолучу категорена). Агlонаш юькъайогlуш йолу хьан [[Special:Watchlist|тергаме могlам чохь]] '''къастийна йу'''.", 'recentchangeslinked-page' => 'Агlон цlе:', -'recentchangeslinked-to' => 'Кхечу агlор, гайта хийцамаш агlонашца, хlоттийначу агlонтlе хьажориг йолуш', +'recentchangeslinked-to' => 'Кхечу агӀор, гайта хийцамаш агӀонашца, хӀоттийначу агӀонтӀе хьажораг йолуш', # Upload 'upload' => 'Файл чуяккхар', @@ -1302,7 +1387,7 @@ $1', 'reuploaddesc' => 'Юху гӀо файл чуйоккху агӀоне', 'upload-tryagain' => 'ДӀадахьийта хийцина файлах лаьцнарг', 'uploadnologintext' => 'Серверан чу файлаш яха хьо $1.', -'upload-permitted' => 'Магийна файлашан тайпанаш: $1.', +'upload-permitted' => 'Магийна файлийн тайпанаш: $1.', 'uploadlogpage' => 'Чуяхаран тéптар', 'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна файлаши. Ишта хьажа. [[Special:ImageList|файлаши могlам]] йа [[Special:NewImages|галеларе файлаши]].', 'filename' => 'Файлан цӀе', @@ -1312,6 +1397,7 @@ $1', 'filesource' => 'Хьост:', 'ignorewarning' => 'ХӀума дац чуяккха файл', 'ignorewarnings' => 'ДӀахедар тергал ца дан', +'badfilename' => 'Файлан цӀе оцу $1.', 'emptyfile' => 'Ахьа чуйоккхуш йолу файл еса хийла там бу. Иза гӀалат хийла мега файлан цӀе нийса язйина йоцу дела. Дехар до хьажа бакъалла и юьй ахьа чуйоккхуш йолу файл.', 'file-deleted-duplicate' => 'Иштта файл ([[:$1]]) хӀинцале дӀаяьккхина хилла. Дехар до, юху файл чуяккхале файл дӀаяккхаран историга хьажа.', 'uploadwarning' => 'Дlахьедар', @@ -1352,7 +1438,7 @@ PICT # тайп тайпан Декъашхо къастичи, цун керла файлаш гойту.', 'listfiles_search_for' => 'Лаха хIуман цIарца:', 'imgfile' => 'файл', -'listfiles' => 'Файлаши могӀам', +'listfiles' => 'Файлийн могӀам', 'listfiles_date' => 'Терахь', 'listfiles_name' => 'Файлан цӀе', 'listfiles_user' => 'Декъашхо', @@ -1374,7 +1460,7 @@ PICT # тайп тайпан 'filehist-dimensions' => 'Файлан барам', 'filehist-filesize' => 'Файлан барам', 'filehist-comment' => 'Билгалдаккхар', -'imagelinks' => 'Хьажоригаш оцу файлан', +'imagelinks' => 'Файл лелор', 'linkstoimage' => '{{PLURAL:$1|ТӀаьхьайогӀу $1 агӀо тӀетойжина|ТӀаьхьайогӀу $1 агӀонаш тӀетойжина|ТӀаьхьайогlу $1 агӀонаш тӀетойжина}} хӀокху файлан:', 'nolinkstoimage' => 'АгӀонашчохь файл лелош яц.', 'sharedupload' => 'Хlара хlума оцун $1 чура ю иза хила мега лелош кхечу кхолламашкахь.', @@ -1407,6 +1493,7 @@ PICT # тайп тайпан # MIME search 'mimesearch' => 'MIME хула лаха', +'mimesearch-summary' => 'ХӀокху агӀоно йиш хуьлуьйту MIME-тайпан файлаш харжа. Яздеш долу формат: чулацаман тайп/бухара тайп, масала image/jpeg.', 'mimetype' => 'MIME-тайп:', # Unwatched pages @@ -1417,10 +1504,17 @@ PICT # тайп тайпан # Unused templates 'unusedtemplates' => 'Лелош доцу кепаш', +'unusedtemplatestext' => 'Кхузахь дагар йина «{{ns:template}}» цӀерийн меттиган агӀонаш, кхечу агӀонийн юкъа тоьхна йоцу. +Диц ма делахь хьажа кеп агӀонашкахь лелош юй.', # Random page 'randompage' => 'Цахууш нисйелла агӀо', +# Random page in category +'randomincategory' => 'Категори чу цахууш нийса елла агӀо', +'randomincategory-selectcategory' => 'Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.', +'randomincategory-selectcategory-submit' => 'Дехьа гӀо', + # Random redirect 'randomredirect' => 'Цахууш нисделла дIасахьажор', @@ -1451,7 +1545,8 @@ PICT # тайп тайпан 'brokenredirects-edit' => 'нисйé', 'brokenredirects-delete' => 'дӀаяккха', -'withoutinterwiki' => 'Кхечу меттанашан хьажориг йоцу агIонаш', +'withoutinterwiki' => 'Юкъарвики-хьажорагаш йоцу агӀонаш', +'withoutinterwiki-summary' => 'Лахара агӀонийн юкъарвики-хьажорагаш яц:', 'withoutinterwiki-submit' => 'Гайта', 'fewestrevisions' => 'ЧIогIа кIезиг башхонаш йолу агIонаш', @@ -1459,8 +1554,8 @@ PICT # тайп тайпан # Miscellaneous special pages 'nbytes' => '$1 {{PLURAL:$1|байт|байташ|байт}}', 'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}', -'ninterwikis' => '$1 {{PLURAL:$1|юкъарвики-хьажориг|юкъарвики-хьажоригаш}}', -'nlinks' => '$1 {{PLURAL:$1|хьажориг|хьажоригаш}}', +'ninterwikis' => '$1 {{PLURAL:$1|юкъарвики-хьажораг|юкъарвики-хьажорагаш}}', +'nlinks' => '$1 {{PLURAL:$1|хьажораг|хьажорагаш}}', 'nmembers' => '$1 {{PLURAL:$1|хӀума|хӀумнаш}}', 'nimagelinks' => 'Лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}', 'ntransclusions' => 'лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}', @@ -1475,16 +1570,20 @@ PICT # тайп тайпан 'wantedcategories' => 'Оьшуш йолу категореш', 'wantedpages' => 'Оьшуш йолу агIонаш', 'wantedfiles' => 'Оьшуш йолу файлаш', +'wantedfiletext-cat' => 'Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула сиз хира ду. +Кхин йоцу файлаш гойту [[:$1]] чохь', +'wantedfiletext-nocat' => 'Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула сиз хира ду.', 'wantedtemplates' => 'Оьшуш долу кепаш', -'mostlinked' => 'Дуккха хьажоригаш тIе тоьхна йолу агIонаш', +'mostlinked' => 'Дуккха хьажорагаш тIе тоьхна йолу агIонаш', 'mostlinkedcategories' => 'Дуккха тӀе хьажораш йолу категореш', 'mostlinkedtemplates' => 'Массарел дуккха а леладо кепаш', 'mostcategories' => 'Дуккха категореш тӀе тоьхна йолу агӀонаш', 'mostimages' => 'Массарел дуккха лелайо файлаш', -'mostinterwikis' => 'Дуккха юкъарвики хьажоригаш тӀе тоьхна йолу агӀонаш', +'mostinterwikis' => 'Дуккха юкъарвики хьажорагаш тӀе тоьхна йолу агӀонаш', 'mostrevisions' => 'Сих сиха нисйина йолу агIонаш', 'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза', 'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)', +'prefixindex-strip' => 'Хиламийн могӀам чура префикс къайлаяккха', 'shortpages' => 'Боцоа яззамаш', 'longpages' => 'Беха яззамаш', 'deadendpages' => 'Дика йоцу агIонаш', @@ -1493,13 +1592,14 @@ PICT # тайп тайпан 'listusers' => 'Декъашхой могlам', 'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта', 'listusers-creationsort' => 'Кхолларан хене хьаьжна нисъяр', +'listusers-desc' => 'Харжа къезиг хиларца', 'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2', 'newpages' => 'Керла агlонаш', 'newpages-username' => 'Декъашхо:', 'ancientpages' => 'Яззамаш оцу терахьца тӀаьххьара тадар дина долу', 'move' => 'Цlе хийца', 'movethispage' => 'Хlокху агlон цlе хийца', -'unusedimagestext' => 'Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нисса йогlу хьажориг (URL) хlокху хlуман, хlокху могlаме йогlуш ялахь яцахь а иза хила мега жигара лелош.', +'unusedimagestext' => 'Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нийсса йогӀу хьажораг (URL) хӀокху хӀуман, хӀокху могӀаме йогӀуш ялахь яцахь а иза хила мега жигара лелош.', 'notargettitle' => 'Ӏалашо билгал йина яц', 'nopagetitle' => 'Ишта агӀо яц', 'nopagetext' => 'Ишта агӀо яц.', @@ -1549,9 +1649,13 @@ PICT # тайп тайпан 'sp-deletedcontributions-contribs' => 'къинхьегам', # Special:LinkSearch -'linksearch' => 'Арахьа хьажориг', +'linksearch' => 'Арахьара хьажораг', +'linksearch-pat' => 'Лаха кеп:', 'linksearch-ok' => 'Лаха', -'linksearch-line' => '$2 — хьажориг кху $1', +'linksearch-text' => 'Лело мега хӀоттош йолу символаш, масала, *.wikipedia.org. +Лакхара даржан домен мукъа хила еза , масала*.org
      +Ловш йолу {{PLURAL:$2|протокол|протоколаш}}: $1 (Iад йитарца http://, протокол бакъалла язъен яцахь).', +'linksearch-line' => '$2 — хьажораг кху $1', # Special:ListUsers 'listusersfrom' => 'Гучé баха декъашхой, болалуш болу тӀера:', @@ -1574,6 +1678,7 @@ PICT # тайп тайпан 'listgrouprights-members' => '(тобан могlам)', # Email user +'mailnologintext' => 'Электронан кехаташ кхехьийта йиш хилийта [[Special:UserLogin|системин чугӀо]] кхин декъашхошка хаамаш кхехьийта хьа [[Special:Preferences|гӀирса чохь]] бакъалла долу электронан почтан адрес хила деза.', 'emailuser' => 'Декъашхочун хааман кехат', 'emailuser-title-target' => 'Декъашхочунга кехат яздар', 'emailuser-title-notarget' => 'Декъашхочунга кехат яздар', @@ -1624,16 +1729,7 @@ PICT # тайп тайпан 'delete-confirm' => '$1 — дӀаяккхар', 'delete-legend' => 'ДӀаяккхар', 'historywarning' => "'''Тергам:''' хӀокху агӀона герггарчу хьесапехь $1 {{PLURAL:$1|версеш|верси|верси}} ю:", -'confirmdeletetext' => "
      -Хьо гӀерта '''[[Википеди:АгӀонаш дӀаяхар|хӀара агӀо дӀаяккха]]'''; '''дехар до''', хьажа [[Special:Whatlinkshere/{{FULLPAGENAMEE}}|хьажориг юй кхузе хьажийна]], дӀаяккхале хьалха уьш нисйа деза. -{{#switch:{{NAMESPACE}}|{{ns:File talk}}= -
      Хила мега, хӀара дийцаре агӀо -{{#ifexist:Media:{{PAGENAME}} -|{{#ifexist:File:{{PAGENAME}}|цигара файлан.|оц [[ВикидӀайуьллуче]]ра.}} -|йоцуш йолу файлан]] -}} -}} -
      ", +'confirmdeletetext' => "Хьо гӀерта агӀо я файл дӀаяккха '''дехар до''', дӀаяккхале хьалха хьажа [[{{MediaWiki:Policy-url}}|кхуза]].", 'actioncomplete' => 'Дешдерг кхочушди', 'actionfailed' => 'Кхочушъ дина дац', 'deletedtext' => '«$1» дӀаяккхина яра. @@ -1725,6 +1821,7 @@ PICT # тайп тайпан 'undeletebtn' => 'МеттахӀоттае', 'undeletelink' => 'хьажа/меттахӀоттае', 'undeleteviewlink' => 'хьажа', +'undeletereset' => 'ЦӀанъян', 'undeleteinvert' => 'Къастае массо', 'undeletecomment' => 'Бахьан:', 'undeletedrevisions' => '$1 {{PLURAL:$1|хийцамаш|хийцамаш|хийцамаш}} меттахӀоттайина', @@ -1767,22 +1864,22 @@ PICT # тайп тайпан 'sp-contributions-submit' => 'Лаха', # What links here -'whatlinkshere' => 'Хьажоригаш кхузе', -'whatlinkshere-title' => 'Агlонаш, хьажоригца оцу «$1»', +'whatlinkshere' => 'Хьажорагаш кхузе', +'whatlinkshere-title' => 'ХӀокхунца «$1» йолу агӀонаш', 'whatlinkshere-page' => 'Агlо:', -'linkshere' => "Тlаьхьайогlу агlонаш хьажоригца ю оцу '''[[:$1]]''':", -'nolinkshere' => "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашчохь хьажоригаш яц", +'linkshere' => "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажорагца ю", +'nolinkshere' => "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажорагаш яц.", 'nolinkshere-ns' => "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш", 'isredirect' => 'агlо-дlасахьажайар', 'istemplate' => 'лата йe', -'isimage' => 'Оцу суьртан хьажориг', +'isimage' => 'Файлан хьажораг', 'whatlinkshere-prev' => '{{PLURAL:$1|хьалхайодарг|хьалхайодарш|хьалхайодарш}} $1', 'whatlinkshere-next' => '{{PLURAL:$1|тlаьхьайогlург|тlаьхьайогlурш|тlаьхьайогlурш}} $1', -'whatlinkshere-links' => '← хьажоригаш', +'whatlinkshere-links' => '← хьажорагаш', 'whatlinkshere-hideredirs' => '$1 дlасахьажйар', 'whatlinkshere-hidetrans' => '$1 латораш', -'whatlinkshere-hidelinks' => '$1 хьажоригаш', -'whatlinkshere-hideimages' => '$1 файлашан хьажоригаш', +'whatlinkshere-hidelinks' => '$1 хьажорагаш', +'whatlinkshere-hideimages' => '$1 файлийн хьажорагаш', 'whatlinkshere-filters' => 'Литтарш', # Block/unblock @@ -1872,18 +1969,19 @@ PICT # тайп тайпан # Move page 'move-page' => '$1 — цlе хийцар', 'move-page-legend' => 'ЦӀe хийца яр', -'movepagetext' => "Леладан лахар хатlаьхь, хьо агlон цlе хуьйцуш ву, цхьатерра дехьа а докхуш цуьнан хийцаман тептар. -Тиша цlе хира ю дlасахьажйарехь керлачун тlе хьажийна. -Хьега далур ду ша шех дlасахьажор керла яккхар, хьалхалерачуьна метта йиллина йолу. -Нагахь ахьа иза цадинехь, дехар до, хьажа йуйла [[Special:DoubleRedirects|шалгlа]] а [[Special:BrokenRedirects|хадийначу дlасахьажориш]]. -Ахьа жоп лур ду кхин дlа а хьажориг хьажийна хилийта, хила йезаче. - -Тергамбеш хила, иза агlо '''хира яц''' цlе хийцина, нагахь иза цlе йолуш керла агlо йалахь, цхьа йолу хенахь, нагахь иза йалахь цхьан тlе хьажийна йа йаьсса а нисйарца истори йоцуш. -Иза бохург ду, хьега хийцалур ю оцу агlон цlе оцу цlарца, хlинц цуьна хилла йолу, нагахь ахьа гlалатонца цlе хийцанехь, йолуш йолу агlо цахууш йа мега хьа. - -'''ДlАХЬЕДАР!''' -Цlе хийцарца хила тарло барамашкахь а цамётту хийцам ''гlар йойлачу'' агlонашна. -Дехар до, кхин дlа хьо вахале, дика ойла йе, хьо кхеташ хиларехь тlаьхьа хиндолучунах.", +'movepagetext' => "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг. + +Хьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажорагаш]] юй техь аьлла. + +Шу жоьпехь ду хьажорагаш нийса некъ гойтуш хиларан. + +Тидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а. + +И бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц. + +'''ДӀАХЬЕДАР!''' + +ЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.", 'movepagetext-noredirectfixer' => "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг. Хьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажорагаш]] юй техь аьлла. @@ -1922,6 +2020,7 @@ PICT # тайп тайпан 'movepage-page-moved' => 'АгӀона $1 цӀе хийцина оцу $2.', 'movelogpage' => 'Цlераш хийцаран тептар', 'movesubpage' => '{{PLURAL:$1|Бухара агӀо|Бухара агӀонаш}}', +'movesubpagetext' => 'ХӀокху агӀона $1 {{PLURAL:$1|бухара агӀо ю|бухара агӀонаш ю}}.', 'movenosubpage' => 'ХӀокху агӀона бухара агӀонаш яц.', 'movereason' => 'Бахьан:', 'revertmove' => 'юхаяккха', @@ -1942,11 +2041,11 @@ PICT # тайп тайпан # Export 'export' => 'АгӀонаш араяхар', -'exporttext' => 'Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агlонаш йа гулдина йолу агlонаш хlокх XML барамца, йуха тlяхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хlокху MediaWiki гlирсаца. +'exporttext' => 'Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агӀонаш йа гулдина йолу агӀонаш хӀокх XML барамца, юха тӀяхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хlокху MediaWiki гlирсаца. -Кхечу меттера яззамаш чуйаха, чуязйе цlе редокхчу метте, цlхьа могlан цlе могlаршкахь, йуха харжа лаьи шуна Кхечу меттер чуйаха массо яззамашна истори хийцамбарш йа тlяхьаралера яззамна башхо. +Кхечу меттера яззамаш чуйаха, чуязйе цӀе тадечу метте, цӀхьа могӀан цӀе могӀаршкахь, юха харжа лаьи шуна Кхечу меттер чуйаха массо яззамашна истори хийцамбарш йа тӀяхьаралера яззамна башхо. -Шуьга кхи даландерг, лелаеш йолу меттиг къастаман машан хьажориг кхечу меттер чудаха тlяхьарлера башхон яззамаш. Массала оцу яззамна [[{{MediaWiki:Mainpage}}]] хlара хира йу хьажориг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].', +Шуьга кхи даландерг, лелаеш йолу меттиг къастаман машан хьажораг кхечу меттер чудаха тӀаьхьарлерачу башхон яззамаш. Масала оцу яззамна [[{{MediaWiki:Mainpage}}]] хӀара хира ю хьажораг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].', 'exportcuronly' => 'Карара верси бен юкъа ма тоха, юзийна хьалхалерра истори йоцуш', 'export-submit' => 'Экспорт ян', 'export-addcattext' => 'ТӀетоха агӀонаш категори чура:', @@ -1958,6 +2057,8 @@ PICT # тайп тайпан 'allmessagesname' => 'Хаам', 'allmessagesdefault' => 'Шаьшха йоза', 'allmessagescurrent' => 'Карарчу хенан йоза', +'allmessagestext' => 'ХӀара «MediaWiki» цӀерийн меттигера системан хаамийн могӀа бу. +Хьайна MediaWiki тая лууш делахь, дехар до, проект [//translatewiki.net translatewiki.net] [//www.mediawiki.org/wiki/Localisation юьйцучу хьажа].', 'allmessages-filter-legend' => 'Литтар', 'allmessages-filter' => 'Литтар оцу хьола хийцамца:', 'allmessages-filter-unmodified' => 'Хийцан йоцурш', @@ -1965,7 +2066,7 @@ PICT # тайп тайпан 'allmessages-filter-modified' => 'Хийцнарш', 'allmessages-prefix' => 'Литтар оцу дешахьалхе:', 'allmessages-language' => 'Мотт:', -'allmessages-filter-submit' => 'Дехьа вала', +'allmessages-filter-submit' => 'Дехьа гӀо', # Thumbnails 'thumbnail-more' => 'Доккха де', @@ -1976,6 +2077,7 @@ PICT # тайп тайпан 'import-interwiki-source' => 'Вики-хьост/агlо:', 'import-interwiki-templates' => 'Лата де массо кепаш', 'import-upload-filename' => 'Файлан цӀе:', +'import-comment' => 'Билгалдаккхар:', 'importnosources' => 'Юкъаравики-импортан хьост хаьржина яцара, дуьхьала хийцамашан истори чуяккхар дӀадайина ду.', # Import log @@ -2001,11 +2103,11 @@ PICT # тайп тайпан 'tooltip-ca-watch' => 'Тlетоха хlара агlо сан тергаме могlам юкъа', 'tooltip-ca-unwatch' => 'Дlайаккха хlара агlо хьай тергаме могlам юкъар', 'tooltip-search' => 'Лаха иза дош', -'tooltip-search-go' => 'Билгала и санна цlе йолучу агlон чу дехьа вала', +'tooltip-search-go' => 'Билгала и санна цӀе йолучу агӀон чу дехьа гӀо', 'tooltip-search-fulltext' => 'Лаха агlонаш ше чулацамехь хlара йоза долуш', -'tooltip-p-logo' => 'Коьрта агIо', -'tooltip-n-mainpage' => 'Дехьавалар коьрта агlончу', -'tooltip-n-mainpage-description' => 'Дехьавалар коьрта агlончу', +'tooltip-p-logo' => 'Коьрта агӀона дехьа гӀо', +'tooltip-n-mainpage' => 'Коьрта агӀона дехьа гӀо', +'tooltip-n-mainpage-description' => 'Коьрта агӀона дехьа гӀо', 'tooltip-n-portal' => 'Оцу кхолламах, мичахь хlу йу лаьташ а хlудалур ду шуьга', 'tooltip-n-currentevents' => 'Дlаоьхуш болу хаамашна могlам', 'tooltip-n-recentchanges' => 'Тlаьххьаралера хийцаман могlам', @@ -2020,7 +2122,7 @@ PICT # тайп тайпан 'tooltip-t-upload' => 'Чуйаха файлаш', 'tooltip-t-specialpages' => 'Белха агlонаши могlам', 'tooltip-t-print' => 'Хlокху агlонна зорба туху башхо', -'tooltip-t-permalink' => 'Даимна йолу хьажориг хlокху башха агlонна', +'tooltip-t-permalink' => 'Даима йолу хьажораг хӀокху башха агӀонна', 'tooltip-ca-nstab-main' => 'Яззамна чулацам', 'tooltip-ca-nstab-user' => 'ХӀора декъашхочун долахь йолу агӀо ю', 'tooltip-ca-nstab-media' => 'Медиа-файл', @@ -2059,7 +2161,7 @@ PICT # тайп тайпан # Spam protection 'spamprotectiontitle' => 'Совбиларна литтар', 'spamprotectiontext' => 'Хьо дӀаязъян гӀерта агӀо спам-литтаро дӀакъоьвлина. -Цуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажориг хилар.', +Цуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажораг хилар.', # Info page 'pageinfo-header-basic' => 'Коьрта хаам', @@ -2099,21 +2201,26 @@ PICT # тайп тайпан 'show-big-image-size' => '$1 × $2 пикселш', # Special:NewFiles -'newimages' => 'Керлачу файланшан галерий', +'newimages' => 'Керлачу файлийн галерий', 'newimages-summary' => 'ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.', 'newimages-legend' => 'Литтар', +'showhidebots' => '$1 шабелхалой', 'ilsubmit' => 'Лаха', 'sp-newimages-showfrom' => 'Гайта керла файлаш $2, $1 тӀера дуьйна', # Video information, used by Language::formatTimePeriod() to format lengths in the above messages 'seconds-abbrev' => '$1оцу', +# Human-readable timestamps +'hours-ago' => '$1 {{PLURAL:$1|сахьат}} хьалха', +'yesterday-at' => 'селхана $1 даьлча', + # Bad image list 'bad_image_list' => 'Барам хила беза ишта: -Лораш хира йу могlамяхь йолу хlумнаш (могlийн, йола луш йолу сабол тlира *). -Дуьхьаралера хьажориг магlарши хила беза хьажориг кху цамагдо сурт дуьлаче. -Тlяхьа йогlуш йолу хьажориг оцу могlарехь хира йу магóш, билгалла аьлча яззамаш долуче, сурт хьаллаточехь.', +Лораш хира ю могӀамяхь йолу хӀумнаш (могӀийн, йола луш йолу символ тӀира *). +Дуьххьаралера хьажораг магӀарши хила беза хьажораг кху цамагдо сурт дуьлаче. +ТӀяхьа йогӀуш йолу хьажораг оцу могӀарехь хира ю магóш, билгалла аьлча яззамаш долуче, сурт хьаллаточехь.', # Metadata 'metadata' => 'Метахаамаш', @@ -2164,6 +2271,7 @@ PICT # тайп тайпан 'exif-gpsaltitude' => 'Локхалла', 'exif-gpsdestlatitude' => 'Объектан дохалла', 'exif-gpsdatestamp' => 'Терахь', +'exif-jpegfilecomment' => 'JPEG-файлан билгалдаккхар', 'exif-keywords' => 'Коьрта дешнаш', 'exif-objectname' => 'Йоцца цӀе', 'exif-specialinstructions' => 'Къаьсттина тӀехьажор', @@ -2175,6 +2283,8 @@ PICT # тайп тайпан 'exif-originaltransmissionref' => 'ДӀадолалун меттиган код', 'exif-label' => 'Билгало', 'exif-datetimemetadata' => 'ТӀехьара метахаамаш хийцина терахь', +'exif-pngfilecomment' => 'PNG-файлан билгалдаккхар', +'exif-giffilecomment' => 'GIF-файлан билгалдаккхар', # Exif attributes 'exif-compression-1' => 'ТIеIовдан яц', @@ -2277,11 +2387,17 @@ PICT # тайп тайпан 'redirect' => 'Декъашхочун файлан тӀера дӀасхьажор', 'redirect-legend' => 'Файлан я агӀона тӀера дӀасхьажор', 'redirect-summary' => 'ХӀара агӀо лело йиш ю файлан я агӀона тӀера дӀасхьажош.', +'redirect-submit' => 'Дехьа гӀо', +'redirect-lookup' => 'Лаха:', 'redirect-value' => 'МаьӀна:', 'redirect-user' => 'Декъашхочун ID', +'redirect-revision' => 'АгӀона верси', +'redirect-file' => 'Файлан цӀе', # Special:FileDuplicateSearch 'fileduplicatesearch' => 'Лаха цхьатера йолу файлаш', +'fileduplicatesearch-summary' => 'Лаха цхьатера йолу файлаш хэш-кодаца.', +'fileduplicatesearch-legend' => 'Цхьатера ерш лахар', 'fileduplicatesearch-filename' => 'Файлан цӀе:', 'fileduplicatesearch-submit' => 'Лаха', 'fileduplicatesearch-info' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}
      Файлан барам: $3
      MIME-тайп: $4', @@ -2339,12 +2455,13 @@ PICT # тайп тайпан 'dberr-outofdate' => 'Хьуна хаалахь, цуьна йолу меттиг хила мега тишйелла черахь.', # HTML forms +'htmlform-invalid-input' => 'Ахьа яздинчу цхьан дакхано гӀалат далина', 'htmlform-submit' => 'ДӀадахьийта', 'htmlform-reset' => 'Цаоьшу хийцамаш', 'htmlform-selectorother-other' => 'Кхин', # New logging system -'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаякхина|дӀаякхина}} агӀо $3', +'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3', 'logentry-delete-restore' => '$1 {{GENDER:$2|меттахӀоттайина|меттахӀоттайина}} агӀо $3', 'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4', 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажийнарг цаюьтуш', @@ -2352,6 +2469,7 @@ PICT # тайп тайпан 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а', 'logentry-newusers-newusers' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1', 'logentry-newusers-create' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1', +'logentry-newusers-autocreate' => 'Автоматически кхоьллина {{GENDER:$2|декъашхочун}} $1 дӀаяздар', 'logentry-rights-rights' => '$1 {{GENDER:$2|хийцина}} хӀокхуна $3 бакъо $4 → $5', 'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|хийцина}} хӏокхуна $3 бакъо', 'rightsnone' => '(яц)', diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php index 3090f3f0c6..d083eb56a7 100644 --- a/languages/messages/MessagesCkb.php +++ b/languages/messages/MessagesCkb.php @@ -1182,7 +1182,7 @@ $1", 'search-result-size' => '$1 ({{PLURAL:$2|یەک وشە|$2 وشە}})', 'search-result-category-size' => '{{PLURAL:$1|Ù¡ ئەندام|$1 ئەندام}} ({{PLURAL:$2|Ù¡ ژێرپۆل|$2 ژێرپۆل}}, {{PLURAL:$3|Ù¡ پەڕگە|$3 پەڕگە}})', 'search-result-score' => 'پەیوەندی: $1%', -'search-redirect' => '(ئاڵوگۆڕ $1)', +'search-redirect' => '(ڕەوانەکەر $1)', 'search-section' => '(بەشی $1)', 'search-suggest' => 'ئایا مەبەستت ئەمە بوو: $1', 'search-interwiki-caption' => 'پرۆژە خوشکەکان', @@ -2461,12 +2461,9 @@ $1', 'ipb_blocked_as_range' => 'هەڵە: ئای‌پی $1 ڕاستەوخۆ بەربەست نەکراوە بۆیە ناکڕێت لە بەربەست لای‌ بەیت. ئەوە وەک بەشێک لە زنجیرە ئای‌پیی $2 بەربەست کراوە و هەر بەو شێوە دەکرێ لە بەربەست دەرچێ.', 'ip_range_invalid' => 'زنجیرە ئای‌پی نەگونجاو.', -'blockme' => 'بەربەست‌کردنی من', 'proxyblocker' => 'بەربەست‌کەری پرۆکسی', -'proxyblocker-disabled' => 'ئەم فەنکشێنە لەکار خستراوە.', 'proxyblockreason' => 'ناونیشانی ئای‌پی تۆ بەربەست‌کراوە لەبەر ئەوەی پرۆکسیەکی کراوەیە. تکایە پەیوەندی بکە بە دابینکەری خزمەتی ئینتەرنەتی خۆت یان پاڵپشتی تەکنیکی و ئاگادریان کەوە لەو کێشە ئەمنیە گرینگە.', -'proxyblocksuccess' => 'جێ‌بەجێ‌کرا.', 'sorbsreason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.', 'sorbs_create_account_reason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە. بۆیە ناتوانی هەژمارە درووست‌بکەی.', diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php index 81ba616a82..06378b9cca 100644 --- a/languages/messages/MessagesCs.php +++ b/languages/messages/MessagesCs.php @@ -2857,11 +2857,8 @@ Vizte též [[Special:BlockList|seznam vÅ¡ech probíhajících bloků]].', 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 není blokována přímo a tak ji nelze odblokovat. Je částí zablokovaného rozsahu $2, který může být odblokován.', 'ip_range_invalid' => 'Neplatný IP rozsah.', 'ip_range_toolarge' => 'Blokování rozsahů větších než /$1 není dovoleno.', -'blockme' => 'Zablokuj mě', 'proxyblocker' => 'Blokování proxy serverů', -'proxyblocker-disabled' => 'Tato funkce je vypnuta.', 'proxyblockreason' => 'VaÅ¡e IP adresa byla zablokována, protože funguje jako otevřený proxy server. Kontaktujte svého poskytovatele internetového připojení nebo technickou podporu a informujte je o tomto vážném bezpečnostním problému.', -'proxyblocksuccess' => 'Hotovo.', 'sorbsreason' => 'VaÅ¡e IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.', 'sorbs_create_account_reason' => 'VaÅ¡e IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet', 'xffblockreason' => 'IP adresa uvedená v hlavičce X-Forwarded-For, aÅ¥ už vaÅ¡e, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1', @@ -3215,6 +3212,8 @@ Uložte jej na svůj disk a nahrajte ho sem.', 'spam_reverting' => 'Revert na poslední verzi neobsahující odkazy na $1', 'spam_blanking' => 'VÅ¡echny verze obsahovaly odkazy na $1, vyprázdněno', 'spam_deleting' => 'VÅ¡echny verze obsahovaly odkazy na $1, smazáno', +'simpleantispam-label' => "Antispamová kontrola. +'''NEVYPLŇUJTE''' následující!", # Info page 'pageinfo-title' => 'Informace o stránce „$1“', @@ -3880,7 +3879,7 @@ Opravdu si přejete znovu tuto stránku založit?', # Separators for various lists, etc. 'ellipsis' => '…', -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← předchozí stránka', diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php index 67b86572d5..2d2d4bfab3 100644 --- a/languages/messages/MessagesCsb.php +++ b/languages/messages/MessagesCsb.php @@ -1041,7 +1041,6 @@ Biéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc 'blocklogentry' => 'zablokòwôł [[$1]], czas blokadë: $2 $3', 'unblocklogentry' => 'òdblokòwôł $1', 'block-log-flags-nocreate' => 'blokada ùsôdzaniô kònta', -'proxyblocksuccess' => 'Fertich.', # Developer tools 'lockbtn' => 'Zascëgôj bazã pòdôwków', diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php index 93a28bb156..194a62cae5 100644 --- a/languages/messages/MessagesCy.php +++ b/languages/messages/MessagesCy.php @@ -301,7 +301,7 @@ $messages = array( 'tagline' => 'Oddi ar {{SITENAME}}', 'help' => 'Cymorth', 'search' => 'Chwilio', -'searchbutton' => 'Chwilio', +'searchbutton' => 'Chwilier', 'go' => 'Eler', 'searcharticle' => 'Mynd', 'history' => 'Hanes y dudalen', @@ -334,7 +334,7 @@ $messages = array( 'articlepage' => 'Dangos tudalen bwnc', 'talk' => 'Sgwrs', 'views' => 'Golygon', -'toolbox' => 'Blwch offer', +'toolbox' => 'Offer', 'userpage' => 'Gweld tudalen y defnyddiwr', 'projectpage' => 'Gweld tudalen y wici', 'imagepage' => 'Gweld tudalen y ffeil', @@ -399,7 +399,7 @@ $1', 'youhavenewmessagesmulti' => 'Mae negeseuon newydd gennych ar $1', 'editsection' => 'golygu', 'editold' => 'golygu', -'viewsourceold' => 'dangos y tarddiad', +'viewsourceold' => 'dangos côd y dudalen', 'editlink' => 'golygu', 'viewsourcelink' => 'dangos côd y dudalen', 'editsectionhint' => "Golygu'r adran: $1", @@ -558,16 +558,16 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec 'loginprompt' => "Mae'n rhaid galluogi cwcis er mwyn mewngofnodi i {{SITENAME}}.", 'userlogin' => 'Mewngofnodi / creu cyfrif', 'userloginnocreate' => 'Mewngofnodi', -'logout' => 'Allgofnodi', +'logout' => 'Allgofnoder', 'userlogout' => 'Allgofnodi', 'notloggedin' => 'Nid ydych wedi mewngofnodi', 'userlogin-noaccount' => 'Dim cyfrif gennych?', 'userlogin-joinproject' => 'Ymuno â {{SITENAME}}', -'nologin' => "Dim cyfrif gennych? '''$1'''.", +'nologin' => 'Dim cyfrif gennych? $1.', 'nologinlink' => 'Crëwch gyfrif', 'createaccount' => 'Creu cyfrif newydd', -'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.", -'gotaccountlink' => 'Mewngofnodwch', +'gotaccount' => 'Oes cyfrif gennych eisoes? $1.', +'gotaccountlink' => 'Mewngofnodi', 'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?', 'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair', 'helplogin-url' => 'Help:Mewngofnodi', @@ -722,7 +722,7 @@ Y cyfrinair dros dro: $2", 'changeemail-none' => '(dim)', 'changeemail-password' => 'Eich cyfrinair ar {{SITENAME}}:', 'changeemail-submit' => 'Newidier y cyfeiriad e-bost', -'changeemail-cancel' => 'Dileer', +'changeemail-cancel' => 'Diddymer', # Special:ResetTokens 'resettokens' => 'Ailosod tocynnau', @@ -898,7 +898,7 @@ Cynigiodd y gweinyddwr a glodd y gronfa ddata y rheswm hwn dros ei chloi: $1", Dyma'r cofnod lòg diweddaraf, er gwybodaeth:", 'semiprotectedpagewarning' => "'''Sylwer:''' Mae'r dudalen hon wedi ei chloi; dim ond defnyddwyr cofrestredig a allant ei golygu. Dyma'r cofnod lòg diweddaraf, er gwybodaeth:", -'cascadeprotectedwarning' => "'''Dalier sylw:''' Mae'r dudalen hon wedi ei diogelu fel nad ond defnyddwyr â galluoedd gweinyddwyr sy'n gallu ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei|ei|eu|eu|eu|eu}} sgydol-ddiogelu.", +'cascadeprotectedwarning' => "'''Dalier sylw:''' Mae'r dudalen hon wedi ei diogelu fel nad ond defnyddwyr â galluoedd gweinyddwyr sy'n gallu ei newid, oherwydd ei bod yn rhan o'r {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol}} sydd wedi {{PLURAL:$1|ei sgydol-ddiogelu|ei sgydol-ddiogelu|eu sgydol-diogelu}}.", 'titleprotectedwarning' => "'''RHYBUDD: Mae'r dudalen hon wedi ei chloi; dim ond rhai defnyddwyr sydd â'r [[Special:ListGroupRights|gallu]] i'w chreu.''' Dyma'r cofnod lòg diweddaraf, er gwybodaeth:", 'templatesused' => 'Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y dudalen hon:', @@ -2288,9 +2288,11 @@ Gwelwch y $2 am gofnod o\'r dileuon diweddar.', 'deleteotherreason' => 'Rheswm arall:', 'deletereasonotherlist' => 'Rheswm arall', 'deletereason-dropdown' => "*Rhesymau arferol dros ddileu -** Ar gais yr awdur +** Sbam +** Fandaliaeth ** Torri'r hawlfraint -** Fandaliaeth", +** Ar gais yr awdur +** Ailgyfeiriad wedi torri", 'delete-edit-reasonlist' => 'Golygu rhestr y rhesymau dros ddileu', 'delete-toobig' => "Cafwyd dros $1 {{PLURAL:$1|o olygiadau}} i'r dudalen hon. Cyfyngwyd ar y gallu i ddileu tudalennau sydd wedi eu golygu cymaint â hyn, er mwyn osgoi amharu ar weithrediad databas {{SITENAME}} yn ddamweiniol.", @@ -2609,11 +2611,8 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br 'ipb_blocked_as_range' => "Gwall: Nid yw'r cyfeiriad IP $1 wedi'n rwystro'n uniongyrchol ac felly ni ellir ei ddadrwystro. Wedi dweud hynny, y mae'n rhan o'r amrediad $2 sydd wedi'i rwystro; gellir dadrwystro'r amrediad.", 'ip_range_invalid' => 'Ystod IP annilys.', 'ip_range_toolarge' => "Ni chaniateir rhwystrau ystod sy'n fwy na /$1.", -'blockme' => 'Rhwystro fi', 'proxyblocker' => 'Dirprwy-flociwr', -'proxyblocker-disabled' => 'Analluogwyd y swyddogaeth hon.', 'proxyblockreason' => "Mae eich cyfeiriad IP wedi'i rwystro gan ei fod yn ddirprwy agored. Cysylltwch â'ch Cyflenwr Gwasanaeth Rhyngrwyd neu gymorth technegol er mwyn eu hysbysu am y broblem ddiogelwch ddifrifol yma.", -'proxyblocksuccess' => 'Gwnaethpwyd.', 'sorbsreason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.', 'sorbs_create_account_reason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}. Ni allwch greu cyfrif', @@ -2958,6 +2957,8 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd 'spam_reverting' => 'Wedi adfer y diwygiad diweddaraf na sydd yn cynnwys cysylltiadau i $1', 'spam_blanking' => 'Roedd cysylltiadau i $1 gan bob golygiad, felly gwacawyd y dudalen', 'spam_deleting' => 'Roedd pob diwygiad yn cynnwys cysylltiadau â $1, felly fe ddilëwyd y dudalen', +'simpleantispam-label' => "Prawf gwrth-sbam. +'''Peidiwch''' â llenwi hwn!", # Info page 'pageinfo-title' => 'Manylion "$1"', diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php index 04e3d8ecec..29caffcee5 100644 --- a/languages/messages/MessagesDa.php +++ b/languages/messages/MessagesDa.php @@ -35,6 +35,7 @@ * @author Morten LJ * @author Najami * @author Nghtwlkr + * @author Overlaet * @author Palnatoke * @author Peter Alberti * @author Peter Andersen @@ -219,7 +220,7 @@ $messages = array( 'tog-enotifwatchlistpages' => 'Send mig en e-mail ved ændringer til en side eller fil pÃ¥ min overvÃ¥gningsliste', 'tog-enotifusertalkpages' => 'Send mig en e-mail nÃ¥r min brugerdiskussionsside ændres', 'tog-enotifminoredits' => 'Send mig ogsÃ¥ en e-mail ved mindre ændringer af sider og filer pÃ¥ min overvÃ¥gningsliste', -'tog-enotifrevealaddr' => 'Vis min e-mail-adresse i mails med besked om ændringer', +'tog-enotifrevealaddr' => 'Vis min e-mailadresse i e-mails med besked om ændringer', 'tog-shownumberswatching' => 'Vis antal brugere, der overvÃ¥ger', 'tog-oldsig' => 'Nuværende signatur:', 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning', @@ -361,7 +362,7 @@ $messages = array( 'vector-action-move' => 'Flyt', 'vector-action-protect' => 'Beskyt', 'vector-action-undelete' => 'Gendan', -'vector-action-unprotect' => 'Ændr beskyttelse', +'vector-action-unprotect' => 'Ændre beskyttelse', 'vector-simplesearch-preference' => 'Aktivér forenklet søgefelt (kun Vector-udseendet)', 'vector-view-create' => 'Opret', 'vector-view-edit' => 'Redigér', @@ -383,7 +384,7 @@ $messages = array( 'searcharticle' => 'GÃ¥ til', 'history' => 'Historik', 'history_short' => 'Historik', -'updatedmarker' => '(ændret)', +'updatedmarker' => 'opdateret siden sidste besøg', 'printableversion' => 'Udskriftsvenlig udgave', 'permalink' => 'Permanent henvisning', 'print' => 'Udskriv', @@ -398,10 +399,10 @@ $messages = array( 'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}', 'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}', 'protect' => 'Beskyt', -'protect_change' => 'ændr', +'protect_change' => 'ændre', 'protectthispage' => 'Beskyt side', -'unprotect' => 'Ændr beskyttelse', -'unprotectthispage' => 'Ændr beskyttelsen af denne side', +'unprotect' => 'Ændre beskyttelse', +'unprotectthispage' => 'Ændre beskyttelsen af denne side', 'newpage' => 'Ny side', 'talkpage' => 'Diskussion', 'talkpagelinktext' => 'diskussion', @@ -532,9 +533,9 @@ Dette kan indikere en fejl i softwaren.', 'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.", 'readonly' => 'Databasen er skrivebeskyttet', 'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornÃ¥r skrivebeskyttelsen ophæves igen', -'readonlytext' => 'Databasen er midlertidigt skrivebeskyttet. Forsøg venligst senere. +'readonlytext' => 'Databasen er i øjeblikket lÃ¥st for nye poster og andre ændringer, sandsynligvis for rutinemæssig databasevedligeholdelse, hvorefter den vil være tilbage til normal. -Årsag til spærringen: $1', +Den administrator som har lÃ¥st, gav denne forklaring: $1', 'missing-article' => 'Databasen burde indeholde siden "$1" $2, men det gør den ikke. Den sandsynlige Ã¥rsag er at du har fulgt et forældet link til en forskel eller en gammel version af en side der er blevet slettet. @@ -590,10 +591,10 @@ $2', 'customjsprotected' => 'Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.', 'mycustomcssprotected' => 'Du har ikke rettigheder til at redigere denne CSS-side.', 'mycustomjsprotected' => 'Du har ikke rettigheder til at redigere denne JavaScript-side.', -'myprivateinfoprotected' => 'Du har ikke tilladelse til at redigere dine private oplysninger.', -'mypreferencesprotected' => 'Du har ikke tilladelse til at redigere dine præferencer.', +'myprivateinfoprotected' => 'Du har ikke rettigheder til at redigere dine private oplysninger.', +'mypreferencesprotected' => 'Du har ikke rettigheder til at redigere dine indstillinger.', 'ns-specialprotected' => 'Sider i navnerummet {{ns:special}} kan ikke redigeres.', -'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.", +'titleprotected' => 'Dette sidenavn er blevet beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er "\'\'$2\'\'".', 'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet. Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".', @@ -621,10 +622,10 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].', 'yourpassword' => 'Din adgangskode:', 'userlogin-yourpassword' => 'Adgangskode', 'userlogin-yourpassword-ph' => 'Indtast din adgangskode', -'createacct-yourpassword-ph' => 'Indtast kodeord', +'createacct-yourpassword-ph' => 'Indtast en adgangskode', 'yourpasswordagain' => 'Gentag adgangskode', -'createacct-yourpasswordagain' => 'Bekræft kodeord', -'createacct-yourpasswordagain-ph' => 'Indtast kodeord igen', +'createacct-yourpasswordagain' => 'Bekræft adgangskode', +'createacct-yourpasswordagain-ph' => 'Indtast adgangskode igen', 'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})', 'userlogin-remembermypassword' => 'Husk mig', 'userlogin-signwithsecure' => 'Brug sikker forbindelse', @@ -655,19 +656,19 @@ Brug formularen nedenfor til at logge pÃ¥ som en anden bruger.', 'userlogin-createanother' => 'Opret en anden konto', 'createacct-join' => 'Indtast dine oplysninger nedenfor.', 'createacct-another-join' => 'Angiv den nye kontos oplysninger nedenfor.', -'createacct-emailrequired' => 'Mailadresse', -'createacct-emailoptional' => 'Mailadresse (valgfri)', -'createacct-email-ph' => 'Indtast din mailadresse', -'createacct-another-email-ph' => 'Indtast e-mail-adresse', +'createacct-emailrequired' => 'E-mailadresse', +'createacct-emailoptional' => 'E-mailadresse (valgfri)', +'createacct-email-ph' => 'Indtast din e-mailadresse', +'createacct-another-email-ph' => 'Indtast e-mailadresse', 'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse', -'createacct-realname' => 'Dit rigtige navn', +'createacct-realname' => 'Dit rigtige navn (valgfrit)', 'createaccountreason' => 'Begrundelse:', 'createacct-reason' => 'Årsag', -'createacct-reason-ph' => 'Hvorfor vil du oprette endnu en konto', +'createacct-reason-ph' => 'Hvorfor du vil oprette endnu en konto', 'createacct-captcha' => 'Sikkerhedskontrol', 'createacct-imgcaptcha-ph' => 'Indtast venligst ovenstÃ¥ende tekst', 'createacct-submit' => 'Opret din konto', -'createacct-another-submit' => 'Oprette en anden konto', +'createacct-another-submit' => 'Opret en anden konto', 'createacct-benefit-heading' => '{{SITENAME}} laves af mennesker som dig.', 'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}', 'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}', @@ -678,7 +679,7 @@ Vælg venligst et andet brugernavn.', 'loginerror' => 'Logon mislykket', 'createacct-error' => 'Fejl ved kontooprettelse', 'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1', -'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget pÃ¥. {{SITENAME}} bruger cookies til at logge brugere pÃ¥. Du har slÃ¥et cookies fra. Vær venlig at slÃ¥ cookies til, og derefter kan du logge pÃ¥ med dit nye brugernavn og kodeord.', +'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget pÃ¥. {{SITENAME}} bruger cookies til at logge brugere pÃ¥. Du har slÃ¥et cookies fra. Vær venlig at slÃ¥ cookies til, og derefter kan du logge pÃ¥ med dit nye brugernavn og adgangskode.', 'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere pÃ¥. Du har slÃ¥et cookies fra. SlÃ¥ dem venligst til og prøv igen.', 'nocookiesfornew' => 'Denne brugerkonto er ikke oprettet, da vi ikke kunne bekræfte dens kilde. Sørg for, at du har aktivereret cookies, genindlæs siden og prøv igen.', @@ -690,41 +691,40 @@ Der skelnes mellem store og bogstaver i brugernavne. Kontrollér stavemÃ¥den, eller [[Special:UserLogin/signup|opret en ny konto]].', 'nosuchusershort' => 'Der er ingen bruger ved navn "$1". Tjek din stavning.', 'nouserspecified' => 'Angiv venligst et brugernavn.', -'login-userblocked' => 'Denne bruger er blokeret. Login er ikke tilladt', +'login-userblocked' => 'Denne bruger er blokeret. Det er ikke tilladt at logge pÃ¥.', 'wrongpassword' => 'Den indtastede adgangskode var forkert. Prøv igen.', -'wrongpasswordempty' => 'Du glemte at indtaste password. Prøv igen.', +'wrongpasswordempty' => 'Du glemte at indtaste adgangskode. Prøv igen.', 'passwordtooshort' => 'Adgangskoden skal mindst være pÃ¥ $1 {{PLURAL:$1|tegn|tegn}}.', -'password-name-match' => 'Kodeordet mÃ¥ ikke være det samme som brugernavnet.', +'password-name-match' => 'Adgangskoden mÃ¥ ikke være det samme som brugernavnet.', 'password-login-forbidden' => 'Brugen af dette brugernavn og adgangskode er blevet forbudt.', -'mailmypassword' => 'Send nyt password', -'passwordremindertitle' => 'Nyt password til {{SITENAME}}', +'mailmypassword' => 'Send ny adgangskode', +'passwordremindertitle' => 'Ny midlertidig adgangskode til {{SITENAME}}', 'passwordremindertext' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har bedt om at vi sender dig en ny adgangskode til at logge pÃ¥ {{SITENAME}} ($4). En midlertidig adgangskode for bruger "$2" er blevet lavet, den er "$3". -Hvis dette var din mening, skal du logge ind og vælge en ny adgangskode nu. +Hvis dette var din mening, skal du logge pÃ¥ og vælge en ny adgangskode nu. Din midlertidige adgangskode vil udløbe om {{PLURAL:$5|en dag|$5 dage}}. Hvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke om din gamle adgangskode og ikke længere vil ændre den, kan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.', -'noemail' => 'Der er ikke oplyst en e-mail-adresse for bruger "$1".', +'noemail' => 'Der er ikke oplyst en e-mailadresse for bruger "$1".', 'noemailcreate' => 'Du skal angive en gyldig e-mailadresse', -'passwordsent' => 'En ny adgangskode er sendt til e-mail-adressen, -som er registreret for "$1". +'passwordsent' => 'En ny adgangskode er sendt til e-mailadressen, som er registreret for "$1". Du bør logge pÃ¥ og ændre din adgangskode straks efter du har modtaget e-mailen.', -'blocked-mailpassword' => 'Din IP-adresse er spærret for ændring af sider. For at forhindre misbrug, er det heller ikke muligt, at bestille et nyt password.', -'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mail-adresse. +'blocked-mailpassword' => 'Din IP-adresse er spærret for ændring af sider. For at forhindre misbrug, er det heller ikke muligt, at bestille en ny adgangskode.', +'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mailadresse. Før en e-mail kan modtages af andre brugere af {{SITENAME}}-mailfunktionen, skal adressen og dens tilhørsforhold til denne bruger bekræftes. Følg venligst anvisningerne i denne mail.', 'throttled-mailpassword' => 'Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.', 'mailerror' => 'Fejl ved afsendelse af e-mail: $1', 'acct_creation_throttle_hit' => 'Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere. Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.', -'emailauthenticated' => 'Din e-mail-adresse blev bekræftet $2 $3.', +'emailauthenticated' => 'Din e-mailadresse blev bekræftet $2 $3.', 'emailnotauthenticated' => 'Din e-mail-adresse er endnu ikke bekræftet og de avancerede e-mail-funktioner er slÃ¥et fra indtil bekræftelse har fundet sted (d.u.a.). Log ind med den midlertidige adgangskode, der er blevet sendt til dig, for at bekræfte, eller bestil et nyt pÃ¥ loginsiden.', -'noemailprefs' => 'Angiv en e-mail-adresse, sÃ¥ følgende funktioner er til rÃ¥dighed.', -'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).', -'invalidemailaddress' => 'E-mail-adressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mail-adresse med et korrekt format eller tøm feltet.', -'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres pÃ¥ denne wiki.', +'noemailprefs' => 'Angiv en e-mailadresse, sÃ¥ følgende funktioner er til rÃ¥dighed.', +'emailconfirmlink' => 'Bekræft din e-mailadresse', +'invalidemailaddress' => 'E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet.', +'cannotchangeemail' => 'De e-mailadresser, der er tilknyttet brugerkontoer, kan ikke ændres pÃ¥ denne wiki.', 'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.', 'accountcreated' => 'Brugerkonto oprettet', 'accountcreatedtext' => 'Brugerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) er oprettet.', @@ -744,12 +744,12 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit # Email sending 'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion", -'user-mail-no-addy' => 'Forsøgte at sende email uden en email-adresse', +'user-mail-no-addy' => 'Forsøgte at sende e-mail uden en e-mailadresse', 'user-mail-no-body' => 'Forsøgte at sende en e-mail med tomt eller urimeligt kort indhold.', # Change password dialog 'resetpass' => 'Skift adgangskode', -'resetpass_announce' => 'Log pÃ¥ med den via e-mail tilsendte password. For at afslutte tilmeldingen, skal du nu vælge et nyt password.', +'resetpass_announce' => 'Du loggede pÃ¥ med den via e-mail tilsendte adgangskode. For at afslutte tilmeldingen, skal du nu vælge en ny adgangskode.', 'resetpass_text' => '', 'resetpass_header' => 'Skift adgangskode', 'oldpassword' => 'Gammel adgangskode:', @@ -764,33 +764,33 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit 'resetpass-wrong-oldpass' => 'Ugyldig midlertidig eller gældende adgangskode. Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.', 'resetpass-temp-password' => 'Midlertidig adgangskode', -'resetpass-abort-generic' => 'Ændring af kodeord er blevet afbrudt af udvidelse', +'resetpass-abort-generic' => 'Ændring af adgangskode er blevet afbrudt af en udvidelse', # Special:PasswordReset 'passwordreset' => 'Nulstil adgangskode', 'passwordreset-text-one' => 'Udfyld denne formular for at nulstille din adgangskode.', 'passwordreset-text-many' => '{{PLURAL:$1|Udfyld en af felterne nedenfor for at nulstille din adgangskode.}}', 'passwordreset-legend' => 'Nulstil adgangskode', -'passwordreset-disabled' => 'Nulstilling af kodeord er slÃ¥et fra pÃ¥ denne wiki.', +'passwordreset-disabled' => 'Nulstilling af adgangskode er slÃ¥et fra pÃ¥ denne wiki.', 'passwordreset-emaildisabled' => 'E-mailfunktioner er slÃ¥et fra pÃ¥ denne wiki.', 'passwordreset-username' => 'Brugernavn:', 'passwordreset-domain' => 'Domæne:', -'passwordreset-capture' => 'Se den resulterende email?', +'passwordreset-capture' => 'Se den resulterende e-mail?', 'passwordreset-capture-help' => 'Hvis du krydser dette felt af, vil emailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.', -'passwordreset-email' => 'E-mail adresse:', +'passwordreset-email' => 'E-mailadresse:', 'passwordreset-emailtitle' => 'Kontooplysninger pÃ¥ {{SITENAME}}', -'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at fÃ¥ nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse: +'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at fÃ¥ nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse: $2 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}. -Du bør logge pÃ¥ og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.', -'passwordreset-emailtext-user' => 'Brugeren $1 pÃ¥ {{SITENAME}} har anmodet om at fÃ¥ nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse: +Du bør logge pÃ¥ og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.', +'passwordreset-emailtext-user' => 'Brugeren $1 pÃ¥ {{SITENAME}} har anmodet om at fÃ¥ nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse: $2 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}. -Du bør logge pÃ¥ og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.', +Du bør logge pÃ¥ og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.', 'passwordreset-emailelement' => 'Brugernavn: $1 Midlertidig adgangskode: $2', 'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet sendt.', @@ -798,15 +798,15 @@ Midlertidig adgangskode: $2', 'passwordreset-emailerror-capture' => 'En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1', # Special:ChangeEmail -'changeemail' => 'Ændr email-adresse', -'changeemail-header' => 'Ændr kontoens email-adresse', -'changeemail-text' => 'Udfyld denne formular for at ændre din email-adresse. Du skal indtaste dit kodeord for at bekræfte denne ændring.', +'changeemail' => 'Ændre e-mailadresse', +'changeemail-header' => 'Ændre kontoens e-mailadresse', +'changeemail-text' => 'Udfyld denne formular for at ændre din e-mailadresse. Du skal indtaste din adgangskode for at bekræfte denne ændring.', 'changeemail-no-info' => 'Du skal være logget pÃ¥ for at komme direkte til denne side.', -'changeemail-oldemail' => 'Nuværende email-adresse:', -'changeemail-newemail' => 'Ny email-adresse:', +'changeemail-oldemail' => 'Nuværende e-mailadresse:', +'changeemail-newemail' => 'Ny e-mailadresse:', 'changeemail-none' => '(ingen)', 'changeemail-password' => 'Din adgangskode til {{SITENAME}}:', -'changeemail-submit' => 'Ændr email', +'changeemail-submit' => 'Ændre e-mail', 'changeemail-cancel' => 'Afbryd', # Special:ResetTokens @@ -886,13 +886,13 @@ Begrundelsen for det er: Du kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen. -Bemærk at du ikke kan bruge funktionen "e-mail til denne bruger" medmindre du har en gyldig e-mail-adresse registreret i din [[Special:Preferences|brugerindstilling]], og du ikke er blevet blokeret fra at bruge den. +Bemærk at du ikke kan bruge funktionen "e-mail til denne bruger" medmindre du har en gyldig e-mailadresse registreret i din [[Special:Preferences|brugerindstilling]], og du ikke er blevet blokeret fra at bruge den. Din nuværende IP-adresse er $3, og blokerings-id\'et er #$5. Angiv venligst alle de ovenstÃ¥ende detaljer ved eventuelle henvendelser.', 'blockednoreason' => 'ingen begrundelse givet', 'whitelistedittext' => 'Du skal $1 for at kunne redigere sider.', -'confirmedittext' => 'Du skal først bekræfte e-mail-adressen, før du kan lave ændringer. Udfyld og bekræft din e-mail-adresse i dine [[Special:Preferences|Indstillinger]].', +'confirmedittext' => 'Du skal først bekræfte e-mailadressen, før du kan lave ændringer. Udfyld og bekræft din e-mailadresse i dine [[Special:Preferences|indstillinger]].', 'nosuchsectiontitle' => 'Kan ikke finde afsnittet', 'nosuchsectiontext' => 'Du forsøgte at ændre et ikke-eksisterende afsnit. Det kan være flyttet eller slettet, siden du hentede siden.', 'loginreqtitle' => 'Log pÃ¥ nødvendigt', @@ -1152,7 +1152,7 @@ Andre administratorer pÃ¥ {{SITENAME}} vil fortsat være i stand til at se det s 'revdelete-hide-comment' => 'Skjul ændringskommentar', 'revdelete-hide-user' => 'Skjul brugerens brugernavn/IP', 'revdelete-hide-restricted' => 'Skjul ogsÃ¥ informationen for administratorer', -'revdelete-radio-same' => '(ændr ikke)', +'revdelete-radio-same' => '(ikke ændre)', 'revdelete-radio-set' => 'Ja', 'revdelete-radio-unset' => 'Nej', 'revdelete-suppress' => 'Skjul ogsÃ¥ informationen for administratorer', @@ -1331,8 +1331,8 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d 'prefs-watchlist-token' => 'OvervÃ¥gningslistenøgle:', 'prefs-misc' => 'Forskelligt', 'prefs-resetpass' => 'Skift adgangskode', -'prefs-changeemail' => 'Ændr email', -'prefs-setemail' => 'Angiv en email-adresse', +'prefs-changeemail' => 'Ændre e-mailadresse', +'prefs-setemail' => 'Angiv en e-mailadresse', 'prefs-email' => 'Indstillinger for e-mail', 'prefs-rendering' => 'Udseende', 'saveprefs' => 'Gem indstillinger', @@ -1405,9 +1405,9 @@ Informationen vil være offentlig.', 'email' => 'E-mail', 'prefs-help-realname' => 'Angivelse af rigtigt navn er valgfrit. Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.', -'prefs-help-email' => 'Angivelse af e-mail-adresse er valgfrit. Det gør det muligt at sende dig en ny adgangskode hvis du glemmer den.', +'prefs-help-email' => 'Angivelse af e-mailadresse er valgfrit, men den gør det muligt at sende dig en ny adgangskode hvis du glemmer den.', 'prefs-help-email-others' => 'Du kan ogsÃ¥ vælge at lade andre kontakte dig gennem din bruger eller diskussions side uden at behøve at afsløre din identitet.', -'prefs-help-email-required' => 'E-mail-adresse er krævet.', +'prefs-help-email-required' => 'E-mailadresse er krævet.', 'prefs-info' => 'Grundlæggende information', 'prefs-i18n' => 'Internationalisering:', 'prefs-signature' => 'Signatur', @@ -1429,7 +1429,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit # User preference: email validation using jQuery 'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig', -'email-address-validity-invalid' => 'Indtast en gyldig e-mail adresse', +'email-address-validity-invalid' => 'Indtast en gyldig e-mailadresse', # User rights 'userrights' => 'HÃ¥ndtering af brugerrettigheder', @@ -1530,8 +1530,8 @@ Vær venlig at gennemse og bekræft dine ændringer.', 'right-editmyuserjs' => 'Redigere dine egne JavaScript-filer', 'right-viewmywatchlist' => 'Se din egen overvÃ¥gningsliste', 'right-editmywatchlist' => 'Redigere din egen overvÃ¥gningsliste. Bemærk nogle handlinger tilføjer sider selv uden denne rettelse.', -'right-viewmyprivateinfo' => 'Se dine egen private data (f.eks. e-mail-adresse, rigtige navn)', -'right-editmyprivateinfo' => 'Redigere din egen private data (f.eks. e-mail-adresse, rigtige navn)', +'right-viewmyprivateinfo' => 'Se dine egne private data (f.eks. e-mailadresse, rigtige navn)', +'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. e-mailadresse, rigtige navn)', 'right-editmyoptions' => 'Redigere dine egne indstillinger', 'right-rollback' => 'Hurtig gendannelse af alle redigeringer foretaget af den seneste bruger', 'right-markbotedits' => 'Markere gendannelser som ændringer foretaget af en robot', @@ -1593,7 +1593,7 @@ Vær venlig at gennemse og bekræft dine ændringer.', 'action-userrights' => 'ændre alle brugerrettigheder', 'action-userrights-interwiki' => 'ændre brugerrettigheder for brugere pÃ¥ andre wikier', 'action-siteadmin' => 'lÃ¥se eller lÃ¥se databasen op', -'action-sendemail' => 'sende email', +'action-sendemail' => 'sende e-mail', 'action-editmywatchlist' => 'rediger din overvÃ¥gningsliste', 'action-viewmywatchlist' => 'se din overvÃ¥gningsliste', 'action-viewmyprivateinfo' => 'se din private information', @@ -2243,17 +2243,17 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat 'mailnologin' => 'Du er ikke logget pÃ¥', 'mailnologintext' => 'Du skal være [[Special:UserLogin|logget pÃ¥]] og have en gyldig e-mailadresse sat i dine [[Special:Preferences|indstillinger]] for at sende e-mail til andre brugere.', 'emailuser' => 'E-mail til denne bruger', -'emailuser-title-target' => 'Send email til denne {{GENDER:$1|bruger}}', -'emailuser-title-notarget' => 'Send email til en bruger', +'emailuser-title-target' => 'Send e-mail til denne {{GENDER:$1|bruger}}', +'emailuser-title-notarget' => 'Send e-mail til en bruger', 'emailpage' => 'E-mail bruger', 'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne {{GENDER:$1|bruger}}. Den e-mail-adresse, du har angivet i [[Special:Preferences|dine indstillinger]], vil dukke op i "fra"-feltet pÃ¥ e-mailen, sÃ¥ modtageren kan svare dig.', 'usermailererror' => 'E-mail-modulet returnerede en fejl:', -'defemailsubject' => '{{SITENAME}}-email fra brugeren "$1"', +'defemailsubject' => '{{SITENAME}}-e-mail fra brugeren "$1"', 'usermaildisabled' => 'Bruger-e-mail deaktiveret', 'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere pÃ¥ denne wiki', -'noemailtitle' => 'Ingen e-mail-adresse', -'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.', +'noemailtitle' => 'Ingen e-mailadresse', +'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mailadresse.', 'nowikiemailtitle' => 'E-mail er ikke tilladt', 'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.', 'emailnotarget' => 'Ikke-eksisterende eller ugyldigt brugernavn for modtageren.', @@ -2378,11 +2378,12 @@ Bekræft venligst at du virkelig vil gøre dette, at du forstÃ¥r konsekvenserne, 'deletecomment' => 'Begrundelse:', 'deleteotherreason' => 'Anden/uddybende begrundelse:', 'deletereasonotherlist' => 'Anden begrundelse', -'deletereason-dropdown' => ' -*Hyppige sletningsÃ¥rsager -** Efter forfatters ønske +'deletereason-dropdown' => '* Hyppige sletningsÃ¥rsager +** Spam +** Hærværk ** Overtrædelse af ophavsret -** Hærværk', +** Efter forfatters ønske +** Brudt omdirigering', 'delete-edit-reasonlist' => 'Rediger sletningsÃ¥rsager', 'delete-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}}. Sletning af sÃ¥danne sider er begrænset, for at forhindre utilsigtet forstyrrelse af {{SITENAME}}.', 'delete-warning-toobig' => 'Denne side har en stor historik, over {{PLURAL:$1|en version|$1 versioner}} versioner, slettes den kan det forstyrre driften af {{SITENAME}}, gÃ¥ forsigtigt frem.', @@ -2417,7 +2418,7 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sideb 'modifiedarticleprotection' => 'ændrede beskyttelsen af "[[$1]]"', 'unprotectedarticle' => 'fjernede beskyttelse af "[[$1]]"', 'movedarticleprotection' => 'flyttede beskyttelsesindstillinger fra "[[$2]]" til "[[$1]]"', -'protect-title' => 'Ændr beskyttelse af "$1"', +'protect-title' => 'Ændre beskyttelse af "$1"', 'protect-title-notallowed' => 'FÃ¥ vist beskyttelsesniveauet af "$1"', 'prot_1movedto2' => '$1 flyttet til $2', 'protect-badnamespace-title' => 'Navnerum, der ikke kan beskyttes', @@ -2662,7 +2663,7 @@ Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.', 'ipblocklist-no-results' => 'Den angivene IP-addresse eller brugernavn er ikke blokeret.', 'blocklink' => 'bloker', 'unblocklink' => 'ophæv blokering', -'change-blocklink' => 'ændr blokering', +'change-blocklink' => 'ændre blokering', 'contribslink' => 'bidrag', 'emaillink' => 'send e-mail', 'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]". @@ -2697,11 +2698,8 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle 'ipb_blocked_as_range' => 'Fejl: IP-adressen $1 er ikke direkte blokeret. Derfor kan en blokering ikke ophæves. Adressen er blokeret som en del af intervallet $2. Denne blokering kan ophæves.', 'ip_range_invalid' => 'Ugyldigt IP-interval.', 'ip_range_toolarge' => 'Blokeringer af IP-serier større end /$1 er ikke tilladte.', -'blockme' => 'Bloker mig', 'proxyblocker' => 'Proxy-blokering', -'proxyblocker-disabled' => 'Denne funktion er ikke i brug.', 'proxyblockreason' => "Din IP-adresse er blevet blokeret fordi den er en sÃ¥kaldt ''Ã¥ben proxy''. Kontakt din Internet-udbyder eller tekniske hotline og oplyse dem om dette alvorlige sikkerhedsproblem.", -'proxyblocksuccess' => 'Færdig.', 'sorbsreason' => 'IP-adressen er opført i DNSBL pÃ¥ {{SITENAME}} som Ã¥ben PROXY.', 'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL pÃ¥ {{SITENAME}} som Ã¥ben PROXY. Oprettelse af nye brugere er ikke mulig.', 'xffblockreason' => 'En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en pÃ¥ en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1', @@ -2958,7 +2956,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge Du kan se pÃ¥ kildeteksten.', 'tooltip-ca-history' => 'Tidligere versioner af denne side', 'tooltip-ca-protect' => 'Beskyt denne side', -'tooltip-ca-unprotect' => 'Ændr beskyttelsen af denne side', +'tooltip-ca-unprotect' => 'Ændre beskyttelsen af denne side', 'tooltip-ca-delete' => 'Slet denne side', 'tooltip-ca-undelete' => 'Gendan de redigeringer der blev lavet pÃ¥ denne side før den blev slettet', 'tooltip-ca-move' => 'Flyt denne side', @@ -3043,6 +3041,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.', 'spam_reverting' => 'Sidste version uden henvisning til $1 gendannet.', 'spam_blanking' => 'Alle versioner, som indeholdt henvisninger til $1, er renset.', 'spam_deleting' => 'Alle versioner indeholder henvisninger til $1, sletter', +'simpleantispam-label' => "Anti-spam tjek. +Udfyld '''IKKE''' dette!", # Info page 'pageinfo-title' => 'Information om "$1"', @@ -3617,37 +3617,39 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi 'limitall' => 'alle', # Email address confirmation -'confirmemail' => 'Bekræft e-mail-adressen', -'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mail-adresse i din [[Special:Preferences|brugerprofil]].', -'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik pÃ¥ kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik pÃ¥ dette link bekræftes, at e-mail-adressen er gyldig.', +'confirmemail' => 'Bekræft e-mailadresse', +'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mailadresse i din [[Special:Preferences|brugerprofil]].', +'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mailadresse (autentificering), før du kan bruge de udvidede e-mailfunktioner. Med et klik pÃ¥ kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik pÃ¥ dette link bekræftes, at e-mailadressen er gyldig.', 'confirmemail_pending' => 'En bekræftelsesmail er allerede sendt til dig. Hvis du først for nylig har oprettet brugerkontoen, vent da et par minutter pÃ¥ denne e-mail, før du bestiller en ny kode.', 'confirmemail_send' => 'Send bekræftelseskode', 'confirmemail_sent' => 'Bekræftelses-e-mail afsendt.', -'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mail-adresse. Denne kode skal ikke bruges til anmeldelsen, den kræves dog til aktiveringen af e-mail-funktionerne indenfor Wikien.', -'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt. +'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mailadresse. Denne kode skal ikke bruges til at logge pÃ¥, den kræves til aktivering af e-mailfunktionerne i Wikien.', +'confirmemail_sendfailed' => '{{SITENAME}} kunne ikke afsende din bekræftelsesmail. +Kontroller at e-mailadressen er korrekt. -Svarbesked fra mailserveren: $1', +Besked fra mailserveren: $1', 'confirmemail_invalid' => 'Ugyldig bekræftelseskode. Kodens gyldighed er muligvis udløbet.', -'confirmemail_needlogin' => 'Du skal $1 for at bekræfte e-mail-adressen.', -'confirmemail_success' => 'E-mail-adressen er nu bekræftet. Du kan nu logge pÃ¥.', -'confirmemail_loggedin' => 'E-mail-adressen er nu bekræftet.', -'confirmemail_error' => 'Der skete en fejl ved bekræftelsen af e-mail-adressen.', -'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mail-adressen', +'confirmemail_needlogin' => 'Du skal $1 for at bekræfte din e-mailadresse.', +'confirmemail_success' => 'E-mailadressen er blevet bekræftet. +Du kan nu [[Special:UserLogin|logge pÃ¥]].', +'confirmemail_loggedin' => 'Din e-mailadresse er nu bekræftet.', +'confirmemail_error' => 'Der skete en fejl under lagring af din bekræftelse.', +'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mailadresse', 'confirmemail_body' => 'Hej, -Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mail-adresse til brugerkontoen "$2" pÃ¥ {{SITENAME}}. +Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mailadresse til brugerkontoen "$2" pÃ¥ {{SITENAME}}. -For at aktivere e-mail-funktionen for {{SITENAME}} (igen) og for at bekræfte, at denne brugerkonto virkelig hører til din e-mail-adresse og dermed til dig, bedes du Ã¥bne det følgende link i din browser: $3 +For at aktivere e-mailfunktionen for {{SITENAME}} og for at bekræfte, at denne brugerkonto virkelig hører til din e-mailadresse og dermed til dig, bedes du Ã¥bne det følgende link i din browser: $3 Bekræftelseskoden er gyldig indtil følgende tidspunkt: $4 -Hvis denne e-mail-adresse *ikke* hører til den anførte brugerkonto, skal du i stedet Ã¥bne dette link i din browser: $5 +Hvis denne e-mailadresse *ikke* hører til den anførte brugerkonto, skal du i stedet Ã¥bne dette link i din browser: $5 -- {{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}', -'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret emailadressen for kontoen "$2" til denne adresse pÃ¥ {{SITENAME}}. +'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret e-mailadressen for kontoen "$2" til denne adresse pÃ¥ {{SITENAME}}. -For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere emailfunktionerne pÃ¥ {{SITENAME}}, bedes du Ã¥bne følgende link i en browser: +For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere e-mailfunktionerne pÃ¥ {{SITENAME}}, bedes du Ã¥bne følgende link i en browser: $3 diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php index afea0890cf..210078a30c 100644 --- a/languages/messages/MessagesDe.php +++ b/languages/messages/MessagesDe.php @@ -2919,11 +2919,8 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen 'ipb_blocked_as_range' => 'Fehler: Die IP-Adresse $1 wurde als Teil der Bereichssperre $2 indirekt gesperrt. Eine Entsperrung von $1 alleine ist nicht möglich.', 'ip_range_invalid' => 'Ungültiger IP-Adressbereich.', 'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.', -'blockme' => 'Sperre mich', 'proxyblocker' => 'Proxy blocker', -'proxyblocker-disabled' => 'Diese Funktion ist deaktiviert.', 'proxyblockreason' => 'Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.', -'proxyblocksuccess' => 'Erledigt.', 'sorbsreason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.', 'sorbs_create_account_reason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.', 'xffblockreason' => 'Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1', @@ -3285,6 +3282,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.', 'spam_reverting' => 'Letzte Version ohne Links zu $1 wiederhergestellt.', 'spam_blanking' => 'Alle Versionen mit einem Link zu $1 wurden bereinigt.', 'spam_deleting' => 'Alle Versionen mit einem Link zu $1 wurden gelöscht.', +'simpleantispam-label' => "Spamschutzprüfung. +Hier '''NICHTS''' eintragen!", # Info page 'pageinfo-title' => 'Informationen zu „$1“', @@ -4208,12 +4207,12 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung 'revdelete-uname-unhid' => 'Benutzername freigegeben', 'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren', 'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben', -'logentry-move-move' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4', -'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen', -'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung', -'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung, ohne selbst eine Weiterleitung anzulegen', -'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} Version $4 von Seite $3 als kontrolliert', -'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch Version $4 von Seite $3 als kontrolliert', +'logentry-move-move' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4', +'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen', +'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4 und überschrieb dabei eine Weiterleitung', +'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} die Seite $3 nach $4 und überschrieb dabei eine Weiterleitung, ohne selbst eine Weiterleitung anzulegen', +'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} die Version $4 von Seite $3 als kontrolliert', +'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch die Version $4 von Seite $3 als kontrolliert', 'logentry-newusers-newusers' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}', 'logentry-newusers-create' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}', 'logentry-newusers-create2' => 'Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}}', diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php index d87a09c28e..aa5ce1f21c 100644 --- a/languages/messages/MessagesDiq.php +++ b/languages/messages/MessagesDiq.php @@ -2805,11 +2805,8 @@ belka ver-grewtış wedariyayo.', labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no wedari.', 'ip_range_invalid' => 'Rêza IPi nêvêrena.', 'ip_range_toolarge' => 'Menzilan ke /$1 ra girdêrê inan rê izin nidano.', -'blockme' => 'Mi blok bik', 'proxyblocker' => 'blokarê proxyi', -'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.', 'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.', -'proxyblocksuccess' => 'Qeyd ke.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra DNSBL de proxy hesibyayo u liste biyo.', 'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo. @@ -3155,6 +3152,8 @@ Tı eşkeno yew sebeb bınus.', 'spam_reverting' => 'agêriyeno revizyon o ke tawayê $1 ıney piya çiniyo', 'spam_blanking' => 'Revizyonê gredê $1 vineyay, wa weng kero', 'spam_deleting' => 'Revizyonê gredê $1 vineyay, wa besterneyê', +'simpleantispam-label' => "tehqiqatê Anti-spami. +no '''de mekerê'''!", # Info page 'pageinfo-title' => 'Heq tê "$1"\'i', diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php index c87a1e4cad..d53ebe1139 100644 --- a/languages/messages/MessagesDsb.php +++ b/languages/messages/MessagesDsb.php @@ -2508,11 +2508,8 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe 'ipb_blocked_as_range' => 'Zmólka: IP-adresa $1 njejo direktnje blokěrowana a njeda se wótblokěrowaś. Jo pak ako źěl wobcerka $2 blokěrowana, kótaryž da se wótblokěrowaś.', 'ip_range_invalid' => 'Njepłaśecy wobłuk IP-adresow.', 'ip_range_toolarge' => 'Wobcerkowe bloki, kótarež su wětÅ¡e ako /$1, njejsu dowólone.', -'blockme' => 'blokěruj mě', 'proxyblocker' => 'Blokěrowanje proxy', -'proxyblocker-disabled' => 'Toś ta funkcija jo znjemóžnjona.', 'proxyblockreason' => 'Twója IP-adresa jo se blokěrowała, dokulaž jo wócynjony proxy. PÅ¡osym kontaktěruj swójogo seśowego providera abo swóje systemowe administratory a informěruj je wó toś tom móžnem wěstotnem problemje.', -'proxyblocksuccess' => 'Gótowe.', 'sorbsreason' => 'Twója IP-adresa jo w DNSBL we {{GRAMMAR:lokatiw|{{SITENAME}}}} zapisana ako wócynjony proxy.', 'sorbs_create_account_reason' => 'Twója IP-adresa jo w DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} ako wócynjony proxy zapisana. Njejo móžno, nowe wužywarske konta załožowaś.', 'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twója pak ta proksy-serwera, kótaryž wužywaÅ¡, jo se zablokěrowała. Spócetna pśicyna za blokěrowanje jo była: $1', @@ -2850,6 +2847,8 @@ W zespominanju dajo se pśicyna pódaś.', 'spam_reverting' => 'Nawrośijo se slědna wersija, kótaraž njejo wopśimjeła wótkaz na $1.', 'spam_blanking' => 'WÅ¡ykne wersije su wopśimowali wótkaze na $1, do rěcha spórane.', 'spam_deleting' => 'WÅ¡ykne wersije z wótkazami do $1 so laÅ¡uju', +'simpleantispam-label' => "Antispamowa kontrola. +How '''NIC''' zapisaś!", # Info page 'pageinfo-title' => 'Informacije za bok "$1"', diff --git a/languages/messages/MessagesDv.php b/languages/messages/MessagesDv.php index 04b7ff014c..87c5aeb6d1 100644 --- a/languages/messages/MessagesDv.php +++ b/languages/messages/MessagesDv.php @@ -734,7 +734,6 @@ Also see [[Special:WantedCategories|wanted categories]].', 'blocklink' => 'ފިޔަވަޅުއަޅުއްވާ', 'unblocklink' => 'ފިޔަވަޅުއެޅުން ބަދަލުކުރައްވާ', 'contribslink' => 'ޙިއްޞާ', -'proxyblocksuccess' => 'ފުރިހަމަވެއްޖެ.', # Developer tools 'lockdb' => 'ކޮށާރު ބަންދުކުރައްވާ', diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php index 22e7b4edcb..410d7d91e9 100644 --- a/languages/messages/MessagesEl.php +++ b/languages/messages/MessagesEl.php @@ -579,7 +579,7 @@ $messages = array( 'articlepage' => 'Εμφάνιση σελίδας περιεχομένου', 'talk' => 'Συζήτηση', 'views' => 'Προβολές', -'toolbox' => 'Εργαλειοθήκη', +'toolbox' => 'Εργαλεία', 'userpage' => 'Προβολή σελίδας χρήστη', 'projectpage' => 'Προβολή σελίδας εγχειρήματος', 'imagepage' => 'Προβολή σελίδας αρχείου', @@ -2828,11 +2828,8 @@ $1', 'ipb_blocked_as_range' => 'Σφάλμα! Η φραγή της διεύθυνσης IP $1 δεν είναι άμεση και δεν μπορεί να αρθεί. Όμως αποτελεί μέρος της περιοχής $2, της οποίας η φραγή μπορεί να αρθεί.', 'ip_range_invalid' => 'Το εύρος των διευθύνσεων IP δεν είναι έγκυρο.', 'ip_range_toolarge' => 'Φραγές range μεγαλύτερων από /$1 δεν επιτρέπονται.', -'blockme' => 'Φραγή σε μένα', 'proxyblocker' => 'Εργαλείο φραγής διακομιστών (proxy blocker)', -'proxyblocker-disabled' => 'Η λειτουργία αυτή έχει απενεργοποιηθεί.', 'proxyblockreason' => 'Η διεύθυνση IP σας έχει υποστεί φραγή γιατί είναι open proxy. Παρακαλούμε επικοινωνείστε με τον παροχέα υπηρεσιών Διαδικτύου που χρησιμοποιείτε ή με την τεχνική υποστήριξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαρό θέμα ασφάλειας.', -'proxyblocksuccess' => 'Ολοκληρώθηκε!', 'sorbsreason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.', 'sorbs_create_account_reason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί open proxy στο DNSBL. Δεν μπορείτε να δημιουργήσετε λογαριασμό χρήστη.', 'cant-block-while-blocked' => 'Δεν μπορείτε να φράξετε άλλους χρήστες ενώ είστε φραγμένος/η.', @@ -2909,7 +2906,7 @@ $1', 'movepage-moved' => '\'\'\'"$1" μεταφέρθηκε στο "$2"\'\'\'', 'movepage-moved-redirect' => 'Δημιουργήθηκε μια ανακατεύθυνση.', 'movepage-moved-noredirect' => 'Η δημιουργία ανακατεύθυνσης παρεμποδίστηκε.', -'articleexists' => 'Υπάρχει ήδη σελίδα με αυτό το όνομα. Παρακαλούμε δώστε άλλο όνομα στη σελίδα.', +'articleexists' => 'Υπάρχει ήδη σελίδα με αυτό το όνομα, ή το όνομα που επιλέξατε δεν είναι αποδεκτό. Παρακαλούμε δώστε άλλο όνομα στη σελίδα.', 'cantmove-titleprotected' => "Δεν μπορείτε να μετακινήσετε μια σελίδα σ' αυτή τη θέση διότι έχει απαγορευθεί η δημιουργία αυτού του τίτλου", 'talkexists' => "Η ίδια η σελίδα μετακινήθηκε επιτυχώς αλλά όχι και η σελίδα συζήτησης, λόγω του ότι υπάρχει ήδη άλλη σελίδα συζήτησης κάτω από το νέο τίτλο. Παρακαλούμε ενοποιήστε τις δύο σελίδες με 'αντιγραφή-και-επικόλληση'.", 'movedto' => 'Μετακινήθηκε στο', @@ -3183,6 +3180,8 @@ $2', 'spam_reverting' => 'Επαναφορά στην τελευταία έκδοση που δεν περιέχει συνδέσμους στο $1', 'spam_blanking' => 'Όλες οι αναθεωρήσεις περιείχαν συνδέσμους προς το $1, εξάλειψη', 'spam_deleting' => 'Διαγραφή όλων των αναθεωρήσεων που περιείχαν συνδέσμους προς το $1', +'simpleantispam-label' => "Έλεγχος anti-spam. +'''ΜΗΝ''' το συμπληρώσετε αυτό!", # Info page 'pageinfo-title' => 'Πληροφορίες για "$1"', diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index e247442023..6d68d36aa5 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -392,7 +392,6 @@ $specialPageAliases = array( 'Badtitle' => array( 'Badtitle' ), 'Blankpage' => array( 'BlankPage' ), 'Block' => array( 'Block', 'BlockIP', 'BlockUser' ), - 'Blockme' => array( 'BlockMe' ), 'Booksources' => array( 'BookSources' ), 'BrokenRedirects' => array( 'BrokenRedirects' ), 'Categories' => array( 'Categories' ), @@ -791,7 +790,7 @@ future releases. Also note that since each list value is wrapped in a unique 'broken-file-category' => 'Pages with broken file links', 'categoryviewer-pagedlinks' => '($1) ($2)', # only translate this message to other languages if you have to change it -'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it +'linkprefix' => '/^((?>.*(? 'About', 'article' => 'Content page', @@ -874,7 +873,7 @@ future releases. Also note that since each list value is wrapped in a unique 'articlepage' => 'View content page', 'talk' => 'Discussion', 'views' => 'Views', -'toolbox' => 'Toolbox', +'toolbox' => 'Tools', 'userpage' => 'View user page', 'projectpage' => 'View project page', 'imagepage' => 'View file page', @@ -1212,7 +1211,7 @@ continue using your old password.', 'passwordsent' => 'A new password has been sent to the email address registered for "$1". Please log in again after you receive it.', 'blocked-mailpassword' => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.', -'eauthentsent' => 'A confirmation email has been sent to the nominated email address. +'eauthentsent' => 'A confirmation email has been sent to the specified email address. Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.', 'throttled-mailpassword' => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}. To prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.', @@ -3400,12 +3399,9 @@ See the [[Special:BlockList|block list]] for the list of currently operational b It is, however, blocked as part of the range $2, which can be unblocked.', 'ip_range_invalid' => 'Invalid IP range.', 'ip_range_toolarge' => 'Range blocks larger than /$1 are not allowed.', -'blockme' => 'Block me', 'proxyblocker' => 'Proxy blocker', -'proxyblocker-disabled' => 'This function is disabled.', 'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or technical support of your organization and inform them of this serious security problem.', -'proxyblocksuccess' => 'Done.', 'sorbs' => 'DNSBL', # only translate this message to other languages if you have to change it 'sorbsreason' => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.', 'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}. @@ -3855,6 +3851,8 @@ This is probably caused by a link to a blacklisted external site.', 'spam_reverting' => 'Reverting to last revision not containing links to $1', 'spam_blanking' => 'All revisions contained links to $1, blanking', 'spam_deleting' => 'All revisions contained links to $1, deleting', +'simpleantispam-label' => "Anti-spam check. +Do '''NOT''' fill this in!", # Info page 'pageinfo-header' => '-', # do not translate or duplicate this message to other languages diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php index fb5be50e23..b8ec1e55ad 100644 --- a/languages/messages/MessagesEo.php +++ b/languages/messages/MessagesEo.php @@ -2764,11 +2764,8 @@ La kialo donita por la forbaro de $1 estis: "$2"', 'ipb_blocked_as_range' => 'Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.', 'ip_range_invalid' => 'Malvalida IP-adresa intervalo.', 'ip_range_toolarge' => 'IP-adresaj intervaloj pli grandaj ol /$1 estas malpermesataj.', -'blockme' => 'Forbari min', 'proxyblocker' => 'Forbarilo por prokuriloj.', -'proxyblocker-disabled' => 'Ĉi tiu funkcio estas malŝaltita.', 'proxyblockreason' => 'Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aÅ­ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.', -'proxyblocksuccess' => 'Farita.', 'sorbsreason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.', 'sorbs_create_account_reason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.', 'cant-block-while-blocked' => 'Vi ne povas forbari aliajn uzantojn dum vi estas forbarita.', @@ -3135,6 +3132,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj. 'spam_reverting' => 'Restarigo de lasta versio ne entenante ligilojn al $1', 'spam_blanking' => 'Forviŝo de ĉiuj versioj entenantaj ligilojn al $1', 'spam_deleting' => 'Ĉiuj versioj enhavis ligilojn al $1 - forigante', +'simpleantispam-label' => 'Kontrolo kontraÅ­ spamo. +NE ENIGU ion ajn!', # Info page 'pageinfo-title' => 'Informoj por "$1"', diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php index be82bc2df7..df55273100 100644 --- a/languages/messages/MessagesEs.php +++ b/languages/messages/MessagesEs.php @@ -2893,11 +2893,8 @@ Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueo Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado.', 'ip_range_invalid' => 'El rango de IP no es válido.', 'ip_range_toolarge' => 'Los bloqueos de rango superiores a /$1 no están permitidos.', -'blockme' => 'Bloquearme', 'proxyblocker' => 'Bloqueador de proxies', -'proxyblocker-disabled' => 'Esta función está desactivada.', 'proxyblockreason' => 'Su dirección IP ha sido bloqueada porque es un proxy abierto. Por favor, contacte con su proveedor de servicios de Internet o con su servicio de asistencia técnica e infórmeles de este grave problema de seguridad.', -'proxyblocksuccess' => 'Hecho.', 'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.', 'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta', 'xffblockreason' => 'Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1', @@ -3262,6 +3259,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista 'spam_reverting' => 'Revirtiendo a la última versión que no contenga enlaces a $1', 'spam_blanking' => 'Todas las revisiones contienen enlaces a $1, blanqueando', 'spam_deleting' => 'Todas las revisiones que contienen enlaces a $1, en proceso de eliminación', +'simpleantispam-label' => 'Comprobación anti-spam +¡NO rellenes esto!', # Info page 'pageinfo-title' => 'Información para «$1»', diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php index 74f1332105..ecdae416ba 100644 --- a/languages/messages/MessagesEt.php +++ b/languages/messages/MessagesEt.php @@ -749,6 +749,9 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ 'userlogin-resetpassword-link' => 'Lähtesta oma parool', 'helplogin-url' => 'Help:Sisselogimine', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]', +'userlogin-loggedin' => 'Oled juba sisse logitud nimega {{GENDER:$1|$1}}. +Kasuta allolevat vormi, et logida sisse teise kasutajaga.', +'userlogin-createanother' => 'Loo teine konto', 'createacct-join' => 'Sisesta allapoole oma andmed.', 'createacct-another-join' => 'Sisesta allpool uue konto andmed.', 'createacct-emailrequired' => 'E-posti aadress', @@ -1230,10 +1233,10 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG 'revdelete-no-file' => 'Faili ei ole.', 'revdelete-show-file-confirm' => 'Kas oled kindel, et soovid häha faili "$1" kustutatud redaktsiooni, mis tehti $2 kell $3?', 'revdelete-show-file-submit' => 'Jah', -'revdelete-selected' => "'''{{PLURAL:$2|Valitud versioon|Valitud versioonid}} artiklist [[:$1]]:'''", +'revdelete-selected' => "'''Valitud {{PLURAL:$2|redaktsioon|redaktsioonid}} leheküljest [[:$1]]:'''", 'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''", -'revdelete-text' => "'''Kustutatud redaktsioonid kajastuvad endiselt lehe ajaloos ja logides, kuid osa nende sisust pole tavakasutajatele nähtav.''' -{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad varjatud sisu siiski vaadata ning seda vajadusel taastada, kui see pole just täiendavalt ära keelatud.", +'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.''' +{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.", 'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].', 'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel: * Sobimatu isiklik teave @@ -2452,10 +2455,12 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s 'deletecomment' => 'Põhjus:', 'deleteotherreason' => 'Muu või täiendav põhjus:', 'deletereasonotherlist' => 'Muu põhjus', -'deletereason-dropdown' => '*Harilikud kustutamise põhjused -** Autori palve +'deletereason-dropdown' => '* Harilikud kustutamise põhjused +** Rämpspostitus +** Vandalism ** Autoriõiguse rikkumine -** Vandalism', +** Autori palve +** Katkine ümbersuunamine', 'delete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid', 'delete-toobig' => 'See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}. Selle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.', @@ -2776,11 +2781,8 @@ Blokeering võib juba eemaldatud olla.', See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.', 'ip_range_invalid' => 'Vigane IP-vahemik.', 'ip_range_toolarge' => 'Suuremad aadressiblokid kui /$1 pole lubatud.', -'blockme' => 'Blokeeri mind', 'proxyblocker' => 'Proksiblokeerija', -'proxyblocker-disabled' => 'See funktsioon ei toimi.', 'proxyblockreason' => 'Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.', -'proxyblocksuccess' => 'Tehtud.', 'sorbsreason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.', 'sorbs_create_account_reason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi. Sa ei saa kasutajakontot luua.', @@ -3128,6 +3130,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk 'spam_reverting' => 'Taastan viimase versiooni, mis ei sisalda linke aadressile $1.', 'spam_blanking' => 'Kõik versioonid sisaldasid linke veebilehele $1. Lehekülg tühjendatud.', 'spam_deleting' => 'Kustutatud kõik redaktsioonid, mis viitasid aadressile $1.', +'simpleantispam-label' => "Rämpspostikontroll. +'''ÄRA''' täida seda välja!", # Info page 'pageinfo-title' => 'Teave lehekülje "$1" kohta', diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php index 825466dfe5..739314d266 100644 --- a/languages/messages/MessagesEu.php +++ b/languages/messages/MessagesEu.php @@ -2438,11 +2438,8 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.', 'ip_range_invalid' => 'Baliogabeko IP eremua.', 'ip_range_toolarge' => '/$1 baino handiagoak diren blokeo eremuak ezin dira eskuratu.', -'blockme' => 'Blokea nazazu', 'proxyblocker' => 'Proxy blokeatzailea', -'proxyblocker-disabled' => 'Funtzio hau ez-gaitua dago.', 'proxyblockreason' => 'Zure IP helbidea blokeatu egin da proxy ireki baten zaudelako. Mesedez, zure Interneteko Zerbitzu Hornitzailearekin harremanetan jar zaitez segurtasun arazo honetaz ohartarazteko.', -'proxyblocksuccess' => 'Egina.', 'sorbsreason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan.', 'sorbs_create_account_reason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan. Ezin duzu kontua sortu.', 'cant-block-while-blocked' => 'Blokeatuta zauden bitartean ezin dituzu beste lankideak blokeatu.', @@ -2510,7 +2507,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.", 'move-subpages' => 'Azpiorrialde guztiak ($1-tik gora) mugitu', 'move-talk-subpages' => 'Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu', 'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.', -'movepage-page-moved' => '$1 orria $2 izenera aldatu da.', +'movepage-page-moved' => '«$1» orria «$2» izenera aldatu da.', 'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.', 'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.', 'movelogpage' => 'Mugimendu erregistroa', @@ -2744,6 +2741,8 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.', 'spambot_username' => 'MediaWikiren spam garbiketa', 'spam_reverting' => '$1(e)rako loturarik ez daukan azken bertsiora itzultzen', 'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten', +'simpleantispam-label' => "Anti-spam egiaztapena. +Atal hau '''EZ''' bete!", # Info page 'pageinfo-title' => '"$1"(r)entzako informazioa', @@ -3584,9 +3583,9 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.', 'revdelete-uname-unhid' => 'lankide ezkutua erakutsi', 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira', 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira', -'logentry-move-move' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du', +'logentry-move-move' => '$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du', 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du, birzuzenketarik utzi gabe', -'logentry-move-move_redir' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik', +'logentry-move-move_redir' => '$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik', 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe', 'logentry-patrol-patrol' => '$1(e)k $3 orrialdearen $4 berrikuzpena patruilatutzat {{GENDER:$2|markatu}} du', 'logentry-newusers-newusers' => '$1 erabiltzaile kontua sortu da', diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php index 6b0eefb7cb..cf6a54dc17 100644 --- a/languages/messages/MessagesExt.php +++ b/languages/messages/MessagesExt.php @@ -1663,11 +1663,8 @@ Escrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan 'ipb_cant_unblock' => "Marru: Nu s'á alcuentrau el tarugu con ID $1. Es posibri que ya aiga siu desatarugau.", 'ipb_blocked_as_range' => "Marru: La IP $1 nu s'alcuentra atarugá diretamenti, polo que nu puei sel desatarugá. Nu ostanti, hue atarugá cumu parti el intervalu $2, que puei sel desatarugau.", 'ip_range_invalid' => "Rangu d'IP nu premitiu.", -'blockme' => 'Atarugami', 'proxyblocker' => 'Tarugaol de proxys', -'proxyblocker-disabled' => "Esta hunción s'alcuentra desativá.", 'proxyblockreason' => "La tu direción IP á siu atarugá polque es un proxy abiertu. Pol favol, contauta con el tu proveol de sirvicius d'Internet u con el tu sirviciu d'asisténcia télefónica i enhórmalus desti gravi pobrema e seguráncia.", -'proxyblocksuccess' => 'Hechu.', 'sorbsreason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}.', 'sorbs_create_account_reason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}. Nu se te premiti crial una cuenta', diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php index de17d415d2..9744b0e575 100644 --- a/languages/messages/MessagesFa.php +++ b/languages/messages/MessagesFa.php @@ -606,7 +606,7 @@ $messages = array( 'vector-action-protect' => 'محافظت', 'vector-action-undelete' => 'احیا', 'vector-action-unprotect' => 'تغییر سطح حفاظت', -'vector-simplesearch-preference' => 'فعال کردن نوار جستجوی ساده‌شده (فقط در پوستهٔ برداری)', +'vector-simplesearch-preference' => 'فعال‌کردن نوار جستجوی ساده‌شده (فقط در پوستهٔ برداری)', 'vector-view-create' => 'ایجاد', 'vector-view-edit' => 'ویرایش', 'vector-view-history' => 'نمایش تاریخچه', @@ -655,7 +655,7 @@ $messages = array( 'articlepage' => 'نمایش مقاله', 'talk' => 'بحث', 'views' => 'بازدیدها', -'toolbox' => 'جعبه‌ابزار', +'toolbox' => 'ابزارها', 'userpage' => 'نمایش صفحهٔ کاربر', 'projectpage' => 'دیدن صفحهٔ پروژه', 'imagepage' => 'نمایش صفحهٔ پرونده', @@ -761,11 +761,11 @@ $1', # Main script and global functions 'nosuchaction' => 'چنین عملی وجود ندارد', -'nosuchactiontext' => 'عمل مشخص‌شده در نشانی اینترنتی غیرمجاز است. +'nosuchactiontext' => 'عمل مشخص‌شده در نشانی اینترنتی نامجاز است. ممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا پیوند مشکل‌داری را دنبال کرده باشید. همچنین ممکن است ایرادی در نرم‌افزار استفاده‌شده در {{SITENAME}} وجود داشته باشد.', 'nosuchspecialpage' => 'چنین صفحهٔ ویژه‌ای وجود ندارد', -'nospecialpagetext' => 'شما یک صفحهٔ ویژهٔ غیرمجاز را درخواست کرده‌اید. +'nospecialpagetext' => 'شما یک صفحهٔ ویژهٔ نامجاز را درخواست کرده‌اید. فهرستی از صفحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.', @@ -1077,7 +1077,7 @@ $2 'resettokens-legend' => 'بازنشانی شناساننده‌ها', 'resettokens-tokens' => 'شناساننده‌ها:', 'resettokens-token-label' => '$1 (مقدار کنونی: $2)', -'resettokens-watchlist-token' => 'شناساننده برای خوراک وبِ [[Special:Watchlist|تغییرات صفحه‌هایی که پیگیری می‌کنید]] (اتم/آراس‌اس)', +'resettokens-watchlist-token' => 'شناسانندهٔ خوراک وبِی [[Special:Watchlist|تغییرات صفحه‌هایی که پی‌گیری می‌کنید]] (اتم/آراس‌اس)', 'resettokens-done' => 'بازنشانی شناساننده‌ها.', 'resettokens-resetbutton' => 'بازشناسی شناساننده‌های گزیده‌شده.', @@ -1402,11 +1402,11 @@ $2 'rev-delundel' => 'نمایش/نهفتن', 'rev-showdeleted' => 'نمایش', 'revisiondelete' => 'حذف/احیای نسخه‌ها', -'revdelete-nooldid-title' => 'نسخه هدف غیرمجاز', +'revdelete-nooldid-title' => 'نسخهٔ هدف نامجاز', 'revdelete-nooldid-text' => 'شما نسخه‌های هدف را برای انجام این عمل مشخص نکرده‌اید یا این نسخه‌ها وجود ندارند، یا این که شما می‌خواهید آخرین نسخه را پنهان کنید.', 'revdelete-nologtype-title' => 'نوع سیاهه مشخص نشده‌است', 'revdelete-nologtype-text' => 'شما هیچ نوع سیاهه‌ای را برای این کار مشخص نکردید.', -'revdelete-nologid-title' => 'مورد غیرمجاز در سیاهه', +'revdelete-nologid-title' => 'مدخل نامجاز سیاهه', 'revdelete-nologid-text' => 'شما یا رویدادی را در سیاههٔ هدف مشخص نکردید یا موردی را مشخص کردید که وجود ندارد.', 'revdelete-no-file' => 'پروندهٔ مشخص شده وجود ندارد.', 'revdelete-show-file-confirm' => 'آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذف شده از پروندهٔ «$1» مورخ $2 ساعت $3 را ببینید؟', @@ -1665,8 +1665,8 @@ $1", 'yourvariant' => 'گویش زبان محتوا:', 'prefs-help-variant' => 'گویش انتخابی شما برای نمایش محتوای صفحه‌ها در این ویکی.', 'yournick' => 'امضای جدید:', -'prefs-help-signature' => 'نظرهای نوشته شده در صفحهٔ بحث باید با «~~~~» امضا شوند؛ این علامت به طور خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.', -'badsig' => 'امضای خام غیرمجاز. +'prefs-help-signature' => 'نظرهای نوشته‌شده در صفحهٔ بحث باید با «~~~~» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.', +'badsig' => 'امضای خام نامجاز. لطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.', 'badsiglength' => 'امضای شما بیش از اندازه طولانی است. امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.', @@ -1675,7 +1675,7 @@ $1", 'gender-male' => 'مرد', 'gender-female' => 'زن', 'prefs-help-gender' => 'انجام این تنظیم اختیاری است. -نرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت شما و ذکر شما برای دیگران با استفاده از قوائد درست دستور زبان استفاده می‌کند. +نرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت و ذکر شما برای دیگران با استفاده از دستور زبان درست استفاده می‌کند. این اطلاعات عمومی خواهند بود.', 'email' => 'رایانامه', 'prefs-help-realname' => 'نام واقعی اختیاری است. @@ -1809,14 +1809,14 @@ $1", 'right-editmyprivateinfo' => 'داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)', 'right-editmyoptions' => 'ترجیحات خود را ویرایش', 'right-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است', -'right-markbotedits' => 'علامت زدن ویرایش‌های واگردانی شده به عنوان ویرایش ربات', +'right-markbotedits' => 'علامت‌زدن ویرایش‌های واگردانی‌شده به‌عنوان ویرایش ربات', 'right-noratelimit' => 'تاثیر نپذیرفتن از محدودیت سرعت', -'right-import' => 'وارد کردن صفحه از ویکی‌های دیگر', -'right-importupload' => 'وارد کردن صفحه از طریق بارگذاری پرونده', +'right-import' => 'واردکردن صفحه از ویکی‌های دیگر', +'right-importupload' => 'واردکردن صفحه از طریق بارگذاری پرونده', 'right-patrol' => 'گشت زدن به ویرایش‌های دیگران', 'right-autopatrol' => 'گشن زدن خودکار به ویرایش‌های خودش', 'right-patrolmarks' => 'مشاهدهٔ برچسب گشت تغییرات اخیر', -'right-unwatchedpages' => 'مشاهدهٔ فهرست صفحه‌هایی که پیگیری نمی‌شوند', +'right-unwatchedpages' => 'مشاهدهٔ فهرست صفحه‌هایی که پی‌گیری نمی‌شوند', 'right-mergehistory' => 'ادغام تاریخچهٔ صفحه‌ها', 'right-userrights' => 'ویرایش تمام اختیارات کاربرها', 'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر', @@ -1856,10 +1856,10 @@ $1", 'action-undelete' => 'احیای این صفحه', 'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذف شده', 'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی', -'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن', +'action-block' => 'قطع دسترسی این کاربر از ویرایش‌کردن', 'action-protect' => 'تغییر سطح محافظت این صفحه', 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است', -'action-import' => 'وارد کردن صفحه از ویکی های دیگر', +'action-import' => 'واردکردن صفحه از ویکی های دیگر', 'action-importupload' => 'واردکردن صفحه از طریق بارگذاری پرونده', 'action-patrol' => 'گشت زدن ویرایش دیگران', 'action-autopatrol' => 'گشت زدن ویرایش خودتان', @@ -1945,7 +1945,7 @@ $1", *'''[[{{ns:media}}:File.ogg]]''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده", 'upload-permitted' => 'انواع مجاز پرونده‌ها: $1.', 'upload-preferred' => 'انواع ترجیح‌داده شده پرونده‌ها: $1.', -'upload-prohibited' => 'انواع غیرمجاز پرونده‌ها: $1.', +'upload-prohibited' => 'انواع نامجاز پرونده‌ها: $1.', 'uploadlog' => 'سیاههٔ بارگذاری‌ها', 'uploadlogpage' => 'سیاههٔ بارگذاری‌ها', 'uploadlogpagetext' => 'فهرست زیر فهرستی از آخرین بارگذاری پرونده‌ها است. @@ -1966,11 +1966,11 @@ $1", 'badfilename' => 'نام پرونده به «$1» تغییر کرد.', 'filetype-mime-mismatch' => 'پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.', 'filetype-badmime' => 'پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.', -'filetype-bad-ie-mime' => 'این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ غیرمجاز و احتمالاً خطرناک است.', +'filetype-bad-ie-mime' => 'این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به‌عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ نامجاز و احتمالاً خطرناک است.', 'filetype-unwanted-type' => "'''«‎.‎$1»''' یک نوع پرونده ناخواسته است. {{PLURAL:$3|نوع پرونده ترجیح داده شده|انواع پرونده ترجیح داده شده}} از این قرار است: $2 .", -'filetype-banned-type' => '‎\'\'\'".$1"\'\'\' {{PLURAL:$4|یک نوع پرونده غیرمجاز است|انواعی پرونده غیرمجاز هستند}}. -{{PLURAL:$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: $2 .', +'filetype-banned-type' => '‎\'\'\'".$1"\'\'\' {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواعی پروندهٔ نامجاز هستند}}. +{{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.', 'filetype-missing' => 'این پرونده پسوند (مثلاً «‎.jpg») ندارد.', 'empty-file' => 'پرونده‌ای که ارسال کردید خالی بود.', 'file-too-large' => 'پرونده‌ای که ارسال کردید بیش از اندازه بزرگ بود.', @@ -2125,7 +2125,7 @@ $1', 'uploadstash-nofiles' => 'شما هیچ پروندهٔ انبارشده‌ای ندارید.', 'uploadstash-badtoken' => 'انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.', 'uploadstash-errclear' => 'پاک کردن پرونده‌ها ناموفق بود.', -'uploadstash-refresh' => 'تازه کردن فهرست پرونده‌ها', +'uploadstash-refresh' => 'تازه‌کردن فهرست پرونده‌ها', 'invalid-chunk-offset' => 'جابجایی نامعتبر قطعه', # img_auth script messages @@ -2306,7 +2306,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.', 'statistics-articles' => 'صفحه‌های محتوایی', 'statistics-pages' => 'صفحه‌ها', 'statistics-pages-desc' => 'تمام صفحه‌های این ویکی، از جمله صفحه‌های بحث، تغییرمسیر و غیره', -'statistics-files' => 'پرونده‌های بارگذاری شده', +'statistics-files' => 'پرونده‌های بارگذاری‌شده', 'statistics-edits' => 'ویرایش صفحه‌ها از هنگامی که {{SITENAME}} راه‌اندازی شده', 'statistics-edits-average' => 'متوسط ویرایش‌ها به ازای هر صفحه', 'statistics-views-total' => 'مجموع بازدیدها', @@ -2367,10 +2367,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.', 'popularpages' => 'صفحه‌های محبوب', 'wantedcategories' => 'رده‌های مورد نیاز', 'wantedpages' => 'صفحه‌های مورد نیاز', -'wantedpages-badtitle' => 'عنوان غیرمجاز در مجموعهٔ نتایج: $1', +'wantedpages-badtitle' => 'عنوان نامجاز در مجموعهٔ نتایج: $1', 'wantedfiles' => 'پرونده‌های مورد نیاز', 'wantedfiletext-cat' => 'پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب خط خواهد خورد. علاوه بر این، صفحاتی که پرونده‌هایی ناموجود را در خود جای داده‌اند در [[:$1]] فهرست شده‌اند.', -'wantedfiletext-nocat' => 'پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب خط خواهد خورد.', +'wantedfiletext-nocat' => 'پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبهٔ مثبت کاذب خط خواهد خورد.', 'wantedtemplates' => 'الگوهای مورد نیاز', 'mostlinked' => 'صفحه‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است', 'mostlinkedcategories' => 'رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است', @@ -2583,7 +2583,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.', 'iteminvalidname' => 'مشکل با مورد «$1»، نام نامعتبر است...', 'wlnote' => 'در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4', 'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3', -'watchlist-options' => 'گزینه‌های پیگیری', +'watchlist-options' => 'گزینه‌های پی‌گیری', # Displayed when you click the "watch" button and it is in the process of watching 'watching' => 'پی‌گیری...', @@ -2907,11 +2907,11 @@ $1', 'ipbotheroption' => 'دیگر', 'ipbotherreason' => 'دلیل دیگر/اضافی:', 'ipbhidename' => 'نهفتن نام کاربری از ویرایش‌ها و فهرست‌ها', -'ipbwatchuser' => 'پیگیری صفحهٔ کاربری و بحث این کاربر', +'ipbwatchuser' => 'پی‌گیری صفحهٔ کاربری و بحث این کاربر', 'ipb-disableusertalk' => 'جلوگیری از ویرایشی صفحهً بحث توسط خود کاربر در زمانی که بسته است', 'ipb-change-block' => 'بستن دوبارهٔ کاربر با این تنظیم‌ها', 'ipb-confirm' => 'تأیید بستن', -'badipaddress' => 'نشانی آی‌پی غیر مجاز', +'badipaddress' => 'نشانی آی‌پی نامجاز', 'blockipsuccesssub' => 'بستن با موفقیت انجام شد', 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بسته شد.
      برای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.', @@ -2991,12 +2991,9 @@ $1', این نشانی به همراه بازه $2 بسته شده که قابل باز شدن است.', 'ip_range_invalid' => 'بازهٔ آی‌پی نامعتبر.', 'ip_range_toolarge' => 'قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.', -'blockme' => 'دسترسی مرا قطع کن', 'proxyblocker' => 'مسدود کننده پروکسی', -'proxyblocker-disabled' => 'این عملکرد غیرفعال شده‌است.', 'proxyblockreason' => 'نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است. لطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.', -'proxyblocksuccess' => 'انجام شد.', 'sorbsreason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.', 'sorbs_create_account_reason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است. شما اجازهٔ ساختن حساب کاربری ندارید.', @@ -3068,7 +3065,7 @@ $1', 'movenotallowedfile' => 'شما اجازهٔ انتقال پرونده‌ها را ندارید.', 'cant-move-user-page' => 'شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.', 'cant-move-to-user-page' => 'شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).', -'newtitle' => 'به عنوان جدید', +'newtitle' => 'به‌عنوان جدید', 'move-watch' => 'پی‌گیری صفحه‌های مبدأ و مقصد', 'movepagebtn' => 'صفحه منتقل شود', 'pagemovedsub' => 'انتقال با موفقیت انجام شد', @@ -3112,7 +3109,7 @@ $1', 'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد', 'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد', 'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست', -'imageinvalidfilename' => 'نام پروندهٔ هدف غیرمجاز است', +'imageinvalidfilename' => 'نام پروندهٔ هدف نامجاز است', 'fix-double-redirects' => 'به روز کردن تمامی تغییرمسیرهایی که به مقالهٔ اصلی اشاره می‌کنند', 'move-leave-redirect' => 'بر جا گذاشتن یک تغییرمسیر', 'protectedpagemovewarning' => "'''هشدار:''' این صفحه قفل شده‌است به طوری که تنها کاربران با دسترسی مدیریت می‌توانند آن را انتقال دهند. @@ -3173,7 +3170,7 @@ $2', 'djvu_no_xml' => 'امکان پیدا کردن پروندهٔ XML برای استفادهٔ DjVu وجود نداشت.', 'thumbnail-temp-create' => 'نمی‌توان پروندهٔ بندانگشتی موقت را ساخت', 'thumbnail-dest-create' => 'نمی‌توان تصویر بندانگشتی را در مقصد ذخیره کرد', -'thumbnail_invalid_params' => 'پارامترهای غیرمجاز در تصویر بندانگشتی (thumbnail)', +'thumbnail_invalid_params' => 'پارامترهای نامجاز در تصویر بندانگشتی (thumbnail)', 'thumbnail_dest_directory' => 'اشکال در ایجاد پوشهٔ مقصد', 'thumbnail_image-type' => 'تصویر از نوع پشتیبانی نشده', 'thumbnail_gd-library' => 'تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد', @@ -3223,7 +3220,7 @@ $2', 'import-error-edit' => 'صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ویرایش آن نیستید.', 'import-error-create' => 'صفحهٔ «$1» وارد نمی‌شود، چون شما مجاز به ایجاد آن نیستید.', 'import-error-interwiki' => 'صفحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.', -'import-error-special' => 'صفحه «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام غیرمجاز است.', +'import-error-special' => 'صفحهٔ «$1» درون‌ریزی نشد، چرا که متعلق به فضای نام نامجاز است.', 'import-error-invalid' => 'صفحه "$1" به دلیل نامعتبر بودن نامش وارد نمی‌شود.', 'import-error-unserialize' => 'امکان خارج کردن نسخهٔ $2 از صفحهٔ «$1» از حالت سریال‌شده وجود نداشت. گزارش شد که نسخه از مدل محتوای $3 استفاده می‌کند که به صورت $4 سریال شده‌است.', 'import-options-wrong' => '{{PLURAL:$2|جزئیات|جزئیات}} اشتباه: $1', @@ -3346,6 +3343,8 @@ $2', 'spam_reverting' => 'واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.', 'spam_blanking' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن', 'spam_deleting' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال حذف', +'simpleantispam-label' => "بررسی ضدهرزنگاری. +این قسمت را پر '''نکنید'''!", # Info page 'pageinfo-title' => 'اطلاعات در مورد «$1»', @@ -3361,7 +3360,7 @@ $2', 'pageinfo-language' => 'زبان محتوای صفحه', 'pageinfo-robot-policy' => '‌فهرست‌کردن توسط ربات‌ها', 'pageinfo-robot-index' => 'مجاز', -'pageinfo-robot-noindex' => 'غیر مجاز', +'pageinfo-robot-noindex' => 'نامجاز', 'pageinfo-views' => 'شمار بازدیدها', 'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان صفحه', 'pageinfo-few-watchers' => 'کمتر از $1 {{PLURAL:$1| پی‌گیر|پی‌گیر}}', @@ -3436,7 +3435,7 @@ $1', 'mediawarning' => "'''هشدار''': این پرونده ممکن است حاوی کدهای مخرب باشد. با اجرای آن رایانهٔ شما ممکن است آسیب ببیند.", 'imagemaxsize' => "محدودیت ابعاد تصویر:
      ''(برای صفحه‌های توصیف پرونده)''", -'thumbsize' => 'اندازهٔ Thumbnail:', +'thumbsize' => 'اندازهٔ بنداگشتی:', 'widthheight' => '$1 در $2', 'widthheightpage' => '$1×$2، $3 {{PLURAL:$3|صفحه|صفحه}}', 'file-info' => 'اندازهٔ پرونده: $1، نوع MIME $2', @@ -3445,7 +3444,7 @@ $1', 'file-nohires' => 'تفکیک‌پذیری بالاتری در دسترس نیست.', 'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد $1 × $2 پیکسل، اندازهٔ پرونده: $3', 'svg-long-desc-animated' => 'پروندهٔ اس‌وی‌جی متحرک، با ابعاد $1 × $2 پیکسل، اندازهٔ پرونده: $3', -'svg-long-error' => 'پرونده SVG غیرمجاز: $1', +'svg-long-error' => 'پرونده SVG نامجاز: $1', 'show-big-image' => 'تصویر با تفکیک‌پذیری بالاتر', 'show-big-image-preview' => 'اندازهٔ این پیش‌نمایش: $1.', 'show-big-image-other' => '{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.', @@ -3880,7 +3879,7 @@ $1', 'exif-dc-contributor' => 'مشارکت‌کنندگان', 'exif-dc-coverage' => 'محدوده مکانی و یا زمانی رسانه', -'exif-dc-date' => 'تاریخ (ها)', +'exif-dc-date' => 'تاریخ(ها)', 'exif-dc-publisher' => 'ناشر', 'exif-dc-relation' => 'رسانه‌های مرتبط', 'exif-dc-rights' => 'حقوق', @@ -4059,7 +4058,7 @@ $5 'watchlistedit-noitems' => 'فهرست پی‌گیری‌های شما خالی است.', 'watchlistedit-normal-title' => 'ویرایش فهرست پی‌گیری‌ها', 'watchlistedit-normal-legend' => 'حذف عنوان‌ها از فهرست پی‌گیری‌ها', -'watchlistedit-normal-explain' => 'عنوان‌های موجود در فهرست پیگیری شما در زیر نشان داده شده‌اند. +'watchlistedit-normal-explain' => 'عنوان‌های موجود در فهرست پی‌گیری شما در زیر نشان داده شده‌اند. برای حذف هر عنوان جعبهٔ کنار آن را علامت بزنید و دکمهٔ «{{int:Watchlistedit-normal-submit}}» را بفشارید. شما همچنین می‌توانید [[Special:EditWatchlist/raw|فهرست خام را ویرایش کنید]].', 'watchlistedit-normal-submit' => 'حذف عنوان‌ها', @@ -4319,7 +4318,7 @@ $5 'logentry-move-move_redir' => '$1 صفحهٔ $3 را به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}', 'logentry-move-move_redir-noredirect' => '$1 صفحهٔ $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}', 'logentry-patrol-patrol' => '$1 نسخه $4 صفحه $3 را به عنوان گشت خورده {{GENDER:$2|علامت زد}}', -'logentry-patrol-patrol-auto' => '$1 نسخه $4 صفحه $3 را به طور خودکار به عنوان گشت خورده {{GENDER:$2|علامت زد}}', +'logentry-patrol-patrol-auto' => '$1 نسخهٔ $4 صفحهٔ $3 را به‌طور خودکار به‌عنوان گشت‌خورده {{GENDER:$2|علامت زد}}', 'logentry-newusers-newusers' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}', 'logentry-newusers-create' => 'حساب کاربری $1 {{GENDER:$2|ایجاد شد}}', 'logentry-newusers-create2' => 'حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}}', @@ -4365,7 +4364,7 @@ $5 'api-error-file-too-large' => 'پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.', 'api-error-filename-tooshort' => 'نام پرونده بیش از اندازه کوتاه است.', 'api-error-filetype-banned' => 'این نوع پرونده ممنوع است.', -'api-error-filetype-banned-type' => '‎$1 {{PLURAL:$4|یک نوع پرونده غیرمجاز است|انواعی پرونده غیرمجاز هستند}}. {{PLURAL:$3|نوع پرونده مجاز|انواع پرونده مجاز}} از این قرار است: $2 .', +'api-error-filetype-banned-type' => '‎$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.', 'api-error-filetype-missing' => 'پرونده فرمت ندارد.', 'api-error-hookaborted' => 'اصلاحیه‌ای که شما سعی در ایجاد آن بودید توسط افزونه‌ای به دام افتاد.', 'api-error-http' => 'خطای داخلی: قادر به اتصال به سرور نیست.', diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php index 804552bfaf..350c00c7d4 100644 --- a/languages/messages/MessagesFi.php +++ b/languages/messages/MessagesFi.php @@ -360,7 +360,7 @@ $messages = array( 'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään', 'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla', 'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia', -'tog-prefershttps' => 'Käytä aina turvallista yhteyttä kun olet kirjautunut sisään', +'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään', 'underline-always' => 'Aina', 'underline-never' => 'Ei koskaan', @@ -809,7 +809,7 @@ Salli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi k 'nocookiesfornew' => 'Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.', 'noname' => 'Et ole määritellyt kelvollista käyttäjänimeä.', 'loginsuccesstitle' => 'Sisäänkirjautuminen onnistui', -'loginsuccess' => "'''Olet nyt kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''", +'loginsuccess' => "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''", 'nosuchuser' => 'Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:UserLogin/signup|luo uusi käyttäjätunnus]].', 'nosuchusershort' => 'Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?', 'nouserspecified' => 'Käyttäjätunnusta ei ole määritelty.', @@ -824,7 +824,7 @@ Salli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi k 'passwordremindertext' => 'Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Väliaikainen salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana. Väliaikainen salasana vanhenee {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua. Jos joku muu on tehnyt tämän pyynnön, tai jos olet muistanut salasanasi ja et halua vaihtaa sitä, voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.', -'noemail' => 'Käyttäjälle "$1" ei ole määritelty sähköpostiosoitetta.', +'noemail' => 'Käyttäjälle $1 ei ole määritelty sähköpostiosoitetta.', 'noemailcreate' => 'Sinun on annettava voimassa oleva sähköpostiosoite', 'passwordsent' => 'Uusi salasana on lähetetty käyttäjän $1 sähköpostiosoitteeseen. Ole hyvä ja kirjaudu sisään kun olet saanut sen.', @@ -854,8 +854,8 @@ Odota $1 ennen kuin yrität uudelleen.', 'login-abort-generic' => 'Kirjautuminen epäonnistui – keskeytetty', 'loginlanguagelabel' => 'Kieli: $1', 'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.', -'createacct-another-realname-tip' => 'Oikea nimi on vapaaehtoinen. -Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisältöä on tuottanut.', +'createacct-another-realname-tip' => 'Vapaaehtoinen. +Nimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.', # Email sending 'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa', @@ -871,7 +871,7 @@ Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisält 'newpassword' => 'Uusi salasana:', 'retypenew' => 'Uusi salasana uudelleen:', 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään', -'changepassword-success' => 'Salasanasi vaihtaminen onnistui.', +'changepassword-success' => 'Salasanan vaihto onnistui.', 'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.', 'resetpass-no-info' => 'Et voi nähdä tätä sivua kirjautumatta sisään.', 'resetpass-submit-loggedin' => 'Muuta salasana', @@ -879,14 +879,14 @@ Jos kuitenkin kerrot sen, nimeä käytetään jotta voidaan kertoa kuka sisält 'resetpass-wrong-oldpass' => 'Virheellinen väliaikainen tai nykyinen salasana. Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikaista salasanaa.', 'resetpass-temp-password' => 'Väliaikainen salasana:', -'resetpass-abort-generic' => 'Lisäosa hylkäsi salasanan vaihdon.', +'resetpass-abort-generic' => 'Laajennus keskeytti salasanan vaihdon.', # Special:PasswordReset -'passwordreset' => 'Salasanan vaihto', -'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.', -'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä nollataksesi salasanasi.}}', -'passwordreset-legend' => 'Salasanan vaihto', -'passwordreset-disabled' => 'Salasanojen vaihtaminen ei ole mahdollista tässä wikissä.', +'passwordreset' => 'Salasanan uudistus', +'passwordreset-text-one' => 'Täytä tämä lomake uudistaaksesi salasanasi.', +'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä uudistaaksesi salasanasi.}}', +'passwordreset-legend' => 'Salasanan uudistus', +'passwordreset-disabled' => 'Salasanojen uudistaminen ei ole mahdollista tässä wikissä.', 'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.', 'passwordreset-username' => 'Käyttäjätunnus:', 'passwordreset-domain' => 'Verkkotunnus:', @@ -932,15 +932,15 @@ Väliaikainen salasana: $2', 'changeemail-cancel' => 'Peruuta', # Special:ResetTokens -'resettokens' => 'Uudista tunnisteet', -'resettokens-text' => 'Tällä sivulla voit uudistaa tunnisteesi, joiden avulla hallitaan pääsyä käyttäjätiliisi liittyviin yksityisiin tietoihin. +'resettokens' => 'Uudista avaimet', +'resettokens-text' => 'Tällä sivulla voit uudistaa avaimesi, jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin. -Sinun pitää tehdä tämä jos olet vahingossa jakanut ne jonkun kanssa tai käyttäjätiliisi on saatettu kajota.', -'resettokens-no-tokens' => 'Tunnisteita ei löydy uudistettavaksi.', -'resettokens-legend' => 'Uudista tunnisteet', -'resettokens-tokens' => 'Tunnisteet:', +Sinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.', +'resettokens-no-tokens' => 'Avaimia ei ole uudistettavaksi.', +'resettokens-legend' => 'Uudista avaimet', +'resettokens-tokens' => 'Avaimet:', 'resettokens-token-label' => '$1 (nykyinen arvo: $2)', -'resettokens-watchlist-token' => 'Tarkkailulistan verkkosyötteen tunniste', +'resettokens-watchlist-token' => '[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain', 'resettokens-done' => 'Avaimet on uudistettu.', 'resettokens-resetbutton' => 'Uudista valitut avaimet', @@ -1445,7 +1445,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön 'prefs-rendering' => 'Ulkoasu', 'saveprefs' => 'Tallenna asetukset', 'resetprefs' => 'Tyhjennä tallentamattomat muutokset', -'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa asetusten osastoissa)', +'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa osioissa)', 'prefs-editing' => 'Muokkaus', 'rows' => 'Rivejä', 'columns' => 'Sarakkeita', @@ -1457,8 +1457,10 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön 'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}', 'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena', 'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.', -'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen. Kuka tahansa joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä. [[Special:ResetTokens|Napsauta tästä jos sinun pitää uudistaa se]].', -'savedprefs' => 'Asetuksesi tallennettiin onnistuneesti.', +'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen. +Kuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä. +[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].', +'savedprefs' => 'Asetuksesi on tallennettu.', 'timezonelegend' => 'Aikavyöhyke', 'localtime' => 'Paikallinen aika', 'timezoneuseserverdefault' => 'Käytä oletusta ($1)', @@ -1502,8 +1504,8 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön 'badsiglength' => 'Allekirjoitus on liian pitkä – sen on oltava alle $1 {{PLURAL:$1|merkki|merkkiä}}.', 'yourgender' => 'Mikä seuraavista kuvaa sinua?', 'gender-unknown' => 'En halua määritellä', -'gender-male' => 'Hän on miespuolinen käyttäjä', -'gender-female' => 'Hän on naispuolinen käyttäjä', +'gender-male' => 'Mies', +'gender-female' => 'Nainen', 'prefs-help-gender' => 'Tämän asetuksen määrittäminen on vapaaehtoista. Ohjelmisto käyttää annettua arvoa viitaten sinuun oikealla kieliopillisella suvulla. Tämä tieto on julkinen.', @@ -1545,10 +1547,10 @@ Tämä tieto on julkinen.', 'saveusergroups' => 'Tallenna nämä käyttäjäryhmät', 'userrights-groupsmember' => 'Jäsenenä ryhmissä:', 'userrights-groupsmember-auto' => 'Automaattisesti jäsenenä ryhmissä:', -'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on: +'userrights-groups-help' => 'Voit muuttaa ryhmiä, joissa tämä käyttäjä on. * Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä. * Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä. -* * tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä kun olet hänet siihen lisännyt tai päinvastoin', +* * tarkoittaa, että et pysty poistamaan käyttäjää tästä ryhmästä, kun olet hänet siihen lisännyt tai päinvastoin', 'userrights-reason' => 'Syy:', 'userrights-no-interwiki' => 'Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.', 'userrights-nodatabase' => 'Tietokantaa $1 ei ole tai se ei ole paikallinen.', @@ -1629,9 +1631,9 @@ Tämä tieto on julkinen.', 'right-editusercssjs' => 'Muokata toisten käyttäjien CSS- ja JavaScript-tiedostoja', 'right-editusercss' => 'Muokata toisten käyttäjien CSS-tiedostoja', 'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja', -'right-editmyusercss' => 'Muokata omia CSS-tiedostojaan', -'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostojaan', -'right-viewmywatchlist' => 'Katsoa tarkkailulistaasi', +'right-editmyusercss' => 'Muokata omia CSS-tiedostoja', +'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostoja', +'right-viewmywatchlist' => 'Tarkastella tarkkailulistaasi', 'right-editmywatchlist' => 'Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.', 'right-viewmyprivateinfo' => 'Nähdä omat yksityiset tietosi (esim. sähköpostiosoite, oikea nimi)', 'right-editmyprivateinfo' => 'Muokata omia yksityisiä tietojasi (esim. sähköpostiosoite, oikea nimi)', @@ -1698,7 +1700,7 @@ Tämä tieto on julkinen.', 'action-siteadmin' => 'lukita tai avata tietokantaa', 'action-sendemail' => 'lähettää sähköpostia', 'action-editmywatchlist' => 'muokata tarkkailulistaasi', -'action-viewmywatchlist' => 'katsoa tarkkailulistaasi', +'action-viewmywatchlist' => 'tarkastella tarkkailulistaasi', 'action-viewmyprivateinfo' => 'katsoa omia yksityisiä tietojasi', 'action-editmyprivateinfo' => 'muokata omia yksityisiä tietojasi', @@ -2097,11 +2099,11 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi image/jpeg.', 'randompage-nopages' => '{{PLURAL:$2|Nimiavaruudessa|Nimiavaruuksissa}} $1 ei ole sivuja.', # Random page in category -'randomincategory' => 'Satunnainen sivu, joka kuuluu luokkaan', -'randomincategory-invalidcategory' => '" $1 " ei ole kelvollinen luokan nimi.', -'randomincategory-nopages' => 'Luokassa [[:Category:$1]] ei ole sivuja.', -'randomincategory-selectcategory' => 'Etsi satunnainen sivu luokasta: $1 $2.', -'randomincategory-selectcategory-submit' => 'Etsi', +'randomincategory' => 'Satunnainen sivu luokasta', +'randomincategory-invalidcategory' => '$1 ei ole kelvollinen luokan nimi.', +'randomincategory-nopages' => 'Luokassa [[:Category:$1|$1]] ei ole sivuja.', +'randomincategory-selectcategory' => 'Hae satunnainen sivu luokasta: $1 $2', +'randomincategory-selectcategory-submit' => 'Hae', # Random redirect 'randomredirect' => 'Satunnainen ohjaus', @@ -2314,7 +2316,8 @@ Vaaditaan vähintään ylätason verkkotunnus, esimerkiksi "*.org".
      'listgrouprights' => 'Käyttäjäryhmien oikeudet', 'listgrouprights-summary' => 'Tämä lista sisältää tämän wikin käyttäjäryhmät sekä ryhmiin liitetyt käyttöoikeudet. Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWiki:Listgrouprights-helppage}}|erilliseltä ohjesivulta]].', -'listgrouprights-key' => '* Myönnetyt oikeudet +'listgrouprights-key' => 'Selite: +* Myönnetyt oikeudet * Kumotut oikeudet', 'listgrouprights-group' => 'Ryhmä', 'listgrouprights-rights' => 'Oikeudet', @@ -2467,10 +2470,12 @@ Sivulla $2 on lista viimeaikaisista poistoista.', 'deletecomment' => 'Syy', 'deleteotherreason' => 'Muu syy tai tarkennus', 'deletereasonotherlist' => 'Muu syy', -'deletereason-dropdown' => '*Yleiset poistosyyt -** Tekijän poistopyyntö +'deletereason-dropdown' => '* Yleiset poistosyyt ** Tekijänoikeusrikkomus -** Vandalismi', +** Tekijän poistopyyntö +** Testisivu +** Vandalismi +** Virheellinen ohjaus', 'delete-edit-reasonlist' => 'Muokkaa poistosyitä', 'delete-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.', 'delete-warning-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.', @@ -2537,7 +2542,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k 'protect-otherreason-op' => 'Muu syy', 'protect-dropdown' => '*Yleiset suojaussyyt ** Jatkuva vandalismi -** Jatkuva roskalinkkien lisääminen +** Jatkuva mainoslinkkien lisääminen ** Muokkaussota ** Suuri näkyvyys', 'protect-edit-reasonlist' => 'Muokkaa suojaussyitä', @@ -2776,11 +2781,8 @@ Alla on ote häivytyslokista.', 'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa', 'ip_range_invalid' => 'Virheellinen IP-alue.', 'ip_range_toolarge' => 'Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.', -'blockme' => 'Estä minut', 'proxyblocker' => 'Välityspalvelinesto', -'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.', 'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.', -'proxyblocksuccess' => 'Valmis.', 'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.', 'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. Et voi luoda käyttäjätunnusta.', @@ -2996,7 +2998,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.', 'import-error-interwiki' => 'Sivua $1 ei voitu tuoda, koska sen nimi on varattu ulkoisen linkittämisen (interwiki).', 'import-error-special' => 'Sivua $1 ei tuoda, koska se kuuluu nimitilaan, joka ei salli sivuja.', 'import-error-invalid' => 'Sivua $1 ei tuoda, koska sen nimi ei kelpaa.', -'import-error-unserialize' => 'Revisiota $2 sivusta "$1" ei voida jakaa osiin. Revision kerrottiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.', +'import-error-unserialize' => 'Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.', 'import-options-wrong' => '{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: $1', 'import-rootpage-invalid' => 'Annettu sivun nimi ei kelpaa.', 'import-rootpage-nosubpage' => 'Annetun sivun nimiavaruus $1 ei salli alasivuja.', @@ -3043,9 +3045,9 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.', 'tooltip-ca-move' => 'Siirrä tämä sivu', 'tooltip-ca-watch' => 'Lisää tämä sivu tarkkailulistallesi', 'tooltip-ca-unwatch' => 'Poista tämä sivu tarkkailulistaltasi', -'tooltip-search' => 'Etsi {{GRAMMAR:elative|{{SITENAME}}}}', +'tooltip-search' => 'Hae {{GRAMMAR:elative|{{SITENAME}}}}', 'tooltip-search-go' => 'Siirry sivulle, joka on tarkalleen tällä nimellä', -'tooltip-search-fulltext' => 'Etsi sivuilta tätä tekstiä', +'tooltip-search-fulltext' => 'Hae sivuilta tätä tekstiä', 'tooltip-p-logo' => 'Etusivu', 'tooltip-n-mainpage' => 'Siirry etusivulle', 'tooltip-n-mainpage-description' => 'Siirry etusivulle', @@ -3136,6 +3138,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.', 'spam_reverting' => 'Palautettu viimeisimpään versioon, joka ei sisällä linkkejä kohteeseen $1.', 'spam_blanking' => 'Kaikki versiot sisälsivät linkkejä kohteeseen $1. Sivu tyhjennetty.', 'spam_deleting' => 'Kaikki versiot sisälsivät linkkejä kohteeseen $1, poistetaan', +'simpleantispam-label' => "Mainostenvastainen varmistus. +'''ÄLÄ''' täytä tätä!", # Info page 'pageinfo-title' => 'Tietoja sivusta $1', @@ -3792,7 +3796,7 @@ Varmista, että haluat luoda sivun uudelleen.", 'confirm-unwatch-top' => 'Poistetaanko tämä sivu tarkkailulistaltasi?', # Separators for various lists, etc. -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← edellinen sivu', @@ -3885,7 +3889,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].', 'version-license' => 'Lisenssi', 'version-poweredby-credits' => "Tämä wiki käyttää '''[//www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.", 'version-poweredby-others' => 'muut', -'version-poweredby-translators' => 'translatewiki.net kääntäjät', +'version-poweredby-translators' => 'translatewiki.net-kääntäjät', 'version-credits-summary' => 'Haluaisimme kiittää seuraavia henkilöitä heidän panoksestaan [[Special:Version|MediaWiki-ohjelmistoon]].', 'version-license-info' => 'MediaWiki on vapaa ohjelmisto – voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai halutessasi minkä tahansa myöhemmän version mukaisesti. @@ -3900,13 +3904,13 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P 'version-entrypoints-header-url' => 'URL', # Special:Redirect -'redirect' => 'Ohjaus tiedostonimen, käyttäjänumeron tai versionumeron mukaan', -'redirect-legend' => 'Uudelleenohjaa tiedostoon tai sivulle', -'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedoston nimen mukaan), sivulle (sivun versionumeron mukaan) tai käyttäjäsivulle (käyttäjätunnuksen numeron mukaan).', +'redirect' => 'Ohjaus tiedostonimen, käyttäjätunnisteen tai versiotunnisteen mukaan', +'redirect-legend' => 'Ohjaus tiedostoon tai sivulle', +'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (versiotunnisteen mukaan) tai käyttäjäsivulle (käyttäjätunnisteen numeron mukaan).', 'redirect-submit' => 'Siirry', 'redirect-lookup' => 'Hae:', 'redirect-value' => 'Arvo:', -'redirect-user' => 'Käyttäjän tunnusnumero', +'redirect-user' => 'Käyttäjätunniste', 'redirect-revision' => 'Sivun versio', 'redirect-file' => 'Tiedostonimi', 'redirect-not-exists' => 'Arvoa ei löytynyt', @@ -4103,9 +4107,9 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi 'api-error-publishfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.', 'api-error-timeout' => 'Palvelin ei vastannut odotetun ajan kuluessa.', 'api-error-unclassified' => 'Tapahtui tuntematon virhe.', -'api-error-unknown-code' => 'Tuntematon virhe: $1', +'api-error-unknown-code' => 'Tuntematon virhe: $1.', 'api-error-unknown-error' => 'Sisäinen virhe: Jotain meni vikaan kun tiedostosi yritettiin tallentaa.', -'api-error-unknown-warning' => 'Tuntematon varoitus: $1', +'api-error-unknown-warning' => 'Tuntematon varoitus: $1.', 'api-error-unknownerror' => 'Tuntematon virhe: $1.', 'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.', 'api-error-verification-error' => 'Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.', diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php index 2cda4627b8..794d86d0a5 100644 --- a/languages/messages/MessagesFo.php +++ b/languages/messages/MessagesFo.php @@ -329,7 +329,7 @@ $messages = array( 'articlepage' => 'Vís síðu við innihaldi', 'talk' => 'Kjak', 'views' => 'Skoðanir', -'toolbox' => 'Amboðskassi', +'toolbox' => 'Tól', 'userpage' => 'Vís brúkarasíðu', 'projectpage' => 'Vís verkætlanarsíðu', 'imagepage' => 'Vís fílusíðuna', @@ -1486,8 +1486,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam 'action-block' => 'noktað hesum brúkara at rætta', 'action-protect' => 'broyt verjustøðuna hjá hesi síðu', 'action-rollback' => 'rulla skjótt aftur rættingarnar hjá tí seinasta brúkaranum, sum rættaði eina ávísa síðu', -'action-import' => 'innflyt hesa síðu frá aðrari wiki', -'action-importupload' => 'innflyt hesa síðuna frá einari fílu sum er løgd út', +'action-import' => 'innflyt síður frá aðrari wiki', +'action-importupload' => 'innflyt síður frá einari fílu sum er løgd út', 'action-patrol' => 'markað rætting hjá øðrum sum eftirhugda', 'action-autopatrol' => 'fá tina rætting merkta sum eftirhugda', 'action-unwatchedpages' => 'Síggj listan yvir síður sum ikki eru eftiransaðar', @@ -1503,6 +1503,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam # Recent changes 'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}', +'enhancedrc-history' => 'søga', 'recentchanges' => 'Seinastu broytingar', 'recentchanges-legend' => 'Nýligar broytingar møguleikar', 'recentchanges-summary' => 'Á hesi síðu kanst tú fylgja teimum nýggjastu broytingunum á hesi wiki.', @@ -2205,10 +2206,12 @@ Sí $2 fyri fulla skráseting av strikingum.', 'deletecomment' => 'Orsøk:', 'deleteotherreason' => 'Onnur orsøk:', 'deletereasonotherlist' => 'Onnur orsøk', -'deletereason-dropdown' => '*Vanligar orsøkir til striking -** Umbøn frá høvunda +'deletereason-dropdown' => '* Vanligar orsøkir til striking +** Spamm +** Herverk (Vandalisma) ** Brot á upphavsrættin -** Herverk (Vandalisma)', +** Umbøn frá høvunda +** Brotin víðaristilling', 'delete-edit-reasonlist' => 'Rætta orsøkir til striking', 'delete-toobig' => 'Henda síðan hevur eina langa rættingar søgu, meira enn $1 {{PLURAL:$1|versjón|versjónir}}. Striking av slíkum síðum er avmarkað fyri at forða fyri at onkur av óvart kemur til at forstýra {{SITENAME}}.', @@ -2228,7 +2231,7 @@ onkur annar hevur longu rættað ella rullað síðuna aftur. Seinasta broytingin á síðuni var av [[User:$3|$3]] ([[User talk:$3|kjak]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).', 'editcomment' => "Rættingarfrágreiðingin var: \"''\$1''\".", 'revertpage' => 'Tók burtur rættingar hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]]) til seinastu versjón hjá [[User:$1|$1]]', -'revertpage-nouser' => 'Tók burtur rættingar hjá einum fjaldum brúkara til seinastu versjón hjá [[User:$1|$1]]', +'revertpage-nouser' => 'Tók burtur rættingar hjá einum fjaldum brúkara til seinastu versjón hjá {{GENDER:$1|[[User:$1|$1]]}}', 'rollback-success' => 'Tók burtur rættingar hjá $1; broytti tað aftur til seinastu versjón hjá $2.', @@ -2341,7 +2344,7 @@ Sí [[Special:Log/delete|slettingarloggin]] fyri at síggja seinastu strikingar 'contributions' => '{{GENDER:$1|Brúkaraíkøst}}', 'contributions-title' => 'Brúkaraíkøst fyri $1', 'mycontris' => 'Íkøst', -'contribsub2' => 'Eftir $1 ($2)', +'contribsub2' => 'Fyri {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Ongar broytingar vóru funnar, sum samsvaraðu hesar treytirnar.', 'uctop' => '(verandi)', 'month' => 'Frá mánaði (og áðrenn):', @@ -2484,10 +2487,7 @@ Fjalingarloggurin er vístur niðanfyri til kunningar:', 'ipb-otherblocks-header' => '{{PLURAL:$1|Onnur sperring|Aðrar sperringar}}', 'unblock-hideuser' => 'Tú kanst ikki taka burtur sperringina hjá hesum brúkara, eftirsum brúkaranavnið hjá viðkomandi er fjalt.', 'ipb_cant_unblock' => 'Feilur: Sperring ID $1 ikki funnin. Tað er møguligt, at sperringin longu er tikin burtur.', -'blockme' => 'Sperra meg', 'proxyblocker' => 'Proxy sperring', -'proxyblocker-disabled' => 'Henda funksjónin er ikki virkin.', -'proxyblocksuccess' => 'Liðugt.', 'sorbsreason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.', 'sorbs_create_account_reason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar. Tú kanst ikki upprætta eina konto.', diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php index d0de77ea93..f733321cc7 100644 --- a/languages/messages/MessagesFr.php +++ b/languages/messages/MessagesFr.php @@ -608,7 +608,7 @@ $messages = array( 'articlepage' => 'Voir la page de contenu', 'talk' => 'Discussion', 'views' => 'Affichages', -'toolbox' => 'Boîte à outils', +'toolbox' => 'Outils', 'userpage' => 'Page utilisateur', 'projectpage' => 'Page méta', 'imagepage' => 'Voir la page du fichier', @@ -2582,7 +2582,7 @@ Voir $2 pour une liste des suppressions récentes.', ** Vandalisme ** Violation des droits d’auteur ** Demande de l’auteur -** Redirection erronée', +** Redirection cassée', 'delete-edit-reasonlist' => 'Modifier les motifs de suppression de page', 'delete-toobig' => 'Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}. La suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.', @@ -2907,12 +2907,9 @@ Il est possible qu'un déblocage ait déjà été effectué.", Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.", 'ip_range_invalid' => 'Plage IP incorrecte.', 'ip_range_toolarge' => 'Les blocages de plages plus grandes que /$1 ne sont pas autorisées.', -'blockme' => 'Bloquez-moi', 'proxyblocker' => 'Bloqueur de mandataires', -'proxyblocker-disabled' => 'Cette fonction est désactivée.', 'proxyblockreason' => "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert. Veuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.", -'proxyblocksuccess' => 'Fait.', 'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.', 'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}. Vous ne pouvez pas créer un compte.', @@ -3273,6 +3270,8 @@ Vous pouvez toutefois en visualiser la source.', 'spam_reverting' => 'Rétablissement de la dernière version ne contenant pas de lien vers $1', 'spam_blanking' => 'Toutes les versions contenant des liens vers $1 sont blanchies', 'spam_deleting' => 'Toutes les versions contenaient des liens vers $1, suppression', +'simpleantispam-label' => "Vérification anti-spam. +Ne '''RIEN''' inscrire ici !", # Info page 'pageinfo-title' => 'Informations pour « $1 »', @@ -3953,7 +3952,7 @@ Veuillez confirmer que vous désirez réellement recréer cette page.", # Separators for various lists, etc. 'semicolon-separator' => ' ; ', 'colon-separator' => ' : ', -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← page précédente', diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php index 58df14c4ed..e83aa9a398 100644 --- a/languages/messages/MessagesFrp.php +++ b/languages/messages/MessagesFrp.php @@ -2832,12 +2832,9 @@ O est possiblo qu’un dèblocâjo èye ja étâ fêt.', Portant, el est avouéc la plage $2 que pôt étre dèblocâ.', 'ip_range_invalid' => 'Plage d’adrèces IP fôssa.', 'ip_range_toolarge' => 'Los blocâjos de plages d’adrèces IP ples grantes que /$1 sont pas ôtorisâs.', -'blockme' => 'Blocâd-mè', 'proxyblocker' => "Bloquior de sèrvors mandatèros (''proxies'')", -'proxyblocker-disabled' => 'Cela fonccion est dèsactivâ.', 'proxyblockreason' => "Voutra adrèce IP at étâ blocâ perce qu’o est un sèrvor mandatèro (''proxy'') uvèrt. Vos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra assistance tècnica et l’enformar de cél problèmo de sècuritât sèriox.", -'proxyblocksuccess' => 'Chavonâ.', 'sorbsreason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.", 'sorbs_create_account_reason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}. Vos pouede pas fâre un compto.", @@ -3197,6 +3194,8 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l 'spam_reverting' => 'Rètablissement de la dèrriére vèrsion que contint gins de lim de vers $1', 'spam_blanking' => 'Totes les vèrsions que contegnont des lims de vers $1 sont blanchies', 'spam_deleting' => 'Totes les vèrsions que contegnont des lims de vers $1 sont suprimâs', +'simpleantispam-label' => "Contrôlo anti-spame. +Enscrîde '''REN''' ique !", # Info page 'pageinfo-title' => 'Enformacions por « $1 »', @@ -3846,7 +3845,7 @@ Volyéd confirmar que vos voléd franc refâre cela pâge.", # Separators for various lists, etc. 'semicolon-separator' => ' ; ', 'colon-separator' => ' : ', -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← pâge devant', diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php index 689339a4c2..008767793a 100644 --- a/languages/messages/MessagesFrr.php +++ b/languages/messages/MessagesFrr.php @@ -267,7 +267,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'Auer {{SITENAME}}', 'aboutpage' => 'Project:Auer', -'copyright' => 'Det stäänt oner det lisens $1.', +'copyright' => 'Det sidj as tu fun oner $1 , wan diar niks ööders stäänt.', 'copyrightpage' => '{{ns:project}}:Copyrights', 'currentevents' => 'Aktuels', 'currentevents-url' => 'Project:Aktuels', @@ -482,6 +482,9 @@ Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelang 'userlogin-resetpassword-link' => 'Paaswurd turagsaat', 'helplogin-url' => 'Help:Uunmelde', 'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Halep bi't uunmeldin]]", +'userlogin-loggedin' => 'Du beest al üs {{GENDER:$1|$1}} uunmeldet. +Brük det formulaar diar oner, am di mä en öödern nööm uuntumeldin.', +'userlogin-createanother' => 'En ööder brükerkonto iinracht', 'createacct-join' => 'Du oner din dooten iin.', 'createacct-another-join' => "Skriiw oner a dooten för't nei brükerkonto hen", 'createacct-emailrequired' => 'E-mail adres', @@ -1408,7 +1411,7 @@ Arken koon det lees.', 'action-protect' => 'det seekerhaid faan sidjen tu feranrin', 'action-rollback' => 'feranrangen faan di leetst brüker gau turagtusaaten', 'action-import' => 'sidjen faan en ööder Wiki tu importiarin', -'action-importupload' => 'sidjen auer det huuchschüüren faan datein tu importiarin', +'action-importupload' => 'sidjen auer det huuchschüüren faan en datei tu importiarin', 'action-patrol' => 'det werk faan ööder brükern üs kontroliaret tu kääntiaknin', 'action-autopatrol' => 'aanj feranrangen üs kontroliaret tu kääntiaknin', 'action-unwatchedpages' => 'det list faan sidjen uuntulukin, diar näämen üüb aachtet', @@ -1712,6 +1715,7 @@ För a seekerhaid as img_auth.php ei aktiwiaret.', 'listfiles_count' => 'Werjuunen', 'listfiles-show-all' => 'Ual bilwerjuunen mä iinslütj', 'listfiles-latestversion' => 'Aktuel werjuun', +'listfiles-latestversion-yes' => 'Ja', 'listfiles-latestversion-no' => 'Naan', # File description page @@ -1920,6 +1924,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s 'listusers' => 'Brükerfertiaknis', 'listusers-editsonly' => 'Wise bluas aktiif brükern', 'listusers-creationsort' => 'Sortiare efter dootem', +'listusers-desc' => 'Sortiare amdeel', 'usereditcount' => '{{PLURAL:$1|feranrang|$1 feranrangen}}', 'usercreated' => '{{GENDER:$3|Maaget}} di $1 am a klook $2', 'newpages' => 'Nei sidjen', @@ -2172,9 +2177,11 @@ Halep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}', 'deleteotherreason' => 'Ööder/noch en grünj:', 'deletereasonotherlist' => 'Ööder grünj', 'deletereason-dropdown' => "*Algemian grünjer för't striken -** Di skriiwer wul det so +** Spam / dom tjüch +** Wandaalen onerwais ** Copyright as ei beaachtet -** Wandaalen onerwais", +** Di skriiwer wul det so +** Widjerfeerang uunstaken", 'delete-edit-reasonlist' => "Grünjer för't striken bewerke", 'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.', 'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.", @@ -2192,7 +2199,7 @@ Halep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}', Det leetst feranrang as faan [[User:$3|$3]] ([[User talk:$3|Diskusjuun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).', 'editcomment' => "Tuupfaadet feranrang: ''„$1“''.", 'revertpage' => 'Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.', -'revertpage-nouser' => 'Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan [[User:$1|$1]] weder iinsteld.', +'revertpage-nouser' => 'Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.', 'rollback-success' => 'Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.', # Edit tokens @@ -2332,7 +2339,7 @@ $1", 'contributions' => '{{GENDER:$1|Brüker}} bidracher', 'contributions-title' => 'Brükerbidracher för "$1"', 'mycontris' => 'Bidracher', -'contribsub2' => 'För $1 ($2)', +'contribsub2' => 'För {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Diar wiar nian paasin brükerbidracher', 'uctop' => '(aktuel)', 'month' => 'faan muun (of iarer):', @@ -2487,12 +2494,9 @@ Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.", 'ipb_blocked_as_range' => 'Feeler: Det IP-adres $1 as auer det widjloftag sper $2 speret. Det sper faan $1 alian koon ei apheewen wurd.', 'ip_range_invalid' => 'Ferkiard IP-adresrüm', 'ip_range_toolarge' => 'Adresrümen mut ei grater üs /$1 wees.', -'blockme' => 'Spere mi', 'proxyblocker' => 'Proxy blocker', -'proxyblocker-disabled' => 'Detdiar funktjuun as ei aktiif', 'proxyblockreason' => 'Din IP-adres as speret wurden, auer det tu en eebenen proxy hiart. Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun fraag.', -'proxyblocksuccess' => 'Klaar.', 'sorbsreason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd.', 'sorbs_create_account_reason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd. Dü könst nian brükerkonto maage.', 'xffblockreason' => 'En IP-adres uun di X-Forwarded-For-Header as speret wurden, det as din aanj of det faan dan proxy server. Di spergrünj as: $1', @@ -2821,6 +2825,8 @@ Dü könst di kweltekst uunluke.', 'spam_reverting' => 'Leetst werjuun saner ferwisangen tu $1 weder iinsteld.', 'spam_blanking' => 'Aal a werjuunen mä en ferwisang tu $1 san apklaaret wurden.', 'spam_deleting' => 'Aal a werjuunen mä en ferwisung tu $1 san stregen wurden.', +'simpleantispam-label' => "Anti-spam preew. +Heer '''NIKS''' iindreeg!", # Info page 'pageinfo-title' => 'Informatjuun tu „$1“', @@ -3637,7 +3643,10 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen 'tags-tag' => 'Kääntiaken-nööm', 'tags-display-header' => 'Nööm üüb feranrangslisten', 'tags-description-header' => 'Widjloftag beskriiwang', +'tags-active-header' => 'Aktiif?', 'tags-hitcount-header' => 'Kääntiakent feranrangen', +'tags-active-yes' => 'Ja', +'tags-active-no' => 'Naan', 'tags-edit' => 'bewerke', 'tags-hitcount' => '$1 {{PLURAL:$1|feranrang|feranrangen}}', @@ -3804,9 +3813,9 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen 'limitreport-ppvisitednodes' => 'Taal faan ferbinjangsknooter för di föörproseser', 'limitreport-ppgeneratednodes' => 'Faan di föörproseser bereegent ferbinjangsknooter', 'limitreport-postexpandincludesize' => "Grate faan iinbinjangen efter't ütjwidjin", -'limitreport-postexpandincludesize-value' => '$1/$2 bytes', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', 'limitreport-templateargumentsize' => "Grate faan't föörlaagenargument", -'limitreport-templateargumentsize-value' => '$1/$2 bytes', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', 'limitreport-expansiondepth' => 'Maksimaal ütjwidjangsjipde', 'limitreport-expensivefunctioncount' => 'Taal faan apwendag parser-funktjuunen', diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php index 4fdeab1d3a..db3b20dab5 100644 --- a/languages/messages/MessagesFy.php +++ b/languages/messages/MessagesFy.php @@ -1913,7 +1913,6 @@ Meld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.", 'ipb_expiry_invalid' => 'Tiid fan ferrinnen is net goed.', 'ipb_already_blocked' => '"$1" is al útsluten', 'ipb_cant_unblock' => 'Flater: It útsluten fan ID $1 kin net fûn wurde. It is miskien al net mear útsluten.', -'proxyblocksuccess' => 'Dien.', # Developer tools 'lockdb' => "Meitsje de database 'Net-skriuwe'", diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php index 52e6280541..d7b37f5564 100644 --- a/languages/messages/MessagesGa.php +++ b/languages/messages/MessagesGa.php @@ -1551,7 +1551,6 @@ liosta a fháil de coisc atá i bhfeidhm faoi láthair.', 'proxyblockreason' => "Coisceadh do sheoladh IP dá bharr gur seachfhreastalaí neamhshlándála is ea é. Déan teagmháil le do chomhlacht idirlín nó le do lucht cabhrach teicneolaíochta go mbeidh 'fhios acu faoin fadhb slándála tábhachtach seo.", -'proxyblocksuccess' => 'Rinneadh.', 'sorbsreason' => 'Liostalaítear do sheoladh IP mar sheachfhreastalaí oscailte sa DNSBL.', # Developer tools diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php index b8a07a81b1..bef6c2f48a 100644 --- a/languages/messages/MessagesGan_hans.php +++ b/languages/messages/MessagesGan_hans.php @@ -1051,7 +1051,7 @@ $2', 'unwatchedpages' => '冇眏到𠮶页面', # List redirects -'listredirects' => '重定向页面列表', +'listredirects' => '重定向列表', # Unused templates 'unusedtemplates' => '冇使用𠮶模板', @@ -1086,7 +1086,7 @@ $2', 'statistics-users-active-desc' => '头$1日操作过𠮶用户', 'statistics-mostpopular' => '眵𠮶人最多𠮶页面', -'doubleredirects' => '双重重定向页面', +'doubleredirects' => '双重重定向', 'doubleredirectstext' => '底下𠮶重定向链接到别只重定向页面:', 'double-redirect-fixed-move' => '[[$1]]拕移动正,佢个下拕重定向到[[$2]]。', 'double-redirect-fixer' => '重定向𠮶修正器', @@ -1515,11 +1515,8 @@ $1', 'ipb_already_blocked' => '锁到嘞"$1"', 'ipb_cant_unblock' => '错误: 冇发现Block ID $1。个只IP话伓定拖解封喽。', 'ip_range_invalid' => '冇用𠮶IP范围。', -'blockme' => '封吥偶去', 'proxyblocker' => '代理封锁器', -'proxyblocker-disabled' => '个只功能用伓正喽。', 'proxyblockreason' => '倷𠮶IP系一只公开𠮶代理,佢拖封到嘞。请联络倷𠮶Internet服务提供商或技术帮助再告诵佢俚个只严重𠮶安全问题。', -'proxyblocksuccess' => '扤正啰。', 'sorbsreason' => '{{SITENAME}}用𠮶 DNSBL 查到倷𠮶IP地址系只公开代理服务器。', 'sorbs_create_account_reason' => '{{SITENAME}}用𠮶 DNSBL 检查到倷𠮶IP地址系只公开代理服务器,倷也就新开伓正帐户。', diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php index f9b3f760f3..4628ab30b0 100644 --- a/languages/messages/MessagesGan_hant.php +++ b/languages/messages/MessagesGan_hant.php @@ -1537,11 +1537,8 @@ $1', 'ipb_already_blocked' => '鎖到哩"$1"', 'ipb_cant_unblock' => '錯誤: 冇發現Block ID $1。箇隻IP話伓定拕解封哩。', 'ip_range_invalid' => '冇用嗰IP範圍。', -'blockme' => '封吥我去', 'proxyblocker' => '代理封鎖器', -'proxyblocker-disabled' => '箇隻功能用伓正哩。', 'proxyblockreason' => '汝嗰IP係一隻公開嗰代理,佢拕封到哩。請聯絡汝嗰Internet服務提供商或技術幫助再告誦佢俚箇隻嚴重嗰安全問題。', -'proxyblocksuccess' => '舞正哩。', 'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到汝嗰IP地址係隻公開代理服務器。', 'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到汝嗰IP地址係隻公開代理服務器,汝也就新開伓正帳戶。', diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php index 04d247113d..a65a09d60c 100644 --- a/languages/messages/MessagesGd.php +++ b/languages/messages/MessagesGd.php @@ -1450,7 +1450,6 @@ Seo roghainnean làithreach na duilleige '''$1''':", 'block-log-flags-nocreate' => 'cruthachadh de chunntasan ùra à comas', 'ipb_expiry_invalid' => 'Tha an t-àm-crìochnachaidh mì-dhligheach.', 'ip_range_invalid' => 'Raon IP neo-iomchaidh.', -'proxyblocksuccess' => 'Dèanta.', # Developer tools 'lockdb' => 'Glais an stòr-dàta', diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php index 36830450b3..df89c1817c 100644 --- a/languages/messages/MessagesGl.php +++ b/languages/messages/MessagesGl.php @@ -471,7 +471,7 @@ $messages = array( 'articlepage' => 'Ver a páxina de contido', 'talk' => 'Conversa', 'views' => 'Vistas', -'toolbox' => 'Caixa de ferramentas', +'toolbox' => 'Ferramentas', 'userpage' => 'Ver a páxina {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}', 'projectpage' => 'Ver a páxina do proxecto', 'imagepage' => 'Ver a páxina do ficheiro', @@ -2810,12 +2810,9 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent 'ipb_blocked_as_range' => 'Erro: O enderezo IP $1 non está bloqueado directamente e non se pode desbloquear. Porén, está bloqueado por estar no rango $2, que si se pode desbloquear.', 'ip_range_invalid' => 'Rango IP non válido.', 'ip_range_toolarge' => 'Non están permitidos os rangos de bloqueo maiores que /$1.', -'blockme' => 'Bloquearme', 'proxyblocker' => 'Bloqueador de proxy', -'proxyblocker-disabled' => 'Esta función está desactivada.', 'proxyblockreason' => 'O seu enderezo IP foi bloqueado porque é un proxy aberto. Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.', -'proxyblocksuccess' => 'Feito.', 'sorbsreason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.', 'sorbs_create_account_reason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}. Polo tanto, non pode crear unha conta', @@ -3179,6 +3176,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n 'spam_reverting' => 'Revertida á última edición sen ligazóns a "$1"', 'spam_blanking' => 'Limpáronse todas as revisións con ligazóns a "$1"', 'spam_deleting' => 'Borráronse todas as revisións con ligazóns a "$1"', +'simpleantispam-label' => "Comprobación antispam. +'''NON''' encha isto!", # Info page 'pageinfo-title' => 'Información sobre "$1"', diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php index 876608df64..f1161fd40f 100644 --- a/languages/messages/MessagesGrc.php +++ b/languages/messages/MessagesGrc.php @@ -1811,10 +1811,7 @@ $1', 'ipb_cant_unblock' => 'Σφάλμα: Ἡ φραγὴ τῆς ID $1 οὐχ εὑρέθη. Εἰκότως ἀποπεφραγμένη ἤδη ἐστίν.', 'ip_range_invalid' => 'Ἄκυρον IP-εὖρος.', -'blockme' => 'Φράξον με', 'proxyblocker' => 'Ἐργαλεῖον φραγῆς διακομιστῶν', -'proxyblocker-disabled' => 'Ἥδε ἡ ἐνέργεια κατεσταλμένη εστίν.', -'proxyblocksuccess' => 'Γενομένη.', 'cant-block-while-blocked' => 'Οὐκ ἔξεστί σοι φράττειν ἑτέρους χρωμένους ἐν ὅσῳ πεφραγμένος εἶ.', # Developer tools diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php index 042bc7489f..1e34d5b4a6 100644 --- a/languages/messages/MessagesGsw.php +++ b/languages/messages/MessagesGsw.php @@ -2462,11 +2462,8 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]]. 'ipb_blocked_as_range' => 'Fähler: D IP-Adräss $1 isch as Teil vu dr Beryychssperri $2 indirekt gsperrt. S isch nit megli, nume $1 z entsperre.', 'ip_range_invalid' => 'Uugiltige IP-Adrässberyych.', 'ip_range_toolarge' => 'Adrässberyych, wu greßer sin wie /$1, sin nit erlaubt.', -'blockme' => 'Sperr mi', 'proxyblocker' => 'Proxy blocker', -'proxyblocker-disabled' => 'Die Funktion isch deaktiviert.', 'proxyblockreason' => 'Dyni IP-Adrässe isch gsperrt wore, wel si ne ufige Proxy isch. Bitte kontaktier Dyyn Internet-Provider oder Dyni Systemadministratore un informier si iber des Sicherheitsproblem.', -'proxyblocksuccess' => 'Fertig.', 'sorbsreason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet.', 'sorbs_create_account_reason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet. S Aalege vu neije Benutzer isch nit megli.', 'cant-block-while-blocked' => 'Du derfsch kei anderi Benutzer sperre, derwylscht Du sälber gsperrt bisch.', @@ -2781,6 +2778,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.', 'spam_reverting' => 'Letschti Version ohni Links zue $1 widerhärgstellt.', 'spam_blanking' => 'In allene Versione het s Links zue $1 gha, sufer gmacht.', 'spam_deleting' => 'Alli Versione mit eme Link zue $1 sin glescht woret.', +'simpleantispam-label' => "Spamschutz-Priefig. Do '''nyt''' yytrage!", # Info page 'pageinfo-title' => 'Informatione zue „$1“', diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php index 100e2ad2b2..69692e85ee 100644 --- a/languages/messages/MessagesGu.php +++ b/languages/messages/MessagesGu.php @@ -153,7 +153,7 @@ $linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu"; $messages = array( # User preference toggles 'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન):', -'tog-justify' => 'ફકરો લાઇનસર કરો', +'tog-justify' => 'ફકરાઓ લાઇનસર કરો', 'tog-hideminor' => 'હાલમાં થયેલા ફેરફારમાં નાના ફેરફારો છુપાવો', 'tog-hidepatrolled' => 'હાલના સલામતી માટે કરવામાં આવેલાં થયેલા ફેરફારો છુપાવો.', 'tog-newpageshidepatrolled' => 'નવાં પાનાંની યાદીમાંથી દેખરેખ હેઠળનાં પાનાં છુપાવો', @@ -175,9 +175,9 @@ $messages = array( 'tog-previewonfirst' => 'પ્રથમ ફેરફાર વખતે પૂર્વાલોકન બતાવો', 'tog-nocache' => 'બ્રાઉઝરનું પેજ કેશિંગ અસક્રિય કરો', 'tog-enotifwatchlistpages' => 'મારી ધ્યાનસૂચિમાંનું પાનુ અને ફાઇલમાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો', -'tog-enotifusertalkpages' => 'મારી ચર્ચાનાં પાનામાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો', -'tog-enotifminoredits' => 'પાનાં અને ફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇ-મેલ મોકલો', -'tog-enotifrevealaddr' => 'નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ એડ્રેસ બતાવો', +'tog-enotifusertalkpages' => 'મારી ચર્ચાનાં પાનામાં ફેરફાર થાય ત્યારે મને ઇમેલ મોકલો', +'tog-enotifminoredits' => 'પાનાં અને ફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇમેલ મોકલો', +'tog-enotifrevealaddr' => 'નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ સરનામું બતાવો', 'tog-shownumberswatching' => 'ધ્યાન રાખતા સભ્યોની સંખ્યા બતાવો', 'tog-oldsig' => 'હાલના હસ્તાક્ષર:', 'tog-fancysig' => 'હસ્તાક્ષરનો વિકિલખાણ તરીકે ઉપયોગ કરો (સ્વચાલિત કડી વગર)', @@ -187,10 +187,10 @@ $messages = array( 'tog-watchlisthidebots' => 'ધ્યાનસુચીમાં બોટ દ્વારા થયેલા ફેરફાર સંતાડો.', 'tog-watchlisthideminor' => "'મારી ધ્યાનસુચી'માં નાનાં ફેરફારો છુપાવો", 'tog-watchlisthideliu' => 'લોગ થયેલા સભ્ય દ્વારા કરવામાં આવેલ ફેરફાર ધ્યાનસુચીમાં છુપાવો.', -'tog-watchlisthideanons' => 'અજાણ્યાસભ્ય દ્વારા થયેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો.', -'tog-watchlisthidepatrolled' => 'સુરક્ષા કાજે કરવામાં આવેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો.', -'tog-ccmeonemails' => 'મે અન્યોને મોકલેલા ઇ-મેઇલની નકલ મને મોકલો', -'tog-diffonly' => 'તફાવતની નીચે લેખ ન બતાવશો.', +'tog-watchlisthideanons' => 'અજાણ્યા સભ્ય દ્વારા થયેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો', +'tog-watchlisthidepatrolled' => 'સુરક્ષા કાજે કરવામાં આવેલ ફેરફાર મારી ધ્યાનસુચીમાં છુપાવો', +'tog-ccmeonemails' => 'મે અન્યોને મોકલેલા ઇમેલની નકલ મને મોકલો', +'tog-diffonly' => 'તફાવતની નીચે લેખ ન બતાવશો', 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો', 'tog-noconvertlink' => 'Disable link title conversion', 'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો', @@ -341,7 +341,7 @@ $messages = array( 'search' => 'શોધો', 'searchbutton' => 'શોધો', 'go' => 'જાઓ', -'searcharticle' => 'જાવ', +'searcharticle' => 'જાઓ', 'history' => 'પાનાનો ઇતિહાસ', 'history_short' => 'ઇતિહાસ', 'updatedmarker' => 'મારી ગઇ મુલાકાત પછીના બદલાવ', @@ -352,7 +352,7 @@ $messages = array( 'edit' => 'ફેરફાર કરો', 'create' => 'બનાવો', 'editthispage' => 'આ પાનામાં ફેરફાર કરો', -'create-this-page' => 'આ પાનું બનાવો.', +'create-this-page' => 'આ પાનું બનાવો', 'delete' => 'રદ કરો', 'deletethispage' => 'આ પાનું હટાવો', 'undeletethispage' => 'આ પાનું પુનર્જીવીત કરો', @@ -360,7 +360,7 @@ $messages = array( 'viewdeleted_short' => '{{PLURAL:$1|ભૂંસી નાખેલો એક|ભૂંસી નાખેલા $1}} ફેરફાર જુઓ', 'protect' => 'સુરક્ષિત કરો', 'protect_change' => 'બદલો', -'protectthispage' => 'આ પાનું સુરક્ષિત કરો.', +'protectthispage' => 'આ પાનું સુરક્ષિત કરો', 'unprotect' => 'સુરક્ષા બદલો', 'unprotectthispage' => 'આ પાનાનું સુરક્ષા બદલો', 'newpage' => 'નવું પાનું', @@ -372,7 +372,7 @@ $messages = array( 'articlepage' => 'લેખનું પાનું જુઓ', 'talk' => 'ચર્ચા', 'views' => 'દેખાવ', -'toolbox' => 'સાધન પેટી', +'toolbox' => 'સાધનો', 'userpage' => 'સભ્યનું પાનું જુઓ', 'projectpage' => 'પ્રકલ્પનું પાનું જુઓ', 'imagepage' => 'ફાઇલનું પાનું જુઓ', @@ -387,7 +387,7 @@ $messages = array( 'lastmodifiedat' => 'આ પાનામાં છેલ્લો ફેરફાર $1ના રોજ $2 વાગ્યે થયો.', 'viewcount' => 'આ પાનું {{PLURAL:$1|એક|$1}} વખત જોવામાં આવ્યું છે.', 'protectedpage' => 'સંરક્ષિત પાનું', -'jumpto' => 'સીધા આના પર જાવ:', +'jumpto' => 'આના પર જાવ:', 'jumptonavigation' => 'ભ્રમણ', 'jumptosearch' => 'શોધો', 'view-pool-error' => 'માફ કરશો, આ સમયે સર્વર અતિબોજા હેઠળ છે. @@ -398,7 +398,7 @@ $messages = array( $1', 'pool-timeout' => 'સમય સમાપ્ત - સ્થગિતતા પ્રતિક્ષીત', -'pool-queuefull' => '(Pool) કતાર પૂરી ભરેલી', +'pool-queuefull' => '(Pool) કતાર પૂરી ભરેલી છે', 'pool-errorunknown' => 'અજ્ઞાત ત્રુટિ', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). @@ -432,18 +432,18 @@ $1', 'ok' => 'મંજૂર', 'retrievedfrom' => '"$1"થી લીધેલું', 'youhavenewmessages' => 'તમારા માટે $1 ($2).', -'newmessageslink' => 'નવીન સંદેશ', +'newmessageslink' => 'નવીન સંદેશાઓ', 'newmessagesdifflink' => 'છેલ્લો ફેરફાર', 'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).', -'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)', +'youhavenewmessagesmanyusers' => 'આપને માટે ઘણાં સભ્યો તરફથી $1 છે ($2).', 'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશો|નવા સંદેશા}}', 'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}', -'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.', +'youhavenewmessagesmulti' => 'તમારા માટે $1 ઉપર નવા સંદેશાઓ છે', 'editsection' => 'ફેરફાર કરો', 'editold' => 'ફેરફાર કરો', 'viewsourceold' => 'સ્રોત જુઓ', 'editlink' => 'ફેરફાર', -'viewsourcelink' => 'સ્રોત જુઓ.', +'viewsourcelink' => 'સ્રોત જુઓ', 'editsectionhint' => 'ફેરફાર કરો - પરિચ્છેદ: $1', 'toc' => 'અનુક્રમણિકા', 'showtoc' => 'બતાવો', @@ -456,10 +456,10 @@ $1', 'feedlinks' => 'ફીડ:', 'feed-invalid' => 'અયોગ્ય સબસ્ક્રીપ્સન ફીડ પ્રકાર.', 'feed-unavailable' => ' સંલગ્ન માહિતીની અપૂરાતિ મોજૂદ નથી', -'site-rss-feed' => '$1 RSS Feed', -'site-atom-feed' => '$1 Atom Feed', -'page-rss-feed' => '"$1" RSS Feed', -'page-atom-feed' => '"$1" એટોમ ફીડ', +'site-rss-feed' => '$1 RSS ફીડ', +'site-atom-feed' => '$1 એટમ ફીડ', +'page-rss-feed' => '"$1" RSS ફીડ', +'page-atom-feed' => '"$1" એટમ ફીડ', 'red-link-title' => '$1 (પાનું અસ્તિત્વમાં નથી)', 'sort-descending' => 'ઉતરતા ક્રમમાં ગોઠવો', 'sort-ascending' => 'ચડતા ક્રમમાં ગોઠવો', @@ -477,7 +477,7 @@ $1', 'nstab-category' => 'શ્રેણી', # Main script and global functions -'nosuchaction' => 'આવી કોઇ ક્રિયા નથી.', +'nosuchaction' => 'આવી કોઇ ક્રિયા નથી', 'nosuchactiontext' => 'આ URL દ્વારા દર્શાવેલી ક્રિયા અયોગ્ય છે. તમે કદાચ ખોટો URL છાપ્યો હશે અથવા ખોટી કડીથી અહીં આવ્યા હશો. તમે સોફ્ટવેરની આ ખામી {{SITENAME}} પર દર્શાવી શકો છો.', @@ -495,7 +495,7 @@ $1', 'databaseerror-query' => 'પ્રશ્ન: $1', 'databaseerror-function' => 'વિધેય: $1', 'databaseerror-error' => 'ક્ષતિ: $1', -'laggedslavemode' => 'ચેતવણી: પાનું તાજેતરના ફેરફાર ધરાવતું નથી.', +'laggedslavemode' => '"ચેતવણી:" પાનું તાજેતરના ફેરફાર ધરાવતું નથી.', 'readonly' => 'ડેટાબેઝ સ્થગિત', 'enterlockreason' => 'સ્થગિતતા ક્યારે દુર કરાશે તેના અંદાજ શાથે,સ્થગિત કરવાનું કારણ આપો', 'readonlytext' => 'નવી નોંધો અને ફેરફારો માટે ડેટાબેઝ હાલમાં સ્થગિત કરાયેલ છે,કદાચ નિયમિત ડેટાબેઝ સારસંભાળ માટે,તે પછી આ ફરી સામાન્ય થશે. @@ -517,7 +517,7 @@ $1', 'filecopyerror' => '"$1" થી "$2"માં નકલ નિષ્ફળ.', 'filerenameerror' => '"$1" નું નામ બદલીને "$2" કરવામાં નિષ્ફળ.', 'filedeleteerror' => '"$1" ફાઇલ હટાવી ન શકાઇ.', -'directorycreateerror' => 'ડીરેક્ટરી "$1" ન બનાવી શકાઇ.', +'directorycreateerror' => 'ડિરેક્ટરી "$1" ન બનાવી શકાઇ.', 'filenotfound' => 'ફાઇલ "$1" ન મળી.', 'fileexistserror' => 'ફાઇલ "$1"માં ન લખી શકાયું : ફાઇલ અસ્તિત્વ ધરાવે છે.', 'unexpected' => 'અણધારી કિંમત: "$1"="$2".', @@ -528,7 +528,7 @@ $1', 'cannotdelete-title' => '"$1" પાનું કાઢી શકતા નથી', 'delete-hook-aborted' => 'દૂર કરવાનું હૂક વડે રોકી રાખવામાં આવ્યું. તે કોઇ કારણ આપતું નથી.', -'badtitle' => 'ખરાબ નામ', +'badtitle' => 'ખરાબ શિર્ષક', 'badtitletext' => 'આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે. શક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.', 'perfcached' => 'નીચે દર્શાવેલી માહિતી જૂના સંગ્રહમાંથી લીધેલી છે અને શક્ય છે કે તે હાલની પરિસ્થિતિમાં સચોટ ના હોય. વધુમાં વધુ {{PLURAL:$1|એક પરિણામ|$1 પરિણામો}} આ સંગ્રહમાં ઉપલબ્ધ છે.', @@ -582,12 +582,12 @@ $2', 'yourname' => 'સભ્ય નામ:', 'userlogin-yourname' => 'સભ્ય નામ', 'userlogin-yourname-ph' => 'તમારૂં સભ્ય નામ દાખલ કરો', -'createacct-another-username-ph' => 'તમારૂં સભ્યનામ દાખલ કરો', +'createacct-another-username-ph' => 'સભ્યનામ દાખલ કરો', 'yourpassword' => 'ગુપ્ત સંજ્ઞા:', 'userlogin-yourpassword' => 'ગુપ્ત સંજ્ઞા', -'userlogin-yourpassword-ph' => 'ગુપ્ત સંજ્ઞા લખો', +'userlogin-yourpassword-ph' => 'તમારી ગુપ્ત સંજ્ઞા (પાસવર્ડ) લખો', 'createacct-yourpassword-ph' => 'પાસવર્ડ દાખલ કરો', -'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો', +'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો:', 'createacct-yourpasswordagain' => 'પાસવર્ડની ખાતરી કરો', 'createacct-yourpasswordagain-ph' => 'પાસવર્ડ ફરીથી દાખલ કરો', 'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)', @@ -604,7 +604,7 @@ $2', 'logout' => 'બહાર નીકળો', 'userlogout' => 'બહાર નીકળો/લૉગ આઉટ', 'notloggedin' => 'પ્રવેશ કરેલ નથી', -'userlogin-noaccount' => 'શું તમારૂં ખાતું નથી ?', +'userlogin-noaccount' => 'શું તમારૂં ખાતું નથી?', 'userlogin-joinproject' => '{{SITENAME}} સાથે જોડાવ', 'nologin' => "શું તમારૂં ખાતું નથી? તો નવું '''$1'''.", 'nologinlink' => 'ખાતું ખોલો', @@ -615,6 +615,8 @@ $2', 'userlogin-resetpassword-link' => 'તમારી ગુપ્તસંજ્ઞા બદલો', 'helplogin-url' => 'Help:પ્રવેશ માટે', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|પ્રવેશવા માટેની મદદ]]', +'userlogin-loggedin' => 'તમે પહેલેથી {{GENDER:$1|$1}} તરીકે પ્રવેશ કરેલો જ છે. +બીજા સભ્ય તરીકે પ્રવેશ કરવા માટે નીચેનું ફોર્મ વાપરો.', 'userlogin-createanother' => 'બીજું ખાતું બનાવો', 'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.', 'createacct-another-join' => 'નવા ખાતાંની માહિતી નીચે દાખલ કરો.', @@ -669,20 +671,19 @@ $2', 'passwordtooshort' => 'ગુપ્ત સંજ્ઞામાં ઓછામાં {{PLURAL:$1|ઓછો એક અક્ષર હોવો |ઓછા $1 અક્ષર હોવા}} જોઇએ.', 'password-name-match' => 'તમારી ગુપ્તસંજ્ઞા તમારા સભ્યનામ કરતાં અલગ જ હોવી જોઇએ.', 'password-login-forbidden' => 'આ સભ્યનામ અને ગુપ્તસંજ્ઞા વાપરવા પર પ્રતિબંધ છે.', -'mailmypassword' => 'પાસવર્ડ ઇ-મેલમાં મોકલો', +'mailmypassword' => 'નવો પાસવર્ડ ઇમેલમાં મોકલો', 'passwordremindertitle' => '{{SITENAME}} માટેની નવી કામચલાઉ ગુપ્ત સંજ્ઞા', 'passwordremindertext' => 'કોઇકે (કદાચ તમે IP એડ્રેસ $1 પરથી) {{SITENAME}} ($4) માટે નવી ગુપ્ત સજ્ઞા (પાસવર્ડ) માટે વિનંતી કરેલ છે. હંગામી ધોરણે સભ્ય "$2" માટે ગુપ્ત સંજ્ઞા બની છે અને તે "$3". જો તમે જ આ વિનંતી કરી હોય અને તમે ગુપ્ત સંજ્ઞા બદલવા માંગતા હો તો તમારે પ્રવેશ કરવો પડશે અને નવી ગુપ્ત સંજ્ઞા પસંદ કરવી પડશે. હંગામી ગુપ્ત સંજ્ઞાની અવધિ {{PLURAL:$5|એક દિવસ|$5 દિવસો}} છે ત્યાર બાદ તે કામ નહીં કરે. જો બીજા કોઇએ આ વિનંતી કરી હોય અથવા તમને તમારી જુની ગુપ્ત સંજ્ઞા યાદ આવી ગઇ હોય અને તમે તે બદલવા ન માંગતા હો તો આ સંદેશ અવગણીને તમારી જુની ગુપ્ત સંજ્ઞા વાપરવાનું ચાલુ રાખો.', 'noemail' => 'સભ્ય "$1"નું કોઇ ઇ-મેલ સરનામું નોંધાયેલું નથી.', -'noemailcreate' => 'વૈધ ઇ-મેલ આપશો', +'noemailcreate' => 'તમારે વૈધ ઇમેલ આપવાની જરૂર છે.', 'passwordsent' => '"$1" ની નવી ગુપ્તસંજ્ઞા (પાસવર્ડ) આપના ઇમેઇલ પર મોકલવામાં આવ્યો છે. કૃપા કરી તે મળ્યા બાદ ફરી લોગ ઇન કરો.', -'blocked-mailpassword' => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse. -ફેરફાર કરવા માટે તમારું IP એડ્રેસ સ્થગિત કરી દેવાયું છે તેથી દૂરુપયોગ ટાળવા માટે તમને ગુપ્તસંજ્ઞા રીકવરી કરવાની છૂટ નથી.', -'eauthentsent' => 'પુષ્ટિ કરવા માટે તમે આપેલા સરનામાં પર ઇમેઇલ મોકલવામાં આવ્યો છે. -એ જ સરનામે બીજો ઇમેઇલ થતાં પહેલાં તમારે ઇમેઇલમાં લખેલી સૂચનાઓ પ્રમાણે કરવું પડશે જેથી એ પુષ્ટિ થઇ શકે કે આપેલું સરનામું તમારું છે.', +'blocked-mailpassword' => 'ફેરફાર કરવા માટે તમારું IP એડ્રેસ સ્થગિત કરી દેવાયું છે, તેથી દૂરુપયોગ ટાળવા માટે તમને ગુપ્તસંજ્ઞા ફરી મેળવવાની છૂટ નથી.', +'eauthentsent' => 'પુષ્ટિ કરવા માટે તમે આપેલા સરનામાં પર ઇમેલ મોકલવામાં આવ્યો છે. +એ જ સરનામે બીજો ઇમેલ થતાં પહેલાં તમારે ઇમેલમાં લખેલી સૂચનાઓ પ્રમાણે કરવું પડશે જેથી એ પુષ્ટિ થઇ શકે કે આપેલું સરનામું તમારું છે.', 'throttled-mailpassword' => 'ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} મોકલેલી છે. દૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.', 'mailerror' => 'મેઇલ મોકલવામાં ત્રુટિ: $1', @@ -733,23 +734,23 @@ $2', 'resetpass-no-info' => 'બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.', 'resetpass-submit-loggedin' => 'ગુપ્તસંજ્ઞા બદલો', 'resetpass-submit-cancel' => 'રદ કરો', -'resetpass-wrong-oldpass' => 'અવૈધ હંગામે કે કાયમી ગુપ્તસંજ્ઞા. -કદાચ તમે પહેલેથી સફળતા પૂર્વક તમારી ગુપ્ત સંજ્ઞા બદલી દીધી હોય કે નવી ગુપ્ત સંંજ્ઞામાટે વિનંતિ કરી હોય', +'resetpass-wrong-oldpass' => 'અયોગ્ય હંગામી કે હાલની ગુપ્તસંજ્ઞા. +કદાચ તમે પહેલેથી સફળતાપૂર્વક તમારી ગુપ્ત સંજ્ઞા બદલી દીધી હશે કે નવી ગુપ્ત સંજ્ઞા માટે વિનંતિ કરી હશે.', 'resetpass-temp-password' => 'કામચલાઉ ગુપ્તસંજ્ઞા:', 'resetpass-abort-generic' => 'વિસ્તારક વડે પાસવર્ડ બદલવાનું રોકી રખાયું છે.', # Special:PasswordReset -'passwordreset' => 'પાસવર્ડ રીસેટ કરો', +'passwordreset' => 'ગુપ્ત સંજ્ઞા ફરી ગોઠવો', 'passwordreset-text-one' => 'તમારો પાસવર્ડ બદલવા માટે આ ફોર્મ પૂરુ કરો.', -'passwordreset-legend' => 'પાસવર્ડ રીસેટ કરો', -'passwordreset-disabled' => 'આ વિકી પર પાસવર્ડ રીસેટ કરવા પર પ્રતિબંધ છે.', +'passwordreset-legend' => 'ગુપ્ત સંજ્ઞા ફરી ગોઠવો', +'passwordreset-disabled' => 'આ વિકી પર ગુપ્ત સંજ્ઞા ફરી ગોઠવવા પર પ્રતિબંધ છે.', 'passwordreset-emaildisabled' => 'આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.', 'passwordreset-username' => 'સભ્ય નામ:', 'passwordreset-domain' => 'ડોમેઈન:', -'passwordreset-capture' => 'પરિણામી ઈ મેલ જોવો છે ?', +'passwordreset-capture' => 'પરિણામી ઈમેલ જોવો છે?', 'passwordreset-capture-help' => 'જો તમે આ ઓપ્શન સિલેક્ટ કરશો, તો તમને અને યુઝર ને ઈ મેલ (કામચલાઉ પાસવર્ડ સાથે) દેખાડવામાં આવશે.', -'passwordreset-email' => 'ઇ મેલ સરનામું:', -'passwordreset-emailtitle' => '{{SITENAME}} માટે ખાતુ બનાવ્યું', +'passwordreset-email' => 'ઇમેલ સરનામું:', +'passwordreset-emailtitle' => '{{SITENAME}} પર ખાતાની માહિતી', 'passwordreset-emailtext-ip' => 'કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}} ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે. . . @@ -769,15 +770,15 @@ $2 'passwordreset-emailerror-capture' => 'પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1', # Special:ChangeEmail -'changeemail' => 'ઈ મેલ ખાતુ બદલવા માટે', -'changeemail-header' => 'તમારા ખાતાનું ઈ-મેઈલ સરનામું બદલો', +'changeemail' => 'ઇમેલ સરનામું બદલો', +'changeemail-header' => 'તમારા ખાતાનું ઇમેલ સરનામું બદલો', 'changeemail-text' => 'તમારું ઈ-મેઈલ સરનામું બદલવા માટે આ ફોર્મ ભરો. આ ફેરફાર કાયમ કરવા માટે તમારે પાસવર્ડ ભરવાની જરૂર પડશે.', 'changeemail-no-info' => 'બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.', -'changeemail-oldemail' => 'હાલ નું ઈ મેલ ખાતુ:', -'changeemail-newemail' => 'નવું ઈ-મેલ સરનામું', +'changeemail-oldemail' => 'હાલનું ઈમેલ સરનામું:', +'changeemail-newemail' => 'નવું ઈમેલ સરનામું:', 'changeemail-none' => '(કંઈ નહી)', 'changeemail-password' => 'તમારો {{SITENAME}} પાસવર્ડ:', -'changeemail-submit' => 'ઈ મેલ બદલો', +'changeemail-submit' => 'ઈમેલ બદલો', 'changeemail-cancel' => 'રદ કરો', # Special:ResetTokens @@ -811,13 +812,13 @@ $2 # Edit pages 'summary' => 'સારાંશ:', 'subject' => 'વિષય/શીર્ષક:', -'minoredit' => 'આ એક નાનો સુધારો છે.', +'minoredit' => 'આ એક નાનો સુધારો છે', 'watchthis' => 'આ પાનાને ધ્યાનમાં રાખો', -'savearticle' => 'સાચવો', +'savearticle' => 'પાનું સાચવો', 'preview' => 'પૂર્વાવલોકન', -'showpreview' => 'ઝલક', +'showpreview' => 'ઝલક દર્શાવો', 'showlivepreview' => 'જીવંત પૂર્વાવલોકન', -'showdiff' => 'ફેરફારો', +'showdiff' => 'ફેરફારો દર્શાવો', 'anoneditwarning' => "'''ચેતવણી:''' તમે તમારા સભ્ય નામથી પ્રવેશ કર્યો નથી. આ પાનાનાં ઇતિહાસમાં તમારૂં આઇ.પી. (IP) એડ્રેસ નોંધવામાં આવશે.", 'anonpreviewwarning' => 'તમે સભ્યનામથી પ્રવેશ કર્યો નથી,આ પાનું ઈતિહાસમાંતમારા IP સરનામાના નામે સાચવવામાં આવશે', @@ -934,7 +935,7 @@ $2 તમારે તમારા ફેરફારો વિહરમાન હયાત લેખમાં વિલિન કરવો પડશે. જો તમે \"{{int:savearticle}}\" આ બાન દબાવશો તો '''ફક્ત''' ઉપરનો લેખ સચવાશે.", 'yourtext' => 'તમારું લખાણ', -'storedversion' => 'રક્ષિત પુનરાવર્તન', +'storedversion' => 'સંગ્રહેલ પુનરાવર્તન', 'nonunicodebrowser' => "'''ચેતવણી: તમારું બ્રાઉઝર યુનિકોડ ઉકેલવા સક્ષમ નથી.''' અહીં તમે સુરક્ષિત રીતે ફેરફારો નહીં કરી શકો: ASCII સિવાયના અક્ષરો સંપાદન ચોકઠામાં હેક્સાડેસિમલ સ્વરૂપે દેખાશે.", 'editingold' => "'''ચેતવણી: તમે આ પાનાની ખૂબ જૂની આવૃત્તિમાં ફેરફાર કરી રહ્યાં છો.''' @@ -1039,7 +1040,7 @@ $3 દ્વારા અપાયેલ કારણ છે ''$2''", 'currentrev-asof' => '$1એ જોઈ શકાતી હાલની આવૃત્તિ', 'revisionasof' => '$1 સુધીનાં પુનરાવર્તન', 'revision-info' => '$2 દ્વારા $1 સુધીમાં કરવામાં આવેલાં ફેરફારો', -'previousrevision' => '←જુના ફેરફારો', +'previousrevision' => '← જુના ફેરફારો', 'nextrevision' => 'આ પછીનું પુનરાવર્તન→', 'currentrevisionlink' => 'વર્તમાન આવૃત્તિ', 'cur' => 'વર્તમાન', @@ -1194,7 +1195,7 @@ $1", # Merge log 'mergelog' => 'લોગ વિલિન કરો', 'pagemerge-logentry' => '[[$1]] ને [[$2]]માં વિલિન કરાયું ( $3 સુધી ના પુનરાવર્તનો)', -'revertmerge' => 'છુટુ પાડો', +'revertmerge' => 'છુટું પાડો', 'mergelogpagetext' => 'તાજેતરમાં એક બીજા સાથે વિલિન થયેલ ઇતિહાસ પાનાની યાદી', # Diffs @@ -1277,7 +1278,7 @@ $1", # Preferences page 'preferences' => 'પસંદ', -'mypreferences' => 'પસંદ', +'mypreferences' => 'પસંદગીઓ', 'prefs-edits' => 'સંપાદનોની સંખ્યા', 'prefsnologin' => 'પ્રવેશ કરેલ નથી', 'prefsnologintext' => 'સભ્યના અધિકારો બદલવા તમે [{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logged in] પ્રવેશ કરેલો હોવો જોઈએ', @@ -1873,10 +1874,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', 'filehist-current' => 'વર્તમાન', 'filehist-datetime' => 'તારીખ/સમય', 'filehist-thumb' => 'લઘુચિત્ર', -'filehist-thumbtext' => '$1ઍ હતું તે સંસ્કરણનું લઘુચિત્ર', -'filehist-nothumb' => 'થમ્બનેઇલ નથી', +'filehist-thumbtext' => '$1એ હતું તે સંસ્કરણનું લઘુચિત્ર', +'filehist-nothumb' => 'લઘુચિત્ર નથી', 'filehist-user' => 'સભ્ય', -'filehist-dimensions' => 'પરિમાણ', +'filehist-dimensions' => 'પરિમાણો', 'filehist-filesize' => 'ફાઇલનું કદ', 'filehist-comment' => 'ટિપ્પણી', 'filehist-missing' => 'ફાઇલ ગાયબ', @@ -1917,8 +1918,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', 'filedelete-intro' => "તમે '''[[Media:$1|$1]]'' ફાઇલ અને તેની સાથે સંલગ્ન ઇતિહાસ ભુંસી રહ્યા છો.", 'filedelete-intro-old' => "તમે '''[[Media:$1|$1]]'''નું આ [$4 $3, $2] વર્ઝન ભુસી રહ્યા છો.", 'filedelete-comment' => 'કારણ:', -'filedelete-submit' => 'ભુંસો', -'filedelete-success' => "'''$1'''ને ભૂંસી નાંખવામાં આવ્યું છે.", +'filedelete-submit' => 'દૂર કરો', +'filedelete-success' => "'''$1'''ને દૂર કરવામાં આવ્યું છે.", 'filedelete-success-old' => "'''[[Media:$1|$1]]'''નું $3, $2ના રોજનું સંસ્કરણ ભુંસી નાખ્યું છે.", 'filedelete-nofile' => "'''$1'''નું અસ્તિત્વ નથી.", 'filedelete-nofile-old' => "'''$1'''નું આપે જણાવેલ ખાસિયતવાળું સંગ્રહિત સંસ્કરણ અસ્તિત્વમાં નથી.", @@ -1955,6 +1956,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', 'randompage-nopages' => 'આ {{PLURAL:$2|નામસ્થળ|નામસ્થળો}}માં કોઇ પાના નથી: $1.', # Random page in category +'randomincategory' => 'શ્રેણીમાં ગમે તે પાનું', +'randomincategory-invalidcategory' => '"$1" એ યોગ્ય શ્રેણી નામ નથી.', +'randomincategory-nopages' => '[[:Category:$1|$1]] વર્ગમાં કોઇ પાનું નથી.', +'randomincategory-selectcategory' => 'વર્ગમાંથી ગમે તે પાનું મેળવો: $1 $2.', 'randomincategory-selectcategory-submit' => 'જાઓ', # Random redirect @@ -2010,6 +2015,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', # Miscellaneous special pages 'nbytes' => '$1 {{PLURAL:$1|બાઇટ|બાઇટ્સ}}', 'ncategories' => '$1 {{PLURAL:$1|શ્રેણી|શ્રેણીઓ}}', +'ninterwikis' => '$1 {{PLURAL:$1|આંતરવિકિ|આંતરવિકિઓ}}', 'nlinks' => '$1 {{PLURAL:$1|કડી|કડીઓ}}', 'nmembers' => '$1 {{PLURAL:$1|સદસ્ય|સદસ્યો}}', 'nrevisions' => '$1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}', @@ -2057,6 +2063,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', 'listusers' => 'સભ્યોની યાદી', 'listusers-editsonly' => 'માત્ર સંપાદન કરનારા સભ્યો બતાવો', 'listusers-creationsort' => 'તારીખ અનુસાર ગોઠવો', +'listusers-desc' => 'ઉતરતા ક્રમમાં ગોઠવો', 'usereditcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}', 'usercreated' => '$1 તારીખે $2 વાગ્યે {{GENDER:$3|બનાવ્યું}}', 'newpages' => 'નવાં પાનાં', @@ -2102,7 +2109,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ', 'prevpage' => 'પાછળનું પાનું ($1)', 'allpagesfrom' => 'આનાથી શરૂ થતા પાના દર્શાવો:', 'allpagesto' => 'આનાથી અંત થતા પાના દર્શાવો:', -'allarticles' => 'બધા લેખ', +'allarticles' => 'બધા પાનાંઓ', 'allinnamespace' => 'બધા પાના ($1 નમાવકાશ)', 'allnotinnamespace' => 'બધા પાના ($1 નમાવકાશમાંના હોય)', 'allpagesprev' => 'પહેલાનું', @@ -2317,10 +2324,12 @@ $UNWATCHURL 'deletecomment' => 'કારણ:', 'deleteotherreason' => 'અન્ય/વધારાનું કારણ:', 'deletereasonotherlist' => 'અન્ય કારણ', -'deletereason-dropdown' => '* હટાવવાનાં સામાન્ય કારણો -** લેખકની વિનંતી +'deletereason-dropdown' => '* દૂર કરવાના સામાન્ય કારણો +** સ્પામ +** ભાંગફોડીયા પ્રવૃત્તિ ** પ્રકાશનાધિકાર ભંગ -** ભાંગફોડીયા પ્રવૃત્તિ', +** લેખકની વિનંતી +** ભાંગેલ વળાંક', 'delete-edit-reasonlist' => 'ભુંસવાનું કારણ બદલો.', 'delete-toobig' => 'આ પાનાના ફેરફારોનો ઇતિહાસ ખૂબ લાંબો છે , $1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}થી પણ વધારે. {{SITENAME}}ને અક્સ્માતે ખોરવાતું અટકાવવા આવા પાનાને હટાવવા પર પ્રતિબંધ છે.', @@ -2531,7 +2540,7 @@ $1', 'whatlinkshere-hidetrans' => '$1 આરપાર સમાવેશનો', 'whatlinkshere-hidelinks' => 'કડીઓ $1', 'whatlinkshere-hideimages' => '$1 ફાઇલની કડીઓ', -'whatlinkshere-filters' => 'ચાળણી', +'whatlinkshere-filters' => 'ચાળણીઓ', # Block/unblock 'autoblockid' => 'ઓટોબ્લોક #$1', @@ -2588,7 +2597,7 @@ $1', 'unblocked-range' => '$1 અનાવરોધિત કરવામાં આવ્યું છે', 'unblocked-id' => ' $1 નો પ્રતિબંધ હટાવાયો', 'blocklist' => 'પ્રતિબંધિત સભ્યો', -'ipblocklist' => 'અવરોધિત વપરાશકર્તાઓ', +'ipblocklist' => 'પ્રતિબંધિત વપરાશકર્તાઓ', 'ipblocklist-legend' => 'પ્રતિબંધિત સભ્ય શોધો', 'blocklist-userblocks' => 'એકાઉન્ટ બ્લોકો છુપાવો', 'blocklist-tempblocks' => 'કામચલાઉ બ્લોકો છુપાવો', @@ -2652,12 +2661,9 @@ $1', જો કે આને સામૂહિક $2 રોક લગાવાઇ હોવાથી તે સમૂ હની રોક હટાવી શકાશે.', 'ip_range_invalid' => 'અવૈધ IP શ્રેણી', 'ip_range_toolarge' => '/$1થી મોટા વિસ્તાર પ્રતિબંધની પરવાનગી નથી.', -'blockme' => 'મને પ્રતિબંધિત કરો', 'proxyblocker' => 'અવેજી (પ્રોક્સી) રોક લગાડનાર', -'proxyblocker-disabled' => 'આ સુવિધા નિષ્ક્રીય કરી છે.', 'proxyblockreason' => 'તમારા IP સરનામા પરા રોક લગાડાઈ છે કેમકે તેએક ખુલ્લી પ્રોક્સી છે. કૃપયા તમારા ઇંટરનેટ સેવા પ્રદાતા કે તકનીકી સહાય વિભાગનો સંપર્ક કરી જણાવો કે આ એક ભયંકર સુરક્ષા મામલો છે.', -'proxyblocksuccess' => 'સંપન્ન', 'sorbsreason' => '{{SITENAME}} દ્વારા વપરાયેલા DNSBL માં તમારું IP સરનામું એક ખુલ્લી પ્રોક્સી તરીકે નોંધાયું છે.', 'sorbs_create_account_reason' => '{{SITENAME}} માં વપરાતા DNSBL દ્વારા તમારા IP સરનામાને ખુલી પ્રોક્સી જણાવાઇ છે. તમે ખાતાની રચના નહીં કરી શકો.', @@ -2826,6 +2832,8 @@ $1', 'thumbnail-more' => 'વિસ્તૃત કરો', 'filemissing' => 'ફાઇલ ગાયબ', 'thumbnail_error' => 'નાની છબી (થંબનેઇલ-thumbnail) બનાવવામાં ત્રુટિ: $1', +'thumbnail_error_remote' => '$1 તરફથી ક્ષતિ સંદેશ: +$2', 'djvu_page_error' => 'DjVu પાનું સીમાની બહાર', 'djvu_no_xml' => 'DjVu ફાઇલ માટે XML લાવવા અસમર્થ', 'thumbnail-temp-create' => 'હંગામી થમ્બનેલ ફાઈલ ન બનાવી શકાઈ', @@ -2907,7 +2915,7 @@ $1', 'tooltip-pt-anonuserpage' => 'IP સરનામું માટેના સભ્ય પાનામાં તમે ફેરફાર કરી રહ્યાં છો.', 'tooltip-pt-mytalk' => 'તમારૂં ચર્ચાનું પાનું', 'tooltip-pt-anontalk' => 'આ IP સરનામા દ્વારા થયેલ ફેરફારની ચર્ચા', -'tooltip-pt-preferences' => 'મારી પસંદ', +'tooltip-pt-preferences' => 'તમારી પસંદગીઓ', 'tooltip-pt-watchlist' => 'તમે દેખરેખ રાખી રહ્યાં હોવ તેવા પાનાઓની યાદી', 'tooltip-pt-mycontris' => 'તમારા યોગદાનની યાદી', 'tooltip-pt-login' => 'આપને લોગ ઇન કરવા ભલામણ કરવામાં આવે છે, જોકે તે આવશ્યક નથી', @@ -2933,9 +2941,9 @@ $1', 'tooltip-n-mainpage-description' => 'મુખ્ય પાના પર જાઓ', 'tooltip-n-portal' => 'પરિયોજના વિષે, આપ શું કરી શકો અને વસ્તુઓ ક્યાં શોધશો', 'tooltip-n-currentevents' => 'પ્રસ્તુત ઘટનાની પૃષ્ઠભૂમિની માહિતિ શોધો', -'tooltip-n-recentchanges' => 'વિકિમાં હાલમા થયેલા ફેરફારોની સૂચિ.', +'tooltip-n-recentchanges' => 'વિકિમાં હાલમાં થયેલ ફેરફારોની સૂચિ', 'tooltip-n-randompage' => 'કોઇ પણ એક લેખ બતાવો', -'tooltip-n-help' => 'શોધવા માટેની જગ્યા.', +'tooltip-n-help' => 'શોધવા માટેની જગ્યા', 'tooltip-t-whatlinkshere' => 'અહીં જોડાતા બધાં વિકિ પાનાઓની યાદી', 'tooltip-t-recentchangeslinked' => 'આ પાના પરની કડીઓ વાળા લેખોમાં તાજેતરમાં થયેલા ફેરફારો', 'tooltip-feed-rss' => 'આ પાના માટે આર.એસ.એસ. ફીડ', @@ -2995,6 +3003,8 @@ $1', 'spambot_username' => 'મિડિયાવિકી સ્પેમ સફાઇ', 'spam_reverting' => ' $1 પર કડી ન ધરાવતા છેલ્લા ફેરેફાર પર પુનઃ સ્થાપન કરાય છે', 'spam_blanking' => 'બધા ફેરફારોમાં $1 પર કડી હતી, આને હટાવી દેવામાં આવે છે', +'simpleantispam-label' => "સ્પામ-વિરોધી તપાસ. +આને '''ના''' ભરશો!", # Info page 'pageinfo-title' => ' "$1" માટે માહિતી', @@ -3824,6 +3834,7 @@ $5 'dberr-problems' => 'દિલગીરી! આ સાઇટ તકનિકી અડચણ અનુભવી રહી છે.', 'dberr-again' => 'થોડી વાર રાહ જોઈને ફરી પેજ લોડ કરવાનો પ્રયત્ન કરો.', 'dberr-info' => '(માહિતી સંચય સર્વર : $1નો સંપર્ક નથી કરી શકાયો)', +'dberr-info-hidden' => '(ડેટાબેઝ સર્વર સાથે જોડાણ થઇ શકતું નથી)', 'dberr-usegoogle' => 'તેસમયા દરમ્યાન તમે ગુગલ દ્વારા શોધી શકો', 'dberr-outofdate' => 'આપણી માહિતી સંબંધી તેમની સૂચિ કાલાતિત હોઇ શકે.', 'dberr-cachederror' => 'વિનંતિ કરેલ પાનાની આ એક સંગ્રહીત પ્રત માત્ર છે અને તે અધ્યતન ન પણ હોય.', @@ -3871,8 +3882,8 @@ $5 'logentry-move-move-noredirect' => '$1 એ દિશાનિર્દેશન છોડ્યા વગર પાના $3ને $4 પર {{GENDER:$2|વાળ્યું}}', 'logentry-move-move_redir' => '$1એ દિશાનિર્દેશન કરીને પાના $3ને $4 પર {{GENDER:$2|ખસેડ્યું}}', 'logentry-move-move_redir-noredirect' => '$1એ દિશાનિર્દેશન કરીને પાના $3ને $4 પર {{GENDER:$2|વાળ્યું}} પણ પાછળ દિશાનિર્દેશન છોડ્યું નહી', -'logentry-patrol-patrol' => '$1 આવૃત્તિ ચિહ્નિત થયેલ પાનાં $4 $3 ચોકી કરવા ફરવા નીકળવું', -'logentry-patrol-patrol-auto' => '$1 આપોઆપ ચિહ્નિત ચોકી પહેરો કરવા લાગ્યા આવૃત્તિ પાનું $4 $3', +'logentry-patrol-patrol' => 'પાનાં $3 ની આવૃત્તિ $4 ને $1 વડે ચોકી કરવા માટે {{GENDER:$2|નિશાનીત}} કરેલ છે', +'logentry-patrol-patrol-auto' => 'પાનાં $3 ની આવૃત્તિ $4 ને $1 એ આપમેળે ચોકી કરવા માટે {{GENDER:$2|નિશાનીત}} કરેલ છે', 'logentry-newusers-newusers' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}', 'logentry-newusers-create' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}', 'logentry-newusers-create2' => 'સભ્ય ખાતું $3 $1 વડે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}', diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php index cfd1c4833f..1e2aafedb2 100644 --- a/languages/messages/MessagesGv.php +++ b/languages/messages/MessagesGv.php @@ -1186,7 +1186,6 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':", 'unblocklogentry' => '$1 er ny neughlassey magh', 'block-log-flags-anononly' => 'ymmydeyryn neuenmyssit ynrican', 'block-log-flags-nocreate' => 'gyn kiart coontyssyn y chroo', -'proxyblocksuccess' => 'Jeant.', # Move page 'move-page' => '$1 y scughey', diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php index 3176244060..770bd8992f 100644 --- a/languages/messages/MessagesHak.php +++ b/languages/messages/MessagesHak.php @@ -1560,7 +1560,6 @@ Also see [[Special:WantedCategories|wanted categories]].', 'ip_range_invalid' => '無效嘅IP範圍。', 'proxyblocker' => '代理封鎖器', 'proxyblockreason' => '汝嘅IP地址係一隻開放嘅代理,其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。', -'proxyblocksuccess' => '完成。', 'sorbsreason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.', 'sorbs_create_account_reason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.', diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php index 23c203fbd7..b0084fa385 100644 --- a/languages/messages/MessagesHaw.php +++ b/languages/messages/MessagesHaw.php @@ -736,7 +736,6 @@ E Ê»ike iā $2 no ka papa o nā kāpae Ê»ana hou.', 'unblocklink' => 'mai pale', 'change-blocklink' => 'hoÊ»ololi ka palena', 'contribslink' => 'nā ha‘awina', -'blockme' => 'E ke‘a ia‘u', # Move page 'move-page-legend' => 'HoÊ»oneÊ»e i ka Ê»aoÊ»ao', diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php index d26e1b7aa3..ffa2ae2ff6 100644 --- a/languages/messages/MessagesHe.php +++ b/languages/messages/MessagesHe.php @@ -579,7 +579,7 @@ $messages = array( 'articlepage' => 'צפייה בדף התוכן', 'talk' => 'שיחה', 'views' => 'צפיות', -'toolbox' => 'תיבת כלים', +'toolbox' => 'כלים', 'userpage' => 'צפייה בדף המשתמש', 'projectpage' => 'צפייה בדף המיזם', 'imagepage' => 'צפייה בדף הקובץ', @@ -2900,12 +2900,9 @@ $1', 'ipb_blocked_as_range' => 'שגיאה: כתובת ה־IP $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה. עם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.', 'ip_range_invalid' => 'טווח IP שגוי.', 'ip_range_toolarge' => 'לא ניתן לחסום טווחים גדולים מ־/$1.', -'blockme' => 'חסום אותי', 'proxyblocker' => 'חוסם פרוקסי', -'proxyblocker-disabled' => 'אפשרות זו מבוטלת.', 'proxyblockreason' => 'כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח. אנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.', -'proxyblocksuccess' => 'בוצע.', 'sorbsreason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו.', 'sorbs_create_account_reason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו. אינכם יכולים ליצור חשבון.', 'xffblockreason' => 'כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1', @@ -3271,6 +3268,8 @@ $2', 'spam_reverting' => 'שחזור לגרסה אחרונה שלא כוללת קישורים ל־$1', 'spam_blanking' => 'כל הגרסאות כוללות קישורים ל־$1, מרוקן את הדף', 'spam_deleting' => 'כל הגרסאות כוללות קישורים ל־$1, מוחק את הדף', +'simpleantispam-label' => "בדיקת אנטי־ספאם. +'''אל''' תמלאו שדה זה!", # Info page 'pageinfo-title' => 'מידע על "$1"', diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php index 16904d70bf..9787c39048 100644 --- a/languages/messages/MessagesHi.php +++ b/languages/messages/MessagesHi.php @@ -402,7 +402,7 @@ $messages = array( 'specialpage' => 'विशेष पृष्ठ', 'personaltools' => 'वैयक्तिक औज़ार', 'postcomment' => 'नया अनुभाग', -'articlepage' => 'लेख देखें', +'articlepage' => 'सामग्री पृष्ठ देखें', 'talk' => 'चर्चा', 'views' => 'दर्शाव', 'toolbox' => 'साधन पेटी', @@ -436,7 +436,7 @@ $1', 'aboutsite' => '{{SITENAME}} के बारे में', 'aboutpage' => 'Project:परिचय', 'copyright' => 'उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।', -'copyrightpage' => '{{ns:project}}:सर्वाधिकार', +'copyrightpage' => '{{ns:project}}:कॉपीराइट', 'currentevents' => 'हाल की घटनाएँ', 'currentevents-url' => 'Project:हाल की घटनाएँ', 'disclaimers' => 'अस्वीकरण', @@ -480,7 +480,7 @@ $1', 'hidetoc' => 'छिपाएँ', 'collapsible-collapse' => 'छोटा करें', 'collapsible-expand' => 'विस्तार करें', -'thisisdeleted' => '$1 देखें या बदलें?', +'thisisdeleted' => '$1 देखें या वापिस लाएँ?', 'viewdeleted' => '$1 दिखायें?', 'restorelink' => '{{PLURAL:$1|एक हटाया हुआ|$1 हटाये हुए}} बदलाव', 'feedlinks' => 'फ़ीड:', @@ -1344,10 +1344,10 @@ $1", 'prefs-personal' => 'सदस्य व्यक्तिरेखा', 'prefs-rc' => 'हाल में हुए बदलाव', 'prefs-watchlist' => 'ध्यानसूची', -'prefs-watchlist-days' => 'ध्यानसूचीमें दिखाने के दिन:', +'prefs-watchlist-days' => 'ध्यानसूची में दिखाने के दिन:', 'prefs-watchlist-days-max' => 'अधिकतम $1 {{PLURAL:$1|दिन}}', 'prefs-watchlist-edits' => 'बढ़ाई हुई ध्यानसूची में दिखाने हेतु अधिकतम बदलाव:', -'prefs-watchlist-edits-max' => 'अधिकतम संख्या: १०००', +'prefs-watchlist-edits-max' => 'अधिकतम संख्या: एक हज़ार', 'prefs-watchlist-token' => 'ध्यानसूची टोकन', 'prefs-misc' => 'अन्य', 'prefs-resetpass' => 'कूटशब्द बदलें', @@ -1576,7 +1576,7 @@ HTML टैग की जाँच करें।', 'newuserlogpagetext' => 'यह सदस्य खातों के निर्माण का लॉग है।', # User rights log -'rightslog' => 'सदस्य अधिकार सूची', +'rightslog' => 'सदस्य अधिकार लॉग', 'rightslogtext' => 'यह सदस्य अधिकारों में हुए बदलावों की सूची है।', # Associated actions - in the sentence "You do not have permission to X" @@ -1605,7 +1605,7 @@ HTML टैग की जाँच करें।', 'action-block' => 'इस सदस्य को संपादन करने से ब्लॉक करने', 'action-protect' => 'इस पृष्ठ के सुरक्षा स्तर बदलने', 'action-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लेने', -'action-import' => 'किसी और विकि से यह पृष्ठ आयात करने', +'action-import' => 'किसी और विकि से पृष्ठ आयात करने', 'action-importupload' => 'फ़ाइल अपलोड द्वारा यह पृष्ठ आयात करे', 'action-patrol' => 'अन्य सदस्यों के सम्पादन परीक्षित करने', 'action-autopatrol' => 'अपने सम्पादन स्वचालित रूप से परीक्षित करने', @@ -2086,7 +2086,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।', 'withoutinterwiki' => 'बिना अंतरविकि कड़ियों वाले पृष्ठ', 'withoutinterwiki-summary' => 'निम्न पृष्ठ अन्य भाषाओं के अवतरणों से नहीं जुड़ते हैं।', -'withoutinterwiki-legend' => 'उपपद', +'withoutinterwiki-legend' => 'उपसर्ग', 'withoutinterwiki-submit' => 'दिखायें', 'fewestrevisions' => 'सबसे कम अवतरणों वाले पृष्ठ', @@ -2143,7 +2143,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।', 'listusers' => 'सदस्यसूची', 'listusers-editsonly' => 'केवल संपादन कर चुके सदस्य दिखाएँ', 'listusers-creationsort' => 'निर्माण तिथि के आधार पर क्रमांकन करें', -'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादन}}', +'usereditcount' => '$1 {{PLURAL:$1|सम्पादन}}', 'usercreated' => '$1 को $2 बजे बनाया गया, सदस्यनाम $3 है', 'newpages' => 'नए पृष्ठ', 'newpages-username' => 'सदस्यनाम:', @@ -2172,7 +2172,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।', # Special:Log 'specialloguserlabel' => 'कर्ता:', -'speciallogtitlelabel' => 'प्रयोजन (शीर्षक):', +'speciallogtitlelabel' => 'प्रयोजन (शीर्षक अथवा सदस्यनाम):', 'log' => 'लॉग', 'all-logs-page' => 'सभी सार्वजनिक लॉग', 'alllogstext' => '{{SITENAME}} की सभी उपलब्ध लॉगों की प्रविष्टियों का मिला-जुला प्रदर्शन। @@ -2406,9 +2406,11 @@ $UNWATCHURL 'deleteotherreason' => 'अन्य/अतिरिक्त कारण:', 'deletereasonotherlist' => 'अन्य कारण', 'deletereason-dropdown' => '*हटाने के सामान्य कारण -** लेखक की बिनती +** स्पैम +** बर्बरता ** कॉपीराइट उल्लंघन -** बर्बरता', +** लेखक का अनुरोध +** टूटा अनुप्रेषण', 'delete-edit-reasonlist' => 'हटाने के कारण संपादित करें', 'delete-toobig' => 'इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है। {{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।', @@ -2431,7 +2433,7 @@ $UNWATCHURL इस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।', 'editcomment' => "संपादन सारांश था: \"''\$1''\"।", 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया', -'revertpage-nouser' => '(सदस्य नाम हटाया गया है) द्वारा किए गए संपादन को वापिस पुरानी स्थिति में ला कर इसके पहले के [[User:$1|$1]] द्वारा बने अवतरण को फिर से ताज़ा अवतरण बनाया।', +'revertpage-nouser' => '(सदस्य नाम हटाया गया है) के संपादनों को हटाकर {{GENDER:$1|[[User:$1|$1]]}} के अन्तिम अवतरण को पूर्ववत किया।', 'rollback-success' => '$1 के संपादन हटाए; $2 द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।', @@ -2489,7 +2491,7 @@ $2 द्वारा संपादित अन्तिम अवतरण **अफलदायी सम्पादन युद्ध **अधिक यातायात वाला पृष्ठ', 'protect-edit-reasonlist' => 'सुरक्षा के कारण बदलें', -'protect-expiry-options' => '१ घंटा:1 hour,१ दिन:1 day,१ सप्ताह:1 week,२ सप्ताह:2 weeks,१ महीना:1 month,३ महीने:3 months,६ महीने:6 months,१ साल:1 year,हमेशा के लिए:infinite', +'protect-expiry-options' => 'एक घंटा:1 hour,एक दिन:1 day,एक सप्ताह:1 week,दो सप्ताह:2 weeks,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक साल:1 year,हमेशा के लिए:infinite', 'restriction-type' => 'अधिकार:', 'restriction-level' => 'सुरक्षा-स्तर:', 'minimum-size' => 'न्यूनतम आकार', @@ -2508,7 +2510,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 'restriction-level-all' => 'कोई भी स्तर', # Undelete -'undelete' => 'हटाया पृष्ठ देखें', +'undelete' => 'हटाए पृष्ठ देखें', 'undeletepage' => 'हटाए गए पृष्ठ देखें और पुनर्स्थापित करें', 'undeletepagetitle' => "'''नीचे [[:$1|$1]] के हटाए गए अवतरण दर्शाए गये हैं।'''", 'viewdeletedpage' => 'हटाए गए पृष्ठ देखें', @@ -2517,46 +2519,46 @@ $2 द्वारा संपादित अन्तिम अवतरण 'undelete-fieldset-title' => 'अवतरण पुरानी स्थिति पर लाएँ', 'undeleteextrahelp' => "पृष्ठ का संपूर्ण इतिहास वापस लाने के लिए सभी बक्सों से सही का निशान हटा दें और '''''{{int:undeletebtn}}''''' पर क्लिक करें। चुनिंदा इतिहास को वापस लाने के लिए उन अवतरणों के बगल के बक्सों पर सही का निशान लगाएँ और '''''{{int:undeletebtn}}''''' पर क्लिक करें।", -'undeleterevisions' => '$1 {{PLURAL:$1|अवतरण}} लेखागार में हैं', +'undeleterevisions' => '$1 अवतरण लेखागार में {{PLURAL:$1|है|हैं}}', 'undeletehistory' => 'यदि आप पृष्ठ को पुनर्स्थापित करते हैं तो सभी अवतरण इतिहास में पुनर्स्थापित हो जायेंगे। हटाने के बाद यदि एक नया पृष्ठ उसी नाम से बनाया गया है तो पुनर्स्थापित अवतरण पिछले इतिहास में दर्शित होंगे।', 'undeleterevdel' => 'यदि पुनर्स्थापन के फलस्वरूप शीर्ष पृष्ठ या फ़ाइल अवतरण आंशिक रूप से मिट सकता है, तो इसे नहीं किया जायेगा। ऐसी स्थिति में, आपको नवीनतम मिटाए गए अवतरण को बिना सही के निशान लगाये हुए या बिना छुपाये रखना होगा।', -'undeletehistorynoadmin' => 'यह पृष्ठ निकाल दिया गया है। -निकाले जाने का कारन नीचे सारांश में दिया गया है, और साथ ही उन सदस्यों के बारे में विस्तार भी दिया गया है, जिन्होंने निकाले जाने से पहले इस पृष्ठ को संपादित किया है। -इन हटाये गए अवतरणों के विद्यमान विषय वस्तु केवल प्रशासकों को ही उपलब्ध है।', +'undeletehistorynoadmin' => 'यह पृष्ठ हटा दिया गया है। +हटाए जाने का कारन नीचे सारांश में दिया गया है, और साथ ही उन सदस्यों के बारे में विस्तार भी दिया गया है, जिन्होंने हटाए जाने से पहले इस पृष्ठ को संपादित किया था। +इन हटाये गए अवतरणों का पाठ केवल प्रबंधकों को ही उपलब्ध है।', 'undelete-revision' => '$1 ($4 को $5 बजे $3 द्वारा बनाया गया) का मिटाया हुआ संस्करण:', 'undeleterevision-missing' => 'अमान्य अथवा अनुपस्थित अवतरण। -या तो आप ग़लत सम्पर्क प्रयोग कर रहे हैं, या यह अवतरण पुनर्स्थापित किया जा चुका है, अथवा इसे लेखागार से निकाल दिया गया है।', -'undelete-nodiff' => 'पुरान अवतरण नहीं हैं।', +या तो आप ग़लत कड़ी प्रयोग कर रहे हैं, या यह अवतरण पुनर्स्थापित किया जा चुका है, अथवा इसे लेखागार से हटा दिया गया है।', +'undelete-nodiff' => 'कोई पुराना अवतरण नहीं मिला।', 'undeletebtn' => 'वापस ले आयें', -'undeletelink' => 'देखें/पुरानी स्थिति पर लाएँ', +'undeletelink' => 'देखें/पुनर्स्थापित करें', 'undeleteviewlink' => 'देखें', 'undeletereset' => 'पूर्ववत करें', 'undeleteinvert' => 'चुनाव उलटें', -'undeletecomment' => 'टिप्पणी हटाना', -'undeletedrevisions' => '{{PLURAL:$1|एक रूपान्तर वापस लाया गया|$1 रूपान्तर वापस लाये गये}} है', -'undeletedrevisions-files' => '{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाईल|$2 फ़ाइलें}} पुनर्स्थापित कर दियें', -'undeletedfiles' => '{{PLURAL:$1|1 फ़ाईल|$1 फ़ाईलें}} पुनर्स्थापित', +'undeletecomment' => 'कारण:', +'undeletedrevisions' => '{{PLURAL:$1|एक अवतरण पुनर्स्थापित किया|$1 अवतरण पुनर्स्थापित किये}}', +'undeletedrevisions-files' => '{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाइल|$2 फ़ाइलें}} पुनर्स्थापित कर दीं', +'undeletedfiles' => '{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइलें}} पुनर्स्थापित', 'cannotundelete' => 'पुनर्स्थापित नहीं कर सके: $1', 'undeletedpage' => "'''$1 को पुनर्स्थापित कर दिया गया है''' हाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।", -'undelete-header' => 'हाल में हटाये गये पृष्ठ देखने के लियें [[Special:Log/delete|हटाने की सूची]] देखें।', +'undelete-header' => 'हाल में हटाये गये पृष्ठ देखने के लिये [[Special:Log/delete|हटाने का लॉग]] देखें।', 'undelete-search-title' => 'हटाये गये पृष्ठ खोजें', 'undelete-search-box' => 'हटाये गये पृष्ठ खोजें', 'undelete-search-prefix' => 'शुरूआती शब्द अनुसार पृष्ठ खोजें:', 'undelete-search-submit' => 'खोजें', -'undelete-no-results' => 'हटायें गयें पन्नोंके आर्चिव्हमें मेल खाने वाले पृष्ठ मिले नहीं।', -'undelete-filename-mismatch' => '$1 समयके फ़ाइलके हटाये गये अवतरणको पुनर्स्थापित नहीं किया जा सकता: फ़ाईल का नाम मेल नहीं खाता', -'undelete-bad-store-key' => '$1 समयका फ़ाईल अवतरण पुनर्स्थापित नहीं कर सकतें हैं: हटाने से पहले फ़ाईल अस्तित्वमें नहीं थी।', -'undelete-cleanup-error' => 'इस्तेमालमें न लाई गई "$1" आर्चिव्ह फ़ाईल हटाने में समस्या हुई हैं।', -'undelete-missing-filearchive' => 'सिचिका पुरालेख क्रमांक $1 को पुनर्स्थापित करने में असक्षम हैं, क्योंकि यह आँकड़ाकोष में उपलब्ध नहीं है। +'undelete-no-results' => 'हटाए गए पृष्ठों के लेखागार में मेल खाते कोई पृष्ठ नहीं मिले।', +'undelete-filename-mismatch' => '$1 के फ़ाइल के हटाये गये अवतरण को पुनर्स्थापित नहीं किया जा सकता: फ़ाइल का नाम मेल नहीं खाता', +'undelete-bad-store-key' => '$1 का फ़ाइल अवतरण पुनर्स्थापित नहीं कर सकते हैं: हटाने से पहले भी फ़ाइल मौजूद नहीं थी।', +'undelete-cleanup-error' => 'पुरालेख में से अप्रयुक्त फ़ाइल "$1" हटाने में त्रुटि।', +'undelete-missing-filearchive' => 'फ़ाइल पुरालेख आई॰डी $1 को पुनर्स्थापित करने में असक्षम हैं, क्योंकि यह डाटाबेस में उपलब्ध नहीं है। या ऐसा भी हो सकता है कि इसे पहले से ही पुनर्स्थापित किया जा चुका हो।', -'undelete-error' => 'पृष्ठ अविलोपन में त्रुटि', -'undelete-error-short' => 'फ़ाईल पुनर्स्थापित करने में समस्या: $1', -'undelete-error-long' => 'फ़ाईल पुनर्स्थापित करने में आई हुई समस्याएं: +'undelete-error' => 'पृष्ठ पुनर्स्थापन में त्रुटि', +'undelete-error-short' => 'फ़ाइल पुनर्स्थापन में त्रुटि: $1', +'undelete-error-long' => 'फ़ाइल पुनर्स्थापन में आई त्रुटियाँ: $1', 'undelete-show-file-confirm' => 'क्या आप वाकई फ़ाइल "$1" के $2 को $3 बजे बने, हटाए जा चुके अवतरण को देखना चाहते हैं?', @@ -2644,7 +2646,7 @@ $1', 'ipbenableautoblock' => 'इस सदस्यद्वारा इस्तेमाल किया गया आखिरी आईपी एड्रेस और यहां से आगे इस सदस्य द्वारा इस्तेमालमें लाये जाने वाले सभी एड्रेस ब्लॉक करें।', 'ipbsubmit' => 'इस सदस्य को और बदलाव करने से रोकें', 'ipbother' => 'अन्य समय:', -'ipboptions' => '२ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा के लिये:infinite', +'ipboptions' => 'दो घंटे:2 hours,एक दिन:1 day,तीन दिन:3 days,एक सप्ताह:1 week,दो सप्ताह:2 weeks,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक साल:1 year,हमेशा के लिये:infinite', 'ipbotheroption' => 'अन्य', 'ipbotherreason' => 'अन्य/दूसरा कारण:', 'ipbhidename' => 'संपादन व सूचियों से सदस्य नाम छिपाएँ', @@ -2732,12 +2734,9 @@ $1 को बाध्य करने का कारण है: "$2"', फिर भी, $2 प्रकार को बाध्य किया जा सकता है, जिनको अबाध्य किया जा सकता है।', 'ip_range_invalid' => 'गलत आईपी रेंज', 'ip_range_toolarge' => '/$1 से अधिक बड़े रेञ्ज ब्लॉकों की अनुमति नहीं है।', -'blockme' => 'मुझे ब्लॉक करो', 'proxyblocker' => 'प्रॉक्सी ब्लॉकर', -'proxyblocker-disabled' => 'यह कार्य रद्द कर दिया गया हैं।', 'proxyblockreason' => 'आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है। कृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।', -'proxyblocksuccess' => 'हो गया।', 'sorbsreason' => '{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।', 'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।', 'cant-block-while-blocked' => 'आप खुद ही अवरोधित हैं इसलिए इस समय आप औरों को अवरोधित नहीं कर सकते हैं।', @@ -3005,7 +3004,7 @@ $1 को बाध्य करने का कारण है: "$2"', 'tooltip-ca-protect' => 'इस पृष्ठको सुरक्षित किजीयें', 'tooltip-ca-unprotect' => 'इस पृष्ठ की सुरक्षा बदलें ।', 'tooltip-ca-delete' => 'इस पृष्ठ को हटाएं', -'tooltip-ca-undelete' => 'इस पृष्ठको हटाने से पहले किये गये बदलाव पुनर्स्थापित करें', +'tooltip-ca-undelete' => 'इस पृष्ठ को हटाने से पहले किये गये बदलाव पुनर्स्थापित करें', 'tooltip-ca-move' => 'यह पृष्ठ स्थानांतरित करें', 'tooltip-ca-watch' => 'इस पृष्ठ को अपनी ध्यानसूची में डालें', 'tooltip-ca-unwatch' => 'यह पृष्ठ अपने ध्यानसूचीसे हटाएं', @@ -3088,6 +3087,8 @@ $1 को बाध्य करने का कारण है: "$2"', 'spam_reverting' => '$1 को कड़ी ना होने वाले पुराने अवतरण को पुनर्स्थापित कर रहें हैं', 'spam_blanking' => 'सभी अवतरणोंमें $1 को कड़ियां हैं, पूरा पाठ निकाल रहें हैं', 'spam_deleting' => 'सभी अवतरणों में $1 की कड़ी थी, हटाया जा रहा है', +'simpleantispam-label' => "ऍन्टी-स्पैम जाँच. +इसे भरें '''नहीं'''!", # Info page 'pageinfo-title' => '"$1" के लिये जानकारी', diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php index d27923ce5c..ac292cb20e 100644 --- a/languages/messages/MessagesHif_latn.php +++ b/languages/messages/MessagesHif_latn.php @@ -2558,12 +2558,9 @@ Saait iske pahile khol dewa gais hoi.', Lekin iske, as part of the range $2, block karaa gais hai, jiske unblock karaa jaawe sake hai.', 'ip_range_invalid' => 'IP ke range me galti hai.', 'ip_range_toolarge' => '/$1 se barraa range blocks ke ijajat nai hae.', -'blockme' => 'Ham ke roko', 'proxyblocker' => 'Proxy roke waala', -'proxyblocker-disabled' => 'Ii function pe rukawat hai.', 'proxyblockreason' => 'Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai. Meharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.', -'proxyblocksuccess' => 'Hoe gais hai.', 'sorbsreason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.', 'sorbs_create_account_reason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai. Aap ke ek account banae ke ijajat nai hai', diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php index 833749e836..aa32c73888 100644 --- a/languages/messages/MessagesHr.php +++ b/languages/messages/MessagesHr.php @@ -367,7 +367,7 @@ $messages = array( 'underline-default' => 'Prema postavkama preglednika', # Font style option in Special:Preferences -'editfont-style' => 'Uredi područje font stila:', +'editfont-style' => 'Font u okviru za uređivanje', 'editfont-default' => 'Prema postavkama preglednika', 'editfont-monospace' => 'Font s jednakim razmakom', 'editfont-sansserif' => 'Font Sans-serif', @@ -829,7 +829,7 @@ Da bi spriječili zloupotrebu, moguće je poslati samo jedan e-mail za promjenu 'mailerror' => 'PogrjeÅ¡ka pri slanju e-poÅ¡te: $1', 'acct_creation_throttle_hit' => 'Posjetitelji ovog wikija koji rabe VaÅ¡u IP adresu napravili su {{PLURAL:$1|1 račun|$1 računa}} u posljednjem danu, Å¡to je najveći dopuÅ¡teni broj u tom vremenskom razdoblju. Zbog toga posjetitelji s ove IP adrese trenutačno ne mogu otvoriti nove suradničke račune.', -'emailauthenticated' => 'VaÅ¡a e-mail adresa je ovjerena $2 u $3.', +'emailauthenticated' => 'vaÅ¡a e-mail adresa je ovjerena $2 u $3.', 'emailnotauthenticated' => 'VaÅ¡a e-mail adresa joÅ¡ nije ovjerena. Ne možemo poslati e-mail ni u jednoj od sljedećih naredbi.', 'noemailprefs' => 'Nije navedena adresa elektroničke poÅ¡te, stoga sljedeće naredbe ne će raditi.', @@ -879,6 +879,7 @@ Možda ste već uspjeÅ¡no promijenili VaÅ¡u lozinku ili ste zatražili novu priv 'passwordreset-text-one' => 'Ispunite ovaj obrazac ako želite ponovno postaviti VaÅ¡u zaporku.', 'passwordreset-legend' => 'PoniÅ¡ti lozinku', 'passwordreset-disabled' => 'PoniÅ¡tavanje lozinke je onemogućeno na ovom wikiju.', +'passwordreset-emaildisabled' => 'Funkcija e-poÅ¡te je onemogućena na ovom wikiju.', 'passwordreset-username' => 'Suradničko ime:', 'passwordreset-domain' => 'Domena:', 'passwordreset-capture' => 'Pogledati krajnju poruku?', @@ -1440,8 +1441,9 @@ ViÅ¡e informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F 'stub-threshold-disabled' => 'Onemogućeno', 'recentchangesdays' => 'Broj dana prikazanih u nedavnim promjenama:', 'recentchangesdays-max' => '(maksimalno $1 {{PLURAL:$1|dan|dana}})', -'recentchangescount' => 'Broj izmjena za prikaz kao zadano:', +'recentchangescount' => 'Zadani broj izmjena koje se prikazuju:', 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne promjene, stare izmjene, i evidencije.', +'prefs-help-watchlist-token2' => 'Ovo je tajni ključ prema sažetku vaÅ¡eg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati vaÅ¡ popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].', 'savedprefs' => 'VaÅ¡e postavke su sačuvane.', 'timezonelegend' => 'Vremenska zona:', 'localtime' => 'Lokalno vrijeme:', @@ -1504,9 +1506,9 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.', 'prefs-editor' => 'Uređivač', 'prefs-preview' => 'Prikaži kako će izgledati', 'prefs-advancedrc' => 'Napredne mogućnosti', -'prefs-advancedrendering' => 'Napredne opcije', -'prefs-advancedsearchoptions' => 'Napredne opcije', -'prefs-advancedwatchlist' => 'Napredne opcije', +'prefs-advancedrendering' => 'Napredne mogućnosti', +'prefs-advancedsearchoptions' => 'Napredne mogućnosti', +'prefs-advancedwatchlist' => 'Napredne mogućnosti', 'prefs-displayrc' => 'Prikaži opcije', 'prefs-displaysearchoptions' => 'Mogućnosti prikaza', 'prefs-displaywatchlist' => 'Mogućnosti prikaza', @@ -2589,7 +2591,7 @@ $1', 'contributions' => 'Doprinosi {{GENDER:$1|suradnika|suradnice}}', 'contributions-title' => 'Suradnički doprinosi za $1', 'mycontris' => 'Moji doprinosi', -'contribsub2' => 'Za $1 ($2)', +'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Nema promjena koje udovoljavaju ovim kriterijima.', 'uctop' => '(vrh)', 'month' => 'Od mjeseca (i ranije):', @@ -2747,11 +2749,8 @@ Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokir 'ipb_blocked_as_range' => 'PogreÅ¡ka: IP adresa $1 nije blokirana direktno te stoga ne može biti odblokirana. Blokirana je kao dio opsega $2, koji može biti odblokiran.', 'ip_range_invalid' => 'Raspon IP adresa nije valjan.', 'ip_range_toolarge' => 'Opsezi blokiranja veći od /$1 nisu dozvoljeni.', -'blockme' => 'Blokiraj me', 'proxyblocker' => 'ZaÅ¡tita od otvorenih posrednika (proxyja)', -'proxyblocker-disabled' => 'Ova funkcija je onemogućena.', 'proxyblockreason' => 'VaÅ¡a je IP adresa blokirana jer se radi o otvorenom posredniku (proxyju). Molimo stupite u vezu s VaÅ¡im davateljem internetskih usluga (ISP-om) ili službom tehničke podrÅ¡ke i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.', -'proxyblocksuccess' => 'Napravljeno.', 'sorbsreason' => 'VaÅ¡a IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL.', 'sorbs_create_account_reason' => 'VaÅ¡a IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL. Ne možete otvoriti račun.', 'cant-block-while-blocked' => 'Ne možete blokirati druge suradnike dok ste blokirani.', @@ -3093,6 +3092,8 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.', 'spam_reverting' => 'Vraćam na zadnju inačicu koja ne sadrži poveznice na $1', 'spam_blanking' => 'Sve inačice sadrže poveznice na $1, briÅ¡em cjelokupni sadržaj', 'spam_deleting' => 'Sve inačice sadržale su poveznice na $1, briÅ¡em cjelokupni sadržaj', +'simpleantispam-label' => "Anti-spam provjera. +'''Ne''' ispunjavajte ovo!", # Info page 'pageinfo-title' => 'Podatci o stranici "$1"', @@ -3957,6 +3958,7 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic 'tags' => 'Valjane oznake izmjena', 'tag-filter' => 'Filtar [[Special:Tags|oznaka]]:', 'tag-filter-submit' => 'Filtar', +'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)', 'tags-title' => 'Oznake', 'tags-intro' => 'Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.', 'tags-tag' => 'Naziv oznake', diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php index f362223a37..42eeeb508d 100644 --- a/languages/messages/MessagesHsb.php +++ b/languages/messages/MessagesHsb.php @@ -2569,11 +2569,8 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.' 'ipb_blocked_as_range' => 'Zmylk: IP $1 njeje direktnje zablokowana a njeda so wublokować. Blokuje so wÅ¡ak jako dźěl wobwoda $2, kotryž da so wublokować.', 'ip_range_invalid' => 'Njepłaciwy wobłuk IP-adresow.', 'ip_range_toolarge' => 'Wobłukowe bloki, kotrež su wjetÅ¡e hač /$1, njejsu dowolene.', -'blockme' => 'Blokować', 'proxyblocker' => 'Awtomatiske blokowanje wotewrjenych proksy-serwerow', -'proxyblocker-disabled' => 'Tuta funkcija je deaktiwizowana.', 'proxyblockreason' => 'Twoja IP-adresa bu zablokowana, dokelž je wotewrjeny proksy. ProÅ¡u skontaktuj swojeho prowidera abo syćoweho administratora a informuj jeho wo tutym chutnym wěstotnym problemje.', -'proxyblocksuccess' => 'Dokónčene.', 'sorbs' => 'SORBS DNSbl', 'sorbsreason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana.', 'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. NjemóžeÅ¡ konto wutworić.', @@ -2904,6 +2901,8 @@ $2', 'spam_reverting' => 'wróćo na poslednju wersiju, kotraž wotkazy na $1 njewobsahuje', 'spam_blanking' => 'Wšě wersije z wotkazami do $1 so porjedźeja', 'spam_deleting' => 'Wšě wersije z wotkazami do $1 so zhaÅ¡eja', +'simpleantispam-label' => "Kontrola přećiwo spamej. +Tu '''ničo''' njezapisać!", # Info page 'pageinfo-title' => 'Informacije za stronu "$1"', diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php index a6e681f4cc..0795f8f516 100644 --- a/languages/messages/MessagesHu.php +++ b/languages/messages/MessagesHu.php @@ -2746,11 +2746,8 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v 'ipb_blocked_as_range' => 'Hiba: a(z) $1 IP-cím nem blokkolható közvetlenül, és nem lehet feloldani. A(z) $2 tartomány részeként van blokkolva, amely feloldható.', 'ip_range_invalid' => 'Érvénytelen IP-tartomány.', 'ip_range_toolarge' => 'Nem engedélyezettek azok a tartományblokkok, melyek nagyobbak mint /$1.', -'blockme' => 'Saját magam blokkolása', 'proxyblocker' => 'Proxyblokkoló', -'proxyblocker-disabled' => 'Ez a funkció le van tiltva.', 'proxyblockreason' => "Az IP-címeden ''nyílt proxy'' üzemel. Amennyiben nem használsz proxyt, vedd fel a kapcsolatot egy informatikussal vagy az internetszolgáltatóddal ezen súlyos biztonsági probléma ügyében.", -'proxyblocksuccess' => 'Kész.', 'sorbsreason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán.', 'sorbs_create_account_reason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán. Nem hozhatsz létre fiókot.', 'cant-block-while-blocked' => 'Nem blokkolhatsz más szerkesztőket, miközben te magad blokkolva vagy.', @@ -3116,6 +3113,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr 'spam_reverting' => 'Visszatérés a $1 lapra mutató hivatkozásokat nem tartalmazó utolsó változathoz', 'spam_blanking' => 'Az összes változat tartalmazott a $1 lapra mutató hivatkozásokat, kiürítés', 'spam_deleting' => 'Minden változat tartalmazott $1-re mutató hivatkozást, törlöm', +'simpleantispam-label' => "Spam elleni ellenőrzés. +'''NE''' töltsd ezt ki!", # Info page 'pageinfo-title' => 'Információk a(z) „$1” lapról', diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php index e3581419e1..aa7b289805 100644 --- a/languages/messages/MessagesHy.php +++ b/languages/messages/MessagesHy.php @@ -2163,7 +2163,6 @@ $1', 'ip_range_invalid' => 'IP-հասցեների անթույլատրելի լայնույթ։', 'proxyblocker' => 'Փոխանորդի արգելափակում', 'proxyblockreason' => 'Ձեր IP-հասցեն արգելափակվել Õ§, քանի որ Õ¡ÕµÕ¶ պատկանում Õ§ հանրային միջնորդ (պրոքսի) սեռվերին։ Խնդրում ենք Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ ձեր ցանցային Õ¯Õ¡Õ´ Õ¿Õ¥Õ­Õ¶Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ ծառայության տրամադրողի Õ°Õ¥Õ¿ և տեղեկացնել Õ¡ÕµÕ½ լուրջ անվտանգության խնդրի մասին։', -'proxyblocksuccess' => 'Արված է։', 'sorbsreason' => 'Ձեր IP-հասցեն Õ°Õ¡Õ·Õ¾Õ¾Õ¡Õ® Õ§ որպես Õ¡Õ¦Õ¡Õ¿ օգտագործման փոխանորդ DNSBL ցանկում։', 'sorbs_create_account_reason' => 'Ձեր IP-հասցեն Õ°Õ¡Õ·Õ¾Õ¾Õ¡Õ® Õ§ որպես Õ¡Õ¦Õ¡Õ¿ օգտագործման փոխանորդ DNSBL ցանկում։ Դուք չեք կարող Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ մասնակցային հաշիվ։', 'ipbnounblockself' => 'Դուք չեք կարող արգելափակել ինքներդ Õ±Õ¥Õ¦', diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php index cb7b4d24af..aa48902fe3 100644 --- a/languages/messages/MessagesIa.php +++ b/languages/messages/MessagesIa.php @@ -362,7 +362,7 @@ $messages = array( 'articlepage' => 'Vider pagina de contento', 'talk' => 'Discussion', 'views' => 'Representationes', -'toolbox' => 'Instrumentario', +'toolbox' => 'Instrumentos', 'userpage' => 'Vider pagina del usator', 'projectpage' => 'Vider pagina de projecto', 'imagepage' => 'Vider le pagina del file', @@ -2392,10 +2392,12 @@ Tote le horas es in le fuso horari del servitor.', 'deletecomment' => 'Motivo:', 'deleteotherreason' => 'Motivo altere/additional:', 'deletereasonotherlist' => 'Altere motivo', -'deletereason-dropdown' => '*Motivos habitual pro deler paginas -** Requesta del autor +'deletereason-dropdown' => '*Motivos commun pro deler +** Spam +** Vandalismo ** Violation de copyright -** Vandalismo', +** Requesta del autor +** Redirection rupte', 'delete-edit-reasonlist' => 'Modificar le motivos pro deletion', 'delete-toobig' => 'Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}. Le deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.', @@ -2725,12 +2727,9 @@ Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e bl Illo es, nonobstante, blocate como parte del intervallo $2, le qual pote esser disblocate.', 'ip_range_invalid' => 'Intervallo de adresses IP invalide.', 'ip_range_toolarge' => 'Non es permittite blocar un gamma de adresses IP plus grande que /$1.', -'blockme' => 'Blocar me', 'proxyblocker' => 'Blocator de proxy', -'proxyblocker-disabled' => 'Iste function es disactivate.', 'proxyblockreason' => 'Tu adresse IP ha essite blocate proque illo es un proxy aperte. Per favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.', -'proxyblocksuccess' => 'Succedite.', 'sorbsreason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.', 'sorbs_create_account_reason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}. Tu non pote crear un conto', @@ -3092,6 +3091,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in 'spam_reverting' => 'Revertite al ultime version que non contine ligamines a $1', 'spam_blanking' => 'Tote le versiones contineva ligamines a $1. Le pagina es vacuate.', 'spam_deleting' => 'Tote le versiones contineva ligamines a $1. Le pagina es delite.', +'simpleantispam-label' => "Verification anti-spam. +'''NON''' completa isto!", # Info page 'pageinfo-title' => 'Informationes pro "$1"', diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php index b070bde690..cee748da37 100644 --- a/languages/messages/MessagesId.php +++ b/languages/messages/MessagesId.php @@ -2856,11 +2856,8 @@ Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat in 'ipb_blocked_as_range' => 'Kesalahan: IP $1 tidak diblok secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.', 'ip_range_invalid' => 'Blok IP tidak sah.', 'ip_range_toolarge' => 'Rentang blok lebih besar dari /$1 tidak diperbolehkan.', -'blockme' => 'Blokir saya', 'proxyblocker' => 'Pemblokir proxy', -'proxyblocker-disabled' => 'Fitur ini sedang tidak diakfifkan.', 'proxyblockreason' => 'Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.', -'proxyblocksuccess' => 'Selesai.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.', 'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.', @@ -3221,6 +3218,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit 'spam_reverting' => 'Membatalkan ke versi terakhir yang tak memiliki pranala ke $1', 'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, kosong', 'spam_deleting' => 'Semua revisi yang memiliki pranala ke $1, penghapusan', +'simpleantispam-label' => "Pemeriksaan anti-spam. +Masukan ini '''DILARANG'''!", # Info page 'pageinfo-title' => 'Informasi untuk "$1"', diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php index 2d5a126977..d80520c177 100644 --- a/languages/messages/MessagesIg.php +++ b/languages/messages/MessagesIg.php @@ -1285,8 +1285,6 @@ Ngá bu ihe hé mèkwàrà nà ihü '''$1''':", 'unblocklogentry' => 'àkwáchị gị $1', 'block-log-flags-nocreate' => "Í ké ọ'bànifé bàchìrì", 'block-log-flags-noemail' => 'ha kwàchịrị e-mail', -'blockme' => 'Kwàchím', -'proxyblocksuccess' => 'Ọméchá.', # Developer tools 'lockdb' => 'Gbàchí uche nsónùsòrò', diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php index d87b4819f1..1d502cb9ad 100644 --- a/languages/messages/MessagesIlo.php +++ b/languages/messages/MessagesIlo.php @@ -252,7 +252,7 @@ $messages = array( 'articlepage' => 'Kitaen ti naglaon a panid', 'talk' => 'Pagtungtungan', 'views' => 'Dagiti pangkitaan', -'toolbox' => 'Kahon ti ramit', +'toolbox' => 'Ramramit', 'userpage' => 'Kitaen ti panid ti agar-aramat', 'projectpage' => 'Kitaen ti panid ti gandat', 'imagepage' => 'Kitaen ti panid ti papeles', @@ -498,6 +498,9 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE 'userlogin-resetpassword-link' => 'Iyasentar manen ti kontrasenias', 'helplogin-url' => 'Help:Panagserrek', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tulong iti panagserrek]]', +'userlogin-loggedin' => 'Nakastrekkan a kas ni {{GENDER:$1|$1}}. +Usaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.', +'userlogin-createanother' => 'Agaramid pay ti sabali a pakabilangan', 'createacct-join' => 'Ikabil ti pakaammom dita baba.', 'createacct-another-join' => 'Ikabil ti pakaammo ti baro a pakabilangan dita baba.', 'createacct-emailrequired' => 'Esurat a pagtaengan', @@ -2265,10 +2268,12 @@ Kitaen ti $2 para iti pannakrehistro dagiti naudi a naikkat.', 'deletecomment' => 'Rason:', 'deleteotherreason' => 'Sabali/maipatinayon a rason:', 'deletereasonotherlist' => 'Sabali a rason', -'deletereason-dropdown' => '*Kadawyan a rasrason ti panagikkat -** Kiddaw ti mannurat +'deletereason-dropdown' => '* Kadawyan a rasrason ti panagikkat +** Spam +** Bandalismo ** Panaglabsing iti karbengan ti panagipablaak -** Bandalismo', +** Kiddaw ti mannurat +** Naputed a baw-ing', 'delete-edit-reasonlist' => 'Urnosen dagiti rason ti panagikkat', 'delete-toobig' => 'Daytoy a panid ket dakkel ti pakasaritaanna, sumurok a $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}. Ti panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga inkarkaro a pannakadadael ti {{SITENAME}}.', @@ -2596,12 +2601,9 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi Ngem, nupay kasta, naserran a kas paset ti sakup ti $2, a mabalin a malukatan ti serrana.', 'ip_range_invalid' => 'Imbalido a sakup ti IP.', 'ip_range_toolarge' => 'Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.', -'blockme' => 'Serraannak', 'proxyblocker' => 'Pannakbagi a panagserra', -'proxyblocker-disabled' => 'Daytoy a panagaramid ket nabaldado.', 'proxyblockreason' => 'Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi. Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti kaurnusam ken ibagam kaniada ti nakaro a parikut ti seguridad.', -'proxyblocksuccess' => 'Nalpasen.', 'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.', 'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}. Saanka a makaaramid ti pakabilangan', @@ -2948,6 +2950,8 @@ Daytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a pagsaada 'spam_reverting' => 'Ipasubli ti kinaudi a panagbaliw nga awan dagiti linaon a silpo idiay $1', 'spam_blanking' => 'Dagiti amin a panagbaliw ket aglaon kadagiti silpo idiay $1, iblanko', 'spam_deleting' => 'Dagiti amin a panagbaliw ket naglaon kadagiti silpo idiay $1, ik-ikkaten', +'simpleantispam-label' => "Kontra-spam a panagkita. + '''Saan''' mo a suratan daytoy!", # Info page 'pageinfo-title' => 'Pakaammo para iti "$1"', diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php index 7ef3b098e8..0626ea7f26 100644 --- a/languages/messages/MessagesInh.php +++ b/languages/messages/MessagesInh.php @@ -182,8 +182,8 @@ $messages = array( 'help' => 'Куцтохкам', 'search' => 'Лахаp', 'searchbutton' => 'Хьалаха', -'go' => 'Дехьавала', -'searcharticle' => 'Дехьавала', +'go' => 'Дехьа гӀо', +'searcharticle' => 'Дехьа гӀо', 'history' => 'искар', 'history_short' => 'Искар', 'updatedmarker' => 'Со ханача денца хувцамаш хиннaд', @@ -228,7 +228,7 @@ $messages = array( 'lastmodifiedat' => 'Укх оагӀув тӀехьара хувцам: $2, $1.', 'viewcount' => 'Укх оагӀув тӀа бӀаргтасса хиннад {{PLURAL:$1|цхьазза|$1 шозза}}.', 'protectedpage' => 'Лорама оагӀув', -'jumpto' => 'Укхаза дехьавала/яла:', +'jumpto' => 'Укхаза дехьа гӀо:', 'jumptonavigation' => 'никътохкарг', 'jumptosearch' => 'леха', 'pool-timeout' => 'ЧIегатохара сабаран ха чакхаяьннай', @@ -909,8 +909,6 @@ $messages = array( 'blocklogentry' => '[[$1]] чIега белаб, $2 $3 ха ялалца', 'unblocklogentry' => '$1 юха яста я', 'block-log-flags-nocreate' => 'ЛархIамий дагарчена цIи яьккхар пурам янза я.', -'blockme' => 'ЧIега бола сона', -'proxyblocksuccess' => 'Хьадаьд.', # Move page 'move-page-legend' => 'ОагIува цIи хувца', @@ -956,7 +954,7 @@ $messages = array( 'allmessagesdefault' => 'Сатийна улла яздам', 'allmessages-filter-all' => 'Дерригаш', 'allmessages-language' => 'Мотт:', -'allmessages-filter-submit' => 'Дехьавала/яла', +'allmessages-filter-submit' => 'Дехьа гӀо', # Thumbnails 'thumbnail-more' => 'Хьадоккхаде', @@ -1102,7 +1100,7 @@ $messages = array( 'confirm_purge_button' => 'Ð¥Iаа', # Multipage image navigation -'imgmultigo' => 'Дехьавала/яла!', +'imgmultigo' => 'Дехьа гӀо!', 'imgmultigoto' => '$1 оагIув тIа дехьавала', # Table pager diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php index e93d0c2947..599890c4b7 100644 --- a/languages/messages/MessagesIo.php +++ b/languages/messages/MessagesIo.php @@ -1246,7 +1246,6 @@ Videz [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.', 'unblocklogentry' => 'desblokusis "$1"', 'ipb_expiry_invalid' => 'Nevalida expiro-tempo.', 'ip_range_invalid' => 'Nevalida IP-rango.', -'proxyblocksuccess' => 'Facita.', # Developer tools 'lockdb' => 'Blokusar datumaro', diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php index 2eb622408a..2e25bdd5aa 100644 --- a/languages/messages/MessagesIs.php +++ b/languages/messages/MessagesIs.php @@ -2689,12 +2689,9 @@ Sjá [[Special:BlockList|ítarlegri lista]] fyrir öll núgildandi bönn.', Vistfangið var bannað sem hluti af fjöldabanninu $2, sem er hægt að afbanna.', 'ip_range_invalid' => 'Ógilt vistfangasvið.', 'ip_range_toolarge' => 'Fjöldabönn stærri en /$1 eru óheimil.', -'blockme' => 'Banna mig', 'proxyblocker' => 'Vefsels bann', -'proxyblocker-disabled' => 'Þessi virkni er óvirk.', 'proxyblockreason' => 'Vistfangið þitt hefur verið bannað því það er opið vefsel. Vinsamlegast hafðu samband við internetþjónustuaðilann þinn eða netstjóra félagsins og láttu þá vita af þessu alvarlegu öryggisvandamáli.', -'proxyblocksuccess' => 'Búinn.', 'sorbsreason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er í notkun á {{SITENAME}}.', 'sorbs_create_account_reason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er notað af {{SITENAME}}. Þú getur ekki stofnað aðgang.', @@ -3039,6 +3036,8 @@ Vinsamlegast reyndu aftur.', 'spam_reverting' => 'Tek aftur síðustu breytingu sem inniheldur ekki tengil á $1', 'spam_blanking' => 'Allar útgáfur innihéldu tengla á $1, tæmi síðuna', 'spam_deleting' => 'Allar útgáfur innihéldu tengla á $1, eyði síðunni', +'simpleantispam-label' => 'Kæfuvörn. +Ekki fylla þetta út!', # Info page 'pageinfo-title' => 'Upplýsingar um $1', diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php index a625b42b8d..705b376fc0 100644 --- a/languages/messages/MessagesIt.php +++ b/languages/messages/MessagesIt.php @@ -2767,11 +2767,8 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b 'ipb_blocked_as_range' => "Errore: L'indirizzo IP $1 non è soggetto a blocco individuale e non può essere sbloccato. Il blocco è invece attivo a livello dell'intervallo $2, che può essere sbloccato.", 'ip_range_invalid' => 'Intervallo di indirizzi IP non valido.', 'ip_range_toolarge' => 'Non è possibile bloccare range superiori al /$1', -'blockme' => 'Bloccami', 'proxyblocker' => 'Blocco dei proxy aperti', -'proxyblocker-disabled' => 'Questa funzione è disabilitata.', 'proxyblockreason' => 'Questo indirizzo IP è stato bloccato perché risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.', -'proxyblocksuccess' => 'Fatto.', 'sorbsreason' => 'Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.', 'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.', 'xffblockreason' => "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1", @@ -3118,6 +3115,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log 'spam_reverting' => "Ripristinata l'ultima versione priva di collegamenti a $1", 'spam_blanking' => 'Pagina svuotata, tutte le versioni contenevano collegamenti a $1', 'spam_deleting' => 'Pagina cancellata, tutte le versioni contenevano collegamenti a $1', +'simpleantispam-label' => "Controllo anti-spam. +'''NON''' riempire!", # Info page 'pageinfo-title' => 'Informazioni per "$1"', @@ -3785,7 +3784,7 @@ Per favore, conferma che vuoi veramente ricreare questa pagina.", 'confirm-unwatch-top' => 'Elimina questa pagina dalla tua lista degli osservati speciali?', # Separators for various lists, etc. -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← pagina precedente', diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php index fddfca2bb2..69e841b522 100644 --- a/languages/messages/MessagesJa.php +++ b/languages/messages/MessagesJa.php @@ -585,7 +585,7 @@ $messages = array( 'articlepage' => '本文を表示', 'talk' => '議論', 'views' => '表示', -'toolbox' => 'ツールボックス', +'toolbox' => 'ツール', 'userpage' => '利用者ページを表示', 'projectpage' => 'プロジェクトのページを表示', 'imagepage' => 'ファイルのページを表示', @@ -841,7 +841,7 @@ $2', 'createacct-emailoptional' => 'メールアドレス (省略可能)', 'createacct-email-ph' => 'メールアドレスを入力', 'createacct-another-email-ph' => 'メールアドレスを入力', -'createaccountmail' => '一時的でランダムなパスワードを生成して、指定したメールアドレスに送信する', +'createaccountmail' => '一時的な無作為のパスワードを生成して、指定したメールアドレスに送信', 'createacct-realname' => '本名 (省略可能)', 'createaccountreason' => '理由:', 'createacct-reason' => '理由', @@ -1560,7 +1560,7 @@ $1", 'prefs-rendering' => '表示', 'saveprefs' => '保存', 'resetprefs' => '保存していない変更を破棄', -'restoreprefs' => 'すべて初期設定に戻す', +'restoreprefs' => 'すべて初期設定に戻す (すべての節について)', 'prefs-editing' => '編集', 'rows' => '行数:', 'columns' => '列数:', @@ -2969,12 +2969,9 @@ $1 のブロックの理由は「''$2''」です。", ただし、$2の範囲でブロックされており、こちらのブロックは別途解除できます。', 'ip_range_invalid' => 'IP範囲が無効です。', 'ip_range_toolarge' => '/$1より広範囲の範囲ブロックは許可されていません。', -'blockme' => '自分をブロック', 'proxyblocker' => 'プロキシブロック係', -'proxyblocker-disabled' => 'この機能は無効になっています。', 'proxyblockreason' => 'このIPアドレスは公開プロキシであるためブロックされています。 ご使用中のインターネットサービスプロバイダーまたは所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。', -'proxyblocksuccess' => '完了。', 'sorbs' => 'DNSBL', 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。', 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。 @@ -3347,6 +3344,8 @@ $2', 'spam_reverting' => '$1へのリンクを含まない最新の版に差し戻し', 'spam_blanking' => 'すべての版が$1へのリンクを含んでいます。白紙化します。', 'spam_deleting' => 'すべての版が$1へのリンクを含んでいます。削除します。', +'simpleantispam-label' => "スパム攻撃防止用のチェックです。 +ここに値を決して入力'''しない'''でください。", # Info page 'pageinfo-title' => '「$1」の情報', @@ -3360,7 +3359,7 @@ $2', 'pageinfo-length' => 'ページの長さ (バイト単位)', 'pageinfo-article-id' => 'ページ ID', 'pageinfo-language' => 'ページ本文の言語', -'pageinfo-robot-policy' => 'ロボットによるインデックス化', +'pageinfo-robot-policy' => 'ロボットによるインデックス作成', 'pageinfo-robot-index' => '許可', 'pageinfo-robot-noindex' => '不許可', 'pageinfo-views' => '閲覧回数', diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php index ca273a2b00..82b4075157 100644 --- a/languages/messages/MessagesJv.php +++ b/languages/messages/MessagesJv.php @@ -2396,12 +2396,9 @@ Mangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo dafta 'ipb_blocked_as_range' => 'Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.', 'ip_range_invalid' => 'Blok IP ora absah.', 'ip_range_toolarge' => 'Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.', -'blockme' => 'Blokiren aku', 'proxyblocker' => 'Pamblokir proxy', -'proxyblocker-disabled' => 'Fungsi iki saiki lagi dipatèni.', 'proxyblockreason' => "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''. Mangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.", -'proxyblocksuccess' => 'Bubar.', 'sorbsreason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.", 'sorbs_create_account_reason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.", 'cant-block-while-blocked' => 'Panjenengan ora bisa mblokir panganggo liya nalika panjenengan dhéwé pinuju diblokir.', @@ -2731,6 +2728,8 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.', 'spam_reverting' => 'Mbalèkaké menyang vèrsi pungkasan sing ora ana pranalané menyang $1', 'spam_blanking' => 'Kabèh révisi sing duwé pranala menyang $1, pangosongan', 'spam_deleting' => 'Kabèh benahan sing nduwé pranala nèng $1, dibusaki', +'simpleantispam-label' => "Pamariksan anti-spam. +'''Aja''' diisèkaké!", # Info page 'pageinfo-title' => 'Inpormasi kanggo "$1"', diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php index b43f299343..a4cd57a570 100644 --- a/languages/messages/MessagesKa.php +++ b/languages/messages/MessagesKa.php @@ -15,6 +15,7 @@ * @author Dawid Deutschland * @author ITshnik * @author Kaganer + * @author MIKHEIL * @author Malafaya * @author Nemo bis * @author Nodar Kherkheulidze @@ -175,7 +176,7 @@ $messages = array( 'tog-hidepatrolled' => 'დამალეთ შესწორებული რედაქტირებები ბოლო ცვლილებებში', 'tog-newpageshidepatrolled' => 'დამალეთ შემოწმებული გვერდები ახალი გვერდების სიიდან', 'tog-extendwatchlist' => 'გავრცობილი კონტროლის სია ყველა დაკავშირებული ცვლილების ჩვენების ჩათვლით', -'tog-usenewrc' => 'ბოლო ცვლილებების და კონტროლის სიის ცვლილებების დაჯგუფება (საჭიროა ჯავასკრიპტი)', +'tog-usenewrc' => 'ბოლო ცვლილებების და კონტროლის სიის ცვლილებების დაჯგუფება', 'tog-numberheadings' => 'ავტომატურად დანომრე ქვესათაურები', 'tog-showtoolbar' => 'რედაქტირების პანელის ჩვენება', 'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით', @@ -419,7 +420,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => '{{SITENAME}}-ის შესახებ', 'aboutpage' => 'Project:შესახებ', -'copyright' => 'შინაარსი წარმოდგენილია $1 პირობებით.', +'copyright' => 'შინაარსი წარმოდგენილია $1 პირობებით (თუ სხვა არ არის მითითებული).', 'copyrightpage' => '{{ns:project}}:საავტორო უფლებები', 'currentevents' => 'მიმდინარე მოვლენები', 'currentevents-url' => 'Project:მიმდინარე მოვლენები', @@ -587,11 +588,9 @@ $2', 'virus-unknownscanner' => 'უცნობი ანტივირუსი:', # Login and logout pages -'logouttext' => "'''თქვენ ამჟამად სისტემიდან გასული ხართ.''' +'logouttext' => "'''თქვენ ამჟამად გასული ხართ სისტემიდან.''' -შეგიძლიათ გამოიყენოთ {{SITENAME}} ანონიმურად, ან შეგიძლიათ -[$1 შეხვიდეთ ისევ] როგორც იგივე ან სხვა მომხმარებელი. -შენიშნეთ, რომ ზოგიერთ გვერდზე შესაძლოა ისევ უჩვენებდეს რომ შესული ხართ სანამ თქვენი ბრაუზერის მეხსიერებას არ გაწმენდთ.", +ზოგიერთმა გვერდმა შესაძლოა ისევ ისე გააგრძელოს ჩვენება თითქოს თქვენ ჯერ კიდევ სისტემაში იყოთ. ამის მოსაგვარებლად საჭიროა თქვენი ბრაუზერის მეხსიერების გაწმენდა.", 'welcomeuser' => 'მოგესალმებით, $1!', 'welcomecreation-msg' => 'თქვენი ანგარიში შექმნილია. არ დაგავიწყდეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კონფიგურაციის]] შეცვლა.', @@ -636,7 +635,7 @@ $2', 'createacct-emailoptional' => 'ელ. ფოსტის მისამართი (არასავალდებულო)', 'createacct-email-ph' => 'შეიყვანეთ თქვენი ელ. ფოსტის მისამართი', 'createacct-another-email-ph' => 'შეიყვანეთ ელ.ფოსტის მისამართი', -'createaccountmail' => 'გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და მისი გაგზავნა ქვემოთ მითითებულ ელ. ფოსტის მისამართზე:', +'createaccountmail' => 'გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და მისი გააგზავნეთ მითითებულ ელ.ფოსტის მისამართზე', 'createacct-realname' => 'ნამდვილი სახელი (არააუცილებელი)', 'createaccountreason' => 'მიზეზი:', 'createacct-reason' => 'მიზეზი', @@ -879,8 +878,9 @@ $2 'loginreqlink' => 'შესვლა', 'loginreqpagetext' => 'თქვენ უნდა $1 სხვა გვერდები აჩვენოთ.', 'accmailtitle' => 'პაროლი გაგზავნილია.', -'accmailtext' => "მომხმარებელი [[User talk:$1|$1]]-სთვის შექმნილია ახალი პაროლი, შექმნილი შემთხვევითი სიმბოლოებისგან გაიგზავნა $2 ელექტრონულ მისამართზე. -სისტემისადმი თავის წარდგენის შემდეგ თქვენ შეგიძლლიათ ''[[Special:ChangePassword|შეცვალოთ პაროლი]]''.", +'accmailtext' => "შემთხვევითი მეთოდით შექმნილი პაროლი მომხმარებლისათვის [[User talk:$1|$1]] გაგზავნილია მისამართზე $2. + +ავტორიზაციის გავლის შემდეგ შესაძლებელი იქნება ამ ანგარიშის ''[[Special:ChangePassword|პაროლის შეცვლა]]'' ანგარიშში შესვლის გვერდზე.", 'newarticle' => '(ახალი)', 'newarticletext' => 'ბმულის მეშვეობით თქვენ მოხვდით გვერდზე, რომელიც ჯერ არ არსებობს. გვერდის შესაქმნელად შეიყვანეთ ინფორმაცია ქვემო ფანჯარაში @@ -1322,7 +1322,7 @@ $1", 'prefs-rendering' => 'იერსახე', 'saveprefs' => 'შენახვა', 'resetprefs' => 'გადატვირთვა', -'restoreprefs' => 'კონფიგურაციის საწყისზე დაბრუნება', +'restoreprefs' => 'ყველა საწყისი პარამეტრის აღდგენა (ყველა სექციაში)', 'prefs-editing' => 'რედაქტირება', 'rows' => 'რიგები:', 'columns' => 'სვეტები', @@ -1383,8 +1383,9 @@ $1", 'gender-unknown' => 'მითითებას არ ვთვლი საჭიროდ', 'gender-male' => 'ის (მამრობითი) არედაქტირებს ვიკი-გვერდებს', 'gender-female' => 'ის (მდედრობითი) არედაქტირებს ვიკი-გვერდებს', -'prefs-help-gender' => 'არასავალდებულო ველი: გამოიყენება პროგრამული უზრუნველყოფის იმ შეტყობინებებისთვის, რომლებიც ადამიანის სქესზეა დამოკიდებული. -ეს ინფორმაცია საზოგადოებრივი იქნება.', +'prefs-help-gender' => 'ამ პარამეტრის დაყენება არასავალდებულოა. +პროგრამული უზრუნველყოფა ამ ინფორმაციას იყენებს მხოლოდ სწორი გრამატიკული სქესით მომართვისათვის. +ეს ინფორმაცია საჯარო იქნება ყველასათვის.', 'email' => 'ელ. ფოსტა', 'prefs-help-realname' => 'ნამდვილი სახელის მითითება აუცილებელი არ არის, მაგრამ თუ მიუთითებთ ის გამოყენებული იქნება თქვენი ნამუშევრის აღსანიშნავად.', 'prefs-help-email' => 'ელ. ფოსტის მისამართი არ არის სავალდებულო, მაგრამ მისი მითითება იძლევა ახალი პაროლის გამოგზავნის საშუალებას თქვენი პაროლის დავიწყების შემთხვევაში.', @@ -1480,7 +1481,7 @@ $1", 'right-reupload-shared' => 'ფაილთა შეცვლა საერთო საცავიდან ლოკალურებით', 'right-upload_by_url' => 'ფაილის ატვირთვა URL-დან', 'right-purge' => 'ქეშის გაწმენდა დადასტურების გვერდის გარეშე', -'right-autoconfirmed' => 'ნაწილობრივ დაცული გვერდების რედაქტირება', +'right-autoconfirmed' => 'სიჩქარის შეზღუდვა IP მისამართზე არ არის', 'right-bot' => 'ჩაითვალო ავტომატურ პროცესად', 'right-nominornewtalk' => 'მცირე რედაქტირებების არ ქონის შემთხვევაში ჩაირთვება ახალ შეტყობინებათა რეჟიმი', 'right-apihighlimits' => 'ნაკლები შეზღუდვა API-მოთხოვნებზე', @@ -1501,7 +1502,7 @@ $1", 'right-ipblock-exempt' => 'IP ბლოკის, ავტობლოკის და დიაპაზონთა ბლოკის გასვლა', 'right-proxyunbannable' => 'პროქსის ავტობლოკის გადასვლა', 'right-unblockself' => 'საკუთარი თავის განბლოკვა', -'right-protect' => 'გვერდების დაცვის დონის შეცვლა და დაცული გვერდების რედაქტირება', +'right-protect' => 'გვერდების დაცვის დონის შეცვლა და კასკადურად დაცული გვერდების რედაქტირება', 'right-editprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-sysop}}“', 'right-editsemiprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-autoconfirmed}}“', 'right-editinterface' => 'მომხმარებლის ინტერფეისის შეცვლა', @@ -1583,7 +1584,7 @@ $1", 'enhancedrc-history' => 'ისტორია', 'recentchanges' => 'ბოლო ცვლილებები', 'recentchanges-legend' => 'ბოლო ცვლილებების პარამეტრები', -'recentchanges-summary' => 'უთვალთვალეთ ვიკიში ბოლო ცვლილებებს ამ გვერდზე.', +'recentchanges-summary' => 'უთვალთვალეთ ვიკის ბოლო ცვლილებებს ამ გვერდზე.', 'recentchanges-feed-description' => 'ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.', 'recentchanges-label-newpage' => 'ამ რედაქტირებით შეიქმნა ახალი გვერდი', 'recentchanges-label-minor' => 'ეს არის მცირე შესწორება', @@ -1864,8 +1865,7 @@ $1', 'upload_source_file' => ' (ფაილი შენს კომპიუტერზე)', # Special:ListFiles -'listfiles-summary' => 'ეს სპეციალური გვერდი აჩვენებს ყველა ატვირთულ ფაილს. -მომხმარებლების მიხედვით გაფილტვრისას, ნაჩვენები იქნება ამ მომხმარებლის მხოლოდ ახალი ატვირთვები.', +'listfiles-summary' => 'ეს სპეციალური გვერდი აჩვენებს ყველა ატვირთულ ფაილს.', 'listfiles_search_for' => 'ძიება სურათის სახელის მიხედვით:', 'imgfile' => 'ფაილი', 'listfiles' => 'სურათების სია', @@ -1877,6 +1877,7 @@ $1', 'listfiles_description' => 'აღწერილობა', 'listfiles_count' => 'ვერსიები', 'listfiles-show-all' => 'სურათების ძველი ვერსიების ჩართვა', +'listfiles-latestversion' => 'მიმდინარე ვერსია', 'listfiles-latestversion-yes' => 'დიახ', 'listfiles-latestversion-no' => 'არა', @@ -1976,6 +1977,7 @@ $1', 'randompage-nopages' => '{{PLURAL:$2|სახელთა შემდეგი სივრცე|სახელთა შემდეგ სივრცეში}} "$1" არ არის გვერდები.', # Random page in category +'randomincategory-invalidcategory' => 'კატეგორია „$1“ არ არსებობს.', 'randomincategory-selectcategory-submit' => 'მიდი', # Random redirect @@ -2348,9 +2350,11 @@ $UNWATCHURL 'deleteotherreason' => 'სხვა/დამატებითი მიზეზი:', 'deletereasonotherlist' => 'სხვა მიზეზი', 'deletereason-dropdown' => '* წაშლის ხშირი მიზეზები -** ავტორის თხოვნით +** სპამი +** ვანდალიზმი ** საავტორო უფლების დარღვევა -** ვანდალიზმი', +** ავტორის მოთხოვნით +** გატეხილი გადამისამართება', 'delete-edit-reasonlist' => 'წაშლის მიზეზების რედაქტირება', 'delete-toobig' => 'ამ გვერდს ძალიან გრძელი ისტორია გააჩნია, $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი. მისი წაშლა აიკრძალა {{SITENAME}}-ის კორექტურად მუშაობის უზრუნველყოფისთვის.', 'delete-warning-toobig' => 'ამ გვერდს ძალიან გრძელი ისტორია გააჩნია, $1 {{PLURAL:$1|ვერსიაზე|ვერსიიებზე|ვერსიებზე}} მეტი. @@ -2371,7 +2375,7 @@ $UNWATCHURL ბოლო ცვლილებები შეიტანა [[User:$3|$3]] ([[User talk:$3|განხილვა]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).', 'editcomment' => "რედაქტირება განმარტებული იყო როგორც: \"''\$1''\".", 'revertpage' => '[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია', -'revertpage-nouser' => 'მომხმარებელ (მომხმარებლის სახელი დამალულია)-ის რედაქტირება დაბრუნებულია ვერსიაზე [[User:$1|$1]]', +'revertpage-nouser' => 'მომხმარებლის (მომხმარებლის სახელი დამალულია) ცვლილებები დაბრუნებულია ვერსიაზე {{GENDER:$1|[[User:$1|$1]]}}', 'rollback-success' => 'გაუქმდა შესწორება $1; დაბრუნება ვერსიაზე $2.', # Edit tokens @@ -2513,7 +2517,7 @@ $1', 'contributions' => '{{GENDER:$1|მომხმარებელი}} წვლილი', 'contributions-title' => 'მომხმარებლის წვლილი $1', 'mycontris' => 'წვლილი', -'contribsub2' => '$1 ($2) თვის', +'contribsub2' => 'მომხმარებელი {{GENDER:$3|$1}} წვლილი ($2)', 'nocontribs' => 'ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის', 'uctop' => '(მიმდინარე)', 'month' => 'თვე:', @@ -2672,11 +2676,8 @@ $1', 'ipb_blocked_as_range' => 'შეცდომა: IP-მისამართი $1 არ იყო პირდაპირ დაბლოკილი, შესაბამისად ვერ მოხდება მისი განბლოკვა.თუმცა იგი ეკუთვნის დიაპაზონს $2, რომლის განბლოკვა შესაძლებელია.', 'ip_range_invalid' => 'არასწორი IP მისამართი', 'ip_range_toolarge' => 'დაბლოკვა /$1 დიაპაზონზე ზემოთ აკრძალულია.', -'blockme' => 'დამბლოკე', 'proxyblocker' => 'პროქსის ბლოკირება', -'proxyblocker-disabled' => 'ეს ფუნქცია გაუქმებულია.', 'proxyblockreason' => 'თქვენი IP მისამართი დაიბლოკა, ვინაიდან ის ღია პროქსია. გთხოვთ დაუკავშირდეთ თქვენ ინტერნეტ პროვაიდერს ან ტექ. სამსახურს და აცნობოთ მათ ამ სერიოზული უსაფრთხოების პრობლემის შესახებ.', -'proxyblocksuccess' => 'შესრულებულია.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'თქვენი IP-მისამართი მიჩნევა ღია პროქსიდ DNSBL-ის თანახმად.', 'sorbs_create_account_reason' => 'თქვენი IP-მისამართი ითვლება ღია პროქსიდ DNSBL-ის ანახმად. თქვენ ვერ შექმნით ანგარიშს.', @@ -3024,6 +3025,8 @@ $2', 'spam_reverting' => 'დაბრუნება ბოლო ვერსიასთან, რომელიც არ შეიცავს ბმულს $1-თან', 'spam_blanking' => 'ყველა გვერდი შეიცავს ბმულს $1-გვერდზე. გასუფთავება', 'spam_deleting' => 'ყველა ვერსია შეიცავდა ბმულს $1-ზე, მიმდინარეობს წაშლა', +'simpleantispam-label' => "სპამის საწინააღმდეგო შემოწმება. +ეს '''არ''' შეავსოთ!", # Info page 'pageinfo-title' => 'ინფორმაცია „$1“-თვის', @@ -3037,7 +3040,7 @@ $2', 'pageinfo-length' => 'გვერდის სიგრძე (ბაიტებში)', 'pageinfo-article-id' => 'გვერდის ID', 'pageinfo-language' => 'გვერდის შინაარსის ენა', -'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი', +'pageinfo-robot-policy' => 'ინდექსაცია საძიებო რობოტებით', 'pageinfo-robot-index' => 'დაშვებულია', 'pageinfo-robot-noindex' => 'არ არის დაშვებული', 'pageinfo-views' => 'ხილვების რაოდენობა', diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php index 5800a8bffc..147e19af70 100644 --- a/languages/messages/MessagesKaa.php +++ b/languages/messages/MessagesKaa.php @@ -1580,8 +1580,6 @@ Basqa bloklawlar ushın [[Special:BlockList|IP bloklaw dizimin]] ko'rip shıg'ı 'block-log-flags-noemail' => "e-mail bloklang'an", 'ipb_expiry_invalid' => "Ku'shin joytıw waqtı nadurıs.", 'ipb_already_blocked' => '"$1" a\'lle qashan bloklang\'an', -'proxyblocker-disabled' => "Bul funktsiya o'shirilgen.", -'proxyblocksuccess' => 'Tamamlandı.', # Developer tools 'lockdb' => "Mag'lıwmatlar bazasın qulpla", diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php index 23e206a5c6..27bff4d711 100644 --- a/languages/messages/MessagesKab.php +++ b/languages/messages/MessagesKab.php @@ -2239,7 +2239,6 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :', 'block-log-flags-anononly' => 'Imseqdacen udrigen kan', 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel', 'proxyblockreason' => 'Tansa n IP inek teɛkel axaá¹­er nettat "open proxy". G leɛnayek, meslay akk d provider inek.', -'proxyblocksuccess' => 'D ayen.', 'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuÉ£ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.', 'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuÉ£ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}. Ur tezmireḍ ara ad snulfuḍ amiḍan.', diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php index 906b356330..0e985311bd 100644 --- a/languages/messages/MessagesKk_arab.php +++ b/languages/messages/MessagesKk_arab.php @@ -2015,12 +2015,9 @@ $1 بۇعاتتاۋى ٴۇشىن كەلتىرىلگەن سەبەبى: «$2».', 'ipb_blocked_as_range' => 'قاتەلىك: IP $1 تىكەلەي بۇعاتتالماعان جانە بۇعاتتاۋى وشىرىلمەيدى. بىراق, بۇل بۇعاتتاۋى ٴوشىرىلۋى مۇمكىن $2 اۋقىمى بولىگى بوپ بۇعاتتالعان.', 'ip_range_invalid' => 'IP مەكەنجاي اۋقىمى جارامسىز.', -'blockme' => 'وزدىكتىك_بۇعاتتاۋ', 'proxyblocker' => 'پروكسىي سەرۆەرلەردى بۇعاتتاۋىش', -'proxyblocker-disabled' => 'بۇل جەتە وشىرىلگەن.', 'proxyblockreason' => 'IP مەكەنجايىڭىز اشىق پروكسىي سەرۆەرگە جاتاتىندىقتان بۇعاتتالعان. ىينتەرنەت قىزمەتىن جابدىقتاۋشىڭىزبەن, نە تەحنىيكالىق قولداۋ قىزمەتىمەن قاتىناسىڭىز, جانە ولارعا وسى وتە كۇردەلى قاۋىپسىزدىك شاتاق تۋرالى اقپارات بەرىڭىز.', -'proxyblocksuccess' => 'ٴبىتتى.', 'sorbsreason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.', 'sorbs_create_account_reason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى. جاڭا تىركەلگى جاساي المايسىز.', diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php index 23528c1944..816391404b 100644 --- a/languages/messages/MessagesKk_cyrl.php +++ b/languages/messages/MessagesKk_cyrl.php @@ -2619,12 +2619,9 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».', 'ipb_blocked_as_range' => 'Қателік: IP $1 тікелей бұғатталмаған және бұғаттауы өшірілмейді. Бірақ, бұл бұғаттауы өшірілуі мүмкін $2 ауқымы бөлігі боп бұғатталған.', 'ip_range_invalid' => 'IP мекенжай ауқымы жарамсыз.', -'blockme' => 'Тіркелгімді бұғатта', 'proxyblocker' => 'Прокси серверлерді бұғаттауыш', -'proxyblocker-disabled' => 'Бұл жете өшірілген.', 'proxyblockreason' => 'IP мекенжайыңыз ашық прокси серверге жататындықтан бұғатталған. Интернет қызметін жабдықтаушыңызбен, не техникалық қолдау қызметімен қатынасыңыз, және оларға осы оте күрделі қауыпсіздік шатақ туралы ақпарат беріңіз.', -'proxyblocksuccess' => 'Орындалды.', 'sorbsreason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады.', 'sorbs_create_account_reason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады. Жаңа тіркелгі жасай алмайсыз.', @@ -3673,7 +3670,9 @@ $5 'tags-tag' => 'Тег атауы', 'tags-display-header' => 'Өзгеріс тізіміндегі көрінісі', 'tags-description-header' => 'Толық сипаттама мәні', -'tags-hitcount-header' => 'Телгіленген өзгерістер', +'tags-active-header' => 'Белсенді ме?', +'tags-hitcount-header' => 'Тегтелген өзгерістер', +'tags-active-yes' => 'Иә', 'tags-edit' => 'өңдеу', 'tags-hitcount' => '$1 {{PLURAL:$1|өзгеріс|өзгеріс}}', @@ -3713,7 +3712,7 @@ $5 'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}}', 'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)', 'logentry-newusers-newusers' => '$1 жаңадан қатысушы тіркелгісін {{GENDER:$2|жасады}}', -'logentry-newusers-create' => '$1 жаңадан қатысушы тіркелгісі {{GENDER:$2|жасады}}', +'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді', 'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді', 'logentry-newusers-autocreate' => '$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}', 'logentry-rights-rights' => '$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгерті}}', diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php index 22622eb989..67e7cf7499 100644 --- a/languages/messages/MessagesKk_latn.php +++ b/languages/messages/MessagesKk_latn.php @@ -1978,12 +1978,9 @@ Ağımdağı belsendi tïımdar men buğattawlardı [[{{#special:Ipblocklist}}|I 'ipb_blocked_as_range' => 'Qatelik: IP $1 tikeleý buğattalmağan jäne buğattawı öşirilmeýdi. Biraq, bul buğattawı öşirilwi mümkin $2 awqımı böligi bop buğattalğan.', 'ip_range_invalid' => 'IP mekenjaý awqımı jaramsız.', -'blockme' => 'Özdiktik_buğattaw', 'proxyblocker' => 'Proksï serverlerdi buğattawış', -'proxyblocker-disabled' => 'Bul jete öşirilgen.', 'proxyblockreason' => 'IP mekenjaýıñız aşıq proksï serverge jatatındıqtan buğattalğan. Ïnternet qızmetin jabdıqtawşıñızben, ne texnïkalıq qoldaw qızmetimen qatınasıñız, jäne olarğa osı ote kürdeli qawıpsizdik şataq twralı aqparat beriñiz.', -'proxyblocksuccess' => 'Bitti.', 'sorbsreason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.', 'sorbs_create_account_reason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı. Jaña tirkelgi jasaý almaýsız.', diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php index b962cdd337..c4e951be3c 100644 --- a/languages/messages/MessagesKm.php +++ b/languages/messages/MessagesKm.php @@ -2732,13 +2732,10 @@ $1', វាប្រហែលជាត្រូវបានគេដកការហាមឃាត់ហើយ។', 'ip_range_invalid' => 'ដែនកំណត់ IP គ្មានសុពលភាព។', -'blockme' => 'ហាមឃាត់ខ្ញុំ', 'proxyblocker' => 'កម្ម​វិធី​​រាំង​ផ្ទប់​ប្រូកស៊ី (Proxy)', -'proxyblocker-disabled' => 'មុខងារនេះត្រូវបានអសកម្ម។', 'proxyblockreason' => 'អាសយដ្ឋាន IP របស់អ្នកត្រូវបានរាំងខ្ទប់ហើយ ពីព្រោះវាជាប្រុកស៊ី(proxy)ចំហ។ សូមទំនាក់ទំនងអ្នកផ្ដល់សេវាអ៊ីនធឺណិតឬអ្នកបច្ចេកទេសរបស់អ្នក ហើយប្រាប់ពួកគេពីបញ្ហាសុវត្ថិភាពដ៏សំខាន់នេះ។', -'proxyblocksuccess' => 'រួចរាល់ជាស្ថាពរ។', 'sorbsreason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។', 'sorbs_create_account_reason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។ diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php index 71ac4a7d1e..060371e9cb 100644 --- a/languages/messages/MessagesKn.php +++ b/languages/messages/MessagesKn.php @@ -1711,8 +1711,6 @@ $2', 'block-log-flags-nocreate' => 'ಖಾತೆ ಸೃಷ್ಟಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ', 'block-log-flags-noemail' => 'ಇ-ಅಂಚೆ ತಡೆಹಿಡಿಯಲಾಗಿದೆ', 'ipb_already_blocked' => '"$1" ಆಗಲೆ ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ', -'blockme' => 'ನನ್ನನ್ನು ತಡೆಹಿಡಿ', -'proxyblocksuccess' => 'ಮುಗಿಯಿತು.', # Developer tools 'lockdb' => 'ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚು', diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php index fc1999f22c..709864331a 100644 --- a/languages/messages/MessagesKo.php +++ b/languages/messages/MessagesKo.php @@ -569,7 +569,7 @@ $messages = array( 'articlepage' => '문서 보기', 'talk' => '토론', 'views' => '보기', -'toolbox' => '도구모음', +'toolbox' => '도구', 'userpage' => '사용자 문서 보기', 'projectpage' => '프로젝트 문서 보기', 'imagepage' => '파일 문서 보기', @@ -805,7 +805,7 @@ $2', 'userlogin-noaccount' => '계정이 없나요?', 'userlogin-joinproject' => '{{SITENAME}}에 가입하세요', 'nologin' => '계정이 없나요? $1.', -'nologinlink' => '계정을 만드세요', +'nologinlink' => '계정을 만들기', 'createaccount' => '계정 만들기', 'gotaccount' => '계정이 이미 있다면, $1.', 'gotaccountlink' => '로그인하세요', @@ -2598,7 +2598,7 @@ $UNWATCHURL 'deletereasonotherlist' => '다른 이유', 'deletereason-dropdown' => '* 일반적인 삭제 이유 ** 스팸 -** 훼손 행위 +** 문서 훼손 행위 ** 저작권 침해 ** 작성자의 요청 ** 깨진 넘겨주기', @@ -2929,12 +2929,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"', 하지만 $2로 광역 차단되었기 때문에, 광역 차단 해제로 차단을 해제할 수 있습니다.', 'ip_range_invalid' => 'IP 범위가 잘못되었습니다.', 'ip_range_toolarge' => '/$1보다 넓은 범위의 광역 차단을 할 수 없습니다.', -'blockme' => '자가 차단', 'proxyblocker' => '프록시 차단', -'proxyblocker-disabled' => '이 기능은 비활성되어 있습니다.', 'proxyblockreason' => '당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다. 만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.', -'proxyblocksuccess' => '완료.', 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.', 'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다. 계정을 만들 수 없습니다.', @@ -3305,6 +3302,8 @@ $2', 'spam_reverting' => '$1(을)를 포함하지 않는 최신 버전으로 되돌림', 'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함', 'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함', +'simpleantispam-label' => "스팸 방지 검사입니다. +이것을 입력하지 '''마세요'''!", # Info page 'pageinfo-title' => '"$1" 문서에 대한 정보', diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php index 171fd7083f..b886dce4cd 100644 --- a/languages/messages/MessagesKrc.php +++ b/languages/messages/MessagesKrc.php @@ -2438,12 +2438,9 @@ $1', Алай а, бу $2 диапазонну кесеги кибик тыйылгъанды, диапазонну блокдан чыгъарыргъа боллукъсуз.', 'ip_range_invalid' => 'Джараусуз IP диапазон.', 'ip_range_toolarge' => '/$1 кёб диапазонланы блокга салыргъа джарамайды.', -'blockme' => 'Мени блокга сал', 'proxyblocker' => 'Проксилени тыйыу', -'proxyblocker-disabled' => 'Бу функция джукълатылыбды.', 'proxyblockreason' => 'IP-адресигиз ачыкъ прокси болгъаны ючюн тыйылдыгъыз. Тилейбиз, кесигизни интернет-провайдеригиз бла, неда дагъан болгъан къуллукъла бла байланыб, къоркъуусузлукъну бу проблемасын билдиригиз.', -'proxyblocksuccess' => 'Тындырылды.', 'sorbsreason' => 'IP-адресигиз, {{SITENAME}} сайтда хайырланнган DNSBL-де ачыкъ прокси кибик саналады.', 'sorbs_create_account_reason' => 'IP-адресигиз, translatewiki.net сайтда хайырланнган DNSBL-де ачыкъ прокси кибик саналады. Тергеу джазыу къураяллыкъ тюлсюз.', 'cant-block-while-blocked' => 'Сиз кесигиз блокда заманда, башха къошулуучуланы блок этеллик тюлсюз.', diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php index 649567c3be..a9e226602f 100644 --- a/languages/messages/MessagesKsh.php +++ b/languages/messages/MessagesKsh.php @@ -2860,14 +2860,11 @@ Automattesch jesperrte Internet Service Provider) un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rääschnere!', -'proxyblocksuccess' => 'Jedonn.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!', 'sorbs_create_account_reason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Dröm kanns De Dich heh em Wiki nit als ene neue Metmaacher aanmelde. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker oder (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!', @@ -3240,6 +3237,7 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.', 'spam_reverting' => 'De letzte Version ohne de Links op „$1“ widder zerröckjehollt.', 'spam_blanking' => 'All die Versione hatte Links op „$1“, die sin jetz erus jemaht.', 'spam_deleting' => 'All di Versione met Lenks op „$1“ wääde fott jeschmeße', +'simpleantispam-label' => 'SPAMschotz — donn hee nix endraare!', # Info page 'pageinfo-title' => 'Övver di Sigg: „$1“', diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php index 2a8eca3cd0..09da332810 100644 --- a/languages/messages/MessagesKu_latn.php +++ b/languages/messages/MessagesKu_latn.php @@ -1711,8 +1711,6 @@ Sedemekê binivîse!", 'ipb_already_blocked' => '"$1" berê hatîye astengkirin', 'ipb-needreblock' => '$1 berê hatiye astengkirin. Tu dixwazî eyaran biguherînî?', 'ipb_cant_unblock' => "Şaşbûn: ID'ya astengkirinê $1 nehate dîtin. Astengkirinê xwe niha belkî hatîye rakirin.", -'blockme' => 'Min astengbike', -'proxyblocksuccess' => 'Çêbû.', 'sorbsreason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin.", 'sorbs_create_account_reason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin. Tu nikarê account'ekê ji xwe ra çêkê.", diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php index 45e12eacfb..bac3319ac9 100644 --- a/languages/messages/MessagesKy.php +++ b/languages/messages/MessagesKy.php @@ -1309,7 +1309,6 @@ To include a file in a page, use a link in one of the following forms: 'block-log-flags-nocreate' => 'эсеп жазуусун жаратуу өчүрүлгөн', 'block-log-flags-noemail' => 'кат жөнөтүүгө тыюу салынган', 'block-log-flags-hiddenname' => 'колдонуучу аты жашырылган', -'blockme' => 'Мени бөгөттө', 'proxyblocker' => 'Проксини блокировкалоо', # Developer tools diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php index ff7a910b25..178251cac8 100644 --- a/languages/messages/MessagesLa.php +++ b/languages/messages/MessagesLa.php @@ -1833,10 +1833,7 @@ Commodule notatio obstructionum subter datur.', 'ipb_already_blocked' => '"$1" iam obstructus est', 'ipb-needreblock' => '$1 iam obstructus est. Visne obstructionem modificare?', 'ip_range_invalid' => 'Latitudo IP irrita.', -'blockme' => 'Usor obstructus', 'proxyblocker' => 'Instrumentum obstructionis moderatorum', -'proxyblocker-disabled' => 'Haec functio prohibita est.', -'proxyblocksuccess' => 'Factum.', 'cant-block-while-blocked' => 'Dum obstructus es, non potes usores alios obstruere.', # Developer tools diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php index 73cc82c604..fea0593732 100644 --- a/languages/messages/MessagesLb.php +++ b/languages/messages/MessagesLb.php @@ -403,7 +403,7 @@ $messages = array( 'articlepage' => 'Säit', 'talk' => 'Diskussioun', 'views' => 'Affichagen', -'toolbox' => 'Geschirkëscht', +'toolbox' => 'Geschir (Tools)', 'userpage' => 'Benotzersäit', 'projectpage' => 'Meta-Text', 'imagepage' => 'Billersäit kucken', @@ -735,7 +735,7 @@ Wann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfa Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.', 'login-abort-generic' => 'Dir sidd net ageloggt - Aloggen ofgebrach', 'loginlanguagelabel' => 'Sprooch: $1', -'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.', +'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem futtise Browser oder Proxy-Tëschespäicher kënnt.', 'createacct-another-realname-tip' => "De richtegen Numm ass fakultativ. Wann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.", @@ -2685,11 +2685,8 @@ Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.", Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.", 'ip_range_invalid' => 'Ongëltegen IP Block.', 'ip_range_toolarge' => 'Späre vu Beräicher déi méi grouss wéi /$1 si sinn net erlaabt.', -'blockme' => 'Spär mech', 'proxyblocker' => 'Proxy blocker', -'proxyblocker-disabled' => 'Dës Funktioun ass ausgeschalt.', 'proxyblockreason' => 'Är IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. ären Internet-Provider oder ärs Systemadministrateuren und informéiert si iiwwer dëses méigleche Sécherheetsprobleem.', -'proxyblocksuccess' => 'Gemaach.', 'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.', 'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.', 'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1', @@ -3039,6 +3036,8 @@ Dëst wahrscheinlech duerch en externe Link den op der schwaarzer Lëscht (black 'spam_reverting' => 'Déi lescht Versioun ouni Linken op $1 restauréieren.', 'spam_blanking' => 'An alle Versioune ware Linken op $1, et ass elo alles gebotzt.', 'spam_deleting' => 'All Versioune mat Linken op $1 gi geläscht', +'simpleantispam-label' => "Anti-Spam Kontroll. +Fëllt dëst '''NET''' aus!", # Info page 'pageinfo-title' => 'Informatioun iwwer "$1"', diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php index 95b479f4eb..f038432486 100644 --- a/languages/messages/MessagesLfn.php +++ b/languages/messages/MessagesLfn.php @@ -141,7 +141,7 @@ $messages = array( 'cancel' => 'Cansela', 'moredotdotdot' => 'Plu...', 'mypage' => 'Me paje', -'mytalk' => 'Me discutes', +'mytalk' => 'Discutes', 'anontalk' => 'Discutes per esta IP', 'navigation' => 'Naviga', 'and' => ' e', @@ -444,7 +444,7 @@ La arcivo de sutraes per esta paje es asi per conveni:", # Preferences page 'preferences' => 'Preferis', -'mypreferences' => 'Me preferis', +'mypreferences' => 'Preferis', 'skin-preview' => 'Previde', 'saveprefs' => 'Fisa', 'rows' => 'Linias:', @@ -473,6 +473,7 @@ La arcivo de sutraes per esta paje es asi per conveni:", 'gender-female' => 'Fema', 'email' => 'Eposta', 'prefs-help-realname' => 'Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.', +'prefs-signature' => 'Suscrive', # User rights 'userrights' => 'Dirije de la diretos de usores', @@ -518,7 +519,7 @@ La arcivo de sutraes per esta paje es asi per conveni:", 'newpageletter' => 'N', 'boteditletter' => 'b', 'rc_categories_any' => 'Cualce', -'rc-enhanced-expand' => 'Mostra detalias (JavaScript es nesesada)', +'rc-enhanced-expand' => 'Mostra detalias', 'rc-enhanced-hide' => 'Asconde detalias', # Recent changes linked @@ -554,7 +555,7 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte' 'filehist-dimensions' => 'Mesuras', 'filehist-filesize' => 'Grandia de fix', 'filehist-comment' => 'Comenta', -'imagelinks' => 'Lias de fix', +'imagelinks' => 'Usas de fix', 'linkstoimage' => 'Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:', 'nolinkstoimage' => 'Es no pajes ce lia a esta fix.', 'sharedupload' => 'Esta fix es parte de $1 e pote es usada par otra projetas.', @@ -663,7 +664,7 @@ Also see [[Special:WantedCategories|wanted categories]].', # Watchlist 'watchlist' => 'Pajes oservada', -'mywatchlist' => 'Me lista de pajes oservada', +'mywatchlist' => 'Lista de pajes oservada', 'nowatchlist' => 'Tu ave no cosas en tu lista oservada', 'addedwatchtext' => "La paje \"[[:\$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]]. Cambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada. diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php index 222c7fdb44..3c042bea75 100644 --- a/languages/messages/MessagesLi.php +++ b/languages/messages/MessagesLi.php @@ -2450,11 +2450,8 @@ Wils se de instellinge wiezige?', 'ipb_blocked_as_range' => "Fout: 't IP-adres $1 is neet direct geblokkeerd en de blokkade kan neet opgeheve waere. De blokkade is ongerdeil van de reeks $2, wovan de blokkade waal opgeheve kan waere.", 'ip_range_invalid' => 'Ongeldige IP-reeks', 'ip_range_toolarge' => 'Reeksblokkades groeater es /$1 kènne neet.', -'blockme' => 'Blokkeer mich', 'proxyblocker' => 'Proxyblokker', -'proxyblocker-disabled' => 'Deze functie is oetgesjakeld.', 'proxyblockreason' => "Dien IP-adres is geblokkeerd ómdat 't 'n aope proxy is. Contacteer estebleef diene internet service provider of technische óngersjteuning en informeer ze euver dit serjeus veiligheidsprebleem.", -'proxyblocksuccess' => 'Klaor.', 'sorbsreason' => 'Dien IP-adres is opgenaome in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek.', 'sorbs_create_account_reason' => 'Dien IP-adres is opgenómme in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek. De kèns gein gebroekersaccount aanmake.', 'cant-block-while-blocked' => 'De kins anger gebroekers neet blokkere terwiel se zelf geblokkeerd bös.', @@ -2780,6 +2777,8 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.", 'spam_reverting' => 'Bezig mit trökdrèjje nao de letste versie die gein verwiezing haet nao $1', 'spam_blanking' => "Alle wieziginge mit 'ne link nao $1 waere verwiederd", 'spam_deleting' => 'Alle wieziginge hawwe links nao $1, wuuertj gewösj', +'simpleantispam-label' => "Antispemcontrole. +Vol dit veld '''NEET''' in!", # Info page 'pageinfo-title' => 'Informatie euver "$1"', diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php index 6adb664b44..0fafbb0dcc 100644 --- a/languages/messages/MessagesLoz.php +++ b/languages/messages/MessagesLoz.php @@ -837,7 +837,6 @@ Petohoni di petulo '''$1''' sa:", 'contribslink' => 'afina', 'blocklogpage' => 'Desu di bolok', 'blocklogentry' => 'sa bolok [[$1]] e simpekile sa $2 $3', -'proxyblocksuccess' => 'Afi.', # Move page 'move-page-legend' => 'Nyanganyisize petulo', diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php index 0efe4a3d4e..1c977f1bbf 100644 --- a/languages/messages/MessagesLt.php +++ b/languages/messages/MessagesLt.php @@ -2600,11 +2600,8 @@ Jei norite pamatyti dabar blokuojamus adresus, žiÅ«rėkite [[Special:BlockList| 'ipb_blocked_as_range' => 'Klaida: IP $1 nebuvo užblokuotas tiesiogiai, tad negali bÅ«ti atblokuotas. Tačiau jis buvo užblokuotas kaip srities $2 dalis, kuri gali bÅ«ti atblokuota.', 'ip_range_invalid' => 'Neleistina IP sritis.', 'ip_range_toolarge' => 'Didesni nei /$1 blokai neleidžiami.', -'blockme' => 'Užblokuoti mane', 'proxyblocker' => 'Tarpinių serverių („proxy“) blokavimo priemonė', -'proxyblocker-disabled' => 'Å i funkcija yra iÅ¡jungta.', 'proxyblockreason' => 'JÅ«sų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. PraÅ¡ome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneÅ¡kite jiems apie Å¡ią svarbią saugumo problemą.', -'proxyblocksuccess' => 'Atlikta.', 'sorbsreason' => 'JÅ«sų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą Å¡ios svetainės.', 'sorbs_create_account_reason' => 'JÅ«sų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą Å¡ios svetainės. JÅ«s negalite sukurti paskyros', 'cant-block-while-blocked' => 'JÅ«s negalite blokuoti kitų naudotojų, pats bÅ«damas užblokuotas.', @@ -2960,6 +2957,8 @@ Leidžia pridėti atmetimo priežastį komentaruose', 'spam_reverting' => 'Atkuriama į ankstesnę versiją, neturinčios nuorodų į $1', 'spam_blanking' => 'Visos versijos turėjo nuorodų į $1, iÅ¡valoma', 'spam_deleting' => 'Visos versijos turėjo nuorodų į $1, iÅ¡trinama', +'simpleantispam-label' => "Anti-spam patikra. +'''NE'''pildykite!", # Info page 'pageinfo-title' => '„$1“ informacija', diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php index c97461d615..9580b70782 100644 --- a/languages/messages/MessagesLv.php +++ b/languages/messages/MessagesLv.php @@ -1939,10 +1939,12 @@ Papildinformācija: 'deletecomment' => 'Iemesls:', 'deleteotherreason' => 'Cits/papildu iemesls:', 'deletereasonotherlist' => 'Cits iemesls', -'deletereason-dropdown' => '*IzplatÄ«ti dzēšanas iemesli -** Autora pieprsÄ«jums +'deletereason-dropdown' => '* IzplatÄ«ti dzēšanas iemesli +** Spams +** Vandālisms ** AutortiesÄ«bu pārkāpums -** Vandālisms', +** Autora pieprasÄ«jums +** NederÄ«ga pāradresācija', 'delete-edit-reasonlist' => 'IzmainÄ«t dzēšanas iemeslus', 'delete-toobig' => 'Å ai lapai ir liela izmaiņu hronoloÄ£ija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}. Šādu lapu dzēšana ir atslēgta, lai novērstu nejauÅ¡us traucējumus {{grammar:lokatÄ«vs|{{SITENAME}}}}.', @@ -2079,6 +2081,7 @@ $1', # Namespace form on various pages 'namespace' => 'Vārdtelpa:', 'invert' => 'Izvēlēties pretēji', +'namespace_association' => 'SaistÄ«tā vārdtelpa', 'blanknamespace' => '(Pamatlapa)', # Contributions @@ -2231,10 +2234,7 @@ Tas, iespējams, jau ir atbloķēts.', 'ipb_blocked_as_range' => 'Kļūda: IP $1 nav bloķēta tieÅ¡i, tāpēc to nevar atbloķēt. Tā ir bloķēta kā daļa no IP adreÅ¡u diapazona $2, kuru var atbloķēt.', 'ip_range_invalid' => 'NederÄ«gs IP diapazons', -'blockme' => 'Bloķēt mani', 'proxyblocker' => 'Starpniekservera bloķētājs', -'proxyblocker-disabled' => 'Å Ä« funkcija ir atspējota.', -'proxyblocksuccess' => 'DarÄ«ts.', 'cant-block-while-blocked' => 'Tu nevari bloķēt citus lietotājus, kamēr pats esi bloķēts.', 'ipbblocked' => 'Tu nevar bloķēt vai atbloķēt lietotājus, jo Tu pats esi bloķēts', 'ipbnounblockself' => 'Tev nav atļauts sevi atbloķēt', @@ -2515,6 +2515,8 @@ To visticamāk izraisÄ«ja ārēja saite uz melnajā sarakstā esoÅ¡u interneta v 'spamprotectionmatch' => 'Spama filtram radās iebildumi pret Å¡o tekstu: $1', 'spambot_username' => 'MediaWiki surogātpasta tÄ«rÄ«Å¡ana', 'spam_reverting' => 'Atjauno iepriekšējo versiju, kas nesatur saiti uz $1', +'simpleantispam-label' => "Pretspama pārbaude. + '''NEAIZPILDĪT!'''", # Info page 'pageinfo-title' => 'Informācija par "$1"', @@ -2641,6 +2643,7 @@ Pārējie lauki, pēc noklusējuma, bÅ«s paslēpti. 'exif-imagelength' => 'augstums', 'exif-bitspersample' => 'biti komponentē', 'exif-compression' => 'SaspieÅ¡anas veids', +'exif-photometricinterpretation' => 'Pikseļu sastāvs', 'exif-orientation' => 'Orientācija', 'exif-samplesperpixel' => 'Komponentu skaits', 'exif-planarconfiguration' => 'Datu izkārtojums', diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php index 1af650a977..c57b0a5b2d 100644 --- a/languages/messages/MessagesLzh.php +++ b/languages/messages/MessagesLzh.php @@ -2212,9 +2212,7 @@ $1', 'ipb_blocked_as_range' => '錯:該IP $1 無直禁也,無赦之。唯它在 $2 之範禁內,其範可赦之。', 'ip_range_invalid' => 'IP址圍不格', 'ip_range_toolarge' => '大於 /$1 之禁段乃無容也。', -'blockme' => '自禁', 'proxyblocker' => '禁Proxy', -'proxyblocksuccess' => '成矣。', 'cant-block-while-blocked' => '爾然被禁,勿施於人。', 'cant-see-hidden-user' => '簿禁或藏矣。 爾無藏之權,無視纂禁也。', diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php index 187fbcb34c..70e2146c62 100644 --- a/languages/messages/MessagesMai.php +++ b/languages/messages/MessagesMai.php @@ -2300,12 +2300,9 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"', ई, मुदा, क्षेत्र $2 क अन्दर प्रतिबन्धित अछि, जे अप्रतिबन्धित कएल जा सकैए।', 'ip_range_invalid' => 'अमान्य अनिकेत क्षेत्र।', 'ip_range_toolarge' => 'समूह खण्ड पैघ अछि /$1 सभकेँ अनुमति नै छै।', -'blockme' => 'हमरा प्रतिबन्धित करू', 'proxyblocker' => 'दोसराइत प्रतिबन्धक', -'proxyblocker-disabled' => 'ई प्रकार्य प्रतिबन्धित अछि।', 'proxyblockreason' => 'अहाँक अनिकेत पता प्रतिबन्धित भेल अछि कारण ई सोझे-सोझ दोसराइत अछि। अहाँ अपन अन्तर्जाल सेवा दाता वा तकनीकी सहायकसँ सम्पर्क करू आ ऐ गम्भीर सुरक्षा समस्याक सूचना दिअ।', -'proxyblocksuccess' => 'भेल।', 'sorbsreason' => 'अहाँक अनिकेत सूचित अछि सोझे-सोझ दोसराइतक रूपमे {{जालस्थल}} क डी.एन.एस.बी.एल.मे।', 'sorbs_create_account_reason' => 'अहाँक अनिकेत एतए सूचित अछि खुजल दोसराइत सन डी.एन.बी.एस.एल. मे जे प्रयोग कएल जाइए {{अन्तर्जाल}} द्वारा।', 'cant-block-while-blocked' => 'अहाँ जाधरि स्वयं प्रतिबन्धित छी दोसराकेँ प्रतिबन्धित नै कऽ सकै छी।', diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php index 2468aab492..746a2e1f7d 100644 --- a/languages/messages/MessagesMdf.php +++ b/languages/messages/MessagesMdf.php @@ -2029,12 +2029,9 @@ $1', 'ipb_blocked_as_range' => 'Эльбятькс: IP $1 аф кардаф видеста ди соннеда аш кода кардафкссь валхтомс. Сон, интай улема, кардафоль кода $2-нь потмонц пакшец, конань эзда ули кода кардафксонь валхтомс.', 'ip_range_invalid' => 'Аф кондясти IP потмоц.', -'blockme' => 'Кардамань монь', 'proxyblocker' => 'Ётка якаень сёлгома', -'proxyblocker-disabled' => 'Тя функциесь аф тиеви.', 'proxyblockreason' => 'Тонь IP адрес пякстафоль сонь панжада прокси-серверонь эзда. Тондейть эряви сотомс тонь интернет ладяйть эли текникань нежедемать мархта ди пачфтемс тя прябалать колга.', -'proxyblocksuccess' => 'Тиф.', 'sorbsreason' => 'Тонь IP адресце лувови панжада ётка якай сервероннекс DNSBL-са, конась нолдаф тевс {{SITENAME}}са.', 'sorbs_create_account_reason' => 'Тонь IP адресце лувови панжада ётка якань сервероннекс DNSBL-са конась нолнезь тевс {{SITENAME}}са. Тондейть аш кода сёрматфтомать тиемс', diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php index 5e7125465c..5386a6605f 100644 --- a/languages/messages/MessagesMg.php +++ b/languages/messages/MessagesMg.php @@ -464,7 +464,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'Mombamomba ny {{SITENAME}}', 'aboutpage' => 'Project:Mombamomba', -'copyright' => '$1 no mifehy ny fampiasana ny votoatin-kevitra eto.', +'copyright' => 'Ny lisansa $1 no mamehy ny fampiasana ity voatoatiny ity.', 'copyrightpage' => '{{ns:project}}:Copyright', 'currentevents' => 'Ny vaovao', 'currentevents-url' => 'Project:Vaovao', @@ -680,6 +680,7 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.", 'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao', 'helplogin-url' => 'Help:Fidirana', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]', +'userlogin-createanother' => 'Hamorona kaonty hafa', 'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.', 'createacct-another-join' => "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty", 'createacct-emailrequired' => 'Adiresy mailaka :', @@ -1428,7 +1429,7 @@ Tokony mba manana lohavy ambanimbany kokoa non'ny $1", 'gender-unknown' => 'Tsy tia hanome ny antsipirihany aho', 'gender-male' => 'Manova pejy wiki izy (lehilahy)', 'gender-female' => 'Manova pejy wiki izy (vehivavy)', -'prefs-help-gender' => "Ankifidy : Ampiasaina mba hifanaraka amin'ny lahi-vavy. Ho sarababem-bahoaka io fampahalalàna io.", +'prefs-help-gender' => "Ankifidy : ampiasaina ho an'ny fifandraisan'ny rindrankajy aminao. Ho sarababem-bahoaka ity fampahalalana ity.", 'email' => 'Imailaka', 'prefs-help-realname' => "Anarana marina (afaka tsy fenoina): raha fenoinao ity dia hampiasaina hanomezana anao tambin'ny asa izay efainao eto.", 'prefs-help-email' => 'Azo tsy omena ny adiresy imailaka, fa ilaina izy io raha sendra hadino ny tenimiafinao.', @@ -1610,8 +1611,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa." 'action-block' => 'manakana am-panoratana ny mpikambana iray', 'action-protect' => "manova ny fanovàn'ity pejy ity", 'action-rollback' => "Manafoana haingana ny fanovan'ny mpikambana farany nanova pejy iray", -'action-import' => 'mampiditra ity pejy ity avy amina wiki hafa', -'action-importupload' => 'hampiditra ity pejy ity avy amina rakitra nampidirina', +'action-import' => "hampiditra ity pejy ity avy amin'ny wiki hafa", +'action-importupload' => "hampiditra ity pejy ity amin'ny fampidirana rakitra", 'action-patrol' => 'marihana ho hita ity version ity', 'action-autopatrol' => 'manana ny fanovanao voamarina', 'action-unwatchedpages' => 'hijery ny lisitry ny pejy tsy arahina', @@ -1915,6 +1916,7 @@ Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vao 'listfiles_size' => 'Habe', 'listfiles_description' => 'Visavisa', 'listfiles_count' => 'Version', +'listfiles-latestversion' => 'Filaza ankehitriny', 'listfiles-latestversion-yes' => 'Eny', 'listfiles-latestversion-no' => 'Tsia', @@ -1941,8 +1943,12 @@ Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vao 'morelinkstoimage' => "Hijery [[Special:WhatLinksHere/$1|rohy fanampiny]] makany amin'io rakitra io.", 'linkstoimage-redirect' => '$1 (fihodinana) $2', 'sharedupload' => "Mety ho rakitra itambarana amin'ny tetikasa hafa ny rakitra $1.", +'sharedupload-desc-there' => "Avy amin'i $1 ity rakitr aity ary mety ampiasaina any amin'ny tetikasa hafa. +Jereo [$2 ny pejy famisavisana ilay rakitra] ho an'ny fampahalalana fanampiny.", 'sharedupload-desc-here' => "Avy amin'i $1 io rakitra io ary mety ampiasain'ny tetikasa hafa. Aseho eo ambany ny [$2 famisavisana ilay rakitra].", +'sharedupload-desc-edit' => "Avy amin'i $1 ity rakitra ity ka mety ampiasaina any amina tetikasa hafa. +Mety tia hanova ny famisavisany ianao any amin'ny [$2 pejy famisavisana rakitra] any.", 'filepage-nofile' => 'Tsy nahitana rakitra mitondra io anarana io.', 'filepage-nofile-link' => 'Tsy misy rakitra mitondra io anarana io, fa afaka [$1 mampiditra azy ianao].', 'uploadnewversion-linktext' => "Andefa version vaovao n'ity rakitra ity", @@ -2379,7 +2385,7 @@ ataovy am-pitandremana ity tao ity.", Efa nataon'i [[User:$3|$3]] ([[User talk:$3|dinika]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ny fanovana farany.", 'editcomment' => "Toy izao no fanamarihana momba io fanovana io: \"''\$1''\".", 'revertpage' => "Voafafa ny fanovana ny [[Special:Contributions/$2|$2]] ([[User talk:$2|Dinika]]); voaverina amin'ny votoatiny teo aloha nataon'i [[User:$1|$1]]", -'revertpage-nouser' => "Manala ny fanovana (nataon'ny anaram-pikambana nesorina), miverina any amin'ny santiona farany nataon'i [[User:$1|$1]]", +'revertpage-nouser' => "Manala ny fanovana (nataom-pikambana voaafina), miverina any amin'ny filaza faran'i [[User:$1|$1]]", 'rollback-success' => "Fanalàna ny fanovana nataon'i $1 ; miverina any amin'ny santiôna farany nataon'i $2.", @@ -2398,7 +2404,7 @@ Ho ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy 'unprotectedarticle' => "nanala ny fiarovana an'i « [[$1]] »", 'movedarticleprotection' => 'nanova ny safidim-piarovana : « [[$2]] » lasa « [[$1]] »', 'protect-title' => "Hanova ny lentam-piarovana ho an'i « $1 »", -'protect-title-notallowed' => "Hijery ny lentam-piarovana ho an'i «[[$1]]»", +'protect-title-notallowed' => "Hijery ny lentam-piarovana ho an'i «$1»", 'prot_1movedto2' => '[[$1]] voaova anarana ho [[$2]]', 'protect-badnamespace-title' => 'Anaran-tsehatra tsy azo arovana', 'protect-badnamespace-text' => "Tsy afaka arovana ny pejy ao amin'io anaran-tsehatra io.", @@ -2519,7 +2525,7 @@ $1', 'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}", 'contributions-title' => "Fandraisan'anjaran'i $1", 'mycontris' => "Fandraisan'anjara", -'contribsub2' => "ho an'ny $1 ($2)", +'contribsub2' => "Ho an'ny $1 ($2)", 'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.", 'uctop' => '(ankehitriny)', 'month' => "Tamin'ny volana (sy teo aloha) :", @@ -2594,8 +2600,8 @@ Fenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).", 'ipb-confirm' => 'Sakanana marina', 'badipaddress' => 'Tsy mety ny adiresy IP (invalid)', 'blockipsuccesssub' => 'Vita soa aman-tsara ny sakana', -'blockipsuccesstext' => 'Voasakana i [[Special:Contributions/$1|$1]]. -
      Jereo ny [[Special:BlockList|lisitry ny IP voasakana]] raha hanala ny sakana efa misy.', +'blockipsuccesstext' => 'Voasakana i [[Special:Contributions/$1|$1]].
      +Jereo ny [[Special:BlockList|lisitry ny voasakana]] raha hanala ny sakana efa misy.', 'ipb-blockingself' => 'Hanakana ny kaontinao ianao ! Tena hanao izany ve ?', 'ipb-confirmhideuser' => "Eo ampanakanana mpikambana miaraka amin'ny \"fanakonana mpikambana\" ampiasaina. Izany dia mamafa ny anaran'ilay mpikambana amin'ny listra ary amin'ny iditra laogy. Tena hanao izany ve ianao?", 'ipb-edit-dropdown' => 'Hanova ny antony fanakanana tsipalotra', @@ -2648,9 +2654,9 @@ Eo ambany ny laogim-panakanana.', Eo ambany ny laogim-pamafana.', 'blocklogentry' => 'voasakana i "[[$1]]" mandritra ny $2 ; antony : $3', 'reblock-logentry' => "nanova ny parametatry ny sakan'i [[$1]], ary tapitra amin'ny $2. Ny antony dia ''$3''", -'blocklogtext' => "Eto no ahitana ny tantaran'ny hetsika momba ny fisakanana sy ny fanafoanana fisakanana mpandray anjara. -Ireo adiresy IP voasakana ho azy dia tsy miseho eto. Jereo ao amin'ny [[Special:BlockList|lisitry ny IP voasakana]] -ny lisitry ny fisakanana sy fandrarana na tanteraka misy ankehitriny.", +'blocklogtext' => "Eto no ahitana ny tantaran'ny hetsika momba ny fisakanana sy ny famoanana ny fisakanana mpandray anjara. +Tsy aseho eto ny adiresy IP voasakana ho azy. +Jereo ao amin'ny [[Special:BlockList|lisitry ny sakana]] hahitana ny lisitry ny sakana mihatra amin'izao fotoana izao", 'unblocklogentry' => "voaaisotra ny sakana an'i $1", 'block-log-flags-anononly' => 'mpikambana tsy nisoratra anarana ihany', 'block-log-flags-nocreate' => 'tsy mahazo manokatra kaonty', @@ -2673,11 +2679,8 @@ Mety efa natao angamba ny fanalana sakana.', Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.", 'ip_range_invalid' => 'Tsy mety io IP io.', 'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.', -'blockme' => 'Sakano ahy', 'proxyblocker' => 'Mpisakana proxy', -'proxyblocker-disabled' => 'Tsy mandeha io asa io.', 'proxyblockreason' => "Voasakana ny adiresy IP-nao satria adiresy proxy malalaka izy io. Azafady mba lazao amin'ny mpanome internet anao io olana io.", -'proxyblocksuccess' => 'Vita.', 'sorbsreason' => "Voasokokajin'ny DNSBL ho ao anatin'ny proxy midanadana ny adiresy IP-nao.", 'sorbs_create_account_reason' => "Voasokajy ho isan'ny proxy midanadana ao amin'ny DNSBL ny adiresy IP-nao. Ireo IP ireo dia ahiana ho fitaovana azon'ny mpandefa spam ampiasaina. Tsy afaka manokatra kaonty ianao.", 'cant-block-while-blocked' => 'Tsy azo sakananao ny mpikambana hafa raha mbola voasakana ianao.', @@ -2718,15 +2721,15 @@ Mba hahafahany manidy na mamoha ny banky angona, mila azo soratan'ny lohamilin-t # Move page 'move-page' => "Hanova anarana an'i $1", 'move-page-legend' => 'Afindrao toerana ny pejy', -'movepagetext' => "Ampiasao ilay formulaire eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy-na redirection ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy). -Afaka manao ''update'' ny redirect ianao. +'movepagetext' => "Ampiasao ilay fôrmiolera eo ambany eo mba hamindra azy toerana, voakisaka any amin'ny anarany ankehitriny ny tantarany. Lasa pejy fihodinana ilay pejy taloha, (manondro makany amin'ny anarany ankehitriny ilay pejy). + +Afaka manavao ho azy ny fihodinana mankany amin'ny lohateny taloha ianao. Raha tsy fidinao ny manao izany, marino tsara ny fisian'ireo [[Special:DoubleRedirects|fihodinana roa]] na [[Special:BrokenRedirects|fihodinana tapaka]]. Ianao no manana andrikitra amin'ny fanamarinana ny tsi-fitapahan'ireo rohy. Jereo koa fa '''tsy afaka''' akisaka ilay pejy ra mitovy anarana amin'ny pejy efa misy ny anarana ny anarana vaovaon'ilay pejy tianao akisaka, fa mety atao ihany io asa io ra tsy misy nininona ilay pejy. Afaka manolo anarana pejy efa manondro ny fihisiny taloha ianao ra diso ianao, fa tsy afaka ataonao no manitsaka pejy efa misy. '''TANDREMO''' -Mety fanom-panona ihany ny mpitsidika ra be mpitsidika io pejy ovainao anarana io ; -Tsy maintsy fantatrao tsara ny vokany aloha no mitohy.", +Mety ho fiovana lehibe ary tsy ampoizina ny fanaovana izany ho an'ny pejy voatsidika mateetika ; fantaro tsara ny fiantraika alohan'ny manao izany.", 'movepagetalktext' => "Voasikaka koa ny pejin-dresak'ity pejy ity '''ra''' : * Efa misy pejin-dresaka efa misy votoatiny amin'ilay anarana vaovao, na @@ -2906,6 +2909,9 @@ Avereno fanindroany.', # JavaScriptTest 'javascripttest' => 'Fanandramana JavaScript', 'javascripttest-title' => 'Mandefa fanandramana $1', +'javascripttest-pagetext-skins' => 'Mifidia skin hanaovana ny fanandramana:', +'javascripttest-qunit-intro' => "Jereo ny [$1 fanoroana mikasika ny andrana] eo amin'i mediawiki.org.", +'javascripttest-qunit-heading' => "Tohin'andrana QUnit an'i Javascript eo amin'i MediaWiki", # Tooltip help for the actions 'tooltip-pt-userpage' => 'Ny pejinao', @@ -2925,7 +2931,7 @@ Ampesao ny topi-maso aloha no mihatiry.", 'tooltip-ca-viewsource' => 'Voaaro ilay pejy. Fa afaka itanao ny voatotiny.', 'tooltip-ca-history' => "Ny revision natao tamin'ity pejy ity", 'tooltip-ca-protect' => 'Arovy ity pejy ity', -'tooltip-ca-unprotect' => "Hanala ny fiarovan'ity pejy ity", +'tooltip-ca-unprotect' => "Hanova ny lentam-piarovan'ity pejy ity", 'tooltip-ca-delete' => 'Fafao ity pejy ity', 'tooltip-ca-undelete' => "Hamerina ny fanovana natao tamin'ity pejy ity talohan'ny famafany", 'tooltip-ca-move' => 'Ovay anarana ilay pejy', @@ -2992,7 +2998,8 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a 'othercontribs' => "Mifototra amin'ny asan'i $1.", 'others' => 'hafa', 'siteusers' => '{{SITENAME}} mpikambana $1 miisa $2{{PLURAL:}}', -'anonusers' => "Ny mpikambana tsy nisoratra anarana $1 ao amin'i {{SITENAME}}", +'anonusers' => "Ny mpikambana tsy nisoratra anarana $1 ao amin'i {{SITENAME}}{{PLURAL:$2}}", +'creditspage' => "Fisaorana ho an'ny pejy", # Spam protection 'spamprotectiontitle' => "Sivana mpiaro amin'ny spam", @@ -3012,11 +3019,12 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a 'pageinfo-length' => 'Halavam-pejy (oktety)', 'pageinfo-article-id' => 'Laharam-pejy', 'pageinfo-language' => "Tenin'ny votoatiny", -'pageinfo-robot-policy' => "Satan'ny motera fikarohana", -'pageinfo-robot-index' => 'Azo tondroina', +'pageinfo-robot-policy' => "Fanondroana ataon'ny rôbô", +'pageinfo-robot-index' => 'Azo atao', 'pageinfo-robot-noindex' => 'Tsy azo tondroina', 'pageinfo-views' => "Isan'ny jery", 'pageinfo-watchers' => "Isan'ny mpandray anjara manaraka", +'pageinfo-few-watchers' => 'Mpanaraka latsaky ny $1{{PLURAL:}}', 'pageinfo-redirects-name' => "Fihodinana manketo amin'ity pejy ity", 'pageinfo-subpages-name' => "Zana-pejin'ity pejy ity", 'pageinfo-firstuser' => 'Mpamorona ilay pejy', @@ -3029,7 +3037,7 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a 'pageinfo-recent-authors' => "Isa vao haingan'ny mpanoratra misongadina", 'pageinfo-hidden-categories' => 'Sokajy nafenina{{PLURAL:$1}} ($1)', 'pageinfo-templates' => 'Endrika natsofoka{{PLURAL:$1}} ($1)', -'pageinfo-transclusions' => "Pejy natsofoka tanatin'i ($1)", +'pageinfo-transclusions' => "Pejy natsofoka tanatin'i ($1){{PLURAL:}}", 'pageinfo-toolboxlink' => 'Fampahalalana mikasika ny pejy', 'pageinfo-redirectsto' => "Fihdinana mankany amin'ny", 'pageinfo-redirectsto-info' => 'fampahalalana', @@ -3054,6 +3062,7 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a 'markedaspatrollederrortext' => 'Tsy maintsy misafidy santiôna iray ianao mba hahafahanao manamarika azy ho voamarina.', 'markedaspatrollederror-noautopatrol' => 'Tsy azonao marihana ho voamarina ny fanovanao.', 'markedaspatrollednotify' => "Voamarika ho hita ny fanovana natao tamin'i $1.", +'markedaspatrollederrornotify' => 'Tsy nahamarika azy ho voaara-maso.', # Patrol log 'patrol-log-page' => "Laogin'ny fanovana voamarina", @@ -3089,7 +3098,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.", 'svg-long-error' => 'Rakitra SVG tsy ekena : $1', 'show-big-image' => "Hijery ny tena haben'ny sary", 'show-big-image-preview' => "Haben'ny topi-maso: $1.", -'show-big-image-other' => 'Habe hafa: $1{{PLURAL:$1}}', +'show-big-image-other' => 'Habe hafa: $1{{PLURAL:$2}}', 'show-big-image-size' => '$1 × $2 teboka', 'file-info-gif-looped' => 'miverimberina', 'file-info-gif-frames' => 'sary{{PLURAL:$1}} $1', @@ -3224,7 +3233,12 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray . 'exif-gpsdestlatitude' => 'Laharam-pehintany tanjona', 'exif-gpsareainformation' => 'Anaram-paritra GPS', 'exif-gpsdatestamp' => 'Daty GPS', +'exif-worldregioncreated' => 'Faritany nangalana ity ilay sary', 'exif-countrycreated' => 'Firenena nangalana ilay sary', +'exif-countrycodecreated' => 'Kaontim-pirenena nangalana ilay sary', +'exif-provinceorstatecreated' => 'Faritany nangalana ilay sary', +'exif-citycreated' => 'Tanàna nangalana ilay sary', +'exif-sublocationcreated' => 'Fari-tanàna nangalana ilay sary', 'exif-worldregiondest' => 'Faritany aseho', 'exif-countrydest' => 'Firenena aseho', 'exif-countrycodedest' => 'Kaodim-pirenena aseho', @@ -3245,6 +3259,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray . 'exif-contact' => 'Fampahalalana mikasika ny fifandraisana', 'exif-writer' => 'Mpanoratra', 'exif-languagecode' => 'Fiteny', +'exif-iimversion' => 'filaza IIM', 'exif-iimcategory' => 'Sokajy', 'exif-iimsupplementalcategory' => 'Sokajy fanampiny', 'exif-datetimeexpires' => 'Asa ampiasaina aoriany', @@ -3268,9 +3283,15 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray . 'exif-attributionurl' => "Rehefa mampiasa ity asa ity dia asio rohy mankany amin'i", 'exif-preferredattributionname' => 'Rehefa mampiasa ilay asa, isaory', 'exif-pngfilecomment' => "Famoahan-kevitra momban'ilay rakitra PNG", +'exif-disclaimer' => 'Fampitanremana', 'exif-contentwarning' => 'Fampitandremana mikasika ny votoatiny', 'exif-giffilecomment' => 'Famoahan-kevitry ny rakirta GIF', 'exif-intellectualgenre' => 'Karazan-javatra', +'exif-subjectnewscode' => "Kaodin'ny lohahevitra", +'exif-event' => 'Zava-mitranga azo sary', +'exif-organisationinimage' => 'Fikambanana azo sary', +'exif-personinimage' => 'Olona azo sary', +'exif-originalimageheight' => "Haambon-tsary talohan'ny nanovana azy", 'exif-copyrighted-true' => "Iharan'ny zom-pamorona", 'exif-copyrighted-false' => "Toetran'ny zom-pamorona tsy voafaritra", @@ -3278,10 +3299,20 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray . 'exif-unknowndate' => 'Daty tsy fantatra', 'exif-orientation-1' => 'Tsotra', +'exif-orientation-3' => 'Ahodina 180°', +'exif-orientation-4' => 'Navadika ambony ambany', +'exif-orientation-5' => 'Navadika 90° miankavia ary navadika ambony ambany', +'exif-orientation-6' => 'Navadika 90° miankavia', +'exif-orientation-7' => 'Navadika 90° miankavanana ary navadika ambony ambany', +'exif-orientation-8' => 'Navadika 90° miankavanana', + +'exif-planarconfiguration-2' => 'Data misaraka', 'exif-componentsconfiguration-0' => 'tsy nahitana', 'exif-exposureprogram-0' => 'Tsy nolazaina', +'exif-exposureprogram-1' => 'Natao tanana', +'exif-exposureprogram-2' => 'Fandaharana ara-dalàna', 'exif-subjectdistance-value' => '$1 metatra', @@ -3298,8 +3329,16 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray . 'exif-lightsource-9' => "Toetr'andro mazava", 'exif-lightsource-10' => "Toetr'andro mandrahona", 'exif-lightsource-11' => 'Haloka', +'exif-lightsource-17' => 'Jiro manara-penitra A', +'exif-lightsource-18' => 'Jiro manara-penitra B', +'exif-lightsource-19' => 'Jiro manara-penitra C', +'exif-lightsource-24' => "Tangistenina ISO an'ny studio", +'exif-lightsource-255' => 'Loharanon-kazavana hafa', # Flash modes +'exif-flash-fired-0' => 'Tsy nirehitra ny flash', +'exif-flash-fired-1' => 'Nirehitra ny flash', +'exif-flash-return-0' => 'Tsy misy stirôbôskôpy mamerina lefa fahitana', 'exif-flash-mode-3' => 'Toetra aotômatika', 'exif-focalplaneresolutionunit-2' => 'Posy', @@ -3354,7 +3393,9 @@ raha vao nanokatra kaonty ianao, dia miandrasa minitra vitsivitsy mba ho tonga i 'confirmemail_sent' => 'Lasa ny fanamarinana ny imailaka.', 'confirmemail_oncreate' => "Nalefa tany amin'ny adiresy imailakao ny kaody fanamarinana. Tsy ilaina ampaisaina io tenimiafina io rehefa hiditra eto amin'ity wiki ity ianao, fa tsy maintsy omenao ilay izy rehefa mampiasa tao mifototra amin'ny imailaka.", -'confirmemail_sendfailed' => 'Tsy lasa ny fanamarinana ny imailaka. Hamarino ny adiresy fandrao misy litera tsy mety.', +'confirmemail_sendfailed' => "Tsy lasa ny fanamarinana ny imailaka. Hamarino ny adiresy fandrao misy litera tsy mety. + +Ity no naverin'ny mpandefa mailaka : $1", 'confirmemail_invalid' => 'Tsy mety ilay fango fanamarinana. Angamba efa lany daty?', 'confirmemail_needlogin' => 'Mila $1 ianao raha hanamarina ny adiresy imailakao.', 'confirmemail_success' => 'Voamarina ny adiresy imailakao. Afaka [[Special:UserLogin|miditra]] ianao ankehitriny ary mankafia ny wiki.', @@ -3390,6 +3431,11 @@ Azafady hamafiso fa tena irinao averina hoforonina tokoa ity lahatsoratra ity.", 'confirm_purge_button' => 'Eka', 'confirm-purge-top' => "Fafana ve ny cache-n'ity pejy ity?", +# action=watch/unwatch +'confirm-watch-top' => 'Hanaraka ity pejy ity?', +'confirm-unwatch-button' => 'OK', +'confirm-unwatch-top' => "Hanala ity pejy ity amin'ny lisitry ny pejy arahinao?", + # Multipage image navigation 'imgmultipageprev' => '← pejy nialoha', 'imgmultipagenext' => 'pejy manaraka →', @@ -3404,6 +3450,7 @@ Azafady hamafiso fa tena irinao averina hoforonina tokoa ity lahatsoratra ity.", 'table_pager_first' => 'Pejy voalohany', 'table_pager_last' => 'Pejy farany', 'table_pager_limit' => 'Haneho zavatra $1 isaky ny pejy', +'table_pager_limit_label' => 'Valiny isam-pejy:', 'table_pager_limit_submit' => 'Hitsidika', 'table_pager_empty' => 'Tsy nahitana valiny', @@ -3430,7 +3477,11 @@ Andramo ny topi-maso tsotra', 'watchlistedit-noitems' => 'Tsy misy lohateny ny lisitrao.', 'watchlistedit-normal-title' => 'Hanova ny lisitra ny pejy arahako maso', 'watchlistedit-normal-legend' => "Hanala lohateny ao amin'ny lisitra", +'watchlistedit-normal-explain' => "Aseho eo ambany ny lohateny ao amin'ny lisitry ny pejy arahanao. +Tsindrio ny boaty eo akaikiny ary tsindrio « {{int:Watchlistedit-normal-submit}} ». +Azonao atao ihany koa ny [[Special:EditWatchlist/raw|manova ilay lisitra amin'ny akorany]].", 'watchlistedit-normal-submit' => 'Hanala ireo lohateny nosafidiana ireo', +'watchlistedit-normal-done' => "Afaka tamin'ny lisitry ny pejy arahanao ny lohateny $1{{PLURAL:}}", 'watchlistedit-raw-title' => "Hanova ny lisitra ny pejy arahako maso amin'ny fomba akorany", 'watchlistedit-raw-legend' => "Fanovana ilay lisitry ny pejy arahina maso amin'ny fomba akorany", 'watchlistedit-raw-titles' => 'Lohateny :', @@ -3455,6 +3506,7 @@ Andramo ny topi-maso tsotra', 'version-hook-subscribedby' => "Nalefan'i", 'version-version' => '(Santiôna $1)', 'version-license' => 'Lisansy', +'version-poweredby-others' => 'hafa', 'version-software' => 'Rindrankahy voapetraka', 'version-software-product' => 'Vokatra', 'version-software-version' => 'Santiôna', @@ -3481,7 +3533,7 @@ Andramo ny topi-maso tsotra', 'specialpages-group-highuse' => 'Pejy ampiasaina mafy', 'specialpages-group-pages' => 'Lisitra ny pejy', 'specialpages-group-pagetools' => "Fitaovna ho an'ny pejy", -'specialpages-group-wiki' => "Datan'ny wiki sy fitaovana", +'specialpages-group-wiki' => 'Data sy fitaovana', 'specialpages-group-redirects' => 'Pejy manokana voaodina', 'specialpages-group-spam' => 'Fitaovana fanalana spam', @@ -3546,13 +3598,13 @@ Andramo ny topi-maso tsotra', 'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra", 'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra", 'logentry-move-move' => "nanova ny anaran'i $3 ho $4 i $1", -'logentry-newusers-newusers' => 'Noforonina ny kaontim-pikambana $1', -'logentry-newusers-create' => 'Noforonina ny kaontim-pikambana $1', -'logentry-newusers-create2' => "Noforonin'i $1 ny kaomtim-pikambana $3", -'logentry-newusers-autocreate' => 'Noforonina ho azy ny kaontim-pikambana $1', -'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5", -'logentry-rights-rights-legacy' => "$1 nanova ny vonodrom-pikambana isian'i $3", -'logentry-rights-autopromote' => 'Lasa $5 ho azy i $1 izay $4 taloha', +'logentry-newusers-newusers' => '{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1', +'logentry-newusers-create' => '{{GENDER:$2|Noforonina}} ny kaontim-pikambana $1', +'logentry-newusers-create2' => "{{GENDER:$2|Noforonin}}'i $1 ny kaomtim-pikambana $3", +'logentry-newusers-autocreate' => '{{GENDER:$2|Noforonina}} ho azy ny kaontim-pikambana $1', +'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5{{GENDER:$2}}", +'logentry-rights-rights-legacy' => "{{GENDER:$2}}$1 nanova ny vonodrom-pikambana isian'i $3", +'logentry-rights-autopromote' => '{{GENDER:$2}}Lasa $5 ho azy i $1 izay $4 taloha', 'rightsnone' => '(tsy misy)', # Feedback diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php index d215781677..1d804d06a0 100644 --- a/languages/messages/MessagesMin.php +++ b/languages/messages/MessagesMin.php @@ -2058,9 +2058,7 @@ Caliak [[Special:BlockList|daftar sakek]] untuak kasado pangguno nan kini kanai 'ipb_already_blocked' => '"$1" alah disakek', 'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?', 'ipb-otherblocks-header' => '{{PLURAL:$1|Sakek}} lain', -'blockme' => 'Sakek denai', 'proxyblocker' => 'Sakek proksi', -'proxyblocker-disabled' => 'Fungsi ko dimatian', # Developer tools 'lockdb' => 'Kunci basis data', @@ -2255,6 +2253,8 @@ Sanak hanyo buliah mancaliak sumbernyo sajo', # Spam protection 'spam_blanking' => 'Sado revisi nan ado pautan ka $1, kosong', 'spam_deleting' => 'Sado revisi nan ado pautan ka $1, dihapuih', +'simpleantispam-label' => "Pamarisoan anti-spam. +Masukan ko '''DILARANG'''!", # Info page 'pageinfo-title' => 'Informasi untuak "$1"', diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php index d467be4e19..982427e346 100644 --- a/languages/messages/MessagesMk.php +++ b/languages/messages/MessagesMk.php @@ -569,7 +569,7 @@ $messages = array( 'articlepage' => 'Преглед на содржината', 'talk' => 'Разговор', 'views' => 'Посети', -'toolbox' => 'Алатник', +'toolbox' => 'Алатки', 'userpage' => 'Преглед на корисничката страница', 'projectpage' => 'Преглед на проектната страница', 'imagepage' => 'Преглед на страницата на податотеката', @@ -2924,12 +2924,9 @@ $1', Таа е блокирана како дел од блокот адреси $2, кој не може да се деблокира.', 'ip_range_invalid' => 'Неважечки IP дијапазон на адреси.', 'ip_range_toolarge' => 'Не се дозволени опсежни блокирања поголеми од /$1.', -'blockme' => 'Блокирај ме', 'proxyblocker' => 'Блокер на застапници (proxy)', -'proxyblocker-disabled' => 'Оваа функција е оневозможена.', 'proxyblockreason' => 'Вашата IP-адреса е блокирана бидејќи претставува отворен застапник (proxy). Ве молиме контактирајте со вашиот доставувач на Интернет услуги или техничката поддршка и информирајте ги за овој сериозен безбедносен проблем.', -'proxyblocksuccess' => 'Готово.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..', 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}. @@ -3299,6 +3296,8 @@ $2', 'spam_reverting' => 'Враќам на последната верзија што не содржи врска до $1', 'spam_blanking' => 'Сите ревизии содржеа врски до $1. Чистам', 'spam_deleting' => 'Сите ревизии содржеа врски до $1. Бришам', +'simpleantispam-label' => "Проверка против спам. +'''НЕ''' пополнувајте го ова!", # Info page 'pageinfo-title' => 'Информации за „$1“', @@ -4037,7 +4036,7 @@ $5 'confirm-unwatch-top' => 'Да ја отстранам страницава од списокот на набљудувања?', # Separators for various lists, etc. -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← претходна страница', diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php index 6da9f87006..d4e81afc56 100644 --- a/languages/messages/MessagesMl.php +++ b/languages/messages/MessagesMl.php @@ -558,7 +558,7 @@ $messages = array( 'articlepage' => 'ലേഖനം കാണുക', 'talk' => 'സംവാദം', 'views' => 'ദർശനീയത', -'toolbox' => 'പണിസഞ്ചി', +'toolbox' => 'ഉപകരണങ്ങൾ', 'userpage' => 'ഉപയോക്താവിന്റെ താൾ കാണുക', 'projectpage' => 'പദ്ധതി താൾ കാണുക', 'imagepage' => 'പ്രമാണ താൾ കാണുക', @@ -2506,9 +2506,11 @@ $UNWATCHURL 'deleteotherreason' => 'മറ്റ്/കൂടുതൽ കാരണങ്ങൾ:', 'deletereasonotherlist' => 'മറ്റു കാരണങ്ങൾ', 'deletereason-dropdown' => '*മായ്ക്കാനുള്ള സാധാരണ കാരണങ്ങൾ -** സ്രഷ്ടാവ് ആവശ്യപ്പെട്ടതു പ്രകാരം +** പാഴെഴുത്ത് +** നശീകരണ പ്രവർത്തനം ** പകർപ്പവകാശ ലംഘനം -** നശീകരണ പ്രവർത്തനം', +** സ്രഷ്ടാവ് ആവശ്യപ്പെട്ടതു പ്രകാരം +** പൊട്ടിയ തിരിച്ചുവിടൽ', 'delete-edit-reasonlist' => 'മായ്ക്കലിന്റെ കാരണം തിരുത്തുക', 'delete-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ നിലനില്പ്പിനെ തന്നെ ബാധിക്കുമെന്നതിനാൽ ഈ താൾ മായ്ക്കുന്നതിനുള്ള അവകാശം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.', 'delete-warning-toobig' => 'ഈ താളിനു വളരെ വിപുലമായ തിരുത്തൽ ചരിത്രമുണ്ട്. അതായത്, ഇതിനു് $1 മേൽ {{PLURAL:$1|പതിപ്പുണ്ട്|പതിപ്പുകളുണ്ട്}}. ഇത്തരം താളുകൾ മായ്ക്കുന്നതു {{SITENAME}} സം‌രംഭത്തിന്റെ ഡാറ്റാബേസ് ഓപ്പറേഷനെ ബാധിച്ചേക്കാം. അതിനാൽ വളരെ ശ്രദ്ധാപൂർവ്വം തുടർനടപടികളിലേക്കു നീങ്ങുക.', @@ -2823,11 +2825,8 @@ $1', 'ipb_blocked_as_range' => 'പിഴവ്: $1 എന്ന ഐ.പി.യെ നേരിട്ടല്ല തടഞ്ഞിട്ടുള്ളത്. അതിനാൽ തടയൽ നീക്കം ചെയ്യുവാൻ സാദ്ധ്യമല്ല. അതിനെ $2ന്റെ ഭാഗമായുള്ള റേഞ്ചിൽ ആണ്‌ തടഞ്ഞിട്ടുള്ളത്. അത് ഒഴിവാക്കാവുന്നതാണ്.', 'ip_range_invalid' => 'അസാധുവായ ഐ.പി. റേഞ്ച്.', 'ip_range_toolarge' => 'പരിധി നിശ്ചയിച്ചുള്ള തടയലുകൾ /$1 എന്നതിലും കൂടുതലാകാൻ അനുവദിക്കുന്നില്ല.', -'blockme' => 'എന്നെ തടയുക', 'proxyblocker' => 'പ്രോക്സി തടയൽ', -'proxyblocker-disabled' => 'ഈ പ്രക്രിയ സജ്ജമാക്കിയിട്ടില്ല.', 'proxyblockreason' => 'ഓപ്പൺ പ്രോക്സി ആയതിനാൽ താങ്കളുടെ ഐ.പി. വിലാസത്തെ തടഞ്ഞിരിക്കുന്നു. ഇതു എന്തെങ്കിലും പിഴവ് മൂലം സംഭവിച്ചതാണെങ്കിൽ താങ്കളുടെ ഇന്റർനെറ്റ് സേവന ദാതാവിനെ സമീപിച്ചു ഈ സുരക്ഷാ പ്രശ്നത്തെ കുറിച്ച് ബോധിപ്പിക്കുക.', -'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.', 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.', 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.', 'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1', @@ -3191,6 +3190,8 @@ $1', 'spam_reverting' => '$1 എന്നതിലേയ്ക്കുള്ള കണ്ണികളില്ലാത്ത അവസാന നാൾപ്പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്യുന്നു', 'spam_blanking' => '$1 എന്നതിലേയ്ക്ക് കണ്ണികളുള്ള എല്ലാ നാൾപ്പതിപ്പുകളും ശൂന്യമാക്കുന്നു', 'spam_deleting' => '$1 എന്നതിലേയ്ക്ക് കണ്ണികളുള്ള എല്ലാ നാൾപ്പതിപ്പുകളും മായ്ക്കുന്നു', +'simpleantispam-label' => "പാഴെഴുത്ത് വിരുദ്ധ പരിശോധന. +ഇത് '''പൂരിപ്പിക്കരുത്'''!", # Info page 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ', diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php index b158fe31cb..04734d64f5 100644 --- a/languages/messages/MessagesMn.php +++ b/languages/messages/MessagesMn.php @@ -2398,12 +2398,9 @@ $1', Харин энэ нь $2 хэсгийн хэсэг болж түгжигдсэн байгаа бөгөөд үүнийг тайлах боломжтой.', 'ip_range_invalid' => 'Хүчингүй IP-н хүрээ.', 'ip_range_toolarge' => '/$1-с том хэмжээтэй түгжээ нь хориотой.', -'blockme' => 'Намайг түгж', 'proxyblocker' => 'Түгжигч прокси', -'proxyblocker-disabled' => 'Энэ функцийг хаасан байна.', 'proxyblockreason' => 'Таны IP хаяг нь чөлөөт прокси учраас түгжигдсэн байна. Та өөрийн ISP-тэйгээ холбоо барьж техникийн зөвлөгөө авч энэ асуудлынхаа тухай хэлнэ Ò¯Ò¯.', -'proxyblocksuccess' => 'Гүйцэтгэсэн.', 'sorbsreason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси хэмээн тодорхойлсон байна.', 'sorbs_create_account_reason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси гэж тэмдэглэсэн байна. Та бүртгэл үүсгэх боломжгүй.', diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php index d5a7690962..7a462bac31 100644 --- a/languages/messages/MessagesMr.php +++ b/languages/messages/MessagesMr.php @@ -541,7 +541,7 @@ $messages = array( 'articlepage' => 'लेख पृष्ठ', 'talk' => 'चर्चा', 'views' => 'दृष्ये', -'toolbox' => 'साधनपेटी', +'toolbox' => 'साधने', 'userpage' => 'सदस्य पृष्ठ', 'projectpage' => 'प्रकल्प पान पहा', 'imagepage' => 'संचिका पृष्ठ पहा', @@ -657,6 +657,9 @@ $1', 'databaseerror-text' => 'विदागार पृच्छा त्रूटी घडलेली आहे. ते संचेतनात गणकदोष असण्याची शक्यता निर्देशित करते.', 'databaseerror-textcl' => 'विदागार पृच्छा त्रूटी घडलेली आहे.', +'databaseerror-query' => 'पृच्छा:$1', +'databaseerror-function' => 'क्रिया: $1', +'databaseerror-error' => 'त्रुटी: $1', 'laggedslavemode' => "'''सुचना:''' पानावर अद्ययावत बदल नसतील.", 'readonly' => 'विदागारास (डाटाबेस) ताळे आहे.', 'enterlockreason' => 'विदागारास ताळे ठोकण्याचे कारण, ताळे उघडले जाण्याच्या अदमासे कालावधीसहीत द्या.', @@ -777,6 +780,8 @@ $2', 'userlogin-resetpassword-link' => 'परवलीचा शब्द पुन्हा जुळवा (रिसेट)', 'helplogin-url' => 'Help:सनोंद प्रवेशासाठी(लॉगिंग-ईन)', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|सनोंद-प्रवेशासाठी(लॉग-ईन) सहाय्य]]', +'userlogin-loggedin' => 'आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.', +'userlogin-createanother' => 'दुसरे नवीन खाते तयार करा', 'createacct-join' => 'खाली आपली माहिती भरा', 'createacct-another-join' => 'नविन खात्याबाबतची माहिती येथे खाली टाका.', 'createacct-emailrequired' => 'विपत्र पत्ता(ई-मेल)', @@ -1515,6 +1520,7 @@ $1", 'prefs-displaywatchlist' => 'दर्शन पर्याय', 'prefs-tokenwatchlist' => 'ओळखचिन्ह', 'prefs-diffs' => 'फरक', +'prefs-help-prefershttps' => 'हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.', # User preference: email validation using jQuery 'email-address-validity-valid' => 'विपत्रपत्ता वैध दिसत आहे', @@ -1672,8 +1678,8 @@ $1", 'action-block' => 'या सदस्यास संपादन करण्यापासून प्रतिबंधित करा', 'action-protect' => 'या पानाचा सुरक्षास्तर बदला', 'action-rollback' => 'या आधीच्या सदस्याने नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर पूर्वस्थितीत न्या', -'action-import' => 'दुसऱ्या विकीवरुन हे पान आयात करा', -'action-importupload' => 'अपभारीत संचिकेतून पान आयात करा', +'action-import' => 'दुसऱ्या विकीवरुन पाने आयात करा', +'action-importupload' => 'अपभारीत संचिकेतून पाने आयात करा', 'action-patrol' => "इतरांची संपादनांवर 'पहारा दिला' म्हणून खूण करा", 'action-autopatrol' => 'आपल्या संपादनांवर पहारा दिल्याची खूण करा', 'action-unwatchedpages' => 'पहारा न दिलेल्या पानांची यादी पहा', @@ -1689,6 +1695,7 @@ $1", # Recent changes 'nchanges' => '$1 {{PLURAL:$1|बदल}}', +'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|मागील भेटीनंतर}}', 'enhancedrc-history' => 'इतिहास', 'recentchanges' => 'अलीकडील बदल', 'recentchanges-legend' => 'अलीकडील बदलाएवजी पर्याय', @@ -1972,6 +1979,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे 'listfiles_size' => 'आकार (बाईट्स)', 'listfiles_description' => 'वर्णन', 'listfiles_count' => 'आवृत्त्या', +'listfiles-show-all' => 'या चित्राच्या जून्या आवृत्त्या अंतर्भूत करा.', +'listfiles-latestversion' => 'सध्याची आवृत्ती', 'listfiles-latestversion-yes' => 'हो', 'listfiles-latestversion-no' => 'नाही', @@ -2178,6 +2187,7 @@ Input:contenttype/subtype, e.g. image/jpeg.', 'listusers' => 'सदस्यांची यादी', 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा', 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा', +'listusers-desc' => 'उतरत्या क्रमाने निवडा', 'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}', 'usercreated' => 'दि. $1 ला, $2 वाजता, सदस्य खाते{{GENDER:$3|द्वारे बनविल्या गेले}}', 'newpages' => 'नवीन पाने', @@ -2436,9 +2446,11 @@ $UNWATCHURL 'deleteotherreason' => 'दुसरे/अतिरिक्त कारण:', 'deletereasonotherlist' => 'दुसरे कारण', 'deletereason-dropdown' => '* वगळण्याची सामान्य कारणे -** लेखकाची(लेखिकेची) विनंती +** स्पॅम +** उत्पात ** प्रताधिकार उल्लंघन -** उत्पात', +** लेखकाची(लेखिकेची) विनंती +** तुटकी पुनर्निर्देशने', 'delete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा', 'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}}पेक्षा जास्त वेळा बदलण्यात आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये म्हणून शक्य केलेले नाही.', 'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}} पेक्षा जास्त वेळा बदलण्यात आलेले आहे. @@ -2458,7 +2470,7 @@ $UNWATCHURL शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.', 'editcomment' => "संपादन सारांश \"''\$1''\" होता.", 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.', -'revertpage-nouser' => '(सदस्यनाम लपवले) यांनी केलेले बदल उलटवून [[User:$1|$1]] यांच्या आवृत्तीप्रमाणे पूर्ववत केले.', +'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.', 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.', # Edit tokens @@ -2590,7 +2602,7 @@ $1', 'contributions' => '{{GENDER:$1|सदस्य}} योगदान', 'contributions-title' => '$1 साठी सदस्य-योगदान', 'mycontris' => 'योगदान', -'contribsub2' => '$1 ($2) साठी', +'contribsub2' => '{{GENDER:$3|$1}} ($2) साठी', 'nocontribs' => 'या मानदंडाशी जुळणारे बदल सापडले नाहीत.', 'uctop' => '(सद्य)', 'month' => 'या महिन्यापासून (आणि पूर्वीचे):', @@ -2746,11 +2758,8 @@ $1', 'ipb_blocked_as_range' => 'त्रूटी:अंकपत्ता IP $1 हा प्रत्यक्षपणे प्रतिबंधित केलेला नाही आणि अप्रतिबंधीत करता येत नाही.तो,अर्थात,$2पल्ल्याचा भाग म्हाणून तो प्रतिबंधित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.', 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.', 'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.', -'blockme' => 'मला प्रतिबंधित करा', 'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक', -'proxyblocker-disabled' => 'हे कार्य अवरूद्ध केले आहे.', 'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.', -'proxyblocksuccess' => 'झाले.', 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.', 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही', 'xffblockreason' => '(X-Forwarded-For header) मधील अंकपत्ता,आपला किंवा आपण वापरत असलेल्या सर्व्हरचा,प्रतिबंधित केल्या गेला आहे.प्रतिबंधित करण्याचे मुळ कारण होते:$1', @@ -3090,6 +3099,8 @@ $1', 'spam_reverting' => '$1शी दुवे नसलेल्या गेल्या आवर्तनाकडे परत उलटवत आहे', 'spam_blanking' => '$1शी दुवे असलेली सर्व आवर्तने,रिक्त केली जात आहेत', 'spam_deleting' => 'यातील सर्व आवृत्त्यांचे $1शी दुवे आहेत.गाळत आहे', +'simpleantispam-label' => "चिखलणी विरोधक तपासणी. +हे भरू '''नका'''!", # Info page 'pageinfo-title' => '"$1" च्याबद्दल माहिती', @@ -3913,7 +3924,10 @@ $5 'tags-tag' => 'खूण नाव', 'tags-display-header' => 'बदल सुचीवर कसे दिसेल', 'tags-description-header' => 'अर्थाची पूर्ण माहिती', +'tags-active-header' => 'सक्रिय?', 'tags-hitcount-header' => 'खुणा केलेले बदल', +'tags-active-yes' => 'होय', +'tags-active-no' => 'नाही', 'tags-edit' => 'संपादन करा', 'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}', @@ -3934,6 +3948,7 @@ $5 'dberr-problems' => 'माफ करा, हे संकेतस्थळ सध्या तांत्रिक अडचणींना सामोरे जात आहे.', 'dberr-again' => 'थोडा वेळ थांबून पुन्हा पहा.', 'dberr-info' => '( विदादाताशी संपर्क साधण्यात असमर्थ : $1)', +'dberr-info-hidden' => '( विदादात्याशी संपर्क साधण्यात असमर्थ)', 'dberr-usegoogle' => 'तोपर्यंत गूगलवर शोधून पहा', 'dberr-outofdate' => 'लक्षात घ्या, आमच्या मजकुराबाबत त्यांची सूची कालबाह्य असू शकते', 'dberr-cachederror' => 'ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.', @@ -4072,7 +4087,7 @@ $5 'limitreport-cputime' => 'CPU वापराचा वेळ', 'limitreport-cputime-value' => '$1 {{PLURAL:$1|सेकंद}}', 'limitreport-walltime-value' => '$1 {{PLURAL:$1|सेकंद}}', -'limitreport-postexpandincludesize-value' => '$1/$2 बाईटस्', -'limitreport-templateargumentsize-value' => '$1/$2 बाईटस्', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}', ); diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php index fea4ebe370..2f07107d7b 100644 --- a/languages/messages/MessagesMs.php +++ b/languages/messages/MessagesMs.php @@ -2699,12 +2699,9 @@ Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan 'ipb_blocked_as_range' => 'Ralat: IP $1 tidak boleh dinyahsekat kerana ia tidak disekat secara langsung. Sebaliknya, ia disekat kerana merupakan sebahagian daripada sekatan julat $2, yang mana boleh dinyahsekat.', 'ip_range_invalid' => 'Julat IP tidak sah.', 'ip_range_toolarge' => 'Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan.', -'blockme' => 'Sekat saya', 'proxyblocker' => 'Penyekat proksi', -'proxyblocker-disabled' => 'Fungsi ini dimatikan.', 'proxyblockreason' => 'Alamat IP anda telah disekat kerana ia merupakan proksi terbuka. Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal dan beritahu mereka mengenai masalah keselamatan yang berat ini.', -'proxyblocksuccess' => 'Berjaya.', 'sorbsreason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}.', 'sorbs_create_account_reason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}. Oleh itu, anda tidak dibenarkan membuka akaun baru.', 'xffblockreason' => 'Alamat IP yang terdapat dalam pengepala X-Forwarded-For, sama ada milik anda ataupun pelayan proksi yang anda gunakan, telah disekat. Sebab asal sekatan adalah: $1', @@ -3053,6 +3050,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.', 'spam_reverting' => 'Membalikkan kepada versi terakhir yang tidak mengandungi pautan ke $1', 'spam_blanking' => 'Mengosongkan semua semakan yang mengandungi pautan ke $1', 'spam_deleting' => 'Menghapuskan semua semakan yang mengandungi pautan ke $1', +'simpleantispam-label' => "Pemeriksaan anti-spam. '''JANGAN''' isi ruangan ini!", # Info page 'pageinfo-title' => 'Maklumat untuk "$1"', diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php index 360f61df0e..6bec1c6da2 100644 --- a/languages/messages/MessagesMt.php +++ b/languages/messages/MessagesMt.php @@ -2608,11 +2608,8 @@ Ara l-[[Special:BlockList|lista tal-blokki]] sabiex tara l-blokki attivi.', 'ipb_blocked_as_range' => "Problema: L-Indirizz tal-IP $1 ma jistax jiÄ¡i blokkat waħdu u ma jistax jiÄ¡i sblokkat. L-Imblokk huwa attiv però f'livell ta' interval $2, li jista' jkun sblokkat.", 'ip_range_invalid' => "Interval ta' indirizzi ta' IP mhux validi.", 'ip_range_toolarge' => "Mhumiex permessi firxa ta' blokki ikbar minn /$1.", -'blockme' => 'Imblukkani', 'proxyblocker' => "Blokki ta' proxy miftuħa", -'proxyblocker-disabled' => 'Din il-funzjoni mhijiex attivata.', 'proxyblockreason' => "L-indirizz IP tiegħek Ä¡ie imblukkat peress li huwa proxy miftuħ. Jekk jogħġbok, ikkuntattja lill-provdituri tas-servizz tal-internet (ISP) jew lis-''support'' tekniku tiegħek u infurmahom b'din il-problema serja ta' sigurtà.", -'proxyblocksuccess' => 'Blokk esegwit.', 'sorbsreason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}.', 'sorbs_create_account_reason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}. Ma tistax toħloq kont.', 'cant-block-while-blocked' => 'Ma tistax timblokka lil utenti oħra waqt li inti mblukkat.', diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php index 3fe13d1ca5..8a3fb50354 100644 --- a/languages/messages/MessagesMwl.php +++ b/languages/messages/MessagesMwl.php @@ -246,7 +246,7 @@ $messages = array( 'articlepage' => 'Ber páigina de cuntenido', 'talk' => 'Çcusson', 'views' => 'Besitas', -'toolbox' => 'Caixa de Ferramientas', +'toolbox' => 'Ferramientas', 'userpage' => 'Ber páigina de outelizador', 'imagepage' => 'Ber páigina de fexeiro', 'mediawikipage' => 'Ber páigina de mensaiges', diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php index 227cad4956..4edacf7ee5 100644 --- a/languages/messages/MessagesMy.php +++ b/languages/messages/MessagesMy.php @@ -1509,8 +1509,6 @@ Your e-mail address is not revealed when other users contact you. 'block-log-flags-hiddenname' => 'အသုံးပြုသူအမည် ဝှက်ထားသည်', 'ipb_expiry_invalid' => 'သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။', 'ipb_already_blocked' => '"$1" ကို အစကတည်းက ပိတ်ထားသည်', -'blockme' => 'ကျွန်ုပ်ကို ပိတ်ရန်', -'proxyblocksuccess' => 'ပြီးပါပြီ။', # Move page 'move-page' => '$1 ကို ရွှေ့ရန်', diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php index 9fad6c7e26..e24ad45ac4 100644 --- a/languages/messages/MessagesMyv.php +++ b/languages/messages/MessagesMyv.php @@ -1638,8 +1638,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь — 'block-log-flags-noemail' => 'е-сёрма озавтозь саймес', 'block-log-flags-hiddenname' => 'лисиенть-совиенть лемезэ кекшезь', 'ipb_already_blocked' => '"$1" уш саймас саезь', -'blockme' => 'Озавтомак саймес', -'proxyblocksuccess' => 'Озавтовсь.', # Developer tools 'lockdb' => 'Сёлгомс датабазанть', diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php index 77b0acf8e6..a9224e7703 100644 --- a/languages/messages/MessagesNah.php +++ b/languages/messages/MessagesNah.php @@ -1173,8 +1173,6 @@ Xiquitta $2 ic yancuÄ«c tlapololiztli.', 'change-blocklink' => 'Ticpatlaz tlatzacualli', 'contribslink' => 'tlapatlaliztli', 'blocklogpage' => 'TlatequitiltilÄ«lli ōmotzacuili', -'blockme' => 'TimitzcuilÄ«z', -'proxyblocksuccess' => 'ŌmochÄ«uh.', # Move page 'move-page' => 'Ticzacāz $1', diff --git a/languages/messages/MessagesNb.php b/languages/messages/MessagesNb.php index 91c0d6ea2e..cd16f34706 100644 --- a/languages/messages/MessagesNb.php +++ b/languages/messages/MessagesNb.php @@ -2810,11 +2810,8 @@ Skjulingsloggen vises nedenfor.', 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikke blokkert direkte, og kan ikke avblokkeres. Den er imidlertid blokkert som del av blokkeringa av IP-rangen $2, som kan avblokkeres.', 'ip_range_invalid' => 'Ugyldig IP-rad.', 'ip_range_toolarge' => 'Blokkering av IP-serier større enn /$1 er ikke tillatt.', -'blockme' => 'Blokker meg', 'proxyblocker' => 'Proxyblokker', -'proxyblocker-disabled' => 'Denne funksjonen er slÃ¥tt av.', 'proxyblockreason' => 'IP-adressen din ble blokkert fordi den er en Ã¥pen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.', -'proxyblocksuccess' => 'Utført.', 'sorbsreason' => 'Din IP-adresse angis som en Ã¥pen proxy i DNSBL-en brukt av {{SITENAME}}.', 'sorbs_create_account_reason' => 'Din IP-adresse angis som en Ã¥pen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto', 'xffblockreason' => 'En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1', @@ -3167,6 +3164,8 @@ Dette er sannsynligvis forÃ¥rsaket av en lenke til et svartelistet eksternt nett 'spam_reverting' => 'Tilbakestiller til siste versjon uten lenke til $1', 'spam_blanking' => 'Alle revisjoner inneholdt lenke til $1, tømmer siden', 'spam_deleting' => 'Sletter alle revisjoner med lenker til $1', +'simpleantispam-label' => "Antispamsjekk. +'''IKKE''' fyll inn dette feltet!", # Info page 'pageinfo-title' => 'Informasjon om «$1»', diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php index 10cc0d044c..b981c5a37e 100644 --- a/languages/messages/MessagesNds.php +++ b/languages/messages/MessagesNds.php @@ -2194,12 +2194,9 @@ Kiek [[Special:BlockList|IP-Blocklist]] för en List vun den blockten Brukern.', 'ipb_cant_unblock' => 'Fehler: Block-ID $1 nich funnen. De Sperr is villicht al wedder ophoven.', 'ipb_blocked_as_range' => 'Fehler: De IP-Adress $1 is as Deel vun de IP-Reeg $2 indirekt sperrt worrn. De Sperr trüchnehmen för $1 alleen geiht nich.', 'ip_range_invalid' => 'Ungüllig IP-Addressrebeet.', -'blockme' => 'Sperr mi', 'proxyblocker' => 'Proxyblocker', -'proxyblocker-disabled' => 'Disse Funkschoon is afstellt.', 'proxyblockreason' => 'Dien IP-Adress is blockt, vun wegen dat se en apenen Proxy is. Kontakteer dien Provider oder diene Systemtechnik un informeer se över dat möögliche Sekerheitsproblem.', -'proxyblocksuccess' => 'Trech.', 'sorbsreason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY.', 'sorbs_create_account_reason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY. Du kannst keen Brukerkonto nee opstellen.', 'cant-block-while-blocked' => 'Du kannst kene annern Brukers sperren, wenn du sülvst sperrt büst.', @@ -2480,6 +2477,7 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import 'spambot_username' => 'MediaWiki Spam-Oprümen', 'spam_reverting' => 'Trüchdreiht na de letzte Version ahn Lenken na $1.', 'spam_blanking' => 'All Versionen harrn Lenken na $1, rein maakt.', +'simpleantispam-label' => "Antispam-Kuntrull. Hier '''nix''' indragen!", # Info page 'pageinfo-title' => 'Informatschoon för "$1"', diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php index 4c6ba0e211..a7dd270a04 100644 --- a/languages/messages/MessagesNds_nl.php +++ b/languages/messages/MessagesNds_nl.php @@ -2483,10 +2483,12 @@ Bevestig hieronder dat dit inderdaod de bedoeling is, da'j de gevolgen begriepen 'deletecomment' => 'Reden:', 'deleteotherreason' => 'Aandere/extra reden:', 'deletereasonotherlist' => 'Aandere reden', -'deletereason-dropdown' => '*Redens veur t vortdoon van ziejen +'deletereason-dropdown' => '* Redens veur t vortdoon van ziejen +** Spam +** Vandalisme +** Schending van auteursrechten ** Op verzeuk van de auteur -** Schending van auteursrecht -** Vandalisme', +** Ebreuken deurverwiezing', 'delete-edit-reasonlist' => 'Redens veur t vortdoon bewarken', 'delete-toobig' => 'Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}. t Vortdoon van dit soort ziejen is mit rechten bepark um t per ongelok versteuren van de warking van {{SITENAME}} te veurkoemen.', @@ -2802,11 +2804,8 @@ Wi'j de instellingen wiezigen?", De blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven kan wörden.', 'ip_range_invalid' => 'Ongeldige IP-reeks', 'ip_range_toolarge' => 'Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.', -'blockme' => 'Mien blokkeren', 'proxyblocker' => 'Proxyblokker', -'proxyblocker-disabled' => 'Disse funksie is uutezet.', 'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.", -'proxyblocksuccess' => 'Suksesvol.', 'sorbsreason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.", 'sorbs_create_account_reason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken. Je kunnen gien gebrukerszied anmaken.", @@ -3146,6 +3145,8 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet 'spam_reverting' => 'Bezig mit t weerummezetten naor de leste versie die gien verwiezing hef naor $1', 'spam_blanking' => 'Alle wiezigingen mit n verwiezing naor $1 wörden vortehaold', 'spam_deleting' => 'In alle versies staon verwiezingen naor $1. Zied vortedaon', +'simpleantispam-label' => "Antispamkontraole. +Hier '''NIKS''' invullen!", # Info page 'pageinfo-title' => 'Informasie over "$1"', @@ -3947,7 +3948,7 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de 'specialpages-group-pagetools' => 'Ziedhulpmiddels', 'specialpages-group-wiki' => 'Gegevens en hulpmiddels', 'specialpages-group-redirects' => 'Deurverwiezende spesiale ziejen', -'specialpages-group-spam' => 'Hulpmiddels tegen ongewunste bewarkingen', +'specialpages-group-spam' => 'Spam-hulpmiddels', # Special:BlankPage 'blankpage' => 'Lege zied', diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php index cd42746212..6abbfdace5 100644 --- a/languages/messages/MessagesNe.php +++ b/languages/messages/MessagesNe.php @@ -273,7 +273,7 @@ $messages = array( 'articlepage' => 'कन्टेन्ट पृष्ठ हेर्नुहोस्', 'talk' => 'वार्तालाप', 'views' => 'अवलोकनहरू', -'toolbox' => 'औजारबट्टा', +'toolbox' => 'औजारहरू', 'userpage' => 'प्रयोगकर्ता पृष्ठ हेर्ने', 'projectpage' => 'प्रोजेक्ट पृष्ठ हेर्ने', 'imagepage' => 'फाइल पृष्ठ हेर्नुहोस्', @@ -336,6 +336,9 @@ $1', 'newmessageslink' => 'नयाँ सन्देशहरू', 'newmessagesdifflink' => 'आखिरी परिवर्तन', 'youhavenewmessagesfromusers' => 'तपाईंको लागि {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1', +'youhavenewmessagesmanyusers' => 'तपाईँलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।', +'newmessageslinkplural' => '{{PLURAL:$1|नयाँ सन्देश|नयाँ सन्देशहरू}}', +'newmessagesdifflinkplural' => 'अन्तिम {{PLURAL:$1|सम्पादन|सम्पादनहरू}}', 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा नयाँ सन्देशहरू छन्', 'editsection' => 'सम्पादन', 'editold' => 'सम्पादन गर्ने', @@ -389,6 +392,12 @@ $1', # General errors 'error' => 'त्रुटि', 'databaseerror' => 'डेटावेस त्रुटि', +'databaseerror-text' => 'डेटाबेस क्वेरीमा खराबी देखा पर्‌यो । +यसले सफ्टवेयरमा त्रुटी रहेको इङ्गित गर्न सक्छ ।', +'databaseerror-textcl' => 'डेटावेस क्वेरीमा खराबी देखियो ।', +'databaseerror-query' => 'क्वेरी: $1', +'databaseerror-function' => 'फङ्सन : $1', +'databaseerror-error' => 'खराबी: $1', 'laggedslavemode' => "'''चेतावनी:''' पृष्ठमा हालका अद्यतनहरु नहुनसक्छन् ।", 'readonly' => 'डेटाबेस बन्द गरिएको छ', 'enterlockreason' => 'ताल्चा मार्नुको कारण दिनुहोस्, साथै ताल्चा हटाउने समयको अवधि अनुमान लगाउनुहोस्।', @@ -419,6 +428,8 @@ $1', 'cannotdelete' => '"$1" पृष्ठ वा फ़ाइल मेट्नसकिएन। यो अघिबाट नैं मेटिएको हुनुपर्छ।', 'cannotdelete-title' => 'पृष्ठ "$1" लाई मेट्न सकिएन', +'delete-hook-aborted' => 'हुकले सम्पादनकार्य बन्द गरिदियो । +कुनै कारण दिइएन ।', 'badtitle' => 'गलत शीर्षक', 'badtitletext' => 'अनुरोध गरेको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो। यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।', 'perfcached' => 'तलको डाटाहरु क्याचमा रहेका कुराहरु हुन्। अपटुडेट नहुनपनि सक्छन्।अधिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} क्यासमा उपलब्ध छ।', @@ -433,10 +444,11 @@ $1', 'actionthrottled' => 'कार्य रोकियो', 'actionthrottledtext' => 'स्पामबाट बच्ने तरिकाको रुपमा , तपाईँलाई यो कार्य थोरै समयमा धेरै पटक गर्नबाट सिमित गरिएको छ, र तपाईले आफ्नो सिमा पार गरिसक्नु भयो । कृपया केही मिनेटहरु पछि पुन: प्रयास गर्नुहोस् ।', -'protectedpagetext' => 'यो पृष्ठ सम्पादन हुनबाट बचाउन सम्पादनमा रोक लगाइएको छ।', +'protectedpagetext' => 'यो पृष्ठ सम्पादन हुनबाट बचाउन सम्पादनमा तथा अन्यकार्यमा रोक लगाइएको छ।', 'viewsourcetext' => 'तपाईँले यस पृष्ठको स्रोत हेर्न र प्रतिलिपी गर्न सक्नुहुन्छ ।', 'viewyourtext' => "यस पृष्ठमा रहेका '''तपाईँका सम्पादनहरु''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :", -'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन ताल्चा मारिएको छ।', +'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन सुरक्षा प्रादन गरिएको छ। +सम्पूर्ण विकिहरूका लागि अनुवादमा परिवर्तन गर्नको लागि [//translatewiki.net/ translatewiki.net], प्रयोग गर्नुहोस् , मिडियाविकि स्थानियकरण परियोजना ।', 'editinginterface' => "'''चेतावनी:''' तपाईं यस्तो पृष्ठलाई सम्पादन गर्नुहुँदैछ, जसले सफ्टवेयरको लागि अन्तरमोहोड़ा (interface) पाठ प्रदान गर्दछ। यसको परिवर्तनले यस विकिमा अरु प्रयोगकर्ताको अन्तरमोहोड़ाको प्रदर्शनमा प्रभाव पार्छ। सबै विकिका निम्ति अनुवाद जोड्न अथवा परिबर्तन गर्न कृपया यहाँ जानुहोस् [//translatewiki.net/ translatewiki.net], मीडियाविकि स्थानीयकरण पारियोजना।", @@ -448,9 +460,9 @@ $2', 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादन गर्न सकिदैन ।', 'titleprotected' => ' [[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ। कारण "\'\'$2\'\'" हो ।', -'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिंदैन किन भनें फाइल भण्डार "$2" केवल पढ्ने स्थिति (read-only mode)मा छ। +'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिँदैन किन भने फाइल भण्डार "$2" केवल पढ्ने स्थिति (read-only mode)मा छ। -कारण यो दिएकोछ: "\'\'$3\'\'"।', +यसलाई सुरक्षित गर्ने प्रवन्धकले यो कारण दिएकाछन् : \'\'$3\'\'।', 'exception-nologin' => 'प्रवेश (लग ईन) नगरिएको', # Virus scanner @@ -460,14 +472,25 @@ $2', # Login and logout pages 'logouttext' => "'''तपाईं अहिले बाहिर निस्कनु भएको छ।''' -तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट [$1 फेरि प्रवेश गर्न] पनि सक्नुहुन्छ। -याद राख्नुहोस् तपाईंले ब्राउजरको स्मरण भण्डार खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।", + +याद राख्नुहोस् तपाईंले ब्राउजरको क्याश खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।", 'welcomeuser' => '$1जी स्वागत छ!', 'yourname' => 'प्रयोगकर्ता नाम:', +'userlogin-yourname' => 'प्रयोगकर्ता नाम', +'userlogin-yourname-ph' => 'तपाईँको प्रयोगकर्तानाम लेख्नुहोस्', +'createacct-another-username-ph' => 'प्रयोगकर्तानाम लेख्नुहोस्', 'yourpassword' => 'पासवर्ड', +'userlogin-yourpassword' => 'पासवर्ड', +'userlogin-yourpassword-ph' => 'तपाईँको पासवर्ड लेख्नुहोस्', +'createacct-yourpassword-ph' => 'पासवर्ड लेख्नुहोस्', 'yourpasswordagain' => 'पासवर्ड फेरि टाईप गर्नुहोस्', +'createacct-yourpasswordagain' => 'पासवर्ड निश्चित गर्नुहोस्', +'createacct-yourpasswordagain-ph' => 'फेरि पासवर्ड लेख्नुहोस्', 'remembermypassword' => 'यो कम्प्युटरमा मेरो प्रवेश याद गर । (धेरैमा $1 {{PLURAL:$1|दिन|दिनहरु}})', +'userlogin-remembermypassword' => 'मलाई प्रवेश गराइराख्ने', +'userlogin-signwithsecure' => 'सुक्षित जडान प्रयोग गर्ने', 'yourdomainname' => 'तपाईंको ज्ञानक्षेत्र(डोमेन)', +'password-change-forbidden' => 'यो विकिमा पासवर्ड परिवर्तन गर्न सक्नुहुन्न ।', 'externaldberror' => 'यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।', 'login' => 'प्रवेश', 'nav-login-createaccount' => 'प्रवेश गर्ने/नयाँ खाता बनाउने', @@ -477,14 +500,33 @@ $2', 'logout' => 'निर्गमन', 'userlogout' => 'निर्गमन (लग आउउ)', 'notloggedin' => 'प्रवेश (लग ईन) नगरिएको', +'userlogin-noaccount' => 'के खाता छैन ?', +'userlogin-joinproject' => '{{SITENAME}} मा खाता खोल्नुहोस् ।', 'nologin' => 'तपाईको खाता छैन? $1 ।', 'nologinlink' => 'नयाँ खाता खोल्नुहोस्', 'createaccount' => 'खाता खोल्नुहोस्', 'gotaccount' => "के तपाईँसँग पहिले देखि नै खाता छ ? '''$1''' ।", 'gotaccountlink' => 'लग इन', 'userlogin-resetlink' => 'प्रवेश सम्बन्धी विवरणहरु बिर्सनु भयो?', -'createaccountmail' => 'इ-मेलबाट', +'userlogin-resetpassword-link' => 'पासवर्ड परिवर्तन गर्नुहोस्', +'userlogin-createanother' => 'अर्को खाता खोल्नुहोस्', +'createacct-join' => 'तपाईँका जानकारीहरू तल थप्नुहोस् ।', +'createacct-another-join' => 'नयाँ खाताको जानकारी तल थप्नुहोस ।', +'createacct-emailrequired' => 'इमेल ठेगाना', +'createacct-emailoptional' => 'इमेल ठेगाना (ऐच्छिक)', +'createacct-email-ph' => 'तपाईँको इमेल ठेगाना भर्नुहोस्', +'createacct-another-email-ph' => 'इमेल ठेगाना भर्नुहोस्', +'createaccountmail' => 'कुनै अस्थाई र श्रिजित पासवर्ड प्रयोग गर्ने र खुलाईएको इमेलमा पठाउने', +'createacct-realname' => 'वास्तविक नाम(ऐच्छिक)', 'createaccountreason' => 'कारण :', +'createacct-reason' => 'कारण', +'createacct-reason-ph' => 'किन नयाँ खाता खोलिरहनु भएको हो ?', +'createacct-captcha' => 'सुरक्षा जाँच', +'createacct-imgcaptcha-ph' => 'माथि देखिए अनुसारको पाठ भर्नुहोस्', +'createacct-submit' => 'तपाईँको खाता सिर्जना गर्नुहोस', +'createacct-another-submit' => 'अर्को खाता सिर्जना गर्नुहोस्', +'createacct-benefit-heading' => '{{SITENAME}} तपाईँ जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।', +'createacct-benefit-body1' => '{{PLURAL:$1|सम्पादन|सम्पादनहरू}}', 'badretype' => 'तपाईंले दिनुभएको पासवर्ड मिल्दैन।', 'userexists' => 'तपाईले प्रविष्ट गर्नुभएको प्रयोगकर्ताको नाम पहिले देखिनै प्रयोगमा छ । कृपया फरक नाम छान्नुहोस् ।', @@ -541,12 +583,11 @@ $2', 'cannotchangeemail' => 'यस विकिमा तपाईको खातासँग सम्बन्धित इमेल ठेगाना परिवर्तन गर्न सकिन्न ।', 'emaildisabled' => 'यो साइटले इमेलहरु पठाउन सक्तैन।', 'accountcreated' => 'खाता खोलियो', -'accountcreatedtext' => '$1 कोलागि प्रयोगकर्ता खाता खोलियो।', +'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]])$1 प्रयोगकर्ताको लागि खाता खोलिएको छ ।', 'createaccount-title' => '{{SITENAME}}कोलागि खाता खोल्ने काम', 'createaccount-text' => 'कसैले तपाईको इमेल ठेगानालाई {{SITENAME}} ($4) मा "$2" नामको खाता बनाएको छ, जसको पासवर्ड "$3" छ।', 'usernamehasherror' => 'प्रयोगकर्तानाममा ह्यास अक्षरहरु राख्न मिल्दैन।', -'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभयो। -कृपया पर्खेर केही समयपछि मात्र प्रयास गर्नुहोस्।', +'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ ,कृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।', 'login-abort-generic' => 'तपाईंको प्रवेश असफल भयो - छोड़ियो', 'loginlanguagelabel' => 'भाषा: $1', 'suspicious-userlogout' => 'तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।', @@ -565,7 +606,7 @@ $2', 'newpassword' => 'नयाँ पासवर्ड:', 'retypenew' => 'प्रवेश शव्द पुन: दिनुहोस् :', 'resetpass_submit' => 'पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने', -'changepassword-success' => 'तपाईँको प्रवेशशव्द सफलतापूर्वक परिवर्तन भयो ! तपाईलाई प्रवेश गराइँदैछ ...', +'changepassword-success' => 'तपाईँको पासवर्ड सफलतापूर्वक परिवर्तन भयो !', 'resetpass_forbidden' => 'प्रवेशशव्द परिवर्तन गर्न मिल्दैन', 'resetpass-no-info' => 'यो पृष्ठ सिधै हेर्नको लागि तपाईँले प्रवेश गर्नुपर्छ ।', 'resetpass-submit-loggedin' => 'प्रवेशशव्द परिवर्तन गर्ने', @@ -598,8 +639,8 @@ $2 तपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड चुन्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनु हुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।', 'passwordreset-emailelement' => 'प्रयोगकर्ताको नाम: $1 अस्थाई पासवर्ड: $2', -'passwordreset-emailsent' => 'एउटा अनुस्मारक इमेल पठाइयो।', -'passwordreset-emailsent-capture' => 'अनुस्मारक इमेल पठाइयो, जो तल देखाइएकोछ।', +'passwordreset-emailsent' => 'पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।', +'passwordreset-emailsent-capture' => 'पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।', # Special:ChangeEmail 'changeemail' => 'इमेल ठेगाना परिवर्तन गर्नुहोस', @@ -856,8 +897,8 @@ $2 लिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमा अंतर, '''({{int:last}})''' = पहिलाका अवतरणको बीचमा अंतर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।", 'history-fieldset-title' => 'इतिहासको विचरण गर्ने', 'history-show-deleted' => 'मेटिएका मात्र', -'histfirst' => 'पहिलो', -'histlast' => 'अन्तिम', +'histfirst' => 'पुरानो', +'histlast' => 'नयाँ', 'historysize' => '({{PLURAL:$1|१ बाइट |$1 बाइटहरु}})', 'historyempty' => '(खाली)', @@ -1040,7 +1081,7 @@ $1", 'search-interwiki-default' => '$1 नतिजाहरु:', 'search-interwiki-more' => '(अझै)', 'search-relatedarticle' => 'सम्बन्धित', -'mwsuggest-disable' => 'AJAX सुझाव निस्क्रिय पार्नुहोस्', +'mwsuggest-disable' => 'खोज सुझावहरु अक्षम पार्ने', 'searcheverything-enable' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्', 'searchrelated' => 'सम्बन्धित', 'searchall' => 'सबै', @@ -1092,7 +1133,7 @@ $1", 'prefs-rendering' => 'स्वरुप', 'saveprefs' => 'संग्रह', 'resetprefs' => 'संग्रह नगरिएका परिवर्तनहरु सफागर्ने', -'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने', +'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)', 'prefs-editing' => 'सम्पादन', 'rows' => 'हरफहरु :', 'columns' => 'स्तम्भहरु :', @@ -1136,8 +1177,8 @@ $1", 'prefs-emailconfirm-label' => 'इ-मेल एकिन प्रक्रिया :', 'youremail' => 'ईमेल', 'username' => '{{GENDER:$1|प्रयोगकर्ता नाम}}:', -'uid' => 'प्रोगकर्ता आइडी:', -'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को सदस्य :', +'uid' => '{{GENDER:$1|प्रयोगकर्ता}} ID:', +'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदस्य}} :', 'prefs-memberingroups-type' => '$1', 'prefs-registration' => 'दर्ता समय:', 'prefs-registration-date-time' => '$1', @@ -1150,10 +1191,10 @@ $1", HTML ट्यागहरु जाँच्नुहोस् ।', 'badsiglength' => 'तपाईको दस्तखत धेरै लामो छ। यो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।', -'yourgender' => 'लिङ्ग:', -'gender-unknown' => 'नखुलेको', -'gender-male' => 'पुरूष', -'gender-female' => 'महिला', +'yourgender' => 'कसरी वताउन चाहनुहुन्छ ?', +'gender-unknown' => 'म खुलाउन चाहन्न', +'gender-male' => 'उसले विकि पृष्ठहरू सम्पादन गर्छ', +'gender-female' => 'उनले विकि पृष्ठ सम्पादन गर्छिन', 'prefs-help-gender' => 'वैकल्पिक: सफ्टवेयरले लिङगानुसार सम्बोधन गर्नको लागि प्रयोग गरिन्छ । यो जानकारी सार्वजनिक हुनेछ ।', 'email' => 'ईमेल', @@ -1167,7 +1208,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।', 'prefs-signature' => 'हस्ताक्षर', 'prefs-dateformat' => 'मिति ढाँचा', 'prefs-timeoffset' => 'समय अफसेट', -'prefs-advancedediting' => 'सामान्य', +'prefs-advancedediting' => 'सामान्य विकल्पहरू', 'prefs-advancedrc' => 'उन्नत विकल्पहरू', 'prefs-advancedrendering' => 'उन्नत विकल्पहरु', 'prefs-advancedsearchoptions' => 'उन्नत विकल्पहरू', @@ -2242,12 +2283,9 @@ $1को बन्देजको कारण : "$2" हो', यो एक रेन्ज रोक $2, को अन्तर्गत रहेको छ जसलाई रोक खोल्न मिल्छ ।', 'ip_range_invalid' => 'IP क्षेत्र अमान्य ।', 'ip_range_toolarge' => ' /$1 भन्दा ठूलो रेन्ज रोक लगाउन पाइदैन ।.', -'blockme' => 'मलाई निषेध गर्ने', 'proxyblocker' => 'प्रोक्सी निषेध गर्ने', -'proxyblocker-disabled' => 'यो कार्य निष्कृय पारिएको छ।', 'proxyblockreason' => 'तपाईको IP ठेगानामा रोक लगाइएको छ किनकी यो खुला प्रोक्सी हो । कृपया तपाईको इन्टरनेट सेवा प्रदायक या प्राविधिक सहायतालाई सम्पर्क गरी यस सुरक्षा समस्याको बारेमा जानकारी गराउनुहोस् ।', -'proxyblocksuccess' => 'सकियो.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।', 'sorbs_create_account_reason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ। diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php index 5e17a4d054..c4fb71d4d8 100644 --- a/languages/messages/MessagesNl.php +++ b/languages/messages/MessagesNl.php @@ -1637,7 +1637,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u 'prefs-signature' => 'Ondertekening', 'prefs-dateformat' => 'Datumopmaak:', 'prefs-timeoffset' => 'Tijdverschil', -'prefs-advancedediting' => 'Algemene opties', +'prefs-advancedediting' => 'Algemene instellingen', 'prefs-editor' => 'Tekstverwerker', 'prefs-preview' => 'Voorvertoning', 'prefs-advancedrc' => 'Gevorderde instellingen', @@ -2243,7 +2243,7 @@ Invoer: inhoudstype/subtype, bijvoorbeeld image/jpeg.', # Unused templates 'unusedtemplates' => 'Ongebruikte sjablonen', 'unusedtemplatestext' => 'Deze pagina geeft alle pagina\'s weer in de naamruimte {{ns:template}} die op geen enkele pagina gebruikt worden. -Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens deze sjabloon te verwijderen.', +Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabloon te verwijderen.', 'unusedtemplateswlh' => 'andere koppelingen', # Random page @@ -2961,12 +2961,9 @@ Misschien is de blokkade al opgeheven.', De blokkade is onderdeel van de reeks $2, waarvan de blokkade wel opgeheven kan worden.', 'ip_range_invalid' => 'Ongeldige IP-reeks.', 'ip_range_toolarge' => 'Reeksblokkades groter dan /$1 zijn niet toegestaan.', -'blockme' => 'Mij blokkeren', 'proxyblocker' => 'Proxyblocker', -'proxyblocker-disabled' => 'Deze functie is uitgeschakeld.', 'proxyblockreason' => 'Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver. Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.', -'proxyblocksuccess' => 'Afgerond.', 'sorbsreason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.', 'sorbs_create_account_reason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt. U kunt geen gebruiker registreren.', @@ -3338,6 +3335,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.', 'spam_reverting' => 'Teruggedraaid naar de laatste versie die geen koppeling bevat naar $1', 'spam_blanking' => 'Alle versies bevatten een koppeling naar $1. Pagina leeggemaakt', 'spam_deleting' => 'Alle versies bevatten koppelingen naar $1. Pagina verwijderd', +'simpleantispam-label' => "Antispamcontrole. +Vul dit veld '''NIET''' in!", # Info page 'pageinfo-title' => 'Informatie over "$1"', diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php index 74eddc5a26..fe944b1903 100644 --- a/languages/messages/MessagesNn.php +++ b/languages/messages/MessagesNn.php @@ -2721,11 +2721,8 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. SjÃ¥ [[Special:Blo 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikkje direkte blokkert og kan ikkje opphevast. Adressa er blokkert som ein del av blokkeringa av IP-intervallet $2. Denne blokkeringa kan opphevast.', 'ip_range_invalid' => 'Ugyldig IP-adresseserie.', 'ip_range_toolarge' => 'Blokkering av IP-seriar større enn /$1 er ikkje tillate.', -'blockme' => 'Blokker meg', 'proxyblocker' => 'Proxy-blokkerar', -'proxyblocker-disabled' => 'Denne funksjonen er slÃ¥tt av.', 'proxyblockreason' => 'Du er blokkert frÃ¥ Ã¥ endre fordi IP-adressa di tilhøyrer ein open mellomtenar (proxy). Du bør kontakte internettleverandøren din eller kundesørvis og gje dei beskjed, ettersom dette er eit alvorleg sikkerheitsproblem.', -'proxyblocksuccess' => 'Utført.', 'sorbsreason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL.', 'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor fÃ¥r du ikkje registrert deg.', 'xffblockreason' => 'Ei IP-adresse i X-Forwarded-For-tittelen, anten di eller den som høyrer til ein proksytenar du nyttar, er blokkert. Den opphavlege blokkeringsgrunnen var: $1', @@ -3063,6 +3060,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans 'spam_reverting' => 'Attenderullar til siste versjon utan lenkje til $1', 'spam_blanking' => 'Alle versjonar inneheldt lenkje til $1, tømmer sida', 'spam_deleting' => 'Alle versjonane inneheldt lenkjer til $1, slettar.', +'simpleantispam-label' => "Antispam-kontroll. +'''IKKJE''' fyll ut dette feltet!", # Info page 'pageinfo-title' => 'Informasjon om «$1»', diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php index 114fb929a6..99cea7601c 100644 --- a/languages/messages/MessagesNso.php +++ b/languages/messages/MessagesNso.php @@ -1028,7 +1028,6 @@ Seemo sa go lota ga letlakala '''$1''':", 'unblocklogentry' => 'Gago thibelo $1', 'block-log-flags-nocreate' => 'Go hloma tÅ¡hupaleloko gago dumelege', 'block-log-flags-noemail' => 'e-mail e thibilwe', -'proxyblocksuccess' => 'Phetilwe.', # Move page 'move-page-legend' => 'HuduÅ¡a letlakala', diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php index d53a57800b..bd206aa331 100644 --- a/languages/messages/MessagesOc.php +++ b/languages/messages/MessagesOc.php @@ -314,7 +314,7 @@ $messages = array( 'tog-minordefault' => 'Considerar mas modificacions coma menoras per defaut', 'tog-previewontop' => 'Far veire la previsualizacion al dessús de la zòna de modificacion', 'tog-previewonfirst' => 'Far veire la previsualizacion al moment de la primièra edicion', -'tog-nocache' => "Desactivar l'amagatal de paginas", +'tog-nocache' => "Desactivar l'escondedor de las paginas pel navigador", 'tog-enotifwatchlistpages' => 'M’avertir per corrièr electronic quand una pagina o un fichièr de ma lista de seguiment es modificat', 'tog-enotifusertalkpages' => 'M’avertir per corrièr electronic en cas de modificacion de ma pagina de discussion', 'tog-enotifminoredits' => 'M’avertir per corrièr electronic quitament en cas de modificacions menoras de las paginas o dels fichièrs', @@ -510,7 +510,7 @@ $messages = array( 'articlepage' => "Vejatz l'article", 'talk' => 'Discussion', 'views' => 'Afichatges', -'toolbox' => "Bóstia d'aisinas", +'toolbox' => 'Aisinas', 'userpage' => "Pagina d'utilizaire", 'projectpage' => 'Pagina meta', 'imagepage' => 'Veire la pagina del fichièr', @@ -540,7 +540,7 @@ $1", # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'A prepaus de {{SITENAME}}', 'aboutpage' => 'Project:A prepaus', -'copyright' => 'Lo contengut es disponible segon los tèrmes de la licéncia $1.', +'copyright' => 'Lo contengut es disponible jos licéncia $1 levat mencion contrària.', 'copyrightpage' => '{{ns:project}}:Copyright', 'currentevents' => 'Actualitats', 'currentevents-url' => 'Project:Actualitats', @@ -623,6 +623,8 @@ Una lista de las paginas especialas pòt èsser trobada sus [[Special:SpecialPag # General errors 'error' => 'Error', 'databaseerror' => 'Error de la banca de donadas', +'databaseerror-text' => "Una error de requèsta de banca de donadas s'es producha. Aquò pòt provenir d'un bug dins lo logicial.", +'databaseerror-textcl' => "Una error de requèsta de banca de donadas s'es produsida.", 'databaseerror-query' => 'Requèsta : $1', 'databaseerror-function' => 'Foncion : $1', 'databaseerror-error' => 'Error : $1', @@ -746,6 +748,9 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI 'userlogin-resetpassword-link' => 'Reïnicializar lo senhal', 'helplogin-url' => 'Help:Connexion', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a la connexion]]', +'userlogin-loggedin' => 'Sètz ja connectat en tant que {{GENDER:$1|$1}}. +Utilizatz lo formulari çaijós per vos connectar amb un autre utilizaire.', +'userlogin-createanother' => 'Crear un autre compte', 'createacct-join' => 'Entratz vòstras informacions çaijós.', 'createacct-another-join' => 'Picar las informacions del novèl compte çaijós.', 'createacct-emailrequired' => 'Adreça electronica', @@ -1505,6 +1510,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi 'prefs-displaywatchlist' => "Opcions d'afichatge", 'prefs-tokenwatchlist' => 'Geton', 'prefs-diffs' => 'Diferéncias', +'prefs-help-prefershttps' => 'Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.', # User preference: email validation using jQuery 'email-address-validity-valid' => "L'adreça electronica sembla bona", @@ -1531,6 +1537,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi 'userrights-notallowed' => "Avètz pas la permission d'apondre o suprimir de dreches d'utilizaire.", 'userrights-changeable-col' => 'Los gropes que podètz cambiar', 'userrights-unchangeable-col' => 'Los gropes que podètz pas cambiar', +'userrights-conflict' => "Conflicte de modificacion de dreches d'utilizaire ! Relegissètz e confirmatz vòstras modificacions.", # Groups 'group' => 'Grop :', @@ -1659,8 +1666,8 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi 'action-block' => 'blocar aqueste utilizaire a l’edicion', 'action-protect' => 'modificar los nivèls de proteccion per aquesta pagina', 'action-rollback' => "anullar rapidament las modificacions del darrièr utilizaire qu'a modificat una pagina donada", -'action-import' => 'importar aquesta pagina a partir d’un autre wiki', -'action-importupload' => 'importar aquesta pagina e partir de l’impòrt d’un fichièr', +'action-import' => 'importar de paginas dempuèi un autre wiki', +'action-importupload' => 'importar de paginas dempuèi un fichièr telecargat', 'action-patrol' => 'marcar la modificacion dels autres coma patrolhada', 'action-autopatrol' => 'aver vòstra modificacion marcada coma patrolhada', 'action-unwatchedpages' => 'veire la lista de las paginas pas susvelhadas', @@ -2175,6 +2182,7 @@ Las entradas barradas son estadas resolgudas.', 'listusers' => 'Lista dels participants', 'listusers-editsonly' => "Far veire sonque los utilizaires qu'an al mens una contribucion", 'listusers-creationsort' => 'Triar per data de creacion', +'listusers-desc' => 'Triar en òrdre descendent', 'usereditcount' => '$1 {{PLURAL:$1|cambiament|cambiaments}}', 'usercreated' => '{{GENDER:$3|Creat}} lo $1 a $2', 'newpages' => 'Paginas novèlas', @@ -2435,10 +2443,12 @@ Vejatz $2 per una lista de las supressions recentas.', 'deletecomment' => 'Motiu :', 'deleteotherreason' => 'Motius suplementaris o autres :', 'deletereasonotherlist' => 'Autre motiu', -'deletereason-dropdown' => "*Motius de supression mai corrents -** Demanda de l'autor -** Violacion dels dreches d'autor -** Vandalisme", +'deletereason-dropdown' => '* Motius de supression los mai corrents +** Corrièrs indesirables +** Vandalisme +** Violacion dels dreches d’autor +** Demanda de l’autor +** Redireccion copada', 'delete-edit-reasonlist' => 'Modifica los motius de la supression', 'delete-toobig' => "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}. La supression de talas paginas es estada limitada per evitar de perturbacions accidentalas de {{SITENAME}}.", @@ -2460,7 +2470,7 @@ qualqu’un mai ja a modificat o revocat la pagina. La darrièra modificacion es estada efectuada per [[User:$3|$3]] ([[User talk:$3|Discutir]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", 'editcomment' => "Lo resumit de la modificacion èra : « ''$1'' ».", 'revertpage' => 'Anullacion de las modificacions de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) cap a la darrièra version de [[User:$1|$1]]', -'revertpage-nouser' => 'Revocacion de las modificacions per un d’utilizaire amagat a la darrièra version per [[User:$1|$1]]', +'revertpage-nouser' => 'Revocacion de las modificacions per un utilizaire amagat a la darrièra version per {{GENDER:$1|[[User:$1|$1]]}}', 'rollback-success' => 'Anullacion de las modificacions de $1 ; retorn a la version de $2.', # Edit tokens @@ -2481,6 +2491,7 @@ Consultatz la [[Special:ProtectedPages|lista de las paginas protegidas]] per la 'protect-title-notallowed' => 'Veire lo nivèl de proteccion de « $1 »', 'prot_1movedto2' => 'a renomenat [[$1]] en [[$2]]', 'protect-badnamespace-title' => 'Espaci de noms pas protegible', +'protect-badnamespace-text' => 'Las paginas dins aqueste espaci de noms pòdon pas èsser protegidas.', 'protect-norestrictiontypes-title' => 'Pagina pas protegibla', 'protect-legend' => 'Confirmar la proteccion', 'protectcomment' => 'Rason :', @@ -2593,7 +2604,7 @@ $1", 'contributions' => "Contribucions de l'{{GENDER:$1|utilizaire|utilizaira}}", 'contributions-title' => 'Lista de las contribucions de l’utilizaire $1', 'mycontris' => 'Contribucions', -'contribsub2' => 'Lista de las contribucions de $1 ($2). Las paginas que son estadas escafadas son pas afichadas.', +'contribsub2' => 'Per {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Cap de modificacion correspondenta a aquestes critèris es pas estada trobada.', 'uctop' => '(actual)', 'month' => 'A partir del mes (e precedents) :', @@ -2745,11 +2756,8 @@ Consultatz la [[Special:BlockList|lista dels utilizaires blocats]] per veire los 'ipb_blocked_as_range' => "Error : L'adreça IP $1 es pas estada blocada dirèctament e doncas pòt pas èsser deblocada. Çaquelà, es estada blocada per la plaja $2 la quala pòt èsser deblocada.", 'ip_range_invalid' => 'Plaja IP incorrècta.', 'ip_range_toolarge' => 'Los blocatges de plajas mai grandas que /$1 son pas autorizadas.', -'blockme' => 'Blocatz-me', 'proxyblocker' => 'Blocaire de mandatari (proxy)', -'proxyblocker-disabled' => 'Aquesta foncion es desactivada.', 'proxyblockreason' => "Vòstra ip es estada blocada perque s’agís d’un proxy dobèrt. Mercé de contactar vòstre fornidor d’accès internet o vòstre supòrt tecnic e de l’informar d'aqueste problèma de seguretat.", -'proxyblocksuccess' => 'Acabat.', 'sorbsreason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.', 'sorbs_create_account_reason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}. Podètz pas crear un compte', @@ -2947,6 +2955,7 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.", 'import-token-mismatch' => 'Pèrda de las donadas de sesilha. Tornatz ensajar.', 'import-invalid-interwiki' => "Impossible d'importar dempuèi lo wiki especificat.", 'import-options-wrong' => '{{PLURAL:$2|Marrida opcion|Marridas opcions}} : $1', +'import-rootpage-invalid' => 'La pagina raiç provesida es un títol invalid.', # Import log 'importlogpage' => 'Istoric de las importacions de paginas', @@ -2959,6 +2968,7 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.", # JavaScriptTest 'javascripttest' => 'Tèst de JavaScript', 'javascripttest-title' => 'Execucion dels tèsts $1', +'javascripttest-pagetext-noframework' => "Aquesta pagina es reservada per l'execucion dels tèsts JavaScript.", 'javascripttest-pagetext-unknownframework' => 'Estructura « $1 » desconeguda.', 'javascripttest-pagetext-frameworks' => 'Causissètz una de las estructuras de tèst seguentas : $1', 'javascripttest-pagetext-skins' => 'Causissètz un abilhatge amb lo qual cal aviar los tèsts :', @@ -3073,6 +3083,8 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit 'spam_reverting' => 'Restabliment de la darrièra version que conten pas de ligam cap a $1', 'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas', 'spam_deleting' => 'Totas las versions contenonián de ligams cap a $1, supression', +'simpleantispam-label' => "Verificacion antispam. +Inscriviscatz '''PAS RES''' dedins !", # Info page 'pageinfo-title' => 'Informacions per « $1 »', @@ -3899,7 +3911,10 @@ Ensajatz la previsualizacion normala.', 'tags-tag' => 'Nom de la balisa', 'tags-display-header' => 'Aparéncia dins las listas de modificacions', 'tags-description-header' => 'Descripcion completa de la balisa', +'tags-active-header' => 'Actiu ?', 'tags-hitcount-header' => 'Modificacions balisadas', +'tags-active-yes' => 'Òc', +'tags-active-no' => 'Non', 'tags-edit' => 'modificar', 'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiaments}}', @@ -3920,6 +3935,7 @@ Ensajatz la previsualizacion normala.', 'dberr-problems' => 'O planhèm ! Aqueste site rencontra de dificultats tecnicas.', 'dberr-again' => "Ensajatz d'esperar qualques minutas e tornatz cargar.", 'dberr-info' => '(Se pòt pas connectar al servidor de la banca de donadas : $1)', +'dberr-info-hidden' => '(Connexion al servidor de la banca de donadas impossibla)', 'dberr-usegoogle' => 'Podètz ensajar de cercar amb Google pendent aqueste temps.', 'dberr-outofdate' => 'Notatz que lors indèxes de nòstre contengut pòdon èsser depassats.', 'dberr-cachederror' => 'Aquò es una còpia amagada de la pagina demandada e pòt èsser depassada.', @@ -4011,8 +4027,12 @@ Ensajatz la previsualizacion normala.', 'api-error-filetype-missing' => "L'extension del fichièr es mancanta.", 'api-error-hookaborted' => "La modificacion qu'avètz ensajat de realizar es estada anullada per una extension.", 'api-error-illegal-filename' => 'Lo nom del fichièr es pas autorizat.', +'api-error-mustbeloggedin' => 'Vos cal èsser connectat per telecargar de fichièrs.', +'api-error-mustbeposted' => 'Error intèrna : aquesta requèsta necessita lo metòde HTTP POST.', 'api-error-nomodule' => 'Error intèrna : cap de modul de versament pas definit.', 'api-error-ok-but-empty' => 'Error intèrna : Lo servidor a pas respondut.', +'api-error-overwrite' => 'Espotir un fichièr existent es pas autorizat.', +'api-error-stashfailed' => 'Error intèrna : lo servidor a pas pogut enregistrar lo fichièr temporari.', 'api-error-unclassified' => "Una error desconeguda s'es producha.", 'api-error-unknown-code' => 'Error desconeguda : « $1 »', 'api-error-unknown-warning' => 'Avertiment desconegut : $1', @@ -4042,9 +4062,9 @@ Ensajatz la previsualizacion normala.', 'limitreport-ppvisitednodes' => 'Nombre de nosèls de preprocessor visitats', 'limitreport-ppgeneratednodes' => 'Nombre de nosèls de preprocessor generats', 'limitreport-postexpandincludesize' => 'Talha d’inclusion aprèp espandiment', -'limitreport-postexpandincludesize-value' => '$1/$2 octets', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}', 'limitreport-templateargumentsize' => 'Talha de l’argument del modèl', -'limitreport-templateargumentsize-value' => '$1/$2 octets', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}', 'limitreport-expansiondepth' => 'Mai granda prigondor d’espandiment', 'limitreport-expensivefunctioncount' => 'Nombre de foncions d’analisi costosas', diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php index cb687eb077..4d8a75b43c 100644 --- a/languages/messages/MessagesOr.php +++ b/languages/messages/MessagesOr.php @@ -2732,12 +2732,9 @@ $1ର ଅଟକ ପାଇଁ ଦିଆଯାଇଥିବା କାରଣଟି ଏହା, $2 ଭିତରେ ଥିବାରୁ ତାହାକୁ ଅଟକରୁ ଛାଡ଼ କରାଯାଇପାରିବ ନାହିଁ ।', 'ip_range_invalid' => 'ଅଚଳ IP ସୀମା ।', 'ip_range_toolarge' => '/$1 ଠାରୁ ବଡ଼ ସୀମା ଅଟକ ଅନୁମୋଦିତ ନୁହେଁ ।', -'blockme' => 'ମୋତେ ଅଟକାଇବେ', 'proxyblocker' => 'ପ୍ରକ୍ସି ଅଟକ', -'proxyblocker-disabled' => 'ଏହି କାମଟି ଅଚଳ କରାଯାଇଅଛି ।', 'proxyblockreason' => 'ଏକ ଖୋଲା ପ୍ରକ୍ସି ହୋଇଥିବାରୁ ଆପଣଙ୍କ IP ଠିକଣାଟିକୁ ଅଟକାଇଦିଆଗଲା । ଦୟାକରି ଆପଣଙ୍କ ଇଣ୍ଟରନେଟ ସେବାପ୍ରଦାନକାରୀ, କାରିଗରି ସହଯୋଗ କିମ୍ବା ସଙ୍ଗଠନ ସହିତ କଥା ହୋଇ ଏହି ବିରାଟ ଅସୁବିଧା ବାବଦରେ ବତାଇଦିଅନ୍ତୁ ।', -'proxyblocksuccess' => 'ଶେଷ ହେଲା ।', 'sorbsreason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।', 'sorbs_create_account_reason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି । ଆପଣ ନୂଆ ଖାତାଟିଏ ଖୋଲି ପାରିବେ ନାହିଁ', @@ -3083,6 +3080,8 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 'spam_reverting' => '$1 ସହ ଯୋଡ଼ା ନଥିବା ଶେଷ ସଂସ୍କରଣକୁ ଲେଉଟାଇ ଦେଉଅଛୁଁ', 'spam_blanking' => '$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା', 'spam_deleting' => '$1 ସହ ଯୋଡ଼ାଥିବା ସବୁଯାକ ସଂସ୍କରଣ ଖାଲି କରିଦିଆଗଲା', +'simpleantispam-label' => "ସ୍ପାମ-ବିରୋଧି ପରଖ । +ଏହାକୁ ଭରନ୍ତୁ '''ନାହିଁ''' !", # Info page 'pageinfo-title' => '"$1"ର ବିବରଣୀ', diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php index 270fa0dfc5..92d65983c4 100644 --- a/languages/messages/MessagesPa.php +++ b/languages/messages/MessagesPa.php @@ -698,8 +698,8 @@ $2', 'emailnotauthenticated' => 'ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਹਾਲੇ ਤਸਕਦੀਕ ਨਹੀਂ ਹੋਇਆ। ਹੇਠ ਦਿੱਤੇ ਫੀਚਰਾਂ ਲਈ ਕੋਈ ਵੀ ਈਮੇਲ ਨਹੀਂ ਭੇਜੀ ਜਾਵੇਗੀ।', 'noemailprefs' => 'ਇਹਨਾਂ ਸਹੂਲਤਾਂ ਦੀ ਵਰਤੋਂ ਲਈ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿਚ ਇਕ ਈ-ਮੇਲ ਪਤਾ ਦਿਓ।', 'emailconfirmlink' => 'ਆਪਣਾ ਈਮੇਲ ਪਤਾ ਤਸਦੀਕ ਕਰਾਓ', -'invalidemailaddress' => 'ਈ-ਮੇਲ ਪਤਾ ਕਬੂਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਲਿਖਿਆ ਨਹੀਂ ਜਾਪਦਾ ਹੈ। -ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਓ ਜਾਂ ਇਹ ਖ਼ਾਨਾ ਖ਼ਾਲੀ ਛੱਡ ਦਿਓ।', +'invalidemailaddress' => 'ਈਮੇਲ ਪਤਾ ਕਬੂਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਲਿਖਿਆ ਨਹੀਂ ਜਾਪਦਾ ਹੈ। +ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਲਿਖੋ ਜਾਂ ਇਹ ਖ਼ਾਨਾ ਖ਼ਾਲੀ ਛੱਡ ਦਿਓ।', 'cannotchangeemail' => 'ਇਸ ਵਿਕੀ ਤੇ ਈ-ਮੇਲ ਪਤੇ ਬਦਲੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।', 'emaildisabled' => 'ਇਹ ਸਾਈਟ ਈ-ਮੇਲਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀ।', 'accountcreated' => 'ਖਾਤਾ ਬਣਾਇਆ', @@ -1240,7 +1240,7 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।', 'gender-female' => 'ਉਹ ਵਿਕੀ ਸਫ਼ੇ ਸੋਧਦੀ ਹੈ', 'email' => 'ਈਮੇਲ', 'prefs-help-realname' => 'ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ, ਅਤੇ ਜੇ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।', -'prefs-help-email' => 'ਤੁਹਾਡੀ ਮਰਜੀ ਹੈ ਈਮੇਲ ਪਤਾ ਦਿਓ ਜਾਂ ਨਾ ਦਿਓ ਪਰ ਪਾਸਵਰਡ ਭੁੱਲ ਜਾਣ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਜਰੂਰੀ ਹੈ।', +'prefs-help-email' => 'ਈਮੇਲ ਪਤਾ ਦੇਣਾ ਤੁਹਾਡੀ ਮਰਜ਼ੀ ਹੈ, ਦਿਓ ਜਾਂ ਨਾ ਦਿਓ ਪਰ ਪਾਸਵਰਡ ਭੁੱਲ ਜਾਣ ਤੇ ਨਵਾਂ ਪਾਸਵਰਡ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਜ਼ਰੂਰੀ ਹੈ।', 'prefs-help-email-others' => 'ਤੁਸੀਂ ਇਹ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ ਕਿ ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ ਜਾਂ ਚਰਚਾ ਪੰਨੇ ਤੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜ ਸਕਣ? ਜਦੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।', 'prefs-help-email-required' => 'ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।', @@ -2081,8 +2081,6 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ 'ipb-otherblocks-header' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}', 'unblock-hideuser' => 'ਤੁਸੀਂ ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਕਿਉਂਕਿ ਇਸਦਾ ਮੈਂਬਰ-ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ ਹੈ।', 'ipb_cant_unblock' => 'ਗ਼ਲਤੀ: ਪਾਬੰਦੀ ਪਤਾ $1 ਨਹੀਂ ਲੱਭਿਆ। ਸ਼ਾਇਦ ਇਹ ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀ-ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ।', -'blockme' => 'ਮੇਰੇ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ', -'proxyblocksuccess' => 'ਪੂਰਾ ਹੋਇਆ', 'cant-block-while-blocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਜਦੋਂ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ।', 'ipbblocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਜਾਂ ਪਾਬੰਦੀ-ਮੁਕਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ', 'ipbnounblockself' => 'ਤੁਹਾਨੂੰ ਖ਼ੁਦ ਨੂੰ ਪਾਬੰਦੀ-ਮੁਕਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ', @@ -2562,6 +2560,8 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ 'confirmemail_send' => 'ਇੱਕ ਤਸਦੀਕੀ ਕੋਡ ਭੇਜੋ', 'confirmemail_sent' => 'ਤਸਦੀਕੀ ਈਮੇਲ ਭੇਜੀ ਗਈ।', 'confirmemail_invalid' => 'ਗਲਤ ਪੁਸ਼ਟੀ ਕੋਡ ਹੈ। ਕੋਡ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੋ ਸਕਦੀ ਹੈ।', +'confirmemail_success' => 'ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਤਸਦੀਕ ਹੋ ਚੁੱਕਾ ਹੈ। +ਤੁਸੀਂ ਹੁਣ [[Special:UserLogin|ਲਾਗਇਨ]] ਕਰ ਕੇ ਵਿਕੀ ਦਾ ਮਜ਼ਾ ਸਕਦੇ ਹੋ।', 'confirmemail_loggedin' => 'ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਹੁਣ ਤਸਦੀਕ ਹੋ ਚੁੱਕਾ ਹੈ।', 'confirmemail_subject' => '{{SITENAME}} ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ', 'confirmemail_invalidated' => 'ਈਮੇਲ ਪਤੇ ਦੀ ਤਸਦੀਕੀ ਰੱਦ ਕੀਤੀ ਗਈ', @@ -2613,17 +2613,21 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ ਸਧਾਰਨ ਝਲਕ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।', # Watchlist editor -'watchlistedit-noitems' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ ਹਨ।', +'watchlistedit-numitems' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਤੋਂ ਬਿਨਾਂ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ {{PLURAL:$1|1 ਸਿਰਲੇਖ ਹੈ|$1 ਸਿਰਲੇਖ ਹਨ}}।', +'watchlistedit-noitems' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ ਹਨ।', 'watchlistedit-normal-title' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ', -'watchlistedit-normal-legend' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਤੋਂ ਸਿਰਲੇਖ ਹਟਾਓ', +'watchlistedit-normal-legend' => 'ਸਿਰਲੇਖਾਂ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਹਟਾਓ', 'watchlistedit-normal-submit' => 'ਸਿਰਲੇਖ ਹਟਾਓ', +'watchlistedit-normal-done' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ {{PLURAL:$1|1 ਸਿਰਲੇਖ ਹਟਾਇਆ ਗਿਆ|$1 ਸਿਰਲੇਖ ਹਟਾਏ ਗਏ}}:', 'watchlistedit-raw-title' => 'ਕੱਚੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸੋਧੋ', -'watchlistedit-raw-legend' => 'ਕੱਚੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਸੋਧੋ', +'watchlistedit-raw-legend' => 'ਕੱਚੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ', +'watchlistedit-raw-explain' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਮੌਜੂਦ ਸਫ਼ੇ ਹਟਾਏ ਜਾਂ ਹੋਰ ਜੋੜੇ ਜਾ ਸਕਦੇ ਹਨ। ਹਟਾਉਣ ਜਾਂ ਜੋੜਨ ਤੋਂ ਬਾਅਦ "{{int:Watchlistedit-raw-submit}}" ’ਤੇ ਕਲਿੱਕ ਕਰੋ। +ਤੁਸੀਂ [[Special:EditWatchlist|ਮਿਆਰੀ ਐਡੀਟਰ]] ਵੀ ਵਰਤ ਸਕਦੇ ਹੋ।', 'watchlistedit-raw-titles' => 'ਸਿਰਲੇਖ:', 'watchlistedit-raw-submit' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਤਾਜ਼ੀ ਕਰੋ', -'watchlistedit-raw-done' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨ-ਸੂਚੀ ਅੱਪਡੇਟ ਹੋ ਗਈ ਹੈ।', -'watchlistedit-raw-added' => '{{PLURAL:$1|1 title was|$1 titles were}} ਸ਼ਾਮਲ:', -'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 titles were}} ਹਟਾਓ:', +'watchlistedit-raw-done' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਅੱਪਡੇਟ ਹੋ ਗਈ ਹੈ।', +'watchlistedit-raw-added' => '{{PLURAL:$1|1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤਾ|$1 ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕੀਤੇ}}:', +'watchlistedit-raw-removed' => '{{PLURAL:$1|1 ਸਿਰਲੇਖ ਹਟਾਇਆ|$1 ਸਿਰਲੇਖ ਹਟਾਏ}}:', # Watchlist editing tools 'watchlisttools-view' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ ਵੇਖੋ', diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php index 572a001a2a..0788b053a3 100644 --- a/languages/messages/MessagesPam.php +++ b/languages/messages/MessagesPam.php @@ -1655,12 +1655,9 @@ Lon me ing [[Special:BlockList|IP block list]] para king tala da reng kasalungsu 'ipb_blocked_as_range' => 'Mali: E diretsung makasabat ing IP $1, at e maliaring ilako pangasabat. Pero makasabat ya antimong kayabe king range $2, a maliaring ilako pangasabat.', 'ip_range_invalid' => 'E matatanggap a IP range.', -'blockme' => 'Sabatan muku', 'proxyblocker' => 'Maniabat a proxy', -'proxyblocker-disabled' => 'Makapatda (disabled) ya ing gamit (function) a ini.', 'proxyblockreason' => 'Mesabat ya ing kekang IP address uling metung yang open proxy. Pakiyaus me ing kekang Internet service provider o tech support at pabaluan me kaniting mabayat a prublema king seguridad.', -'proxyblocksuccess' => 'Merapat na.', 'sorbsreason' => 'Makalista ya ing kekang IP address antimong open proxy king DNSBL a gagamitan ning {{SITENAME}}.', 'sorbs_create_account_reason' => 'Makalista yang open proxy king DNSBL a gagamitan ning {{SITENAME}} ing kekang IP address. E ka maliaring maglalang account.', diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php index 25ddedf012..4d12a58890 100644 --- a/languages/messages/MessagesPdc.php +++ b/languages/messages/MessagesPdc.php @@ -790,7 +790,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.', 'infiniteblock' => 'fer immer', 'blocklink' => 'Aabinne', 'contribslink' => 'Ardickele', -'proxyblocksuccess' => 'Geduh.', # Move page 'move-page' => '„$1“ ziehe', @@ -935,7 +934,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.', # Separators for various lists, etc. 'ellipsis' => '…', -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← letscht Blatt', diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php index 839037b685..5614ffc854 100644 --- a/languages/messages/MessagesPl.php +++ b/languages/messages/MessagesPl.php @@ -769,6 +769,9 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].', 'userlogin-resetpassword-link' => 'Nie pamiętasz hasła?', 'helplogin-url' => 'Help:Logowanie', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc z logowaniem]]', +'userlogin-loggedin' => 'Zalogowano jako {{GENDER:$1|$1}}. +Użyj poniższego formularza, aby zalogować się jako inny użytkownik.', +'userlogin-createanother' => 'Załóż nowe konto', 'createacct-join' => 'Wpisz poniżej swoje dane.', 'createacct-another-join' => 'Wprowadź szczegóły nowego konta poniżej.', 'createacct-emailrequired' => 'Adres e‐mail', @@ -1278,7 +1281,7 @@ wybrana wersja nie istnieje lub próbowano ukryć wersję bieżącą.', 'logdelete-selected' => "'''Zaznaczone {{PLURAL:$1|zdarzenie|zdarzenia}} z rejestru:'''", 'revdelete-text' => "'''Usunięte wersje i czynności będą nadal widoczne w historii strony i rejestrach, ale ich treść nie będzie publicznie dostępna.''' Inni administratorzy {{GRAMMAR:D.lp|{{SITENAME}}}} nadal będą mieć dostęp do ukrytych treści oraz będą mogli je odtworzyć używając standardowych mechanizmów, chyba że nałożono dodatkowe ograniczenia.", -'revdelete-confirm' => 'Potwierdź, że chcesz to zrobić, rozumiesz konsekwencje oraz że robisz to zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]].', +'revdelete-confirm' => 'Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.', 'revdelete-suppress-text' => "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji: * Ujawnienie danych osobowych *: ''adres domowy, numer telefonu, numer PESEL itp''", @@ -2687,7 +2690,7 @@ $1', 'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}', 'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1', 'mycontris' => 'Edycje', -'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}}$1 ($2)', +'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)', 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.', 'uctop' => '(ostatnia)', 'month' => 'Do miesiąca (włącznie)', @@ -2845,12 +2848,9 @@ By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:Blo Należy on do zablokowanego zakresu adresów $2. Odblokować można tylko cały zakres.', 'ip_range_invalid' => 'Niepoprawny zakres adresów IP.', 'ip_range_toolarge' => 'Zakresy IP większe niż /$1 są niedozwolone.', -'blockme' => 'Zablokuj mnie', 'proxyblocker' => 'Blokowanie proxy', -'proxyblocker-disabled' => 'Ta funkcja jest wyłączona.', 'proxyblockreason' => 'Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy. O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.', -'proxyblocksuccess' => 'Wykonano.', 'sorbsreason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.', 'sorbs_create_account_reason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}. Nie możesz utworzyć konta', @@ -3212,6 +3212,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int 'spam_reverting' => 'Przywracanie ostatniej wersji nie zawierającej linków do $1', 'spam_blanking' => 'Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.', 'spam_deleting' => 'Wszystkie wersje zawierały linki do $1, usuwam.', +'simpleantispam-label' => "Filtr antyspamowy. +'''NIE''' wpisuj tu nic!", # Info page 'pageinfo-title' => 'Informacje o „$1“', @@ -3891,7 +3893,7 @@ Czy na pewno chcesz ją ponownie utworzyć?", 'confirm-unwatch-top' => 'Usunąć tę stronę z listy obserwowanych?', # Separators for various lists, etc. -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← poprzednia strona', @@ -4099,7 +4101,7 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene 'tag-filter-submit' => 'Filtr', 'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Znacznik|Znaczniki}}]]: $2)', 'tags-title' => 'Znaczniki', -'tags-intro' => 'Na tej stronie znajduje się lista wzorców tekstu, dla których oprogramowanie może oznaczyć edycje, dodatkowo wskazując ich znaczenie.', +'tags-intro' => 'Na tej stronie znajduje się lista znaczników, którymi oprogramowanie może oznaczyć edycje, oraz ich opisów.', 'tags-tag' => 'Nazwa znacznika', 'tags-display-header' => 'Wystąpienia na listach zmian', 'tags-description-header' => 'Pełny opis znaczenia', diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php index 57ba7ef4f6..c709598024 100644 --- a/languages/messages/MessagesPms.php +++ b/languages/messages/MessagesPms.php @@ -260,7 +260,7 @@ $messages = array( 'articlepage' => 'Vëdde la pàgina ëd contnù', 'talk' => 'Discussion', 'views' => 'Vìsite', -'toolbox' => "Bòita dj'utiss", +'toolbox' => 'Utiss', 'userpage' => 'Che a varda la pàgina Utent', 'projectpage' => 'Che a varda la pàgina ëd proget', 'imagepage' => "Vëdde la pàgina dl'archivi", @@ -808,68 +808,67 @@ test ch'a-i é già. Sossì dle vire a riva quand un a deuvra un servent anònim 'edit_form_incomplete' => "'''Chèiche part dël formolari ëd modìfica a son pa rivà al servent; ch'a contròla për da bin che soe modìfiche a-i sio ancora e ch'a preuva torna.'''", 'editing' => 'Modìfica ëd $1', 'creating' => 'Creé $1', -'editingsection' => 'I soma dapress a modifiché $1 (session)', -'editingcomment' => 'I soma dapress a modifiché $1 (neuva session)', -'editconflict' => "Conflit d'edission: $1", -'explainconflict' => "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentré che chiel (chila) as prontava la soa. +'editingsection' => 'Modìfica ëd $1 (session)', +'editingcomment' => 'Modìfica ëd $1 (neuva session)', +'editconflict' => 'Conflit ëd modìfica: $1', +'explainconflict' => "Cheidun d'àutr a l'ha salvà soa version dl'artìcol antramentre che chiel as prontava la soa. Ël quàder ëd modìfica dë dzora a mostra ël test ëd l'artìcol coma a resta adess (visadì, lòn che a-i é ant sla Ragnà). Soe modìfiche a stan ant ël quàder dë sota. Ën volend a peul gionté soe modìfiche ant ël quàder dë dzora. '''Mach''' ël test ant ël quàder dë dzora a sarà salvà, ën sgnacand ël boton \"{{int:savearticle}}\".", 'yourtext' => 'Sò test', -'storedversion' => 'Version memorisà', -'nonunicodebrowser' => "'''A L'EUJ! Sò programa ëd navigassion (browser) a travaja pa giust con lë stàndard unicode. I soma obligà a dovré dij truschin përchè a peula salvesse sò artìcoj sensa problema: ij caràter che a son nen ASCII a jë s-ciairerà ant ël quàder ëd modìfica test coma còdes esadecimaj.'''", -'editingold' => "'''CHE A FASA MACH ATENSION: che a sta fasend-je dle modìfiche a na version nen agiornà dl'artìcol.
      +'storedversion' => 'La version memorisà', +'nonunicodebrowser' => "'''A L'EUJ! Sò programa ëd navigassion a marcia pa giust con lë stàndard Unicode. I soma obligà a dovré dij truschin përchè a peula salvesse sò artìcoj sensa problema: ij caràter che a son nen ASCII a jë s-ciairerà ant ël quàder ëd modìfica dël test coma còdes esadecimaj.'''", +'editingold' => "'''CHE A FASA MACH ATENSION: che a l'é an camin ch'a modìfica na version nen agiornà dl'artìcol.
      Se a la salva parèj, lòn che a l'era stàit fàit dapress a sta revision-sì as perdrà d'autut.'''", 'yourdiff' => 'Diferense', -'copyrightwarning' => "Che a ten-a për piasì present che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj). -Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ansima a {{SITENAME}}, ma pitòst che as lo pùblica ansima a un sò sit përsonal.
      -Ën mandand ës test-sì chiel (chila) as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel (daspërchila) coma original, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt, ò pura che chiel (chila) a l'ha arseivù autorisassion scrita a dovré sto test e che sòn a peul dimostrelo.
      -'''DOVRÉ PA MAI DËL MATERIAL COATÀ DA DRIT D'AUTOR (c) SENSA AVÈJ N'AUTORISASSION SCRITA PËR FELO!!!'''", -'copyrightwarning2' => "Për piasì, che a ten-a present che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da dj'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.
      -Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel (ò daspërchila), ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion). -'''CHE A MANDA PA DËL MATERIAL COATÀ DA DRIT D'AUTOR SENSA AVÈJ AVÙ ËL PËRMESS SCRIT DË FELO!'''", -'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobyte}} , che a resta pì che ël -lìmit màssim ëd {{PLURAL:$2|un kilobyte|$2 kilobyte}}. Parèj as peul pa salvesse.", -'readonlywarning' => "'''Avis: La base dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.''' +'copyrightwarning' => "Che a ten-a për piasì da ment che tute le contribussion a {{SITENAME}} as consìdero dàite sota a na licensa ëd la sòrt $2 (che a varda $1 për avèj pì 'd detaj). +Se a veul nen che sò test a peula esse modificà e distribuì da qualsëssìa përson-a sensa gnun-a limitassion ëd gnun-a sòrt, che a lo buta pa ambelessì.
      +Ën mandand ës test-sì chiel as fa garant sota soa responsabilità che ël test a l'ha scrivusslo despërchiel, ò pura che a l'ha tracopialo da na sorgiss ëd pùblich domini, ò da n'àutra sorgiss dla midema sòrt. +'''Anserì mai dël material coatà da drit d'autor sensa avèj n'autorisassion për felo!'''", +'copyrightwarning2' => "Për piasì, che a ten-a da ment che tute le contribussion a {{SITENAME}} a peulo esse modificà ò scancelà da d'àutri contributor. Se a veul nen che lòn che a scriv a ven-a modificà sensa limitassion ëd gnun-a sòrt, che a lo manda nen ambelessì.
      +Ant l'istess temp, ën mandand dël material un as pija la responsabilità dë dì che a l'ha scrivusslo daspërchiel, ò pura che a l'ha copialo da na sorgiss ëd domini pùblich, ò pura da 'nt n'àutra sorgiss dla midema sòrt (che a varda $1 për avèj pì d'anformassion). +'''Che a manda pa dël material coata da drit d'autor sensa avèj avù ël përmess ëd felo!'''", +'longpageerror' => "'''EROR: Ël test che a l'ha mandà a l'é longh {{PLURAL:$1|un kilobyte|$1 kilobytes}}, che a resta pì che ël lìmit màssim {{PLURAL:$2|d'un kilobyte|ëd $2 kilobyte}}.''' Parèj as peul pa salvesse.", +'readonlywarning' => "'''Avis: La base ëd dat a l'é stàita blocà për manutension, e donca a podrà pa salvesse soe modìfiche tut sùbit.''' A peul esse che a-j ven-a còmod copiesse via sò test e ancoless-lo an n'archivi ëd test e goernelo për pi tard. L'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1", -'protectedpagewarning' => "'''Avis: costa pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.''' +'protectedpagewarning' => "'''Avis: costa pàgina-sì a l'é stàita protegiùa an manera che mach j'utent con la qualìfica da aministrator a peulo feje dle modìfiche.''' L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:", 'semiprotectedpagewarning' => "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela. L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:", -'cascadeprotectedwarning' => "'''Tension:''' sta pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che {{PLURAL:\$1|a l'é proteta|a-i intra ant le pàgine protete}} col sistema \"a cascada\":", +'cascadeprotectedwarning' => "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:", 'titleprotectedwarning' => "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.''' L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:", -'templatesused' => '{{PLURAL:$1|Stamp|Stamp}} dovrà dzora a sta pàgina-sì:', -'templatesusedpreview' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta preuva-sì:', -'templatesusedsection' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta session-sì:', +'templatesused' => '{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:', +'templatesusedpreview' => '{{PLURAL:$1|Stamp}} dovrà an costa preuva:', +'templatesusedsection' => '{{PLURAL:$1|Stamp}} dovrà an costa session-sì:', 'template-protected' => '(protet)', 'template-semiprotected' => '(mes-protet)', 'hiddencategories' => 'Sta pàgina-sì a fa part ëd {{PLURAL:$1|na categorìa|$1 categorìe}} stërmà:', -'edittools' => "", -'nocreatetext' => "Cost sit-sì a l'ha limità la possibilità ëd creé dle pàgine neuve. +'edittools' => "", +'nocreatetext' => "{{SITENAME}} a l'ha limità la possibilità ëd creé dle pàgine neuve. A peul torné andaré e modifiché na pàgina che a-i é già, ò pura [[Special:UserLogin|rintré ant ël sistema ò deurb-se un cont]].", -'nocreate-loggedin' => "A l'ha pa ij përmess për creé dle pàgine neuve.", -'sectioneditnotsupported-title' => "La modìfica dla session a l'é nen prevëdùa", -'sectioneditnotsupported-text' => "La modìfica dla session a l'é nen prevëdùa an costa pàgina ëd modìfica.", +'nocreate-loggedin' => "A l'ha pa ël përmess ëd creé dle pàgine neuve.", +'sectioneditnotsupported-title' => "La modìfica ëd session a l'é nen mantnùa", +'sectioneditnotsupported-text' => "La modìfica ëd na session a l'é nen mantnùa për costa pàgina.", 'permissionserrors' => 'Eror ant ij përmess', -'permissionserrorstext' => "A l'ha pa ij përmess dont a fa da manca për {{PLURAL:$1|via che|via che}}:", -'permissionserrorstext-withaction' => "It l'has nen ij përmess për $2, për {{PLURAL:$1|cost motiv|costi motiv}}:", -'recreate-moveddeleted-warn' => "A l'é an camin ch'a crea torna na pàgina ch'a l'era stàita scancelà.''' +'permissionserrorstext' => "A l'ha pa ij përmess dont a fa da manca për {{PLURAL:$1|via che}}:", +'permissionserrorstext-withaction' => "A l'ha nen ij përmess për $2, për {{PLURAL:$1|cost motiv|costi motiv}}:", +'recreate-moveddeleted-warn' => "'''Atension: a l'é an camin ch'a crea torna na pàgina ch'a l'era stàita scancelà.''' Ch'a varda d'esse sigur ch'a vala la pen-a ëd travajé an sna pàgina parèj. Për soa comodità i-j mostroma la lista djë scancelament ch'a toco sta pàgina-sì:", 'moveddeleted-notice' => "Sta pàgina-sì a l'é stàita scancelà. -Ël registr ëd le scancelassion e dij tramud a l'é arportà sota për arferiment.", -'log-fulllog' => 'Varda tut ël registr', +Ël registr ëd le scancelassion e dij tramud a l'é arportà sì-sota për arferiment.", +'log-fulllog' => 'Vëdde tut ël registr', 'edit-hook-aborted' => "Modìfica anulà da n'estension. -A-i é pa gnun-e spiegassion.", -'edit-gone-missing' => 'As peul nen modifiché la pàgina. +A-i é pa dë spiegassion.", +'edit-gone-missing' => 'As peul nen agiornesse la pàgina. A smija che a sia stàita scancelà.', -'edit-conflict' => "Conflit d'edission.", -'edit-no-change' => "Toa modìfica a l'é stàita ignorà, përchè a l'é pa stàit fàit gnun cambiament al test.", -'postedit-confirmation' => "Soa modìfica a l'é stàita salvà!", +'edit-conflict' => 'Conflit ëd modìfiche.', +'edit-no-change' => "Soa modìfica a l'é stàita ignorà, përchè gnun cambiament a l'é stàit fàit al test.", +'postedit-confirmation' => "Soa modìfica a l'é stàita salvà.", 'edit-already-exists' => 'As peul nen creesse la pàgina. A esist già.', 'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche", @@ -2569,12 +2568,9 @@ coj che sio ij blocagi ativ al dì d'ancheuj.", 'ipb_blocked_as_range' => "Eror: L'adrëssa IP $1 a l'ha gnun blocagi diret ansima e donca a peul pa esse dësblocà. A resta blocà mach për via ch'a l'é ciapà andrinta al ragg $2, e lolì as peul pa dësblochesse.", 'ip_range_invalid' => 'Nùmer IP nen bon.', 'ip_range_toolarge' => "Ij blocagi d'antërvaj pi gròss che /$1 a son pa përmëttù.", -'blockme' => 'Blòch-me', 'proxyblocker' => "Blocador dj'arpetitor", -'proxyblocker-disabled' => "Sta funsion-sì a l'é pa abilità.", 'proxyblockreason' => "Soa adrëssa IP a l'é stàita blocà përchè a l'é cola ëd n'arpetitor duvèrt. Për piasì che a contata sò fornitor ëd conession e che a lo anforma. As trata d'un problema ëd sigurëssa motobin serios.", -'proxyblocksuccess' => 'Bele fàit.', 'sorbsreason' => "Soa adrëssa IP a l'é listà coma arpetitor duvert (open proxy) ansima al DNSBL dovrà da {{SITENAME}}.", 'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor duvèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.", 'xffblockreason' => "N'adrëssa IP ant l'antestassion X-Forwarded-For, la soa o cola d'un servent fantasma che chiel a deuvra, a l'é stàita blocà. La rason dël blocagi inissial a l'era: $1", @@ -2928,6 +2924,8 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e 'spam_reverting' => "Butà andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1", 'spam_blanking' => "Pàgina dësvujdà, che tute le version a l'avìo andrinta dj'anliure a $1", 'spam_deleting' => 'Scancelà, dagià che tute le revision a contnisìo dle liure a $1', +'simpleantispam-label' => "Contròl contra la rumenta. +Compilé '''NEN''' sòn!", # Info page 'pageinfo-title' => 'Anformassion për «$1»', diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php index fceb4c7774..01de94dee3 100644 --- a/languages/messages/MessagesPnb.php +++ b/languages/messages/MessagesPnb.php @@ -2330,12 +2330,9 @@ $1', اینوں $2 دی رینج چ روکیا گیا، جینوں کھولیا جاسکدا اے۔', 'ip_range_invalid' => 'ناں منی جان والی آئی پی رینج۔', 'ip_range_toolarge' => 'رینج روکاں /$1 توں وڈیاں دی اجازت نئیں۔', -'blockme' => 'مینوں روکو', 'proxyblocker' => 'دوروں روکن والا', -'proxyblocker-disabled' => 'اس کم نوں روک دتا گیا اے۔', 'proxyblockreason' => 'تواڈا آئی پی پتہ تے روک لگادتی گئی جے کیوں جے اے اک کھلا پراکسی اے۔ مہربانی کرکے اپنے انٹرنٹ سروس دین والے نال یا تکنیکی مدد دین والے نال تے اوناں ایس بچاؤ خطرے بارے دسو۔', -'proxyblocksuccess' => 'ہوگیا۔', 'sorbsreason' => 'تیرا آئی پی پتہ اک کھلی پراکسی وانگوں دتا گیا اے ڈی این ایس بی ایل چ {{سائیٹناں}} نے۔', 'sorbs_create_account_reason' => 'تواڈا پتہ اک کھلا پراکسی لسٹ چ اے ڈی این ایس بی ایل نال {{سائیٹناں}} چ۔ تسیں اک کھاتہ نئیں کھول سکدے۔', @@ -2667,6 +2664,8 @@ $1', 'spambot_username' => 'میڈیاوکی سپام سفائی', 'spam_reverting' => 'آخری ریوین ول جیدے چ $1 دے جوڑ ناں ہون۔', 'spam_blanking' => 'سارے ریوین جناں چ $1 نوں جوڑ نیں، طاف کیتا جاریا اے۔', +'simpleantispam-label' => 'سپام روک پھاٹک +ایدے تے ناں لکھو۔', # Info page 'pageinfo-title' => '"$1" لئی جانکاری', diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php index 1d8834f5e6..ad44e5a535 100644 --- a/languages/messages/MessagesPnt.php +++ b/languages/messages/MessagesPnt.php @@ -1102,8 +1102,6 @@ $messages = array( 'blocklogentry' => 'εσπάλισεν [[$1]] για $2 $3', 'unblocklogentry' => 'άνοιγμαν ασπαλιγματί τη $1', 'block-log-flags-nocreate' => "ποίσιμον λογαρίας 'κ ίνεται", -'blockme' => 'Ασπάλισον με', -'proxyblocksuccess' => 'Εγέντον.', # Developer tools 'lockdb' => 'Ασπάλιγμαν βάσης δογμενίων', diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php index 51ec75c878..ebbde8044d 100644 --- a/languages/messages/MessagesPrg.php +++ b/languages/messages/MessagesPrg.php @@ -1855,10 +1855,7 @@ JaÄ«s en [[Special:BlockList|IP blōkisenin listin]] ki widālai wissans tēnti Sta ast, Å¡lāit, blōkitan kāigi delÄ«ks stesse $2 ebÄ«mtan, kawÄ«dan mazzi bÅ«twei etblōkitan.', 'ip_range_invalid' => 'Nitikrōmiskas IP ebÄ«mtan.', 'ip_range_toolarge' => 'EbÄ«mtas blōkisenei mÅ«iseisan nikāi /$1 ni ast preiēminan.', -'blockme' => 'Blōkis min', 'proxyblocker' => 'Proxy blōkisna', -'proxyblocker-disabled' => 'Å Ä« funkciōni ast izklaÅ«tan.', -'proxyblocksuccess' => 'SegÄ«tan.', 'sorbsreason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}.', 'sorbs_create_account_reason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}. TÅ« ni mazzi teÄ«ktun rekkenan', diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php index 378334fb82..60bef83832 100644 --- a/languages/messages/MessagesPs.php +++ b/languages/messages/MessagesPs.php @@ -652,7 +652,7 @@ $1', 'mailerror' => 'د برېښليک د لېږلو ستونزه: $1', 'acct_creation_throttle_hit' => 'د همدې ويکي کارنانو په وروستيو ورځو کې ستاسې د IP پتې په کارولو سره {{PLURAL:$1|1 گڼون|$1 گڼونونه}} جوړ کړي، چې دا په همدې مودې کې د گڼونونو د جوړولو تر ټولو ډېر شمېر دی چې اجازه يې ورکړ شوې. نو په همدې خاطر د اوس لپاره د همدې IP پتې کارنان نه شي کولای چې نور گڼونونه جوړ کړي.', -'emailauthenticated' => 'ستاسې برېښليک پته په $2 نېټه په $3 بجو د منلو وړ وګرځېده.', +'emailauthenticated' => 'ستاسې برېښليک پته په $2 نېټه په $3 بجو د منلو وړ وگرځېده.', 'emailnotauthenticated' => 'لا تر اوسه ستاسې برېښليک پته د منلو وړ نه ده ګرځېدلې. د لاندې ځانګړتياو لپاره به تاسې ته هېڅ کوم برېښليک و نه لېږل شي.', 'noemailprefs' => 'ددې لپاره چې دا کړنې کار وکړي نو تاسو يو برېښليک وټاکۍ.', 'emailconfirmlink' => 'د خپل د برېښليک پتې پخلی وکړی', @@ -2002,8 +2002,6 @@ $UNWATCHURL نه ليدنه وکړۍ 'ipb-needreblock' => 'پر $1 د پخوا نه بنديز لگېدلی. آيا تاسې د امستنو بدلول غواړۍ؟', 'ipb-otherblocks-header' => '{{PLURAL:$1|بل بنديز|نور بنديزونه}}', -'blockme' => 'پر ما بنديز لگول', -'proxyblocksuccess' => 'ترسره شو.', # Developer tools 'lockdb' => 'توکبنسټ تړل', diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php index 25fdbd5a52..fbc2dede39 100644 --- a/languages/messages/MessagesPt.php +++ b/languages/messages/MessagesPt.php @@ -655,6 +655,7 @@ Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{i Isto pode indicar um defeito no programa.', 'databaseerror-textcl' => 'Ocorreu um erro na consulta à base de dados.', 'databaseerror-query' => 'Consulta:$1', +'databaseerror-function' => 'Função: $1', 'databaseerror-error' => 'Erro: $1', 'laggedslavemode' => "'''Aviso:''' A página pode não conter as atualizações mais recentes.", 'readonly' => 'Base de dados bloqueada (limitada a leituras)', @@ -1391,6 +1392,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v 'compareselectedversions' => 'Comparar as versões selecionadas', 'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas', 'editundo' => 'desfazer', +'diff-empty' => '(Sem diferenças)', 'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})', 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})', 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}. @@ -1556,8 +1558,9 @@ Não deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.', 'yourgender' => 'Como prefere ser descrito?', 'gender-unknown' => 'Prefiro não dizer', 'gender-male' => 'Ele edita páginas wiki', -'gender-female' => 'Feminino', -'prefs-help-gender' => 'Opcional: usado pelo programa para ajuste das mensagens ao género do utilizador. +'gender-female' => 'Ela edita páginas wiki', +'prefs-help-gender' => 'Esta preferência é opcional. +O software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado. Esta informação será pública.', 'email' => 'Correio electrónico', 'prefs-help-realname' => 'O fornecimento do nome verdadeiro é opcional. @@ -1571,6 +1574,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu 'prefs-dateformat' => 'Formato de data', 'prefs-timeoffset' => 'Desvio horário', 'prefs-advancedediting' => 'Opções gerais', +'prefs-editor' => 'Editor', 'prefs-preview' => 'Antevisão', 'prefs-advancedrc' => 'Opções avançadas', 'prefs-advancedrendering' => 'Opções avançadas', @@ -1581,6 +1585,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu 'prefs-displaywatchlist' => 'Opções de apresentação', 'prefs-tokenwatchlist' => 'Chave', 'prefs-diffs' => 'Diferenças', +'prefs-help-prefershttps' => 'Esta preferência terá efeito no seu próximo início de sessão.', # User preference: email validation using jQuery 'email-address-validity-valid' => 'Parece válido', @@ -1607,7 +1612,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.', 'userrights-changeable-col' => 'Grupos que pode alterar', 'userrights-unchangeable-col' => 'Grupos que não pode alterar', -'userrights-conflict' => 'Conflito com os privilégios dos utilizadores! Por favor, aplique as suas mudanças novamente.', +'userrights-conflict' => 'Conflito entre alterações de privilégios de utilizador! Por favor, revise e confirme as suas mudanças.', 'userrights-removed-self' => 'Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.', # Groups @@ -1675,12 +1680,16 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu 'right-unblockself' => 'Desbloquearem-se a si próprios', 'right-protect' => 'Mudar níveis de proteção e editar páginas protegidas em cascata', 'right-editprotected' => 'Editar páginas protegidas como "{{int:protect-level-sysop}}"', +'right-editsemiprotected' => 'Editar páginas protegidas como "{{int:protect-level-autoconfirmed}}"', 'right-editinterface' => 'Editar a interface de utilizador', 'right-editusercssjs' => 'Editar os ficheiros CSS e JS de outros utilizadores', 'right-editusercss' => 'Editar os ficheiros CSS de outros utilizadores', 'right-edituserjs' => 'Editar os ficheiros JS de outros utilizadores', 'right-editmyusercss' => 'Editar os seus próprios ficheiros CSS de utilizador', 'right-editmyuserjs' => 'Editar os seus próprios ficheiros JavaScript de utilizador', +'right-viewmyprivateinfo' => 'Ver os seus próprios dados privados (ex.: endereço de e-mail, nome real)', +'right-editmyprivateinfo' => 'Editar os seus próprios dados privados (ex.: endereço de e-mail, nome real)', +'right-editmyoptions' => 'Editar as suas próprias preferências', 'right-rollback' => 'Reverter rapidamente as edições do último utilizador que editou uma página em particular', 'right-markbotedits' => 'Marcar edições revertidas como edições de bot', 'right-noratelimit' => 'Não ser afetado pelos limites de velocidade de operação', @@ -1732,8 +1741,8 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu 'action-block' => 'impedir este utilizador de editar', 'action-protect' => 'alterar os níveis de proteção desta página', 'action-rollback' => 'reverter rapidamente as edições do último utilizador que editou uma dada página', -'action-import' => 'importar esta página a partir de outra wiki', -'action-importupload' => 'importar esta página a partir de um ficheiro xml', +'action-import' => 'importar páginas a partir de outra wiki', +'action-importupload' => 'importar páginas por meio do envio de um ficheiro', 'action-patrol' => 'marcar as edições de outros utilizadores como patrulhadas', 'action-autopatrol' => 'marcar como patrulhadas as suas próprias edições', 'action-unwatchedpages' => 'ver a lista de páginas não-vigiadas', @@ -1745,6 +1754,8 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu # Recent changes 'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}', +'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde a última visita}}', +'enhancedrc-history' => 'histórico', 'recentchanges' => 'Mudanças recentes', 'recentchanges-legend' => 'Opções das mudanças recentes', 'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes da wiki.', @@ -1796,7 +1807,7 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.", 'reuploaddesc' => 'Cancelar o envio e voltar ao formulário de carregamento', 'upload-tryagain' => 'Submeta a descrição do ficheiro modificado', 'uploadnologin' => 'Não autenticado', -'uploadnologintext' => 'Tem de estar [[Special:UserLogin|autenticado]] para enviar ficheiros.', +'uploadnologintext' => 'Tem de $1 para enviar ficheiros.', 'upload_directory_missing' => 'O diretório de carregamento de ficheiros ($1) não existe e o servidor de internet não conseguiu criá-lo.', 'upload_directory_read_only' => 'O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).', 'uploaderror' => 'Erro ao carregar', @@ -2060,6 +2071,10 @@ Verifique se o endereço está correto e o site disponível, por favor.', 'listfiles_size' => 'Tamanho', 'listfiles_description' => 'Descrição', 'listfiles_count' => 'Versões', +'listfiles-show-all' => 'Incluir versões antigas de imagens', +'listfiles-latestversion' => 'Versão atual', +'listfiles-latestversion-yes' => 'Sim', +'listfiles-latestversion-no' => 'Não', # File description page 'file-anchor-link' => 'Ficheiro', @@ -2155,6 +2170,7 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.', # Random page in category +'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].', 'randomincategory-selectcategory-submit' => 'Ir', # Random redirect @@ -2187,8 +2203,8 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic 'pageswithprop-text' => 'Esta página lista páginas que usam uma propriedade em particular.', 'pageswithprop-prop' => 'Nome da propriedade:', 'pageswithprop-submit' => 'Avançar', -'pageswithprop-prophidden-long' => 'foi ocultado o valor da propriedade por ser um texto muito longo ($1 kilobytes)', -'pageswithprop-prophidden-binary' => 'foi ocultado o valor da propriedade por ser binário ($1 kilobytes)', +'pageswithprop-prophidden-long' => 'foi ocultado o valor da propriedade por ser um texto muito longo ($1)', +'pageswithprop-prophidden-binary' => 'foi ocultado o valor da propriedade por ser binário ($1)', 'doubleredirects' => 'Redirecionamentos duplos', 'doubleredirectstext' => 'Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento. @@ -2246,7 +2262,7 @@ Agora redirecciona para [[$2]].', 'mostinterwikis' => 'Páginas com mais interwikis', 'mostrevisions' => 'Páginas com mais revisões', 'prefixindex' => 'Todas as páginas iniciadas por', -'prefixindex-namespace' => 'Todas as páginas com prefixo (domínio $1)', +'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)', 'prefixindex-strip' => 'Remover prefixo', 'shortpages' => 'Páginas curtas', 'longpages' => 'Páginas longas', @@ -2526,9 +2542,11 @@ Consulte $2 para um registo de eliminações recentes.', 'deleteotherreason' => 'Outro/motivo adicional:', 'deletereasonotherlist' => 'Outro motivo', 'deletereason-dropdown' => '* Motivos de eliminação comuns -** Pedido do autor +** Spam +** Vandalismo ** Violação de direitos de autor -** Vandalismo', +** Pedido do autor +** Redirecionamento quebrado', 'delete-edit-reasonlist' => 'Editar motivos de eliminação', 'delete-toobig' => 'Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}. A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.', @@ -2847,12 +2865,9 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.', 'ip_range_invalid' => 'Gama de IPs inválida.', 'ip_range_toolarge' => 'Não são permitidas gamas de IPs maiores do que /$1.', -'blockme' => 'Bloquear-me', 'proxyblocker' => 'Bloqueador de proxies', -'proxyblocker-disabled' => 'Esta função foi impossibilitada.', 'proxyblockreason' => "O seu endereço IP foi bloqueado por ser um ''proxy'' público. Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.", -'proxyblocksuccess' => 'Feito.', 'sorbsreason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.", 'sorbs_create_account_reason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta", 'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1', @@ -3211,6 +3226,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con 'spam_reverting' => 'A reverter para a última revisão que não contém links para $1', 'spam_blanking' => 'Todas as revisões continham links para $1; a esvaziar', 'spam_deleting' => 'Todas as revisões continham links para $1; a eliminar', +'simpleantispam-label' => "Verificação contra spam +'''NÃO''' preencha isto!", # Info page 'pageinfo-title' => 'Informações sobre "$1"', @@ -4050,7 +4067,10 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN 'tags-tag' => 'Nome da etiqueta', 'tags-display-header' => 'Aparência nas listas de modificações', 'tags-description-header' => 'Descrição completa do significado', +'tags-active-header' => 'Ativa?', 'tags-hitcount-header' => 'Modificações etiquetadas', +'tags-active-yes' => 'Sim', +'tags-active-no' => 'Não', 'tags-edit' => 'editar', 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}', @@ -4071,6 +4091,7 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN 'dberr-problems' => 'Desculpe! Este site está com dificuldades técnicas.', 'dberr-again' => 'Experimente esperar alguns minutos e atualizar.', 'dberr-info' => '(Não foi possível contactar o servidor da base de dados: $1)', +'dberr-info-hidden' => '(Não foi possível contactar o servidor de base de dados)', 'dberr-usegoogle' => 'Pode tentar pesquisar no Google entretanto.', 'dberr-outofdate' => 'Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.', 'dberr-cachederror' => 'A seguinte página é uma cópia em cache da página pedida e pode não estar atualizada.', @@ -4208,7 +4229,9 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se # Limit report 'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}', -'limitreport-postexpandincludesize-value' => '$1/$2 bytes', -'limitreport-templateargumentsize-value' => '$1/$2 bytes', +'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', +'limitreport-templateargumentsize' => 'Tamanho dos argumentos da predefinição', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', ); diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php index 108a8179b5..16b0d6f7a6 100644 --- a/languages/messages/MessagesPt_br.php +++ b/languages/messages/MessagesPt_br.php @@ -61,6 +61,7 @@ * @author Sir Lestaty de Lioncourt * @author Teles * @author TheGabrielZaum + * @author Titoncio * @author Urhixidur * @author Vivaelcelta * @author Vuln @@ -789,6 +790,8 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no 'userlogin-resetpassword-link' => 'Troque sua senha', 'helplogin-url' => 'Help:Iniciar sessão', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]', +'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}. +Use o formulário abaixo para iniciar sessão como outro usuário.', 'createacct-join' => 'Insira suas informações abaixo.', 'createacct-another-join' => 'Preeencha as informações para a nova conta', 'createacct-emailrequired' => 'Endereço de e-mail', @@ -2539,10 +2542,12 @@ Consulte $2 para um registro de eliminações recentes.', 'deletecomment' => 'Motivo:', 'deleteotherreason' => 'Justificativa adicional:', 'deletereasonotherlist' => 'Outro motivo', -'deletereason-dropdown' => '* Motivos de eliminação comuns -** Pedido do autor +'deletereason-dropdown' => '* Motivos comuns para eliminação +** Spam +** Vandalismo ** Violação de direitos de autor -** Vandalismo', +** A pedido do autor +** Redirecionamento inválido', 'delete-edit-reasonlist' => 'Editar motivos de eliminação', 'delete-toobig' => 'Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}. A eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.', @@ -2703,7 +2708,7 @@ $1', 'contributions' => 'Contribuições {{GENDER:$1|do usuário|da usuária}}', 'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1', 'mycontris' => 'Contribuições', -'contribsub2' => 'Para $1 ($2)', +'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Não foram encontradas mudanças com este critério.', 'uctop' => '(atual)', 'month' => 'Mês (inclusive anteriores):', @@ -2858,11 +2863,8 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta, não podendo ser desbloqueado deste modo. Se encontra bloqueado como parte do "range" $2, o qual pode ser desbloqueado.', 'ip_range_invalid' => 'Gama de IPs inválida.', 'ip_range_toolarge' => 'Intervalos de bloqueio maiores do que /$1 não são permitidos', -'blockme' => 'Bloquear-me', 'proxyblocker' => 'Bloqueador de proxy', -'proxyblocker-disabled' => 'Esta função está desabilitada.', 'proxyblockreason' => 'O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.', -'proxyblocksuccess' => 'Concluído.', 'sorbsreason' => 'O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.', 'sorbs_create_account_reason' => 'O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta', 'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1', @@ -3211,6 +3213,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext 'spam_reverting' => 'Revertendo para a última versão que não contém links para $1', 'spam_blanking' => 'Todas revisões contendo links para $1, limpando', 'spam_deleting' => 'Eliminada por todas as suas edições conterem links para $1', +'simpleantispam-label' => "Verificação contra spam +'''NÃO''' preencha isto!", # Info page 'pageinfo-title' => 'Informações sobre "$1"', @@ -4047,7 +4051,10 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN 'tags-tag' => 'Nome da etiqueta', 'tags-display-header' => 'Aparência nas listas de modificações', 'tags-description-header' => 'Descrição completa do significado', +'tags-active-header' => 'Ativo?', 'tags-hitcount-header' => 'Modificações etiquetadas', +'tags-active-yes' => 'Sim', +'tags-active-no' => 'Não', 'tags-edit' => 'editar', 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}', @@ -4212,8 +4219,11 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com 'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}', 'limitreport-ppvisitednodes' => 'Número de nós visitados pelo pré-processador', 'limitreport-ppgeneratednodes' => 'Número de nós gerados pelo pré-processador', +'limitreport-postexpandincludesize' => 'Tamanho de inclusão pós-expansão', 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', +'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição', 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}', 'limitreport-expansiondepth' => 'Máxima profundidade de expansão', +'limitreport-expensivefunctioncount' => 'Conta da função expansiva do analizador', ); diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php index 74d13aca4b..a8b66b29df 100644 --- a/languages/messages/MessagesQqq.php +++ b/languages/messages/MessagesQqq.php @@ -653,7 +653,7 @@ See also: \'\'\'Note:\'\'\' This is "views" as in "appearances"/"representations", \'\'\'not\'\'\' as in "visits"/"accesses". {{Identical|View}}', 'toolbox' => 'The title of the toolbox below the search menu. -{{Identical|Toolbox}}', +{{Identical|Tool}}', 'userpage' => '', 'projectpage' => 'Used as link text in Talk page of project page.', 'imagepage' => 'Used as link text in Talk page of file page.', @@ -4508,7 +4508,8 @@ Example: [[:Image:Addon-icn.png]]', 'filehist-dimensions' => 'Used as label in file description page. Followed by length, filesize, and width x height. e.g. "1.5 s (13 KB)".', -'filehist-filesize' => 'In image description page', +'filehist-filesize' => 'Used in image description page. +{{Identical|File size}}', 'filehist-comment' => 'In file description page {{Identical|Comment}}', @@ -6617,33 +6618,18 @@ See also: * {{msg-mw|Range block disabled}} * {{msg-mw|Ip range invalid}} * {{msg-mw|Ip range toolarge}}', -'blockme' => '{{doc-special|BlockMe|unlisted=1}} -This feature is disabled by default.', 'proxyblocker' => 'Used in [[Special:BlockMe]]. See also: * {{msg-mw|proxyblocker-disabled}} * {{msg-mw|proxyblockreason}} * {{msg-mw|proxyblocksuccess}}', -'proxyblocker-disabled' => 'Used in [[Special:BlockMe]]. - -See also: -* {{msg-mw|proxyblocker}} -* {{msg-mw|proxyblockreason}} -* {{msg-mw|proxyblocksuccess}}', 'proxyblockreason' => 'Used as explanation of the reason in [[Special:BlockMe]]. See also: * {{msg-mw|proxyblocker-disabled}} * {{msg-mw|proxyblocker}} * {{msg-mw|proxyblocksuccess}}', -'proxyblocksuccess' => 'Used in [[Special:BlockMe]]. - -See also: -* {{msg-mw|proxyblocker-disabled}} -* {{msg-mw|proxyblocker}} -* {{msg-mw|proxyblockreason}} -{{Identical|Done}}', 'sorbs' => '{{optional}}', 'sorbsreason' => 'See also: * {{msg-mw|Sorbsreason}} @@ -8004,6 +7990,9 @@ Used when a page is deleted because all revisions contained a particular link. Parameters: * $1 - a spammed domain name', +'simpleantispam-label' => 'Used as label for the input box in "Edit" page. + +The label and the input box are always hidden.', # Info page 'pageinfo-title' => 'Page title for action=info. Parameters: diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php index 7da7374730..4d7ca96561 100644 --- a/languages/messages/MessagesQu.php +++ b/languages/messages/MessagesQu.php @@ -272,12 +272,12 @@ $messages = array( 'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay", 'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay", 'tog-extendwatchlist' => "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu", -'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas (JavaScript nisqallawanmi llamk'an)", +'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas", 'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay", 'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy", -'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan (JavaScript)", +'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan", 'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan", -'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)", +'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa", 'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)", 'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})", 'tog-watchcreations' => "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay", @@ -295,7 +295,7 @@ $messages = array( 'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna", 'tog-oldsig' => "Kachkaqña silq'uy:", 'tog-fancysig' => "Silq'uyta wiki qillqa hinata llamk'achiy (mana kikinmanta t'inkichaq silq'uy)", -'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (JavaScript) (llamiy aknaraq)", +'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (llamiy aknaraq)", 'tog-forceeditsummary' => "Ch'usaq llamk'apuy waqaychasqa kachkaptinqa ch'itiyay.", 'tog-watchlisthideown' => "Watiqasqaykunapiqa ñuqap llamk'apusqaykunata pakay", 'tog-watchlisthidebots' => "Watiqasqaykunapiqa rurana antachakunap llamk'apusqankunata pakay", @@ -309,6 +309,7 @@ $messages = array( 'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy", 'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu', 'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.", +'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay", 'underline-always' => "Hayk'appas", 'underline-never' => "Mana hayk'appas", @@ -409,7 +410,7 @@ $messages = array( 'newwindow' => '(Musuq wintanam kichakun)', 'cancel' => 'Ama niy', 'moredotdotdot' => 'Aswan...', -'morenotlisted' => 'Aswanqa sutisuyupi manam kanchu...', +'morenotlisted' => "Kay sutisuyuqa manaraqmi hunt'asqachu.", 'mypage' => "P'anqay", 'mytalk' => 'Rimachinay', 'anontalk' => 'Kay IP huchhapaq rimanakuy', @@ -512,7 +513,7 @@ $1", # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => '{{SITENAME}}manta', 'aboutpage' => 'Project:{{SITENAME}}manta', -'copyright' => "Ch'aqtasqakunataqa llamk'achinkiman $1 nisqap ruraq hayñinkama", +'copyright' => "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.", 'copyrightpage' => '{{ns:project}}:Ruraqpa hayñin', 'currentevents' => 'Kunan pacha', 'currentevents-url' => 'Project:Kunan pacha', @@ -595,6 +596,11 @@ Allin sapaq p'anqakunataqa tarinki [[Special:SpecialPages|Sapaq p'anqakuna]] nis # General errors 'error' => 'Pantasqa', 'databaseerror' => 'Willañiqintin pantasqa', +'databaseerror-text' => "Willañiqintin maskana pantasqam tukurqan. Llamp'u kaqpi pantasqachá kachkan.", +'databaseerror-textcl' => 'Willañiqintin maskana pantasqam tukurqan.', +'databaseerror-query' => 'Maskana: $1', +'databaseerror-function' => 'Ruray paqtachi: $1', +'databaseerror-error' => 'Pantasqa: $1', 'laggedslavemode' => "'''Paqtataq''': Kay p'anqapiqa manaraqchá kachkanchu aswan qayna musuqchasqakuna.", 'readonly' => "Willañiqintinqa hark'asqam", 'enterlockreason' => "Qillqamuy imarayku hark'asqa karqan, hayk'appas manañachá hark'asqachu kanqa", @@ -628,6 +634,7 @@ P\'anqaqa pipapas qullusqanñachá.', 'cannotdelete-title' => 'Manam atinichu "$1" sutiyuq p\'anqata qulluyta', 'delete-hook-aborted' => "Ch'iwinam qulluyta t'ipirqan. Manam nirqanchu imarayku.", +'no-null-revision' => 'Manam atinichu "$1" p\'anqapaq musuq ch\'usaq musuqchasqata kamariyta.', 'badtitle' => "P'anqap sutinqa manam allinchu", 'badtitletext' => "Kay p'anqap sutinqa manam allinchu, mana allin interwiki t'inkichá icha ch'usaqchá, p'anqa sutipaq mana saqillasqa sananchayuqchá.", 'perfcached' => "Kay qatiq willakunaqa ''cache'' nisqa pakasqa hallch'apim kachkan, chayrayku manañachá musuqchasqachu. {{PLURAL:$1|Huklla|$1-lla}} taripasqam pakasqa hallch'api aypalla kachkan, manam aswanchu.", @@ -655,6 +662,8 @@ $2", 'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.", 'mycustomcssprotected' => "Kay CSS p'anqataqa manam llamk'apuyta atinkichu.", 'mycustomjsprotected' => "Kay JavaScript p'anqataqa manam llamk'apuyta atinkichu.", +'myprivateinfoprotected' => "Manam saqillasqachu kanki kikiykip akuna willaykikunata llamk'apunaykipaq.", +'mypreferencesprotected' => "Manam saqillasqachu kanki allinkachinaykikunata llamk'apunaykipaq.", 'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.", 'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.", 'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi. @@ -673,13 +682,14 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".', # Login and logout pages 'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.''' -Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, [$1 musuqmanta yaykuy] ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.", +Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.", 'welcomeuser' => 'Allinmi hamusqayki, $1!', 'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam. Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.', 'yourname' => 'Ruraq sutiyki:', 'userlogin-yourname' => 'Ruraqpa sutin', 'userlogin-yourname-ph' => 'Ruraqpa sutiykita yaykuchiy', +'createacct-another-username-ph' => 'Ruraqpa sutinta yaykuchiy', 'yourpassword' => 'Yaykuna rimayki', 'userlogin-yourpassword' => 'Yaykuna rima', 'userlogin-yourpassword-ph' => 'Yaykuna rimaykita yaykuchiy', @@ -712,11 +722,13 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay 'userlogin-resetpassword-link' => 'Yaykuna rimaykita kutichiy', 'helplogin-url' => 'Help:Yaykuy', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yaykunapaq yanapa]]', +'userlogin-createanother' => 'Huk rakiqunata kamariy', 'createacct-join' => 'Kay qatiqpi willaykita yaykuchiy.', 'createacct-emailrequired' => 'E-chaski imamayta', 'createacct-emailoptional' => 'E-chaski imamayta (munaspayki)', 'createacct-email-ph' => 'E-chaski imamaytaykita yaykuchiy', -'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay", +'createacct-another-email-ph' => 'E-chaski imamaytata yaykuchiy', +'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay", 'createacct-realname' => 'Chiqap suti (munaspayki)', 'createaccountreason' => 'Kayrayku:', 'createacct-reason' => 'Kayrayku', @@ -724,6 +736,7 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay 'createacct-captcha' => 'Amachana llanchiy', 'createacct-imgcaptcha-ph' => 'Hanaqpi rikusqayki qillqata yaykuchiy', 'createacct-submit' => 'Rakiqunaykita kamariy', +'createacct-another-submit' => 'Huk rakiqunata kamariy', 'createacct-benefit-heading' => '{{SITENAME}}taqa qam hina runakunam ruran.', 'createacct-benefit-body1' => "{{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}", 'createacct-benefit-body2' => "{{PLURAL:$1|p'anqa|p'anqakuna}}", @@ -783,10 +796,11 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.', Kay willay pantasqa kaptinqa, qhawarparillay.', 'usernamehasherror' => 'Ruraqpa sutinqa ama iskaychakana (#) sananchayuqchu kachun', -'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, suyariy manaraq musuqmanta yaykuykachaspa.', +'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, $1 suyariy manaraq musuqmanta yaykuykachaspa.', 'login-abort-generic' => 'Yaykuykachaspayki manam ayparqankichu - Allqasqa', 'loginlanguagelabel' => 'Rimay: $1', 'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.", +'createacct-another-realname-tip' => "* Chiqap sutiqa munanallapaqmi. Quwaptiykiqa, llamk'apusqakunam paywan sananchasqa kanqa.", # Email sending 'php-mail-error-unknown' => 'Mana riqsisqa pantasqa PHP mail() rurananpi', @@ -802,7 +816,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.', 'newpassword' => 'Musuq yaykuna rima:', 'retypenew' => 'Musuq yaykuna rimaykita takyachiy:', 'resetpass_submit' => 'Yaykuna rimata hukchaspa yaykuy', -'changepassword-success' => 'Yaykuna rimaykiqa hukchasqañam. Yaykamuchkankim...', +'changepassword-success' => 'Yaykuna rimaykiqa aypalla hukchasqañam.', 'resetpass_forbidden' => 'Manam saqillanchu yaykuna rimata hukchayta', 'resetpass-no-info' => "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.", 'resetpass-submit-loggedin' => 'Yaykuna rimata hukchay', @@ -815,7 +829,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata # Special:PasswordReset 'passwordreset' => 'Yaykuna rimata kutichiy', 'passwordreset-text-one' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.", -'passwordreset-text-many' => '{{PLURAL:$1|Kay willa rakikunamanta hukta yaykuchiy, yaykuna rimaykita kutichinaykipaq.}}', +'passwordreset-text-many' => "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}", 'passwordreset-legend' => 'Yaykuna rimata kutichiy', 'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.', 'passwordreset-emaildisabled' => "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.", @@ -863,6 +877,15 @@ Mit'alla yaykuna rima: $2", 'changeemail-submit' => 'E-chaskita wakinchay', 'changeemail-cancel' => 'Ama niy', +# Special:ResetTokens +'resettokens' => 'Llawikunata kutichiy', +'resettokens-no-tokens' => 'Manam kanchu kutichina llawikuna.', +'resettokens-legend' => 'Llawikunata kutichiy', +'resettokens-tokens' => 'Llawikuna:', +'resettokens-token-label' => '$1 (kunan chani: $2)', +'resettokens-done' => 'Llawikunaqa kutichimusqañam.', +'resettokens-resetbutton' => 'Akllasqa llawikunata kutichimuy', + # Edit page toolbar 'bold_sample' => 'Yanasapa qillqa', 'bold_tip' => 'Yanasapa qillqa', @@ -935,7 +958,7 @@ Astasqachá icha qullusqachá qhawachkaptiyki.', 'accmailtitle' => 'Yaykuna rimaqa kachasqañam.', 'accmailtext' => "Kikinmanta kamarisqa [[User talk:$1|$1]]-paq yaykuna rimaqa $2-manmi kachasqaña. -Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay musuq rakiqunapaq yaykuna rimata hukchaytam atinki.", +Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay yaykuna rimata hukchaytam atinki.", 'newarticle' => '(Musuq)', 'newarticletext' => "Manaraq kachkaq p'anqatam llamk'apuchkanki. Musuq p'anqata kamariyta munaspaykiqa, qillqarillay. Astawan ñawiriyta munaspaykiqa, [[{{MediaWiki:Helppage}}|yanapana p'anqata]] qhaway. Mana munaspaykitaq, ñawpaq p'anqaman ripuy.", 'anontalkpagetext' => "---- ''Kayqa huk sutinnaq icha mana sutinta llamk'achiq ruraqpa rimanakuyninmi. IP huchhantam hallch'asunchik payta sutinchanapaq. Achka ruraqkunam huklla IP huchhanta llamk'achiyta atin. Sutinnaq ruraq kaspaykiqa, mana qampa rurasqaykimanta willamusqakunata rikuspaykiqa, ama hina kaspa [[Special:UserLogin/signup|rakiqunaykita kamariy]] icha [[Special:UserLogin|yaykuy]] huk sutinnaq ruraqkunawan ama pantasqa kanaykipaq.''", @@ -1027,7 +1050,7 @@ Hallch'api qhipaq kaq yaykuchisqataqa kay qatiqpim rikunki willasunaykipaq:", 'nocreate-loggedin' => "Manam saqillasunkichu musuq p'anqakunata kamariyta.", 'sectioneditnotsupported-title' => "Raki allichayqa manam q'imisqachu", 'sectioneditnotsupported-text' => "Raki allichayqa kay p'anqapi manam q'imisqachu.", -'permissionserrors' => 'Saqillay pantasqakuna', +'permissionserrors' => 'Saqillay pantasqa', 'permissionserrorstext' => 'Manam saqillasunkichu, {{PLURAL:$1|kayraykum|kayraykum}}:', 'permissionserrorstext-withaction' => 'Manam saqillasunkichu $2-ta, {{PLURAL:$1|kayraykum|kayraykum}}:', 'recreate-moveddeleted-warn' => "'''Paqtataq: Ñawpaqta qullusqaña p'anqatam musuqmanta kamarichkanki.''' @@ -1086,6 +1109,7 @@ Chay niykunaqa manam chaninchasqachu.", 'undo-failure' => "Manam atinichu llamk'apusqata kutichiyta, huk ruraqtaq musuqta llamk'apurquptinñam.", 'undo-norev' => "Manam atinichu llamk'apusqata kutichiyta, mana kaptinmi icha qullusqa kaptinmi.", 'undo-summary' => '[[Special:Contributions/$2|$2]]-pa $1 hukchasqanta kutichisqa ([[User talk:$2|rimay]])', +'undo-summary-username-hidden' => 'Pakasqa ruraqpa $1 nisqa musuqchasqata kutichiy', # Account creation failure 'cantcreateaccounttitle' => 'Manam atinichu rakiqunata kichayta', @@ -1112,8 +1136,8 @@ $3-qa nirqan kayraykum: ''$2''", (ñawpaq) = ñawpaq kachkasqanwan huk kaykuna, a = aslla hukchasqa", 'history-fieldset-title' => 'Wiñay kawsaypi maskay', 'history-show-deleted' => 'Qullusqalla', -'histfirst' => 'Ñawpaqkuna', -'histlast' => 'Qhipaqkuna', +'histfirst' => 'ñawpaqkuna', +'histlast' => 'qhipaqkuna', 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})', 'historyempty' => "(ch'usaq)", @@ -1263,6 +1287,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla. 'compareselectedversions' => "Akllasqa llamk'apusqakunata wakichay", 'showhideselectedversions' => 'Akllasqa musuqchasqakunata rikuchiy/pakay', 'editundo' => 'kutichiy', +'diff-empty' => '(Manam wak hina kanchu)', 'diff-multi' => "({{PLURAL:$2|Huk ruraqpa|$2 ruraqpa}} {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})", 'diff-multi-manyusers' => "({{PLURAL:$2|Hukmanta|$2-manta}} aswan ruraqkunap {{PLURAL:$1|chawpipi huk llamk'apusqanqa manam rikuchisqachu|chawpipi $1 llamk'apusqankunaqa manam rikuchisqachu}})", 'difference-missing-revision' => "Kay wakin kaymanta ($1) {{PLURAL:$2|huk musuqchasqa|$2 musuqchasqakuna}} manam tarisqachu. @@ -1362,7 +1387,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha 'prefs-rendering' => "Rikch'akuynin", 'saveprefs' => 'Allinkachinakunata waqaychay', 'resetprefs' => 'Mana waqaychasqa hukchasqakunaman ama niy', -'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy', +'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)', 'prefs-editing' => "Llamk'apusqa", 'rows' => 'Sinrukuna:', 'columns' => 'Wachukuna:', @@ -1418,11 +1443,11 @@ Chaytataq manam kutichiyta atinkichu.", 'badsig' => "Chawa silq'usqaykiqa manam allinchu; HTML sananchakunata llanchiy.", 'badsiglength' => 'Chutu sutiykiqa nisyu sunim. $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', -'yourgender' => 'Qhari icha warmi:', -'gender-unknown' => 'Mana riqsisqa', -'gender-male' => 'Qhari', -'gender-female' => 'Warmi', -'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq. Kay willayqa sapsim kanqa.", +'yourgender' => 'Ima hina nisunkikutaq munanki?', +'gender-unknown' => 'Manam willayta munanichu', +'gender-male' => "Qharim wikita llamk'apun", +'gender-female' => "Warmim wikita llamk'apun", +'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq huk runakunaman willananpaqpas. Kay willayqa sapsim kanqa.", 'email' => 'E-chaski', 'prefs-help-realname' => "* Chiqap sutiyki (munaspaqa): quwaptiykiqa, llamk'apusqaykikunam paywan sananchasqa kanqa.", 'prefs-help-email' => 'E-chaskita munaspayki akllayta atinki. Arí nispaykiqa, yaykuna rimata qunqaspayki musuq yaykuna rimata e-chaski imamaytaykiman kachachikamuyta atinki.', @@ -1433,7 +1458,9 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'prefs-signature' => "Silq'uy", 'prefs-dateformat' => "P'unchaw rikch'ay", 'prefs-timeoffset' => 'Pacha wakinyay', -'prefs-advancedediting' => 'Ñawparikusqa akllanakuna', +'prefs-advancedediting' => 'Sapsi akllanakuna', +'prefs-editor' => "P'anqachaq", +'prefs-preview' => 'Ñawpaqta qhawallay', 'prefs-advancedrc' => 'Ñawparikusqa akllanakuna', 'prefs-advancedrendering' => 'Ñawparikusqa akllanakuna', 'prefs-advancedsearchoptions' => 'Ñawparikusqa akllanakuna', @@ -1441,6 +1468,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'prefs-displayrc' => 'Akllanakunata rikuchiy', 'prefs-displaysearchoptions' => 'Akllanakunata rikuchiy', 'prefs-displaywatchlist' => 'Akllanakunata rikuchiy', +'prefs-tokenwatchlist' => 'Llawi', 'prefs-diffs' => 'Wakin kaykuna', # User preference: email validation using jQuery @@ -1468,7 +1496,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'userrights-notallowed' => 'Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.', 'userrights-changeable-col' => 'Hukchanayki huñukuna', 'userrights-unchangeable-col' => 'Mana hukchanayki huñukuna', -'userrights-conflict' => 'Ruraqpa hayñin tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.', +'userrights-conflict' => 'Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.', # Groups 'group' => 'Huñu:', @@ -1512,7 +1540,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'right-reupload-shared' => 'Rakinakusqa midya waqaychanallapi kaq willañiqikunata huknachay', 'right-upload_by_url' => 'URL tiyaymanta willañiqita churkuy', 'right-purge' => "''Cache'' nisqa pakasqa hallch'ata ch'usaqchay mana takyachina p'anqawan", -'right-autoconfirmed' => "Kuskan amachasqa p'anqakunata llamk'apuy", +'right-autoconfirmed' => 'IP-pi tiksisqa achura saywakunapa manam saywachasqan kanqachu', 'right-bot' => 'Rurana antachap ruraykachasqanta hina hatalliy', 'right-nominornewtalk' => 'Kikinpa rimachinanpi uchuylla hukchasqakunata "musuq willaykuna" nisqapi mana rikuy', 'right-apihighlimits' => "API maskanakunapi aswan hanaq saywakunata llamk'achiy", @@ -1533,14 +1561,20 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'right-ipblock-exempt' => "IP hark'ayta, kikinmanta hark'ayta, tawqa hark'aytapas pulqaspa pasay", 'right-proxyunbannable' => "Kikinmanta ''proxy'' nisqa sirwiq hark'ayta pulqaspa pasay", 'right-unblockself' => "Kikinta hark'asqamanta qispikuy", -'right-protect' => "Amachasqa kachkayta hukchay, amachasqa p'anqakunata llamk'apuy", -'right-editprotected' => "Amachasqa p'anqakunata llamk'apuy (mana phaqcha amachasqa)", +'right-protect' => "Amachasqa kachkayta hukchay, ch'aqtasqa amachasqa p'anqakunata llamk'apuy", +'right-editprotected' => 'Amachasqa p\'anqakunata "{{int:protect-level-sysop}}" hina llamk\'apuy', +'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" hina amachasqa p\'anqakunata llamk\'apuy', 'right-editinterface' => "Ruraqpaq uyapurata llamk'apuy", 'right-editusercssjs' => "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy", 'right-editusercss' => "Huk ruraqkunap CSS willañiqinkunata llamk'apuy", 'right-edituserjs' => "Huk ruraqkunap JS willañiqinkunata llamk'apuy", 'right-editmyusercss' => "Kikiykip ruraqpaq CSS willañiqiykikunata llamk'apuy", 'right-editmyuserjs' => "Kikiykip ruraqpaq JavaScript willañiqiykikunata llamk'apuy", +'right-viewmywatchlist' => 'Kikiykip watiqasqayki sutisuyuykita qhaway', +'right-editmywatchlist' => "Kikiykip watiqasqayki sutisuyuykita llamk'apuy. Paqtataq, huk ruranakunaqa p'anqakunata yapanqaraqmi kay hañi mana kaptinpas.", +'right-viewmyprivateinfo' => 'Kikiykip akuna willaykikunata qhaway (ahinataq e-chaski imamaytayki, chiqap sutiyki)', +'right-editmyprivateinfo' => "Kikiykip akuna willaykikunata llamk'apuy (ahinataq e-chaski imamaytayki, chiqap sutiyki)", +'right-editmyoptions' => "Kikiykip allinkachinaykikunata llamk'apuy", 'right-rollback' => "Huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy", 'right-markbotedits' => "Kutichisqa llamk'apusqakunata rurana antachap llamk'apusqankunata hina sananchay", 'right-noratelimit' => 'Achura saywakunap manam chayachisqanchu', @@ -1592,8 +1626,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'action-block' => "kay ruraqta llamk'apuymanta hark'ay", 'action-protect' => "kay p'anqapaq amachana kamachisqakunata hukchay", 'action-rollback' => "huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy", -'action-import' => "kay p'anqata hawa wikimanta chaskimuy", -'action-importupload' => "kay p'anqata willañiqi churkusqamanta chaskimuy", +'action-import' => "p'anqakunata hawa wikimanta chaskimuy", +'action-importupload' => "p'anqakunata willañiqi churkusqamanta chaskimuy", 'action-patrol' => "huk ruraqpa llamk'apusqanta patrullasqa nispa sananchay", 'action-autopatrol' => "kikiykip llamk'apusqaykita patrullasqa nispa sananchakuy", 'action-unwatchedpages' => "mana watiqasqa p'anqa sutisuyuta qhaway", @@ -1602,12 +1636,19 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'action-userrights-interwiki' => "hawa wikikunapi ruraqkunap hayñinkunata llamk'apuy", 'action-siteadmin' => "willañiqintinta hark'ay icha paskay", 'action-sendemail' => 'e-chaskikunata kachay', +'action-editmywatchlist' => "watiqasqayki sutisuyuta llamk'apuy", +'action-viewmywatchlist' => 'watiqasqayki sutisuyuta qhaway', +'action-viewmyprivateinfo' => 'kikiykip akuna willaykikunata qhaway', +'action-editmyprivateinfo' => "kikiykip akuna willaykikunata llamk'apuy", # Recent changes 'nchanges' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}', +'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|qhipaq watukusqamantapacha}}', +'enhancedrc-history' => 'wiñay kawsay', 'recentchanges' => 'Ñaqha hukchasqa', 'recentchanges-legend' => 'Ñaqha hukchasqapaq allinkachinakuna', 'recentchanges-summary' => "Kay p'anqapiqa aswan qhipaq ñaqha hukchasqakunam.", +'recentchanges-noresult' => "Kay taripanakama hukchasqakunaqa akllasqa mit'api manam kanchu.", 'recentchanges-feed-description' => 'Kay mikhuchinapi wikipi qhipaq ñaqha hukchasqakunata qatiy.', 'recentchanges-label-newpage' => "Kayta llamk'apuptiykim musuq p'anqam tukukurqun", 'recentchanges-label-minor' => "Kayqa aslla llamk'apuymi", @@ -1635,7 +1676,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'rc_categories_any' => 'Imallapas', 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña', 'newsectionsummary' => 'Musuq raki: /* $1 */', -'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)', +'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy', 'rc-enhanced-hide' => 'Imaymanachakunata pakay', 'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa', @@ -1654,7 +1695,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.', 'reuploaddesc' => "Churkuna hunt'ana p'anqaman kutimuy.", 'upload-tryagain' => 'Hukchasqa willañiqimanta willaykunata kachay', 'uploadnologin' => 'Manaraqmi yaykurqunkichu', -'uploadnologintext' => '[[Special:UserLogin|Yaykunaykim]] tiyan willañiqikunata churkunaykipaq.', +'uploadnologintext' => '$1 tiyan willañiqikunata churkunaykipaq.', 'upload_directory_missing' => 'Churkuna willañiqi churanaqa ($1) manam kanchu. Llika sirwiqpas manam atinchu churkuna willañiqi churanata kamariyta.', 'upload_directory_read_only' => "Llika sirwiqqa manam atinchu churkuna hallch'aman ($1) qillqayta.", 'uploaderror' => 'Willañiqita churkunayaptiyki pantasqam tukurqan', @@ -1873,8 +1914,7 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.', 'upload_source_file' => ' (antañiqiqniykipi willañiqi)', # Special:ListFiles -'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki. -Ruraqkama ch'illchispaykiqa, chay ruraq qhipaq churkuq kaptillan willañiqikunatam sutisuyup patanpi rikunki.", +'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.", 'listfiles_search_for' => 'Rikchap sutinta maskay:', 'imgfile' => 'willañiqi', 'listfiles' => 'Rikchakuna', @@ -1885,6 +1925,10 @@ Ruraqkama ch'illchispaykiqa, chay ruraq qhipaq churkuq kaptillan willañiqikunat 'listfiles_size' => 'Hatun kay', 'listfiles_description' => "T'iktuna", 'listfiles_count' => 'Musuqchasqakuna', +'listfiles-show-all' => "Rikchakunamanta mawk'a musuqchasqakunata ch'aqtay", +'listfiles-latestversion' => 'Kunan musuqchasqa', +'listfiles-latestversion-yes' => 'Arí', +'listfiles-latestversion-no' => 'Mana', # File description page 'file-anchor-link' => 'Rikcha', @@ -1979,6 +2023,13 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun 'randompage' => "Mayninpi p'anqa", 'randompage-nopages' => "Manam ima p'anqapas kanchu kay suti {{PLURAL:$2|k'itipi|k'itikunapi}}: $1.", +# Random page in category +'randomincategory' => "Katiguriyapi kikinmanta p'anqa", +'randomincategory-invalidcategory' => '"$1" nisqaqa katiguriyapaq manam allin sutinchu.', +'randomincategory-nopages' => "[[:Category:$1|$1]] katiguriyapiqa manam p'anqakuna kanchu.", +'randomincategory-selectcategory' => "Katiguriyamanta kikinmanta p'anqata chaskiy: $1 $2.", +'randomincategory-selectcategory-submit' => 'Riy', + # Random redirect 'randomredirect' => "Mayninpi pusapuna p'anqa", 'randomredirect-nopages' => 'Manam kanchu "$1" nisqa suti k\'itipi pusapuna p\'anqakuna.', @@ -2184,7 +2235,8 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: $1 (mana mayq 'listgrouprights' => 'Ruraq huñup hayñinkuna', 'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki. Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgrouprights-helppage}}|kaypi qhaway]].", -'listgrouprights-key' => '* Qusqa hayñi +'listgrouprights-key' => 'T\'iktuna: +* Qusqa hayñi * Qichusqa hayñi', 'listgrouprights-group' => 'Huñu', 'listgrouprights-rights' => 'Hayñikuna', @@ -2339,9 +2391,11 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.', 'deleteotherreason' => 'Huk rayku:', 'deletereasonotherlist' => 'Huk rayku', 'deletereason-dropdown' => "*Qulluypaq sapsi raykukuna -** Kikin kamariqpa mañakusqan +** Spam nisqa millay rurasqa +** Wandaluchasqa ** Ruraqpa hayñinta k'irisqa -** Wandaluchasqa", +** Kikin kamariqpa mañakusqan +** P'itisqa pusapuna", 'delete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy", 'delete-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqakunata qulluyqa saywachasqam, {{SITENAME}}ta mana waqllinapaq.", 'delete-warning-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqata qulluspaykiqa, {{SITENAME}}ta waqllinkimanchá. Kay ruraymanta anchata yuyaychakuspa hamut'ay.", @@ -2359,7 +2413,7 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.', Qhipaq kaq llamk'apusqaqa [[User:$3|$3]]-pa ([[User talk:$3|rimanakuy]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) rurasqanmi.", 'editcomment' => "Llamk'apusqakunamanta pisichasqaqa kay hinam: \"''\$1''\".", 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|rimachina]]) sutiyuq ruraqpa hukchasqankunaqa kutichisqam [[User:$1|$1]]-pa ñawpaq hukchasqanman', -'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam [[User:$1|$1]]-pa ñawpaq llamk'apusqanta paqarichispa", +'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam {{GENDER:$1|[[User:$1|$1]]}}-pa ñawpaq llamk'apusqanta paqarichispa", 'rollback-success' => "$1-pa hukchasqankunaqa kutichisqañam $2-pa ñawpaq llamk'apusqanta paqarichispa.", # Edit tokens @@ -2493,7 +2547,7 @@ $1', 'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna", 'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna", 'mycontris' => "Llamk'apusqaykuna", -'contribsub2' => '$1 ($2)', +'contribsub2' => '{{GENDER:$3|$1}}paq ($2)', 'nocontribs' => 'Manam kay hina hukchasqakuna kanchu.', 'uctop' => '(qhipaq hukchasqa)', 'month' => 'Kay killamanta (ñawpaqmantapas):', @@ -2644,11 +2698,8 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will 'ipb_blocked_as_range' => "Pantasqa: IP $1 huchhaqa manam chiqallachu hark'asqa kaptinmi manam paskanallachu. Chaywanpas, $2 patayayku kaspataq hark'asqam kachkan. Chay patayaykuqa hark'asqamanta paskanallam.", 'ip_range_invalid' => "IP huchha k'itiqa manam chanichkanchu.", 'ip_range_toolarge' => "/$1-manta aswan hatun k'iti hark'aykunaqa manam saqillasqachu.", -'blockme' => "Hark'away", 'proxyblocker' => "Proxy hark'aq", -'proxyblocker-disabled' => 'Kay ruranamanqa ama nisqam.', 'proxyblockreason' => "IP huchhaykiqa hark'asqam kichasqa proxy kaptinmi. Ama hina kaspa, internet mink'aqniykiman icha allwiya yanapaqniykiman kay hatun qasi sasachakuymanta willay.", -'proxyblocksuccess' => 'Rurasqañam.', 'sorbsreason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam.', 'sorbs_create_account_reason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam. Manam atinkichu rakiqunata kichayta', 'cant-block-while-blocked' => "Kikiyki hark'asqa kaspaykiqa, manam huk ruraqkunata hark'ayta atinkichu.", @@ -3000,13 +3051,13 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall 'pageinfo-length' => "P'anqap chhikan (byte)", 'pageinfo-article-id' => "P'anqap ID-nin", 'pageinfo-language' => "P'anqap rimaynin", -'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin', -'pageinfo-robot-index' => 'Maskana yuyarinapaqpas', -'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq', +'pageinfo-robot-policy' => 'Maskana kuyuchinam yuyarinachan', +'pageinfo-robot-index' => 'Saqillasqa', +'pageinfo-robot-noindex' => 'Mana saqillasqa', 'pageinfo-views' => "Hayk'a qhawaykuna", 'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna", 'pageinfo-few-watchers' => '$1-manta aswan pisi {{PLURAL:$1|qhawaq|qhawaqkuna}}', -'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna", +'pageinfo-redirects-name' => "Kay p'anqaman hayk'a pusampuqkuna", 'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna", 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pusapuna|pusapunakuna}}; $3 {{PLURAL:$3|mana pusapuna|mana pusapunakuna}})', 'pageinfo-firstuser' => "P'anqap kamariqnin", @@ -3339,7 +3390,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi 'exif-compression-4' => 'CCITT Huñu 4 tilifaks llawiy', 'exif-copyrighted-true' => 'Iskaychay hayñi kan', -'exif-copyrighted-false' => 'Sapsi kapuy', +'exif-copyrighted-false' => "Ruraqpa iskaychay hayñin kachkayqa mana sut'ichasqachu", 'exif-unknowndate' => "Mana riqsisqa p'unchaw", @@ -3597,7 +3648,7 @@ Kay takyachina tuyruqa $4 pachapim puchukanqa.', 'confirmemail_body_set' => 'Pipas, qamchiki, $1 IP huchhayuq tiyaymanta, hukcharqan {{SITENAME}}pi "$2" sutiyuq rakiqunapaq e-chaski imamaytatam kay imamaytaman. -Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita musuqmanta takyachinaykipaq: +Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita takyachinaykipaq: $3 @@ -3794,7 +3845,10 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY 'tags-tag' => 'Unanchachap sutin', 'tags-display-header' => "Hukchasqakunamanta sutisuyup rikch'akuynin", 'tags-description-header' => "Sut'inmanta hunt'a ch'uyanchaynin", +'tags-active-header' => 'Ruraqllachu?', 'tags-hitcount-header' => 'Unanchasqa hukchasqakuna', +'tags-active-yes' => 'Arí', +'tags-active-no' => 'Mana', 'tags-edit' => "llamk'apuy", 'tags-hitcount' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}', @@ -3950,4 +4004,10 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni # Image rotation 'rotate-comment' => "Rikch'aqa pacha rikuchiqwan $1 {{PLURAL:$1|k'atma}} muyusqam", +# Limit report +'limitreport-cputime-value' => '$1 {{PLURAL:$1|sikundu|sikundukuna}}', +'limitreport-walltime-value' => '$1 {{PLURAL:$1|sikundu|sikundukuna}}', +'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}', +'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}', + ); diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php index a83bdc3ebd..f944b9684e 100644 --- a/languages/messages/MessagesRm.php +++ b/languages/messages/MessagesRm.php @@ -2452,12 +2452,9 @@ Eventualmain è ella gia vegnida annulada.", Ella e bloccada en la zona d'adressas IP $2 che po vegnir debloccà.", 'ip_range_invalid' => "Zona d'adressas IP nunvalida.", 'ip_range_toolarge' => "Zonas da bloccadas pli grondas che /$1 n'èn betg lubidas.", -'blockme' => 'Bloccar mai', 'proxyblocker' => 'Bloccar proxys', -'proxyblocker-disabled' => 'Questa funcziun è deactivada.', 'proxyblockreason' => "Tia adressa IP è vegnida bloccada perquai ch'ella è in proxy avert. Contactescha tes provider dals survetschs d'internet u ils administraturs dal sistem ed als infurmescha davart quest problem da segirezza pussaivel.", -'proxyblocksuccess' => 'Terminà.', 'sorbsreason' => 'Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.', 'sorbs_create_account_reason' => "Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}. Ti na pos betg crear in conto d'utilisader.", diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php index 81d6ae0779..ad808244b1 100644 --- a/languages/messages/MessagesRo.php +++ b/languages/messages/MessagesRo.php @@ -518,7 +518,7 @@ $messages = array( 'articlepage' => 'Vedeți articolul', 'talk' => 'Discuție', 'views' => 'Vizualizări', -'toolbox' => 'Trusa de unelte', +'toolbox' => 'Unelte', 'userpage' => 'Vizualizați pagina utilizatorului', 'projectpage' => 'Vizualizați pagina proiectului', 'imagepage' => 'Vizualizați pagina fișierului', @@ -2824,12 +2824,9 @@ Jurnalul suprimărilor este indicat mai jos:', Face parte din area de blocare $2, care nu poate fi deblocată.', 'ip_range_invalid' => 'Serie IP invalidă.', 'ip_range_toolarge' => 'Blocările mai mari de /$1 nu sunt permise.', -'blockme' => 'Blochează-mă', 'proxyblocker' => 'Blocaj de proxy', -'proxyblocker-disabled' => 'Această funcție este dezactivată.', 'proxyblockreason' => 'Adresa dumneavoastră IP a fost blocată pentru că este un proxy deschis. Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii IT și să-i informați asupra acestei probleme serioase de securitate.', -'proxyblocksuccess' => 'Realizat.', 'sorbsreason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în DNSBL.', 'sorbs_create_account_reason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în lista neagră DNS. Nu vă puteți crea un cont', @@ -3184,6 +3181,8 @@ Permite adăugarea unui motiv în descrierea modificărilor', 'spam_reverting' => 'Revenire la ultima versiune care nu conține legături către $1', 'spam_blanking' => 'Toate versiunile conținând legături către $1 au fost golite', 'spam_deleting' => 'Toate versiunile conținând legături către $1 au fost șterse', +'simpleantispam-label' => "Verificare antispam. +'''NU''' completați!", # Info page 'pageinfo-title' => 'Informații pentru „$1”', diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php index 393d036dad..bc1f7730e0 100644 --- a/languages/messages/MessagesRoa_tara.php +++ b/languages/messages/MessagesRoa_tara.php @@ -2615,12 +2615,9 @@ Pò essere ca ha state già sbloccate.", Jidde ha state bloccate cumme parte de l'indervalle $2, ca pò essere sbloccate.", 'ip_range_invalid' => "L'indervalle de l'IP non g'è valide.", 'ip_range_toolarge' => 'Le indervalle de le blocche cchiù larie de /$1 non ge sonde permesse.', -'blockme' => 'Bloccheme', 'proxyblocker' => 'Bloccaore de proxy', -'proxyblocker-disabled' => "'A funzione ha state disabbilitete.", 'proxyblockreason' => "L'indirizze IP tue ha state bloccate purcè jè 'nu proxy apirte. Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbormescele de stu serie probbleme de securezze.", -'proxyblocksuccess' => 'Spicciete.', 'sorbs' => 'DNSBL', 'sorbsreason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.", 'sorbs_create_account_reason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}. @@ -2994,6 +2991,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a 'spam_reverting' => "Turnanne a l'urtema revisione no ge condiene collegaminde a $1", 'spam_blanking' => 'Tutte le revisiune condènene collegaminde a $1, vacande', 'spam_deleting' => 'Tutte le revisiune condènene collegaminde a $1, stoche a scangelle', +'simpleantispam-label' => "Verifiche andi-spam. +'''NO''' anghiè quiste!", # Info page 'pageinfo-title' => '\'Mbormaziune pe "$1"', diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php index afcb7f7fb3..8eb25d11a5 100644 --- a/languages/messages/MessagesRu.php +++ b/languages/messages/MessagesRu.php @@ -55,6 +55,7 @@ * @author Incnis Mrsi * @author Iniquity * @author Innv + * @author Ivan Shmakov * @author Jackie * @author JenVan * @author Jl @@ -886,7 +887,7 @@ $2', 'logout' => 'Завершение сеанса', 'userlogout' => 'Завершение сеанса', 'notloggedin' => 'Вы не представились системе', -'userlogin-noaccount' => 'Нет учетной записи?', +'userlogin-noaccount' => 'Нет учётной записи?', 'userlogin-joinproject' => 'Присоединиться к проекту', 'nologin' => 'Нет учётной записи? $1.', 'nologinlink' => 'Создать учётную запись', @@ -1449,9 +1450,10 @@ $1", 'revdelete-concurrent-change' => 'Ошибка изменения записи от $2, $1: её статус был изменён кем-то другим, пока вы пытались изменить его. Пожалуйста, проверьте журналы.', 'revdelete-only-restricted' => 'Ошибка сокрытия записи от $2 $1: вы не можете скрыть запись от просмотра администраторами без выбора одной из других настроек сокрытия.', -'revdelete-reason-dropdown' => 'Стандартные причины удаления +'revdelete-reason-dropdown' => '* Стандартные причины удаления ** Нарушение авторских прав ** Неуместные личные сведения +** Неуместное имя участника ** Потенциально клеветнические сведения', 'revdelete-otherreason' => 'Другая/дополнительная причина:', 'revdelete-reasonotherlist' => 'Другая причина', @@ -2965,11 +2967,8 @@ $1', 'ipb_blocked_as_range' => 'Ошибка: IP-адрес $1 был заблокирован не напрямую и не может быть разблокирован. Однако, он принадлежит к заблокированному диапазону $2, который можно разблокировать.', 'ip_range_invalid' => 'Недопустимый диапазон IP-адресов.', 'ip_range_toolarge' => 'Блокировки диапазонов свыше /$1 запрещены.', -'blockme' => 'Заблокируй меня', 'proxyblocker' => 'Блокировка прокси', -'proxyblocker-disabled' => 'Функция отключена.', 'proxyblockreason' => 'Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.', -'proxyblocksuccess' => 'Выполнено.', 'sorbsreason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL.', 'sorbs_create_account_reason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.', 'xffblockreason' => 'Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1', @@ -3337,6 +3336,8 @@ The wiki server can't provide data in a format your client can read.", 'spam_reverting' => 'Откат к последней версии, не содержащей ссылки на $1', 'spam_blanking' => 'Все версии содержат ссылки на $1, очистка', 'spam_deleting' => 'Все версии содержали ссылки на $1, производится удаление', +'simpleantispam-label' => "Анти-спам проверка. +'''НЕ''' заполняйте это!", # Info page 'pageinfo-title' => 'Сведения по «$1»', diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php index a7375db991..210df3b427 100644 --- a/languages/messages/MessagesRue.php +++ b/languages/messages/MessagesRue.php @@ -2586,12 +2586,9 @@ $1', 'ipb_blocked_as_range' => 'Хыба: IP-адреса $1 не є блокована прямо а так єй не є можне одблоковати. Є частёв заблокованого россягу $2, котрый може быти одблокованый.', 'ip_range_invalid' => 'Неплатный IP россяг.', 'ip_range_toolarge' => 'Блокованя россягів векшых як /$1 не є дозволене.', -'blockme' => 'Заблокуй ня', 'proxyblocker' => 'Блокованя проксі', -'proxyblocker-disabled' => 'Тота фунція є выпнута.', 'proxyblockreason' => 'Ваша IP-адреса была заблокована, зато же фунґує як отвореный проксі сервер. Контактуйте свого Інтернет-провайдера або технічну підпору і інформуйте їх о тім серьёзнім беспечностнім проблемі.', -'proxyblocksuccess' => 'Готово.', 'sorbsreason' => 'Ваша IP-адреса є веджена як отвореный проксі в DNSBL.', 'sorbs_create_account_reason' => 'Ваша IP-адреса є веджена як одкрытый проксі в DNSBL. З той адресы собі не можете створити конто.', 'xffblockreason' => 'IP адреса написана в голові X-Forwarded-For, ці уж ваша, або проксі сервера, што хоснуєете, была заблокована. Оріґінална прічіна того блокованя: $1', @@ -2925,6 +2922,8 @@ $2', 'spam_reverting' => 'Реверт на послїдню верзію необсягуючу одказы на $1', 'spam_blanking' => 'Вшыткы ревізії обсяговали одказы на $1, выпорожнєны', 'spam_deleting' => 'Вшыткы ревізії обсяговали одказы на $1, змазане', +'simpleantispam-label' => "Перевірка на спам. +'''НЕ''' заповнюйте тото!", # Info page 'pageinfo-title' => 'Інформація про "$1"', diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php index 36a4d5b3c2..1272862232 100644 --- a/languages/messages/MessagesSa.php +++ b/languages/messages/MessagesSa.php @@ -2639,12 +2639,9 @@ $1 इत्यस्य अवरोधस्य कारणं तु "$2" $2 इति प्रकारस्य अवरोधं कर्तुं शक्यते यत् अनवरोधमिच्छति ।', 'ip_range_invalid' => 'अमान्यः ऐपिप्रकारः', 'ip_range_toolarge' => '/$1 तः अधिकं वृहत्प्रकारकः अवरोधः नानुमतः ।', -'blockme' => 'माम् अवरुणद्धु ।', 'proxyblocker' => 'प्रतिहस्तकः अवरोधकः ।', -'proxyblocker-disabled' => 'अयं कार्यकलापः निष्क्रियः ।', 'proxyblockreason' => 'भवतः ऐपि सङ्केतः अवरुद्धः यतः अयं कश्चन मुक्तप्रतिहस्तकः । अन्तर्जालसेवादायकं सम्पर्कयतु गभीरायाः सुरक्षासमस्यायाः विषये सूचयतु च', -'proxyblocksuccess' => 'समापित ।', 'sorbsreason' => 'DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः', 'sorbs_create_account_reason' => 'DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।', 'cant-block-while-blocked' => 'अन्ययोजकान् अवरोद्धुं भवान् नैव शक्नोति यतः भवान् अवरुद्धः ।', @@ -2977,6 +2974,8 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 'spam_reverting' => '$1 इत्यनेन नानुबद्धनां प्राचीनपुनरावृत्तीनां पुनस्थापनं कुर्वन्ति ।', 'spam_blanking' => 'सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः पूर्णपाठाः अपनीयन्ते ।', 'spam_deleting' => 'सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः । पूर्णपाठाः अपनीयन्ते ।', +'simpleantispam-label' => "अनिष्टसन्देशविरोधपरीक्षणम् । +अस्मिन् '''नहि''' पूर्यताम् !", # Info page 'pageinfo-title' => '"$1" कृते सूचनाः ।', diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php index a525e966fc..2990ac89df 100644 --- a/languages/messages/MessagesSah.php +++ b/languages/messages/MessagesSah.php @@ -2543,11 +2543,8 @@ $1', 'ipb_blocked_as_range' => 'Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа суох. Ол гынан баран IP бу $2 диапазон сорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун устуохха) сөп.', 'ip_range_invalid' => 'IP-лар диапазоннара сатаммат.', 'ip_range_toolarge' => 'Мантан /$1 үөһэ диапазоннары хааччахтыыр сатаммат.', -'blockme' => 'Миигин боп (блокируйдаа)', 'proxyblocker' => 'Прокси бобуллуута', -'proxyblocker-disabled' => 'Бу дьайыы араарыллыбыт.', 'proxyblockreason' => 'Эн IP-Ò¥ аһаҕас прокси эбит, онон бобулунна. Интернет-провайдергын эбэтэр техническэй сулууспаны кытта сибээстэһэн кутталлаах суол баарын биллэр.', -'proxyblocksuccess' => 'Сатанна.', 'sorbsreason' => 'Эн IP-Ò¥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.', 'sorbs_create_account_reason' => 'Эн IP-Ò¥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар. Саҥаттан бэлиэтэнэр кыаҕыҥ суох.', 'xffblockreason' => 'X-Forwarded-For баһыгар баар IP-аадырыс бобуллубут. Бу IP Эйиэнэ эбэтэр туһанар проксиҥ гиэнэ буолуон сөп. Бобуу төрүөтэ маннык эбит: $1', @@ -2899,6 +2896,8 @@ $2', 'spam_reverting' => 'Манна: $1 ыйынньыга суох бүтэһик торуму сөргүтүү (төннөрүү)', 'spam_blanking' => 'Бары торумнар манна "$1" ыйынньыктаахтар, барытын суох оҥоруу', 'spam_deleting' => 'Бары барыллар манна "$1" сигэнэллэр эит, сотуу бара турар', +'simpleantispam-label' => "Анти-спам бэрэбиэркэтэ. +Маны '''толорумаҥ'''!", # Info page 'pageinfo-title' => '"$1" туһунан', diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php index 99e5c2bcc6..0b18a5c5c1 100644 --- a/languages/messages/MessagesSat.php +++ b/languages/messages/MessagesSat.php @@ -1035,8 +1035,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena', 'block-log-flags-nocreate' => 'Ekauná¹­ benao do bondogeya', 'block-log-flags-noemail' => 'E-mail do esetgea', 'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea', -'blockme' => 'Esedińmẽ', -'proxyblocksuccess' => 'Hoena', # Move page 'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ', diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php index 94762316cb..bfc2b2be00 100644 --- a/languages/messages/MessagesSc.php +++ b/languages/messages/MessagesSc.php @@ -1208,8 +1208,6 @@ Abbàida sa [[Special:BlockList|lista de IP bloccados]] pro bìder sas bloccadur 'blocklogentry' => 'bloccau [[$1]] pro unu tempu de $2 $3', 'unblocklogentry' => 'at sbloccau $1', 'block-log-flags-nocreate' => 'creatzione account bloccada', -'blockme' => 'Blocca·mi', -'proxyblocksuccess' => 'Fatu.', 'sorbs' => 'DNSBL', # Developer tools diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php index 51ba6e0a89..4a257c8dc7 100644 --- a/languages/messages/MessagesScn.php +++ b/languages/messages/MessagesScn.php @@ -2145,11 +2145,8 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]] 'ipb_cant_unblock' => 'Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.', 'ipb_blocked_as_range' => 'Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.', 'ip_range_invalid' => 'Ntervallu di ndirizzi IP nun vàlidu.', -'blockme' => 'Blocca a mia', 'proxyblocker' => 'Blocca proxy', -'proxyblocker-disabled' => 'Sta funzioni nun è attiva.', 'proxyblockreason' => "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.", -'proxyblocksuccess' => 'Esiquitu.', 'sorbsreason' => 'Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.', 'sorbs_create_account_reason' => 'Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.', 'cant-block-while-blocked' => 'Nun putiti bluccari àutri utenti ntô mentri ca vui stissi siti bluccati.', diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php index a0e2972c82..736c64fe79 100644 --- a/languages/messages/MessagesSco.php +++ b/languages/messages/MessagesSco.php @@ -1230,7 +1230,6 @@ tae an afore-blockit IP address or uisername.', 'block-log-flags-nocreate' => 'accoont-makkin blockit', 'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.', 'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.', -'proxyblocksuccess' => 'Duin', 'sorbsreason' => 'Yer IP address is leetit as an open proxy in the DNSBL.', 'sorbs_create_account_reason' => 'Yer IP address is leetit as an open proxy in the DNSBL. Ye canna mak an accoont', diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php index fb2921fea9..2c4cb3b2c5 100644 --- a/languages/messages/MessagesSdc.php +++ b/languages/messages/MessagesSdc.php @@ -1513,11 +1513,8 @@ $1", 'ipb_cant_unblock' => 'Errori: Impussìbiri acciappà lu broccu cun ID $1. Lu broccu pudia assé già isthaddu buggaddu.', 'ipb_blocked_as_range' => "Errori: L'indirizzu IP $1 nò è broccaddu individuaimmenti e nò pó assé ibbruccaddu. Lu broccu è inveci attibu a libellu di l'intervallu $2, chi pó assé ibbruccaddu.", 'ip_range_invalid' => "Intervallu d'indirizzi ip nò vàriddu.", -'blockme' => 'Broccami', 'proxyblocker' => 'Broccu di li proxy abbérthi', -'proxyblocker-disabled' => 'Chistha funzioni nò è attiba.', 'proxyblockreason' => "Chisth'indirizzu IP è isthaddu broccaddu parchí risultha assé un proxy abbérthu. Pa piazeri cuntattà lu propriu frunidori di sivvìzi pa la reti pa infuimmalli di chisthu grabi probrema di sigguriddai.", -'proxyblocksuccess' => 'Broggu eseguiddu.', 'sorbsreason' => "Chisth'indirizzu IP è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.", 'sorbs_create_account_reason' => "Nò è pussìbiri crià nobi registhrazioni da chisthu indirizzu IP parchí è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.", diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php index a58585cb65..32339884cc 100644 --- a/languages/messages/MessagesSe.php +++ b/languages/messages/MessagesSe.php @@ -1214,7 +1214,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.', 'blocklink' => 'hehtte', 'contribslink' => 'rievdadusat', 'blocklogentry' => 'esttii geavaheaddji dahje IP-čujuhusa [[$1]], eastima bistin lea $2 $3', -'proxyblocksuccess' => 'Gárvvis.', # Developer tools 'lockdb' => 'Gidde diehtovuođu', diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php index 322ec1eefd..95e53d8969 100644 --- a/languages/messages/MessagesSgs.php +++ b/languages/messages/MessagesSgs.php @@ -1532,7 +1532,6 @@ onkstiau ožbluokoutam IP adresō a nauduotuojō.', 'ipb_expiry_invalid' => 'Galiuojėma čiesos nelaistėns.', 'ipb_already_blocked' => '„$1“ jau ožblokouts', 'ipb-needreblock' => '$1 jau Ä«r ožblokouts. A nuorėt pakeistė nustatÄ«mus?', -'proxyblocksuccess' => 'PadarÄ«t.', # Developer tools 'unlockdbtext' => 'Atrakėnos doumenÅ« baze grōžėns galimÄ«be vėsėm diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php index 34aeed93ff..5bafdd5b4d 100644 --- a/languages/messages/MessagesSh.php +++ b/languages/messages/MessagesSh.php @@ -2708,12 +2708,9 @@ Možda je već deblokirana.', Međ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.', -'blockme' => 'Blokiraj me', 'proxyblocker' => 'Bloker proksija', -'proxyblocker-disabled' => 'Ova funkcija je onemogućena.', 'proxyblockreason' => 'VaÅ¡a IP adresa je blokirana jer je ona otvoreni proksi. Molimo 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.', -'proxyblocksuccess' => 'Proksi uspjeÅ¡no blokiran.', '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}}. Ne možete napraviti račun', diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php index adcee78bf9..4a30265408 100644 --- a/languages/messages/MessagesSi.php +++ b/languages/messages/MessagesSi.php @@ -2601,12 +2601,9 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"', එනමුදු, එය, $2 පරාසයෙහි කොටසක් ලෙස වාරණයට ලක් කොට ඇති අතර, එහි වාරණය අත්හිටුවිය හැක.', 'ip_range_invalid' => 'අනීතික අන්තර්ජාල ලිපින පරාසයකි.', 'ip_range_toolarge' => '/$1 ට වඩා විශාල පරාස කොටස්වලට ඉඩ ලබා නොදේ.', -'blockme' => 'මා වාරණය කරන්න', 'proxyblocker' => 'ප්‍රතියුක්ත (ප්‍රොක්සි) වාරණකරු', -'proxyblocker-disabled' => 'මෙම කෘත්‍යය අක්‍රීය කොට ඇත.', 'proxyblockreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය විවෘත ප්‍රතියුක්තයක් (ප්‍රොක්සි) බැවින් එය වාරණය කොට ඇත. ඔබගේ අන්තර්ජාල සේවා ප්‍රතිපාදකයා හෝ තාක්ෂණික අනුග්‍රාහකයා හෝ අමතා මෙම බරපතළ ආරක්ෂණ ගැටළුව ඔවුනට නිරාවරණය කරන්න.', -'proxyblocksuccess' => 'සිදුකලා.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත.', 'sorbs_create_account_reason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත. @@ -2953,6 +2950,8 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"', 'spambot_username' => 'මීඩියාවිකි ස්පෑම් ඉවත්කිරීම', 'spam_reverting' => ' $1 හට සබැඳියන් නොමැති අවසන් අනුවාදය වෙත ප්‍රතිවර්තනය වෙමින්', 'spam_blanking' => 'සියළු සංශෝධනයන්හි $1 වෙතවූ සබැඳියන් අඩංගු විය, හිස්කරමින්', +'simpleantispam-label' => "ප්‍රති-ස්පෑම පරීක්‍ෂාව. +කරුණාකර මෙය පුරවන්න '''එපා'''!", # Info page 'pageinfo-title' => '"$1" සඳහා තොරතුරු', diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php index eb8b9e4c78..fb9d6160f6 100644 --- a/languages/messages/MessagesSk.php +++ b/languages/messages/MessagesSk.php @@ -2760,11 +2760,8 @@ blokované IP adresy nie sú zahrnuté. Pozri zoznam 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 nie je blokovaná priamo a nie je ju teda možné odblokovaÅ¥. Je vÅ¡ak blokovaná v rámci rozsahu $2, ktorý je možné odblokovaÅ¥.', 'ip_range_invalid' => 'Neplatný IP rozsah.', 'ip_range_toolarge' => 'Bloky rozsahov väčšie ako /$1 nie sú povolené.', -'blockme' => 'Zablokuj ma', 'proxyblocker' => 'Blokovač proxy', -'proxyblocker-disabled' => 'Táto funkcia je vypnutá.', 'proxyblockreason' => 'VaÅ¡a IP adresa bola zablokovaná, pretože je otvorená proxy. Prosím kontaktujte vášho internetového poskytovateľa alebo technickú podporu a informujte ich o tomto vážnom bezpečnostnom probléme.', -'proxyblocksuccess' => 'Hotovo.', 'sorbsreason' => 'VaÅ¡a IP adresa je vedená ako nezabezpečený proxy server v DNSBL.', 'sorbs_create_account_reason' => 'VaÅ¡a IP adresa je vedená ako nezabezpečený proxy server v databáze DNSBL, ktorú používa {{SITENAME}}. Nemôžete si vytvoriÅ¥ účet.', 'cant-block-while-blocked' => 'Nemôžete blokovaÅ¥ iných používateľov, kým ste zablokovaný.', @@ -3139,6 +3136,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na 'spam_reverting' => 'Vraciam poslednú verziu, ktorá neobsahuje odkazy na $1', 'spam_blanking' => 'VÅ¡etky revízie obsahovali odkaz na $1, odstraňujem obsah', 'spam_deleting' => 'VÅ¡etky revízie obsahovali odkaz na $1, odstraňuje sa', +'simpleantispam-label' => "Antispamová kontrola. +'''NEVYPĹŇAJTE''' nasledovné!", # Info page 'pageinfo-title' => 'Informácie o „$1“', diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php index bad752fec6..adc6c4a607 100644 --- a/languages/messages/MessagesSl.php +++ b/languages/messages/MessagesSl.php @@ -405,7 +405,7 @@ $messages = array( 'articlepage' => 'Prikaže članek', 'talk' => 'Pogovor', 'views' => 'Pogled', -'toolbox' => 'Pripomočki', +'toolbox' => 'Orodja', 'userpage' => 'Prikaži uporabnikovo stran', 'projectpage' => 'Prikaži projektno stran', 'imagepage' => 'Pokaži stran z datoteko', @@ -2746,12 +2746,9 @@ Ali želite spremeniti nastavitve blokade?', Je pa blokiran kot del območja $2, ki ga lahko odblokirate.', 'ip_range_invalid' => 'Neveljaven IP-razpon.', 'ip_range_toolarge' => 'Območja blokade večja od /$1 niso dovoljena.', -'blockme' => 'Blokiraj me', 'proxyblocker' => 'Blokator posredniÅ¡kih strežnikov', -'proxyblocker-disabled' => 'Funkcija je onemogočena.', 'proxyblockreason' => 'Ker uporabljate odprti posredniÅ¡ki strežnik, je urejanje z vaÅ¡ega IP-naslova preprečeno. Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehnično podporo.', -'proxyblocksuccess' => 'Storjeno.', 'sorbsreason' => 'VaÅ¡ IP-naslov je v DNSBL uvrščen med odprte posredniÅ¡ke strežnike.', 'sorbs_create_account_reason' => 'VaÅ¡ IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniÅ¡ki strežnik (proxy). Računa žal ne morete ustvariti.', @@ -3098,6 +3095,8 @@ Omogoča vnos pojasnila v povzetku urejanja.', 'spam_reverting' => 'Vračanje na zadnjo redakcijo brez povezav na $1', 'spam_blanking' => 'Vse redakcije so vsebovale povezave na $1, izpraznjujem', 'spam_deleting' => 'Vse redakcije so vsebovale povezave na $1, briÅ¡em', +'simpleantispam-label' => "Preverjanje proti smetju. +'''NE''' izpolnite tega!", # Info page 'pageinfo-title' => 'Informacije o »$1«', @@ -3769,7 +3768,7 @@ Prosimo, potrdite, da jo resnično želite znova ustvariti.", 'confirm-unwatch-top' => 'Odstranim stran z vaÅ¡ega spiska nadzorov?', # Separators for various lists, etc. -'percent' => '$1 %', +'percent' => '$1 %', # Multipage image navigation 'imgmultipageprev' => '← prejÅ¡nja stran', diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php index bb2ca41229..d9f0412597 100644 --- a/languages/messages/MessagesSli.php +++ b/languages/messages/MessagesSli.php @@ -1694,10 +1694,7 @@ Siehe de [[Special:BlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]] fi 'ipb_cant_unblock' => 'Fahler: Sperr-ID $1 ne gefunda. De Sperre wurde bereits uffgehuba.', 'ipb_blocked_as_range' => 'Fahler: De IP-Atresse $1 wurde ols Teel dar Bereichssperre $2 indirekt gesperrt. Anne Entsperrung vu $1 alleene ies ne meeglich.', 'ip_range_invalid' => 'Ungiltiger IP-Atressbereich.', -'blockme' => 'Sperre miech', -'proxyblocker-disabled' => 'Diese Funksjonn ies deaktiviert.', 'proxyblockreason' => 'Denne IP-Atresse wurde gesperrt, do se a offener Proxy ies. Bitte kontaktiere denn Internet-Provider oder denne Systemadministratoren und informiere se ieber dieses meegliche Sicherheetsproblem.', -'proxyblocksuccess' => 'Fattich', 'sorbsreason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet.', 'sorbs_create_account_reason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet. Doas Oalega neuer Nutzer ies ne meeglich.', 'cant-block-while-blocked' => 'Du koast kenne andern Nutzer sperra, während du selbst gesperrt best', diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php index 0ad5309da3..cfba54fe22 100644 --- a/languages/messages/MessagesSo.php +++ b/languages/messages/MessagesSo.php @@ -1300,8 +1300,6 @@ Eeg [[Special:BlockList|Mamnuucyada]] si aad u aragto liiska mamnuucyada ee hadd 'block-log-flags-nocreate' => 'sameynta gudagalah lamaogola', 'block-log-flags-noemail' => 'e-mailka laga mamnuucay', 'ipb-needreblock' => '$1 mar hore aa la mamnuucay. marabtaa in aad wax ka bedesho habka?', -'blockme' => 'I mamnuuc', -'proxyblocksuccess' => 'waa la sameeyay.', # Move page 'movenologin' => 'Gudaha kuma jirtid', diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php index 7c2e633bdf..b3aff4eb48 100644 --- a/languages/messages/MessagesSq.php +++ b/languages/messages/MessagesSq.php @@ -2601,11 +2601,8 @@ Mund të jetë zhbllokuar.', Ajo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.', 'ip_range_invalid' => 'Shtrirje IP gabim.', 'ip_range_toolarge' => 'Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.', -'blockme' => 'Më blloko', 'proxyblocker' => 'Bllokuesi i ndërmjetëseve', -'proxyblocker-disabled' => 'Ky funksion është pamundësuar.', 'proxyblockreason' => 'IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.', -'proxyblocksuccess' => 'Mbaruar.', 'sorbsreason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.', 'sorbs_create_account_reason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.', 'cant-block-while-blocked' => 'Ju nuk mund të bllokoni përdorues të tjerë ndërkohë që jeni i bllokuar.', @@ -2936,6 +2933,8 @@ Ju lutemi provoni përsëri.', 'spam_reverting' => "U kthye tek versioni i fundit që s'ka lidhje tek $1", 'spam_blanking' => 'U boshatis sepse të gjitha versionet kanë lidhje tek $1', 'spam_deleting' => 'Të gjitha inspektimet përmbanin lidhje në $1, duke fshirë', +'simpleantispam-label' => "Kontroll anti-spam. +'''MOS''' e plotësoni këtë!", # Info page 'pageinfo-title' => 'Informacion për " $1 "', diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php index b36c9c48e5..b28c453e9c 100644 --- a/languages/messages/MessagesSr_ec.php +++ b/languages/messages/MessagesSr_ec.php @@ -860,14 +860,15 @@ $2', 'userlogin-resetpassword-link' => 'Ресетујте лозинку', 'helplogin-url' => 'Help:Logging in', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]', +'userlogin-createanother' => 'Отвори још један налог', 'createacct-join' => 'Унесите своје податке испод', 'createacct-another-join' => 'Унесите податке за нови налог испод.', 'createacct-emailrequired' => 'Адреса е-поште', -'createacct-emailoptional' => 'Адреса е-поште (опцијоно)', +'createacct-emailoptional' => 'Адреса е-поште (опционо)', 'createacct-email-ph' => 'Унесите вашу адресу е-поште', 'createacct-another-email-ph' => 'Унесите адресу е-поште', 'createaccountmail' => 'Користите привремену, случајно створену лозинку и пошаљите на наведену адресу електронске поште', -'createacct-realname' => 'Право име (опцијоно)', +'createacct-realname' => 'Право име (опционо)', 'createaccountreason' => 'Разлог:', 'createacct-reason' => 'Разлог', 'createacct-reason-ph' => 'Зашто правите још један налог?', @@ -2775,7 +2776,7 @@ $1', 'contributions' => '{{GENDER:$1|Кориснички}} доприноси', 'contributions-title' => 'Доприноси {{GENDER:$1|корисника|кориснице|корисника}} $1', 'mycontris' => 'Доприноси', -'contribsub2' => 'За $1 ($2)', +'contribsub2' => 'За {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Измене које одговарају овим условима нису пронађене.', 'uctop' => '(последња)', 'month' => 'од месеца (и раније):', @@ -2933,12 +2934,9 @@ $1', Она је блокирана као део блокаде $2, која може бити деблокирана.', 'ip_range_invalid' => 'Неисправан распод ИП адреса.', 'ip_range_toolarge' => 'Опсежна блокирања већа од /$1 нису дозвољена.', -'blockme' => 'Блокирај ме', 'proxyblocker' => 'Блокер посредника', -'proxyblocker-disabled' => 'Ова функција је онемогућена.', 'proxyblockreason' => 'Ваша ИП адреса је блокирана јер представља отворени посредник. Обратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.', -'proxyblocksuccess' => 'Урађено.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.', 'sorbs_create_account_reason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}. @@ -3308,6 +3306,7 @@ $1', 'spam_reverting' => 'Враћам на последњу измену која не садржи везе до $1', 'spam_blanking' => 'Све измене садрже везе до $1. Чистим', 'spam_deleting' => 'Све измене садрже везе до $1. Бришем', +'simpleantispam-label' => "Провера спама. '''НЕ''' попуњавај ово унутра!", # Info page 'pageinfo-title' => 'Подаци о „$1“', @@ -4103,7 +4102,7 @@ $5 # Auto-summaries 'autosumm-blank' => 'Потпуно обрисана страница', -'autosumm-replace' => 'Замена садржаја са „$1“', +'autosumm-replace' => 'Замена садржаја странице са „$1“', 'autoredircomment' => 'Преусмерење на [[$1]]', 'autosumm-new' => 'Направљена страница са: „$1“', diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php index f1ea384452..bb7f381146 100644 --- a/languages/messages/MessagesSr_el.php +++ b/languages/messages/MessagesSr_el.php @@ -759,10 +759,10 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste joÅ¡ pr 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]', 'createacct-join' => 'Unesite svoje podatke ispod.', 'createacct-emailrequired' => 'Adresa e-poÅ¡te', -'createacct-emailoptional' => 'Adresa e-poÅ¡te (opcijono)', +'createacct-emailoptional' => 'Adresa e-poÅ¡te (opciono)', 'createacct-email-ph' => 'Unesite vaÅ¡u adresu e-pоšte', 'createaccountmail' => 'Koristite privremenu, slučajno stvorenu lozinku i poÅ¡aljite na navedenu adresu elektronske poÅ¡te', -'createacct-realname' => 'Pravo ime (opcijono)', +'createacct-realname' => 'Pravo ime (opciono)', 'createaccountreason' => 'Razlog:', 'createacct-reason' => 'Razlog', 'createacct-reason-ph' => 'ZaÅ¡to pravite joÅ¡ jedan nalog?', @@ -2629,7 +2629,7 @@ $1', 'contributions' => '{{GENDER:$1|Korisnički}} doprinosi', 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1', 'mycontris' => 'Doprinosi', -'contribsub2' => 'Za $1 ($2)', +'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.', 'uctop' => '(poslednja)', 'month' => 'od meseca (i ranije):', @@ -2787,12 +2787,9 @@ Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].', Ona je blokirana kao deo blokade $2, koja može biti deblokirana.', 'ip_range_invalid' => 'Neispravan raspod IP adresa.', 'ip_range_toolarge' => 'Opsežna blokiranja veća od /$1 nisu dozvoljena.', -'blockme' => 'Blokiraj me', 'proxyblocker' => 'Bloker posrednika', -'proxyblocker-disabled' => 'Ova funkcija je onemogućena.', 'proxyblockreason' => 'VaÅ¡a IP adresa je blokirana jer predstavlja otvoreni posrednik. Obratite se vaÅ¡em dobavljaču internet usluga ili tehničku podrÅ¡ku i obavestite ih o ovom ozbiljnom bezbednosnom problemu.', -'proxyblocksuccess' => 'Urađeno.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'VaÅ¡a IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.', 'sorbs_create_account_reason' => 'VaÅ¡a IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}. @@ -3161,6 +3158,7 @@ Ovo je verovatno izazvano vezom do spoljaÅ¡njeg sajta koji se nalazi na crnoj li 'spam_reverting' => 'Vraćam na poslednju izmenu koja ne sadrži veze do $1', 'spam_blanking' => 'Sve izmene sadrže veze do $1. Čistim', 'spam_deleting' => 'Sve izmene sadrže veze do $1. BriÅ¡em', +'simpleantispam-label' => "Provera spama. '''NE''' popunjavaj ovo unutra!", # Info page 'pageinfo-title' => 'Podaci o „$1“', @@ -3938,7 +3936,7 @@ Potvrdite da stvarno želite da napravite stranicu.", # Auto-summaries 'autosumm-blank' => 'Potpuno obrisana stranica', -'autosumm-replace' => 'Zamena sadržaja sa „$1“', +'autosumm-replace' => 'Zamena sadržaja stranice sa „$1“', 'autoredircomment' => 'Preusmerenje na [[$1]]', 'autosumm-new' => 'Napravljena stranica sa: „$1“', diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php index 9fcdd639ba..a5fb1179fc 100644 --- a/languages/messages/MessagesStq.php +++ b/languages/messages/MessagesStq.php @@ -2237,11 +2237,8 @@ Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässen un Benutsernoome 'ipb_blocked_as_range' => 'Failer: Ju IP-Adresse $1 wuude as Deel fon ju Beräksspeere $2 indirekt speerd. Ne Äntspeerenge fon $1 alleene is nit muugelk.', 'ip_range_invalid' => 'Uungultige IP-Adräsberäk.', 'ip_range_toolarge' => 'Adräsberäkke, do der gratter sunt as /$1, sunt nit ferlööwed.', -'blockme' => 'Speer mie', 'proxyblocker' => 'Proxy blokker', -'proxyblocker-disabled' => 'Disse Funktion is deaktivierd.', 'proxyblockreason' => 'Jou IP-Adrässe wuude speerd, deer ju n eepenen Proxy is. Kontaktierje jädden Jou Provider af Jou Systemtechnik un informierje Jou jou uur dit muugelke Sicherhaidsproblem.', -'proxyblocksuccess' => 'Kloor.', 'sorbsreason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested.', 'sorbs_create_account_reason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested. Du koast neen Benutser-Account anlääse.', 'cant-block-while-blocked' => 'Du duurst neen uur Benutsere speere, wan du sälwen speerd bäst.', @@ -2550,6 +2547,7 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.', 'spambot_username' => 'MediaWiki Spam-Süüwerenge', 'spam_reverting' => 'Lääste Version sunner Links tou $1 wier häärstoald.', 'spam_blanking' => 'Aal Versione äntheelden Links tou $1, skeenmoaked.', +'simpleantispam-label' => "Spamskuts-Wröige. Hier '''niks''' iendreege!", # Info page 'pageinfo-title' => 'Informatione tou „$1“', diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php index e8e7e2f22f..410e1ba2b8 100644 --- a/languages/messages/MessagesSu.php +++ b/languages/messages/MessagesSu.php @@ -2157,11 +2157,8 @@ Pikeun rujukan, logna dipidangkeun di handap ieu:', 'unblock-hideuser' => 'Anjeun teu bisa muka peungpeuk ieu pamaké, kusabab landihanan keur disumputkeun.', 'ipb_cant_unblock' => 'Éror: ID peungpeuk $1 teu kapanggih. Sigana mah geus dibuka.', 'ip_range_invalid' => 'Angka IP teu bener.', -'blockme' => 'Peungpeuk kuring', 'proxyblocker' => 'Pameungpeuk proxy', -'proxyblocker-disabled' => 'Ieu fungsi keur ditumpurkeun.', 'proxyblockreason' => "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.", -'proxyblocksuccess' => 'Réngsé.', 'sorbsreason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL.", 'sorbs_create_account_reason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening", 'cant-block-while-blocked' => 'Lamun keur dipeungpeuk, anjeun teu bisa meungpeuk séjén kontributor.', diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php index 1ca2f1a320..16d4439f2e 100644 --- a/languages/messages/MessagesSv.php +++ b/languages/messages/MessagesSv.php @@ -334,17 +334,17 @@ $messages = array( 'tog-newpageshidepatrolled' => 'Göm patrullerade sidor frÃ¥n listan över nya sidor', 'tog-extendwatchlist' => 'Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste', 'tog-usenewrc' => 'Gruppera ändringar efter sida i senaste ändringar och bevakningslistan', -'tog-numberheadings' => 'Numrerade rubriker', -'tog-showtoolbar' => 'Visa redigerings-verktygsraden', +'tog-numberheadings' => 'Automatisk numrerade rubriker', +'tog-showtoolbar' => 'Visa redigeringsverktygsraden', 'tog-editondblclick' => 'Redigera sidor med dubbelklick', 'tog-editsection' => 'Aktivera redigering av avsnitt genom [redigera]-länkar', 'tog-editsectiononrightclick' => 'Aktivera redigering av avsnitt genom högerklick pÃ¥ underrubriker', -'tog-showtoc' => 'Visa innehÃ¥llsförteckning (för sidor som har minst fyra rubriker)', +'tog-showtoc' => 'Visa innehÃ¥llsförteckning (för sidor med minst fyra rubriker)', 'tog-rememberpassword' => 'Kom ihÃ¥g min inloggning pÃ¥ den här webbläsaren (i maximalt $1 {{PLURAL:$1|dygn|dygn}})', -'tog-watchcreations' => 'Lägg till sidor jag skapar i min bevakningslista', -'tog-watchdefault' => 'Lägg till sidor jag redigerar i min bevakningslista', -'tog-watchmoves' => 'Lägg till sidor jag flyttar i min bevakningslista', -'tog-watchdeletion' => 'Lägg till sidor jag raderar i min bevakningslista', +'tog-watchcreations' => 'Lägg till sidor jag skapar och filer jag laddar upp till min bevakningslista', +'tog-watchdefault' => 'Lägg till sidor och filer jag redigerar i min bevakningslista', +'tog-watchmoves' => 'Lägg till sidor och filer jag flyttar i min bevakningslista', +'tog-watchdeletion' => 'Lägg till sidor och filer jag raderar i min bevakningslista', 'tog-minordefault' => 'Markera automatiskt ändringar som mindre', 'tog-previewontop' => 'Visa förhandsgranskningen ovanför redigeringsrutan', 'tog-previewonfirst' => 'Visa förhandsgranskning när redigering pÃ¥börjas', @@ -544,7 +544,7 @@ $messages = array( 'articlepage' => 'Visa innehÃ¥llssida', 'talk' => 'Diskussion', 'views' => 'Visningar', -'toolbox' => 'VerktygslÃ¥da', +'toolbox' => 'Verktyg', 'userpage' => 'Visa användarsida', 'projectpage' => 'Visa projektsida', 'imagepage' => 'Visa filsida', @@ -1547,7 +1547,7 @@ Programvaran använder detta värde för att adressera dig till andra med rätt 'prefs-help-realname' => 'Riktigt namn behöver inte anges. Om du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.', 'prefs-help-email' => 'Att ange e-postadress är valfritt, men gör det möjligt att fÃ¥ ditt lösenord mejlat till dig om du glömmer det.', -'prefs-help-email-others' => 'Du kan ocksÃ¥ välja att lÃ¥ta andra användare kontakta dig genom din användar-eller diskussionssida utan att avslöja din identitet.', +'prefs-help-email-others' => 'Du kan ocksÃ¥ välja att lÃ¥ta andra användare kontakta dig genom din användar- eller diskussionssida utan att avslöja din identitet.', 'prefs-help-email-required' => 'E-postadress mÃ¥ste anges.', 'prefs-info' => 'Grundläggande information', 'prefs-i18n' => 'Internationalisering', @@ -1599,7 +1599,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till # Groups 'group' => 'Grupp:', 'group-user' => 'Användare', -'group-autoconfirmed' => 'Bekräftade användare', +'group-autoconfirmed' => 'Automatiskt bekräftade användare', 'group-bot' => 'Robotar', 'group-sysop' => 'Administratörer', 'group-bureaucrat' => 'ByrÃ¥krater', @@ -2844,11 +2844,8 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke 'ipb_blocked_as_range' => 'Fel: IP-adressen $1 är inte direkt blockerad, och kan därför inte avblockeras. Adressen är blockerad som en del av IP-intervallet $2, som kan avblockeras.', 'ip_range_invalid' => 'Ogiltigt IP-intervall.', 'ip_range_toolarge' => 'Blockering av block större än /$1 är inte tillÃ¥tna.', -'blockme' => 'Blockera mig', 'proxyblocker' => 'Proxy-block', -'proxyblocker-disabled' => 'Den här funktionen är avaktiverad.', 'proxyblockreason' => 'Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.', -'proxyblocksuccess' => 'Gjort.', 'sorbsreason' => 'Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.', 'sorbs_create_account_reason' => 'Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}. Du fÃ¥r inte skapa ett användarkonto', @@ -3214,6 +3211,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.', 'spam_reverting' => 'Återställer till den senaste versionen som inte innehÃ¥ller länkar till $1', 'spam_blanking' => 'Alla versioner innehöll en länk till $1, blankar', 'spam_deleting' => 'Alla ändringar innehöll länkar till $1, raderar', +'simpleantispam-label' => "Anti-spamkontroll. +Fyll '''INTE''' i den här!", # Info page 'pageinfo-title' => 'Information om "$1"', diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php index 499b2b0b4e..d8ef376124 100644 --- a/languages/messages/MessagesSw.php +++ b/languages/messages/MessagesSw.php @@ -2294,8 +2294,6 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari 'block-log-flags-noemail' => 'barua pepe imezuiliwa', 'block-log-flags-hiddenname' => 'jina la mtumiaji limefichwa', 'ipb_already_blocked' => '"$1" tayari imeshazuiwa', -'blockme' => 'Nizuie', -'proxyblocksuccess' => 'Tayari.', # Developer tools 'lockdb' => 'Funga hifadhidata', diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php index f915f20a23..b31112648a 100644 --- a/languages/messages/MessagesSzl.php +++ b/languages/messages/MessagesSzl.php @@ -13,6 +13,7 @@ * @author Gaj777 * @author Herr Kriss * @author Kaganer + * @author Krol111 * @author Lajsikonik * @author Leinad * @author Lwh @@ -74,9 +75,9 @@ $messages = array( 'tog-usenewrc' => 'Używej poszyrzyńo ńydowno pomjyńanych (JavaScript)', 'tog-numberheadings' => 'Automatyczno numeracyjo titlůw', 'tog-showtoolbar' => 'Pokoż gurt werkcojgůw (JavaScript)', -'tog-editondblclick' => 'Edycja napoczynajům dwa klikńyńća (JavaScript)', +'tog-editondblclick' => 'Edycyjo napoczynajům dwa klikńyńća (JavaScript)', 'tog-editsection' => 'Kożdo tajla zajty sprowjano uosobno', -'tog-editsectiononrightclick' => 'Klikńyńće prawym kneflym myszy na titlu tajli
      napoczyno jego sprowjańy(JavaScript)', +'tog-editsectiononrightclick' => 'Klikńyńće prawym kneflym myszy na titlu tajli
      napoczyno jigo sprowjańy(JavaScript)', 'tog-showtoc' => 'Pokoż spis treśći (na zajtach, kere majům wjyncy jak trzi tajle)', 'tog-rememberpassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})', 'tog-watchcreations' => 'Dowům pozůr na zajty, kere żech naszkryfloł', @@ -94,7 +95,7 @@ $messages = array( 'tog-shownumberswatching' => 'Pokoż, wjela sprowjorzy dowo pozůr', 'tog-oldsig' => 'Teroźni wyglůnd Twojygo szrajbowańo', 'tog-fancysig' => 'Szrajbńij s kodůma wiki (bez autůmatycznygo linka)', -'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (eksperymentalny)', +'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (ekszperymentalny)', 'tog-forceeditsummary' => 'Pedź, kejbych ńic ńy naszkryfloł we uopiśe pomjyńań', 'tog-watchlisthideown' => 'Schow moje pomjyńańa we artiklach, na kere dowom pozůr', 'tog-watchlisthidebots' => 'Schow pomjyńańa sprowjone bez boty we artiklach, na kere dowom pozůr', @@ -106,6 +107,8 @@ $messages = array( 'tog-diffonly' => 'Ńy pokozuj treśći zajtůw půnižyj porůwnańo pomjyńań', 'tog-showhiddencats' => 'Pokoż schowane kategoryje', 'tog-norollbackdiff' => 'Uomiń pokozywańy pomjyńań po użyću funkcyje „cofej”', +'tog-useeditwarning' => 'Uostrzegej mje, kej uopuszczom zajta edycyji bez spamjyntańo půmjań', +'tog-prefershttps' => 'Zowdy używej pewne połůnczyńe przi logowańu', 'underline-always' => 'Dycki', 'underline-never' => 'Ńigdy', @@ -169,6 +172,15 @@ $messages = array( 'oct' => 'paź', 'nov' => 'lis', 'dec' => 'gru', +'january-date' => '$1 styczńa', +'february-date' => '$1 lutygo', +'april-date' => '$1 kwjytńa', +'may-date' => '$1 moja', +'june-date' => '$1 czyrwca', +'august-date' => '$1 śyrpńa', +'september-date' => '$1 wrzyśńa', +'october-date' => '$1 paźdźyrńika', +'december-date' => '$1 grudńa', # Categories related messages 'pagecategories' => '{{PLURAL:$1|Kategoryjo|Kategoryje|Kategoryj}}', @@ -194,8 +206,9 @@ $messages = array( 'newwindow' => '(uodwjyro śe we nowym uokńe)', 'cancel' => 'Uodćepej', 'moredotdotdot' => 'Wjyncy...', -'mypage' => 'Moja zajta', -'mytalk' => 'Mojo dyskusyjo', +'morenotlisted' => 'Ńy je to kůmplytno lista', +'mypage' => 'Zajta', +'mytalk' => 'Dyskusyjo', 'anontalk' => 'Godka tygo IP', 'navigation' => 'Nawigacyjo', 'and' => ' a', @@ -217,7 +230,7 @@ $messages = array( 'vector-action-protect' => 'Zawrzij', 'vector-action-undelete' => 'Wćep', 'vector-action-unprotect' => 'Uodymkńij', -'vector-simplesearch-preference' => 'Włącz zaawansowane podpowiedzi wyszukiwania (tylko dla skórki Wektor)', +'vector-simplesearch-preference' => 'Używej zaawansowane podpowjedźi sznupańo (ino lo skůrki Wektor)', 'vector-view-create' => 'Stwůrz', 'vector-view-edit' => 'Sprowjej', 'vector-view-history' => 'Uobocz gyszichta', @@ -227,6 +240,7 @@ $messages = array( 'namespaces' => 'Raumy mjan', 'variants' => 'Warjanty', +'navigation-heading' => 'Menu nawigacyji', 'errorpagetitle' => 'Feler', 'returnto' => 'Nazod do zajty $1.', 'tagline' => 'Ze {{GRAMMAR:D.lp|{{SITENAME}}}}', @@ -248,6 +262,7 @@ $messages = array( 'create-this-page' => 'Stwůrz ta zajta', 'delete' => 'Wyćep', 'deletethispage' => 'Wyćep ta zajta', +'undeletethispage' => 'Prziwrůć ta zajta', 'undelete_short' => 'Wćep nazod {{PLURAL:$1|jedna wersyjo|$1 wersyje|$1 wersyji}}', 'viewdeleted_short' => '{{PLURAL:$1|jedna wyćepano wersyjo|$1 wyćepane wersyje|$1 wyćepanych wersyjůw}}', 'protect' => 'Zawrzij', @@ -292,7 +307,7 @@ $1', # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage). 'aboutsite' => 'Uo {{GRAMMAR:MS.lp|{{SITENAME}}}}', 'aboutpage' => 'Project:Uo serwiśe', -'copyright' => 'Tekst udostympńany na licencyji $1.', +'copyright' => 'Tekst udostympńany na licencyji $1, eli inakszyj ńy podano.', 'copyrightpage' => '{{ns:project}}:Autorske prawa', 'currentevents' => 'Aktualne przitrefjyńa', 'currentevents-url' => 'Project:Aktualne przitrefjyńa', @@ -320,6 +335,10 @@ $1', 'youhavenewmessages' => 'Mosz $1 ($2).', 'newmessageslink' => 'nowe powjadůmjyńa', 'newmessagesdifflink' => 'uostatńe pomjyńyńy', +'youhavenewmessagesfromusers' => 'Mosz $1 uod {{PLURAL:$3|inszygo używocza|$3 używoczy}} ($2).', +'youhavenewmessagesmanyusers' => 'Mosz $1 uod wjelu używoczy ($2).', +'newmessageslinkplural' => '{{PLURAL:$1|jydno nowina|nowiny}}', +'newmessagesdifflinkplural' => '{{PLURAL:$1|uostatńe sprowjyńe|uostatńe sprowjyńa}}', 'youhavenewmessagesmulti' => 'Mosz nowe powjadůmjyńa: $1', 'editsection' => 'Sprowjej', 'editold' => 'sprowjej', @@ -369,6 +388,11 @@ Lista špecyjalnych zajtůw znejdźeš na [[Special:SpecialPages|{{int:specialpa # General errors 'error' => 'Feler', 'databaseerror' => 'Feler bazy danych', +'databaseerror-text' => 'Pojawjůł śe feler przi wysyłańu zapytańa do bazy danych. Mogebność je, aże je to feler we uoprogramowańu.', +'databaseerror-textcl' => 'Pojawjůł śe feler przi wysyłańu zapytańa do bazy danych.', +'databaseerror-query' => 'Zapytańe: $1', +'databaseerror-function' => 'Funkcyjo: $1', +'databaseerror-error' => 'Feler: $1', 'laggedslavemode' => 'Dej pozůr: Ta zajta može ńy mjeć nojnowšych aktualizacyjůw.', 'readonly' => 'Baza danych je zawarto', 'enterlockreason' => 'Naškryflej sam powůd zawarća bazy danych a za wjela (myńi-wjyncyj) ja uodymkńeš', @@ -399,6 +423,7 @@ Eli tak ńy je, możno śe trefił feler we softwaru MediaWiki. Kej ja, pedz uo 'badarticleerror' => 'Tyj uoperacyje ńy idźe zrobić lo tyj zajty.', 'cannotdelete' => 'Ńy idźe wyćepać podanyj zajty abo grafiki $1.', 'cannotdelete-title' => 'Ńy idźie wyćepać zajty "$1".', +'delete-hook-aborted' => 'Wyćepywańe sztopńynte bez hak. Przyczyna ńyuokreślůno.', 'badtitle' => 'Felerno tytůua', 'badtitletext' => 'Podano felerny titel zajty. Prawdopodańy sům w ńim znoki, kerych ńy wolno užywać we titlach abo je pusty.', 'perfcached' => 'To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a może ńy być aktualne. Nojwjyncyj {{PLURAL:$1|jydyn wynik je|$1 wyniki sům}} w tyj pamjyńći.', @@ -428,6 +453,8 @@ Powůd zawarćo: ''$2''.", Administrator kery zawarł wćepał kůmyntorz: "$3".', 'invalidtitle-knownnamespace' => 'Felerne mjano "$3" w przestrzeńy "$2".', +'exception-nologin' => 'Ńy jest żeś zalogůwany', +'exception-nologin-text' => 'Ta zajta abo akcyja wymogo byćo zalogůwanym na tyj wiki.', # Virus scanner 'virus-badscanner' => "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''", @@ -435,15 +462,28 @@ Administrator kery zawarł wćepał kůmyntorz: "$3".', 'virus-unknownscanner' => 'ńyznajůmy průgram antywirusowy', # Login and logout pages -'logouttext' => "'''Terozki ježeś wylůgowany'''. +'logouttext' => "'''Terozki jeżeś wylůgowany'''. -Možeš dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany užytkowńik, abo [$1 zalůgować śe nazod] kej tyn som abo inkšy užytkowńik. -Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co ježeś zalůgowany, a bydźe tak aže uodśwjyžyš jeij cache.", +Możesz dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany sprowjorz, abo [$1 zalůgować śe nazod] kej tyn som abo inkszy używocz. +Dej pozůr, co na ńykerych zajtach przeglůndarka może dali pokozywać co jeżeś zalůgowany, a bydźe tak aże uodśwjyżysz jeij cache.", +'welcomeuser' => 'Witej, $1', +'welcomecreation-msg' => 'Uotwarli my sam lo Ćebje kůnto. +Pamjyntej coby posztalować [[Special:Preferences|preferencyji]]', 'yourname' => 'Mjano użytkowńika:', +'userlogin-yourname' => 'Mjano używocza', +'userlogin-yourname-ph' => 'Wszkryflej swoje mjano użytkowńika', +'createacct-another-username-ph' => 'Wszkryflej mjano użytkowńika', 'yourpassword' => 'Hasło:', +'userlogin-yourpassword-ph' => 'Wszkryflej swoje hasło', +'createacct-yourpassword-ph' => 'Wszkryflej hasło', 'yourpasswordagain' => 'Naszkryflej ausdruk zaś', +'createacct-yourpasswordagain' => 'Potwjyrdź hasło', +'createacct-yourpasswordagain-ph' => 'Wszkryflej hasło jeszcze roz', 'remembermypassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})', +'userlogin-remembermypassword' => 'Ńy wylogůwywuj mje', +'userlogin-signwithsecure' => 'Użyj bezpjecznygo połůnczyńa', 'yourdomainname' => 'Twoja domyna', +'password-change-forbidden' => 'Ńy można půmjyńać haseł na tyj wiki.', 'externaldberror' => 'Je jaki feler we zewnyntřnyj baźe autentyfikacyjnyj, abo ńy moš uprawńyń potřebnych do aktualizacyji zewnyntřnego kůnta.', 'login' => 'Zaloguj śe', 'nav-login-createaccount' => 'Logowańy / tworzińy kůnta', @@ -453,14 +493,18 @@ Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co jež 'logout' => 'Wyloguj', 'userlogout' => 'Uodloguj śe', 'notloggedin' => 'Ńy ježeś zalůgowany', +'userlogin-noaccount' => 'Ńy mosz kůnta?', +'userlogin-joinproject' => 'Doćep śe do {{SITENAME}}', 'nologin' => "Ńy mosz kůnta? '''$1'''.", 'nologinlink' => 'Twůrz kůnto', 'createaccount' => 'Twůrz nowe kůnto', 'gotaccount' => "Mosz już kůnto? '''$1'''.", 'gotaccountlink' => 'Naloguj śe', 'userlogin-resetlink' => 'Zapomńoł żeś dane lo nalogowańo?', -'createaccountmail' => 'e-brifym', +'createaccountmail' => 'Użyj chwilowygo hasła losowo genyrowanygo a wyślij je na wrychtowany adres e-brifa.', +'createacct-realname' => 'Prawdźiwe imje a nazwisko (uopcjůnalńe)', 'createaccountreason' => 'Kůmyntorz:', +'createacct-reason' => 'Powůd:', 'badretype' => 'Hasua kere žeś naškryflou ńy zgodzajům śe jydne s drugim.', 'userexists' => 'Mjano użytkowńika, kere żeś wybroł, je zajynte. Wybjer, prosza, inksze mjano.', 'loginerror' => 'Feler při logůwańu', @@ -498,8 +542,8 @@ Zalůguj śe zaś jak dostańyš tygo brifa.', 'blocked-mailpassword' => 'Twůj adres IP zostou zawarty a ńy možeš užywać funkcyje odzyskiwańo hasua skuli možliwośći jeji nadužywańo.', 'eauthentsent' => 'Potwjerdzeńy zostoło posłane na e-brifa. Jak bydźesz chćoł, coby wysyłouo Ći e-brify, pjyrwyj go przeczytej. Bydźesz tam mjoł instrukcyjo co mosz zrobić, coby pokozać, aże tyn ausdruk je Twůj.', -'throttled-mailpassword' => 'Připůmńyńy hasua bůuo juž wysuane bez {{PLURAL:$1|uostatńo godźina|uostatńe $1 godźin}}. -Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano na jydne bez {{PLURAL:$1|godźina|$1 godźiny}}.', +'throttled-mailpassword' => 'Przipůmńyńy hasła bůło już wysłane bez {{PLURAL:$1|uostatńo godźina|uostatńe $1 godźin}}. +Coby powstrzimać nadużyća, mogebność wysyłańo przipůmńyń nasztalowano na jydne bez {{PLURAL:$1|godźina|$1 godźiny}}.', 'mailerror' => 'Při wysyuańu e-brifa zdořiu śe feler: $1', 'acct_creation_throttle_hit' => 'Przikro nom, założył(a)żeś już {{PLURAL:$1|1 kůnto|$1 kůnta}}. Ńy możesz założyć kolejnygo.', 'emailauthenticated' => 'Twůj adres e-brifa zostou uwjeřitelńůny $2 uo $3.', @@ -510,11 +554,11 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano 'cannotchangeemail' => 'Ńy możno pomjyńyc ausdruku e-mail.', 'emaildisabled' => 'Ta zajta ńy je mogebna posyłać e-brify.', 'accountcreated' => 'Utwůřůno kůnto', -'accountcreatedtext' => 'Kůnto lo $1 zostouo utwůřůne.', +'accountcreatedtext' => 'Kůnto lo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|dyskusyjo]]) je utwůrzůne.', 'createaccount-title' => 'Stwořyńy kůnta na {{GRAMMAR:MS.lp|{{SITENAME}}}}', 'createaccount-text' => 'Ktoś utworził na {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4) dla Twojego adresa e-brif kůnto "$2". Aktualne hasło to "$3". Powińeżeś śe terozki zalogůwać a je zmjyńić.', 'usernamehasherror' => 'Nazwa sprowjorza ńy może mjyć buchsztaby "#".', -'login-throttled' => '!Wykonołżeś za wjela průb zalůgowańo śe na te kůnto. Poczekej chwila ńym zaś sprůbujesz.', +'login-throttled' => 'Wykonołżeś za wjela průb zalůgowańo śe na te kůnto. Uodczekej $1 ńym zaś sprůbujesz.', 'login-abort-generic' => 'Felerne logowańe', 'loginlanguagelabel' => 'Godka: $1', 'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.', @@ -531,7 +575,7 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano 'newpassword' => 'Nowe hasło', 'retypenew' => 'Naszkryflej jeszcze roz nowe hasło:', 'resetpass_submit' => 'Naštaluj hasuo a zalůguj', -'changepassword-success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...', +'changepassword-success' => 'Twoje hasło zostoło půmyślńy půmjyńone!', 'resetpass_forbidden' => 'Ńy idźe sam půmjyńyć hasuůw.', 'resetpass-no-info' => 'Muśysz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.', 'resetpass-submit-loggedin' => 'Zmjyń hasło', @@ -904,6 +948,7 @@ $1', 'editundo' => 'uodćepej', 'diff-multi' => '(Ńy pokozano {{PLURAL:$1|jydnyj wersyji postrzedńij|$1 wersyji postrzedńich}}, sprowjanej bez {{PLURAL:$2|jydnygo sprowjorza|$2 sprowjorzow}} .)', 'diff-multi-manyusers' => '(Ńy pokozano {{PLURAL:$1|jydnyj wersyji postrzedńij|$1 wersyji postrzedńich}}, sprowjanej bez {{PLURAL:$2|jydnygo sprowjorza|$2 sprowjorzow}} .)', +'difference-missing-revision' => '{{PLURAL:$2|Wersyjo|$2 wersyje|$2 wersyji}} #$1 zajty "{{PAGENAME}}" ńy {{PLURAL:$2|uostoła znaleźůno|uostoły znaleźůne|uostoło znaleźůnych}}. Zauobycz je to skiż starygo linky do wyćępanyj zajty. Powůd wyćepańa nojdźesz we [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejerze].', # Search results 'searchresults' => 'Wyńiki sznupańo', @@ -946,7 +991,7 @@ $1', 'search-interwiki-default' => '$1 wyńiki:', 'search-interwiki-more' => '(wjyncyj)', 'search-relatedarticle' => 'Podane', -'mwsuggest-disable' => 'Wyuůnč sůgestyje AJAX', +'mwsuggest-disable' => 'Wyłůncz sůgestyje AJAX', 'searcheverything-enable' => 'Sznupej we wszech mjan', 'searchrelated' => 'podane', 'searchall' => 'wszyjske', @@ -965,10 +1010,11 @@ $1', 'powersearch-togglenone' => 'żodno', 'search-external' => 'Šnupańy zewnyntřne', 'searchdisabled' => 'Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.', +'search-error' => 'Wystůmpjůł feler przi sznupańu: $1', # Preferences page 'preferences' => 'Preferyncyje', -'mypreferences' => 'Moje preferyncyje', +'mypreferences' => 'Preferyncyje', 'prefs-edits' => 'Liczba sprowjyń:', 'prefsnologin' => 'Ńy ježeś zalůgowany', 'prefsnologintext' => 'Muśiš śe [{{fullurl:{{#Special:UserLogin}}|returnto=$1}} zalůgować] coby štalować swoje preferyncyje.', @@ -1027,14 +1073,14 @@ $1', 'timezoneregion-indian' => 'Ocean Indyjski', 'timezoneregion-pacific' => 'Uocean Spokojny', 'allowemail' => 'Inkśi užytkowńicy můgům přesyuać mje e-brify', -'prefs-searchoptions' => 'Uopcyje šnupańo', +'prefs-searchoptions' => 'Sznupańe', 'prefs-namespaces' => 'Přystřyńe mjan', 'defaultns' => 'Důmyślńy sznupej we nastympujůncych przystrzyńach mjan:', 'default' => 'důmyślńy', 'prefs-files' => 'Pliki', 'youremail' => 'E-brif:', -'username' => 'Mjano użytkowńika:', -'uid' => 'ID užytkowńika:', +'username' => '{{GENDER:$1|Mjano używocza}}:', +'uid' => 'ID używocza:', 'prefs-memberingroups' => 'Należy do {{PLURAL:$1|grupy|grup:}}', 'prefs-registration' => 'Czas twůrzyńa kůnta:', 'yourrealname' => 'Prawdźiwe mjano', @@ -1042,8 +1088,8 @@ $1', 'yournick' => 'Twoja šrajba:', 'badsig' => 'Felerno šrajba, sprowdź značńiki HTML.', 'badsiglength' => 'Twůj szrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchsztaby|buchsztabůw}}', -'yourgender' => 'Płeć', -'gender-unknown' => 'ńyznana', +'yourgender' => 'Płeć:', +'gender-unknown' => 'ńyznano', 'gender-male' => 'chop', 'gender-female' => 'baba', 'email' => 'E-brif', @@ -2002,12 +2048,9 @@ Coby přejřeć lista uobecńy aktywnych zawarć, přyńdź na zajta [[Special:B 'ipb_blocked_as_range' => 'Feler: Adres IP $1 ńy zostou zawarty bezpośredńo i ńy može zostać uodymkńjynty. Noležy uůn do zawartygo zakresu adresůw $2. Uodymknůńć možno ino couki zakres.', 'ip_range_invalid' => 'Ńypoprowny zakres adresów IP.', -'blockme' => 'Zawryj mi sprowjyńa', 'proxyblocker' => 'Zawjyrańe proxy', -'proxyblocker-disabled' => 'Ta fůnkcyjo je wůuůnčůna.', 'proxyblockreason' => 'Twůj adres IP zostou zawarty, bo je to adres uotwartygo proxy. Sprawa noležy wyjaśńić s dostawcům Internetu abo půmocům techńičnům informujůnc uo tym powažnym problymje s bezpječyństwym.', -'proxyblocksuccess' => 'Wykůnane.', 'sorbsreason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.', 'sorbs_create_account_reason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}. Ńy možeš utwořić kůnta', diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php index e112f26c50..d2fd4c6a16 100644 --- a/languages/messages/MessagesTa.php +++ b/languages/messages/MessagesTa.php @@ -2429,12 +2429,9 @@ $1', 'ipb_blocked_as_range' => 'தவறு:இந்த ஐ.பி. $1 நேரடியாக தடைச் செய்யப்படவில்லை எனவே தடையை நீக்க முடியாது. இது $2 என்ற ஐ.பி. வீச்சு தடைச் செய்யப்பட்டதால் தடைச் செய்யப்பட்டுள்ளது இவ்வீச்சிற்கான தடையை நீக்க முடியும்.', 'ip_range_invalid' => 'செல்லுபடியற்ற ஐ.பி. வீச்சு', 'ip_range_toolarge' => '/$1 க்கு பெரிய வரம்பு தடுப்புகள் அனுமதிக்கப்படவில்லை.', -'blockme' => 'என்னை தடைச் செய்', 'proxyblocker' => 'மறைவணுக்கம் (புரொக்சி) தடுப்பி', -'proxyblocker-disabled' => 'இந்தச் செயல் செயலிழக்கச் முடக்கப்பட்டுள்ளது.', 'proxyblockreason' => 'உங்கள் IP முகவரி தடை செய்யப்பட்டுள்ளது ஏனெனில் இது ஒரு திறந்த பதிலி(proxy). தயவுசெய்து உங்கள் இணைய சேவை வழங்குபவரையோ அல்லது உங்கள் நிறுவனத்தின் தொழில்நுட்ப ஆதரவையோ தொடர்பு கொள்ளவும் மேலும் அவர்களிடம் இந்த கடுமையான பாதுகாப்பு பிரச்சினை பற்றி தெரிவியுங்கள்.', -'proxyblocksuccess' => 'வெற்றி.', 'sorbsreason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக DNSBL பயன்படுத்தப்படுவதாக {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது.', 'sorbs_create_account_reason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக DNSBL பயன்படுத்தப்படுவதாக {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது. உங்களால் கணக்கை உருவாக்க இயலாது.', diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php index 2f40eb2189..532db2c38e 100644 --- a/languages/messages/MessagesTe.php +++ b/languages/messages/MessagesTe.php @@ -1326,7 +1326,7 @@ $1", 'group-bot' => 'బాట్‌లు', 'group-sysop' => 'నిర్వాహకులు', 'group-bureaucrat' => 'అధికారులు', -'group-suppress' => 'పరాకులు', +'group-suppress' => 'మార్పులను పూర్తిగా కనిపించకుండాచేయుట', 'group-all' => '(అందరూ)', 'group-user-member' => '{{GENDER:$1|వాడుకరి}}', @@ -1334,14 +1334,14 @@ $1", 'group-bot-member' => '{{GENDER:$1|బాట్}}', 'group-sysop-member' => '{{GENDER:$1|నిర్వాహకుడు|నిర్వాహకురాలు}}', 'group-bureaucrat-member' => '{{GENDER:$1|అధికారి|అధికారిణి}}', -'group-suppress-member' => 'పరాకు', +'group-suppress-member' => '{{GENDER:$1|మార్పులను పూర్తిగా కనిపించకుండాచేయుట}}', 'grouppage-user' => '{{ns:project}}:వాడుకరులు', 'grouppage-autoconfirmed' => '{{ns:project}}:ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు', 'grouppage-bot' => '{{ns:project}}:బాట్లు', 'grouppage-sysop' => '{{ns:project}}:నిర్వాహకులు', 'grouppage-bureaucrat' => '{{ns:project}}:అధికార్లు', -'grouppage-suppress' => '{{ns:project}}:పరాకు', +'grouppage-suppress' => '{{ns:project}}:మార్పులను పూర్తిగా కనిపించకుండాచేయుట', # Rights 'right-read' => 'పేజీలు చదవడం', @@ -1902,7 +1902,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.', 'nopagetext' => 'మీరు అడిగిన పేజీ లేదు', 'pager-newer-n' => '{{PLURAL:$1|1 కొత్తది|$1 కొత్తవి}}', 'pager-older-n' => '{{PLURAL:$1|1 పాతది|$1 పాతవి}}', -'suppress' => 'పరాకు', +'suppress' => 'మార్పులను పూర్తిగా కనిపించకుండాచేయుట', 'querypage-disabled' => 'పనితీరు కారణాల వలన, ఈ ప్రత్యేకపేజీని అశక్తం చేసాం.', # Book sources @@ -2433,11 +2433,8 @@ $1', 'ipb_blocked_as_range' => 'లోపం: ఐపీ $1 ను నేరుగా నిరోధించలేదు, అంచేత నిరోధాన్ని రద్దుపరచలేము. అయితే, అది $2 శ్రేణిలో భాగంగా నిరోధానికి గురైంది, ఈ శ్రేణిపై ఉన్న నిరోధాన్ని రద్దుపరచవచ్చు.', 'ip_range_invalid' => 'సరైన ఐపీ శ్రేణి కాదు.', 'ip_range_toolarge' => '/$1 కంటే పెద్దవైన సామూహిక నిరోధాలు అనుమతించబడవు.', -'blockme' => 'నన్ను నిరోధించు', 'proxyblocker' => 'ప్రాక్సీ నిరోధకం', -'proxyblocker-disabled' => 'ఈ ఫంక్షన్ను అశక్తం చేసాం.', 'proxyblockreason' => 'మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీ కాబట్టి దాన్ని నిరోధించాం. మీ ఇంటర్నెట్ సేవాదారుని గానీ, సాంకేతిక సహాయకుని గానీ సంప్రదించి తీవ్రమైన ఈ భద్రతా వైఫల్యాన్ని గురించి తెలపండి.', -'proxyblocksuccess' => 'పూర్తయింది.', 'sorbsreason' => '{{SITENAME}} వాడే DNSBLలో మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీగా నమోదై ఉంది.', 'sorbs_create_account_reason' => 'మీ ఐపీ అడ్రసు DNSBL లో ఓపెను ప్రాక్సీగా నమోదయి ఉంది. మీరు ఎకౌంటును సృష్టించజాలరు.', 'cant-block-while-blocked' => 'నిరోధంలో ఉన్న మీరు ఇతర వాడుకరులపై నిరోధం అమలుచేయలేరు.', diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php index 46dcd5cca1..f7ea5cd2fa 100644 --- a/languages/messages/MessagesTg_cyrl.php +++ b/languages/messages/MessagesTg_cyrl.php @@ -1720,11 +1720,8 @@ $1', 'ipb_cant_unblock' => 'Хато: Нишонаи баста шудани $1 ёфт нашуд. Мумкин аст пештар боз шуда бошад.', 'ipb_blocked_as_range' => 'Хато: Нишонаи IP-и $1 ба шакли мустақим баста нашудааст ва наметавонад боз шавад. Ин нишона ҳамроҳи $2, баста шуда қобили боз шудан аст.', 'ip_range_invalid' => 'Сафи IP номӯътабар аст.', -'blockme' => 'Дастрасии манро қать кун', 'proxyblocker' => 'Проксибанд', -'proxyblocker-disabled' => 'Ин амал ғайрифаъол шудааст.', 'proxyblockreason' => 'Аз сабаби пешкор боз (open proxy) буданаш, нишонаи IP-и шумо баста шудааст. Лутфан бо таъминкунандаи хизматҳои Интернетии худ ё пуштибони техникӣ тамос бигиред ва онҳоро бо ин мушкилии амниятии муҳим огоҳ кунед.', -'proxyblocksuccess' => 'Анҷом шуд.', 'sorbsreason' => 'Нишонаи IP-и шумо ҳамчун як проксии кушода дар DNSBL феҳрист шудааст, ки аз тарафи {{SITENAME}} истифода мешавад.', 'sorbs_create_account_reason' => 'Нишонаи IP-и шумо ҳамчун проксии кушода дар DNSBL, ки аз тарафи {{SITENAME}} истифода мешавад, феҳрист шудааст. Шумо наметавонед ҳисоби корабариеро эҷод кунед', diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php index 07f31cc5bb..40debf6bcb 100644 --- a/languages/messages/MessagesTg_latn.php +++ b/languages/messages/MessagesTg_latn.php @@ -1507,11 +1507,8 @@ Baroi fehristi mahrumijatho va basta şudanhoi amalijoti kununī ba [[Special:Bl 'ipb_cant_unblock' => 'Xato: Nişonai basta şudani $1 joft naşud. Mumkin ast peştar boz şuda boşad.', 'ipb_blocked_as_range' => 'Xato: Nişonai IP-i $1 ba şakli mustaqim basta naşudaast va nametavonad boz şavad. In nişona hamrohi $2, basta şuda qobili boz şudan ast.', 'ip_range_invalid' => "Safi IP nomū'tabar ast.", -'blockme' => 'Dastrasiji manro qatь kun', 'proxyblocker' => 'Proksiband', -'proxyblocker-disabled' => "In amal ƣajrifa'ol şudaast.", 'proxyblockreason' => "Az sababi peşkor boz (open proxy) budanaş, nişonai IP-i şumo basta şudaast. Lutfan bo ta'minkunandai xizmathoi Internetiji xud jo puştiboni texnikī tamos bigired va onhoro bo in muşkiliji amnijatiji muhim ogoh kuned.", -'proxyblocksuccess' => 'Ançom şud.', 'sorbsreason' => 'Nişonai IP-i şumo hamcun jak proksiji kuşoda dar DNSBL fehrist şudaast, ki az tarafi {{SITENAME}} istifoda meşavad.', 'sorbs_create_account_reason' => 'Nişonai IP-i şumo hamcun proksiji kuşoda dar DNSBL, ki az tarafi {{SITENAME}} istifoda meşavad, fehrist şudaast. Şumo nametavoned hisobi korabariero eçod kuned', diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php index c955c0635d..a0d9ec1ede 100644 --- a/languages/messages/MessagesTh.php +++ b/languages/messages/MessagesTh.php @@ -647,6 +647,8 @@ $1', 'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่', 'helplogin-url' => 'Help:การล็อกอิน', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]', +'userlogin-loggedin' => 'คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว +ใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง', 'userlogin-createanother' => 'สร้างอีกบัญชี', 'createacct-join' => 'กรอกสารสนเทศของคุณด้านล่าง', 'createacct-another-join' => 'กรอกข้อมูลของบัญชีใหม่ด้านล่าง', @@ -1105,7 +1107,7 @@ $2 คุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]", 'rev-suppressed-diff-view' => "รุ่นหนึ่งของผลต่างนี้'''ถูกยับยั้ง''' คุณสามารถดูผลต่างนี้ได้ รายละเอียดพบได้ใน[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ปูมการยับยั้ง]", -'rev-delundel' => 'แสดง/ซ่อน', +'rev-delundel' => 'เปลี่ยนทัศนวิสัย', 'rev-showdeleted' => 'แสดง', 'revisiondelete' => 'ลบ/กู้คืนรุ่น', 'revdelete-nooldid-title' => 'ไม่มีรุ่นที่ต้องการ', @@ -1429,6 +1431,8 @@ $1", 'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิผู้ใช้', 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้', 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้', +'userrights-conflict' => 'พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ', +'userrights-removed-self' => 'คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีกต่อไป', # Groups 'group' => 'กลุ่ม:', @@ -2107,6 +2111,8 @@ $1', 'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง', # SpecialCachedPage +'cachedspecial-viewing-cached-ttl' => 'คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1', +'cachedspecial-viewing-cached-ts' => 'คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจไม่เป็นจริงทั้งหมด', 'cachedspecial-refresh-now' => 'ดูล่าสุด', # Special:Categories @@ -2130,7 +2136,7 @@ $1', 'linksearch-ok' => 'ค้นหา', 'linksearch-text' => 'สามารถใช้ตัวแทนเช่น "*.wikipedia.org" ได้ ต้องการโดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"
      -{PLURAL:$2|โพรโทคอล}}ที่รองรับ: $1 (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)', +{{PLURAL:$2|โพรโทคอล}}ที่รองรับ: $1 (ค่าโดยปริยายเป็น http:// หากไม่ระบุโพรโทคอล)', 'linksearch-line' => '$1 ถูกลิงก์จาก $2', 'linksearch-error' => 'อักขระตัวแทนอยู่ได้เฉพาะหน้าชื่อโฮสต์เท่านั้น', @@ -2309,9 +2315,11 @@ $UNWATCHURL 'deleteotherreason' => 'เหตุผลอื่น/เพิ่มเติม:', 'deletereasonotherlist' => 'เหตุผลอื่น', 'deletereason-dropdown' => '* เหตุผลการลบทั่วไป -** รับแจ้งจากผู้เขียน +** สแปม +** ก่อกวน ** ละเมิดลิขสิทธิ์ -** ก่อกวน', +** ผู้เขียนร้องขอ +** การเปลี่ยนทางเสีย', 'delete-edit-reasonlist' => 'แก้ไขเหตุผลการลบ', 'delete-toobig' => 'หน้านี้มีประวัติการแก้ไขนาดใหญ่ คือ กว่า $1 รุ่น การลบหน้าเช่นนี้ถูกจำกัดเพื่อป้องกันการรบกวน{{SITENAME}}โดยบังเอิญ', 'delete-warning-toobig' => 'หน้านี้มีประวัติการแก้ไขขนาดใหญ่ กว่า $1 รุ่น การลบหน้านี้อาจรบกวนการทำงานของฐานข้อมูลของ {{SITENAME}} โปรดดำเนินการด้วยความระมัดระวัง', @@ -2329,7 +2337,7 @@ $UNWATCHURL ผู้แก้ไขล่าสุดของหน้านี้คือ [[User:$3|$3]] ([[User talk:$3|พูดคุย]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])', 'editcomment' => "คำอธิบายอย่างย่อคือ: \"''\$1''\"", 'revertpage' => 'ย้อนการแก้ไขของ [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ไปยังรุ่นของ [[User:$1|$1]]', -'revertpage-nouser' => 'ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นล่าสุดโดย [[User:$1|$1]]', +'revertpage-nouser' => 'ย้อนการแก้ไขโดยผู้ใช้ไม่ระบุชื่อไปยังรุ่นสุดท้ายโดย {{GENDER:$1|[[User:$1|$1]]}}', 'rollback-success' => 'ย้อนรุ่นที่แก้ไขโดย $1 ไปยังรุ่นล่าสุดโดย $2', # Edit tokens @@ -2471,7 +2479,7 @@ $1', 'contributions' => 'เรื่องที่เขียนโดย{{GENDER:$1|ผู้ใช้}}นี้', 'contributions-title' => 'เรื่องที่เขียนโดย $1', 'mycontris' => 'เรื่องที่เขียน', -'contribsub2' => 'สำหรับ $1 ($2)', +'contribsub2' => 'สำหรับ {{GENDER:$3|$1}} ($2)', 'nocontribs' => 'ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้', 'uctop' => '(ปัจจุบัน)', 'month' => 'จากเดือน (และก่อนหน้า):', @@ -2629,11 +2637,8 @@ $1', อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้', 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง', 'ip_range_toolarge' => 'พิสัยบล็อกที่มีขนาดใหญ่กว่า /$1 จะไม่ได้รับอนุญาต', -'blockme' => 'บล็อกฉัน', 'proxyblocker' => 'บล็อกพร็อกซี', -'proxyblocker-disabled' => 'ฟังก์ชันนี้ถูกปิดใช้งาน', 'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้', -'proxyblocksuccess' => 'สำเร็จ', 'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้', 'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ คุณไม่สามารถสร้างบัญชีได้', @@ -2659,6 +2664,7 @@ $1', 'unlockdbsuccesstext' => 'ปลดล็อกฐานข้อมูลเรียบร้อย', 'lockfilenotwritable' => 'ไม่สามารถล็อกฐานข้อมูลได้ เนื่องจากการเขียนลงฐานข้อมูล การล็อกและการปลดล็อกจำเป็นต้องทำที่เว็บเซิร์ฟเวอร์', 'databasenotlocked' => 'ฐานข้อมูลไม่ได้ล็อก', +'lockedbyandtime' => '(โดย {{GENDER:$1|$1}} เมื่อวันที่ $2 เวลา $3)', # Move page 'move-page' => 'ย้าย $1', @@ -2898,7 +2904,7 @@ $1', 'tooltip-t-recentchangeslinked' => 'รายการปรับปรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้', 'tooltip-feed-rss' => 'ฟีดชนิดอาร์เอสเอส (RSS) ของหน้านี้', 'tooltip-feed-atom' => 'ฟีดอะตอม (Atom) ของหน้านี้', -'tooltip-t-contributions' => 'รายการเรื่องที่เขียนโดยผู้ใช้คนนี้', +'tooltip-t-contributions' => 'รายการเรื่องที่เขียนโดยผู้ใช้นี้', 'tooltip-t-emailuser' => 'ส่งอีเมลถึงผู้ใช้นี้', 'tooltip-t-upload' => 'อัปโหลดไฟล์', 'tooltip-t-specialpages' => 'รายการหน้าพิเศษทั้งหมด', @@ -3057,8 +3063,8 @@ $1', 'filedelete-archive-read-only' => 'ไดเรกทอรีกรุชื่อ "$1" ไม่สามารถเขียนลงได้โดยเว็บเซิร์ฟเวอร์', # Browsing diffs -'previousdiff' => '← แตกต่างก่อนหน้า', -'nextdiff' => 'แตกต่างถัดไป →', +'previousdiff' => '← การแก้ไขก่อนหน้า', +'nextdiff' => 'การแก้ไขถัดไป →', # Media information 'mediawarning' => "'''คำเตือน''': ไฟล์รูปแบบนี้อาจมีโค้ดที่ไม่พึงประสงค์ diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php index 4a29ea13fb..7c7b5e1877 100644 --- a/languages/messages/MessagesTk.php +++ b/languages/messages/MessagesTk.php @@ -778,8 +778,8 @@ $3 tarapyndan görkezilen sebäp: ''$2''", '''({{int:last}})''' = öňündäki wersiýadan tapawudy, '''{{int:minoreditletter}}''' = ujypsyzja özgerdiş.", 'history-fieldset-title' => 'Geçmişe göz aýla', 'history-show-deleted' => 'Diňe öçürilenler', -'histfirst' => 'Iň irki', -'histlast' => 'Ýaňy-ýakyndaky', +'histfirst' => 'iň köne', +'histlast' => 'iň täze', 'historysize' => '({{PLURAL:$1|1 baýt|$1 baýt}})', 'historyempty' => '(boş)', @@ -1282,7 +1282,7 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.', 'rc_categories' => 'Kategoriýalar bilen çäklendir ("|" bilen aýyr)', 'rc_categories_any' => 'Islendik', 'newsectionsummary' => '/* $1 */ täze bölüm', -'rc-enhanced-expand' => 'Jikme-jiklikleri görkez (JavaScript gerekli)', +'rc-enhanced-expand' => 'Jikme-jikligi görkez', 'rc-enhanced-hide' => 'Jikme-jiklikleri gizle', # Recent changes linked @@ -2055,9 +2055,9 @@ $1', 'contributions' => '{{GENDER:$1|Ulanyjy}} goşantlary', 'contributions-title' => '$1 üçin ulanyjy goşantlary', 'mycontris' => 'Goşantlar', -'contribsub2' => '$1 ($2)', +'contribsub2' => '{{GENDER:$3|$1}} üçin ($2)', 'nocontribs' => 'Bu kriteriýlere gabat gelýän üýtgeşme ýok.', -'uctop' => '(iň soňky)', +'uctop' => '(häzirki)', 'month' => 'Aý:', 'year' => 'Ýyl:', @@ -2192,12 +2192,9 @@ Blokirlemesi eýýäm aýyrylan bolmagy mümkin.', Emma, bu adres $2 diapazonynyň bir bölegi hökmünde blokirlenipdir, diapazon blokirlemesini aýryp bilersiňiz.', 'ip_range_invalid' => 'Nädogry IP diapazony.', 'ip_range_toolarge' => '/$1 blokdan uly aralyk blokirlemelere rugsat berilmeýär', -'blockme' => 'Meni blokirle', 'proxyblocker' => 'Proksi blokirleýji', -'proxyblocker-disabled' => 'Bu funksiýa ýapyk.', 'proxyblockreason' => 'IP adresiňiz açyk proksidigi sebäpli blokirlenipdir. Internet üpjün edijiňiz ýa-da goldaw gullugy bilen habarlaşyp, olary bu çynlakaý howpsuzlyk problemasy barada habardar ediň.', -'proxyblocksuccess' => 'Ýerine ýetirildi.', 'sorbsreason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.', 'sorbs_create_account_reason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr. Hasap açyp bilmeýärsiňiz.', @@ -2491,6 +2488,8 @@ Mazmun üçin bir sebäp goşmaga rugsat berýär', 'spambot_username' => 'MediaWiki spam arassalaýyş', 'spam_reverting' => '$1 sahypasyna çykgytlary bolmadyk iň soňky wersiýasyna yzyna getirilýär', 'spam_blanking' => 'Ähli wersiýalarda $1 sahypasyna çykgytlar bar, boşadylýar', +'simpleantispam-label' => "Anti-spam barlagy. +Muny '''DOLDURMAŇ'''!", # Patrolling 'markaspatrolleddiff' => 'Patrullyk edilen diýip belle', diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php index 8a0f80463d..becffb7c3c 100644 --- a/languages/messages/MessagesTl.php +++ b/languages/messages/MessagesTl.php @@ -2591,11 +2591,8 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy 'ipb_blocked_as_range' => 'Mali: Hindi diretsong nakaharang ang IP na $1 at hindi maaaring tanggalin sa pagkakaharang. Bagaman, bahagi ito sa sakop na $2, na maaaring tanggalin sa pagkaharang.', 'ip_range_invalid' => 'Hindi tamang sakop ng IP.', 'ip_range_toolarge' => 'Hindi pinapayagan ang mga saklaw ng pagharang na mas malaki kaysa /$1.', -'blockme' => 'Harangin ako', 'proxyblocker' => 'Pangharang ng proxy', -'proxyblocker-disabled' => 'Nakapatay ang pagharang sa proxy.', 'proxyblockreason' => 'Hinarang ang IP address mo dahil bukas na proxy ito. Makipag-ugnayan sa iyong tagabigay ng serbisyong Internet o suportang teknikal at ipaalam sa kanila itong seryesong suliranin sa seguridad.', -'proxyblocksuccess' => 'Tapos na.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito.', 'sorbs_create_account_reason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito. Hindi ka makakalikha ng akawnt', @@ -2956,6 +2953,8 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn 'spam_reverting' => "Ibinabalik sa huling bersyon na 'di-naglalaman ng mga kawing sa $1", 'spam_blanking' => 'Lahat ng mga pagbabago ay naglalaman ng mga kawing sa $1, pagpapatlang', 'spam_deleting' => 'Lahat ng mga pagbabago ay naglalaman ng mga kawing sa $1, binubura', +'simpleantispam-label' => "Pagsusuring panlaban sa \"manlulusob\" (''spam''). +'''HUWAG''' itong lagyan ng laman!", # Info page 'pageinfo-title' => 'Kabatiran para sa "$1"', diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php index 5deddb1546..1329371295 100644 --- a/languages/messages/MessagesTo.php +++ b/languages/messages/MessagesTo.php @@ -890,7 +890,6 @@ Vakai ki he [[Special:Log/delete|hokohoko tāmateʻi]] ki he lekooti ʻo e ngaah 'ipb_already_blocked' => 'Kuo ʻosi taʻofi ʻa e "$1"', 'ipb_cant_unblock' => 'Hala: naʻe ʻikai ʻilo ko e taʻofi fika $1. Mahalo pē kuo ʻosi ʻene taʻetaʻofi.', 'ip_range_invalid' => 'ʻOku taʻeʻaonga ʻa e fakavā IP', -'proxyblocksuccess' => 'Kuo fai.', # Developer tools 'lockdb' => 'Lokaʻi ʻa e tānekingaʻilo', diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php index d9accb7661..c0c2bef050 100644 --- a/languages/messages/MessagesTr.php +++ b/languages/messages/MessagesTr.php @@ -36,6 +36,7 @@ * @author LuCKY * @author Mach * @author Manco Capac + * @author Meelo * @author Metal Militia * @author Mirzali * @author Mskyrider @@ -1550,8 +1551,8 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.', 'yourgender' => 'Nasıl açıklamayı tercih edersiniz?', 'gender-unknown' => 'Söylemek istemiyorsanız', -'gender-male' => 'Wiki düzenlemelerinde erkek olarak', -'gender-female' => 'Wiki düzenlemelerinde kadın olarak', +'gender-male' => 'Viki sayfalarını erkek olarak düzenliyorum', +'gender-female' => 'Viki sayfalarını kadın olarak düzenliyorum', 'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır. Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır. Bu bilgiler herkes tarafından görülebilir.', @@ -2052,12 +2053,14 @@ Sıradaki liste sadece bu dosyaya bağlantı veren {{PLURAL:$1|ilk dosyayı|ilk 'morelinkstoimage' => 'Bu dosyaya [[Special:WhatLinksHere/$1|daha fazla bağlantıları]] gör.', 'linkstoimage-redirect' => '$1 (dosya yönlendirme) $2', 'duplicatesoffile' => 'Şu {{PLURAL:$1|dosya|$1 dosya}}, bu dosyanın kopyası ([[Special:FileDuplicateSearch/$2|daha fazla ayrıntı]]):', -'sharedupload' => 'Bu dosya $1 deposundan ve diğer projelerde kullanılıyor olabilir.', +'sharedupload' => 'Bu dosya $1 projesinden olup, diğer projelerde kullanılıyor olabilir.', 'sharedupload-desc-there' => 'Bu dosya $1 deposundan ve diğer projeler tarafından kullanılıyor olabilir. Daha fazla bilgi için lütfen [$2 dosya açıklama sayfasına] bakın.', 'sharedupload-desc-here' => 'Bu dosya $1 deposundan ve diğer projeler tarafından kullanılıyor olabilir. Aşağıda [$2 dosya açıklama sayfasındaki] açıklama gösteriliyor.', -'sharedupload-desc-create' => 'Bu dosya, $1 ve diğer projeler tarafından kullanılıyor olabilir. -Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bulunmaktadır.', +'sharedupload-desc-edit' => 'Bu dosya $1 projesinden olup, diğer projelerde kullanılıyor olabilir. +Dosyanın açıklama sayfasında değişiklik yapmak için ilgili sayfaya [$2 buradan] gidebilirsiniz.', +'sharedupload-desc-create' => 'Bu dosya $1 projesinden olup, diğer projelerde kullanılıyor olabilir. +Dosyanın açıklama sayfasında değişiklik yapmak için ilgili sayfaya [$2 buradan] gidebilirsiniz.', 'filepage-nofile' => 'Bu isimde bir dosya yok.', 'filepage-nofile-link' => 'Bu isimde bir dosya yok, ama siz [$1 yükleyebilirsiniz].', 'uploadnewversion-linktext' => 'Dosyanın yenisini yükleyin', @@ -2636,7 +2639,7 @@ $1', 'contributions' => '{{GENDER:$1|Kullanıcı}} katkıları', 'contributions-title' => '$1 için kullanıcı katkıları', 'mycontris' => 'Katkılar', -'contribsub2' => '$1 ($2)', +'contribsub2' => '{{GENDER:$3|$1}} ($2) tarafından', 'nocontribs' => 'Bu kriterlere uyan değişiklik bulunamadı', 'uctop' => '(son)', 'month' => 'Ay:', @@ -2789,12 +2792,9 @@ Engelleme kaldırılmış olabilir.', Ancak, bu adres $2 aralığının parçası olarak engellenmiş, aralık engellemesini kaldırabilirsiniz.', 'ip_range_invalid' => 'Geçersiz IP aralığı.', 'ip_range_toolarge' => '/$1 bloktan daha büyük aralık bloklarına izin verilmez.', -'blockme' => 'Beni engelle', 'proxyblocker' => 'Proxy engelleyici', -'proxyblocker-disabled' => 'Bu işlev devre dışı bırakıldı.', 'proxyblockreason' => 'IP adresiniz açık bir proxy olduğu için engellendi. Lütfen İnternet sevis sağlayınız ile ya da teknik destek ile irtibat kurun ve bu ciddi güvenlik probleminden haberdar edin.', -'proxyblocksuccess' => 'Tamamlanmıştır.', 'sorbsreason' => "IP adresiniz, {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.", 'sorbs_create_account_reason' => "IP adresiniz {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş. Hesap oluşturamazsınız", @@ -3118,6 +3118,8 @@ Geçici dosya kayıp.', 'spambot_username' => 'Medyaviki spam temizleme', 'spam_reverting' => '$1 ile bağlantı içermeyen son sürüme geri dönülüyor', 'spam_blanking' => 'Tüm revizyonlar $1 sayfasına bağlantı içeriyor, boşaltılıyor', +'simpleantispam-label' => "Anti-spam denetimi. +Bunu '''doldurmayın'''!", # Info page 'pageinfo-title' => 'Bilgi için "$1"', diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php index bb8c4f5c4f..f25aebf6e5 100644 --- a/languages/messages/MessagesTt_cyrl.php +++ b/languages/messages/MessagesTt_cyrl.php @@ -1992,7 +1992,6 @@ $1', 'block-log-flags-noemail' => 'хат җибәрү тыелган', 'block-log-flags-hiddenname' => 'кулланучының исеме яшерелгән', 'proxyblocker' => 'Прокси тыю', -'proxyblocksuccess' => 'Эшләнде', 'sorbsreason' => 'Сезнең IP адресыгыз DNSBLда ачык прокси дип санала.', # Developer tools diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php index 4fbc4eb97c..6d17c364f3 100644 --- a/languages/messages/MessagesTt_latn.php +++ b/languages/messages/MessagesTt_latn.php @@ -1687,7 +1687,6 @@ $1', 'ipb_expiry_invalid' => 'İskärü waqıtı xatalı.', 'ip_range_invalid' => 'Xatalı IP arası.', 'proxyblocker' => 'Proksi tıyu', -'proxyblocksuccess' => 'Eşlände', 'sorbsreason' => 'Sezneñ IP adresığız DNSBLda açıq proksi dip sanala.', # Developer tools diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php index 7c16f4ac2b..ac03870dce 100644 --- a/languages/messages/MessagesUdm.php +++ b/languages/messages/MessagesUdm.php @@ -151,7 +151,7 @@ $messages = array( 'index-category' => 'Индексировать кароно бамъёс', 'noindex-category' => 'Индексировать каронтэм бамъёс', -'linkprefix' => '/^(.*?)(„|«)$/sDu', +'linkprefix' => '/^((?>.*(? 'Та сярысь', 'article' => 'Статья', diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php index f30bce4f1b..ab5ee42361 100644 --- a/languages/messages/MessagesUg_arab.php +++ b/languages/messages/MessagesUg_arab.php @@ -2518,12 +2518,9 @@ $1', ئەمما ئۇ $2 نىڭ چەكلەش دائىرىسى ئىچىدە، بۇ دائىرىنى چەكلەشتىن بىكار قىلغىلى بولىدۇ.', 'ip_range_invalid' => 'IP دائىرىسى ئىناۋەتسىز.', 'ip_range_toolarge' => '/$1 دىن چوڭ بولغان چەكلەش دائىرىسىگە يول قويۇلمايدۇ.', -'blockme' => 'مېنى چەكلە', 'proxyblocker' => 'ۋاكالەتچىنى چەكلىگۈچى', -'proxyblocker-disabled' => 'بۇ ئىقتىدار چەكلەنگەن.', 'proxyblockreason' => 'IP ئادرېسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن. ئىنتېرنېت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تېخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئېغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.', -'proxyblocksuccess' => 'تامام', 'sorbs' => 'DNSBL', 'sorbsreason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.', 'sorbs_create_account_reason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان. diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php index 5fd2c79f8d..105bef1bdd 100644 --- a/languages/messages/MessagesUk.php +++ b/languages/messages/MessagesUk.php @@ -1595,9 +1595,9 @@ $1", 'badsiglength' => 'Ваш підпис дуже довгий. Повинно бути не більше $1 {{PLURAL:$1|символу|символів|символів}}.', 'yourgender' => 'Як ви волієте бути описаним?', -'gender-unknown' => 'Я не волію деталізувати', -'gender-male' => 'Він редагує вікі-сторінки', -'gender-female' => 'Вона редагує вікі-сторінки', +'gender-unknown' => 'Не визначена', +'gender-male' => 'Чоловіча', +'gender-female' => 'Жіноча', 'prefs-help-gender' => "Задання цього параметру - необов'язкове. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі. Ця інформація загальнодоступна.", 'email' => 'Електронна пошта', @@ -2913,12 +2913,9 @@ $1', 'ipb_blocked_as_range' => 'Помилка: IP-адреса $1 була заблокована не напряму і не може бути розблокована. Однак, вона належить до заблокованого діапазону $2, який можна розблокувати.', 'ip_range_invalid' => 'Неприпустимий діапазон IP-адрес.', 'ip_range_toolarge' => 'Блокування діапазонів, більших за /$1, не дозволені.', -'blockme' => 'Заблокуй мене', 'proxyblocker' => 'Блокування проксі', -'proxyblocker-disabled' => 'Функція відключена.', 'proxyblockreason' => "Ваша IP-адреса заблокована, тому що це — відкритий проксі. Будь ласка, зв'яжіться з вашим Інтернет-провайдером чи службою підтримки й повідомте їм про цю серйозну проблему безпеки.", -'proxyblocksuccess' => 'Виконано.', 'sorbs' => 'DNSBL', 'sorbsreason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL.', 'sorbs_create_account_reason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.', @@ -3281,6 +3278,8 @@ The wiki server can't provide data in a format your client can read.", 'spam_reverting' => 'Відкинути до останньої версії, що не містить посилання на $1', 'spam_blanking' => 'Всі версії містять посилання на $1, очистка', 'spam_deleting' => 'Все версії, що містили посилання на $1, вилучаються', +'simpleantispam-label' => "Перевірка на спам. +'''НЕ''' заповнюйте це!", # Info page 'pageinfo-title' => 'Інформація про " $1 "', diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php index c33570fa0a..cc5d0f7b1b 100644 --- a/languages/messages/MessagesUr.php +++ b/languages/messages/MessagesUr.php @@ -1427,7 +1427,6 @@ Also see [[Special:WantedCategories|wanted categories]].', 'contribslink' => 'شـراکـت', 'blocklogpage' => 'نوشتۂ پابندی', 'block-log-flags-nocreate' => 'کھاتے کی تخلیق غیرفعال', -'proxyblocksuccess' => 'کردیا.', # Move page 'move-page' => 'منتقلی', diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php index d89d92965a..e8746b379a 100644 --- a/languages/messages/MessagesUz.php +++ b/languages/messages/MessagesUz.php @@ -1463,7 +1463,6 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.', 'blocklogentry' => '$2 muddatga [[$1]]ni chetlashtirdi $3', 'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan', 'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi", -'proxyblocksuccess' => 'Bajarildi.', # Move page 'move-page' => '$1 — qayta nomlash', diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php index da6ccc35cf..535d622590 100644 --- a/languages/messages/MessagesVec.php +++ b/languages/messages/MessagesVec.php @@ -2567,11 +2567,8 @@ Qua soto ghe xe el registro de le sopression:', 'ipb_blocked_as_range' => "Eror: L'indirizo IP $1 no'l xe sogeto a bloco individual e no'l pol èssar sblocà. El bloco el xe invesse ativo a livel de l'intervalo $2, che el pol èssar sblocà.", 'ip_range_invalid' => 'Intervało de indirissi IP mìa vałido.', 'ip_range_toolarge' => 'No se pol mia blocar intervali piassè grandi de /$1', -'blockme' => 'Blòcheme', 'proxyblocker' => 'Bloco dei proxy verti', -'proxyblocker-disabled' => 'Sta funzion la xe disabilità.', 'proxyblockreason' => 'Sto indirizo IP el xe stà blocà parché el risulta èssar un proxy verto. Se prega de contatar el proprio fornitor de acesso a Internet o el suporto tènico e dirghe de sto grave problema de sicureza.', -'proxyblocksuccess' => 'Fatto.', 'sorbsreason' => 'Sto indirizo IP el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.', 'sorbs_create_account_reason' => 'No se pol crear acessi novi da sto indirizo IP parché el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.', 'xffblockreason' => "Un indiriso IP presente ne l'intestasion X-Forwarded-For, tuo o del server proxy che te sì drio doparar, el xe stà blocà. La motivasion originale del bloco la xe: $1", @@ -2905,6 +2902,8 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto 'spam_reverting' => "Ripristinà l'ultima version priva de colegamenti a $1", 'spam_blanking' => 'Pàxena svodà, tute łe version le contegneva cołegamenti a $1', 'spam_deleting' => 'Pàjina scansełà, tute łe version łe contegneva ligamenti a $1', +'simpleantispam-label' => "Controlo anti spam. +'''NO STA''' scrivar gnente qua de soto!", # Info page 'pageinfo-title' => 'Informasion par "$1"', diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php index 03321d2b49..a724c1e896 100644 --- a/languages/messages/MessagesVep.php +++ b/languages/messages/MessagesVep.php @@ -2075,12 +2075,9 @@ Alemba om anttud blokiruindaiglehtez:', 'ipb_cant_unblock' => 'Petuz: ei voi löuta ID $1:n blokiruindad. Voib olda, se om jo heittud.', 'ip_range_invalid' => 'Vär IP-diapazon.', -'blockme' => 'Blokiruigat mindai', 'proxyblocker' => 'Proxy-blokator', -'proxyblocker-disabled' => 'Nece funkcii ei ole kävutamas.', 'proxyblockreason' => 'Teiden IP-adres om blokiruidud, sikš miše se om avoin proksi. Olgat hüväd, säkat pagin teiden Internet-provaideranke i kirjutagat hänele necen varuitomuden problemas.', -'proxyblocksuccess' => 'Vaumiž.', 'sorbsreason' => 'Teiden IP-adres om ozutadud kut avaitud proksi {{SITENAME}}-saitan DNSBL-an mustas nimikirjuteses.', 'cant-block-while-blocked' => 'Teile ei sa blokiruida toižid kävutajid, sikš miše tö iče olet blokiruidud.', diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php index f95d7c6e8a..2a1fca946c 100644 --- a/languages/messages/MessagesVi.php +++ b/languages/messages/MessagesVi.php @@ -854,8 +854,7 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỏ trống ô Xin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.', 'usernamehasherror' => 'Tên người dùng không thể chứa dấu rào', -'login-throttled' => 'Bạn đã thử quá nhiều mật khẩu của tài khoản này. -Xin hãy đợi $1 rồi thử lại.', +'login-throttled' => 'Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.', 'login-abort-generic' => 'Thất bại khi đăng nhập', 'loginlanguagelabel' => 'Ngôn ngữ: $1', 'suspicious-userlogout' => 'Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.', @@ -1031,7 +1030,7 @@ Có thể nó đã bị di chuyển hoặc xóa đi trong khi bạn đang xem tr 'accmailtitle' => 'Đã gửi mật khẩu.', 'accmailtext' => "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.", 'newarticle' => '(Mới)', -'newarticletext' => '
      ', +'newarticletext' => "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [[{{MediaWiki:Helppage}}|trang trợ giúp]] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (''Back'') trong trình duyệt của bạn.", 'anontalkpagetext' => "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập. Do đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta. Một địa chỉ IP như vậy có thể có nhiều người cùng dùng chung. @@ -2510,9 +2509,11 @@ Xin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy c 'deleteotherreason' => 'Lý do khác/bổ sung:', 'deletereasonotherlist' => 'Lý do khác', 'deletereason-dropdown' => '*Các lý do xóa phổ biến -** Tác giả yêu cầu +** Đăng tỉ thư rác +** Phá hoại ** Vi phạm bản quyền -** Phá hoại', +** Tác giả yêu cầu +** Chuyển hướng sai', 'delete-edit-reasonlist' => 'Sửa lý do xóa', 'delete-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi. Việc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoại do vô ý cho {{SITENAME}}.', @@ -2825,11 +2826,8 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].', 'ipb_blocked_as_range' => 'Lỗi: Địa chỉ IP $1 không bị cấm trực tiếp và do đó không thể bỏ cấm. Tuy nhiên, nó bị cấm do là một bộ phận của dải IP $2, bạn có thể bỏ cấm dải này.', 'ip_range_invalid' => 'Dải IP không hợp lệ.', 'ip_range_toolarge' => 'Không được phép cấm dải IP lớn hơn /$1.', -'blockme' => 'Cấm tôi', 'proxyblocker' => 'Cấm proxy', -'proxyblocker-disabled' => 'Chức năng này đã bị tắt.', 'proxyblockreason' => 'Địa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bộ phận hỗ trợ kỹ thuật của bạn và thông báo với họ về vấn đề an ninh nghiêm trọng này.', -'proxyblocksuccess' => 'Xong.', 'sorbsreason' => 'Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.', 'sorbs_create_account_reason' => 'Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.', 'xffblockreason' => 'Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1', @@ -3193,6 +3191,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.', 'spam_reverting' => 'Lùi lại đến phiên bản cuối không chứa liên kết đến $1', 'spam_blanking' => 'Tất cả các phiên bản có liên kết đến $1; tẩy trống', 'spam_deleting' => 'Tất cả các phiên bản có liên kết đến $1; xóa', +'simpleantispam-label' => "Hệ thông đang kiểm tra chống spam. +Xin '''ĐỪNG''' điền gì vào!", # Info page 'pageinfo-title' => 'Thông tin về “$1”', diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php index ae7b6dc9c3..11b0ea30ed 100644 --- a/languages/messages/MessagesVmf.php +++ b/languages/messages/MessagesVmf.php @@ -8,6 +8,7 @@ * @file * * @author Altaileopard + * @author Bua333 * @author Matma Rex * @author Midnight Gambler * @author Silvicola @@ -103,7 +104,12 @@ $messages = array( 'friday' => 'Freidooch', 'saturday' => 'Samsdooch', 'sun' => 'Su', +'mon' => 'Mon', +'tue' => 'Die', +'wed' => 'Mid', 'thu' => 'Du', +'fri' => 'Fre', +'sat' => 'Sam', 'january' => 'Januaar', 'february' => 'Feebruaar', 'march' => 'Märds', @@ -150,8 +156,11 @@ $messages = array( 'hidden-categories' => '{{PLURAL:$1|Fârschdegde ghadegorii|Fârschdegde ghadegoriin}}', 'category-subcat-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a undâr-ghadegorii|dsam $2 undâr-ghadegoriâ, wofoo {{PLURAL:$1|nôr ôône| $1}}}} undn ôôdsajchd wärn.', 'category-article-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a sajdn|$2 sajdn, wofoo hiir {{PLURAL:$1|aane undn ôôdsajchd wärd|l$1 ôôdsajchd undn wärn}}}}.', +'category-file-count' => '{{PLURAL:$2|Di Gadegorii umfasd bloos a Dadei.|Di folgende {{PLURAL:$1|Dadei is|$1 Dadein sind}} in der Gadegorii, von insgsamd $2 Dadein anzeichd.}}', 'listingcontinuesabbrev' => '(Fôrdsedsung)', +'noindex-category' => 'Seidn, wou net indexierd sin', +'about' => 'Ieber', 'newwindow' => '(Wärd in am najn fenschdâ daargschdeld)', 'cancel' => 'Abbrechn', 'mytalk' => 'Disghusjoonssajdn', @@ -218,7 +227,7 @@ $messages = array( 'articlepage' => "D'inhalds-sajdn dsajchn", 'talk' => 'Disghusjoon', 'views' => 'Ôôsichdn', -'toolbox' => 'Werchdsajch-ghisdn', +'toolbox' => 'Werchdsajch', 'userpage' => "D'benudsârsajdn dsajchn", 'projectpage' => "D'brojägdsajdn dsjachn", 'imagepage' => "D'dadhaj-sajdn dsajchn", @@ -327,20 +336,27 @@ Wen des basiird, dan massdn`s, wemma â dsu alde bearbajdung ôôschaua wil odâ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In dämm Fall melds´däs, bidde mid där URL, am [[Special:ListUsers/sysop|Administrator]].", 'missingarticle-rev' => '(wärsjoonsnumâr: $1)', +'badtitle' => 'Ungüldicher Addigl', 'badtitletext' => "Dii fârlangde sajdn gibd's ned, odâr sii had ân uugildichn sajdnnôôma ghabd, odâr s'wôôr â gschlambdâr fârwajs fonâm andârn wighi häär. Filajchd is aa â buuchschdôôb drin'n, däär in sajdnnôôm gôôr ned schdena däf.", 'viewsource' => 'Gwäl-dhägsd ôôgugn', # Login and logout pages 'yourname' => 'Benudsârnôômâ', 'yourpassword' => 'Bhaswôrd:', -'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm (for a maximum of $1 {{PLURAL:$1|day|days}})', +'yourpasswordagain' => 'Bassworrd widderhulln:', +'remembermypassword' => 'Miid den Brauser dauerhafd ogmeld bleim (maximal $1 {{PLURAL:$1|Dooch|Dooch}})', 'login' => 'Ôômeldn', 'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng', +'loginprompt' => 'Zum Omelldn mäin Guggies agdivierd sei.', 'userlogin' => 'Ôômeldn / Als Bajdräächâr ajschrajm', 'logout' => 'Abmeldn', 'userlogout' => 'Abmeldn', +'nologin' => 'Du hast ka Nutzergonto? $1', 'nologinlink' => 'Sich als najâr Ôôgmeldâr ôômäldn', +'createaccount' => 'Nutzergonto olegn', +'gotaccount' => 'Du host scho a Benudtzergondo? $1', 'gotaccountlink' => 'Omeldn', +'userlogin-resetlink' => 'Omeldedadn vergessn?', 'mailmypassword' => 'Â najs passwôrd iwâr iimejl dsuschign lasn', 'loginlanguagelabel' => 'Sproch: $1', @@ -401,7 +417,8 @@ Wen'D dich awâr hiirhäär bloos fârlaafn hasd, glig ââfach af '''Zurück''' 'noarticletext' => 'Dii sajdn gibd\'s bis eds no ned. Duu ghâusch nach däm ausdrug aa [[Special:Search/{{PAGENAME}}|in alle sajdn suchng]], [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} in di dsugheerichng log-biichâr suchng] odâr dii sajdn [{{fullurl:{{FULLPAGENAME}}|action=edit}} ôôleeng un najschrajm].', -'previewnote' => "'''Hiir siggsd bloos, wii's wärn dääd, dii sajdn is ôbâr no ned gschbaichärd!'''", +'noarticletext-nopermission' => 'Däi Seidn endhäld momendan nu kan Dexd, [[Special:Search/{{PAGENAME}}|Du derfsd däi Seidn a net derschdelln]].', +'previewnote' => "'''Des is blouss a Vuurschau.''' Däi Seidn is nu net gschbeicherd worrn.", 'editing' => 'Beärbâdn fon $1', 'editingsection' => 'Beärwâdn fo $1 (bloos abschnid)', 'copyrightwarning' => "''Ghobhiir jôô ghâ web-sajdn, dii där ned ghärn, un benuds ghâ uurheewarrechdlich gschidsde wärgghe oone geneemichung fom uurheewâr!'''
      @@ -413,15 +430,24 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'template-semiprotected' => '(ned ôôgmeldede un naje benudsär däfn hiir ned schrajm)', 'hiddencategories' => 'Dii sajdn ghäärd dsu {{PLURAL:$1|aanâr fârschdegdn|$1 fârschdegde}} ghadegoriin:', 'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:', +'recreate-moveddeleted-warn' => "'''Achdung: Du derschdellsd a Seidn, däi wou bereids fräiers glöschd worrn is.''' + +Bidde dou sorgfälldig ieberbriefen, ob die erneide Seidnderschdellung die Richdlinien endschbrechn doud. + +Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begrindung vo der vuurherichen Löschung:", +'moveddeleted-notice' => 'Däi Seidn is glöschd worrn. Zur Informadion folchds Lösch- un Verschäibungslogbuch vo dera Seidn.', # Parser/template warnings 'post-expand-template-inclusion-warning' => "'''Wannung''': Däi Gräiss vo eibundne Vuurloong is zu grouss, einiche Vuurloong könna net eibundn werrn.", 'post-expand-template-inclusion-category' => 'Seidn, in dena wou däi maximale Gräiss vo eibundne Vuurloong ieberschriddn is.', +'post-expand-template-argument-warning' => "'''Wannung:''' Däi Seidn endhäld mindesdens an Barameder in anner Vuurlooch, der wou exbandierd zu grouß is.", +'post-expand-template-argument-category' => 'Seidn miid ignorierde Vuurloongbarameder', # History pages 'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn', 'currentrev-asof' => 'Jedsiche wärsjoon, am $2 um $3 gmachd', 'revisionasof' => 'Wärsjoon fom $2 um $3 Uur', +'revision-info' => 'Version vom $1 Uhr von $2', 'previousrevision' => '← wärsjoon dâfoor', 'nextrevision' => 'Nägsdnajâre wärsjoon →', 'currentrevisionlink' => 'Geechnwärdiche wärsjoon', @@ -431,8 +457,12 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd * '''({{int:cur}})''' = undârschiid dsur geechnwärdichn wärsjoon, '''({{int:last}})''' = undârschiid dsur foorichn wärsjoon * Uurdsajd/Daadum = wärsjoon dsu dära dsajd, '''{{int:minoreditletter}}''' = glane ändärung.", 'history-fieldset-title' => 'Suchng in där wärsjoonsfolche', -'histfirst' => 'Äldâschde', -'histlast' => 'Najsde', +'history-show-deleted' => 'Blouss glöschde Versiona zeing', +'histfirst' => 'älldsde', +'histlast' => 'neisde', + +# Revision feed +'history-feed-item-nocomment' => '$1 bis $2', # Revision deletion 'rev-delundel' => 'ôôdsajng/fârbärng', @@ -444,10 +474,11 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'revertmerge' => 'Dsrig fôr dii fârajnichung', # Diffs -'history-title' => 'Wärsjoonsfolche fo „$1“', +'history-title' => '$1: Versionsgschichd', 'lineno' => 'Dsajln $1:', 'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn', 'editundo' => 'riggängich machng', +'diff-multi' => '({{PLURAL:$1|A dazwischaliengde Version|$1 dazwischaliengde Versiona}} von {{PLURAL:$2|am Nutzer|$2 Nutzern}} {{PLURAL:$1|wird|werrn}} ned ozeichd)', # Search results 'searchresults' => 'Bam suchng gfundne sachng', @@ -459,13 +490,24 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'notextmatches' => 'Närchnds gfundn.', 'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}', 'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}', +'prevn-title' => '{{PLURAL:$1|Vuurherichs Ergebnis|Vuurheriche $1 Ergebniss}}', +'nextn-title' => '{{PLURAL:$1|Folngnds Ergebnis|Folngnde $1 Ergebniss}}', +'shown-title' => 'Zeich mer $1 {{PLURAL:$1|Ergebnis|Ergebniss}} bro Seidn', 'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)', +'searchmenu-exists' => "'''Es gidd a Seidn, däi wou´n Nooma „[[:$1]]“ hodd.'''", 'searchmenu-new' => "'''Derschdell dai Seidn „[[:$1]]“ in diesn Wigi.'''", 'searchprofile-articles' => 'Inhaldsseidn', +'searchprofile-project' => 'Hilf- un Brojegdseidn', 'searchprofile-images' => 'Muldimedia', 'searchprofile-everything' => 'Alls', 'searchprofile-advanced' => 'Erweiderd', +'searchprofile-articles-tooltip' => 'Soung in $1', +'searchprofile-project-tooltip' => 'Soung in $1', +'searchprofile-images-tooltip' => 'Nach Daddein soung', +'searchprofile-everything-tooltip' => 'Gsamdn Inhald durchsoung (aa Disgussionsseidn)', +'searchprofile-advanced-tooltip' => 'Soung in weidere Namensraim', 'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})', +'search-result-category-size' => '{{PLURAL:$1|1 Seidn|$1 Seidn}} ({{PLURAL:$2|1 Untergadegorii|$2 Untergadegoriin}}, {{PLURAL:$3|1 Dadei|$3 Dadein}})', 'search-result-score' => 'Âjschleechich: $1 %', 'search-redirect' => '(Wajdalajdung fon „$1“ häa)', 'search-section' => '(Abschnid $1)', @@ -546,6 +588,9 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'timezoneregion-pacific' => 'Bhadsiifischâr Oodseaan', 'allowemail' => 'Iimejl-embfang fon andrâ ôôschdeln', 'youremail' => 'E-mail:', +'yourrealname' => 'Bürcherlicher Noma:', +'prefs-help-email' => 'Des Ogeem vo anner E-Mail-Adressn is obdional, ermöglichd obber däi Zusendung vo an Ersatzbassworrd, wennsd dei Bassworrd vergessn hosd.', +'prefs-help-email-others' => 'Miid andre Benutzer koost a iber däi Benutzerdisgussionsseidn Kondagd afneha, ohne dass dei Idendidäd offenleeng moussd.', # Groups 'group-sysop' => 'Adminisdradoorn', @@ -566,13 +611,18 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'recentchanges' => 'ledsde änderunga', 'recentchanges-legend' => 'Âjschdelunga, wii di ledsdn ändrunga dsajchd wärn solln', 'recentchanges-feed-description' => 'Fârfolch mid dem Fiid dii ledsdn ändrungn in {{SITENAME}}.', +'recentchanges-label-newpage' => 'Neie Seidn', 'recentchanges-label-minor' => 'Blos a weng wôs is gändârd wôrn', +'recentchanges-label-bot' => 'Ändrung durch an Bot', +'recentchanges-label-unpatrolled' => 'Net-kondrollierde Ändrung', 'rcnote' => "Des {{Plural:$1|is dii aane ändrung|sin dii '''$1''' ändrunga}}, dii in di {{Plural:$2|ledsdn 24 schdundn|ledsdn '''$2''' doochn}} gmachd wôrn {{Plural:$1|is|sin}}. Schdand is fom $4, $5 uur.", +'rcnotefrom' => "Oozeichd werrn däi Ändrunga seid '''$2''' (max. '''$1''' Eidrääch).", 'rclistfrom' => 'Bloos di ändrunga dsajchn sajd $1', 'rcshowhideminor' => 'Glenâre Ändrungn $1', 'rcshowhidebots' => 'Bods (bearbajdâr, dii ajchendlich brograme san) $1', 'rcshowhideliu' => 'Ôôgmäldâde bearbajdâr $1', 'rcshowhideanons' => '$1 uuôôgmäldâde bearbajdâr', +'rcshowhidepatr' => 'Gondrollierde Ändrunga $1', 'rcshowhidemine' => 'Ajchne bajdrääch $1', 'rclinks' => 'Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.
      $3', 'diff' => 'undârschiid', @@ -582,7 +632,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd 'minoreditletter' => 'g', 'newpageletter' => 'N', 'boteditletter' => 'B', -'rc-enhanced-expand' => 'Ajndslhajdn ôôdsajchn (gäd bloos mid JavaScript)', +'rc-enhanced-expand' => 'Eindslheidn oodseichn (gäd bloos mid JavaScript)', 'rc-enhanced-hide' => 'Glaanichghajdn ned dsajng', # Recent changes linked @@ -596,14 +646,17 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd # Upload 'upload' => 'Nauflôôdn', 'uploadlogpage' => 'Brodoghol fom dadaj-hoochlôôdn', +'filedesc' => 'Bschreibung', 'uploadedimage' => 'had „[[$1]]“ naufglôôdn', 'license' => 'Lizenz', +'license-header' => 'Lizenz', # File description page 'file-anchor-link' => 'Daddei', 'filehist' => 'Wärsjoona bis eds', 'filehist-help' => 'Glig af ân dsajdbhungd, um dii dôômôôliche fasung ôôdsuschaua', +'filehist-revert' => 'zricksedzn', 'filehist-current' => 'agduäl', 'filehist-datetime' => 'Âjschdlungs-daadum un -dsajd', 'filehist-thumb' => 'Schbigbildlâ', @@ -637,6 +690,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].", 'ncategories' => '$1 {{PLURAL:$1|GhadegoriiGhadegoriin}}', 'nmembers' => '{{PLURAL:$1|1 âjdrôôch|$1 âjdrääch}}', 'prefixindex' => 'Ale sajdn mid brääfigs', +'usercreated' => '{{GENDER:$3|Ersschdelld}} am $1 um $2 Uhr', 'newpages' => 'Naje sajdn', 'move' => 'Umdaafn', 'movethispage' => 'Sajdn umdaafn', @@ -665,6 +719,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].", # Special:LinkSearch 'linksearch' => 'Linggs nach ausârhalb', +'linksearch-line' => '$1 is verlingt vo $2', # Special:ListGroupRights 'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)', @@ -673,8 +728,9 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].", 'emailuser' => 'Dem ôôgmeldn â iimejl schign', # Watchlist -'watchlist' => 'Maj beoobachdungs-lisdn', +'watchlist' => 'Beoobachdungslisdn', 'mywatchlist' => 'Beoobachdungslisdn', +'watchlistfor2' => 'Fär $1 ($2)', 'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] . Wen sich af der sajdn oda iirâr disghusjoons-sajdn was duud, wärd se ab eds @@ -697,6 +753,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in 'deletepage' => 'Sajdn leschn', 'confirmdeletetext' => "Duu bisd grôd dâbaj, â sajdn midsamd alle dsugheeriche alde wärsjoona ds'leschn. Bide beschdäädich, das De wasd, was des als bewirgd, un das De Dich dâbaj aa an d'[[{{MediaWiki:Policy-url}}|richliinjen]] fo dem wighi hiir häldsd.", 'actioncomplete' => 'Erleedichd', +'actionfailed' => 'Agdsion fehlgschloong', 'deletedtext' => '„$1“ is gleschd wôrn. Im $2 findsd â lisdn mid dâ ledsdn leschunga.', 'dellogpage' => 'Logbuch fo di leschunga', 'deletecomment' => 'Grund:', @@ -748,19 +805,22 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in 'blanknamespace' => '(Sajdn)', # Contributions -'contributions' => 'Ajchne bajdrääch', +'contributions' => 'Eichne Beidrääch', 'contributions-title' => 'Bajdrääch fo „$1“', 'mycontris' => 'Bajdreech', -'contribsub2' => 'Fär $1 ($2)', -'uctop' => '(ledsdâr schdand)', +'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)', +'uctop' => '(agduell)', 'month' => 'bis moonad:', 'year' => 'bis dsum jôôr:', 'sp-contributions-newbies' => 'Bloos bajdrääch fo naj Ôôgmeldâ dsajchn', 'sp-contributions-blocklog' => 'Schbär-brodoghol', +'sp-contributions-uploads' => 'Houchglodne Daddein', +'sp-contributions-logs' => 'Logbäicher', 'sp-contributions-talk' => 'Disgussion', 'sp-contributions-search' => 'Bajdreech suchng', 'sp-contributions-username' => 'IP-adresn odär nôômâ fom Ôôgmeldn:', +'sp-contributions-toponly' => 'Blouss agduelle Versiona zeing', 'sp-contributions-submit' => 'Suchng', # What links here @@ -768,16 +828,17 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in 'whatlinkshere-title' => 'Sajdn, di af „$1“ fârwajsn', 'whatlinkshere-page' => 'Sajdn:', 'linkshere' => "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':", +'nolinkshere' => "Ka Seidn verlingt af '''„[[:$1]]“'''.", 'isredirect' => 'Wajdârlajdungssajdn', 'istemplate' => 'Foorlaachn-ajbindung', -'isimage' => 'fârwajs af des bild hiir', +'isimage' => 'Daddeilink', 'whatlinkshere-prev' => '{{PLURAL:$1|vorhäärichâr|vorhääriche $1}}', 'whatlinkshere-next' => '{{PLURAL:$1|nägschdâr|nägschde $1}}', 'whatlinkshere-links' => '← fârwajse hiirhäär', 'whatlinkshere-hideredirs' => '$1 wajdârlajdungn', 'whatlinkshere-hidetrans' => '$1 Foorlaachn-ajbindunga', 'whatlinkshere-hidelinks' => '$1 Fârwajse', -'whatlinkshere-hideimages' => '$1 Bild-fârwajse', +'whatlinkshere-hideimages' => 'Daddeilings $1', 'whatlinkshere-filters' => 'Fildhâr', # Block/unblock @@ -785,7 +846,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in 'blockip-title' => 'Bearbajdâr aus-schbärn', 'blockip-legend' => 'IP-Adresn odr Bearbajdâr aus-schbärn', 'ipboptions' => '2 schdund:2 hours,1 dooch:1 day,3 dooch:3 days,1 wochng:1 week,2 wochng:2 weeks,1 moonad:1 month,3 moonad:3 months,6 moonad:6 months,1 jôôr:1 year,oone dsajdschrangng:infinite', -'ipblocklist' => 'Gschbärde IP-adresn un Ôôgmelde', +'ipblocklist' => 'Gschberrder Nutzer', 'blocklink' => 'Schbärn', 'unblocklink' => 'frajgeem', 'change-blocklink' => 'Schbärn ändârn', @@ -827,8 +888,13 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un ' # Export 'export' => 'Sajdn ägsbhôrdiirn', +# Namespace 8 related +'allmessagesname' => 'Noma', +'allmessagesdefault' => 'Schdandaddexd', + # Thumbnails 'thumbnail-more' => 'Grässär machng', +'thumbnail_error' => 'Fehler beim Derschdelln von Vuurschaubilld: $1', # Tooltip help for the actions 'tooltip-pt-userpage' => 'Daj benudsâr-sajdn', @@ -923,7 +989,7 @@ Bloos dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc 'metadata-help' => 'Dii dadaj umfasd annäre ôôgam, dii normaalârwajs fo där digidaal-ghamâraa odär fo am sghänâr häärghumma. Wen dii dadaj indswischn fârändârd wôrn is, meechn dii nimä dsum bild basn.', 'metadata-expand' => 'Ajdslhajdn dsajchn', 'metadata-collapse' => 'Ajdslhajdn ausblendn', -'metadata-fields' => 'Hiir afgfiirde fäldâr fo dâ EXIF-medha-daadn wärn af alle bildbeschrajwungs-sajdn afgfiird, aa wen dii medhadaadn-dabelln ajgfalded is. Annäre sin ärschdâmôôl fârschdegd. +'metadata-fields' => 'Folgnde Felder vo däi EXIF-Medadaden, däi wou in den MediaWigi-Sysdemdexd ogeem sin, werrn af Bildbeschreibungsseidn miid eiglabbder Medadadndabelln ozeichd. Weidere werrn schdandaddmäßich net ozeichd. * make * model * datetimeoriginal @@ -956,7 +1022,23 @@ Bloos dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc 'watchlisttools-edit' => 'Beobachdungslisdn dsajchn un ändârn', 'watchlisttools-raw' => "In där beoobachdungslisdn ds'fuâs rumworschdln", +# Core parser functions +'duplicate-defaultsort' => 'Der Sordierungsschlissl „$2“ ieberschreibt den vuurher verwendten Schlissl „$1“.', + # Special:SpecialPages 'specialpages' => 'Schbedsjaal-sajdn', +# External image whitelist +'external_image_whitelist' => ' # Däi Zeiln net verändern.
      +# Undnstehnd könna Fragmende vo reguläre Asdrigg (der Deil zwischa die //) eigeem werrn.
      +# Däi werrn miid die URLs vo Bilder aus egsderne Gwelln verglichng.
      +# A bositiver Vergleich fiehrt zur Ozeich vom Bild, sunsd werrds Bild blouss als Link ozeichd.
      +# Zeiln, däi wou miid an # ofanga, werrn als Gommendar behandld.
      +# Zwischa Grouß- un Klaaschreibung werrd net underschiedn.
      +
      +# Fragmende vo reguläre Asdrigg nach dera Zeiln eidroong. Däi Zeiln net verändern.
      ', + +# Special:Tags +'tag-filter' => '[[Special:Tags|Marrgierungs]]-Fillder:', + ); diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php index 41363152d1..f244cd69ec 100644 --- a/languages/messages/MessagesVo.php +++ b/languages/messages/MessagesVo.php @@ -120,7 +120,7 @@ $messages = array( 'tog-hidepatrolled' => 'Klänedön redakamis pezepöl in lised votükamas nulik.', 'tog-newpageshidepatrolled' => 'Klänedön padis pezepöl in lised padas nulik', 'tog-extendwatchlist' => 'Stäänükön galädalisedi ad jonön votükamis tefik valik, e no te nulikünos', -'tog-usenewrc' => 'Grupön votükamis pado in votukäms nulik e galädalised (me JavaScript)', +'tog-usenewrc' => 'Grupön votükamis pado in votukäms nulik e galädalised', 'tog-numberheadings' => 'Givön itjäfidiko nümis dilädatiädes', 'tog-showtoolbar' => 'Jonön redakamastumemi', 'tog-editondblclick' => 'Dälön redakön padis pö drän telik mugaknopa', @@ -250,6 +250,7 @@ $messages = array( 'newwindow' => '(maifikon in fenät nulik)', 'cancel' => 'Stöpädön', 'moredotdotdot' => 'Plu...', +'morenotlisted' => 'Lised at no binon lölöfik.', 'mypage' => 'Pad', 'mytalk' => 'Bespiks', 'anontalk' => 'Bespiks ela IP at', @@ -319,7 +320,7 @@ $messages = array( 'articlepage' => 'Jonön ninädapadi', 'talk' => 'Bespik', 'views' => 'Logams', -'toolbox' => 'Stumem', +'toolbox' => 'Stums', 'userpage' => 'Logön gebanapadi', 'projectpage' => 'Logön proyegapadi', 'imagepage' => 'Jonön ragivapad', @@ -419,6 +420,7 @@ Mögos i, das atos sinifon, das dabinon säkädil pö program fa {{SITENAME}} pa # General errors 'error' => 'Pöl', 'databaseerror' => 'Pöl in nünodem', +'databaseerror-function' => 'Dunod: $1', 'databaseerror-error' => 'Pöl: $1', 'laggedslavemode' => 'Nuned: pad ba labon votükamis brefabüik', 'readonly' => 'Vük pefärmükon', @@ -461,7 +463,7 @@ Beg: $2', 'viewsource-title' => 'Logön fonäti pada: "$1"', 'actionthrottled' => 'Dun pemiedükon', 'actionthrottledtext' => 'Ad tadunön reklamami itjäfidik (el „spam“), dunot at no padälon tu suvo dü brefüp. Ya erivol miedi gretikün. Steifülolös nogna pos minuts anik.', -'protectedpagetext' => 'Pad at pejelon ad neletön redakami.', +'protectedpagetext' => 'Pad at pejelon ad neletön redakami u dunotis votik.', 'viewsourcetext' => 'Kanol logön e kopiedön fonätakoti pada at:', 'protectedinterface' => 'Pad at jafon vödemis sitanünas, ed anu pelökofärmükon ad vitön migebis.', 'editinginterface' => "'''Nuned:''' redakol padi, kel labükon vödemis bevüik pro programem. @@ -469,6 +471,10 @@ Votükams pada at oflunons logoti gebanasita pro gebans votik. Ad läükön u votükön tradutodis pro els wiki valik, demolös gebi ela [//translatewiki.net/?setlang=vo translatewiki.net]: topükamaproyeg ela MediaWiki.", 'cascadeprotected' => 'Pad at pejelon ta redakam, bi pakeninükon fa {{PLURAL:$1|pad|pads}} sököl, kels pejelons ma „jänajel“: $2', 'namespaceprotected' => "No dalol redakön padis in nemaspad: '''$1'''.", +'mycustomcssprotected' => 'No dalol redakön padi: CSS at.', +'mycustomjsprotected' => 'No dalol redakön padi: JavaScript at.', +'myprivateinfoprotected' => 'No dalol redakön nünis privatik ola.', +'mypreferencesprotected' => 'No dalol votükön buükamis olik.', 'ns-specialprotected' => 'Pads patik no kanons paredakön.', 'titleprotected' => "Jaf tiäda at penemögükon fa geban: [[User:$1|$1]]. Kod binon: ''$2''.", @@ -568,7 +574,7 @@ Sekü atos, visitans ladeti-IP at geböls no dalons jafön kalis pluik ün atim. 'invalidemailaddress' => 'Ladet leäktronik no kanon pazepön bi fomät onik jiniko no lonöfon. Penolös ladeti labü fomät lonöföl, u vagükolös penamaspadi.', 'accountcreated' => 'Kal pejafon', -'accountcreatedtext' => 'Gebanakal pro $1 pejafon.', +'accountcreatedtext' => 'Gebanakal pro [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|bespik]]) pejafon.', 'createaccount-title' => 'Kalijafam in {{SITENAME}}', 'createaccount-text' => 'Ek ejafon kali pro ladet leäktronik ola in {{SITENAME}} ($4) labü nem: „$2“ e letavöd: „$3“. Kanol nunädön oli e votükön letavödi olik anu. @@ -678,7 +684,7 @@ Ladet-IP olik binon $3, e nüm blokama at binon #$5. Mäniotolös nünis löpik 'nosuchsectiontitle' => 'Diläd no petuvöl', 'nosuchsectiontext' => 'Esteifülol ad redakön dilädi no dabinöli.', 'loginreqtitle' => 'Nunädam Paflagon', -'loginreqlink' => 'nunädolös obi', +'loginreqlink' => 'nunädön oli', 'loginreqpagetext' => 'Mutol $1 ad logön padis votik.', 'accmailtitle' => 'Letavöd pesedon.', 'accmailtext' => "Letavöd fädik pro [[User talk:$1|$1]] pasedon lü $2. @@ -747,7 +753,8 @@ If no vilol, das vödems olik poredakons nenmisero, tän no pladolös onis isio. Garanol obes, das ol it epenol atosi, u das ekopiedol atosi se räyun notidik u se fon libik sümik (logolös eli $1 pro notets). '''NO PLADOLÖD ISIO NEN DÄL LAUTANA VÖDEMIS LABÜ KOPIEDAGITÄT!'''", -'longpageerror' => "'''PÖL: Vödem fa ol pesedöl labon lunoti miljölätas $1, kelos pluon leigodü völad muik pedälöl miljölätas $2. No kanon padakipön.'''", +'longpageerror' => "'''Pöl: Vödem fa ol pesedöl labon lunoti {{PLURAL:$1|miljöläta bal|miljölätas $1}}, kelos pluon leigodü völad muik pedälöl {{PLURAL:$2|miljöläta bal|miljölätas $2}}.''' +No kanon padakipön.", 'readonlywarning' => "'''NUNED: Vük pefärmükon kodü kodididazesüd. No kanol dakipön votükamis olik anu. Kopiedolös vödemi nulik ini program votik e dakipolös oni in nünöm olik. Poso okanol dönu steifülön ad pladön oni isio.''' Geban, kel efärmükon oni, egevon kodi at: $1", @@ -806,6 +813,7 @@ Paramet(s) at pemoädon(s).', 'undo-failure' => 'No eplöpos ad sädunön redakami at sekü konflits vü redakams vüik.', 'undo-norev' => 'No eplöpos ad sädunön redakami at, bi no dabinon u pämoükon.', 'undo-summary' => 'Äsädunon votükami $1 fa [[Special:Contributions/$2|$2]] ([[User talk:$2|Bespikapad]])', +'undo-summary-username-hidden' => 'Sädunön revidi: $1 fa geban peklenädöl', # Account creation failure 'cantcreateaccounttitle' => 'Kal no kanon pajafön', @@ -1158,7 +1166,7 @@ Muton labön {{PLURAL:$1|malati|malatis}} läs $1.', 'right-ipblock-exempt' => 'Nedemön blokamis-IP, blokamis itjäfidik e grupiblokamis', 'right-proxyunbannable' => 'Nedemön blokamis itjäfidik pladulömas', 'right-protect' => 'Votükön jelanivodis e redakön padis pejelöl', -'right-editprotected' => 'Bevobön padis pejelöl (nen vatafalajel)', +'right-editprotected' => 'Bevobön padis pejelöl äs "{{int:protect-level-sysop}}"', 'right-editinterface' => 'Votükön gebanaloveikömi', 'right-editusercssjs' => 'Redakön ragivis-CSS e -JS gebanas votik', 'right-editusercss' => 'Redakön ragivis-CSS gebanas votik', @@ -1271,7 +1279,7 @@ Pads [[Special:Watchlist|galädaliseda olik]] '''pakazetons'''.", 'uploadbtn' => 'Löpükön ragivi', 'reuploaddesc' => 'Nosükon lopükami e geikön lü löpükamafomet.', 'uploadnologin' => 'No enunädon oki', -'uploadnologintext' => 'Mutol [[Special:UserLogin|nunädön oli]] ad löpükön ragivis.', +'uploadnologintext' => 'Mutol $1 ad löpükön ragivis.', 'upload_directory_missing' => 'Löpükamaragiviär ($1) no dabinon e no ekanon pajafön fa dünanünöm bevüresodik.', 'upload_directory_read_only' => 'Ragiviär lopükama ($1) no kanon papenön fa dünanünöm bevüresodik.', 'uploaderror' => 'Pök pö löpükam', @@ -1585,7 +1593,7 @@ Primanünods: ninädasot/donasot, a.s. image/jpeg.', 'booksources-invalid-isbn' => 'El ISBN at jiniko no lonöfon; kontrololös pökis po kopiedam se rigafonät.', # Special:Log -'specialloguserlabel' => 'Geban:', +'specialloguserlabel' => 'Dunan:', 'speciallogtitlelabel' => 'Lükömöp (tiäd u geban):', 'log' => 'Jenotaliseds', 'all-logs-page' => 'Jenotaliseds notidik valik', @@ -1643,7 +1651,7 @@ Protoks pestütöl: $1', 'listusers-blocked' => '(pebloköl)', # Special:ActiveUsers -'activeusers-count' => '{{PLURAL:$1|redakam|redakams}} $1 ün {{PLURAL:$3|del lätik|dels lätik $3}}', +'activeusers-count' => '{{PLURAL:$1|dunot|dunots}} $1 ün {{PLURAL:$3|del lätik|dels lätik $3}}', 'activeusers-hidebots' => 'Klänedolöd elis bot', 'activeusers-hidesysops' => 'Klänedolöd guvanis', 'activeusers-noresult' => 'Geban nonik petuvon.', @@ -1778,10 +1786,12 @@ $2 jonon moükamis nulik.', 'deletecomment' => 'Kod:', 'deleteotherreason' => 'Kod votik:', 'deletereasonotherlist' => 'Kod votik', -'deletereason-dropdown' => '* Kods kösömik moükama -** Beg lautana +'deletereason-dropdown' => "* Kods kösömik moükama +** 'Spam' +** Vandalim ** Kopiedagitäts -** Vandalim', +** Beg lautana +** Lüodüköm dädik", 'delete-edit-reasonlist' => 'Redakön kodis moükama', 'delete-toobig' => 'Pad at labon redakamajenotemi lunik ({{PLURAL:$1|revid|revids}} plu $1). Moükam padas somik pemiedükon ad vitön däropami pö {{SITENAME}}.', @@ -1812,7 +1822,7 @@ Välolös knopi: „Geikön“ e dönulodolös padi, de kel ekömol, e tän stei Logolös [[Special:ProtectedPages|lisedi padas pejelöl]], kö pajonons padijelams anu lonöföls.', 'protectedarticle' => 'ejelon padi: „[[$1]]“', 'modifiedarticleprotection' => 'evotükon jelanivodi pada: „[[$1]]“', -'unprotectedarticle' => 'Pad: „[[$1]]“ pesäjelon.', +'unprotectedarticle' => 'esäjelon padi: "[[$1]]"', 'movedarticleprotection' => 'moved protection settings from „[[$2]]“ to „[[$1]]“', 'protect-title' => 'lonon jelanivodi pada: „$1“', 'prot_1movedto2' => '[[$1]] petopätükon lü [[$2]]', @@ -1924,7 +1934,7 @@ $1', 'contributions' => '{{GENDER:$1|Gebanakeblünots}}', 'contributions-title' => 'Gebanakeblünots pro $1', 'mycontris' => 'Keblünots', -'contribsub2' => 'Tefü $1 ($2)', +'contribsub2' => '{{GENDER:$3|Hiela|Jiela|Ela}} $1 ($2)', 'nocontribs' => 'Votükams nonik petuvons me paramets at.', 'uctop' => '(anuik)', 'month' => 'De mul (e büiks):', @@ -2053,12 +2063,9 @@ Logolös blokamis e xilis anu lonöfölis in [[Special:BlockList|lised blokamas] 'ipb_blocked_as_range' => 'Pöl: ladet-IP $1 no peblokon stedöfiko e no kanon pasäblokön. Peblokon ye as dil ladetema: $2, kel kanon pasäblokön.', 'ip_range_invalid' => 'Ladetem-IP no lonöföl.', -'blockme' => 'Blokolöd obi', 'proxyblocker' => 'Bloköm pladulömas', -'proxyblocker-disabled' => 'Dun at penemogükon.', 'proxyblockreason' => 'Ladet-IP olik peblokon bi binon pladulöm maifik. Kosikolös ko dünigevan bevüresodik u kaenastütans olik e nunolös ones sefasäkädi fefik at.', -'proxyblocksuccess' => 'Peledunon.', 'sorbsreason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.', 'sorbs_create_account_reason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl. No dalol jafön kali.', diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php index 6a082f40df..3998ef4577 100644 --- a/languages/messages/MessagesVot.php +++ b/languages/messages/MessagesVot.php @@ -734,7 +734,6 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.', 'blocklogentry' => 'piätteli cäüttijää vai IP-cislaa [[$1]]. Piättelemin lõpub $2 $3', 'unblocklogentry' => 'rooci cäüttijält $1 muutuzpiäsüss', 'block-log-flags-nocreate' => 'lukuloomin piäteltü', -'proxyblocksuccess' => 'On tehtü.', # Move page 'movepagetext' => "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle. diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php index 998d675f20..7ed5278268 100644 --- a/languages/messages/MessagesVro.php +++ b/languages/messages/MessagesVro.php @@ -1562,7 +1562,6 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu 'ip_range_invalid' => 'Viganõ puutri võrgoaadrõsi kujo.', 'proxyblocker' => 'Vaihõserveri kinniqpidämine', 'proxyblockreason' => "Su puutri võrgoaadrõs om kinniq peet, selle et taa om avalik vaihõserver. Otsiq üles uma võrgoliini pakja vai puutrias'atundja ja kõnõlõq näile taast hädäst.", -'proxyblocksuccess' => 'Valmis.', 'sorbsreason' => 'Su puutri võrgoaadrõs om SORBS-i mustan nimekirän ku avalik vaihõserver.', 'sorbs_create_account_reason' => 'Su puutri võrgoaadrõs om pant SORBS-i musta nimekirjä ku avalik vaihõserver. Sa saa-i pruukjanimme tetäq', diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php index 714c552886..52b3202052 100644 --- a/languages/messages/MessagesWa.php +++ b/languages/messages/MessagesWa.php @@ -1724,7 +1724,6 @@ Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po vey les blocaedjes 'ip_range_invalid' => "Fortchete d' adresses IP nén valide.", 'proxyblocker' => 'Blocaedje di procsi', 'proxyblockreason' => "Voste adresse IP a stî blokêye paski c' est on procsi k' est å lådje. Contactez vost ahesseu Internet ou l' siervice di sopoirt tecnike eyet lzî dire po çoula, la k' c' est on problinme di såvrité serieus.", -'proxyblocksuccess' => 'Fwait.', 'sorbsreason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL.", 'sorbs_create_account_reason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL. Vos n' poloz nén ahiver on conte d' uzeu.", diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php index c9caa3c59b..bd99d85963 100644 --- a/languages/messages/MessagesWar.php +++ b/languages/messages/MessagesWar.php @@ -1899,8 +1899,6 @@ Tanggala an pagpugong $1', 'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli', 'block-log-flags-hiddenname' => 'nakatago an agnay-hit-gumaramit', 'ipb_already_blocked' => '"$1" in ginpugngan na', -'blockme' => 'Pugngi ako', -'proxyblocksuccess' => 'Human na.', 'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon', # Developer tools diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php index 295b15fa80..092ea9d40c 100644 --- a/languages/messages/MessagesWo.php +++ b/languages/messages/MessagesWo.php @@ -1850,11 +1850,8 @@ Dangaa bëgg a soppi anam yi?', 'ipb_cant_unblock' => 'Njuumte: téyeg $1 gisuwul. Xéj-na dañ kaa téyedi ba noppi.', 'ipb_blocked_as_range' => 'Njuumte: màkkaan mi $1 téyewuñ ko moom kase, kon doo ko man téyedi. Ci mbooloom $2 la bokk, faww nga téyedi mbooloo mépp.', 'ip_range_invalid' => 'Mbooloom IP mi baaxul.', -'blockme' => 'Téye ma', 'proxyblocker' => 'Téyekatu yóbbantekat', -'proxyblocker-disabled' => 'Bii solo doxul.', 'proxyblockreason' => 'Dañ téye sa IP ndax dadi ab yóbbantekat bu ubbeeku. Di la ñaan nga jublu ci sa ki la jox internet yegge ko jafe-jafeb kaaraange bi.', -'proxyblocksuccess' => 'Jàll na.', 'sorbsreason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo.', 'sorbs_create_account_reason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo. Kon sag mbindu du mana nekk.', 'cant-block-while-blocked' => 'Manoo di téye yeneen jëfandikukat ci diir bi ñu la téye.', diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php index b8c6da0255..69a4b97e5c 100644 --- a/languages/messages/MessagesWuu.php +++ b/languages/messages/MessagesWuu.php @@ -1545,7 +1545,6 @@ $1", 'blocklogtext' => '箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。', 'unblocklogentry' => '$1已经拨解封', 'block-log-flags-nocreate' => '建账号禁用哉', -'proxyblocksuccess' => '好哉。', # Developer tools 'lockdb' => '鎖數據庫', diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php index 1bdd3ed470..a0edc0c5b0 100644 --- a/languages/messages/MessagesXal.php +++ b/languages/messages/MessagesXal.php @@ -990,7 +990,6 @@ $2 шидрә һарһлһна төлә хәләтн.', 'blocklogentry' => '[[$1]] бүслсн $2 күртл, $3 учрта', 'unblocklogentry' => '$1-г бүслсн биш болулв', 'block-log-flags-nocreate' => 'бичгдлһиг бүтәҗ болшго', -'blockme' => 'Намаг бүслчк', # Move page 'movepagetext' => "Та дораһар цаасар, халхин сольлһна тууҗ көндәд, терүнә нериг сольх. diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php index 0a90da4212..22c9ed3b9c 100644 --- a/languages/messages/MessagesYi.php +++ b/languages/messages/MessagesYi.php @@ -413,7 +413,7 @@ $messages = array( 'articlepage' => 'זען אינהאַלט בלאַט', 'talk' => 'שמועס', 'views' => 'קוקן', -'toolbox' => 'געצייג קאסטן', +'toolbox' => 'געצייג', 'userpage' => 'זען באַניצער בלאַט', 'projectpage' => 'זען פראיעקט בלאַט', 'imagepage' => 'זען טעקע בלאט', @@ -658,6 +658,8 @@ $2', 'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט', 'helplogin-url' => 'Help:אריינלאגירן', 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]', +'userlogin-loggedin' => 'איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}. +ניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.', 'userlogin-createanother' => 'שאפֿן נאך א קאנטע', 'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.', 'createacct-another-join' => 'ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.', @@ -2679,11 +2681,8 @@ $1', דאך איז ער בלאקירט אַלס א טייל פֿון דעם אָפשטאַנד $2, וואָס מ'קען יא אויפֿבלאקירן.", 'ip_range_invalid' => 'אומריכטיגער IP גרייך.', 'ip_range_toolarge' => 'אָפשטאַנדן גרעסער ווי /$1 קען מען נישט בלאקירן.', -'blockme' => 'בלאקירט מיך', 'proxyblocker' => 'פראקסי בלאקער', -'proxyblocker-disabled' => 'די פֿונקציע איז אומאַקטיווירט.', 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.', -'proxyblocksuccess' => 'געטאן.', 'cant-block-while-blocked' => 'איר קען נישט בלאקירן קיין אנדערע באניצער ווען איר זענט אליין בלאקירט.', 'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.', 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן', diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php index d5b9bda6dd..1d2c0b26dc 100644 --- a/languages/messages/MessagesYo.php +++ b/languages/messages/MessagesYo.php @@ -2530,11 +2530,8 @@ $1', Sùgbọ́n ó jẹ́ dídílọ́nà gẹ́gẹ́bí ìkan nínú ìgbàjá $2, èyí sì ṣe é mọ́ dí lọ́nà mọ́.', 'ip_range_invalid' => 'Àdìmọ́ IP aláìníìbámu.', 'ip_range_toolarge' => 'Ìgbàjá ìdínà tó tóbi ju /$1 kò jẹ́ gbígbà ní àyè.', -'blockme' => 'Dínà mi', 'proxyblocker' => 'Olùdínà ẹ̀rọ-ìwọ̀fà ẹlòmíràn', -'proxyblocker-disabled' => 'Ìmúṣe yìí jẹ́ dídálẹ́kun.', 'proxyblockreason' => 'Àdírẹ́ẹ̀sì IP yín ti jẹ́ dídílọ́nà nítorípé ó jẹ́ ẹ̀rọ alàìlórúkọ ẹlòmíràn ìgboro. Ẹ sọ ìsòro yìí fún olùpèsè ìwọ̀fà Internet yín tàbí aṣeàtìlẹyìn ẹ̀rọ-ìpèsè ibiiṣẹ́ yín.', -'proxyblocksuccess' => 'Ṣetán', 'sorbsreason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.', 'sorbs_create_account_reason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò. Ẹ kò le dá àpamọ́.', diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php index 284ecc62c4..d048e5866e 100644 --- a/languages/messages/MessagesYue.php +++ b/languages/messages/MessagesYue.php @@ -663,7 +663,7 @@ $1', 'passwordsent' => '新嘅密碼已經寄咗畀呢位用戶 "$1" 嘅電郵地址。收到之後請重新登入。', 'blocked-mailpassword' => '你嘅IP地址被鎖住,唔可以用密碼復原功能以防止濫用。', 'eauthentsent' => '確認電郵已經傳送到指定嘅電郵地址。喺其它嘅郵件傳送到呢個戶口之前,你需要按電郵嘅指示,嚟確認呢個戶口真係屬於你嘅。', -'throttled-mailpassword' => '一個密碼提醒已經響$1個鐘頭之前發送咗。為咗防止濫用,響$1個鐘頭之內只可以發送一個密碼提醒。', +'throttled-mailpassword' => '一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用,響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。', 'mailerror' => '傳送電郵錯誤: $1', 'acct_creation_throttle_hit' => '利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口,係響呢段時間嘅上限。 結果,利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。', @@ -2328,11 +2328,8 @@ $1', 'ipb_blocked_as_range' => '錯誤:個IP $1 無直接封鎖,唔可以解封。但係佢係響 $2 嘅封鎖範圍之內,嗰段範圍係可以解封嘅。', 'ip_range_invalid' => '無效嘅IP範圍', 'ip_range_toolarge' => '大過 /$1 嘅封鎖範圍係唔容許嘅。', -'blockme' => '封鎖我', 'proxyblocker' => 'Proxy 封鎖器', -'proxyblocker-disabled' => '呢個功能已經停用。', 'proxyblockreason' => '你嘅IP係一個公開(指任何人都可以用,無須身份認證?)嘅代理地址,因此被封鎖。請聯絡你嘅Internet服務提供商或技術支援,向佢哋報告呢個嚴重嘅安全問題。', -'proxyblocksuccess' => '完成。', 'sorbsreason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。', 'sorbs_create_account_reason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。你唔可以開新戶口。', 'cant-block-while-blocked' => '當你被封鎖嗰陣唔可以封鎖其他用戶。', @@ -2648,6 +2645,8 @@ $1', 'spambot_username' => 'MediaWiki垃圾清除', 'spam_reverting' => '恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。', 'spam_blanking' => '全部版本都含有指去$1嘅連結,留空', +'simpleantispam-label' => "反垃圾檢查。 +'''唔好'''加入呢個!", # Skin names 'skinname-cologneblue' => '科隆藍', @@ -2715,6 +2714,12 @@ $1', 'bydate' => '以時間', 'sp-newimages-showfrom' => '顯示由$1 $2嘅新檔', +# Video information, used by Language::formatTimePeriod() to format lengths in the above messages +'hours' => '$1{{PLURAL:$1|個鐘}}', + +# Human-readable timestamps +'hours-ago' => '$1{{PLURAL:$1|個鐘}}之前', + # Bad image list 'bad_image_list' => '請根據下面嘅格式去寫: @@ -3019,7 +3024,7 @@ Variants for Chinese language 'exif-gpsmeasuremode-3' => '三維量度', # Pseudotags used for GPSSpeedRef -'exif-gpsspeed-k' => '千米/小時', +'exif-gpsspeed-k' => '公里/小時', 'exif-gpsspeed-m' => '英里/小時', 'exif-gpsspeed-n' => '浬/小時', @@ -3310,4 +3315,7 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅 'searchsuggest-search' => '搵嘢', 'searchsuggest-containing' => '名單傳送緊...', +# Durations +'duration-hours' => '$1{{PLURAL:$1|個鐘}}', + ); diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php index 44dcda471e..6a37a4853d 100644 --- a/languages/messages/MessagesZh_hans.php +++ b/languages/messages/MessagesZh_hans.php @@ -578,7 +578,7 @@ $messages = array( 'articlepage' => '查看内容页面', 'talk' => '讨论', 'views' => '查看', -'toolbox' => '工具箱', +'toolbox' => '工具', 'userpage' => '查看用户页面', 'projectpage' => '查看项目页面', 'imagepage' => '查看文件页面', @@ -1176,7 +1176,7 @@ $2 # "Undo" feature 'undo-success' => '该编辑可以被撤销。请检查下面的对比以核实你想要撤销的内容,然后保存下面的更改以完成撤销。', 'undo-failure' => '因存在冲突的中间编辑,本编辑不能撤销。', -'undo-norev' => '由于其修订版本不存在或已删除,此编辑不能撤销。', +'undo-norev' => '该编辑无法撤消,因为它不存在或已被删除。', 'undo-summary' => '撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1', 'undo-summary-username-hidden' => '取消由一匿名用户所作的修订$1', @@ -1712,8 +1712,8 @@ $1", 'recentchanges-label-bot' => '该编辑由机器人进行', 'recentchanges-label-unpatrolled' => '该编辑尚未巡查', 'rcnote' => "下面是过去'''$2'''天的最后'''$1'''个更改,截至$4 $5。", -'rcnotefrom' => "下面是自'''$2'''起的更改(最多显示'''$1'''个)。", -'rclistfrom' => '显示自$1起的新更改', +'rcnotefrom' => "下面是'''$2'''之后的更改(最多显示'''$1'''个)。", +'rclistfrom' => '显示$1之后的新更改', 'rcshowhideminor' => '$1小编辑', 'rcshowhidebots' => '$1机器人的编辑', 'rcshowhideliu' => '$1登录用户的编辑', @@ -2085,7 +2085,7 @@ $1', # Random redirect 'randomredirect' => '随机重定向', -'randomredirect-nopages' => '在 "$1" 名字空间中没有重定向页面。', +'randomredirect-nopages' => '“$1”名字空间中没有重定向。', # Statistics 'statistics' => '统计', @@ -2443,10 +2443,10 @@ $UNWATCHURL 'deletereasonotherlist' => '其他原因', 'deletereason-dropdown' => '*常见删除原因 ** 广告 -** 作者申请 -** 侵犯著作权 ** 破坏行为 -** 损坏重定向', +** 侵犯著作权 +** 作者申请 +** 损坏的重定向', 'delete-edit-reasonlist' => '编辑删除原因', 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。', 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。', @@ -2465,7 +2465,7 @@ $UNWATCHURL 'editcomment' => '编辑摘要:"$1"。', 'revertpage' => '已恢复[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的编辑至[[User:$1|$1]]的最后一个修订版本', 'revertpage-nouser' => '恢复由隐藏用户的编辑到{{GENDER:$1|[[User:$1|$1]]}}的最后一个修订版本', -'rollback-success' => '已恢复$1的编辑,更改回$2的最后修订版本。', +'rollback-success' => '已恢复$1的编辑,更改回$2的最后版本。', # Edit tokens 'sessionfailure-title' => '会话无效', @@ -2752,11 +2752,8 @@ $1被封禁的理由是:“$2”', 'ipb_blocked_as_range' => '错误:IP地址$1未被直接封禁,故无法解除封禁。然而,它位于IP地址段$2的封禁范围内,后者可被解除封禁。', 'ip_range_invalid' => '无效的IP地址段。', 'ip_range_toolarge' => '不允许大于/$1的段封禁。', -'blockme' => '封禁我', 'proxyblocker' => '代理封禁器', -'proxyblocker-disabled' => '此功能已禁用。', 'proxyblockreason' => '您的IP地址为已被封禁的公开代理。请联系您的互联网服务提供商或技术支持者,并告知他们此严重的安全问题。', -'proxyblocksuccess' => '完成。', 'sorbsreason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。', 'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。', 'xffblockreason' => '您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1', @@ -3054,7 +3051,7 @@ $2', 'tooltip-save' => '保存你的更改', 'tooltip-preview' => '预览您的更改,请在保存前使用此功能!', 'tooltip-diff' => '显示您对该文字所做的更改', -'tooltip-compareselectedversions' => '查看此页面两个选定的修订版本间的差异。', +'tooltip-compareselectedversions' => '查看该页面两个选定的版本之间的差异。', 'tooltip-watch' => '添加本页面至你的监视列表', 'tooltip-watchlistedit-normal-submit' => '删除标题', 'tooltip-watchlistedit-raw-submit' => '更新监视列表', @@ -3064,7 +3061,7 @@ $2', 'tooltip-undo' => '“撤销”可以恢复该编辑并在预览模式下打开编辑表单。它允许在摘要中加入原因。', 'tooltip-preferences-save' => '保存系统设置', 'tooltip-summary' => '请输入简短的摘要', -'tooltip-iwiki' => '$1——$2', +'tooltip-iwiki' => '$1 – 2', # Stylesheets 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */', @@ -3114,6 +3111,8 @@ $2', 'spam_reverting' => '恢复到不包含链接的最近修订版本$1', 'spam_blanking' => '消隐所有包含链接至$1的修订', 'spam_deleting' => '正在删除所有包含至$1的版本', +'simpleantispam-label' => "反垃圾检查。 +'''不要'''加入这个!", # Info page 'pageinfo-title' => '“$1”的信息', @@ -3787,7 +3786,7 @@ $5 # action=purge 'confirm_purge_button' => '确定', 'confirm-purge-top' => '要清除此页面的缓存吗?', -'confirm-purge-bottom' => '清理一页将会清除快取以及强迫显示最现时之修订版本。', +'confirm-purge-bottom' => '清除页面数据会清除缓存并强制显示最近的版本。', # action=watch/unwatch 'confirm-watch-button' => '确定', @@ -3907,12 +3906,12 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含 # Special:Redirect 'redirect' => '重定向(按文件、用户或版本ID)', 'redirect-legend' => '重定向至文件或页面', -'redirect-summary' => '本特殊页面会重定向到一个文件(给予文件名),一个页面(给予修订版本ID),或一个用户页面(给予用户数字ID)。', +'redirect-summary' => '本特殊页面可以跳转至一个文件(提供文件名)、页面(提供版本ID)或用户页面(提供数字用户ID)。', 'redirect-submit' => '提交', 'redirect-lookup' => '基于:', 'redirect-value' => '值:', 'redirect-user' => '用户ID', -'redirect-revision' => '页面修订', +'redirect-revision' => '页面版本ID', 'redirect-file' => '文件名', 'redirect-not-exists' => '没找到相应值', @@ -4141,6 +4140,6 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含 'limitreport-templateargumentsize' => '模板参数大小', 'limitreport-templateargumentsize-value' => '$1/$2 字节', 'limitreport-expansiondepth' => '最高扩展深度', -'limitreport-expensivefunctioncount' => '昂贵的函数分析技术器', +'limitreport-expensivefunctioncount' => '高级函数分析器', ); diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php index 3bc76732f5..28ab8f6b2a 100644 --- a/languages/messages/MessagesZh_hant.php +++ b/languages/messages/MessagesZh_hant.php @@ -2405,10 +2405,12 @@ $UNWATCHURL 'deletecomment' => '理由:', 'deleteotherreason' => '其它/附加的理由:', 'deletereasonotherlist' => '其它理由', -'deletereason-dropdown' => '*常用刪除理由 -** 作者請求 +'deletereason-dropdown' => '* 常見刪除理由 +** 濫發電郵 +** 破壞 ** 侵犯版權 -** 破壞', +** 作者請求 +** 損壞重定向頁', 'delete-edit-reasonlist' => '編輯刪除理由', 'delete-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。', 'delete-warning-toobig' => '這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。', @@ -2719,11 +2721,8 @@ $1被封禁的理由是“$2”', 'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接查封,不可以解除封禁。但是它是在 $2 的查封範圍之內,該段範圍是可以解除封禁的。', 'ip_range_invalid' => '無效的IP範圍。', 'ip_range_toolarge' => '大於 /$1 的封鎖範圍是不容許的。', -'blockme' => '查封我', 'proxyblocker' => '代理封鎖器', -'proxyblocker-disabled' => '這個功能已經停用。', 'proxyblockreason' => '您的IP位址是一個開放的代理,它已經被封鎖。請聯繫您的網際網路服務提供商或技術支援者並告知告知他們該嚴重的安全問題。', -'proxyblocksuccess' => '完成。', 'sorbsreason' => '您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。', 'sorbs_create_account_reason' => '由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器,所以您無法建立賬號。', 'xffblockreason' => '您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由:$1', @@ -3085,6 +3084,8 @@ $2', 'spam_reverting' => '恢復到不包含連結至$1的最近修訂版本', 'spam_blanking' => '所有包含連結至$1的修訂,清空', 'spam_deleting' => '所有包含連結至$1的修訂,刪除中', +'simpleantispam-label' => "反垃圾檢查。 +'''不要'''加入這個!", # Info page 'pageinfo-title' => '「$1」的信息', @@ -3939,6 +3940,8 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任 'tags-description-header' => '解釋完整描述', 'tags-active-header' => '存檔?', 'tags-hitcount-header' => '已加上標籤的更改', +'tags-active-yes' => '是', +'tags-active-no' => '否', 'tags-edit' => '編輯', 'tags-hitcount' => '$1次更改', diff --git a/maintenance/archives/patch-archive-ar_id.sql b/maintenance/archives/patch-archive-ar_id.sql new file mode 100644 index 0000000000..ddd1d7b482 --- /dev/null +++ b/maintenance/archives/patch-archive-ar_id.sql @@ -0,0 +1,8 @@ +-- +-- patch-archive-ar_id.sql +-- +-- Bug 39675. Add archive.ar_id. + +ALTER TABLE /*$wgDBprefix*/archive + ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST, + ADD PRIMARY KEY (ar_id); diff --git a/maintenance/archives/patch-change_tag.sql b/maintenance/archives/patch-change_tag.sql index 030e086b47..3079a5bb30 100644 --- a/maintenance/archives/patch-change_tag.sql +++ b/maintenance/archives/patch-change_tag.sql @@ -13,20 +13,3 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag); -- Covering index, so we can pull all the info only out of the index. CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id); - --- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+ -CREATE TABLE /*_*/tag_summary ( - ts_rc_id int NULL, - ts_log_id int NULL, - ts_rev_id int NULL, - ts_tags BLOB NOT NULL -) /*$wgDBTableOptions*/; - -CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id); -CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id); -CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id); - - -CREATE TABLE /*_*/valid_tag ( - vt_tag varchar(255) NOT NULL PRIMARY KEY -) /*$wgDBTableOptions*/; diff --git a/maintenance/archives/patch-externallinks-el_id.sql b/maintenance/archives/patch-externallinks-el_id.sql new file mode 100644 index 0000000000..d4b51b5175 --- /dev/null +++ b/maintenance/archives/patch-externallinks-el_id.sql @@ -0,0 +1,8 @@ +-- +-- patch-extenallinks-el_id.sql +-- +-- Bug 15441. Add externallinks.el_id. + +ALTER TABLE /*$wgDBprefix*/externallinks + ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST, + ADD PRIMARY KEY (el_id); diff --git a/maintenance/archives/patch-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql new file mode 100644 index 0000000000..a81b368002 --- /dev/null +++ b/maintenance/archives/patch-tag_summary.sql @@ -0,0 +1,12 @@ +-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+ +-- Andrew Garrett, 2009-01 +CREATE TABLE /*_*/tag_summary ( + ts_rc_id int NULL, + ts_log_id int NULL, + ts_rev_id int NULL, + ts_tags BLOB NOT NULL +) /*$wgDBTableOptions*/; + +CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id); +CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id); +CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id); diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql new file mode 100644 index 0000000000..994a5d53ee --- /dev/null +++ b/maintenance/archives/patch-valid_tag.sql @@ -0,0 +1,4 @@ +-- Andrew Garrett, 2009-01 +CREATE TABLE /*_*/valid_tag ( + vt_tag varchar(255) NOT NULL PRIMARY KEY +) /*$wgDBTableOptions*/; diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php index 1e36363919..81758913dd 100644 --- a/maintenance/deleteEqualMessages.php +++ b/maintenance/deleteEqualMessages.php @@ -70,7 +70,13 @@ class DeleteEqualMessages extends Maintenance { $default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain(); $messageInfo['relevantPages']++; - if ( $actual === $default ) { + + if ( + // Exclude messages that are empty by default, such as sitenotice, specialpage + // summaries and accesskeys. + $default !== '' && $default !== '-' && + $actual === $default + ) { $hasTalk = isset( $statuses['talks'][$key] ); $messageInfo['results'][] = array( 'title' => $key . $titleSuffix, diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php index 6b7f38a8e8..548bb2f2e4 100644 --- a/maintenance/fuzz-tester.php +++ b/maintenance/fuzz-tester.php @@ -118,7 +118,6 @@ Wiki configuration for testing: // Enable weird and wonderful options: // Increase default error reporting level. error_reporting (E_ALL); // At a later date could be increased to E_ALL | E_STRICT - $wgBlockOpenProxies = true; // Some block pages require this to be true in order to test. $wgEnableUploads = true; // enable uploads. $wgDBerrorLog = "/root/mediawiki-db-error-log.txt"; // log DB errors, replace with suitable path. $wgShowSQLErrors = true; // Show SQL errors (instead of saying the query was hidden). @@ -1483,24 +1482,6 @@ class watchlistTest extends pageTest { } } - -/** - ** a page test for "Special:Blockme" - */ -class specialBlockmeTest extends pageTest { - function __construct() { - $this->pagePath = "index.php?title=Special:Blockme"; - - $this->params = array (); - - // sometimes we specify "ip", and sometimes we don't. - if ( wikiFuzz::randnum( 1 ) == 0 ) { - $this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) ); - } - } -} - - /** ** a page test for "Special:Movepage" */ @@ -2161,7 +2142,7 @@ class GeSHi_Test extends pageTest { /** ** selects a page test to run. * @param $count - * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBlockmeTest|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest + * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest */ function selectPageTest( $count ) { @@ -2197,7 +2178,6 @@ function selectPageTest( $count ) { case 20: return new redirectTest(); case 21: return new confirmEmail(); case 22: return new watchlistTest(); - case 23: return new specialBlockmeTest(); case 24: return new specialUndeletePageTest(); case 25: return new specialMovePage(); case 26: return new specialUnlockdbPageTest(); diff --git a/maintenance/importImages.php b/maintenance/importImages.php index cbbcf0f9e6..54fd4e2d88 100644 --- a/maintenance/importImages.php +++ b/maintenance/importImages.php @@ -230,14 +230,14 @@ if ( $count > 0 ) { } else { $props = FSFile::getPropsFromPath( $file ); $flags = 0; - $options = array(); + $publishOptions = array(); $handler = MediaHandler::getHandler( $props['mime'] ); if ( $handler ) { - $options['headers'] = $handler->getStreamHeaders( $props['metadata'] ); + $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] ); } else { - $options['headers'] = array(); + $publishOptions['headers'] = array(); } - $archive = $image->publish( $file, $flags, $options ); + $archive = $image->publish( $file, $flags, $publishOptions ); if ( !$archive->isGood() ) { echo "failed. (" . $archive->getWikiText() . @@ -248,7 +248,7 @@ if ( $count > 0 ) { } $commentText = SpecialUpload::getInitialPageText( $commentText, $license ); - if ( !$summary ) { + if ( !isset( $options['summary'] ) ) { $summary = $commentText; } diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json index e98e9c0fbe..c595980515 100644 --- a/maintenance/jsduck/categories.json +++ b/maintenance/jsduck/categories.json @@ -9,6 +9,7 @@ "mw.Map", "mw.Message", "mw.loader", + "mw.loader.store", "mw.log", "mw.html", "mw.html.Cdata", @@ -21,6 +22,7 @@ "classes": [ "mw.Title", "mw.inspect", + "mw.inspect.reports", "mw.notification", "mw.user", "mw.util", diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index ca3a4f554b..a4fc922bcd 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -2378,11 +2378,8 @@ $wgMessageStructure = array( 'ipb_blocked_as_range', 'ip_range_invalid', 'ip_range_toolarge', - 'blockme', 'proxyblocker', - 'proxyblocker-disabled', 'proxyblockreason', - 'proxyblocksuccess', 'sorbs', 'sorbsreason', 'sorbs_create_account_reason', @@ -2779,6 +2776,7 @@ $wgMessageStructure = array( 'spam_reverting', 'spam_blanking', 'spam_deleting', + 'simpleantispam-label', ), 'info' => array( 'pageinfo-header', diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql index c474f004e5..7356c38f75 100644 --- a/maintenance/mssql/tables.sql +++ b/maintenance/mssql/tables.sql @@ -159,6 +159,7 @@ CREATE TABLE /*$wgDBprefix*/text ( -- Cannot reasonably create views on this table, due to the presence of TEXT -- columns. CREATE TABLE /*$wgDBprefix*/archive ( + ar_id NOT NULL PRIMARY KEY clustered IDENTITY, ar_namespace SMALLINT NOT NULL DEFAULT 0, ar_title NVARCHAR(255) NOT NULL DEFAULT '', ar_text NVARCHAR(MAX) NOT NULL, @@ -298,6 +299,7 @@ CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, l -- Track links to external URLs -- IE >= 4 supports no more than 2083 characters in a URL CREATE TABLE /*$wgDBprefix*/externallinks ( + el_id INT NOT NULL PRIMARY KEY clustered IDENTITY, el_from INT NOT NULL DEFAULT '0', el_to VARCHAR(2083) NOT NULL, el_index VARCHAR(896) NOT NULL, diff --git a/maintenance/mwjsduck-gen b/maintenance/mwjsduck-gen index bc10bc2c7b..622712ed3d 100755 --- a/maintenance/mwjsduck-gen +++ b/maintenance/mwjsduck-gen @@ -6,7 +6,7 @@ then JSDUCK_MWVERSION="$2" elif [[ "$*" != "" ]] then - echo "Usage $0: [--version ]" + echo "Usage: $0 [--version ]" echo exit 1 fi diff --git a/maintenance/oracle/archives/patch-archive-ar_id.sql b/maintenance/oracle/archives/patch-archive-ar_id.sql new file mode 100644 index 0000000000..a43f76024b --- /dev/null +++ b/maintenance/oracle/archives/patch-archive-ar_id.sql @@ -0,0 +1,6 @@ +define mw_prefix='{$wgDBprefix}'; + +ALTER TABLE &mw_prefix.archive ADD ( +ar_id NUMBER NOT NULL, +); +ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id); diff --git a/maintenance/oracle/archives/patch-externallinks-el_id.sql b/maintenance/oracle/archives/patch-externallinks-el_id.sql new file mode 100644 index 0000000000..a8c443f42f --- /dev/null +++ b/maintenance/oracle/archives/patch-externallinks-el_id.sql @@ -0,0 +1,4 @@ +define mw_prefix='{$wgDBprefix}'; + +ALTER TABLE &mw_prefix.externallinks ADD el_id NUMBER NOT NULL; +ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id); \ No newline at end of file diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql index 57b6e7edab..acfabc339a 100644 --- a/maintenance/oracle/tables.sql +++ b/maintenance/oracle/tables.sql @@ -129,7 +129,9 @@ CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text' ); ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id); +CREATE SEQUENCE archive_ar_id_seq; CREATE TABLE &mw_prefix.archive ( + ar_id NUMBER NOT NULL, ar_namespace NUMBER DEFAULT 0 NOT NULL, ar_title VARCHAR2(255) NOT NULL, ar_text CLOB, @@ -149,6 +151,7 @@ CREATE TABLE &mw_prefix.archive ( ar_content_model VARCHAR2(32), ar_content_format VARCHAR2(64) ); +ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id); ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED; CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp); CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp); @@ -208,11 +211,14 @@ ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KE CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title); CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages); +CREATE SEQUENCE externallinks_el_id_seq; CREATE TABLE &mw_prefix.externallinks ( + el_id NUMBER NOT NULL, el_from NUMBER NOT NULL, el_to VARCHAR2(2048) NOT NULL, el_index VARCHAR2(2048) NOT NULL ); +ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id); ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED; CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to); CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from); diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php index 3c69125a97..042790fc76 100644 --- a/maintenance/populateRevisionLength.php +++ b/maintenance/populateRevisionLength.php @@ -1,6 +1,7 @@ mDescription = "Populates the rev_len field"; + $this->mDescription = "Populates the rev_len and ar_len fields"; $this->setBatchSize( 200 ); } protected function getUpdateKey() { - return 'populate rev_len'; - } - - protected function updateSkippedMessage() { - return 'rev_len column of revision table already populated.'; + return 'populate rev_len and ar_len'; } public function doDBUpdates() { $db = $this->getDB( DB_MASTER ); if ( !$db->tableExists( 'revision' ) ) { $this->error( "revision table does not exist", true ); + } elseif ( !$db->tableExists( 'archive' ) ) { + $this->error( "archive table does not exist", true ); } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) { $this->output( "rev_len column does not exist\n\n", true ); return false; } $this->output( "Populating rev_len column\n" ); + $rev = $this->doLenUpdates( 'revision', 'rev_id', 'rev', Revision::selectFields() ); + + $this->output( "Populating ar_len column\n" ); + $ar = $this->doLenUpdates( 'archive', 'ar_id', 'ar', Revision::selectArchiveFields() ); + + $this->output( "rev_len and ar_len population complete [$rev revision rows, $ar archive rows].\n" ); + return true; + } - $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __METHOD__ ); - $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ ); + /** + * @param string $table + * @param string $idCol + * @param string $prefix + * @param array $fields + * @return int + */ + protected function doLenUpdates( $table, $idCol, $prefix, $fields ) { + $db = $this->getDB( DB_MASTER ); + $start = $db->selectField( $table, "MIN($idCol)", false, __METHOD__ ); + $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ ); if ( !$start || !$end ) { - $this->output( "...revision table seems to be empty.\n" ); - return true; + $this->output( "...$table table seems to be empty.\n" ); + return 0; } # Do remaining chunks $blockStart = intval( $start ); $blockEnd = intval( $start ) + $this->mBatchSize - 1; $count = 0; - $missing = 0; - $fields = Revision::selectFields(); + while ( $blockStart <= $end ) { - $this->output( "...doing rev_id from $blockStart to $blockEnd\n" ); + $this->output( "...doing $idCol from $blockStart to $blockEnd\n" ); $res = $db->select( - 'revision', + $table, $fields, array( - "rev_id >= $blockStart", - "rev_id <= $blockEnd", - "rev_len IS NULL" + "$idCol >= $blockStart", + "$idCol <= $blockEnd", + "{$prefix}_len IS NULL" ), __METHOD__ ); + + $db->begin( __METHOD__ ); # Go through and update rev_len from these rows. foreach ( $res as $row ) { - $rev = new Revision( $row ); - $content = $rev->getContent(); - if ( !$content ) { - # This should not happen, but sometimes does (bug 20757) - $this->output( "Content of revision {$row->rev_id} unavailable!\n" ); - $missing++; - } - else { - # Update the row... - $db->update( 'revision', - array( 'rev_len' => $content->getSize() ), - array( 'rev_id' => $row->rev_id ), - __METHOD__ ); + if ( $this->upgradeRow( $row, $table, $idCol, $prefix ) ) { $count++; } } + $db->commit( __METHOD__ ); + $blockStart += $this->mBatchSize; $blockEnd += $this->mBatchSize; wfWaitForSlaves(); } - $this->output( "rev_len population complete ... {$count} rows changed ({$missing} missing)\n" ); + return $count; + } + + /** + * @param $row + * @param string $table + * @param string $idCol + * @param string $prefix + * @return bool + */ + protected function upgradeRow( $row, $table, $idCol, $prefix ) { + $db = $this->getDB( DB_MASTER ); + + $rev = ( $table === 'archive' ) + ? Revision::newFromArchiveRow( $row ) + : new Revision( $row ); + + $content = $rev->getContent(); + if ( !$content ) { + # This should not happen, but sometimes does (bug 20757) + $id = $row->$idCol; + $this->output( "Content of $table $id unavailable!\n" ); + return false; + } + + # Update the row... + $db->update( $table, + array( "{$prefix}_len" => $content->getSize() ), + array( $idCol => $row->$idCol ), + __METHOD__ + ); + return true; } } diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index 7c863549fd..d0d1e92de8 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -18,6 +18,8 @@ DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE; DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE; DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE; DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE; +DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE; +DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE; DROP FUNCTION IF EXISTS page_deleted() CASCADE; DROP FUNCTION IF EXISTS ts2_page_title() CASCADE; DROP FUNCTION IF EXISTS ts2_page_text() CASCADE; @@ -156,7 +158,9 @@ ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_prop CREATE INDEX page_props_propname ON page_props (pp_propname); CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page); +CREATE SEQUENCE archive_ar_id_seq; CREATE TABLE archive ( + ar_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq'), ar_namespace SMALLINT NOT NULL, ar_title TEXT NOT NULL, ar_text TEXT, -- technically should be bytea, but not used anymore @@ -224,7 +228,9 @@ CREATE TABLE categorylinks ( CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to); CREATE INDEX cl_sortkey ON categorylinks (cl_to, cl_sortkey, cl_from); +CREATE SEQUENCE externallinks_id_seq; CREATE TABLE externallinks ( + el_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_id_seq'), el_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, el_to TEXT NOT NULL, el_index TEXT NOT NULL diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php deleted file mode 100644 index b52f20fb50..0000000000 --- a/maintenance/proxyCheck.php +++ /dev/null @@ -1,70 +0,0 @@ -> /home/tstarling/open/proxy.log`; diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql index 73b008cce8..1a59be5aeb 100644 --- a/maintenance/sqlite/archives/initial-indexes.sql +++ b/maintenance/sqlite/archives/initial-indexes.sql @@ -28,6 +28,8 @@ DROP TABLE IF EXISTS /*_*/interwiki_tmp; DROP TABLE IF EXISTS /*_*/page_restrictions_tmp; DROP TABLE IF EXISTS /*_*/protected_titles_tmp; DROP TABLE IF EXISTS /*_*/page_props_tmp; +DROP TABLE IF EXISTS /*_*/archive_tmp; +DROP TABLE IF EXISTS /*_*/externallinks_tmp; -------------------------------------------------------------------------------- -- Create new tables @@ -268,6 +270,47 @@ CREATE TABLE /*_*/page_props_tmp ( ); CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props_tmp (pp_page,pp_propname); +-- +-- Holding area for deleted articles, which may be viewed +-- or restored by admins through the Special:Undelete interface. +-- The fields generally correspond to the page, revision, and text +-- fields, with several caveats. +-- Cannot reasonably create views on this table, due to the presence of TEXT +-- columns. +CREATE TABLE /*$wgDBprefix*/archive_tmp ( + ar_id NOT NULL PRIMARY KEY clustered IDENTITY, + ar_namespace SMALLINT NOT NULL DEFAULT 0, + ar_title NVARCHAR(255) NOT NULL DEFAULT '', + ar_text NVARCHAR(MAX) NOT NULL, + ar_comment NVARCHAR(255) NOT NULL, + ar_user INT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE SET NULL, + ar_user_text NVARCHAR(255) NOT NULL, + ar_timestamp DATETIME NOT NULL DEFAULT GETDATE(), + ar_minor_edit BIT NOT NULL DEFAULT 0, + ar_flags NVARCHAR(255) NOT NULL, + ar_rev_id INT, + ar_text_id INT, + ar_deleted BIT NOT NULL DEFAULT 0, + ar_len INT DEFAULT NULL, + ar_page_id INT NULL, + ar_parent_id INT NULL +); +CREATE INDEX /*$wgDBprefix*/ar_name_title_timestamp ON /*$wgDBprefix*/archive_tmp(ar_namespace,ar_title,ar_timestamp); +CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive_tmp(ar_user_text,ar_timestamp); +CREATE INDEX /*$wgDBprefix*/ar_user_text ON /*$wgDBprefix*/archive_tmp(ar_user_text); + +-- +-- Track links to external URLs +-- IE >= 4 supports no more than 2083 characters in a URL +CREATE TABLE /*$wgDBprefix*/externallinks_tmp ( + el_id INT NOT NULL PRIMARY KEY clustered IDENTITY, + el_from INT NOT NULL DEFAULT '0', + el_to VARCHAR(2083) NOT NULL, + el_index VARCHAR(896) NOT NULL, +); +-- Maximum key length ON SQL Server is 900 bytes +CREATE INDEX /*$wgDBprefix*/externallinks_index ON /*$wgDBprefix*/externallinks_tmp(el_index); + -------------------------------------------------------------------------------- -- Populate the new tables using INSERT SELECT -------------------------------------------------------------------------------- @@ -290,6 +333,8 @@ INSERT OR IGNORE INTO /*_*/interwiki_tmp SELECT * FROM /*_*/interwiki; INSERT OR IGNORE INTO /*_*/page_restrictions_tmp SELECT * FROM /*_*/page_restrictions; INSERT OR IGNORE INTO /*_*/protected_titles_tmp SELECT * FROM /*_*/protected_titles; INSERT OR IGNORE INTO /*_*/page_props_tmp SELECT * FROM /*_*/page_props; +INSERT OR IGNORE INTO /*_*/archive_tmp SELECT * FROM /*_*/archive; +INSERT OR IGNORE INTO /*_*/externallinks_tmp SELECT * FROM /*_*/externallinks; -------------------------------------------------------------------------------- -- Do the table renames @@ -331,6 +376,10 @@ DROP TABLE /*_*/protected_titles; ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles; DROP TABLE /*_*/page_props; ALTER TABLE /*_*/page_props_tmp RENAME TO /*_*/page_props; +DROP TABLE /*_*/archive; +ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive; +DROP TABLE /*_*/externalllinks; +ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks; -------------------------------------------------------------------------------- -- Drop and create tables with unique indexes but no valuable data diff --git a/maintenance/sqlite/archives/patch-archive-ar_id.sql b/maintenance/sqlite/archives/patch-archive-ar_id.sql new file mode 100644 index 0000000000..00a9b071e8 --- /dev/null +++ b/maintenance/sqlite/archives/patch-archive-ar_id.sql @@ -0,0 +1,39 @@ +DROP TABLE IF EXISTS /*_*/archive_tmp; + +CREATE TABLE /*$wgDBprefix*/archive_tmp ( + ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + ar_namespace int NOT NULL default 0, + ar_title varchar(255) binary NOT NULL default '', + ar_text mediumblob NOT NULL, + ar_comment tinyblob NOT NULL, + ar_user int unsigned NOT NULL default 0, + ar_user_text varchar(255) binary NOT NULL, + ar_timestamp binary(14) NOT NULL default '', + ar_minor_edit tinyint NOT NULL default 0, + ar_flags tinyblob NOT NULL, + ar_rev_id int unsigned, + ar_text_id int unsigned, + ar_deleted tinyint unsigned NOT NULL default 0, + ar_len int unsigned, + ar_page_id int unsigned, + ar_parent_id int unsigned default NULL, + ar_sha1 varbinary(32) NOT NULL default '', + ar_content_model varbinary(32) DEFAULT NULL, + ar_content_format varbinary(64) DEFAULT NULL +); + +INSERT OR IGNORE INTO /*_*/archive_tmp ( + ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp, + ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id ) + SELECT + ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp, + ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id + FROM /*_*/archive; + +DROP TABLE /*_*/archive; + +ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive; + +CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp); +CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp); +CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id); diff --git a/maintenance/sqlite/archives/patch-externallinks-el_id.sql b/maintenance/sqlite/archives/patch-externallinks-el_id.sql new file mode 100644 index 0000000000..0aad40715a --- /dev/null +++ b/maintenance/sqlite/archives/patch-externallinks-el_id.sql @@ -0,0 +1,19 @@ +DROP TABLE IF EXISTS /*_*/externallinks_tmp; + +CREATE TABLE /*$wgDBprefix*/externallinks_tmp ( + el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + el_from int unsigned NOT NULL default 0, + el_to blob NOT NULL, + el_index blob NOT NULL +); + +INSERT OR IGNORE INTO /*_*/externallinks_tmp (el_from, el_to, el_index) SELECT + el_from, el_to, el_index FROM /*_*/externallinks; + +DROP TABLE /*_*/externallinks; + +ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks; + +CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40)); +CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from); +CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60)); \ No newline at end of file diff --git a/maintenance/tables.sql b/maintenance/tables.sql index 07fd14aea6..af01a30cc1 100644 --- a/maintenance/tables.sql +++ b/maintenance/tables.sql @@ -380,6 +380,8 @@ CREATE TABLE /*_*/text ( -- fields, with several caveats. -- CREATE TABLE /*_*/archive ( + -- Primary key + ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, ar_namespace int NOT NULL default 0, ar_title varchar(255) binary NOT NULL default '', @@ -445,7 +447,6 @@ CREATE TABLE /*_*/archive ( -- content format, see CONTENT_FORMAT_XXX constants ar_content_format varbinary(64) DEFAULT NULL - ) /*$wgDBTableOptions*/; CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp); @@ -602,6 +603,9 @@ CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages); -- Track links to external URLs -- CREATE TABLE /*_*/externallinks ( + -- Primary key + el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, + -- page_id of the referring page el_from int unsigned NOT NULL default 0, @@ -1080,7 +1084,7 @@ CREATE TABLE /*_*/recentchanges ( -- Visibility of recent changes items, bitfield rc_deleted tinyint unsigned NOT NULL default 0, - -- Value corresonding to log_id, specific log entries + -- Value corresponding to log_id, specific log entries rc_logid int unsigned NOT NULL default 0, -- Store log type info here, or null rc_log_type varbinary(255) NULL default NULL, @@ -1109,8 +1113,9 @@ CREATE TABLE /*_*/watchlist ( wl_namespace int NOT NULL default 0, wl_title varchar(255) binary NOT NULL default '', - -- Timestamp when user was last sent a notification e-mail; - -- cleared when the user visits the page. + -- Timestamp used to send notification e-mails and show "updated since last visit" markers on + -- history and recent changes / watchlist. Set to NULL when the user visits the latest revision + -- of the page, which means that they should be sent an e-mail on the next change. wl_notificationtimestamp varbinary(14) ) /*$wgDBTableOptions*/; diff --git a/resources/Resources.php b/resources/Resources.php index c0336472d6..8809227dc2 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -87,7 +87,7 @@ return array( 'localBasePath' => $GLOBALS['wgStyleDirectory'], ), 'skins.vector' => array( - // Keep in sync with WebInstallerOutput::getCSS() + // Used in the web installer. Test it after modifying this definition! 'styles' => array( 'common/commonElements.css' => array( 'media' => 'screen' ), 'common/commonContent.css' => array( 'media' => 'screen' ), @@ -655,7 +655,10 @@ return array( ), 'mediawiki.inspect' => array( 'scripts' => 'resources/mediawiki/mediawiki.inspect.js', - 'dependencies' => 'jquery.byteLength', + 'dependencies' => array( + 'jquery.byteLength', + 'jquery.json', + ), 'targets' => array( 'desktop', 'mobile' ), ), 'mediawiki.feedback' => array( @@ -1008,6 +1011,9 @@ return array( 'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js', 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css', 'position' => 'top', + 'skinStyles' => array( + 'vector' => 'skins/vector/special.preferences.less', + ), ), 'mediawiki.special.recentchanges' => array( 'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js', @@ -1106,8 +1112,9 @@ return array( 'localBasePath' => $GLOBALS['wgStyleDirectory'], ), 'mediawiki.legacy.config' => array( + // Used in the web installer. Test it after modifying this definition! 'scripts' => 'common/config.js', - 'styles' => array( 'common/config.css', 'common/config-cc.css' ), + 'styles' => array( 'common/config.css' ), 'remoteBasePath' => $GLOBALS['wgStylePath'], 'localBasePath' => $GLOBALS['wgStyleDirectory'], 'dependencies' => 'mediawiki.legacy.wikibits', @@ -1129,6 +1136,7 @@ return array( 'position' => 'top', ), 'mediawiki.legacy.shared' => array( + // Used in the web installer. Test it after modifying this definition! 'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ), 'remoteBasePath' => $GLOBALS['wgStylePath'], 'localBasePath' => $GLOBALS['wgStyleDirectory'], diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js index bdc66751be..b3d7bb3d33 100644 --- a/resources/jquery/jquery.tablesorter.js +++ b/resources/jquery/jquery.tablesorter.js @@ -481,10 +481,10 @@ var name = mw.language.months.names[i].toLowerCase(); ts.monthNames[name] = i + 1; regex.push( $.escapeRE( name ) ); - name = mw.language.months.genitive[i].toLowerCase().replace( '.', '' ); + name = mw.language.months.genitive[i].toLowerCase(); ts.monthNames[name] = i + 1; regex.push( $.escapeRE( name ) ); - name = mw.language.months.abbrev[i].toLowerCase(); + name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' ); ts.monthNames[name] = i + 1; regex.push( $.escapeRE( name ) ); } diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js index 381e172c33..cc83a4b819 100644 --- a/resources/mediawiki.api/mediawiki.api.edit.js +++ b/resources/mediawiki.api/mediawiki.api.edit.js @@ -3,9 +3,6 @@ */ ( function ( mw, $ ) { - // Cache token so we don't have to keep fetching new ones for every single request. - var cachedToken = null; - $.extend( mw.Api.prototype, { /** @@ -19,32 +16,7 @@ * @return {jQuery.Promise} See #post */ postWithEditToken: function ( params, ok, err ) { - var useTokenToPost, getTokenIfBad, - api = this; - if ( cachedToken === null ) { - // We don't have a valid cached token, so get a fresh one and try posting. - // We do not trap any 'badtoken' or 'notoken' errors, because we don't want - // an infinite loop. If this fresh token is bad, something else is very wrong. - useTokenToPost = function ( token ) { - params.token = token; - api.post( params, { ok: ok, err: err } ); - }; - return api.getEditToken( useTokenToPost, err ); - } else { - // We do have a token, but it might be expired. So if it is 'bad' then - // start over with a new token. - params.token = cachedToken; - getTokenIfBad = function ( code, result ) { - if ( code === 'badtoken' ) { - // force a new token, clear any old one - cachedToken = null; - api.postWithEditToken( params, ok, err ); - } else { - err( code, result ); - } - }; - return api.post( params, { ok: ok, err: getTokenIfBad } ); - } + return this.postWithToken( 'edit', params ).done( ok ).fail( err ); }, /** @@ -57,38 +29,7 @@ * @return {string} return.done.token Received token. */ getEditToken: function ( ok, err ) { - var d = $.Deferred(), - apiPromise; - - // Backwards compatibility (< MW 1.20) - d.done( ok ).fail( err ); - - apiPromise = this.get( { - action: 'tokens', - type: 'edit' - }, { - // Due to the API assuming we're logged out if we pass the callback-parameter, - // we have to disable jQuery's callback system, and instead parse JSON string, - // by setting 'jsonp' to false. - // TODO: This concern seems genuine but no other module has it. Is it still - // needed and/or should we pass this by default? - jsonp: false - } ) - .done( function ( data ) { - var token; - // If token type is not available for this user, - // key 'edittoken' is missing or can contain Boolean false - if ( data.tokens && data.tokens.edittoken ) { - token = data.tokens.edittoken; - cachedToken = token; - d.resolve( token ); - } else { - d.reject( 'token-missing', data ); - } - } ) - .fail( d.reject ); - - return d.promise( { abort: apiPromise.abort } ); + return this.getToken( 'edit' ).done( ok ).fail( err ); }, /** @@ -111,8 +52,7 @@ text: message }, ok, err ); } - - } ); + } ); /** * @class mw.Api diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js index 142c454183..cdc67679f4 100644 --- a/resources/mediawiki.api/mediawiki.api.js +++ b/resources/mediawiki.api/mediawiki.api.js @@ -20,7 +20,8 @@ dataType: 'json' } - }; + }, + tokenCache = {}; /** * Constructor to create an object to interact with the API of a particular MediaWiki server. @@ -176,8 +177,82 @@ return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) { mw.log( 'mw.Api error: ', code, details ); } ); - } + }, + + /** + * Post to API with specified type of token. If we have no token, get one and try to post. + * If we have a cached token try using that, and if it fails, blank out the + * cached token and start over. For example to change an user option you could do: + * + * new mw.Api().postWithToken( 'options', { + * action: 'options', + * optionname: 'gender', + * optionvalue: 'female' + * } ); + * + * @param {string} tokenType The name of the token, like options or edit. + * @param {Object} params API parameters + * @return {jQuery.Promise} See #post + */ + postWithToken: function ( tokenType, params ) { + var api = this, hasOwn = tokenCache.hasOwnProperty; + if ( hasOwn.call( tokenCache, tokenType ) && tokenCache[tokenType] !== undefined ) { + params.token = tokenCache[tokenType]; + return api.post( params ).then( + null, + function ( code ) { + if ( code === 'badtoken' ) { + // force a new token, clear any old one + tokenCache[tokenType] = params.token = undefined; + return api.post( params ); + } + // Pass the promise forward, so the caller gets error codes + return this; + } + ); + } else { + return api.getToken( tokenType ).then( function ( token ) { + tokenCache[tokenType] = params.token = token; + return api.post( params ); + } ); + } + }, + /** + * Api helper to grab any token. + * + * @param {string} type Token type. + * @return {jQuery.Promise} + * @return {Function} return.done + * @return {string} return.done.token Received token. + */ + getToken: function ( type ) { + var apiPromise, + d = $.Deferred(); + + apiPromise = this.get( { + action: 'tokens', + type: type + }, { + // Due to the API assuming we're logged out if we pass the callback-parameter, + // we have to disable jQuery's callback system, and instead parse JSON string, + // by setting 'jsonp' to false. + // TODO: This concern seems genuine but no other module has it. Is it still + // needed and/or should we pass this by default? + } ) + .done( function ( data ) { + // If token type is not available for this user, + // key '...token' is missing or can contain Boolean false + if ( data.tokens && data.tokens[type + 'token'] ) { + d.resolve( data.tokens[type + 'token'] ); + } else { + d.reject( 'token-missing', data ); + } + } ) + .fail( d.reject ); + + return d.promise( { abort: apiPromise.abort } ); + } }; /** diff --git a/resources/mediawiki.special/mediawiki.special.preferences.css b/resources/mediawiki.special/mediawiki.special.preferences.css index d455b2135d..161efde30d 100644 --- a/resources/mediawiki.special/mediawiki.special.preferences.css +++ b/resources/mediawiki.special/mediawiki.special.preferences.css @@ -9,6 +9,3 @@ /* .mw-email-authenticated .mw-input { } */ -.mw-sp-pref-successbox { - font-weight: bold; -} diff --git a/resources/mediawiki.special/mediawiki.special.vforms.css b/resources/mediawiki.special/mediawiki.special.vforms.css index 9ffe11cfb1..768a9c6e16 100644 --- a/resources/mediawiki.special/mediawiki.special.vforms.css +++ b/resources/mediawiki.special/mediawiki.special.vforms.css @@ -33,28 +33,9 @@ section.mw-form-header { font-size: 0.9em; margin: 0 0 1em 0; padding: 0.5em; - border: 1px solid; word-wrap: break-word; } -.mw-ui-vform .errorbox { - color: #cc0000; - border-color: #fac5c5; - background-color: #fae3e3; -} - -.mw-ui-vform .warningbox { - color: #705000; - border-color: #fde29b; - background-color: #fdf1d1; -} - -.mw-ui-vform .successbox { - color: #009000; - border-color: #b7fdb5; - background-color: #e1fddf; -} - /* * Override the right margin of the form to give space in case a benefits * column appears to the side. diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js index b236019663..4a6456678b 100644 --- a/resources/mediawiki/mediawiki.Title.js +++ b/resources/mediawiki/mediawiki.Title.js @@ -312,13 +312,12 @@ // thumb.php-generated thumbnails thumbPhpRegex = /thumb\.php/, - regexes = [ // Thumbnails - /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/, + /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-\1[^\s\/]*$/, // Thumbnails in non-hashed upload directories - /\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/, + /\/([^\s\/]+)\/[^\s\/]+-\1[^\s\/]*$/, // Full size images /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/, diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js index 5cecc164bf..346e783aff 100644 --- a/resources/mediawiki/mediawiki.inspect.js +++ b/resources/mediawiki/mediawiki.inspect.js @@ -4,8 +4,16 @@ * @author Ori Livneh * @since 1.22 */ +/*jshint devel:true */ ( function ( mw, $ ) { + function sortByProperty( array, prop, descending ) { + var order = descending ? -1 : 1; + return array.sort( function ( a, b ) { + return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0; + } ); + } + /** * @class mw.inspect * @singleton @@ -45,6 +53,36 @@ return payload; }, + /** + * Given CSS source, count both the total number of selectors it + * contains and the number which match some element in the current + * document. + * + * @param {string} css CSS source + * @return Selector counts + * @return {number} return.selectors Total number of selectors + * @return {number} return.matched Number of matched selectors + */ + auditSelectors: function ( css ) { + var selectors = { total: 0, matched: 0 }, + style = document.createElement( 'style' ), + sheet, rules; + + style.textContent = css; + document.body.appendChild( style ); + // Standards-compliant browsers use .sheet.cssRules, IE8 uses .styleSheet.rules… + sheet = style.sheet || style.styleSheet; + rules = sheet.cssRules || sheet.rules; + $.each( rules, function ( index, rule ) { + selectors.total++; + if ( document.querySelector( rule.selectorText ) !== null ) { + selectors.matched++; + } + } ); + document.body.removeChild( style ); + return selectors; + }, + /** * Get a list of all loaded ResourceLoader modules. * @@ -57,13 +95,56 @@ }, /** - * Print a breakdown of all loaded modules and their size in kilobytes - * to the debug console. Modules are ordered from largest to smallest. + * Print tabular data to the console, using console.table, console.log, + * or mw.log (in declining order of preference). + * + * @param {Array} data Tabular data represented as an array of objects + * with common properties. + */ + dumpTable: function ( data ) { + try { + // Bartosz made me put this here. + if ( window.opera ) { throw window.opera; } + // Use Function.prototype#call to force an exception on Firefox, + // which doesn't define console#table but doesn't complain if you + // try to invoke it. + console.table.call( console.table, data ); + return; + } catch (e) {} + try { + console.log( $.toJSON( data, null, 2 ) ); + return; + } catch (e) {} + mw.log( data ); + }, + + /** + * Generate and print one more reports. When invoked with no arguments, + * print all reports. + * + * @param {string...} [reports] Report names to run, or unset to print + * all available reports. */ - inspectModules: function () { - var console = window.console; + runReports: function () { + var reports = arguments.length > 0 ? + Array.prototype.slice.call( arguments ) : + $.map( inspect.reports, function ( v, k ) { return k; } ); + + $.each( reports, function ( index, name ) { + inspect.dumpTable( inspect.reports[name]() ); + } ); + }, - $( function () { + /** + * @class mw.inspect.reports + * @singleton + */ + reports: { + /** + * Generate a breakdown of all loaded modules and their size in + * kilobytes. Modules are ordered from largest to smallest. + */ + size: function () { // Map each module to a descriptor object. var modules = $.map( inspect.getLoadedModules(), function ( module ) { return { @@ -73,9 +154,7 @@ } ); // Sort module descriptors by size, largest first. - modules.sort( function ( a, b ) { - return b.size - a.size; - } ); + sortByProperty( modules, 'size', true ); // Convert size to human-readable string. $.each( modules, function ( i, module ) { @@ -84,22 +163,40 @@ ( module.size !== null ? module.size + ' B' : null ); } ); - if ( console ) { - if ( console.table ) { - console.table( modules ); - } else { - $.each( modules, function ( i, module ) { - console.log( [ module.name, module.size ].join( '\t' ) ); - } ); - } - } - } ); + return modules; + }, + + /** + * For each module with styles, count the number of selectors, and + * count how many match against some element currently in the DOM. + */ + css: function () { + var modules = []; + + $.each( inspect.getLoadedModules(), function ( index, name ) { + var css, stats, module = mw.loader.moduleRegistry[name]; + + try { + css = module.style.css.join(); + } catch (e) { return; } // skip + + stats = inspect.auditSelectors( css ); + modules.push( { + module: name, + allSelectors: stats.total, + matchedSelectors: stats.matched, + percentMatched: stats.total !== 0 ? + ( stats.matched / stats.total * 100 ).toFixed( 2 ) + '%' : null + } ); + } ); + sortByProperty( modules, 'allSelectors', true ); + return modules; + }, } }; if ( mw.config.get( 'debug' ) ) { - inspect.getModuleSize = function () { return null; }; - mw.log( 'mw.inspect: Module sizes are not available in debug mode.' ); + mw.log( 'mw.inspect: reports are not available in debug mode.' ); } mw.inspect = inspect; diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js index 4138ac8d97..f4ea93f7b6 100644 --- a/resources/mediawiki/mediawiki.js +++ b/resources/mediawiki/mediawiki.js @@ -1,5 +1,9 @@ -/* - * Core MediaWiki JavaScript Library +/** + * Base library for MediaWiki. + * + * @class mw + * @alternateClassName mediaWiki + * @singleton */ var mw = ( function ( $, undefined ) { @@ -10,6 +14,31 @@ var mw = ( function ( $, undefined ) { var hasOwn = Object.prototype.hasOwnProperty, slice = Array.prototype.slice; + /** + * Log a message to window.console, if possible. Useful to force logging of some + * errors that are otherwise hard to detect (I.e., this logs also in production mode). + * Gets console references in each invocation, so that delayed debugging tools work + * fine. No need for optimization here, which would only result in losing logs. + * + * @private + * @method log_ + * @param {string} msg text for the log entry. + * @param {Error} [e] + */ + function log( msg, e ) { + var console = window.console; + if ( console && console.log ) { + console.log( msg ); + // If we have an exception object, log it through .error() to trigger + // proper stacktraces in browsers that support it. There are no (known) + // browsers that don't support .error(), that do support .log() and + // have useful exception handling through .log(). + if ( e && console.error ) { + console.error( String( e ), e ); + } + } + } + /* Object constructors */ /** @@ -197,7 +226,7 @@ var mw = ( function ( $, undefined ) { }, /** - * Converts message object to it's string form based on the state of format. + * Converts message object to its string form based on the state of format. * * @return {string} Message as a string in the current form or `` if key does not exist. */ @@ -291,11 +320,7 @@ var mw = ( function ( $, undefined ) { }; /** - * Base library for MediaWiki. - * * @class mw - * @alternateClassName mediaWiki - * @singleton */ return { /* Public Members */ @@ -592,7 +617,7 @@ var mw = ( function ( $, undefined ) { try { styleEl.styleSheet.cssText += cssText; // IE } catch ( e ) { - log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e ); + log( 'addEmbeddedCSS fail', e ); } } else { styleEl.appendChild( document.createTextNode( String( cssText ) ) ); @@ -770,30 +795,6 @@ var mw = ( function ( $, undefined ) { return filter( 'ready', dependencies ).length === dependencies.length; } - /** - * Log a message to window.console, if possible. Useful to force logging of some - * errors that are otherwise hard to detect (I.e., this logs also in production mode). - * Gets console references in each invocation, so that delayed debugging tools work - * fine. No need for optimization here, which would only result in losing logs. - * - * @private - * @param {string} msg text for the log entry. - * @param {Error} [e] - */ - function log( msg, e ) { - var console = window.console; - if ( console && console.log ) { - console.log( msg ); - // If we have an exception object, log it through .error() to trigger - // proper stacktraces in browsers that support it. There are no (known) - // browsers that don't support .error(), that do support .log() and - // have useful exception handling through .log(). - if ( e && console.error ) { - console.error( e ); - } - } - } - /** * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs * and modules that depend upon this module. if the given module failed, propagate the 'error' @@ -834,29 +835,26 @@ var mw = ( function ( $, undefined ) { j -= 1; try { if ( hasErrors ) { - throw new Error( 'Module ' + module + ' failed.'); + if ( $.isFunction( job.error ) ) { + job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] ); + } } else { if ( $.isFunction( job.ready ) ) { job.ready(); } } } catch ( e ) { - if ( $.isFunction( job.error ) ) { - try { - job.error( e, [module] ); - } catch ( ex ) { - // A user-defined operation raised an exception. Swallow to protect - // our state machine! - log( 'Exception thrown by job.error()', ex ); - } - } + // A user-defined callback raised an exception. + // Swallow it to protect our state machine! + log( 'Exception thrown by job.error', e ); } } } if ( registry[module].state === 'ready' ) { - // The current module became 'ready'. Recursively execute all dependent modules that are loaded - // and now have all dependencies satisfied. + // The current module became 'ready'. Set it in the module store, and recursively execute all + // dependent modules that are loaded and now have all dependencies satisfied. + mw.loader.store.set( module, registry[module] ); for ( m in registry ) { if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) { execute( m ); @@ -1009,7 +1007,7 @@ var mw = ( function ( $, undefined ) { } catch ( e ) { // This needs to NOT use mw.log because these errors are common in production mode // and not in debug mode, such as when a symbol that should be global isn't exported - log( 'Exception thrown by ' + module + ': ' + e.message, e ); + log( 'Exception thrown by ' + module, e ); registry[module].state = 'error'; handlePending( module ); } @@ -1210,7 +1208,7 @@ var mw = ( function ( $, undefined ) { addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async ); } - /* Public Methods */ + /* Public Members */ return { /** * The module registry is exposed as an aid for debugging and inspecting page @@ -1259,6 +1257,19 @@ var mw = ( function ( $, undefined ) { } } } + + mw.loader.store.init(); + if ( mw.loader.store.enabled ) { + batch = $.grep( batch, function ( module ) { + var source = mw.loader.store.get( module ); + if ( source ) { + $.globalEval( source ); + return false; // Don't fetch + } + return true; // Fetch + } ); + } + // Early exit if there's nothing to load... if ( !batch.length ) { return; @@ -1453,16 +1464,19 @@ var mw = ( function ( $, undefined ) { * @param {Function|Array} script Function with module code or Array of URLs to * be used as the src attribute of a new `